pax_global_header00006660000000000000000000000064141675763360014534gustar00rootroot0000000000000052 comment=886fe6e879d9374fc536fe7d090760fd2f89f5b1 pyvo-1.2.1/000077500000000000000000000000001416757633600125325ustar00rootroot00000000000000pyvo-1.2.1/.github/000077500000000000000000000000001416757633600140725ustar00rootroot00000000000000pyvo-1.2.1/.github/workflows/000077500000000000000000000000001416757633600161275ustar00rootroot00000000000000pyvo-1.2.1/.github/workflows/cibuild.yml000066400000000000000000000066021416757633600202710ustar00rootroot00000000000000name: CI on: push: pull_request: schedule: - cron: "0 3 * * *" jobs: egginfo: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Python 3.8 uses: actions/setup-python@v2 with: python-version: 3.8 - name: Install tox run: python -m pip install --upgrade tox - name: egg-info run: tox -e egg_info tests: needs: egginfo runs-on: ubuntu-latest name: ${{ matrix.python-version }} strategy: fail-fast: true matrix: python-version: ["3.7", "3.8", "3.9", "3.10"] steps: - name: Checkout code uses: actions/checkout@v2 with: fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install tox run: python -m pip install --upgrade tox - name: Python ${{ matrix.python-version }} with astropy run: | # remove "." from matrix.python-version to get the defaults tox python versions tox_python_target=$(echo py${{matrix.python-version}} | sed 's/\.//') echo "Tox python target: " $tox_python_target tox -e $tox_python_target-test mac_windows: runs-on: ${{ matrix.os }} needs: tests strategy: fail-fast: true matrix: os: [macos-latest, windows-latest] steps: - name: Checkout code uses: actions/checkout@v2 with: fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v2 with: python-version: 3.8 - name: Install tox run: python -m pip install --upgrade tox - name: Python 3.8 with latest astropy run: tox -e py38-latest style_coverage: runs-on: ubuntu-latest needs: tests steps: - uses: actions/checkout@v2 - name: Set up Python 3.8 uses: actions/setup-python@v2 with: python-version: 3.8 - name: Setup Graphviz uses: ts-graphviz/setup-graphviz@v1 - name: Install tox run: python -m pip install --upgrade tox - name: Check codestyle run: tox -e codestyle - name: Check coverage run: tox -e cov - name: Upload coverage to codecov uses: codecov/codecov-action@v2 with: file: ./coverage.xml devastropy: # TODO: this job should be allowed to fail except that the functionality # is not available in actions yet. runs-on: ubuntu-latest needs: tests steps: - uses: actions/checkout@v2 - name: Set up Python 3.10 uses: actions/setup-python@v2 with: python-version: "3.10" - name: Install tox run: python -m pip install --upgrade tox - name: Run tests against devastropy run: tox -e py310-test-devastropy oldestastropy: runs-on: ubuntu-latest needs: tests steps: - uses: actions/checkout@v2 - name: Set up Python 3.8 uses: actions/setup-python@v2 with: python-version: 3.8 - name: Install tox run: python -m pip install --upgrade tox - name: Run tests against oldestastropy run: tox -e py38-test-oldestastropy #publish: #needs: coverage #TODO - should be trigger by tagging associated with creating a new release in # github. The tag should be compared to the version in setup.cfg to ensure # consistency. pyvo-1.2.1/.gitignore000066400000000000000000000012551416757633600145250ustar00rootroot00000000000000# Compiled files *.py[cod] *.a *.o *.so __pycache__ # Ignore .c files by default to avoid including generated code. If you want to # add a non-generated .c extension, use `git add -f filename.c`. *.c # Other generated files */version.py */cython_version.py htmlcov .coverage MANIFEST .ipynb_checkpoints # Sphinx docs/api docs/_build # Eclipse editor project files .project .pydevproject .settings # Pycharm editor project files .idea # Packages/installer info *.egg *.egg-info dist build eggs parts bin var sdist develop-eggs .installed.cfg distribute-*.tar.gz # Other .cache .tox .*.sw[op] *~ .project .pydevproject .settings # Mac OSX .DS_Store # ipython .ipynb_checkpoints pyvo-1.2.1/.gitmodules000066400000000000000000000001541416757633600147070ustar00rootroot00000000000000[submodule "astropy_helpers"] path = astropy_helpers url = https://github.com/astropy/astropy-helpers.git pyvo-1.2.1/.readthedocs.yml000066400000000000000000000006451416757633600156250ustar00rootroot00000000000000version: 2 build: image: latest sphinx: builder: html configuration: docs/conf.py fail_on_warning: true # Install regular dependencies. # Then, install special pinning for RTD. python: version: 3.8 system_packages: false install: - requirements: docs/requirements.txt - method: pip path: . extra_requirements: - docs - all # Don't build any extra formats formats: [] pyvo-1.2.1/CHANGES.rst000066400000000000000000000072051416757633600143400ustar00rootroot000000000000001.2.1 (2022-01-12) ================== - Get wraps decorator from functools instead of astropy (no functional change) [#283] 1.2 (2021-12-17) ================ - Make .bysemantics expand its terms to the entire branch by default [#241] - Added optional includeaux flag for regTAP search() [#258] - Added VOResource 1.1 mirrorurl and testquerystring to vosi.Interface [#269] 1.1 (2020-06-26) ================ - Added TAP examples function. [#220] - Add default for UWS version. [#199] - Handle description of None when describing a TAP service's tables. [#197] - Properly handle single string keywords value for regsearch(). [#201] - Add support for SIAv2. [#206] - Add kwargs to sia2. [#222] 1.0 (2019-09-20) ================ - Fix pedantic table parsing not throwing exception. [#140] - Drop support for legacy Python 2.7. [#153] - Sphinx 1.7 or higher is needed to build the documentation. [#160] - Add support for authenticated requests. [#157] - Add a get_job_list method to the TAPService class. [#169] - Replace example's usage of pyvo.object2pos() with SkyCoord.from_name() [#171] - Stop installing files from scripts to /usr/local/bin. Move them to examples/images instead. [#166] - Update ex_casA_image_cat example. [#172] - Fix waveband option in registry.regsearch [#175] - Fix to regtap.ivoid2service(), few decode()'s, para_format_desc was moved to utils. [#177] 0.9.3 (2019-05-30) ================== - Fix parsing of SecurityMethod in capabilities. - Keep up to date with upstream astropy changes. - Move into astropy GitHub organization and README updates. - Replace mimetype functions with library-based ones. 0.9.2 ===== - Fix typo fornat -> format. 0.9.1 ===== - Don't use OR's in RegTAP queries. - Add a timeout to job wait. 0.9 === - Add a describe method to services to print a human-readable description. - Use a customized user agent in http requests. - Fix some python2/3 issues. - Add general datalink processing method. 0.8.1 ===== - Pass use_names_over_ids=True to astropy's to_table. 0.8 === - Make XML handling more generic. 0.7rc1 ====== - Rework VOSI parsing using astropy xml handling. - Describe service object bases on vosi capabilities. - Add SODA functionallity. - Fixes and Improvements. 0.6.1 ===== - Add Datalink interface. - Put some common functionallity in Mixins. - Minor fixes and improvements. 0.6 === - Using RegTAP as the only registry interface. - Added a datamodel keyword to registry search. - Using the six libray to address Python 2/3 compatibility issues. - AsyncTAPJob is now context aware. - Improvement upload handling; it is no longer necessary to specifiy the type of upload. - Allow astropy's SkyCoord and Quantity as input parameters. 0.5.2 ===== - Remove trailing ? from query urls. - VOTable fieldnames are now gathered from names only instead of ID and name. 0.5.1 ===== - Fix content decoding related error in async result handling. 0.5 === - Added a RegTAP interface. - Removed urllib in favor of the requests library. - Deprecated vao registry interface. - Minor improvements and fixes. 0.4.1 ===== - Fix a bug where maxrec wasn't send to the server. 0.4 === - Use astropy tables for table metadata. - Fix another content encoding error. 0.3.2 ===== - Adding table property to DALResults. This is a shortcut to access the astropy table. - Improved Error Handling. 0.3.1 ===== - Fix an error where the content wasn't decoded properly. - Fix a bug where POST parameters are submitted as GET parameters. 0.3 === - Adding TAP API. 0.1 === - This is the last release that supports Python 2.6. - This release only contains bug fixes beyond 0.0beta2. pyvo-1.2.1/CONTRIBUTORS.rst000066400000000000000000000016641416757633600152300ustar00rootroot00000000000000PyVO Contributors ----------------- PyVO is an open source project developed through GitHub at https://github.com/pyvirtobs; community contributions are welcome. This project began in 2012 as a product of the US Virtual Astronomical Observatory, funded through a cooperative agreement with the US National Science Foundation. PyVO was developed with contributions from the following developers: Contributor's Name | Affiliations | GitHub identity ---------------------|----------------|------------------- Stefan Becker | Heidelberg Univ. | funbaker Thomas Boch | CDS | tboch Carlos Brandt | Universita di Roma La Sapienza | chbrandt Markus Demleitner | Heidelberg Univ. | msdemlei Christoph Deil | MPI for Nuclear Physics | cdeil Mike Fitzpatrick | NOAO | Matthew Graham | Caltech | doccosmos Gus Muench | Harvard/CfA, AAS | augustfly Ray Plante | NCSA/UIUC, NIST | RayPlante Brigitta Sipocz | Cambridge, UK | bsipocz Doug Tody | NRAO | pyvo-1.2.1/LICENSE.rst000066400000000000000000000027741416757633600143600ustar00rootroot00000000000000BSD 3-Clause License Copyright (c) 2020, Astropy-pyvo Developers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pyvo-1.2.1/MANIFEST.in000066400000000000000000000020731416757633600142720ustar00rootroot00000000000000include README.rst include CHANGES.rst include ez_setup.py include ah_bootstrap.py include setup.cfg recursive-include packagename *.pyx *.c *.pxd recursive-include docs * recursive-include licenses * recursive-include cextern * recursive-include scripts * prune build prune docs/_build prune docs/api # the next few stanzas are for astropy_helpers. It's derived from the # astropy_helpers/MANIFEST.in, but requires additional includes for the actual # package directory and egg-info. include astropy_helpers/README.rst include astropy_helpers/CHANGES.rst include astropy_helpers/LICENSE.rst recursive-include astropy_helpers/licenses * include astropy_helpers/ez_setup.py include astropy_helpers/ah_bootstrap.py recursive-include astropy_helpers/astropy_helpers *.py *.pyx *.c *.h recursive-include astropy_helpers/astropy_helpers.egg-info * # include the sphinx stuff with "*" because there are css/html/rst/etc. recursive-include astropy_helpers/astropy_helpers/sphinx * prune astropy_helpers/build prune astropy_helpers/astropy_helpers/tests global-exclude *.pyc *.o pyvo-1.2.1/README.rst000066400000000000000000000043521416757633600142250ustar00rootroot00000000000000PyVO =================================== .. image:: http://img.shields.io/badge/powered%20by-AstroPy-orange.svg?style=flat :target: http://www.astropy.org :alt: Powered by Astropy Badge .. image:: https://github.com/astropy/pyvo/workflows/CI/badge.svg?branch=main :target: https://github.com/astropy/pyvo/workflows/CI/badge.svg?branch=main :alt: CI Status .. image:: https://coveralls.io/repos/github/pyvirtobs/pyvo/badge.svg?branch=main :target: https://coveralls.io/github/pyvirtobs/pyvo?branch=main :alt: Coverage Status .. image:: https://zenodo.org/badge/10865450.svg :target: https://zenodo.org/badge/latestdoi/10865450 PyVO is a package providing access to remote data and services of the Virtual observatory (VO) using Python. Its development was launched by the NSF/NASA-funded Virtual Astronomical Observatory (VAO, www.usvao.org) project (formerly under the name VAOpy) as part of its initiative to bring VO capabilities to desktop. Its goal is to allow astronomers and tool developers to access data and services from remote archives and other web resources. It takes advantage of VO standards to give access to thousands of catalogs, data archives, information services, and analysis tools. It also takes advantage of the general capabilities of Astopy (and numpy), and so a secondary goal is to provide a development platform for migrating more VO capabilities into Astropy. Source code can be found `on GitHub `_ Releases of PyVO are available from `PyPI `_ thus, it and its prerequisites can be most easily installed using ``pip``: pip install pyvo Alternatively, you can do a source install: python setup.py install EXAMPLES -------- Many instructive examples can be found in the `PyVO Documentation `_. Additional examples can be found in the scripts directory. UNIT TESTS ---------- PyVO uses the Astropy framework for unit tests which is built into the setup script. To run the tests, type: python setup.py test This will run all unit tests that do not require a network connection. To run all tests, including those that access the network, add the --remote-data (-R) option: python setup.py test -R pyvo-1.2.1/RELEASE.rst000066400000000000000000000015211416757633600143430ustar00rootroot00000000000000Release Procedure for pyvo ========================== These steps are intended to help guide a developer into making a new release. For these instructions, version is to be replaced by the version number of the release. 1. Edit setup.cfg and remove .dev from the version number 2. Edit CHANGES.rst to change unreleased to the date of the release. 3. Commit and push 4. git tag -a version -m "releasing new version version" (this makes a release tag) 5. git push origin version 6. python setup.py sdist (this makes a .tar.gz of the package in dist) 7. twine upload sdist/* (this uploads the output of the previous step to pypi) 8. Edit setup.cfg and set the version to the next release number and add .dev after the version number. Add a new section at the top for the next release number 9. Commit and push. This begins the new release pyvo-1.2.1/ah_bootstrap.py000066400000000000000000001106341416757633600155760ustar00rootroot00000000000000""" This bootstrap module contains code for ensuring that the astropy_helpers package will be importable by the time the setup.py script runs. It also includes some workarounds to ensure that a recent-enough version of setuptools is being used for the installation. This module should be the first thing imported in the setup.py of distributions that make use of the utilities in astropy_helpers. If the distribution ships with its own copy of astropy_helpers, this module will first attempt to import from the shipped copy. However, it will also check PyPI to see if there are any bug-fix releases on top of the current version that may be useful to get past platform-specific bugs that have been fixed. When running setup.py, use the ``--offline`` command-line option to disable the auto-upgrade checks. When this module is imported or otherwise executed it automatically calls a main function that attempts to read the project's setup.cfg file, which it checks for a configuration section called ``[ah_bootstrap]`` the presences of that section, and options therein, determine the next step taken: If it contains an option called ``auto_use`` with a value of ``True``, it will automatically call the main function of this module called `use_astropy_helpers` (see that function's docstring for full details). Otherwise no further action is taken and by default the system-installed version of astropy-helpers will be used (however, ``ah_bootstrap.use_astropy_helpers`` may be called manually from within the setup.py script). This behavior can also be controlled using the ``--auto-use`` and ``--no-auto-use`` command-line flags. For clarity, an alias for ``--no-auto-use`` is ``--use-system-astropy-helpers``, and we recommend using the latter if needed. Additional options in the ``[ah_boostrap]`` section of setup.cfg have the same names as the arguments to `use_astropy_helpers`, and can be used to configure the bootstrap script when ``auto_use = True``. See https://github.com/astropy/astropy-helpers for more details, and for the latest version of this module. """ import contextlib import errno import io import locale import os import re import subprocess as sp import sys from distutils import log from distutils.debug import DEBUG from configparser import ConfigParser, RawConfigParser import pkg_resources from setuptools import Distribution from setuptools.package_index import PackageIndex # This is the minimum Python version required for astropy-helpers __minimum_python_version__ = (3, 5) # TODO: Maybe enable checking for a specific version of astropy_helpers? DIST_NAME = 'astropy-helpers' PACKAGE_NAME = 'astropy_helpers' UPPER_VERSION_EXCLUSIVE = None # Defaults for other options DOWNLOAD_IF_NEEDED = True INDEX_URL = 'https://pypi.python.org/simple' USE_GIT = True OFFLINE = False AUTO_UPGRADE = True # A list of all the configuration options and their required types CFG_OPTIONS = [ ('auto_use', bool), ('path', str), ('download_if_needed', bool), ('index_url', str), ('use_git', bool), ('offline', bool), ('auto_upgrade', bool) ] # Start off by parsing the setup.cfg file SETUP_CFG = ConfigParser() if os.path.exists('setup.cfg'): try: SETUP_CFG.read('setup.cfg') except Exception as e: if DEBUG: raise log.error( "Error reading setup.cfg: {0!r}\n{1} will not be " "automatically bootstrapped and package installation may fail." "\n{2}".format(e, PACKAGE_NAME, _err_help_msg)) # We used package_name in the package template for a while instead of name if SETUP_CFG.has_option('metadata', 'name'): parent_package = SETUP_CFG.get('metadata', 'name') elif SETUP_CFG.has_option('metadata', 'package_name'): parent_package = SETUP_CFG.get('metadata', 'package_name') else: parent_package = None if SETUP_CFG.has_option('options', 'python_requires'): python_requires = SETUP_CFG.get('options', 'python_requires') # The python_requires key has a syntax that can be parsed by SpecifierSet # in the packaging package. However, we don't want to have to depend on that # package, so instead we can use setuptools (which bundles packaging). We # have to add 'python' to parse it with Requirement. from pkg_resources import Requirement req = Requirement.parse('python' + python_requires) # We want the Python version as a string, which we can get from the platform module import platform # strip off trailing '+' incase this is a dev install of python python_version = platform.python_version().strip('+') # allow pre-releases to count as 'new enough' if not req.specifier.contains(python_version, True): if parent_package is None: message = "ERROR: Python {} is required by this package\n".format(req.specifier) else: message = "ERROR: Python {} is required by {}\n".format(req.specifier, parent_package) sys.stderr.write(message) sys.exit(1) if sys.version_info < __minimum_python_version__: if parent_package is None: message = "ERROR: Python {} or later is required by astropy-helpers\n".format( __minimum_python_version__) else: message = "ERROR: Python {} or later is required by astropy-helpers for {}\n".format( __minimum_python_version__, parent_package) sys.stderr.write(message) sys.exit(1) _str_types = (str, bytes) # What follows are several import statements meant to deal with install-time # issues with either missing or misbehaving pacakges (including making sure # setuptools itself is installed): # Check that setuptools 30.3 or later is present from distutils.version import LooseVersion try: import setuptools assert LooseVersion(setuptools.__version__) >= LooseVersion('30.3') except (ImportError, AssertionError): sys.stderr.write("ERROR: setuptools 30.3 or later is required by astropy-helpers\n") sys.exit(1) # typing as a dependency for 1.6.1+ Sphinx causes issues when imported after # initializing submodule with ah_boostrap.py # See discussion and references in # https://github.com/astropy/astropy-helpers/issues/302 try: import typing # noqa except ImportError: pass # Note: The following import is required as a workaround to # https://github.com/astropy/astropy-helpers/issues/89; if we don't import this # module now, it will get cleaned up after `run_setup` is called, but that will # later cause the TemporaryDirectory class defined in it to stop working when # used later on by setuptools try: import setuptools.py31compat # noqa except ImportError: pass # matplotlib can cause problems if it is imported from within a call of # run_setup(), because in some circumstances it will try to write to the user's # home directory, resulting in a SandboxViolation. See # https://github.com/matplotlib/matplotlib/pull/4165 # Making sure matplotlib, if it is available, is imported early in the setup # process can mitigate this (note importing matplotlib.pyplot has the same # issue) try: import matplotlib matplotlib.use('Agg') import matplotlib.pyplot except: # Ignore if this fails for *any* reason* pass # End compatibility imports... class _Bootstrapper(object): """ Bootstrapper implementation. See ``use_astropy_helpers`` for parameter documentation. """ def __init__(self, path=None, index_url=None, use_git=None, offline=None, download_if_needed=None, auto_upgrade=None): if path is None: path = PACKAGE_NAME if not (isinstance(path, _str_types) or path is False): raise TypeError('path must be a string or False') if not isinstance(path, str): fs_encoding = sys.getfilesystemencoding() path = path.decode(fs_encoding) # path to unicode self.path = path # Set other option attributes, using defaults where necessary self.index_url = index_url if index_url is not None else INDEX_URL self.offline = offline if offline is not None else OFFLINE # If offline=True, override download and auto-upgrade if self.offline: download_if_needed = False auto_upgrade = False self.download = (download_if_needed if download_if_needed is not None else DOWNLOAD_IF_NEEDED) self.auto_upgrade = (auto_upgrade if auto_upgrade is not None else AUTO_UPGRADE) # If this is a release then the .git directory will not exist so we # should not use git. git_dir_exists = os.path.exists(os.path.join(os.path.dirname(__file__), '.git')) if use_git is None and not git_dir_exists: use_git = False self.use_git = use_git if use_git is not None else USE_GIT # Declared as False by default--later we check if astropy-helpers can be # upgraded from PyPI, but only if not using a source distribution (as in # the case of import from a git submodule) self.is_submodule = False @classmethod def main(cls, argv=None): if argv is None: argv = sys.argv config = cls.parse_config() config.update(cls.parse_command_line(argv)) auto_use = config.pop('auto_use', False) bootstrapper = cls(**config) if auto_use: # Run the bootstrapper, otherwise the setup.py is using the old # use_astropy_helpers() interface, in which case it will run the # bootstrapper manually after reconfiguring it. bootstrapper.run() return bootstrapper @classmethod def parse_config(cls): if not SETUP_CFG.has_section('ah_bootstrap'): return {} config = {} for option, type_ in CFG_OPTIONS: if not SETUP_CFG.has_option('ah_bootstrap', option): continue if type_ is bool: value = SETUP_CFG.getboolean('ah_bootstrap', option) else: value = SETUP_CFG.get('ah_bootstrap', option) config[option] = value return config @classmethod def parse_command_line(cls, argv=None): if argv is None: argv = sys.argv config = {} # For now we just pop recognized ah_bootstrap options out of the # arg list. This is imperfect; in the unlikely case that a setup.py # custom command or even custom Distribution class defines an argument # of the same name then we will break that. However there's a catch22 # here that we can't just do full argument parsing right here, because # we don't yet know *how* to parse all possible command-line arguments. if '--no-git' in argv: config['use_git'] = False argv.remove('--no-git') if '--offline' in argv: config['offline'] = True argv.remove('--offline') if '--auto-use' in argv: config['auto_use'] = True argv.remove('--auto-use') if '--no-auto-use' in argv: config['auto_use'] = False argv.remove('--no-auto-use') if '--use-system-astropy-helpers' in argv: config['auto_use'] = False argv.remove('--use-system-astropy-helpers') return config def run(self): strategies = ['local_directory', 'local_file', 'index'] dist = None # First, remove any previously imported versions of astropy_helpers; # this is necessary for nested installs where one package's installer # is installing another package via setuptools.sandbox.run_setup, as in # the case of setup_requires for key in list(sys.modules): try: if key == PACKAGE_NAME or key.startswith(PACKAGE_NAME + '.'): del sys.modules[key] except AttributeError: # Sometimes mysterious non-string things can turn up in # sys.modules continue # Check to see if the path is a submodule self.is_submodule = self._check_submodule() for strategy in strategies: method = getattr(self, 'get_{0}_dist'.format(strategy)) dist = method() if dist is not None: break else: raise _AHBootstrapSystemExit( "No source found for the {0!r} package; {0} must be " "available and importable as a prerequisite to building " "or installing this package.".format(PACKAGE_NAME)) # This is a bit hacky, but if astropy_helpers was loaded from a # directory/submodule its Distribution object gets a "precedence" of # "DEVELOP_DIST". However, in other cases it gets a precedence of # "EGG_DIST". However, when activing the distribution it will only be # placed early on sys.path if it is treated as an EGG_DIST, so always # do that dist = dist.clone(precedence=pkg_resources.EGG_DIST) # Otherwise we found a version of astropy-helpers, so we're done # Just active the found distribution on sys.path--if we did a # download this usually happens automatically but it doesn't hurt to # do it again # Note: Adding the dist to the global working set also activates it # (makes it importable on sys.path) by default. try: pkg_resources.working_set.add(dist, replace=True) except TypeError: # Some (much) older versions of setuptools do not have the # replace=True option here. These versions are old enough that all # bets may be off anyways, but it's easy enough to work around just # in case... if dist.key in pkg_resources.working_set.by_key: del pkg_resources.working_set.by_key[dist.key] pkg_resources.working_set.add(dist) @property def config(self): """ A `dict` containing the options this `_Bootstrapper` was configured with. """ return dict((optname, getattr(self, optname)) for optname, _ in CFG_OPTIONS if hasattr(self, optname)) def get_local_directory_dist(self): """ Handle importing a vendored package from a subdirectory of the source distribution. """ if not os.path.isdir(self.path): return log.info('Attempting to import astropy_helpers from {0} {1!r}'.format( 'submodule' if self.is_submodule else 'directory', self.path)) dist = self._directory_import() if dist is None: log.warn( 'The requested path {0!r} for importing {1} does not ' 'exist, or does not contain a copy of the {1} ' 'package.'.format(self.path, PACKAGE_NAME)) elif self.auto_upgrade and not self.is_submodule: # A version of astropy-helpers was found on the available path, but # check to see if a bugfix release is available on PyPI upgrade = self._do_upgrade(dist) if upgrade is not None: dist = upgrade return dist def get_local_file_dist(self): """ Handle importing from a source archive; this also uses setup_requires but points easy_install directly to the source archive. """ if not os.path.isfile(self.path): return log.info('Attempting to unpack and import astropy_helpers from ' '{0!r}'.format(self.path)) try: dist = self._do_download(find_links=[self.path]) except Exception as e: if DEBUG: raise log.warn( 'Failed to import {0} from the specified archive {1!r}: ' '{2}'.format(PACKAGE_NAME, self.path, str(e))) dist = None if dist is not None and self.auto_upgrade: # A version of astropy-helpers was found on the available path, but # check to see if a bugfix release is available on PyPI upgrade = self._do_upgrade(dist) if upgrade is not None: dist = upgrade return dist def get_index_dist(self): if not self.download: log.warn('Downloading {0!r} disabled.'.format(DIST_NAME)) return None log.warn( "Downloading {0!r}; run setup.py with the --offline option to " "force offline installation.".format(DIST_NAME)) try: dist = self._do_download() except Exception as e: if DEBUG: raise log.warn( 'Failed to download and/or install {0!r} from {1!r}:\n' '{2}'.format(DIST_NAME, self.index_url, str(e))) dist = None # No need to run auto-upgrade here since we've already presumably # gotten the most up-to-date version from the package index return dist def _directory_import(self): """ Import astropy_helpers from the given path, which will be added to sys.path. Must return True if the import succeeded, and False otherwise. """ # Return True on success, False on failure but download is allowed, and # otherwise raise SystemExit path = os.path.abspath(self.path) # Use an empty WorkingSet rather than the man # pkg_resources.working_set, since on older versions of setuptools this # will invoke a VersionConflict when trying to install an upgrade ws = pkg_resources.WorkingSet([]) ws.add_entry(path) dist = ws.by_key.get(DIST_NAME) if dist is None: # We didn't find an egg-info/dist-info in the given path, but if a # setup.py exists we can generate it setup_py = os.path.join(path, 'setup.py') if os.path.isfile(setup_py): # We use subprocess instead of run_setup from setuptools to # avoid segmentation faults - see the following for more details: # https://github.com/cython/cython/issues/2104 sp.check_output([sys.executable, 'setup.py', 'egg_info'], cwd=path) for dist in pkg_resources.find_distributions(path, True): # There should be only one... return dist return dist def _do_download(self, version='', find_links=None): if find_links: allow_hosts = '' index_url = None else: allow_hosts = None index_url = self.index_url # Annoyingly, setuptools will not handle other arguments to # Distribution (such as options) before handling setup_requires, so it # is not straightforward to programmatically augment the arguments which # are passed to easy_install class _Distribution(Distribution): def get_option_dict(self, command_name): opts = Distribution.get_option_dict(self, command_name) if command_name == 'easy_install': if find_links is not None: opts['find_links'] = ('setup script', find_links) if index_url is not None: opts['index_url'] = ('setup script', index_url) if allow_hosts is not None: opts['allow_hosts'] = ('setup script', allow_hosts) return opts if version: req = '{0}=={1}'.format(DIST_NAME, version) else: if UPPER_VERSION_EXCLUSIVE is None: req = DIST_NAME else: req = '{0}<{1}'.format(DIST_NAME, UPPER_VERSION_EXCLUSIVE) attrs = {'setup_requires': [req]} # NOTE: we need to parse the config file (e.g. setup.cfg) to make sure # it honours the options set in the [easy_install] section, and we need # to explicitly fetch the requirement eggs as setup_requires does not # get honored in recent versions of setuptools: # https://github.com/pypa/setuptools/issues/1273 try: context = _verbose if DEBUG else _silence with context(): dist = _Distribution(attrs=attrs) try: dist.parse_config_files(ignore_option_errors=True) dist.fetch_build_eggs(req) except TypeError: # On older versions of setuptools, ignore_option_errors # doesn't exist, and the above two lines are not needed # so we can just continue pass # If the setup_requires succeeded it will have added the new dist to # the main working_set return pkg_resources.working_set.by_key.get(DIST_NAME) except Exception as e: if DEBUG: raise msg = 'Error retrieving {0} from {1}:\n{2}' if find_links: source = find_links[0] elif index_url != INDEX_URL: source = index_url else: source = 'PyPI' raise Exception(msg.format(DIST_NAME, source, repr(e))) def _do_upgrade(self, dist): # Build up a requirement for a higher bugfix release but a lower minor # release (so API compatibility is guaranteed) next_version = _next_version(dist.parsed_version) req = pkg_resources.Requirement.parse( '{0}>{1},<{2}'.format(DIST_NAME, dist.version, next_version)) package_index = PackageIndex(index_url=self.index_url) upgrade = package_index.obtain(req) if upgrade is not None: return self._do_download(version=upgrade.version) def _check_submodule(self): """ Check if the given path is a git submodule. See the docstrings for ``_check_submodule_using_git`` and ``_check_submodule_no_git`` for further details. """ if (self.path is None or (os.path.exists(self.path) and not os.path.isdir(self.path))): return False if self.use_git: return self._check_submodule_using_git() else: return self._check_submodule_no_git() def _check_submodule_using_git(self): """ Check if the given path is a git submodule. If so, attempt to initialize and/or update the submodule if needed. This function makes calls to the ``git`` command in subprocesses. The ``_check_submodule_no_git`` option uses pure Python to check if the given path looks like a git submodule, but it cannot perform updates. """ cmd = ['git', 'submodule', 'status', '--', self.path] try: log.info('Running `{0}`; use the --no-git option to disable git ' 'commands'.format(' '.join(cmd))) returncode, stdout, stderr = run_cmd(cmd) except _CommandNotFound: # The git command simply wasn't found; this is most likely the # case on user systems that don't have git and are simply # trying to install the package from PyPI or a source # distribution. Silently ignore this case and simply don't try # to use submodules return False stderr = stderr.strip() if returncode != 0 and stderr: # Unfortunately the return code alone cannot be relied on, as # earlier versions of git returned 0 even if the requested submodule # does not exist # This is a warning that occurs in perl (from running git submodule) # which only occurs with a malformatted locale setting which can # happen sometimes on OSX. See again # https://github.com/astropy/astropy/issues/2749 perl_warning = ('perl: warning: Falling back to the standard locale ' '("C").') if not stderr.strip().endswith(perl_warning): # Some other unknown error condition occurred log.warn('git submodule command failed ' 'unexpectedly:\n{0}'.format(stderr)) return False # Output of `git submodule status` is as follows: # # 1: Status indicator: '-' for submodule is uninitialized, '+' if # submodule is initialized but is not at the commit currently indicated # in .gitmodules (and thus needs to be updated), or 'U' if the # submodule is in an unstable state (i.e. has merge conflicts) # # 2. SHA-1 hash of the current commit of the submodule (we don't really # need this information but it's useful for checking that the output is # correct) # # 3. The output of `git describe` for the submodule's current commit # hash (this includes for example what branches the commit is on) but # only if the submodule is initialized. We ignore this information for # now _git_submodule_status_re = re.compile( r'^(?P[+-U ])(?P[0-9a-f]{40}) ' r'(?P\S+)( .*)?$') # The stdout should only contain one line--the status of the # requested submodule m = _git_submodule_status_re.match(stdout) if m: # Yes, the path *is* a git submodule self._update_submodule(m.group('submodule'), m.group('status')) return True else: log.warn( 'Unexpected output from `git submodule status`:\n{0}\n' 'Will attempt import from {1!r} regardless.'.format( stdout, self.path)) return False def _check_submodule_no_git(self): """ Like ``_check_submodule_using_git``, but simply parses the .gitmodules file to determine if the supplied path is a git submodule, and does not exec any subprocesses. This can only determine if a path is a submodule--it does not perform updates, etc. This function may need to be updated if the format of the .gitmodules file is changed between git versions. """ gitmodules_path = os.path.abspath('.gitmodules') if not os.path.isfile(gitmodules_path): return False # This is a minimal reader for gitconfig-style files. It handles a few of # the quirks that make gitconfig files incompatible with ConfigParser-style # files, but does not support the full gitconfig syntax (just enough # needed to read a .gitmodules file). gitmodules_fileobj = io.StringIO() # Must use io.open for cross-Python-compatible behavior wrt unicode with io.open(gitmodules_path) as f: for line in f: # gitconfig files are more flexible with leading whitespace; just # go ahead and remove it line = line.lstrip() # comments can start with either # or ; if line and line[0] in (':', ';'): continue gitmodules_fileobj.write(line) gitmodules_fileobj.seek(0) cfg = RawConfigParser() try: cfg.readfp(gitmodules_fileobj) except Exception as exc: log.warn('Malformatted .gitmodules file: {0}\n' '{1} cannot be assumed to be a git submodule.'.format( exc, self.path)) return False for section in cfg.sections(): if not cfg.has_option(section, 'path'): continue submodule_path = cfg.get(section, 'path').rstrip(os.sep) if submodule_path == self.path.rstrip(os.sep): return True return False def _update_submodule(self, submodule, status): if status == ' ': # The submodule is up to date; no action necessary return elif status == '-': if self.offline: raise _AHBootstrapSystemExit( "Cannot initialize the {0} submodule in --offline mode; " "this requires being able to clone the submodule from an " "online repository.".format(submodule)) cmd = ['update', '--init'] action = 'Initializing' elif status == '+': cmd = ['update'] action = 'Updating' if self.offline: cmd.append('--no-fetch') elif status == 'U': raise _AHBootstrapSystemExit( 'Error: Submodule {0} contains unresolved merge conflicts. ' 'Please complete or abandon any changes in the submodule so that ' 'it is in a usable state, then try again.'.format(submodule)) else: log.warn('Unknown status {0!r} for git submodule {1!r}. Will ' 'attempt to use the submodule as-is, but try to ensure ' 'that the submodule is in a clean state and contains no ' 'conflicts or errors.\n{2}'.format(status, submodule, _err_help_msg)) return err_msg = None cmd = ['git', 'submodule'] + cmd + ['--', submodule] log.warn('{0} {1} submodule with: `{2}`'.format( action, submodule, ' '.join(cmd))) try: log.info('Running `{0}`; use the --no-git option to disable git ' 'commands'.format(' '.join(cmd))) returncode, stdout, stderr = run_cmd(cmd) except OSError as e: err_msg = str(e) else: if returncode != 0: err_msg = stderr if err_msg is not None: log.warn('An unexpected error occurred updating the git submodule ' '{0!r}:\n{1}\n{2}'.format(submodule, err_msg, _err_help_msg)) class _CommandNotFound(OSError): """ An exception raised when a command run with run_cmd is not found on the system. """ def run_cmd(cmd): """ Run a command in a subprocess, given as a list of command-line arguments. Returns a ``(returncode, stdout, stderr)`` tuple. """ try: p = sp.Popen(cmd, stdout=sp.PIPE, stderr=sp.PIPE) # XXX: May block if either stdout or stderr fill their buffers; # however for the commands this is currently used for that is # unlikely (they should have very brief output) stdout, stderr = p.communicate() except OSError as e: if DEBUG: raise if e.errno == errno.ENOENT: msg = 'Command not found: `{0}`'.format(' '.join(cmd)) raise _CommandNotFound(msg, cmd) else: raise _AHBootstrapSystemExit( 'An unexpected error occurred when running the ' '`{0}` command:\n{1}'.format(' '.join(cmd), str(e))) # Can fail of the default locale is not configured properly. See # https://github.com/astropy/astropy/issues/2749. For the purposes under # consideration 'latin1' is an acceptable fallback. try: stdio_encoding = locale.getdefaultlocale()[1] or 'latin1' except ValueError: # Due to an OSX oddity locale.getdefaultlocale() can also crash # depending on the user's locale/language settings. See: # http://bugs.python.org/issue18378 stdio_encoding = 'latin1' # Unlikely to fail at this point but even then let's be flexible if not isinstance(stdout, str): stdout = stdout.decode(stdio_encoding, 'replace') if not isinstance(stderr, str): stderr = stderr.decode(stdio_encoding, 'replace') return (p.returncode, stdout, stderr) def _next_version(version): """ Given a parsed version from pkg_resources.parse_version, returns a new version string with the next minor version. Examples ======== >>> _next_version(pkg_resources.parse_version('1.2.3')) '1.3.0' """ if hasattr(version, 'base_version'): # New version parsing from setuptools >= 8.0 if version.base_version: parts = version.base_version.split('.') else: parts = [] else: parts = [] for part in version: if part.startswith('*'): break parts.append(part) parts = [int(p) for p in parts] if len(parts) < 3: parts += [0] * (3 - len(parts)) major, minor, micro = parts[:3] return '{0}.{1}.{2}'.format(major, minor + 1, 0) class _DummyFile(object): """A noop writeable object.""" errors = '' # Required for Python 3.x encoding = 'utf-8' def write(self, s): pass def flush(self): pass @contextlib.contextmanager def _verbose(): yield @contextlib.contextmanager def _silence(): """A context manager that silences sys.stdout and sys.stderr.""" old_stdout = sys.stdout old_stderr = sys.stderr sys.stdout = _DummyFile() sys.stderr = _DummyFile() exception_occurred = False try: yield except: exception_occurred = True # Go ahead and clean up so that exception handling can work normally sys.stdout = old_stdout sys.stderr = old_stderr raise if not exception_occurred: sys.stdout = old_stdout sys.stderr = old_stderr _err_help_msg = """ If the problem persists consider installing astropy_helpers manually using pip (`pip install astropy_helpers`) or by manually downloading the source archive, extracting it, and installing by running `python setup.py install` from the root of the extracted source code. """ class _AHBootstrapSystemExit(SystemExit): def __init__(self, *args): if not args: msg = 'An unknown problem occurred bootstrapping astropy_helpers.' else: msg = args[0] msg += '\n' + _err_help_msg super(_AHBootstrapSystemExit, self).__init__(msg, *args[1:]) BOOTSTRAPPER = _Bootstrapper.main() def use_astropy_helpers(**kwargs): """ Ensure that the `astropy_helpers` module is available and is importable. This supports automatic submodule initialization if astropy_helpers is included in a project as a git submodule, or will download it from PyPI if necessary. Parameters ---------- path : str or None, optional A filesystem path relative to the root of the project's source code that should be added to `sys.path` so that `astropy_helpers` can be imported from that path. If the path is a git submodule it will automatically be initialized and/or updated. The path may also be to a ``.tar.gz`` archive of the astropy_helpers source distribution. In this case the archive is automatically unpacked and made temporarily available on `sys.path` as a ``.egg`` archive. If `None` skip straight to downloading. download_if_needed : bool, optional If the provided filesystem path is not found an attempt will be made to download astropy_helpers from PyPI. It will then be made temporarily available on `sys.path` as a ``.egg`` archive (using the ``setup_requires`` feature of setuptools. If the ``--offline`` option is given at the command line the value of this argument is overridden to `False`. index_url : str, optional If provided, use a different URL for the Python package index than the main PyPI server. use_git : bool, optional If `False` no git commands will be used--this effectively disables support for git submodules. If the ``--no-git`` option is given at the command line the value of this argument is overridden to `False`. auto_upgrade : bool, optional By default, when installing a package from a non-development source distribution ah_boostrap will try to automatically check for patch releases to astropy-helpers on PyPI and use the patched version over any bundled versions. Setting this to `False` will disable that functionality. If the ``--offline`` option is given at the command line the value of this argument is overridden to `False`. offline : bool, optional If `False` disable all actions that require an internet connection, including downloading packages from the package index and fetching updates to any git submodule. Defaults to `True`. """ global BOOTSTRAPPER config = BOOTSTRAPPER.config config.update(**kwargs) # Create a new bootstrapper with the updated configuration and run it BOOTSTRAPPER = _Bootstrapper(**config) BOOTSTRAPPER.run() pyvo-1.2.1/astropy_helpers/000077500000000000000000000000001416757633600157555ustar00rootroot00000000000000pyvo-1.2.1/conftest.py000066400000000000000000000022271416757633600147340ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst # This file is the main file used when running tests with pytest directly, # in particular if running e.g. ``pytest docs/``. import os import tempfile try: from pytest_astropy_header.display import PYTEST_HEADER_MODULES, TESTED_VERSIONS except ImportError: PYTEST_HEADER_MODULES = {} TESTED_VERSIONS = {} try: from pyvo import __version__ as version except ImportError: version = 'unknown' TESTED_VERSIONS['pyvo'] = version # Make sure we use temporary directories for the config and cache # so that the tests are insensitive to local configuration. os.environ['XDG_CONFIG_HOME'] = tempfile.mkdtemp('astropy_config') os.environ['XDG_CACHE_HOME'] = tempfile.mkdtemp('astropy_cache') os.mkdir(os.path.join(os.environ['XDG_CONFIG_HOME'], 'astropy')) os.mkdir(os.path.join(os.environ['XDG_CACHE_HOME'], 'astropy')) # Note that we don't need to change the environment variables back or remove # them after testing, because they are only changed for the duration of the # Python process, and this configuration only matters if running pytest # directly, not from e.g. an IPython session. pyvo-1.2.1/docs/000077500000000000000000000000001416757633600134625ustar00rootroot00000000000000pyvo-1.2.1/docs/Makefile000066400000000000000000000111641416757633600151250ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest #This is needed with git because git doesn't create a dir if it's empty $(shell [ -d "_static" ] || mkdir -p _static) help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR) -rm -rf api html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Astropy.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Astropy.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/Astropy" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Astropy" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." make -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." pyvo-1.2.1/docs/_templates/000077500000000000000000000000001416757633600156175ustar00rootroot00000000000000pyvo-1.2.1/docs/_templates/autosummary/000077500000000000000000000000001416757633600202055ustar00rootroot00000000000000pyvo-1.2.1/docs/_templates/autosummary/base.rst000066400000000000000000000003721416757633600216530ustar00rootroot00000000000000{% extends "autosummary_core/base.rst" %} {# The template this is inherited from is in astropy/sphinx/ext/templates/autosummary_core. If you want to modify this template, it is strongly recommended that you still inherit from the astropy template. #}pyvo-1.2.1/docs/_templates/autosummary/class.rst000066400000000000000000000003731416757633600220470ustar00rootroot00000000000000{% extends "autosummary_core/class.rst" %} {# The template this is inherited from is in astropy/sphinx/ext/templates/autosummary_core. If you want to modify this template, it is strongly recommended that you still inherit from the astropy template. #}pyvo-1.2.1/docs/_templates/autosummary/module.rst000066400000000000000000000003741416757633600222300ustar00rootroot00000000000000{% extends "autosummary_core/module.rst" %} {# The template this is inherited from is in astropy/sphinx/ext/templates/autosummary_core. If you want to modify this template, it is strongly recommended that you still inherit from the astropy template. #}pyvo-1.2.1/docs/auth/000077500000000000000000000000001416757633600144235ustar00rootroot00000000000000pyvo-1.2.1/docs/auth/index.rst000066400000000000000000000005241416757633600162650ustar00rootroot00000000000000****************** Auth (`pyvo.auth`) ****************** This module contains submodules which help handle auth when communicating with virtual observatory services. Reference/API ============= .. automodapi:: pyvo.auth .. automodapi:: pyvo.auth.authsession .. automodapi:: pyvo.auth.authurls .. automodapi:: pyvo.auth.credentialstore pyvo-1.2.1/docs/conf.py000066400000000000000000000144461416757633600147720ustar00rootroot00000000000000# -*- coding: utf-8 -*- # Licensed under a 3-clause BSD style license - see LICENSE.rst # # Astropy documentation build configuration file. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this file. # # All configuration values have a default. Some values are defined in # the global Astropy configuration which is loaded here before anything else. # See astropy.sphinx.conf for which values are set there. # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('..')) # IMPORTANT: the above commented section was generated by sphinx-quickstart, but # is *NOT* appropriate for astropy or Astropy affiliated packages. It is left # commented out with this explanation to make it clear why this should not be # done. If the sys.path entry above is added, when the astropy.sphinx.conf # import occurs, it will import the *source* version of astropy instead of the # version installed (if invoked as "make html" or directly with sphinx), or the # version in the build directory (if "python setup.py build_sphinx" is used). # Thus, any C-extensions that are needed to build the documentation will *not* # be accessible, and the documentation will not build correctly. import datetime import os import sys try: import astropy_helpers except ImportError: # Building from inside the docs/ directory? if os.path.basename(os.getcwd()) == 'docs': a_h_path = os.path.abspath(os.path.join('..', 'astropy_helpers')) if os.path.isdir(a_h_path): sys.path.insert(1, a_h_path) # Load all of the global Astropy configuration from sphinx_astropy.conf import * # Get configuration information from setup.cfg try: from ConfigParser import ConfigParser except ImportError: from configparser import ConfigParser conf = ConfigParser() conf.read([os.path.join(os.path.dirname(__file__), '..', 'setup.cfg')]) setup_cfg = dict(conf.items('metadata')) # -- General configuration ---------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. needs_sphinx = '1.7' # To perform a Sphinx version check that needs to be more specific than # major.minor, call `check_sphinx_version("x.y.z")` here. # check_sphinx_version("1.2.1") # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns.append('_templates') # Add any paths that contain templates here, relative to this directory. if 'templates_path' not in locals(): # in case parent conf.py defines it templates_path = [] templates_path.append('_templates') # This is added to the end of RST files - a good place to put substitutions to # be used globally. rst_epilog += """ """ # -- Project information ------------------------------------------------------ # This does not *have* to match the package name, but typically does project = setup_cfg['package_name'] author = setup_cfg['author'] copyright = '{}, {}'.format( datetime.datetime.now().year, setup_cfg['author']) # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. __import__(setup_cfg['package_name']) package = sys.modules[setup_cfg['package_name']] # The short X.Y version. version = package.__version__.split('-', 1)[0] # The full version, including alpha/beta/rc tags. release = package.__version__ # -- Options for HTML output --------------------------------------------------- # A NOTE ON HTML THEMES # The global astropy configuration uses a custom theme, 'bootstrap-astropy', # which is installed along with astropy. A different theme can be used or # the options for this theme can be modified by overriding some of the # variables set in the global configuration. The variables set in the # global configuration are listed below, commented out. # Add any paths that contain custom themes here, relative to this directory. # To use a different custom theme, add the directory containing the theme. #html_theme_path = [] # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. To override the custom theme, set this to the # name of a builtin theme or the name of a custom theme in html_theme_path. #html_theme = None # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = '' # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '' # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". html_title = '{} v{}'.format(project, release) # Output file base name for HTML help builder. htmlhelp_basename = project + 'doc' # -- Options for LaTeX output -------------------------------------------------- # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [('index', project + '.tex', project + ' Documentation', author, 'manual')] # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [('index', project.lower(), project + ' Documentation', [author], 1)] # -- Options for the edit_on_github extension ---------------------------------------- if eval(setup_cfg.get('edit_on_github')): extensions += ['astropy.sphinx.ext.edit_on_github'] versionmod = __import__(setup_cfg['package_name'] + '.version') edit_on_github_project = setup_cfg['github_project'] if versionmod.release: edit_on_github_branch = "v" + versionmod.version else: edit_on_github_branch = "main" edit_on_github_source_root = "" edit_on_github_doc_root = "docs" pyvo-1.2.1/docs/dal/000077500000000000000000000000001416757633600142225ustar00rootroot00000000000000pyvo-1.2.1/docs/dal/index.rst000066400000000000000000000370641416757633600160750ustar00rootroot00000000000000.. _pyvo-data-access: ************************ Data Access (`pyvo.dal`) ************************ This subpackage provides access to the various data servies in the VO. Getting started =============== Service objects are created with the service url and provide service-specific metadata. >>> service = vo.dal.SIAService("http://dc.zah.uni-heidelberg.de/lswscans/res/positions/siap/siap.xml") >>> print(service.description) They provide a ``search`` method with varying standard parameters for submitting queries. >>> resultset = service.search(pos=pos, size=size) which returns a :ref:`resultset `. Individual services may define additional, custom parameters. You can pass these to the ``search`` method as (case-insensitive) keyword arguments. Call the method ``describe`` to print human-readable service metadata. You most likely want to use this in a notebook session or similar before actually querying the service. See :ref:`pyvo-services` for a explanation of the different interfaces. .. _pyvo-astro-params: Astrometrical parameters ------------------------ Most services expose the astrometrical parameters ``pos`` and ``size`` for which PyVO accept `~astropy.coordinates.SkyCoord` or `~astropy.units.Quantity` objects as well as any other sequence containing right ascension and declination in degrees, which are converted to the standard coordinate frame (in the VO, that usually is ICRS) in the standard units (always degrees in the VO) before they are submitted to the service. Also, `~astropy.coordinates.SkyCoord` can be used to lookup names of astronomical objects you are searching for. >>> import pyvo as vo >>> from astropy.coordinates import SkyCoord >>> from astropy.units import Quantity >>> >>> pos = SkyCoord.from_name('NGC 4993') >>> size = Quantity(0.5, unit="deg") See :ref:`astropy-coordinates` and :ref:`astropy-units` for details. The `~astropy.units.Quantity` object is also suitable for any other astrometrical parameter, such as waveband ranges. Some services also accept `~astropy.time.Time` as ``time`` parameter. >>> from astropy.time import Time >>> time = Time( >>> ('2015-01-01T00:00:00', '2018-01-01T00:00:00'), >>> format='isot', scale='utc' >>> ) See :ref:`astropy-time` for explanation. .. _pyvo-verbosity: Verbosity --------- Several VO protocols have the notion of “verbosityâ€, where 1 means “minimal set of columnsâ€, 2 means “columns most users can work with†and 3 â€everything including exotic itemsâ€. Query functions accept these values in the ``verbosity`` parameter. The exact semantics are service-specific. Availability and capabilities ----------------------------- VO services should offer some standard â€support†interfaces specified in VOSI. In pyVO, the information obtained from these endpoints can be obtained from some service attributes. For availability (i.e., is the service up and running?), this is :py:attr:`~pyvo.dal.mixin.AvailabilityMixin.available` and :py:attr:`~pyvo.dal.mixin.AvailabilityMixin.up_since` Capabilities describe specific pieces of functionality (such as “this is a spectral searchâ€) and further metadata (such as â€this service will never return more than 10000 rowsâ€). This information is contained in the datastructure :py:class:`~pyvo.io.vosi.endpoint.CapabilitiesFile` available through :py:attr:`~pyvo.dal.mixin.CapabilityMixin.capabilities`. Exceptions ---------- See :py:mod:`pyvo.dal.exceptions`. .. _pyvo-services: Services ======== There are five types of services with different purposes but a similiar interface available. .. _pyvo_tap: Table Access Protocol --------------------- Unlike the other services, this one works with tables queryable by an sql-ish language called *ADQL* instead of predefined search constraints. >>> tap_service = vo.dal.TAPService("http://dc.g-vo.org/tap") >>> tap_results = tap_service.search("SELECT TOP 10 * FROM ivoa.obscore") As a sanity precaution, most services have some default limit of how many rows they will return before overflowing: >>> print(tap_service.maxrec) To retrieve more rows than that (often conservative) default limit, you must override maxrec in the call to ``search``: >>> tap_results = tap_service.search( >>> "SELECT * FROM ivoa.obscore", maxrec=100000) Services will not let you raise maxrec beyond the hard match limit: >>> print(tap_service.hardlimit) A list of the tables and the columns within them is available in the TAPService's :py:attr:`~pyvo.dal.TAPService.tables` attribute by using it as an iterator or calling it's ``describe()`` method for a human-readable summary. Uploads ^^^^^^^ Some TAP services allow you to upload your own tables to make them accessible in queries. For this the various query methods have a ``uploads`` keyword, which accepts a dictionary of table name and content. The mechanism behind this parameter is smart enough to distinct between various types of content, either a :py:class:`~str` pointing to a local file or a file-like object, a :py:class:`~astropy.table.Table` or :py:class:`~pyvo.dal.query.DALResults` for an inline upload, or a url :py:class:`~str` pointing to a remote resource. The uploaded tables will be available as ``TAP_UPLOAD.name``. .. note:: The supported upload methods are available under :py:meth:`~pyvo.dal.tap.TAPService.upload_methods`. .. _pyvo-sia: Simple Image Access ------------------- Like the name says, this service serves astronomical images. Basic queries are done with the ``pos`` and ``size`` parameters described in :ref:`pyvo-astro-params`, with ``size`` being the rectangular region around ``pos``. >>> pos = SkyCoord.from_name('Eta Carina') >>> size = Quantity(0.5, unit="deg") >>> sia_service = vo.dal.SIAService("http://dc.zah.uni-heidelberg.de/hppunion/q/im/siap.xml") >>> sia_results = sia_service.search(pos=pos, size=size) The dataset format, 'all' by default, can be specified: >>> sia_results = sia_service.search(pos=pos, size=size, format='graphics') This would return all graphical image formats (png, jpeg, gif) available. Other possible values are image/* mimetypes, or ``metadata``, which returns no image at all but instead a declaration of the additional parameters supported by the given service. The ``intersect`` argument (defaulting to ``OVERLAPS``) lets a program specify the desired relationship between the region of interest and the coverage of the images (case-insensitively): >>> sia_results = sia_service.search(pos=pos, size=size, intersect='covers') Available values: ========= ====================================================== COVERS select images that completely cover the search region ENCLOSED select images that are complete enclosed by the region OVERLAPS select any image that overlaps with the search region CENTER select images whose center is within the search region ========= ====================================================== This service exposes the :ref:`verbosity ` parameter Simple Spectrum Access ---------------------- Access to (one-dimensional) spectra resembles image access, with some subtile differences: The size parameter is called ``diameter`` here, and hence the search region is always circular with ``pos`` as center: >>> ssa_service = vo.dal.SSAService("http://www.isdc.unige.ch/vo-services/lc") >>> ssa_results = ssa_service.search(pos=pos, diameter=size) SSA queries can be further constrained by the ``band`` and ``time`` parameters. >>> ssa_results = ssa_service.search( >>> pos=pos, diameter=size, >>> time=time, band=Quantity((1e-13, 1e-12), unit="meter") >>> ) Simple Cone Search ------------------ The Simple Cone Search returns results – typically catalog entries – within a circular region on the sky defined by the parameters ``pos`` (again, ICRS) and ``radius``: >>> scs_srv = vo.dal.SCSService( >>> 'http://dc.zah.uni-heidelberg.de/arihip/q/cone/scs.xml') >>> scs_results = scs_srv.search(pos=pos, radius=size) This service exposes the :ref:`verbosity ` parameter Simple Line Access ------------------ This service let you query for spectral lines in a certain ``wavelength`` range. The unit of the values is meters, but any unit may be specified using `~astropy.units.Quantity`. Jobs ==== Some services, most notably TAP ones, allow asynchronous operation (i.e., you submit a job, receive a URL where to check for updates, and then can go away) using a VO standard called UWS. These have a ``submit_job`` method, which has the same parameters as their ``search`` but start a server-side job instead of waiting for the result to return. This is particulary useful for longer-running queries or when you want to run several queries in parallel from one script. .. note:: It is good practice to test the query with a maxrec constraint first. When you invoke ``submit job`` you will get a job object. >>> async_srv = vo.dal.TAPService("http://dc.g-vo.org/tap") >>> job = async_srv.submit_job("SELECT * FROM ivoa.obscore") .. note:: Currently, only `pyvo.dal.tap.TAPService` supports server-side jobs. This job is not yet running yet. To start it invoke ``run`` >>> job.run() Get the current job phase: >>> print(job.phase) RUN Maximum run time in seconds is available and can be changed with :py:attr:`~pyvo.dal.tap.AsyncTAPJob.execution_duration` >>> print(job.execution_duration) 3600 >>> job.execution_duration = 7200 Obtaining the job url, which is needed to reconstruct the job at a later point: >>> job_url = job.url >>> job = vo.dal.tap.AsyncTAPJob(job_url) Besides ``run`` there are also several other job control methods: * :py:meth:`~pyvo.dal.tap.AsyncTAPJob.abort` * :py:meth:`~pyvo.dal.tap.AsyncTAPJob.delete` * :py:meth:`~pyvo.dal.tap.AsyncTAPJob.wait` .. note:: Usually the service deletes the job after a certain time, but it is a good practice to delete it manually when done. The destruction time can be obtained and changed with :py:attr:`~pyvo.dal.tap.AsyncTAPJob.destruction` Also, :py:class:`pyvo.dal.tap.AsyncTAPJob` works as a context manager which takes care of this automatically: >>> with async_srv.submit_job("SELECT * FROM ivoa.obscore") as job: >>> job.run() >>> print('Job deleted!') Check for errors in the job execution: >>> job.raise_if_error() If the execution was successful, the resultset can be obtained using :py:meth:`~pyvo.dal.tap.AsyncTAPJob.fetch_result` The result url is available under :py:attr:`~pyvo.dal.tap.AsyncTAPJob.result_uri` .. _pyvo-resultsets: Resultsets and Records ====================== Resultsets contain primarily tabular data and might also provide binary datasets and/or access to additional data services. To obtain the names of the columns in a service response, write: >>> print(resultset.fieldnames) Rich metadata equivalent to what is found in VOTables (including unit, ucd, utype, and xtype) is available through resultset's :py:meth:`~pyvo.dal.query.DALResults.getdesc` method: >>> print(resultset.getdesc("accref").ucd) .. note:: Two convenience functions let you retrieve columns of a specific physics (by UCD) or with a particular legacy data model annotation (by utype), like this: >>> fieldname = resultset.fieldname_with_ucd('phot.mag;em.opt.V') >>> fieldname = resultset.fieldname_with_utype('Access.Reference') Iterating over a resultset gives the rows in the result: >>> for row in resultset: >>> print row['accref'] ... The total number of rows in the answer is available as its ``len()``: >>> print(len(resultset)) 9 If the row contains datasets, they are exposed by several retrieval methods: >>> url = row.getdataurl() >>> fileobj = row.getdataset() >>> obj = row.getdataobj() Returning the access url, the file-like object or the appropiate python object to further work on. As with general numpy arrays, accessing individual columns via names gives an array of all of their values: >>> column = resultset['accref'] whereas integers retrieve columns: >>> row = resultset[0] and both combined gives a single value: >>> value = resultset['accref', 0] Row objects may expose certain key columns as properties. See the corresponding API spec listed below for details. * :py:class:`pyvo.dal.sia.SIARecord` * :py:class:`pyvo.dal.ssa.SSARecord` * :py:class:`pyvo.dal.scs.SCSRecord` * :py:class:`pyvo.dal.sla.SLARecord` Multiple datasets ----------------- PyVO supports multiple datasets exposed on record level through the datalink. To get an iterator yielding specific datasets, call :py:meth:`pyvo.dal.adhoc.DatalinkResults.bysemantics` with the identifier identifying the dataset you want it to return. >>> preview = next(row.getdatalink().bysemantics('#preview')).getdataset() .. note:: Since the creation of datalink objects requires a network roundtrip, it is recommended to call ``getdatalink`` only once. Of course one can also build a datalink object from it's url. >>> datalink = DatalinkResults.from_result_url(url) Server-side processing ---------------------- Some services support the server-side processing of record datasets. This includes spatial cutouts for 2d-images, reducing of spectra to a certain waveband range, and many more depending on the service. Datalink ^^^^^^^^ Generic access to processing services is provided through the datalink interface. >>> datalink_proc = next(row.getdatalink().bysemantics('#proc')) .. note:: most times there is only one processing service per result, and thats all you need. >>> datalink_proc = row.getdatalink().get_first_proc() The returned object lets you access the available input parameters which you can pass as keywords to the ``process`` method. >>> print(datalink_proc.input_params) For more details about this have a look at :py:class:`astropy.io.votable.tree.Param`. Calling the method will return a file-like object on sucess. >>> print(datalink_proc) >>> fobj = datalink.process(circle=(1, 1, 1)) SODA ^^^^ SODA is a service with predefined parameters, available on row-level through :py:meth:`pyvo.dal.adhoc.SodaRecordMixin.processed` which exposes a set of parameters who are dependend on the type of service. - ``circle`` -- a sequence (degrees) or :py:class:`astropy.units.Quantity` of longitude, latitude and radius - ``range`` -- a sequence (degrees) or :py:class:`astropy.units.Quantity` of two longitude values and two latitude values describing a rectangle. - ``polygon`` -- multiple pairs of longitude and latitude points - ``band`` -- a sequence of two values (meters) or :py:class:`astropy.units.Quantity` with two bandwitdh values. The right sort order will be ensured if converting from frequency to wavelength. Interoperabillity over SAMP --------------------------- Tables and datasets can be send to other astronomical applications, providing they have support for SAMP (Simple Application Messaging Protocol). You can either broadcast whole tables by calling ``broadcast_samp`` on the resultset or a single product (image, spectrum) by calling this method on the SIA or SSA record. .. note:: Don't forget to start the application and make sure there is a runnung SAMP Hub. Underlying data structures -------------------------- PyVO also allows access to underlying data structures. The astropy data class :py:class:`astropy.table.Table` is accessible with the method :py:meth:`pyvo.dal.DALResults.to_table`, following astropy naming conventions. If you want to work with the XML data structures :py:class:`astropy.io.votable.tree.VOTableFile` or :py:class:`astropy.io.votable.tree.Table`, they are accessible by the attributes :py:attr:`pyvo.dal.DALResults.resultstable` and :py:attr:`pyvo.dal.DALResults.votable`, respectively. Reference/API ============= .. automodapi:: pyvo.dal .. automodapi:: pyvo.dal.adhoc .. automodapi:: pyvo.dal.exceptions pyvo-1.2.1/docs/index.rst000066400000000000000000000071131416757633600153250ustar00rootroot00000000000000PyVO ==== Introduction ------------ This is the documentation for PyVO, an affiliated package for the `astropy `__ package. PyVO lets you find and retrieve astronomical data available from archives that support standard `IVOA `__ virtual observatory service protocols. * `Table Access Protocol (TAP) `_ -- accessing source catalogs using sql-ish queries. * `Simple Image Access (SIA) `_ -- finding images in an archive. * `Simple Spectral Access (SSA) `_ -- finding spectra in an archive. * `Simple Cone Search (SCS) `_ -- for positional searching a source catalog or an observation log. * `Simple Line Access (SLAP) `_ -- finding data about spectral lines, including their rest frequencies. .. note:: If you need to access data which is not available via the Virtual Observatory standards, try the astropy affiliated package `astroquery `__ (and, of course, ask the data providers to do the right thing and use the proper standards for their publication). Installation ------------ PyVO is installable via pip. .. code-block:: bash pip install pyvo Source Installation ^^^^^^^^^^^^^^^^^^^ .. code-block:: bash git clone http://github.com/pyvirtobs/pyvo cd pyvo python setup.py install Requirements ------------ * numpy * astropy * requests .. note:: With numpy below version 1.14.0 there are some regression with float representations. See ``__ for details. .. _getting-started: Getting started --------------- Data Access ^^^^^^^^^^^ Most of the interesting functionality of pyVO is through the various data access service interfaces (SCS for catalogs, SIA for images, SSAP for spectra, TAP for tables). All of these behave in a similar way. First, there is a class describing a specific type of service: >>> import pyvo as vo >>> service = vo.dal.TAPService("http://dc.g-vo.org/tap") Once you have a service object, you can run queries with parameters specific to the service type. In this example, a database query is enough: >>> resultset = service.search("SELECT TOP 1 * FROM ivoa.obscore") dataproduct_type dataproduct_subtype calib_level ... s_pixel_scale em_ucd ... arcs object object int16 ... float64 object ---------------- ------------------- ----------- ... ------------- ------ image 1 ... -- What is returned by the search method is a to get a resultset object, which esseintially works like a numpy record array. It can be processed either by columns: >>> row = resultset[0] >>> column = resultset["dataproduct_type"] or by rows. >>> for row in resultset: >>> calib_level = row["calib_level"] For more details on how to use data access services see :ref:`pyvo-data-access` Registry search ^^^^^^^^^^^^^^^ PyVO also contains a component that lets your programs interrogate the IVOA Registry in a simple way. For instance, to iterate over all TAP services supporting the obscore data model (which lets people publish observational datasets through TAP tables), you can write: >>> for service in vo.regsearch(datamodel="obscore"): ... print(service) Using `pyvo` ------------ .. toctree:: :maxdepth: 1 dal/index registry/index io/index auth/index pyvo-1.2.1/docs/io/000077500000000000000000000000001416757633600140715ustar00rootroot00000000000000pyvo-1.2.1/docs/io/index.rst000066400000000000000000000002701416757633600157310ustar00rootroot00000000000000************** IO (`pyvo.io`) ************** This module contains submodules which handle datastructures related to the virtual observatory. .. toctree:: :maxdepth: 1 vosi uws pyvo-1.2.1/docs/io/uws.rst000066400000000000000000000002411416757633600154360ustar00rootroot00000000000000******************* UWS (`pyvo.io.uws`) ******************* Reference/API ============= .. automodapi:: pyvo.io.uws.endpoint .. automodapi:: pyvo.io.uws.tree pyvo-1.2.1/docs/io/vosi.rst000066400000000000000000000004561416757633600156100ustar00rootroot00000000000000********************* VOSI (`pyvo.io.vosi`) ********************* Reference/API ============= .. automodapi:: pyvo.io.vosi.endpoint .. automodapi:: pyvo.io.vosi.voresource .. automodapi:: pyvo.io.vosi.vodataservice .. automodapi:: pyvo.io.vosi.tapregext .. automodapi:: pyvo.io.vosi.availability pyvo-1.2.1/docs/make.bat000066400000000000000000000106411416757633600150710ustar00rootroot00000000000000@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=_build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Astropy.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Astropy.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) :end pyvo-1.2.1/docs/registry/000077500000000000000000000000001416757633600153325ustar00rootroot00000000000000pyvo-1.2.1/docs/registry/index.rst000066400000000000000000000025211416757633600171730ustar00rootroot00000000000000.. _pyvo-registry: ************************** Registry (`pyvo.registry`) ************************** This subpackage let you find data access services using search parameters. Getting started =============== Registry searches are performed using the :py:meth:`pyvo.registry.search` method. >>> from pyvo.registry import search as regsearch It is possible to match against a list of ``keywords`` to find resources related to a particular topic, for instances services containing data about quasars. >>> services = regsearch(keywords=['quasar']) A single keyword can be specified as a single string instead of a list. >>> services = regsearch(keywords='quasar') Furthermore the search can be limited to a certain ``servicetype``, one of sia, ssa, scs, sla, tap. >>> services = regsearch(keywords=['quasar'], servicetype='tap') Filtering by the desired waveband is also possible. >>> services = regsearch( ... keywords=['quasar'], servicetype='tap', waveband='x-ray') And at last, the data model can be specified. >>> obscore_services = regsearch(datamodel='ObsCore') Search results ============== Registry search results are similar to :ref:`pyvo-resultsets`. See :py:class:`pyvo.registry.regtap.RegistryResource` for a listing of row attributes. Reference/API ============= .. automodapi:: pyvo.registry .. automodapi:: pyvo.registry.regtap pyvo-1.2.1/docs/requirements.txt000066400000000000000000000002661416757633600167520ustar00rootroot00000000000000sphinx-astropy # 27/Oct/2021 - docutils pinned due to: # https://github.com/readthedocs/readthedocs.org/issues/8616 # https://github.com/sphinx-doc/sphinx/issues/9727 docutils<0.18 pyvo-1.2.1/examples/000077500000000000000000000000001416757633600143505ustar00rootroot00000000000000pyvo-1.2.1/examples/auth/000077500000000000000000000000001416757633600153115ustar00rootroot00000000000000pyvo-1.2.1/examples/auth/cadc_auth_example.py000066400000000000000000000016451416757633600213170ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Example for authenticating with CADC TAP service """ import getpass import requests import pyvo from pyvo.auth import authsession # Gather login information data = { 'username': input('Username:'), 'password': getpass.getpass('Password:') } headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain' } # Do the login and get the cookie login_url = 'https://ws-cadc.canfar.net/ac/login' response = requests.post(login_url, data=data, headers=headers) response.raise_for_status() cookie = '\"' + response.text + '\"' # Configure the session and run the query auth = authsession.AuthSession() auth.credentials.set_cookie('CADC_SSO', cookie) service = pyvo.dal.TAPService('https://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/tap', auth) job = service.search('SELECT * from TAP_SCHEMA.tables') print(job) pyvo-1.2.1/examples/auth/cert_auth_example.py000066400000000000000000000010601416757633600213510ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Example for using client certificate authentication with CADC TAP service Tests for pyvo.extensions.authsession """ import pyvo from pyvo.auth import authsession certificate_path = input('Path to client certificate file:') auth = authsession.AuthSession() auth.credentials.set_client_certificate(certificate_path) service = pyvo.dal.TAPService('https://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/tap', auth) job = service.search('SELECT * from TAP_SCHEMA.tables') print(job) pyvo-1.2.1/examples/auth/gaia_auth_example.py000066400000000000000000000020071416757633600213170ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Example for authenticating with Gaia TAP service """ import getpass import requests import pyvo from pyvo.auth import securitymethods, authsession # Gather login information data = { 'username': input('Username:'), 'password': getpass.getpass('Password:') } headers = { 'Content-Type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain' } # Create a session and do the login. # The cookie will end up in the cookie jar of the session. login_url = 'http://gea.esac.esa.int/tap-server/login' session = requests.Session() response = session.post(login_url, data=data, headers=headers) response.raise_for_status() # Use this session with the auth cookie for all requests to Gaia. auth = authsession.AuthSession() auth.credentials.set(securitymethods.ANONYMOUS, session) service = pyvo.dal.TAPService('http://gea.esac.esa.int/tap-server/tap', auth) job = service.search('SELECT * from TAP_SCHEMA.tables') print(job) pyvo-1.2.1/examples/images/000077500000000000000000000000001416757633600156155ustar00rootroot00000000000000pyvo-1.2.1/examples/images/README.rst000066400000000000000000000011241416757633600173020ustar00rootroot00000000000000Example Scripts =============== This directory contains example scripts that illustrate the use of pyvo. Be sure that that pyvo (e.g. the parent of this directory) is in your PYTHONPATH. (And don't forget: these require network access, and an unreliable or slow network may produce poor results.) ex_casA_image_cat.py discovers archives that may have x-ray images and then queries those archives to find what x-ray images they have of CasA; the list of images are saved to a CSV file. ex_get_cutouts.py downloads cut-out images for a list of source from the NVSS survey. pyvo-1.2.1/examples/images/ex_casA_image_cat.py000066400000000000000000000020711416757633600215230ustar00rootroot00000000000000#! /usr/bin/env python import pyvo as vo from astropy.coordinates import SkyCoord import warnings warnings.filterwarnings('ignore', module="astropy.io.votable.*") # find archives with x-ray images archives = vo.regsearch(servicetype='image', waveband='x-ray') # position of my favorite source pos = SkyCoord.from_name('Cas A') # find images and list in a file with open('cas-a.csv', 'w') as csv: print("Archive short name,Archive title,Image" "title,RA,Dec,format,URL", file=csv) for arch in archives: print("searching {}...".format(arch.short_name)) try: matches = arch.search(pos=pos, size=0.25) except vo.DALAccessError as ex: print("Trouble accessing {} archive ({})".format( arch.short_name, str(ex))) continue print("...found {} images.".format(len(matches))) for image in matches: print(','.join( (arch.short_name, arch.res_title, image.title, str(image.pos), image.format, image.getdataurl())), file=csv) pyvo-1.2.1/examples/images/ex_get_cutouts.py000066400000000000000000000014311416757633600212270ustar00rootroot00000000000000#! /usr/bin/env python from astropy.coordinates import SkyCoord import pyvo as vo import os # obtain your list of positions from somewhere sourcenames = ["ngc4258", "m101", "m51"] mysources = {} for src in sourcenames: mysources[src] = SkyCoord.from_name(src) # create an output directory for cutouts if not os.path.exists("NVSSimages"): os.mkdir("NVSSimages") # setup a query object for NVSS nvss = "http://skyview.gsfc.nasa.gov/cgi-bin/vo/sia.pl?survey=nvss&" query = vo.sia.SIAQuery(nvss) query.size = 0.2 # degrees query.format = 'image/fits' for name, pos in mysources.items(): query.pos = pos results = query.execute() for image in results: print("Downloading %s..." % name) image.cachedataset(filename="NVSSimages/%s.fits" % name) pyvo-1.2.1/examples/notebooks/000077500000000000000000000000001416757633600163535ustar00rootroot00000000000000pyvo-1.2.1/examples/notebooks/simple_service_discovery.ipynb000066400000000000000000000152051416757633600245210ustar00rootroot00000000000000{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pyvo as vo" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The most common use of the registry is to find archives with \n", "`VO data access services`, and the simplest way\n", "to do this is to use the \n", "`~pyvo.regsearch` function. For example, to find data\n", "collections that contain searchable X-ray images:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "services = vo.regsearch(servicetype='sia', waveband='x-ray')\n", "len(services)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aha! Perhaps you didn't realize there were that many.\n", "What collections are these?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for service in services:\n", " print(service.res_title)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can gather, each record in the registry search results\n", "represents a different service (in this case, an image service).\n", "Included in the record is the all-important base URL for the service:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(services[0].access_url)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "However, it's not necessary to keep track of that URL because you can\n", "now search that collection directly via the registry record:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "images = services[0].search(pos=(350.85, 58.815), size=0.25)\n", "len(images)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Other types of services via the ``servicetype`` parameter:\n", "\n", "| set ``servicetype`` to... | ...to find:\n", "| ------------------------- | -------------------------------------\n", "| sia | Simple Image Access (SIA) services\n", "| ssa | Simple Spectral Access (SSA) services\n", "| scs | Simple Cone Search (SCS) services\n", "| slap | Simple Line Access (SLA) services\n", "| tap | Table Access Protocol (TAP) services\n", "\n", "For example, to find all known Cone Search services:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cats = vo.regsearch(servicetype='conesearch')\n", "len(cats)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Wow, that's a lot of catalogs. (Most of these are from the\n", "`Vizier Catalog Archive `)\n", "every Vizier catalog that includes a position is available as a Cone\n", "Search service.) For just catalogs related to blazars:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cats = vo.regsearch(keywords=['blazar'], servicetype='conesearch')\n", "len(cats)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How about blazars observed with Fermi?" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cats = vo.regsearch(keywords=['blazar', 'Fermi'], servicetype='conesearch')\n", "len(cats)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Sometimes you may be looking for a particular catalog or image collections\n", "that you already know exists, and you just need to learn the base URL\n", "for the service. The ``keywords`` parameter can be used to find it.\n", "For example, suppose you want to get cutout images from the NRAO VLA\n", "Sky Survey (NVSS):" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "colls = vo.regsearch(keywords=[\"NVSS\"], servicetype='sia')\n", "for coll in colls:\n", " print(coll.res_title)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "More powerful than a cone search is a generic TAP service. These services optionally provide helpful information on how to use them. First, let's see what services are available that serve NASA data:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "taps = vo.regsearch(servicetype='tap',keywords=['HEASARC'])\n", "for tapsvc in taps:\n", " tapsvc.describe()\n", " print(\"---------\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then we need to find out what tables each service serves, because each *may* server many. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "tables=taps[0].service.tables\n", "for table in tables:\n", " table.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see example queries if the service offers them. This .examples method returns a TAPQuery object that can be executed. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "for example in taps[0].service.examples:\n", " print(example['QUERY'])\n", " result=example.execute()\n", " break\n", "result.to_table()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "And for each table, you can find out the available columns:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(\"Columns={}\".format(sorted([k.name for k in tables['a1'].columns ])))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.7" } }, "nbformat": 4, "nbformat_minor": 1 } pyvo-1.2.1/examples/notebooks/working_with_registry_results.ipynb000066400000000000000000000147101416757633600256450ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see from the examples in simple_service_discovery,\n", "a search will often return more than one record,\n", "and so sometimes you need to review some of the\n", "resource metadata to determine which one or ones you want. You may\n", "have noticed that the results behave similarly to the results from the\n", "data access services. Like them, registry search results are returned\n", "as a `~pyvo.registry.regtap.RegistryResults` instance, and each\n", "record is represented as a `~pyvo.registry.regtap.RegistryResource` instance. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import pyvo as vo\n", "colls = vo.regsearch(keywords=[\"NVSS\"], servicetype='sia')\n", "nvss = colls[0]\n", "nvss.res_title" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you are looking for a particular data collection or catalog, as we\n", "did above when we looked for the NVSS archive, often simply reviewing\n", "the titles is sufficient. Other times, particularly when you are not\n", "sure what you are looking for, it helps to look deeper. \n", "\n", "The resource description, available via the \n", "`~pyvo.registry.regtap.ResourceRecord.res_description` property,\n", "tends to be the most revealing. It contains a paragraph (or two)\n", "summarizing the catalog or data collection. It will often describe\n", "the scientific intent behind the collection. \n", "\n", "The `~pyvo.registry.regtap.RegistryResource.short_name` can also be\n", "helpful, as well. This name is meant to be short--16 characters or\n", "fewer; consequently, the value is often includes the abbreviation for the\n", "project or observatory that produced the collection or catalog. \n", "\n", "A selection of the resource metadata, including the title, shortname and\n", "desription, can be printed out in a summary form with\n", "the `~pyvo.registry.regtap.RegistryResource.describe` function." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "nvss.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Registry Records can be converted to a service object that can be queried. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "nvss = colls[0].service # converts record to service object\n", "nvss.search(pos=(350.85, 58.815),size=0.25,format=\"image/fits\").to_table()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Thus, not only does this service instance contain the base URL but it\n", "also includes all of the metadata from the registry that desribes the\n", "service. With this service object, we can either call its \n", "`~pyvo.dal.sia.SIAService.search` function directly as above, or \n", "create query objects to get cutouts for a whole list of sources." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "cutouts1 = nvss.search(pos=(148.8888, 69.065), size=0.2)\n", "nvssq = nvss.create_query(size=0.2) # or create a query object\n", "nvssq.pos = (350.85, 58.815)\n", "cutouts2 = nvssq.execute()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our discussion of service metadata offers an opportunity to highlight\n", "another important property, the service's *IVOA Identifier* (sometimes\n", "referred to as its *ivoid*). This is a globally-unique identifier\n", "that takes the form of a \n", "`URI `_:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "colls = vo.regsearch(keywords=[\"NVSS\"], servicetype='sia')\n", "for coll in colls:\n", " print(coll.ivoid)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This identifier can be used to retrieve a specific service from the registry. " ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "nvss = vo.registry.ivoid2service('ivo://nasa.heasarc/skyview/nvss',servicetype='sia')\n", "nvss.search(pos=(350.85, 58.815),size=0.25,format=\"image/fits\").to_table()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we end this discussion of the service objects, you can hopefully\n", "see that there is a straight-forward chain of discovery classes that\n", "connect the registry down through to a dataset. Spelled out in all\n", "its detail, it looks like this:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "services = vo.regsearch(keywords=[\"NVSS\"],\n", " servicetype='sia') \n", "nvss_resource = services[0]\n", "nvss_service = nvss_resource.service \n", "nvss_query = nvss_service.create_query(pos=(350.85, 58.815),\n", " size=0.25, \n", " format=\"image/fits\")\n", "images = nvss_query.execute()\n", "firstim = images[0]\n", "\n", "print(type(services))\n", "print(type(nvss_resource))\n", "print(type(nvss_service))\n", "print(type(nvss_query))\n", "print(type(images))\n", "print(type(firstim))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Most of the time, it's not necessary to follow all these steps\n", "yourself, so there are functions and methods that provide syntactic\n", "shortcuts. However, when you need some finer control over the\n", "process, it is possible to jump off the fast track and work directly\n", "with an underlying object. " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.7" } }, "nbformat": 4, "nbformat_minor": 1 } pyvo-1.2.1/examples/serialquery.py000066400000000000000000000052561416757633600172770ustar00rootroot00000000000000# An example script that does a registry query (first argument to main, # here "standard stars") and then runs cone searches (RA, DEC, SRC # taken from the command line in that order) against them until the # first returns a result. That result is then broadcast to all SAMP # clients. # # Usage example: Start TOPCAT, then run # # python serialquery.py 314 27.1 2 # # After a short while you should see a result table in TOPCAT. # # Disclaimer: Of course, this isn't how you should write a command line # interface. # # This file has been put in the public domain by the authors, # Markus Demleitner and # Stefan Becker . import contextlib import os import sys import tempfile import time from astropy.samp import SAMPIntegratedClient from pyvo.registry import regtap @contextlib.contextmanager def samp_accessible(astropy_table): """a context manager making astroy_table available under a (file) URL for the controlled section. This is useful with uploads. """ handle, f_name = tempfile.mkstemp(suffix=".xml") with os.fdopen(handle, "w") as f: astropy_table.write(output=f, format="votable") try: yield "file://"+f_name finally: os.unlink(f_name) @contextlib.contextmanager def SAMP_conn(): """a context manager to give the controlled block a SAMP connection. The program will disconnect as the controlled block is exited. """ client = SAMPIntegratedClient(name="serialquery", description="A serial SCS querier.") client.connect() try: yield client finally: client.disconnect() def broadcast(astropy_table): """broadcasts an astropy table object to all SAMP clients on the local bus. """ with SAMP_conn() as client: with samp_accessible(astropy_table) as table_url: client.notify_all( { "samp.mtype": "table.load.votable", "samp.params": { "url": table_url, }}) time.sleep(2) # hack: give other clients time to pick our table up def main(query_terms, ra, dec, sr): for resource in regtap.search( keywords=[query_terms], servicetype="image" ): print(resource.res_title) result = resource.service.search((ra, dec), sr) print(len(result)) if result: break else: sys.exit("No service has results for CIRCLE({}, {}, {})".format( ra, dec, sr)) broadcast(result.table) if __name__ == "__main__": # serialquery.py RA DEC SR main("standard stars", *[float(v) for v in sys.argv[1:]]) pyvo-1.2.1/licenses/000077500000000000000000000000001416757633600143375ustar00rootroot00000000000000pyvo-1.2.1/licenses/ASTROPY_LICENSE.rst000066400000000000000000000027301416757633600173760ustar00rootroot00000000000000Copyright (c) 2011-2013, Astropy Developers All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Astropy Team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pyvo-1.2.1/licenses/LICENSE.rst000066400000000000000000000027511416757633600161600ustar00rootroot00000000000000Copyright (c) 2013, Virtual Astronomical Observatory, LLC (VAO) All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the VAO nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pyvo-1.2.1/licenses/README.rst000066400000000000000000000002421416757633600160240ustar00rootroot00000000000000Licenses ======== This directory holds license and credit information for the affiliated package, works the affiliated package is derived from, and/or datasets. pyvo-1.2.1/pip-requirements000066400000000000000000000000331416757633600157620ustar00rootroot00000000000000astropy requests mimeparse pyvo-1.2.1/pyproject.toml000066400000000000000000000001221416757633600154410ustar00rootroot00000000000000[tool.astropy-bot] [tool.astropy-bot.changelog_checker] filename = "CHANGES.rst" pyvo-1.2.1/pyvo/000077500000000000000000000000001416757633600135275ustar00rootroot00000000000000pyvo-1.2.1/pyvo/__init__.py000066400000000000000000000027451416757633600156500ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ PyVO is a package providing access to remote data and services of the Virtual observatory (VO) using Python. The pyvo module currently provides these main capabilities: * find archives that provide particular data of a particular type and/or relates to a particular topic * regsearch() * search an archive for datasets of a particular type * imagesearch(), spectrumsearch() * do simple searches on catalogs or databases * conesearch(), linesearch(), tablesearch() Submodules provide additional functions and classes for greater control over access to these services. This module also exposes the exception classes raised by the above functions, of which DALAccessError is the root parent exception. """ # Affiliated packages may add whatever they like to this file, but # should keep this content at the top. # ---------------------------------------------------------------------------- from ._astropy_init import * # ---------------------------------------------------------------------------- # For egg_info test builds to pass, put package imports here. if not _ASTROPY_SETUP_: from . import registry from .dal import ssa, sia, sla, scs, tap from . import auth from .registry import search as regsearch from .dal import ( imagesearch, spectrumsearch, conesearch, linesearch, tablesearch, DALAccessError, DALProtocolError, DALFormatError, DALServiceError, DALQueryError) pyvo-1.2.1/pyvo/_astropy_init.py000066400000000000000000000013221416757633600167620ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst __all__ = ['__version__', '__githash__'] # this indicates whether or not we are in the package's setup.py try: _ASTROPY_SETUP_ except NameError: import builtins builtins._ASTROPY_SETUP_ = False try: from .version import version as __version__ except ImportError: __version__ = '' try: from .version import githash as __githash__ except ImportError: __githash__ = '' if not _ASTROPY_SETUP_: # noqa import os # Create the test function for self test from astropy.tests.runner import TestRunner test = TestRunner.make_test_runner_in(os.path.dirname(__file__)) test.__test__ = False __all__ += ['test'] pyvo-1.2.1/pyvo/auth/000077500000000000000000000000001416757633600144705ustar00rootroot00000000000000pyvo-1.2.1/pyvo/auth/__init__.py000066400000000000000000000003541416757633600166030ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst __all__ = ["AuthSession", "AuthURLs", "CredentialStore"] from .authsession import AuthSession from .authurls import AuthURLs from .credentialstore import CredentialStore pyvo-1.2.1/pyvo/auth/authsession.py000066400000000000000000000064131416757633600174130ustar00rootroot00000000000000import logging from .authurls import AuthURLs from .credentialstore import CredentialStore __all__ = ["AuthSession"] class AuthSession: """ A requests-like session that pyvo can use to dispatch its network calls with authentication. The user adds their credentials to the credentials object, such as adding a cookie, certificate, or password. The network requests made by pyvo pass through here, and the URL of the request is matched against the capabilities of the service. Based on what credentials have been provided and the capabilities of the service, appropriate credentials are added to the request before it is sent. """ def __init__(self): super(AuthSession, self).__init__() self.credentials = CredentialStore() self._auth_urls = AuthURLs() def add_security_method_for_url(self, url, security_method, exact=False): """ Add a security method for a url. This is additive with update_from_capabilities. This can be useful to set additional security methods that aren't set in the capabilities for whatever reason. Parameters ---------- url : str URL to set a security method for security_method : str URI of the security method to set exact : bool If True, match only this URL. If false, match all URLs that match this as a base URL. """ self._auth_urls.add_security_method_for_url(url, security_method, exact=exact) def update_from_capabilities(self, capabilities): """ Update the URL to security method mapping using the capabilities provided. Parameters ---------- capabilities : object List of `~pyvo.io.vosi.voresource.Capabilities` """ self._auth_urls.update_from_capabilities(capabilities) def get(self, url, **kwargs): """ Wrapper to make a HTTP GET request with authentication. """ return self._request('GET', url, **kwargs) def post(self, url, **kwargs): """ Wrapper to make a HTTP POST request with authentication. """ return self._request('POST', url, **kwargs) def _request(self, http_method, url, **kwargs): """ Make an HTTP request with authentication. This function looks at the url of the request, determines what credentials it should attach to the request to authenticate, and then dispatches the request to the underlying requests library using the session that has been configured with the credentials. Parameters ---------- http_method : str the HTTP verb of the request. url : str the URL to request """ auth_methods = self._auth_urls.allowed_auth_methods(url) logging.debug('Possible auth methods: %s', auth_methods) negotiated_method = self.credentials.negotiate_method(auth_methods) logging.debug('Using auth method: %s', negotiated_method) session = self.credentials.get(negotiated_method) return session.request(http_method, url, **kwargs) def __repr__(self): return '\n'.join([repr(self.credentials), repr(self._auth_urls)]) pyvo-1.2.1/pyvo/auth/authurls.py000066400000000000000000000075261416757633600167230ustar00rootroot00000000000000import collections import logging from . import securitymethods __all__ = ["AuthURLs"] class AuthURLs(): """ AuthURLs helps determine which security method should be used with a given URL. It learns the security methods through the VOSI capabilities, which are passed in via update_from_capabilities. """ def __init__(self): self.full_urls = collections.defaultdict(set) self.base_urls = collections.defaultdict(set) def update_from_capabilities(self, capabilities): """ Update the URL to security method mapping using the capabilities provided. Parameters ---------- capabilities : object List of `~pyvo.io.vosi.voresource.Capabilities` """ for c in capabilities: for i in c.interfaces: for u in i.accessurls: url = u.content exact = u.use == 'full' if not i.securitymethods: self.add_security_method_for_url(url, securitymethods.ANONYMOUS, exact) for sm in i.securitymethods: method = sm.standardid or securitymethods.ANONYMOUS self.add_security_method_for_url(url, method, exact) def add_security_method_for_url(self, url, security_method, exact=False): """ Add a security method for a url. This is additive with update_from_capabilities. This can be useful to set additional security methods that aren't set in the capabilities for whatever reason. Parameters ---------- url : str URL to set a security method for security_method : str URI of the security method to set exact : bool If True, match only this URL. If false, match all URLs that match this as a base URL. """ if exact: self.full_urls[url].add(security_method) else: self.base_urls[url].add(security_method) def allowed_auth_methods(self, url): """ Return the authentication methods allowed for a particular URL. The methods are returned as URIs that represent security methods. Parameters ---------- url : str the URL to determine authentication methods """ logging.debug('Determining auth method for %s', url) if url in self.full_urls: methods = self.full_urls[url] logging.debug('Matching full url %s, methods %s', url, methods) return methods for base_url, methods in self._iterate_base_urls(): if url.startswith(base_url): logging.debug('Matching base url %s, methods %s', base_url, methods) return methods logging.debug('No match, using anonymous auth') return {securitymethods.ANONYMOUS} def _iterate_base_urls(self): """ A generator to sort the base URLs in the correct way to determine the most specific base_url. This is done by returning them longest to shortest. """ def sort_by_len(x): return len(x[0]) # Sort the base path matching URLs, so that # the longest URLs (the most specific ones, if # there is a tie) are used to determine the # auth method. for url, method in sorted(self.base_urls.items(), key=sort_by_len, reverse=True): yield url, method def __repr__(self): urls = [] for url, methods in self.full_urls.items(): urls.append('Full match:' + url + ':' + str(methods)) for url, methods in self._iterate_base_urls(): urls.append('Base match:' + url + ':' + str(methods)) return '\n'.join(urls) pyvo-1.2.1/pyvo/auth/credentialstore.py000066400000000000000000000114161416757633600202340ustar00rootroot00000000000000import logging from pyvo.utils.http import create_session from . import securitymethods __all__ = ["CredentialStore"] class CredentialStore(object): """ The credential store takes user credentials, and uses them to create appropriate requests sessions for dispatching requests using those credentials. Different types of credentials can be passed in, such as cookies, a jar of cookies, certificates, and basic auth. A session can also be associated with a security method URI by calling the set function. Before a request is to be dispatched, the AuthSession calls the get method to retrieve the appropriate requests.Session for making that HTTP request. """ def __init__(self): self.credentials = {} self.set(securitymethods.ANONYMOUS, create_session()) def negotiate_method(self, allowed_methods): """ Compare the credentials provided by the user against the security methods passed in, and determine which method is to be used for making this request. Parameters ---------- allowed_methods : list(str) list of allowed security methods to return Raises ------ Raises an exception if a common method could not be negotiated. """ available_methods = set(self.credentials.keys()) methods = available_methods.intersection(allowed_methods) logging.debug('Available methods: %s', methods) # If we have no common auth mechanism, then fail. if not methods: msg = 'Negotiation failed. Server supports %s, client supports %s' % \ (allowed_methods, available_methods) raise Exception(msg) # If there are more than 1 method to pick, don't pick # anonymous over an actual method. if len(methods) > 1: methods.discard(securitymethods.ANONYMOUS) # Pick a random method. return methods.pop() def set(self, method_uri, session): """ Associate a security method URI with a requests.Session like object. Parameters ---------- method_uri : str URI representing the security method session : object the requests.Session like object that will dispatch requests for the authentication method provided by method_uri """ self.credentials[method_uri] = session def get(self, method_uri): """ Retrieve the requests.Session like object associated with a security method URI. Parameters ---------- method_uri : str URI representing the security method """ return self.credentials[method_uri] def set_cookie(self, cookie_name, cookie_value, domain='', path='/'): """ Add a cookie to use as authentication. More than one call to set_cookie will add multiple cookies into the same cookie jar used for the request. Parameters ---------- cookie_name : str name of the cookie cookie_value : str value of the cookie domain : str restrict usage of this cookie to this domain path : str restrict usage of this cookie to this path """ cookie_session = self.credentials.setdefault(securitymethods.COOKIE, create_session()) cookie_session.cookies.set(cookie_name, cookie_value, domain=domain, path=path) def set_cookie_jar(self, cookie_jar): """ Set the cookie jar to use for authentication. Any previous cookies or cookie jars set will be removed. Parameters ---------- cookie_jar : obj the cookie jar to use. """ cookie_session = self.credentials.setdefault(securitymethods.COOKIE, create_session()) cookie_session.cookies = cookie_jar def set_client_certificate(self, certificate_path): """ Add a client certificate to use for authentication. Parameters ---------- certificate_path : str path to the file of the client certificate """ cert_session = create_session() cert_session.cert = certificate_path self.set(securitymethods.CLIENT_CERTIFICATE, cert_session) def set_password(self, username, password): """ Add a username / password for basic authentication. Parameters ---------- username : str username to use password : str password to use """ basic_session = create_session() basic_session.auth = (username, password) self.set(securitymethods.BASIC, basic_session) def __repr__(self): return 'Support for %s' % self.credentials.keys() pyvo-1.2.1/pyvo/auth/securitymethods.py000066400000000000000000000002411416757633600202720ustar00rootroot00000000000000ANONYMOUS = 'anonymous' BASIC = 'ivo://ivoa.net/sso#BasicAA' CLIENT_CERTIFICATE = 'ivo://ivoa.net/sso#tls-with-certificate' COOKIE = 'ivo://ivoa.net/sso#cookie' pyvo-1.2.1/pyvo/auth/tests/000077500000000000000000000000001416757633600156325ustar00rootroot00000000000000pyvo-1.2.1/pyvo/auth/tests/__init__.py000066400000000000000000000001001416757633600177320ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst pyvo-1.2.1/pyvo/auth/tests/conftest.py000066400000000000000000000012561416757633600200350ustar00rootroot00000000000000from contextlib import contextmanager import pytest import requests_mock class ContextAdapter(requests_mock.Adapter): """ requests_mock adapter where ``register_uri`` returns a context manager """ @contextmanager def register_uri(self, *args, **kwargs): matcher = super().register_uri(*args, **kwargs) yield matcher self.remove_matcher(matcher) def remove_matcher(self, matcher): if matcher in self._matchers: self._matchers.remove(matcher) @pytest.fixture(scope='function') def mocker(): with requests_mock.Mocker( adapter=ContextAdapter(case_sensitive=True) ) as mocker: yield mocker pyvo-1.2.1/pyvo/auth/tests/data/000077500000000000000000000000001416757633600165435ustar00rootroot00000000000000pyvo-1.2.1/pyvo/auth/tests/data/tap/000077500000000000000000000000001416757633600173275ustar00rootroot00000000000000pyvo-1.2.1/pyvo/auth/tests/data/tap/capabilities.xml000066400000000000000000000071051416757633600225050ustar00rootroot00000000000000 http://example.com/tap/capabilities http://example.com/tap/availability http://example.com/tap/tables $security_methods http://example.com/tap $security_methods ADQL 2.0 ADQL-2.0
POINT
CIRCLE
DISTANCE
POLYGON
REGION
CONTAINS
INTERSECTS
AREA
CENTROID
COORD1
COORD2
application/x-votable+xml votable text/xml text/csv csv text/tab-separated-values tsv 604800 604800 600 600 134217728 134217728 10000 10000
pyvo-1.2.1/pyvo/auth/tests/setup_package.py000066400000000000000000000002721416757633600210200ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst import os def get_package_data(): paths = [os.path.join('data/tap', '*.xml')] return {'pyvo.auth.tests': paths} pyvo-1.2.1/pyvo/auth/tests/test_auth.py000066400000000000000000000151301416757633600202040ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.auth """ import base64 from requests.cookies import RequestsCookieJar from string import Template import pytest from astropy.utils.data import get_pkg_data_contents import pyvo.dal from pyvo.auth.authsession import AuthSession from pyvo.dal.tests.test_tap import MockAsyncTAPServer @pytest.fixture() def security_methods(): return [None] @pytest.fixture() def auth_capabilities(mocker, security_methods): anon_element = '' sm_element = Template('') method_elements = [] for m in security_methods: if m is None: method_elements.append(anon_element) else: method_elements.append(sm_element.substitute(m=m)) def callback(request, context): t = Template(get_pkg_data_contents('data/tap/capabilities.xml')) capabilities = t.substitute(security_methods=method_elements) return capabilities.encode('utf-8') with mocker.register_uri( 'GET', 'http://example.com/tap/capabilities', content=callback ) as matcher: yield matcher class MockAnonAuthTAPServer(MockAsyncTAPServer): def validator(self, request): assert request.cert is None assert 'Authorization' not in request.headers assert 'Cookie' not in request.headers @pytest.fixture() def anon_auth_service(mocker): yield from MockAnonAuthTAPServer().use(mocker) class MockCookieAuthTAPServer(MockAsyncTAPServer): def validator(self, request): assert request.cert is None assert 'Authorization' not in request.headers assert request.headers.get('Cookie', None) == 'TEST_COOKIE=BADCOOKIE' @pytest.fixture() def cookie_auth_service(mocker): yield from MockCookieAuthTAPServer().use(mocker) class MockCertificateAuthTAPServer(MockAsyncTAPServer): def validator(self, request): assert request.cert == 'client-certificate.pem' assert 'Authorization' not in request.headers assert 'Cookie' not in request.headers @pytest.fixture() def certificate_auth_service(mocker): yield from MockCertificateAuthTAPServer().use(mocker) class MockBasicAuthTAPServer(MockAsyncTAPServer): def validator(self, request): pw = 'testuser:hunter2'.encode('ascii') basic_encoded = 'Basic ' + base64.b64encode(pw).decode('ascii') assert request.cert is None assert request.headers.get('Authorization', None) == basic_encoded assert 'Cookie' not in request.headers @pytest.fixture() def basic_auth_service(mocker): yield from MockBasicAuthTAPServer().use(mocker) @pytest.mark.usefixtures('cookie_auth_service', 'auth_capabilities') @pytest.mark.parametrize('security_methods', [[None, 'ivo://ivoa.net/sso#cookie']]) @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_cookies_auth(): session = AuthSession() session.credentials.set_cookie('TEST_COOKIE', 'BADCOOKIE') service = pyvo.dal.TAPService('http://example.com/tap', session) service.run_async("SELECT * FROM ivoa.obscore") @pytest.mark.usefixtures('cookie_auth_service', 'auth_capabilities') @pytest.mark.parametrize('security_methods', [[None, 'ivo://ivoa.net/sso#cookie']]) @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_cookie_jar_auth(): session = AuthSession() jar = RequestsCookieJar() jar.set('TEST_COOKIE', 'BADCOOKIE') session.credentials.set_cookie_jar(jar) service = pyvo.dal.TAPService('http://example.com/tap', session) service.run_async("SELECT * FROM ivoa.obscore") @pytest.mark.usefixtures('certificate_auth_service', 'auth_capabilities') @pytest.mark.parametrize('security_methods', [[None, 'ivo://ivoa.net/sso#tls-with-certificate']]) @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_certificate_auth(): session = AuthSession() session.credentials.set_client_certificate('client-certificate.pem') service = pyvo.dal.TAPService('http://example.com/tap', session) service.run_async("SELECT * FROM ivoa.obscore") @pytest.mark.usefixtures('basic_auth_service', 'auth_capabilities') @pytest.mark.parametrize('security_methods', [[None, 'ivo://ivoa.net/sso#BasicAA']]) @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_basic_auth(): session = AuthSession() session.credentials.set_password('testuser', 'hunter2') service = pyvo.dal.TAPService('http://example.com/tap', session) service.run_async("SELECT * FROM ivoa.obscore") @pytest.mark.usefixtures('basic_auth_service', 'auth_capabilities') @pytest.mark.parametrize('security_methods', [[None, 'ivo://ivoa.net/sso#BasicAA']]) @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_negotiation(): session = AuthSession() session.credentials.set_password('testuser', 'hunter2') session.credentials.set_client_certificate('client-certificate.pem') session.credentials.set_cookie('TEST_COOKIE', 'BADCOOKIE') service = pyvo.dal.TAPService('http://example.com/tap', session) service.run_async("SELECT * FROM ivoa.obscore") @pytest.mark.usefixtures('anon_auth_service', 'auth_capabilities') @pytest.mark.parametrize('security_methods', [[None, 'ivo://ivoa.net/sso#FancyAuth']]) @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_no_common_auth_negotiation(): session = AuthSession() session.credentials.set_password('testuser', 'hunter2') session.credentials.set_client_certificate('client-certificate.pem') session.credentials.set_cookie('TEST_COOKIE', 'BADCOOKIE') service = pyvo.dal.TAPService('http://example.com/tap', session) service.run_async("SELECT * FROM ivoa.obscore") pyvo-1.2.1/pyvo/conftest.py000066400000000000000000000042731416757633600157340ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst import os from distutils.version import LooseVersion # this contains imports plugins that configure py.test for astropy tests. # by importing them here in conftest.py they are discoverable by py.test # no matter how it is invoked within the source tree. from astropy.version import version as astropy_version if LooseVersion(astropy_version) < LooseVersion('2.0.3'): # Astropy is not compatible with the standalone plugins prior this while # astroquery requires them, so we need this workaround. This will mess # up the test header, but everything else will work. from astropy.tests.pytest_plugins import (PYTEST_HEADER_MODULES, enable_deprecations_as_exceptions, TESTED_VERSIONS) elif astropy_version < '3.0': # With older versions of Astropy, we actually need to import the pytest # plugins themselves in order to make them discoverable by pytest. from astropy.tests.pytest_plugins import * else: # As of Astropy 3.0, the pytest plugins provided by Astropy are # automatically made available when Astropy is installed. This means it's # not necessary to import them here, but we still need to import global # variables that are used for configuration. from pytest_astropy_header.display import PYTEST_HEADER_MODULES, TESTED_VERSIONS from astropy.tests.helper import enable_deprecations_as_exceptions # Add astropy to test header information and remove unused packages. # Pytest header customisation was introduced in astropy 1.0. try: PYTEST_HEADER_MODULES['Astropy'] = 'astropy' del PYTEST_HEADER_MODULES['h5py'] del PYTEST_HEADER_MODULES['Scipy'] del PYTEST_HEADER_MODULES['Matplotlib'] del PYTEST_HEADER_MODULES['Pandas'] except (NameError, KeyError): pass enable_deprecations_as_exceptions() # This is to figure out the affiliated package version, rather than # using Astropy's from .version import version, astropy_helpers_version packagename = os.path.basename(os.path.dirname(__file__)) TESTED_VERSIONS[packagename] = version TESTED_VERSIONS['astropy_helpers'] = astropy_helpers_version pyvo-1.2.1/pyvo/dal/000077500000000000000000000000001416757633600142675ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/__init__.py000066400000000000000000000025131416757633600164010ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from .sia import search as imagesearch from .sia2 import search as imagesearch2 from .ssa import search as spectrumsearch from .sla import search as linesearch from .scs import search as conesearch from .tap import search as tablesearch from .query import DALService, DALQuery, DALResults, Record from .sia import SIAService, SIAQuery, SIAResults, SIARecord from .ssa import SSAService, SSAQuery, SSAResults, SSARecord from .sla import SLAService, SLAQuery, SLAResults, SLARecord from .scs import SCSService, SCSQuery, SCSResults, SCSRecord from .tap import TAPService, TAPQuery, TAPResults, AsyncTAPJob from .exceptions import ( DALAccessError, DALProtocolError, DALFormatError, DALServiceError, DALQueryError) __all__ = [ "imagesearch", "spectrumsearch", "linesearch", "conesearch", "tablesearch", "DALService", "sia2", "imagesearch2", "SIAService", "SSAService", "SLAService", "SCSService", "TAPService", "DALQuery", "SIAQuery", "SSAQuery", "SLAQuery", "SCSQuery", "TAPQuery", "DALResults", "SIAResults", "SSAResults", "SLAResults", "SCSResults", "TAPResults", "Record", "SIARecord", "SSARecord", "SLARecord", "SCSRecord", "AsyncTAPJob", "DALAccessError", "DALProtocolError", "DALFormatError", "DALServiceError", "DALQueryError"] pyvo-1.2.1/pyvo/dal/adhoc.py000066400000000000000000001012361416757633600157220ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Datalink classes and mixins """ import numpy as np import warnings import copy from collections import OrderedDict from .query import DALResults, DALQuery, DALService, Record from .exceptions import DALServiceError from .vosi import AvailabilityMixin, CapabilityMixin from .params import find_param_by_keyword, get_converter from astropy.io.votable.tree import Param from astropy import units as u from astropy.units import Quantity, Unit from astropy.units import spectral as spectral_equivalencies from pyvo.utils.compat import ASTROPY_LT_4_1 from astropy.io.votable.tree import Resource, Group from astropy.utils.collections import HomogeneousList from ..utils.decorators import stream_decode_content from ..utils import vocabularies from .params import PosQueryParam, IntervalQueryParam, TimeQueryParam,\ EnumQueryParam from ..dam.obscore import POLARIZATION_STATES # calls to DataLink from the results pages are batched for performance # reasons. This is the size of a batch DATALINK_BATCH_CALL_SIZE = 50 SODA_SYNC_IVOID = 'ivo://ivoa.net/std/SODA#sync-1.0' DATALINK_IVOID = 'ivo://ivoa.net/std/datalink' # MIME types DATALINK_MIME_TYPE = 'application/x-votable+xml;content=datalink' # monkeypatch astropy with group support in RESOURCE def _monkeypath_astropy_resource_groups(): old_group_unknown_tag = Group._add_unknown_tag def new_group_unknown_tag(self, iterator, tag, data, config, pos): if tag == "PARAM": return self._add_param(self, iterator, tag, data, config, pos) else: old_group_unknown_tag(self, iterator, tag, data, config, pos) old_init = Resource.__init__ def new_init(self, *args, **kwargs): old_init(self, *args, **kwargs) self._groups = HomogeneousList(Group) Resource.__init__ = new_init def resource_groups(self): return self._groups Resource.groups = property(resource_groups) def resource_add_group(self, iterator, tag, data, config, pos): group = Group(self, config=config, pos=pos, **data) self.groups.append(group) group.parse(iterator, config) Resource._add_group = resource_add_group old_resource_unknown_tag = Resource._add_unknown_tag def new_resource_unknown_tag(self, iterator, tag, data, config, pos): if tag == "GROUP": return self._add_group(iterator, tag, data, config, pos) else: old_resource_unknown_tag(self, iterator, tag, data, config, pos) Resource._add_unknown_tag = new_resource_unknown_tag if not hasattr(Resource, 'groups'): _monkeypath_astropy_resource_groups() __all__ = [ "AdhocServiceResultsMixin", "DatalinkResultsMixin", "DatalinkRecordMixin", "DatalinkService", "DatalinkQuery", "DatalinkResults", "DatalinkRecord", "SodaRecordMixin", "SodaQuery"] def _get_input_params_from_resource(resource): # get the group with name inputParams group_input_params = next( group for group in resource.groups if group.name == "inputParams") # get only Param elements from the group return { _.name: _ for _ in group_input_params.entries if isinstance(_, Param)} def _get_params_from_resource(resource): return {_.name: _ for _ in resource.params} def _get_accessurl_from_params(params): if "accessURL" not in params: raise DALServiceError("Datalink has no accessURL") return params["accessURL"].value class AdhocServiceResultsMixin: """ Mixing for adhoc:service functionallity for results classes. """ def __init__(self, votable, url=None, session=None): super().__init__(votable, url=url, session=session) self._adhocservices = list( resource for resource in votable.resources if resource.type == "meta" and resource.utype == "adhoc:service" ) def iter_adhocservices(self): yield from self._adhocservices def get_adhocservice_by_ivoid(self, ivo_id): """ Return the adhoc service starting with the given ivo_id. Parameters ---------- ivoid : str the ivoid of the service we want to have. Returns ------- Resource The resource element describing the service. """ if ASTROPY_LT_4_1 and isinstance(ivo_id, str): ivo_id = ivo_id.encode('utf-8') if not ASTROPY_LT_4_1 and isinstance(ivo_id, bytes): ivo_id = ivo_id.decode('utf-8') for adhocservice in self.iter_adhocservices(): if any( all(( param.name == "standardID", param.value.lower().startswith(ivo_id.lower()) )) for param in adhocservice.params ): return adhocservice raise DALServiceError( "No Adhoc Service with ivo-id {}!".format(ivo_id)) def get_adhocservice_by_id(self, id_): """ Return the adhoc service starting with the given service_def id. Parameters ---------- id_ : str the service_def id of the service we want to have. Returns ------- Resource The resource element describing the service. """ for adhocservice in self.iter_adhocservices(): if adhocservice.ID == id_: return adhocservice raise DALServiceError( "No Adhoc Service with service_def id {}!".format(id_)) class DatalinkResultsMixin(AdhocServiceResultsMixin): """ Mixing for datalink functionallity for results classes. """ def iter_datalinks(self): """ Iterates over all datalinks in a DALResult. """ # To reduce the number of calls to the Datalink service, multiple # IDs are sent in batches. The appropriate batch size is not available # as each service has its own criteria for determining the maximum # number of IDs processed per request. To overcome this limitation, # this method initially sends all the available IDs and if the # response is partial, uses the size of the response as the batch # size. if not hasattr(self, '_datalink'): try: self._datalink = self.get_adhocservice_by_ivoid(DATALINK_IVOID) except DALServiceError: self._datalink = None remaining_ids = [] # remaining IDs to processed current_batch = None # retrieved but not returned yet current_ids = [] # retrieved but not returned processed_ids = [] # retrived and returned IDs batch_size = None # size of the batch for row in self: if self._datalink: if not current_ids: if batch_size is None: # first call. self.query = DatalinkQuery.from_resource( [_ for _ in self], self._datalink) remaining_ids = self.query['ID'] if not remaining_ids: # we are done return if batch_size: # subsequent calls are limitted to batch size self.query['ID'] = remaining_ids[:batch_size] current_batch = self.query.execute(post=True) current_ids = list(OrderedDict.fromkeys( [_ for _ in current_batch.to_table()['ID']])) if not current_ids: raise DALServiceError( 'Could not retrieve datalinks for: {}'.format( ', '.join([_ for _ in remaining_ids]))) batch_size = len(current_ids) id = current_ids.pop(0) processed_ids.append(id) remaining_ids.remove(id) yield current_batch.clone_byid(id) elif row.access_format == DATALINK_MIME_TYPE: yield DatalinkResults.from_result_url(row.getdataurl()) else: yield None class DatalinkRecordMixin: """ Mixin for record classes, providing functionallity for datalink. - ``getdataset()`` considers datalink. """ def getdatalink(self): try: datalink = self._results.get_adhocservice_by_ivoid(DATALINK_IVOID) query = DatalinkQuery.from_resource(self, datalink) return query.execute() except DALServiceError: return DatalinkResults.from_result_url(self.getdataurl()) @stream_decode_content def getdataset(self, timeout=None): try: url = next(self.getdatalink().bysemantics('#this')).access_url response = self._session.get(url, stream=True, timeout=timeout) response.raise_for_status() return response.raw except (DALServiceError, ValueError, StopIteration): # this should go to Record.getdataset() return super().getdataset(timeout=timeout) class DatalinkService(DALService, AvailabilityMixin, CapabilityMixin): """ a representation of a Datalink service """ def __init__(self, baseurl, session=None): """ instantiate a Datalink service Parameters ---------- baseurl : str the base URL that should be used for forming queries to the service. session : object optional session to use for network requests """ super().__init__(baseurl, session=session) # Check if the session has an update_from_capabilities attribute. # This means that the session is aware of IVOA capabilities, # and can use this information in processing network requests. # One such usecase for this is auth. if hasattr(self._session, 'update_from_capabilities'): self._session.update_from_capabilities(self.capabilities) def run_sync(self, id, responseformat=None, **keywords): """ runs sync query and returns its result Parameters ---------- id : str the dataset identifier responseformat : str the output format Returns ------- DatalinkResults the query result See Also -------- DatalinkResults """ return self.create_query(id, responseformat, **keywords).execute() # alias for service discovery search = run_sync def create_query(self, id, responseformat=None, **keywords): """ create a query object that constraints can be added to and then executed. The input arguments will initialize the query with the given values. Parameters ---------- baseurl : str the base URL for the Datalink service id : str the dataset identifier responseformat : str the output format """ return DatalinkQuery( self.baseurl, id, responseformat, **keywords) class DatalinkQuery(DALQuery): """ A class for preparing a query to a Datalink service. Query constraints are added via its service type-specific methods. The various execute() functions will submit the query and return the results. The base URL for the query, which controls where the query will be sent when one of the execute functions is called, is typically set at construction time; however, it can be updated later via the :py:attr:`~pyvo.dal.query.DALQuery.baseurl` to send a configured query to another service. A session can also optionally be passed in that will be used for network transactions made by this object to remote services. In addition to the search constraint attributes described below, search parameters can be set generically by name via dict semantics. The typical function for submitting the query is ``execute()``; however, alternate execute functions provide the response in different forms, allowing the caller to take greater control of the result processing. """ @classmethod def from_resource(cls, rows, resource, session=None, **kwargs): """ Creates a instance from a number of records and a Datalink Resource. XML Hierarchy: .. code:: xml """ input_params = _get_input_params_from_resource(resource) # get params outside of any group dl_params = _get_params_from_resource(resource) accessurl = _get_accessurl_from_params(dl_params) query_params = dict() for name, input_param in input_params.items(): if input_param.ref: if isinstance(rows, list): query_params[name] = [] for r in rows: query_params[name].append(r[input_param.ref]) else: # scalars are also accepted for backwards compatibility query_params[name] = rows[input_param.ref] elif np.isscalar(input_param.value) and input_param.value: query_params[name] = input_param.value elif ( not np.isscalar(input_param.value) and input_param.value.all() and len(input_param.value) ): query_params[name] = " ".join( str(_) for _ in input_param.value) for name, query_param in kwargs.items(): try: input_param = find_param_by_keyword(name, input_params) if input_param and query_param is None: del query_params[input_param.name] converter = get_converter(input_param) query_params[input_param.name] = converter.serialize( query_param) except KeyError: query_params[name] = query_param return cls(accessurl, session=session, **query_params) def __init__( self, baseurl, id=None, responseformat=None, session=None, **keywords): """ initialize the query object with the given parameters Parameters ---------- baseurl : str the Datalink baseurl id : str the dataset identifier responseformat : str the output format session : object optional session to use for network requests """ super().__init__(baseurl, session=session, **keywords) if id: self["ID"] = id if responseformat: self["RESPONSEFORMAT"] = responseformat def execute(self, post=False): """ submit the query and return the results as a DatalinkResults instance Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError for errors either in the input query syntax or other user errors detected by the service DALFormatError for errors parsing the VOTable response """ return DatalinkResults(self.execute_votable(post), url=self.queryurl, session=self._session) class DatalinkResults(DatalinkResultsMixin, DALResults): """ The list of matching records resulting from an datalink query. Each record contains a set of metadata that describes an available record matching the query constraints. The number of records in the results is available by passing it to the Python built-in ``len()`` function. This class supports iterable semantics; thus, individual records (in the form of :py:class:`~pyvo.dal.query.Record` instances) are typically accessed by iterating over an ``DatalinkResults`` instance. Alternatively, records can be accessed randomly via :py:meth:`getrecord` or through a Python Database API (v2) Cursor (via :py:meth:`~pyvo.dal.query.DALResults.cursor`). Column-based data access is possible via the :py:meth:`~pyvo.dal.query.DALResults.getcolumn` method. ``DatalinkResults`` is essentially a wrapper around an Astropy :py:mod:`~astropy.io.votable` :py:class:`~astropy.io.votable.tree.Table` instance where the columns contain the various metadata describing the images. One can access that VOTable directly via the :py:attr:`~pyvo.dal.query.DALResults.votable` attribute. Thus, when one retrieves a whole column via :py:meth:`~pyvo.dal.query.DALResults.getcolumn`, the result is a Numpy array. Alternatively, one can manipulate the results as an Astropy :py:class:`~astropy.table.table.Table` via the following conversion: >>> table = results.to_table() ``DatalinkResults`` supports the array item operator ``[...]`` in a read-only context. When the argument is numerical, the result is an :py:class:`~pyvo.dal.query.Record` instance, representing the record at the position given by the numerical index. If the argument is a string, it is interpreted as the name of a column, and the data from the column matching that name is returned as a Numpy array. """ def getrecord(self, index): """ return a representation of a datalink result record that follows dictionary semantics. The keys of the dictionary are those returned by this instance's fieldnames attribute. The returned record has the additional function :py:meth:`~pyvo.dal.query.DALResults.getdataset` Parameters ---------- index : int the integer index of the desired record where 0 returns the first record Returns ------- REc a dictionary-like wrapper containing the result record metadata. Raises ------ IndexError if index is negative or equal or larger than the number of rows in the result table. See Also -------- Record """ return DatalinkRecord(self, index, session=self._session) def bysemantics(self, semantics, include_narrower=True): """ return the rows with the dataset identified by the given semantics Parameters ---------- semantics: str or list One or more term(s) from the datalink vocabulary (http://www.ivoa.net/rdf/datalink/core). Terms may be passed in with or without a leading hash. Note that at this point non-datalink/core URIs (i.e., full resource URIs) are not supported (and will be butchered). include_narrower: boolean If true, the result will include matches for any term that is narrower than the term passed in. Returns ------- Sequence of DatalinkRecord a sequence of dictionary-like wrappers containing the result record """ if isinstance(semantics, str): semantics = [semantics] semantics = [term.lstrip("#") for term in semantics] if include_narrower: additional_terms = [] voc = vocabularies.get_vocabulary("datalink/core") for term in semantics: if term in voc["terms"]: additional_terms.extend(voc["terms"][term]["narrower"]) semantics = semantics+additional_terms semantics = set("#"+term for term in semantics) for record in self: if record.semantics in semantics: yield record def clone_byid(self, id): """ return a clone of the object with results and corresponding resources matching a given id Returns ------- Sequence of DatalinkRecord a sequence of dictionary-like wrappers containing the result record """ copy_tb = copy.deepcopy(self.votable) votable = copy_tb.get_first_table() # find index of ID column id_index = None for index, field in enumerate(votable.fields): if field.name == 'ID': id_index = index rows = [x for x in votable.array if x[id_index] == id] votable.create_arrays(len(rows)) for index, row in enumerate(rows): votable.array[index] = row # now remove unreferenced services from resources if ASTROPY_LT_4_1: referenced_serviced = \ [x.decode('utf-8') for x in votable.array['service_def'] if x] else: referenced_serviced = \ [x for x in votable.array['service_def'] if x] # remove customized that are not referenced by the current results for x in copy_tb.resources: if x.ID and x.ID not in referenced_serviced: copy_tb.resources.remove(x) return DatalinkResults(copy_tb) def getdataset(self, timeout=None): """ return the first row with the dataset identified by semantics #this Returns ------- DatalinkRecord a dictionary-like wrapper containing the result record. """ try: return next(self.bysemantics("#this")).getdataset(timeout=timeout) except StopIteration: raise ValueError("No row with semantics #this found!") def iter_procs(self): """ iterate over all rows with a processing service """ for row in self: if row.service_def: yield row def get_first_proc(self): """ returns the first datalink row with a processing service. """ for proc in self.iter_procs(): return proc raise IndexError("No processing service found in datalink result") class SodaRecordMixin: """ Mixin for soda functionality for record classes. If used, it's result class must have `pyvo.dal.datalink.AdhocServiceResultsMixin` mixed in. """ def _get_soda_resource(self): try: return self._results.get_adhocservice_by_ivoid(SODA_SYNC_IVOID) except DALServiceError: pass # let it count as soda resource try: return self._results.get_adhocservice_by_ivoid( "ivo://ivoa.net/std/datalink#links") except DALServiceError: pass dataformat = self.getdataformat() if dataformat is None: raise DALServiceError( "No SODA Resouces available and no dataformat in record. " "Maybe you forgot to include it into the TAP Query?") if "content=datalink" in dataformat: dataurl = self.getdataurl() if not dataurl: raise DALServiceError( "No dataurl in record, but dataformat contains " "'content=datalink'. Maybe you forgot to include it into " "the TAP Query?") try: datalink_result = DatalinkResults.from_result_url(dataurl) return datalink_result.get_adhocservice_by_ivoid( SODA_SYNC_IVOID) except DALServiceError: pass return None def processed( self, circle=None, range=None, polygon=None, band=None, **kwargs): """ Returns processed dataset. Parameters ---------- circle : `astropy.units.Quantity` latitude, longitude and radius range : `astropy.units.Quantity` two longitude + two latitude values describing a rectangle polygon : `astropy.units.Quantity` multiple (at least three) pairs of longitude and latitude points band : `astropy.units.Quantity` two bandwidth or frequency values """ soda_resource = self._get_soda_resource() if soda_resource: soda_query = SodaQuery.from_resource( self, soda_resource, circle=circle, range=range, polygon=polygon, band=band, **kwargs) soda_stream = soda_query.execute_stream() soda_query.raise_if_error() return soda_stream else: return self.getdataset() class DatalinkRecord(DatalinkRecordMixin, SodaRecordMixin, Record): """ a dictionary-like container for data in a record from the results of an datalink query, The commonly accessed metadata which are stadardized by the datalink standard are available as attributes. If the metadatum accessible via an attribute is not available, the value of that attribute will be None. All metadata, including non-standard metadata, are acessible via the ``get(`` *key* ``)`` function (or the [*key*] operator) where *key* is table column name. """ @property def id(self): """ Input identifier """ return self.get("ID", decode=True) @property def access_url(self): """ Link to data or processing service """ row_url = self.get("access_url", decode=True) if not row_url: proc_resource = self._results.get_adhocservice_by_id( self.service_def) dl_params = _get_params_from_resource(proc_resource) row_url = _get_accessurl_from_params(dl_params) return row_url @property def service_def(self): """ reference to the service descriptor resource """ return self.get("service_def", decode=True) @property def error_message(self): """ Error if an access_url cannot be created """ return self.get("error_message", decode=True) @property def description(self): """ Human-readable text describing this link """ return self.get("description", decode=True) @property def semantics(self): """ Term from a controlled vocabulary describing the link """ return self.get("semantics", decode=True) @property def content_type(self): """ Mime-type of the content the link returns """ return self.get("content_type", decode=True) @property def content_length(self): """ Size of the download the link returns """ return int(self["content_length"]) def getdataurl(self): """ return the URL contained in the access URL column which can be used to retrieve the dataset described by this record. Raises :py:class:`~pyvo.dal.query.DALServiceError` if theres an error. """ if self.error_message: raise DALServiceError(self.error_message) return self.access_url def process(self, **kwargs): """ calls the processing service and returns it's result as a file-like object """ proc_resource = self._results.get_adhocservice_by_id(self.service_def) proc_query = DatalinkQuery.from_resource(self, proc_resource, **kwargs) proc_stream = proc_query.execute_stream() return proc_stream @property def params(self): """ the access parameters of the service behind this datalink row. """ proc_resource = self._results.get_adhocservice_by_id(self.service_def) return proc_resource.params @property def input_params(self): """ a list of input parameters for the service behind this datalink row. """ proc_resource = self._results.get_adhocservice_by_id(self.service_def) return list(_get_input_params_from_resource(proc_resource).values()) class AxisParamMixin(): """ Stores the axis parameters (pos, band, time and pol) used in SODA or SIAv2 queries """ @property def pos(self): if not hasattr(self, '_pos'): self._pos = PosQueryParam() self['POS'] = self._pos.dal return self._pos @property def band(self): if not hasattr(self, '_band'): self._band = IntervalQueryParam(unit=u.meter, equivalencies=u.spectral()) self['BAND'] = self.band.dal return self._band @property def time(self): if not hasattr(self, '_time'): self._time = TimeQueryParam() self['TIME'] = self.time.dal return self._time @property def pol(self): if not hasattr(self, '_pol'): self._pol = EnumQueryParam(POLARIZATION_STATES) self['POL'] = self.pol.dal return self._pol class SodaQuery(DatalinkQuery, AxisParamMixin): """ a class for preparing a query to a SODA Service. """ def __init__( self, baseurl, circle=None, range=None, polygon=None, band=None, **kwargs): super().__init__(baseurl, **kwargs) if circle: self.circle = circle if range: self.range = range if polygon: self.polygon = polygon if band: self.band = band @property def circle(self): """ The CIRCLE parameter defines a spatial region using the circle xtype defined in DALI. """ return getattr(self, '_circle', None) @circle.setter def circle(self, circle): if len(circle) != 3: raise ValueError( "Range must be a sequence with exactly three values") self['CIRCLE'] = PosQueryParam().get_dal_format(circle).\ replace('CIRCLE ', '') setattr(self, '_circle', circle) del self.range del self.polygon @circle.deleter def circle(self): if hasattr(self, '_circle'): delattr(self, '_circle') if 'CIRCLE' in self: del self['CIRCLE'] @property def range(self): """ A rectangular range. """ warnings.warn( "Use pos attribute instead", DeprecationWarning ) return getattr(self, '_circle', None) @range.setter def range(self, range): if len(range) != 4: raise ValueError( "Range must be a sequence with exactly four values") self['POS'] = PosQueryParam().get_dal_format(range) setattr(self, '_range', range) del self.circle del self.polygon @range.deleter def range(self): if hasattr(self, '_range'): delattr(self, '_range') if 'POS' in self and self['POS'].startswith('RANGE'): del self['POS'] @property def polygon(self): """ The POLYGON parameter defines a spatial region using the polygon xtype defined in DALI. """ return getattr(self, '_polygon', None) @polygon.setter def polygon(self, polygon): if len(polygon) < 6: raise ValueError( "Polygon must be a sequence of at least six values") self['POLYGON'] = PosQueryParam().get_dal_format(polygon).\ replace('POLYGON ', '') setattr(self, '_polygon', polygon) del self.circle del self.range @polygon.deleter def polygon(self): if hasattr(self, '_polygon'): delattr(self, '_polygon') if 'POLYGON' in self: del self['POLYGON'] @property def band(self): """ The BAND parameter defines the wavelength interval(s) to be extracted from the data using a floating point interval """ return getattr(self, "_band", None) @band.setter def band(self, band): setattr(self, "_band", band) if not isinstance(band, Quantity): valerr = ValueError( 'Band must be specified with exactly two values, ', 'expressing a frequency or wavelength range' ) try: # assume meters band = band * Unit("meter") if len(band) != 2: raise valerr except (ValueError, TypeError): raise valerr # transform to meters band = band.to(Unit("m"), equivalencies=spectral_equivalencies()) # frequency is counter-proportional to wavelength, so we just sort # it to have the right order again band.sort() self["BAND"] = "{start} {end}".format( start=band.value[0], end=band.value[1]) @band.deleter def band(self): if hasattr(self, '_band'): delattr(self, '_band') if 'BAND' in self: del self['BAND'] pyvo-1.2.1/pyvo/dal/dbapi2.py000066400000000000000000000160041416757633600160030ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ An implementation of the Database API v2.0 interface to DAL VOTable responses. This only supports read-only access. """ from .query import Iter apilevel = "2.0" threadsafety = 2 paramstyle = "n/a" __all__ = "STRING BINARY NUMBER DATETIME ROWID".split() class Error(Exception): """ DB-API base exception """ pass class Warning(Exception): """ DB-API warning """ pass class InterfaceError(Error): """ DB-API exception indicating an error related to the database interface rather than the database itself. """ pass class DatabaseError(Error): """ DB-API exception indicating an error related to the database. """ pass class DataError(DatabaseError): """ DB-API exception indicating an error while processing data (e.g. divide by zero, numeric value out-of-range, etc.) """ pass class OperationalError(DatabaseError): """ DB-API exception indicating an error related to the database's operation and not necessarily under the control of the programmer. """ pass class IntegrityError(DatabaseError): """ DB-API exception indicating an inconsistancy in the database integrity. """ pass class InternalError(DatabaseError): """ DB-API exception indicating an internal error that might indicate that a connection or cursor is no longer valid. """ pass class ProgrammingError(DatabaseError): """ DB-API exception indicating an erroneous request (e.g. column not found) """ pass class NotSupportedError(DatabaseError): """ DB-API exception indicating a request is not supported """ pass class TypeObject: def __init__(self, *values): self._values = values @property def id(self): return self._values[0] def __eq__(self, other): if not isinstance(other, TypeObject): return False if other.id in self._values: return True return self.id in other._values def __ne__(self, other): return not self.__eq__(other) STRING = TypeObject(0) BINARY = TypeObject(1) NUMBER = TypeObject(2) DATETIME = TypeObject(3, STRING.id) ROWID = TypeObject(4, NUMBER.id) def connect(source): raise NotSupportedError("Connection objects not supported") class Cursor(Iter): """ A class used to walk through a query response table row by row, accessing the contents of each record (row) of the table. This class implements the Python Database API. """ def __init__(self, results): """Create a cursor instance. The constructor is not typically called by directly applications; rather an instance is obtained from calling a DalQuery's execute(). """ super().__init__(results) self._description = self._mkdesc() self._rowcount = len(self.resultset) self._arraysize = 1 def _mkdesc(self): flds = self.resultset.fieldnames out = [] for name in flds: fld = self.resultset.getdesc(name) typ = STRING if fld.datatype in ("short", "int", "long", "float", "double", "floatComplex", "doubleComplex", "boolean"): typ = NUMBER elif fld.datatype in "char unicodeChar unsignedByte".split(): typ = STRING out.append((name, typ)) return tuple(out) @property def description(self): """ a read-only sequence of 2-item seqences. Each seqence describes a column in the results, giving its name and type_code. """ return self._description @property def rowcount(self): """ the number of rows in the result (read-only) """ return self._rowcount @property def arraysize(self): """ the number of rows that will be returned by returned by a call to fetchmany(). This defaults to 1, but can be changed. """ return self._arraysize @arraysize.setter def arraysize(self, value): if not value: value = 1 self._arraysize = value def infos(self): """Return any INFO elements in the VOTable as a dictionary. Returns ------- dict : A dictionary with each element corresponding to a single INFO, representing the INFO as a name:value pair. """ return self.resultset._infos def fetchone(self): """Return the next row of the query response table. Returns ------- tuple : The response is a tuple wherein each element is the value of the corresponding table field. """ try: rec = self.next() out = [] for name in self.resultset.fieldnames: out.append(rec[name]) return out except StopIteration: return None def fetchmany(self, size=None): """Fetch the next block of rows from the query result. Parameters ---------- size : int The number of rows to return (default: cursor.arraysize). Returns ------- list of tuples : A list of tuples, one per row. An empty sequence is returned when no more rows are available. If a DictCursor is used then the output consists of a list of dictionaries, one per row. """ if not size: size = self.arraysize out = [] for _ in range(size): out.append(self.fetchone()) return out def fetchall(self): """Fetch all remaining rows from the result set. Returns ------- list of tuples : A list of tuples, one per row. An empty sequence is returned when no more rows are available. If a DictCursor is used then the output consists of a list of dictionaries, one per row. """ out = [] for _ in range(self._rowcount - self.pos): out.append(self.fetchone()) return out def scroll(self, value, mode="relative"): """Move the row cursor. Parameters ---------- value : str The number of rows to skip or the row number to position to. mode : str Either "relative" for a relative skip (default), or "absolute" to position to a row by its absolute index within the result set (zero-indexed). """ if mode == "absolute": if value > 0: self.pos = value else: raise DataError("row number not valid:" + str(value)) elif mode == "relative": self.pos += value def close(self): """Close the cursor object and free all resources. This implementation does nothing. It is provided for compliance with the Python Database API. """ # this can remain implemented as "pass" pass pyvo-1.2.1/pyvo/dal/exceptions.py000066400000000000000000000156421416757633600170320ustar00rootroot00000000000000""" DAL Exceptions. """ __all__ = [ "DALAccessError", "DALProtocolError", "DALFormatError", "DALServiceError", "DALQueryError"] import re import requests from astropy.utils.exceptions import AstropyUserWarning class DALAccessError(Exception): """ a base class for failures while accessing a DAL service """ _defreason = "Unknown service access error" def __init__(self, reason=None, url=None): """ initialize the exception with an error message Parameters ---------- reason : str a message describing the cause of the error url : str the query URL that produced the error """ if not reason: reason = self._defreason super().__init__(reason) self._reason = reason self._url = url @classmethod def _typeName(cls, exc): try: return exc.__qualname__ except AttributeError: return re.sub( r"'>$", '', re.sub(r"<(type|class) '(.*\.)?", '', str(type(exc))) ) def __str__(self): return self._reason def __repr__(self): return "{}: {}".format(self._typeName(self), self._reason) @property def reason(self): """ a string description of what went wrong """ return self._reason @property def url(self): """ the URL that produced the error. If None, the URL is unknown or unset """ return self._url class DALProtocolError(DALAccessError): """ a base exception indicating that a DAL service responded with an error. This can be either an HTTP protocol error or a response format error; both of these are handled by separate subclasses. This base class captures an underlying exception clause. """ _defreason = "Unknown DAL Protocol Error" def __init__(self, reason=None, cause=None, url=None): """ initialize with a string message and an optional HTTP response code Parameters ---------- reason : str a message describing the cause of the error code : int the HTTP error code (as an integer) cause : str an exception issued as the underlying cause. A value of None indicates that no underlying exception was caught. url : str the query URL that produced the error """ super().__init__(reason, url) self._cause = cause @property def cause(self): """ a string description of what went wrong """ return self._cause class DALFormatError(DALProtocolError): """ an exception indicating that a DAL response contains fatal format errors. This would include XML or VOTable format errors. """ _defreason = "Unknown VOTable Format Error" def __init__(self, cause=None, url=None, reason=None): """ create the exception Parameters ---------- cause : str an exception issued as the underlying cause. A value of None indicates that no underlying exception was caught. url the query URL that produced the error reason a message describing the cause of the error """ if cause and not reason: reason = "{}: {}".format( DALAccessError._typeName(cause), str(cause)) super().__init__(reason, cause, url) class DALServiceError(DALProtocolError): """ an exception indicating a failure communicating with a DAL service. Most typically, this is used to report DAL queries that result in an HTTP error. """ _defreason = "Unknown service error" def __init__(self, reason=None, code=None, cause=None, url=None): """ initialize with a string message and an optional HTTP response code Parameters ---------- reason : str a message describing the cause of the error code : int the HTTP error code (as an integer) cause : str an exception issued as the underlying cause. A value of None indicates that no underlying exception was caught. url : str the query URL that produced the error """ super().__init__(reason, cause, url) self._code = code @property def code(self): """ the HTTP error code that resulted from the DAL service query, indicating the error. If None, the service did not produce an HTTP response. """ return self._code @classmethod def from_except(cls, exc, url=None): """ create and return DALServiceError exception appropriate for the given exception that represents the underlying cause. """ if isinstance(exc, requests.exceptions.RequestException): message = str(exc) try: code = exc.response.status_code except AttributeError: code = 0 return DALServiceError(message, code, exc, url) elif isinstance(exc, Exception): return DALServiceError("{}: {}".format(cls._typeName(exc), str(exc)), cause=exc, url=url) else: raise TypeError("from_except: expected Exception") class DALQueryError(DALAccessError): """ an exception indicating an error by a working DAL service while processing a query. Generally, this would be an error that the service successfully detected and consequently was able to respond with a legal error response-- namely, a VOTable document with an INFO element contains the description of the error. Possible errors will include bad usage by the client, such as query-syntax errors. """ _defreason = "Unknown DAL Query Error" def __init__(self, reason=None, label=None, url=None): """ Parameters ---------- reason : str a message describing the cause of the error. This should be set to the content of the INFO error element. label : str the identifying name of the error. This should be the value of the INFO element's value attribute within the VOTable response that describes the error. url : str the query URL that produced the error """ super().__init__(reason, url) self._label = label @property def label(self): """ the identifing name for the error given in the DAL query response. DAL queries that produce an error which is detectable on the server will respond with a VOTable containing an INFO element that contains the description of the error. This property contains the value of the INFO's value attribute. """ return self._label class PyvoUserWarning(AstropyUserWarning): pass pyvo-1.2.1/pyvo/dal/mimetype.py000066400000000000000000000063331416757633600164770ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ A module for parsing and working with mimetypes """ import mimetypes import cgi from astropy.io.fits import HDUList from ..utils.http import use_session mimetypes.add_type('application/fits', 'fits') mimetypes.add_type('application/x-fits', 'fits') mimetypes.add_type('image/fits', 'fits') mimetypes.add_type('text/plain', 'txt') def mime2extension(mimetype, default=None): """ return a recommended file extension for a file with a given MIME-type. This function provides some generic mappings that can be leveraged in implementations of ``suggest_extension()`` in ``Record`` subclasses. >>> mime2extension('application/fits') fits >>> mime2extension('image/jpeg') jpg >>> mime2extension('application/x-zed', 'dat') dat Parameters ---------- mimetype : str the file MIME-type byte-string to convert default : str the default extension to return if one could not be recommended based on ``mimetype``. By convention, this should not include a preceding '.' Returns ------- str the recommended extension without a preceding '.', or the value of ``default`` if no recommendation could be made. """ if not mimetype: return default if type(mimetype) == str: mimetype = mimetype.encode('utf-8') ext = mimetypes.guess_extension(mimetype, strict=False) return ext def mime_object_maker(url, mimetype, session=None): """ return a data object suitable for the mimetype given. this will either return a astropy fits object or a pyvo DALResults object, a PIL object for conventional images or string for text content. Parameters ---------- url : str the object download url mimetype : str the content mimetype session : object optional session to use for network requests Raises ------ ValueError if the mimetype is missing or cannot be parsed correctly """ if not mimetype: raise ValueError('mimetype required') session = use_session(session) full_type, params = cgi.parse_header(mimetype) mimetype = [x.strip() for x in full_type.split('/')] if '/' in full_type \ else None if not mimetype or len(mimetype) > 2: raise ValueError("Can't parse mimetype \"{}\"".format(full_type)) if mimetype[0] == 'text': return session.get(url).text if mimetype[1] == 'fits' or mimetype[1] == 'x-fits': response = session.get(url) return HDUList.fromstring(response.content) if mimetype[0] == 'image': from PIL import Image from io import BytesIO response = session.get(url) bio = BytesIO(response.content) return Image.open(bio) if mimetype[1] == 'x-votable' or mimetype[1] == 'x-votable+xml': # As soon as there are some kind of recursive data structures, # things start to get messy if mimetype[2].get('content', None) == 'datalink': from .adhoc import DatalinkResults return DatalinkResults.from_result_url(url) else: from .query import DALResults return DALResults.from_result_url(url) pyvo-1.2.1/pyvo/dal/params.py000066400000000000000000000331531416757633600161310ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This file contains functionallity related to VOTABLE Params. """ import numpy as np from collections.abc import MutableSet import abc from astropy import units as u from astropy.units import Quantity, Unit from astropy.time import Time from astropy.io.votable.converters import ( get_converter as get_votable_converter) from .exceptions import DALServiceError NUMERIC_DATATYPES = {'short', 'int', 'long', 'float', 'double'} def find_param_by_keyword(keyword, params): """ Searches for a specific param by keyword. This function will try to look for the keyword as-is first, and then tries to find the uppercase'd version of the keyword. """ if keyword in params: return params[keyword] keyword = keyword.upper() if keyword in params: return params[keyword] raise KeyError('No param named {} defined'.format(keyword)) registry = dict() def xtype(name): def decorate(cls): registry[name] = cls return cls return decorate def unify_value(func): """ Decorator for serialize method to do unit conversion on input value. The decorator converts the input value to the unit in the input param. """ def wrapper(self, value): if self._param.unit: value = Quantity(value) if not value.unit.to_string(): value = value * Unit(self._param.unit) else: value = value.to(self._param.unit) if isinstance(value, Quantity): value = value.value return func(self, value) return wrapper def get_converter(param): if param.xtype in registry: return registry[param.xtype](param) if param.datatype in NUMERIC_DATATYPES: return Number(param) return Converter(param) class Converter: """ Base class for all converters. Each subclass handles the conversion of a input value based on a specific xtype. """ def __init__(self, param): self._param = param def serialize(self, value): """ Serialize for use in DAL Queries """ if isinstance(value, list): # multiple values return [str(_) for _ in value] else: return str(value) class Number(Converter): def __init__(self, param): if param.datatype not in {'short', 'int', 'long', 'float', 'double'}: pass super().__init__(param) @unify_value def serialize(self, value): """ Serialize for use in DAL Queries """ return get_votable_converter(self._param).output( value, np.zeros_like(value)) @xtype('timestamp') class Timestamp(Converter): def __init__(self, param): if param.datatype != 'char': raise DALServiceError('Datatype is not char') super().__init__(param) def serialize(self, value): """ Serialize time values for use in DAL Queries """ value = Time(value) if value.size == 1: return value.isot else: raise DALServiceError('Expecting a scalar time value') @xtype('interval') class Interval(Number): def __init__(self, param): try: arraysize = int(param.arraysize) if arraysize % 2: raise DALServiceError('Arraysize is not even') except ValueError: raise DALServiceError('Arraysize is not even') super().__init__(param) @unify_value def serialize(self, value): size = np.size(value) if size % 2: raise DALServiceError('Interval size is not even') return super().serialize(value) @xtype('point') class Point(Number): def __init__(self, param): try: arraysize = int(param.arraysize) if arraysize != 2: raise DALServiceError('Point arraysize must be 2') except ValueError: raise DALServiceError('Point arraysize must be 2') super().__init__(param) @unify_value def serialize(self, value): size = np.size(value) if size != 2: raise DALServiceError('Point size must be 2') return super().serialize(value) @xtype('circle') class Circle(Number): def __init__(self, param): arraysize = int(param.arraysize) if arraysize != 3: raise DALServiceError('Circle arraysize must be 3') super().__init__(param) @unify_value def serialize(self, value): size = np.size(value) if size != 3: raise DALServiceError('Circle size must be 3') return super().serialize(value) @xtype('polygon') class Polygon(Number): def __init__(self, param): try: arraysize = int(param.arraysize) if arraysize % 3: raise DALServiceError('Arraysize is not a multiple of 3') except ValueError: if param.arraysize != '*': raise DALServiceError('Arraysize is not a multiple of 3') super().__init__(param) @unify_value def serialize(self, value): size = np.size(value) try: if size % 3: raise DALServiceError('Size is not a multiple of 3') except ValueError: raise DALServiceError('Size is not a multiple of 3') return super().serialize(value) class AbstractDalQueryParam(MutableSet, metaclass=abc.ABCMeta): """ Base class for a DAL parameter. In general, a DAL parameter allows for multiple values which are OR-ed by the service. As such, the class behaves like a set that stores all the values. When a value is added to an attribute, it is validated and formatted to conform to the using service (SIAv2 or SODA) and value errors might be raised. The `dal` attribute stores the current list of formatted attributes. Subclasses must override the `dal_formatter` method that formats values for serialization. That includes unit conversions and string representation Duplicates in the set are determine based on the formatted DAL representation of the value. """ def __init__(self, values=()): """ Parameters ---------- values : sequence, optional An initial set of values. """ self.dal = [] self._data = [] for item in values: self.add(item) super().__init__() @abc.abstractmethod def get_dal_format(self, item): """ Method to be provided by subclasses """ return def add(self, item): if item in self: return self._data.append(item) self.dal.append(self.get_dal_format(item)) def discard(self, item): # relies on the fact that both the raw and the formatted # attribute lists have the items in the same order. It # uses the formatted list (normalized units) to get the index. index = self.dal.index(self.get_dal_format(item)) self._data.pop(index) self.dal.pop(index) def __iter__(self): return iter(self._data) def __len__(self): return len(self._data) def __contains__(self, item): # check dal format for duplications since the quantities are known return self.get_dal_format(item) in self.dal class StrQueryParam(AbstractDalQueryParam): """ Representation of a unitless, single-value parameter. The formatter is just a str() cast """ def get_dal_format(self, val): return str(val) class PosQueryParam(AbstractDalQueryParam): """ Representation of a position parameter. Depending on the number of entries, the resulting DAL format is CIRCLE, RANGE or POLYGON. """ def get_dal_format(self, val): """ formats the tuple values into a string to be sent to the service entries in values are either quantities or assumed to be degrees """ self._validate_pos(val) if len(val) == 3: shape = 'CIRCLE' elif len(val) == 4: shape = 'RANGE' elif len(val) > 5 and not len(val) % 2: shape = 'POLYGON' else: raise ValueError( 'Invalid shape {}. Tuple with 3 (CIRCLE), 4 (RANGE) or ' 'even 6 and above (POLYGON) accepted.'.format(val)) return '{} {}'.format(shape, ' '.join( [str(val.to(u.deg).value) if isinstance(val, Quantity) else str((val*u.deg).value) for val in val])) def _validate_pos(self, pos): """ validates position This has probably done already somewhere else """ if len(pos) == 3: self._validate_ra(pos[0]) self._validate_dec(pos[1]) if not isinstance(pos[2], Quantity): radius = pos[2] * u.deg else: radius = pos[2] if radius <= 0*u.deg or radius.to(u.deg) > 90*u.deg: raise ValueError('Invalid circle radius: {}'.format(radius)) elif len(pos) == 4: ra_min = pos[0] if isinstance(pos[0], Quantity) else pos[0] * u.deg ra_max = pos[1] if isinstance(pos[1], Quantity) else pos[1] * u.deg dec_min = pos[2] if isinstance(pos[2], Quantity) \ else pos[2] * u.deg dec_max = pos[3] if isinstance(pos[3], Quantity) \ else pos[3] * u.deg self._validate_ra(ra_min) self._validate_ra(ra_max) if ra_max.to(u.deg) < ra_min.to(u.deg): raise ValueError('min > max in ra range: {} > {}'. format(ra_min, ra_max)) self._validate_dec(dec_min) self._validate_dec(dec_max) if dec_max.to(u.deg) < dec_min.to(u.deg): raise ValueError('min > max in dec range: {} > {}'. format(dec_min, dec_max)) else: for i, m in enumerate(pos): if i % 2: self._validate_dec(m) else: self._validate_ra(m) def _validate_ra(self, ra): if not isinstance(ra, Quantity): ra = ra * u.deg if ra.to(u.deg).value < 0 or ra.to(u.deg).value > 360.0: raise ValueError('Invalid ra: {}'.format(ra)) def _validate_dec(self, dec): if not isinstance(dec, Quantity): dec = dec * u.deg if dec.to(u.deg).value < -90.0 or dec.to(u.deg).value > 90.0: raise ValueError('Invalid dec: {}'.format(dec)) class IntervalQueryParam(AbstractDalQueryParam): """ Representation of an interval DAL parameter. """ def __init__(self, unit=None, equivalencies=None): """ Parameters ---------- unit : `astropy.unit` Unit this paramter is represented in DAL format equivalencies: list List of equivalencies for unit conversion """ self._unit = unit self._equivalencies = equivalencies super().__init__() def get_dal_format(self, val): if isinstance(val, (tuple, Quantity)): if len(val) == 1: high = low = val[0] elif len(val) == 2: low = val[0] high = val[1] else: raise ValueError('Too few/many values in interval attribute: {}'. format(val)) else: high = low = val if isinstance(low, (int, float)) and isinstance(high, (int, float))\ and low > high: raise ValueError('Invalid interval: min({}) > max({})'.format( low, high)) if self._unit: if not isinstance(low, Quantity): low = low*self._unit low = low.to(self._unit, equivalencies=self._equivalencies).value if not isinstance(high, Quantity): high = high*self._unit high = high.to(self._unit, equivalencies=self._equivalencies).value if low > high: # interval could become invalid during transform (e.g. GHz->m) low, high = high, low return '{} {}'.format(low, high) class TimeQueryParam(AbstractDalQueryParam): """ Representation of a timestamp parameter. """ def get_dal_format(self, val): if isinstance(val, tuple): if len(val) == 1: max_time = min_time = val[0] elif len(val) == 2: min_time = val[0] max_time = val[1] else: raise ValueError('Too few/many members in time attribute: {}'. format(val)) else: max_time = min_time = val if not isinstance(min_time, Time): min_time = Time(min_time) if not isinstance(max_time, Time): max_time = Time(max_time) if min_time > max_time: raise ValueError('Invalid time interval: min({}) > max({})'.format( min_time, max_time )) return '{} {}'.format(min_time.mjd, max_time.mjd) class EnumQueryParam(AbstractDalQueryParam): """ Representation of an enum parameter """ def __init__(self, allowed_values): """ Parameters ---------- allowed_values : sequence Sequence of allowed values for the enum """ self._allowed = allowed_values super().__init__() def get_dal_format(self, val): if val not in self._allowed: raise ValueError('{} not a valid value from: {}'. format(val, self._allowed)) return str(val) pyvo-1.2.1/pyvo/dal/query.py000066400000000000000000001007151416757633600160120ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ A module for walking through the query response of VO data access layer (DAL) queries and general VOTable-based datasets. Most data queries in the VO return a table as a result, usually formatted as a VOTable. Each row of the table describes a single physical or virtual dataset which can be retrieved. For uniformity, datasets are described via standard metadata defined by a data model specific to the type of data being queried. The fields of the data model are identified most generally by their VOClient alias as defined in this interface, or at a lower level by the Utype or UCD of the specific standard and version of the standard being queried. While the data model differs depending upon the type of data being queried, the form of the query response is the same for all classes of data, allowing a common query response interface to be used. An exception to this occurs when querying an astronomical catalog or other externally defined table. In this case there is no VO defined standard data model. Usually the field names are used to uniquely identify table columns. """ __all__ = ["DALService", "DALQuery", "DALResults", "Record"] import os import shutil import re import requests try: from collections.abc import Mapping except ImportError: from collections import Mapping import collections from warnings import warn from astropy.table import Table from astropy.io.votable import parse as votableparse from astropy.io.votable.ucd import parse_ucd from astropy.utils.exceptions import AstropyDeprecationWarning from .mimetype import mime_object_maker from .exceptions import (DALFormatError, DALServiceError, DALQueryError) from .. import samp from ..utils.decorators import stream_decode_content from ..utils.http import use_session class DALService: """ an abstract base class representing a DAL service located a particular endpoint. """ def __init__(self, baseurl, session=None): """ instantiate the service connecting it to a base URL Parameters ---------- baseurl : str the base URL that should be used for forming queries to the service. session : object optional session to use for network requests """ self._baseurl = baseurl self._session = use_session(session) @property def baseurl(self): """ the base URL identifying the location of the service and where queries are submitted (read-only) """ return self._baseurl def search(self, **keywords): """ send a search query to this service. This implementation has no knowledge of the type of service being queried. The query parameters are given as arbitrary keywords which will be assumed to be understood by the service (i.e. there is no argument checking). The response is a generic DALResults object. Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError for errors either in the input query syntax or other user errors detected by the service DALFormatError for errors parsing the VOTable response """ q = self.create_query(**keywords) return q.execute() def create_query(self, **keywords): """ create a query object that constraints can be added to and then executed. Returns ------- DALQuery a generic query object """ q = DALQuery(self.baseurl, session=self._session, **keywords) return q def describe(self): print('DAL Service at {}'.format(self.baseurl)) class DALQuery(dict): """ a class for preparing a query to a particular service. Query constraints are added via its service type-specific methods. The various execute() functions will submit the query and return the results. The base URL for the query can be changed via the baseurl property. A session can also optionally be passed in that will be used for network transactions made by this object to remote services. """ _ex = None def __init__(self, baseurl, session=None, **keywords): """ initialize the query object with a baseurl """ if type(baseurl) == bytes: baseurl = baseurl.decode("utf-8") self._baseurl = baseurl.rstrip("?") self._session = use_session(session) self.update({key.upper(): value for key, value in keywords.items()}) @property def baseurl(self): """ the base URL that this query will be sent to when one of the execute functions is called. """ return self._baseurl def execute(self): """ submit the query and return the results as a Results subclass instance Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError for errors either in the input query syntax or other user errors detected by the service DALFormatError for errors parsing the VOTable response """ return DALResults(self.execute_votable(), self.queryurl, session=self._session) def execute_raw(self): """ submit the query and return the raw response as a string. No exceptions are raised here because non-2xx responses might still contain payload. They can be raised later by calling ``raise_if_error`` """ f = self.execute_stream() out = None try: out = f.read() finally: f.close() return out @stream_decode_content def execute_stream(self, post=False): """ Submit the query and return the raw response as a file stream. No exceptions are raised here because non-2xx responses might still contain payload. They can be raised later by calling ``raise_if_error`` """ response = self.submit(post=post) try: response.raise_for_status() except requests.RequestException as ex: # save for later use self._ex = ex finally: return response.raw def submit(self, post=False): """ does the actual request """ url = self.queryurl params = {k: v for k, v in self.items()} if post: response = self._session.post(url, data=params, stream=True, allow_redirects=True) else: response = self._session.get(url, params=params, stream=True, allow_redirects=True) return response def execute_votable(self, post=False): """ Submit the query and return the results as an AstroPy votable instance. As this is the level where qualified error messages are available, they are raised here instead of in the underlying execute_stream. Returns ------- astropy.io.votable.tree.Table an Astropy votable Table instance Raises ------ DALServiceError for errors connecting to or communicating with the service DALFormatError for errors parsing the VOTable response See Also -------- astropy.io.votable DALServiceError DALFormatError DALQueryError """ try: return votableparse(self.execute_stream(post=post).read) except Exception as e: self.raise_if_error() raise DALFormatError(e, self.queryurl) def raise_if_error(self): """ Raise if there was an error on http level. """ if self._ex: e = self._ex raise DALServiceError.from_except(e, self.queryurl) @property def queryurl(self): """ The URL that encodes the current query. This is the URL that the execute functions will use if called next. """ return self.baseurl class DALResults: """ Results from a DAL query. It provides random access to records in the response. Alternatively, it can provide results via a Cursor (compliant with the Python Database API) or an iterable. """ @classmethod @stream_decode_content def _from_result_url(cls, result_url, session): return session.get(result_url, stream=True).raw @classmethod def from_result_url(cls, result_url, session=None): """ Create a result object from a url. Uses the optional session to make the request. """ session = use_session(session) return cls( votableparse(cls._from_result_url(result_url, session).read), url=result_url, session=session) def __init__(self, votable, url=None, session=None): """ initialize the cursor. This constructor is not typically called by directly applications; rather an instance is obtained from calling a DALQuery's execute(). Parameters ---------- votable : str the service response parsed into an astropy.io.votable.tree.VOTableFile instance. url : str the URL that produced the response session : object optional session to use for network requests Raises ------ DALFormatError if the response VOTable does not contain a response table See Also -------- DALFormatError """ self._votable = votable self._url = url self._session = use_session(session) self._status = self._findstatus(votable) if self._status[0].lower() not in ("ok", "overflow"): raise DALQueryError(self._status[1], self._status[0], url) self._resultstable = self._findresultstable(votable) if not self._resultstable: raise DALFormatError( reason="VOTable response missing results table", url=url) self._fldnames = tuple( field.name for field in self._resultstable.fields) if not self._fldnames: raise DALFormatError( reason="response table missing column descriptions.", url=url) self._infos = self._findinfos(votable) def _findresultstable(self, votable): # this can be overridden to specialize for a particular DAL protocol res = self._findresultsresource(votable) if not res or len(res.tables) < 1: return None return res.tables[0] def _findresultsresource(self, votable): # this can be overridden to specialize for a particular DAL protocol if len(votable.resources) < 1: return None for res in votable.resources: if res.type.lower() == "results": return res return votable.resources[0] def _findstatus(self, votable): # this can be overridden to specialize for a particular DAL protocol # look first in the result resource res = self._findresultsresource(votable) if res: # should be a RESOURCE/INFO info = self._findstatusinfo(res.infos) if info: return (info.value, info.content) # if not there, check inside first table if len(res.tables) > 0: info = self._findstatusinfo(res.tables[0].infos) if info: return (info.value, info.content) # otherwise, look just below the root element info = self._findstatusinfo(votable.infos) if info: return (info.value, info.content) # assume it's okay return ("OK", "QUERY_STATUS not specified") def _findstatusinfo(self, infos): # this can be overridden to specialize for a particular DAL protocol for info in infos: if info.name.lower() == 'query_status': return info def _findinfos(self, votable): # this can be overridden to specialize for a particular DAL protocol infos = {} res = self._findresultsresource(votable) for info in res.infos: infos[info.name] = info.value for info in votable.infos: infos[info.name] = info.value return infos def __repr__(self): return repr(self.to_table()) @property def queryurl(self): """ the URL query that produced these results. None is returned if unknown """ return self._url @property def votable(self): """ The complete votable XML Document `astropy.io.votable.tree.VOTableFile` """ return self._votable @property def resultstable(self): """ The votable XML element `astropy.io.votable.tree.Table` """ return self._resultstable def to_table(self): """ Returns a astropy Table object. Returns ------- `astropy.table.Table` """ return self.resultstable.to_table(use_names_over_ids=True) @property def table(self): warn(AstropyDeprecationWarning( 'Using the table property is deprecated. ' 'Please use se to_table() instead.' )) return self.to_table() def __len__(self): """ return the record count """ return len(self.resultstable.array) def __getitem__(self, indx): """ if indx is a string, r[indx] will return the field with the name of indx; if indx is an integer, r[indx] will return the indx-th record. """ if isinstance(indx, int): return self.getrecord(indx) elif isinstance(indx, tuple): return self.getvalue(*indx) else: return self.getcolumn(indx) @property def fieldnames(self): """ return the names of the columns. These are the names that are used to access values from the dictionaries returned by getrecord(). They correspond to the column name. """ return self._fldnames @property def fielddescs(self): """ return the full metadata the columns as a list of Field instances, a simple object with attributes corresponding the the VOTable FIELD attributes, namely: name, id, type, ucd, utype, arraysize, description """ return self.resultstable.fields @property def status(self): """ The query status as a 2-element tuple e.g. ('OK', 'Everythings fine') """ return self._status def fieldname_with_ucd(self, ucd): """ return the field name that has a given UCD value or None if the UCD is not found. """ search_ucds = set(parse_ucd(ucd, has_colon=True)) for field in (field for field in self.fielddescs if field.ucd): field_ucds = set(parse_ucd(field.ucd, has_colon=True)) if search_ucds & field_ucds: return field.name return None def fieldname_with_utype(self, utype): """ return the field name that has a given UType value or None if the UType is not found. """ try: iterchain = ( self.getdesc(fieldname) for fieldname in self.fieldnames) iterchain = (field for field in iterchain if field.utype == utype) return next(iterchain).name except StopIteration: return None def getcolumn(self, name): """ return a numpy array containing the values for the column with the given name """ try: if name not in self.fieldnames: name = self.resultstable.get_field_by_id(name).name return self.resultstable.array[name] except KeyError: raise KeyError("No such column: {}".format(name)) def getrecord(self, index): """ return a representation of a result record that follows dictionary semantics. The keys of the dictionary are those returned by this instance's fieldnames attribute.The returned record may have additional accessor methods for getting at stardard DAL response metadata (e.g. ra, dec). Parameters ---------- index : int the integer index of the desired record where 0 returns the first record Returns ------- Record a dictionary-like wrapper containing the result record metadata. Raises ------ IndexError if index is negative or equal or larger than the number of rows in the result table. See Also -------- Record """ return Record(self, index, session=self._session) def getvalue(self, name, index): """ return the value of a record attribute--a value from a column and row. Parameters ---------- name : str the name of the attribute (column) index : int the zero-based index of the record Raises ------ IndexError if index is negative or equal or larger than the number of rows in the result table. KeyError if name is not a recognized column name """ return self.getrecord(index)[name] def getdesc(self, name): """ return the field description for the record attribute (column) with the given name Parameters ---------- name : str the name of the attribute (column) Returns ------- object with attributes (name, id, datatype, unit, ucd, utype, arraysize) which describe the column """ if name not in self._fldnames: raise KeyError(name) return self.resultstable.get_field_by_id_or_name(name) def __iter__(self): """ return a python iterable for stepping through the records in this result """ pos = 0 while True: try: out = self.getrecord(pos) except IndexError: break yield out pos += 1 def broadcast_samp(self, client_name=None): """ Broadcast the table to ``client_name`` via SAMP """ with samp.connection() as conn: samp.send_table_to( conn, self.to_table(), client_name=client_name, name=self.queryurl) def cursor(self): """ return a cursor that is compliant with the Python Database API's :class:`.Cursor` interface. See PEP 249 for details. """ from .dbapi2 import Cursor return Cursor(self) class Record(Mapping): """ one record from a DAL query result. The column values are accessible as dictionary items. It also provides special added functions for accessing the dataset the record corresponds to. Subclasses may provide additional functions for access to service type-specific data. """ def __init__(self, results, index, session=None): self._results = results self._index = index self._session = use_session(session) self._mapping = collections.OrderedDict( zip( results.fieldnames, results.resultstable.array.data[index] ) ) def __getitem__(self, key): try: if key not in self._mapping: key = self._results.resultstable.get_field_by_id(key).name return self._mapping[key] except KeyError: raise KeyError("No such column: {}".format(key)) def __iter__(self): return iter(self._mapping) def __len__(self): return len(self._mapping) def __repr__(self): return repr(tuple(self.values())) def get(self, key, default=None, decode=False): """ This method mimics the dict get method and adds a decode parameter to allow decoding of binary strings. """ out = self._mapping.get(key, default) if decode and isinstance(out, bytes): out = out.decode('ascii') return out def getbyucd(self, ucd, default=None, decode=False): """ return the column with the given ucd. """ return self.get( self._results.fieldname_with_ucd(ucd), default, decode) def getbyutype(self, utype, default=None, decode=False): """ return the column with the given utype. Raises ------ KeyError if theres no column with the given utype. """ return self.get( self._results.fieldname_with_utype(utype), default, decode) def getdataformat(self): """ return the mimetype of the dataset described by this record. """ return self.getbyucd('meta.code.mime', decode=True) def getdataurl(self): """ return the URL contained in the access URL column which can be used to retrieve the dataset described by this record. None is returned if no such column exists. """ for fieldname in self._results.fieldnames: field = self._results.getdesc(fieldname) if (field.utype and "access.reference" in field.utype.lower()) or ( field.ucd and "meta.dataset" in field.ucd and "meta.ref.url" in field.ucd ): out = self[fieldname] if isinstance(out, bytes): out = out.decode('utf-8') return out return None def getdataobj(self): """ return the appropiate data object suitable for the data content behind this record. """ return mime_object_maker(self.getdataurl(), self.getdataformat()) @stream_decode_content def getdataset(self, timeout=None): """ Get the dataset described by this record from the server. Parameters ---------- timeout : float the time in seconds to allow for a successful connection with server before failing with an IOError (specifically, socket.timeout) exception Returns ------- A file-like object which may be read to retrieve the referenced dataset. Raises ------ KeyError if no datast access URL is included in the record URLError if the dataset access URL is invalid (note: subclass of IOError) HTTPError if an HTTP error occurs while accessing the dataset (note: subclass of IOError) socket.timeout if the timeout is exceeded before a connection is established. (note: subclass of IOError) IOError if some other error occurs while establishing the data stream. """ url = self.getdataurl() if not url: raise KeyError("no dataset access URL recognized in record") if timeout: response = self._session.get(url, stream=True, timeout=timeout) else: response = self._session.get(url, stream=True) response.raise_for_status() return response.raw def cachedataset(self, filename=None, dir=".", timeout=None, bufsize=None): """ retrieve the dataset described by this record and write it out to a file with the given name. If the file already exists, it will be over-written. Parameters ---------- filename : str the name of the file to write dataset to. If the value represents a relative path, it will be taken to be relative to the value of the ``dir`` parameter. If None, a default name is attempted based on the record title and format. dir : str the directory to write the file into. This value will be ignored if filename is an absolute path. timeout : int the time in seconds to allow for a successful connection with server before failing with an IOError (specifically, socket.timeout) exception bufsize : int a buffer size in bytes for copying the data to disk (default: 0.5 MB) Raises ------ KeyError if no datast access URL is included in the record URLError if the dataset access URL is invalid HTTPError if an HTTP error occurs while accessing the dataset socket.timeout if the timeout is exceeded before a connection is established. (note: subclass of IOError) IOError if an error occurs while writing out the dataset """ if not bufsize: bufsize = 524288 if not filename: filename = self.make_dataset_filename(dir) inp = self.getdataset(timeout) try: with open(filename, 'wb') as out: shutil.copyfileobj(inp, out) finally: inp.close() _dsname_no = 0 # used by make_dataset_filename def make_dataset_filename(self, dir=".", base=None, ext=None): """ create a viable pathname in a given directory for saving the dataset available via getdataset(). The pathname that is returned is guaranteed not to already exist (under single-threaded conditions). This implementation will first try combining the base name with the file extension (with a dot). If this file already exists in the directory, a name that appends an integer suffix ("-#") to the base before joining with the extension will be tried. The integer will be incremented until a non-existent filename is created. Parameters ---------- dir : str the directory to save the dataset under. This must already exist. base : str a basename to use to as the base of the filename. If None, the result of ``suggest_dataset_basename()`` will be used. ext : str the filename extension to use. If None, the result of ``suggest_extension()`` will be used. """ if not dir: raise ValueError( "make_dataset_filename(): no dir parameter provided") if not os.path.exists(dir): os.mkdir(dir) if not os.path.isdir(dir): raise ValueError("{}: not a directory".format(dir)) if not base: base = self.suggest_dataset_basename() if not ext: ext = self.suggest_extension("dat") # be efficient when writing a bunch of files into the same directory # in succession n = self._dsname_no def mkpath(i): return os.path.join(dir, "{}-{}.{}".format(base, i, ext)) if n > 0: # find the last file written of the form, base-n.ext while n > 0 and not os.path.exists(mkpath(n)): n -= 1 if n > 0: n += 1 if n == 0: # never wrote a file of form, base-n.ext; try base.ext path = os.path.join(dir, "{}.{}".format(base, ext)) if not os.path.exists(path): return path n += 1 # find next available name while os.path.exists(mkpath(n)): n += 1 self._dsname_no = n return mkpath(n) def suggest_dataset_basename(self): """ return a default base filename that the dataset available via ``getdataset()`` can be saved as. This function is specialized for a particular service type this record originates from so that it can be used by ``cachedataset()`` via ``make_dataset_filename()``. """ # abstract; specialized for the different service types return "dataset" def suggest_extension(self, default=None): """ returns a recommended filename extension for the dataset described by this record. Typically, this would look at the column describing the format and choose an extension accordingly. This function is specialized for a particular service type this record originates from so that it can be used by ``cachedataset()`` via ``make_dataset_filename()``. """ # abstract; specialized for the different service types return default class Iter: def __init__(self, res): self.resultset = res self.pos = 0 def __iter__(self): return self def __next__(self): try: out = self.resultset.getrecord(self.pos) self.pos += 1 return out except IndexError: raise StopIteration() next = __next__ class Upload: """ This class represents a DALI Upload as described in http://www.ivoa.net/documents/DALI/20161101/PR-DALI-1.1-20161101.html#tth_sEc3.4.5 """ def __init__(self, name, content): """ Initialise the Upload object with the given parameters Parameters ---------- name : str Tablename for use in queries content : object If its a file-like object, a string pointing to a local file, a `DALResults` object or a astropy table, `is_inline` will be true and it will expose a file-like object under `fileobj` Otherwise it exposes a URI under `uri` """ try: self._is_file = os.path.isfile(content) except Exception: self._is_file = False self._is_fileobj = hasattr(content, "read") self._is_table = isinstance(content, Table) self._is_resultset = isinstance(content, DALResults) self._inline = any(( self._is_file, self._is_fileobj, self._is_table, self._is_resultset, )) self._name = name self._content = content @property def is_inline(self): """ True if the upload can be inlined """ return self._inline @property def name(self): return self._name def fileobj(self): """ A file-like object for a local resource Raises ------ ValueError if theres no valid local resource """ if not self.is_inline: raise ValueError( "Upload {name} doesn't refer to a local resource".format( name=self.name)) # astropy table if isinstance(self._content, Table): from io import BytesIO fileobj = BytesIO() self._content.write(output=fileobj, format="votable") fileobj.seek(0) return fileobj elif isinstance(self._content, DALResults): from io import BytesIO fileobj = BytesIO() table = self._content.to_table() table.write(output=fileobj, format="votable") fileobj.seek(0) return fileobj fileobj = self._content try: fileobj = open(self._content) finally: return fileobj def uri(self): """ The URI pointing to the result """ # TODO: use a async job base class instead of hasattr for inspection if hasattr(self._content, "result_uri"): self._content.raise_if_error() uri = self._content.result_uri else: uri = str(self._content) return uri def query_part(self): """ The query part for use in DALI requests """ if self.is_inline: value = "{name},param:{name}" else: value = "{name},{uri}" return value.format(name=self.name, uri=self.uri()) class UploadList(list): """ This class extends the native python list with utility functions for upload handling """ @classmethod def fromdict(cls, dct): """ Constructs a upload list from a dictionary with table_name: content """ return cls(Upload(key, value) for key, value in dct.items()) def param(self): """ Returns a string suitable for use in UPLOAD parameters """ return ";".join(upload.query_part() for upload in self) _image_mt_re = re.compile(r'^image/(\w+)') _text_mt_re = re.compile(r'^text/(\w+)') _votable_mt_re = re.compile(r'^(\w+)/(x-)?votable(\+\w+)?') pyvo-1.2.1/pyvo/dal/scs.py000066400000000000000000000453321416757633600154400ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ A module for searching remote source and observation catalogs A Simple Cone Search (SCS) service allows a client to search for records in a source or observation catalog whose positions are within some minimum distance of a search position (i.e. within a specified "cone" on the sky). This module provides an interface for accessing such services. It is implemented as a specialization of the DAL Query interface. The ``search()`` function provides a simple interface to a service, returning an SCSResults instance as its results which represents the matching records from the catalog. The SCSResults supports access to and iterations over the individual records; these are provided as SCSRecord instances, which give easy access to key metadata in the response, including the ICRS position of the matched source or observation. This module also features the SCSQuery class that provides an interface for building up and remembering a query. The SCSService class can represent a specific service available at a URL endpoint. """ from pyvo.io.vosi.vodataservice import TableParam from astropy.coordinates import SkyCoord from astropy.units import Unit, Quantity from astropy.io.votable.tree import Field from astropy.table import Table from .query import DALResults, DALQuery, DALService, Record from .adhoc import DatalinkResultsMixin, DatalinkRecordMixin __all__ = ["search", "SCSService", "SCSQuery", "SCSResults", "SCSRecord"] def search(url, pos, radius=1.0, verbosity=2, **keywords): """ submit a simple Cone Search query that requests objects or observations whose positions fall within some distance from a search position. Parameters ---------- url : str the base URL of the query service. pos : astropy.coordinates.SkyCoord a SkyCoord instance defining the position of the center of the circular search region. converted if it's a iterable containing scalars, assuming icrs degrees. radius : `~astropy.units.Quantity` or float a Quantity instance defining the radius of the circular search region, in degrees. converted if it is another unit. verbosity : int an integer value that indicates the volume of columns to return in the result table. 0 means the minimum set of columsn, and 3 means as many columns as are available. **keywords : additional case insensitive parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. Returns ------- SCSResults a container holding a table of matching catalog records Raises ------ DALServiceError for errors connecting to or communicating with the service. DALQueryError if the service responds with an error, including a query syntax error. See Also -------- SCSResults pyvo.dal.query.DALServiceError pyvo.dal.query.DALQueryError """ return SCSService(url).search(pos, radius, verbosity, **keywords) class SCSService(DALService): """ a representation of a Cone Search service """ def __init__(self, baseurl, session=None): """ instantiate a Cone Search service Parameters ---------- baseurl : str the base URL for submitting search queries to the service. session : object optional session to use for network requests """ super().__init__(baseurl, session=session) def _get_metadata(self): """ download the metadata resource """ if not hasattr(self, '_metadata'): query = self.create_query(pos=(0, 0), radius=0) metadata = query.execute_votable() setattr(self, '_metadata', metadata) @property def description(self): """ the service description. """ self._get_metadata() try: return getattr(self, '_metadata').description except AttributeError: return None @property def columns(self): """ the available columns on this service """ self._get_metadata() fields = filter( lambda field_or_param: isinstance(field_or_param, Field), self._metadata.iter_fields_and_params() ) try: return [ TableParam.from_field(field) for field in fields] except AttributeError: return [] def search(self, pos, radius=1.0, verbosity=2, **keywords): """ submit a simple Cone Search query that requests objects or observations whose positions fall within some distance from a search position. Parameters ---------- pos : astropy.coordinates.SkyCoord a SkyCoord instance defining the position of the center of the circular search region. converted if it's a iterable containing scalars, assuming icrs degrees. radius : `~astropy.units.Quantity` or float a Quantity instance defining the radius of the circular search region, in degrees. converted if it is another unit. verbosity : int an integer value that indicates the volume of columns to return in the result table. 0 means the minimum set of columns, 3 means as many columns as are available. **keywords : additional case insensitive parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. Returns ------- SCSResults a container holding a table of matching catalog records Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError if the service responds with an error, including a query syntax error. See Also -------- SCSResults pyvo.dal.query.DALServiceError pyvo.dal.query.DALQueryError """ return self.create_query(pos, radius, verbosity, **keywords).execute() def create_query(self, pos=None, radius=None, verbosity=None, **keywords): """ create a query object that constraints can be added to and then executed. The input arguments will initialize the query with the given values. Parameters ---------- pos : astropy.coordinates.SkyCoord a SkyCoord instance defining the position of the center of the circular search region. converted if it's a iterable containing scalars, assuming icrs degrees. radius : `~astropy.units.Quantity` or float a Quantity instance defining the radius of the circular search region, in degrees. converted if it is another unit. verbosity : int an integer value that indicates the volume of columns to return in the result table. 0 means the minimum set of columns, 3 means as many columns as are available. **keywords : additional case insensitive parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. Returns ------- SCSQuery the query instance See Also -------- SCSQuery """ return SCSQuery(self.baseurl, pos, radius, verbosity, session=self._session, **keywords) def describe(self): print(self.description) print() rows = [( col.name, col.description, col.unit, col.ucd, col.utype, col.datatype.arraysize, col.datatype.content, ) for col in self.columns] names = ( 'name', 'description', 'unit', 'ucd', 'utype', 'arraysize', 'datatype', ) table = Table(rows=rows, names=names) table.pprint( max_lines=-1, max_width=-1, show_unit=False, show_dtype=False) class SCSQuery(DALQuery): """ a class for preparing an query to a Cone Search service. Query constraints are added via its service type-specific methods. The various execute() functions will submit the query and return the results. The base URL for the query, which controls where the query will be sent when one of the execute functions is called, is typically set at construction time; however, it can be updated later via the :py:attr:`~pyvo.dal.query.DALQuery.baseurl` to send a configured query to another service. In addition to the search constraint attributes described below, search parameters can be set generically by name via dict semantics. The typical function for submitting the query is ``execute()``; however, alternate execute functions provide the response in different forms, allowing the caller to take greater control of the result processing. """ def __init__( self, baseurl, pos=None, radius=None, verbosity=None, session=None, **keywords): """ initialize the query object with a baseurl and the given parameters Parameters ---------- pos : astropy.coordinates.SkyCoord a SkyCoord instance defining the position of the center of the circular search region. converted if it's a iterable containing scalars, assuming icrs degrees. radius : `~astropy.units.Quantity` or float a Quantity instance defining the radius of the circular search region, in degrees. converted if it is another unit. verbosity : int an integer value that indicates the volume of columns to return in the result table. 0 means the minimum set of columns, 3 means as many columns as are available. session : object optional session to use for network requests """ super().__init__(baseurl, session=session) if pos is not None: self.pos = pos if radius is not None: self.radius = radius if verbosity is not None: self.verbosity = verbosity self.update({key.upper(): value for key, value in keywords.items()}) @property def pos(self): """ the position of the center of the circular search region as a `~astropy.coordinates.SkyCoord` instance. """ return getattr(self, "_pos", None) @pos.setter def pos(self, pos): setattr(self, "_pos", pos) if not isinstance(pos, SkyCoord): try: ra, dec = pos except (TypeError, ValueError): raise ValueError( 'Pos must be a sequence with exactly two values, ' 'expressing ra and dec in icrs degrees' ) # assume degrees pos = SkyCoord(ra=ra, dec=dec, unit="deg", frame="icrs") self["RA"] = pos.icrs.ra.deg self["DEC"] = pos.icrs.dec.deg @pos.deleter def pos(self): delattr(self, "_pos") del self["RA"] del self["DEC"] @property def radius(self): """ the radius of the circular region around pos as a `~astropy.units.Quantity` instance. """ return getattr(self, "_radius", None) @radius.setter def radius(self, radius): setattr(self, "_radius", radius) if not isinstance(radius, Quantity): valerr = ValueError("Radius must be exactly one value") try: # assume degrees radius = radius * Unit("deg") except ValueError: raise valerr try: if len(radius): raise valerr except TypeError: pass # len 1 self["SR"] = radius.to(Unit("deg")).value @radius.deleter def radius(self): delattr(self, "_radius") del self["SR"] @property def verbosity(self): """ an integer value that indicates the volume of columns to return in the result table. 0 means the minimum set of columsn, 3 means as many columns as are available. """ return getattr(self, "_verbosity", None) @verbosity.setter def verbosity(self, verbosity): setattr(self, "_verbosity", verbosity) self["VERB"] = verbosity @verbosity.deleter def verbosity(self): delattr(self, "_verbosity") del self["VERB"] def execute(self): """ submit the query and return the results as a SCSResults instance Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError for errors either in the input query syntax or other user errors detected by the service DALFormatError for errors parsing the VOTable response """ return SCSResults(self.execute_votable(), url=self.queryurl, session=self._session) class SCSResults(DALResults, DatalinkResultsMixin): """ The list of matching catalog records resulting from a catalog (SCS) query. Each record contains a set of metadata that describes a source or observation within the requested circular region (i.e. a "cone"). The number of records in the results is available via the :py:attr:`nrecs attribute or by passing it to the Python built-in ``len()`` function. This class supports iterable semantics; thus, individual records (in the form of :py:class:`~pyvo.dal.scs.SCSRecord` instances) are typically accessed by iterating over an ``SCSResults`` instance. >>> results = pyvo.conesearch(url, pos=[12.24, -13.1], radius=0.1) >>> for src in results: ... print("{0}: {1} {2}".format(src.id, src.ra, src.dec)) Alternatively, records can be accessed randomly via :py:meth:`getrecord` or through a Python Database API (v2) Cursor (via :py:meth:`~pyvo.dal.query.DALResults.cursor`). Column-based data access is possible via the :py:meth:`~pyvo.dal.query.DALResults.getcolumn` method. ``SCSResults`` is essentially a wrapper around an Astropy :py:mod:`~astropy.io.votable` :py:class:`~astropy.io.votable.tree.Table` instance where the columns contain the various metadata describing the images. One can access that VOTable directly via the :py:attr:`~pyvo.dal.query.DALResults.votable` attribute. Thus, when one retrieves a whole column via :py:meth:`~pyvo.dal.query.DALResults.getcolumn`, the result is a Numpy array. Alternatively, one can manipulate the results as an Astropy :py:class:`~astropy.table.table.Table` via the following conversion: >>> table = results.votable.to_table() ``SCSResults`` supports the array item operator ``[...]`` in a read-only context. When the argument is numerical, the result is an :py:class:`~pyvo.dal.scs.SCSRecord` instance, representing the record at the position given by the numerical index. If the argument is a string, it is interpreted as the name of a column, and the data from the column matching that name is returned as a Numpy array. """ def _findresultsresource(self, votable): if len(votable.resources) < 1: return None return votable.resources[0] def _findstatus(self, votable): # this is specialized according to the Conesearch standard # look first in the preferred location: just below the root VOTABLE info = self._findstatusinfo(votable.infos) if info: return (info.name, info.value) # look next in the result resource res = self._findresultsresource(votable) if res: # look for RESOURCE/INFO info = self._findstatusinfo(res.infos) if info: return (info.name, info.value) # if not there, check for a PARAM info = self._findstatusinfo(res.params) if info: return (info.name, info.value) # last resort: VOTABLE/DEFINITIONS/PARAM # NOT SUPPORTED BY astropy; parser has been configured to # raise W22 as exception instead. # assume it's okay return ("OK", "Successful Response") def _findstatusinfo(self, infos): # this can be overridden to specialize for a particular DAL protocol for info in infos: if info.name == "Error": return info def getrecord(self, index): """ return a representation of a conesearch result record that follows dictionary semantics. The keys of the dictionary are those returned by this instance's fieldnames attribute. The returned record has the following additional properties: id, ra, dec Parameters ---------- index : int the integer index of the desired record where 0 returns the first record Returns ------- SCSRecord a dictionary-like wrapper containing the result record metadata. Raises ------ IndexError if index is negative or equal or larger than the number of rows in the result table. See Also -------- Record """ return SCSRecord(self, index, session=self._session) class SCSRecord(DatalinkRecordMixin, Record): """ a dictionary-like container for data in a record from the results of an Cone Search (SCS) query, describing a matching source or observation. The commonly accessed metadata which are stadardized by the SCS protocol are available as attributes. All metadata, particularly non-standard metadata, are acessible via the ``get(`` *key* ``)`` function (or the [*key*] operator) where *key* is table column name. """ @property def pos(self): """ the position of the object or observation described by this record. """ return SkyCoord( ra=self.getbyucd("POS_EQ_RA_MAIN"), dec=self.getbyucd("POS_EQ_DEC_MAIN"), unit="deg", frame="icrs") @property def id(self): """ return the identifying name of the object or observation described by this record. """ return self.getbyucd("ID_MAIN") pyvo-1.2.1/pyvo/dal/sia.py000066400000000000000000001004061416757633600154160ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ A module for searching for images in a remote archive. A Simple Image Access (SIA) service allows a client to search for images in an archive whose field of view overlaps with a given rectangular region on the sky. The service responds to a search query with a table in which each row represents an image that is available for download. The columns provide metadata describing each image and one column in particular provides the image's download URL (also called the *access reference*, or *acref*). Some SIA services act as a cut-out service; in this case, the query result is a table of images whose field of view matches the requested region and which will be created when accessed via the download URL. This module provides an interface for accessing an SIA service. It is implemented as a specialization of the DAL Query interface. The ``search()`` function support the simplest and most common types of queries, returning an SIAResults instance as its results which represents the matching images from the archive. The SIAResults supports access to and iterations over the individual records; these are provided as SIARecord instances, which give easy access to key metadata in the response, such as the position of the image's center, the image format, the size and shape of the image, and its download URL. The ``SIAService`` class can represent a specific service available at a URL endpoint. """ import re from pyvo.io.vosi.vodataservice import TableParam from astropy.coordinates import SkyCoord from astropy.time import Time from astropy.units import Quantity, Unit from .query import DALResults, DALQuery, DALService, Record from .mimetype import mime2extension from .adhoc import DatalinkResultsMixin, DatalinkRecordMixin, SodaRecordMixin from .. import samp __all__ = ["search", "SIAService", "SIAQuery", "SIAResults", "SIARecord"] def search( url, pos, size=1.0, format='all', intersect="overlaps", verbosity=2, **keywords): """ submit a simple SIA query that requests images overlapping a given region Parameters ---------- url : str the base URL for the SIA service pos : `~astropy.coordinates.SkyCoord` class or sequence of two floats the position of the center of the rectangular search region. assuming icrs decimal degrees if unit is not specified. size : `~astropy.units.Quantity` class or up to 2 floats. the full rectangular size of the search region along the RA and Dec directions. converted if it's a iterable containing scalars, assuming decimal degrees. format : str the image format(s) of interest. "all" (default) indicates all available formats; "graphic" indicates graphical images (e.g. jpeg, png, gif; not FITS); "metadata" indicates that no images should be returned--only an empty table with complete metadata; "image/\\*" indicates a particular image format where * can have values like "fits", "jpeg", "png", etc. intersect : str a token indicating how the returned images should intersect with the search region; recognized values include: ========= ====================================================== COVERS select images that completely cover the search region ENCLOSED select images that are complete enclosed by the region OVERLAPS select any image that overlaps with the search region CENTER select images whose center is within the search region ========= ====================================================== verbosity : int an integer value that indicates the volume of columns to return in the result table. 0 means the minimum set of columsn, 3 means as many columns as are available. **keywords : additional parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. Returns ------- SIAResults a container holding a table of matching image records Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError if the service responds with an error, including a query syntax error. See Also -------- SIAResults pyvo.dal.query.DALServiceError pyvo.dal.query.DALQueryError """ service = SIAService(url) return service.search(pos, size, format, intersect, verbosity, **keywords) class SIAService(DALService): """ a representation of an SIA service """ def __init__(self, baseurl, session=None): """ instantiate an SIA service Parameters ---------- baseurl : str the base URL for submitting search queries to the service. session : object optional session to use for network requests """ super().__init__(baseurl, session=session) def _get_metadata(self): """ the metadata resource element """ if not hasattr(self, "_metadata"): query = self.create_query(format='metadata') metadata = query.execute_votable() setattr(self, "_metadata", metadata) try: setattr(self, "_metadata_resource", metadata.resources[0]) except IndexError: setattr(self, "_metadata_resource", None) @property def description(self): """ the service description. """ self._get_metadata() try: return getattr(self, "_metadata", None).description except AttributeError: return None @property def params(self): """ the service parameters. """ self._get_metadata() try: return getattr(self, "_metadata_resource", None).params except AttributeError: return None @property def columns(self): """ the available columns on this service """ self._get_metadata() fields = getattr(self, '_metadata', None).get_first_table().fields try: return [ TableParam.from_field(field) for field in fields] except AttributeError: return [] def search( self, pos, size=1.0, format='all', intersect="overlaps", verbosity=2, **keywords): """ submit a SIA query to this service with the given parameters. Parameters ---------- pos : `~astropy.coordinates.SkyCoord` class or sequence of two floats the position of the center of the rectangular search region. assuming icrs decimal degrees if unit is not specified. size : `~astropy.units.Quantity` class or up to 2 floats. the full rectangular size of the search region along the RA and Dec directions. converted if it's a iterable containing scalars, assuming decimal degrees. size : `~astropy.units.Quantity` class or scalar float the size of the rectangular region around pos. assuming icrs decimal degrees if unit is not specified. format : str the image format(s) of interest. "all" (default) indicates all available formats; "graphic" indicates graphical images (e.g. jpeg, png, gif; not FITS); "metadata" indicates that no images should be returned--only an empty table with complete metadata; "image/\\*" indicates a particular image format where * can have values like "fits", "jpeg", "png", etc. intersect : str a token indicating how the returned images should intersect with the search region; recognized values include: ========= ====================================================== COVERS select images that completely cover the search region ENCLOSED select images that are complete enclosed by the region OVERLAPS select any image that overlaps with the search region CENTER select images whose center is within the search region ========= ====================================================== verbosity : int an integer value that indicates the volume of columns to return in the result table. 0 means the minimum set of columns, 3 means as many columns as are available. **keywords : additional parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. Returns ------- SIAResults a container holding a table of matching catalog records Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError if the service responds with an error, including a query syntax error. See Also -------- SIAResults pyvo.dal.query.DALServiceError pyvo.dal.query.DALQueryError """ return self.create_query( pos, size, format, intersect, verbosity, **keywords).execute() def create_query( self, pos=None, size=None, format=None, intersect=None, verbosity=None, **keywords): """ create a query object that constraints can be added to and then executed. The input arguments will initialize the query with the given values. Parameters ---------- pos : `~astropy.coordinates.SkyCoord` class or sequence of two floats the position of the center of the rectangular search region. assuming icrs decimal degrees if unit is not specified. size : `~astropy.units.Quantity` class or up to 2 floats. the full rectangular size of the search region along the RA and Dec directions. converted if it's a iterable containing scalars, assuming decimal degrees. size : `~astropy.units.Quantity` class or scalar float the size of the rectangular region around pos. assuming icrs decimal degrees if unit is not specified. format : str the image format(s) of interest. "all" (default) indicates all available formats; "graphic" indicates graphical images (e.g. jpeg, png, gif; not FITS); "metadata" indicates that no images should be returned--only an empty table with complete metadata; "image/\\*" indicates a particular image format where * can have values like "fits", "jpeg", "png", etc. intersect : str a token indicating how the returned images should intersect with the search region; recognized values include: ========= ====================================================== COVERS select images that completely cover the search region ENCLOSED select images that are complete enclosed by the region OVERLAPS select any image that overlaps with the search region CENTER select images whose center is within the search region ========= ====================================================== verbosity : int an integer value that indicates the volume of columns to return in the result table. 0 means the minimum set of columsn, 3 means as many columns as are available. **keywords : additional parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. Returns ------- SIAQuery the query instance See Also -------- SIAQuery """ return SIAQuery( self.baseurl, pos, size, format, intersect, verbosity, self._session, **keywords) def describe(self): print(self.description) print() class SIAQuery(DALQuery): """ a class for preparing an query to an SIA service. Query constraints are added via its service type-specific methods. The various execute() functions will submit the query and return the results. The base URL for the query, which controls where the query will be sent when one of the execute functions is called, is typically set at construction time; however, it can be updated later via the :py:attr:`~pyvo.dal.query.DALQuery.baseurl` to send a configured query to another service. In addition to the search constraint attributes described below, search parameters can be set generically by name via dict semantics. The typical function for submitting the query is ``execute()``; however, alternate execute functions provide the response in different forms, allowing the caller to take greater control of the result processing. """ def __init__( self, baseurl, pos=None, size=None, format=None, intersect=None, verbosity=None, session=None, **keywords): """ initialize the query object with a baseurl and the given parameters Parameters ---------- baseurl : str the base URL for the SIA service pos : `~astropy.coordinates.SkyCoord` class or sequence of two floats the position of the center of the rectangular search region. assuming icrs decimal degrees if unit is not specified. size : `~astropy.units.Quantity` class or up to 2 floats. the full rectangular size of the search region along the RA and Dec directions. converted if it's a iterable containing scalars, assuming decimal degrees. size : `~astropy.units.Quantity` class or scalar float the size of the rectangular region around pos. assuming icrs decimal degrees if unit is not specified. format : str the image format(s) of interest. "all" (default) indicates all available formats; "graphic" indicates graphical images (e.g. jpeg, png, gif; not FITS); "metadata" indicates that no images should be returned--only an empty table with complete metadata; "image/\\*" indicates a particular image format where * can have values like "fits", "jpeg", "png", etc. intersect : str a token indicating how the returned images should intersect with the search region; recognized values include: ========= ====================================================== COVERS select images that completely cover the search region ENCLOSED select images that are complete enclosed by the region OVERLAPS select any image that overlaps with the search region CENTER select images whose center is within the search region ========= ====================================================== verbosity : int an integer value that indicates the volume of columns to return in the result table. 0 means the minimum set of columsn, 3 means as many columns as are available. session : object optional session to use for network requests **keywords : additional parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. """ super().__init__(baseurl, session=session, **keywords) if pos: self.pos = pos if size is not None: self.size = size if format: self.format = format if intersect: self.intersect = intersect if verbosity: self.verbosity = verbosity @property def pos(self): """ the position of the center of the rectangular search region as a `~astropy.coordinates.SkyCoord` instance. """ return getattr(self, "_pos", None) @pos.setter def pos(self, pos): setattr(self, "_pos", pos) if not isinstance(pos, SkyCoord): try: ra, dec = pos except (TypeError, ValueError): raise ValueError( 'Pos must be a sequence with exactly two values, ' 'expressing ra and dec in icrs degrees' ) # assume degrees pos = SkyCoord(ra=ra, dec=dec, unit="deg", frame="icrs") self["POS"] = "{ra},{dec}".format( ra=pos.icrs.ra.deg, dec=pos.icrs.dec.deg) @pos.deleter def pos(self): delattr(self, "_pos") del self["POS"] @property def size(self): """ the size of the rectangular region around pos as a `~astropy.units.Quantity` instance. """ return getattr(self, "_size", None) @size.setter def size(self, size): setattr(self, "_size", size) if not isinstance(size, Quantity): valerr = ValueError( 'Size must be either a single value or a sequence with two' 'values, expressing degrees' ) try: # assume degrees size = size * Unit("deg") except ValueError: raise valerr try: if len(size) > 2: raise valerr except TypeError: pass # len 1 try: self["SIZE"] = ",".join( str(deg) for deg in size.to(Unit("deg")).value) except TypeError: self["SIZE"] = str(size.to(Unit("deg")).value) @size.deleter def size(self): delattr(self, "_size") del self["SIZE"] @property def format(self): """ the image format(s) of interest. "all" (default) indicates all available formats; "graphic" indicates graphical images (e.g. jpeg, png, gif; not FITS); "metadata" indicates that no images should be returned--only an empty table with complete metadata; "image/\\*" indicates a particular image format where * can have values like "fits", "jpeg", "png", etc. """ return getattr(self, "_format", None) @format.setter def format(self, format_): setattr(self, "_format", format_) if type(format_) in (str, bytes): format_ = [format_] self["FORMAT"] = ",".join(_.upper() for _ in format_) @format.deleter def format(self): delattr(self, "_format") del self["FORMAT"] @property def intersect(self): """ a token indicating how the returned images should intersect with the search region; recognized values include: ========= ====================================================== COVERS select images that completely cover the search region ENCLOSED select images that are complete enclosed by the region OVERLAPS select any image that overlaps with the search region CENTER select images whose center is within the search region ========= ====================================================== """ return getattr(self, "_intersect", None) @intersect.setter def intersect(self, intersect): setattr(self, "_intersect", intersect) self["INTERSECT"] = intersect.upper() @intersect.deleter def intersect(self): delattr(self, "_intersect") del self["INTERSECT"] @property def verbosity(self): """ an integer value that indicates the volume of columns to return in the result table. 0 means the minimum set of columsn, 3 means as many columns as are available. """ return getattr(self, "_verbosity", None) @verbosity.setter def verbosity(self, verbosity): setattr(self, "_verbosity", verbosity) self["VERB"] = verbosity @verbosity.deleter def verbosity(self): delattr(self, "_verbosity") del self["VERB"] def execute(self): """ submit the query and return the results as a SIAResults instance Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError for errors either in the input query syntax or other user errors detected by the service DALFormatError for errors parsing the VOTable response """ return SIAResults(self.execute_votable(), url=self.queryurl, session=self._session) class SIAResults(DatalinkResultsMixin, DALResults): """ The list of matching images resulting from an image (SIA) query. Each record contains a set of metadata that describes an available image matching the query constraints. The number of records in the results is available via the :py:attr:`nrecs` attribute or by passing it to the Python built-in ``len()`` function. This class supports iterable semantics; thus, individual records (in the form of :py:class:`~pyvo.dal.sia.SIARecord` instances) are typically accessed by iterating over an ``SIAResults`` instance. >>> results = pyvo.imagesearch(url, pos=[12.24, -13.1], size=0.1) >>> for image in results: ... print("{0}: {1}".format(image.title, title.getdataurl())) Alternatively, records can be accessed randomly via :py:meth:`getrecord` or through a Python Database API (v2) Cursor (via :py:meth:`~pyvo.dal.query.DALResults.cursor`). Column-based data access is possible via the :py:meth:`~pyvo.dal.query.DALResults.getcolumn` method. ``SIAResults`` is essentially a wrapper around an Astropy :py:mod:`~astropy.io.votable` :py:class:`~astropy.io.votable.tree.Table` instance where the columns contain the various metadata describing the images. One can access that VOTable directly via the :py:attr:`~pyvo.dal.query.DALResults.votable` attribute. Thus, when one retrieves a whole column via :py:meth:`~pyvo.dal.query.DALResults.getcolumn`, the result is a Numpy array. Alternatively, one can manipulate the results as an Astropy :py:class:`~astropy.table.table.Table` via the following conversion: >>> table = results.votable.to_table() ``SIAResults`` supports the array item operator ``[...]`` in a read-only context. When the argument is numerical, the result is an :py:class:`~pyvo.dal.sia.SIARecord` instance, representing the record at the position given by the numerical index. If the argument is a string, it is interpreted as the name of a column, and the data from the column matching that name is returned as a Numpy array. """ def getrecord(self, index): """ return a representation of a sia result record that follows dictionary semantics. The keys of the dictionary are those returned by this instance's fieldnames attribute. The returned record has additional image-specific properties Parameters ---------- index : int the integer index of the desired record where 0 returns the first record Returns ------- SIARecord a dictionary-like wrapper containing the result record metadata. Raises ------ IndexError if index is negative or equal or larger than the number of rows in the result table. See Also -------- Record """ return SIARecord(self, index, session=self._session) class SIARecord(SodaRecordMixin, DatalinkRecordMixin, Record): """ a dictionary-like container for data in a record from the results of an image (SIA) search, describing an available image. The commonly accessed metadata which are stadardized by the SIA protocol are available as attributes. If the metadatum accessible via an attribute is not available, the value of that attribute will be None. All metadata, including non-standard metadata, are acessible via the ``get(`` *key* ``)`` function (or the [*key*] operator) where *key* is table column name. """ def getdataformat(self): """ return the mimetype of the dataset described by this record. """ return self.getbyucd("VOX:Image_Format", decode=True) @property def pos(self): """ the position of the object or observation described by this record. """ return SkyCoord( ra=self.getbyucd("POS_EQ_RA_MAIN"), dec=self.getbyucd("POS_EQ_DEC_MAIN"), unit="deg", frame="icrs") # Image Metadata @property def title(self): """ the title of the image """ return self.getbyucd("VOX:Image_Title", decode=True) @property def instr(self): """ the name of the instrument (or instruments) that produced the data that went into this image. """ return self.getbyucd("INST_ID", decode=True) @property def dateobs(self): """ the modified Julien date (MJD) of the mid-point of the observational data that went into the image, as an astropy.time.Time instance """ dateobs = self.getbyucd("VOX:Image_MJDateObs") if dateobs: return Time(dateobs, format="mjd") else: return None @property def naxes(self): """ the number of axes in this image. """ return self.getbyucd("VOX:Image_Naxes") @property def naxis(self): """ the lengths of the sides along each axis, in pix, as a astropy Quantity pix """ return self.getbyucd("VOX:Image_Naxis") * Unit("pix") @property def scale(self): """ the scale of the pixels in each image axis, in degrees/pixel, as a astropy Quantity deg / pix """ return self.getbyucd("VOX:Image_Scale") * (Unit("deg") / Unit("pix")) @property def format(self): """ the format of the image """ return self.getbyucd("VOX:Image_Format", decode=True) # Coordinate System Metadata @property def coord_frame(self): """ the coordinate system reference frame, one of the following: "ICRS", "FK5", "FK4", "ECL", "GAL", and "SGAL". """ return self.getbyucd("VOX:STC_CoordRefFrame", decode=True) @property def coord_equinox(self): """ the equinox of the used coordinate system """ return self.getbyucd("VOX:STC_CoordEquinox") @property def coord_projection(self): """ the celestial projection (TAN / ARC / SIN / etc.) """ return self.getbyucd("VOX:WCS_CoordProjection", decode=True) @property def coord_refpixel(self): """ the image pixel coordinates of the WCS reference pixel """ return self.getbyucd("VOX:WCS_CoordRefPixel") @property def coord_refvalue(self): """ the world coordinates of the WCS reference pixel. """ return self.getbyucd("VOX:WCS_CoordRefValue") @property def cdmatrix(self): """ the WCS CD matrix defining the scale and rotation (among other things) of the image. ordered as CD[i,j] = [0,0], [0,1], [1,0], [1,1]. """ return self.getbyucd("VOX:WCS_CDMatrix").reshape((2, 2)) # Spectral Bandpass Metadata @property def bandpass_id(self): """ the bandpass by name (e.g., "V", "SDSS_U", "K", "K-Band", etc.) """ return self.getbyucd("VOX:BandPass_ID", decode=True) @property def bandpass_unit(self): """ the astropy unit used to represent spectral values. """ sia = self.getbyucd("VOX:BandPass_Unit", decode=True) if sia: return Unit(sia) else: # dimensionless return Unit("") @property def bandpass_refvalue(self): """ the characteristic (reference) wavelength, frequency or energy for the bandpass model, as an astropy Quantity of bandpass_unit """ return Quantity( self.getbyucd("VOX:BandPass_RefValue"), self.bandpass_unit) @property def bandpass_hilimit(self): """ the upper limit of the bandpass as astropy Quantity in bandpass_unit """ return Quantity( self.getbyucd("VOX:BandPass_HiLimit"), self.bandpass_unit) @property def bandpass_lolimit(self): """ the lower limit of the bandpass as astropy Quantity in bandpass_unit """ return Quantity( self.getbyucd("VOX:BandPass_LoLimit"), self.bandpass_unit) # Processig Metadata @property def pixflags(self): """ the type of processing done by the image service to produce an output image pixel a string of one or more of the following values: * C -- The image pixels were copied from a source image without change, as when an atlas image or cutout is returned. * F -- The image pixels were computed by resampling an existing image, e.g., to rescale or reproject the data, and were filtered by an interpolator. * X -- The image pixels were computed by the service directly from a primary data set hence were not filtered by an interpolator. * Z -- The image pixels contain valid flux (intensity) values, e.g., if the pixels were resampled with a flux-preserving interpolator. * V -- The image pixels contain some unspecified visualization of the data, hence are suitable for display but not for numerical analysis. """ return self.getbyucd("VOX:Image_PixFlags", decode=True) # Access Metadata @property def acref(self): """ the URL that can be used to retrieve the image """ return self.getbyucd("VOX:Image_AccessReference", decode=True) @property def acref_ttl(self): """ the minimum time to live in seconds of the access reference """ return self.getbyucd("VOX:Image_AccessRefTTL") @property def filesize(self): """ the (estimated) size of the image in bytes """ return self.getbyucd("VOX:Image_FileSize") def getdataurl(self): """ return the URL contained in the access URL column which can be used to retrieve the dataset described by this record. None is returned if no such column exists. """ dataurl = super().getdataurl() if dataurl is None: return self.acref else: return dataurl def suggest_dataset_basename(self): """ return a default base filename that the dataset available via ``getdataset()`` can be saved as. This function is specialized for a particular service type this record originates from so that it can be used by ``cachedataset()`` via ``make_dataset_filename()``. """ out = self.title if type(out) == bytes: out = out.decode('utf-8') if not out: out = "image" else: out = re.sub(r'\s+', '_', out.strip()) return out def suggest_extension(self, default=None): """ returns a recommended filename extension for the dataset described by this record. Typically, this would look at the column describing the format and choose an extension accordingly. """ return mime2extension(self.format, default) def broadcast_samp(self, client_name=None): """ Broadcast the image to ``client_name`` via SAMP """ with samp.connection() as conn: samp.send_image_to( conn, self.getdataurl(), client_name, name=self.suggest_dataset_basename()) pyvo-1.2.1/pyvo/dal/sia2.py000066400000000000000000001133541416757633600155060ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ A module for searching for images in a remote archive. A Simple Image Access (SIA) service allows a client to search for images based on a number of criteria/parameters. The results are represented in `pyvo.dam.obscore.ObsCoreMetadata` format. The ``SIAService`` class can represent a specific service available at a URL endpoint. """ from astropy import units as u from astropy import time from .query import DALResults, DALQuery, DALService, Record from .adhoc import DatalinkResultsMixin, AxisParamMixin, SodaRecordMixin,\ DatalinkRecordMixin from .params import IntervalQueryParam, StrQueryParam, EnumQueryParam from .vosi import AvailabilityMixin, CapabilityMixin from ..dam import ObsCoreMetadata, CALIBRATION_LEVELS __all__ = ["search", "SIAService", "SIAQuery", "SIAResults", "ObsCoreRecord"] SIA2_STANDARD_ID = 'ivo://ivoa.net/std/SIA#query-2.0' SIA_PARAMETERS_DESC = """ pos : single or list of tuples angle units (default: deg) the positional region(s) to be searched for data. Each region can be expressed as a tuple representing a CIRCLE, RANGE or POLYGON as follows: (ra, dec, radius) - for CIRCLE. (angle units - defaults to) (long1, long2, lat1, lat2) - for RANGE (angle units required) (ra, dec, ra, dec, ra, dec ... ) ra/dec points for POLYGON all in angle units band : scalar, tuple(interval) or list of tuples (spectral units (default: meter) the energy interval(s) to be searched for data. time : single or list of `~astropy.time.Time` or compatible strings the time interval(s) to be searched for data. pol : single or list of str from `pyvo.dam.obscore.POLARIZATION_STATES` the polarization state(s) to be searched for data. field_of_view : single or list of tuples angle units (default arcsec) the range(s) of field of view (size) to be searched for data spatial_resolution : single or list of tuples angle units required the range(s) of spatial resolution to be searched for data spectral_resolving_power : single or list of tuples the range(s) of spectral resolving power to be searched for data exptime : single or list of tuples time units (default: second) the range(s) of exposure times to be searched for data timeres : single of list of tuples time units (default: second) the range(s) of temporal resolution to be searched for data publisher_did : single or list of str specifies the unique identifier of dataset(s). It is global because it must include information regarding the publisher (obs_publisher_did in ObsCore) collection : single or list of str name of the collection that the data belongs to facility : single or list of str specifies the name of the facility (usually telescope) where the data was acquired. instrument : single or list of str specifies the name of the instrument with which the data was acquired. data_type : 'image'|'cube' specifies the type of the data calib_level : single or list from enum `pyvo.dam.obscore.CALIBRATION_LEVELS` specifies the calibration level of the data. Can be a single value or a list of values target_name : single or list of str specifies the name of the target (e.g. the intention of the original science program or observation) res_format : single or list of strings specifies response format(s). max_records : int allows the client to limit the number or records in the response **kwargs : custom query parameters single or a list of values (or tuples for intervals) custom query parameters that a specific service accepts. The values of the parameters need to follow the SIAv2 format and represent the appropriate quantities (where applicable). """ def search(url, pos=None, band=None, time=None, pol=None, field_of_view=None, spatial_resolution=None, spectral_resolving_power=None, exptime=None, timeres=None, publisher_did=None, facility=None, collection=None, instrument=None, data_type=None, calib_level=None, target_name=None, res_format=None, maxrec=None, session=None, **kwargs): """ submit a simple SIA query to a SIAv2 compatible service Parameters ---------- url : str url of the SIA service (base or endpoint) _SIA2_PARAMETERS """ service = SIAService(url) return service.search(pos=pos, band=band, time=time, pol=pol, field_of_view=field_of_view, spatial_resolution=spatial_resolution, spectral_resolving_power=spectral_resolving_power, exptime=exptime, timeres=timeres, publisher_did=publisher_did, facility=facility, collection=collection, instrument=instrument, data_type=data_type, calib_level=calib_level, target_name=target_name, res_format=res_format, maxrec=maxrec, session=session, **kwargs) search.__doc__ = search.__doc__.replace('_SIA2_PARAMETERS', SIA_PARAMETERS_DESC) def _tolist(value): # return value as a list - is there something in Python to do that? if not value: return [] if isinstance(value, list): return value return [value] class SIAService(DALService, AvailabilityMixin, CapabilityMixin): """ a representation of an SIA2 service """ def __init__(self, baseurl, session=None): """ instantiate an SIA service Parameters ---------- url : str url - URL of the SIA service (base or query endpoint) session : object optional session to use for network requests """ super().__init__(baseurl, session=session) # Check if the session has an update_from_capabilities attribute. # This means that the session is aware of IVOA capabilities, # and can use this information in processing network requests. # One such usecase for this is auth. if hasattr(self._session, 'update_from_capabilities'): self._session.update_from_capabilities(self.capabilities) self.query_ep = None # service query end point for cap in self.capabilities: # assumes that the access URL is the same regardless of the # authentication method except BasicAA which is not supported # in pyvo. So pick any access url as long as it's not if cap.standardid.lower() == SIA2_STANDARD_ID.lower(): for interface in cap.interfaces: if interface.accessurls and \ not (len(interface.securitymethods) == 1 and interface.securitymethods[0].standardid == 'ivo://ivoa.net/sso#BasicAA'): self.query_ep = interface.accessurls[0].content break if not self.query_ep: raise AttributeError('No valid end point found') def search(self, pos=None, band=None, time=None, pol=None, field_of_view=None, spatial_resolution=None, spectral_resolving_power=None, exptime=None, timeres=None, publisher_did=None, facility=None, collection=None, instrument=None, data_type=None, calib_level=None, target_name=None, res_format=None, maxrec=None, session=None, **kwargs): """ Performs a SIAv2 search against a SIAv2 service See Also -------- pyvo.dal.sia2.SIAQuery """ return SIAQuery(self.query_ep, pos=pos, band=band, time=time, pol=pol, field_of_view=field_of_view, spatial_resolution=spatial_resolution, spectral_resolving_power=spectral_resolving_power, exptime=exptime, timeres=timeres, publisher_did=publisher_did, facility=facility, collection=collection, instrument=instrument, data_type=data_type, calib_level=calib_level, target_name=target_name, res_format=res_format, maxrec=maxrec, session=session, **kwargs).execute() class SIAQuery(DALQuery, AxisParamMixin): """ a class very similar to :py:attr:`~pyvo.dal.query.SIAQuery` class but used to interact with SIAv2 services. """ def __init__(self, url, pos=None, band=None, time=None, pol=None, field_of_view=None, spatial_resolution=None, spectral_resolving_power=None, exptime=None, timeres=None, publisher_did=None, facility=None, collection=None, instrument=None, data_type=None, calib_level=None, target_name=None, res_format=None, maxrec=None, session=None, **kwargs): """ initialize the query object with a url and the given parameters Note: The majority of the attributes represent constraints used to query the SIA service and are represented through lists. Multiple value attributes are OR-ed in the query, however the values of different attributes are AND-ed. Intervals are represented with tuples and open-ended intervals should be expressed with float("-inf") or float("inf"). Eg. For all values less than or equal to 600 use (float(-inf), 600) Additional attribute constraints can be specified (or removed) after this object has been created using the *.add and *_del methods. Parameters ---------- url : url where to send the query request to _SIA2_PARAMETERS session : object optional session to use for network requests Returns ------- SIAResults a container holding a table of matching image records. Records are represented in IVOA ObsCore format Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError if the service responds with an error, including a query syntax error. See Also -------- SIAResults pyvo.dal.query.DALServiceError pyvo.dal.query.DALQueryError """ super().__init__(url, session=session) for pp in _tolist(pos): self.pos.add(pp) for bb in _tolist(band): self.band.add(bb) for tt in _tolist(time): self.time.add(tt) for pp in _tolist(pol): self.pol.add(pp) for ff in _tolist(field_of_view): self.field_of_view.add(ff) for sp in _tolist(spatial_resolution): self.spatial_resolution.add(sp) for sr in _tolist(spectral_resolving_power): self.spectral_resolving_power.add(sr) for et in _tolist(exptime): self.exptime.add(et) for tr in _tolist(timeres): self.timeres.add(tr) for ii in _tolist(publisher_did): self.publisher_did.add(ii) for ff in _tolist(facility): self.facility.add(ff) for col in _tolist(collection): self.collection.add(col) for inst in _tolist(instrument): self.instrument.add(inst) for dt in _tolist(data_type): self.data_type.add(dt) for cal in _tolist(calib_level): self.calib_level.add(cal) for tt in _tolist(target_name): self.target_name.add(tt) for rf in _tolist(res_format): self.res_format.add(rf) for name, value in kwargs.items(): custom_arg = [] for kw in _tolist(value): if isinstance(kw, tuple): val = '{} {}'.format(kw[0], kw[1]) else: val = str(kw) custom_arg.append(val) self[name] = custom_arg self.maxrec = maxrec __init__.__doc__ = \ __init__.__doc__.replace('_SIA2_PARAMETERS', SIA_PARAMETERS_DESC) @property def field_of_view(self): if not hasattr(self, '_fov'): self._fov = IntervalQueryParam(u.deg) self['FOV'] = self._fov.dal return self._fov @property def spatial_resolution(self): if not hasattr(self, '_spatres'): self._spatres = IntervalQueryParam(u.arcsec) self['SPATRES'] = self._spatres.dal return self._spatres @property def spectral_resolving_power(self): if not hasattr(self, '_specrp'): self._specrp = IntervalQueryParam() self['SPECRP'] = self._specrp.dal return self._specrp @property def exptime(self): if not hasattr(self, '_exptime'): self._exptime = IntervalQueryParam(u.second) self['EXPTIME'] = self._exptime.dal return self._exptime @property def timeres(self): if not hasattr(self, '_timeres'): self._timeres = IntervalQueryParam(u.second) self['TIMERES'] = self._timeres.dal return self._timeres @property def publisher_did(self): if not hasattr(self, '_publisher_did'): self._publisher_did = StrQueryParam() self['ID'] = self._publisher_did.dal return self._publisher_did @property def facility(self): if not hasattr(self, '_facility'): self._facility = StrQueryParam() self['FACILITY'] = self._facility.dal return self._facility @property def collection(self): if not hasattr(self, '_collection'): self._collection = StrQueryParam() self['COLLECTION'] = self._collection.dal return self._collection @property def instrument(self): if not hasattr(self, '_instrument'): self._instrument = StrQueryParam() self['INSTRUMENT'] = self._instrument.dal return self._instrument @property def data_type(self): if not hasattr(self, '_data_type'): self._data_type = StrQueryParam() self['DPTYPE'] = self._data_type.dal return self._data_type @property def calib_level(self): if not hasattr(self, '_cal'): self._cal = EnumQueryParam(CALIBRATION_LEVELS) self['CALIB'] = self._cal.dal return self._cal @property def target_name(self): if not hasattr(self, '_target'): self._target_name = StrQueryParam() self['TARGET'] = self._target_name.dal return self._target_name @property def res_format(self): if not hasattr(self, '_res_format'): self._res_format = StrQueryParam() self['FORMAT'] = self._res_format.dal return self._res_format @property def maxrec(self): return self._maxrec @maxrec.setter def maxrec(self, val): if not val: return if not isinstance(val, int) and val > 0: raise ValueError('maxrec {} must be positive int'.format(val)) self._maxrec = val self['MAXREC'] = str(val) def execute(self): """ submit the query and return the results as a SIAResults instance Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError for errors either in the input query syntax or other user errors detected by the service DALFormatError for errors parsing the VOTable response """ return SIAResults(self.execute_votable(), url=self.queryurl, session=self._session) class SIAResults(DatalinkResultsMixin, DALResults): """ The list of matching images resulting from an image (SIA) query. Each record contains a set of metadata that describes an available image matching the query constraints. The number of records in the results is available via the :py:attr:`nrecs` attribute or by passing it to the Python built-in ``len()`` function. This class supports iterable semantics; thus, individual records (in the form of :py:class:`~pyvo.dal.sia2.ObsCoreRecord` instances) are typically accessed by iterating over an ``SIAResults`` instance. >>> results = pyvo.imagesearch(url, pos=[12.24, -13.1], size=0.1) >>> for image in results: ... print("{0}: {1}".format(image.title, title.getdataurl())) Alternatively, records can be accessed randomly via :py:meth:`getrecord` or through a Python Database API (v2) Cursor (via :py:meth:`~pyvo.dal.query.DALResults.cursor`). Column-based data access is possible via the :py:meth:`~pyvo.dal.query.DALResults.getcolumn` method. ``SIAResults`` is essentially a wrapper around an Astropy :py:mod:`~astropy.io.votable` :py:class:`~astropy.io.votable.tree.Table` instance where the columns contain the various metadata describing the images. One can access that VOTable directly via the :py:attr:`~pyvo.dal.query.DALResults.votable` attribute. Thus, when one retrieves a whole column via :py:meth:`~pyvo.dal.query.DALResults.getcolumn`, the result is a Numpy array. Alternatively, one can manipulate the results as an Astropy :py:class:`~astropy.table.table.Table` via the following conversion: >>> table = results.votable.to_table() ``SIAResults`` supports the array item operator ``[...]`` in a read-only context. When the argument is numerical, the result is an :py:class:`~pyvo.dal.sia2.ObsCoreRecord` instance, representing the record at the position given by the numerical index. If the argument is a string, it is interpreted as the name of a column, and the data from the column matching that name is returned as a Numpy array. """ def getrecord(self, index): """ return a representation of a sia result record that follows dictionary semantics. The keys of the dictionary are those returned by this instance's fieldnames attribute. The returned record has additional image-specific properties Parameters ---------- index : int the integer index of the desired record where 0 returns the first record Returns ------- ObsCoreMetadataRecord a dictionary-like wrapper containing the result record metadata. Raises ------ IndexError if index is negative or equal or larger than the number of rows in the result table. See Also -------- Record """ return ObsCoreRecord(self, index, session=self._session) class ObsCoreRecord(SodaRecordMixin, DatalinkRecordMixin, Record, ObsCoreMetadata): """ a dictionary-like container for data in a record from the results of an image (SIAv2) search, describing an available image in ObsCore format. The commonly accessed metadata which are stadardized by the SIA protocol are available as attributes. If the metadatum accessible via an attribute is not available, the value of that attribute will be None. All metadata, including non-standard metadata, are also acessible via the ``get(`` *key* ``)`` function (or the [*key*] operator) where *key* is table column name. """ # OBSERVATION INFO @property def dataproduct_type(self): """ Data product (file content) primary type. This is coded as a string that conveys a general idea of the content and organization of a dataset. """ return self.get('dataproduct_type', decode=True) @property def dataproduct_subtype(self): """ Data product more specific type """ return self.get('dataproduct_subtype', decode=True, default=None) @property def calib_level(self): """ Calibration level of the observation: in {0, 1, 2, 3, 4} """ return self.get('calib_level') # TARGET INFO @property def target_name(self): """ The target_name attribute contains the name of the target of the observation, if any. This is typically the name of an astronomical object, but could be the name of a survey field. The target name is most useful for output, to identify the target of an observation to the user. In queries it is generally better to refer to astronomical objects by position, using a name resolver to convert the target name into a coordinate (when possible). """ return self.get('target_name', decode=True) @property def target_class(self): """ This field indicates the type of object that was pointed for this observation. It is a string with possible values defined in a special vocabulary set to be defined: list of object classes (or types) used by the SIMBAD database, NED or defined in another IVOA vocabulary. """ return self.get('target_class', decode=True, default=None) # DATA DESCRIPTION @property def obs_id(self): """ Collection specific internal ID given by the ObsTAP service """ return self.get('obs_id', decode=True) @property def obs_title(self): """ Brief description of dataset in free format """ return self.get('obs_title', decode=True, default=None) @property def obs_collection(self): """ The name of the collection (DataID.Collection) identifies the data collection to which the data product belongs. A data collection can be any collection of datasets which are alike in some fashion. Typical data collections might be all the data from a particular telescope, instrument, or survey. The value is either the registered shortname for the data collection, the full registered IVOA identifier for the collection, or a data provider defined short name for the collection. Examples: HST/WFPC2, VLT/FORS2, CHANDRA/ACIS-S, etc. """ return self.get('obs_collection', decode=True) @property def obs_create_date(self): """ Date when the dataset was created """ cd = self.get('obs_create_date', default=None) return cd if not cd else time.Time(cd) @property def obs_creator_name(self): """ The name of the institution or entity which created the dataset. """ return self.get('obs_creator_name', decode=True, default=None) @property def obs_creator_did(self): """ IVOA dataset identifier given by its creator. """ return self.get('obs_creator_did', decode=True, default=None) # CURATION INFORMATION @property def obs_release_date(self): """ Observation release date """ rt = self.get('obs_release_date', default=None, decode=True) return rt if not rt else time.Time(rt) @property def obs_publisher_did(self): """ ID for the Dataset assigned by the publisher. Note that data from a source (creator_did) can be published by multiple publishers and have assigned multiple publisher data IDs. """ return self.get('obs_publisher_did', decode=True) @property def publisher_id(self): """ IVOA-ID for the Publisher. It will also be globally unique since each publisher has a unique registered publisher ID """ return self.get('publisher_id', decode=True, default=None) @property def bib_reference(self): """ URL or bibcode for documentation. This is a forward link to major publications which reference the dataset. """ return self.get('bib_reference', decode=True, default=None) @property def data_rights(self): """ This parameter allows mentioning the availability of a dataset. Possible values are: public, secure, or proprietary. """ return self.get('data_rights', decode=True, default=None) # ACCESS INFORMATION @property def access_url(self): """ The access_url column contains a URL that can be used to download the data product (as a file of some sort). Access URLs are not guaranteed to remain valid and unchanged indefinitely. To access a specific data product after a period of time (e.g., days or weeks) a query should be performed to obtain a fresh access URL. """ return self.get('access_url', decode=True) @property def access_format(self): """ Content format of the dataset. The value of access_format should be a MIME type, either a standard MIME type, an extended MIME type from the above table, or a new custom MIME type defined by the data provider. """ return self.get('access_format', decode=True) @property def access_estsize(self): """ The approximate size (in kilobytes) of the file available via the access_url. This is used only to gain some idea of the size of a data product before downloading it, hence only an approximate value is required. Provision of dataset size estimates is important whenever it is possible that datasets can be very large. """ return self.get('access_estsize')*1000*u.byte # SPATIAL CHARACTERISATION @property def s_ra(self): """ ICRS Right Ascension of the center of the observation """ return self.get('s_ra')*u.deg @property def s_dec(self): """ CRS Declination of the center of the observation """ return self.get('s_dec')*u.deg @property def s_fov(self): """ Approximate size of the covered region as the diameter of a containing circle. For most data products the value given should be large enough to include the entire area of the observation; coverage within the bounded region need not be complete, for example if the specified radius encompasses a rotated rectangular region. For observations which do not have a well-defined boundary, e.g. radio or high energy observations, a characteristic value should be given. The radius attribute provides a simple way to characterize and use (e.g. for discovery computations) the approximate spatial coverage of a data product. The spatial coverage of a data product can be more precisely specified using the region attribute. """ return self.get('s_fov')*u.deg @property def s_region(self): """ Sky region covered by the data product (expressed in ICRS frame). It can be used to precisely specify the covered spatial region of a data product. It is often an exact, or almost exact, representation of the illumination region of a given observation defined in a standard way by the concept of Support in the Characterisation data model. """ return self.get('s_region', decode=True) @property def s_resolution(self): """ Spatial resolution of data specifies a reference value chosen by the data provider for the estimated spatial resolution of the data product in arcseconds. This refers to the smallest spatial feature in the observed signal that can be resolved. In cases where the spatial resolution varies across the field the best spatial resolution (smallest resolvable spatial feature) should be specified. In cases where the spatial frequency sampling of an observation is complex (e.g., interferometry) a typical value for spatial resolution estimate should be given; additional characterisation may be necessary to fully specify the spatial characteristics of the data. """ return self.get('s_resolution')*u.arcsec @property def s_xel1(self): """ Number of elements along the first spatial axis """ return self.get('s_xel1') @property def s_xel2(self): """ Number of elements along the second spatial axis """ return self.get('s_xel2') @property def s_ucd(self): """ UCD for the nature of the spatial axis (pos or u,v data) """ return self.get('s_ucd', decode=True, default=None) @property def s_unit(self): """ Unit used for spatial axis """ return self.get('s_unit', decode=True, default=None) @property def s_resolution_min(self): """ Resolution min value on spatial axis (FHWM of PSF) """ rmin = self.get('s_resolution_min', default=None) return rmin if not rmin else rmin*u.arcsec @property def s_resolution_max(self): """ Resolution max value on spatial axis (FHWM of PSF) """ rmax = self.get('s_resolution_max', default=None) return rmax if not rmax else rmax * u.arcsec @property def s_calib_status(self): """ A string to encode the calibration status along the spatial axis (astrometry). Possible values could be {uncalibrated, raw, calibrated} """ return self.get('s_calib_status', decode=True, default=None) @property def s_stat_error(self): """ This parameter gives an estimate of the astrometric statistical error after the astrometric calibration phase. """ return self.get('s_stat_error', decode=True, default=None) @property def s_pixel_scale(self): """ This corresponds to the sampling precision of the data along the spatial axis. It is stored as a real number corresponding to the spatial sampling period, i.e., the distance in world coordinates system units between two pixel centers. It may contain two values if the pixels are rectangular. """ return self.get('s_pixel_scale', decode=True, default=None) # TIME CHARACTERISATION @property def t_xel(self): """ Number of elements along the time axis """ return self.get('t_xel') @property def t_ref_pos(self): """ Time Axis Reference Position as defined in STC REC, Section 4.4.1.1.1 """ return self.get('t_ref_pos', decode=True, default=None) @property def t_min(self): """ The start time of the observation specified in MJD. In case of data products result of the combination of multiple frames, min time must be the minimum of the start times """ return time.Time(self.get('t_min'), format='mjd') @property def t_max(self): """ The stop time of the observation specified in MJD. In case of data products result of the combination of multiple frames, t_max must be the maximum of the stop times """ return time.Time(self.get('t_min'), format='mjd') @property def t_exptime(self): """ Total exposure time. For simple exposures, this is just the time_bounds size expressed in seconds. For data where the detector is not active at all times (e.g. data products made by combining exposures taken at different times), the t_exptime will be smaller than the time_bounds interval. For data where the xptime is not constant over the entire data product, the median exposure time per pixel is a good way to characterize the typical value. In some cases, exptime is generally used as an indicator of the relative sensitivity (depth) within a single data collection (e.g. obs_collection); data providers should supply a suitable relative value when it is not feasible to define or compute the true exposure time. In case of targeted observations, on the contrary the exposure time is often adjusted to achieve similar signal to noise ratio for different targets. """ return self.get('t_exptime')*u.second @property def t_resolution(self): """ Estimated or average value of the temporal resolution. """ return self.get('t_resolution')*u.second @property def t_calib_status(self): """ Type of time coordinate calibration. Possible values are principally {uncalibrated, calibrated, raw, relative}. This may be extended for specific time domain collections. """ return self.get('t_calib_status', decode=True, default=None) @property def t_stat_error(self): """ Time coord statistical error on the time measurements in seconds """ ter = self.get('t_stat_error', default=None) return ter if not ter else ter*u.second # SPECTRAL CHARACTERISATION @property def em_xel(self): """ Number of elements along the spectral axis """ return self.get('em_xel') @property def em_ucd(self): """ Nature of the spectral axis """ return self.get('em_ucd', decode=True, default=None) @property def em_unit(self): """ Units along the spectral axis """ return self.get('em_unit', decode=True, default=None) @property def em_calib_status(self): """ This attribute of the spectral axis indicates the status of the data in terms of spectral calibration. Possible values are defined in the Characterisation Data Model and belong to {uncalibrated , calibrated, relative, absolute}. """ return self.get('em_calib_status', decode=True, default=None) @property def em_min(self): """ Minimum of the spectral interval covered by the observation """ return self.get('em_min')*u.meter @property def em_max(self): """ Maximum of the spectral interval covered by the observation """ return self.get('em_max')*u.meter @property def em_res_power(self): """ Average estimation for the spectral resolution power stored as a double value, with no unit. """ return self.get("em_res_power") @property def em_res_power_min(self): """ Resolving power min value on spectral axis """ return self.get('em_res_power_min', None) @property def em_res_power_max(self): """ Resolving power max value on spectral axis """ return self.get('em_res_power_max', None) @property def em_resolution(self): """ A mean estimate of the resolution, e.g. Full Width at Half Maximum (FWHM) of the Line Spread Function (or LSF). This can be used for narrow range spectra whereas in the majority of cases, the resolution power is preferable due to the LSF variation along the spectral axis. """ if 'em_resolution' in self.keys(): return self.get('em_resolution')*u.meter return None @property def em_stat_error(self): """ Spectral coord statistical error (accuracy along the spectral axis) """ if 'em_stat_error' in self.keys(): return self.get('em_stat_error')*u.meter return None # OBSERVABLE AXIS @property def o_ucd(self): """ Nature of the observable axis within the data product """ return self.get('o_ucd', decode=True) @property def o_unit(self): """ Units along the observable axis """ return self.get('o_unit', decode=True, default=None) @property def o_calib_status(self): """ Type of calibration applied on the Flux observed (or other observable quantity). """ return self.get('o_calib_status', decode=True, default=None) @property def o_stat_error(self): """ Statistical error on the Observable axis. Note: the return value has the units defined in unit """ return self.get('o_stat_error', decode=True, default=None) # POLARIZATION CHARACTERISATION @property def pol_xel(self): """ Number of different polarization states present in the data. The default value is 0, indicating that polarization was not explicitly observed. Corresponding values are stored in the `pol` property """ return self.get('pol_xel') @property def pol_states(self): """ List of polarization states present in the data file. Possible values are: {I Q U V RR LL RL LR XX YY XY YX POLI POLA}. Values in the set are separated by the '/' character. A leading / character must start the list and a trailing / character must end it. It should be ordered following the above list, compatible with the FITS list table for polarization definition. """ return self.get('pol_states', decode=True, default=None) # PROVENANCE @property def instrument_name(self): """ The name of the instrument used for the acquisition of the data """ return self.get('instrument_name', decode=True) @property def facility_name(self): """ Name of the facility or observatory used to collect the data """ return self.get('facility_name', decode=True, default=None) @property def proposal_id(self): """ Identifier of proposal to which observation belongs """ return self.get('proposal_id', default=None, decode=True) pyvo-1.2.1/pyvo/dal/sla.py000066400000000000000000000372221416757633600154260ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ A module for searching for spectral line metadata in a remote database. A Simple Line Access (SLA) service allows a client to search for metadata describing atomic and molecular transitions that can result in spectral line emission and absorption. The service responds to a search query with a table in which each row represents a transition that matches the query constraints. The columns provide the metadata describing the transition. This module provides an interface for accessing an SLA service. It is implemented as a specialization of the DAL Query interface. The ``search()`` function support the simplest and most common types of queries, returning an SLAResults instance as its results which represents the matching imagess from the archive. The SLAResults supports access to and iterations over the individual records; these are provided as SLARecord instances, which give easy access to key metadata in the response, such as the transition title. The SLAService class can represent a specific service available at a URL endpoint. """ from pyvo.io.vosi.vodataservice import TableParam from astropy.units import Quantity, Unit from astropy.units import spectral as spectral_equivalencies from astropy.io.votable.tree import Field from astropy.table import Table from .query import DALResults, DALQuery, DALService, Record __all__ = ["search", "SLAService", "SLAQuery", "SLAResults", "SLARecord"] def search(baseurl, wavelength, **keywords): """ submit a simple SLA query that requests spectral lines within a wavelength range Parameters ---------- baseurl : str the base URL for the SLA service wavelength : `~astropy.units.Quantity` class or sequence of two floats the bandwidth range the observations belong to. assuming meters if unit is not specified. **keywords : additional parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. Returns ------- SLAResults a container holding a table of matching spectral lines Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError if the service responds with an error, including a query syntax error. """ service = SLAService(baseurl) return service.search(wavelength, **keywords) class SLAService(DALService): """ a representation of an spectral line catalog (SLA) service """ def __init__(self, baseurl, session=None): """ instantiate an SLA service Parameters ---------- baseurl : str the base URL for submitting search queries to the service. session : object optional session to use for network requests """ super().__init__(baseurl, session=session) def _get_metadata(self): """ download the metadata resource """ if not hasattr(self, "_metadata"): query = self.create_query(request='getCapabilities') metadata = query.execute_votable() setattr(self, "_metadata", metadata) @property def description(self): """ the service description. """ self._get_metadata() try: return getattr(self, "_metadata", None).description except AttributeError: return None @property def columns(self): """ the available columns on this service """ self._get_metadata() fields = filter( lambda field_or_param: isinstance(field_or_param, Field), self._metadata.iter_fields_and_params() ) try: return [ TableParam.from_field(field) for field in fields] except AttributeError: return [] def search(self, wavelength, **keywords): """ submit a simple SLA query to this service with the given constraints. This method is provided for a simple but typical SLA queries. For more complex queries, one should create an SLAQuery object via create_query() Parameters ---------- wavelength : `~astropy.units.Quantity` class or sequence of two floats the bandwidth range the observations belong to. assuming meters if unit is not specified. **keywords : additional parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. Returns ------- SLAResults a container holding a table of matching spectral lines Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError if the service responds with an error, including a query syntax error. See Also -------- SLAResults pyvo.dal.query.DALServiceError pyvo.dal.query.DALQueryError """ return self.create_query(wavelength, **keywords).execute() def create_query(self, wavelength=None, request="queryData", **keywords): """ create a query object that constraints can be added to and then executed. The input arguments will initialize the query with the given values. Parameters ---------- wavelength : `~astropy.units.Quantity` class or sequence of two floats the bandwidth range the observations belong to. assuming meters if unit is not specified. **keywords : additional parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. Returns ------- SLAQuery the query instance See Also -------- SLAQuery """ return SLAQuery(self.baseurl, wavelength, request, session=self._session, **keywords) def describe(self): print(self.description) print() rows = [( col.name, col.description, col.unit, col.ucd, col.utype, col.datatype.arraysize, col.datatype.content, ) for col in self.columns] names = ( 'name', 'description', 'unit', 'ucd', 'utype', 'arraysize', 'datatype', ) table = Table(rows=rows, names=names) table.pprint( max_lines=-1, max_width=-1, show_unit=False, show_dtype=False) class SLAQuery(DALQuery): """ a class for preparing an query to an SLA service. Query constraints are added via its service type-specific methods. The various execute() functions will submit the query and return the results. The base URL for the query, which controls where the query will be sent when one of the execute functions is called, is typically set at construction time; however, it can be updated later via the :py:attr:`~pyvo.dal.query.DALQuery.baseurl` to send a configured query to another service. In addition to the search constraint attributes described below, search parameters can be set generically by name via the dict semantics. The typical function for submitting the query is ``execute()``; however, alternate execute functions provide the response in different forms, allowing the caller to take greater control of the result processing. """ def __init__( self, baseurl, wavelength=None, request="queryData", session=None, **keywords): """ initialize the query object with a baseurl and the given parameters Parameters ---------- baseurl : str the base URL for the SLA service wavelength : `~astropy.units.Quantity` class or sequence of two floats the bandwidth range the observations belong to. assuming meters if unit is not specified. session : object optional session to use for network requests **keywords : additional parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. """ super().__init__(baseurl, session=session) if wavelength is not None: self.wavelength = wavelength self.request = request @property def wavelength(self): """ the frequency/wavelength range the observations belong to. """ return getattr(self, "_wavelength", None) @wavelength.setter def wavelength(self, wavelength): setattr(self, "_wavelength", wavelength) if not isinstance(wavelength, Quantity): valerr = ValueError( 'Wavelength range must be a sequence with exactly two values', 'expressing a frequency or wavelength range') try: # assume meters wavelength = wavelength * Unit("meter") except ValueError: raise valerr try: if len(wavelength) != 2: raise valerr except TypeError: raise valerr # transform to meters wavelength = wavelength.to( Unit("m"), equivalencies=spectral_equivalencies()) # frequency is counter-proportional to wavelength, so we just sort it # to have the right order again wavelength.sort() self["WAVELENGTH"] = "{start}/{end}".format( start=wavelength.value[0], end=wavelength.value[1]) @wavelength.deleter def wavelength(self): delattr(self, "_wavelength") del self["WAVELENGTH"] @property def request(self): """ the type of service operation which is being performed """ return getattr(self, "_request", None) @request.setter def request(self, val): setattr(self, "_request", val) self["REQUEST"] = val @request.deleter def request(self): delattr(self, "_request") del self["REQUEST"] def execute(self): """ submit the query and return the results as a SLAResults instance Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError for errors either in the input query syntax or other user errors detected by the service DALFormatError for errors parsing the VOTable response """ return SLAResults(self.execute_votable(), self.queryurl, session=self._session) class SLAResults(DALResults): """ The list of matching spectral lines resulting from a spectal line catalog (SLA) query. Each record contains a set of metadata that describes a source or observation within the requested circular region (i.e. a "cone"). The number of records in the results is available via the :py:attr:`nrecs attribute or by passing it to the Python built-in ``len()`` function. This class supports iterable semantics; thus, individual records (in the form of :py:class:`~pyvo.dal.sia.SLARecord` instances) are typically accessed by iterating over an ``SLAResults`` instance. >>> results = pyvo.linesearch(url, wavelength=(0.0265,0.0280)) >>> for spl in results: ... print("{0}: {1}".format(spl.species_name, spl.wavelength)) Alternatively, records can be accessed randomly via :py:meth:`getrecord` or through a Python Database API (v2) Cursor (via :py:meth:`~pyvo.dal.query.DALResults.cursor`). Column-based data access is possible via the :py:meth:`~pyvo.dal.query.DALResults.getcolumn` method. ``SLAResults`` is essentially a wrapper around an Astropy :py:mod:`~astropy.io.votable` :py:class:`~astropy.io.votable.tree.Table` instance where the columns contain the various metadata describing the images. One can access that VOTable directly via the :py:attr:`~pyvo.dal.query.DALResults.votable` attribute. Thus, when one retrieves a whole column via :py:meth:`~pyvo.dal.query.DALResults.getcolumn`, the result is a Numpy array. Alternatively, one can manipulate the results as an Astropy :py:class:`~astropy.table.table.Table` via the following conversion: >>> table = results.votable.to_table() ``SLAResults`` supports the array item operator ``[...]`` in a read-only context. When the argument is numerical, the result is an :py:class:`~pyvo.dal.sla.SLARecord` instance, representing the record at the position given by the numerical index. If the argument is a string, it is interpreted as the name of a column, and the data from the column matching that name is returned as a Numpy array. """ def getrecord(self, index): """ return a representation of a sla result record that follows dictionary semantics. The keys of the dictionary are those returned by this instance's fieldnames attribute. The returned record has additional image-specific properties Parameters ---------- index : int the integer index of the desired record where 0 returns the first record Returns ------- SLARecord a dictionary-like wrapper containing the result record metadata. Raises ------ IndexError if index is negative or equal or larger than the number of rows in the result table. See Also -------- Record """ return SLARecord(self, index, session=self._session) class SLARecord(Record): """ a dictionary-like container for data in a record from the results of an spectral line (SLA) query, describing a spectral line transition. The commonly accessed metadata which are stadardized by the SLA protocol are available as attributes. All metadata, particularly non-standard metadata, are acessible via the ``get(`` *key* ``)`` function (or the [*key*] operator) where *key* is table column name. """ @property def title(self): """ a title/small description of the line transition """ return self.getbyutype("ssldm:Line.title", decode=True) @property def wavelength(self): """ the vacuum wavelength of the line in meters. """ return self.getbyutype("ssldm:Line.wavelength.value") * Unit("m") @property def species_name(self): """ the name of the chemical species that produces the transition. """ return self.getbyutype("ssldm:Line.species.name") @property def status(self): """ the name of the chemical species that produces the transition. """ return self.getbyutype("ssldm:Line.identificationStatus") @property def initial_level(self): """ a description of the initial (higher energy) quantum level """ return self.getbyutype("ssldm:Line.initialLevel.name", decode=True) @property def final_level(self): """ a description of the final (higher energy) quantum level """ return self.getbyutype("ssldm:Line.finalLevel.name") pyvo-1.2.1/pyvo/dal/ssa.py000066400000000000000000000630271416757633600154370ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ A module for searching for spectra in a remote archive. A Simple Spectral Access (SSA) service allows a client to search for spectra in an archive whose field of view overlaps with a given cone on the sky. The service responds to a search query with a table in which each row represents an image that is available for download. The columns provide metadata describing each image and one column in particular provides the image's download URL (also called the *access reference*, or *acref*). Some SSA services can create spectra on-the-fly from underlying data (e.g. image cubes); in this case, the query result is a table of images whose aperture matches the requested cone and which will be created when accessed via the download URL. This module provides an interface for accessing an SSA service. It is implemented as a specialization of the DAL Query interface. The ``search()`` function support the simplest and most common types of queries, returning an SSAResults instance as its results which represents the matching imagess from the archive. The SSAResults supports access to and iterations over the individual records; these are provided as SSARecord instances, which give easy access to key metadata in the response, such as the position of the spectrum's aperture, the spectrum format, its frequency range, and its download URL. The SSAService class can represent a specific service available at a URL endpoint. """ import re from pyvo.io.vosi.vodataservice import TableParam from astropy.coordinates import SkyCoord from astropy.time import Time from astropy.units import Quantity, Unit from astropy.units import spectral as spectral_equivalencies from astropy.io.votable.tree import Field from astropy.table import Table from .query import DALResults, DALQuery, DALService, Record from .mimetype import mime2extension from .adhoc import DatalinkResultsMixin, DatalinkRecordMixin, SodaRecordMixin from .. import samp __all__ = ["search", "SSAService", "SSAQuery", "SSAResults", "SSARecord"] def search( baseurl, pos=None, diameter=None, band=None, time=None, format='all', **keywords): """ submit a simple SSA query that requests spectra overlapping a given region Parameters ---------- baseurl : str the base URL for the SSA service pos : `~astropy.coordinates.SkyCoord` class or sequence of two floats the position of the center of the circular search region. assuming icrs decimal degrees if unit is not specified. diameter : `~astropy.units.Quantity` class or scalar float the diameter of the circular region around pos in which to search. assuming icrs decimal degrees if unit is not specified. band : `~astropy.units.Quantity` class or sequence of two floats the bandwidth range the observations belong to. assuming meters if unit is not specified. time : `~astropy.time.Time` class or sequence of two strings the datetime range the observations were made in. assuming iso 8601 if format is not specified. format : str the image format(s) of interest. "all" indicates all available formats; "graphic" indicates graphical images (e.g. jpeg, png, gif; not FITS); "metadata" indicates that no images should be returned--only an empty table with complete metadata. **keywords : additional case insensitive parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. Returns ------- SSAResults a container holding a table of matching spectrum records Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError if the service responds with an error, including a query syntax error. See Also -------- SSAResults pyvo.dal.query.DALServiceError pyvo.dal.query.DALQueryError """ return SSAService(baseurl).search( pos, diameter, band, time, format, **keywords) class SSAService(DALService): """ a representation of an SSA service """ def __init__(self, baseurl): """ instantiate an SSA service Parameters ---------- baseurl : str the base URL for submitting search queries to the service. """ super().__init__(baseurl) def _get_metadata(self): """ the metadata resource element """ if not hasattr(self, "_metadata"): query = self.create_query(format='metadata') metadata = query.execute_votable() setattr(self, "_metadata", metadata) @property def description(self): """ the service description. """ self._get_metadata() try: return getattr(self, "_metadata", None).description except AttributeError: return None @property def columns(self): """ the available columns on this service """ self._get_metadata() fields = filter( lambda field_or_param: isinstance(field_or_param, Field), self._metadata.iter_fields_and_params() ) try: return [ TableParam.from_field(field) for field in fields] except AttributeError: return [] def search( self, pos=None, diameter=None, band=None, time=None, format='all', **keywords): """ submit a SSA query to this service with the given constraints. Parameters ---------- pos : `~astropy.coordinates.SkyCoord` class or sequence of two floats the position of the center of the circular search region. assuming icrs decimal degrees if unit is not specified. diameter : `~astropy.units.Quantity` class or scalar float the diameter of the circular region around pos in which to search. assuming icrs decimal degrees if unit is not specified. band : `~astropy.units.Quantity` class or sequence of two floats the bandwidth range the observations belong to. assuming meters if unit is not specified. time : `~astropy.time.Time` class or sequence of two strings the datetime range the observations were made in. assuming iso 8601 if format is not specified. format : str the image format(s) of interest. "all" indicates all available formats; "graphic" indicates graphical images (e.g. jpeg, png, gif; not FITS); "metadata" indicates that no images should be returned--only an empty table with complete metadata. **keywords : additional case insensitive parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. Returns ------- SSAResults a container holding a table of matching catalog records Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError if the service responds with an error, including query syntax errors See Also -------- SSAResults pyvo.dal.query.DALServiceError pyvo.dal.query.DALQueryError """ return self.create_query( pos, diameter, band, time, format, **keywords).execute() def create_query( self, pos=None, diameter=None, band=None, time=None, format=None, request="queryData", **keywords): """ create a query object that constraints can be added to and then executed. The input arguments will initialize the query with the given values. Parameters ---------- pos : `~astropy.coordinates.SkyCoord` class or sequence of two floats the position of the center of the circular search region. assuming icrs decimal degrees if unit is not specified. diameter : `~astropy.units.Quantity` class or scalar float the diameter of the circular region around pos in which to search. assuming icrs decimal degrees if unit is not specified. band : `~astropy.units.Quantity` class or sequence of two floats the bandwidth range the observations belong to. assuming meters if unit is not specified. time : `~astropy.time.Time` class or sequence of two strings the datetime range the observations were made in. assuming iso 8601 if format is not specified. format : str the image format(s) of interest. "all" indicates all available formats; "graphic" indicates graphical images (e.g. jpeg, png, gif; not FITS); "metadata" indicates that no images should be returned--only an empty table with complete metadata. **keywords : additional case insensitive parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. Returns ------- SSAQuery the query instance See Also -------- SSAQuery """ return SSAQuery( self.baseurl, pos, diameter, band, time, format, request, session=self._session, **keywords) def describe(self): print(self.description) print() rows = [( col.name, col.description, col.unit, col.ucd, col.utype, col.datatype.arraysize, col.datatype.content, ) for col in self.columns] names = ( 'name', 'description', 'unit', 'ucd', 'utype', 'arraysize', 'datatype', ) table = Table(rows=rows, names=names) table.pprint( max_lines=-1, max_width=-1, show_unit=False, show_dtype=False) class SSAQuery(DALQuery): """ a class for preparing an query to an SSA service. Query constraints are added via its service type-specific properties and methods. Once all the constraints are set, one of the various execute() functions can be called to submit the query and return the results. The base URL for the query, which controls where the query will be sent when one of the execute functions is called, is typically set at construction time; however, it can be updated later via the :py:attr:`~pyvo.dal.query.DALQuery.baseurl` to send a configured query to another service. The typical function for submitting the query is ``execute()``; however, alternate execute functions provide the response in different forms, allowing the caller to take greater control of the result processing. """ def __init__( self, baseurl, pos=None, diameter=None, band=None, time=None, format=None, request="queryData", session=None, **keywords): """ initialize the query object with a baseurl and the given parameters Parameters ---------- baseurl : str the base URL for the SSA service pos : `~astropy.coordinates.SkyCoord` class or sequence of two floats the position of the center of the circular search region. assuming icrs decimal degrees if unit is not specified. diameter : `~astropy.units.Quantity` class or scalar float the diameter of the circular region around pos in which to search. assuming icrs decimal degrees if unit is not specified. band : `~astropy.units.Quantity` class or sequence of two floats the bandwidth range the observations belong to. assuming meters if unit is not specified. time : `~astropy.time.Time` class or sequence of two strings the datetime range the observations were made in. assuming iso 8601 if format is not specified. format : str the image format(s) of interest. "all" indicates all available formats; "graphic" indicates graphical images (e.g. jpeg, png, gif; not FITS); "metadata" indicates that no images should be returned--only an empty table with complete metadata. session : object optional session to use for network requests **keywords : additional case insensitive parameters can be given via arbitrary case insensitive keyword arguments. Where there is overlap with the parameters set by the other arguments to this function, these keywords will override. """ super().__init__(baseurl, session=session) if pos: self.pos = pos if diameter is not None: self.diameter = diameter if band: self.band = band if time: self.time = time if format: self.format = format self.request = request self.update({key.upper(): value for key, value in keywords.items()}) @property def pos(self): """ the position of the center of the circular search region as a `~astropy.coordinates.SkyCoord` instance. """ return getattr(self, "_pos", None) @pos.setter def pos(self, pos): setattr(self, "_pos", pos) if not isinstance(pos, SkyCoord): try: ra, dec = pos except (TypeError, ValueError): raise ValueError( 'Pos must be a sequence with exactly two values, ' 'expressing ra and dec in icrs degrees' ) # assume degrees pos = SkyCoord(ra=ra, dec=dec, unit="deg", frame="icrs") self["POS"] = "{ra},{dec}".format( ra=pos.icrs.ra.deg, dec=pos.icrs.dec.deg) @pos.deleter def pos(self): delattr(self, "_pos") del self["POS"] @property def diameter(self): """ the diameter of the circular region around pos as a `~astropy.units.Quantity` instance. """ return getattr(self, "_diameter", None) @diameter.setter def diameter(self, diameter): setattr(self, "_diameter", diameter) if not isinstance(diameter, Quantity): valerr = ValueError( 'Radius must be exactly one value, expressing degrees') try: # assume degrees diameter = diameter * Unit("deg") except ValueError: raise valerr try: if len(diameter): raise valerr except TypeError: pass # len 1 self["SIZE"] = diameter.to(Unit("deg")).value @diameter.deleter def diameter(self): delattr(self, "_diameter") del self["SIZE"] @property def band(self): """ the bandwidth range the observations belong to. """ return getattr(self, "_band", None) @band.setter def band(self, band): setattr(self, "_band", band) if not isinstance(band, Quantity): valerr = ValueError( 'Band must be a sequence with exactly two values', 'expressing a frequency or wavelength range') try: # assume meters band = band * Unit("meter") except ValueError: raise valerr try: if len(band) != 2: raise valerr except TypeError: raise valerr # transform to meters band = band.to(Unit("m"), equivalencies=spectral_equivalencies()) # frequency is counter-proportional to wavelength, so we just sort # it to have the right order again band.sort() self["BAND"] = "{start}/{end}".format( start=band.value[0], end=band.value[1]) @band.deleter def band(self): delattr(self, "_band") del self["BAND"] @property def time(self): """ the datetime range the observations were made in. """ return getattr(self, "_time", None) @time.setter def time(self, time): setattr(self, "_time", time) if not isinstance(time, Time): valerr = ValueError( 'Time must be a sequence with exactly two values, ' 'expressing a datetime in ISO 8601' ) try: # assume iso8601 time = Time(time, format="isot") except ValueError: raise valerr try: if len(time) != 2: raise valerr except TypeError: raise valerr self["TIME"] = "{start}/{end}".format( start=time.isot[0], end=time.isot[1]) @time.deleter def time(self): delattr(self, "_time") del self["TIME"] @property def format(self): """ the image format(s) of interest. "all" indicates all available formats; "graphic" indicates graphical images (e.g. jpeg, png, gif; not FITS); "metadata" indicates that no images should be returned--only an empty table with complete metadata. """ return getattr(self, "_format", None) @format.setter def format(self, val): setattr(self, "_format", val) if type(val) in (str, bytes): val = [val] self["FORMAT"] = ",".join(val) @format.deleter def format(self): delattr(self, "_format") del self["FORMAT"] @property def request(self): """ the type of service operation which is being performed """ return getattr(self, "_request", None) @request.setter def request(self, val): setattr(self, "_request", val) self["REQUEST"] = val @request.deleter def request(self): delattr(self, "_request") del self["REQUEST"] def execute(self): """ submit the query and return the results as a SSAResults instance Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError for errors either in the input query syntax or other user errors detected by the service DALFormatError for errors parsing the VOTable response """ return SSAResults(self.execute_votable(), url=self.queryurl, session=self._session) class SSAResults(DatalinkResultsMixin, DALResults): """ The list of matching images resulting from a spectrum (SSA) query. Each record contains a set of metadata that describes an available spectrum matching the query constraints. The number of records in the results is by passing it to the Python built-in ``len()`` function. This class supports iterable semantics; thus, individual records (in the form of :py:class:`~pyvo.dal.ssa.SSARecord` instances) are typically accessed by iterating over an ``SSAResults`` instance. >>> results = pyvo.spectrumsearch(url, pos=[12.24, -13.1], diameter=0.2) >>> for spec in results: ... print("{0}: {1}".format(spec.title, spec.getdataurl())) Alternatively, records can be accessed randomly via :py:meth:`getrecord` or through a Python Database API (v2) Cursor (via :py:meth:`~pyvo.dal.query.DALResults.cursor`). Column-based data access is possible via the :py:meth:`~pyvo.dal.query.DALResults.getcolumn` method. ``SSAResults`` is essentially a wrapper around an Astropy :py:mod:`~astropy.io.votable` :py:class:`~astropy.io.votable.tree.Table` instance where the columns contain the various metadata describing the spectra. One can access that VOTable directly via the :py:attr:`~pyvo.dal.query.DALResults.votable` attribute. Thus, when one retrieves a whole column via :py:meth:`~pyvo.dal.query.DALResults.getcolumn`, the result is a Numpy array. Alternatively, one can manipulate the results as an Astropy :py:class:`~astropy.table.table.Table` via the following conversion: >>> table = results.votable.to_table() ``SSAResults`` supports the array item operator ``[...]`` in a read-only context. When the argument is numerical, the result is an :py:class:`~pyvo.dal.ssa.SSARecord` instance, representing the record at the position given by the numerical index. If the argument is a string, it is interpreted as the name of a column, and the data from the column matching that name is returned as a Numpy array. """ def getrecord(self, index): """ return a representation of a sia result record that follows dictionary semantics. The keys of the dictionary are those returned by this instance's fieldnames attribute. The returned record has additional image-specific properties Parameters ---------- index : int the integer index of the desired record where 0 returns the first record Returns ------- SIARecord a dictionary-like wrapper containing the result record metadata. Raises ------ IndexError if index is negative or equal or larger than the number of rows in the result table. See Also -------- Record """ return SSARecord(self, index, session=self._session) class SSARecord(SodaRecordMixin, DatalinkRecordMixin, Record): """ a dictionary-like container for data in a record from the results of an SSA query, describing an available spectrum. The commonly accessed metadata which are stadardized by the SSA protocol are available as attributes. If the metadatum accessible via an attribute is not available, the value of that attribute will be None. All metadata, including non-standard metadata, are acessible via the ``get(`` *key* ``)`` function (or the [*key*] operator) where *key* is table column name. """ @property def ra(self): """ return the right ascension of the center of the spectrum """ return self.getbyutype("ssa:Target.Pos")[0] @property def dec(self): """ return the declination of the center of the spectrum """ return self.getbyutype("ssa:Target.Pos")[1] @property def title(self): """ return the title of the spectrum """ return self.getbyutype("ssa:DataID.Title", decode=True) @property def format(self): """ return the file format that this the spectrum is stored in """ return self.getbyutype("ssa:Access.Format", decode=True) @property def dateobs(self): """ return the modified Julien date (MJD) of the mid-point of the observational data that went into the spectrum """ dateobs = self.getbyutype("ssa:DataID.Date", decode=True) if dateobs: return Time(dateobs, format="iso") else: return None @property def instr(self): """ return the name of the instrument (or instruments) that produced the data that went into this spectrum. """ return self.getbyutype("ssa:DataID.Instrument", decode=True) @property def acref(self): """ return the URL that can be used to retrieve the spectrum. """ return self.getbyutype("ssa:Access.Reference", decode=True) @property def filesize(self): """ The (estimated) size of the image in bytes """ return self.getbyutype("ssa:Access.Size") def getdataurl(self): """ return the URL contained in the access URL column which can be used to retrieve the dataset described by this record. None is returned if no such column exists. """ dataurl = super().getdataurl() if dataurl is None: return self.acref else: return dataurl def suggest_dataset_basename(self): """ return a default base filename that the dataset available via ``getdataset()`` can be saved as. This function is specialized for a particular service type this record originates from so that it can be used by ``cachedataset()`` via ``make_dataset_filename()``. """ out = self.title if type(out) == bytes: out = out.decode('utf-8') if not out: out = "spectrum" else: out = re.sub(r'\s+', '_', out.strip()) return out def suggest_extension(self, default=None): """ returns a recommended filename extension for the dataset described by this record. Typically, this would look at the column describing the format and choose an extension accordingly. """ return mime2extension(self.format, default) def broadcast_samp(self, client_name=None): """ Broadcast the spectrum to ``client_name`` via SAMP """ with samp.connection() as conn: samp.send_spectrum_to( conn, self.getdataurl(), client_name, name=self.suggest_dataset_basename()) pyvo-1.2.1/pyvo/dal/tap.py000066400000000000000000000767721416757633600154500ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ A module for accessing remote source and observation catalogs """ from functools import partial from datetime import datetime from time import sleep from distutils.version import LooseVersion import requests from urllib.parse import urlparse, urljoin from astropy.io.votable import parse as votableparse from .query import ( DALResults, DALQuery, DALService, Record, UploadList, DALServiceError, DALQueryError) from .vosi import AvailabilityMixin, CapabilityMixin, VOSITables from .adhoc import DatalinkResultsMixin, DatalinkRecordMixin, SodaRecordMixin from ..io import vosi, uws from ..io.vosi import tapregext as tr from ..utils.formatting import para_format_desc from ..utils.http import use_session import xml.etree.ElementTree import io __all__ = [ "search", "escape", "TAPService", "TAPQuery", "AsyncTAPJob", "TAPResults"] IVOA_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%fZ" def _from_ivoa_format(datetime_str): """ parses an ivoa date in ISO 8601 format: YYYY-MM-DDTHH:MM:SS.[mmm]Z :param datetime_str: :return: corresponding datetime object """ # TODO Replace with datetime.fromisoformat(date_string) in Python3.7+ try: # with fraction of seconds first return datetime.strptime(datetime_str, IVOA_DATETIME_FORMAT) except ValueError: # and without return datetime.strptime(datetime_str, "%Y-%m-%dT%H:%M:%SZ") def escape(term): """ escapes a term for use in ADQL """ return str(term).replace("'", "''") def search(url, query, language="ADQL", maxrec=None, uploads=None, **keywords): """ submit a Table Access query that returns rows matching the criteria given. Parameters ---------- url : str the base URL of the query service. query : str, dict The query string / parameters language : str specifies the query language, default ADQL. useful for services which allow to use the backend query language. maxrec : int the maximum records to return. defaults to the service default uploads : dict a mapping from table names to file like objects containing a votable Returns ------- TAPResults a container holding a table of matching catalog records Raises ------ DALServiceError for errors connecting to or communicating with the service. DALQueryError if the service responds with an error, including a query syntax error. """ service = TAPService(url) return service.search(query, language, maxrec, uploads, **keywords) class TAPService(DALService, AvailabilityMixin, CapabilityMixin): """ a representation of a Table Access Protocol service """ _tables = None _examples = None def __init__(self, baseurl, session=None): """ instantiate a Tablee Access Protocol service Parameters ---------- baseurl : str the base URL that should be used for forming queries to the service. session : object optional session to use for network requests """ super().__init__(baseurl, session=session) # Check if the session has an update_from_capabilities attribute. # This means that the session is aware of IVOA capabilities, # and can use this information in processing network requests. # One such usecase for this is auth. if hasattr(self._session, 'update_from_capabilities'): self._session.update_from_capabilities(self.capabilities) @property def tables(self): """ returns tables as a dict-like object """ if self._tables is None: tables_url = '{}/tables'.format(self.baseurl) response = self._session.get(tables_url, stream=True) try: response.raise_for_status() except requests.RequestException as ex: raise DALServiceError.from_except(ex, tables_url) # requests doesn't decode the content by default response.raw.read = partial(response.raw.read, decode_content=True) self._tables = VOSITables( vosi.parse_tables(response.raw.read), tables_url) return self._tables @property def examples(self): """ returns examples as a list of TAPQuery objects """ if self._examples is None: examples_url = '{}/examples'.format(self.baseurl) response = self._session.get(examples_url, stream=True) if response.status_code == 404: return [] try: response.raise_for_status() except requests.RequestException as ex: raise DALServiceError.from_except(ex, examples_url) try: root = xml.etree.ElementTree.parse(io.BytesIO(response.content)).getroot() exampleElements = root.findall('.//*[@property="query"]') except Exception as ex: raise DALServiceError.from_except(ex, examples_url) self._examples = [TAPQuery(self.baseurl, example.text) for example in exampleElements] return self._examples @property def maxrec(self): """ the default output limit. Raises ------ DALServiceError if the property is not exposed by the service """ try: for capa in self.capabilities: if isinstance(capa, tr.TableAccess): return capa.outputlimit.default.content except AttributeError: pass raise DALServiceError("Default limit not exposed by the service") @property def hardlimit(self): """ the hard output limit. Raises ------ DALServiceError if the property is not exposed by the service """ try: for capa in self.capabilities: if isinstance(capa, tr.TableAccess): return capa.outputlimit.hard.content except AttributeError: pass raise DALServiceError("Hard limit not exposed by the service") @property def upload_methods(self): """ a list of upload methods in form of :py:class:`~pyvo.io.vosi.tapregext.UploadMethod` objects """ upload_methods = [] for capa in self.capabilities: if isinstance(capa, tr.TableAccess): upload_methods += capa.uploadmethods return upload_methods def run_sync( self, query, language="ADQL", maxrec=None, uploads=None, **keywords): """ runs sync query and returns its result Parameters ---------- query : str The query language : str specifies the query language, default ADQL. useful for services which allow to use the backend query language. maxrec : int the maximum records to return. defaults to the service default uploads : dict a mapping from table names to objects containing a votable Returns ------- TAPResults the query result See Also -------- TAPResults """ return self.create_query( query, language=language, maxrec=maxrec, uploads=uploads, **keywords).execute() # alias for service discovery search = run_sync def run_async( self, query, language="ADQL", maxrec=None, uploads=None, **keywords): """ runs async query and returns its result Parameters ---------- query : str, dict the query string / parameters language : str specifies the query language, default ADQL. useful for services which allow to use the backend query language. maxrec : int the maximum records to return. defaults to the service default uploads : dict a mapping from table names to objects containing a votable Returns ------- TAPResult the query instance Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError for errors either in the input query syntax or other user errors detected by the service DALFormatError for errors parsing the VOTable response See Also -------- AsyncTAPJob """ job = AsyncTAPJob.create( self.baseurl, query, language, maxrec, uploads, self._session, **keywords) job = job.run().wait() job.raise_if_error() result = job.fetch_result() job.delete() return result def submit_job( self, query, language="ADQL", maxrec=None, uploads=None, **keywords): """ submit a async query without starting it and returns a AsyncTAPJob object Parameters ---------- query : str the query string / parameters language : str specifies the query language, default ADQL. useful for services which allow to use the backend query language. maxrec : int the maximum records to return. defaults to the service default uploads : dict a mapping from table names to objects containing a votable Returns ------- AsyncTAPJob the query instance See Also -------- AsyncTAPJob """ return AsyncTAPJob.create( self.baseurl, query, language, maxrec, uploads, self._session, **keywords) def create_query( self, query=None, mode="sync", language="ADQL", maxrec=None, uploads=None, **keywords): """ create a query object that constraints can be added to and then executed. The input arguments will initialize the query with the given values. Parameters ---------- baseurl : str the base URL for the TAP service query : str the query string / parameters mode : str the query mode (sync | async). default "sync" language : str specifies the query language, default ADQL. useful for services which allow to use the backend query language. maxrec : int specifies the maximum records to return. defaults to the service default. uploads : dict a mapping from table names to objects containing a votable. """ return TAPQuery( self.baseurl, query, mode, language, maxrec, uploads, self._session, **keywords) def get_job(self, job_id): """ Returns the job corresponding to an ID. Note that the caller must be able to see the job in the current security context. Parameters ---------- job_id : str ID of the job to view Returns ------- `~pyvo.io.vosi.endpoint.JobSummary` corresponding to the job ID """ response = self._session.get( self.baseurl + '/async/' + job_id, stream=True) response.raw.read = partial(response.raw.read, decode_content=True) return uws.parse_job(response.raw.read) def get_job_list(self, phases=None, after=None, last=None, short_description=True): """ lists jobs that the caller can see in the current security context. The list can be filtered on the server side by the phases of the jobs, creation date time or Note that by default jobs in 'ARCHIVED` phase are not returned. Parameters ---------- phases: list of str Union of job phases to filter the results by. after: datetime Return only jobs created after this datetime last: int Return only the most recent number of jobs short_description: flag - True or False If True, the jobs in the list will contain only the information corresponding to the TAP ShortJobDescription object (job ID, phase, run ID, owner ID and creation ID) whereas if False, a separate GET call to each job is performed for the complete job description. Returns ------- list of `~pyvo.io.vosi.endpoint.JobSummary` """ params = {'PHASE': phases, 'LAST': last} if after: if isinstance(after, str): after = _from_ivoa_format(after) params['AFTER'] = after.strftime(IVOA_DATETIME_FORMAT) response = self._session.get('{}/async'.format(self.baseurl), params=params, stream=True) response.raw.read = partial(response.raw.read, decode_content=True) jobs = uws.parse_job_list(response.raw.read) if not short_description: dj = [] for job in jobs: dj.append(self.get_job(job.jobid)) return dj else: return list(jobs) def describe(self, width=None): """ Print a summary description of this service. This includes the interface capabilities, and the content description if it doesn't contains multiple data collections (in other words, it is not a TAP service). """ if len(self.tables) == 1: description = next(self.tables.values()).description if width: description = para_format_desc(description, width) print(description) print() capabilities = filter( lambda x: not str(x.standardid).startswith( 'ivo://ivoa.net/std/VOSI'), self.capabilities ) for cap in capabilities: cap.describe() print() class AsyncTAPJob: """ This class represents a UWS TAP Job. """ _job = {} @classmethod def create( cls, baseurl, query, language="ADQL", maxrec=None, uploads=None, session=None, **keywords): """ creates a async tap job on the server under `baseurl` Parameters ---------- baseurl : str the TAP baseurl query : str the query string language : str specifies the query language, default ADQL. useful for services which allow to use the backend query language. maxrec : int the maximum records to return. defaults to the service default uploads : dict a mapping from table names to objects containing a votable session : object optional session to use for network requests """ query = TAPQuery( baseurl, query, mode="async", language=language, maxrec=maxrec, uploads=uploads, session=session, **keywords) response = query.submit() job = cls(response.url, session=session) return job def __init__(self, url, session=None): """ initialize the job object with the given url and fetch remote values Parameters ---------- url : str the job url """ self._url = url self._session = use_session(session) self._update() def __enter__(self): """ Enters the context """ return self def __exit__(self, exc_type, exc_val, exc_tb): """ Exits the context. The job is silently deleted. """ try: self.delete() except Exception: pass def _update(self, wait_for_statechange=False, timeout=10.): """ updates local job infos with remote values """ try: if wait_for_statechange: response = self._session.get( self.url, stream=True, timeout=timeout, params={ "WAIT": "-1" } ) else: response = self._session.get(self.url, stream=True, timeout=timeout) response.raise_for_status() except requests.RequestException as ex: raise DALServiceError.from_except(ex, self.url) # requests doesn't decode the content by default response.raw.read = partial(response.raw.read, decode_content=True) self._job = uws.parse_job(response.raw.read) @property def job(self): """ all up-to-date uws job infos as dictionary """ # keep it up to date self._update() return self._job @property def url(self): """ the job url """ return self._url @property def job_id(self): """ the job id """ return self._job.jobid @property def phase(self): """ the current query phase """ self._update() return self._job.phase @property def execution_duration(self): """ maximum execution duration as ~`astropy.time.TimeDelta` """ self._update() return self._job.executionduration @execution_duration.setter def execution_duration(self, value): try: response = self._session.post( "{}/executionduration".format(self.url), data={"EXECUTIONDURATION": str(value)}) response.raise_for_status() except requests.RequestException as ex: raise DALServiceError.from_except(ex, self.url) self._update() @property def destruction(self): """ datetime after which the job results are deleted automatically. read-write """ self._update() return self._job.destruction @destruction.setter def destruction(self, value): """ datetime after which the job results are deleted automatically. read-write Parameters ---------- value : datetime datetime after which the job results are deleted automatically """ if isinstance(value, str): value = _from_ivoa_format(value) try: response = self._session.post( "{}/destruction".format(self.url), data={"DESTRUCTION": value.strftime(IVOA_DATETIME_FORMAT)}) response.raise_for_status() except requests.RequestException as ex: raise DALServiceError.from_except(ex, self.url) self._update() @property def quote(self): """ estimated runtime """ self._update() return self._job.quote @property def owner(self): """ job owner (if applicable) """ self._update() return self._job.ownerid @property def query(self): """ the job query """ self._update() for parameter in self._job.parameters: if parameter.id_ == 'query': return parameter.content return '' @query.setter def query(self, query): try: response = self._session.post( '{}/parameters'.format(self.url), data={"QUERY": query}) response.raise_for_status() except requests.RequestException as ex: raise DALServiceError.from_except(ex, self.url) self._update() def upload(self, **kwargs): """ upload a table to the job. the job must not been started. """ uploads = UploadList.fromdict(kwargs) files = { upload.name: upload.fileobj() for upload in uploads if upload.is_inline } try: response = self._session.post( '{}/parameters'.format(self.url), data={'UPLOAD': uploads.param()}, files=files ) response.raise_for_status() except requests.RequestException as ex: raise DALServiceError.from_except(ex, self.url) self._update() @property def results(self): """ The job results if exists """ return self._job.results @property def result(self): """ The job result if exists """ try: for r in self._job.results: if r.id_ == 'result': return r return self._job.results[0] except IndexError: return None @property def result_uris(self): """ a list of the last result uri's """ return [result.href for result in self._job.results] @property def result_uri(self): """ the uri of the result """ try: uri = self.result.href if not urlparse(uri).netloc: uri = urljoin(self.url, uri) return uri except IndexError: return None @property def uws_version(self): self._update() return self._job.version def run(self): """ starts the job / change phase to RUN """ try: response = self._session.post( '{}/phase'.format(self.url), data={"PHASE": "RUN"}) response.raise_for_status() except requests.RequestException as ex: raise DALServiceError.from_except(ex, self.url) return self def abort(self): """ aborts the job / change phase to ABORT """ try: response = self._session.post( '{}/phase'.format(self.url), data={"PHASE": "ABORT"}) response.raise_for_status() except requests.RequestException as ex: raise DALServiceError.from_except(ex, self.url) return self def wait(self, phases=None, timeout=600.): """ waits for the job to reach the given phases. Parameters ---------- phases : list phases to wait for Raises ------ DALServiceError if the job is in a state that won't lead to an result """ if not phases: phases = {"COMPLETED", "ABORTED", "ERROR"} interval = 1.0 increment = 1.2 active_phases = { "QUEUED", "EXECUTING", "RUN", "COMPLETED", "ERROR", "UNKNOWN"} while True: self._update(wait_for_statechange=True, timeout=timeout) # use the cached value cur_phase = self._job.phase if cur_phase not in active_phases: raise DALServiceError( "Cannot wait for job completion. Job is not active!") if cur_phase in phases: break # fallback for uws 1.0 if LooseVersion(self._job.version) < LooseVersion("1.1"): sleep(interval) interval = min(120, interval * increment) return self def delete(self): """ deletes the job. this object will become invalid. """ try: response = self._session.post(self.url, data={"ACTION": "DELETE"}) response.raise_for_status() except requests.RequestException as ex: raise DALServiceError.from_except(ex, self.url) self._url = None def raise_if_error(self): """ raise a exception if theres an error Raises ------ DALQueryError if theres an error """ if self.phase in {"ERROR", "ABORTED"}: raise DALQueryError("Query Error", self.phase, self.url) def fetch_result(self): """ returns the result votable if query is finished """ try: response = self._session.get(self.result_uri, stream=True) response.raise_for_status() except requests.RequestException as ex: self._update() # we propably got a 404 because query error. raise with error msg self.raise_if_error() raise DALServiceError.from_except(ex, self.url) response.raw.read = partial( response.raw.read, decode_content=True) return TAPResults(votableparse(response.raw.read), url=self.result_uri, session=self._session) class TAPQuery(DALQuery): """ a class for preparing an query to an TAP service. Query constraints are added via its service type-specific methods. The various execute() functions will submit the query and return the results. The base URL for the query, which controls where the query will be sent when one of the execute functions is called, is typically set at construction time; however, it can be updated later via the :py:attr:`~pyvo.dal.query.DALQuery.baseurl` to send a configured query to another service. In addition to the search constraint attributes described below, search parameters can be set generically by name via dict semantics. The typical function for submitting the query is ``execute()``; however, alternate execute functions provide the response in different forms, allowing the caller to take greater control of the result processing. """ def __init__( self, baseurl, query, mode="sync", language="ADQL", maxrec=None, uploads=None, session=None, **keywords): """ initialize the query object with the given parameters Parameters ---------- baseurl : str the TAP baseurl query : str the query string mode : str the query mode (sync | async). default "sync" language : str the query language. defaults to ADQL maxrec : int the amount of records to fetch uploads : dict Files to upload. Uses table name as key and table content as value. session : object optional session to use for network requests """ baseurl = baseurl.rstrip("?") super().__init__(baseurl, session=session, **keywords) self._mode = mode if mode in ("sync", "async") else "sync" self._uploads = UploadList.fromdict(uploads or {}) self["REQUEST"] = "doQuery" self["LANG"] = language if maxrec: self["MAXREC"] = maxrec self["QUERY"] = query if self._uploads: self["UPLOAD"] = self._uploads.param() @property def queryurl(self): return '{baseurl}/{mode}'.format(baseurl=self.baseurl, mode=self._mode) def execute_stream(self, post=False): """ submit the query and return the raw VOTable XML as a file stream Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError for errors in the input query syntax """ # theres nothing to execute in non-sync queries if self._mode != "sync": raise DALServiceError( "Cannot execute a non-synchronous query. Use submit instead") return super().execute_stream(post=post) def execute(self): """ submit the query and return the results as a TAPResults instance Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError for errors either in the input query syntax or other user errors detected by the service DALFormatError for errors parsing the VOTable response """ return TAPResults(self.execute_votable(), url=self.queryurl, session=self._session) def submit(self, post=False): """ Does the request part of the TAP query. This function is separated from response parsing because async queries return no votable but behave like sync queries in terms of request. It returns the requests response. """ url = self.queryurl files = { upload.name: upload.fileobj() for upload in self._uploads if upload.is_inline } response = self._session.post( url, data=self, stream=True, files=files) # requests doesn't decode the content by default response.raw.read = partial(response.raw.read, decode_content=True) return response class TAPResults(DatalinkResultsMixin, DALResults): """ The list of matching images resulting from an image (SIA) query. Each record contains a set of metadata that describes an available image matching the query constraints. The number of records in the results is available via the :py:attr:`nrecs` attribute or by passing it to the Python built-in ``len()`` function. This class supports iterable semantics; thus, individual records (in the form of :py:class:`~pyvo.dal.query.Record` instances) are typically accessed by iterating over an ``TAPResults`` instance. Alternatively, records can be accessed randomly via :py:meth:`getrecord` or through a Python Database API (v2) Cursor (via :py:meth:`~pyvo.dal.query.DALResults.cursor`). Column-based data access is possible via the :py:meth:`~pyvo.dal.query.DALResults.getcolumn` method. ``TAPResults`` is essentially a wrapper around an Astropy :py:mod:`~astropy.io.votable` :py:class:`~astropy.io.votable.tree.Table` instance where the columns contain the various metadata describing the images. One can access that VOTable directly via the :py:attr:`~pyvo.dal.query.DALResults.votable` attribute. Thus, when one retrieves a whole column via :py:meth:`~pyvo.dal.query.DALResults.getcolumn`, the result is a Numpy array. Alternatively, one can manipulate the results as an Astropy :py:class:`~astropy.table.table.Table` via the following conversion: >>> table = results.table ``SIAResults`` supports the array item operator ``[...]`` in a read-only context. When the argument is numerical, the result is an :py:class:`~pyvo.dal.query.Record` instance, representing the record at the position given by the numerical index. If the argument is a string, it is interpreted as the name of a column, and the data from the column matching that name is returned as a Numpy array. """ @property def infos(self): """ return the info element as dictionary """ return getattr(self, "_infos", {}) @property def query_status(self): """ return the query status """ return getattr(self, "_infos", {}).get("QUERY_STATUS", None) def getrecord(self, index): """ return a representation of a tap result record that follows dictionary semantics. The keys of the dictionary are those returned by this instance's fieldnames attribute. The returned record has additional image-specific properties Parameters ---------- index : int the integer index of the desired record where 0 returns the first record Returns ------- REc a dictionary-like wrapper containing the result record metadata. Raises ------ IndexError if index is negative or equal or larger than the number of rows in the result table. See Also -------- Record """ return TAPRecord(self, index) class TAPRecord(SodaRecordMixin, DatalinkRecordMixin, Record): pass pyvo-1.2.1/pyvo/dal/tests/000077500000000000000000000000001416757633600154315ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/tests/__init__.py000066400000000000000000000001001416757633600175310ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst pyvo-1.2.1/pyvo/dal/tests/conftest.py000066400000000000000000000012561416757633600176340ustar00rootroot00000000000000from contextlib import contextmanager import pytest import requests_mock class ContextAdapter(requests_mock.Adapter): """ requests_mock adapter where ``register_uri`` returns a context manager """ @contextmanager def register_uri(self, *args, **kwargs): matcher = super().register_uri(*args, **kwargs) yield matcher self.remove_matcher(matcher) def remove_matcher(self, matcher): if matcher in self._matchers: self._matchers.remove(matcher) @pytest.fixture(scope='function') def mocker(): with requests_mock.Mocker( adapter=ContextAdapter(case_sensitive=True) ) as mocker: yield mocker pyvo-1.2.1/pyvo/dal/tests/data/000077500000000000000000000000001416757633600163425ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/tests/data/datalink/000077500000000000000000000000001416757633600201315ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/tests/data/datalink/cutout1.xml000066400000000000000000000260741416757633600222700ustar00rootroot00000000000000
the caller is allowed to use this link with the current authenticated identity
ivo://cadc.nrc.ca/MACHO?54150/cal054150r https://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/data/pub/MACHO/cal054150r.fits.fz?RUNID=e3h6rssb161oyf7j #this download ad:MACHO/cal054150r.fits.fz application/fits 18616320 true
ivo://cadc.nrc.ca/MACHO?54150/cal054150r soda-146cec58-9031-4568-9aeb-380eabb50942 #cutout SODA-sync cutout of ad:MACHO/cal054150r.fits.fz application/fits true
ivo://cadc.nrc.ca/MACHO?54150/cal054150r soda-142c15fb-f9ff-4ad0-b35f-7efb07d9bfea #cutout SODA-async cutout of ad:MACHO/cal054150r.fits.fz application/fits true
ivo://cadc.nrc.ca/MACHO?54151/cal054151b https://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/data/pub/MACHO/cal054151b.fits.fz?RUNID=e3h6rssb161oyf7j #this download ad:MACHO/cal054151b.fits.fz application/fits 21692160 true
ivo://cadc.nrc.ca/MACHO?54151/cal054151b soda-2d68bb35-50e4-459b-bfb2-ac2b5da1a5d1 #cutout SODA-sync cutout of ad:MACHO/cal054151b.fits.fz application/fits true
ivo://cadc.nrc.ca/MACHO?54151/cal054151b soda-fadba418-47ec-4a3d-b8ab-8368f3081082 #cutout SODA-async cutout of ad:MACHO/cal054151b.fits.fz application/fits true
pyvo-1.2.1/pyvo/dal/tests/data/datalink/cutout2.xml000066400000000000000000000142311416757633600222610ustar00rootroot00000000000000 the caller is allowed to use this link with the current authenticated identity
ivo://cadc.nrc.ca/MACHO?54151/cal054151r https://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/data/pub/MACHO/cal054151r.fits.fz?RUNID=of051krube49ud2e #this download ad:MACHO/cal054151r.fits.fz application/fits 18987840 true
ivo://cadc.nrc.ca/MACHO?54151/cal054151r soda-40d74211-597b-4aa9-a153-f5ac67b77021 #cutout SODA-sync cutout of ad:MACHO/cal054151r.fits.fz application/fits true
ivo://cadc.nrc.ca/MACHO?54151/cal054151r soda-8e48c445-8f76-4c01-abcf-bdb1c2f7caf5 #cutout SODA-async cutout of ad:MACHO/cal054151r.fits.fz application/fits true
pyvo-1.2.1/pyvo/dal/tests/data/datalink/datalink-obscore.xml000066400000000000000000000316621416757633600241040ustar00rootroot00000000000000 calibration level (0,1,2,3) publisher dataset identifier short name for the data colection telescope name instrument name internal dataset identifier type of product timestamp of date the data becomes publicly available RA of central coordinates DEC of central coordinates size of the region covered (~diameter of minimum bounding circle) region bounded by observation typical spatial resolution dimensions (number of pixels) along one spatial axis name of intended target dimensions (number of pixels) along the other spatial axis start time of observation (MJD) end time of observation (MJD) exposure time of observation typical temporal resolution dimensions (number of pixels) along the time axis start spectral coordinate value stop spectral coordinate value typical spectral resolution dimensions (number of pixels) along the energy axis dimensions (number of pixels) along the polarization axis UCD describing the spectral axis polarization states present in the data URL to download the data estimated size of the download UCD describing the observable axis (pixel values) format of the data file(s) primary key timestamp of last modification of the metadata
2 ivo://cadc.nrc.ca/MACHO?54150/cal054150r MACHO Mt. Stromlo Observatory 50 inch MACHO 54150 image 2008-10-08T00:00:00.000 88.81762854444203 -67.77109486072844 1.0245546113974644 polygon 89.70783791485876 -67.41840881752057 89.74786512306278 -68.14322955012662 88.22311503462467 -68.14813181576002 87.81208257298478 -67.77896886699358 87.82899304985233 -67.4197778334441 4.353822892 4181 macho000071 4200 50527.522581 50527.526053 300.0 300.0 7 5.800000000000001E-7 7.8E-7 5.799999999999999 7 https://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/caom2ops/datalink?runid=b7vdfnrcr8kq35a1&ID=ivo%3A%2F%2Fcadc.nrc.ca%2FMACHO%3F54150%2Fcal054150r phot.count application/x-votable+xml;content=datalink 00000000-0000-0000-93cf-fed05e0e60f6 2019-11-20T19:29:40.929
2 ivo://cadc.nrc.ca/MACHO?54151/cal054151b MACHO Mt. Stromlo Observatory 50 inch MACHO 54151 image 2008-10-08T00:00:00.000 79.9564431173079 -70.32295142824165 1.0420934836421956 polygon 81.03835269676311 -69.95434045997953 81.07118698080274 -70.68523150491481 78.84035765138141 -70.68806135194416 78.88155357298983 -69.9513684574919 5.020573004 4175 macho000006 4168 50527.527002 50527.530475 300.0 300.0 8 4.800000000000001E-7 5.800000000000001E-7 5.799999999999999 8 https://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/caom2ops/datalink?runid=b7vdfnrcr8kq35a1&ID=ivo%3A%2F%2Fcadc.nrc.ca%2FMACHO%3F54151%2Fcal054151b phot.count application/x-votable+xml;content=datalink 00000000-0000-0000-b8fb-fed05e2e4e02 2019-11-20T19:29:40.960
2 ivo://cadc.nrc.ca/MACHO?54151/cal054151r MACHO Mt. Stromlo Observatory 50 inch MACHO 54151 image 2008-10-08T00:00:00.000 80.01859124602015 -70.30750032450052 1.0248990302163568 polygon 81.01558843560966 -69.95461093880266 81.06567094624911 -70.67927922356017 79.34988020864029 -70.684376201833 78.89013903241694 -70.31495449099631 78.91029632344201 -69.95565099163903 5.020573004 4181 macho000006 4169 50527.527002 50527.530475 300.0 300.0 7 5.800000000000001E-7 7.8E-7 5.799999999999999 7 https://www.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/caom2ops/datalink?runid=b7vdfnrcr8kq35a1&ID=ivo%3A%2F%2Fcadc.nrc.ca%2FMACHO%3F54151%2Fcal054151r phot.count application/x-votable+xml;content=datalink 00000000-0000-0000-b83a-fed05e27f58e 2019-11-20T19:29:40.960
pyvo-1.2.1/pyvo/dal/tests/data/datalink/datalink-ssa.xml000066400000000000000000000516031416757633600232330ustar00rootroot00000000000000 Spectra from the Flash and Heros Echelle spectrographs developed at Landessternwarte Heidelberg and mounted at La Silla and various other observatories. The data mostly contains spectra of OB stars. Heros was the name of the instrument after Flash got a second channel in 1995. This resource contains data associated with the publication 1996A&A...312..539S. For advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/flashheros.data SSAP Exactly 30 rows were returned. This means your query probably reached the match limit. Increase MAXREC. A measure of how closely the record matches your query. Higher numbers mean better matches. Observed position RA and Dec as a 2-real array as required by SSAP. Target RA and Dec as a 2-real array as required by SSAP. URL of a preview for the dataset, where available. Access key for the data MIME type of the file served Size of the data in bytes Title or the dataset (usually, spectrum) Dataset identifier assigned by the creator Dataset identifier assigned by the publisher Processing/Creation date Date last published. Bandpass (i.e., rough spectral location) of this dataset; use something generic like 'Optical' here. Creator assigned version for this dataset (will be incremented when this particular item is changed). Common name of object observed. Object class (star, QSO,...; use Simbad object classification http://simbad.u-strasbg.fr/simbad/sim-display?data=otypes if at all possible) Redshift of target object Equatorial (ICRS) position of the target object. Signal-to-noise ratio estimated for this dataset ICRS location of aperture center Angular diameter of aperture Midpoint of exposure Exposure duration Midpoint of region covered in this dataset Width of the spectrum Lower value of spectral coordinate Upper value of spectral coordinate Number of points in the spectrum Local observation key (used to connect to single orders). Type of flux calibration Data model name and version System RA and Dec are given in Time conversion factor in Osuna-Salgado convention. Spectral conversion factor in Osuna-Salgado convention UCD of the spectral column Unit of the spectral column Flux/magnitude conversion factor in Osuna-Salgado convention UCD of the flux column Unit of the flux column Type of data (spectrum, time series, etc) Publisher of the datasets included here. Creator of the datasets included here. IOVA id of the originating data collection Instrument or code used to produce these datasets Method of generation for the data. Process used to produce the data URL or bibcode of a publication describing this data. Statistical error in flux Systematic error in flux Type of flux calibration Bin size in wavelength Statistical error in wavelength Systematic error in wavelength Type of wavelength calibration Resolution on the spectral axis Statistical error in position Type of calibration in spatial coordinates Spatial resolution of data
0.0 304.446675349555 38.0329313131891 304.446675349555 38.0329313131891 NaN NaN http://dc.zah.uni-heidelberg.de/getproduct/flashheros/data/ca90/f0011.mt?preview=True http://dc.zah.uni-heidelberg.de/getproduct/flashheros/data/ca90/f0011.mt image/fits 100800 Flash/Heros p Cyg 1990-10-11 09:28:07.500003 ivo://org.gavo.dc/~?flashheros/data/ca90/f0011.mt 1993-05-18T00:00:00 2017-02-22T13:19:40.966036 p Cyg star NaN NaN NaN NaN 304.446675349555 38.0329313131891 17.6 48175.39453125 NaN 5.40127e-07 2.78147e-07 4.01053e-07 6.792e-07 23181 ca90/f0011.mt NORMALIZED
The pubisher DID of the dataset of interest Recalibrate the spectrum. Right now, the only recalibration supported is max(flux)=1 ('RELATIVE'). Spectral cutout interval MIME type of the output format
pyvo-1.2.1/pyvo/dal/tests/data/datalink/datalink.xml000066400000000000000000000133651416757633600224520ustar00rootroot00000000000000 Data links for data sets. Publisher data set id; this is an identifier for the dataset in question and can be used to retrieve the data. URL to retrieve the data or access the service. Identifier for the type of service if accessURL refers to a service. If accessURL is empty, this column gives the reason why. More information on this link What kind of data is linked here? Standard identifiers here include science, calibration, preview, info, auxiliary MIME type for the data returned. Size of the resource at access_url
ivo://org.gavo.dc/~?flashheros/data/ca90/f0011.mt http://dc.zah.uni-heidelberg.de/flashheros/q/echdl/dlmeta?ID=ivo%3A%2F%2Forg.gavo.dc%2F%7E%3Fflashheros%2Fdata_raw%2Fca90%2Fn0011.mt Split Echelle Orders #progenitor application/x-votable+xml;content=datalink -1
ivo://org.gavo.dc/~?flashheros/data/ca90/f0011.mt ndndtdihpgea #proc -1
ivo://org.gavo.dc/~?flashheros/data/ca90/f0011.mt http://dc.zah.uni-heidelberg.de/getproduct/flashheros/data/ca90/f0011.mt The full dataset. #this image/fits 100800
ivo://org.gavo.dc/~?flashheros/data/ca90/f0011.mt http://dc.zah.uni-heidelberg.de/getproduct/flashheros/data/ca90/f0011.mt?preview=True A preview for the dataset. #preview image/png -1
The pubisher DID of the dataset of interest Recalibrate the spectrum. Right now, the only recalibration supported is max(flux)=1 ('RELATIVE'). Spectral cutout interval MIME type of the output format
pyvo-1.2.1/pyvo/dal/tests/data/datalink/proc.xml000066400000000000000000000167351416757633600216320ustar00rootroot00000000000000 Data links for data sets. Publisher data set id; this is an identifier for the dataset in question and can be used to retrieve the data. URL to retrieve the data or access the service. Identifier for the type of service if accessURL refers to a service. If accessURL is empty, this column gives the reason why. More information on this link What kind of data is linked here? Standard identifiers here include science, calibration, preview, info, auxiliary Media type for the data returned. Size of the resource at access_url
ivo://org.gavo.dc/~?bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz procsvc An interactive service on this dataset. #proc -1
ivo://org.gavo.dc/~?bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz http://dc.zah.uni-heidelberg.de/getproduct/bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz The full dataset. #this image/fits 68708160
ivo://org.gavo.dc/~?bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz http://dc.zah.uni-heidelberg.de/getproduct/bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz?preview=True A preview for the dataset. #preview-image image/jpeg -1
ivo://org.gavo.dc/s/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz http://dc.zah.uni-heidelberg.de/wider.dat An artificial thing. #preview image/jpeg -1
An interactive service on this dataset. The pubisher DID of the dataset of interest The latitude coordinate The longitude coordinate Factor to scale the image down before transporting (this does not currently take into account cutout parameters). Region to (approximately) cut out, as Circle, Region, or Polygon A polygon (as a flattened array of ra, dec pairs) that should be covered by the cutout. A circle (as a flattened array of ra, dec, radius) that should be covered by the cutout. Pixel coordinate along axis 1 Pixel coordinate along axis 2 Set to HEADER to retrieve just the primary header, leave empty for data.
pyvo-1.2.1/pyvo/dal/tests/data/datalink/proc_inf.xml000066400000000000000000000161561416757633600224630ustar00rootroot00000000000000 Data links for data sets. Publisher data set id; this is an identifier for the dataset in question and can be used to retrieve the data. URL to retrieve the data or access the service. Identifier for the type of service if accessURL refers to a service. If accessURL is empty, this column gives the reason why. More information on this link What kind of data is linked here? Standard identifiers here include science, calibration, preview, info, auxiliary Media type for the data returned. Size of the resource at access_url
ivo://org.gavo.dc/~?bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz procsvc An interactive service on this dataset. #proc -1
ivo://org.gavo.dc/~?bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz http://dc.zah.uni-heidelberg.de/getproduct/bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz The full dataset. #this image/fits 68708160
ivo://org.gavo.dc/~?bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz http://dc.zah.uni-heidelberg.de/getproduct/bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz?preview=True A preview for the dataset. #preview image/jpeg -1
An interactive service on this dataset. The pubisher DID of the dataset of interest The latitude coordinate The longitude coordinate Factor to scale the image down before transporting (this does not currently take into account cutout parameters). Region to (approximately) cut out, as Circle, Region, or Polygon A polygon (as a flattened array of ra, dec pairs) that should be covered by the cutout. A circle (as a flattened array of ra, dec, radius) that should be covered by the cutout. Pixel coordinate along axis 1 Pixel coordinate along axis 2 Set to HEADER to retrieve just the primary header, leave empty for data.
pyvo-1.2.1/pyvo/dal/tests/data/datalink/proc_units.xml000066400000000000000000000161601416757633600230440ustar00rootroot00000000000000 Data links for data sets. Publisher data set id; this is an identifier for the dataset in question and can be used to retrieve the data. URL to retrieve the data or access the service. Identifier for the type of service if accessURL refers to a service. If accessURL is empty, this column gives the reason why. More information on this link What kind of data is linked here? Standard identifiers here include science, calibration, preview, info, auxiliary Media type for the data returned. Size of the resource at access_url
ivo://org.gavo.dc/~?bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz procsvc An interactive service on this dataset. #proc -1
ivo://org.gavo.dc/~?bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz http://dc.zah.uni-heidelberg.de/getproduct/bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz The full dataset. #this image/fits 68708160
ivo://org.gavo.dc/~?bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz http://dc.zah.uni-heidelberg.de/getproduct/bgds/data/gds_big/v6a/2010/GDS_0644-0035/i_s/eq010000ms/20100927.comb_avg.0001.fits.fz?preview=True A preview for the dataset. #preview image/jpeg -1
An interactive service on this dataset. The pubisher DID of the dataset of interest The latitude coordinate The longitude coordinate Factor to scale the image down before transporting (this does not currently take into account cutout parameters). Region to (approximately) cut out, as Circle, Region, or Polygon A polygon (as a flattened array of ra, dec pairs) that should be covered by the cutout. A circle (as a flattened array of ra, dec, radius) that should be covered by the cutout. Pixel coordinate along axis 1 Pixel coordinate along axis 2 Set to HEADER to retrieve just the primary header, leave empty for data.
pyvo-1.2.1/pyvo/dal/tests/data/mimetype/000077500000000000000000000000001416757633600201735ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/tests/data/mimetype/ivoa_logo.jpg000066400000000000000000000304551416757633600226620ustar00rootroot00000000000000ÿØÿàJFIFHHÿá€ExifMM*JR(‡iZHH î ÿÛC     ÿÛC  ÿÀî"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýü¢Š(¢Š(¢Š(¢Š(¢“ò¯3ñŸÆŸ„_áwñ×ÄïxH¯TÕµÛ{yÑÃô®¦Ñ_ë¿ðQoÙCH’Hì<}ªxÂTÎWÃ~¾½SI ŸŽì{Õm?㯊¿hiÚ—Ã+Oü,øi|…å×õ[ƒ\Õ“8Ùe .-¡=~Òùsÿ,Ð}ñn-+´$ÓØúSÇ|à=v= RÔ®õÌ›íü9¡Z=þ¥"žŒaˆÓI6'ûUæ³|TøÏ®È[ÿ|/à»~KŸë†æèŽÄÚÙ+"ý À5•á/hÞÐdÓü7¡gC4¦[¹v¼—r²Ï3æI¤=K»k´XfUùâ•yg,ïû@ßÈKüZð.‘œ–y6ûn–øä~«FÚçö„°£ñßÂï‘ÒCÂW6‡§™ܘ>ûÒºøxQêEiÅ×ò F/‹¾;ðñfø‰ð—VNA™5Ÿ_ rÝGvk}‘]¨ÿv1ë^¹áxGÇÞσ¼A¦ø‡MÜQå´˜1…ÇXä_½ƒº8 ;ŠÉµêǽp¾(øW£øƒÅGźý瀾#$[ ñNŒŠ³È";¨îï!Î3 ‘ü,‡š÷ª+âoþ×¶_üG£øKöðO4ízõ$6^"ð–….¥¢êÉ3,[Í ˜ ½»«2vg\1Ýð÷íßû(øŠö;Qñ‡AðåëþâkkÆ}~Õ/ëNÎ×Õì}yEsžñ…<]¤­ÿ…|MáïY0ÈŸJÔbºŒ]ѱÑæ¥1…QLŠ( Š( Š( Š( Š+Ä"Ð|)á-C_ñ6±¦øB±„Íy¨ê7)½º¬ò9 £êhj©ßj6^‘s¨jw¶šu…ºžêêUŠ(”ufv =I¯…¼KûZø«ÆúMÜÿ³Ï„ô4ð\LR‹Ÿ/Eð¬x8-j­¶{ÿcXÏ÷ȯ†> øëö_Õ¼@º§íñÿâ¯í®ÆÛ…ü'lúg„íÜíHcxâuÍ3±š¸SœÝ¢®DêF*òv>îø‰ÿý¼âvðǃ5mgã‡ÎV=áí‰ÔÎðq†t£èÌxé^=wñËþ ñ|_ gÝà–‰'1jž2”Oxªz6ÙŒh§ØE'ã_9YÁ@´‡:h³çìÉðëᾓòã–îeW`;¼V±¦ãõ˜ýMy÷ˆà µ¼Çìž.ðÏ„¢‘rEðä%—“Ñî ¦½ YV&ZòÛÔâži†Ú¿¡õ×ìIûX|X„·Ç?Ú¿T6ÒÓiZ4·-l=„P5¤_š·Ô×Wàÿø%oÀíqq¯x§Ç"¾cºimÒÖÄH}Ù"iOã!>õù›¨þÒ´½i+jß¾&L¬ã‹Me¬GÓâ1\gü%¿Œ{nEiBÿÃâÆb§?ˆê¸©(裖9%méðH%yÿëÕ¨íÒL´M´ŽªÕ…T »Ho½ìFükN'ò£õ,3÷G`GjÒ„ÉV[¾kJ&_—š¤²1£ž óž¿Z1¸ä•#‚Zæ¾%ü6ð¯Å¿ƒš‚¼]jÓé·@IÄ'mÅÂóÄ/ü¡äüƒH?—q~É¿iHï[~ø¡ñï@ÖŧÃÿÚ?Ä·:U´;æ´ñlpx’Ò=©’$˜¸QŸ—ýnG¥~ò€Ïê+ľ"þÎÿ ¾&Kq{®x^ßNñ ¨Wþ ¾Ã¨ŒúÍ<ÁþÌÔ÷½ftg¥z)ù­çÔËkA~â³^OT|1á¯Ûë⧆V~,ü±ñ^žYu¿‡š–f}ãau†õ8I›Ú¾Çø_ûY|øµªA¤xkÇúvŸâ·á¼3âm+VFþïÙ®6»tÜ=ëáÏŠÿ³OþØ®£k4¿ünÊeÔ­-vêztJX–¹·A‰cPy–@1€ WË%Ñ<=ãu2kÚV•¯ØJD¶’\F Õ)̽ˆd#Ø×u<› ‹ƒž§ÉÿW8gœâp³PÄÓù¯êß‘ý  #½-~ø'âÇÏ‚ºr|<øqã?y[›Áß&’úÚ4É-ïAûLt dAÇ÷çÁŸÛsá¿ÄZøCÇ7ßþ$ÎÁ-ô_ΟeÔŸþœoGî®2z&VOö+ÆÆeØŒ+ýätïÐö0y–¿w-{u>Ò¢ŽãëK\'xQERäK_~Ú_µþû4ü*·ÒtH¬µï‹ºü/ÿî“)&+HÇÊ×× r!CÀ^ òâ!¤ÛInÅ)(«³¦ý©¿l¿…¿²Ïc>#™¼IãýB3ý…àý6Po/ I'_&zÈÃýÐÇŠü(ø™ûXüJøÉã˜|KãH4Ýnâ DÚF‰¨Aæè:U Óؘîg_ùø»ó9éq_2ëºÎ³â¿‰:׌üY¬j(ñŽ­pfÔõFO2yØö¢ 訸U8¨”·îϰ¯¥ÁäÐIJ®¯±óø¬ÚoJzyωü_âÿˆ>&MOÇ>(×<[} êצeAábîD£ XÕ@ì+²øWðËYø«ã½sCðûÆ×zg†ïõ™¾KXKìéÕÛjväñä_ ßþµúû&þ×Z—Ã]WÄñ—àxü=…¯åÓ®-¼=oiw%ä1yE$±*™VB¥H|’Hæ½*êt©?cÎ¥(T©z¬øF5Iô¸”œçqÿ Öh_Ì4%U?½_Os_^øà÷ÇÛsâž(G‚¼á8.ÏÛøv>Ì?ñÇ pªÉy èImªxgŠýIøQÿÿøðêÞÞûÄŸüN 5*ËnwŽÐ~å¦U›ý£\ÕójT•·}—ù42ÉÕ×eçþGá†|)âÏíÓüá?øÊìÊwG¡iS^í๢R«ß©õ×ìÿû?üPð§íÉðïRø‘àMGÂv6Ú}þµg§, , G±‰Šmk Fð9 ~üiÚf¤i0ØiVzeŒJ+{X(ÐÁTÐWÈæ3Á@cŽiJGgðÝZ5Á<Ϩ8b?ïÊW‹‰ÍëVƒ…’Lõ0ùERS½Ú5ãšAùçŽ-¦6eWõ'Ð(?4¨÷­;y¨™‰eþþ/¡õÏFU ÂÅZá>é ÏjцFaç3•þø#ïøÓµtVóf_1Á89ÀèǶ*ìsï·ØÜƒÞ¹ô™d*«Ÿ)³·oU>õufp£ø@(ØÇû=ª·Ú1È#=¨!½ñGì…à WTfm]tµ³Ô™ºµÍ³5´äÿÛHž½j¼?ö~_/àn­¶è#ñ¯ˆD8þ×»8À’+Ü(È>¾¸¯ËÚá&ŸðÃâî‰â_ éöñxÆïkw¥*m‹MÔÊ4»áÇú¸çD•Š”H„Œy„Wêq`’xñíŸâ½&OxOáý¬ö·(¼Ö ÖD&@ ¥©bfoîï¤*Þ.ØÈVÇ¡”Õ©O¯ð<ìÚŒ*a&§Ñ_æ|¨Ác©ës:äFñâ4‚cŒ…ãå= ex“ú~©ðöÛÃþ#Ñíu-:íÚYm®áÞŒF#чPG# ‚*’Ú]&«¼±¼S»ƒÜ“Ú½ë[ñÿ®þXx]¼ºµ¦§.n¿´%-yQ¨™IêX‚6”mÏzý"¬¶N<ÉèÏÎ)Åjù¬Ö¨ç>~ÐÿgÍ:ÞßQ›[øÇð^Do¥ÝNgñƒ96“9Íä?儇Ì|®~í~³|;ø‘à¯Šß ´¿xÄ$ðÍú“å³ýÖ4r)ÃG"žSÁøõf!ð݇Ø$7àÍ&3Ó#éÞ°ü'â_üø™ÅO…ÑIz/¥-ã‰Dvž$·^ ±ƒòÅ~ƒ%%çÆÇÈ ×Ëæ¼>¬êa×Ëü©Ê¸ÝSÄ?Ÿùÿ™ûµEyßÂÏŠ> øÇð7Cø…à=Pj¾Ôâ&'d),2)+$2¡å%ÁFSЃ^‰_}yçÿ>$xsáìñã‰>,œÛèÓ$¾ºÚ~iv–$õwb¨£»0¯ä¯âWįüaø÷⟊7¸3x›_»2ËrÑÙ@¼AizGaF:Ìyc_²ÿðW_ˆói_³ÇÃ…“´cÅ:亖¦‹üvÖ ¬ˆÞÆyboûg_…ÖÃ|9-À›ò¯{'Ã^õ_¢øcàÚS^ÐþxÍ ¾˜,´ •ŠÞY rŠÄ @\ÙõX6}¥|z3¥7­O´¡V ¥:¾Gøý¤Â5ñÿ® wðóèÏáí~èKµtà×)5­Ä™yždNßÂeBp ‘õÅV¼³µÔ4«›Ûk{Ë;ˆš)àž1$r£ 2²žH8 ðk#cã˜.“ûJÙRÔ¼rß1ÎÒ·P;Uä7SiŠò³ ŽO•Ÿå#·â;Uíwà§‹<0¹øMwm¬øn,2ø;W¸òžÕs’¶W„1Tþì3ƒ¢¼kÅyÌ>2Ò,|LÚ7‹WPø}¬N Gcâ˜~Æd9ʈ¥$Ã7#þYHÔé±ÉWK33J’¯ÌayëïÁæ´"iä’KiŒ`>F¯„¼E¹c®kmâ½CRÕ¼e¨j.u­FþM÷ Æã€‚TPG ¯Oø/ã+O‡ß4³qáÏë6&h&wöÅ®`Y¤R7Ý…*˜nGQU¾2|VÓ¼kñw_œxcÂöz,7Ò¤Ööæ+™ÑX#É»¶3Ðu¯k.ÁG]ƺ·ÄÏž&—4ç­þ¼ŽÃú¤±G4÷ª/líbÈIHcÀÁíS[i‘j×±¶—9vwÌI÷××µkö-kL¶Ó<ºŸŒ5)äß>Ÿ¢XË:vUc ²¯üŠì¿á\øËÂ:rk?/<-ðcN´“ÅâçS˜ž¿gÓlËË+c±t>¢½ÙŽÅ5é»8¨åØšß ®Ëñ9ûMíõË‹µ˜ZÇP´µU›<ëšã|k¯ë^3Õì|%ðÎ?°ßK ®¥¯I…†ÊÜýé­Ôó$­ÈŒýÒ~`XŽöÇGÓ|Y«ê2ikwñi6mysâoÛÃç”FUßo¦¦`µa‰g3Ì:„dSÒ4ÅÒu²¾[ÄñÈ×RÊò´3u24ŒIv'bI54ëTÄ-,zßâûº~c­Jž¯4º[á_>¿‘Ùþξ7µýš?l]ÃV’IcðsÇ—PhÚµ´²“•­í k| è.Hòf=ÜÆÇœçö˜Œ×áŒü;oñà·‹ôÇf‡T¸Ó_É‘8e¸<3)ìé"£¥~¸þÎ¥øµûü)ø‰wígÖòê v»Eò®á*H+ä8‡>!J+I~}O¬áÌ|«áÜfîã×Ë¡øéÿ€3¯íqðCw™öVðŽ¢#ÏÝßö¨7cßJü¦°IT ÿZýÔÿ‚»ü7»Ö?g…ÿ4ûi'o ëï§j~Z–+m¨*¢±Ça6ô#îzóøÖŒ^ñjÇ áŸB±KͤÎw¯^Lã­zʤ{žc‹±½ä±™ÙŠ9RIÉÁÈÖíž©k½•–aªêƦ+k+všW c„PIéØUÈü#¯F·PÂ/â÷fã#H™FÈꧨÍniv>0Ñ&±ÕtMǺF¥nì±ÜØÇuéžrÔ÷«ubôLÁAö=oâìçñáï~ø—Tð‰åÓ|I£CTi2˜ôÉMÌ‹äOòâ6ò„O‡Áù¥z—Á/ÛwãÁ›ø<=öûˆ¾ ‚&Äs9šÚ<à%½ØÌ‘¨èÄŠ;\ÏÄßß~#|8øqá­KþâØhž[-Mk°5IÌÒ1šp÷­åùi—þéõ¯š¯ü&{[@ñŒ?é™ÉÑeuûÙêâ¹cB5©þý+n¤¨Îô[?t¾ÁDþxÖXì[­*ú;˜ü 6"¿–;/øŠãÄðÒµWäi·nçï ­XÓ<1ñ CñÊj:>㟠êû~“ Õ¤¹ºùí$së^el’›»½NúyÌÕ½¤>ãú³Ü7c<Õ OJÓ5­}7XÓìu]:a‰­o Y¢z20 þ"¿ŸoþÐÿµ®‡®_Ùé?>#]Z¤25”öˆ58ò¼ª³M”‚=$Þ¾çøGûRüeñ‡‡¤Óõ}GÀþ:°Ô4=gÃ7–O0S†žÞdŸl°“™cÊg  àŸ/€«CYY¯#ÓÃc©ÖÑhüÏ®/ÿfÿ†r÷>‡Ä.ß;ŸÂº´¶pœúÛÖçñŠ¹ë¿‚ŸlÕÓÃÿ­¯í¶m[ox^)Éî?yk%¾¾ÓÖ¹ëá¶ó/~xTPáIÓ¼c,,}öËgÿ}VüüVmÒ[¯ƒ òÉÚÏiâ->Eþ$dþUÂv£ÀßôØ¥It?…¾&ˆ‘·ìºõÝ‹ñßkÛÈ~7÷ëLkŒ1X<7¿¯n°(4¯XH¾ø´^Ý}+¤´dȪfø;ñ; H´¹öø*uý¢·Ä®>üZ ÆdÒÀ뎿mý(:§mmPKðKâbιŽ}*`ôÛz?zl~&ñr^y­ðSâëHF~ǧã§'?lÁõú×]ÿ |ò¬p|øœ]€+ç\iQƒžŸòøi¯ñÏÆR<‘ÙüÖÄ©ÕoKÅVqË& ùFšT…¥R‹È€1#Ì÷Ü_þÙ~?“Ľ—‡~hÚ–ž«ëgÅ3O§ËrÌGÙ£’+"$eÇÎêLjx/œãÌöÃý¤u}_R¶_ø;Â6ÖQ;ÜHú5ýô¨F@AºH•˜¶OS^–ŠrS§»Ûõ<Üf3 Ë*u%ëkþ‡;ì[û@êwÙ¤…ú ,±«<úåÕÃQÓ lÞ$õçJõ-;ö'øqáÛk]wâ߆4M’ ®æÑü94ò\0P ³Íp«ÂñœòHɯ³øçûQøÚ-Auø—Bû:ù¿gÐü/šNœæ5y"’@Ýò¢·|Wwˆ|o-¯ŒµŠZ䚀’Þ«êW÷–ñ…SûÃ6ÀK }Üc5ïBŽgQ{ÕT¯$x2¯–Sw&þÿÕŸSø‹áìÙàëŒüOý¤µ)µ8“Ë’ÊÃU±´™€øSáÒvG¦ø/OLƒÓí2‚A÷Ž8ÏÒ¼ÑÓIMLEÓêíÍÞ¹q+\^Nç“æÍ!gqõ9xV]úèi«Ú·Í.—|-o)Vå¢|:÷äϯ)ÿÂG¯ÐcRÿÀ†ÿ?á#×ÿè1©àCxÏɺo¬õ]6ëN¾ðô)E·Š|!ªáoôyýËH[¬s.QÔ‚r+Ó(kþ=þƒ:—þ7øÑÿ ½ÿAKÿükŠÚÿ„_ÿ Æ¥ÿ þ4ÂG¯ÿÐcRÿÀ†ÿá­¬ük⯎oàïßøWIK®©ss¬XÏrd-pЄA±íi$œç=«7[·ø‘ኚς5ßêÚÛxSû_Gº¶²¸µ·ÞŽui\”%A,¤3Á Kÿ„^ÿ Æ¥ÿ þ4ÂG¯ãÛ:–?ëá¿Æ¸‡žø£ñáÔzæ™âÿ†Ö‘Löº®—sáÛÏ´i—qàKo(}TCJ²ä04ýTÔWÖ<7â[(th“,:½ŒLÍÉŠæn^ÞU•º‚æF ïþ=þƒ:—þ7ø×)âý.×Ç~M/Å-w©C¢kI¾ÒñÜYʰJ¤8,ʉñÁ–× 8¾&hA?ws Eo­ÅŽFøÜ¬›Äßì±æ¦Òþ(x2öò]?Uñ^ÕJ†þÏñ*>™r¬3ÀIÂîàžP°ÖH,¬m<7xÓêR±[B¿jùÛv,p ‘‡¥?tdûè\çõ  wø· ji§l\ü‡ç|‚»¥¦­ûHþÛÚg„$Ô/µ/„ õhu_É,¥íõmyû9{:Û.&ŸÊSÎqú=^yð³á‡„~üÑ>ø&ÆK-NŒüóHd¸»™Éin'ó$Ò9gw<’}0+Ð袊(ç?ÿ³—‡>.^éÞ,Òu[ï‡th™thè¦æ<›{ˆÏËujÇïC'Ô©æ¾Ko‰Þ&øeã+~ÒZŸ€5»‰…¾‘ã+gðLj[ òîþ='n¿gŸiÏÝfúX¾ ðæâÏêñ>‹¥øƒB¿„Ã{§ê©<¡ê®Œ#ë@&‚ +) ¬¡•È`z{Š+’׿dß|5s¨þÌ~9‡GÑË¿ÃoI5î†ù$•´¹Ë\Øû*—ŒpW›KñÂ/ë‘è<â_ZÉ-/õÄèÿNúœY„ƒØKå··Zú'áGüžö±ÿb?ú_-Uø£ÿ'õ_ù'qÿéÆJä¼ñÂ^ý§›Åz¶¥<¾Ôüž™a>¡m<‹zîTIn޹ÚÊy<ƒÅ?_ñž…ãïÛ2}Âíª^hÖþŠÎ[»*æÑæúGòÇnm¿1Æp1@]OUø{ñ%¾$xnÒâþ6… ñfn¹mRÉ:M÷»·Š²&øú”+ìŸ|iñOá÷‡þ$ü3¾Ón¼SceöüM¶ÛW´—%”Ì?唘XŒÅ VÇ §Î ‚ t5CÂ^)Ô>ø¾ÿÊÓu]sá–«;]]Xipît+ÇlË<0/Í%´¤–’4Ë$™uR°ΧôsðÑüM$”A'6riF ß­öÿ+ìWSsæâ0ƒ© ƒ·æ¯uøià˜¾x?\ø›ñ6ïN´ñmæžfÕîžpm´ó"ÙD瑚I<Ù2ÝåÇ_²›üj_‰²ëÞ5U̵,Þ`ÊL`Üÿwæy~`_—8â¹ox²ûãˆìíÆ™ªè¿ téÖå-5Kv·¹ñÒ01I$ óGiÕ$¥}¬Êà ë:ÄωP|C×-ç±Ò­UÓÁš5Âí{+iöd?vêuÇÊyŠ"†i3ë_³º©?¤eÿá;eÝŽpº^žú á3–%¹'­Rð·‹õŸ…¼E¨®¨ø«ÀúõÂ^êúJ,šŽ™x°¤ 2DÄyðIQnT>b2àž2Ò4ïþÖÛÆV‘x–V¶Óô[-HyÖ¶>k;¿w½ä–Bd*X€p¸ªð­¾ÿЃà¯üÛÿñÚx¿ÅŸ³gêÚÅkV7ö¦M*ùµÍ,[C¯Û2`\ˆrv‰âHÏ á€Ê•5âÿkø«ÿE³Æ_ø(Ò¿ù£šûãV’K¦üh׿ÔPn¶RÑt絑Ç!eÛ«˜Éá¶0lƒš†ïD¿ø_ñßÀÅÍÍîx¼«Ü1fžm>g<µÌ*2¬y–!»–G­êÑÖþ.üø‘ð:O üN¾¹ðOˆoÛté ŸíZEôM•žÞdŒ†Úà6|,‘8–ò÷Ã/ªiÀú‹»2cÜ€>•ÓøgãoÁïJ±xcâ‡uk–8©¬ÅÀ>†'ep}Šæ¿F¶Ž}ú×–øÏàwÁ¯ˆ‚C㯅üW,ƒæ›SÐmæ—ð¦áøð¥3´!‘åhÈÈ`Ä‚=séQ÷ääýjKÏØGö|IÌžÒüsðÖL|§Áþ5Ôtè×é ÌbÿÇ1X²þÆÞ#°Ïü"ŸµGÇÍ)ÌqkiÚ¯±óíwÿ  j+™Ÿöjý¤ì@7í;áQAé¯ü0™¾­osè*£üý°­×ÿgSÅsáJØŸûâí¨³ÞßÞoÎïýæüë…? mP\ý—å=ËZk ü˜Ó×áí™'x“ödµÞMÕäÇàd_ç@¾÷þó~t„’rI&¹øû\ÝŒ\|aø¢ú›?^Ü‘ÿ/T~•~?Ùsã½úí¿ÚºîćOü;Óí&¦#ë@ –l²J08š©¨_ÚéÖ-y«_ZéÖ¨>iïgXQG»9Uxb›+æÆ?´'íâ°F¼Q— zålàŒþM]6ûþÌuäWš—Âû?ê1œ‹Ïj—zܤúŸµÉ ü…|õ«þÑÿ´M´ññB×õq÷tß ùšÅÛ˜Z,ŸÂ¥±ñçÅÿ0á_ìÙñ+R…þæ¯ã‰!ð͆;6Ù‹\2ÿ»Oµ~†økÁ> ðf˜,¼á/ xVÌ y>™ ¢cé]0÷ ôßÙãö“ñ¤@üGøÛ¢|/ÒŸïèß 4²÷Dͨކ ãŒÇ ŸB+Û~~Ê>x†?iÞ>%ñ ûÞ)ñmäšÎ¬ÇÔ\\—1ý#=«èÊ(ÂÉúÒÑEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEÿÙpyvo-1.2.1/pyvo/dal/tests/data/mimetype/test.fits000066400000000000000000000757001416757633600220520ustar00rootroot00000000000000SIMPLE = T / Standard FITS format BITPIX = 8 / NAXIS = 0 / no data in main file EXTEND = T / Extensions may exist FILENAME= 'swp06542llg' / original name of input file TELESCOP= 'IUE ' / International Ultraviolet Explorer ORIGIN = 'GODDARD ' / Tape writing location CAMERA = 3 / IUE camera number IMAGE = 6542 / IUE image sequence number APERTURE= '' / Aperture DISPERSN= 'LOW ' / IUE spectrograph dispersion DATE-OBS= 'nn/nn/nn' / Observation date (dd/mm/yy) DATE-PRO= 'nn/nn/nn' / Processing date (dd/mm/yy) DATE = '18-Feb-1993' / Date file was written (dd/mm/yy) RA = 0.000000 / Right Ascension in degrees DEC = 0.000000 / Declination in degrees EQUINOX = 1950.0 / Epoch for coordinates (years) THDA-RES= 0.000000 / THDA at time of read THDA-SPE= 0.000000 / THDA at end of exposure COMMENT * COMMENT * THE IUE VICAR HEADER COMMENT * COMMENT IUE-VICAR HEADER START 0001000100071204 1 2 013106542 1 C 1445* 4*IUESOC * * * 3600* * * * * * * * * * 2 C SWP6542, NGC 7027, 60 MIN, LG APER, LO DISP 3 C 4 C 5 C PROGRAM:NPBRB OBSERVER:BOHLIN DATE:1979.2609.260 17SEP 6 C 7 C 8 C 9 C 79260123556* 9 * 218 *OPSDEV14*112438 RDXSPREP 2 IMAGE 5614 * 10 C 091608 SCAN READLO SS 1 G3 58 *112511 SCAN READLO SS 1 G3 58 * 11 C 091623 X 56 Y 72 G1 99 HT 106 *112525 X 56 Y 72 G1 99 HT 106 * 12 C 093518 TLM,FES2ROM *114939 TLM,FES2ROM * 13 C 101100 FIN 3 T 3599 S 97 U 109 *120916 FESTRK TRACKING * 14 C 101150 MODE LWL *121950 FIN 3 T 3599 S 97 U 109 * 15 C 101239 TARGET FROM SWLA *122052 TARGET FROM SWLA * 16 C 101436 TARGET IN LWLA *122532 TARGET IN LWLA * 17 C 101542 EXPOBC 2 59 59 MAXG NOL *122642 EXPOBC 2 59 59 MAXG NOL * 18 C 101755 FESTRK TRACKING *122948 FESTRK TRACKING * 19 C 101919 TLM,SWPROM *123115 TLM,SWPROM * 20 C 101957 READPREP 3 IMAGE 6541 *123556 RDXSPREP 3 IMAGE 6542 * 21 C 102029 SCAN READLO SS 1 G3 44 *123631 SCAN READLO SS 1 G3 44 * 22 C 102045 X 60 Y 76 G1 82 HT 105 *123648 X 60 Y 76 G1 82 HT 105 * 23 C 104652 TLM,FES2ROM *123621 * 24 C 111319 MODE SWL *123646 * 25 C 111545 FIN 2 T 3599 S 98 U 109 *090650 ACQ STARTED * 26 C 111646 TARGET FROM LWLA *090952 TARGET IN SWLA * 27 C 111841 TARGET IN SWLA *091005 FES 761 IN 20 0 0 * 28 C 111953 EXPOBC 3 59 59 MAXG NOL *091059 EXPOBC 3 59 59 MAXG NOL * 29 C 112211 FESTRK TRACKING *091257 FESTRK TRACKING * 30 C 112328 TLM,LWRROM *091415 TLM,LWRROM .200000E 02 * 31 C 112412 MODE LWH *091534 READPREP 2 IMAGE 5613 * 32 C 33 C 34 C 35 C NPBRB*1*02*BOHLIN * 7* *N*00007027*0*0*1* 70 36 C 21 5 94+42 2 3*999* 0*0*99.0*99.00* 0.0 * 0* 120.00* 0* 37 C ' i cf@fh= %cc 38 C 39 C ?4 3 t ] D " 4 3c3D3 4 40 C 41 C 42 C 8 r 4 M , i ) K n c D H 43 C 44 C 45 C 46 C 47 C 48 C 49 C 50 C 0 0 0 0 0 020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 51 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 04040 51 C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 52 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 020 0 04040 52 C 0 0 020 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 04040 53 C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 080 0 0 0 0 0 0 0 0 0 54 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 04040 54 C 2 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 55 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 04040 55 C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 020 0 0 0 0 0 0 0 0 0 0 0 56 0 0 0 0 020 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 04040 56 C 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 020 0 0 0 0 0a0 0 0 0 8 0 0 0 57 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 04040 57 C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 58 0 0 020 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 04040 58 C 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 080 0 2 0 0 0 0 080 0 59 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 080 0 0 0 0 0 0 0 0 0 0 0 04040 59 C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 020 0 0 0 0 0 0 0 0 0 60 0 0 0 0 0 0 0 080 0 820 0 030 0 0 0 0 0 0 0 0 8 0 0 0 08030 04040 60 C 0 0 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 8 0 0 0 0 61 0 0 0 0 0 020 0 0 0 0 0 0 020 0 0 0 0 0 0 0 0 020 080 0 0 0 04040 61 C 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 2 0 0 8 030 0 0 0 0 62 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 0 0 0 0 0 0 0 8 0 0 04040 62 C 222 0 0 2 0 0 0 2 280 0 0 0 0 0 0 8 0 0 0 0 2 0 0 0 0 0 0 0 0 020 63 0 0 0 0 028 0 0 0 0 0 0 0 0 0 0 0 020 0 0 080 020 0 0 0 0 0204040 63 C 0 0 0 0 0 028 8 0 0 0 0 0 0 0 0 0 0 0 0 0 8 2 020a0 0 0 0 0 0 2 0 64 2 0 0 0 0 0 0 0 0 8 0a8 0 0 0 0 0 0 020 0 0 02020 0 0 0 0 0 04040 64 C 0 0 0 c 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 0 028 0 8 0 0 2 0 0282020 0 65 0 2 0 8 0 020 0 0 0 0 0 0 0 0 0 2 0c0 03020 020 080 0 0 0 2 04040 65 C 80 0 2 0 0 0 0 0 08020 0 a 0 0 0 2 0 0 080 0 020 8 0 0 0 0 0 0 0 0 66 0 080 0 0 0 080 0 0 0 c 0 0 080 0 0 8 0 0 8 0 8 0 0 8 0 020 04040 66 C 80 0 8 0 018 0 020 0 0 0 0 0 0 0 0 080 0 8 0 020 0 8 0 0 0a0 2 0 8 67 0 0 0 080 0 0 0 8 0 2 0 030 0 0 0 0 0 0 0 020 020 8 8 0 8 0 04040 67 C 0 0 0 8 02080 8 0 0 0 0 0 0 0 0bffff0 0 0 0 0 2 0 2 0 0 0 0 0 0 2 68 0 0 0 0 3 0 0 0 082 2 c 0 0 02080 0 0 0 0 0 0 0 2 0 8a2 0 0 04040 68 C 0 c80 8 0 0 080 2 0 0 022 8 880 0 0 0 0 0 0 0 0 8 0 0 2 0 0 0 0 0 69 0 0 0 280 0 8 0 0 0c8 08020 0 0 0 0 0 0 0 0 088 0 0 0 0 8 0 04040 69 C 0 080 2 0 0 0 0 08280 8 0 2 8 0 0 2 2 3 020 020 0 0 0 0a0 2 a 0 0 70 a 0 0 0 2 8 08080 020a0 0 2202ffff0 0 0 0 0 0 0 0 0 0 0 080 04040 70 C 08222 c 0 2 0 0 0 0 282 0 080 020 0 0 0 a 280 0 0 2 0 080 0 820a2 71 22 020 020 0 8 020 8 020 0 0 2 0 8 0 080 2 280 08022 2 0 0 0 24040 71 C 2220 8 0 8 0 0 0 0 0 2 02080 8 2 0 0 0 2 0 020 082 0 0 0 0 02020 0 72 02088 0 0 082 82020 0 280 8 8 8 8 820 0 a8020 020 8 0 2 2 0 24040 72 C 0 2 0 8 0a2 0 088 0 0 0 2 2808020 0 220 0 2 0 0 0 8 0 a 0b0 0 0 b 73 280 0 0 0 0 0 0 0 2 0 020 080 0 0a080 8 0a0 0 8 0 2 0 fc0 0824040 73 C 0 880 02088 0 2 0 0 0 2 0 0aa82 0 280 0 0 880 08022 0 0 a 288 0 8 74 88 c 08a28 0 0 a 080 0 820 0 2808220 8a0 0 0 0208220 0 0 0 0 34040 74 C 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 75 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 04040 75 C c1af6fbcc 0 0 09d707b 0c6 e 03dc8 c32474e366a29253f47413320314d64 76 29 03d8af6 51a1c9090 05e7d8233122e2a19282e1d32 f18117da5abab 0 0 0 76 C ac30 0ff 0 439abbba0 0445aa4 4371f2a31342b1d1d2c2f151914161d502d37 77 70727e207b197a227b14259a1e92209420951e96 1 0 1b8e1 0 0e02ce0fa3540 77 C 7b 07b 072 07b7b7b7b7b 039 0 07f4c4541ae547c979951ceae9580808645 0 78 03a3234363a302f2f3335332b35bdad 6c1f6568282 0 1 08282404040404040 78 C 0 0 6c2f2568381 0 1 080803b3535343b35313036373633338977877945776b 79 796a7b2f7f7e7f7a7a34777d7f7e8e487f40404040404040404040404040404040 79 C 993837611019 e89 0cc 040404040404040404040404040404040404040404040 80 404040404040404040404040404040404040404040404040404040404040404040 80 C dfbffbe 0 0 0 07f374399 2 2fe66fb30 0 0 0 0 0 0d0 0 0 0 0 0 0 080 81 0 0 0 0 0 0 0 0 0 0 088 0 0 0 c 0 0 0 c 0 0 0 0 0 0 0ff 0 0 04040 81 C 4f1960 0 0 0 0 0ff 0 0 0ff 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 82 0 0 0ff 0 0 0ff 0 0 0 0 0 0 0ff 0 0 0ff 0 0 0 0 0 0 0 0 0 0 04040 82 C 83 C 84 C 85 C b2b 0 0 017 0 0 0 689a1e02ce0e1 0 021 0 016809e32 0 0dcc1f5a15e3b 86 b1dad9565668c969c92fc9 0 061415142 0 0404040 2 3 c d e404040404040 86 C c12 0 0 0 5 0 0 0 38a9ae02ce0e1 0 026 0 016809e32baab 6c1f2568381 87 0 1 07f807e7f7a7a3477 0 061414140 0 0404040 3 635 b c404040404040 87 C c1a 0 0 0 5 0 0 0 38999e02ce0e1 0 02b 0 016809e32bdad 6c1f6568282 88 0 1 082826b776a7b2f7e 0 061404141 0 0404040 2 432 b c404040404040 88 C c25 0 0 0 0 0 0 0 0899de02ce0e0 0 034 0 016809e32 0 0d8c5f2a0ab42 89 acdac579927eca7aca34c9 0 0714a4141 0 0404040 3 7 6 d e404040404040 89 C c30 0 0 0 a 0 0 01e89a1e02cdfe1 0 01b 0 012809e32 0 0d8c1f29f493f 90 addad581637cc97aca34c9 0 071424141 0 0404040 3 312 d e404040404040 90 C a f 0 0 016 0 0 01e8a96e02ce0e1 0 035 0 012809e4abdad 6c1f5568282 91 0 1 082826c796b7b307f 0 061404141 0 0404040 2 42f b c404040404040 91 C a14 0 0 0 0 0 0 019899ee02ce0e1 0 042 0 016809e4a 0 0d8c4f2a0ab3e 92 acdac679927fca7bc935c9 0 0714a4141 0 0404040 3 73b d e404040404040 92 C a1a 0 0 014 0 0 0238a9ce02cdfe1 0 042 0 016909e4abaab 6c1f2538381 93 0 1 080807ec97aca35c9 0 061514141 0 0404040 3 1 8 d e404040404040 93 C a20 0 0 0 a 0 0 0 5899be02cdfe1 0 034 0 016909e4abc6d 6c1f2528381 94 0 1 080807bc97bca35c9 0 061514141 0 0404040 3 122 d e404040404040 94 C a21 0ffffe2 0 0 02389a1e02ce0e0 0 042 0 012809e4a 0 0d8c1f2a0ce39 95 acdad481637bca7bca35c9 0 071424141 0 0404040 3 321 d e404040404040 95 C b e 0 0 028 0fffffb8a9ae02ce0e1 0 034 0 016809e52bdad 6c1f6568282 96 0 1 082826c796a7b307f 0 061404141 0 0404040 2 631 b c404040404040 96 C b14 0 0 01e 0 0 0 f8a98e02ce0e1 0 02d 0 010809e52baab 6c1f2568481 97 0 1 080807e7f7b7a3479 0 061414140 0 0404040 3 4 0 b c404040404040 97 C b19 0 0 02b 0 0 01089a0e02ce0e1 0 024 0 012809e32 0 0dcc4f6a1473f 98 b0daca768e6cc96ac930ca 0 06141514a 0 0404040 2 729 d e404040404040 98 C b24 0 0 0 d 0 0 019899ee02cdfe0 0 032 0 012809e32 0 0dcc1f5a15b3e 99 b1dad9565669c96aca30ca 0 061415142 0 0404040 2 327 d e404040404040 99 C b2a 0ffffef 0 0 023899be02cdfe1 0 02e 0 012909e32bf6f 6c1f6538282100 0 1 0828268c969ca2fca 0 061414151 0 0404040 2 1 7 d e404040404040100 CCOMMENT IUE-VICAR HEADER ENDED HISTORY IUE-LOG STARTED HISTORY *GEOMF 11:20Z SEP 21,'79 HCHISTORY ********* GEOM. & PHOTOM. CORRECTED IMAGE ********** CHISTORY PCF C/** DATA REC. 11 1 1 1 768 8448 5 3 6.1 5.0 2536 .00000 1PCHISTORY 0 1684 3374 6873 9091 10586 1PCHISTORY 14371 17745 21524 25105 28500 1PCHISTORY 11.000 11.000 11.000 11.000 11.000 11.000 1PCHISTORY 11.000 11.000 11.000 11.000 11.000 1PCHISTORY TUBE 3 SEC EHT 6.1 ITT EHT 5.0 WAVELENGTH 2536 DIFFUSER 0 1PCHISTORY C MODE : FACTOR .178E 00 1PCHISTORY *FICOR5 11:20Z SEP 21,'79 HCHISTORY ******** DATA FROM LARGE APERTURE ******** CHISTORY *EXTLOW 11:20Z SEP 21,'79 HCHISTORY @EXTLOW: OMEGA= 90.0, HBACK= 5, DISTANCE= 11.0 CHISTORY :HT=15, DC#= 1; ISN: 0 PSN 1 SIGS= .444 SIGL= .421CHISTORY B 1= -.283235346667D 03 B 2= .376096600120D 00 B 3= .000000000000D 00CHISTORY A 1= .964207510446D 03 A 2= -.466539532721D 00 A 3= .000000000000D 00CHISTORY LINE SHIFT = .000 SAMPLE SHIFT = .000 CHISTORY *SMOOTH 11:20Z SEP 21,'79 HCHISTORY *ARCHIVE 11:20Z SEP 21,'79 HCHISTORY *ITOE 11:20Z SEP 21,'79 HCHISTORY ***** FILE OF MERGED EXTRACTED SPECTRA ***** CHISTORY *** GROSS, BACKGROUND, NET & ABSOL. CALIB. NET *** CHISTORY *ETOEM 11:20Z SEP 21,'79 HCHISTORY *ARCHIVE 11:20Z SEP 21,'79 HLHISTORY IUE-LOG FINISHED END XTENSION= 'BINTABLE' / Extension type BITPIX = 8 / binary data NAXIS = 2 / Number of Axes NAXIS1 = 7532 / width of table in bytes NAXIS2 = 1 / Number of entries in table PCOUNT = 0 / Number of parameters/group GCOUNT = 1 / Number of groups TFIELDS = 9 / Number of fields in each row EXTNAME = 'IUE MELO' / name of table (?) COMMENT IUE MELO file data containing G, B, N, A, & E vectors COMMENT Each row contains order number, npts, W0, deltaW, & vectors above TFORM1 = '1I ' / Count and data type of field 1 TTYPE1 = 'ORDER ' / spectral order (low dispersion = 1) TUNIT1 = ' ' / unitless TFORM2 = '1I ' / field 2 has one 2-byte integer TTYPE2 = 'NPTS ' / number of non-zero points in each vector TUNIT2 = ' ' / unitless TFORM3 = '1E ' / Count and data type of field 3 TTYPE3 = 'LAMBDA ' / 3rd field is starting wavelength TUNIT3 = 'ANGSTROM' / unit is angstrom TFORM4 = '1E ' / Count and Type of 4th field TTYPE4 = 'DELTAW ' / 4th field is wavelength increment TUNIT4 = 'ANGSTROM' / unit is angstrom TFORM5 = '376E ' / Count and Type of 5th field TTYPE5 = 'GROSS ' / 5th field is gross flux array TUNIT5 = 'FN ' / unit is IUE FN TFORM6 = '376E ' / Count and Type of 6th field TTYPE6 = 'BACK ' / 6th field is background flux array TUNIT6 = 'FN ' / unit is IUE FN TFORM7 = '376E ' / Count and Type of 7th field TTYPE7 = 'NET ' / 7th field is net flux array TUNIT7 = 'ERGS ' / unit is IUE FN TFORM8 = '376E ' / Count and Type of 8th field TTYPE8 = 'ABNET ' / absolutely calibrated net flux array TUNIT8 = 'ERGS ' / unit is ergs/cm2/sec/angstrom TFORM9 = '376E ' / Count and Type of 9th field TTYPE9 = 'EPSILONS' / 9th field is epsilons TUNIT9 = ' ' / unitless END xDz33@)³¿F–¬ÚFšD«F‡ÏœF‰XõF¦lZFˆ›yFœ£…F’leFŸtF†œÄF‡ F|³§FñÌFµDF†õF‰Â«F‹?FŠˆFŽ‘öFšæìFŠÜÏFBn†FArûF‘ ‚F•BpF‚jôF–ÝF¬ÕIF¯»·F\FˆhFœ²†F›}£FŠ` F|„ÈF‡ËF§•§F¦^F†”¦Fš’jFŒš}FˆD•F¤ÛF“yâF“vAFŠnÚFØ F’¶1F– ÎF“ñF™FØF°p³FŸc…F¥û‚FôFœËìF©aF£)\FŸŽ]F mF¡ë(F™_rF˜}fF™ÊFF¦É½F÷XF¦•ºF¬]F¸$FŽ£FŒåÿF·‹FÓÝEFÛ^¬G"GG¾íHZ\”H«ÉiHÀ'ÓH­¼×H‡ƒ-H W\GBÐWFÉE£F¶Ë‡F¦Ž£F²ÀÁFÃÏF³Ã|F¸ûŒFªÚêF¹5TF¦€WFž@îF«Y¸F ÀëF¡•F§>F˜})F˜äF¦"®F·°/F§ciFªC$F©ÄæF¬EÎF¨¼"F¨²#FªSåF±;F´wF©F¦’FºeF¨éšFŸ¤ðF¬ÏF¶OF½GF©¿FšvìF¢?ŽF¬¦F²S F·±AFµÏÅF¼˜"FÁ…F½aF¯D¦F¦%tFªµHF¨ú¯F¦X5F¤ÍóF°;ŸF«sF£X‚F¥ë®F«DWF¤³]F¬{F©_tF¹·PF³èF¬&°F¯¢¸F¹PFË%¯FÙÿ¥FßÒ FÍ'sFÀ4F¹NKF²ë¹F«åñF²Ê)F®ªZF­ÌïF¹ùøF²@F©h‘F¨B¶F¯¾F—4•F§F-F®ÂÊF´é¿F®@ÇF«z­FŸìäF›ìâF§ÿÛF§×œF¬²ÎF²9F¬&pFªÒœF³ŠœFÉwÿFÛ2FØ_ÌFÎ6%F¼F¯IÝF¨,ÅF Í‡F©{8Fµ¡QF®§ûF©šF¥ðßF­°‘F¹WõFºb(F½ûFÝü®FÙ_§F½fF­–BF¹ŒFÕA›G'àñGÈÕH.#HEJHZ­G ì÷G F³¯hF£HF«KFª=F¥^¾F°v‰F²ÑÐF¬»F­×F¯,|F¯˜ºFª„F Ú˜F£î±F¨8uF¬ÌF¼[DF»“÷F­c·F¯‹©F¸×žF¯@´F¦ áFª>/F°÷KF«%bF¯|²F¿ÖFè2G-üXGˆ­GŒµÓGK˜ÜFæûBFªgÞF£êF»TïFà¤ÎFÚºéF×›NFá?¡Fáÿ8F½JF§ÕÖF§×ÃF¢r4F¡üF§oF§F¤%¯F©¨F›`’Fˆ+'F‡F`'FxäæFˆ½rF‘;HFŠ_vF‰ÞÞF‘‰ÈF˜¨fF‘/FŠ£iF’›ÌF –ïFªoFªÿ¸F©áFÒ/Fƒ§F“+jF˜›mF¤å²F©†>F•22F´ )F©YÂF§ÚZF—åÀFª;ƒF›ä"FšxaFœEF¯ ßFšô_F¥¤IFìÙbFúÁeFËÈ6Fåa®FÞWˆFÆÌFŽFF‘ͳFx|°F FVF§…iFtBFŸž†F/F‘œ†F–@£F™²†FŸEzF¤’›F£ìöFªß¼F¡èF­¤®Fµ#ÝF¡Ñ3F”XÐF¦H9F»nFÁaF±‰—F–´îF‹·±F¤ógF³áñF¯À€F«ßèF›3F•åÕFªçEF·ÏF YŒF‹ŽF¹\‹F½ëöF¸#èF¹¨÷F¢TFœ±•F¢÷¡F¦ÞF­•F±ÂãF­FËÊF»-F®Ž¢F™]†F®ìyF©ŠæFžu&F”É(F—+¿Fž‹F¦ûF¥S·F«k Fž«fF£ZF·_¿F±hÈF©qyFªªÜF¬¦ÈF¨®!F§±`F¨ùÈF·ïEF®ˆTF­Ý†F¬¶RF£;‘F˜ï F—¨PF›Ð•F6F¨›F§|KF§™)Fª>NF®¥F­‚F—u•F…Ý÷FùFé$F¦½ÒFª“YFŸ÷ŽF§óÃF ÆËF¥fF­§ÍFœâ“F©ÞqF¹HFª¦UFœjhF’âF–¶×F¤ámF£žwF”¼çFœ9BF¤ùF¯%¯F«EÞFšM°F†‰„FˆF”–F˜ö0F£—bF°”nFª,-F ÑµF£Fªu¼F§¸`FœßÊF›ƒF£ËÖF£þ#F¢U÷F¥uJF£žZF¥ñHF¢y‡FØF¢ˆoF¬ ùF·ÿôF­—éFž#¥F—ÏÑF“}F¤êÞF´ŒÆF®èÜF &¹F­j’F¶¿ÎF¥¹{F—ÙkF“rF”SþF”lF“F}œF–›áF£8"F¨q@F¤¨ÄF«cSF¬ŸUF£ûF¡0LFß¼sFúk;F±‰¼FšššFæuF‘ F–^F—ÐéF¡‘ÐF¤™ÎFŸ\/FFÎF5—FmðFWÅeFP¯FržFzF”g_F“*ÒF~FŒ˜F‡Î’Fˆ|\F’¼F ¡èF¦XæF˜W©FÁ:F“IFœ ¹F™oKFmîÙFZ°Fcþ{FQPÎFx@F‘„ŽFŽÃÚF‡þ‹F‰ë@F¦iF›€ãF™ÕÇF•}F‹sâFŠ–ÃF“ö³F™Š¬FÍÓF’SöF “XF›àÒF“vYF™(=F˜g¸F”«ŒFž=F‹#F† ÔFVCF™kF¤×4F§öF£òUF‘ôrFˆºFˆG$F‘aÊFedF—‡¡F™¶âFwðF‹aGF‹“nF”d²F›9¦F‘|>F“†7F‹‹FˆyêF„J°F…=F‡½ÌFŒð™F‹ôF3F•F’ 0FŽ:ËF‘ÍúF•°F˜ƒøF”TÑFšµÏFœYF›uF—$~FÖ:F“¦¼FÓXF‚F‚#µF„Š?F­øFˆRF‘äôFeÐF‚F¤ FˆãFô“F²›FíF•ÁJFŽ$FŽT›FŒE"F›í]F lF™ÍéFÕAF‘…F„‹ÖFŠº,F£çwFÛÜF¸²ËECßÅ„z~DzBÀD´¢gÄ_ÔÐÄ&ôéEC9óÄßôDüÍÕD5ÀšEÊ]ÄAÉ´Ä,:ûÄÜ<D#Ù‰C¥¢)Ã̉øB¢WCÇ0CÇ0Dˆƒ¼E,ŸyD> ÅŽ ÅŸJDκõES'ð<ENE™n)E¡>Dy–%Ã5BE ÖRDîôäÃДÅ;ŸÄ&E45¨E"ú!ľÏáDlµ:Ä`Œ’Ľ*ØDò5ÜÃŽ‡ÃÇØÄÔ©ÆÄzððÄQ„ÃÅÚmÄg²pÃjÏ1C¬ÚE 2ECkÒDn¼ Ã•X5Ãè‚íDŒÈ¯C¦<ÂÞ6ŽBt?C‚ÄO–pÄuJüÄoYjÅ™üDðDÅ„èÕC{¾åDVE NèÅP­ðÅkx¢D´ ¿E™Æ^E±å)F“·ÈG‘§éHD–H ’7H´ð@H¢tHxÉ¡Gæ¢ÉFרóEn7D×™šܤDÒ¦)Ey%E N‚E?ÅÍD¯ËES¡2D‡ƒByDÒµœCŽéCŽU DS3„Ä’´¶Ä¬PÐC‰30Eú&C‡GD 8CÀÄäD$ÈÁC$°xCíÔC¶'D—•øDÊû|CYkÃjdìECCY.Ä…‹"D à˜D×D×E R£ȠÄý?ĈOC<ÆDTÅŒD¾½ŠD¡:GEÎE+Ç×E r‡Cà¥ÙÄ,°BŠ-ÃRjQÃîM‘Ät©DoüCϵÄiÅâDOÜ ÎD#ÀüCtysEG÷D³N›DhlDioùEµ˜EŠ4¤EÅ ÞEÜHE‘:E:Ö(EÞD kwCÒUD¬÷†Do‚ßDnã„E#H‘DÕèD$ÁÞD Ã]Ä9%!Ä¿V–D £ÀDÁ+YE DÂAëDš9ãÃ`G€Ä6‘DB•vD2ÒAD¢ÒçDöuçD–ðûD¦cE ¡EšïEá]ÉEÖÕE¯ÄEPDÜ9Dd7UAÕ'àD’ÚnE-Œ„Dð¿5D¢‡DS%DçB6ERàÊE]•†E|ÐEýæEêÜEm?[DØñCECkÿEÐð!F®k&Gj¸åHêœH0ÏÒHPGpTFebMDÿî£Âà²ÒDh˜ÂDCýíBÏ­D¼6NDß&DtìäD{žD 1´D«_|D1¹ˆÃÌëÁB¨DVôD›¡EM¡EJ‘ÆD¹.øDä5ÁEA#›DîüfD4L D˜NÀDÿ%qD›½»D׿7EhÈF 7£F·ÙœG=È¿GF¸ùFñ/]FjCð°‰ÃÇ áE) (EïÂ%Eß=¨EÚ«FEF AE†ªDä@OE˜•DÐJDÛ -E-áüE<œ,E1ÎëEg’Dïü©Ä ‹µÄ5ÙÄÒÁñÅû–ÃûܶD|ÿÃ}’gàjÂD#ZöDÃBD2¢Ã1ÎNDZ‡¡E)¤jE~E… ïE€ŠyE“žËE¹ÜEÙ‚JF‘F ’Eä $E±bEE›£ÀEUÛßE ¾lEA+EL6Ed8EHóEŠCE1PElM&EúbE3FœESöEDYD¥yñCŸòöD‚´PDéÇDÜŽ ÅŽ ÅŸJDκõES'ð<ENE™n)E¡>Dy–%Ã5BE ÖRDîôäÃДÅ;ŸÄ&E45¨E"ú!ľÏáDlµ:Ä`Œ’Ľ*ØDò5ÜÃŽ‡ÃÇØÄÔ©ÆÄzððÄQ„ÃÅÚmÄg²pÃjÏ1C¬ÚE 2ECkÒDn¼ Ã•X5Ãè‚íDŒÈ¯C¦<ÂÞ6ŽBt?C‚ÄO–pÄuJüÄoYjÅ™üDðDÅ„èÕC{¾åDVE NèÅP­ðÅkx¢D´ ¿E™Æ^E±å)F“·ÈG‘§éHD–H ’7H´ð@H¢tHxÉ¡Gæ¢ÉFרóEn7D×™šܤDÒ¦)Ey%E N‚E?ÅÍD¯ËES¡2D‡ƒByDÒµœCŽéCŽU DS3„Ä’´¶Ä¬PÐC‰30Eú&C‡GD 8CÀÄäD$ÈÁC$°xCíÔC¶'D—•øDÊû|CYkÃjdìECCY.Ä…‹"D à˜D×D×E R£ȠÄý?ĈOC<ÆDTÅŒD¾½ŠD¡:GEÎE+Ç×E r‡Cà¥ÙÄ,°BŠ-ÃRjQÃîM‘Ät©DoüCϵÄiÅâDOÜ ÎD#ÀüCtysEG÷D³N›DhlDioùEµ˜EŠ4¤EÅ ÞEÜHE‘:E:Ö(EÞD kwCÒUD¬÷†Do‚ßDnã„E#H‘DÕèD$ÁÞD Ã]Ä9%!Ä¿V–D £ÀDÁ+YE DÂAëDš9ãÃ`G€Ä6‘DB•vD2ÒAD¢ÒçDöuçD–ðûD¦cE ¡EšïEá]ÉEÖÕE¯ÄEPDÜ9Dd7UAÕ'àD’ÚnE-Œ„Dð¿5D¢‡DS%DçB6ERàÊE]•†E|ÐEýæEêÜEm?[DØñCECkÿEÐð!F®k&Gj¸åHêœH0ÏÒHPGpTFebMDÿî£Âà²ÒDh˜ÂDCýíBÏ­D¼6NDß&DtìäD{žD 1´D«_|D1¹ˆÃÌëÁB¨DVôD›¡EM¡EJ‘ÆD¹.øDä5ÁEA#›DîüfD4L D˜NÀDÿ%qD›½»D׿7EhÈF 7£F·ÙœG=È¿GF¸ùFñ/]FjCð°‰ÃÇ áE) (EïÂ%Eß=¨EÚ«FEF AE†ªDä@OE˜•DÐJDÛ -E-áüE<œ,E1ÎëEg’Dïü©Ä ‹µÄ5ÙÄÒÁñÅû–ÃûܶD|ÿÃ}’gàjÂD#ZöDÃBD2¢Ã1ÎNDZ‡¡E)¤jE~E… ïE€ŠyE“žËE¹ÜEÙ‚JF‘F ’Eä $E±bEE›£ÀEUÛßE ¾lEA+EL6Ed8EHóEŠCE1PElM&EúbE3FœESöEDYD¥yñCŸòöD‚´PDéÇDÜŽ This is a “light†version of the full Gaia DR2 gaia_source table, containing the original astrometric and photmetric columns with just enough additional information to let careful researchers notice when data is becomes uncertain and the full error model should be consulted. The full DR2 is available from numerous places in the VO (in particular from the TAP services ivo://uni-heidelberg.de/gaia/tap and ivo://esavo/gaia/tap.vo-dmlhttp://www.ivoa.net/dm/VO-DML.vo-dml.xmlstc2http://www.ivoa.net/dm/STC.vo-dml.xmlndcubeurn:dachsjunk:not-model:ndcubedshttp://www.ivoa.net/dm/DatasetMetadata-1.0.vo-dml.xmlivoahttp://www.ivoa.net/dm/ivoa.vo-dml.xmlivo://org.gavo.dcGAVO Data Center1TIMESERIES0BARYCENTERTCBJ2015.5ICRSObservation time (JD in barycentric TCB).Integrated flux in G; Use -2.5 log10(flux)+zero point to convert to magnitudes, where zero point is 25.6884 for DR2 fluxes in G in the Vega system.Magnitude in G, Vega system. Converted from flux using the formula given there. If flux_error/flux<0.1, you can use 1.09*flux_error/flux as a good estimate for the error; else the distribution is so skewed that you should work with fluxes rather than magnitude.Error in G flux.Gaia DR2 source_id of the objectPublisher-assigned title of the data setGaia DR2 RA of source objectGaia DR2 Dec of source object
2456920.5128546842921290000.02.0244633198665625106712000.0
2456920.5868590062659600000.02.12635918930161776519500.0
2456934.71934151562149850000.02.357379601891061323700500.0
2456934.89549362941934760000.02.471832249920307621371500.0
2456961.89449747331734390000.02.590533097882719547525800.0
2457003.4517497892104220000.02.38067213968078322162500.0
2457003.62791153141916840000.02.48193534119698727515800.0
2457031.44824773961690810000.02.61816298069168623871700.0
2457159.5289318261786750000.02.558240523066988533130900.0
2457176.6052401572000550000.02.43552647443061717323600.0
2457176.78139499341995940000.02.438031295473038531137300.0
2457176.7813949941865150000.02.511615588522033735917300.0
2457217.48488136571567590000.02.700318789111836519312300.0
2457217.5588855411545590000.02.715664252034944317547200.0
2457243.22822660380051200.05.9299803836130423535790.0
2457243.2282266511594470000.02.681859119019044618471700.0
2457276.9587075891714040000.02.603347618259917324701500.0
2457277.0327569814386006000.04.2219148617232065148650000.0
2457314.51514880643684.4916.772456544623715137729.0
2457314.69113340551330620000.02.878264882849528332975800.0
2457340.69249006731747150000.02.582574518630597324057400.0
2457340.7665252461694830000.02.6155846430100111095400.0
2457381.17602146931449470000.02.78537692226139927228900.0
2457438.90777355531788970000.02.55689235560183215526400.0
2457494.62331029451770970000.02.56787198909823326964400.0
pyvo-1.2.1/pyvo/dal/tests/data/query/000077500000000000000000000000001416757633600175075ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/tests/data/query/basic.xml000066400000000000000000000015461416757633600213200ustar00rootroot00000000000000 OK
23 Illuminatus
42 Don't panic, and always carry a towel
1337 Elite
pyvo-1.2.1/pyvo/dal/tests/data/query/dataset.xml000066400000000000000000000021311416757633600216530ustar00rootroot00000000000000 OK
image/fits http://example.com/querydata/image.fits
application/x-votable+xml http://example.com/querydata/votable.xml
application/x-votable+xml;content=datalink http://example.com/querydata/votable-datalink.xml
pyvo-1.2.1/pyvo/dal/tests/data/query/errorstatus.xml000066400000000000000000000015541416757633600226330ustar00rootroot00000000000000 ERROR
23 Illuminatus
42 Don't panic, and always carry a towel
1337 Elite
pyvo-1.2.1/pyvo/dal/tests/data/query/firstresource.xml000066400000000000000000000015461416757633600231360ustar00rootroot00000000000000 OK
23 Illuminatus
42 Don't panic, and always carry a towel
1337 Elite
pyvo-1.2.1/pyvo/dal/tests/data/query/missingcolumns.xml000066400000000000000000000011031416757633600232760ustar00rootroot00000000000000 OK
pyvo-1.2.1/pyvo/dal/tests/data/query/missingresource.xml000066400000000000000000000005041416757633600234510ustar00rootroot00000000000000 pyvo-1.2.1/pyvo/dal/tests/data/query/missingtable.xml000066400000000000000000000006711416757633600227160ustar00rootroot00000000000000 OK pyvo-1.2.1/pyvo/dal/tests/data/query/rootinfo.xml000066400000000000000000000015451416757633600220750ustar00rootroot00000000000000 OK
23 Illuminatus
42 Don't panic, and always carry a towel
1337 Elite
pyvo-1.2.1/pyvo/dal/tests/data/query/tableinfo.xml000066400000000000000000000015471416757633600222030ustar00rootroot00000000000000 OK
23 Illuminatus
42 Don't panic, and always carry a towel
1337 Elite
pyvo-1.2.1/pyvo/dal/tests/data/querydata/000077500000000000000000000000001416757633600203415ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/tests/data/querydata/image.fits000066400000000000000000020205001416757633600223110ustar00rootroot00000000000000SIMPLE = T / conforms to FITS standard BITPIX = 8 / array data type NAXIS = 0 / number of array dimensions EXTEND = T END XTENSION= 'IMAGE ' / Image extension BITPIX = -64 / array data type NAXIS = 2 / number of array dimensions NAXIS1 = 256 NAXIS2 = 256 PCOUNT = 0 / number of parameters GCOUNT = 1 / number of groups END ?×I*ŸqK2?î­àÁ5g¥?ÒsXG ?æ”–«CÞ¬?É9ÆU-?ÕëgføM?è[\J1Ò~?Ü,/xñ?ëåéNï*.?¹‰Â’²ø?è[‡™©?í‚›ÕL|?í×à‘«?ÓsÆ<¶8P?ÅW$Ot?¹Èi`Ýø?ÑòÑõÉ0ä?ëœsñåCœ?×…´Èp„?èH;‚‰Q?äú8)ür?¨ZߟGÕ`?ºÀ¿]M(?ÁØÿJŸ=p?Õã„FñÀ?ÑÝóó)xÒ?Ðä]5²? ŠÔ>Ò‘?ãZ o.Ü?å{ó`èW¶?糞ùoDc?俢û®Èˆ?ÖO+þõÜ?ëó$Í5?¹ŸÕ›º‘À?æ¶*,õœ6?ІØ$Ÿ~š?ÏQ«™$X,?éyÏÚP9?ï+ ò®8?ãÓ/ËD·†?îå[} j?°A‘w´ ?É&‹2^Ì?Õ™:ƒlH&?½X+#ç X?Úƒs@ˆ?Ú@Ÿn¼f?Ü&h½ñš?ï%*;#?ëŒÝµöÈ?᪬TvðP?Ô(qÊ•Ff?êú ó·?ÍîÇ]òƒð?á­ŠŸ …?îzûxn¸??ê½AÔX5?æáܧ’^?×nÏÑ`ÿ?ï!xXI±¸?îéß)q€?âqЉ’¡Ó?ÚÛX€OÄ?Ýžm‹º` ?Ö‰¹Br?× ]?]l¥\Ó?ïÒ:·ôô?âK †Z×¶?ç²hw™á›?ì% ‘U½?é§ëgŽÍ?êÜEž„É¥?Ð4'Íy¸L?¶¢Bužá?ÙúØÆyâ?æážquâ‹?ïýT–}?ÚuŽÄ§|?ìÛð—þV’?çßÃ] Í?äʆªŸ?×ÿº wÔÆ?ê8ä_Š L?ÒÒAtn›„?ìÇôþ4d?ØÉ°]ã« ?ê,RìXã?è©ÈR?¤‰ãÝ*߀?àql/Q™ä?è;Évâ6?äÉ´‚ÕÚö?é.¥ª’›?ÂÑÁ¹ßʼ?Ýé´ÕË™ú?æ-ylLÒ?ã5Éá @€?_™ÖÄ+H?écD¹ÝËû?Ôš…é!Ž:?à"EóÞ(?Àæ6PC ?ô]L‰ `?æƒü9¾/¥?Ñ®X†[†?ï9*_¶È?çu)Ü” ï?éíø˜ÁÐ?à¾6Wˆ?៮>1±?בPömx?åÅêfç§“?·Ã¼°…?ã[;KÚ?æsJ´*–?ÚXšºÝ;Œ?È®ŸôsÄ?ÞT†'~–@?»ŸŒsk°?ך7IÉÑÐ?Ínßá’?D?âÄæŠïÎQ?ᙑޔQ?Ó ¨êÁž?åÆ>f-Ã:?ëŪ8v}¾?ã®1"‡h?Ñ÷CXÚ®?ÔšJÆ?Ó¨óôz\?ãu(•Ž.?™‰‡”?íÖ­ÙíŒ?êxzIƒ?ãßZ+X?G3„¦ºÐ?Ô?]&¦?íyÐ{?é;2¶¶Y?Ö~nÞ¦W(?ÝWìײæ?Ø—!k~Ý:?âZÑQÊm?ë ñ5Lú?Ãb±‹âKì?á’ Å`æ?éy™¾QsÐ?æà¦PT‚?Ñ .s\?änÓ;?áäW»Äóù?>Ýb`?Ü`ÕÀÂ?çRbƒlÂ?Ü2OLœ˜2?çÚ˜ù??Ò‰/èÈmP?á|¬Lµ^?å•qûá®?éë=‚¸2)?Ñ7õ^Þ®?às;ÅL+:?æ‡r¥ º?àèZoL‹.?ÔŠ–3…º?Ú’l;h™Ð?ÉgyáÍ–?ï%Ü·©k¢?ïnp3á&x?æ;¤d!š®?á’+ñŠ?Ðßä²S ?èNùÚ²ê?ç¹ýª­Ô?êË]$ ƒ ?à7-Ežž?å7oØ|ÊA?ç)²þàD`?¶I€KÖ`?´à`{]ÛÐ?Î_—ŽvȤ?äË_>ÿ?Õ] ‰è3@?ÛÇývý‚à?Õ¨?¤iZ?êÙÑi?Ûcÿž¶Áì?Ñ.î¬*?Ü_¼„ŸÀ?ëÇ«Æóz? R²Çx@?ã´þkIû?ÞïŤé±0?ïtŽblÐ?ËÍB8È?è %EYqï?Áݼö°7Œ?Ò‘c0Æú?î"°¯“?۹Π’„°?àØçËŒJ?å·¬¬ãY?äo ÿŠ,?ç‚ûÔVy?ÑhïdMt?ìŽzÄDí?Гf1Ô¬?Ë«í5ØT?Ò: ¬dÃÄ?à€.±x×à?æŒ1c f?çãÚ`ÓHÓ?Ý&Œ‰Á,?íýðsì‚?ï‚!É B?Õp·%»ï?ª^ƒG%s?í(©ƒ's?ìKw–²Ú?ç­­Ow¾“?ãÊe+}[µ?ÑÀµ~v5p?ËPd¿¼Ýx?Óײ²°CJ?ìÃ\`m¸?ìlCO4©?ÃN¬êí—à?¿ƒ’¯·¦p?ãŠég,…?᩸7­K?å2†'x?ÏÏ<­5L?äùŒE—§?Ý#› ?^?Æ=ûr L?Ü+ä•äÌf?äüʲFij?Ü܉‚æ ?î…vàÐ?ß®xŠ:Ð?ÅUÿl?Ãø?ËU¦=¶`?׿Ä}Ìþ?ªÁ^ù À?íØT¡YÃÈ?è;/²üþ?Ä3Sî¯,?亮ž€ô¤?æ–WÎ'þ?Ú¯ ª¿àn?ΕÔYU´ä?ë¹¢U:"®?îaÚÇ­ö?ê6ˆž%–?ÙÕK·á^ˆ?‘‰¤®Ö ?ìhÕTß›?¬°h’Lœ?ÒDïZ¾Œ?À¼%Œš‡ ?çˆÈíGmÇ?Ù‚^'ô¾œ?é [ ÜÙ2?Õ€Ü_~ü?Á-Ðþ´d?䨋“=f}?ÞÑ´’YÎ?îÿÀÎ’à?í‚3ˆ3?åVA¼ÍÍ{?¿·Ðð" ?ïÙì© 1?Ùa¬Ëׯ?èòÍ%èz?Ó̪GIÚ?ÜFnDtÑš?à Dé??ß| „Ѱ?Þ¯Ýà‚Aâ?ë~xÕAT?çñŸ™Ç%?â®Æ ³ç?àŒHéºÁ?ÇAD ‰©`?Ú=½ëˆâ?à#¸ Ë8s?âDŽÐ¬S|?à÷zƒ£Ž?ãÜn7™šV?ׇFð€K8?Â{ÇWGEð?²ç7ay ?À|féâÛ|?䀵°oÔ?ì'ãyW?à:ÔŽZ2?å*_XúÉl?ç¾u»""‰?·0+÷1ܸ?Ä^ Õþ¡`?ê½åW†?ïy䈟3?æìUöŸÏu?ä—cNv}?ꉴã/²?Ñp“ ¦–?¹Ø5p °?²XÍvˆ?Òš^+Tt?ÃÑât7?É|[7}˜?Ó?€oëÂ?ï8n>„V?ëu«%#P?ãRõŠ/ý¸?ë>ÿkýn?äÝ2Kªó‘?ÝíÿEJ¯H?Ñ‚¬+È>?ïÅdšúö?ëTÄŒ¿&?UÊó×ï@?Ö3Q‰«Š®?ÇgESÔ?fÚÓTÇ"?àÛ³96à¿?Èõˆ¹¬Ø$?îÒC­mS0?ÚDÛÚ3\Š?åS¶7[?ÒÁ¤²™Ž?Ù¶ï_ ¬?Ð4ˆ±@F?쥅øa~?Üž?ûm5Ð?ïÞ„{è?ì»ÁüV*s?Óbᥬ?ÜtÏ$×Ö?ë¨Û„f?Ü`¨Æ ƒø?èG‹7ö„?ʼnÊö4@?Ük».R?å’ÿßFF ?âh—˜Ö?²Ûû ± ?Ð… ¡´»’?Á¸o¥þì?–ð· p`?ëš+õš9·?Ü¿™©ú’?ÜGüQ“®?ïÆ–ª«Ü?Öºnp²#†?íüÒ”í?è>a£&é©?ÕSo»¤Ðæ?ç·½­t¢?Í>Éê3œ”?áËP°—G?àÀì¿¡Ë€?Ä5)™ŸÆX?›ä–ôç ?âBŠ8Å&?ã—Ú+¥g?âHî=ý ?Û3 FNÑ(?ÚȨ́–Š$?ÜÒM¿ò?àÙ$À?ç÷1ÙKAa?Ý 5Z[eú?Ó—¹hçü?ä)EQÔ¹?î±*LDÏó?íÇ­`?ål–Áö?Ï8x é4?âå†v°ð? PÚ£yð?è¡ò4Žø?ê6põ5?í·Ÿ­ßm?ârÒ¦y±…?âzqí–?Ñ¡21¸˜?èªÀ–m6.?èôŽ©ØF?çš<0è?ÔLôuXÆ?îNåXÙãV?»° gj°?µÓÂZO8?íÍ6Y©?åÁ•{2?áHü]uŽ?å*»øÖ?ÌÞûdôˆ?ºÕұݰ8?ÕÖ°-/r´?î¸e;Ü&?åÂQb¤Ò–?çu˜2-öë?Íki 60? b®–ù&p?£ð¦¡?Õ7%|¸?Ýž1 ?Þå×1rܤ?å<ÌWk`§?ço3 Sá?×ËsßÜH?Úw$ײ\?Í…Xɰp?ä?<‡¥…?Ï?¸hBŠ4?Ô,½~¤`?Í‘ƒ'f0?è|) ß‘}?µþÛŠÙp?æÛð¿ ?à×ð6=¥?á·–ÿÑx?ï3FN?Ÿ/ŠÎÀ?×Ô…?˜tXñ€?¹ kð:[?ïA±õ€?ÜÕQ”ƒ ?à{]À<ÿ?ž‹‘O@?áòÀ 6ˤ?ç–û„fô?ì}®]Rz?q}ú•{­€?œ®•Ùà?îÄ'0ÉÙ?…8âq¸·?ÞüPb+µ†?âqKs‡ÿC?Üœ½êÿ ?µRøöx?êSäÔÐÇX?é|“! Ëâ?ŠT}ÝÃ/@?Æ·žßwß`?àØ7/þ %?›ósß[]à?æýIÖpÊú?ßå=ÛP‡š?é|O¶é?åä¶à7¶w?¾ÒQmòp?ÕtDÕÛNè?çZuJ(/?¹r³å à?Ã]î tó˜?ä_tðiÀ?íC¶ªía?ïj!Y\³ò?à<,z:V?ßÖ¸#%nP?çòahW?Ð ÅnëÈ?ã×)CêÔ?êÐ>úÖHF?ÊÇ®6­ì?îøìˆÕCn?£Þk¼„€?ßÎ %^Dà?»áxÒsŠ ?Ïu/7 ?îìÛ$Xá?æ[¼kí.å?Ú+¤ü-}Œ?Ùqz ÚPN?ær ˜Šz?íÚlƒ1¹?¦$»vož€?ã:° Ã$?Õ²€jy?è%R¢WS?”ß÷d¶à?ÄÜ}cß×?â´Óê«?Þ3‚Õ°‚‚?à‹íxɸ?ã”æ¬ofÃ?ãË!W5?¶—'¢w¨ ?á+µ´;Ê?ä°Jž&ô?ít?Mä?䵋ڣŠ?㨃4¿?âYkñ@?碚òÓ}?á²W„ºM?î3ª(Z‘ï?êèO–ƒ?ÝÎNYD¤?çL…û°1¾?Øÿ´½ºH?ʂ׃¸?Å ž¸]X?ìuåÜÔj?ÞÁ‰‹²Uê?ÝÓFÚaÎ?ÑÖ똌#*?Þ2ÐHã)?í£÷žW(Û?ç£\ÿýUç?áN¡‰hÍ?é” MÙÚ?µžÅeàk`?ÛBméÛ¹ì?Ç2w}È?Ö2X5!°?ß™q<Î`?æÎv!o?í×pÊ¡T?ØHhst¦?Ç ¥ ì?¢¹Èd?ì×é,Ë+?∫Á/Í?î¨u¯dM0?ኄ¼~ag?ÔáàÑŽn?æB†@Òk?ž1 FâÀ?©}FSZ80?êóé`²I ?Èj÷ÆÏô?ç®Þ)<”s?î¸Éª‚[¶?Éxc)êLü?®¤ú¡y`?Ï ØÃ$L?ß¶g ]Z?éî)dA(?è{È´ý˜á?ÙÝ8ÿ†Í8?Ñn}ñvqü?íŽFn)Ì?åA<‰ïùS?ä î—^˜s?ꦜî3>¥?éO®7?àÍ.ü{?ÛüË…‹¸?ísùÀõë?Û#º+Ý•?â}›ÛNRü?é‚pKS{ ?¶£ü/W°?¶¦€(?áAVC S`?×° |X?ãØäaS×È?åN ÝþH?îVj£I3¦?Ñ; B,?è~ÒÐb?àȇ´kçù?é@+óD¯?ß'ˆ$á?Û{ŠO‹¸?ÛKþˆl?ä,o«Ð„?åpáú‚îÁ?†[Ã’?ç+ï©=~ ?ZÊÄ’Xô?éƒÍ$îª? ÐRîÕû@?à8Ÿ¯Â¬?êçö ‰C?¶Š`-ÏZ`?Á£Ý)ò°Ð?ç Ö×´?ã¶*`—Ö?âѯ€µŒG?ã’Úy‘?ìð›T?ãþ¨¬¢€c?ÅKy+_?À?Ó= Ç"ò?èÔžìI¢–?åUKv0 ­?à>Âæè?ÆE,9j ?å™u(0Y?Ï{Œ„«x?êH™±˜.M?ÐÈ¿‘$s@?î}gËe³?ÛÛh°Û¹*?µÃ,èã(?îfLÅcR±?ŽºúfGáÀ?¾ §¦¿H?áòVßx.«?ÈÿÀ ˜?ì\8S7;?â/IJ`×w?ÉåÅù`+°?éæRï¹òA?Û¢¸Ö?â÷ÀÚQgN?åô&Ã]Ÿ?ï¦ci'?쫚†O?„»7\X©@?ۭتX¶?Ëê±€?Û^ Þ$?ÔÆ§áPJ?¤"9 í_À?ë€&R ì™?æITyiN?¯úÀ–ð?â6Ä{ÆþJ?íôq>Ks?ï®-¤´>?í§øí/sé?ÖbˆòÐÓ(?è‘Mo?¸…R,סH?ácg²#öÆ?ÅˆÊ þRh?Õgæ !>X?ê¶A0°Ã?Üಇ\®?Õ¯¾ wæ?î[%"%o‘?ï™6eƒ?À ’xÆýÔ?î$ò¥1 ?ÑipO’“^?¼‰ö¶ ²˜?áÁîkyB×?îëËY7^?ÐöÓ %Ú?ãæˆŒ3á?Õ¾Fª¼ùŒ?¤LÙѰ?Öß8ƒË8t?ßé:'¨—è?®¬·V{é0?è†)&ž?Úkþª¶fž?äLà|]ýÆ?Ëno>ç<„?ëq8h£?ëXÄ7sºù?å+OR·(?«œaÀ®Ëà?ß6m¨?ä÷‹™¥Ë?ßæ²þÆ?ë4ø‡B¾?å²\XÌˤ?î´±~’Ì?æ"éÞ»1=?Ýðü.ÄDÀ?â!Ž•Ây?ßéî¤y…ø?îù7w¨à?§±7s 0Ð?ÐJ@ˆ’?èM´ÀÛ5c?é—±%e{?é²yØG?ØŠ$‰eo,?è$%è¿Ý?à uý_?èÊÀüV¸?ìh½N‚ˆ?ÆÞ!¿aè?îôÞpÕ-?âüÔ·ó«?„a”.„À?á;¡Ð 6è?èjy°µG?ÀÖšˆ‚”¤?êRÎVp~²?áO•Mè?í/AI<\?¸Ô¢Ù[@?Ü¡ªze?×õ®1È ?꺄Ø ©?ã­]úÍô?Ûw¨|;­®?Ýþó­0?Ò‰­¶ÈŠ?êe7I° f?¼ˆ1¨$“À?íÉŽ'!Î ?äšõD°?Îî"NóT?Êeœgo4?·®n íÒè?±k«Ý?X?à‹†çü?·pQú%Ð?í¢íˆ•Þ?âîî‚ýp%?ߤ&·M‡Ú?Ýj+ûÙ¯Z?Ýä 6?Øö?èìÍC…èÍ?âKÄy¶\?ãwà¢Kv?ç#{+vJ?æóÒ†z Ì?¢vw@– ð?”×3Š À?ØwþLìŒ?⸳·j?Ú ¸ƒÄÁL?çÓoî‘üÚ?äY6ÄMç–?Ó?ÏN\?êÊ¡;,÷?Ôͬãþ¬l?ÞñÒTé?¼?çu42#?Û¢+uo?ÈG–¬?ž|p⡉?Ýì£P³›f?â8Êtîú?œðù¿3?ÉßXü3¿Ü?Éð¯TAmÔ?á ^,x¢?ï˜ÉÃçFû?êŸÜó\[U?æ·‹šU•?ïÔùíIA?á é |?æJú¯µÂ?­¸AgŽÌÐ?ÉLǨöùYp?Žï—cÊõÀ?ä 5\S2K?äí0 ‰×+?wûêÕ>€?言 Ò?ãc¬©a[?êqÚ øÈ?ß3Á§lT?åøvÊ(?ÓEg_™$”?ëqü.<Ú?îqÀ—•@x?o–`…<?Ź®MP?ÞÁå/൲?å#j ý q?æªÈU9Áü?ëqï§+¼?à&¶çX ?íÙsJpö_?¦,2Éß‘Ð?èó6¨˜š?æùžlˆ«?ÔmxÉ—"¶?ÉÒV·È74?ᘊÕTF?Þúà¯o+6?ëœe=0?·Ž ’Qh?Ù¢ËwâŠ?ë”+ÊÁÞÃ?á;óÿLËß?Þð£Tf?Çb•<Äæl?ç¢ö›+á\?²Äëf°¡Ø?Ú–—ì·;¸?Õˆ÷,g?â‰]óˆø?Ê(×7h?¼>Ú%Tïˆ?êØÏ)ØÓW?îW¯~V×?Þéεü¾?ç·å/½?¶1>m¢ˆ?æ×Äú†*?ÃͼËy´?Ð]Cý90?é3lЭ‡?Ç>Ô ]-\?é%¿uˆøS?Ï$ºöÕ6°?ì=ßTËV?íÚÞ½‚Uà?ãŒäLË!?½hÕGríp?ë0…Mºî?ÙŸ$q.Çê?à¼ÕòÊi©?Ö2)VÂ?Û’çƒÆ®?£F¶ ‚¢€?î]h&?ì8ÂÈxp?wRõ Þ?é$Ö”Œyf?ꬌüïv?ÒHO0¢çò?ÍÇ‹úФ?ÖT@åî²?Ô“ó%°l?ëKöå-Um?顯¥Ùò´?àwÂa ¢?îÖ;8SîB?ÃÙ™[$?ï'Þ´(:?´j:¹€?ä‡i¯ùW&?æ =ŽpK?Æ^ܨY?ËhÎíci ?ܺxÞμ?ào1ú?íÉb]µ"?â<²eR¬?á[g œQ?ì³/y?ìéŽöëöô?¬±oCR°?æ6×±EÙ?ëù¼Õ±Àj?åTã‡&¡ü?à,‹[¶?ë{9ʰŸí?ÄfÏA¸?ä·è,†Ï?ìü{ó!?Ç»£)ïÎü?ÏZè+sÐ?ÝLÝ=©h?á<‘îhΗ?âòüD²y?ØoxÄÞĸ?åÂÔašþ´?ä =³ {?âé¨ò7Þ?é*W{#’×?à½ß§ª?Éqó„& ?áIäràù[?ç†Eë² ç?ãö‹JFðþ?àó°·T?Ò& óôÞp?ëÆ³¼V¶v?Í{ohÄ#p?Å\m›(Œ°?ïÑ“qtdH?íð„¾·ô’?éV¢S>{?ÍRüŒ?Þx?éc<¸ü?Ã)0=ìh?Á§¹)lŬ?ãÚ¿›Grˆ?º±!îˆcˆ?íPçÅàœú?ÞÑwÌPŠ?å̯§n]?掙;·$?ì›"÷¾Ñ?â%HPX‡å?ÜØƒiCˆN?é¤tW/Ô_?Ïñ/´ÎûŒ?âÑxnß5?Ɇ6~ˆ?éfý±þ?äŸs{¶?Æ=^ƒÁD?åêÀ;Ä¥?ÏóúÕ¢  ?ãN˜Œ?Ê >Òž—D?½»êàô² ?â—nX ?Õu⥲O¸?èÚáÒLZ2?ׂЀE¬?àå(¡èî?Á`‹d̼(?Т/µÔŽü?Þ$:Ü¥²?æãQPz)?îÎIÀP?éf¼`02ý?ëÿ?ø¯È?Á)40€Ô?àqóÆf†»?ã5LÄʹ?çj™ÄmT¼?’ q©±•à?ÊÊrG¾ôP?ê&‘šÃy+?º  Q¬+P?íkù;¥·}?ê"ýÉÚ?ΟÃð ?êÓúëí8å?âæÔÁW?äq½à€×Û?îÿêM–°?Á´[õÉä?à^l§Ÿ‘?дw=ˆS–?ޞĵà:¦?ÏX$‡W’œ?å-Ö¿‡…3?×—"1opº?×áýŸØø?íŠ+ÖDbô?µŽzún˜`?ä› ÚH6ç?ÕÆBÝÿzö?åçJbG?Ø¢~”¶Ø?ÌG¸ÉÉŸà?Úd–½¥x?Ø·<Âо?Ö›kô˜9Ò?çȳrL¯G?ÑD¿¶ï„?Úü’¤¾†X?·Ì±$X°?¬ s¶ ~€?࣢ Æo?⟔l—?í‘"+8øº?çãݸ~?ÎèÙ,_P?ÛÙçvôÌØ?ë’krˆƒ‰?ãì䳕vm?Ò‡ôÂ@9(?ç„¶R…\p?è–×<ÚA?äA0E7D?ç—9„Sn?ƪøf1?ê¥GŠÁÖÝ?ã‡MÄè£?ºÃƒ~qŒ˜?í=×!Ñ{§?Úûó$˜¾6?éV¦ *?Òû2ùjï ?Ûìúª?á®qâEm]?ѨvÍɺ?êš[ƒ›ó?Èùø?¾ò+aøH?åv6€Ôê?ÎÝ$5ù°?Åí“®àËH?æ­x\ÑVš?ÔR0Ìã¿d?°fèRŽÛð?äÃú¾zl?é6·Nø?»3øº:º?æ~y—¬&n?ážZ,†§A?ÊçÃ\ÌÏä?¶‚\œLíø?Ä0J4a©D?Îgn‡Sp?êwËys±æ?Ü"¿ò¤Í²?·’G ˆ?¦ÌThôM ?èE“‚ S^?ÙnÂP4?ëjŽLõ[ù?Àr·0ʼX?ÖH97'P?Ô@G¶z D?å¯Ü?¹bH‰‚[°?ïíP¡tŽë?؉"p¾?ÛÏ}¨Â”P?ÌÁKÇA„?µë’3Áì¨?çÛœ³¡»?ì¤nðîÈ"?îfŠ¢»ð?î!*ébÄ@?çGFSW~?ÇçIt"|?Û™tˆÀŒ?È‹mÞj?ïÉì­úœë?²!=§ X?æä @Kâ]?à­=êi ?Äe¼1Ö@?âoü­JR?áÿÖúÌ;?é4w¾õ?ã c‚†?ên\òÉX?Üö9†?è”kÖãÎ?Ì÷›dÒ ?Å!ŸrbŒ?ÁTt ¨Íh?ºŒaHÀa0?ÌÅ0ÜBð?éxp“>—¹?é —›ÌÀ„?ßB‡+.™X?Þ¥dÚYn¶?ï­‰Ó±õY?ÅiœE»@?Êå®»´?ã94i7®?éHhüHk?æÆÛÑšxƒ?é,ðùœ!?ç£ÇT/?Õxc=#,?Ü´ …}ð¬?Þ¹ðJý&¬?Õ<Û?¡¾?É5Jm׊¼?ëÞùãXp?ï~j™ zª?Øw”/ì ?¬ s••Î@?ÇÙÁZcd?éP4/7"?ß.XªIœà?½V} Ø ?³\+?FeÈ?æ¼AË«¯E?Ç‚°‹žX?ßç•ÏÞ~8?äŠè¢#7?Ì,wêKp?ëVXX±·?Ôq³¨›¢?è®fL¬_?àW#åË¢$?á;u½*¾?ê¹Tè/Êh?泉PºÿN?éë‚‹Á?äï°Ã€z?ÑÖª?î?ãhͧìˆ?àm“)@X?ê^HÊXD?á:N#±6^?ãºjSæ?î¶ýÀ?ÒÇ4"ˆG>?ßc›j?Ü'ªÈâ˲?È“r$†à?º¢/WÏ8?ÈÉ©-=ì?¤V•œ-«°?Ó‘¸žéè?Îìö0§iÐ?è1mÞ+½?ãŽáEn˜à?ê›Ú–c™Ó?á¿ûb¥?Ü`馇0?î(š=ý¦?¢-±Þc«°?æ5é€ï‘?áÈJÀÈx?æ€lÐ4;?ß žÚ”Z?ŸÂ¢@?ɨñW?íùà½l’W?ì LïR?ãØŠù‘­0?à+ÜS •?’âk”âÀ?¦€4:@?ï5¥é M?ା˜óÎ?¯ñË8 Ë?Ò_&÷›?énÃåÙVô?ë® ¬Z¡/?ÌÜù™"Œ?á4‡sn?Ì9$½!  ?ÃyDIÏÜ ?èc ¦wlÕ?Ë`ÊÿO¯Ô?ÛjL¦bÚ?ÍLYáh °?á¡"š´hè?êÙ>šÔ&Á?ä|Ý%¡š?íœ7Ý8b?Óäp/Ò?ãŠO\¼t?êwG…؇£?Çm)ÿìø?íÆréL×b?¿å]y~x?çU2¨ûÌ?ÞÙ$"¦éì?â"6ì?åµ>êy?³ Äì@?¢Â1â¯Çà?ãÿV8ìlÚ?ì¯)¶šgz?tSOÁ4?¬®®ÿ!f0?ÞŽ%TUÄ?ïüÀ!ßð–?Í[»LqR ?âÑÉúN?ícªñ¯ ?ʪÍíåT?î5PNˆk? €1) `?ÐÚðd?§õ“…Ä?ì§Zà9ØÏ?Û“ô˸;\?Û-€O`êÞ?뾺áÛñÉ?Ó.†.Èì?×Íà·,¡?ÔÙ¢äþíÖ?àÑ ©.“w?Â=õ[ô8?Ìõà#VÀ?Ú9™Áud?Ø€M3 ?ƒ1¬Ækv@?¿jÙk)é0?ç^AO»?×}Ô¤ŽfÊ?çÃÄ,W?íÛâ‚°?í^&A!ÙZ?ë½U·ã?Ê “SÊ%p?éæ{øÜ¥Ñ?âL7ÔÎC?ìFy’-¿?Íúïúv¬?âB>§)1?Üeá+ÓKº?Ó®Óî´ár?ÚKBr©{ø?ã3Í‚âz ?èåž—C?ÊÞßXpÜ?âMäç}©ó?ÒA׃Ðn?´VvIÀ?î{Œ$K?ëÖ3½Ëë¤?›’úQý ?Âã­ê«ˆ?Õ¯YÝSà?æ‡Õ€ª–¬?îÔÕF›?àÐ&Øbù?³.}²Ø?Ë‚øör|?êÒ-mÏ?ŸÚ_ ¢Ÿ€?Õî½õŒð?é>¬ÏcI?è©o2ºv?å…pŠî?¿e¬F~Ò°?áIâ@€î2?êÌ·¤O¥?ézS9«á?î4d=Ê×2?Öú4É^n?ã]Z"©ø ?ãvMo¯¾ñ?Ý<ùÔO x?–Ô®Q±@?åü C›8?ïÏ%"¯×/?ÕþÚórx?áx$#˜õ?Öp æ«/x?·¤çGùh?Ñå’âj?áùŠ:é>?§› d•– ?ꜭ,ØœÇ?àÉ*™v€m?Ñ#…‹Bn?ãI¹êùNü?ì+uʾQ?Í 5'¯ñ ?ãÛÝ·é'?Ó罘H¡þ?Ãí…83ì˜?ß:dŽÒŒ?î‰íóî ?ï˜Vë?ëžFÃ,?ÍÞt¡°?š¾­èŸ?ÜíTq¶±*?°Þý˜£È?éÀ˜uµ?븴@ú—?âà¤:ÝCø?à,a”–Ø?åp7ŒõÚö?êé?ÖíB?ÉÇ’ˆæ«0?ã ƒõ‡ å?Ó Î7àÇ’?ã“×'£vÇ?£r8?†0€?žÖIú€?æ¿ïVv?Ì]£¶ ?êKý@â)?é M¿ Ê?Øü47JB?ë5Âüư“?¤§ûpb×`?ìå65Œ,¥?»¹ßbH¿`?èêÃø,Á?ì¦ß“·Õ?Ù§ÃÄ‹ž?ïüÕ„Îjñ?èô¿ÞA‹7?åÏT^Àµ?罤Õм?í£]+?ï¨+ÈŽ†æ?ѬTVÔÖ.?ç‹„Ÿï¶?æ›K d?ç£Å¥q¬]?vI£{Ñê?ÒÆ¨7d°?íÖé^f¨¥?é\ÿB?à$HZ)„»?âi[©ˆÀA?鎳™AQ?ØùÐWí(?ÓF‡rÜŠ?íõÙ­ë'È?×bß­Fª?“Š6 ?}à?äéU‹¨ ù?ëQ)¢S¦,?ë&Õ¿¦?㲕~Ÿ?ߨÿ©Ëï¢?áR¶m*æ=?ëtÛ?ÜNÛ?ÞÑÉéǦ?çvV¤¹™á?àœ}L#Õ0?àeµGd R¹¿L?ì9ºÝQ,?í€Ö:ù$Ó?ÖyžqX?ãeóÛv-?Âd—l¼?ÉPZßíêp?Ý)¾Í#‚?﯌RçÁ?è˜kÙ<à?ä3¤5X‹?½g°gª‰8?¨ï¨{hÐ?í™ÕnI_g?Ú2wŒMÂ`?èåÛGœÏ²?}±®ŠÒf€?ì)j®wŠ@?ÜI,wmF?㮘Él‹?æëàBXh?ݯ\dÑTÀ?ï3’€+…Ü?ë±<í®œ?êŸl<…;–?ꊄý°?àƒPÂoç3?æé'Êr|¬?åã”奌?à çº‘€A?ìBñ/ñ†?âtN¼ý?É~ða…$?ê;RŒª–¢?éü4Ÿ=+á?éû}1Zó—?Ô½F¤zé¤?èVñwŠý"?èÝc\/±?ít?×1'¯³Ð|?Ð̯\ ÷¬?ß "`ö4?¡Nr竨°?ìYZ|`Ɉ?ÝéZì[¼"?ì3výÒ?ᜧgܹÖ?äUpw»?ÂZ™¨ ?䘭AÛBô?â8÷O}ß?ªâƒïâÐ?ÙœÕ=Vl?Œ =móˆÀ?Þ^íȦB?í阱Ï_o?ܘ¿¯,ƒØ?ê?ŸÈŽÚ(?ÛnúçªÂÄ?設Wªr?Êâªc' (?ÝEßv¶?ÑÄ„È/+ ?ÚKaœ~F?êLî(Å0[?Ó¦šŽêí?éðM&1áÝ?Dz Ó±¨,?¨TíS^nÐ?Õƒ v.?Ô5äT¸n?ÍJe¼™* ?éãÈ'‰W?ã<|™«?ßÉ'¦Iw^? ¬™DôJ@?”-ÕèØÀ?çk”á/Œ?î>ÑX¾ãŸ?í’ Hé?éIu{â*‹?ÌŸ.è†çl?êS›HµJ–?ã â`ê?ìÜ“c?îÉ>Ýäž?À>aŽÜ?é諸v¼?íÉ‹Œ@±?àÁ}½’Y?š`KÌtž ?ÁûÛMË3È?ç"F~?|Ä?êšÆoªv?æ´êò ?ÓEîÇüކ?çòTü­X˜?Ú݉Ì÷Ð?ãO« m?î¥DÝWâ?¾Ä¾Ï jx?Ë’BÓà?×’TWþl$?Õµ§\9f\?ë+QVF¥¹?áb„e'A?ßaÝ•“ÁÈ?ÝHÌkuôÐ?íšUDÈ?·Á/´¸-P?Ù=¾A@?¨Ï£Üß: ?Øl¾AIT?Ö²,œcÉ$?Á‡‚·7ýÜ?Âèü)£©x?ѸÊ}$óâ?Ä{1vظ?îi¬8Ýâ?×m:Ê€˜?È7 ÄÜ?îݵMÔ-?àØ§0a?ÑãW¤ã²?Öö*À˜N?Ú’5Yú„?Òº.qr•ü?ë©Z}/ä?Ú@ÞÉB:D?Ø ºm 3è?¨°Tß1ñ?ÁI¿·¬$?ÒasÃéã?í(ãÞ#p!?È}$¥ÿÌ?Ä,6Tžˆ?ȱ5¹t¬?â¶aŒÁù?Õ÷oäóó(?à’¶P™íJ?Ûiw,¶‚>?ãɹI¸ëZ?ís©¤ü~?ïä¦`ç?âÉÉñÁ?Ýå?Ϙêvû?ã¬åàk-?ãqß°}´?åÀ¼Õ Áö?È4–Ã’ô?ê*sZ¯*!?èÃqã; ¤?·õ?† Î?çr,è*÷?äûz½‚Ùï?ºƒ`ÙiØ?ÉÛ6ávÞ¸?™gþ)¶Ñ@?êZuñ "?éµ6>r;%?îXxèúî?ä»òÉÊ?ÍÒAÖ‹Ãp?ËÖ?‹?¨?É Š$¶?Çóq;ÆSH?ìi7kb_Í?îÝÇϽ?Òƒð m¦?Ó6‹"° D?äaýkàa—?îñ'¬Qßâ? tÓå;Ð?àVÓ–¨&?íùðÌ$¨?í¹é^¶øÊ?ììÅ{P~q?â|E’™Ñ’?ÇÈ>þn¤?ÁKPŒ>?âPnöo?šØõ˜Bà?ß ޤiì?èMýÏ › ?ËêÒÕÉä?ãOC«ŠR‘?åoëP6?ãƒP%Ÿ–Ÿ?Õ÷©K„~ä?ëìÜb§ ?Ú$F*%ã¾?qÇ4†€?ç°(†ÅÜ•?çZÁ9Ù ?îÉsð¥’&?ç’?ÓÈk6ž)¦?îÁP¤<ž?ëÇTÞ3¡?ç8dHÎ?ÁäÒ[‰ôü?ÐåÐÓ£mî?Äla,¢?껡=o£þ?ã½54?Ò{ãR?4?Þøp×ô×Ð?ìÄ´è…ã?æD>8¤µ?ÒÌš*p?èÑ«ÇÔ³á?â|°#êrÁ?±ˆ”!S¶X?次ï¸x\?¾ýâã2«˜?íæl¬Ûø?Þs,bîÔ?Í4ûF‡?Eñâø 4?Õð3ÛÞÒ?äØ+(`æ±?ÚmÍÕ&Žö?Ùî[5V,?ÎÁÂ(?åÍ>BSH~?Ñç9ýq®¬?ÅÝ¢J# ?Ѐ¦“"©?’m½Ë•Œ€?É IT¼?Ê‘sü?Çûù›û|d?ßVpûÙ?èüYø®e‘?çÖU`1ð?³åãG3;à?Åeý\ ü?ãÔ~ámnn?Å? ¦Õ,?æëd?æ>?Óžu@2¥^?âny{êÉ‹?á1@ÚÀÙh?´òÿ ÆG0?± Jþ5Ý0?ìí¤Ñ¥Æ?é'C‡?¸ÿÍÞ?×F•íª8?ƾYÖÏh?韃a'^?Ð1QËõ]°?Ù¥ ’7ˆÎ?︖AX†Ð?ï(þ‰,l?æØÜh=?ââÈ9F8È?ÃàÊî?¸H?ÄÎn€Ðð?ì«îêûö7?ázÁ£Ñhí?Ø*Œ™ ªF?à€¼È=/€?î}OΘ·?Ï^»·"Ä?íwýºs?Ó0t?Ûa?שDœ å”?·“¼á<?á#C@X-d?ã‡DÔ°Ë?ímê9ù”?ëc™†Ô*‹?æ¸~C±;À?éM¢{¦( ?Á²Ù v?ÄÆI8 ¾?ÙÖ[…^?álHºüu0?è°~,g*â?á¢$\(?☀x®Sû?âBÊyô?ß#v+ïxŽ?©_5þªÃ?¥fš~ú:ð?Ükƒö9™?ߨª'P.?ËñpúcÜ?ç¸*G?à7ít‚Êe?èÐi Ñ/G?í <ˆiÆ?íþȈó?îcPK?ßú äÒù>?à)S3¼÷«?ã!)²›Ä?îÿ^Jx>?Û¶Ww[®?àŠq ɳ#?Ë4ÉMÓ½ø?çP¤M÷§?Ò&$^2?èy¦~*à ?ã'¶¸Ö[?×}Áï-?ÜSÓ;v›v?ãUI?éùb?¬$Tñdp ?æŒTèó@Š?ÊÁÆm$•H?î „¹ÆÕ­?×’_©Ðð?À†©í9Ÿ ?í™'m¨C5?ÞÆ‘ÒÑ?襘‘zZÃ?Ì“¶¢&¬P?àQrfí;9?áíGE=Á?²!eë‘p?ÑqlêF¾ˆ?ï­\åòyÿ?Äx€= ®Œ?íÞçÒð.?ÅÏîš?~,?ì¬õùRVZ?˽#ƒÁh?ÀH¬±ébh?Ïn–×Ü?ÖX ?ætEÍ06?è5It'$Ä?ëðq¾%Ëš?è ú›#“?æŒØÔ¡)n?å  ,Ü‹?Òô3p•cð?î<ÄQ†yÇ?í­ÛãHQe?¬žL~jð?º¾„%Ýð?Ù¶Qºœk\?·•›!Ýà?ç;uš¤Ó:?ËH¸õçüH?èågÈd|?ç0'b{ͱ?Ú`À§æB°?ä«…ëM—Õ?µžÃUŒ’(?Å­3J]”ì?Ï6œtxY,?èW­O·?ã@·¶ä¯¦?àJ3åâ‹?èǽ±‰£ë?Ñt¥¹®OÖ?˯C–ñä(?ãJ#Ö®ß?¬wâ9?bCóí¢à?èŽ_Qþ¬?ä=™Þ‹Ýn?Ô^Xý|nî?Ç+;é+ÔŒ?³9¤­Úÿð?Ø$qWW[?ßæ£±Ž?áB‰òÚ„?Æg¬Y›jp?ÃöÍ÷JÔ?ÕÙ7ì"?èð<¢€M1?ègž“ z?áj8Ôß?ÌU`–|€?Êí9=™â¼?ì1¿°sz?â}J*r?ж•‚"ñð?â!P…ô§š?ײ > ê?ïc¤þû+¨?ìšPˆMìî?æRfÆš2b?ãòÕ[Ãüs?®Ë:S€?»»}.  ?î=Ÿ2Ú“?ßÙÔE3"?ï„Ú´UaŠ?í*coS µ?ä¥{gÄ Û?˜lŒ„L`?äÕáQ<±H?ç4ñËêýÉ?Тír\?¹§EV^Yx?ä=£æ%zN?î‰õL?Ð~/¤,?Õ>6è…Ö?àîGò?ÐùQcW·Ì?¦ÕŸ™‘À?è_mšS?æ}‹ºmb?ÛMç"]Ñ~?×cLQ5â?Øù{¦}æ?£4ÁC¥R€?Û†{Œ#3ú?ÌãaÈ[ûP?íQðo™ÛÂ?ã_祿˜d?¶•2ÞW­ð?וæ`š¤?œ„¦ EZ`?íwàY•VM?â*/¼‡IP?ïv¯ˆ ‹ ?èIå ‡Ð?¶Å-œqÙ¨?î­z$ÁDÙ?µ°G?‰å?´;B:¡,Ø?ìîw am?æR™~± n?ØÇ«³tšf?ã­ÝªÇ¥p?ÔÂ÷~imJ?‘¿r@þˆ ?í­&H!^{?ÓhV¡Þàô?Ûí ¢g^?ÀgJÚ,ÏT?ë‡ñZ”è?Ù]Zmi5F?à¡â·o{?æ™%‹ú«?Öt+0~¸?Ó¡ZˆÅBd?æ¾Ùà3€?ÛÎN™´ ”?ÑqÌô6B?îÏT÷ö¿?ÞWã7.#J?«)šp?îe¥wÑí?Гwn5È?É/§Ã›Ð?ã\[Ñ{ í?ÚÿÈø¸€?ÐÂåÇÜÊ?ˆ—aJ@?æ»´ƒ·?ÙÆ£HôJ?Ô ²ÄGÃ@?ÜG§*=r?±½Í¾EZø?â]»÷RX´?ä÷ÿr«“ó?ëÖ°ô'¨?ÞÓµÝÑmÄ?ê¹ç~°}Ú?ºey“VÜ0?å–Kl\Gí?¶êgšþnX? ¥«Ä„?Øiêtu”?íλÏrC¦?´¡V}8€?ëÐ#Ûk´?ãk†¥þ?ë«o ðÛf?æmQÙ }(?ÌÔ*“î?ÌwƉñh?wyFf?âD˜«•|?Å—Ÿs[¨?º*÷EÐ?Àó´œuR¬?æÛbËlß?îÏMü¡ÓS?ìtôéªîŽ?ì¡è–NN?ÝØ:µ…ô?Ö·?€žè?àçŽÂŸMŠ?ÈsêÖR¨?×sö…«Ýl?о]¾«Ð,?§xp!¬0?äµ.LtÈ?ë’BìÞ?èÁ58׆?ÛÙkùÅÜ?ÖÖèD,?Þòòzt®F?åf±]ü?ãÓ²Ó.£?ÜZûú¥€?Ãñ®bG™è?ßçJ€Ê8?ÖQ(ŠŠ¦Ô?ã®jJYÒö?äL›µ&ë?Ôÿ¨§rÞ?Òž\à4?æŒtýħž?å-í¡Y?Ñl ¬ÃWø?ãªòz¬?çê’ôIYÝ?è¥i¯Rì^?ÖVŠüôþ?ÚÏžšŽš?å@=V×?îeÊ!¢¬è?ÚçöáRª?íc{?ÐBZ´;à?âÜÆÁo†D?·¡û»Å‚h?îÃg›Š¦?Ñž'3O‘L?åáǦä“ç?í„t )p?ïoc¯Øo?ÙÄÇ£qfö?é…^ï½?æwZTÂC?ÚH¥ª¡J?è%i̤/k?íAÉåpR?å †÷õ^ñ?åmK·åC§?罬µcÚÔ?ç#å m?èWĺQç?ܵ,ê›S?™s™"sÎ@?´6o=!H?¯G_à:#?Ðùðslö?Ö,üòD?Ù£7L¶¤?ßÁø ™p€?çs¬wƒ??Úªì]Ò-D?¸™”@W?êÒ»;?ägïƒ"?À{QÐàFP?ÜÝÎר¿”?îèƒÿÎA?ÝÎ*¦ˆ?ê)±Á9þè?Á—*-Y?¼`ˆ·X?ЋÜ+}U¼?ë öiÓá‚?à_ýÒ¸p?špæ Q‘?ÞG±Œq§?èÃaF~ºî?”ñ` B ?îsí¾`ÇÄ?å Sû‹ïÙ?ïÂØÅQƒŸ?èâÞ…Í ”?×ß?®ùh,?Ø.}á?• (ö¸@?è¿ÆôÝv¦?¤IÂI •ð?äGÉ‹?Ñ¥¼Å’?Ù•.<0:?ÔË>¸ÚãŠ?äƒZ¤f[à?ç›9BUÝ>?ÑF–üÂ(Æ?ìÏö¯ÕÔö?Ç­ü5?ÀôÊ´VØ ?é¬,£²¯?î7åae\?×+éoxmÔ?ë¾}*&Ê?ïÈ6W2r?¼‚:bxD(?×5Xkª0º?Òj[³f%Ž?Úè$z‘ex?ÐSšâØç?‘§ž(Œ§?Ôeõž|?ãè~zWR®?Ë:ò}@?ï }RB?ݪgœ½ L?îaèJsÎ?ï <§Â«/?ãÉŸˆ¦ó?ï§æE`¿Ë?ã4î*Ò?ê"öµÐ|õ?ÇTJHÊà?è!'vH±?ç%if‘N?í ûV°?Õž©ÉË'®?µ±Ã?L?Æ» c’´?ïñÙÜT"?š½DOÖà?¿L\k˜ñ˜?ØÞ ³†?¤²ˆhºBp?Ç7í¿°¤H?•§ù<€?çÕ'ß¹N‚?Ó‹g Óa?êçÿŸÔ'(?êBlò:Ow?ìäNËî0?ÑÅáǰev?Ó=-C?§Ø?Ä-$&(È?Ò2ŸE‡{?ã'ïŽâ~¯?åWͰX„­?í #Kª?ÚB)x?ãÂQwLJ?Ü'T?ç< {/Õ*?ßî¿Â7Þ?ÚâÌ\Òù:?ÖcØc/ùˆ?À•WÍKl?t½ÈÏ”?ìt…cS)b?áÃÍÜÈí?ï³M`2ì?¹œéÄœÈ?Ù¶l”?Ü]tˆôj?æ ÔCþh7?ÇÐñön?̱ýœ?ïÚÚ%C0?Õ$6á=[æ?ä%®Ú²Ä?áWðÏ2û?Ðy>~¸î?ËFz’]ã?Ó;:×µƒÒ?抽^uí? :=º{?ê^ˆt/É?íóåÔç;“?éR¥Ñ麫?áSÛâYª]?ßz±¤ZtX?Ô™{¢Š[0?Þâ3EEéê?å´Qk€?ÞúÐ~?ÑVÈ‚&?ÕEqè}ò?âéÝ|âåc?ÀY6=ÈÜ?åIù2uõ?ç#7¤#M)?Ý… Êbö?Ô”ŠàŒ8r?â^¬ Ùo?îüQj‚C?Ð0§$îè(?˧ƒÛP?ás¥¿F æ?Ù@¥ñìR?âPzÞLˆë?ÊâÈ¿¸¼?àŽÂ"¨f?Ò"yÆW¡æ?¢evÎ ?ëìþTÕ?ÛG[B—$.?äq÷iØ«Ø?î9‹|æŒ ?Ðî¾á˜?º9â’Nø?îÃÞ…S.?ä$Û¼R?ºÆÛãºÇ?ä|)öC¾Ù?æò Z~xÊ?ãmŽ{+šr?àvö1?î€îN ?¶2@s„Hà?к¶ÀýØ?´`€ãÍè?ÞIp¿$V?Ø@)ÜÕÆ?ÛCϵ…Þ?Ò@ä¥I#ø?»gÔøè?ÉÕHÝ*Ð?ë(‚LMà?äPe „Ø?èœÔB̉¢?¬` kê^ ?ÕŸ¼Yöú?ÜŒ–9á?åcõÍ3?᥉eF,f?Ùž«®?ýª?§KËô=°p?Ôž¸p“ðÒ?Þ‹jbª?Ô·sÚ„?‚=Ž\-€?ç„g­¹B?Þtæ8ÙÆê?ÐŒ=Ým ?ÓëÄkh¶?¢“ ñš3ð?º,’"è?±xCŸéº¨?èÁtö±äš?çðºóF£¯?ÿQãØ?å¥T¯õPË?àú°Þªí?ÜÐi¾ Ì?­?14?@?ä\Ùüdy)?ÌŒP«cì?á9f+ŠÖ?ç]kÑ—?Ö|ï8™~?Å„.ûñ7?ç®3.ÖxW?ÜÆ‘÷(´?à^åDúø?äÈKvÒí?ßNЯÞ?ßÓ?¤Ü–ê?ö´Úä  ?îCX4G Ø?â½Ë*µ°z?äÇu6|ÊÙ?íÄ€<áv?ë;´Ñë®?îE‡Ñˆ?îCÚR?ÖS4æõº„?ê©é¸%Ž?é26ßÞÌÙ?шÖkå Î?ï[»Î˜àƒ?å¯cjW-?ÖÉ-#ç?×sW™ß?ïRm‹Æñö?áu§þ©?ë"¸,V“?å[RôlД?îMÐ%°?ĸI”j$?ï<§¶qÚ?îÝïÍB(?î~`t1xp?ÞÁ»¯ÿb?èò%,¨?áIl}âý?ìu*‰˜\£?íJ®PÆÙó?ï%@£8ü¸?·30<ü?àa滺ô?ÅœnnbˆX?ìN˜À¦W;?¯¾Nh‰ ?ê•âs?åˆJ®ü^C?éMäÚŠ}Q?ÂÍÓÜwˆ?é(d°œ(?Ý[Bí¡Ø?èŠÈ@…fÉ?êô)ümO?î§ÔG§?æ}Œ¿% Ã?ã¥vÌ$·½?ֽŒ塂?Ë[ ­x%l?ÎúÒ/¬ü?ébmO /?áYA?Ë–’?Â’ÑóhØ?ÒØŽ0ÇAà?ØÀYç£l"?ë4c®ö"?Æ•…fí¥è?áÑ™šYÞî?Ô½óÍË$?kù± Õ?ïxD±yÖ?âñfûÜ?˜?Ü‘3ãÜ@?´·ï™|¨?±»0KH?Õ³³”óÞj?ÖéQ9;?í»òD-(?ѼY7Ä<Ê?îiÀ}eÏ?´ÇÜ ?ÛåªV$ œ?’zmý?ÝÑ24Ð?Ö”À Ž­†?àmE õ?ëkʽ_È/?Â9\<áõÌ?ãp©'eÏ?ÁPŒËìY?åÄí»÷s?ç¤ÀýwÛ¡?Ùº1óͦò?Å/ŒÝü?ַ݃€Cö?ëŽþ)ªw?Ù·÷j, ?ŸŽoóÉ,À?ÝB)¬S„?ä'eÂØS‘?æDªºçÉ?í ‚2¶ð?¶X™[ó”?ËmçgŽmü?ä¿éÛ}5 ?¦‡âí«|p?äãS5F?å°#¶˜?çÕ Û‘ˆî?Ú%S+–"ð?ï-‘õå?ÙkB}Y¢à?ÉÈVNáÄyñ?ïŸ „ÈbÁ?°ïÞ^?É <oýH?£¤¿2øà?ê¡ÄÁ3Î%?€íb‚~@?Ê gëx?Óâ—˜_f?Þ ‚š «˜?ïñ<5q ”?Û€8.O&(?à­?Q ?æ ¥Â‰‡ª?¤Žëã<^?×?Žxk°?×Ö Mì¶ú?畸Ã}Û\?Úi±Ê£°?áȼüíå¡?Ò!fû´?ë©—q°l?º®#ê x?Ý‘„j¦?è¿à7)n?ÖØâãð?ß·¢wUÀ?ÒáÖ¬èº?°ÿÔó ò?¡oíÖæ°?î˜Ü•è?î¶Œ¢òë?írˆ¨¿ ï?Õå öL.?ã  ç£]§?äÄÈã?îT¸¼D'?°5à\À?칃SªFø?· Ș?ì®’êÖÖ?Íjðl{–ô?†okèæ@?Ýïˆ Ú?å™4טG?¡v–á]—@?ïÃÝÖâò?莃;Â,ì?Ý›A~^?Ç£ŽW]T?Ô½" ]‚?çui¾ÙKh?Ô”¡ÀªšP?Ê/ÏS“’(?ìœàau6y?Ö0̃w?äºd"£?é£P‘—‹‹?áÕL‡kh?Óaavå¦?ç‘.\2Œ?‰_¿Ñk?Û]b°Ü?æŰS?ào殾? Ê’;á`?ïòC2š(?ãØÁÝІ?ÞY»—y‡2?ƇȃËcœ?îc¯Ÿ@JÙ?ãÈ$õ?çIXªl¼5?ä‹3q+Äó?Õz²^Þ?n?ÐSå^¸(?çÁû€(sË?èåÍK,í&?æJðÕºE?êHÅ›cË?íкz‘T`?Ð?eUNv?Þ¢m·Ä„?×ĶÙ4¡ ?ç¹0ô©1Ë?ןŽ$US(?äá“›™m?©ÝU‚“½?ÄUúÔá°D?éý¯Í?Ü‹‘¤|ƒn?íaôÚ?àóTYÍ¥,?Àn?Âð,?ÇTNþwCì?ê$™¸qûÈ?åü&¶å[?ÍÍ«îD?ìÒ:àç?¶dïH'8?æáôÜ?Æ¢?é=tÀ0½œ?ÀqEi8t?ÁNOa9À?Ð÷'†ÜR`?á‘•éD¤?ÅC^¿F~,?à WJ;¾ú?ݶS@áL$?Þ‚ç<b"?»©éÄu8?木!eð`?ìEaTdp?Öüø²ÓN?à ÂC- ?ÝñÕKÙl¤?½mÔ &Ø?Ì]Þ}ÿ[à?Мiêa-?¯NlÔý«Ð?ê3³Nøâ?籃’1g?¿l‚•Ð?Üe1nqZ?ë™–+Ú?舆7?ÇѲ¤‘@?à|­sŽ…Ñ?½ßPÒpø?é³’ _ÑX?Õ±¨ ?èAç [Î?Ü2-zÖÚö?Ç‘.ÚáT?¦ Ñ™ÏP?à<Ž)ù?îÔç¿÷À?ÍÍ/Þ¨?Ô“ï“‘š?Ý⋆7H?ÊÊïû„X?굕Ûîò?êN'ƒúÜm?Þ8 ª;Óò?ÝõPtĸ?$‹Â€?Ýú9sâñô?æFVw’ Ê?åq*ÝÚ?â0¹ò¦†?ç„뮸Tù?ÒðØO_¶¸?×ÝuS…¿&?ï Mð)«?Ò .Á–j?äÒvõÝÙ?ï-Áï3I?ÚÉi6h)?Ú#J+¬|œ?Úžïv¼º?îû†ÍU]?¥Píècõ?à;ÿãê%X?â’"*ß" ?Þ};pêÔ?ÑÊÖOoˆ´?ßÍIö|=?Åi¥S?ëÒAê?ÞûNS{¼â? ë! @?ÜI¤ ¸Ô?ØR;ƒgX?ë,EÙ^ã2?îK™^PÅB?ëÑÄ¿Y?ã?ïù¥þ]8P?ê’RëYM?ãîSçÔ?ãŸnãÀØ…?æ£xÿí?Ô¥,|1~?¾££™é?à˜Jª­l?ï/ý¨ É?Ô=pùHê?ä0Ë8¾P?Ù¶‹sH[?ï5‚´ßõ?Û†R¨ôN?쫦ªðáq?ë)xyð Ø?ïjÍÑöò¥?Ï=†î¼ˆè?áS°£1?²Eåó¸¨?ºÝ ux?ßùþvm8?«Î´ö˜–@?é“y=‡Ì?ÍL$aá‡?í&w‘Á;F?êÑø×ŒG?êlçm2V?Ù$í.?Ѳ4VV?È@iëxéÌ?â£ÚÄdßI?&Ô6ò?íDÞ2M?Äþȇ¸E„?ÖoŸŒñ¡¨?ã¼=Æâ=?ã%ÛˆÀ²Ñ?æòIQÕ“ô?à{›V‚}´?Ë•êaéQ(?Î}²­´d?î[´cP$?è"›~–çJ?îdØ¢?Ç¡áà\?ÛðÞð¦?êGM|C†?©.‡ÔÉ ?éö>\¶*Þ?¥ß(eñ} ?Ô‡ªüL2X?ÎÈÑÿ$Ä?и–^Ç?àæ¶„Ú?ë“Æ'™Ñ?ç Թç?ã2À§ˆ]N?³ù,º#§@?¾^¯µ¼`?Í×?d©ì?ë$¸ƒÇU=?ÕC57à?¼¯ä½æÂ?îôìÒ.¸?ì*m¥ÞHz?Úc,©ŸÁÜ?ê°595?àè ž?åˆÄo½?íÊÊÐhuv?àÔ è³1ó?Ì‘jQ!È?È(ÍLHÄ?ãÑ §áÏo?Ó†äÖƒ–?ët7’òuÁ?ãì²JpìÀ?ááú ®L?ÆûHh–X?ëϹ‰Ä ?Ó^‚æò(ê?åéW¯JÓx€?ç[>Ç. ?á|¦ @?³„½ò•?¥ë8œ€?éüͲêE?ì°Zr)»Ì?àëxp*{¥?À¬i ‰B\?Õ?Ùk,[LõŽ?ØÔ†üLH?©é™@ÉÐ?Ìú š´$?°äí—¬X?åìé¢ÉHV?êbñxïc?éÀÇç…T?ìû¶-Ö›?Ѐmøf?Ñ—¬ä±ž?í« Š?öy?àDa»È­Ë?–†$‹"?ßh]£™¬?é \€”¼†?ÜxÆÇ&iì?àéæü"?î¸{ìœz?ï›î¿œÐµ?éú•¡LXE?ïÕL‡Æ³?ØÛÉM,~Ü?ÙnY éP?êGî“Wì?Ͳ¯žìYˆ?åœóQ|w!?ß"RØ | ?Ð~gí¥Ü?à¾á¡Á~Í?ŇÊwü1?ÞSZLyJ‚?ÄsaUÒTl?îkœÿ¸?ÀÛ÷h?æŽt£ú/N?Ë9a¢ð4ì?ê0gqKðF?ïÌ>[0í?Ô¡Ô©m?—ö£Y À?ÓWãTc§?èÝïúÛð ?ÎJ6©Êì?àçBÛBO?èW' X*Ý?Ñ‚+Ÿˬ?ìs‘JÀ_?íÖ`b€Öb?æ"À{ÂEò?ØÐ€»*`?îèlÙí„ô?Øtövî?ë| ùÛÕä?àÿ¦VG°?Óù™nЦþ?î³ô?߈G&¸)‚?ÆrF!¶?íÓ¾ØÝ?ÂÊ‹®Yd?Ù/Þ8Y.Š?ÍGNÍ¿ŽÄ?ÞÕgTqó ?懨íO?ܲS‘‚>?Å‘F×?ݤxPß>?é]#¨ì?é6e^vË?ê=8Œ?ãá厅ñJ?Àò©,VÎü?åZ¿a;a?Ô~fï?åo €Ÿ¥?ÉN°a4L?åÐÁA®¤Â?ãèõ¤üìG?ä¼¢~E5ß?ç ´žz?×ý‰ÒÀ¼?Ê·^Çå?ÚB9íW‘È?í0¤NLÊ=?Òô5ñ¤F?ã ³¹rË@?ܧ´°P¸ž?è,fÙV7…?àÈk 6F?Û"/š,\?àjаgØÌ?áv8\mìü?ìö%1žP?ÒÁ¯9£Š?Ç_±gˆßH?ëî¼×4M+?ÎØÜ?í8U8ûM¡?ê!{ml‰G?sR¡"™€?â¦üô^\?é[ø/3?ÝD•ôÇœÂ?é´8è>?çà~>Èe?Õ#0V ÿ?ê{U‚c¸?êÒóøU?ílJ¨>h?æLD+AU?Û),Õç?½MPgåh?ãwd×2øž?¶Ëw ²® ?Ùƒ¢^õW–?Ó`^ñâ?áì…íVçÅ?î/Œ´6Ó‡?é7Þ! ëû?­m½œZ¸ ?æŠÖÈÑ:ê?àAðæ&?ä`&P€k?íÛ¶òk?ïë±\ @±?é®Q†{–?ÕÑUEøœÎ?îH¸Žöe?å.*dׇ?í0> ­šœ?áúÈphÃ?ÂsÞðkÅ´?뢭6?æs¸_¾X¡?åL„(²?Ù]…{=0?æ_´ Zs?ªà=s¸ ?Û`´‘o€?ï‹åÏ{?æˆ$’2?Ô|+ŸµøŒ?ÓióÔ|»œ?áHz¬8?©x Œÿl ?Ç‘#Çψ?ï3L—@ž?œÿ$Q!¦?êùº0i·+?Õ3JTÀAh?‘×–Ç—`?’&½ ).`?áÍS>a0?éíHâø?Øž=õZÄÚ?ázoº D“?Л($ $?æ’êz«!?Ü¥ Ã%ï„?í0¼0 5?íêèGÅj?Þ=œ*˜?ë½ìw©?áL Z+=µ?µü"ˆ áð?ë/ðs„V?ìBŽ#ûy ?× õ(÷2˜?â òü¾z?à¹ôF×ÝÙ?ÒÊpH­h?çö¬Ïæ@?O8¿Þ`?Ú8SO­Ô~?èƒn[†œ‹?Ö«2ï×Z2?àÚßGqj‰?ÁVÁ”frT?Ç#¥Ø?Êúýž¸d?ç¢aûÖßñ?ÅŠ¸ð?êS$ƒÿ?n í»ùŒ?ï>áeƒ?í™çEg ?ãh¯âø?͘ó÷]»ü?º,7×LD?îZá¹&¥Â?à/Ù „j?à}Æ®@ò.?ÈÄFÝÞ?Ï%ýdƒä?ë5ÖúA?¿bôÏ;H?â´PcªH§?ïÆ*\)Î?㘺¬Û?Ð5ƒÎ2Ñü?åè RÄ?Ø Û^„“ž?êG+Ú™=?ä®@?l,?ìƒ{œ Ž?ÐÑ _„*?î£_“ ß—?Ü(ÝÐkrÌ?ä}J Ã¾ó?ïÀ³»Je?³Ú¾á¤è?軩Ý?éƒS6^ò?ï…bÞϼ(?å[7Ì“»ƒ?ÚÝDãVä2?âüŒhÝÃ?ȱw?¤ïr ¯®?ÞNø*2?Ò|€ÄNØ?Évj¸F\?×O³Þ®Ð?ïÎ>ÏìS…?ísF$Ÿ·*?ß0Ey>Zˆ?Þ»üV%òê?ÕwÃà:?ìÿw×»²?é8fïßÛ?Ù4ÓÔ?Åyspívt?ÑÓã‚î9z?Ñmç7׌º?àÁh r+œ?åR“N*_Ð?Á2‚“åT?ãLÔut ì?¿Ãë 1À?Á"¿ˆ¤è?ÌAFšh¨˜?»¡£ˆµZ0?Î#ce¦ì?·­âXpH?ëO¢7æ²?å)ùN™Ú+?æk̤鳊?Ó«BÐqš?ãu9T|Ñ­?©·E£‡nP?å½£mLj?êÀNø+²â?áTéj°œ£?åÕ¾_€xµ?á0XØU¯?؃ŠÍ¿)Ì?®O Xõ†Ð?çf€nÄðì?œÉ&”NG@?ëk¹ÿ\?á?߸N{]?‹ßÇ ?á½Ç‰jy?îûóìÅîM?æú*ó p?·$©üØQ¸?âëe=.GÁ?ÌTz^ô¨?îüdóG?ÝSñг$v?ï ÂYB Ô?Ý/UÊóKú?äHñ?T©?ïšÌ£*r?Ý=&S70Â?Óóü8bh?°L¯ÈIˆ?§W‰–Û0?¯6^ (0?È«ƒy^ ?Í«¼¤"8?·&N ®Z?ïµNñFÂ?ážœ1? ¦?×ÎK¨±°?ÇP\ì^hl?ì€M“ÖÏ ?ä;*· D?é{Þw¥t1?Euh„?ê¾ÖP~k?Ðþlâ³?Î?ÅÍ @‘h?ëíÛ4/„u?Òÿφ,?àÊbÉ_?ê[nÁ)ˆ?ÐÊñy:?égz*·?ÊkÚ\ch?ì)a[{ù¿?Àá=¢ì?骆Í{oˆ?ã´~¹¸ñY?æÔEû?¤s7c—À ?ÜG+)‡-?åîç‡A¿i?ÁÑ[ \|ô?…UVÅjJÀ?ÖÆÜrÌÊ?êˆGc€ì?àÐí‰^K?½NX\®`?ï$énT?ïȧ:ù|4?á@‚HX?ÐåFæù8?á1ÌÛò À?ìê¶#O?æÙG9®‹Ý?ãYÀ.›?ç›!»‡§O?Ðùe÷"?¾ûLQø?Ïì5ÆwÄ?é6*§o€Ù?áÆS¤»´Œ?Ï\‚1¾@?¹ÎšÂC?íP|`îЗ?é.YÓ‹4 ?à§à$~Ã?Î/G”›$?á°KËAöh?Þ4J&|õÌ?ìvÇ'Á–?¶†¡•0?çtÍ‚p‡?ê–ç¨pžÞ?åoþÉî÷?Í{œŠ ?Ñu.Yxp?»<=ì^? ?éèoyç`?ëuL» ØŸ?ê‰=Sö3?ê´šäãñ?ë¦kŽº»?ÅÒZ8%L?ÞýsËå²?à 8Ð Ÿ¦?¼*œY?â ©™àBê?ãw§3«²é?ÇWùŸ?îôq£O?â ”Œ,ï?ëæK ­&ä?î:{`ýV?Óã‡u,ìp?é«AZ,vÛ?ÝÜΆ²²?ÑE’ñ¦T?Õ©© ýüd?åÁd:ýŸp?ß;Õ$"'B?ÂZµ²f°?î¯ ˆ÷ÿ?´)¿w@—?ßB"Ió|L?ȉ‚DÛ¨P?Ìû 9jI¬?Ùôÿï‚6?èo÷hW…?È ²ÎHä?ä.G 9µ?â÷r› ?îô瓽˜8?Øå&lïlâ?à|ƒ"|EV?àit¬®¥?ä×íÙÕp?Éòwáµü?ÐlI×P?å£ 0È?¢z»õk‘p?éÄÀÿ>´}?ËmºÇþ'0?ìôàNJÉR?°$ã­V¼H?ËjQœˆ\?å…׿nŸî?Ã$ÜE<?Øgê9š" ?ÏÜ™¦E±Ü?á¹y3oÏ?~\vïNT?ÔR¤ŒXlP?èáì=Y;»?dž)÷ax?äï‰s“Cx?äå.ÔÄ?ÙƒQ?[u?äì6¶wöm?ìñ¢¶²ñ8?Ó/‚š:?ÒŠ¯`¥€?×3¹ÈÙŠ?Ÿº»sÔÀ?¢K,Q¶‚?å Ô3«?Û|ó˜|›ž?Ñ'Úì–?¿ïø êì(?×DËI…â?Ûé!¦# ?³Ól+θ?æ"*õ”Õ?ÛÉüPü®?— Rû4üÀ?²ù8ˆfß?ìè¥æ”ã?ÃÃåÈ+Þ@?ÙZdD“E,?Ý ¡µj?åÀU¥û?àÕïÃõt¯?ï Ñ?φR?݃q-0Ð?ìá¸'sU?ÀÅgÑ‘À?â,äiT)ð?ÄGîd¤?Щ¢²“{?î%@ÃHy2?Ñ•bŒÛ¦t?銬(ejÎ?ÖY§äHœ?Þ52{“’Œ?ÂõGB¨º¨?æs€6=Å–?섢Α¾Ò?©ë NÜð?¶¸_K6?ÀõÅ>ÛÛ?èTHØCé{?°É^íaip?Ó[tÜ J?ëÒXzs8w?ɉEÈê¶4?îòø‚hMm?ßbtºnð>?´ÃÞ$Å"0?å^ûÝŒDC?ê†LrY€`?ÚÊãd“?æu ©åŸÛ?Ðh¤ìd?åµu1Æ’ù?Ö( së?è~ª?`ì?Á_ Ì ð?íõ­Óà´}?ÕüOû( ª?à‹ t°wµ?ÊõG”ê}ä?É=" )È?Ü-îm;ò?Õ„ü ?á“Lq²–×?âC‡¥Ë´Ø?ÞWeB?Å|öây( ?ä#A·2I½–?Áײžfì?î:55ybƒ?Í^\@ëbü?×¹YsgIH?î/-ƒƒ?ÕÎ!˜œ?äõµBäóÌ?æŠ×ù; ½?à ªXï?åue€•Ñü?æ mƒal%?Ü*@×`–?ä½`+‘©/?Ï®4îvJ´?Ý=WeÑÞV?é–Ña·ö]?ÈiðÛŽÔ?Á ï"‡Œ?é¢j¬ˆÓ?í8¢W³e¤?À?–Ž} ¬?åŒSò:Rx?•õse™?ã]Îø?ׄäôªÍ”?á‰p¼‹¾?Ë3]1!Ì?Îøs{˜™\?á'á"¸r ?ß+c0{*?ØÆß”+¸Ž?ê¼þËé/¬?â‰Þ?ÌQ´…ž?êÏÎÈ’?è& bZ÷?¼¡'ÑÁ¨?è6öÜf?îß0N A?ìÚž E¯?íPtмGä?ÝdJlž“Ê?ØAÏ·ˆH(?Õ(»P€?ж&Cmô?æ:[,õŽ?æ™Ô>_\ð?Ó&JVKÈl?ï!~º (?Ñ@Þ´JEl?Á’ƒµfâ„?áÙêòÏn?½$‰„SœX?Õýïñ…_?ÇÁ{?«}ä?Ù:O,wL„?äv!ø§p?ì»A\ƒI?×ÕWýÐ#¾?ØÁ.1Æâ?æÙ¼$ã-±?ȧ˜ø§Ì?È]OÓ]ü?ãF0œw×?ÔÞâoà ˆ?ç’¡£#þ‹?Ò=bðp ?Óáò•kJ?á5;lÈ?â©é-…n?ÔÔ Î1ÅF?̪ÖÏÚNì?LJ;§¼?ëvCÚBã?Õ¨þó8×n?åBº?á~ÃÍí‡LìÑ?Òf™Cë„?Ü 9bæ?Ê\(1´æ„?ÏÑZûh?ï‘ÒM›^4?ÈÀ° Öæ?Ò§ÞøÏŽ?È%ã–zÀP?ì#®&pŒ?í½vSØÁ0?äþ‡í;Ý?æÂ-ÿ]uú?Ô¾Á |¿’?áõïXÓ€.?°ƒ7<œ>˜?à ñˆ_¨?›R¾* ?àÄ2`BÄk?íÛl®!?Їþ®ý¤?ìf„Åj­Ù?ë 'E q€?×;5¦&Ì?éŸÝb”Y*?×~4Ä`1?ÕÛQ u¸?Ôa_,= ?ãÓ²D¶Ž?ÖÞ®‡ãÜ?ä Ó˦¿×?ÕÛçð?熶œ“?åV?}[gÎ?˜æ <ÅÀ?éÉw[A?Ÿï¬y>¯À?ÀÎ|Ò®ÕD?å#Zqƒ}—?ׯØk¨?¹¦Mº_À?ßQ#Na;¾?‡³‹Y\ü€?à¤_DÖŒ¿?áÜ…Œù¦?˜SG b`?èÂí>8¯û?Öâk P«Z?Ëàok#Fœ?ØöuN•é?ÕÀ? Ý&Ò?Ñt·+Gª,?Û¢ed^ôÚ?å]É»S¦?Áó7¦Sh?ÓwæÙš`˜?ëPÍ|Òc¯?ã†Á j?ÜQ”‚$´¬?Ø"'üþ?äñ†äU?ÑNfTr?ÑQµâh—8?{\ÇÃõ½?âëhƒO+0?ètõðY%?âÓìÃDÖ}?íÌÎ œ,Ù?Íðø·ÞÍd?ÞÜT°á?„ª_!‹?Üó‚~?ïL_èJ•?¦§âðBƒÐ?Øm °s²Ö?çñèè¥{)?±hèÙf[?¿§riÇð?:^­Äà?`Ýi<È-? ‡Dì‰?Ý_,-¨O´?Äa~‘ÊP?êÔ¯¬–¡y?­Ò¾A‡X?߀}¶™êæ?Ɇ¨’ÓUP?çÈvø?íí½Êž©?ิöìX¢?»åe0Ø?æ {–Ó™?Çcߤõ ?½Ç[‚?×wî`0ÞÐ?Ñ®u-fr?Û]T?l?㮵|p[D?ä?ìß*D%?Þhi0IóŽ?Ûá®»»]°?éVœž›¢?¹’<Õ;ˆ?éÁ1Un(9?êî€Q}‚?®šwƒhÐ?î ]jSz?´Û§Û×?è]Ìì Œ{?è4›Ð =?ÍÓú ÂlØ?ïíÿo],?îÄ&}ý’y?åjVã¿Ñ>?˜¾â«Þ$`?±À¥L¼ `?íÀ¹’Xý?í»1!?¸²«Âlõ?ëÙéP"uL?µç—× ¸?ÈñÐ]LW?ãta_ýŠ?ïÊkØÁr?ÕJ2dÊø?ç¥c=zje?î©/|,¬?ØôXbÿdr?Ô÷±áŠº?â! i2?æa0ØK2?äÑ&»êš-?¤'' Öð?ãÚ·‹©K?Ü‘va/ž?Ú `.à} ?á†É:2Qá?ÂÉL±æ4Ì?̘*¬vì?ãu×áM§?Ÿ[ðúà@?Ø€sÿ§R?ì¹A¦*Ö­?Ýçì"oŠ?Ûu$!Y©?Ñ–„ÓE?ÂÞ»i$Sô?â¬å‡é?Ù]}‰Ç¢?êÀöTÁ¶`?ÞÕp=-Î?à©™‘[h?̃ëz«ïD?î†( -“?ï¿ù®“?Ü?Ìâ?¬ÐUL`?Ø}™æè1†?ìûãÌ88e?×aÃèÀšN?ííBò M?ß3‹‡¼?ÐÞávƒ|?ê=)åXêù?ÞïRƒËÆ?x'ð ,º?ãИ•KÖ?ï -Þ«‘?ë$ãP«?Ðfc#¶§Z?À»…fDu$?Ð}pà…ö?Ôþ[­ÐØ?Üéš)œÍ¸?äg0Ae»?z|â°€?Ç`ú\ùA(?ìÎMl×Z?í—Ô˜•'.?äµâæÄsÚ?Õ:}K®?èöŠL,S?߯e‹_Ð?ÉÇdnGÉÌ?ºÙW©.X?èA ÇÁéG?ä¦íS?å]!>Xiû?ÔÜ?,¢ÎÎ?îÅ=j€Ü?ë×׸Æ?äÁƒXÆob?í—Œ¨±?î%fBKx?Ôj"(?é&éD®3?æÒð£Z8?ÛiHûÀ,’?å) %D,?èsâ|ØÕƒ?©7C¥¥à?íæ3¿z?Þßhâ8¨?²èãèËk?ÚBÏWc|?ÕU¤:}^¶?ï„Ù± bA?±lÁ©9µ?éîÏ0?å?ïªàuP°?ì±Ë%1;?Þ+.ˆ?ã&ÑÚqS ?àëÜ‹8ÈT?åé.Qö%…?榺LX*Ž?Ð^“àndx?èÜD4jíH?ŨvÈ~ ?êGNó¦Ä|?Ñ™vk+•4?êÑξc?ÖoÍà¦<¬?çé2Päÿ ?ä62ž¸>?ÁñÁ .?ãF’Žqy?êÜó3ìX?¾xT8@?Ô–gÌÖ£*?Ür;ÕÔ?ânIÙ˜?Â.‡„âˆ?êi÷ê2,?ä캗ý?éz›ªŸ?°Ìã$ƒP?Õ ÈŽÚ?×´[ünÕ$?æšÿV*îZ?ìcc8ož?º|ý°0ÿÈ?×AL6?ã§‚×Îò?æ§Ô ?¢v£j÷B ?ɤÆ*ê¼?âÀ“ÓY0V?ärÏA-÷?äÆ6–³=?ªòT°ø°?ÒçoŒ1H?é§ü©T‡?×òÂ5áú?ä:.aSÖ?딬ɸä¯?׿ð0ëb?Úé= e¸?ÖŸ–‡ýÊ?á…$%’h?éÎD;²Ç¬?äh¨N‚7?ëÊàmg?ÐQ^N£S"?½Õ„{Õ ?å¶¿rH$Ô?ä%Pé,?Â!Qàd?ã(KG> Ð?ï@²4Žv?Ø«žKSš?åºÛSðñ=?ëUˆ× º?íñÛÀ?´Xè!dp?Ë|Çàeà$?ÞàU¯@VÀ?ì¨õŽ?­z52MÅp?ç÷@ ¨†?Ïle|/Zü?݉Qw8?Â>=Ä?æá¦D^^?â­+ESX?ÚTÂÕÛà?í’¯ž Ò4?ïÓÃrù™?ØŸ»èF?Ó1ýyL£?àà"‹d!?àê^޳?ì&ãûÛ% ?ë{®·@é?ãëTÅ0?Ò˜É?ê;K‰u[{?Àò»š»?íFHª ??ìNfLoË?â‰ö§þi‡?±ÕvÍ&H?¼¥+¬¿" ?äX¯v#> ?Ù×Ãÿ.ÅŒ?ëã™§€É?ÚK ’_ÂÄ?æfdœÓ‚³?Åÿ=¯á?Ù‘iO—Ü?°7ÑxÀ˜?ãþÎFý¾?Ò¢ï *À?Ã÷!Ž‹å`?îðM…ð?ÑŒ´P0?ê–!*á›1?çÃk5BúN?ÛU;Íņú?ã²$#ØÌ¼?ÛzSÿ®*Ž?æ< r˜œ?ÏtÙ|þ'Ø?¿Ky(ËÉà?æSÃRP?ÁÅMT°›”?ì½-½‡àê?Ó"Ãðl?å¨rŽO6?ë+jÇW?äðü™&i?íò‚Qe?âwåêÃ?Ã"|¶5 ?ÙÄ5xžBê?ªÓFvqÀ?ïj·WÒ?ç²&Êú‰?ÌP"=ð@Œ?±a¸/h?ØP$-ý ?î×N‡‹J?ê×Çò0‚\?æÑýµ‚?ÊTÓÌ#¤,?ÉЂ¼vI ? ½‰½ˆà?î`(‰nWF?Ãß™4Ô¨?î-]êýX—?ê{NäƒÇ¶?ßuÝzÖ?Àé,¦« ?à‰š¦áÙ?êÚ%MàHz?Áí“FvNH?åÊÕ ðu¦?èlfÁÛ0?áD‚p\?åçç².´Ð?ëä)*!D?ۨϢCÐÆ?מüš=¤?çò?ƒƒ™é?æV¿ñí:½?é4©/Þ?ëþtdÈÊá?ç ¨¢—­½?ê têÙ‚?æ9=HÚ$ž?¹Ã|oP?ëoÏ/I?äè’¦ò?ã?ìäðìj?æ.ñéN?¸,[ÓÀ?Àkª`×þÐ?·º o5ÎÈ?ëNÌ|)fï?Ä”¼]k „?¾eÆpCÇ(?¼çy!?Ü0Ñk\?î”KnÈP??ãÉsàÌg€?îO$½Ð“X?è O$b?¬~‚òõXP?Ô¹Þã{?Ä}—!‚†¨?ÛG{í”?Å™ó½eÀ?ÀÀ¹²1Ç ?æ˜õ¡kðé?â|HÆ7?åúT–·?Én>üt?í`¹Ñÿk?°qzÄJ¼¨?ã&ƒ‡§5?ØYÙ£ƒÿN?•µd/¹?Íg1ÉÕ?éé©x²ÛÅ?ÙØ¬fßõ ?ïî%sÇ„O?åý»ÒZ?ê-‹YÁ¸‰?îõKЦ?ÌÏZ)D?´óy~íp?ÚÆÙœ|†?æÂr"p«¢?áæò{«ôf?ä„ÿ¼Ì?î¶úQ°üõ?ÛpÇØöÔ?àq&X”e?í™g4PÞ?Ô}Gþ½0p?Ú§`6³èà?æÌ¬¤c˜X?åK8'pÞ?è*÷ýY?Ùx(«¡È?ßË EB”?Ô„¾¸?¦Ä‘jŒWÀ?ݾ¬ãpž?ÐôïuÿÐ?åf6 ~ ?¤¤+ kÆð?ã(—ä£éò?·®Œ_Fb?½>5¹tÚÐ?î‰ÃÕ€š?ÒãÊFPÌ?âƒY9ø?ê­‡¤T@?¯>à‡“à?ìJlæp5š?çÆÍOµ›¿?ëÚlÚöY?äU[¨´9?æÈÅ£ÎÛ­?Þeh%Ý®^?éA˜b0?²–à‡÷€?Ê Žô¶´?ØÁõß‘¡Ô?Öšc÷ÚVÖ?ØÂZ0N0j?Ê€82/`?á)«ýÁ–?Äʰ䢼?Ñå­©n?쬋Åž?âN°eî^F?çz·?ë2å3jI—?îÄ‘Âó?¶QG¢Ë0?éŽF\ðÓ?Ûô|1‹SÔ?ëh.Ūv?âçYÒûW>?ÒEäÒÈh?ÀÓ*ˆ”?ìq êhf«?àVR}F)´?ÆþÉ×ð?Ò” -«½v?Æ9Ó†p¬?Ë¿8³Ïä?á\äüÐ@??æDtç´€?ÁB¹cAFð?ÈÞâùþ ?í°±«Ò¬?äÌ´Ù‰(?ëMƒOÕà?Ú—v½-²?ãYßÜâ?è0 Zy¬?à’Ä‹®Á?Ùœ­ñ±5Þ?ㄤ¼Ýþy?Ê ?ÅaÈô?Ú²b:$?bÚÈê]”?Ðé×Óâà?è¾O`¤Öž?íæÂ»ë'?äé³Ñ@4?äLG“IòO?Ô}wÆÈ?ê<5ç*™°?âæ£Üº%ì?äHåf##R?è’ˆC4z?O òÎÜ?²JZ‡Ý ?Úý?5Ýx?Ò#¨¢€óÎ?Ñ¢C‘ ~?ï,ýyÒÀ?ÝfS0ô€@?î{åó;ÓÇ?ïòG¸r¡?ÛhÊ³Üæ?éòdÉ~?çg(L á?æiEBuœ?ì;­`› ?àœEŠ„|P?âä@¡•I·?éÊ÷F'¹ ?mQç˜'?ê§~K„V[?æ_DD¸ï?â‹@j*h?·xq1O”x?î²U< i?àÀŒÓÓ­Ü?ÇR½MO@?ÓÆ©Ì?ìvq_†ê–?ÁÀ¾º#ˆ?æsvPÖÐi?ìO¸Lÿ¸f?ßEÀ»-V?èï;½x†#?ä¬ Fn›ÿ?ëÊT|8-„?äûß«…€†?ª²øn÷¹@?͈4—›$?ãžäH@—?à}¼– ”Ó?çOèaUÍÔ?Û øÄBÕD?ìqéÁGæ?Ñ¿/ø:?çw{Z:‡]?äÿâçå?Üõ™±Ê½è?襫IZ±?²ï'rÍŠØ?éºFim‚A?æCµ×ãM?Ö˘l}·^?çJ?¢™#Q?àOÆp:c?ž=ä¢ ¸à?î›ê?ãXJÕmÐ;?Øÿp9‚]ú?À+î“P?âô•ýöq?Á~ÌŸ‚5l?ßιÀ?ÁØèrTè?«ÏÍ¥£îÀ?ì!?/Ùj³?ÔÐ ’aá?è[Ó¹V?î5Þ¹ÖÝ?Ëö?ÂŒ$óV€?Ãô^ÒÆ^ì?ã“›bnQÙ?ÜÐVñ™®ä?Ýv2åón?îX+Š ~’?½æy®8„@?ì¸*Ó€ý±?É€ƒ”?äÆÙÜð¾|?Ô{\õ0ýx?ç9ýl‰)…?Û‰¶uC.?£š™T‰ƒ°?Þ¼öÛH‹´?éJ@¨Ê?ê~l“h?í šÖl?ÁMg52Ì?Ƚ³çó?¼?É’;Åö\?²ô…Ù‚p˜?åëÉI•J:?èkÓ¨ E?â™ØàYŸ?ç¾°Ñ„ æ?ï³ L¯B¤?ãW«ku)³?ê¥åÜI£m?Ý™® òÓP?Èo_zƈ?íì0zf?Ë/ F^?Û3¨q¹44?äá‚Ò¸Zè?Ñ]Ép¿Þd?â1˜ÚlÈ?î©V©š ç?莚2÷ºM?Ìšt—ü?· S5!X?é2¾S¯$?Ç+å¥Wà?Öí¼©æL?’^Ÿ5¢?سyâ º?Å.?ß@ü?ï.ÄpUCY?èš IVk?Ø“R¥³qž?é¸õ’;\?Èp"'_!¨?ÛÅ(ôbäZ?Àê“Y½|?ç`ä HÑk?ÉU?Í‘ ?Ü~Â;Ú@?À.ËSO8?èvq*?ãt ÇE!?×*g}"˜?ì7ò¾ì$?éçêBôˆ?à°?š‰\×?Íã»[³¼?ÙT’‡¿ ¨?Å‚°ut?㡚t€Ð?ã¿RÆ0¡Û?Ðs­"Îúâ?Ôæ‘CüŸ?±5À±Hê ?å¼ câ<Í?®xuÀ?ÍWÕéÅ·?ÀËïZçt?è¸ÃÎýÀ›?ïuÙKäWt?ë@+‡ã‘…?縅 ²?Ü ;,ˆ?×ZîeR‹L?⴪ȼ‚?¢‰4V^Ù ?¼f”«à´ð?Þ‘C¿Àš¤?Æ•:bèd@?Å]ÔþÌ?äÝ&ÁèÆâ?î£5S«m?Øàv»Ò[ö?Ëm5#­=´?Úì™jÆ?ä¼,à‰è?ã…[ÕpPT?æ·Ý¶ši?§]¦Ä±u°?ÔÍÍ‚ÜÚ?Õb¿>ðŠ?ê#/Ö§:/?ÎÆ 8Í|˜?Ó.ï#L?±ì Pšx?‘'°U?ã…ëÅØtÊ?,Ó7I ?àC+ìh¾?áP÷xb©×?äÓt¯T¿?ãÂñ“u߬?×÷gÄÃíJ?¹¥rwbÕˆ?éÚ¾,÷c?åßGAÏ0?ï©r¥m?¿ÇzÞÑRx?ä iï^-Á?åF›ÌÈNl?ïü¤}Ò  ?«’%„; ?Ãçæ5±x¨?»ì[Oø¸?Ö…mŠà¬?ÉÓÀùÜ?ëº §¸sÃ?ÏŠÿüVêì?›è’±7?áÝ]þ?Ùas7Ÿìz?æÆ]­‰J†?Û=y°ªë°?¤ìåô’0?Á¼ÃÉ…œ?íOÒ7l?§Ì†5+p?»¦ìÏŠp?ÐI¼SßÀ*?Õ CÞ€­¨?ÖI[kEh`?ßrm—Bà ?©;á¦À?è© þïž?Ò!ÖÏÌ6?¼x²;± ?ì˜dE½Û?ÕnļԈ„?¢u þf ?ÍÔoQôð?ØïÞ±Ú?Ô ßà®”>?îtVÞ#™Í?ÕµdôeŽ?Õ zåÂ?çãr+?¸­?Ñüm=A¤Ì?Ø óÂ'”?Ѩ\ÚVx?êÑ‚S.ì8?äA\/?à*šA=4­?ãeۓϹ?Õì†æ-&?ÏJÄÝFüœ?ÔÈ5ã#ËÊ?åHl{{s?éIgÆÜ©§?ÄÈpù Ü?ím¿Ì0?å ú ìÖ¿?à{(”!6S?ßX<õߦ?á2±OßÑ?»Ým<Ìa ?×á—08wê?ì$e[Ûw?çR„&3ÿ?Ä©Ø Õóp?âÓpX§?èZ‘¿~û?è ¤ñ—¤9?éeÌÆjµ?ç£ ¨Ý?í"´_Àð?ìþºã°V?¹¼P ?Ô™„Wª“4?î‚“-ñ?ã)€J2±?D!ȨÀ?鿺;vY?׎&`r?Ù·ÕɆ?ìõκŠ×?ï&¤>S –?ÐÚÙUÂh?æ&#7Qî?ÇO˜·‘°?ÊÀ5f6f?¿;ׯºØ?×á­·Q?,?Öh{ÈB]?ÞfP8¨Ë ?c‰©QšM?Ç·qÆo¢ä?âC¢03]¥?én'2ÅÖK?Ö ª±x‚?çµò«=AÕ?ÓiˆÃÖ„?â;ÜÆ¦n?×F^â€æ?æà%× ?î ?[JÓÛ?æ.Ƕ’?Õ§ep‚(|?ÈM³Ô¨Ø?áft\ŸH?á0M(ðâ?Üu?„Œ P?Ü^ê2tlf?ÞÝÖ¡k?æÉ;tº­`?Ò?Ð|^õ' ?èÁ›}Ð?ÏIãÏ€gh?ÓgîìÖb?À––¢?¡è?é×Þ›rÌ?∠j»O?ÞƒG·^l?äÂÜÁÆ?çWœ’Íê?Ù“áüüá4?ãKi2 ?ìst $l¼?½oM^ö<ð?Ó´?]A6?ê:;u#?Ò`öëˆ?ª82²à?ïÏZæs–Á?뀊q/=G?Éó‘$è?å?å¨àx?ä×Öó?ìsü…½á?Ý>/ÎÞX?éáN<î[\?Þ®h†~#:?ÒµVÄ8˜î?­öÉ]• ?ߦËW•2„?ØÜÿ›L?Ù— üôì|?ägB;GpÀ?‡¡þ­ˆ8?×OÔyv?Ô9Û$l?ãp.ÃÊò?°ã&Ð@¸?Ó{v˺?íGˆûñY?¶¸?×È?ármYÞgp?åå2(„+é?Ë,øøŒ?ä†ÑÉà?è7•a¤Û?ÝÓK Ä ?é +Æ+’à?è0æìÏ?ÜÀÛ×ò.4?ËüÞjí @?ÌŒI«¤?¯gHH¸?bóéµ8€?î:ªq¦Ó=?ijÂpáo¨‰5?Ý™æ”Íà´?¥ni+ÖËÐ?»@s·ó!P?¾ ‰¨Ò¸?îBï[C¨?èîÊ—F?ÛIìpt$?âɹ¶Ðõ?îÙú ‚[?ÐX:_o^?á¼?ù+‹=?ÄÀ‚…K?à‰-èÝù?é3úªÄK?Ùò¢W®Î?é¿ò¯Àž?Úó<<ÿÐà?Û²´®yV?Ñp¯„_Œ?ëí¸js?°4$…qǸ?ìž­‡>?ꦴĿ¿?戫 ¢èü?Û2Êõ¯|?ëOæw»?Êœƒ(^t?´k‘5ÿ(?ѶÆ8«5&?ïñ¤vó)®?ár_ÛH?Ñg©%õœî?á,s[Y-?ãéê?<@ù?ÑkŸÃ¯ãú?ÑÀ(ùBœ?ê¶^ÔP?ÞE—:ÂØ?µô*ÄÊV˜?è[eZ¡Û¤?ã#åÅã‰?ÅaþH?⺶‘žÜ?àÚîì Ál?èF{ ~«?¡°{h­@?édG9ÚS¢?×[FÙÁH8?à‘‚¯»z1?鬻"Ø…?¨ï×5YÏ€?ïäí߉`?ïÈ•¦Ã#]?ÛD€‚.¥š?àž:•]ú5?ã´¹3µã?àët¸…T?í«Áûþ:¤?ÓEòQ(—Ú?Ã5ÇAóì?åÙ­es’±?ÃØQJk|t?rôêÂLŽ?äa1òëÿ?È4Æ+³ä?ÚSCª¥?ëh‰à²Ž?–°i]rGÀ?êߟ¨^ì?Á Ÿ÷Lð?â ×nç^?¿‚ãrË?îÆ‘g¦÷?Ý]ØÒQ ?Å›è”W±?ÒŸ9Ñ?é.›25X?ë<˜Î Çï?æ$W*ÿ?çËpX¢.j?éTj\(!í?ÐZŠDF?ÆX‹«V¶?Áã•¿Ö(?­PØä©?É›ŽþSÕè?í!"­ l?ÐÁ:ú?än¡G“?Ð }'«Ž8?à4 —UÉ3?ë sqàìU?鄯$ž<_?Ù™÷Gì?åù™Ùö#?ã-w¶.Ÿd?àjXw>?€ä<,NÀ?è‹%Ç3óÍ?²?’6™@?Ñ‚¬•¼?äSS¢Bè—?Á…D£S\?ÙW=÷0?áLÛºƒ”q?å„^ 8s?Ï$ómìÎL?ÞgDAŸRX?«qZ6rœp?Ä•ÆU'Ä?ÔQ|^°ø,?î¶’ÿ›Ä?æ¾Káñ1ø?äìJß}k?ÚÐíÚZõŒ?çlðãVË?ç·k°ÿµü?íXHB& ©?Ëï‰6Y÷?Ù™ó¾?ã®Q³2º:?ä7LŒ5 ?Û12ê³>?êÜÑÓ±÷?¸¡ºyð ?ÍA±˜ˆt?éM•K°ó¤?âßy=@?èéÐÿx¡ú?Ýj´+–L?凙lJv¸?Þé©ÅdZ²?éséci?Å:Æîñ6ˆ?×ÌÊ¡"Hì?íu™ˆo7?ØŽ„:lìÎ?¦GLœ2À?ê-{-æoî?ìÔ:?ÑA;JäPæ?Ô [rø?Ú?ælIy¯ÙÝ?ëm͇á?ã mÊi¨¾?î§Ÿß•?À­OãS³¨?Ó_0›Fî?í¶D¶öÉ?çÉ•dÁ%?åL—†Í ?Ø £…P?ÃÚ[@[y0?ᤠè?¹ð3´Í0?Þœ&NXš?çÓ0bÍ6u?äô²L™ø?ÝÛ>›˜žX?äÎøQs`–?½ÆÝ?ëUÄ@‰t?ÓÍ¿^ñJ?íprboŠ?ä|›tMâ?Ï×Hjó ?åß©O}þ„?Ç&†úi ?î%æ,·N}?ìì,æJ7?Å|„Š/X?ÒÎ7(ù|z?è¡KrÚ„?Û¹kd1Ȉ?Ô àl¨Ÿò?æÏB·vÏê?Ñ Ge¿uÜ?éO]Ÿª£?É„-U}2?±aÐxŠêÐ?å=¦ ¢gT?åÃïeqA?ë Vº@!?Î;ŒÒÀ?î’þÕþ1¼?Ûû“1ÉS¢?ªªVÛš?ßOo@Üël?Ç_œ 7¶¨?çe Q¤ÿo?Ù2ÇA®?ïFBC!v?ÝœƒdÊñ8?ξ\ë M?égˆ[dy?í½‚5_m?Ñ,‹¡¿Q"?¾×©€p)@?¬Wù."¾ ?Ñ…­™ š$?ÔÄõmp T?îZ$‹`)?ÓõEƒ–:?éb/@®”?åPœÛQO=?è}>Ѓ?éÂ,Óë·í?àK6lzûý?¿R#‘)?²¾ÒØÒiX?à/ö ë‚?âGyï‰T?Šúüù%À?éwÒŒÐM¤?æv¸éj–”?Ã\P ?ë9ë;úE?â=¨{ÚŽ¢?ç?Ð-%á‘?Õf›Ó¤?¾Xhôx?Þ¬G/b@?å<7p¿“Å?á¨îåiF¨?z¡ž?ÁL“QQox?Æ fÛkoô?ïù>Q"×r?ëµýñs?çÐýk.¨?ãYB±ñºð?ÚÆïî2?ëåfÏŽ®?Þm®SŸö?ÜÈpêÅð†?ÉŸM_f|?ÀajÝm(\?î5Ç©^Ië?ïßÖJ¬ò?ç–9¥‹ã?µ}ÍŠó¼p?âþäe2Ô¿?ÆÆÉo¯,D?ï©4c§<¯?îHçjQ7?Îv +–Áü?à„»Bõ|õ?ÓoR>R¿¢?é%ú©!z&?î­–WK?à®°ÿ–?ëXˆ Ä´?äií]ýI?åÏ]< 3?9°¦?ëpõ"&_‡?äºAª•£•?éHjLƒX?Þöˆ<‹8È?äêräu&ˆ?»Û-{¤ ð?×`§Ë?ᥜ2K¨´?´Q{–'?ã… £OÅ?É}çc¹?Ô4’%!ÕR?í,€R¿G?Ç&D‘)Ì?Ñ…¦/xÞ`?åVþ‘Äa0?æI±È 3Ë?Æï(úé’€?Ø:é9¬¾ª?×yŽZö?éÍeL+îŽ?Ö´2Oþ0?°ÄíU¼Œ¸?Þl­A™Ò?Æ S—¸@?ä»Éãú^?é° AV?äny§Î)?î¸ê‘*?¸Fÿ>ïx?ì믳ÕN?Ø2QŸB»`?µáËÎŽ·ð?³ø{Äù[p?Ý{T´TVÖ?êµ=iJ¼F?ǘq‰t?åEÈOXtƒ?ád™»Î´ý?ëh†Ã¼‰e?Ç\ô4ôl?çþí· Ùö?Û¬šõø¾Ì?Á?… 0$?ÄJ?þ5„?ßZ®)Œ8f?Ú‡ý¹7³Ê?î Œ%c´ ?âQµ•ž?çh#pËâ?ç–31Ï0?è9èIµ0?æ?R€Ø-}?äÐ#žüžÊ?ÞËå†èÆ?ëµÆ3^Á$?Ê>µý¼Pp?¼â¡µBk?by&?¦R?ç?ÎÙã?ÑPñÙš?é%ѧf?ÄH£.”¥À?ßü²i3Ê?ÈKã=PÀ?áà¾ø?ê‘©ô•\?éꆲLؽ?ÓQ𜇬?áž@Ì5¢?éåìõƒf?㽊© ò?ßqGi ˆ?ÎtжGÌ\?í.×ùÆké?Å6JûT¸?Ð&çd'@,?ÆÃÞR$ÿø?áÚÆ5 ž^?ë¾5 ?â* Цén?Ýô(Eið?Ö°× }Ë?áƒ[¹2?y:ØÅö«€?ê5‘˜«rV?ÓÀçAf?éÖS×vÓ?ëö1æÆ?´“öõШ°?Øûø£¹µ²?íÇ×â#Ì(?èÙï¼·l?ë7Ú^R@ñ?éÓ¶Ÿ£«}?ìŵÁ)âü?ìFAXÉ Ù?ÆoκfNÀ?ï¯g÷•#?ìí,?ë ˆ”¤‹?ÓM>Çm ?ë¡£D»?Ê7ØÛx Ü?ØÅ÷>?Øè¸ vp?ÛG®S ¶?åíOÒœ?ïn•*EW?îDf?î1Òñ«·å?È%ÒÆÀ?· )ÂÅ?Ñ+[uqÀ?Êá|º£Ÿ¬?Çl •`†Œ?ëõc1ž ?Ó,V~Øw ?µc‚¿¡°?é É?Œ ð?ïvØyÊî´?àÉCU.m?Ì ¦Ø“p?îPFé/?Ƶ‰M{è?‡´B#p ?}ÉRÍ?¤ÀðËLu ?éwx#çi„?Å®žÈŒÅl?† À»Ú @?è륚St#?¡tפÀ?ïzçÂôv?Ü5ÔŸã€?í<ñ®î0w?ì<õù!a;?¾=³"ì°h?Øÿi÷.N?°lòÊ?À>½í¶¼œ?åi¯¥À¤é?â0™™#V)?ìháî³?æY:2yã¿?Ûê2R’Ö?ÑF¶“FÒ?íw27òc?걪Ó¾y?èÕ¤Nõ?ÆÂw€bFø?ä¡i$ú$?áÅ>1?Ùùq¾©v?꺊:8Ì?éÚÇݘ ?ËŒê{ж$?uúÕV…Ã?æWZ@Ì6»?ä‹Ùi6O?ë†óòýôž?ÙcÚi©_^?ëum~+â?æ*¢bÌ?Üò ?ÜÕlõaŠ?ìj«Å–!?èTÙ HÁ8?ïK4íæð?íñ޼±Âþ?ëÑùo‘þ?Ñ)+êà¡ð?ÆÛƒJ°?ÃÒô7kQ@?ìã$ÕpO@?ã𠹟Ÿ?£æýáÃ/Ð?â^ã—?âV:°£2E?×Ë(Ó¤?Ä'g{pÐ?è†IÓÃR?ÐÙ¼­2?…-T ”?˜Ô—›à?ßgJa"?¦‹1Is£€?èÂ$è¨Xm?ëâý™’-$?ä8ƒ&J°Æ?îtѵ–? ŠDB¢10?ì…GÆA?Ô WÈàiD?³‘†•._¨?ë‘=!$Q?±ÍvRè?Â]­y0üØ?äŠôj™»?ÚÀ¦O‚,?ï–ÈÆ^Æ»?Ù$©Û\ü?îŠËí‹Ér?Ô%w3í?¿aEüS?§ %ÆI`?ìÇbH®‰?è QDV’?Ù×÷â Ê?âb±Süf?ìGÖ'žA?̧t<Ç24?ÄfëŒò¨?»äŽvyÐ?ë®Öì–Êz?Ø}Í7I ?ª4ÈÍѰ?é6[7}R?ØÿĨIü?Ò—Š>Ü?îG”3q–?ëW†_]]û?ǣ׺5+D?ç~:[Á?µ »DTƒ¨?Ú7\aR¯¤?Î&ö¶ÛÄ?ã¦íñWž?ìé ¸ôÒf?ärÎLµþ?â"Ÿ³(‰?ån˜/§ûÓ?ä"¾Ìò`?ëåJ–˜Ì?ÇMîòŽê¼?²%íG6 ?ÒUn‹n?âz8–c?ï'¨ÿ•7ô?Ãw9!m$?ÓØ;‹'Î?êòðy:gÐ?Ái츖‰T?ÔK Cúe(?Å¡5Ì»Ø?ä4¶7·‹?í³6ã^è?ØmQ«ª?ã¡Mý· X?æ»ø¶!±B?ä–Ž+.ÄÔ?æ9¾OñÊñ?ÙPĈmê0?Ôz]…c¢Ø?í0‹$¥×?éOs| m?ê$%åã:´?Ç‚ÈÏyÏÔ?ë ÄŠ¨Ò?ãü„ õù?èK“Çamy?áÁ|sÍw?àйäÝ?Þç’¤?ä%ý–Âx?åŠg9|5p?±[Sb°ÈÀ?êç›Á‰¼?åzCI?é¯JF˜ç.?ïmãȹ?àvã’ðÝ?Ú¦@ëVÖàïó»?çº1Ê mÌ?ÓÕ1ÅöY6?ß’)3Ç$?ЙXR œ?çíðÒ[¸\?Î|µÝ¼?ÛSa‹7„þ?Ïi;ÙÞl?¤š.¦ Eà?Ý–öŒ,F?Âcýb|’,?åî÷ ãù?ÐPéNSÅÀ?âÀe±ÌÛø?ëÛÔ•%?êûÄ3<#q?àH£x ÑX?í¥Óº¥q?änô%vP{?é(Ä(þn?êrr”‘S?Ô¯¡J¹‚??ä-ži½?ËÔ©PÓ(?·?vH6X?Ø[¸åc+\?àkº—êbÞ?¯ÑñµéÀ?ÖÀ„p:°º?ÊEDÇGø¤?éJÖÂÑz?Ú>׈&?ÆkªÖûrô?åbp|6?¦­Ô…ð×ð?迬£ÁT?íæ6ê…¨?‰ôT¸îT€?ÜXí÷µ½ª?ÊÔ]NX?í¯%*_?ìXd”lÜ?Ð?tOÀ?ëý„=}?ǹ1ªÀŸä?ÞfbeêÐ?³iÑo"¨?Ò¤KÉ™d?ìð+¬y?ÎÅc‚4?ç…¿pôð?íÿ·9œx?ì{lKƒÁÁ?ᨕ¥J”¦?êÅ5r¼[?—¡KõC“@?ë˧?û·Õ?·î=â€?ÐÛt£:º?ä´;éJ?Õ‡+‹’ul?æÚ9&æ3?؉‡?Ñ«¬5U ê?±·N”|Šh?ÝÀCéág?ÀÊN¼žYÔ?èècâåÓ>?špb¢^p@?í¡®RàR½?åpº}`÷?Óì„»èî?Ý-2Ýý ?ÚôÙ8’íÎ?£dd7.ƒ ?Î]Tl?甥r™U?콌#­@˜?îA$Ê#!?ݤ1 (?Ü„G51óœ?Ù¥õW ˜ò?èø ô²Ï>?å®ÑD7?í±:Ì`ú¢?ìj¿W%Ã?ÙÈÁ¢•*?ëš¶‚?ß«Ü=¼¾p?ìæ½5`eh?ÔîÏÂG–?¥ïÄ.¢-0?äsx×U>?ß0¥0Ò).?ÐäŽèæ€?åìyå?Ý'%îÙÆ?Øß!3øN?ç÷F4êÀŽ?¸‰=ØÐ?Ò)eЮÐ?Ñ"û9éž?Ú¼>6ö?µ›ý»×V ?¬mûH­â0?ç˜\à„…?¤;Êë?ŽM» ó¦?åÍï–RX?Ø~büFÊ?ËT\÷q?ïâ°£iƒ?Á¨D­Ù0?â‡ÚN…¯?Ùq°!&ð?ÞµÔä’ʤ?хה毊?膨ũí˜?âgŽg{?äGžR)?ßAƒgÔ?ßðke{!t?âOü/»?ÞJqr|?ìÆùª¿ù!?ì ç$bþ—?å«on’‡m?棊p*=È?×8ûö‰˜b?쓚sdµÚ?Óò´hÎ\?èßcœ®ðg?×Og[¢è?qć¼H?Ý:æßN÷X?àäÉvƒ’?êW”Š+d©?´u8mãð?Ý'×R›î?ßô³€9ôö?Ñïù®…6?ÅÒíJÓ°?èåÔQª?î£xŽUÙÛ?Á›C: ÆT?ÔyâÆ?Ó%{8âÜ?ØKÝ„ê–>?© 9°£Öp?ÛÐS•}^?Ö‰§öMH ?¦ãá^Ô½°?à#m5­‹?×ÐØªA€œ?Ó"âàèÄÀ?³R6úÄH?á;Ëåâò?ë’" ! ?à*ºû¯?ìj4ò?â#[eÏ á?Ýa÷’fž?±oä_ëh?Ô„ÇR¼˜?ˆîwl„?ïî÷MHöd?µ†-ÄØ?¼1¹„î€?Ò’ç¥uŒú?àð¼(ÿL?ÕBÊ’<¤?Ô  @´?ê·f›“üj?á‰Ñ*ã4`?ÙFD¨CóÔ?è*Óͼie?ÜR„æiž?äú0àÌ¥_?ázNSGŒ?äôþwZ?ë•ÛÞä/#?îù›ôò¬¢?å¤}MÚ,?ä¢ÏµÃü?Ä9¿¿?ÖIä?Ôƒ Y% B?Öx÷sP\?ä½í²–+R?êÑiLE‰?îoz_ã|?Ã?*»’¬?áNš6ÕQ?êž+âs•5?ì¬JÃ#A?îóQÁ2„Â?âwko?Ô£Ÿƒ‡²?âÂúL4¤?ëát-ñ«Ù?ãpâ0w?à}ë9ö ^?íp’=f§—?Ðbn°ÐïX?ØSJ¥Êvv?ê%èµéK?é}«t?Õ;ÁÜ.Àh?àYt—ý™n?ïõöŠé«?µê`”ø?ä©-M 'r?阋IÇÓ?Þï û¼|.?ßwP¬ Ð?¹{¼½¬€ø?åaßv²/?áÎ¬×øëÈ?ØàD¼è×ð?é%×èNL?ìAë¼â“?×õ‹ÉL;R?Û;7º›B?ä´{8/2‰?ÄSˆy¯˜?é±Í3cœ®?áûdåô§?ìÆÄd?ॠ\U?ìuÒÏàý?ÓÈËNª?é ;Hð?ê[òÿœC{?ÙŽÆë Ì?îÜ›µ­?¶¨?3 ?å1³sÓ ?晾›Çܨ?“n à?ÙWüÂ!?æöέ{Ã?Õ«ý2;°?ÕÙ0î¯Z?åÝzØ$ò÷?Çç…ÞÀ?åyD³?ߌ[ì¸?¼óE?Ó–‹†6°?ëVKgíÁæ?ëh·œEúc?àÈ´0ã¼?ÍO ÓŽQÔ?º†Y¶f›X?Í?pk94?ã´v‚L?³Í~lîÑà?Á#Û5\‹?áuá|ä?ÐG,|FN?Ùí‰=~²|?È¢:M´`¼?y;%:H ?æ÷ñB­ÃÆ?·ïÔâÊ‹ˆ?ïÉ¡µá?ÞíÙ‘c-d?쯅ê_VX?ǃ~à?ëê-Æd£?å[Bb¿?ÒáóLÖ/¨?ä./õ»a™?€MÿbÑÀ?K®²õ?¿þ v¤óh?Çd¾J6¶`?æ¹ø?„²Ò?É\°žw`?ìCß$s?ëhmܤ¤ì?⬋6¥U?ëö}>t•?É5áµ%iD?àgvó¨n?èYOøë6?ÆB{ƒo?£nÇ[ÀöÀ?äXkêêè£?ËâR7Pt?ÃÑÏUþ9¨?»ö!a£EÈ?ï2UÙ•üo?éTìhvj?›H¿Š›?е{â¥*?èlß20Y°?äU [™}Í?å¨,ß:#?â ò­zÐ?·ÄÚüMA ?ä¶kUJ¼‰?ãŒãÆÓÔ?ä¸+p°ßñ?Ó%±…×q?çï<ó¨íé?¡á°DP`?â’gH„œ?ÑÕSÞ/°è?í0½ˆ”ª½?Òõ?^÷“.?è€ Úôœ±?Þ:ø1¾êð?ïvœÜQD?ÇLmf ·Ð?âÆ«—SÅš?ÓáÈɲ?ª,Åëß?á"ûg³ ?æ]]AT.?ÄȤÈÓÚœ?˪ô]¦vd?îP×E?æâ¯p¿aP?•–€µœ`?íqK<Ô–?Óü5å4?ØØ}OÈÂ?äÂ/¹§ l?¹Öò˜æ¸?ãÕ"¥;\?ä×â:ó·?»ã±Ÿ¥äh?hÓîœ+ç?í]xÐ#ÃT?߃§M‰iŽ?廥­%¢?×Qs*‰–?à©£F?¢I?ÈøJȎɈ?ªØoªñ`?ï UËY^?èZ!ï€n?Õ¢)Hè?Íwš¹T¢¨?ï#J\æÉ?ë%æµ–_Î?â9 ,¸?æ+7ºÑ?ÜëÚ©Õþ?è¸D†m$Ç?èÖ* }À`?í©¡½[šW?äv8œ@”?·Þfªn'(?Õ%msˆ?×aÑ\v«ä?ÅÈØ«¬?áÎ-E¼™?ê%LN1?©ðø%aà?Õ~¦VÇÝ>?µþ‡á;¸?ã^òc¥s?Æ3#“…_4?Þ$.l#àð?ëHx›ñF¦?Ñd >ò?ÈÞ©ÒŒþ`?Ù nç² ?îü §p?Û¡:žÎ?lj`:›ˆ?î†5»¼?ÎÝò;³Ó„?ÒIHú ä?¬U$>­Ð?•º É à?ê!#†¤¶v?Ÿ<0 7`?ãk8bkD?éë9-¦¾é?ÙÁߢdŸt?Ù'¼úÞ?雸e[UÐ?í_F‡9^ï?è)ê›>ú±?Òd“…-@?ÆœÚ=Ì?¦xNWf`?äbüÃЊt?ålÛȹ…?Çé%N‚Ðø?íçÌÓ§Ä?âr‹V*¶?Ñ:CU&?ïQê+ز…?ÖYÎ÷̈?í×8lÓsÍ?ËÈ_Kf¤?ÜQבΫú?ÑÈÆ ²®?Ð_õt6?Ýb*I¤?ÑõÉÍit*?ËŸ3 ­ÂÈ?âræ7­â1?ÐM’ÓǾ?À1k¦îŒ?êV3\„…t?ÔiõUT7Ô?ïEü±e”Ü?ß“d»¢ N?ÑlQzæÆ?ìûãÊÖÀª?èEè;C?×twòÐP4?ØœµÄ*?ßÎ:),øN?Ðo|ƒ‘R?›çù¯ùÀ?Ù·n4º®?ǺkpÕ?ËyKGp?¢Û97¾ ?âdñÔ{ÀÝ?é¼Àˆ?ÙÆ:®û:â?ÙpùMÆfX?¬KòÒ}°?Ö}D]° ?Þ–àœ6?ïdú®’õõ?æýt.º…˜?à x;¤#?èö?"üßN?ÊGȬ¸ ?í…"*Œ?àG!°q§£?Áê Y„¸¤?ál!>K,w?ÙÛ€b ¼ü?£ˆO-¹³`?ÑŸ¢qÜ?éŠõ5`ý*?±=„/Ϫ0?Ù9f/Y¬?ìœ`½ü”?èƒJ£9›?ë ÌZTŸ?ì°ˆ¢m8Ô?ê_ï}Ä?Õ¼"<»,?êJ£¹²õ¸?ÓÍÔ›]²º?ê–·äxÙ?à›jCJ£?ÞKLµG´?ì›}Â7?¿ºðΈ(?ï0d9"×?îKÄ•:^:?áΰØw#~?ÄqPÖ|í¬?ØÓ4Œœ?ß6©]fˆ"?â'wYâó@?é°iÑŽ¬(?üÊäÛ?æ5ÿ!Iܼ?écKwœA§?Ð-h b.Ö?Ïéëvè?éÚâœ×l?áÛvÝÀ#.?ã§šbVo¯?å×ûŒB:L?Íá’S @?Ë/d¶Îø?ëžóûô»‰?Õ¶]ÙåÀ?Ôñ«ßr 6?çóøeU?Ä@ |qJŒ?çž‘8wÊp?è|4»?²€î~ÿ6ð?ÍŠ;³Î^À?Ù{ÚtJÁ´?ÌÉ»›)e ?ê8©–qø?Ú;;Dk2&?Þ,¾WZ¨v?å,~‹{w³? yã ð?ÁS€;»e?Ôð˜6cV˜?àtÃFH?ê# }Ô]o?èçâ“ñŸ¸?±àýßÃð?æ T‘õNp?ìa]®d‹?œ#Šåd­ ?æRœ½]¬?â ×fŒ?ëþµ<ïhË?Ð3ßsU?é ¥WV?èÀâ_Ó\(?‘õ,Kà?× !uœz?ÚF%_¬í ?ë ) Äs?è°Hf‡?åHe¡ ?²Þñ½s ?Ì­…ìùÞ?¢kÓ&HÉp?Þ\!³`ý?åÅÛa·Ú‚?âŠá©6?Ô¤Wæ]à"?¾jÑH‰-(?äçá¤8ô?±¥†óï ë?Ó2Ƈ¸Y–?п•;ܶ?ëÓYv¯?ïê¥h(16?çÃrÀÀ?Ó\V„è|?Ë~/Í0›L?écIú5Ð?à|ÑŠ{}€?ê}bx¥ ¿? •ú9M€?âNí Û?ܽ¼Áï¥F?ÁfÈIžØ€?—¦DÂû ?ÄJ8(Ýg¨?Üì·hlô?ݺ˜>æ/°?¸ŠèX~à?µÒœoiú@?ÓÉ÷—æÌ?é¿ËÉÆz?€cSÔ?í#ÜëUIE?º8çeš‰P?Ÿ :ˆ(à?ëÍg^(e?âÙçp|Â?ìŠ|t‹Ã?ìâÑ•»¡?ç1"X¬Ž?Üe]ÐÌ?Α«ô$¶?Ô™ŸÏµŠ ?ç±á£Y?ã”|’E<¢?áþé^ñ.°?Õ«CëÑà ?ÝCn§ÈëP?È’âçæ7L?Û;ä=|?å¿xî˜ÑÍ?ä,„ÕŠ^?³>”tÙ' ?瘕ßÎÆ@?í¥´ “?³.I¡ý@?¶qËÑ@?黪Òðc?ãàØT óH?âß}3ØX ?éÀlªÊïv?柖7kk?ëÆ± }rÃ?äߘX‰K?îÙÔ…Y;?§Èý±È&ð?ÎŒ «>?ï+0¥!/?Ü ¾å.ï¶?Ðr”БS?̯45ä?æ3;Vî é? 9û?áÙ-›™¶Ò?ÙUrS³º?ê.èɯ $?ÕA†f?é™ÃËhäœ?ä”û Â?䘓¡u±Â?×þ§ÞÇt?æÖä™QP?è=yχ??åVÝ?ìPz‡Ô5{?à=…%ËÎ?ÔÕÃmÙÆ?ê–å¼ï}±?ÞÆWŠSv?èi+‰º?ÎiM¯?ÖóÊ»ÓÃP?ér)˨Ô?æµ™4~þp?ç|Öc-´?ê•C]:f¡?ÔŠ¸Ç &Ì?Õû_Öö?ì‡+/µ?×& ›' â?¨õã5ñ?Íq©¯" ?æ®NÙü?äÅC&…²–?ìn??‚YÈ?êe¡DË ?ï²kþàï,?Ä”mµªQ˜?¿Ï~¶TÈX?ã )Øpº`?ÑÅàèT ?æ¡Çn¿?á¸6ŒÑ•?ೆ~Óu?دl¬4?í-Ý•þ?ç¶C˜Œj?àÉleGó9?­¹È[Ä]?Àþ³ý¦ ?à¶auÈ?äjI«¾J¬?¬ Waq?Õcr‡±Â?Ôµü¥¬?î?”¬Z?×%“==%b?ã+›ªñËÿ?èsM‹Ò†?Z`'o„?ëâcn8Cm?èó¼é)›Ô?͆$úvøà?éÎÂ4n?í6ªxX¡ ?éë*×€?Ó›àŰbü?ï±Æ>Dc?ÄE°°˜?ì “sJ§?Ϲ†“Ѓ¬?é};¨eÆ?Ü^B@κ?ä=ïÒCá?Ëb)tOÀ?îoè=õ?ÀRÞ´ºí ?ãßó›Ö?ÒCBÈø9Ê?Ð-¶{t3p?éìÙo ݹ?äñ¡yGV?Д¸;7Ò?åMiôeT?Õ†ÃÄ\?çY ð1 Ö?ÌÚ“Æy™à?ássÏ¿yì?êïl»*’?ìËQ¾;€_?®…Üz ƒ ?äGÕ ¹M?ͺ12FØ?Âð‚ÄÑ(?æ‚ßÖõ\(?åõÅ›*;?Îé)Û×éÐ?ÝœÖ;Pˆ?à”é³?{?¸Vñô/TP?Ò‚xlÙÖ?Éœƒdè?©9ø `à?à›õć?Ø‹ÿ OÊ?ÙŒ¬ ‘?Ó£/×BA?ÁÊ¥…M¸?êYÓÀÉÚá?ìýÈjeò¯?Þ¦uþ?î"ð;#P?ïã~H ò?„úþ(gN@?äÀj=+?Û›«Ùì²?êV:»TR?É)-1r:¬?áö)¸‹/Ú?êxVìÚ?Ó\3¨¶L?´àÄVâ ?›‰U¤ù+À?Æ|᣹mÀ?åhŽ µáŽ?çWð;ÞmY?î·qÊÍ?ج؅=On?âÆ¶¢;%]?ê=| Õ?Á‘ŠÕ«á$?ê®Ws?îì?Ö«Dý ?°”¼8i¸?á1{ÑÞw¤?鱨ÄKÒ÷?áÔÉÑck?ß‚ÍóÎ;š?æcI±Ô?ïÔ«e?è›â&‚ !?ß¶ÙG4´?¶’-Á/–X?ÙÿD1ZÀ ?í*¶ëâ?âø]Àßt?ëhîX÷M°?í 0‘% Ú?í\_‹õܨ?¿2+&ð?ÔyÎTÌØ?ìX?‘*x?ÐS$1÷HL?åò8Õ¸?éçÍ® ÜÂ?Ãÿºw,ýÜ?ã7€.ˆGÝ?œîµ^½¶à?â«/Ö§?¤<ßj¢÷°?ìnmÙH(7?â?ÙV¦‰ÖÏh?áòþ¾®?¿…‹?⦆ò6mó?«@?½ ±3sèÀ?¦çIa‘“p?â¾b$¹Ç™?í=Y?è{¸?ã5SªL¾?è)0‹?èÞëø£Þ™?ÖA±¸g^?ØæEEØJ?Ýßu”“æ?ë=£ŒÂE?ÜQÞí,?Ús@ ëJ?áã—bà?îðEU Z?äùÊo?ÉÊÉ„8?Ñ\Þü·â¸?Ø?wIþø?ÉyÂ0?åp##ů?æ!ŠqCêm?ë™`ñ<_?Õ³7: )Æ?äÓs20ï?ÕésN°B?빌¿ä:?îa1¿¸:ƒ?é ‘‘?ì|뻋çi?é5ë1–·?ã±µù\>p?îMxKáŽÂ?¦5O\H?Õ¥¾Ì :?í|šNˆïX?åI´‹u!¼?ä¢ß/3U ?Ü׬Mü?ÌfKºÓE”?æÒZpý9?ÀÕß.œ”?àZ«ÈNë?à‘Å:àù?ç›=S ~´?×»jn ˜L?ì²J…)?”Èw¾èÀ?Ñ'àýˆ¡j?ï gLð?år¦ÿª»?Ï£)œ ?Ô{HðsD|?ê‚¥ûBò?áÞ÷ù:;g?Ñîtz_8Š?ç!ç_«ù?ãPI3¦iF?ãJ ]?Îý!k$?×m:&õ÷@?½s!öçu°?éóÿ.µoÕ?ïã™ù9â?×Þ<„ÉxÆ?êßWËî?×lnølò?ºžÙ„ëX?ÈÃ.Êâ¨H?Àаӧè€?ämbVs:[?âÿº÷{vÚ?ÂFþ\ý(?á8®u?µþxþÐ[0?¶½ÒGlî@?ïó™'~|€?às_ƒ¬„?ëňCô4 ?ëV¿2?çGT…¹ÔÄ?¶V¥:’?éþ4â&µR?Ô:lÌÑÇÄ?ÐKfÃn*?åd¯V+n?ë 0wM&?àר}™}?î FÒú¬?Ó—.vž.?ÚTùñuüŒ?à$4˸¨×?înÙeaµ©?éC–Q³ ?Ø4‹k°šj?Özn]}Œ?¦W¬G(0?Øøô†Ô€?æ2až´%I?ãd¯Òï9Œ?ÔHª5î£R?ÚêÖà(ϲ?Ñ®>S¤‚†?¸,¤|¹¿à?áoðÙ d‰®?ÞÜˬ?æ×‹9\^˜?ä˜ÿDD²Ï?â¢Ä´œ3³?¥§DÆi€?ãi¼4 ?ß‚%ÊàzÐ?ç\uIxQù?äêZ Å5?Ö\l[Š?ér-ReI–?ç\Gsõƒl?²È=yÉÒø?ì# ògO±?âOîVRà ?ì$‹c\E¦?è€ägú­?æƒÇ¶4¸è?è0%:›V?ç’î’µ–?î$˜T/C?È·»GéÇ,?Ð ÷q†Ìö?è»i }?á¼¶nÖ?ãv ±ûLÝ?»QÐÔŠÉ ?ÑäÝÊèüX?ÏÎñ`yÏÌ?æÂ0ÆÕç?ÒšÃêä´?×§“Q!õ ?åSëE‚å?ë¿ûÃz! ?è" :Ç ?ј`_ Zt?À½ƒíD>œ?ëÎý&?à S´XK?Ř®¾qÕt?ë=TÒ¶Œœ?Ôº?˜'Ôt?˜+â?ív¥1"¤?æ6Óâ¡?¸‡Þ޹l¨?Òƒ"¢”|b?Ôµz„Ê?à6Ù— Ã?ÚúJïIZÄ?Κ¨þ nÈ?ä~lXužE?©` ö•0?͵–„ü®?Àp3,6eT?äÞiƒÓˆo?Ç$¡ä[ ?Æ,“zÍL?äQ3„?è®õê;â?䦒9l?ß„¤J ?Þ̧Í@Î?îw3Å ¯Ä?ÑÄ-õ¨€?éç€}#?« ;» è ?äc„ñip:?î»Ú³2~ê?â¸D–^å~?àx}{QbW?åP93]«±?éë±>ïW ?Û—jT]>"?Ñ?wy=žð?Õ§ø˜g'ð?­cOO/êÐ?ç˜~½ë X?âDòfl½ƒ?ãí¹P¬æÐ?ÈÙSÎÌ?Ô÷-Z%¼?ÑzTŽ.Î|?|%ëÊØ&€?ÀË<ŠY?(?áÍÚ×t?ç¢Åã„xn?²Y‰»«Ð?âF¢Þ$?ï®ËÿnÀo?ê1\!4ú?Ô¥1—-¨ ?×(õ?¶ÀY ·ìÀ?íS&ÛÓø?Õqœ_T?ë ̬KÏÙ?Úêë._Ýf?¤!Ìûæ0?²…‚gì”8?é1µ¬½û?ãqÕJŠc?ãí7C Ž?í¡ãç·Õ?Ûëþói?ê JAE€?áô‰]².?Ê¿cŠŸ ?îM-ô{Iª?ÓÓ&8yØÈ?æ%Re3»??è* =’q:?â•N»ý­Ó?Ì´‰p…_È?ÉÊÞìÆ–T?à¥ÑQZºE?̤(Ìœ?ÙÝø.wJ?ê,:VæU^?ÉI›ÿiª?Ñû³§Pú?Õ”eI,DÌ?äh¿œ £ñ?äf–²÷\?çÅhá×M?Üæ Ò?·¢?î²³:« ?êwkv’?㑪»ƒ®?ì4f,ÔÃ3?ÛcÇ»3×l?Óåãëz?ßøÞú?ëÍ”.ˆP×?Ö<S‹l?¥þ‚¿Å0?ä½ùí/?å5û µâ?îÎs¬R?Ñ_µ8íB¦?·4â šø8?ïœV•&ã?®@Ú ©:@?ãnøîŠl?c|ž ê?Ø ¢{ÆÔ?íúŽa~dk?ï5»Ý+´?âa=¹C?¾é,e†o?ຑ ¦ú?Ú@ôXù&?ļ2¸r(?íWÔÅ8`ž?ïxkµïaT?Íò+ðëd?îïãq“|+?äCèô‡?âœñB¨Ãæ?ÐQÎ8dP?áp9 :?Ìć­ŽÎP?×›Ùe’Ü?éfKÞFêq?‰¦Îpõv@?Î \f5L?Ûø~ÀJ£>?b)y›Š?Ý^~{=EŽ?»ÀŒïX? 7LÕ?ì Lkc®c?æl¼U¥`?ëUú@‚?Ö~©²Õ4?ä*Å´¡ñî?åL¹OQ?è'm‹È´¬?âÃÙXP°?ß•…,ø?Ù\¶ ¶5N?îe|ïÓ.?çó«éÅíz?ì3ùLÑþ?ïcÊüª3®?êñü”ì| ?ܬ×?Æ?çKÌ“™®?ǵjÉ/¤?Ñl3p)Î`?êÕãì³MU?åù¡?ázY€¸ã;?ë/åž¶Í?Äh~1 †Ð?ÛqÛGËä?Ô…#܇v?âø­½b?¤Š6 €?î8ã´1{?à…¿«Þ?äëF–Jýw?Éæ`H}p$?¢PzìÀ?Þ¤@±IÚ?ÑÂ?h…>ì?Þ {l¬B?î'FŠ5}o?Ûcð[ ?¼¨/òát@?Ø×¹^ž¶Œ?ÚPyäöf?áªSIê í?èԹ̃?èc¿•?ì³(ýý?ʯ¿3Ò¨?í }ž¼Â]?ìt„]¼Z?àˆP¯=Ÿ?Ç—ž1Ⱥd?éšèšR?æˆx{¸9?×r úO?Ü¡/áHn?Èð!<…AL?È[Ï–¾è?屚ïÁ©?åhƒ6«q?áàa‹Š…?ÕuÒ]]là?í^Ô¨On?ÅðRnÕŒ?ãxåÚ0«?Õ6ø ‡<Ê?ÖåR?Ê?ãzK¸Ö9³?îÁútð@c?æ‰8lÌ®£?ß":Ö¯ ?×$°ˆ‚|Î?ÜüEÄÖôj?âž<Š4 Ç?îžM4H[Å?Õ/ú Ä´V?éÓ£Q¹?å¡á‡àž@?ìÏ‚8ÒÔ?±N]pzØ?×™Œv?äWïù¸?°û×qÆ?îÂ2£;WI?äI(24dm?¶ªâ)£;?È]¯I&;?å ¡Îça?Þ;ßËQY ?ë-Dxÿñà?Ϥjü¦?äÄû•Ö}?Ç'æËÇp?çM¿#³» ?Û-…¯’ùê?Õ[¥´`®?ïÒ¶íéç~?å@l@Tà?⎒Ø"Ùh?æb /£è?Âöþ#¾rØ?ìÜ/?á/?çºMî°WÀ?Å4(#;`?àÙ«Yú?ç‚Xvøý?Ê’ßÏ‹œ?äcÓ·^?µÞT%V.`?ïêAÕkÄ?ܱc¯‚?·ë®ã*^?Þ¼º驺?Õ._ß¹?ÑŒa¾iø\?ãñÜŒïê|?Æ0 5ÝuÀ?ÑÈ3—ʲ|?˜Ydîõ`?çêÜ&Ü?Åð:Oíx?ÐBïCjÎ?ì¦>?êÂ÷è,Žý?âhB'l?Úö³œsÖ?쪹9²­?ì\ÞéC4G?Ý•ºø0…D?Ðío·C¤?¡U‹Y?ན×\kî?Ò©Q[o¿D?ÒÉŽOÐ?‘ ëú^à?Ìçì?r?ÙWÞ«¿`T?ãáq~³˜?¶DHàÊH?±rÒÞô£¸?è!Zb‚”-?µcÜÖ@P?퉦ӑ։?íßÓÕ#Æ?鎛5ÚNc?ÙNj‰=fœ?ÀDÐÑ…p?䜳ÌÖá?ÑEË5 æB?èwơܖN?èq¼ºÿÆÔ?åy+6´?à§©4–G?´^`æ9~`?á{/[Ý<?챈ê¿*?á3ƒ>Ãè? ór³Ð?æ³eFÌ‹?ÑDa-÷(l?çƒYvµJŸ?ÎÑt ÇE”?ëqƒã]V?âvù• ˜?ã{C—qš?çY/ÍŸÊ?íÅ4#fµ?ÒŠ¢Üþ˜¬?ÞÞªäm˜¾?Øá,ª±†ú?Ðò½yCZ?ç½èA¾Ñ?‘°w0êÔ?é§ëI‹?ì­ñ’ÀÅ?ä~kŠg³Q?â–ðQÖO‘?ë —ØCÖÜ?í£-žy¾?ë´&ïD?æï'B\mU?Ûi /}|?â|ÝŽ€ ¢?í÷B•¶¯î?îªMH?ÚY"ÿnr?Õéhƒ(?ÒŒ=„™*?æ}/®¸@z?Õà@o/³T?íBuKÄ?Ös­k¶Ð?Fš40?¬›ˆ0?è!RâQ,?Ïê¯S#ù?îÔ·4ëïð¨}?á -êÐ?Ñn*‡óm ?ØßÝB.Ø(?ç„ {’Ü?çHðNÙ—?¶qDÄ‘ZÀ?ê;@¸¸‰ö?æ3}CcÝ?ïïéNë?ÇG6õzØ?å]÷l¨R¼?èsé-v]f?ë±yaÈ?ìv¿·- ?ï Òefš?ÏR‰N‚?•NÃ9Áà?âŸh;B]Û?äÍE 7?ïc{á)ž ?ì£_î)_R?}v“Ôvk€?УûTs…?àf¬wo?Ï>™‘H?ë~Ñ*jo?Ö°èvx?Øxîî¾?ÌÁ„a|p?Ñ«÷¿J?Љà{¿â?àU(Q//é?îØäÌðED?ÛÚFT¤ F?çêÓøœ?Æ×TW?×g‘7’†¤?ìAJTõå—?à‘C#^ñ›?ÒL*”Þˆð?â í~Ì)?ÓkóëÍôN?•‰½"™«?ØÆ-s\ÃÞ?èžÒñÐÚ»?Ô}_÷x†L?…: d³?Óp‰*mÝn?ÉŸã€ë ?쒱Ж¡?æa¤S—tÂ?Äzçw^h?ÕÅ,IÊŽ?â¡^MCú?íÍ€ ?ä)(A~Ï\?ã{, ¾ž¸?ã׿nú$?Ûó€âaÉÔ?“½Õ„ˆ‰`?Úé88@•?Яdg¢-À?ÚÓ 97ª?çœ,Dÿf?ìâ’þ:H?βhü ?çmI©î?Â…‘npì?ïK³*‚°?áøÄö{Kœ?é íåýi?©¼£ŽWî°?Öònrî l?ïãë]VI?¢/– Ã@?ÑÓ¶é*x?ÓÐÔ?ì?ížíO?ê\ª¨Tïl?Âëu#êJD?Õ£DÞ­,?íJä ãL?àù£–Í?åàý09©?ËÇðr`T?ïÑý¿ÇÚ?ë`>¬¯ì©?·†yö÷(?Å.ÛZZÏ€?ܧg–À¥È?ìÅù#i@Â?Ð ù|‚d?Ì-Ú‡ x?æêTÑCh,?Ø Ï ¢ÉÀ?Ö8BiÔ“æ?î…Èy³â?ÛxùPȪ?æ˜àÔ0ø%?àX0`sHV?Áî>Î_Ì?âµ~#ØÉ?¯ÿ±F^°?ÓŠ%gýdú?£³õÜ>& ?ï››—H?ð?çÈFAó~?»´ÕStÙ8?ê¬×…2Ž?ÑÙ”ðÒ¸0?éÐÿJÛ¾@?êÏ‚±LN?Ðgrò¨Ž?ám'€7zß?Ôô¨cø?°Ü&?Ëå?í=ܱÜx?Í›gˆ?Þ ±}XÎ?З! ÎÌ?äM¹ÑúS?Ú²ô…H?ÓAÉ-±p?º2…  ÊP?Ø/[(m?â¥ó%¶Ä?Ì»ƒoF¹0?âªe¯sÈx?Ú0,”J”?å p$¬'2?Ùì;eÌIH?ÞaDz³Æî?¸¥wCîØ?ï0¯­ó€`?Êô«,  ?æËú a?ÙN²Åu8?á:á ìOi?ä¹ü·ø¶[?°BÑ™¡MÈ?µo¢5ø?ä_}.4Ý?åß4$L­?çýq 74(?êuóä?é:¢Óý¤Ý?àR/'¸?ãóÀ{mŸ?ãyþµ¤þ?îlz”ã?àµchã¶?ì_ö••{a?ëÃOxÞ$+?Ë'ûúD¤?ȬnQ;¤À?á#ÆÔ®²Y?àdéÍ ƒ?ÁK)æøD?ä äº T?ì0ÎÌnÛŒ?Ë´`¦Šœ?Ü]ÃjO€4?ÓÉ…$_%ü?ì¡ná8?Üa*Ò@—f?çd|1ùv·?º’d«!þ€?ÞQ~ú*›À?ç©ò ’”?î\þ§VÍ[?ÍQv»Ö4x?Þ3mý?ÒI "¸æ?ÖðBÈ×ñp?×ít!ÉpÀ?ë¬ÊaJ^?ÄfUÄêÌ?î L4WQ‹?ÍÎ’ªÖ8?Ã÷8μvÄ?ïþ zâ2?°ÎšaŠh?ḄO³¡˜?ä&œæ‡?ך…©­ø?á(lœ§HÑ?å#Qɬ®?í³&…6¿?­í¯½ìd?âÆ–%a?á©vkíuM?çÈ«±Xùè?ëGËo?ÒŠŠ â†:?×ÙL ¡6?äJLüý0?Ùâç ?šj-À?íl±‚hŽÝ?âò̾­s?褘¹4?íØßuÙQ?ìâÊÖPs?Ó(9ªgœ?çcàû… ?ãvÐæµ³?ç ªNùño?âݶüâçs?æ¢dâ·‚å?‚ÿì'ã€?Ûᆀ“bæ?å>Hn][A?ÑM¥Ô¯x?âˆT ¯,?ÒÞŸ#ðàØ?ÎÔyS ì?¹¾Aëmªø?ÝJx¾^?Ù|ˆƒá»€?€Lõ¥?Òù ú+¡ö?ènüÉ$?Ý×oA$Ê ?Û å쥭ž?ÎBZ3Ô—Ä?Ç‘훫4?Ì¢{`™I?¥A>ª™P?Å ãå&90?Á/jwîÂ8?Ê]}wÝÓü?í½ñ [QÖ?Ü«U0?þ|?åÝr Š…?ïÞT?èQþöŒŒÄ?è–¼³í„?´ïïèÐ<?¼ 8œ±p?êð‰(½—?àMnÁCq?ï#òßÛ?æÀþ˜.°?ɘ( Üdä?äbù ¯¿?çŠÇé|)â?Ñà9Ï®ã.?ÀÚ “Ü?×Ôf×´¦?ç•‹N–?µû¥¨±ê8?çî«PŠd?Ý«=%oŸT?ÕåäÛ÷JÊ?­ŽæeÎÆ°?é–7÷°gW?騗>ƒ¼?Ö×]¬/pF?íx³3t µ?Ëw(ÅSæŒ?ëž»w"I?áÖÕ%Áà?ç C`À?ãa„½v?Ó]L§rNr?ëçJt»ŽH?Ú~)4º"?Æ•W¾‹{?ºþT—ÕÂ@?ɾ‰ô”µ?²Îb”›0˜?Ã7ùÁ™?æšM >?¶ Á/\¨?â:†wœà~?éÕt’Ÿº?è5iÈx»r?à,,ëÄ9?Èߢ& 7¤?à‡/>S?ì _†?æõyÛAvÕ?Ñžµ'àq†?âŠ<Ýÿía?í#ûø}Ó?äkÈáº?ì$  c¾?¢^–«ÚA`?âð MO?àÑŒÚ0˜?¹þ:pÕØ?ïíLY¯É]?á)½ÁSxQ?îþsËúÄ?ªš™ì8Ð?Çtˆ3ž4?ç \Ӧا?¹šÂÑIà?Ûi”Àú?ç\ü^™x–?ïߪ=-Dè?ï¸k–)xp?ç÷-1Õà#?íQŽ»/û?çë ;'ŸÑ?Ùÿr9-?ÕiéwWÆ?Ý,—‰| ˆ?À_ðÔ8%Ä?ܽµ?à'LøAæ0?ÐÁ?q@Ž?Õ€ø›‚?Ú®©3Ýî?íŸmÌT °?çJ$ Äk…?kÈD}¹?ê5Yè‹?é$®àj w?Ü­âÞOüÐ?äÍJQðSú?ä¬ ÑÝz?йåOIR?Ücj‡YPf?ã&k¯kXf?³&Ñ',(?êä#‚\™T?ë"Á ¥aU?ÔÕÂn÷õˆ?³/Â3–¨?í-:¶–ë?ÔÈ?¦$&?¢v†9¦àÀ?ÝN]€[%Ä?æo„wZÑ? ñ÷ Ü°?Ý®rhõ?á\ßl7›?áÍj•?é;¤îSb?´€€îø?ÏÜÝɘ ?³Á+Ëð?Ð¥÷&÷§F?ÓÄdÑqŠ?âmZÔ-)?á\ åH@?ÙºÌ^oSz?©)³õc†À?Øi/ns>²?×'v2¸?æq´¶ñ´`?ëpívúd³?ï–wI0%Ö?êòûTš¾?Ñ8ŸüÀ?êé¤dÉ^?Ýü9w]V?îüæø @?Øa%œ‚V?ä©£•*½ø?ã ºgÈ Æ?ï¿—§ØÊk?ËUôB÷ºä?â €(?¦sÿ0ÖÎà?Ù¤H 3i4?ØY”ˆ> Ð?Ê^ ?ÆKEÖçÈ?àdÜó•„‹?Õ“í@Ö?æˆ÷Ûc¦?Àó—Aº‚ˆ?ã¸ÿ(GF?í$môf?ÖqgÜg(?оí.?´lwQ±Hø?ıl\¢™?æziØB)?Üö‘k7Š?ÆLRöŸq?ÖÏ)”"nè?Þ5”Óâñ"?êÀB\#ïN?×!´óðø|?âG¶ÐÕê?åÒÇè¤?ÛçšjßÍ?Émø'Ö$?å6‡¹…*?íØã„ô?—?æM¹÷Kóá?ágpõît'?ã©Çà—ÓÎ?ëy¾ß¸^?çt\sq":?ï3ÿäfI?ÓšÝ\s”?çf†n¬¶ù?ëšÙu­?Ç5çöÃ,P?¾WF·8?á;–°t9?æ‹„Õt®Ð?ÖLÌ UØ?Ñ»+4Ÿø?ÅY…¬cÃð?Ô¥½F ?ìCû9¡‡?Ùe#ÏI*„?áÔÌñø&?ÉÚBƒ²Œ?íY©Œ‰ãu?íx«9nt?ÈÉÇIRHô?⸚ði?ãˆn…Òà`?âÊ·N|›Þ?î¡ Ä^?Á«O~‡ôä?é£Ó¯?·[ZpH?Û%ü-¢íX?Á« ì!l?·3˜ß¶?êö["‡I8?Ó,\Œ'ž.?Ó¹CÌ–?è@zDÃV?êœþ¡¯Áõ?ÇqÏçð?Ù5e͘l†?Ü}ÿ²‘à?ìTZñýÁ?{¥ñDÆ&?ãE­»é?àùe:,ì?ÔŽw´dµô?‰žTaÔ?ãMírÊé[?Æ?)BeM˜?^±m Ê?×Mæžÿ™è?îl¾ÿiã?ÙËŽ{œ,D?âGÿæŸZª?µ_R:¬ÊÐ?Ûgª :6?Ü‹Öf(œ?î­ë/• ?íçèÙ·,?çœØË\?íÅy82d?ÙÛ0 æº?ÜROÁ\?׸/3vÉ$?èÂ9¿¬?¡?øÈ§Rà?ä’Q6kì!?ßÔH˜4³\?å^Ñõ_?Ù*"‚Ì?ÑóRÙÔ¶?áXì÷eŒï?‘·œÌ­"À?é™Û‰†ô?ã­#¸?Ò}GŽ5r?ÙØ·’µV?ÍàDU?ÛØ6DEr?ìòò¡iá?ÓngpX"¸?Á0ê1-†?íneL[EÛ?ј1£h?æ&ÑbÀfî?ÌñØI˜¨?ìáçA0­?߈Ó>Oe?ç àUd›H?쥌wæò€?ÖtPŽb^?Ðh<¶ù$–?¼D12"h?Êq•§N€?’ÃŽrÝÓ`?é»û‘š™?ÔäÔ®€ž?ÞK!«Êö:?ÆT+dâ×d?àrÞZã‚?Á?ü`Ää?ì‡UoØ?àX@ê$ðb?î„ñŽì?쇖G"gœ?Ò[°EFÚD?Ínйê9Ä?â“ív?{2ùóã?ÁEŠ`Õ¬?ÝX6ÊŠñ˜?à€|:ý¯?âïgÐu@?ä¶¿ª…O?¼ÆÂÀ<È?êÃð®JO?ïV-dÈ*?éXå²ÝS~?ÕP¸Õc,?îû†|† ?æ‰"§µ–?ëþ€|ÈÏ?çÏã¡vÏ?ê@91B°•?W’ñ:×Ü?é$Í6Æ™-?ïE‡ 77?â©Á`uZ¨?ßç´QOÂŒ?ß{G>éØv?á·%iå[?ãQܽªö?Û¹]¹Fþ?ëV –è“??âÀƒd ¸?Ù 8’yY(?µø}š È?Ö»9ÛŽ?àQ@Œ½[?åí$3ÿb?ëÑÜév ?ïí 8;Õ?Ý5F÷¼&ì?ÑwKUB?Ú $òêÎ?ÑH¯mî¡?æE žÎ ?çÅ|Áá ?Ý ÁÌ?Öø’û´?è#ÕÁõP?ÝÇé„™?Ô?Ñ“d_þ?ã„Ìù­û¥?ëcµ©å&ô?è¼dQï?¨­Àz `?ÆqHêŒ?áùxÜý56?á-×¾Zq?åœO+E—?éÒ£õR9ï?Ä 6ôÈÄ?ÈwŒ0f8?É·ÈÞYP?ÐZB|ò,?îð&ªsýõ?²AXDö©x?îãæAµp?²ÿ2æèdh?¹>N6)(?Ô€†h?á0F;Ü2?ŽÆy×&—?ïBç_Üs?Ç¢cÛz,?ì™´d"'?Ú«òEÕ¦?ëó½Hײ?ÐÜ©øôH?°]låË‘Ð?ÒL…§ý?€ÇaŸïÀ?ì>Úšˆ\È?æYŽd¬×?ÝÕ™]¸ÉÜ?Ïû‰5¯ò\?æùyT?ï°¼QÓÁ?ƒM¬LCÀ?ïa[BК?¤v†\ßã`?ç–)~¡?êûµ8“ë?ÓÏïü.éÒ?èwyc¡ù?¥[ª›F€?ê8lÌ%Žg?ؾ¡ºÜ=„?â±æÇŸSñ?åoöÊ,+¥?ŠÑ³i?q'ºIÉã€?â¬6„N8?à.ÖÀ¸?ìÅIU³?岿ºPŠ?Ó|GH1²?á°["¥Ýx?…fȤŽ(€?à%Ma_;;?Í0BO4ì?勪±þS?˜º#×ù ?Ü­-Vè6?´o• ÍÐ?¸)¤#ÜcÐ?ãS™ê[Ã?Ô5naß'n?ãó´~ìPü?Ð óA0šŒ?é_$‚i‚?ä­> ˜ÒQ?èU»c ì˜?Üæàlu4?­."Y?âoèÓ~Ÿ?È OÞí?ÜõpëÖ—¬?ïÀX峘?¼l¥ˆ”S(?ææ­ÁÙýQ?é˱˜}U¿?Ï`7è–ø?àU"Ò[==?èg­ÓŠóä?Û‘»³päL?Áx~oËÀÌ?æ@<ù®O?àöOEÿï?ä垦¿§?äióQÝÜ?ï+§Ñ—`?ÒïÇ,€öp?íS6kþ_/?—óñæÚ?º¿C¶tH?Æ(ÙIH?ïR Øs.â?ß×+íE2?aŒá¿á?å}2ŒKg?¥Õ² 8ã ?ãAf³â?ΦÑûŸ¸?½µ °v)è?Å¿5™gÑX?èÚUð?æ.ð,€RY?ÐgŸMж?Þ(ÏDFH?î¨Ȧ…?áÚECFØ¡?æf¶ò Â?æËnôù?é°Ç÷%z?×N† õV?Íâ;X ñè?Ø¡ûJL’Æ?îË î||h?ãÄ© V?°ŒÃÝ%50?æÐÃ×Ä?â‹ÄÑ?âGÿÛéIŽ?¹]˜‘¼€?áîÉFã¯?“ä¢þ?ØçƒJ?íÄðZ·&š?ào­Æ—ì?ìãÆ OÝ?áŽ<ƒ?Ôx„ÕÇS4?éåõ¬_s~?î<»¡ÿï:?Õ@^8§Ã^?ݹI™ÕöJ?¾Yš‰ßeð?íÄ ¬}ÀW?缦?ï—iap#Ý?ê«ò‰'%?Ê“Eÿ^”?ÑÕÝ#¤*?Ð6{†a~¾?´Ó ½XPH?žmZ@!@?±³@zõ`?ík«„æ‘Æ?ï«B7?êpåÉKè&?Á­ ŸÒ¤?Ö|}±“8?áô Íd?îw¢Óê•?´JD®Y\?äp%mð.’?Èÿ”¾OX?ä;Dsá?ïE;_†SÈ?Î!ó xrX?ˆ l¾iÑ@?Á8ÖÊn“”?Íü­À0?ìêW?ÕÊFÂù·ê?âz’'JÿË?Ó*‘S¼?Áóë_PUÜ?¬Ô°Þ; @?çn¼vÈé?ÚŠµè &?åUcRô?Òú…GÚ+¾?ìµ2ý¹å?îä|£Ê ?ŽôÄœ°È?¯'Õ?ç-úÓ6Šï?ë÷u?ë¼’h8WE?±œù8͘?ß¾ì+1 ?ëœÏ³fq?ºRR‘ù'è?z2kAš©?Ú¶á\±u’?×FÁ¨UÄ?ضøæšÐ?{D ¡Ý€?ÛÐI€”Ø?®ôc[Þà?ب€Ù˜P(?åUM.–‡E?Â+%žÉøL?Ê‘-‹ç2?ÒSI]AÇ(?ãÇ`«ž¶?Ú‰bZß2F?¹HÀŸÇß?Û’wåüîJ?Éß}.¿uÐ?ÉTWÅשÔ?ê&Á7ÜLA? _³Å¬^?¡ˆ/ÑŽÀ?ëé áÂ?Ñ žÿp‰?¥ ‹O£·ð?îFe=ÄJ_?íÚÙ^Ó×|?ÍH•~¨?ʵ|”QÙ¤?ÖÕ¬ñÝž$?áA¼ß«0Ï?Ü¿uòjIž?·¨xŒ› ?ÙO"Ù²‰?ÞXúbý"ê?ÁnÀ+X@?вêXŽ€?ä+§@!Íi?àè@1>t„?çä¤F–U?Сb˜¹åÆ?å|”»ƒq ?äOs‰êXB?ÒF©æÀGB?êP¡+qî?ȶ¼c†ñ@?ê”?W;?Ðõ¿I‰º?Û!Æ^±´&?à2BÇfr??ï€!Æ>ƒÜ?€Ÿö“ =À?ÞÌæ-nh?¼«,Út ¸?°»Êѳ§ ?ïØÖÈ‚4?ÒöÊŒ´×r?é89õ˜1_?ïÌàÐÀ?Ö!AÊ£´?ÑŽð?’wà?Ý£·ÄãôP?áõð?ߨþu6ž?ïâ˜és˜?㊘ÞÂ{Ü?éJÐÆãÄ£?½nMgÍû¨?Ø:…á.?Òº},çØ€?æ/¡¸p[x?ÜlîçÚ?ÝZ"ë#î:?ë¹M¬{}÷?Äü^¾–@?å´2 ¿§?Ìž»Îq˜öô?˜ðZõÐ?ÇF`§0?ë•VýŠ%?âwHïùÝ?íÒœ°Ýà?ïÜļåW?æ¢+]‘¼.?æ¼ÇžµHº?·¨tÊßU?ÔHÏ@ò)>?æ7ÍbD?Œßײ@?ߺ.ªA4?ÑÞp:kŸ*?¾¡è9»åh?ÄܬœÙÏà?è¶ X/U?ÆÔ¢Ó—°?äîûd8ý?È‚` L?îêVù¨Tm?äÞ¸qÂ?à1¯ý—Þ^?Ö–‡Umt?ä±BQ[$‰?Ó3n[ ž?ÚcÙ½_”?ïÔV®‹k ?é‹)Ñ“y?ç$9[¥‚?±§Wž5:Ø?Ö…«1ƒp€?äÓ—[OÒ?ÞvbÉÂxt?êЮ‰ù?±Š6äf†X?áûtÑØ»?ÊþЬè?Ë÷ÿžÒf@?×xœ¢r?Êu|îT?°ìÍ™nÁ(?ág„nu C?ų¤ jÆ(?ß;W †’?×-Š‘gè?´gÖ0-P?¡ÃKÅ®¯à?ã ÑŽ_…1?ÝEº÷¥ˆB?Ó­u—a*?Ï­¾Þ [$?åðkî›?ËÓ´ÿhQ°?éÃV"1?ìùá/Ý1?ã6s6é•?çᎉŠ[?íp&ë¼U?äë2$ˆF?è¹½½y“C?ä€ä\3?ì=é{¯¿?¼%v| ¦À?ïq²EQÊ¥?Ê¶Õ Ã¼t?Ƈúžx?é½í¡\Ö?àr×E’dI?µ†^¢Á›Ø?àO£}Ì®?á¦Z`}?ÕÉ~A™?ë’p–A?؈ëX=>?áÜÈ’,XÅ?ÙÛÄZ÷– ?ÃtŽ7Ð?·#óÒ_oà?êÙ·$|Ê?°óŒÔ¥¨?îV«ÁÕ?í þB›p²?Ã>ɺfÊâÏ…?Ññ¿òl?à+äŽêŽ^?ì{UµÓä´?š5yF fÀ?‘§>½˜–@?êDØ©6;Lþ?Íût¸ß,?â®%¤}?¢ÖŸ$•€?ÞC€úÏ`?ê°ÚÞ?Œ2?ã$0–³°?í´`üÖú?ÂñH§Ô´H?Õ£|ý߬ª?ï¶g•ícu?ÝW}Ç”/6?âºw×ÝÄ>?ïìÛènä?Ü%ê;ˆj¶?ÝCCÐr¶?ÀºÎÚV ?âK¤¼8’é?Ü•h|ÆÛr?ègHò­ñ?£UrßÀ3 ?èÒÍGBź?ÖÚGB–Ä?Ã-ÄI±”?Ómc²?Ý9c«2]®?ëæÁ#‹l?°½?Ѱþ޹’º?ê=ƒ©^ Î?æÑ{IaT?î{Þƒõ“&?ï£iXÞÖ?Ð_7&.Ðä?‘ÝÑšü€?Ô³p¬j6?Ýz–‘–¦?ïÕJN6˜?ê¡îOö^?×PBvø=Ð?å¹Ùÿb›?ìÚs\%?í[pÏy s?êN§£¡x2?·–¼²ÐÂp?îûpŸÄ9?â´E³Ÿ??îí¤šæƒý?Ö*ŸÎfÆZ?ï)FŒ[f?éO ÂEà?ÈbüàÛ„?» œÇâΰ?Øu”¿ØÚ?è¶À>¤k?êïþë˜*?Ø;ö)ˆ½@?ììöÛ¹ÿ?äC~µP÷?ï„©†¡?ï0—É!º2?ëÙï ™³?¶žÆÁàH?ì—N©Dà?ê“f¶L¤ ?ІÙwü¼Ž?é-ˆó?áOh "¬í?ÊðÚB³´?Ö&zRNM?ï–…ÔCK»?ÓÚTõû3¨?Äm‘qÜx?Ô‘ò"ñþ?Ø_Sj$Þ?ì¦ÿþWˆ?ÖMV黫ø?Ä4ÓÊêü?Ù–ëƒDš?µœYsåh?²)°èKp?çgýÌxL?ÜkáZËä?íªðÇ4Ý?ãÐÍ­?ßÑ/¿ –?áø÷æuî ?ìíncš†N?Öžu …?¿«ª£Û— ?ÕPUh›[œ?å}^~ÊñÚ?ë¹ã¾­}?Ó«‚ëÑŒ?ÑgŠî¯I?Ö,^WPÒ?ê>r £©?åÛ Ç»?åo"RY-?é·ò{Í?ÜwNY3Ä?êª[lÊ©Ý?Ò,%U ùd?åε{¦w?Û3)¯m8†?îþå£Ye?ßQ=#“EÔ?Ä@fµÔª?ÑOÑ“¾N?âz´#öR›?Ò Èh]?ÕóØŒåR?ãÄ¿¢wÈ?ìRÁZÀe?ÈÕK?¦XØ?ë{œ(Å£?¿ã¡R€c¸?ÜÛzV?Ýq î>?؃ÓÁÚÄ?…?ÅðÖÀ?â÷yÉ:.Ö?ÒGTÑSÿð?Ú”–á…š?ê¼l…`b?Ð`W} B?â}!·ÄÉ^?àùzL8ëÏ?ç×¾…ø?ã΃¬¢[ƒ?ÑUíO¡€†?î¬"HKLœ?Ôo…·ó`?çÁ#« öÉ?ÑAÄЯ"?íðý¼ÓÚŽ?ï›ÿÜ•i?ß•Y¶?í<ÏðÐø?½Têî’h?í˜Ôuì¿?Å·fhÏÀ?êŽÉ´¹òæ?RÎåg Ì?ï†@Úm’[?Á‡”úà ?ÐdO·pÐ?×M殥0?æ˜â$áïÒ?Ë ìÎ@D?Î¨ÛÆMKô?èî`ì æí?Ô•ŒŽzÖœ?é}˜ÍIq?ç¡dz†U?Ð:ãÎ|Î?íbÊ?Õ*P?Ë}.4á Ü?à<㟂Çv?×ÀΑÞüÂ?ï­‘T[ ?Ã;{e±\È?䂲~6…?ÛµoHÞ?¡Ó%q:~?֣Ɏá`j?’±È<Ö ?âK87¥?¡‘ñdñð?¨'ä*P?åû*‰2 g?ßé”%Mn®?¶ío2[>p?î ä›Òrç?Ôçj‚/T?î2¥w9j?¼•3¹—a@?îFÔ)»™†?°é—·h=ø?éØ!S"z^?ámâé£Ô?ßN¯~˜?âRÍ ×Š?îä‹(Å?Ì7D?æÕBG?±<)3m-¸?Ø&ªÌa¢F?á˜T®uNS?áÉf^”Ì?í·=rZ+?Ú¶L^”?è5Uò˜öy?ãžõtþŠ?è)Òº*?Ú¹¢D€Î?à¡DëÏ?ØŒÞù"°?ÐU{ûPò(?듼"ú¼-?Ã\cæP¨?ÛüÞ- :"?î6g®9?ãNò Ý?£`ò¶9`?è_ž‰H4Û?äèò=î?îËÚ;%Ù?ÔìÉgÐD?âì&œ7 ?Ï,!¶¦…è?¸&¶ök_¨?ï¢òKù w?í16¦‘Á?}8ðüù†?Ùóã–æl?Ý“AB 6?ª‘6œð?ÖÓ~½âæ ?âÕ“¤Ä‘?à;Q^¯;%?ã…q+æÿ?Ø*_´Š*?ëþ ¯ŠÙ?ïj\\»ˆ?â6Cz–b?éãí}»D?àT&€³?汦nj´?Æâ£Ñ•W´?ܪRG…ºr?êãT!VÃ?î-/ŸJ=°?î¯( E»O?ììzA€CW?ÛÇjžzy¸?ÐzËÙÏë–?–lZÚd`?êþ:M¹?â&0zÆO?ã®Ò+`ñ?ÛnSíò?íÿ~Ÿ—?ÆÆÈ›Á†¸?íÖØúñý%?¸¹Ädfæ0?μ99ž¨?äóØ„#-?Õì¾â‹Th?ÞÐ(; ­Ê?Ó">ïù?³ƒº¸`?åW›õ??âÒÖ]¯?ÀåLZTDx?嬂~çþm?ÍÒEB?̰ÜLúåx?àK4€dX?磺 …èº?ã£aBàÄ?‰ˆWšî@?ÙÞž»SÂ?ç­žSTÞu?Í…®+Wh?æO®‘tŠÌ?` nÏHï?é•Fõó^?í¸jšý8?ë½ì§1Ã?ã¼åNò?ÏŠ5–Öž„?Öó®àÚ?ãÃôF¬±?µäbI @?ŬxòÑ¥„?俼ÜúG ?ì»d–”?è"™¢|½l?Ó&TkõÊ@?µÔhF)˜?ìõ?ìhÏû?Ó IT±tÈ?Éû¥ÚñÆ?ÝáñƒÚ?Åè÷MÃ(?æ?NlÖ]?Ø7ز}‘ˆ?ÐÐ/ác9x?æ®ø3³&?å¹QåÈP ?íÔÂ#v?ÓI¹³ ?¸¯¿ Wà?ÏÀÁ¹´¨?Г„?d¨Úbÿê?î3÷þØ3?Ó/¿ÔÞ?ÛËïÖò©?åKƒ»9"?æµo¿†îK?ãS0äÆ=Â?åAN§PS?¡_J8`% ?×9 ž¹§ú?àl~fIÙ ?îÔ¼+¡‚?½–ób·“Ð?Ó‚˜cŸ¥z?Ò^ù?Ä®?å_­È)6?Ògk&'P>?ßiÞG ?͵R?è8oN¸S?ë!ñûƒÞ=?äÕ˜EÝhº?ì,ê šù?ë¯ ÜÁSÔ?é„“Ò#?×Z²x½X?ëmßÇç(?Åyl÷½?ÕÞ{ÚO™Z?껀6ý¿Ù?Î2€ÖŸü?ãuÄÔŒê?¹HJO÷x?íŠcbT¨s?ån+8lj?írªù…?ì•ÕZx–?Ê$ÜVô?ëÛõŠDñT?è½_5ðG?´»IžgéØ?Ïo§¡Ð²@?åvÕþ>ÇÁ?Ò4r4?Ñ,ܽ»q¶?бékBmU?çåu  è?ãNlëbi?ÐÏ>ªÖYú?ê\¤¸×\?ÙYéx?âtûÇ…£Ç?äÚÈÒV?èü4†Æ'?É¿áj­`h?âû÷¿]?ìRó2.?áèV?š!?èdÏМS$?ÕŒ¾WŒ)ò?Üœãñ\À^?èØ÷£ûl³?â2.FÆ?Ì1XM^¬Ü?À¹0p²m`?î‡D†ÅNZ?îï„9Á¯?ПOIÒ?ÝPMâ/ä?ÆBÔêžø?éPÁ1@c°?äØLãX?¦@±}p?å±jý â?îžvm¡ù³?ïEi™6+h?åþE‹ü§¡?¬{í®@à?ÝòÅÑq°â?ËL¬Ë|s(?ë>ì¸arÔ?Ñg#QwØŽ?àÄj:$?Ôp•# ?ì9Gq™Ë@?Ì«2ƒMx?ífËÐY¬?éIÙ}*ÞŽ?ßµý«ž¶?ï;v¾Ü?æUR+Ÿ0®?á@~}Ðâ?à÷mÏö/?â¬éÝàÿ?ÔÙsŸ¶¹’?î¯8빓N?ȵ‘¼Œ–0?Ü„Þ1Krø?ãÑí’Á8?åÁÄèœÈø?æ–‹'?ç•qZ`æÊ?ÞÁQˆQŒ?ã^H{4åÛ?å™Ú²¤?ëÅãHÍý9?ÜÛ7N>?ìÓš™©bq?Ø#ð̳K?ãSO6Ð23?ÜJ%}µ‚?·áðçç9`?¼ÕžöCW ?튑¨c&Ù?Ñ<X¸7Ô?ÂÃ$iìT?‘³ %î?çcp#8]µ?Üå䂟‹f?æ.x¥ æñ?ÕDØãXB?“FÂ×÷?æ«ÿFHA?î<‰ÏaŽÛ?´ÝÞ—õ(?Ô¾€ÿªî?éÎçpA{¹?ؘ6žcP(?áUöõú¤?æö4Û5m,?éÓ£ü†?·Jgø@ ?íí u?Æ¡ ’ Ëø?çTå㜺„?â»A÷dÚ?âÈðû;Fy?䇩J ?ïc½oÿ?í-¦ìKæÜ?î«„’±ð?Ôæ}ô¥Ð?—¥¡×S?î*êÔy?ÎZ]U1‘¤?ä@ö—Ða?ꪯÿüU?̨‹ì«O ?ï ?âî›?ì më^á?åƒâü{t×?ÒŒIÖ±²Ä?è>Ü.¾e?ÝÚbð–æ?ÚzOª&Ð?ßCÚf¨??æoÅ><¯?æ-qX`ãÊ?è2E ^?Ü8ð2µÐ`?ê¿_'Hm’?áelû5¼¶?q•ïþo?ßÒænx?ÕMܾǴ´?ØïîÓ#Ìh?ç¾sèGWI?îMvã·tÍ?Ö¾tá˜]?ëpÈj)Ô¯?Ñ~¸çáî?Ø@pïL‡(?Ö S”›9:?ÜCÇšT?ç§xãgƘ?ì\òCB ?ìâJ­.ær?íu‚¹¾He?Þ ^iB"€?Õ7®”B”T?ĸ÷êÈôx?Ð è§úXÄ?ì„ïëë¯?¾D#ÕŒŒ?ìUÐÓ à?åoC¶5PÛ?í­·pó?í¹Û·ƒA??߯]?œ¶?çÛ×ns?Єì=†Æ€?ï­Li› ×?æÐñ“™?Ô{êoa²?Áîø­è?îÍ…ø À[?ï e´4 ?ØÑP5B?ÇwC.DÒ?ßêõT¡$?èÞ«“‹§³?î§œP¥t?í…£ÈüÖ?ãÉú%½^>?Ù!½që?بÓu/u?å‰ñ;@“?ê´…æ,Ž?ÀjwVýL?Ô™,1Vïr?à¦ØA™Ê§?èݰâÞ?ÂjΙ”?Ï›0eC¼p?×qB1Î]æ?áÏkií?ÖŽÑÓ±“ê?²gŸ¿÷?׆áWãúø?Ú«ïÀ†“L?î8}¨3!|?å¹ê=nü?ë¤Øc?⠮Ͱº?ê‹ñÜ?à~ õ@þ?Íá Ûœ?Ô1·§ß÷Š?Ñ!,Þ–ŠZ?éFÖf¢p?ìƒ9¸!Ã?œ°æ/?®']ðTð?Üecñ÷·T?Ía ¹Ì?èÒ¶ƒª4?ÔÕ™™kð?ê’¹ ¤ö?¶u¯!–@?ãÿKýœxÜ?¯ ƒÍG ?ÕÓnEÍ­ü?êÊû²ÝU˜?Û.Ôas `?ÛáJiÄ?ÄNòÉÓà?á=¿ŒGGY?ÞZ@|þâ?톒f…½?Ö?†!ü?¤o3PøÄ?Äó³`‚è?ì&{£ýZ?¿6a6£?ésVr)E´?ÛðOkD•R?ؿϰçš?ëÏnÈ"?¦ËÔWIð?ìŠK£u+C?áèÝüÛza?쀬 }1@?·ÈoP…=Ø?©TJƒ(m ?åöfêÌm?æ\ã+KÆ?âÎ;zm—?Ñs³®(Ú*?ÙE¿õcìt?åš=üT?éâÇYŽ?è³÷rÖ‰?æOþDnë?Ò÷¶fO@?Ùò¯Vñ¦?ä˜3Ù%õ˜?àhPÏ º–?ã Ì=ÑÁÂ?ÞÂròè?ïý¨ŸEZ½?à Yþìö?žEÙ而à?賟;aë?Þõ7çäÜ?Öì8à,u¸?æ©I¶†?éŸ×ÏXY4?ì~•qy:x?ؘá±V?è$æo&õ?ááo“?êÔÆdyï×?Í!ªµ»Ð?å”ùåEU?áçy’¤¯Ô?Í®-'cx?×b¦-ß0F?ÑÂXÞO¾?ºD„´ïŠ@?˜ã¨ô?¡Kko›íð?¹]£¶{Ø?ÉÂÌʰ0?ÍRÁp¢Œã®?Ý®'-tÌ?ÍïÂ5dø?å5n¹µ›á?ãõ!̽Z?·ýèÑSnÀ?ë'UŸ²¡?Á%¥Ç3ñ?ã­ Út?Ì:Àõä?³H/ ˆv@?ÖΆû!†>?ÈÙ “ß%?ÞàûQ?À¬/€¾ ?½yk˜¾n0?‘šB$¬ ?ìù ER8º?éB¶û"^,?Õ´ËN–˜ž?æ™yú8ö?ÁqµŸfPd?Ä×ÙiÑœ?Ô¬¤—Kª?éÞfi¢?ïáU§ËÐ`?Ë7‚Þ˜?ÙÃV°äŒ€?Ý çyjæf?Øï¿Ç~l?Ù69\; ?çTÐÿÜÖ*?èÂi²k•å?Û²dßl6?Òñ8IR?†éˆ/>µ@?î8\LuÔ…?è=¹+ì[I?á ¶E[q?Öº¿j¹ä^?³Awzöh?½ë°»Ö-h?âÓc®Ì1ê?Ójêj¼?àZý©™§?ï< á?ë³yÅíbf?Î)ˆ=Gòœ?äLm<_Ì–?¸ü­R¯t¸?»WÅüõeP?á¡x£™?o|Qà¢?äp ‚âü?Ò‹»?åòzÈ/Y?倅e¡y ?ëªm‘P¾µ?éU-ïɽ·?ë\Ñóê˜?å¥BÙu«?À€Ð¤m»8?ØÏÐa”¾?âª#:¥i?Øä\×A\?æhç†ý}?íFÏr]ßM?ã¨(VúÁæ?î¡øm9Â?éá1Öbo?à×Û›QÙ?æ+uÑÒ1?Áˆ±$ÐK¬?Á rït”?Ýàš-@¯j?îÓÎ?ìž¡³?àXÃQÈ…Ò?Ïå¬ ~W¼?ÌH4£Ù*Ô?åh.þ^ã~?äUÄQ-Ý‘?ØR~yY8”?ëEB^©Äé?ã‚Tª?ÙÉ5eil*?㢔)ß÷3?à=Tc¹á¾?àÍœ[½æ_?¨üÓ€?ÎÉÄ¡ßX¸?쾕ÇH)9?Ý›æéD?ŒEÀ ¶@?éÒci › ?¼¬twvP?¡Û³¯Ó% ?ºÞ¨ìF•ð?鈫ôÆÝV?ßÙ*V¯:?ç,ªÜÖ?Óöãú"?Û‡Y ÉB?æËk\Â?уFUd€?Ø’2rœ+Ô?àPDb4îº?Û+½×y ?ìG7Àí'?áÁ2"Y?Õ”H±%n?ß>;ôSþh?ïÉóÊx „?è^d¨(•>?ª_TñFÄ?âšVdp?ÐÎW™«–?ê§Ÿµ`›?ï•àS(±?ºðOàÁP?¥øN}¨à?ÁÂëD l?â‘Àè ù^?œ Hºqà?íC Á«‘Ñ?ÔY¢Xº?ç5˜ßé ?½dìÞE:8?Å^;8 ?ìý †ó'?åa Aâ;?â±Ævò?î #o®ó”?µÄx¾úV¨?íþ'°s?é$ë?rI:?æ=¶Rt²?ëpÖté$?Ò  êúª?Ñ –j½ð~?ÞÎ0å±±ö?ͬ2çfŠÀ?î‘›*`ýb?Å™›ÓSíT?æüð»F·n?È”Nébפ?¼.åß¾—À?ÂÈìárÀ?Ýåhút €?æ«x°–?ï ;îým?áÄ'jÑS?ÆÀ˜’œ¼?ÛžÕ×¶ÚÒ?ЦÁ¶¦Ž?ãD/Tï¹Â?ápʶ?ËKúîé8?áAoóP§±?ë¤!8€§?ëpw¥²a?îÚo‚†™?æuâÙ„Û?胱)åè?î(5ÆÒ(P?´ðåû#%?¸‰&`‚X?ÞÜs[z\?‰–šqþ?æñáLæ?¥³Zaâw?ê¢-„yãš?ÑÔò†S¶?Ò]·Uüà?ïo}`vQÞ?Ûä5-Ú?ç9U`+r?Ø%³7I8?ë-ϪÖ*?íª¬Ý–Ë?µE¢*2?Ôp.ówÉ`?ÙRœLÖÚ?ïlkÖï“?íÌd¹Ø )?ÑI #•‚?ÒÏÓµ.?ÀKPQ=è?Öa¢Ùrtà?ãÜ@"L¬?áv¦3ùù?îj‹À;Åë?ájbü¨;n?쎉REØ?éáࣦ×?äÊŠÔ!A?Õ¡Zî¤ô?ï˜fõB«?ؾ‚¯€?Ù¸©§t¨?ïçþdNÝ?ëÊÓŠ4b'?Û—Þ×[¶?í1YK2#?Ñ´™Œ5P?Å,Ù !?Ûs¬ vFØ?Õ³ÃÈ?Ú¾™¾'D?ç¼f³hšp?]é¬?Ù¡H%@Òv?æÕŸ”8?ÉJüû´?×q‡Öë¾4?â¡Èáô'•?â¯S%—?å9'+ùæ?äDÔ“?âMOh-È®?ëÀ©h€X?¹Ÿ»ô>Üx?ÑP%²?Þ¡¿N¡?èšeãÖú?ÙëHÙìžø?ãølB¬ûà?Î4ÞeáÙ?ÖRË·»¬?½hÉs À?Ôpê1P?ævù%ƒ\?Æö+¤ûl?çáªËæ?áӊо?å¥RÎðÚ-?·9úÕ˜è?ê^:wxÍ?èPsÒ?Àý Ð$0?ÆáBºÿe‘C?Ý¿t7¥‡Ž?ÍždÖBð?î S#ƒn?µ6$ä î˜?ä,¿ihƒ=?Ø'ªjÛ•\?´pÉ\¹1?Å$ªôx?ÛJð‰·b?êC ,ŒŽs?ἨFGÓ?èß'Ïpn?Ùé6D<ûN?믧Å)ñt?ÜÛu)l?à¡ÉÑ.ÔJ?ãD瘈aË?îÆ¾ôÑ~Ñ?æœraÿ›ù?ãƒÇã˜Hö?å÷g[¦ 0?îø) Ñ?»Ç={z¨?ÉSû0”?ß¿+*G½Ž?ÚzÑÂ3s&?½o4Ò± `?Û~¶’4¢?è“sÆfõc?âÒýo Ð?‘{ëz; ?àø¾Î»³x?äC¯”šˆ?æE–žUHŠ?åD¼Ç+ôÒ?ÙÌš 5 h?Õá4(:?íü£ÔöçP?}°þDt€?µÂ¬±”^Ð?éA4ZÍ`?¹$uñH?Û`„Û "?îíìùÓm?âø{¹«¶¯?ØñÑÆ­oº?⬙¹Z‹?Éd²¯IÀ?ÉGŠ?ПÓí ]?â|ÓTfR˜?íNÀø€Yÿ?ÞmËwN?Ô»Pˆ'ž?®¼?îð?ÈwZtż?å-jdÊ?·+ÎLÕ²à?»ª^8h˜?ÆÊß4?×À‘øüÎ?í»´ž %o?«ô5ÁÍÀ?÷žŸñ¸È?ÐJ¼ä?ík¯þL@|?ƹzŠÖMÌ?¼Í+þ ?è!mò?æãòÍmô?ìLè ðT~?ÆðîÊÔ?ßC@;8÷4?ÌŠ[+Ið?æYÁPØ?Ô¢ßú›šÞ?äeÙErÁ?ߟù»S¢?DÔ˜Ò?ª§þUig?î™Hlò#ß?€ŸCfÛs?æ¿F3âe²?´uošåˆ?×ÓdVãò:?Ḩô(€¹?Øá⣗˜?控¤h@?îqmd â?¶¾aÐ?åç=çÏÁç?ÜŸj‰ò`?é®jIlèÜ?Í Š…û?螜߯…?ße6g©g>?ê¶¶~Aþ?çqÑ-yÍ?æª §æ?â7lÆ’ÚÎ?çŽú4sD?è¼>ðĈ?Ñoä±êkì?Úyüô¹¨"?ÛFzj‘OÒ?ÃeD¥žBl?x »&¬€?ÖËÏ$ÿ@?çù€;¦J¶?vð@µh|€?ÕaŸB2µJ?§¿õ´ø,0?ï¶tÉtt?ÜLp’¤$?Ý_x-w> ?ÝKÐâÄX?êW½+Ô¸h?»Ä\ÌñÀ?é‚Êò–“æ? üݬ€ð?îöï]²;Ì?ÉFÕrߨ\?´eó]ó@?âš&|¦‹?Ù[ÀêW?êw×û^Ü?Ô¯Âðyr?¼îÈç<?ÐôÛ':?íµ{ ¬?â@hÖ4±?ãÊúÆÒ¯?åa|þ»×È?é,ÎÒ»àa?ãOƒr/„Ä?¾{Cè!@?ãf­”ÙQ€?躾‚»??Ú<Ü }`?Ü~·“?ëcíð†?îçz¶|ö?Ù…ù¯À¦?êáÂ4a1?뽸,Ÿö ?È.ÇÍ:w ?ìê÷æ»á?ïBeîäS?¹s]tTÀ?âåæ1u+ø?Õ›Î{#¥N?∦òÕHñ?ãBFÇ+“†?а#„↌?ïLOd61s?ëÌ&«Ÿ?Ë#ÚtÍn?¶‹MÕuP?åOÖÈ€ë‡?ê…¤»÷Ù ?ȪV\ª±Ø?Ø'7-Št?âŽVJ~?â —SçÈ?ë5yÓüüE?ë¸ÆÃäë?Ò.ÏC4x¬?Α6ã•Ô4?í¥œžÉ?ÎÒŠŒ>M?ɤDµûH?ÇQξûü ?ËZõ‹(Pì?ëTølš?êæ§RîP=?Þ/(ð@î¦?¬ƒW] ?Ø^á<¶?ÐC9Ä?–+%@H§à?ëµMýt¥?ê×¢Gg ?ßÂ7*Wb®?–±/©0Qà?Í®>Qˆ?áé;¿ƒÊ…?èºxFk²?ì’>¶À¦?Ûò‘+Ð2?í ?¸(HL?àýndr”?ÔwÎuÑ"|?È-»Åê@”?ߨä ã(?é±Õ†A—G?ä M×nT‹?î3 âá?ïJe'€?Þù¦ØIŽ?ç$k9Hß?è†ý?y-Å?çÀQ^ÌÞ0?Öös¤§°?åXÎÿ?¯»DVÖˆ?èWà£ÃgÝ?ÐØéJž:?ä¯Ê‘?ãE¾Dê?Úv%ÍØ* ?ÜåéÍÅ?×NõaýÈ?â){{.së?ÔcèèÝH?çæzXrß?í»};¤Éã?ä_ Ÿ­‡ ?ÄìêŠcI?ïäÅ' ±?ÖæÁ?ëõ±x2?à– „?Ù(4]#×H?ìõÍlÄ2¡?ÚЕ+i(?é›sÛ¾?ìޭƨçM?áN24éÏ\?Þ[ïö…^?§è×ðà?Ù¨qä¨?´9¯ê`?ëòY‡ŸÂ?ã7Ç­íGk?ì¶ûݘzÍ?Þúáç¿ì?Æqb>D?ÇcÅU²?‘ù“ ?Ó}ëç™?Õ>Ó”r?Ól@-É&\?ä/vCîB¿?͆RÙø¹”?å/°óÕ»?ë4^3­ÂÖ?²¿-»µ ?ëåL‡ø?Öý/Aư?îr[Œ4î“?ã¶=ˆÃ0™?—ÈArÿ€?çJônœí™?æÒóA²& ?î } D?à!Z8õ€ó?邸8mCF?Ü‘ËÒ ¾B?ãò¡÷?œ~~YB@?êM¡ á?é1Z†#{é?ÖxîOwr?êV$> X?åc…Òȇ?ÐûlÒùZš?Ñìð†C¨x?êHQ!³¸?ãxîÏýŠ?᲌˜dòã?ËÕÕ2Œ?éd®Uó?ãb\Æm?ßQNÓ¿öÙÈ?ë_|Šàq?·Z¸÷Ì?˜¾Þ²€€?èbb÷¯i?ïªÁ•ÝK?ãôR.=¯?ÖBÒÉ_À?ç×"°J ð?«äâ&æ­ ?é––4ì?à¼ù»„ê/?Õú”ú*ææ?éQðè‘?ØS›?-†?Ô8`úc¿?ì§vGI¿?ëh}ùš?ÑÅ”§g$~?ÚV²òc¸?£3|KÄxÀ?Þ—&ìÖ?á&'ÖÛH?á†5+úë?é;Á=á?Ư¦ÖiÜ?¶ô¼oÜòÀ?Ö§¸h¿›"?çuwNV”\?ç5Fñûš?êµü»V±1?¸úž–õX?î ¨“ú?Òcz}®L?ï¢ÛÎ'g?å.À¼IdÇ?ç€R‹©ø?Ønžw?îÞF^§³ ?ÚŒô®×nÞ?ÆH19e(?ÕñÙ êù^?佇M¼Ñ?ÞÚºöƒíÈ?èÅ¢Ãp¼}?»é‚æ½€?í$ÍXÊø?Äô<íˆ"ì?¾—6Þ ï€?äËô‰8ðó?ëRCƒŒ<Ö?Õƒµùå>?æx2þvE?Øœ:>h6?Ö[Œî{J8?쇷Kþoê?ÒjìØeÒ?éä=Îu¥†h?îL‰eP!è?ë]ÐAï?âiW0?äxpXI? zŽQóp?å²o)GyZ?Ó9]Má´?ÙŠÝzðð?»éIŽîx?êE¾ì§~]?å€/L×ø?Úâ9dñŠ¢?»™ÓtÜÀp?糦fÌ?§h¯ÐOÀ?Ú–ûç~°ˆ?ÊÁazk–à?ɵW+ö¦?ìP+Ö.Iw?Û`oÞ?Ô„Ÿ™®ü?îÖ&L:C­?Öï8nµH?ÉeÃßì?ä]vì„?¶¢¤~ÙÈ?µ½„ýy(?èê6Çÿ·?Ô×’0){„?æŸZ52al?Ós¦ïä¦À?íj‚®+Fl?æy±Ê‰?µîsL¯`?è!¢ÐF÷?â !7¨?Ò%*WÅHÂ?×^ãk²æ?ÕoÓ±8?èêq(ñM?Š÷•T?´hë½z?ì K+‹³±?Ýî4fÖ?äàN¬2 ?Ê šËþ7Ð?Ëþl÷žè?á%½Ø•Ì?å$JŠº µ?â¤*^Ôl?áñÿ«~ž?ÐMµM¤ØÂ?Þùe®ÿ‘¼?×mIÙ3”¦?ìâµ7h_]?Ìé°jJè?Þ²myïÌl?®òsÞùŠ0?N’å?Ê?ÉÎå{Œ¹l?èŒ8Ïîê)?ÉA—°3ê ?ÒXLsV?âäÈêo?í®ïoâC¾?ê‡[(¥þ?äÈÐe6 ?Ööø´f2?ÚN°l+ d?ìPÍöÒ«À?í4¢ä˹ž?ïò¾–’Í?Ô³%Z¸?â¸`-x£Ñ?èðÀŽh9?ÉgyO€?áñçÎ ?¶Ôw9 s¸?É`n•–¶È?ÞIéÞ?èü!jÐ?â³M6þ?⓵UÆf˜?Ý„;Ð t?ê4Ô\‘»D?Ý,wG?¿R?çºÔ¦ò?i?Ã<’XfÇ ?´3ˆÁó¨?Ü_:–Ä?ì¡Cˆ A@?æÁ§Þ]†‡?¯—sWÂð?ä8¹A[?Îm¦ÿo4?·•1£õ©°?Ñ j”v ?Á¦'sïH?ãsZú*^?âÅèX?ãþĹZÏ[?Ö¡ aJ6?äߥ½Îì ?ÇÅ5Ĥ?¶eèz?Ùyü‡ˆx^?å®]c£?æÖGŒc °?ë Áj?x?̆مæ¸?á:§Yµ"º?Û)±ÏV¬ð?ÝPìÞµ¡Ø?ì!j"5Ö0?ê0Ãüò?Ö:Ö©üÌ?é·kj›š?粓·SÌ?Úš¨h½çÆ?ÊÝ2v«àˆ?àõŸ[UÎ?Õç#=@lÄ?¤½oõpò`?ÇÈïC•7p?Êÿ=QÇ ?î_…ä²ó?ì—Oò6?гºÒ"Ž?ÜYééC?éãàâ?' ?ä,VI‚…?Æ&Ó}Ù£Ì?ÉÃúdk¿Ì?Þ>Îjœ?îl3ŠÉ('?îR‚à ?ç (£»v?Ø*2Ž™Ä?Ú1‘Ì"¤?¼751'È?²æJÆF0°?ׇ/SÆF?ëëps»ÇŒ?å¬gF5N?æáìuö-?¬¸¥Ûm¿?èßÈuë?Ýy$‹>…?äPH›·¾?åoŒ¢šUc?ň¯Á…T?ÒÓmíêK’?ݼ²¤(þP?îyê¨\O?ßÿ‚Þ™ú?燃ÅÀÑ?Á @Ïrö?çÀÇ}c ?ÛasW>Ò?åÏ Ac‡?æbÉ)Z?â?Âû€3L•¤?ºá{y¦À?ÄÚ­Aƒ40?Å*Ü„ï+Ì?îâÞPDÓ?»Kz°?î~SQæáb?Ò|žÐœŒŽ?걈)g?ãJ&T…6w?ÄDñ¿||?ìV%Mñì?Íhæ)?ë¢K°/z?—¾äÌ{Äà?±zìAQ ?ímTœØþÿ?Èó:b4Ð?æ#¢ƒ]Í ?Ø=UÂ(?æŸýW¶h^?ãµ³ÛÇÞ?æ`}-’h?Ù`ƒŒ(Í?½v³`è?æ¼Ãëû¥´?ãï&Ä?äÓtŠÐñð?í þW™üx?ï`Z¿O?Ñ¢´ÒÕ…Æ?¹ÓÈ Jp?¼rI³ô²Ø?Á©ŸPå`?áçz„kÙ•?æMeÙ=³?æ©•:é¢?ÄQ­Iôˆ8?çÙ›.A¯?æº |å90?ä?3 ‰Óº?á/ß51ø©? yÑ“ß?ÆAWÇS´?Ý0š:þÌp?Øþ«#¦:?Þ¢ô&`•¾?Ú*Œ­R8?Û’¸Ž/â?ÁóÌÇÄY¼?ÌÈC'4?åa5÷}?äŸà³ ?ÃÏók0/ ?Ãðe¦>4?›¢EÍ`?¨P ¿Ð?ÇmB¹+ t?ₜ°ÃÂ8?ééIÓæôÝ?àš1ñlÞ?ØœÄSQ¤b?ØH/CÎ?Ñ˳Ã'LV?áXËŸÉ)?б)þ$×d?Ϩ↔Jø?ËžÛŽp?ßa‹ù…?Â^W»8?ëú¸Ëø¡?ïÍ5¤J?¥ÿѾð?ÔHpW…:f?¬üçâÛ?åé¸\æž?éÖz·¾†i?ào¨}½ô?Ýš!Å}.?É>"š9Ô?ç¨mr®æj?ëê…ؘ?ÓFhδ|?Ì_.ÎX?âÊS—ã´?Õ5 ÙÂh–?£!›7±?òÝs0h?ÃmtúîØ?ïV™ÞIûÊ?égW&@ë¸?°ÌUº?¦ pmUlà?ÑÇIQ™˜,?æþ]‚,âØ?çook©ß?i WDìØ?ÚÏ1tdn?x¾)ê'i?Ñò[¯A¢Ð?å£b2Qé£?²÷¼E0þØ?뢺%$?áú™SC!?ë‡{OZÜ?éOeã·|‘?îbüð¿?çh~žÔ¦?ÑÈŸ¿¼?ïñž7<’X?í=$ šÔ¾?µöIn$Ex?×—|¥—Ê?èò‡Ÿ?â‘Щ?X´?á_*nà3ü?ÖÄÓÞ¹~œ?ß°Ä ÜxX?¾º ?̹W/Wp?áŒÃŽ3?«s Œ å°?à ÂÂÆ?ìÅhÉID•8?ë,¢-àÆ?ÏðÈEèÆ¬?¸öÄnP?çNLÍëj?ëΘÄè?¶k6®,º(?¶žá|ø?â)»È¬šx?³lÅ‚"®Ø?éx=VáùÃ?Ä&Ã.ö;?à°z—jµ£?ÄÛƒ^ò?àúl™€ì?·è9?8€?ׄÛô¬¸?ê¬~òWÆ?á|þº×J?×góívœ?àžÒ'üœ,?ʽùé'©Œ?í“5øB‘?í¸†nQT?èæùnI‰H?È3~?ç>gJXuÑ?èžî´ÎØ6?îÈ5É,É?å´ l]y?àu—”0¿?å©_”ÖΕ?¶9…¥zø?ÓPW@ ?éþ™-A?¤§Û0!a0?ÚªÑh[ˆ?Ñ‘Ÿv«Ð?ÏsÉk­Ä?èú>ë¯Þ ?á3MçÇB¿?ê_œŒPB¨?ÚÍ02¨t?¥FVÔJ?ÓQõ<+ê?ìaü¶h:é?æ¥ÏmŸ?ÑŠ!y?ÅDÓ6Іd?éôT ‹™Ç?¿œEÕÈ5È?¶Ìeó8?æáÄaYëí?ì#m°ôV?Ü ÖÑp?¼u€Õx?Ý6ôÕ¿ž?ë22æjë?Ñrzò)±´? Iý²Þp?Ì“jìßXÌ?íMP ?à~xF ­?Â4abtöT?×vö´Ö›R?‚’YOà´À?´I¼ÄŒ?ìr†»±„l?ád Kˆ?êW$çú?ÇŽ<ÿ?㞢œb=œ?w´,±;@?²v7¾¸0?´ø¬5Ç4à?ÌJ³Ãh?äFK»=ÃÅ?};jå€?çòãéç(œ?Ç °²a?ÇÚØ$©ð(?ìûzAÜ6Ó?æðýUΙ?åðI@\9?êAB¦’š0?âÅêÔÒf?ÓYú›•¦?È< º`ø?àv*>Ï?ë‚Å™­2]?â¿yšN>\?¯"]„?ת| áò?á/J¹„ëE?Ò×)’†q&?ä:/…K}?؃3–ëâ?æ‚‘“‚ßM?ê((Sâw©?ïÙ{<°u?ä´õ ,?Ósòˆ8Œ?Éœ’Ø”L„?Ù*‹Á_-F?É<Ëy.þ\?ä•i6!?Èó8ëéx?×,}죬?΋cÅ?ÝRÐM?ê‡ÏÌ™?íI§Š+?Õ½Ï-x?Æ…Ô?Ç't?³\•·K?À€ü†­¤?ë…õ á´G?äžáÉt ¢?Æ´7™O{ì?ÅçôúÐeÈ?éŸ]¨[]·?Ú½÷àF&?ÉzïÑÔÍÐ?æ]µç¶µÏ?¦D¸¢¸` ?ä©Ü?ç9¤õöî†?àƒ£¥6Ôé?î)5ÕjÙ?Ùvì?É‘>ýf?·b õ"Î`?¸=…2®aÐ?ÄÆcò‘ D?æO™ ìü?ßé}€ Ïø?ï¾°LÖÑ2?ãr'-†F?ãøg2Aë{?çÉX¬€IÈ?Ëp"åàÇø?É×ßø?ÜœkG7J?ÝKP"žº?ää õ¨Ã?Ë޳̿è?×ß$œ«µš?â=‚4M`?Òî<-bÚ?éü!`äÀ?Àíæ_ô´?àµô¬h?Ó„A¦Þøì?ȼóþôŒÀ?Àùö5i%Ü?Ç⃨®›?êÛ-ÝZ?ç)wÄ]D?ß÷1Ràßf?Ûƒ– "?£ÍŸÚŒp?åLà‘T´?åNGâ—ûê?Þ`ÄÕ@Ú?æµ­Íeî?Ý+y“ñJ?躚 -Ì?ï¼4¨¹ž¦?ÉÉ-ô¼?å-FÑ? 5ìýë ?»)É‹Êßø?á‘7kt°t?éè°ñÞº°?äv?Ï·ý¿?ÞæÙâQÊÎ?äãö­"²?ëä"‚%–?ë꫉cjã?é™_{ÛÚ?ì€%·ÏÄ?©ÑMˆ&‰°?ì¯Ql¯Þ?ÊÝ8Mç ´?Òp>žšrP?Äœo2±*°?êÿ¬ãZ?îr¬÷C”l?Òõ¯üˆ¶N?âÓÒ P E?ì“­cÕƒ€?éšk‘á#?ìŽä¶»T?èÎÒ=k(?ê£ß¼Ô»?Ú,Ò0­lÄ?Ó9‡UJ>?Ó}ˆ2¢£Ä?îÑX%@?}+éZ+€?ÒßÁýJ1Ò?Õ+ÿN"?ȺHe…) ?ßlTøÇUP?éÌŸt]'â?⺞E·n?îe£âè°ˆ?ë4T2;ù¢?ïIŒˆ€ðW?ßðú±Š,Ö?ÓuKçà?Ñb?Oü?­ˆÐË ?¾–R^9í(?»£K#¦À?к³ø~ ?à8LôGD?Ëœú¥‚”0?Ù(®ŸÐÊ?Í ‚zã›W?µbÚÖ®¢P?ÎÎY«M ?©)²ì?îﮀø15?­ænö•?äb×K­—?Ý*)HÙ^¤?àƒŸ 5¦?ß(¬“åê?Ö‘°<»Þ?ãžcÅ$w ?âW&ä±?锾 Ž‚?ÖŸ§HvÞ?ÆÃDbôa`?íQ2>ßÃ?É–s½˜k?⯠º€Q ?é:L•ƒ! Ûª?Ò«wÏ’?èÏÌÐúã?Ð…kÕŒ½Œ?ÜßeˆÅIL?æöƒ õÉÓ?îİ{ü?Ô7aÓÅ?êÉ ®Î\?Ümuézõœ?çøÁ ¯?¬ßÁ‡h?é~®ty®”?èÓ"¿G£¢?éÙŽý8/ÝÏL?ÈÉæZ9À?áåÍÃní?ÌžO½ßöÙá(?Ù†€,zÊ?ïk—7õY&?ߦ«uA¢?î<ñv=ûT?äÃàõ›êX?蟵 ,?ÆáyÔ=9H?§UBøHE ?å Ý5ù;??Îý ‚ôn(?¤Á É´ëÀ?וº̱R?íþZ íT?æ^̪”.?í½Šh~–?ϴɨ „?à?üc?gÐ?ìð9ÿ 9ñ?ïðÁ´ßãÛ?îd.{'£?Ùleî?Å«îM¨°?áß»¦½Õ?Ù>êY×Ù¦?°Ά‡Ð?ºè]C…?î[ž}k?ÁšJoð`?ÙeÖÿvú\?·=:–š”?ÚbhŠ?ÕÉ7YÎ~X?è4ÊqÿN?Ýr «¹F*?–_ý¦ ?Ïñª—%ˆ?ÙAõ2œN?²7Käd›°?Œ“ìäld@?ä˜iArD?ÀJBÕ·êü?¯‘„²ôßP?ÀÑ*|ÅÄ?èÜ#I;|´?Ÿƒæ.ù ?ë7i;Àä?À™…TfT?âóÂülæâ?Ú#ª²þ†?î‚ØíÙñÙ?í‰sïôú*?¹8E…eó@?ÙX§´C·Ú?ba´f¿€?Ô žZ-ê?³‡vçtz8?ãl›k»›?ÎW«æ°T?Ⱦ*+ñPü?ÑžÛI&®?½ÓÉ…&[ ?Ûwo6ú?ÛÝÚ8¦p˜?àëvfX&Ž?ì>´LBU'?Ùù Rò?ãÅ䦷?ÖZ#Ùò?äPÚ>䊟?Þ¾l°Õ”?¶¹³ð{q?ÑÂc[XÞ?ìFµ~¼Â?Ú.˶ûnà?ߦße«zN?¾jy]sé¸?íqÙx,‚?î“Éf3?ÆVÑ$±h?åËÉ´Ii?ÕbD~ç ²?à¬Õº/´ ?ÔDÎò\*?ïÙçÓ¼Ù?×EÄÒÔwÔ?ë}é2rS?ÖÑÊ¥j?ç#Îcm16?Ø2 0NÑ?ç¬[â«Þ©?ÆÞýFØ?æD·½ï=?äV“GŸ´˜?ã fêW?ëêÔ0IW¹?’ÍíÛlì@?ä¡ñÝ}¯,?ÍÕææX?á¬jàq}?íÄãyà¿?Ò°§%Ù ˜?ÄMLøœ?þl¾Z£?¹·ð-ŠH?äå \þÈc?ß~ÿPØE?Ú;“nô x?ç©púx_?ÆÍjt¢?ÞF†ñŠˆ\?ÁÍ$õN±0?Ók8ð¾¨æ?Ò>aÃ$}”?è0´Ø^ÐÇ?£Œu³ú@?á†Å©FÖ?Í}Èÿ¤?шoÏ/™0?²„]?H?¹%ù×UÐà?Ò‘â/)uÌ?ݪ#ÿDÚb?è¥uô€2¥?Óçn‡¦X?ï¶þÚˆÃN?×$[îçj@?ÈÞʳþA?Ós‰™œÐ?Ðúºuö8N?æ(}ù\Ô?Ë™á‘âü?~Ê9 v?äнßòZÿ?Ô£…®Ðò?å`àÀ©5?Ô*6Úl"Ú?æb€Nx?ÑHê5C’X?æ,œPè?›ß-f+ ?Çñ  À?ë«Äc¸˜þ?–ñê=ö?ØüùìZŽ¢?îeJU„¯?æs?l«³?È$Í…üøD?ëÚ I¶?ÔËB¼56?Ù î*³x?¬xú|9P?ÑIf~^Ž?å·w«G?î¢Ø&Ѝ?æ¨Ö[½?èØkûž§Ù?ìGwdÄ?ׇ˜ß0?âò€Ö”QŸ?åf˜ØA?ä±ß‚Ir=?ï9„¿[?®Í?ÁMð?æ´&7êht?àŸ>˜N¿Æ?Ó»ÈéMâ?ål±yiÍf?ë¾”„?ÜúЯ[4?à~ýYæ]?â7P™ÄÏ"?ÇŠùq R ?ßs-m^Š?å™GÜmˆ?ê¶W˜”óp?æìJžU‹?çüx‰S·?دƒ¾t‚?·’«-L¨?»‹œ*Èü?É1õG÷4?åÃ,74;ï?Ø7]5!ÞZ?¶@4ðÀÀ?ÝIÙö|?Õš潆?îŸy-Ÿê?ȕŨ$?ér®9®?ïK,5Ä?ãZ†Z,Žƒ?é#† coA?†HÈ4b«À?°aµä9€?áJ·OÒøý?ä(‹]Ka?ÞzRìðN?ᕱé×ÿ‰?æå³¨\?Þ‚N)ÒŸü?å@eÑŸÌ?æ$™\8i°?åpV“Øg•?ØVçùžJ˜?ãZd‡õ·?ǾÈö±ì?å‚»ÞÍiY?ìúërÕi?²ªÉå}x?ëÓ.âìS~?Ѥ¥à?âˆ]켋â?íËðî?ïW]¡ q?ç÷¿‚ÉA?íÕ^ó’/?áÄŲ%È|?ËBbåàGø?èü#_Òš?ætwÖA¿‡?âµi܇ô„?ïtßF-»‚?ë¡]ÉTEB?äOIK&ª2?ïB³¿gB?ØrO+ü®?µûMeòoh?Ø'Yj?轧ů?èèÅ´$!¦?Þð |{±.?Ŷ1ÖŒ?¤Aió«P?æ=Ô>1B ?áV&Ýá ?ȳôÎNGP?å[Î_Ÿ‹ð?ÁN±†  ?ËøW˜DÀ?ÌÌBXÙ6¬?ÓILö=›¢?Æš~,HHÜ?ëm ýPßÍ?ç>ÜÚè]?îErjj0?ÆØóU½?æü¬>'Æ?ã ^ ~›Ù?èƒ7'õÕ?ê/Ü$ ™?‘ö9Ù$ä ?Çwuj‘x?¾ 'a÷@?êôÀ [ý?ìg:é•6?ÊøÕU|N`?Õÿ»?Øä«‘ÿ.?Ò“Öh2?¶2‡Ýx?ÎÈ£†ŽVl?ìi` ¨«$?³Œúøs(8?ÎS8oül?éšhôÒ>?뢂3?ìçx˜ ?S?ÚÚo$~?í!U)Mà?ì` '5?²@†è?•‹ ŠÀ?ë`ñd $U?ÑWõŽ«ÒP?ÍÁ…Ôç:ü?å§‘zÓ·–?Éß9 áõŒ?æH)Â+r¯?ØÊròW ^?»îqN‘ˆ?ê`Š­Ã ?Á~³‰^vˆ?ݯ*¬¬X°?ë=ŸÇ·?Ép¨³ž5Œ?è†Â}qÇ[?ÅNÓóì?á€0®¿ ?Ð0+wÆ”?¹zpø/ ?¡L>ŸH°?æ²üãù?™&óäÎ+?Ëà/4Ô?Õ}è®?ì ÛyJ ?ësIn˜¥?Ù¬ù·×¼?Úã·ÎuŽ?áN!­Ñn?å4/f¶5?Ä X•¨?ìú.‡§Ë?ÑŠ»£BÅ,?åF†s±Õ‡?ì9î³ýgÆ?㽕‘—d?î5›Ò§&è?Ý9mÑ2?ãsZTÐP?£z0ñ[À?ËÕ0?~ŸT?áC0ŠÙŪ?ÇU¬”½à?ä>+c=W?Üö~šÚ?¶ L°È?êÊE£’pî?͘Ԝ‡›?Îï 5à8?æËïÞJf?Òç» ¢Åì?×s0κÉ^?Ï«.ïš ?¼Y@v8?àF·†E½?ß:¢ö^Œ?æ¦' |?á(*0èƒ?Ó‹q[qæ?ÑN@‚B$?ç?Ûè¦T/?ëùÆÉD —?à­EÍV”?ê¶Gf÷?Û¹Ë^ø°?çË2E¨?“"À•r?ãx;Ôvçý?Ê"ewÒŒh?Ö(©?½p¦?êcÁ=4Ä?ì-¬˜s?é/2‹cY·?è…G {:7?ãU¿ðéx¾?ä4qÍä²?Ù¯ z Šˆ?ë·ai'*?çµ– 9çÏ?ÍUØÀÿh?Óù9@ 6²?´Ž*º½`?á¡4pNB?ÔŽtÜ©P?¼’Ö¶ªð?äB‘;Ã@Ç?åàõbÍ?í;øüÜYÒ?â¬eŸ…¦?’Ægd¼à?è³C\ݘ?âi—t–¥?©ìo§?ç3+²æˆ¼?èÅ'²|îÙ?Ë•‹ ñFD?æÁ¼r@À?ጅ¿SÙ?ÃNx{™rŒ?ç7í{ÄZ!?åk}ƒÕSG?â©•¿?äˆA¬?¶ŽÚÌu™?à!…Ò^æ?Ý‹löHÆÔ?ãßç{ ?êÙÑOËOY?å«ërüU›?ãüÝœ²f?æêš”=â:?Ú죆)¤?Ñ/Ô”æÖ?Õî³ÛU¦?ºZÇ×P?äÔÍ–ÔUÖ?äC=NÓ?é 8sÒþ?å_m-I +?æèèQ?ìð GGu?¼ Ý»¿M0?æ,uPÖ?è,¸ü#b?Ñ_“s7¯H?¨$Ë/Œa ?ÀÔæá¦¨?ÙE±Ï:ò?Û5ØxRuÒ?ëö´nF‚?ã!ˆ+ù¾œ?åuÄãd?錤㿄?Þ³Î:@?䵑~=Õ•?èw²ïá­?ïÎ<ªh¦?Á»#¸ÀØ?ä‹.ka?ËÂû_N ?ã¼áa±?Ô9è¹àÛ€?âTòjëGÀ?ÚSІq?æÿ_ùÐ?ÇL0Ò…ô?á¿jim?î?ä2œ?¿úþA©5à?Ý1ýú·\@?U®¹ÿn@?ç×6¹¤’Û?êa>)›½?Ê®Gn‚ì?íãJ§bX?ëaStè!?ǵ°©Úx?³¾‚ƒâ*¨?Á„™Ûèü?ëogeÈ}G?Â=Sûæ¼?Û‡#Èí7R?Þÿ‚¹è5ð?¿¡sЫPP?ì3Ú*Ûùê?íÿå…\ƒ?êê½–àBb?ך-q+ûr?Íì*føÖü?߇cKŒ?í€ß"ºã+?ç”áÛR3?ÐdÔáíƒ0?áÿ´ è±?¹¬³5 ¨?ïß-(""?ÎóÞ% L?Îû –©Tü?Ü•"¡·|˜?’tðŸ¼ã€?§Ö…„.À?Óß0Û†ÉÞ?Áà’4ƒ$?´¶ïiÍM¸?ïóL_âè‰?ç~Š|$_?¹Kg` à?Õ2ž2ôÆî?ؾPÍn?áJ* Ã¨d?çCàt¸F¬?é¡OlüY…?Úw#ÔÔ?àØp óÃ?¾: »e0?Úívþ66¢?â’¿+¦þ?î¾J’J2+?zM?\Z΀?î£R70?a?ãÆuÆxbJ?ì"S¤Qk?ï”P„”†ƒ?ÝrŒa0çN?å6è¿ãº?Ë{;ª€Ä?Æ(|qÕ€?Í0î…lá¼?Ó/ç*'9R?ï[”™(qG?ÈìÙŽìd?»S§O¸Ø?Õ/}ðÔl?«Ôþ†ßÅ@?ä_83¼W&?æM×é é?Ø»]]Õã?Æ!‚:x?èeEÓ:n?áùÅç 2M?»4µsˆ?åîþ ©¼é?çO±…Ù3´?æ'þ5ÕN?á—òð'?Í1ûcÌ?èÚcŽ­?­ç÷ž›„?ȈûÈ?¯#,bªÀ?ã%÷2<[?ãÅãÒ_‹ò?ëì¼]º ?ì#˜fþ§?ì>kD)Î.?ÉûmÞ à?Üj›Æ j?䔸CÄÿ??ÑÞs6'8`?ÆÖ¼Nh?é±fÝád ?ÚºÕÓW!¤?ï½ÅZñ¸P?¿…ÜuŽb ?¼U\$Ý^˜?âuWÀž @?’Ò©%zxà?¬9ƸÜH`?ìgµLÀU4?Ûë”2‹V?èèÖCú „?êòº‰¼ç?“âß·¦5`?߬µüÕê?¶lHrµà?ÞªH>~ æ?Øsð0½Åú?éQ7³È?åï&a³?ïò>ÊñîZ?Ô5^!<Æ?Þ;,›?j?éüUÿ—½u?×<.0Êj?аê E.?ç3‹™º’?Ø„kS*O?ßO­ Ü?è-OzeZ?ÞIÝï±–?ë¹Ùw²•#?ÃK “·ô?æ|-FbD?ØñX%l0š?Ò0`piÿn?Çk µT?î°Z€ót?í^L?‚ƒ?îÃv¿ò?â*¨ëÄã?áÙr݇0?ãhu Ò?Ù‚ ºd?Ì»®Ít)ø?Ü^¨Ê?2"?ä"’¥¿çÍ?ÖÈËxx ?Øëg©‡t ?¡ù%s´· ?áëŸáÁ}¿?Ú7ÙÏZ?äï-€ò?àÜ¥X:Ô?á4ˆñò}?Ät¹äfw¤?Ð÷“ÉÔÌ*?ÞóŸµä?ç1ÙÆ+j°?ݹÎÜM'Ä?Ú¨ŒÂ¥Ž¶?ÌZn*Ђt?ìóvbL†?Ö`ò$f*?àÚ-±ãµ,?ÐÁtú?ÊβüVÔ”?ì7Ë4×JG?ØZ±’/‘Â?æé/úA?·¿yb‹Ö ?Èp3ÿT?΂^Ïàà?âÜþTãà?Ç/Sü‰©D?Þ[O9›3°?éÜÙ¯?ê·wMiØ?ê wßÓ‚?ÝÒùžZ‰â?éÄÕJ´<»?¯(­½Q•ð?”ø«PÔ€?íÝŒ¸‘Ó?í囓\‡?°'|Zì€?꿵¼´ûÐ?Ù;a9tôÎ?àb%…VÆ@?Ñ•ÐÄæ?ÓÕ‹/ø?Òºâûz\H?±l©ò>Êð?ÀÇŽ“J˜?¸Ñ_j˜?é9îŸ T?è˜?©Õ|?ÒL fú¼ª?èÅ×zû±Ö?ß‚ýƒrü?ÔÊÅð%rè?¸l ‹¾Âà?½L Kûp?Þܬ3£›F?ÔôDŒÀæ?Ý ïÁsf?áˆÊÏ- “?ìW“6‚Õ×?ç—™áŽô?ëÌǶ—ºÏ?ßšH/\â?äR±¦—Ÿ?­ÞâF ]à?ÆWDÓìÑ ? û1Òð?îÚ$e¤½?êç²æ µâ?²< kèÕˆ?âhr1°Â? ^Çð P?»øÏÒºu˜?ÈÎbJ¾h?Öò…¡HÏX?â<´ŠÖT?Û«8t d?îa Òo?ʤ³üm„ü?á´eŒ¤#¾?çIG&÷\*?ï• Kd0?èÃy„'˜?çâ?ª ?íš¶íã€?ä;Ç­RZ?éL²¸+¢ö?ì&ÚÐ;ÙU?ìVdF@‡i?îDjó®à?çµ´¡ç[?ç|^Ýʺ~?èÜžø|¾?³0-8@?ÓÃ5¹ÂÖp?¥ØzXÜØ°?ǪñÙ?êÝ4ýðIŒ?èŽa‘BH6?ÆZ!sܲ$?âäºn3^z?å~!/Ãò?àèßÂ@£?Ë!ÓP˜?ïû*汚e?cÏr_ð?Ü>Œ ²¾n?ÕÉISL2?¦ Û@?Þ² 8:®?ëñ;™?Üχa ?èV’#à]8?ê[¸¢ß:}?lTÝV?ïL ‘ä]?î´ÁÐ?å9•%7pÝ?èíbxXJ³?á@uð8)Æ?á_«ñ6q?ãë’8º Ï?á°ó4i[?Ó·|œ­%æ?ïrªª·@?ÊÉ5 ?»Û+_:?à†Þ¸f?ܯŠ;`?î™EÉž•?ÞbŦ+$ô?ºîÙñ2Tìé?ÙGý”hµþ?ÏOèà™ ?×Ùƒÿ,?¹e<Ūs?ÐüG+¡:?å^`3$²?Þç:‰Î ?ÜÇ©½<ÒP?ÞxsrE2?ìs©ÜÚ¸F?èØ¥Ôjï?ïÚÑâ9ç?–ž@¦À?Ìè·?ލx?±^ìŽà?ØQ­‚2?ì¹Ü8 ?Ñ&TÔ/Œ?Õ&§Â…T?Ø„#UÄ`ú?àH öç?î}]âgÞ ?ìB"„¤ß¢?¥9-k)AÐ?ïÝÛaâ?ÐOÃêwp°?í¼…Ñm?ÝDõ.ŽN¤?«#t÷€ÚÐ?äièlë?Í!<+XÖx?Ïêÿ!^íœ?êÿ KCÄ?ç>¹LÀ‡?Ù¹šD“h?ì›·C²óX?E÷n?Ñ<¢qêv?ê'Ó4ÁÃX?ê¤Y:0Mª?ÚË!ú8?Ö›Rzµ2Ø?ãoE4ß?Þ˜þ8WÀ?ïdÀ:ŠÈb?î¹ûÕµ5T?è ×Mœí?ŠÞUM À?וIÝ™â?ËnŽdp?Ëv´µ?ì&b"Bð?¡Y~$8@?é^^éX¢n?ŸF÷‡°Ã€?Ò¤±Àž?Ò ¶Ê{_2?íã¬X’0á?äYbFÛ«n?§&‰‹ÂP?£ï,­»?¾A ÁGð?î©¥OQ[j?êêV¹ ?àñ;Œ?´ïPð>ø?Áp{>rÉD?ÐlT·–?Ûeí4Úc~?ÜAVôÿ‘p?±Ê{tñmÈ?툟 à+Œ?ºÕc'ãjP?ºÆÅ øó?Óß—Ì€à?äþNZ‰?Ì̹3Xt€?Þ(Ž(Ô°°? ¼EÛÈ?ï@(†U?ì#Ë®¯v†?ݼ©JöŠ?ï§D¬aj?æE¥šÖ²Ž?ì%¸ƒÜbÉ?Âóf9CØ?Ögq©ezj?´í(Üdò@?ßS©›ñÌ?ÐíÒº˜?èüŒÝ †“?ë—n°‘/?Ýá]ÍýŠ?ì»robì?ÑùˆZ³²ä?ë.zlV‹?Ú»D`u´?âFxÄ)©ÿ?ÛaÀg‰!ø?ëgM°ÚK?æÝÙ✺X?ÒL‡?T?ãú2`Ô~G?æ·º¶§Mi?äÕ Ë™?É…„Üo—?Ô_ ßwA²?Ñ>è‘æÍ|?à¡ÚðaE•?ìãsZÍËé?ì˜Ýãö3?î 0Éy™Q?ê7V$oQØ?© šd©?Þ[¶H‘?ç¸:)±€Ü?å_—!‘‰`?íÚ¦º¸ä?ê ÷Y߆o?í6¤f’O?å4§Gð&z?Ì~éûÒ²à?ìá: ªHk?éÃ/N'œˆ?çOr½Ö=?¦Êßd~?Ð}‚1?àX#·C‡ü?ãýWB«–8?Å¡uð^ìl?à+Öu!Î?ágòÛ>?æ³^OÓv?ߩ޺?›ބ2†h?â$Ý›~ñ©M-?Øn"¿Ú™Ê?éºHl’,?ï¥æ:vÅÏ?Ù9ôW´ô?ÑÛîûÌÓf?ÒéIÑ·À?ÃMRôø?Ñ ½Ë¬Y°?ÝKÀ)v¤?̖᥯ ð?éDŒ À¨5?Ó,Ün-ßh?ã·²ôö/–?ÍÚõ"±•(?çO­5ƒw?íÕGEÕ ?ÌÝ<²¸?Û7¿d’d?àË,u?æÓaÐk?â ˜’õ?á#«™¥1^?ËdÁmË,?Üèîå7c4?Á¶þæIè?ᔤ?ê 2íÅá?é´ÕÁ•?­’²‹Ç`?Äv¼ÚÙó ?ëýæEóº´?è£ñý2’$?äŸ&@ô¦è?ÊvçßDÅX?é,GÜ«i$?²ÑƒåýÀ? Œœk9Zp?çrh†d?éŠ9Çyì?æ%¸§÷EÑ?ÍbºÓ\$?ëù%™Ô?Ûûæ¡Ð P?Öå°3·H?ÁƘéT?ê D¥è‚?æÎEÏ¡ ?á\åŸð‰?é,Ò€izÖ?»cAôÆ8?ãBŸgñþÚ?è×]D7?Ÿ¨Z-•–à?ÔÈuœ ?Ê›äú‡µì?Ú”œˆŠ;:?ÍÌ¥j`?Ü‚hâŠã2?½;Où²ˆ?·8z¹^lx?Àü…‚Œ˜?ásuü¹Ã‡?ÚÏùœñ‰ú?Úxo'ijÌ?È6 œæ80?äDd˜<4ª?ÒH(Òt¦¢?°ùešõ70?äh-ÄžGé?Ãxt²ê’D?Ò¬v`hlŽ?îgú|jC§?™…HÓ@?Þesø2$?àOŒ£ÌN?éòüâR6Q?Öíd8¸?¯j‚õ2þà?ÎóÞ-4 ?â0ËõÉ?Î_|ªÿ´?åÉÖ½¼W?ÍkåïÓ°?ìuhê(?٪ɖ?Û$PSõ[’?Áƒi'£È?çýì"ó@c?ã†@%}^‘?Ç×pnä?¯ˆ*…†?†Ÿx 24?éWŠý>?áëÀD6?èæy-}ž?¹T¿Æ³½°?á0uEkÕ§?ëŠrÄ6÷3?ÓW©”n6?Ù&Tlò?àc³"»d?Ú'?»5ã×~*?ãiiCyt?Å •øÌ?äÜŸ`»?í¼è}¥l?ébï¨|"b?îoM ¼‡?¸¿e¦#2p?ÍÄc¼óŒô?áÉt¥ ?ìÈ‹u]C2? âçƒÀá ?ÓW9 'ô?ËsÔì¬?Õ¬ñ"÷Ö?«êê"à{à?Û¡“G*Ád?ãÍfʦÛ?éúýç©E?·•!×ÃX?é‰Lù;?æòá›Ã>?ÜŸ]¯þ¢t?ÈkgKH»ì?çí§ºê?åœUéO}u?ÖŠ4šŸ«þ?èŒÊ°Òu(?±¦@ož€?åï9• 5(?뉘ù]k?Ïý º‡™X?¨Â#e­ ?Ó[²‹gð¢?ëâÂg)ËŒ?ÔXL¯.£l?Ñ#¥ŒZX ?ܧÆfpÆ?¿`¹ïxè?¡ñ•T÷@?Ó¼ùô6¸?èlÚcÌf?Ƙ«¿ÍX?Û¶ÊŸR£¼?æÏ¾œè%?ïQ!xó/Õ?î…÷bÿì ?Âw#kþ?âtÕÞ7ï?ëòÉ6²>û?ëÄm,ó?æ€zbª¦—?Û|®ÃíÒ4?àüŒ®g‘s?år0=5$?éŠû2Ã4 ?ëK}dÝØk?ìŸ<ŒœB?ëÈ”kŠÔ’?ï¢X¢zÔ?µ·xè?篜2ä»`?âv€—îê?Ü9“Žÿsâ?í׫ì?⺑HÕº{?æp:LÞåð?ßrÀ£.¢ê?Ï` ׄ>X?ÞnÊæ.ˆ*?èÂ{,&»?ï!f·GU?áÍ&[;l?â+Øz®ä%?åaç5š»?ÓÛíŒ]uö?äëlÐF?ãJf«$?Í^cêžÌ\?Èanôè?Ò Ý •/ ?ì#ŒG Ó?ãzº+xγ?ïNjB?è—?âp¾à‹L?ìŠÀâÇ®?ëÔ¼mÞ9ù?ɲòë>¸?À7¡ÚV?ÑeqF‰ðb?à2M®‰ ç?åêà Ñ>'?ïÍt–B½?!mÐÇHÀ?êõU!óÌŽ?í2ú;NÅ?㟲 Ëk”?å{–×´Ž?ÓŽ¯Õþ? ?ç ¤nÉ ˆ?í喙»È?xuppL?áD•r/?ì•§‹j4p?µ  ¼`?Õâûö5?̤跟¥¤?抉9…Zª?ír¡+ö?Ô“T­L?ê* Â=?×Hö˱;¨?èòuE€1Z?«auU‹P?ëë!1sH?ç÷+³¡?Î_³*±A¸?çdzÒ·Gp?í]H¨L?sÈ3~À?ì·´¡r$w?à45ø??äèw…Aà?Ý J“ f~?ê±^u.v?Íå×gÑð?½ýý’|È?Ët÷Õñ4\?á.À¦â?ì¤{"üa¬?æ “ñ÷ø?”ï$ÿÔ ?Ù#DØ?ÁŠnlq?ã‚öVž9œ?îm4øŽØ?¶_ø¬Dð?ì÷l±`†”?ÛiýÕÜ‹`?Öb0NN°?â@‚,k?©XžjiîP?ÛB0RÈŠ6?î™ä09Á·?ìe¯y q?çYÈI7 ?ËdÿW•+¨?°ñ”ËOˆ?à0ä—üì?èÈk´³u?áÀÔ¥bÎ?ê씟‘Ÿ?ÄÌÉì{!à?ìtG@wÕ¦?âŒûÞ¨m2?º•“²m^È?î€Üí-?¡"U¢èÕÀ?À¨¦iæÌ¸?â:"pÕM?Ãnqf]°?ßvÔ»j?àn<}¯?è :D@æ(?èì‘+Æ‘>?жì½JšD?ÁãÕOX?Æw( ÔD?„ºZøÀ?ì*wÑíË?ï2ÑkiôZ?è0Švnx?ÚÓ°þñ7v?ï¥z“,Ô?âP/’ôu¨?‡†ü?Ó¬%˜ÐÞž?âæ¥Þ§x‡?ê4htÏ®?ÓEV§XØF?ÄYÝžôØ?Ú×ñçÃȦ?ÝÖä6e~?àMØO4kÐ?æ°!Þ¡† ?î÷YÎlÁþ?ã@Ÿm‹Hœ?ì·(çÀD*?ç_ºé?‰·r¤ÅÀÀ?ÈF«¬1¬ü?ä,ʬë`?¿!'UÒ?ÚŒ›n$D?æ>ŸµÄ?àúvñÄOÍ?íàI¦#u?ß¾õïFU ?é•_m6½?䃄ŒpŒ?ï3Ó;Û×?êS¸õS”"?³ncC; ?Ú˜ŒȽF?ØÁUwhcB?ä6·WqÏ??ÔËL±î?áïD HÁf?áRÑ;4 ?ãe{Îû~?ï$—GdÐ_?éýZ剗±?åÜ•†LRÆ?Ð\SѬH?ØÄqy7o&?â«0Näô9?ײ†?¯™@s|R?Ǽ£!Ø?0wQ-à?ÁÅ?÷VÔ?£#Îàä¡?åç&év¿?Ñ£¦@ã`?í1xivÓq?ÄÂû•–+Ð?×=u¨Sæ?©‘æñqp?Ûöbæ}˜˜?ĪãüL¯¨—ì?Ñò”Õäõ?ضf唄?eÅBñ:Ã?ß‹[,B¨?ç0Уšag?âSš…oaË?Ï~Ç\ ?ЄjÖ¨©X?ß8{et¾¾?ªíÄø°?ÍéfÖ8´T?êt—¼€<È?ÊÊßçÍ?áÐh¾ƒ³—?ççN ß5 ?çm ÉæÇ?§Êw‰ü½ ?É}ÕÞÇT?ë™kh…:–?¯S%NvÁ ?Ô½àÊÇ6?Þñ,¶ü?Ì"ªÀ¢|l?¸¤‡V?ª0?Ü–`ÓÔˆÖ?ÐÝÕ;¹x?´[&È÷p?ë¶®z9O?äš@©W}?Ô°F­(p?æ~%WíÀ[?à˜zºpf?ÉPV\„ÈÐ?ÀŒú¦Þï¨?æJ”þÝ?ÙQT±¯=d?áv¶©-Í?â"Uhcê?èé†÷GrÏ?븙BÖ?âr±0õ¬Š?è(Ùto?àµt°é"8?å7!¢Ÿ?îP¨º.ñ¿?ëí¨GŠê#?é1!Wu¼¨?È%mØ@T?´?·þj¨?Þ pÛ,:d?âaxÜêð?äjë„­ y?í;Rhmãƒ?îãê¸gŸÝ?è‰õºš)?ìB"g0rÀ?ïø¥}ñ¾?î­$(þÆÌ?ìxÕ“U~º?äüûQr¡÷?à”}¯ã?âyì?ÒÁÃÄýÊ?«M~?Ã?áºsÔ8?ÛÓ5<$a?å]-º‘†H?çôK‹Û9£?á9M: »þ?ÈÊÖ´/l?Á(k)é|?ëáa–}?ÑË딉Df?è ?¡çÈ?ÉnÙ_oØà?î‹Ùд›+?Ùfw :0?åMFľ?›;p» €?Η¾« ,?ë.EФ “?ÓsrÝB@?çôM…$?à4<³8-?ÍÁ#~àÚd?ÑÖ.jÚ³V?⨃)»‹W?Ø4Á¸ ½L?ëûžq£¤?Ī$7‘´?ÊÇFä?ìÒßð@k¼?É:¦ç³”?Ì ih¨?ÈÈ6p>T?èÛgDjvd?Ðq|ÜFØ?Ý‘ÖÀ´Ó¨?§@:üÐ?è õ?é„aEë?íéòdæ=?á’ðP¶™Ú?àcŸ³‹ö?Á1ÁÐõ"(?Ã!ZðFt?ßKjñJæä?ìýOûYkI?Õó)R¾ˆž?íZ…^!þ?]½à?â+ºZHÍ?êÈ/,&3?Ö§ã±Ìr4?Ú·¼¬ç´?ìy‰·ê(û?Íñë±Æ‘”?ë§/2VIã?æbޤ©™??³SµPsà?ïrxj¬{?ïoèYÿ?âºM8K)®?Ò©lès¹˜?èv´e¾?Ë«,ÿ'Æœ?æ‹õ•ËJg?åIÖ`%^?êÈØt*?¶h w%!˜?ëR½bêý?âÓÉ+·?íLM6R?ÑéÖÎþfÞ?¹#­„ù³`?âž-x¢?â7#r|*¹?ÚxYÍ£–?êm<£ï̦?ìèG³·é?ç‚Ú ”?Í9½•aäü?èî?+Æäª?«\5”T?èÐuËW¦6?숚ç?ÔÐG&µ²ö?âyQº¹s“?ê hþ!Á˜?Âï/-öä(?æÐ~‹+ZÎ?Åt¾4äå?ÝFI Û2?×ß7iz$?ì›3ßè6?ÆØ<”gñ?ͺΠ®Ì?«Óf`^Fà?éµešB—J?å=þrž—?âšYµ$5œ?ê´9™vÍ?ïô‘«/š5?çN&|ª| ?îªôÞ¦á?ç:tôŽ›?Þ= Ñyû–ñ ?Ò «¯ø¶?ÝŒáÔºõæ?ï”ïAÎ?â8³–ó`í?Ó9‚¿”ñœ?í çÂ`áv?ض‹<ƒ2?äÊ“5¢¨g?ÔcºG÷F¬?Ûˆ½óZ&¼?ïƒûÓgµ?¥së Û¥à?ç€9u§à?ÙO‡ís¬Ô?ß à¬sDî?½À©5£˜?™mÁWU(à?§mwld ð?בq|Jô?r%Ã1(á?æVü$Ýl4?Õç]„?醉Öå­?ãFÅÏñ_?¢Ö츕@?Û.l†å­ˆ?Ö€°Ç’&,?QCö!¨Œ?çîhÑé?ê¢Õ: ö?çZ™?z%? }ñ¦nx?⋼-å?äfG×§Á?ã âD1ä?.¾|¹?ä+ôÆí‰ƒ?ç¿?ÛDé?æ«é8‘ú`?éP“³¤2ú?íÐÕœó¢?ìŠ\ãtÎM?åÄY5ápä?çúcË!ÞÛ?ع‹Îçt?εUÈâÒ¸?×DqÕF‚?è%:çà+?è—”÷W?È„è‹Y`?爢%&º?©,·Õõ-`?íñ–D?ê‰fµ±Š±?é Ò¨$‰?à¹,Rî\?èÏp8šÃ?ºúCä%øÈ?Îi*ªÁqx?çÂtÖá?è~#VÖ8?ÁTE§ld?áÛ ,%¢?Æxï7‰¯t?æ =©´1»?ä-ðñ¶?ÆàNu)0D?êÖ·”;~¢?àäOĉ•£?Ó°´žÇÒò?äóãÃ\‹?Ý,Tð?ÅIwNq«¸?édIC†Q‰?æ^øtb…t?é]gTÎaÛ?Æá™“p\?å¶^C8GÖ?ÛSŽùB¶È?ÜÓp|9X?ÔMA…Í~?ç˜ÁÑÙ·?í¾“!ydž?ï1Ȳ /b?íPŽH‹?á…Þ´½Âû?íѺ.w–?Ôm® †)Ú?åy œ4u?Ú§Áù.Ì?åú„M{ð?ã)R”\Á?àZhW·?ÜAž†Ö\?êö—õë8?ê<ůA*e?é²°Çu^p?µm,{* p?æ?·ûþÁà?°©ÇÁ˜?ê™0S3Êy?éW¶Ä< ?ìª š/X?ͼ÷ÒñX?±7 ywžÐ?ì/:‹Æâ›?Ödp"3T?ÑÇfÇ,?ͨõ×\?ÏÆåç›\?×»Õîè@?î=ÙýªSv?ßf.Á‡‹H?Êào÷ªøX?æÓ©•ª?êTjw»°‚?íÊ_3Îë?îØ>• ?ßäñBAx¾?¸å™Ñvh ?×zåè?Öà-QD6?Æø{¢2Lt?™¼W×à?›û';Ú ?ÆSéªBÌ?à‚í˜H´Æ?ånƒšfwí?ØìŠù¼;:?߮ݤn¼?î=êÓ-Lú?è0Ôrõ‰?ÜB'Ö’?±·€.X?è§M‘íÐ?ê?’½ý7¥?áªÚŽâõÎ?ìÔLhÆ?»è½^·mà?ëÒëU|Š?íŸlÕ=}?טˆx4ùê?çA ‡ðŠ@?ÀH:|œ ?½ÜYÒÜh?èj B¼‹ž?Õn뜵ÜX?ä!Ü\¼}z?á‘‚<ÑS@?`glË«?Ê”[d.¸?QOÐ?ÇÏ«éÅå?Ô£·ñ¬·â?~±äG`o€?í•G3vË?ï” T}7?çÕ^FŽîK?ì†JŸRô ?ê 8.µÚÐ?¸ÞrõÌÄP?åÁåãßÖ”?Ñ'ɹš?Í-vá¨Ð?ç—ïÝÓ„Õ?ÚR“!IÌ?áúÑóR?êJã¶÷?çÝÚ xBr?ä™!¥>Q–?¦³@ –ð?Ú°J¸M—>?ßÚwÎÝ?—Sê¤ ¢@?ÈÌHSH•¤?¿ØT,¨?åà½6ͪ?ê>êÌ‹*€?Âj”³å‚ä?ãs,ù£Ëµ?æ¤[ÍJM?â-Åþ½ˆi?ãyKNì?ëíº·?áÍZ+>UÚ?ÄjrWÁ~Ä?‚¶É‰@?Ûç¦ÿ©)z?Ýñ^8xŒ$?×äø ?ÞM“˜p–?Û•¾õWm‚?ÑP|ßå‚?Ðcc%mOb?ÒÅï¶úÒ?å°h¨½å?è î•¿4õ?ØQ@ÍÊ)?¾ŸêEå¬?ØB‡`"Ð?ÎÃøޏ?×hzD?Ù[çPÃíZ?ÜÒÔêluÚ?Ã^XÇø \?à:O|ÀË?ÆKUn½ÞT?åhˆ„?Õ{çÿk^?XkÝwB?×RSÅ ?Ý“Ëkl¨È?Ò#oQòñÜ?âjv‰ ç?ê#£ð/òö?ÄÎ}h¶]d?ïP¯d?Áè’u¯,?ÛûJHLÒ?Õ^ÈMö±æ?—†¢¼Yñà?Þ\áOè×ð?ÞÈé6+_?Û6}ÌŽcv?ÐÙŒExMŒ?ÎxÉ, µ°?Û›Ã*ÑÎ?äp,?è›o?â¹ö͘?²ŸïÈŒè?ÇÌŸ%?ê’µde²?êÛ2µ~%?ïÍ;ª*ò?ïtÃÀÞ:ß?. kÂ?ÕåF˜Áö?â ãm•?íÒŒì4¾?ïŒmUý%Æ?Ę6w©” ?ÓˆÔˆ¯«º?äëh¨ç0?ãµëé„?Ô_ªL?Áîw›Ûªd?äH’ìnPÊ?èËÛ›‡=?¨† A¥®À?ÉüåòÐ?ß´/©Ÿ_Ò?ínE‡J·?êlÅãÖ›¤?À'óEÄEÀ?Á±³Ý ïÀ?êÊyë¯Ê?ï¡ñ2hw?ëš>hù˜?Ñ[mÇCZ?Û"xø«EÐ?Ü‘Lͳót?ïåP3–Ëý?ÃÈ€°³˜ˆ?íж~á‰2?×kä ŒÖ?"Ê»?äNû<‡z¢?ßÔkY ;?ÑýJ Ðz?îâîYéº?Ë,¾ßv\€?Ñ^­¤:?¼´_‹›ÿˆ?Ã*ùÖžà?ëŽÚAËX?ëùüw0TÃ?ãHòö*NÑ?ä³z|§‹¾?ïNsÈA+?ê®±Nx…Ö?äú[O$ >?×ÝšîÒ˜¦?Ï_×?í/!*mI¯?Äe6;Ù47ä?ßg+ †N?áP¨È¼?Ì2ìpzÏT?娓7(è?ÃÔ“|Ø#Cp?îí“æe?£i9,Ò@0?éÕŒúª?ÐßÏØ®giÎ?ßÄ’UaÂ?âE“3?áI—ß?îD´pö¦?êß4 ŒeR?§“Œû˜ï?ׯøü€?Rå’Є?‡Ø‰[áâ@?Ý74(ß ?àm3û^?â^‘A{Nˆ?Û½¬e<Â?ìÀsy"5¶?îë63ˆŽ?Û€£´Þœ?ä„2 ®“?¶¿.T~ÿ8?ÚüÎc4 ?º;ú ñ ?× þ,ñ¤j?ÛÕ”Þt-®?ãàÔØËÔ?ØS•Ekƒ ?ãÆ ž†£?Ü¿q=z?ëÚNDå?êPÓ6ëµ?á5ÛûX«}?Ñ/û¦1ôd?èyÏÜÎWR?åµ.¥Âò?Š ^€?çöÖ§uÎ ?´‹Te"™à?î±aêb?å!žF¦µó?âbâ¨zª¦?í˜ϧñ¯?áRdTfi?çFÍ6¬s?ß·†7‘ø?äš³â£ò?ÞQ“n>Ú?áäxƒºmþ?å*øë‘!äL?æ \®?æµMP<œ´?ØÇTÖ‡ ?ÞÓò ÍT?Ýìj^+?ʵú×°?áL‰­FR?p.W|¶¾€?ê‚KuT?ç6d.¹|2?¾¶·MNé ?ß4«•Ì”?í9‡kÕ4ô?Ñ4[m¦Z4?ï^Wǰãš?âØxœR¹?ª ÷¥.à?èçV >¿?å|GLw˜?Ü(d«)™@?ïn/Kp¬Œ?Ö,çp_$?àÅ`ÓÒVè?¤Eh,õ¤P?æ’Û\+R?ét5æÍ|ë?äÈè§ÑŸ?ããåñzìª?Å&;-yE?Â%k< k°?ä60s9u(?áÕ—¸ê¸?指'¿?â&ylÓü6?à÷Äb†?ê€ðððŸ?È-¹U6¬?Ë_{¹r|?ÈçPšØqÐ?äÍzZ²¼¨?èd:­!Žk?À3Hh„¼?­[Bä%?ÙjņV?ã¹» <_€?ïÒî.9?è虒ż?áeiʧ½0?ïV(…?Ë[?¼ŠÏ2X?¶ŽîÇz'?í×÷¡Œ‹?î~{ÐýPH?ãZEG'c>?Î,]½Ãä?è?ÆZxo?£iâÜ×É?à9ãK­¤?Þu¬Ûåø?ëÂtžŽ‚?ÀRÓrÇœØ?Òt o8-¶?Õ쵊„ŠÊ?êýTÄøû?Õ. +eüê?°¶\TÓØ?ÏŽU.*(?ç Å1'?ÏŠÄä¤?Ñqq³åèÒ?ÉßgòÄ0?ïwßBˆÑ?ˉqëœ?àî ¢êÝÓ?å:F¤q?îæmÛ´?Ì«HM&¯H?±ê­B> ø?ëR’þ?h ÈgçB?ÞNÏKCÆ?àN—vy5Õ?îÞVÆÝúv?ÙF ƒ.?æŒz¦Ñ^?y¨6ÿ$8€?ØèŠÙ2–?é_ ßØ?àÂÒåÃ÷À?ãlÀݤtÄ?êA¤´?Öä>ñµB?ËïôÈŒŒ?îõø[Ú?êçWŒøÝ°?îó7¨Ú:R?ìÛi5´ù$?èú!èžR„?è˜J2O?ëy‹+ÖT?âý[!ÁÁ?ÁÅú1X?çý}G«[??æ)§² ?ݶ!öÀ×î?ç*ëüæ’?ÜIú…sÐZ?æ“Öž‚?î•Sx~ø?²ºálh?ÛèEjt–Þ?Þ›]`º=”?î@€9Ï J?æ¾â>wE·?³AvU½šÐ?âò÷Uî?°c§_ö_P?Ø'ü>óJê?ä òcY:ç?ÙöþWŽüZ?âý¦ÿ’‘—?æ1]&åñZ?íŠÔFÔ?éý]¬Ê'?ê§ÂÙm /?À³š‚!³À?Öµ2ø‡_Ö?åÀGŠ…}?Ì*Á¯S ?íIt+Ý?£›Œ z?—¿|‚u{À?ç/©9nû?é§1NéX?é<ÿÝK&ã?ëª7=èÂ?ì'ÏgÑ3?å¤Èöä‚?á8r$dåî?Ö÷+g·’Â?¾â2I0?Ö¿)—dø?ìáŸHŒ4?†ý ö.§@?è Tá?á}ûåÛÌD?ï’ëý–Â?¬A±¼/J?¨Ý$Ÿ¡?î×_bN¦?ØÅ|?…‹2?ÑÞºKæ?Ûâ¶lr=ì?Ô¦=g—&?Ý”ª(P?Ø\/DÁ?áЭ<!?Ø_¿•óÊ&?Ö3ì¹.´?×v-A^?«ò¾ü ?ÛnÊ®k?Ê?¼Ú£9ípX?ÛßòÇíØh?০[îÍ ?ÆbÆ1Û|€?ß.šW­ýj? ?Ü=k¤?Ó-Ö¸,›F?Ù]Êz?Ù.!šK4?ÚàLðvà ?í á þt(?Ùú8 §4¬?ª%]€?ã"Xb½è?¹Gt‰û&€?ítiøv6P?ã6VÊemƒ?Òk¯Pä¢?ŦÊçÏL?Å¥åÆñи?Ð7 ²T•Î?Ä*na(?í+´†Xp?åR_À…æ?å½aWó0ö?éw}BÜM·?䏨2â‘?¦8ü9`ð?ä J·ï¾?±üŸ¦F?è“ü ð?ªj>ý%§p?ÝÒj´›Û|?ʬ£2-°?Ù6®Ãب?ä+ãÀ®4?åÖÕ„{?Σó\Ù…¨?¸ŸF+«£ˆ?ÙÃlâÎ?à—¶´€ø?äCÂm´?ǧ™u˜?×Ôø4P†?ÊDj×ü?Ú©AÏ}°?î±ü[{$?Îâõ@?×kÜî6?Ó±õ è ?ïaA< À?ïyäϤ©A?ái_<§?ì,(4Þ©'?À›ú'tw|?N銂÷€?Ôä$:?°#À=Ì?ìèМ?†ÛŠ0…@?áѽ ¾»Ü?· 4è#ð?©‡Ö0?åö#bâáø?ë×7 Fœ{?Ú(Y«cžð?Þf/øê-2?Ò…Ø£K*?çz½¼ŠÌ™?Ú/*|Œ?Ö•w”Þ¤:?êå_•<Ú?½^Óà:P?ÁÊä×ð—Ø?ä¬,‚‹þ‹?Çoƒ“Vt?É4ÿ.aeè?ÕOÁ¤“Ø?笭¿¸™Í?ÒȦн—ì?×ä]"V?Þ ©…¶å?í4§!¿¥Ï?ã5–ú1È?ÝË‹‘ü¸?ì…Äëjƒß?ì Et:?Ú!(½º—¶?ê íÁ(?(?çØ/<¡LÄ?È Z ¸?ç ¤Á8?äû›Øìw¬?ì†I`r?ã+&¶Ý…k?±@£P\`?Ú¬˜W¸‹X?ÝÑé„PÖ?è7²ƒâ•?•\Ó«—S?îÛß/À4?ãU’RPÉ“?é[:ðö\i?ÖêÔñoY?ë‰ÉºI.¨?éTOå í˜?ái ¿ê™ ?à¿ùàƒ ?àôqûñª?îl_}|›?¢Ìµ¹l\€?ÓÊ:\÷â?áìAŠ¢Ñ?›mÕZaM ?ì×,e’×?îf³”4!?ŽÊÅ#R@?Ôà0+Œð?à»Ú‘Œ?ëЦCàº/?åL/#éR&?Þ3hf´¿*?알°u?æžµ€™„‡?ßCÕ¹#k¢?Ã/.nYß°?µü1 ¤K˜?ÑÉáÁ_·ü?æ³ Ñb#x?Ú"Ó+ß™n?è %ÏÌ?ÒÉ]þ¡Ô?à~a.ô7Ì?ꮦLìç?å3àÜëž?ÇÉÌô°?Ê‚¨NSõ ?ã8g¥í?ë?âëá†Ñ9Ö?Ú˜¬;HŒ?¹Éá¼RÑ`?Ý£Š¦µ $?H ˜›ø?ï^ƒq4ÊI?äýÐß]?ØûïÒª€–?Æ“;¤T9 ?í Pzˆå?Ñ2h3 ?Û©æ°¾°?Ót¬†D?ãÂÚâ[Hõ?ÇÛY8Y€Ì?š%¹Ø`?áßyKÎÐ?ÖÍÈË ?ÓDGì–€?è-µÈƒX€?Óð»Ï±Ãø?Äö1j¯cx?Öœÿ:ËZB?ÙÙÛŽÈ8?胢”Ò–v?äWþJäüÑ?®?m5ñ@?°E·âAðÐ?âb,ÎG?i?¸ ÐežÏˆ?í‘¿Ù}é?ê(‰¢ ?ën¨Gó¦Ó?Ü((MÆ€?Њ¾ìðÚ ?ãcÎÅ–C?è ×Ú›Á?ΈœHPa?­E¾Cr§À?à0ɾ~‹?ËtØ "ö|?ÝÀ¬­.6z?ãbeyBª·?ì8 ¦?²ÿ¶°û¨?æ†%õS²Ä?ëù%ÛzÎ?ï¿ÊÓqÐo?Ð )hX^?êŒqppö?â‡ÿ*sKd?Øõö íÊ?£,Û³-C€?á#à‡*«N?Ý:¬|úN?Òî!Qe£0?ïà ׂÕK?Ù=Î1Í?Æ=akç?îŸÆQgr?å|;†‰½œ?末©—¦²?êeΑ®n?ÚD&aªD?ãmXÂ5x?æ Cγ ?ßàFþ¡Àv?ÎÅ "Sp?è «ŒñO°?ëîóáž<±?Æ-ÊSƒ“T?ÔHéf¢à?܈a@ZX?ïg éñÍÿ?Ûc¶ž#¹Æ?ÐNÏĈä?Ò ÞYä˜?Ó4ê÷´?ÒrïX"X?æ”õ™¶¦?á?v2‚ _?ëÄ2´›Rœ?ÉÌË.-D?·ý· dÀ?Á;i¯’è?Ø@ZA8hv?ïDÈþÿŸ ?Á¥Q°ç|?ªé¼£¯ð?ÑDý³Š¶?î â%¯^?æø­ä?ÍwyÁ`,?©iË·í³@?í@jŽIK?îYþJ•Î?ÝdX´Ç$ä?ì¦ ‘²^ ?Þ¦H«CèT?ÞÔ€7&8?âm´cÉáR?Óñ²sS€j?Ëü)¤¨?oñHU–?¾ÊF"‚?ëò{¤Š3?è ;´žÞ?à…¢’àZ?Ô½[Í¢ ?å•Þvö‘?äì9v ú+?Oø@gv@?Ó™4NÖ?ç-†ÔØŠÚ?äØN,¨?çdìùç:´?¼Ÿ]DqXè?Ð@Ä$¬á?à9ê‰4&?ÎÍcü8?ÓãC—‡*?æl챈Ñ?Þ(0ûÁ¼?½:k[ò(?Ũ·–3„?­H7R`?£Sh‹&Z€? Pž•‚0?ÞÿDf2ˆ?Ëœ¶â§Œ?çPñ¨É†Å?èØ‡¨Kú€?à&ä˜F?å eá H?ä±Sñw8U?Ó€L´3¶?Æm¡Lx¬?Âÿ°Œø?Ú˜aÉÒ?í#yêtÉ?ÙïZ+¤?ár¨Œu‚?ÌþÖÜü`?©“¯3ºÕ ?â*ƒÀãŠ?Ñš¦Û?àµì’z?êz“ÛÂj?ßZÇÚ —¼?á¥á¶&ãÁ?Ýí.ŸÈv?­.áÚ/ž?àúÇ×z3Í?ÛNÐÅ^Ï"?àð’Ë;@¤?çy©0…\?ÇÿÜ©:x?ßE!:xB6?Øœ©†O?Öžt |°?ÈÚùnÇæÜ?²$f™.è?ëZË „M?Ô'+>cD?éËÀñ±r[?êcÌ7°Ç?îØÂ\bS?ç^œ}H‡p?åzþè8¤Í?êSV‚±ð?à7)tà?Ó1Ù[›Õ^?鉯Öý?äúÝ×?蜇OQ?ØõS¬ ?æ‰Ú„û'4?Ùrµ6j?Ⱦ¹´ô@?å€n›ÙÓ¥?Ñ&A«Jw\?×·XRûèl?ì\¯Ðí®¹?êëù¦Üûž?ìk…°- ?̃åhS9ð?ÒÎZOÎÔ?Úxºz5P?à=øØÂä?î]£¸ÑW?íÞ|4äñê?Ù ªÍGeX?åöx;¬L?çÄ`ýY‰j?ØœBïnAœ?îÜŠuu©?é2`BkÞ?ìm[t\èú?Ü{Ž&@Ü”?ÅŒTûð;À?¹›áse»(?ÚzQ>ácH?v¨cÃM‡€?ç„jeav?ÝÈÎ]›Ë?΄`Ðujì?šÈƒ8–ÚÀ?ÄYã  áx?ꣴ>)Ù?âr=ï-­w?é,ò5#Ž?ÛœsŠÎ+Ú?æÒŸ§õ´?áÃ/Õ“¬Q?æE}õC‚?ÖÙ†ïY?¥ÇPå§a?ÍJñ)h?Ö’*Ë Çn?Ú¼°Fàâê?ê£:(n«?í$Y„¬|;?ɹBð~è?§ Pú­?íîxš ?ļ¸!S´?¾¹ÚÀå!?ž±¥É®À?à(juÇ ?î?*!õ½Ü?àÚàù±%?ïé9ttC9?Á0¿‚=?Ð?ÏKÅ(Ø8?ìœfÓ<Ø?áòU¯´¨ ?à"‰ Ò?Õæ{»Ëï²?ì‰ÖÙÊÿ?îI¿ØÛl?×ó´Ká?Ú ÎÃÝÂ?î\CŒ¾âõ?¾R¦Ù×̨?âšõ“zMA?§öã÷ø™€?êËŽà­.?Ú5?)UÂ?²ß“1è?êl%¤hÏ?éð>þ¤ š?ÐwN{,Çx?§˜Xád€ ?ë¼Ì†n?î§°úó†?ãg z°×?ê%ª"ÄKõ?â Ï鉦a?©X}Àm?ïg2#­¸?Þ•+¾Np?ÜLé“@ª?ëJœºš%¢?ãRšCÑ-?Ð I@•|N?ïíw§ê)&?î‚×|0¼?å<%u#{¦?îºb¯~=?Ó5~[Õç¨?Ф»_.?¤PÒ ¼a@?ȯN]ã°?Öìª8/È?×>Ž©¶w†?êª öž=:?_E+¶,?ÚÍr2•~?ëDž ö‰?äVŠøøÄ?Åná^„œ?è•Ï ±?ç&DW›g•?îÉíþÌ?ÜÓ—j®ú?æv ¢Ð21?Êjn^˜È?äò ]S?鉭"@q?§$J 8<ð?î®$O§¯?äÊÍûŒÜt?â~ÔD]bf?á÷"àJÿó?æwÇÙаá?Ûõ×…C™Ê?àÆb$ÁßÏ?ÙVwäu–?ê5dñýc?æ¼Ôœ4?ѯóû'"?Ç oÈÎl?ï *óß?Û›ÇLn?îÔÙ_kþ`?áÐb ?ç£R'šª?ÁIFiìø?»Ë³÷äzè?å‹*C‘ ?áu^È$¼‡?’9ªenÀ?ᢄšÿ¦E?å>Ÿ7\ºF?ÏQV%ì?ÖÀëo~к?¼æøêU30?í¼Ð;OŸé?ãߢ‡¸1?æ~èp%[à?Ø–ÑylLÂ?ã§’iVÔ?ÃGeôá¸?è² $›Û?ÙùÍ`lzœ?ïMð|âöb?îp¦åã?ÜÁ×Ñ…Š?Úâ1™ÁZ?ê78½—?î¡-›5œé?ìQŠÌûcˆ?ãP:^Øð>?åäÖÿ Àq?íAS¯+ø¼?Ëþ’—„?âÇKË„Ï?Öí.òAøt?Înœ‡VÔ?ÄÀ¨óÌ?ÌÑË ¿Ä?Ú“EpÆ?Ó_~™dA¬?ØÌ‚NÆ?èîÿD"š?äR2w`‰?ç«”é8E?çtÀd§¡?嬥aŸÕè?ß\xúºè?ÕAVgW+Ø?éÈhdˆZ?êœÌ™S?ê T:,G?ÖÅ¡?ì˜IÍy™B?Ìz£„\n?ätæ!NXÈ?¼W(ÄX?àü2BiP?Ýô}É Ü|?´! â?Óœ¬º¤?èà÷;¬tœ?é~$¼iœ?Îëëê˜ñè?Ñ@é¼HB?¶ÂœèC8?áxÐ{[R‡?á:=L?Û<û®~¨?å„ZX"È?oL¯O›ñ?åfAñý2£?ã_¿©|ûÏ?Ú€äT Æ?è©_æ, o?é¡GöÓ¦?ëƒf@Æyõ?ãÞR}(2?ßÑðFÁ‰è?Ù›–Q³;Z?â§²r?îI”A àÈ?å’;¬÷?ã¹v| §q?ì“‹ÎÛ™±?H`Z?ÕÈúÎØŠ?æÒ³hº¹2?³+>í?Ò¹ö|?Þ±# û¦?é$)©àØw?íÀžoÔYg?ØÅ·HçN?Ô3Ï­¡T?äÃÂG?Ô:4#Ä?Ê-N=Û©?æ°inkþP?È '©Ol?Ó@gôñ¤?ÕsqëÆ_ˆ?ŒÈø‡!€?§ –n£@?àF=? üb?ëEiFÄÇ?Ø=¡‹Á”?Ó×I¶P"J?Ñ‚´Ôþœ?ÐÖøG;€?œ?!øë¯`?š÷¤9Ý ?Ö-Ð¥¬x?²lÌØf@?èZ’ñ^û\?ŸÑœf•-à?àÐdK“L?í: $h“?éXf?Õ‹  ]$?ÙŸì§×ÒÔ?é㪼;'?Óá<ÒŒŒ?æ}ò!#ñ?ïÄ+êÎüS?ìæ¿! Ÿ±?ßaí-r–¼?íZØ<¦w?ËT‹ß¢0?Á¹„ò2MH?ä*¨HËb?îø¦ezí?Ú”cæÀõZ?ÑUè„)jt?é5*ùåâ¹?×uí9~ÃT?Ðí`E÷ÊÖ?Ñâ1%ææ?ÜYȃ,?Ñ`ÜûTçî?ÆÅsP¸¥?ßc9ÇM~f?ìµàüVÒ?Õ¦g:´ÛØ?îº/E&n?ãHybü_Ñ?Ôe~ ”7?ׂßI\…Ø?ìs¬m?Ë{±‡@Ð?ã§›u?ákRJYm?رÑϹh?êÇöØqî?ìúÉÔ!Éc?çÇõËÞ?É çð¾ˆ?ç’«Â?ì(%•NÆu?Õ€‡â-H?éyM9àkÓ?ä;­UfØ{?ç… U+è?ºŽpk¹ð?º—Ð"slP?îjœ) Ü?Úó½c–Ô?ÕrM)(È?+òòãà?ÀœÆ³àÒT?°«j‘\Ø?å§G2ZW¬?´h%o'Ž˜?ëqû‚ÇXö?ßt: K*?ág¿z#:u?Ôë]çN9€?Û¶íþèc?äš¹€'?Ý_ÛP·ìZ?ç2¢¥'?ßî0á%dR?ã)÷î/7?îG¶7›xÐ?¹ jQ£·ø?ÒßÕ-Vö?è¨÷Ú¬I­?çðãAñ¬§?ïrmÝ>9?ì†àí{F?âç8›x ?å­bdÉi?볇ž[®?àö÷j 3?¥x\`tð?è›|áD œ?ä‹“Nÿc’?Ó/*:¢€?ìu †-Ð?í5É{÷,?ëY}Pÿh?éW}‹?´Í–W0c€?ÙiJÈ^Z?ÞYcÔcZæ?ÙcЦâ!@?ËÑ•œ@q0?ëi˜‘³/+?ÐVc­?ëE÷ ¥ñ^?éö'£Ø)B?èž5`ÀTô?ë=+5 ?á$Û;¤§?\hkÌ>Ö?î‘M°É™?æNÀ`?¹*>^™`?Ø„?w×R?è3ò«ë~?²6èó80?ï}<Ûð¡?Ö:ù*ë{r?ï[&…h(¿?å.ê%˜?Ù­Þìv?éú¥¦rÊ?çTQ)õ” ?à(pÑ ?äÿò‰¥ò?Ù\R€ú±r?³’µ·¦+?ê‘?è²Òâ ?æôCÂó?áqQœ¯'?ÀµèFf§Ø?Ð-UD ?¬àØ C¦€?®qòu†º`?è+.¸,’? Ãó1³ð?ÙÍø±Ç>?è½L‰.â?ì„ÖÐĶ®?ÎÝNÉ¥ž¸?é2*Tô³?å}TCþ¬?Þ³ñp&?»Ã,/óÈ?똤9aç/?戟¸ÎSo?Þö]-:>.?Îý‘ü‡ø¸?ç”e\œ?¿B­—È?ÒSFSI?Õ-ðÑãØ?×ät[„?»Twêê» ?äòI޹÷?âw¯›:?½†ø#øÃØ?çó ÑиÞ?Ò³ó#Ò?Òdv;f“^?ÐVRÔ@?é=;bœU]?Öœf^Ø?îG„é|Q?äŽ1/ N?ÒØmô÷„?×éo#Ž¿j?æI¡ÛÑ?Áã^k¬?Ù=j„w¤&?á,¥¾ùÖå?Á>.)±p?ç»'Ûo+œ?ã=¢èÈ?Ó ÇÐÿ`?æs A¤?àKy7ÃßÊ?Üí<{| ?åâî›#°?Ôå‹!†B?äÚ«ïv6T?§²T>ß`?ĸë) ×,?ËFÏéˆP?åPfRl£?èH–Tv?ÌjµÐWì?±Ã©<# ø?¯Pð.†AÐ?çA:!ÉRI?Ì`°HÀe¬?Ô¦ÖNš?íÉëK÷žß?㵪þ»k?ÒÔ´úë,?ÐßÃëjú?ãTãë x?Ê¢ùé‚/Þ×@?Ûá´Æ¬?ÐŒÕã:?ß ËKÒ‰`?éÿ[<-Ã?èã6¤$h§?æ¾Ï_þi?´ªD°òÔø?è‡îö–ëÑ?äºæ¯Û..?ê…€ _xd?ÕËØeÌ ?´ÅáJßv¨?Ítófû]x?åÝ8%þyÏ?תr‰}xà?ß®»"A?Ϩ•aîQ€?ÂwmÔ§?× <¤46$?Üêõ*ïÆ?Ðý ,Ê?Õv/G\…ˆ?äßse³ ç?æ`ßÖ xE?Ùdn´vB?ÖÀ¦ÑWö>?ÕýÄ>™ Ê?Þ/ ?­¼,?ã(ÿž¹tÑ?ÃNX"Š™à?ËÑö$}c ?å£úJ.Q?âÈŠ|Û›?×Ä2FÄ?ßóUïM~0?à4èŽäç?ÆãX®ä?P?ިЋÂG?ÓO‡¥(?Ðç;vg?á´Û—¯"?èdFM%&¢?â …^†6‡?ßÒ¢]"?܉þè{M?ès‰`{â?¶m¦PTž`?äÛsð–î>?Ó_J‹-iâ?âádÇÁë?Â1ñ¨€?ÈŒp‡ÿ5(?íH—P¢ˆ?Õ°/Áž9ú?ÚdÚ?ïD?¬x‚­y€?Ê`QȤ?ÈÁÙÚÔ8?àqÞt@¿?È6ù}E0?¬¼hM-—p?Ï34k•ð‹?íézXЬ—?äs9„¬‡?½oPëõU¨?íØB#Ü`^?Çæ…|?àœ šŠ'”?î´TX#$?ÓJ ž´?ÓTMâÎ?äÿÜ¿¯tà?Ü[íÍÚXø?×]´”?ÈR?Yâç ?ל/ø\V?·Ó|v p?³¹c—ÿIˆ?íŸøˆjøŠ?ì´,CBì? ý*ü‘{ ?ê;Ø]úÎ×?ë2Ì@PT?ËSl*¢c ?îÖÂe˜N? €^ÏêS`?Õ¯þ¯ÒŽ?춉ŸÅøk?ç0 jÐhè?ÕŠÜæq¨è?ïx+œ¯?ì#3ñxár?åýíhvV?ئ°?»"ü¦¯H?ç *îuàÐ?Öê™ ²v2?íeíȸL?»Õü¯ò£¨?âL+Ì3—ù?âsû˜[Ú?íLMœ­•?êWØÍ$2?Ö[GXü?ÝÙH5ñÑæ?Ëymþ4?ìa΄ÒoU?Ú´"‡Ýà?É‘ƒ:© ?ÍáK´ú¶¸?ÔùwUXñ*?êXG¶ýv?æîpBIC¬?áÿ¸¹…’?ëGýür?È„‰x‘ìÔ?å{m˜MÞÈ?¸4E=ñ?É0ƒCê¼?âlúa_ÕÛ?é× ×ÛE?ïäMÈoüû?¸1zBø?îêƒ:‹ÿW?©•,¥\š ?ìN¿}8–?ÖýÆ^OË"?áÀáIⶨ?ÙIØuz?ÑBËoÚxJ?Í5ž[eþ ?Úë™$æ°?æWGÞ5Z?¶b}¸`?æÂ‘PZ ?ÂË.ÕÀ?á·¦ô?ïÆyAñ¨×?áD±±ôGÀ?ç(kµ•f”?à—Žö¼ ˜?ìh¤ñ:ó ?§˜Ã?à¾üþ¶N?Û¦Íòºœ?Ý/4“„æ?×\Å'ú?ÏK&ÃØX?ºÉ.͈?Ýž†ô‹_ ?ØÌ>cä$è?Ìô9;}œ?äA3AØé?î#?˜Ä?Õ.¿ýâ3ª?âmºj·?³®ì÷„»Ð?î*9Ä?Ù/+ùü?à;yMÇJ?ÚØ… N½Z?Á#ü{ÿ¥0?ÚÔµ¡ F?Ä0¥„l$?ËCçdˆ ?à¿ZiÏ?Þ_˜ª<à¸?à‹~šj?Òç¼ÒÀ?îÄæ"žhU?äðœâ„‘v?ë½ÃÿÜ?Óõ®U0•ª?’Âeq°`?ÀSÏ࿞œ?ê'l@àÜä?éM%çUi½?étä DÏ?Ó{ Ô?èÆ?ñï¦ð?ÕänÉ;N?í¤µy«"?ÔæØm”?¸ZBË. ?丱Ai?褙Xÿ?ä_6SôV?Å ºÓÿïH?Ût{#Î?Á,ÛÅ/´?æ4êÇN¤?‹I?ªª¯2?³”áŸq!P?íñмU?Ç3ÞËç;ð?Ì•|1Î@À?ˈ “°÷$?î£.Lišù?åù?Ò€#ÆPÒJ?ÙÄAhô«Ø?Ȉ…\Ãp?ß›³áPºˆ?ëo¯“‹?èþ"-Á1?áÈ ;-k½?æïV*õ˜?¸1~c¯?áGŸHå ‹?ËWótMH?í )_/5n?äí…-…Q?ææú„àØ?íß”wÈ‹¤?êÀ£c’ˆ4?ÖM”ñÑØ\?å›0RU?ÉYßÌýÈ?é7Ym Àž?Û7ˆ¨·?ä|ˆnu½?ãÞôµ0?Ûý0Š'͸?åüÒ8âÂ?ÓL¢±év>?ë}â#6?íÃkòBòm?ÌÝ9Zé,Œ?ÛðÔ @x?î_óP5?ê4cHò¸?借´³v?áPµÅ6õ?å†Éû~?çúØ1;Ë?íœ=¸ûµ?çâR¹î?è«'î¼?Ûƒ‚‘Gp?ÞN¡7\4?î bõUàÉ?­Á¬å¥°?ã A%K?í€[ÅdÿÈ?Š/ß,\?îøP8?ä-¨ê6?Ô`]'öF4?ìœúqû–µ?ÑuI¿îZ?Ô¶9C,ò?Ûþ™Ç@º?0Û?êXz0ò[?›ñ B~@?Ùy¡^£?êcV¶Kw¬?ãÀí‹o³á?µ£¡Eë¨?œž`cg€?®Ÿ“úXJÐ?îfÐ%XèÙ?ÑÒž¸Pp?­_œÞÐ?à“>õc?å%ì8]Ý?°è8í?Ψ&e|4?Û˜6“íØZ?ã¤LJošÉ?íH³æ'?î´Ñ"hþ??¶Çë¸J°?º‘5^Í ?ÔÕU×Ê`?éi^Éà?¿¾*cµ«˜?Áªöc—¸?á&’Æx?ã•`àøl?ëÃVtÒÙô?ØѾüÞ(?ÛW¹¢*Ú?äRãzyHd?Ö)ŸC`¶˜?ï¡ÊOª?Çr3m¹£`?ÒœÊÓ„?Ô7P·áÚ?éÞâ–3“?Ä2Ž¿¬t?é„m¯ ±\?Æêz»Qy ?åHŒœêX?Ó1-æt.¬?Ë2ÂÓú/ì?à,‰µ?æ?î-Ý0u°?àV(¨¬¤?½g ý§w€?Ïšð"¶?¹¯=‘8E°?Ø„U϶î?áXPC»Ð?ì^!fõ¢ß?ÓéÞ+$›Ü?ÖI ”»l¦?Å=r,B„ô? qsÙ?ëžÞk¢?ì´a£1Œ?åô£³?è!ˆVÅýC?á°µH§?ê÷)ňï©?ë½`óÍ?ç«¢ñÞÔ?ÄCAÇ©È?ãåé4¿ÒÌ?¹_U´T°?çþý¿®m\?Á;D¿?©4?×_v,?çØ/Ü^ÇÜ?å-—õïÙò?éM{Í϶"?Ø­¡<³Ÿ°?í&íÕŸU?³3YG }`?íÔ'[aÏ›?¦"h»;-€?µÍ̲¡r˜?Ì>õÐn±Ð?芡 âZ?ÛÇïWŽ?ÅâÂÖë|?Ú#8!Í6æ?ºb\7àÈ?Óz½¸ª¨?íØ­g)×ï?×RÈÜ£Ö?ã žµÙ?Ûx€€¢g ?Ëhš× ?Ñ2©Œ?½åDÜdÐ?Ø’a@zÓ„?ؼ··VíÜ?º¹O¯ïßx?®¶±"U`?äkíVÅjÊ?âTá|nÑ?ëØÔÒt²?·Ã/9@€Ð?ÝaGªò@¢?É”×e/¢¨?è§rçÁ?ç–g³ÛÑ?æþ:‚!ì?Ì®ÝiÅp?ëÈ2gAÇ?á‹á;•»?ë§¼åí‰$?Û·ÔªœÞ?ÔoèK ¸?ÒŸÖŸü„?ì«LÄi?ÅâÆUP¼(?êœemŸK}?×`<ñ?£F¹« ‹À?àŠè|¯Ýd?ÔQfƺ:?ì?œ¼’Ð?wØd\W€?¾W‡ªâX?à¨~3-ë?]°xº0?áþï'rñ?׋%ê÷å?㬹–E¥?½e½¥Ù'8?¦ÿÍTð¹À?ßÁÊrñ#˜?ëUðæ$¿?êe„Á×?Üê–ÇÌ&?ßš}x|$?åXˆä:?ÓµÞ1( X?zÍ#’Ò?Ó³©›D?ሌ< Ùû?èž6ã0’?ÓBž£"µb?ÞÎ ÖsJ?ÂÊ™)a0?©QÃCÐ’`?Îp°2P§4?æÓ¨`?ïÝ’P6u^?³…6½ ¸?à€U‚ž©?ïÛÝ.—å‚?åj÷ìáž?å4iÁ“?ßã¥yR:&?Ïáö›£¤?Ï<ý—ÛF?× F­€wÖ?ç½\Vf§?Ó™—ˆV£F?ÛÄ cÈ@Ð?ì”Lõ2¤?ä¿Â>?鳊n—qG?ì4//XD°?ïT…ÈK2?‡ä<Ä€?ãÁQwäLù?àX‡p3½ã?ç§§5´?áÛßTYGq?ãv) ʶó?ÇèPBr(?îåç?…â?Óä3Θì?î3þ¥Ù?àÓQì ?á¥ÑoK0§?µS°9qH°?è ê]Âè?ç"Ó;ûBz?Ûq ëR¿\?íÃÅ?Œ?á>oÅSjã?ÔÞ„$·%?¡ð ¼1ð?ìzò© ?Ù[ç€%R?Þä OÄÜ?ÝÕüšÌà’?ß Ú?3ê?ä‘1õoá?Ìx& ÃÜ?ç‚ßÌÎ?â¿6~Ý‹h?Þ©¥Ð«X?á?ï®™ö±?è:%¥0Y?êò£×nX?Éò!³¿x?戕U¡q?ï9„Ò£s?á`üjno?ÑvÊœÅ^>?ãƒVס?Âõ!ŸÖ?ÎÓ=¿ÿ|?Î}BMŠ4h?æE¯îSc?ꆻæn&Ñ?×Ræ,n©Ž?êÓ&Þ™ ?ÝoÛ¿#N(?à|¥ŸT!?ítïuIÅV?à’>Ó{b7?á:ë”ò^g?ÑŒ)\…ž?åÆÉ±‰*©?çÐ=)[è?Åø$œ"0?än¦î÷?´‹ÁþLа?ì©<>7q¼?ÉÔY¥E×zÐá?ßüÌìF>?âÎ\ÄW?ïä/‡ë}‰?Üî•l£ùÌ?ëšÏGHã?èßÀöE¶^?ã¼v%ý¶?×ï0½ƒ˜Öb|?°ù‚ÿ?çNqVPƒ?xÄlÇR?äaäP?µáDð h?í¸ŠÞÜÃ?éI®5è—?×6ñyUL?»ja¢[ˆ?çе(+›ú?éÎè ìŒB?ꎛ´ódG?䊻[húš?Öd“Q²?ê ÙhØÐ?̯,€K"?îé†{‡)Ü?èôÙêÇÞ?Ú£8B1˜î?Ý–°lU¯?͸†w „?ërÐ1œ?šÓ[è`Š`?ãSrOKÉ?Ø·õɰ¤L?ä5,…)ZÕ?ڶæ¶LV?Ý!)–ÊT?ë?¨ˆLç¯?’^ AÒ@?»›(uñ?ä5;óme?âú.FÆ«Ê?ÝŒ ¡ïŒ?Ùò…i@¨?ä¨g¸óL©?ìx×sªÉ¦?×ñ€Tu;â?Ž$D "@?Êå©4€ð?Æ@Ù|\†L?ãM&ø'ïŠ?ï &äÍa?Únæ½9h?ÐE¾ŸÞ6?ëzeUF#S?à8ŒRd«a?éÂþYrÏo?ÓU•%´?îÎò%KÊ?æ%3¥Þq?ësKàî?É?Ú ÍÐb?ì hdðn´?áV«ÞW—?ŧÎ=Ѹ?ÑÖŒ?ì=úIhc?• Ä55€?ç¤?ïݶ?âH$î«\.?Ü­QÄ"¶?ã»DöÈ^?ç—  Æu ?í(ëÛQçµ?Ò¼”¡Ð?î¦ß¾”Á?Ôá±ëùª$?Ѫ¡î?ˆZ™sFÓ?霘•oºñ?±—õ7wÃà?Ô³^KÆ?”™=,S ?a»ê ¨Ï?æù<³B- ?ÜbFŠ[›?ÖÙ;|&Ù?Öùþ–¶?í5­¾‚é¸?ÄD?6=›˜?ÃÌO×”?Û¼J$3ON?é/ÑR¶O·?z½“azb?æú`ÇÌ?æ Š?åÎÐ[HÃÛ?Àú±×}Yh?ß“­Ÿ$?Ðr¯„^žð?瀗|?æxy´©…"?ã Ã2?èƒfMkgü?ïíÇ vÍM?å–`pp1?ãZüm…?i`Ÿi•?Ùt H6?×½‚̉L?â?¶"4†K?íݼÔD',?Ü'ÜŠ·8n?¹:„R×x?åÚK=¯<ê?ÓsLž9?èJÿÄ…¡˜?³èëxIdÈ?å'm*9€?â´ÙCÓª?ê¾Ö~û,?ìÈ'?¨?îwï ÓŸ?×8Í^§ê4?ç%Ýø?éz§×ü¸"?ÛUˆrn›˜?åϯæ ƒ?È#›‰ÍH?åí¿$45©?Áç&ANØ?é; º©›?Í·¬J?áòg$ “m?ã~6È_?éSwEÜc?Ϭf ¸t?ÀGÜ6Œ˜?Òè¯~a˜?å=O§u:®?ìVx÷í?î¦t^oüå?ï'Єé¼?¡ûW¦n@?îéƒ+ÖM?˜s²Kˆ'?ïàq›(<,?ìøÌ»ä?‡¹¦€ëÀ?Ÿå9ª½¨`?ê?‰Ù?Ówö&áªÂ?§ÅDgýü?°~¥»OÐ?ÒàÒS>Œš?ãðÿO}[Ê?ë àÛîJ.?æÅNZI©‘?â™lp?å"Nyö…?ܪ’o«VÂ?êoù¸y†?ØYÀn?Å ‘Ð ?ái"Â?Ñ©¡Õ jÄ?µÙ;}h?Ô‡O¢ x˜?Õ$íQhÞ?ݰ±ü±ÈŠ?âT¿ô^ Ö?íS{’Õ?íŠ4Qñ%A?Òäã«2ý\?µ5>ÿç˜?Ö¹¾å§?éÂ>2?Æ£ÈClX?ÖØiDøB?Çß´CY0Ø?ãÍg|Ó?²CŽ|¨?ï1wtK?ê2&úJ.ý?ïºÁü}€×?ÅáR-Ò‘¼?î¾géf?ä?µÑÃü?¼ÄæúCùh?à’p¢Š®2?σlÚu9 ?çQÅZÚ¤?¢ÃËÛ : ?±ŒßV`?îžBSì^?·Ù®í?µ`F=:ë¸?Î-Eý´6Ü?ÝÙ :?*?çs½\•©Œ?áãG¹is?êq·N?ï?æ„?äÝ}í^1?˳û'?)8?¾{Pøi?ÜsÞÔ-+ü?5=ޝ?Ä/ôT•Ü?bøõ“?ìðÚZ÷U?ævz‰!-?³3“–H€?äW;òKIm?í´Â?%LM?ï&GR:?Þ'uïï°"?Ûמi2?Ò!‰n¿ì?âV›$zl“?´©; ??·à:" ¶ ?çä«N k?žŸ‰·óÀ?ëPjO£T?Ø­°¾-ˆ,?àv†ÇÐX?Ïðá€,ò?í®2V»?Ñâ•9æe?èP‹X}5?äôq¬½¶s?ÇÅè¬?¾»&w ?ÕTÁ ¥r?Æ2¸û‚Ô?§ñà§ ?æç$=wÛ?щaT¸?ʨI³ãä?ÝŪçð>Ê?Ù"w1˼(?åÖ*‘¯R?Ö…‰xwÖ?æ#|Úpò¾?éY-W.¥l?ãþ¦‚4©‹?î)"m~ê?콦.$‘Þ?ÝH‚]?âüí ¡{ ?ßzô¼øæ?éd?äqgR?²5$*r?ê`@UŸ¨?Æ)žs\?ïbLjæ®?æÿÃD"?²›ÈŠ+[h?ãøä,ùÔ? å-†R?p?ë¶\¶‚\?вzë ‰Þ?¾Ô\)I ¨?Úêæbn?׺âËáä?âc™ì¶î4?ÌÂÙé]œ?æAã»M?à€Ñ¢$ù?ÑVsbÄÆ’?²ª~Ë_Ø?ÍOùƒ(Šì?âqºM…G?´y2Žž9˜?à„”Í­T?é©÷}¿î?âÊÑK¨Mº?Ô˜ ‡¦¢?㊛…Þ ?¼>xÎW6X?áȨ†TøÜ?ÓD& Q̆?Ë®G_! ?Ü-xjô®?Új4”±}À?ÝÓ¨1-”?å‚·kÄž?Ź`~h?í`ªï°…2?áÆõÞš?æO¯[>ô?ÁTúH€ð\?îÿÔýHí8?ªˆ³U@?êi`Ë“r?é¦c€c·+?Ïäì Û‰°?íGè*ÓêI?ê ý·‚?Ë3o穱P?ÔŠºåuÌÄ?ì N‘°ä?²ÛR¤aîˆ?ã¸5!Øa?Ó“’®w6€?êΤ:¾ƒ·?Çòf£L@?¶¶(þªìè?àK¥Rˆfú?Ð;€U"Â?Òè îÚ?ï¦F•Õ82?æ.ÇRæ§ ?ÛØÃ(ü%Z?רäŠül?íÔgŒBo?×6vƒË‡‚?ÅU•»Žä?Á“Í÷ja€?œô›6À?Ó&?œPvê?ïï`½²¢?ÔN×›SŠ?®>ö¾?ã¯àÁa#r?ã ž$øG?²Š¡B‡ýˆ?Á:v õ?Õz<þeZ”?Í±ßæ”L?ékkÆn;?ãî`ÌèO¨?è?õºAž?Þ¶tÿ/3–?á·¤{YBÑ?´Çüí¼(?ëÆ"ÉR?Ó£g»åm¸?ï‹ Z{?¶¦‘bµÔ?í{MÚs5?朘†ƒ ?Ò舒Â?Ù;aÓ4?äd_ÎGbU?ì çÑ›É?àÖò.qòÕ?ĄԻ:ž?ì‰Õ:ð°?轨 (òJ?Ç<@tÔ‰P?ÖÍð©}i’?àŰާ4R?â{ÀRb”?ÞÙ u;³°?ìª6­e¾?âøqÕöQh?êçƒÂi…,?çˈ»œ ?ÆÝ!£B¶¤?ân~Ž~2?çÞ±sQ±?Åx/ö¸Ü?…äoŽáì€?Ô£g,[Â?Æ‚L|ö´?Ü­üI0µN?á§f<αx?›@~Ù @?ây:_PË÷?Ó3ò¤žúÊ?á-»ƒ­?á î„Ó?éÕÓtY=º?ëC½ªrŒ?çÜÜlšIS?£dÃî?êú}ÛdÀ7?ÁÀÅQà˜D?±ü_÷¤ÒÈ?Ü®ûSˆŠ?éXC2…=?–És€?Ã7ʃ”Ïð?ÅOQ¼Ñô?⣽ë€%ñ?ësØrç?åÀ™RCË?ʃ¡(ªD?âyGp?ê²: Ó£þ?Á*ØîØ­d?ìùq³s»?©ã¥d_kp?ãFÔÞÌj?Ò·£¾ÂÏ?§ÓõÊkš ?êGß@¬À?ä½V?÷é?š]n%Ƶ€?ܼ\8v‚þ?âÏË? Qé?¥ÛJ„Ê_ ?ëo½fÁv?çŒP›CcË?æ<êcÓ2?Ñi&$©¦?×ÒkÆ‹x?áó\rJ î?é¸à×`¿×?å HFsúz?à6sx’ 1?ÕF <?ÝË?.h?Ôþ¬õ…ð?á~Ôs]‡?êDÜÓÈ b?åwXÐg?Úíj‹£v?ÚZ 1JX?èÒ’<ï -?Þõ>¨8?Ï¢œ[Äì?íGpû§ßš?ÜsÓMBÐ?ã-ªOÜ?âbÃëð’…?åxâ^‚?ÐGEåö?Ùz%ýØ?É ÷eÈl?áAtü(Œ¯?ÒÖ†0Þ‡Z?Ú#¿U¨ €?¥|éú?¼ýªõ\Û(?ï–Ö™@,?Æ_BXVP?ìãœRwñ˜?îÚáµcf?éÛËéÙÕº?Æ"‡×ˆGP?èà·o1à ?í;)²*0?çµðÕ”R?ç²Òc~?àÝGœX{§?âÀ}Ý­·?¥vÂ1]?è’‹¦çöÕ?ÇV&­€ÂÔ?ï?g‘êüø?í¯b´ýZ?ês¢QËrÁ?Åj®Ú~$L?åü¼’ë?çcV¹'E?å%D{BDó?ê콋ÖO?±ŠÌ–{ÓÐ?à èþÊ5t?ÀœèJæ—0?ë:Xãsæ6?ÍÔXèêî°?—ð}Ž@?ÖnYy!÷ ?î=´]/¥?ãpÔë”?Ð=S¾®€Ð?â½, J)?ìê‰>V?ÜOås“q(?ÆÚ2˼á€?ì\K˜½‹Ç?™9G] ?î”Gœˆ?Â#+•5p?äC|Õ=?ɱ”ý?ìVL™eö9?ï3x”¯?ï;IÙ36¾?ß'Ûqþ9Ò?ÓZ;€J¼?ì鯔՗Ã?ì²X…µQ?£S‘¹GÀ?ã NmA?ÎxBˆH?æs;Ÿ«hk?á‡ü#XN?ïr.ú‚72?ï;H ̆w?Ùw…ÃWè ?çTn`‡(?ãLy•m?¿Î-Ö@ è?ê"âÝÓ?æ"T<ýk?ë TòR?âàJE–)?¤›‹À?àxÙÇL¨?儽gŠ 2?Ùë;¹²˜?Íã3?L?çb ºIs?ä¶p·t?à*±4²Í9?èl—‚l’7?Ý/žÙ„È?âÊ"BMÿì?ëÈé¨L5?Ì©mÕ~np?ê7 µ«Ç?àÀg3Þ¥ã?éV9ÚD~k?¶º«I€ÉÐ?ØR²9†©?ß÷}~š{P?ÏëgUúä?ê†Ý×íà?ì€ö%S?ä±ßþW”3?éè ‡ï?çy¼ø@??â»R{?Ä^ÐÂb¬?à-¡‘Çãã?±”ÿV£?É9êmIì?ìô³…ÙB.?è¦=ƒ Þ?á–NR|?ËÀŸ°:ô?Ñ4Š“Üz?Ü–Î÷õR?Êð÷}ß‚4?ÙE‘uÞˆ?àiklj_„?â¿›!•®„?ÐÙ`å…n®?åT¬§ðšÌ?Þ"Ö’Ǧ?á—Ú­^M0?â}5þ˜j ?ª ÞÔ?âÜ(66d?ÑúÒ<ØN?á·ÐxÉŸ?áv™²]>…?Ä=œÍ ø?Ü®ñC¡7?í7Í'(Â?êã8`ìD?îÀÁù}ò?Õñ)ÈÆb ?¾ôuf¯Ð?âöT;¹C?ºSæ…£-X?¬XÝõÞÐ?êO3ZC“±?ÀbDU~ø?ì¶¡Lø”?ãôùª•ÚÏ?åÔÜÛÄ!£?é™°ý.z?Õѳöé,?»å~[ø¯?æð§R–L·?Òv…6f¦?è#^¤ÝÁ2?®'(Åþà ?À̆”?çÇ(éž2»?è‘dö2­?Û)ä6à ?íÆ&û6…¦?ä…Ç¥¥V?å®»®ýø+?ÜP»S?ÛÏŸ"ºýp?´¢º6_¨?ã'Û&’a,?ìDÑóŽ\p?Ñ#þ˜½LÒ?è<¾1@?ß 1A/:?ïÃÙ¸º?ÆU‘îLVô?ÉüŠùv&Ô?êJÚÔHß?Ü)Ô(?çe$²\B@?â­Ø»ü?愺ácy?æ+öè¸ ?àL_§™&?âzñ_(Ì»?ª‹û6dN`?æP~÷1û?à„½æU7p?ÝV¡’ôà?é—:Ç+gP?ßè¦Nº}¾?Ô«-;ü[Æ?æHô5(¹?Õaìçb¼?äc¸ïéºÙ?ꜛæs¼?½o–Ô?¹Oóbèõx?긗ý ¹?í¾i5V?ѽ2:õî?êD7OãC?Ü\õgd?ÏÁ±*À?æo@íÕ¹?ÊûE6Þz|?ëþHÔûð?ã'ÐGt?Ú¯•4¤¾?à^ ŸÊ?–йtKà?ÏiH¿h P?ä ÛÛ¹mh?älfÝm†?ŸŽ<›À?ì[€™{Â?ë„­@xi?å;Ñ °u?éQO–ßÊ¿?Ñ` ú^?â'hLP©l?ãÆ»ÍT‚q?Î5ò.N¨?ÑÙ§ª›¿Ì?åÔ­Öëå¹?íÆË²×•l?äBsy ú/?¢¾{ÞJÐ?×\úU@?ç8~|N{?é/cÔÿs?×6çx/Q?ä õ 68?èb–¥?ÔχcÁâ?ØSÆœc|˜?¹5”.˜P?ëÎívøŒ·?ègiÕ¾ö?Î×Í KÏ?äûaœv?ÒTŠݲ?à¾'õ|B?înÜ-ç?âm-ì%é³?ÉÒØ/`h?è4í9Ð?ä­ÃB‡?à™n¬M^û?ïN‚K¸?Ýccììs ?×Áñ„d÷?í[°mH¢#?îr$ÝÉA°?ÆÓçq±d?å£ýÑŒ^n?ºõêg¯ˆ?²ro}H0?ÄQ†*dd?Ñâÿ‰tÜR?êÓuGé´ž?œ]‹1!ÛÀ?àµ.ÆY?â’)Ž­Ü®?첆 ,?ìÊ0tüß?ço¾lä?¹3“»Ïè?¢,eM ?êd©²Ì0ô?ÛÇŽ÷Ú?Àï_-W`H?Þ²¾ z»”?åÿƒLQ`Þ?ÜŠèLa;Ä?ÖröÌ-Þ?ïÜ;¯ƒ ä?ÑÑð3 óv?‰ Ir´³À?ê*ÕÌ=vƒ?ߕѴëÁ‚?êr^ø 8?´2µ¢rAð?å\‘Dty¹?ãåV×c?\¾Ú˜±Þ?Â?ßbßg" ?ãbUÖ ¦?ÃCò‚ލ?éÑùš)Ò?Ûìcî2’?Ò1rï3 R?Ô””±%r?³=q±xÝ ?ÕÄ8xà7¼?Û6›¤Ø4?ߎ@%ß2"?ÚÑGo?íÅÿuy" ?à\ *Ä?Ù™;[• ?ã«Ë{ûÕ?ËÍæ+º2Ä?Å«—êx?æ\wYé?ì',Ú@ù¹?èed/ò?ä4qs¸$?䎈TX?ÛS`è>?ÀvR.°¼?í»ÂÎ!À?ìÜ•\ÏY°?ä5»^Y‡6?è]øí¼¡Û?—1Ëh†X?ìæÞ.‹E+?wkL®Ñ‡?™ z.V €?É×ÿð#?èx‚9ï?Á ÌMÜÿ(?ÙÑRÉR?Ð:Xp"¨?â=ò}aÂ?á'dí ?æ¤übÂ:`?Ρ0©]û¬?à+ ‹$ù?²ò$¯=Ý?ÐŒÁ0r?æÂnnL>?ګ̤8Ÿ?ß󽿮îš?ìÌ(€“&?ìdÄå¿¥Ñ?¾%ÆŽíÛ ?ÏÜçÍwG4?Þ©è=µKŽ?ìÐwK"J?Ùžh^“(>?ãîÐt ›º?¼Dï#àP?Ú¬áû˜?Æ¢>c@?ã5jƒ©šæ?í%µ¬ki?ÉUN*í˜t?Ú¬_Qþ?Þú U-?꯿}7EŠ?âÒÄ—íö?Ì;sÌ_0?â"6Ù×>?ÝYô?•° ?×°2kUlf?å½ô6.??ÃÓ'd-þœ?éf&Š‹BÔ?ï'Q+×v?êv NÛ?Ðt¿=¤´?6Ý&ì†?àðye¬À?èõc<{>h?Ý…ê¾IL?ë«øÂ³[¤?€ˆ¨Nê?¹R-ÎRà?ɈÃä,¤?£$gD =Ð?Ô†'pP½è?êJФ ?ï*íÿ#Ǽ?èø‡Çïà”?ëú­Hò/™?ÀžÉá]D?îìzL§=ë?ÚìqãùWR?îSÃÎä"Š?Ò•\{‰*ú?Ò½Qá5±¤?ÅFÐø?Ï™‰Äšø?îãÇwåÁ¦?ÒÀµ{yø?Üž©Àù¯?éÖŒ²ƒX?ÞËçâ ?æ½8é_»?×#J靈È?ŽØ-Q g€?Í®OkÚŒ?Éë.?ð?Ü^¨ŠE.ø?Ê€¿:nô?â("ÿ°ü?æœÍ ?Î?ºäÐàÓ¸?…í‡$™À?³›D*ïŠÈ?ï‚4S‹B?׺>Ì}B‚?×<¾_?¤?ß·µ]Ø?㎯Ä}´??߃ƒÆÀãª?á.}D¤?ä¸V—á ?ÅhÔÒ?îÒzîÉ2?º®ÿUø?Ý¥àéÎ|D?©/Göh`?àã?k?è3FâÀp?ïÀ›ë»?íþ"À*Yl?ê1!¢éôä?Á‹Á:çO?ØÆßvžŽ?ÔÁ×ß-Eà?±âËs3Çh?ÛÏ-²W¤?ç=϶±v?µ~èS‚H?¤á¿àÐ?Í+U·Ø?Á™/‚&Y?ᄞ0þ?Þ'n¨`‚?Î>Øu?¼?ßä¥81º?íì²lA _?Á‡@â³É¼?Ô-ÿÍ•¯P?à¥çBIX?ïߌçPah?¨:®ZœÜp?ßeÌ=¦èœ?ä4l<µç?æavMÔ?ÆXûZŸä?ÛUP‰¹Y*?ÁUZs“K?èköÅã|š?äà =›9?Ôœz—àQ|?¯`˜Ú%p?àvÎíSéq?Ðcª[“|f?Ì7mJ뇘?à ]yê$?ߪ<õø>@?Øäö·³é°?éÄÓÄà Å?ëª2Ë&‰ú?ÌwK¤Ÿ¬?îìgíÛ/É?Èû›¶…¬?éx­ ˜M?›¶˜Ä|»À?Òë1¾Ñæ?æ£ÿ‚–ô?¶JQ‰p?ß4¡W ¸?êSÁ* –3?îl¤˜–ì?åN„4ÆÀÞ?ßîæS]'Ò?Ð<–$8œ?Ë6Ô=Ï:T?è7oAqàÝ?ëbõ–H?Óí­ÚÈÈf?é•0`ÞÄv?Ëì Ì¤ý?ä3]1+·?îT±’½?Ù9ïn®SL?çÇWgˆ?áÖ®Ã?ßÞVz0i6?¯˜dä?rà?ß^žðIíö?ßOÛ­€?éž !¶ðW?•åÂïM£à?éÿ`‘€Þ?åÝ;d~N ?ÅÒaVèp?à0²Ó”è?ãe)—ã²?ÜŽ¸Ýþ²z?ϲÓ‹ï˜?Ëäž§¼ä?Ûã€ú‹]Ž?å$/ÓÁy©?à>ÁVQ_ä?íMWô¦ê?ã «—Ét?ás´$#6?ï®÷J V?ë•5VÆÖû?Ùlôeyh ?ËžãjlŒt?´õi²ï;Ø?Û”ˆDѬ?ç±äŠj.t?ç©H¼]?ÄnaYžœ?àɇ1ŽS¿?‡m±Õ?Öç,Ôi˜Ò?íŠóšÒ³@?í«_ËT‰?⤲¸­?ÀjGʪÔ?ÈÏŸ5…@?ë@åDä–_?Û¼Ñ=¦f?é<£1$ƒ?æ†mù˜??ËT:²¶8?â‡B¾?ÕNܣܰB?áòë›–Š}?ä´>ͦÔ6?áÄ fè2G?׆ԫsÁ|?æl`"Ñó%?à0òEQ?ê38áÎE"?Ò帯¸H?äÃS,\'.?¡¾°ɦÀ?Ò¾o14?æÔ<þ°ñB?±–Q0•Øà?éù?«G°¬?ÁC½‚_A?Ö£R>ˆ®?äa¨æ?èëÅg[=?έ1“ñl?áo.åÛ?Õ7³aB?Òô·¼®®?»¢ì$#?Â-qo(?ä¬Ì¼¬Ó?àmN»Û¡®?½‚›Ý…ù?½[ ›bh?Üöü]ຈ?«[  ì€?Ù©Ÿ ¶êò?Þ€Áªw‰š?æÓ½ê?ìשm«qÖ?Ù ¨ÔOV?àÞå ^?¾¹¯•wð?Ѷ°(zIä?ƒHôÜ?µì%´)6Ø?Òî›B Õ6?Ò.9,Ë^n?»€jª1¸?çsðotS?̸Æç¼ùä?Ð(îÍŒŽþ?æë/‡/¿¡?ÑÔlf·²?éC©žñ‹K?çº;_ɇz?§íÁŸlÐ?б°>—)?Æ \ËÖˆ?ÍÜ“ À›x?댊%F²?à0*«M¥1?éù›o)Ã?à|Wƒ†„Î?â#i.ñ?´yàÖ|H?çÂVûm—X?¼è†À?çÜ >À#+?Ê7♨!È?ë4AÊÙÂ?Ò G#\Gî?ÄÐÝ ‰q”?ÈñÔÔæ-è?í¶|T¹e›?îÁ+°!?änXC£pV?á´µÞNBr?ÕçËÝȸ^?ÎLmµ\ä?ª´† lP?Ó¦ÓUn×0?æD¾éqä+?Á2”x½G ?Þ ›RyÒó°?Ìl«PE?Å=*Üì?ëeÐ cžˆ?ëÍ:›~à?Òøýú/œà?Â<ˆ@\2ì?í¨>K¶Ë?éô€O??îºó³´€U?ß¿öMŒVÐ?å£áÕ:6?¶p7XL‚€?¯×HOã °?ïz÷—ˆí?É'(õ)8¬?ëv* ©tÍ?»tYÊPØ?Ñø_Âw'¶PȬ?ÇWlät‚,?å|NY o?Ü댧2¾?ëˆfi›&?ä"ºtR|?³ö¨aAð?äS”;-ª?á–#ô«5,?ãvlÂÛ¾?èˆ*¶?ívD5}µí?ì!„ç êD?ãÿ\VÛè?Ì*sm˜Ì?ç··Ñ÷?ÔŸÛ‘o…¬?ä°/ô}b?ìk ›‹þ?²‡éù¯‚?ÝÅqGí$®?Ð0óÄåâ?ê4ÿ>$^?Ñò¹#“ú?×X¤âãv?¾ ÒOF€?Â,—¹P ?ÅðÐd?ç©ñPÊÝ?Á‘ôàÝ?ål´¶K»ù?äÃO6pô×?׆ù!#ŒX?àTDºui?ê>÷Bo‡?Ým˜StHœ?í‰Ö§¥>?Ùÿ ,ð|?å£I·;5?ß ø€7Ëð?±"ù1VyÐ?Ï¿y‚Ò\?·‚iMëØ?Ñl2,wÊ?ãÇÅ`oÉ?Ô>öOêP?á—ä‚hÔE?ê²WøÜ?í[ž$À1?ëyûèãE?Ц!ð ?íFÀðçÐ?Ú„PÛðŒ ?å¿MœÙ)…?Êœãú´õ0?×nðWŠ?Ï;fýhÔ|?ê OAùœ?ã>0% I ?çíbᾪ?î~ú€~ ð?Ỿ¦?â S®U’÷?âIôþ?ÁÎ?ÏYÈ?ç‘,Ð×ÂÜ?غiEöeŠ?ë1Êhp?ÃT–›\?èLƒÅ°·#?§8²C_žà?à<>’ïK?è¯ÃðLr ?¾nðÃ?ЈÉ+‰È?î‰CtÒw?ÑTL,:Ö?ã£ßqm½æ?ÖØ†L-+ì?î4š£|“?Z‘;xN?ᣫæŽtYä.?ëgcZÖý»?Ô†ïx¶n?ÄCÅ•AA€?êÈx a×F?à<éžr[w?Ɇ€-å‘H?á¿dýx]?ÍF´ûÊóà?ê °¬ô?â15ÿØXR?à)nÅ}”¹?çà2to*S?ÝdY/U.:?ïþþøO?é-͆{?ÞÊxMÿo¦?Ò³ œ R?Ÿ7!#@ ?Ðò²Z³ŸŽ?ïø…·íð±?égƦM¢Ó?îdP«¤É(?Èìu‹ÌÔ?œJÏÚ/Ô ?æ‰õå¬aé?ÀÙ ¹³ut?ŒblKu5@?ÞÅVÑÉ î?é ôôø,M?Ðuº§ˆÖ?îõ¡ñf½?ïƒ>x“9?× @EFôª?æÆj‰Ey@?é™,er×?ë]!;4òp?ý9L^›è?ï+šÊÉ ?æûÉE\Ÿh?ïøY ¥µ?Ñä—딯R?ØüQBû­²?ïT™†¾ä?ãKÑþ«Ù?§}r¿°?ë'HÕ4@?¯¦Ê|O?×?ï†N]b?çD6 ì~¢?ê:ßЩæÛ?Þ†#U=K´?èèùÆqãê?Ñn€KÁT?éQäD´¤?ç%ýïÇ”¥?°A³†ð(?à_ÎNXÖ4?ºUç)¾Ð?Ù²Ãu?Ú—®mëD?Òé¾jw?îR•‹}?ìKÃ[ÔfP?Û“&PE?á·ˆ?ìØ3“°Å?ಲlO¬Ù?ÌÑá18Ø?× lL?èÓÏ:f‚ˆ?í)³è¢ƒ?írå\n•?Ò WŽcLØ?ÚÂL•篜?ì§>Ái?¥ÃDÁ”€?Ý À–EC¦?ꬣ€'§S?áÂ4*Ö?Ô‡ï¨Þ?á>æèLhÞ?éšhJ‹y?Ìê: å ?âmõDzYB?ßö+_,?Ç1| ›¡ ?ÄA^ô;Ž?×üÛ0öÂ?ÔüCÙ¯²B?圶ÍY©š?ßùïÂ’²’?· ÈêæÂØ?å{Ð3Ζ?ÂòÿÐ ,?êK!ç‚?Ï•é²ö¬?ÚÙ;®8Â4?¦ç°F—Ð?ßeDG°@?§xâÙ–!p?Î)QÄEÐ?ïóPø Œ?ã ÕŽ®e?Ú*‡Þ%&?Ðà|q«®sD?£&O­¬`?Êcäà*Ð?ãœF‚…|7?êoö+‡¢ú?Ð9òM:?ÙRÌ¢˜à?èk§E4QE?Âú‹S©Ø?£cc¢¸>Ð?à>Pt^šè?êýâÒÌM[?àô"‰8Bà?éž3Öò£è?ÌòŽ^ÑìH?Ôd&VÔæ~?Øü>ú2?ßžÝiû\˜?ë*AQ¶ß?¸ÞÃÛɤh?æVæûÔ¤’?ì«A½4 x?ÖL{"2?Óú4Šñ,?ä¿FÄš?çt÷¼ù?èf¥}sG{?î„´ÜoÞ?쾆֑×Ð?ãbïfµ½?è°Áq¹l…?âŹ{!¹’?è™…!]Ã?Ñp•{+ý˜?âex1*?å5¹-?î?áO"@?‰?å0¸î«í?³5Ê]!°?¸á]lq;€?ÈÔwÜ ¨?ïÛ¾tqÙÜ?Ùã[ãJæ?à‚PÐÆ?ÔQºž§¾?ÛØÙ_.qx?≴ˆAa­?áðž%ùì?”Âáë’ü€?çbBVñB?ïÜFç{Z?æß–$ë–%?©¥ÌÉ«þp?ä¸úp b?Ú ‡PÜ©L?ívoA‹Þ÷?í_c¦}IÄ?¨!j d9à?Á€´t´(?âsC9£ª ?æ,Å—o´+?›•v⿃?îÊÄáüh?å€y€§´?¤¾ý­À?ìþÅQs:g?Â#dß´1ð?ív1C*ž˜?í ìûãÿ?ãk9ågÂ?èb/+}ô”?árLgí&ä?áÞS@Çü?²…9æ°?î6¼þ÷p?Ðvú÷‚€²?ìªcÃ,[?éÅ™&V‹?å¥ìW¼W?Æs8 l,?å“ǾÜ!?ïE(Å5B?Úöô­‘‘>?ãBÌgxeí?àk:qÆÁ?í~VOÏ?íÐd"ÿœ¹?Æq¡+›0?ëòœ¡¯SÝ?‘BÆp@À?å—œA$á?àIPñêE?擮чÑÖ?Õ…ó\®?äÖ•Z»ËK?Ð_Üz ®?ç`ò¸7 µ?ÆÓ[½q„?âÚí1ƒÂå?ïSÌ/Öé?<Ï¿ S(?ì¢'WXº½?á.¸Yصª?Øêr´ä?ä‰B½Â?â>pÞ\?驚¢ª?Õcëò` ®?Ò_ÊYñjì?Ò«¿œzõ,?ÆTƒ¥s (?¹ã›Ä ÙX?± 'až8?ÖM,ï?`?ãÞsÇ5?ê ®ß6Ä?å2rT?æ%^d=å?ë— f¬]?™ÒˆÅy ?믖yò?á 28ц?Æâ1@Â4?äÚaaGú?èDæS?õ|?à‘,éýMÖ?á ÚÕÅܤ?ëÏdðA>?çœöû§?áÕSñʺR?´°(Ä•`?Ä*‡ìåÎà?åÕÓ2`޹?ì¯Z”ü„ø?Ö‡2Q?޲†sS?èµ)5ÞZá?ê 0”†Yì?ªë}ê¶M0?à=äƒ#g?è„ÄQP?ÏÃ6Ýc´?Ïǯ]c?ÆÂg†£°?°D/ä 68?Ñ…‹ñP?¥V®´•Ð?æ»=¹¾dº?ë¨ç§•í\?Ô$¾ÆÇ÷8?ÚáöT:¦?ç.åÖcÉ?Ù=·›Í 6?âšjSçø?ìš$saê„?ÁÒ£¢x?ÚcgèH (?æ@5 ¢=S?ÝåLÅVZ?eA³º°?²)û?ßFè?ÛƒÚ!‚ì?ä£k²¿Y?ÖèŽK,úž?æ[ÙR%?á¿‚½º"?ËÅÕ{ßd?ÔÀ‰˜ôG:?Åà5c¢ÊD?ÏZ‹ì¤ø?Òר0I?Š3>>Ö˜?ß 5 oB?ÞCŒ!9‹|?î#ÝOÐÅo?ܵÊj ?ÏóÞÊäi$?á)´,P?Љ<5'l,?åéDrî[Æ?Ш_¬ý‚?¢±ÄÌ€?ßÝ;}måô?Ý`? ´.?×JZµyYT?ã?¼†a?뀋uÐ?ÝâHƒ•} ?áüCǯÂ?è7•XÏ 9? 7%Ô©kp?î¶i¾lXß?Õ˜ôânâ?¡§Zí® ?ËÜYÎaØ?á¡KŒ©M?ÁÑ~‘œÑ?Ùû5Áˆ?Ð~¶4ä¿b?àä"l؉?Õé â[J?©LhtûÙ ?²;¿dš,(?× ûä+Õd?ÞÈZ]?Õº`\ÚVŒ?ÎEÄA?Ììñk²?É"T&#ñ?á²¾ík‰?¥m5ÀÊØ€?Í"v¼ŸbÄ?ÛioO,Ï?ÐP®é\öÂ?ãºþ¶ì‡?íöäl·9?Ût'ËØ?Û?1*—·Ì?é#m]þ°D?µÄÛ{að?ÞpØfŸø?íÁø‡I§}?á–‡*ˆ× ?ávuË 2³?ãy­7ó?ÛYd±!•ì?ÌgÛ\¹´?Ét‚ùOh?ãkÀŠb”?·ýQ`(?Ð~´(l,?ÐØ †vêÌ?¼J©ÕÏë?Ö°KWn?¾Ë ¥öØ?¹bá1?çàç'eã?¾«ea6ø?âíº…]í?ãl~Žvò‚?ç‘i >äÚ?íÈd.Õ?—lù]ò¦`?éˆLXo/?áÔ¤ÊÚ›?èß2´_M?î/ý`ø/U?æŠsÿ)B:?ç!É:5*?Î4Ll<}Œ?ÊYÖìÁò˜?ç5Yü&6?í¹DÆòÚË?ßωúˆòR?ígÚˆ4³?à?âVú˜?ëÓ™/:>?ânúè39V?ã"WòlÛñ?ì¢çºG?Ðbƒø— ?Å•ŒBb¬Ô?í$kIêþ ?ã^æÈÝe?²&ï%-?Îü.É1L?è£áÂ?µT’öX?ìÐHÙŸÏÊ?ï‚9¬3ÇŸ?ˇ¶{°{°?ìÍ•°‘á‡?ÕºeŽÊþ–?æÌðŠ¢¤?â˜9¶()e?äéå…š?º›0 ¡(?éœE0ÞC ?é£^…Ÿ?ân£zríg?ì³µw$ò?å]±Pü×/?Ó{³qî?½o­âÛ!h?*ŸEÀ?á‘.?æ6i‘ Kp?ÑšEn~â?íb¬ã9f’?ìÛÀ,L|?ÆÔɰ?æ0Ã’ÄÖµ?Ê£J…5V€?îpºêÂ;?íw…¾{ÿ?ëÜ£E@¯þ?¼ò˜?à?ä ÃlQû?ßú¶Ü+Æ?Ó£m’!y*?ÛìÂ~z^?äeŒàÈÙ¥?Ü á|)Þ¢?Ù ;ÈawÈ?é$ñ?S6U?骤l~¿?äAyœ©=v?è¡rÌ¡¦e?éÿêZ?ßÓrÑv?¹ÖB“w\`?Õ7~Û~Zê?Ü Ì9æB?Ü«ÓÚ<÷@?ëO‹ÅF+œ?ëúçµÓÀ?ï0áëšÆú?ÍÝ}Kä”?âîÕIVþ?ÛLXb&:?çŒ÷f©ËÐ?ØFúï?Ç.Çð?ìx?ïäù ¡cg?Óx$é}:î?ì¡…Ú8}ì?ãm'ä3-©?ãZï ?î—¦¾E?é?ÔÕD#í?â†ùmÁÅú?äÄ[D`Ê?ì0?˜S¹Ë?ß¡Þqo1n?±Õh @?åëF;*Î?çBT˜rÕ ?µm^zÑ?Ñ4èö„â?Ôœ €ž?Þ‹I`6‰„?ácá?”[J?Ôm¥38b?µW¾xWð?Ò Ro®À?ëUÂR?Ô`ÄòÖÜ8?ê½£Uˆw?ÎXï|M\?ÊwÓ§ŒØ€?ÙO¤7¥Ž´?éí‰ªÈ ?é u¹º˜?µøÚ+ÓH?ÚjÛY™åÔ?ï¶Ô;®?Ð Å2C,?Ð \ƒHFN?éû7,'?š&ÀíÀª?ÂY$µz=?Ø™L‡ß¨ö?â¾ðy8Â?äOö\Xñ?áStHÍK?ïfÃéü?ç`¤Ôãå?ï‡ÇÜiÞw?è/õ"ÛÉ?æ'ŸÛÏà?âŸÕ~–°…?ƃ„šÚð?Ñ0ØÔ–?Ó2E€"?×’ýƺö?ÐŒcÿ|„ú?¦ Å=zp?µâ©¬¡Ùx?¶á_éøH?äž#ÞU?±§øé¸ºˆ?í·Ë®ßŒ?â” õšU?¾Û~‡¯à?ëa𠌳e?Ùõ}5ïïÈ?æ`_“ô?¾~O^º¨€?ÞÁ¹Þl°?¤`E% ép?×ëwÌѸ?ÊK»®x @?ê±Û¬‡š˜?âqÚÿ Áƒ?ÚÊ eø?«Àwåö¬?ßCºjŒ˜?è'kQÕo?ªj+÷Kà?§xJoùð?îX†oÛÑ?ã2[-KŽ?ßÂ3½ÈAö?Íp>P˜?Þ„~Ñl?»Y¥#âH?á=)õO¬?µÕJVí?Éj£”ìT?߯ª1J'v?ÕÍ“¤8?å .–?ÊPŠ%¤Ñt?Äo¾¤Í5?ÙÅrE|Çä?çÔÿQƒ?ëOÈã(ÌX?í4Ð;ˆ,?äˆöÑ#ÿ?ҳņ@ø?ÒxQ°óZ`?Àôev<¼?Äó#oÓ”?ÃE…>Ÿ ?±¨ù¥)?Ïkýu.è?ÐI8Ñàr?ä<‰šqÄi?Þ­]èæ?ìï¿ló†?Çàˆ?ÀØËñF¤?ßíù}fþ?åʺ5gxD?߬ˆZ`È?æ`µ‹Ã?ï+!E¯?ä•Àèm1?âAÈ€ŒX?×HËÄ?ËœQÁa`?Ðg=qè?ÃR¦nï~L?ã#Jò&~õ?å ÑÍ'Å?éZ®QcØ?ä‡ÝN+c?î¸Ïfa©?ésd“ ]~?Àdc†^§Ø?Øà÷а„?ÃéC½jÒø?å6¨Ì.?™•:Þ’?ÍQÏ Eñœ?ë¤ù¸x"J?Õx0á¶ÜŽ?Äc…ÿá]|?âaæ~±¸^?Ù«?°Ø?êÛcþ„÷È?ã$“ðuL?Øë‘ßÚ9€?Îë=-øÓ˜?ï"<¤§u•?Ø:ù± FÔ?ɺ×!O[´?ïîg_&A?äAqÏn?ÁÄs¡¨ø?ëž2èŠñ?Ù›öÞ¢?äŸîŠÚ1?ëi>TÒ5Ù?ë¬8J§,?ÚšÌÊÉ,¤?âÏ(ÿDî~?ÙTaÛ㹂?Ñýœ1¯§h?à 7ëZ”?×›¾Jú`?ávQ\ëR?çx ó"‡?Ö3©/Mú?°z´ÑØÀ8?ŒŽLž @?´>%ªº¹`?åÓûÔ9¥?á¶}HG?Ò¬i"*¤?Ò?®1Oâ:?¾„œj®‚=?º$€ŠüH?Ý­laoo@?Ûòx*óCÐ?ÎÉ»=ïî|?Ú»lÙEÜ?²ÿ›p?ÇÉíåŒ?âÅ.é?ö?à1k ºP?µúJ׈ƒ@?憰ə ‹?ækH—1 ?ÒfWÇm¸?âü^3 *¡?ìú-œÚb¡?½ûÔÑ€?‚ÞZæ­€?Ón²”|&?é’:1'Y?ÐéTám?Ö¥žà§s|?é¡FLæ_ˆ?ä.P¼)!?åã¦ælrR?ë4P¬:«í?àú!˜§Iå?Êܨ>©¿ì?îë*xæ?­…Õ˵ù ?äÚi†úÞ?ï×i¼7?êoN¾äi±?à…'X¾ú?êdX¸;E?äü,jöÁ?â…R•Œ’?êÚÍDïDS?ÕdBž/»ú?ÕÛy­(ò@?‘r¿Þ1ÿ@?ꩲÄú¨Î?àqÚ.Âø?ÑÙUå¦Ã@?Ó¿øbÀö?¹Rc<ìˆ?Ò†Çú\Ô?ä €?)]0?áÀK d"Æ?°0if;À?ÐŒ ës??íµ‹ H?Úhm‚Òà?½ëRJî?ÓC“é’?Þ>ê…„`?ãðe®Sà?è`dÆx?×€â(n˜?Ë£¬Ö0?ê'VátP?âÖ¢â½H?ã©P¿z¹?׊ù@ó¼?ßógA L?Þ~ 3y|¸?ÙÆ%OËzì?ådÑ,ñk`?±®Ž³7¹¸?绪ãuhî?¶«9/N?°?ëæ»ƒû?ਲ਼ˆ?ëŠw¼^3?Ðû2C˜Üf?à–#·|Übv?â±û€¨o?âý>RW?ã›/Ãqƃ?â« j(=?é;Íß?ã8ßL› r?íB%uˆ¦Ê?ÁÒeÖƒø?áO͆éA?Ø(HÊ%œ?ã$€ 8?ÙsºJ‡î?åß#[äú?äŠÊÚs݃?µ‘ÖmÀ?Ë3ª.<À?ìÅÔÈ„dx?æp„«§?Þ´§âV¨?ÖŒ¦y4?íKÝr-?°â‚8g°?ëFHŒÝ&ª?èÛ¯‘J?¾¿p-½Í¸?ÀâaÎØh°?æ×_ÇN¨7?èåõV0Š?×|Ù™Ä?è8´U‰«?âÃÔŒ¼Ö¿?Öß¾®“ô?ãä7äóPÒ?Üníî1„?‰D9 ÀEÀ?â‘…¾ü‡?ààV„ñ}{?èUV?ºë?ïà"åú¡?ÀBpmS`4?ë(߯²¶A?Ó ©•½²?Óò”5X?âlD•d2p?Ô—¶´A×¢?áãs?¢Ý8zú°@?Ö%˜¸îI´?á𠵊Ò?ZtbÀf?áf¡‡‚Yû?赂B8JË?Ö­Øv8óª?ê=9Óv3ï?âÑWoÌÖ?ìîÍ,+üa?ãî%ì–¿?×xÙ#7ŠF?ì1ÁÎ}ð?Öh¬¹¬ê?êÆ>Í­ðƒ?ÐvïEͤ?ê듺ÝI?ä¾É]*?àé^ðš?êãš ;Üi?ãwžmÝrÂ?àå»N´·™?Þ§¹¶ìôl?ÓMÚvŠ?æwSUcÑ?Öç¶ôVÕ¶?ÐK"—ºÆ?Êã%p€P(?z¢¡%p€?Å:˜ãĈ?ÁÙì^éì?á£QÇ”’?í3­ä€¿`?܆&ØlYú?À1£;¬8?ä¸]|~˯?Є%±$Pj?åBS{+Ã×?ØÀ)S“8?ë$kɱj~?Á³´½ï4?å1ßqFÐy? £e£Øì?çj=ÄöÜ~?峡²?é¦>Ü£?ÀŽ;$K@?âÂÖÝ<ô?éáÀt>*r?èñ a‰?Ùì’0:½þ?é)œE?ÐýÐÿCÌ?âb6Øw?ãvè2™ÑÔ?ß`µYŒ?îÁ…>Ôw?ék‡8sH±?³`u8¸?ݦàìYâ?¸JÕˆâŸ@?én¡gý Ò?Ïæu䘰è?äAD¼¨ZØ?éŒB˜aCÖ?ä1GöÝ?êÞ3Ì8?åE៶Í?¯íµÀÝð?ÖïÇ.ãö?ì„ Ï?â¢1ÄÂ{ƒ?ªõ|-ZªP?ïrGp3¬ê?ä oâ¸IJ?çoæ?)^F?ïZ¥ýøpz?à ì0qc?í‡ø«òªâ?ʧݧ&Z ?V7?ìAåf×?ê©ð´›Ë?Ñžgñœj?ámŽ“¿¶o?Ñ Þ5H‹ô?ïÒòWÝ‹?ìRÚÊbˆ?ëdo–’ë?ß«= KOš?½Žù@'È?Â*ç®—´ü?æÆ-YT?êƒ&9?ê;3…šð.?ׂaI¢c„?Í b8Uø?Çù˜ú¼?ØÒ¸z´¦?Ÿ¯¥÷ä ?怛Žô?èD·=d™Ž?ݰ/ .€?Í5‡ã,5D?á‡åì°.¼?ÉŒ¯‰íÞø?è@ÿéØ?Â7"¬5„?á(dûÞ?‡­î–Å €?Öžäßp?ÕWí1ùt?åÆYôB•?ÌK*ƒw`¬?åéMÖ§£?ݪüså V?žPâ ùá`?ãà°d¨mÂ?Üu´ ùb|?Ä8Þöˆ8?§±æôÎÛ?Ûô·½?ÓŽÑÀa(?ßñI'ѵb?ìû”É¢ö?Á=xSû?èËíǺ¯?âRbŽ<»ÿ?écñØg¼?äm/£´^u?ݤZ´pbz?èµú8à?áÜJkQ½/?ïöâ`B?æÐò¸)‚|?£Ç\5ýˆP?Ì6;ø¾T?Æj«{޲´?Ä™å ?ÛW, ïF?â±nE¬¨?ï+ý’ê?ãKH4 yÐ?ÍÚ£Þ]µˆ?êZ¼_ˆ?äÌ»çs%?çð¶“WÂÎ?Ýíp›m·‚?±Fp}ô(?çi5 8œ?Óíì¸6ì?Ó­I. X¸?ç§6$D ?Ñã°x`?Ï|kéYåP?æ¢ñ]äž?îËb®Î¢A?î½¼j”q?æ Þëio?Þ»­°Õ´B?ì.3ãÆ­?ÀQtl©€?ÛèÁ¬¸r?Ó¾À1r0Ä?Ó óâ¹cÊ?±Ë¿‘r&è?ÄLJÆ-š?ÙvîJ?ySœŠ=€?·€5ô_ð?Ò§)¥Æ´?Ò¹˜yGVŽ?Ôì(‘Õx?Çü æ#ˆp?êè§3ízÖ?ê”{m~¿?íÎo3É0?¹ç ·;†p?ë§ávìÅ?ÖÑd–¶p?éÑf$€?×Pm)O(?¯fÐè«Ð?äô‰}nÃ?âü^Ö£?Ó츂ka”?ðô™ÊXÐ?ç{çì²?‰qK–h2€?èójɲª5?ÄB× —Ih?ÁïHRÖ*¤?×ÔT‰ƒ¡V?à(oÿ÷2?±V.ž„£à?äÊë.@8?ÚZp]”š?ÑGCûíýÚ?Õ¾D1§þ?¢®}-Ó×?ÅÌMTÙº?èá ©õ{?ÒÎÌ¿^?è—µÎW<¥?ï1½ IÏr?ÑF(°t?×#¸´€?ÚµShåè?äÞÒêè‰ä?Ò$'÷ô?ê§ö®›õ?嘌W­=¢?ßhMôœuD?Åê¤b„_\?Ñ öå·Ó6?çän»ÕÉ?¯A‰Z‹?ÿ^ê™â`?ÐáÒÙã[¾?ÏM¥û^ ?Ø¢éQ(bò?ÉíùäNW¤?ìÎ_«Tí?ÀüµÖ?éú.ýp¾£?ï·(¨¾F/?ÂZ´Ïþ)°?âC=Þ¯Bî?ÓfB©Íæ?ï 7¢× ?áëð6„å?¦0/¬ÄØÐ?îpç-‹íµ?Œ0[ú¿(€?íyŠFï½?Æ^áÎxM|?îÆQ®ÍðÚ?í­Çh Eù?çˆÇ¸žy©?艪ÈÀ½›?ãÝ53Ðkõ?çÔ;÷¡s?êÓ¹&¯?Üf/!‹Þ?å9ÐJ Bc?Ùšœ;R~?äV“¿ïî‰?ÑóÄè­z?Þ>Ü=5Æ?ÆN|¶o=ø?è“Wí\3?æÊ=aŸï?è=g´Ä?Ù€8Å6?½…­"ø?¦4Æ8FR`?àaeã'µ?îKX§1?à›yEWì?ÐΧóW€?ÒßÐÝWT¾?îðÑ)ùÔ?Ú2Í¡u¹ð?¿¯§5 X°?Øe7aë52?ì›fšX?῱zb“Ù?ÉΤn´x?á '7vÍã?ë¯:ÊM‚ƒ?Ùjäa÷Éî?¦Ò¬I @?âAý‰¤Ð-?¼p"–8?䯸É\úG?À”žÉËœ?ëp5£[ãå?Æ_’i±gè?âF÷Ñ \Š?Å…tXä?Än¯ºHøÄ?êá3s?å1Éa7ç}?î_î³eT¥?ÙcÞwª ?ê¡8Ž%òÑ?èBÈÃÆÈ‡?¾¢•ê:Rø?½àwÈ. ?Ã$žu«êø?íŽA™æ4?â {(Æœ?ëØ}ÜáöÍ?åW‚ïVɪ?¦¥ÚƒEuP?îS>Ö4?ã´]Æ $Þ?æ‚ÅjXê€?¦X6(ÔÐ?íAqX‹°?¸seçT:Ð?ÊÕˆLç0?ê£ñËé(?ã¹R×óÄ?ë¹A"þ?°æi‹l¨?Ýwc_½/ò?í(Òž]?˰KÀ?â÷„Ñ‘X?ëfëmxÄÉ?è ‡ëoš?ãK\QÛ¯?Û|ö»bל?èÎMí­†?âÝÏÉús ?ÐääÇWl?Ù¡[œ¾?ɽF} ¼?éýÈ|¯O?Õy»ì¤l?ë<”#i{«?éÜw«n£Ä?á=V`N?Ù–a?Ef?æ°0“':{?ÌxØ{qè?çÅ{\ïp‡?Ì‚#çÌ•P?Øï³ÕƒÐ?» À ùx?ä LÕQÂx?ÐKJÖÉœÐ?î¯oyØ ž?Ýʆ,$î?ÚÅl´4J†?èÕÃŒýÀÐ?™J@©e ?âbLL™P?áKZU?ë.ªû[?ÖgÍĉ+ú?êò&Ñ) ?ÔJ¼oØ,®?ä¿ô…ì?ìuG[TcÇ?á¯6^_uD?íÛÏäÃ?êXÄ`V`À?ëÞ˜á³?º>Ĥæ4p?à&-KõMÏ?ßH‘)ü?î©L…ýæ¦?äKs „?¬tвÁ°?燇b ,?ÐêFRêþæ?ëéÿ$ ?Ô“«ìR~h?å0¤ô& ?æ½½·®?‹—}·b²À?·»åó‡ ?Þ–v`m*Š?ínºW¥.?Ój °Vâ?äð¼&Oí?Ýf¬nžWð?­Zxý´ÚÐ?ïÒ—|?ÓGÌb_>?Ô=ÖaYkž?å’¿6ù?äzçÖÈ??Ê6æß<|€?×É©ilÜ?â ÙÿmÑ?äÕ¾6dÇ¡?À×Rª¨sˆ?ì²Ò³H–ë?å;KKÚP·?¢Xí¥8é?ã±ç¸4?퓈fE?Å„•¥»ò`?Ï“—â²)(?ï&ÅÊÒø;?áY†!kÙ?ëèýR(Ä?äV"Ìs¢Ä?ä Šø?Ò5Þ"?-‚?Û«=ˆx£¢?ÛµØcªbf?á„ÂV ð?ë¹/ß×í?ÚÁkä?Ô˜±*}ì?ì¼–@ðSµ?ã$/5éÍ3?âBßPù5Ï?çÉ•´âÓÑ?èGF¬Z?ÓÔ¹,˜÷6?ÈBrk¦ 0?à%»”æë?Ò§’3o´?ˆaº©ž€?äîOLê?ç,Pè>†?Ź,«—D?׃LŸ›€?ÚÓ£ïbv?á†G•ˆ‰Ì?Ð?÷š€â?äCÿ(ƒ…L?ÔºôGÑ?ïMö«_y?—™= Ì¥€?·ÊßçU8?º¾´õ![À?ä2özªü0?ëaˆÐ¸[?Õ4Pt”.?ÖVV1º?êa– ÐÔ?í‚§àý¸?ã}ólhÓ?ÎX·§,?Ô~Íɨx?ãQ îGç?ضááv=è?¿â]ájäÈ?äÍ¢Еm?÷§'ï4x?ìlÿÛü°Ò?¼æ«b2 ?Üä )롈?àª=íßÕú?ïg™P³¹?ÂÒâz|Ô?ê¶Ü%ï?Ûœ>ÍÅxæ?ï:v)é—Á?ØLÜq³?Òù×=ýï²?éEÚ£`?ë«ÊÆÇË?Ð+nŒœ§?ämIr‰F?Ò’¹å‹àx?ì˜M¦¶D?¨²9E¯€?Ì0‡7‘ ?骿æ3é?Á tÏÿ?°d?˜ÊÏF ?ßµìE¡°?én&MO?æÓë8Ép?Ùå¹mNb?åó \é! ?à‹c¸¼?èu“#?âˆÚ¹­Ñ?×:i±SñÊ?àÞÞBàÓ;?àðtO{ž?Ù 0ñ“¶r?è¤Lœ§2 ?°]LAxçH?è3{~Í€¯?çw@I’j?Ò}j½ªÓ‚?È>ùy†Ô?µ&;{†½?°Ah®%g8?Þ•†Êã²?á"^%|„5?еúá:6?ãgÅ€£­p?âççÂDÅ?Ö¯óÒoŽ?à[Mã˳•?í^ãXJp]?Ðú§Hpfü?Â>Öri<œ?°y”[@Ø?뿞±Ñ>?Õ¾#äýÄ?ëÿœzó½R?àw‘Ç?Öôêqk?Ý[}žR?äzPÇU›à?ćŒp¹Œ?ãô¼£M´ƒ?Õ.Ì€Fæ?”ŒNçY?€?î–½ÒíLF?è åJÒ?è°–ŒŽ`N?ç4Þà½Ã?Ùûˆ3J.?ãÖ®²9ù’?Ú°®÷ÙË?£³{ È?ãŸ;¢Kä?ÍÞ-µ°?Òh̶²Ü¸?ï•IÑaF ?´!‰sÞQ?ÇKM³,?â#Ž,~ ?ÄÅw•“,?϶µîÅî?ÜÇ “QöÌ?Õªô°Âºx?¼ëûW™¨?æ·ê^(~?é'Dè×CÌ?ãéݘ§çá?ÉJ™xXÁ$?àåKï¶„#?ÖŸ:ľ?Ø@(§s?Ö§€¼k0 ?Ô9ñÃ2ãB?凃 (›?˘·ÍEd?Ø”‹å8ÛP?Õ¤Ú³ !²?ïö”ra?æj¢>yAÂ?ÛëZÚ¶h?ÕæªMh_v?ÐùÒíM¾?Ãó°iQÚÌ?ä·?hSM%?×­b¾d^¼?¡æà™r0?æCãò?âÊ·Ò)(n?ºšµž>y¸?æÛ€´Øó?×ápo·\j?éaW’´p?ãùs.Xk?ìݤ‚?ê4˜ùù€?å ¿+‹&?íç©û”¸?á±êl´÷?Û<¹ýŠè?Ìfg)ÕÀ?í¸Ñp±s¾?íٷıâl?Øq)Ùî¾?ÍáÀÑþ¸?åN–V@?¬ÌÕb `?Ìîü?Ü¥i‰˜ìX?åÞŠu4“?ÖÊÁÊÉÚZ?Ĩ°Î¶WÀ?ßó´æ—ZÞ?½~Ö gp?à ÖÒ†É?ám7ŽD'Â?á¹.hD¼¯?ì/9ÄÈ©?Ðn Ðy°?Òv5!îÄ?êÖ'âðW?Ùž5ä›=4?î›ñ²»]?ßµSsí¼?ÓF«Ìj?Ö^¡ é¸Þ?í<C©?ÈkºgüDd?¿r©$‹ø?±¢ðÀ`ïÚ?GY¶g(?´¶$¦ŽÀ?äi1 «?Ïùœ%d?঄ )?ï^\\scú?ÐÕVªLÆh?ë@®ØXÑA?àÐ/¬ü}?⺆ý®?ÑA©±70?À {…ì`?ÐÀÖRP?á^ß/íê,?íü Ž_© ?Àäz-}G?Ùÿ¬«XT?íå_d©Hô?Þ4—ƒb ?¿A”M@øÈ?Ûë`Dшv?Àæ‹1ª?ãÀêAعR?ÚûùRDˆ?ìÇqpžåÃ?îï8¨?Ñm£ZAX?Ý.žwkø¤?ç¡8íç½[?ÁDFx–à?áS×ò‚=[?Ê`\kˆ3`? RYš™+?Ð){€ ›Ø?°'Ê;Æð?âƒÍªî¾E?êÊ[Ò3?íG3Áã§?íeZÛÙÇ?ì§–ÿz½?숸lQÍ?ï ÓìEäŸ?åsy÷Ù*'?ìu—¬?¤¯”J°?ïZdäjÚ?äùa+ä?ÐÜßw||?í%áŵî^?êÛ{Ô-ï@?ÀÉŸ>Ð?Ïü¨“„T?çÓ*Éö‚?Ç-s$±‘°?Ø1+²ìPü?ë蚢š)°?äÞð#µ»9?ÈîHÎ:Q?ß@ÛTˆ}?é“ï j$?ÓülÚpȘ?ÙŸ¡ÿˆm°?çıÅtv¬?êQi¡À?ÝAàZGø?êÖÂ퀞Ç?Þ…‚áÂâ?ë¨Pj Þ?×”6B?Ín©RGØ?àÈ|à@‰?¨¢ºÎ`Ä@?î<’þÝ)?ïº]“^?îî£Ub¿›?ãLï1Ù“ô?ãÓU ²:Ö?ï¤ú0C ?ë®-Jޝ=?á«nˆ!Ôd?Ñ’èð\qÚ?Ãìœm)ˆ?¹Õ@‘ b?È å°?ºæk›cG?·ˆÐUQ5°?Ö¤“»rõ„?h¾S,>2?êoeTY?Îò 4¯à?ÌB¹¯4g?ã2TðÂE?äx´ü02?̇+>ÿ$?Ç»|L½DÔ?ææy•óÕ1?ïï+µ¦æÓ?×í½Ô“ì?çRÞ‘—Á?æÏ>^†a?êÎNkƒ?ä,~5}´G?Û)\«î&?¢‹ BÄÍp?Б~ Gø?Ç’Ý ‘?åçª f?¡“`L­Ð?ãe‘lÎj?èdPëÑ)?àËýA£zB?—/óN£Ià?×j’‚?ƒI®ŸmÀ?¡ó'ϽÁ€?ç­.);O?ÙIEó¸’Ü?â«¼ÚÆ?Ü•ðôšÄ?ãÜía#Š?p(¢=¬Ë?”Cª*U§ ?ïkÈ8 ÀÌ?Ãcº¤¡•?舋 öûx?çÂoR–.U?ìé¿ìöí?Ýʾ1<Ü?ávñ9tZ?¯ïé†?PUKó ?Ë#šå2|?µ@,ºi ?æ-—+ù{I?ìÒ´Ž?ƽü¿ßÐ?áÚ²È+6?çšhRZßh?ë|ºý“ZÏ?ß0Æ>7°r?ç{E®è'N?ì`í£V܃?Ù ˆŽ†s|?ìD—ášÞ:?Ò«z· ºz?Ï”ý覙x?Ó3ïú?âíhÝ•Vƒ?ŽçãM¾Ù?æ4ˆ ?´1kÙrò0?êUÁÆé?Æû*ZI?¸)€Ì+P?Â*=G)X?Ùf¶~EŽ?Óç9¨Ve/ø±ó?îi*×…Ú?ÙGp¥\hÒ?Þ‹I tR?Óe6{Þܸ?é«.hžÝ ?ÔÀãä?ä©îëc?Ø ä„´ ö?ïR»¢ªüt?ÐBà &?ëó õ:p?ìù»+þ’ ?çÌÂØf”;?Ìš]E¼ð0?Ê0™ò¿e`?àïÅ%sƒ?í‹X 1Â"?ç>oÉئ?å+$ 8™:?æÉ¶ËZG?âNáfÄ™?âô¹?Æ0ß2æ?í9ñS¤?é2.3uب?á ÚOÞå?í ÌÒ ?Ö^D)bª?îLÏ1MZ?Ì̧SQT?ï x\FA´?Ä;¦°@?å»vÿ’ ”?ëbÿ@>ú?Úôàÿ–%Ö?èÂðù›æØ?䱨ŸiH?àa¼ûOÚ?ßhÀqxz"?×»·Ýûè?Í.«AÌ!T?â<:qºe?Ý;õ‹T@Þ?éåhÙ/?àR«R÷E3?ãe +ÿ?Ýæ Ž¢{D?çB+ ¯ô*?µë›zж0?ëê=òFòn?Ý¡Œì­j,?ëMãVǽ?à‰fÒ©QÌ?Ðô¶±ù8?Ý“w ãú|?èC>Wfð?±°?Ï+@?„®€°ý~€?éJyw",?Ðè™ÊXIp?ʱ”ðÊl?ѱ6™P?¢4¶êÚÐ?áÞù›ið?ÁªÒy?îÁR{·<2?芊ܑ¾?é‹úDy—?´`®}*h?í>·–ÒÉj?áÁ3n¾Ý?Òýu$§P?ï´œ‚Jœ?ÚßtÍúϺ?ÖMøöB˜?äø°ëòp?çgóóOåû?Ð3W~5ŒV?ítA¿¤?àŽ†/Ðà?ÅPTóÐ?êëÒ¢âF?åªíëmÓê?¾¸>l1P?å=É4ÍÀ}?Ö«T¡‰’?ìÁú~Ñß?¥ ­.;Ð?Èßa‹ê€?˜0væ»é@?ÃÓõ¬,úä?ê¶Pø?“ŠZ`¦€?ÁºÍ³gÇp?ì%åŠl[?ÚÀŸ_ïÍ„?ÆÔ†LdñÄ?×~#dðú?éÒáˆwó?ا߾[²?Ðý¢šÝ:?ÜÎ<ÁG)´?ííy±i?Øý„"§¬?äJ.nªÛ€?ã8Iä„Ðÿ?ͺ÷afRÌ?ÔôèÁ±€Ä?îëUJ å?³Ð.×!™?êÁâVâ’R?ÔæŠnÊì?ÒKk‹ªšˆ?Ú…âç;Ä?ãÓ­€|%D?Ø~?óʦ¬?í š¦Aý?è,üÛž ?å_e"JÇ„?ËÖjå=0?Ï5NgæN\?ëâ¹x5¶?ì­A¥¤ê°?²xMðž0?ä÷ȱˆ?ÆvÕÎÁÐ?課&Ô…{?Ýžæ[ÎR?Ü8¦\®¨?ä<)”ÓÃ"?ßm§C?àY’ ”(ú?뇵dÛ?ê ÷‹ïU_?¹\YÁ˜è°?èêOäÿ?Îæ–Æ40?Áà$¢ãFÈ?çáZ”Ýü?áiO,€ñl?·ñOQ?Nè?å¯=›€?àÍk–`cƒ?á<þ]I?ãÞµ8›Î&?Ü·>áÇÜ?î¿_l¶?ä`”ÉÝH1?á^äÔÄ/?Û7Š[èÄ?ÝÖrqÄ—v?˶'=L‰ø?åÌÇX¯?Ý¡ŒîòK?ÉAbmŒ¢T?„…I%uÈ@?ànÁgß’_?Á'6¦hN?Ø©¾¤¼ê?ÙŽk„’²?½®‘Ög?邊ŲJ÷?ãà¨w˜¸ã?ÆfÊ‘µì?Ø/ - ˆ?åýò޽?±›Ãx\Gh?âF¿¯”|5?é'g#Ñ9U?²ÏIuõ¸x?¸«¸ç7€?Ò´$Ån?ì Jñ£å³?åö˜Îâo?¼ZUö€?Õ"pcƒ.?·ÿèŽ{ ?áƒq¬Bje?Ø]‡NnJ„?â0t^'?îÖÊ’Ÿ‡?¨­µøèÌÀ?Ì~Ÿè°êà?äRMƒsìJ?íV¶{ç?ßó‰Ž*Sþ?ÛŸ„ÈœZ(?ÇwGO¯%h?íB¹³M¿V?ü¹–8©À?ØÐsÉÒ¤”?àýu‡üš?À•îƒpô?Ø{S Ô¨ü?¹P…ÁXf(?èj_¨3غ?è¶Ç†ö?ë‡C`d/v?à4‚,ûN?ãtQÛ ?É€ì¶H?Ù‡GvÜ ?ÝÊÜšqMæ?í›1¯Œ2r?Éw¨#¶Òè?êø€v®?â@ùäåcÓ?Ñà«É‡V?Îðµ¾ ôÔ?èŽOËPF?Ûô¹vÇØ?Å.¨'“H€?ÆñÑ´8?ï®7êËÑA?çÒsÿ¯}r?î¨X…Qo.?Þ„lƒå¶?Çù×+¶Ø?Øç»€úõ¶?ᕽž?Ö ºTZ?”¨ÒÉà?ºFC X?ê'© ³›u?Ódm‹/~¨?âH;bp¬å?¤¹*-ô°?Éô˜À¡n¼?눘‚Ú_í?íØÙŠB[ß?îržÅ°º?Ù¨ ùb–*?Ä ®%$s¨?áNs»sÁ?Õo4ÅMÖ”?æç»Ù“i¤?ÛõÓ^87L?æ(Œ2è²?ãäÈÞ2?é…Ö8L]?æÍU „F¨?ë¼Å:O?íàyšNõ$?î!ùÕ§ÂÜ?lÜÜ!§Ô?ïÆ9PTý?Í3+õ`?ÑM¿¼¤?д_³ºf®f»?ìËÇCD?Û×Q^*R?³ötá·@?âå|..`&?äñêæϬ?á—¦ZYCá?ä/†9ÈȬ?âÔÓ )³?ëÔ}Ü¥?âo‡ì—>Ù?áogª*ø?¸…͉D?•!DþÀÀ?¼]ç£ü$?ÊF¿”!\8?å‘ÔQăÿ?ê1ÞÒP?Þʃe”?Ï€·ºYQT?Á$u°^{È?È`,Úî?îÏEu†sG?ïÖo’âÜ+?ṚÙÊ­×?éÂÍvÈr!?Ø)%µtÐ?ÍG®=mÝ`?×¶)ƒ÷¶?áÐ {VÒN?Íþ0ÑÌIL?Ï©o y?î¢ß¾;?â7¦ º½Ê?êªsRä?¶^Ë.( ?á¦^œ³¬Ý?©1rذ?¼¿t º$ø?ížF°P|z?ÚìžêÅ?éÛ=^(:?A_›yX?Íё̴?æ) ê$‰Ì?Ï)åˆv?ç€Û—§?Ä䞌?Ò$Ýéëëš?Û˜ˆ=Õº?Ú-\¾#þ?í1“zÍ¥Ÿ?ÝŒæ×Øž?Û¿Æ‚ü4D?ê|{0Q½s?؈n²|”?î¿‹tk{£?é6*ªÿ¸¾?ÓÇKµü¢ ?ä¹oùbŸ”?幸yxJ?¤wuQj¬P?åÓG#‘/?Ý\ÛTKÀÆ?È£+µÔ?æypRWºg?ç¡é|S‹?ä’-šŠ¯Êkxäô?Ö ÷Ö_?í:þ (¢!?âþ2ÀhX|?îC¤Ã/´M?íPÁ6³mW?ï÷·æp¤?ëñs8þ›?êØîR©K?ÇÂqœïÄ?Ϥ€^QÕ?È ï„ôD?à0p>ÍaË?ãÀÇNeRO?ÛBùûnÐ?Я’&Ÿú?ÛP‘Ÿ¦ÿî?ç·Çx[–?ÚÁ„ã›$Ð?æGwe$5?àŒ·Z'¨Ì?åOî'–?îìý—ßZ?ÔI$äçG|?ë/`óßc5?ãÉ@ Q"o?놙ÄÊü?ìú`gÑEü?ã, (ò™×?Â…*(–ê?Ôiè˜ñ´?àœè’˜¨î?äò>„†0?äó†`[ Œ?Þ‰#'>P?ÙJq_8üŽ?È´óizð?Þ+­h~XÞ?èŒ*'û–©?Ü:¾îPmÂ?Ñ”YxûÌ?ì§'šªë?Ý…íöµ¾&?Ç,a£ø?äÜèCˆD?ÓŽÃ ¦˜?Ñ¡Ê bŸJ?î¨ã„Un·?Ü€ž°…_"?ä\R‰HÚ?áõãÚ×9?ÞUÚ5Œ?àxzÏÊÒ?çZÎ'°›p?ì6F¼["(?㉨þlm²?Õquá_3ø?ÓÚ\f_‘Ü?ØlƒÌ?¹‘™E;WØ?ë~G–Ê?Þ‹QÙÝ'Ú?Í=±µ?Ä?Ú‚­òÿÏp?À¹®Ôö ?«^ ¯ò°?â£)å%Ñ|?é<š€"^?â?jGÊ?é P}›?µVhv$?Ý7É®gâ?Á2Ù‘+$?ë× ×Z¯‹?̉¬)D`?ã[®JC³?·ä{{¾ƒ˜?àL…öË=·?ŠÝ*6)@?í X×Qp·?Üô¶  ?µ4úòö¹?Ôm.ñËŠ?í>Ü«yv³?ì­.»C?å>0Ë2@Â?Í[3‚c Ø?ÍÓÓ‡>Ð?ëô£ÿÞe?ëTþ}…”­?¸Ú—ʃ?ÖÚQ'Ý¥n?ïw¨9µöÔ?ì~}йûj?ê}“ý“ô?êCÖ6c§$?֨הçˆx?Üá–b#°¬?ËÈÌôñD?ãéÙŒ?Ä%õ¤Rà?í^­é4ø?켪÷AG?ǰÄ-ó”?î Dû}>?Üx"A ˆ?ÍeݾìÄ?×âRv&J?ÇŒh!,?×þ5úõ?åm‘C7'+?Û‰)Þ†Ä?Ì‚Ö82ƒ†EÞ?æ“(‹5ü=?á¶{I Æ&?äÇ£]ÿЉ?┪Á3¬?Ñ !µ–kš?Æ=ŒeÃe8?Ï¥p_'L?Ùð-&áW`? Ècò;?ѧ$#Ÿ ¾?Qºkû?ÚÏXj£ã$?ÚÕIQeذ?ÌÞò$? T?£[~¨ú™ ?ÆãÕ©Üf?âN €+•?ÐæU˲B?ÐwœÕ(?èÆÁNUj£?çŵ§HŸ}?¶Ÿ€ß»L(?îÌä˨O?Μ]÷C”?éo’C»?é¥õ„®¦“?å FwÂýŒ?Ò~h·m¨?ì£B“ð¿ô?µrWþNˆ?æ a{Bõ?Ü;t—k2?àév͹ É?Î2 iIà?êÒÐoC]·?ïk6ÆB?ºd7{p?ä3¾%”O‰?åýB‰ô<º?¯îÊ6”!À?å,-ý@]Ë?ؘ¤›x1x?×4ï0€?Öe§¹R?çÙeødÐ[?îEW·ð|ð?ä£ZP¨À?✯ªª]?îÛ*åUÌ?çÄ]>É?Ðy|’ö?â/k¨ À^?ÙE§ÆAlP?á†!·EÞÓ?Ò$hu®b²?ÒU\å×?d?Ñ1;úp?ÐOâ°ð?¸Ä/b^@?˯¢ÿSŒ?ï¼Ê—¼‚?äaÕ{o\°?Á/{ö4?îQ˜Øl3è?æãIbIiˆ?Ȉ!V–¬?ÙåjœÐ,?ïÞ|Íœ?Û/3ÿ±Õœ?çÃw7¯[½?ëÿo|‘”Å?³=6ÐL_°?âW6 D?¿Y®Ëï˜0?¨²gîA `?î5ÎuD?Ü™7n Ú?åÁ/êÞ|Ù?äÒ §bì?Ê–‚‡÷›?ì^¥—â:?ÕMoà Ü?êvð Jù?ÆŽw\{|?Î¥‘-x?è Q;ßë?ª¹ÅDü?ÕP'øºJÄ?èH;Íž¤=?Ù±ËÕh?äB¡ã`Ð??à÷óKÄ%Q?À†Â6*8?çÂ)iÙ?³&¼Á¬Ùh?· 6ö㹨?¯|é—GÀ?àQ­xCD?åæq½?ë Óµ Õû?髽jè?àJòEµ¢?ÕQ§°i ?ã‰r =U?Ö"ÝP ~?î:Í¿{ãc?¤,°™;½°?æ=ÁîàÏŸ?Ö(Ô³š ?à1¸5•=?ĵcÏh?–1Ø|Ó¬À?í/ q©¼¡?æòl~¢b"?¾>齓ŸP?ê&ˆ‚D†?Ø΀™ýH?Ñ(ƒF?d?âá„B ,Å?í88e£u˜?Éýxôt?ìwí¡L@?è\õÒ?¹2kË<¨Ð?Ý…×þ¼?ÙT'ô‡Ä?Àkdô&”è?ÌVÂóa?¥#Ö ™Ð?ä·¼åËI?Ø»wé~?çß!ñMCe?áØzÑPÇ?çùêK?ß2Y9‡N´?çÄ“YVÝŸ?±­.Õ‹t¸?ìÁã‡L^?È®,c*ŒÈ?Æ´D ät?в%IÃ7æ?èÁµzûŠ:?èÕ03å°Ò?îºÔÏBû?Ð)ð cÏ"?åØ`èfç«?ï[D…€&?éFK+ô˜»?âÄ#J ƒ?ìî+NO³?ÝF™H "H?¦?ésÆðÀ?ÝFO)›9(?Ô¤Q¤?ׂhåý.?É9Y„Äò ?èú—›¡?´É}Ê?áàÌ?ìzóÞO?é1g©t?áÃô"Û@?êmlÒª,?áÑl‰Š?ÅôÊ¢Ì_h?¿KZQ²~X?ÜŽ.ºÛ P?Á«ú |ì?ë3«Æ~ޝ?ÌíÞ&³÷8?ê’l0h0ø?È/Ý¿¦\?Ü›€ yØ?̈1F£ýØ?¬ìÜÀÉ?¶Ù+8LB0?å„_ÅB6?ëõçÂOò?á6=ù•‰"?¼?¬?‡ö”¿M5€?äBlðÝ,?î8ü/Ý|å?è?Åêÿñ?ê9 È{ä?ËÃ}ˆ§Œ?·œÇë$?Ô,‡1ûòö?©tÑôªj€?èLm‡]Ò?·ë”Ý¢à?ÖÖÂi*ð?ß5ƒ¸D?Ò!ÈÉ;æ?àžÂzxnÿ?í qÊ—?è¦IÊÈW?æu%áÜU+?ÜΉ{ŒºŽ?çêÓ*fzE?ìÝÖù€p?ë¢ùì„’ã?êH•ñ¢S?ÃB%¯v¨?âò‚‚°e?Ú¶a†9 J?ëð¾šÊ,Ì?ÅÀ¸#öW˜?ÆäÐ^šÈ?áùfLæiR?ÕŽRš?ÑOÝK}˜ê?Ê!ÜDâTT?°×'Tóè˜?Ëš¼²8QÌ?äÕÐÍbe?×ø«Ùwß?߈?{<Ö?ÖöµTéò?³gí @¨?´Êç"ÃbÈ?Û˜8Ïê¿?ê©V+úžÖ?êOépµ]%?’Ÿ»(¹ ?॓ˆuv?æUj>ÝHÝ?à„œb’½4?¬µÛ²Š0?Ù4Wæ#?×µ‹±4‚?áw5ÐtO_?ër9<6?ÒÇ÷Jõ&?ȃž¨Æ¯Ø?æ´ìn‚ø?Ï™8ž»$ ?Úcå½…Î?ìvýït!¬?´nØ|?ÉSòZŒ?Üà,·\å€?æ»ÈËv?ØXõêÞž,?ßÃòÑr?íBþ5Þx{?ä-6Ÿ„ªÆ?¯XDÐ?î{Á£ÍÕ?¡ Gšék`?êݵ¶é?äO%Œ„ìö?åX‹Ò«’V?îlĸ^`ˆ?Ó½®ÏbÈú?ïÝÈq•zÎ?â¥E)ö/?Û[?•Âq€?ÜG€EA~?æ/¢EZ™7?çÍØˆß\*?À™å¹ÑÔ?ÔixäåH?Í&ÎËûð?¶p®Ÿ¬¶?—E•: @?Þõš×Yïê?ÅKŽŸ¸Ô?ì”T˜¿?æY±®q?ÖEʙ?ÔÓï°¸Š ?Í”V­„1¨?胑ÒqÑ?Öù;æï?êå¹³y?ÑAÓ¯F?ëUHÆÅQ?è[9FüqÝ?Ö””C"ƒŒ?ï ¨+ß{á?èê p ?Ýèš zr?Þe ý f?í‰èTÊ,?íbý[ t?ãé/ÈÇÛ?G„'çPt?ÚÚ?ÐvÞ?ëhÛßbl˜?¥M³“¶a`?à•à¸v}F?ÜšâP1´?ã4•‚9r?¶äL’ûêà?æ6”Š?åjú‘^O?ÖýlU›Î?ê“×Ó0ä?Ù:»mI‚Ä?ÐxФŶ?áÉS O_p?í›e=ñÀ/?Ân”YlÐ?ã1´3à…Ÿ?ÜyV=³?ìêÄ£ 9Û?©†·WßÀ?ìÉéìØ$Q?Å­¬u+wT?æÆ¥1Šüÿ?Ðæ÷Nùã?è8Àãà9?¥¯üQS»P?Àuo²"@?â_K”YN?ãÌÏ»j*?êã©dØëa?ä½,vœæ?¢awª?⫝̸ïîí?àP§tæÀ=?Ænðؤrx?È…y²?¼?Éú!E¢?ë Ž¯Þ1 ?¸›SWÀ¸?ÖƒÌRbì?é'L"0?à; ¯û—i?ã'™˜mW?ásÑr´(Ž?Ò ¾.¬ö?ß@)ɳÌ?Ý“kÒò?Õöšçï†?è× À†r/?Ã*g@á`Œ?ÅËŠgbç€?»8ã\"oÈ?Œ½j0¨-€?ÌBŒã_*?椂zÀ$?±‡Þt%¨?Äe&'Qô?ç™èùÞ©J?à¯3” q?Ë~·kô?îöß$1B”?ã±nÿ‡gZ?äªx•²Ö?²`ˆŽÈÈ?Á‰iӸɍ?ÍåpµnGÐ?Ú÷b†WTd?íæ¾ÃÙm?¦ ¨` ?×K¡séÜ?à 5ìÁZN?é·Ò°üÆ?¼nŒ m­Ð?ï¾TEçg?Ó)µ3p?æicMÕ?ÕÞø×(€?ÞšÐ9Åü?ÚÏ ;Y®?íy[ª?ãt°‚7œç?íøZĪu?Ø£í§ö”?ÛܺX£…à?íÍéôô§¼?Ú`#«Žb?ÝüèNˆ?îÚ$}Ú¾?ÌxÞ[Ž|Œ?íï(õ"Ñõ?å§ç²…b?Ü,ƒµd?å >öE?áLE4àŠô?èw¤’}36?èÔÔç*B?î¦R;Ää?ßnòÕÚÄ?ï¾ÎòFµ?ä‚qoŠ.?à¾éýa„ž?çg¨C<õ€?Ùð„š‰yV?ëâ6î—ì?Ù{rŽBu8?碨:ÿ÷?Þn(—ˆ¿ž?Ù—3Lf?Í\Rz/P?è¸{gÝ?àÑœºXx?ëði»sïF?£se>t ?íšÌ¿¸S?î%]tl8?ãßywVx?딲½ "?êôdmÑåÏ?äL?ÿû%?á÷ÄoïL?àdA]Ûï]?ëiXDÕë$?ï5uÜY­?íÔš>?wØ?Ìê©\I4?ØitÝ×õ$?ë¡úq”*î?Ù·êžxü?Ð ªÏƒ•T?ݤGë†?¿a«æ²P?À&Æ<ǘ?ï¢wª–?çÍ#ÐØ?ÊÆµéž ?Õ—C¯ºd?–6®—í?äîgQé?¼Hð €?ìqüð‘³ê?ÙµÀw0*?âC˜`ûûù?Î}œâ¦T?œ›Øu à?àp]}‡?ßò`#ö–?ã_v%ʃ_?é³Ð9XV?¼ß2¶Bx?×ÕÛür“?¯²&?]p?á̬/÷¬Î?í4Aþ¶M?Õ‡(¯¤?Õ«à0ö?å8{iõrÄ?×ÙxÝäÉb?îWØê-k?Ô$=ÑÀ¨?Û¾áUú?ã6¼ ¤.?¹'´‹I€?¶¹‹®–hÐ?ë“N,TŒæ?›8*¦À?ê¤Z¸_à?àI V‰Ž?Ñ{y¢Ð?é=ÿI˜V?­’žüå?ÊÖ ^® Ø?î6dýU²[?º×:Åx?âX-;?ìñ±Êã Ó?ÞßMËÝ?éGa…z?Ý©Ô"Ê$?àäp7w)?×Âð9(­„?ãé>Z’N–?ävzOHÔÌ?б,çœ?è=U›@?ÆU’“ÿ£h?ÒèKMìo?¬ÜXs]V0?Ü<À#; ¾?Öû«%è?ÏYÓbš³˜?ÒÉhÖ€.?ëÚvÄdR?á; ´«?Õ*cÞGš˜?Õ†K !ì`?ű/xKu?éG£gó'ˆ?Ò¢_Ûß?ï:ݢƛ’?ÅÅðKú?Á¡¹ Ú€?ÔA3š¢?Ó~BÓ­¨?Øîdºä6?ìcÃße´?ìßçŒÿ[ž?ãw£hD_?éüÚ³ð`??îÓüæ?ŠïÐÏ>€?í¨Y¦ÿ—?騴r—H+?é´`Dÿ±@?ël‰ Ào?Ÿê€ñ?ÕòÛñÈý?ÀíT’Ôül?æ\Ÿé !?çuI?üÃ?ç¨^à?èD7G¯?å@huÕem?“ ¼ 6o`?ß…Œ„=?â6`?ëRÍðEûÓ?⇊S|è?ⳌaByn?ÖØîØHÄ?ïùÕAƲ?ÉÆQ=° ?ÙÁT|ä|?Ãþ‹íýÎØ?àÌIë8]ƒ?ªn^³wÐ?ÕûÖ EÖ”?¾Xh±˜ ?²\zCËo°?éÿ±–>¾?êǃ8=U8?ìI)¤¯†¬?ÝP¹Yà?Ñžm¤¿—t?‹Ü²Ýi@?Ðá™äEïê?à™, ¯Ï?í{çW¹Ðn?ãê5Ç0Z+?ÔæQŸü?Ú.‘A§?à.J*Ý•?è?#¸­N?ÔÓ”è]è¢?×,ÿWòì ?Ø¿üê è®?Ñ º¤È|?âÙ§*¢?àr˾ ¾?㉤ÒòG?Ø€C¿RmÐ?áÖšMx?æïiY ¡?ãfÖ .Õ?ÃJÀ«‹ä?èï'»Ûs=?Û_cêjúà?ïEsË?Ó!Pã6ËÀ?ÊçØl´?Ñ…5] ?¾Í÷Ó¶ø?Åì½nÃØ?Ëíl¹¦Ó‚ÝÎ?Ýze¾¼?í!v8Ú”??æZ£ ÐÖ…?ßnö}v}?îLŒþòHÐ?§ÍÄÎQ?èÅÎ…+`N?Þœ™ùÄzÔ?éÕ÷‰ÙF?¼|DÒµø?é—.Rý?åªcöÕÆè?×µ[É0ýš?±ê¬EbWØ?áîMk†RÁ?×·Í.Ýü:?ëUuýéø?îOô¶?ï£(þšô?â©Þ]ä?²·y‘ôÁà?¿D+7HÐ?äßÝð»™á?ë„D ¨Ì?éÂT•;6)?Ê I4Öó`?í5„ºA?ÝÉ_Ï™}V?ᆬMy¸?ãœ+ûé?ÆQðjNËü?ÜßZ9¦?¸ÀJ7šY ?ÒTvŒ¯Ö?Ô¿Mç2Ð?ÓDâ×)J¦?â|‹?Cßz?ã/cÿÓ™†?èàÌ9‘Zv?è³&wÙsJ?Ò}ü{€?ÓþÝ¡Lï&?ç˜R«_ü?´ã”xp?ègÕ~j½?;ˆCmœ@?ÝÈ”–:€?Û…‚àç·”?ìxDßîè?áHoÅv¯?æ°þ„žzÁ?Çøöœœú,?ãXrëÔ§“?¦s´YíÀ?æ Ç—Ÿ]a?êôÍn¶?è´S<(?çzʸ$?а Uùl?êjNJ:š?àuŒC%û[?¿v#L?ê|ƒÐ/¦ã?ãq÷¹m:ï?ìÃ]|á"?íjEó,RÂ?åáýQõì?¡¤,°,äÀ?æ?Çná?ÒDOh¦„?é×ç 7(¹?Ô€!NJH>?ÌØW¢!Õˆ?儬ÒÙG'Æl˜?ÀdÈLNtd?ì•+ft4?ï•9GƒµŽ?ÄÓ+\G¥X?ç0Œ«¿Œ?ã)>@[?ë úÖs$m?사¾£oa?ÙcŸ:„¬?ëJžjðv?ã$Þ@¬¦È?£ ‘þ™Ò ?ç˜jK~=?Ç3ÞQš8?à ŸEÃä#?Ô˜©tjÛ„?ç››6°9Â?žŽx΀?áÓ,qŒþ ?éÁåŒ!”?Ò «Ú "Ò?t{ƒ6ä?×f\ÝYt?Åa‚³ú\?Ãgÿ@%?é—™)‚p¥?éö‰4ñ+ð?ÝMÆRú’?Ÿw6˜µõà?Ö¼ñi7[ ?ÑäQùZþ?Åžðƈô?´§Ž?Ý|îÓ©V¼?ïT]æ?æW½aqÔ­?Û["h°’?ë©»ÖiöÝ?»nvVòí?ÌLƒ+Œð ?Þe¾ú¸â?Û)¯'ç?®ÉãÝø÷ð?ÖÞùÝX?ßZàïGÊ8?À¶ôœ\œ?èN¿8»áŠ?ÔMj\Ž?æÌï U ¾?ØÆu›~`?ÍÏ´iœê(?ä¸çòL?¤ƒ÷D¯k?Ù8åíÕœ´?ì) ™(Ä?êî¼ðé©?è%§cëõ?é\>ÜŒ á?ÉED¢¯ƒ ?çN±H*ð?Á§uÆ’È?åäêø."?בü.î?ÉK¿mð?ãB RrE?ì3%ÑR?âx¯¢¤*@?à¼S·'?·½Ö®ïH?±B1qŸý@?¼—¦yœœp?âܹ&…c?ÏŠ¦Ý¸ô?ì$Œµ/ÿp?¤ ÐšæÏp?ÚQ…À75þ?躱RÓìœ?ï®Ç°ˆû?ëf Fè}7?áÈ€_#?Ѩg~fSö?À+ó<Òœ?ïåß}°ÏÀ?éºG3?é£j¥Åy?â¤ëËT£?Ý1ÈægÌ’?íÂþcÐ1?Ö$&ï’a ?ï½Rµ}?îÿLeËI¯?ã‘áZàv½?àS´VI?Úò­8ëŒ?íàáiØ] ?ÚÜ” Ei–?äZŽ„~O?ª¯ë?˜,`?‰Þ¨ã 8À?ÛHé "ø?Ê 5—p`¬?åp |§€?Ý=Ôâ¸?ÜÇ•mPÆ?äŒÒUd?Èã(Ѭ?ârɆ¸¯ª?è? _‚w?Øz¼ÚÁh?ÕùºÉ^—ø?ì?%Ö€ ­?À¯%2ØTˆ?Ö'¡feB?éÞfð.Å ?àZát·‘?æ'Åáu?ÃsõLp?Ã&döaUT?Ö,P)äl?ç ÚYkè·?âtÿÿßr?í£þ”Ð=?ê¦7r4ú?ÓC °æŠ?ãäòÚ|L?½«pF—¨?áRH©æ3\?ê4Š‚ÛÈP?ÜqH.Ä…V?ÖÈ£¼?ë*†LH'_?ÛÜ‘n‘F?Û$¶­Ü?Ô¸4ð½Ú6?äÙ°.Sþ×?è¢õTuö´?ãU…š²ä?êkuK¨A?è #âP?çÕ#ÜmÜ?—ŠÅú9 ?ÂéòZ'Ø?Õ=¦•Çqj?à¥ïUÖÒ?îþ­í™Ê?á!^njz?¿Íw¼z€?îûUHéßT?Ò;d;Œ®Z?ÄÛèé…ʘ?ékïùD?Ö<9xŸÅZ?¨8'Ha?ÔÅ‚âÐ?ÞõË ö:?´†6¯.8?¼º©/È?äAtÓÇ?å`”åÐ?Ò‚Í¥û2~?áßÒ:ü?åa)Oªo?¾WéiÌ8?â:$¢QS]?ÂoØö”?Ðòÿ‚ÂÙ®?ë!ŒÂ¬Œ?Æš¿´½ã¨?éI¦H€ž?ë r¹O??Ѽ¹Ê®Ì?ÜÝ ðôJ?ÕrC­yËö?¾‰øGذ?ÔÜŠ!ïö?ÂÎãN‚M ?ífèè\Hb?´Ý`ÀØ¡à?í ÆzH?Ä{“’¬?|v¨]à€?æÂá–gÃ?äˆ@ñ8{?ÒYPhià°?ìŸúõâ?íR¨ëâ?ë ~£›Ù?äâjÇñ?Ïý©RÁ|?á6âÂ0´?è¸pæ%Žû?Ôó>-î8*?Ø-YÜv2?êÏc{=N³?éEmν+?Ø,uºVÎ?ä·ê€¶Ü¥?ïA8³Hßj?ë™éRɼ?Ó_`ðzûD?Òk×TÙ†?Ó$^œß?ìkZw ?Þ%Ú>ß'?˜ §Ie¥ ?éüÉ„¹µ?à`6iúÃ?î…sroz?í°xc ûÚ?åÁÿÄ >?æi¶C#A?ȃ¢añ¨?Ùi°dÕO˜?çbÔY©B?Ñ¿ÎÉä8?êCăLt?ä3£DÚú‰?«EyÜ5à?ךZfwK€?äÊi¨2 ?ßYˆÅ@ž?ºAI?ÜO(?ïclO>³7?êp÷›˜o›?ç1ãäZ–?ÍÃ{¤,P?îK€2²‰?ãÿf$¯P?‘ GË~»`?æâaÑèN?Ô¢FºgZž?ëØÂÔbD?­:Fîê.p?©Ž²,£˜À?㘠+O?Ýd² õr?ÝÙ²}РÌ?áK—--áõ?±[…Z?ܯS%">?ìU4þí¶h?ßãoÉÖ,?æ@;s?î\Çp²³z?¶T•ƒZ¿à?ÊéþŒKà?å²[9gÛÉ?jlޤ& ?Óäi†Œo ?ÐKõ/¨.?ÙÝ?s°?æ´öˆ?ØcX¢ü?ï‘eŸñ˜?é!°¸”L§?ÉXÆä/¾?ÝK]a§6? ¿ø2Ôÿ?îhyu÷Âg?é"[\2uÿ?£].ÇŸ¦P?áß+¸AVn?ÛX†Ã„Šl?ÔåHU–?éw±D¢E?Ø‘ô]¯¶?È]2ô§Æl?åŽ|² °¹?ÄIÝàÔ?®'²xôI@?â8ŸPƒ&?êýŠFxŸ`?átã"§Êà?í/€ºôæF?áhÙJ)½$?» ‰˜+Ð?à—¦ÍÎÒ?èñaéf€F?ÛÔ~‡ì|?ÐrnÚgä?äu–@)æ?k¿¤?à~ïw+H?Õqj#öB?Õ†§³]æþ?è$òÏ¿?ã}OJ®”s?µH¹ªÊŒØ?ãzñ_Ÿœ,?æWc w?œH<ur`?çüEºv„?á÷t#\Ù?ìy—)hé(?ÖnAfOÎ4?Ïc (ü„?åQçæ_)?ÁèјgƒÜ?æsºˆ‚ºs?Þ²°¹  ?ìŒ:ùÖ?ÁyOþ]‚Ü?ϱþˆ@Yà?è@øÞ–?བྷ`ðõ?í¯«=²ï?裛æ<¬?¯üe#d¥0?ÕìúÅ>ð?Æ+~Gܤ¸?ÍPÝÄ¿”?ÌbÑcR›À?å°McÒîü?î tØ-^?ê‹$ÝK‡?Ô3NzFÍb?Ól§h?í™49×\ ?é=šgÂ?P?Ú¨–Ñ8*?àgÁr2?¯|!?ç{vºª§?ì¬ qÔ9?ʬOÌ¥ ¸?ë¼Îˆeý?㎭»?ÚåImÍP?íHÐ%Mà?ÆˆÕ ’ø?½•vpKf?â0Þ±ê?áp#ysY?Ær è",?«y9`?Ã`< öÜ”?ä.„S˜ÃÑ?îô€:šø?á^Y.¸P?ÞÎxyûr"?ç2´f¬Û‡?ß<åÄpÈ?çu8¹þ× ?è}¢ãý“?á¬>xqdš?ì—w…ÿH’?êê40­?ágöh8ºN?ìKÀ+<5?ÛPSZ,¸?Ի㳽-ê?ßµ«y‚H?¡zå† ?èB×`Ž\Ù?àcM$ ?ä¶²¶~Õ?Ù #q|â?µxkG;ü`?,‚û ?·eUOð³ ?çU»ô5°0?·R¢ÒÎ`?Þß1eëIÂ?àÊñáã\?Û Kˆ5=ê?ÍHÞÇA·Ô?ÁlYàzñ?£’¦B¦ ?ã Nµöù??Ú߉A5®Ž?ýõ7ÏÐ?á_{ !`œ?Ø„ õ¡Â?áæâw^ù?íܹî.©/?Ðô?´ëjª?¼8ôT?ì0×Ïf?ã­/ÞïÙ?áŒÜWÝ'e?Ç®ëT‘Ð?è@gÞÉ?Ôɱø°?ÜU)«  ?ä  dgª?ÌÜ1›.dä?ä3‡ã©\?å¤Ü‰en†?êtáÀi‰?Ñ %Ræ?Òëêç>˜€?âÖ×Þ±º>?áù¯M—t?Ö34¼íº?Ò39¬?ÃôÑ"ò(?Û—-oø ?옒ÖÇì…?å¿pª_øž?ÎônÍÞÊ`?ãt‚´›åÅ?ÖŸ½GZ‚n?…jí§<+?çXŠÄµH?âaÅ&ØÀ?ç20±¸ÿY?ÛGå2ž?цÙM”û–?´uL}Fïð? ™À ýÊ€?Þï‘ç-€?Ñ´‚ìKa"?Ó¿Ø‹”?Àˆpë0?ànQX\±s?ç¸2PÌ"#?æ6€8«¡õ?ç€-ên?ÛˆÒ@”\?ΰþds³ä?›Ô§šþi ?é[‚ØMß´?ëžXyH¿?ĸ¸WTô?Üã[K¼±†?ëáÓå§ù?Û÷bž©NÄ?êX½7BW?»üÁÆp­h?ÖÐáõžŸª?îëÄ["5¤?ÓIºë®=ð?åþ‰é F?ïÏl¶þ­œ?ݘŸjt—€?å6§Ðø6?èPÜJøj?æVÑÒ9ö?æW0ö‚¢?íI¹}{l?â®t9z2“?ìåäs"ŸÐ?ÂZ.sŒ‰À?㔉)|º—?Òˆˆú_Ø?îë–ß0K¾?àgB"ë?îjx~Cû?Ð1W¯ò?ë."SuzÚ?àwÒ°P?¹·£Ð¡5?µ}ò!7žx?Ü&Œ°HÞ?åØëÇ3=Þ?ïAþ^q²M?¨=õÿáð?ÁÈÿÁ¼rà?Ú¿}ýr“ˆ?îœ^BþºÒ?ìáha1©¯?Üö±¨?ç¬6ú½?ãd½&} ?áò:*T /?Ñ},0Û Ž?ëŒq,?å3œëÒÝ?Ûyù8’ã?ÜJ®³°=L?á´ã©?æ“ æ¾ŒP?âúCt“ùò?îÝè3QâÝ?¤u‹ãS´à?ã"Ò^:•N?èù:-MÂ?åŸwÁepã?êçAIJF?¿NHèõ§€?×aí0êà ?ßÈõóv&?ä+è>ê,t?â¿Fš÷¡?Ì2ôNŒŒ?éO=²%‹?Â0ö¦G„?ÙáxÚ¬û¨?îu „£7ÿ?Ú׿ÄÏW¤?àk¹Õ.AÔ?àl@ÃCY*?æ°ÈªâŒª?×@ˆ‰µ?íhÇSË?á[šZË?ʳٽMÈ?½þ¡M?Ú”Åg½²Ò?ÑÑá¦~Ò?Ú£Ò—sÑö?ÔNl”ÎÙB?æ¢y°~¬?ÖöûŸG4?è®_L\V?á& ’ñ?ß›€è“.?È;¸<%ü?쮑@ÃK¥?æÈ9æ?Þýu[:aè?̬P$?Ê1'¬AöH?¬s³7AÐ?í« æD^"?èqï.â\?àuÈ1jÅ?Ç'ÿQC(”?ÚÕ‚°fŽl?ç}÷Ï?àOF;iO?ÈÅ¡ûŠÐT?å{Ú•Z?ßò«uNª¶?ÔZ¿Ð*ô@?ÉÁ°ÿQŒ?£F±g§ ?ëoOÒ-’(?Øê³Iÿ_º?驈ŠÂ'?ÁÀ–vsT?ÙñÍåj$ê?åpröºK½?ÚjÞÙD„†?äRpØùÔ?Ôš˜áø?´ÿ›ñŽé¸?èTƒ )?àâ6fÅ?ÞM-  (?ïL«‹}á˜?pæÐ†³!?Üß?.–?¼P êIM@?âÍ}]SÍù?ïg‡B¬þ?æ»áŸ¢Ì?áÕe4É?äÑ­Ó÷ë?Ã-=ÙD?ì=–ŸÛô?Ȇ‘VËÃä?–”A¢\?éy0b–ª?ïiǼ¡Ñ;?àÉê“çÓ ?ì@ŠIµ4?äÎò¤â_{?çÍŽoEö?ë×z¯†ˆ?¡Ðjiÿò?À[eí9ct?íÁ³Ü`?ï" eóïç?êG•Ìž”Œ?Þ‰d4x?íû1GLˆ?æãOö È?À«Œ hºx?ܨ'>Ùe¤?àfôuBî?íì¬[ÈL?Ù{[ÍØ±r?ÇTÒ³ùû°?à˜ü1K?àˆz'<Ú?î¬ø„£{>?íÈÌ£[?ÝdFRæ•ê?Û5%K¨¤ ?ß–aluv?ͬ‹³j¤ ?Ýg«jÊ?ÌX$fNX?œv„ëÂI ?ÒÓ¦{(è?ȽzÑx ?ÃÔªŒ1м?Öÿû~>p?×<\eö?Ѳzé놴?êíÓÁT8Y?íÁM¹Øi?íIÉJP+µ?ãˆ@ƒ¸ˆ“?ÏѾë˜?Ò1ôúùIâ?Ùæª-zh?Ê1ÊH%~ì?¯âFbÜà?àŸöðìx?Ú—|õ¶¹È?êAÏÅ`Á?ÛƒFWÌ?Û†(è™(L?ÜÉeî8„?ãÅå©6Ü‘?âYXm'Qk?ìŽ*¢?­÷?휸üÑÝ?ì#f€æ?ênB¾÷?çøxß?àÇòMh ?éû‡Zq‚"?ÓÚ¬æ°o?ìÜO´Á?×>´´Ãoø?ç¾ÝUh?íRµ™P´õ?ííO“»‰^?íˆm¨Ýº?Þ“ 4(òˆ?î\”ù=_?¬š£vpà?ÀŠÛ›?Ù¸Áp‰¢²?ìò(EÐQ?Tçô?ëÆ’ŸwáI?é”mØ_÷?Õ6WÊJ?àÁ*¹Ñ ?æî_3p?Ø÷8`ùM¦?ÃHdÐû\?®1:7NÐ?Ï“/°h?ÛÛ§åóš?Ô†šPé Z?Ñ¿ö=&?çãgŸTÔõ?ËZµˆ™E?éí„ò4?ØqY¨ÂÊ?è?îñBL¸?ïÂRLõ¹?ëº<­xù?ÔƒqnË‚r?ß5ì4µ˜˜?éIfѯ?Üåsû„2?Á(\ÁÖ°?ÒÝ­‹Á”?Èy€¾ ?»)_óœ0?Þ#~ÿ Œ?â¡€Ây?¼'y™¨?×çŸÇ&p?“ÌT³÷€?ÜÜÂAÞ8?ãÇ?hnOÇ?»»¸3w!h?îÝ+`ò?ÌÊÍ«‡Öþhøj|?í7ynš¸?Þ(Iu¼x?ÖIb?¶ ”Àû°?ÓQµM=á´?àÁè`}¿s?áéÎ`F9?åë±?`ÍÞ?æ£øOœÓ?ïîÀF=¼¬?ˉš/β?Ø6QmpnÄ?à*{ûߪÄ?áo…2 D?Þ¿¨cq?íÍëœóo)?ê¤p ,Ø?ëQ+%Di?ïT©ß?åïùZTÌ™?îfikbÛ?è'P&N¿à?ãP˜6Xì?Û+«5˜°z?é„.ã?è?ÜuÆ8‰Ä?ŽšÑûÀ?ÔŠi€ÐÒ’?ï,…mM-?âŽu‰ ’?È”h§i°H?î”KIcȱ?ѽl–J/°?Ù´á§û(º?î*/Òï?ç]ÒÍØwŽ?²5‡ä_©h?Í ÛIÇ$?æ Ér~ÁÑ?àߊØÖÿã?Ãû·qŸì?¾óÃê½z¸?àÐ+=@y?åaf¯–?æ^+0¾Ï?Ýqç÷V´?ÐÛq+±'ò?¾÷’ÌJ`Ð?×Ô|Hß?µ´6JxÖ¨?íCÞpuQ?ÍYW¨#½@Ä?Úv2W"÷ð?ë6…ý ”®?Ü/_ Jä?çjO½'ƒ?Ôµ.è¦ b?³Au«Ï»È?Ù àGi{’?á8QÉ-ä¦?É×}‡…à?啌´±?¿ü‚>7ùø?ÍŠfÒGoø?âÂÑ<öž?æ„ihIn?ï¡íÞ×nÁ?â»C¬òc ?äª P¶Ñç?â‰Côûù?ÏâšøCH¬?Ϥ²ºx?ê<Íg¬Ô?ÆäKüáð?Çg®’H?}¨ª\ù€?Þ¤ªÃ§+ð?Äye©UÀ?Ù;tÄR8?×ñHñIZ?Ø™˜öUYª?æ‡m‚:3 ?Ûx•둆Ú?èÁû°ÖF?¹'¡*©O?éo"Û2Ž?ênØ÷Œº?âèNÈMƆ?çr2x6?Âî|ÚŒ?ê±à†?»D¨ŽîÄ0?àhOƒÓìä?­Úpä0?êùÚμ\É?³d¦Säf ?årîð¶0?çc«õÂÓý?Ùfr˾ ø?Ó„T~H?ÌvÁF?ä*°dÅ?ǘ_Z_è?âȸÕwÎ?æ3úß?§?ÉB‚¸€?å€àÏÍâ?Ì®uÀÕ-Ô?ÈÆè »ÎÀ?äEµž8|½?äŸÙ=îæ…?¾÷~‚˜?íj¾ E~?¿¡×¥ÜØ?¼P¿ˆ¾à?µËÿ = h?â®cû‘?êy>¦ö¸¤?ÌE‰Ù†™¼?ÞûYìÆ?Ö›Žd?×B¬7Ò?çÍ£@`?â3ÚY¯?êfd&ØCX?Ý^­bQ~?ÙXtTêžž?ãOw¯Ö¸?ïÀöàD?Û²W+lB?˽Cƒzå?Ú›ð`°`?ºG§H?®äuD©Ã`?ã´ÀÙ€W?é›òsâ?îÇèpÄÇ?Ë—ï7P?ãWmçÏ)v?íY' ½ïW?苦‰ØŒS?áw‡¥};W?í:M6e‡?йêjã: ?ã^ÝÅžõG?ì˜;‰8­Q?Ì—ð†m$?Å#¢ qÌ?ÒºV¹šÖ?×53ð&rú?íO¯ÕÃe?Î,‰+„¼8?ä(¢>îUE?Ö#5‹þØš?â?Àô/Å?:´·‰€?¯FÕ; ?äiqi&Ï?ï8úE$?é:[Ð0?Ó[!Ôt?ϟͤ0åø?è-k%Ûh‘?Çå°ã ”?ïgÜ=Þ@!?â˜+QC%?ÀÉ ¨ 8,?ÀÖSe¯B¸?ÅûjjzÐ?Þ%¥Þ_þ?à+2…âÙÅ?ÜÜÎoÊÎ?ê›BO?î+; R’?å`[FØŠ?î8Ä3?° æ.h?Él·Ô´?è…rÉ­:G?×ôà›Žj?ït/ŒšåX?£b“Àº€?Õ Í)È2Ž?ÖLc+’?é$Zb}¥?Ãî½¥P\X?Åê߆ô]¼?ÉoGìp?ãùØÂ?Ÿ“…@?ÈdâŠ0?Òn°°¦?Æf‰¦ÅLØ?Øû¼3€:?Üï÷¥æF,?⸚¬k?ÁÜß jü¨?Ý9"lœ?ì(’dK÷—?çóÏ6±‰­?×/JòY‚?Ñ%kwb„à?`¡-p@?Ó¬(4¢Î?ãBd[Þôˆ?¿ˆÝ>X?ÜÅoëy`?ëV=éó1“?åÅç‰{?ßúX¦oÀ?бEU¬ 6?îXoS¼?é–pS¸L?íIë¡?âê;:È\·?ÝŒô³O€ò?Ü2"°YÂ?ç)ù÷k?ÇÓöÔ»Ì?ÙD;k|FZ?ê;Ëý“ „?íŃ%I?Å„{”ß ?ànŸ†u™W?éEYA~îF?ïà¿&‚?è“ û“!œ?êw‚WîÇLß?áe¿ †0?ܤeÛ à?Э?d¨ü„?ì¡È@%O¤?æ2¡œœø?¾ò½lRH?·2“¹ÒÙh?×ňmp?ì†~™ënì?Å«*ü?ç¶e?n²?º·’œI£H?çsI.ô^?ËÖl3?ت;ÚÂb?é5‘Ÿ¡@“?Ëš–'S#?¼bÖ7—”€?ÐJâÔ*¤>?ˆÉk<ô?‰ÛðÇÖ@?àÕkR¦?Ñàà`Þx¾?äsÕS¹à?¼I»žæt€?ê³²Q½¿¹?Þ'¡òÕgx?îʘäòY?ØÏkéÒœÔ?å¥ñ)Ѹf?â—âž¹‰ø?¬¸°ñÍà?⊜³ -W?ȳAÎ^ˆ?èà¦Õ”Ý?â#^;†Fs?ïÅGGžN?Ô·Œ‚ÊÊ?èŒu‘uà?ã%°­ºE?â»àÝÁ÷ê?ÑIˆL…Å"?±©E±ˆ?çž^6æg†?¬îF.+¾€?Òhé ßrð?»ð΃Tç€?ÀYŠãšd8?æxåÀ´?êκ“ñ¨g?Ù…hÊ"?Ñ´ ŸJ?»·ó]4€?ãI'û߯W?ÄÑâ~0ß ?ïøÔ3•„?ÁåÉQhd?æ9æòÁŒÔ?ØUž²K2ì?´%Ãï©`(?²¹Ä8•‰À?ퟢÏÓ?èé³…ƒ@*?×-Î]Œò4?èF“÷?Ýß„søž|?ÑJï'Þ?ØÂ;F‰q6?©”©ºèS°?Ô«RHºZ?Ô³‘4uØ?îû`P†?é&‡1 Ò°?Ö>ØUô.Ì?äC W|Ýæ?è¤3¿&W?³µØúN˜?×ûñ;Ìj(?ÝâóÅ)t ?é…¨¬ ?íÈ•¼uxA?ºãáË6Ð?ï’lìr:F?ëlQV¿à°?äI?:åFÝ?ãU¨ñéò?½jíuØ?²ÕóÛ ?á÷ÐÈU2?ã¸Q>Ë_ ?ⱚS"$?ïZ‰Ä²k?îÐÙÐ×?ØšoË2?íöqÇà?Çéuí± ?ãÕÜ$¸?Ñ>¬Œ‹ H?Ý8wÝ’?ºÞ‚ÀÌ]@?ÍÀ&sç›è?¤”ÒO{Õ?겟-ƒzi?Ý–ëë,q ?åûßI•ð??ªò0P?Ò'N·Ô…p?îàjÅ™Ôo\?àÞJ?Ƭ¼;ëŠ,?é±\Mèº?å³iÞR&?Ð-ÜcŠ ?Ó!”~>?qůZä€?äÏsKÞÐ?æþ‰"[G?×(ørzXø?΋â<Ì?ê¢ êI˜ì?ÚK¿!mh?áå†}ñ´W?í—ökp4ö?ãÕßéN½Ø?æñ` ¸Ñ?¿ÙG€ºø?ÒÔÈü܇d?ÝHÃa›]8?âÃÃ,°¼i?Ûv˾$1ô?ä5)(ºßì?ì^:% `?ÜÃfø?h8?Ï>=Ùp<ì?âÑLš® ?Átùžž¼?ÑÃîèô?Å÷.FòP?¨Ûà…ææp?çõÁÞâ ?êuœ_—Z9?â%¾*¦e?ÕÊ;3;`?éŒå³« ?Ñå9  þÊ?Á&£97¼?ÖWÀ4ô ¼?ã›Ü8þÔ?êr‹jä?æ´&ÙÏf?àgÓœÁ?ï0$(Ü?Ùˆ‘>Úó¶?ç‹…â”?èºö3‹¡ö?݇┗4?Å›‰bvr8?Ì E™a€d?¢N%‡D?Ù‘ý¦Ú¯8?èEù=ÄÅ?ÇÉߪÔÈ?é¶÷;?ä=Y.5?Öd¸Ž™Ž¢?Ï'Ÿ´WL?Æòe„åh?ã{4Uê|?é*Y¤)U?í{Æì2?íï "¶† ?Ñ·•Šm ?ÀŭªÈ?¾•ê\±ñð?ëQ3 þñ?åY:ëÁ7÷?Òç>üÞ`n?à`̽g?ë¼’. *|?¶ÁOMð?Ö™ˆ—fAˆ?ï4B<®o;?î”yú¨¡¥?ÐeImê Ò?Ýè&í¿çD?î¤]Ù’E?áÞQÿ^Ç?ÝÕçŠGŒ&?´?a‹÷Uh?¾ç™Þ1@?бæ·j”?ëד‘¦À?ƤM„Ù”?Áï~•?ÛÎÜܧ@ž?à+m±e-T?ÓJ½X—p?ãг¤Ù?ÚÚVÄ?îñIZ›B?×Nÿ²û.?î”JÐ" "?ØzçØ¥OF?əߴfD?Ñ€sâ¥#ø?Ñ~&³âÒ?µ÷×"ܧ?ä +’Nó?îü’Ã\o?ãö_þa?Õ¤ºµÈª?ËUo =¬°?ÕyƒËj?Ä}d¸ögø?Ü›¤{%¶®?Ô­‰jð2?êëbÑÿ¡?³ž´»?èÙ÷!L:?çÖÛéæ¡ ?ânU$&ca?âöÅp@ÈÄ?êݺÑ;?Òßv½>t?Ô¼¹Ê‡¤,?쀓þô†?Õ­.Í ¶F?à¤Ñà ?à™dF mA?È<›EaÆ?â€ðG?áyE=ns?ã(s¸  ?¿â~¯p? õS̳ä?âÈohØ?ÎMFÉÖ°?´s<ñþÀ?Ý_è”?Ê6„˜Ù–´?è‹«X+Pb?ÝÒÔX¨(?ÂÍ„L?쀄¬t*?î¶Ôƒ™?ã‹Þ— ù?ÓYp’eÅX?å­,'?ê6î– °?í«ê"Ó9~?ѵڤÕMZ?Ë"z‰,ËD?ªr—s^æ ?Ùª¾ ¨?àýHi™ºø?À[y?ÎHêÁ™`?ÚþØÜÖý’?â dÿ‰Hô?ÆçiXÆ ?ãúç /?ÚÄUHÂ%”?㮵Uf‚?ÝH H¤?åÈwC(?á ì]£?½Ö0×k °?×ï¡/löÄ?æ+ T?êËg6¥‡?ç­¶sø”?°i)k8?ÝÚÂ7,î?ìm ¡)so?Úh®ÝQp?Ò<ðuÌØ?ÒË€=ùm>?ŸZÝFî€?ç7™Õ-F?ç¹ìÊW·?â–—' Ó?â3­[ÖÚy?á”B!?é*ÎcK^¸?å—öð2á?ʉo ì¤ ?ëÀŒ_øåë?èÿ°‘‰€”?Þ¼ôçˆ2X?–ò»[c‚ ?ã;¢‚w÷Ž?Ä€T ÜÀ?î«9-à?è½Oc}\ü?Ò‡U³_:Ð?ÝûIÃ~EF?¶p«°0?ÜûȳùR?ÒXSBÏI?¾¥Xx ?ëç_{"z?á pFBć ?îÅó­Yh3?éÍ>Ø¿?×Pùft¦?ËG”>¦å|?ÓØƒ!J¸?ËJºîÓ4?í§v{ò?á.öR?ïÎWÚGáz?Ø›Q ² ?ÚònØrwÚ?Æd‹ìø?æux'²?Û¿åð:U?èSÝÏü+’?èI¼A¢ç?Úº"õ„íŒ?Œ¿ïFÀ?ÅÈþtø;¬?áæ 4¸?¢¿„|X¡ ?äô$saßÕ?É£ðŽÎ»l?ftÛÒÅÞ?݆6báŒ?Ï,sÈDƒ¼?æj’ \?çžÀ¨mÂR?àXAÄ;M?ã 5ù‹>ê?ÓíoúÂcb?Ú#ÔÒKÔ.?äjpÖÓ~=?é¾z¾&?âÄߦ| ~?¿is¹ø²(?¾æ6´Ï ?®ØaPDì?ì_øÞ:f?ÒQX5Ý›?À*÷ZÝH?îérgüß²?âTóÇóˆ?ãT`̱þ?ÕX3È ´?ãî–äûl?éå/ Û˜?à¬Ü½'^M?âÔ¿0$?ëEb!ñå? |û½?Ôj•œÈ”?æµ/ê?Ém»’8µ´?Óq–|r?>?¬‰…œ¹sp?6].?¹ì¹Šß`?ª\GyÍ?èÕ-?µ)Þ—¬è?ç~jr×’?îµñ•dÜR?Ñ|… ÌìJ?»Îp"ÀÀ?ÉbC¢rêˆ?ï˜9"…è?±6m‚ÅÒø?âÍ@5;?é¤ ŒmÏ?ìítvj?ìu$¬X?Ð`ãJé½?Ã{Ï.'ÔÔ?¥_¦Bq ?ï…eìuUt?Ú±^Wín¢?Û“ªÎæ?îî65æ2?åÿ²áå‘e?áp·Àü?¶…þÛÀ?0?å›Î" ³´?â¬zتÍ?ä‰G^È,“?ÛË^ð*6?Í»7‡Ïd¼?å ”l?În›2ªÀ?ìÀoÏóܽ?Ï;ðí˜8?ÕÚ|Ã(Í2?ê£UéíB?ËC&߸ŒŒ?çö •&ñÆ?íf/#Y£?ãOšºÃ>?æºC/èér?ÇÙ´ˆ+Û˜?¶(•kXV?êŒO+ô†?â2:¤wHf?ë)æ'„ÈÈ?Ó£Vê8G?Ô¥¼ˆP·ü?ê÷hFÜÚ–?ÆÎmÕø?×|e̵Ø?Öî¯õ?èö8YžyôD¦ä?ìÀl“Jlä?êKgР?ÛkvÃUÐ?à‚³Fìk?îPYg7?ë!Ìg¡y?鮆¿ÙQ?æ‚É@Å8?Ø"‘ÎÁá?èµ¢‹ÇÆ?È·(É?Øþß/#¾?è]_ÊD[ü?ìô= t0Ì?â[j&?ä:[â|?ÚxF  mx?ì n—è*ë?Ú_ã„nÙê?çœ6äZíÄ?½ õÕwñ?êõW¥Ò7j?äÐ;Ôƒ?–ó‹9šõ ?¨ð?=Å?ífoŠ?å¾eü?¡Ð ñeè°?èµl2Ü?îB™-ò ?´ª˜?è‰3 ø‘z?ßëií[6?êÈh(J¯*?îù¨v3?⣪FjF?Ìf"½<@?íÒzÃ(¿í?çôäæKV?ï>ß–,oÍ?}°V?³xá(ü|P?ÚðBäƒS†?Î38azt?ÛV°C?ÒNïJSVº?ì7aSOtÉ?Ä;Í?²–* vÈ?±Vž=¤*ð?ߥP'_0?ز×5èäª?ÙJH&Âî–?îTqÝX?á´x1°Ý?Ëès&V˜?Ú  øÃÚ?î;²—Ý ?Ácv–ÖT?ïÛœï#*?î|»‚×rT?îöÝÌà?æCyö¾?æxL^,©?é·œ˜ÔSz?ÝÑ<”jý?àà °1¯ª?ë}ùºŠ-ª?Æ\˜ï5¶€?éÙZ˜`o?Ë«©…<[d?å„0×îÍ?È[&ƒ†_ ?Ý<ä+·j?åXµä ¦Ó?ÖãùF?—ͳ« ?å "ú¥ÊÄ?âkÆ^^·?瞪Ùæõ?íƒÔ>?»eì%m}p?딯º¦ra?ÝÎè@Ñ£„?ä1Ç¥Dw?é~!1S{v?×óô+˜Žò?ì©“¾èÂ@?ÙNJöÔt?íöOX2?êÁÔO=?è,ÇØä ?çcñQ£ ð?ã°ÃénV±?Ó1ç¾ ò?ÑÇÜôC|?æ’€Û¸üa?êcOÁ F?ÓÁÈ剄v?Ó4ß «æ?ëÿót­¯~?áÉGd>ÌÆ?¼kðùvà?¾–ˆQ^ð?ê¡8·ØA¯?Ø÷¡˜k¤?ÙáŠÈ*ä?ص½n?ê Ûq@ ¸?èÀtÑæ£Ú?Û­MΗ°?ÂÔy7}°8?°Ù¾fäøx?á÷ëTÛþ?ãÛï+iv‹?é„fѤâ?éüI´"%?êá÷þ–BW?å”o€'±?í7Ó­ÆSä?ÚÛKÂ,?ÌS?®Øiì?Ë·YñP¾x?Þõ§­ `?æ…ì“Ï?Ó"Bu’"¸?½ºlìý`?瞎Íà?ÊÿÌlø„ü?ëÖ¡¬+·Y?í$TÚÕFq?äbnŠêèm?ê×–6:àI?å4’ß$”ê?Ôd6†L?¼YçŒÓH?ÞÇ"êÂ?ÜɆÈQ+j?ëý¦`Át?ì5Ÿ%íc'?âEÃwº’?ã4¼}”‚Q?àÄÌ‹OJë?ã¿ö7ÄWz?Ú׸~„º?Ø¿?ä½*’+?è Èû­=¯?æÆa]Å?áyÇj]0?å]‡Ÿ/B?䌔ù`??ïÁY_h• ?àÍÌÕàÏ?榺{à?ì/KÕ*{B?Ö¤²yŠD4?Ðh‚á8Z?äþŠ›?Àô.oâ—ð?Õ*Nš)H?àÖ-…¾k?êÆl5c &?áD1xô=Ü?Üy'ú{/Ê?å»î*PpO?º6h5Ëoð?Ë%ñv_§à?ÂeôwÑ„?Ë*OO…?ÚË?¼JÙ ?ß !ör?Ü3CˆJ8r?ìX½º´Ø?ìyLC¯É?Õ3–Vf÷š?¿}Þì‹á8?Ô¬Ê:—\Œ?é&Tm;f?ÞWÅk‹¦?Ô=óß$|ä?êà¤)Jú?å ­Ì¨Gq?¿wñbJ„p?ÙlV³Þ?æøíQ$…H?í W[eà?Ýyr5#=„?Ñk͘û¤?橬ßçHè?é>»N$0¡?ìïÜœîhá?ázÙ­¢þ?Ñ“#—lâ?ïWTþ¦Î?È´z‘›QÜ?ÎÝÇ¡ÓÛ?ј €ÉÌ?ç™ÿĵ?æ8÷¿Ë@?Ãeñ»¨?ÝGô(¬R?ìEy¶VØ?äÈq%‡X?â^ ñ8ä?Ïm"‹mà?çQåÈ)‚P?éâ¬e†?áT`zâV¾?ÂÒË:5t?ßsÜŒ?ÖI¥?[&?àÿbÎ ]?Ý^7ÑÑâ?íMBÝÖ*C?ÁÂ<•@¼?ãû ‘èQ?ã³+¸¥ø?Âû"Ù—?ïP{&âÍ|?ìÆÊ¯Ëæ?èM++pG?î£ôMÞ?æ#Lø¹öé?æ#õé-XŠ?ã³ÙåEÕ?å~ßJ?ä1U^p†·?â»™•±Ù?ÅWèžìK@?ÐA ÔX¬?Ò¹Hð?ä~?í¶YÓÂ>„?³p‚?¨y°sl?â7ÝùGá}?ÖAK®®*?ÔSOd2¦?ب+Ý5¶$?Üx@È®r?íçŽû­xÈ?ÍÑ,Cü?Ó¯pfóR?Øâv̉t?á‡adÿæ¸?î8'âGn?êjkH7J?nÕ Ô2Ñ?Øzþn*â?ã“'dë?èo‹Ø“ߨ?âTEÏlë?êšp‰ØU?èÈàÔK0?Ô1v=Œ´?פy1—?Þ†8ƒ0?´‰3ÓC?⯴øŸ ?ÝçÝS²›D?îXWßò*?Üé¦EìkÞ?Ú@döo¨?ÕO Œ³G¬?Õrƒ6Å?ßà–¶Z^"?Þ J9Ü?á°ŸôºU2?ì–Š³ÏÍQ?Øè@¶¶?áÄ}éûÍ?忽¤­?ßö &¨H?µ.ð^õP?Ñ3­”–êN?Á Œ›ƒô?íW¥‘€Ø2?ìâa:‹?ãÌIEA?Õ *‡…p?«Þ$¹Ç€?Ü#šŒ`Þ?Ö9žøWî"?ÌH Õ~Ç ?Ôø2[Ä ?ì˜À{µ?çÈç–º“ó?ìÈí'`?ì^Æãž4?ç³û!3?ç™­I÷µ?á/b,4?£s“,ê(P?ç”Käb?è¸÷Ïl#?Û€#OQö¬?ÈðâÿääÈ?Ð:Œ?ëdÁX­ûŠ?Ö4j顸?æ=ø˜ðÐ ?Õˆƒ‡~éÞ?èÙMZ+\?îÊŠSáž÷?‰ï÷b?ï’AHmp?èÉc ÿÑþ?ñœ$?¼JŸÂÀ?ÁQ*F“õÜ?Ùj5¢éH?á†è¨ìø·?Öñ•Ú#1>?ì—Âmˆ¶?ë ›(è×?âGéø%› ?ïˆ}dM"?å8Yc0YÖ?Þùƒ)0ÒZ?ϵ©ö·"?ßGž—ú?ä¬;,è,?ê`Â|6?Ö6;T8©v?ÛÆ©ž$eŒ?á2êFÿç?çîþÒR j?ÝZ½÷F?´?çdµ‚|¶^?Ä6FêßF$Ex?Å!¡›?Êô?Ô‘‰Í:T?ê¤_˜q±Þ?Ù^ÀXö¬?Á\sb¯µÌ?³÷Ê WÂØ?ænÝYøè?Ëöíh?ë3.¹\×?æ¥}`O(ç?·_£š?!8?î¹!R ?ïÛß-*©k?ä%jý^Ô"?Ú†0ˆ^ª2?á²E:‹?àOì@Y…?ÕB¼|ôÚn?Ø$j޽H?æ'áRgú?Ó(?ȇ#qdd?É:=f~nÌ?æÍ(ÏÃ…F?çîÊfº?ØíñµGGH? Ê¯TTn?ÆZéý”?îËËÞ¥?ê }¡Çå³?‘a•XÉM`?ïqØŒ] ?ßaÓ¸Š2?Ò‹Çù6?ÁÙÁÁ§¸˜?éÚ¼ÙÌM?Ò>ï—!|L?Ê•&ÀL.?îÝ•IWb§?ì„p›u½?éÀËW=Ê?Ñ,Åèò?œ^ÒuU,`?æ0s6ÂR?àØ–RßÙ=?Ô ¯"F?âԲΔ?×ÊO3?í}ºçÑ̯?äÈåú¥ó?ÉäÛ‘?¼,?ïx¢UmÛì?èLy}Û?ÃI™ªì‹ô?Í\ï$Ýì?â¬[€É&—?Þuçî?ã>· U?åþOA ç?ØéIEßl?Ýȸ[àuÀ?ÔI—:¬?ïY; ý ô?èk]÷ð¾›?¦·%ëš©p?×^èg†–?éðܬE¹B?îÚÄÒí¹?§Cù®%@ð?©nö¹)ûà?ïm¡È‰òô?ÊÑÓW°?îx¡·8ü?æ¶nkÙð?ÜÚ‡›´Ïú?éoMdw8˜?ÑAp(Ò~Ò?Ø$CE¬?êËCê¤ý?ÚÙÇVõª?ÚS!;öL?³d6r.X?Ð4%:…’p?áu§Ñ=¹?›´uC{|?¥Á¸²8?èñý“O^Y?èÀ3تtp?˜[8yìpÀ?á2w‘ßM?{Æz“Ç€?êxî¶›?ÜQ5vúO¤?Ú\ÁSäÈ>?â4>fá!#?Ó Çnªx\?ÔÉÁ€Á›¾?À‘áFÂH?낺¹j?íÎÌÐý~?Å{wï›O¼?æ.ßÚ//f?ê Å_ ?éœÁ½Ñ?åõ)až†ß?êÃçíÝ?ÖH/ê„@¢?²å³ôÈ?Ã/Ô>b—ð?ºëÏŽYP?æ‹âÓ—?í ôýS­?ÓŸ¬³s2ì?àÂÇ/vâˆ?ÆfLv?ÞÛÁõèô?îÔJÞò?ä×4pýæz?zÆ‘­ñ?áëk €»x?Șƒ€áð?âv¡þUw?ɨlüý€ø?ähK…b¿?×]Rˆºæ¬?Õvê³?ؽbG¶]º?å«Í X?Þûÿ6 N?±á˜(åˆð?âIÅfÎ8ø?Ö}­ÁçP?ÚF}Ttú?ãjÖV»?ëòô·Í?ä1¡­àn?Ö•ªv‡O´?çEfù–?Ûcþc cÌ?í]õ³äÜ?é ¬$1Dñ?À§™d£ø°?—±=‡§?§í^)×Ð?èïïïBÜ2?³‘Þmœˆ?Ò5øÕ£Ñ?⥹ª t×?Æ)"C!ýT?è²oŠö“?Ô¯ŒÕ\¶?ãT“Ÿ´?â=K++?ÄBÿ ·L?Ûï—3Lf>?Ô3r¦É®?æž[Å83?ï¿ø ì4Ú?å¼Õiîe?çJÖúGàÂ?Ý’lweÏT?ßït$d?ØÜO¤UsÜ?ï­Ç>›?ÐÉóJ?åìäìÃP?Õ:ŠÚ ¨?­y@È  ?èj›~æÀ?ŸAà …S ?ëÍËOèµ?Ù5Æ‹š?ì ‡—!?á¯ùš$ ?ítTn&¢ú?èt7jH$?èrÕÇ)û ?Õ;|ˆ¯-€?ì¾:sé²a?îüšëŸ?Ñê§—ÅÖP?ˆ¤Œº-ò?èPeúQÀ?ä9Vš V?ä.Yü¼G?ÛB8+'@?ê# ˜Ä?Ïе‰ò´D?Ùχ W X?ÑîÛÆ’¯ì?ë½/€ïÞ)?á7À4~?ía ’IB?ПûÑ-ª?éÂèÑ‹ä?íØäI»¼?ê|šæQ?èy K¶­?Õ¥)œ¾JÀ?ÂÔ@ä?Ñ£Ë3¤Ÿt?ÚP´žèRr?îø~°³O¢?à*k~ekh?Ó½Á6îö†?×%‚þIìV?ï ¶(þ§ï?áÔ‚.‡D?}épÈaÓ€?îØG§F?à_Ç Ñà[?ηE¢ Ü?ï }Kà½?Í PzÜÞÐ?ì‡oØõ?î*è€çT)?îüÍ!?è Ù¹é#?»v¾Írð?ê¤àu¾áb?è@¥ñDDè?æÚs|¶†"?Æv0“‰ÊÀ?À;³äÒa„?Ò#ËY6?æÔ¡ðㆠ?ê~±aªQ?Û]ÜR à?ï)bîê2^?ë'*+óÙ?åLÐjüŠ?Û’\lØ?ê=Õ‡¬ÞÒ?îêA°Ÿ/f?ï8ŠT+s?ëŽHVÖ ?Õ¸í%Z‘Æ?â×]Ý:Ô"?Ýu_›jTŠ?âý2‚YÔ?à{¹aA?ï§buät?Ù80ŸX¸2?Ög¸¬€Ô?ïž=:?¢.S ž ?¹]V‰—M`?íÊ,¤Æ*Þ?à·r€Œ‹i?×ÂjXŠYÞ?íp\€©3 ?èåð'®ž?€Ùßæ›À?ê›qyÒr?椻ނâ?ã*x@µrK?Ó f.2Û|?î>o³ßóñ?Ò¯ô*s¦–?Ø%Hi’DZ?æ%W:ÖËz?¥p}^LÐ?®æŒ4P7p?Û£ lIã?ÖÎ-Ý×ð?ê­{b#²Ø?åX©k/Å?Ê Ou\”ø?⌻ÕwÝ$?ïv2Ép&F?ÌIüHœ\?äª:j—?âE-mbÍ?Ìâ8˜x?í èfSTS?Öú=Ž?ÒŽ™é=°?í¨˜w“á ?ì ôáÿ0?ÕìÀ šŠ?e?×4Ž?Ñ0P(º ?àC =âÎ'?§É:Ò÷P?ß³aF&H&?¼G üËØ?êû>+ ?¢ŒÍtîP?ÎxÂö|?—Ðñ¯a`?çuÕ¤ÍÄü?×5ÚíõÂ?ßILXæÜ?êUÛÍFð?à”òÃ&?ã±ï-òù?ê*YÇ 6Ÿ?äܤÆOà”?åaOžÞ-›?ÆÛÒËÿêt?·õß7Ã`?âÛÈs\¿ˆ?ì6·*ÿ?ã6"°ÇC~?ìõþ.‘È(?ä6ðÎ|zN?Ãq{w,Œ?Ñ|èÌ.ò?æóH7:P?픜®eÌ?×Òêõž&?Ñ @ˆnnb?Çç…Ð%M\?á–¢fŒ,z?¾×žæ-@?ÓìÊÁF±°?Ö;ôí  ?èCôòKþm?醯yLŒÃ?ÉÑ<­˜Sà?â39t¥=i?Â.P?äÂjøQïá?„Ãg‚4X@?ï枉YÈ?ê 6Š›£?ëK€$)¹ã?Û’Q "qJ?å¶MlÏ?ËêÛ•“d?ëÉF§"®‰?Ç5€#þi8?ç-›ÜX?é³ó±Žü?ì•o´"ð?î„sŸxw‘?½ƒJ’Lˆ?„ÜTáñ?êЯaˆX?ÞadVÏO:?ŒtÅq÷\À?íC†ƒ£?γ Á´?é¸û#½8?Ö¥ªa*:~?ì„CßÝ?ë±¢‡Dó?ÕÞsù)¢?ÍÜš²²:(?Î"µ'ôÀ?ÚpsØð?ÒŽêæ?©hîî?âOÆŠ?ÖltQ‹‘&?êöÑ”ê?ç&6€|?ésŸÉv±?¦jÿ·€?Ù?NüªØ?á´æhÔ)?ÍQÊÓ]ø?î5Ÿy3âC?á$0:ütª?ŤҚï?êddu?æ¸Q~Ô?믨 >?£«&û ?‡ ²4 Q€?Ÿ7€¨ÚW@?æÚûh?íÌ©¹$è?ÞmT‹Rá¢?Öãà£6`?éx$¢ä?à‘¬œS¯¤?ãÚÈìç,®?…¹ä+}À?|ý 5þ?åW”iÇp9?èÞ;=àk?ã"jgy»ð?å‘'Dhÿ?°´à“§¼p?ÄIü‹N¯œ?ÚÛæ‘äÇÚ?æ5%v?ìçs¬ŽÃž?âôñÞ+ u?йÛÐE¨?ê4Nq‰ë?äélÞkW?вvÁ!'x?æÂÕD5Í?ÎàI(h?ïÑäc¨?Ô§§=ÂKv?êl>‰‡?ìuãkñÖµ?ÂóÙJg¨ ?Ê3ë/‚|?ÓûøJ`êò?ì"ÕÛø ?Ðö±%æ¼Î?¿èïY'Aà?æÈæ×ì?©|¼eÆÆ ?æØ1©Œn?×ól}d©@?徦]nÁˆ?×&£‘zæp?æÐÆ<Ç~þ?Ð寒ìÞ?ÒûH~6£î?îÑÓžÂA?Þž§²$ô?À~DS\,?ìË6¬/>Ú? "p^è?Ô2,?Ð8Vì8º€?ß;ò}'?½žX‹~u€?é6¬û4Âb?ë:$dÔûò?íÝvú%*O?ÙÛ£×c¶l?ã¼3[Ü?ïstkJ?æëvÿ@=?Ðy9ÞŠ?¤Wΰ{à?ÖøùËmˆ?ì_Ü‚n]]?î=³#h?Š,£Ê÷ÜÀ?¸• ræ°x?¯a‚ „+?»“š3Ü›¸?çwM~4~M?âï“‹øù(?Þ¶ªDÁª¼?á OýŽZU?á±L\EÌ?³0—åíÈ?Dzýá:øä?ãxÎC®iþ?îãÅ@>?ÞäóRÍxò?ëÖeø;Ñ?ä?£ph¤x?â}†7ÇZ?ÜHãao_€?å瀑ËÉ?æJ#ag)?ëA¾Fhõ’?ì!ÒögÞi?áL:&Òº?íp+:?Ë<¯ù'†p?Âjæ¤?ï·NX5¸ù?çEÅfØá?ìXhè€-}?ï8X…æ»?ëeï·)‘?à—÷èÁ™C?ÓSDº1[Ö?ÙÚÜŒs^–?ÚÿKB„?̳yKÿÄX?É7š—u?í “¨\í‚?ÚÊq7 ˜®?äAÔ¯O(i?ÑÑŒJô®æ?Ô½ ‘Ü¡„?±ü8;ÞÃP?î ú|é÷?àûU™  Ò?ÜE[IHÚ?Á7Âdz ?çK$ævâ ?ÃËVpKæ”?ßÄù0?Õ¡r€¤n?é’žëC?Ó*ôxØ?·ÚßUV&è?äþe—LÎ?Ó_ÖÉQ•ˆ?ÇŸdîƒøÌ?éóA×Ü€?èí5]?ëŽmO‚?î¥Q X?…åŠó-@?ê‹^ (t½?îˆô¨1?ߺÚÎ?åRÀ)!×?Üit$F°?ÜÞ?Wº?æòGnKÑÄ?í¬ º?ïtFÜo%!?×¹Î`ÕÃâ?ê<]Ë©(?îZf:3m?߃:+Ð?½ÖíJ¨H@?ÏJ&t¦Oü?Æ„½ªöð?è«ä›Öúf?Ätpìœ?¹àc€¾p?çƒÈæE­=?çîø¦!8?Ðìa·;l?àJ[àMœÚ?àr3…ô&?èvdÉç.?Ѭq±\‹Ô?蹓jO?Qþy|?ïskÓÁís?ØKlmç Ú?‘ èS8 ?ânÉ'é??ÖAô45r?ÍG?Èbâl2\?ÄX´ÊŒp?ÞãjÜ@ª¬?ç…§³KIœ?¡9#Ý[¦ ?ák±º#Ð?ÌÚ€ E?Óf#¶¨æ?ᯜ—ñÕ?æ[åšå­ñ?ÃäÌ„?çHpÞÑ'?Ôy¶\£G„?Ú»l7SóL?íXvªbè®?è®ÍÃŽ Æ?Þý° I?̆Ævò?ãUú¸´F?ÂÖØ-bD?ÓîS‹Ú:ê?æTÿÑ|'ò?ªèÅDG`?æ„'¢‰Ñ.?é Ô>²§Ô?ìïö\_º?à„†‰{:?Ù…ýwY?à=;M4÷?î…¶z?DÎ?Ä+!r¸?ä×*/ûa?æÏìºKÛ?àÄÅ,k¸?Ù[‡”åV ?Ò™ÌïÚ?ßÿºئ?è×ùb•Ä?°Ç.üÙ0?Ï9eÍyÏä?ïï i)z{?áÁk ³h@?éuHh=õb?Ëö‡›×òÐ?ÞH^!r¹?ËiÇÕH˜?èž ½FÅ9?Æì_!Fë€?á(JÂÙþ?å€sî¶½\?ÕíÅͼœ?¶8Epªt?ålMIá=?ÜxyI+à?ß±®ïæØ?íjüP¼?ÊŸ²%›ˆH?á:Þêº?çs[';Î?íνŒ ú9?ç&ƒòõø?çáPi¹r›?É\#‘°´?äŠ\KÕ…µ?Ö+˜ì×Ðü?å‡[˜?ÐW)Ó<?…tRjx@?ï>>ÿç߬?ëì?AšN-?ºSÕ•ì@?á7:Ï ˜?ÌzÆPˆCÄ?¬íÒ!¦P?ØTøcè?ä/×yÉE?ÎÊü´J ?èÙ³Š¼ýµ?àì }Æ?ÐçWf´†²?Ôº E&¬?çÙ#Ò ?Úreë_ã?íœfÝ3á?íôšÌü¸?î ²àNËû?êZ•Ã=]?îïA)·á?Ѱdr­Íj?Êeü¸Ü±À?î êpÓ?çÖk^?ÚsÓõ?áÇæ*.V?íÊSøê¡?é!fÍQq?áÀ!¶J±¥?ì”Oj —ê?Î)cA´?ÅG¾–Å&D?½Ò'ÜáÈ?ÕÜ: &4?ÄNìÓoe?é3©–úé0?Êèú 8Ô?Ñ9ª&&¶?爑›h- ?ìH‚öæQ?îF­”åÔ&?ëWŠÎ8t]?×§.Rôª?ïäN<¬.ë?çýÀl(òI?έS‘£D?Âu Mw·Ì?ét=j®üV?Ñô>'ø?è6)Û\Œ¢?ØÉ¸cR È?ìEÀR·ªk?Þ‘”M_)X?Ô4j„éÒø?îwÏÌ0·­?äm¿p3„k?ªÅv ŽÐ?àÌ2½ê=H?ã`Ïí ú?º³¡3áGð?稳Tz?íÿÓn\?ì#劮¿­?ïEÀNþÜ?â¨î"žÇ®?³UöWø?áxB•Ò é?é£vU“£?¥×âÞØà?è<ÞOR>?¶ž‡ºlD?×[c ¦˜?¢¦Ö±‘ ?ã³åFÞ`=?늳À$ ?çóÑÒmœ?äVMo3?Û™zÎîË¢?éÝÊ›—–?ÌìƒîÄ@?ëüKˆQî›?ç,^@#«?àƒæÁì¨?ê‹ßQ¬èÒ?åŠÜhŸ¨?¶H¨GoG?Ó¡:Òãc4?ê›,gÏ‚?¢3O?´Í)’Fì?Ô#&`9¾ò?ßoÇ\$?°u§# ?áUÞüvþ?ÝZÓÌÜ¢?ÕœÒM ¼?å “cR?é;¶ öª­?Ú–7:oø2?åú;Pm™“?ÆŸUTc)KJL?Ýrý-D?Õ'ÔÂP?ꡱdŠÉ?ÎðÞ`(?ãi*®[Ás?謖]Ëðè?°µæ³9§?é‰çÊò -?ºy0AM©è?îò{v?8?ÁK.<®žD?éÛ_XS0®?ëM±Ü,?Ù[÷_ê?·\|ÅeŒ?æ¹7¢òäV?î¢#Öõ|–?ëbø¤—?Ø];d?æÁÈMÒ?á—o/zÃ\?à¢Kµ§é½?åV@‘ßÚÜ?Ögh'¯+¤?îý‚ƒ<æw?׸äú-Z?í^¬»³•Q?ÛäÄE-È?× c·¨›ò?ÈǨ÷tçÌ?ëÿb+f›?Ç MÒˆ?ä.:I,*È?îô£”å=P?âñEß¼A?ÔäÅ´VW2?Ñ:«Éš6?êñéÜ+n?æÓ;ˆ ±?çæGŸ§0Œ?ÁqçQÔÜ?ÒýÎ?„8>?å´Œ–kÓ?æDšÞÑ1?é\‡ãß–ì?à+zÀeØ?Ť\ëbð?Ú@Ø]ô! ?ÔSû²€?æ¿‹ 18û?íokA»:'?åiúº1?ç9éæÎzå?À'–.?æH埢†?ä8­DáÓ?îç1!Î’1?Å]¸À%$?â¸Dšêäø?–|n©ëH?îñ#Õ}„Õ?ç4( e?‚šõ\À?ì]žè¼?ÊlpS§–¤?â©¡D"t?åŽó¶&?ÒG ®ïd?Þ=P÷aª|?Ã; ÞM+h?Í1–”Í}È?ïôÌSÖ|?ÂæêÐ ”?â@ÚɉÃ?ÅGМt?Ÿÿ*¬?ÑRËë ¢?事ó`?Û†„å¥&?¡ìC£†`?µÚ¼â8ÅÈ?„S˜@4?ï îß!þ?˜=CÂ`?¹ûár¾RÈ?àÏÕÖç?J³R´Ø?¾™l«2¨?ã8u÷_¬?ëIîhu¡›?ÓoÃÚ rò?‡ic›¼É?Ñ“M»O9Ô?ÝÚYPk\L?í½újr/?ê²Ïë¢]Â?Ä—Á”e°p?äÆR¼¯ù ?ÎÍÉþ¤?ÞõèÚ*d?ç“Öº~?äœun³ü?¶âÑM}˜?èYe1…ò%?îøÓùßòo?¥‰?Ï¢"€?ØS´º3/˜?çÈ)¾¨ãA?çÜÓI1œ?匕zùÔ?ãë€ì ü"?æ1œñnø?ÙX§lu^?ØC³°4É?ã×Üoe*?ä“Ú‰UÉ?åê$ŽÌI?Çxì=¡ó,?³½z¸S ø?å€ÌW¤Ÿ?äG7Ò#U?æ¾ì·ií?ä5CýN$?îƒC­”q?Ò;´!âF?›~Õŵ?èÞþ#«óÑ?æ¶ÿ“‰Ò?Ш|M(?ß(@Ãì?ÄR†)ØÉ?æ§°ÎØ?Ì´á_Z;Ð?纞LÑ@³?îb‘Éa½H?Ò«ÖL?Þúä ×Õr?åe—0žÔy?î˲ú%?Ò»žRokX?À6¿”ÂñŒ?Ê(ÿQxè?ÖèþI+g?ÝÀ†‹Mª¢?Ã$®’ª‘$?®¨=^ñ ?ѩᙢ¼’?Õe#Ù²­?ŸŸüËFŠ@?Ÿ2ØR£±À?ß}»yÛ^?Ü5öi7ü?ÈøâNÁŒ?ï4ãÝ}«?îm\^q?àd @H³?É“¤6gp€?áÎC´Ëd?Áw üK=à?¬ ÷*ÉZ0?ïxNìˆ?ì ”#üå?ÂÀ@ÁJ˜?´SÚîwøà?íãr5bH1?è”K]Ò?ä®ÀÚaƒA?ê9)h–ë?ïw —¶ ?Ò/Å\fHZ?“)'Ÿ>P@?ÆŽmtƒ¦¼?é÷å]&¬æ?ؤ¾Ž‡?ÔéÄ^}À¢?ËBƤ÷˜?àÛžat?Ù8>õæJL?ÚÔª?Áò?È|%dɈ?âýðÄ}þ?é f–}š?á@”]…y­?é&É€…8?èëkTe¡?ÉÍáÀak4?éÕ{ÞúÊ3?àÝ~<Åï‰?ß"¦×î¼?ÈKXý¦Áx?é¯ÿÉ„«[?–›´F–à?à ýˆ‰?㌦˜Ž?£ó'Ä.¢À?ÃLîLëp?ãPûúù ?á5áÑì8?èŠ#/_?Þž*³ýÁú?Ñdר*fÎ?©Å¨ssbp?åøOT1S?âØkmåï?ï±O>ZÛ?Ñ*å(ÕF0?׆3¯­7P?±þFŽ3>ð?–€2EW…@?éÜȵß*á?ä¦Éÿö¹›?íÑÓ†Ö÷?ÃZ”I?ï6Ðq®¾?Ö› ©éò?æ9„¯Ú€?æÒ”íZ ?Ù%å0ü?íh¢ìû?ìš“S‚?îq2©ã ?Ù·@Ó \L?êÕ£ô?ÕzÚÄÊ?êx¸º£ ?î_ÆS«¸œ?à·w!LJi?ãàI˜QÞ?è¶IŠ1ø?ÖÈllo>?äo‰™º&l?ã`tJPdæ?°Æ–VCs8?²âH€Ýž(?çXjJû‹?¸»é:GÉ?Ü~6Üô±Ú?Òõ`tD?Þ9¯ëc¤?äãör?Áø^ÆÆ ?ÀEs0¨nì?±Jóh6?ìüûEêN?çöEáäî?Þ·'ž:–î?Ü–˜³-ÿ´?ξ5õ ?åu34…- ?×vç%ÓÔ?¥¶ˆÿ?VÌò¥,?ì{õ óÙ?ÁšÜ%_¢D?ç‘f-× ®?âZ–þ\ÉÚ?É× g$?²yAË¿Wà?ä]<#1[˜?ïBØwËÀÁ?îÃõB‡Y•?êX ‹ ìä"?¹^Évç9˜?í¡¤bžÝ ?ß&ú–Æ?çN9?ÀÄI?Ø] `1?êÀ«¶$?ÏYdÿ?WdñÓ$?ÞmÒÊ'Mn?äø~¹2?ào4ìòü?¢ÿñÌË‚À?äà JQ? ã`½á?ã—©h07?¾¤ˆzñªð?±´#ÃÛh?Âs´oõ¨?ïÓó`L`?é¡!É›»?ßàbƒ.Ð?ÝQW,—è?€¡›?áßœõ™?ëR’˲ñ×?½½ø§‹?ã=Wüz9?‹%N¢„?Û‘šíWZ?äqnMy?ãåŽííÉ?é9Ã5?î¼ÇàÖ»?͈·&ä?ïÍLqˆ¿?æ{9½’,,?Ðw ,õxl?ßHcŠ’Ò(?åõéU-:Å?ìÖ\ô¡)‚?×p†¶òÌ?Ô¨_(ý¸?»—Ô™pA?àÊ‘Èëî?æ üÇñ&Ó?Öœ“—Ìú?펱‹ ?äëÛß· ?×ÉR>‡n?»Zõ{¡À?×EK)ž´Ø?Ã÷ŸY‘Nˆ?Å!w[â@?çY¾à„H?ÄË3U•G ?æœHŽ=Ÿ‹?â@uMß –?’­ùÏ$  ?îARÚÑ¥?ÅÓ¢,šä?ï"Ô†ŒW?ѳ|ùØF?æ yœÛñ»?àÑØ§·`„?êo‹*ëB?ã%•о®?ÛñþL$?Õ^y’¶1¶?¯¸ à?Àb`Ö¼ è?ë"Û‰Kk?æF«Þªì´?»£"OHð?Þ+‰A€þ?Ó%Ú>ÔŠ?á ljù¥€?×ížòÖ`à?샻[u1ä?éš‚tCZŒ?Ð îËßÀ?åþ±ÚuÕ?ã•l!@c?èäY× mM?«e¦Ow¶Ð?Æ¢ƒiVà?©>?J3?æÚ†¼z?Þ,¹ò«£Þ?ÞÈA{ £*?ï Õ?áì¡“?áh]#E´y?鮥ʲØ?Ù0™¬À’?Ùzóçš8.?êý« ˜†?À°Jc-p?á'¢rÎbå?Ëyzƒæ0?Ë)öÅôIØ?æ„ÖüHï?åÞêïU€Ì?è17’3Ê?ê"HHêô?Á™°„h‚°?·Ž¹{V@?îíA ”^9?åИ}é@+?ÙM%‘F¶?Ùˆ;ûaít?ã—¦ÖB€;?è@û׿Ó?å€ÚféÙî?Ñ9Hû>®?Ï;‹%%8?æþF‡]h?µ0¦Õ_Ö?é#½‘HÞ?ÂK7Ð?Û;v§uØéBÄ#X?ïK˜wÞ?Òv ¨Ä?èÿ#´̃?Ûgˆ÷øj?¦Ã›VYp?烧.H×?í¯ßÖÌJ?âÂf_hƒ?ê-"~H?ÚÊ(ao0?î€õ¯)‡b?ä$nÀï¯b?ØT˜Ñ.?Ùxªœ›On?âj9`ž°5?¿žÚìݘ?â‰[)K'z?ÏyWÔŒ?°Ž€ÕVY˜?½‘|˜?ÖØÂ˜?âÕ­Ï)­£?èÔ 45‰ ?ç»K쯹?Ó¤³íú?äño-Õ•I?çÅÄ·üš?Ãuñëì?ÛØØ…Z£Ò?î“¢ŽìÂ^?åòã¼zÁt?æêm·¯5;?ß¾v>ʈ?ã-å æÕW?Þ>h¯)8?çÉÁÝ<‹â?âcº×Hþ?ç½ÓeMà?Úc—¼WÆ>?â*C®«¥o?ÖE d÷O?äˆÜè­ÿw?âêZ™³W?ä¬Z«ÏEî?v¦bò€?ÑBkÿÝ2?Ü öV½à?ç˜y¸`…m?ëX~òb?â&à1àð?èQAë­ä?áü±n?ØÏ(†Ð±l?Ë2OeCL?±è3‚ÌB?Óì¾/êmt?ÕfÉ"ÜŒ?ãVÐÂ@ ?Óì›sÀY’?ãHñ¦7]?è?¿‚ž)¦?ámN”^¢?Öb°ÍBu?í»3r|Ë}?ã¹ËdV/?¾Ói¥h ¨?¿û-„÷ŒØ?Ñ5õD©?éë©H¡Ô]?Èŧ!QÃT?îap¼B?¯#î|O˜?ï'Ÿóà?¾CÅxðÀ ?Ö3Ü–ê&h?ê&×è››?Ë"îƒ&œ?íÝl„úõ?ªÄ+‹À?×.[äì¶?ÐfñÜ@?æ“élÖþè?ç—wæ?Êp@„úÛ ?†*¢´žçÀ?ï™æ‰.9Õ?¢g§q¼Sp?æ¤Lã,d[?æ ärðW?å•-iŠ?íÃȼïs?µB>«mª˜?ªã+jßAà?æNîžÏNÌ?Ó7ݰâÊ?ès_“¥?ħÅã½û´?å«íJeø?À‹{ÞÏNŒ?ëÙüCè?ÜS‰o òP?åŠ ï|~Í?—˜Š¿»÷à?Ñ8°’²?Ñ%Mìd? ÕZ?Às`á?îh¯(Erµ?Á·­Ú›?î`š&Bð^?çyÙŸó=?çÄ ®?w\?áõµýßÉ?î5UùŸXí?мCÆL?Øò öG@H?íÚåISŸ…?è0å¦L?ëC[&Ïü?ç¡)yFG?ë8œÝ¤¸{?ìf‡L¹ôU?ãòœÿo±r?Ó>Ÿ©¼Ýª?Ûõµ’È.?²šuÜÍÀ?Ý€2“DÈ?Å}Mfdt?ì_¡¿úôR?à+èÌ\·T?èKX­~©?áýó‘ÓÁ—?²xÂgß ˜?æ‹yd¿F?ê=˜™KŽ!?à•ÃwøCÇ?¼ËTé½@?ì'[Q?é­õ@µ?ŽØØdÚx€?±ÊádþH?½{°¬Y(?·*P8˜H?àWŲ2#-?å;6õF¦?Öˆ¦ž†IV?îš=¹Ã‰?áá¼_s0/?™â…H¯—@?íÐÌ H/³?ÂUKÛK{®\bž?ç¦-͇?æ®fœ°Gë?ÜÛ¾©Ùh?ê®XÁœÍ?ê]–C.@?án{ßè¡?×±s®c¢?×£)ãÕ¥¦?æ1ò•²÷?º :4³`?áà+fš?èDώי?èè@ó!eÞ?©Ùg”‰v°?áÃ}²«?â†[Û–v?Ð¥™(Ó˜?ÍöIGâÃX?ç»1éjy?ç¶Ií?ìòë0lK?Ö ƒ>Qý?Õ®ÚÁTÁ^?ÊmPyœP?Ücm1ZT?ê)NX³û}?§Tb²* ?êçÝ (0?áªwˆ·(?ܪgQ6~?èþ6ù«{’?Ìþµ¹3bx?éù#¥žp½?鈋‡?é)½~… ?ëò9¸»þ:?çVûÿÙS@?¬Çéó9Äà?È ³µ¬?í²®=ìS%?×-˦™Åæ?ê²{žIY?ã=&,“÷¯?×änm<)˜?ç‘ùR!`?åù/„ I?ÑXiÛ$?í¬íW/vŒ?Üsº¢úöü?„\es¼?çí&; ú?Ä€íD`Ó`?åRG–âà?æÿÄç6?å5”?àM¿?ä W—lÄ?îB#™(«ì?ÒÉ-¶Ûª?’‡¶µb`?íg]ªH7ž?¢´8T£É?â™´”°b?ÏÛÈAò{ä?ïÊh¢A+?³4¶ß‹¨?â%ŸfÕ?ë)С:i?Ò%WÅŠ?½1_.¼­ø?ë}§lŸ/?Ú$mNd¸Â?è”r{¨è?ëÆwM ?á×çàãÌ?è¶Ö…ºB?º~ª²šX?è>Ö&o€‡?ÉwW5“V|?2.Œ¦Ñ@?çˆP”eÖB?àà„T™Œ?Îb‰4¸Ûü?ë󊵺Ér?ÕÛÍ×5Ò?ëÈÁf“?ÖØ§Zø?±û{½ÂȨ?y\å“n=€?î%G''?׸DkÑŸZ?å«¡Rá™?Ó¤T¤‘¼?ãfx̦í?ÄŸ Óuî?áSæ]³!Á?á4´.;’?èaoYÔ¨?âR%m°zù?é@0Ä{n²?ÛŠ[e[â?³?4F¨?ã & £Ó?Ñà4\Öɦ?×Íã;Z÷˜?ÜŒI”?tÀ?åÏöâw#?àHÆêq>t?Òðˆ×;ù?ß ±ÀBEl?Ê(!…„?ã<42bŒ?¬Œ$©„§?áä¶©‡Üû?èÀÝ ?É —àž ?Ù¢9ô<º?é %bWH?Ür¸ßÔ³¼?Ä·Í ÿP?Å)C·jt?àÖ^Pû¦?æû…ô¥?Ø‚ 4D?Ý=ð¯=æÐ?ÂÉ1z’P?è7´`Ÿ é?”ÏÂ?’}@?ä–{›ÓwK?ØÒc ‚ê?áXÅ X¢?À ³ åYx?Ô\õ%A–ø?´©¹)WYð?ílp¬?Dª?êa,½|1x?íàuz›¢ø?Ð}L'ê?ä‘Óy–Ÿ?¶Ëó[¯¸?Fp0…ò ?äf|7¨*G?ì›ÜRÕ¼?Ñé€ÅA4?Õ(LÞø?ë|óÍà?ÇNc5˜#,?êe¼g›?ÁœTá‹éÄ?ݼ˜|FH ?á?,ø’óõ?Çw¯ûDÔ˜?« ØíOì€?ì)ð Ù.ª?ϰX~Xø?ÙQÂÔð®’?î—æW=$:?؉V¡|Z?Í?õ¨8?jü ²ÍÉ?ìõg,«À!?ídi^Mš?Ø¢ 9‘QŽ?ÇIô{åÞÄ?Ñ£ˆ¿Ø‘þ?Ø;wù")4?á¬Vê=w?ëÙªº1£?ß\.$¼?¶Z+Ó•§?ÍÁ@úÓÀ?ãðIð‰¬?د,enÌ?ÅLé[@?°¾’yë’È?Ý/æ#P;P?ææ‘a~Bj?ëŠUÝ^„L?»š¡‚úÚ?Ô¸úä7í¤?àHØv*šç?¬ €ˆ°?¹dS8è ?ÒëB]n?æ§ýê%¿b?ïÚŠ»wGl?¸¸ n6(?Â5gdø?äzTeqn?ëvj/uè?é¾282áÎ?zÇŒ÷C?íÀƒús?¹—9A ?à1òâ;ßæ?柱¶à?ác+ÕÙ†U?â+õY¾?ç4ñØZ¶?Úܔ٠î?àMrÀ•?ÛØ\áoP?Ócòãê–?âR­‹”ÿ?êãÀ€Ýâ?î˜=5J&?Úä0XÌÉz?ßûÞz^ïÖ?ÓcH}»r?ÞY݆Ö\?Ü"°®U:?Ü©‡Xœÿ`?äÁVØÄB¨?£®Œ~…GÐ?ʨ@~e?Öo2”ÝÆ&?â¶ÿ""µâ?àB¡a?ævƒB‹?Ñ¡²Öˆ…J?è5¾þÚ¬?Úë/&? ƒ¾D@?ÚzøT$l?ë›/i/ã@?à_U^¯ò-?Üøê¤]N?äŠL¾4?åû˜»¨-Q?îèj`ÓØ?ÂÙÈ$ó=?Ö°u=bµ†?ãŸÞŽŸ?ÒfÃ"¢‚®?Üâ¤t3|’?È([?Ù%7˜jBÂ?ç6UpßR“?Û1Ž™Ò?ߺ{;Éî?âÇì–$È?àÑê¬ËºE?ÔJÂ*„:?àkENqQ€?ßÝØÅ4ââ?Û[YÒAþ?»/ ’X8?¶.®êëè?Ä£¦ëap?éíTåÎï?ìêzÛ})?åZiÊxOÕ?ʽÞT}Œ?¹æN¹¡AH?Ü1 å(Èr?Í(Y'y?ݪzÊ P ?ÉWÅ–Wd?é)îaÌ`z?Ùßk4ò?ì¨ÊýŽzf?è¶G}þb?Íhg7* ?Ñá#߀î ?á:ÛÊRû5?Òž®œàÃD?è®!ÿª9$?|j6¨€?ãŸÌ¦‹Ž?âZð¢æ«?ëíéÎB9³?×Gj™±Ô?»9´¿C0?ÛqL°ÄD?šä!Êá´€?âÚÙlõµû?ÜÀÄ|®úÂ?àãÝ«Šz]?Ê»òÒX ?íº]™ Ú?ï/xï&z7?ïjúçcX?Ç­7Vç_?Ö4ù™ŸV?Ô|oß9Y>?â÷Fø4šï?él'Z2ÿ™?â9Á4(?à¸Jìmzb?É<øûa´?ÖM¿%?ÀRîÞ"ú?ÖŽ´«lŽ?º‚ÂÎx8?Þ…ËŒ?Õëç…æ¦F?Æ©¸y Ð?»xdx?ç@þkŽ?äËÉ£²~?èþBJz½ ?â8Šš¶?µhDv5 ?í#ú—bh?ìð©âðÃ'?à‚ê3[€n?å) \Êa§?Þ®äçXïä?عuJ”?ík(ðVB?Û~мHÐ?ìfA’Bï¯?Õc42n?ãBç¡{?šº=t´`?áÈfe]Œ†?Ô’¹½˜,?ëÕ×tUb?é#ûeâC?Ã1™ÌX‡ø?èAî}}?å™\;¹Ô?ÙÌä>vâ?éTß,°z?ÅÙòK*D?éBúVñù?b ÅÒí?Èïö „(8?á¦À°Ž:÷?ÛvK#5z?ëI4¢ÓP“?Ø…ž²¨?é\)ª*Aè?ÙCáó8`?ÕOCgÂö?è:IRát¹?ÖE»°ãè^?ãìnê¾{²?Ýð‘Ñgb?ÓÍÆ ý?çúz±‰Ò?îƒìH$]¹?š±÷‡º ?骖ŽÍ8C?ì÷T¼¸g?á[ƒÁ:zt?뇤V°:È?Þõ¸üpÂJ?âî‚Ïñå}?»¼>/!x?Àu™<íL?ìuÀ½LŸd?À0o=A"?ÆrKU–1Ì?æ{ÌK¬>E?ÒºWô,?çÂE‚)3÷?ÚÙeFŸ ?èñ&;jÉ?áÀðάyn?é"°˜2o@?ÄœÉø-Gd?¶G,/ýø?Ðy—:1’ð?º¤aX·˜h?çyJ×Ãv?æ8a4:K·?ï/ˆ"ò?äæÄ+¡,?¶ÇäÒ‰¦ ?Ùûf>ö€Ž?âIDöõ¯q?ÌͤeÒšŒ?ë“Õ-“Àª?Ñø¨UŒF´?בÅJ?æÍ໨*y?µ‹1´0V?ȶ¾7¦ˆD?Æö¡åÀ¹ä?ê³ ÓÜmO?×õŽq†V?ØrÄÈð2?îëQ\Eï?îv…Å,;?àßG:âwT?ãŠN“2’?å®Kšø?à¡9oüV?”1È D)€?×ùgÿ Ùz?åÌÆ×ÕŒ?ë0î$ÙAÁ?Ó¾“9‘ù˜?îo„t;À?µéjRã•À?º™æÞ?¾¸?⛕)Ô%?ÔПNÔX?êôesÀÆ?Ô-¯V¿ª?ã‚’àºW?ßs‡¢bC$?åÄ ¼$?Ãï÷œ!¦?â`;oOÊ ?éÍy¦0Á?߀'Iã¦N?ä®xŠó¨y?Îæ·or¼?抱!± ?ä æjJ{?³— Ê¿„ ?·U4U34 ?ïòÏ ÷ÝE?áç çØ†?º«îô©Öè?ïi¤ ÊÓX?âë{&p¡Ö?ѧ W™t?æ]ÎÎE—P?æcc§&Ã?Ð#­t§zp?ጚq¯ü­?ѯqï©+"?³k>höÈ?³[?É ¦à?¹ —HχÈ?ç‚>ß´›?ééò>F ?èT2q«Âz?¿Æ¸~ŽyÀ?æ¤ís¿.¿?嶸í¿?çà„ÅX?ß|«¹Ï°(?ÊS‘Ò üŒ?à«Ü½´@ú?îûû.ÙȲ?¯ó {÷?ç?-õ†Î?æü<ñÓ7?âdáek}Î?ã,ÆZÎ_?Ã]cªC+?ŸæŒW ™ ?ç¦vXr)?ëEÀö˜J?ÙÆ¢ømù&?éAÞ»oV-?ãÆ±‡Ø5=?ØŽ½£cX?à'2yo Õ?Ú§– Ø?Ø•þa F?ì“uEg ?Ó¿Sš`âÞ?Ü“•/tê?¬óO?Ç 4€é#,?á—NWèÎ_?ç}©ïÒ#„?ÄåG­Å.´?è@UºÂ?Ýq¸È雘?Ú…€Ô\?îáu61?ÓæÖǘ_ª?Ö Dž*?Æþ+(¹Ø?è– Ô¯Ó?áÍÓ–?rT|¼‰?È­QÃ@?ÍÆÇßß?ëÕu-Œ?ГôîEnZ?Ô„K°³2?ìM+ý¤Ý?âóÔ5D?ä¸ y ã„?ÝÏ÷ýY?깡Rx,?ëźµ?ÚPöPßsx?±Í¯âe»h?à 78H ?ãF1T¶Ï?áë;óQ˜½?ÔĽŽA)*?ïvÐ*î?àä®Å/ÂQ?éw ·@tþ?â†?’¬?Þ†¹jºŽ?êRÁ^ÑÞü?ÕPÕ(‹q¸?è£T±ÊÓ?Æ·Oî´?é"ÊðÚGô?à"z½Ë ?èâžà¸4?ç"¼-96¬?NU‰ÏrÀ?¹C ®… p?ë‡Ác r?åÕM´x¡?·UÒ,ŸX(?Ðoêz?ÚÚ ›?Û޺Β?Á`Ôu¯È¤?ïdî¼CG ?ç@þïã?Âoïg¤?ãªóE?Ͳš×G0?âðØK´Ó?ÄEpÍîÀ?ïbÛqTŠN?蓮²šm?ßðõ ¨³Ú?ëÊm‡ºH…?™”zVƒH@?χñR{‘0?ïæ»gÍ€?Ñ3wî^„?Úð ´“*?¶‚³ÎYˆ?âSúBÞ?Û¥»ùuéú?æ2êÑ?áìw*Ý"q?à%k³Fà?Òæ,g›"¶?áQšª ?áìqRå?⋺Jhûm?è¯úĤA‹?®ZoBÓ ?ÓBþRyÃŽ?àQÂNnŠ3?¿s§"«?æßè²–D?Ç´`<•ä?ç2ú<?¥(,jŸF°?å’êô-”Ï?ÚwX—ó=þ?´+ú¼ó˜è?Ø ò"Ù|?íP…œ‚£?Îʵnqð?ì¤*˜Í-uÈ®?䜪5Ÿì?§D«3Ã%`?íü·T¢–j?æíœ“^ãÊ?ÅØòáUp¼?µ§¹æ›X?Ðaè·eã>?ëä¦Ïb?ìªQÌO6?âGBã|Å(?ÇÍX‘±$$?ÎÓ®ÞOØ?ÞDo܆ú?ÍhÇLŠwl?ë¨Y8j"?æ-焯é?êXÃ)!Ðq?Òl¼j¿&?â5——ž?å’Wïð1d?éâÁ°jú`?à)¬TÐ×?ÚeÊh½ö?¨,™©2®p?Ücòÿ×gÜ?Ø "cžÒF?ájqt÷³?îè#HP?䆄Ùĉ?§óéÚüeà?’ÑxòI¢€?Àq¡P¼¦È?Ò®'ðyib?¹Î¾¶º4(?íɬã Q?ä^ûËSå?ëÅ>Є–R?â× ×ì?ë2ýdÅ r?ÍôƒH?庖Âð?ÓÉ™ÕJ>?ìÌîCqÊÉ?Ê)”{|q”?³TߤÈÈ?â—H~Ze?Ì>a N—ä?ÊöÐy “$?à*ê¯öá?ígTû%?êÜÈ?ë8lHq?䯄 EŽ?ácÉ){B?ÝÕôŸ±?†·"gq@?àÿJ«a¹¾?¹Ê¯ RXè?ëér€ùt?Ñ×BŽ%¼È?êý!ÄKˆ]?âxèJ7–?é€9ÒB?Þu5?qû^?¦TÂú* à?´æJ”s»ø?åçRêëÊ?É؈ž¸?ï­$Å ?í „ŠÚ/O?æ@>ÜU^?áfÂÈ‚?àó“Z’u6?ÉHº&0?íè#‚ªÊ ?àgXGŠ!?áÐÕEi³7?‚’®Á»g?ÖªôFSp?ÚáóõgH:?ÔìcwT?é–䔯QÄ?ØÝ1Ív?îô½¸çæ]?Ð`ËWw0?åIšŽH7?ÙçHqª?è"uè#+×?¾bØïvºX?ØÎE³†?â/×sͯ?Ò[6Aa=?ÂT-BœCx?Lj5Ñý ?Ÿg•ˆÂÜ ?ÜxO{œ?érúìßeÎ?îí€4ý³?Í3PÒÁ•´?ä;6”1@à?ë!XÁ‘š1?Ñÿ­‹$ Â?áÅ©û¡0?æ/£Åé?ìJrWWB?ãÝökˆuC?ê2±tEFÜ?Ã+ßV7?Ö”C‚¤AÚ?æJlQV?àÚgÀäÆ?ÖMTÃ-½ž?¸7¹ï¨p?¶) »ýý(?á—È?êœtcc?×JÅ#H?Åô´+4}l?é¶ $S´?ßär´`?Ñáw€åÔ¤?èKØtV'y?Þ¬uãuwD?Ø%ÝÉ¥?êE7”]ÉB?éÜÓµÆÏ?ço¥¿9{?ªãÚÀ‰¼ ?ÍÇH=Q€?¸íhh?ævÏû^¹?îù%g—Ž?îlŠš€ÚT?æq{‘ÓÎ;?о{Þ‚ø\?´¾gc‰k?àÛû5Æÿ?Ö=×T~?ÓûiM?0Â?Þ`$Âä¨?çÛÖ~Æ=?ßìW¾=×2?±Ê¤6D»ˆ?ìAëT3•Š?Å•C@|?Ó{©yc;Ø?ÈéJ“÷âP?æn^ëÞ×Õ?ì3œÂ(?éèŠq®v?ÖÝ1šL_æ?³•ÕW˜?îó"°Ÿò?າáû±?å"‘Œ‡½?ë`‘TK›?ÎûA¨cÎä?Ñ5ºsp?ᙾXžbÞ?ÌiþL?ï._r˜\?èpBÔà?ÝäþòÖ'0?Ù@Ñž{?×?]©" ?Ÿ Ps@?äJÍ?çÐ|rÊ“?ËA¡g¯Ô?àÅJ FT(?¿Î÷”ª?åÎÑ%Jå½?«’,¶Rƒ0?êÏ#ŠB•?í"ð«M¥)?íœ;8‘dÉ?ï!Ó­ˆ 1?ÑQ?Ê•·‡ü¸X?âÑ?@Ë3Ñ?è™[ô’Ð~?·'o´¼§è?ë<#ÃdÕA?Ø%kÔHÚ?ë¯å7êé?ìDkУ|?Ûç1-%B?æOIš—m?ÃDÊ‘˜ÌH?ÂË]•Ì?Ë]¹øBp?áÿ)?°L@?ÉÓ­Á‰8?ãïm´V&?Üîâä®Ú?ætŸ”hrÐ?¸Ù{dÙ'h?áæ„|Ñ&?éÖk; àñ?ÇŠ‰ L|?ë‹‘ã%ü?Æ3óÃh?îÂÄ?\@Æ?ë?Z)›å?ÛGkÊ?ÚÁ}É<¼?è~+Ó6nv?ï<ò³-°Ã?åÌ¢ Q?Ü…®Ù€lä?åÈ ‡?Ö"±q\\?æà*q}#Ñ?èÏ(†…H?á§mÌÃR?â„”p69ú?Ú‘ ÁþÖ8?â—DjÔ~.?à>.;w¤2?É…ÿô Ìp?ãcÉ/ˆ„?⨱—úug?·¼¯Ì°?Ñ-%.« ?½Ý|?às‹…Œ§ß?ë%5&ÁY¼?±…eúµçX?Ó‰Z1­ìN?Öæ_¹ª]¶?´B›8q§@?Ð5Ý9“R?Û3Ä] †î?ÝŠ[.•òL?ä=J»æüƒ?sTÆ›$ç?¸ß#Bq{Ø?à™¿Ñ×eÎ?ÒÈá“‚ ¾?ÓM9’Ææ?àü\ŒÇÉ?ïÖ—w–é$?Ò#žœË,?Åê ëvˆ?è©Í{)yy?GÁ)?Æ=Ð쎆0?î¢z‰ ?ëoÚË ?Ðg#|¤?ïn-ÿTÊ“?ßTÂã)±L?å½›ìlÇ?Á¢Óòzd?ÃéÅV®æ°?êsÇTB?ÛJEŒ8‚œ?í'%AÂ?àïGÓþ?àñ©H9?×°%½a¦?ÁïDwSŸO|?éjC”» ã?×Xp¤MÙ®?é­â.3º?¸j¾„f´h?ÐÅÑ`F¾?Üb•†Ù,¸?Ýcr¸ªB2?·>Œs!è?ÝÀsí^B?äí'« ??ë‡h&¿ÀC?¼µïÖ\íH?ìI4q2‚?æC[VT?£k{"¸ ?”Ûj¤ñó ?ߣj¹ à?°ˆÌø&X ?±•B<}³8?â»I­òÕ*?ä­,…—?è¬OwNò?ëÞDÁ>áE?à=ÍË%?Ñw»(­úò?ÃÊ´ù:t¬?ãâ5­¯Ç?àEFÕc6Ý?ï?V·+ÏÙ?åWŸÍX=?ëlÕ)3R?ÖlAp-'º?ëõé‘dÔ?Ô€½UqK€?ï=¡r¦/Z?ìˆ1à?àÉYÞ>?ä©\eœ4*È?Åíxu?ÐïZ›à ?¶h:–Cv¸?èVŸ² U?Ô§¯qŸÜ?äR !€T?çóÚ^«y¤?›?ãâ?³Ü‡?çL‡ˆ'cÉ?ß„Û#štØ?îÁÿÀ–$£?ÏDë"0?æ%[Z¬4 ?äpyÉü?ã"–¹¥™¸?çOGEü ?î6N6FO=?ïC š`Ñj?æÊ¤=•Ž;?x4Ì1{W€?ÙXâïð8?æ¿@g%›ò?¹ÆrcŠÒ`?Ñ!îõ«4È?¯¨N&<°?îUÙ.mZ:?îh® ¸?ÐSÜìK®?ÞkÂPô\?ä­iIåpj?ÎÁ\Ê“&`?äjØ–[À?à_‡µ_§?è Þò¤üˆ?è„ì|™¾?âwW,üF?ß}š=h(?á¯ï÷,ÙÐ?ä†M| ?æOC­è?È$†(r`?Ä”°½é?é2Özþ?àÒ´ªž¦¥?´5Ès$ È?ÕBë[I½?±úVP½Lð?Þ|_*:ad?߬¼j?ã$)£¤zm?ç;BíæËV?â~®èïß?åEs6^ô?•·;+e| ?·%Ê´÷X?Ö«äòÐŒ?؈%P¨\†?Þµ$,@—è?í²qŠûh´?جCG‘ü?­$Q޻ư?Â×MäEn?Ò‚Žÿ$¦?à8€L ©?ㆊð÷w?ëJ³ì†Ý?³Rш¬?êj»rwäÈ?ïcÊ5¹%?çýïú×Ï ?ɦí÷`|?Ól‹·+œ?áþX€Œ”–?ë šØó?ãg…õq—?ºoiö¨ãH?äïDfͨè?â3w°,?·xx%¾gH?Ø{Y Z­"?¬aPÊY0?áž‘£!ýj?ì&,ú®pi?¡/sØäP?ãÞO-¥ƒÊ?æpŒwÝî?ÝÿZÜÞ\?Ø1°>?ëÀQT‡ÙF?·­¹@¢ø?È "M*Ü?ÔÝÉu­•j?î«€*ü{÷?ÑÌÈ’‚?éíOÂEª±?é i ¹2?å)‡eþèb?Æhy·˜?ì5T¥3„?¸¿?hU H?ëB›?º„?îŸ÷¨B5?â¦n€kEÅ?Í2¿5´Œ?å]6vM??ït^Ч? ?ÕaùDel°?ß™Š/aen?ì+÷îlÞ?èmÜ1 ŸÍ?шâKèú?Û,e+íÎ?þ@M}`?ê¾g)zÝ?äÈW,~?â;‘ ýÀV?ê¾ò \u#?çä þÃ?àƒ»­Û?Òy¬tfú€?Ýf%`1 ’?í¥ÖýqP?¬ÿj«<²P?ïnšùXJ ?ès³<È—î?íV6Á©1?ÚÅé—$Lœ?ì¡õ–D¹?î1c?&œ?†Y¼¢€?á7ÍóG®?ÇGíIœE¤?ìj+wÑ0?Ô*Ç;­ü?í­-(ñ¡?Õ‘/f™×š?¾D çˆäh?áCjòÔ.?îœ6`‡n?çšiIƒË?X0ì{ü`?›ö¶±rÀ?¬û¼¶0?í÷lˆË¢?ãHãÔ¶ ?î(’ÏCŒ?èëasº5?Çí„EQ?éFº1‘¶?äÿ³Ý½á?ã³—B¢Æ ?áìWQp?î êÑïšÛ?ÊÌÿà©„?ž¸«ëÖÀ?èêvÑ+”Þ?ì KÈ$Ñæ?è‰1?êhgúŠI?ßµûån~ª?²¬Å è?ß\gÿä?âš'‘éô¹?çÎÿO5?ï‚çÚ2óÛ?ÍAùVä¼?àK¨ÀÆÁ?ïæÕžÿ©?º²óÞÐ?ÕºV ˜Ô?ØàSÕe—6?ìKBè*Š?â¸þ 2ŒÄ?Ƭäô/š?íñ´àoÝ›?ãˆwCÔ@?à´ BðLn?çù“$«?ãpƒY¸Ä?Ù1ÅçÄäœ?¶‰É­3 ?áÒ‚µÆ&?ïLb¿âU|?íû´àO?ï¯ þ-÷Ø?¹°P(`?Í#ísNÀ?èì |=*?èi0æ¨Ì?×ää²?Ë1Žf¬Ç ?å#=f?ÄÀŒ`ÌP?ì8#@ÊÇ‹?׸u~Ž?±™÷¤–°?¦#!P?³MÇÈ@?è5œù`Žƒ?Ú@r>?èôúA]?æÞ“~€§?èQÝË¢Žh?Ôïœk=F?Ñ3Åð?ÊÒ÷îÐ?×g9­>¦¨?Øu¿E gl?²éf ú6˜?ì°]ÞÇ=?ÂÿJDC¨?Ã'ÃeÖ]à?ÓPd½¶?íéÚ˜¨íØ?éI›-ø®?âÍ‹qÚ´j?Ï´ñÎļ?çhË «?à¦^=”]Ÿ?ìQóo ã?¬¨*Î`?áýŠªWXÈ?Í,Xsø?æFm †¬ÿ?¾‹"o㸨?λVü£mà?Ú…j¯@b?Ì;mgƒÀ?í —tÇ¥?çì·î: ?±sKÔrà?Çr%"äØè?ÔmòxçWê?ÃÊgÖ{,,?èüÜÁ£È?Á"÷˜?×Î1QN?½:ÅÝüSø?êü”](°•?Æ—áÃÎ^?î½#D3q[?ÔSQZ`­d?éî®BåÐ?æIÖÐ¥\?Ö‹Ú»/J?êâ;riÿ?ìUu=!Øã?ç'Hìó\?áô·˜¢N;?äò‚˜²Å?èší—6À¤?í% ¢ÿÒ?犠‰#_?å¤ 4Z}?ïç©hÃÎ?íãsêÌfí?Ä¡–HyÔ?ÜiŠËÆ?âõ\z˜ü?íßV·|ô?é¤>ëˆb?ÓÂ0ç2?ëüTy)G?\ï£, ?Øç­s€ ”?ë%ÞÕ€©?ÛwZDÑ f?ë˜MpÊqð?Òø¾º‘tÀ?ÌwðzÍv?ì·¬Y2?Û€^áÍGê?îñ°¸ôÕj?ãîN^ìe?á‚íýÍ?ëMcÉL?ß ’àT´^?ÂΕ<=·…ôh?ß­K¨Õµ?äÃÛ>$e?ì’7áçXÅ?ïó  ÙŒÜ?ãªÉ#©aE?ºp$yø?á錅ta?àmñûÚ??߸Ì3¡¼?énûéÝ7?Û ÃŠ"Û?ÀØå…d8¨?á!(¿è?¢=ÞU“çÀ?Ö' Ø Ø?ÇïkVÿJ°?B_'fØ?Çô$üPú?Â| 赡€?ãˆ(;ˆ»Ý?ì껤f?áifÌZäT?áù‡Ÿ®«?­äÌv0?Âà4ï‚p ?Êšå8&´?è­šŸS?'©V”`?é q,gŠ´?èåHÔ_”?ÕEã(Ûàv?ãopΗnÏ?ï|%Týfð?±òsÕ3qÐ?ëžYŠG?é³u+Ê?çv½XA?çŸÉÇc¸?Ð0ê?ÜË\?çxúÏ;®a?ÞìMh–4*?fü@?ת„ªuj?á ó½îó?íYüéái?Á’V7sÚø?ÇA‡G'l?ܘvâ½Çn?ãsÚwçlÄ?ÚaÒQ'Lž?ä±s#ÈO?»ºÇÔñÐ?§X6Z¿°?gñAý]w?ʘ÷Å`?ã=ŠÆoO9?ÜÔZêà52?ê.hxô•?í;ŽiŸ2†?í’êŽþª?àÞL]n?í3«nðÞ?ã¯(1~7 ?ÛïÁ†+¼?ÉCOŸîl?îÖ÷0]ŵ?Þ Ö:¨ƒâ?éçº!ÿ%?ÈþùÝL#?ë1E¦÷?ësÿ @0Ì?èJ5 fÆ?×VpÍûW?Ö*LÒÆg2?çß­ëÈ­ò?Ù5–Už?߯áÅ«hÂ?ܱ7ýÔ?è–U(ÀH?ÏQ?)<Ì?ÖALó‹õ¼?Ð2šû.¢?æÑ&G=©0?žj (/ ?ÛËÌ"œŸl?Մ´pÔÀ?ßùÿkQÂÂ?ÕúÀ]HÛ ?Œgéä4§€?ÆGV#Çâ$?É…‡Bx?ëñOÆ>­?ÁRô*Ø?×Y;f™¬?rü‰¥°h?äÅ×ØÚ‰?æ|£[?ÛZÑh8î?ÕýìyîJ?»8Šÿ3éØ?î½n¡Wó?Ñ—€Ý¬q‚?í0ÁÝ 8?Ûë¨1n.?æ™TþåÞ?ík~¹Œâ•?³¥ê¸ŽÐ?£è mÿ?Þ1Çf¾1?ï™gPÃkŠ?ÓcÝ$È?å;çp3Ò”?íŽõ’Âð?æ•Òd¨Ñ?Ð’¾ø:èè?æAßú*?ã(Ñ*ló•?Ûáí?p¦?çtCó!±?ê¤r}çC?àéYAçËN?â7úÖæã‡?åoäæº.?Ó¨qVÛÔ?딚onÑÕ?ä<:È©b?ëT¤Þü}Æ?äxc[_7À?êZ@É¢·R?×Ó4D¬,?ì*N'½Ý?Þ}ŠC/4?æ£þ&}¼y?Éã˜Ø;_À?ÆsŽ !Ä?ëžd1 ?ÓTaPÕî®?ï’úÌ6|°?ßäz¸PÊÈ?Ì–+§\“?ÚÁí” ?ê.l L*;?íö² "æ?ào!;ùE™?Å|z° ¸?ÞN±»3`°?çÅZСç?àð¯[åp?å\Èb\÷y?Ö¿3×<ÈÀ?Ì"q)Ý´?ä ”)”ð?ïå ¤±ð~?Þ"UY£Ä?ï@¨´Â]á?‰¡cbH@?Ù²P€uÌ?ãŠÇÊÂ?ïhƒD í°?à §‘·°‚?Îwÿ½òŠì?Ö7ûEq ‚?¼½jìE" ?¼ÈþUU è?Þ}ä]VÑæ?Ñé6q Â?æUÈ5?Á›˜e˜Ð?äÍV+/×?ìTa1œD?½eîYk(?ï¡Î 2ø?ÓÙ˜ä@è?èÔøÊDŠH?åÕ±áHG?ëû¿ö¸û?Þpvå\Ž?í>_!»$«?ØUÊÍ,Â?ãMß{? ‹8r ZÐ?ê7ì›ã?áÕG1Û?Þ9††Ç'B?ã!ޱè~?ÚÅ¢,ðh?êý§Þü±£?ÙµA cÆ?â½Å™à¸K?ëk%NU?Õ9ÙŽl?QÂ9]¹(?ÃŠÛ ±ÅH?ïàëa™¬?æªEÚVug?¶¦CÕì?‚Æ—ËÏ+À?å“ÜbQu?éý3ï ;Z?Ö„ÜÕ½-Œ?åEŠÃ/†?Ý«Á6†?ës £zú±?ß 3¸Ï™¾?Âà=ÚŒ?êK0Êï?´9ÄÀ?³ö5ê‰Â(?Ç® õ¡ÝX?›Å\ þ ?µ V¨/H?럾뮲©?áèèû¼?êÙ'ò²Tø?Á:‰m2kü?Üá1UmØ ?àølÏùgŽ?Ô)ÛO„;z?Ýá|Ï?ÁÃÒ€ô?꩹ 6 ?ëâ°¤"–B?à˜]è»2§?Òˆ‰M'âä?Þ__Ñ4Ù:?æ“&±ôKq?Ý1¹Kó›¬?ì꿺¼?êd8J€nz?ç’» ä?ÙÄw¡P?âÕ£žm6¬?ìVÅã`i?¿hØkÈp?Ò#W‘y ?ÅxeNùˆÈ?ê3dZ ô?ì–Ölœ±Ì?‹çJA@?éØ$>¸%Û?Æû4‹³?ï`ÏèdÒ’?¸.JÎ0ÕX?â[äô û?î“ä4Y?è*–¸˜Jn?àÉ–öeÌ?ʉ ò3òX?´%‡ñå?Õœtšöz^?ÉÓÜMuã¤?Wœ=M Ä?Öd›h¯‘†?Õç>íèg¾?æ*ºÒ}?î„Òl’Sk?¦`‰I¶!°?äâš{Ç?靈&·?ìø÷( µ?Þ©²)Y&’?’/ïI€?ëg{(r?èÑXžÖÂJ?ᕲæTy?åø,†›—²?—xˆªc ?ï¹ QÔë?ÛÍßhXÑ?Ãq„P2³$?årÁ*r­×?âæ;¢Ó@÷?î²]³cÂØ?çþKƒ]&?ëÄÏÔ=?î÷~û@β?âµ]Ò×jJ?Ñ ”úHvô?¬,Ï’Ã`?áHuÎ Ç?Ñ3Ö¦” Ø?ÍUµÎž?à iM# ?Öø/±f?½}ÀjFà?áÛæ2}1F?è)Ó1p?“‡ S(†?Ö¿‘÷ |?âõr;T»?ëšú›ñ?­í*"Ù½À?éÞÍ¿ +?ÍÅðT?ç;Tµó?éƒ_Ÿ¸l?åòë;?ìo‹­Ôƒ±?é6Íd‘È?ÙLúHx‚¬?ást¬¿²ö?¤âøÞ“°?ë+“:C«?צm¦Ü´?gBãìÕ?í¤ 7_?ãméÄá-?ß¼›¹Ä­v?Ðêä0£÷ê?ïZ]õmÄ ?æw%|ê”V?½‹UuJã@?àTÃXÙÍz?¥¨Føé+ ?åx¸p/ä?±YíàÞM°?Ý__M¡’?ê Y†½?Ù:ã¬K?îÆABɲ#?é­W‰kÇ??írËÈe™?º§‡«áÁè?Òï·¬@Ú?äÛ£N?íÈ{`®-Ž?ƒP`r'N€?âkèeA?ÍñÈca^¨?áR¹û ÕÜ?ç\R1æäA?Ô«Ûö­N?³‰á=Ò¯Ð?ÇöM€lí$?ê‚m#` ?èèŸƒéø¸?Ñ>Š2N?êhfïj+?æ©= ˆ• ?ÖdyVÿþ’?Є¢pBÀÂ?êÌ"aû–¾?Ëq¬êÙ0?ÒSe,±Y2?èç2tý?äöÍPi‚?Ú·3•×Ü?íÈ^Ðq?á1ÂP“F?él”ß›?ÒÒÈËMÜ?¼—ýÈÀ˜(?Ü™Ú×¶?µgÔônnh?ëð¦9Êi?áàNè%?Ñ*”ˆ,>À?ÔcˆÑ).r?Ð"¬vÃò?é}Ó¶Ó6?ìOòɯ?Ø9IGXej?Þ)§ÁÒ!f?ÞÄæñÈN?àE“>7m?Ý•e l¤´?³kÜÜßù?ÕR‹îõÊ?éâ¯\ZÌ?ìÂÑv¦Ç?ÞO¸ªÌ*?áо<Î’F?ájc„çÁä?áÉ“:F~Œ?á΋ ],?Þ"{=À?ëètJiÒ'?ÞÜ0u§v¨?ëAÉOäJh?æ/&€Ç¹?ÈPÍ[¹è?ïF§uí?ÕúuMÚ x?ÄaÕÅ-œ?ÚIAŸGÓ"?–ȉ±Lí?æYðÄF¤r?ÕÓÏ~ãËF?âîv©Š?ä*»Ù—o€?²rÙ†V¨ ?ÍÍí[`PH?ÙàÈ«eé4?àÕ<–è?ÀÍ'Óã?Éú÷¼^Óü?ыÉ~æ?ˆ»É°j¦€?ЂcöûŒ”?åßö~]Mr?æ°ÊêYpÚ?Î-4{GH?îã+ܵì?çm/Õël?ÙªÑçe"?ëF¾OÛL?ך¶mý@?ʼnÝ0‚$?éiØ‹Ÿï?ë1> õü?ÔðÉ•³?ÆŸœcgÚ°?èüí‰ ²¨?éáü.µ?ç’ǬRl=?î˜#嬶^?á´«sìN?Êß eEü?çìÚ•ã?ã:€< ?éO…b1Êš?æ©|y~§Ö?Ó—ßï Až?àåX4þ·ì?¢’H³«€?èÖêГP?Üï¬;c€?Ç)ßÛÞÀX?írååâý6?ìK_ÕvO?åt`ŸÏÅ?¶8Ýä?íSã·¸?ì4fýr¹V?㙊Æ/?ãñ>¹jÝ?ºµ¤ÌRp?ä¿Ç)Ž’?ÒmƧ1=´?¡]{¶`?á×_ ¥Â¬?¼¢Âu:D?ì¡6kÂ3?ë‘ ­ ή?èßÜÜ^Ÿ?«uŸÍ0€?Ù•86ÿz2?åh….¸õ?ãŽ-›&>?Þ…mܵÊ?è!´î­?¾»õ¢8?ÇûGšùl?w¸™M-€?àA×_??åªGöTš³?æý C,®?ßó! #ü¾?Ýï{^–Þ?é=ʼn¨HZ?êé~„cI4?è´ÙÁ B?ØÍe™Ž…à?ÏÈÄІ}x?Ð ¾’Òê?ോáùØ?ë¥T|ª?Ùº”±`†²?ë†U=jöš?Â*ô÷ëüX?³)©e_ñ8?æ¶Ÿc¯F0?à0U»ƒ! ?ì‘gI{G}?è[n4ÿ'n?à4¿%Ûê?áÛä¼ õ?ݘåÏ ô¤?æO\ŠŽH?à1Õ[ì`á?á½È̳?éÇ\½Š Ž?Ë„õFœì?¡½pÚîÐ?뮂@¡?æ}–„¯ßE?×CÂoú?êŽ`Mø±`?ê@ooÑy,?ßûÆß°ß?íN–—yŽ?ÅÙß$ÿåt?è2.AŒƒ?ÖÕ÷…*f?膤QÇ?í.ea’Ù?̇uO±ç,?ä8ûüÍœ}?ÕADŠ_,n?äýï´–Ü{?Î:[\68?äÅ{Ë ?ÄeЋáT?éFMÄ@¸Q?æäLuÏ(·?æ„–¿¸E³?¥ú;%à ?Åà…Q»­ÞÆ£?ígšìP(?ínÜ(€?äPbIöˆ?é¬-£?ßìÂÆ_Œ?} u9p€?ç ·W-5ù´?êÊ10‚¡?¿?&ïçH?Ò­Ãè?ÎË(vi@´?燙¡Æ?Ô$­¼?ïï¶åu¹?åéãc¢?μ+AÜ?çxÔs=E ?Ѹ“Óš?Åvp|(?á9@²ô°?êWcøzÖÑ?朽ù­ì_?ê%§@N„?ä»t´ª˜?á>ãÝ¿]?¬õ¥¬¬Å°?ëe—Þâo?ßNÊŸB)X?ïÆü¦° w?Ô „òaŒ^?âJž`G?ÝÌ5øV¥8?é^3k¦t?ÇäëøÙŒ?Ĭغ>x?ßfÅ™èŒ?ê{ÐŽ›ÿ?Óe!Ï?ëéAêãÝ—?ëWkÖ@ÆX?ÐENÖË?ìæv»¶Ë'?ïeNa»C?×xDHÍŽ?ÊÀ|=:œ?Ëk'­‡îœ?ÊÅÞSê?ìpq¯™?ïg~Åó­?âÌê¯ø’?àvé^éX?Âk¿PU¨?³ç­Æ!±?Î2õ“˜9p?ÔÅÇFãZ?±'p³Âl?´¤û=†Q0?ÂJE«Ô¨?ÒËt/Žò?äâÓP*ày?äŠ Ý˜£?ê–¸ýs™1?á·:’?Ÿ~•àå| ?胚‹˜M?æè‰:¡Ž?ÁfY8A£?êrΆiëK?ÔÞ´6 È?àÞ²gR•Ô?ÙÐ;®,?±1+¹¸P°?µñp]z(è?ÌBfÙÅ%œ?îÖR1»O‡?åYmGB??ät”­ðcE?ï?ÀémLw?ߎ¦:(f?Ñ))‘eþÖ?ïE\l*Щ?éªZ "ɶ?é1œ[¯¢ ?êÓš:$?²à˜3Óð?¼àwTuð?Ðër;ʬ´?É8hàŸŒ?¾$úòåà?è ý§æÛ5?ß›RÞ) ?éÿÙ0M!?Û G¤Ž`Ž?ãñÕÔ*€-?슖 qd?à”‹ô¬Áø?Ó‹Míöõê?ÊeD$FÜ?áMCº÷ÍÕ?ØP,pÓà?¸”!ªêñ°?èƒZ#UcBƒ?àkh)wí?ÚÖq*|?èÞ±Ûæ?âäôd´,?å¶4ƒ˜a?¹ŽÍ`þX?ªû˜«™m`?煮·†è?±¯72Çä@?Í;®g>p?ê-F¹,ó´?¨æqé)@?Ã÷ý ?Ìó02D?ï±ó]ð\™?âëûíéí?ÔL¶½ÑnX?奅ØYr?¼Ô¦h›@?àŒR;}ùb?Ò?ól…ìà?µÀ.çògx?ÑŒPÍÔ&?³ ™Àè?êîë·)Q^?éôøàä`ø?çÕ”¯¦ú?Ðíâ/ó®Ô?ÚzâÖ]l?Ì_;è¤d ?çqéšù»7?ÒóƒUb?îÃݵ°Ÿ?ÆŸtÃBi,?Ñú*ÞlÐ?âÉy'——à?åíyv²Ø¸?Ë µSãðh?⨯´"î?ÙÔ‰ºÈæš?êƒm_¯°â?ã(ªº¢v?â‡û°¼¼Ê?Ñ9‘AÓß?æ#“…Nº:?Êðlh:x´?ÞYZyDh?ï½oY~”?éT=SXÂí?×ÿª™Ô?ÒhÂí®ª?À§íE1?Ú*oXoÛ(?ïZõ‰@?ïçúäØH?è | Þf?Ø,ñšÊN ?åØ!ˆ¤d?´É/P ?ØôÉ [V?éªRˆŽkê?Í÷žTÕ$?Ýþ+(HÄ?èâ ïáJ?¿ ÚsÍB ?Öǯԛ˼?íK°˜›7z?Óê5ò›>?ç…ÂÞŽ[?ì³óCÐ+¨?åþªø&’Ö?Ú³É@ÀÞ^?™'HJaáÀ?á{°…¼Áò?¢rVï'Ô?ÉÔžÉ?Ð" pk€B?Ð<| —¶œ?ÁvpÎ)\?°]Žë€?¹(¤º³áø?ÄÓ¹Mª8\?Ðçˮٜ?ÚÒ$(c-Ú?Ú‰xr?ãÓÂT%Ó?ágã‰)µò?³°û`—8?åyw^.¹ø?â¬Ê¢hÒŒ?ÉÇżè`ì?á·>a [þ?j e›?ãYÿM½|Ì?Å¡é°âx¬?†QuÁÜk€?çö`ѧ¤?Àø7‡ö&H?îëaVjBo?åŤÌ#Έ?¡u¨÷:Ñð?èHRe1Ñ?—ÙL5ËÇ ?Ð&¯šN0?ÝŠ@©è¸?åÌòKË@?åÓÝÎOS_?ÚÊ w1$Ö?Ð UÖš?ÒŸ[ƒ¬?ë½^ßù|Q?ÛlÌpTdZ?ڀ㛡¼?íçxûXny?ëŽm ë Q?êq†P>)Ò?Õ=,†TpB?†¶~F"À?å==8]à?Òôä†X`?Ó0b²Æt¸?ž÷7žŸ`?嬯Z“?«áiÙ×à?í©w4ý?Õ?°Q7ù‡À?×|ü³ªþÒ?Ü2E¼QÁÒ?Íðç%Ø?ÑMÓ耆?éñ™œØU?Óˆ]—ÌNà?× kƒ‚2¶?í“+ŠøF›?Û°;R¦‘Ô?ï*z{Dp‡?䄾ÄÏ1á?ΞßÚŽ½ø?èW–y}¹?Ö¹‚2 |?ÇIÝp P?¦Å–ßãÐ?ÞaÝ—Àƒ´?ưیò¾L?î5’p¼V´?ÐüìSŠŸô?ì÷3üK( ?æ\mÄ«¯ ?æãŒVz]Ù?èh—8V††?Î_È.·æ¼?Ê f?EóÌ?NBU5ÂX?ém†áh’?èÔ«±«âŒ?ºQ5µjp?ëèèW^fU?ì+º­^Ë-?Ü‹™za’?Ò/èÛ\g4?¿ÎÔE?ÀýÙwÈ?æW°‹±G`?è”lÏ®?â‚Ñnª87?îÞýzÖ’–?ä–ÈÈ8?Ý+‚kN¿ú?ÂÛƘ)?ÙH­”Ìíð?Ìü5‘,?èÂ2_ ?è âBÈXµ?ã«G÷×Õ8?~Ñï ª?âÄrËYü%?ìþÂ?L®?¿Îò\8f€?ÌSº6À?ߨñ:¢WÔ?σê¿è´?íó…¾$?ãÂÙ“òQ?Æ"ýDÛ½p?ÞQ ìç¦?â½=Ä£N>±¬Ð?ç ­Î&"ž?Àô[fÚ\?ÍÜä)˜x?Ø;•¸ËÞ?Dzô€?Øz?¨éC°?îa¼Ó½5?îpP($r?Áâ÷àad?âÌÿ¨²Ê ?ÚDq«ö?ì2e?ÖÕ8BV§H?ï|»¦Ê+?˜ðu•JÀ?Ûîê‚2?å:G÷½•Ô?Ñ8oƇ6?éjÆLe?ÅQj\3/”?éÏ›Í9‡é?ݫҠåYH?áà±Rû‡w?ï°Ù\Ò*¤?às[!ø?æ¥WiÝ®?ìa;e‹–?ÞÁë dÆ?Ó3\gLpp?ÖÈ%ŽTz?Æ÷-Ý#Ø?ÄÏÏûm0ì?¨®"´ ?ßI¾¡ÐÁ‚?ç3ž¯€?Ù¥&o¢?ÇÊ(²QTÈ?î b¼’a?¶¤¥ð÷ýh?â;‰þþî?àºÛ Áù?»ùdhX?ϲrbœÀ?Ä*ê–RÔ?ïàH±?àî§£*—I?À·èDØ?¸ƒ†öÇϨ?ÆRëœE ?àMSZK?ÔM‡nC¶x?Ä¡(™ò­ä?ÓýÔŠé6?î6Ùûüéù?å÷ÞDV¬?ØæKÊ îb?Ïð 9Òo?çGÕÅDY?تm¹H :?ïµf¢Ou ?ÙĵM´|Î?Îàwê’˜?Ðo²EëáÄ?Ùc¢.©¸?».yKZlP?¾w†Q“…Ø?åð^µØ?êd †I®?ÝSäÌ`?ì_ êt?¿f5áX܈?ït ¸#ÔÊ?ÊçI‹iTp?×~ë° œ?®~ã½ö¬?Ê-±nÇ?ã´†IdgÆ?⽃k¥ü?Ö'½6 œ?ëIH ÎpS?¬’FP+ ?Ûiˆ56?ïñš ØÜÕ?æ7yßüË6?»RÀýF ?Ýï©Æ¿B?­¹vi?Ô?11^Ì?ç»Í-T‹ê?î½å:„?Æ9! ò‰X?ÖìÇŸQè ?ä£*äiñW?àuhå5ã?ãò'g}¾ˆ?áèŸ!×^?Ø’V]*ðd?ì’¸gÊçƒ?äÀCŠ’ ?ámÐϬ»?êlŒh[·?êHÊéë–L?çãx\†ô˜?çç$íÞXº?áE¢bÿ?Ò¡¹’8šâ?Ë\x!fT8?ã†ìm‚ºÆ?Ùøzë—5ª?éï­ÍÃQ?ãÓ8U )?Øg°À9Î?®}XÑR^ ?ì—cñ `#?Ò2ÖÚ›`?Ü©œÈ5ÑŽ?éuãζì?á@Ã*&aË?æ2åy=F?ØAg§ ìâ?í=×è•`?Á‘ÉH\R`?º)êÓ?í°ìh^º?Þb£-¯”?â‡&.”n?ç"±Ûh"?Ù3ýÞæ ˜?ìñW’ ÃÁ?ÞÒÚúwɾ?êc­ ¨.À?ÖÀ# š/t?²9†£¬Üø?ä4·¯úª?Í0BÌJÀˆ?èO%4Â:?ä’>—?ÑA¾ËÿH?äeö®3Àç?° ×ÇéÎà?ÓÙ)/Þ?ãwÕ»ãí?ì.öA•˜?ít«…•šÁ?éYå¶pS?éTµoÒU"?â4ŠV!?èvZ›D?ÀÔÞMÁ?Í”ËΊH?¢iÁD=Ð?曌 ¸2ô?ª±ò¯€¿€?¾ÖT–Sh?ËæÉÄÒ÷Ä?Á R+P?É×÷_›À?Á‚,z{Œ?ÓþÓ CÆ?æÃ#Ú™â\?èœS²BTØ?ÙÁ{³TÜÐ?ν-à²ô?éDš!2è?ç 񿂤â?¾KgD‰Ü¨?Øúyu—žú?ìfk3žDx?ÅQ†átä?Ổ#é@?µ¤ã4Z?ã{SæƒÝ?Ú17 k:ˆ?êö„ÎÈÕˆ?ã~£`3"µ?Ñ>•z©Š?º±Ø35?©ŽÄtË?Ú¯ýÏv?Ò÷îŽ5þ?íÍ#q[7F?±™B^j0?îÔ(¬õ¹“?ãÄëoˆ— ?àMŠÈ]S=?ÔÙ#‰éo?·šÎNéWH?Ü 07o8†?èá†z¬ó?Úëi¨`KÌ?Ú(*t<6Æ?è•ÿ¡ÊÎË?ä¸, ß·ö?ïÕµ: ?¾^*‘aî ?ÎÆTÉYµ\?ìÑa<ÍΑ?Û˜úÏß‹„?íÆçëŒ?ìæ¤íÙ¤?Þø‘–?ØiXýˆ?âårŸ6„?á ÇT*õ?ɘ*g ?ïÅ‘›•çS?ã÷PZ ?ëüÖPñ» ?»ªKW{‹?ßO·Ã6Þ”?Ô¾4r÷z?¾tè{’I ?í©á¹é ?èç'üìù?Ø—Gvê?Êúš`¤ ?׸šÆáö@?‚%ÍŸÃ@?±@6È5Š(?àµÍ¾ÉQ¢?ãwí¾¬?å~ñ^®±È?î8mâÃø[?í1¬ê7?è˜Èœü0?ê{‡o©'?ʈ›õr?é)˜dÃ…?ê·T°VËü?äÒþïœ?ë÷V0Ÿã?å|Éõyþ?¤! Ÿˆ–?ÙÍ ¤Ú|B?Û§Yô¼?ã]#Øþb–?àùv€¾Ö?çxÿ~n?Ü-73ÀôŒ?ë †RH?ÌRsÛÙÁ?ìæÐžh?¿þy;¤W?Õcj‚ö?´Ñ¡È?èLß%\_?äcOÀŒüZ?Ô<ÊÕ ¾?ÃO¦Éðޤ?êÁP™ª??Ð_ûÉE5ø?áj ƒ³µ?é&rxÆåù?½ÝOCqø?éÐïJ[›Û?ËR;§Ôý°?»ú7¤5˜?¯¨„M¸wà?àn•èv?ïâ’7U?ÑSäÂÒ?îŸÞ¿å‘H?ÊñQÅÝ0?à‰bHÚ.?æü &:ß?êÔGh¾?ÍnLÓp?Èô ÒÐu€?ÛñÔ ‡XÎ?¥-ä‰Ë0?íRxqßj1?ÜKׇ9ò?æ@—bÙ¢?å÷Yiù+§?Ò¼Eö¨‚æ?â°SõË/Ì?—6×ñb ?íózÆMBâ?ä| üÿ7?åO"îÕâ?Àí¿2?êÒÛOC9?áà­ø$‡‰?ÅN­Ìz¾(?ÚV)4L?ë]ÜÀK»ö?Ö²êI‚4?ÀŽjÎʬ?Ø*£RgÇX?­?¾åÌ?·@"yð?îJcålñ‡?«òº¤û§?îM¸»œ?äŠ:S-‹~?²°.­Ñ¤Ð?ß¶~й.?ܘÓ(Êìþ?á²Ô… ?è^%¤N:?ØDý`î(ò?ïà*D¨7?ÖácF›Yt?ìÜdÊ¿l"?ᇠÃ{?Û¦o¾ õ|?•T[¶Ùr?àÔõÔtº?æÌÉ¿{?é‚<Ù½?ê't“ª`Ï?ÐrÜ”ç`L?–üì˜Â?Ж šÕGT?ïBx]!± ?Ú‚c° â?é?â¨W¶<ú?êkU± êx?ïc™‚Z:?í¯5š"™D?»·ç„Ø£¨?Õ2EÚ]¶Ž?Ì(Ôöõ“È?Ñ­›íäîî?îŽèÍ^?°Aé,uœX?¼<+Â×߈?ßä5Í¢?îÇ8Èãî"?é¡0¤5”É?Ê£³Œ›l?ëR%ñà?êNä‡Ü‰Ê?ÛD §Ø?ëºÓ‚),#?î©Xö£¶Ü?çp¤ OO?ìÐ ÈëÔM?¾çã‰ZV?³§mâ¬?ײ¿ÑÖ?Ù®î„åŒî?²^¡ˆ ?ëæx9®o§?»5†¶@Äø?Ó†ÇðFñ?Ù™ 5×î?åf]:ñ•?®²â7S?í@ ¯Ø(“?ê^x1?è´²Âǰ„?³cò$*?Ö376“ÐÔ?ì~4ȯ?¯YŸ¾ò`?Ì„ââßn`?•_}Ar6à?Í!f<ð?âfÇ«Û#?‚eJb‹\?ç ‚1 Òá?áþÊb™0…?ë3éæÈ?îŒqU‡¯?›ùâÈß+?ݪaæLõ@?Ä¥¶¾Zô?ÎíH‘óè?èR ¬n€¨?éu ÏO^I?Íe?« ä?ǘ,›/ä?ÙöçWË;–?ÄrÁôß2(?Ãéù/Ô?²õú®\h?ÕÚÐÉM*?ê'®X|”?ä¹42ù?å5dc@Š?ä±\â< š?Þª‡oðSè?ËR=ßT?ÜþP¯T"Î?â?€Rÿ4„?Ýì @¸ä?ë8‰ò:`ˆ?ä8K!C?·Úü5©@?ëÁyJ}„?¦ˆ’¸×Žp?æ M× ¾?¬2„!Þ3P?ëR(«›?ë¯/ñÆòç?ÍqQñô¨`??¯NbÏ€?²_.ƒ<‡¸?ÍRì 3—P?×AüÈ„ï~?áÎÀv}Ëñ?Ö ıY~?Õ»¨½Z0?ãóΟ3°?Ú…JÅý†?ä+E^EÉ·?¼¤iÆò†8?ºOaëè?ÑÔ3å¾8&?êØÙŸ;T?ÑEkÖ;ØÄ?ÕÃöuíÒ?ÖæB\|>‚?é*-.¯å?íÿK˜B?Þþìò?Ýômþº[d?âmÙ×W§6?ꂬU>’?æÃª"Ã'‚?ì–ó¦s?éáü°À·?áĵ"É?ï{ã;Ÿèþ?Ë¥‰kô€?Ê»^—wuø?ëâÚý)eý?®9¥ÅL"?ï%_áÝ?Õ\¥1ž0?ÀŽÚjb}|?ì=ûkpJ?èBì®7ãó?ä“8öÂf?ÙöŒkéö?ÍÇFdIÜ?ãÕkI=TŒ?µuBÂ{”P?í+\.†ÉÃ?ë™Áy4„ú?Ü£92?éP…ç ?ë{¢ Y™?ϼÙUÄ?Åšw@â|?åIgz*±?àjÙCQ:?êÁqŒ¼ß?«ìß‘‹Š?ÛéL¦nn?Õ2ôÙÛ–˜?î¯ã 8‰z?Ä8»ƒ+?Á­Š±zÿ|?š+úç `?ˆänÈÍÚÀ?àÁIè¹? ?èsüvcó1?ÃÚ]ð¢:t?ÑöÇŠà¶Î?ïØ-¦MÏù?Úy{j..º?í)/,祸?Ö@ž«¥>?šëjÓu; ?ªWº æ40?æDº™PÜ?êW¹¨˜0?ÑX#;›!â?Õ+7qZÌ?â‘mo¾›@?êoeÏ,?ÉÛ®¤þã´?â3ù§1G?íÏó|ÍÔ?á‹¢ŒX?Ñ‚S?îØän»»?âÜIàt¢?Ðçð‘U˜?á@UOŠ‹0?èšAâ}R?éwlÒ7§x?ÒsÝAª v?ÏØÑ£mEŒ?ÁÍ—†¹€?ìY@ª×(€?È %§H$?À¾â¾Tt?ÜfÿA»ãŽ?ìÑE4ö?án×pÂÀÛ?îÔçœyÀ?Û‚üWíØ`?´W'ÁŸð€?ä;Ë?ï³.–¨&?¶íö£Š`?Õ¦Ëg„®?ÂJ§¸"”?ØËt¥µ5j?Ü 6›p?ëøÓhab?ÎBêçì(@?Â+a'Þs?ëWD­ƒ?ÄðqÁ.… ?ë‘ïeöØM?ï÷š“Á7?èà“]â¾ ?Öâ}Ù¦?ä_êÜ´Ç?îjC2ß?ß[Ÿ«~Ý(?ÐÕõŠh?²5*{Œ¼0?àJ‡qÍj&?¬zA?ÿÐ?ž cÓþ`?£rϵ2 ?Ümƒ”)ÛP?ëæò伡?¦â-±‰ºÐ?ä-¯ þˆ˜?á%Ïݱº?éé>©àƒÐ?æOûFYÆ?Ü:³Ã r?¹†Xì'Ðà?Îf²åbt?ágŒâXðx?í祰5?Þ°;Û.1Š?æÒÐBX€?¶ÜM6à‡P?± sÄH?Üü*¿Ì›ä?ÓPP8øÿš?ÖRÚø:IÄ?àpž0÷w®?äÆŒªì/Â?çf¥›Ä?Úç¨zƒèÌ?ïíÓ“rì\?»¥N¶¨gx?çë(`íóÕ?Áˆ@xv'p?ÙÛ·m æ?Ô„UpóÆ?Õ;ôùœ?èr|5È?ÑþAÍ÷^? sÛ]%Ð?Ô:à߯ˆp?ç̈‹#A?äL78N_†?ÆL;QÓhœ?ã ”(N±Á?v5Ѥ@?àam1·?éò;Æ©éã?ܯnóß®H?å/ì/ wz?ì ¬r–2’?Ë’N¢ŸËø?”/æ ò<@?æúdƒÞ?æ‘1|—³$?äÄÕé¾S†?ÞHIÛò?åï,ŨT?íâÒgùœË?¯õjv :°?¾…münX?ì²åE_ë?âÚ¢`ìU-?ÑEN÷–Æ?Ûíé:#æð?ÕBNøö78?Æ[áÕŽ3€?È«±Ì^V@?Ú—w ©¡?ꄉ±™‹‘?ëÕ›á„Ú¹?Òñ[‘ÄnÜ?àöÂQ™ö?æñ>d3?Ý.ÿ]ûÂ?°ÿ{$ŸÇX?Ê“ïlT?ß•뉭¦?Ú6*ºÛâ?ÐáÎ.ÒÎ?ïå8.SÒ¤?å3Žc!˯?âîK]Wµ?²š‘f¤Ã?Ø€jM©2?ÐÊR:»½¢?ßÕ—;,ð?âuȨÑòr?ØsƒÊV¦?é Rê<'?íh~{Gm?Û A>Èb?ïÔËDËÂM?ÙöèEÿô?ÛzõX´Üx?Â&ü)°ü?âÁ¥6ÑiÝ2j?ÍsMf°)?é'J³®-Í?ì ¡‘P·Ð?ãä  y?í/jçLæ6?ÎQ1–\žÀ?°d7mUÀ¸?ÀâvRaùd?Ô<Ádƪ¬?Þ!dPz?ÁeCmÙ¼?îýxÑh?ä‰ô¤‘˜?⪂>z¬?ÓD”—w?Ý }»°l?ï§gö„ü?²Â’Êíì¨?ºJ]¯‹ˆ?éÀ}^“x?Øò‚¦à?ä>ëîçŒ?ÊYÿœ^?ÑkÀXHê´?ÃŸå²æ_`?뫃×D¬]?Ç„­­â™?ÑCSKB.ú?ê.³„ì\Ö?ÓVªuWÈ?Æ·ôè³R0?èŠùÔd¸Ò?ë½_ì–€?áÞ/ÕÄ_`?ÙV\õìÄ?Ò}µ“kB?×B½{ëV?Ã…w²Ä£À?×L»Ûê+Þ?ç½¾–'›»?ìÏ#J‹£™?å.K¿Z¹–?ï#³(*ù=?¯Ÿ¹s#ùð?Ý0ƽ¨mb?ír£½iqÞ?ãYÛÙÈ–è?.jóø@?¬™ñéÐ?êRú úo{?ìJ¾–ë!j?ß‘ÔÍI– ?ã—ÅH©îm?æÉ¾´<&?ä³xE«_?ÆÅXÅíà?±ó ó´Ùˆ?®py Œù`?à’íQXÄt?àhZ½àÓ?á–pH¿0?¸Ä‘M.™À?ãAp´ÎŠ-?É`ë;Tð?å~ÄÄ¿G·?Ìc7kÚVh?éúñˆL_§?ç‹GyþÇ?éyªƒ/U?ÂÒ¢4è¬?Î[[z¶•à?³ä›[†q?ä}8÷ž-?æàGŒ ?Íåñ©÷dÐ?ãú•׊@¶?ÀMë,¾p?â“VQ±Èˆ?âLcÇ6;P?ë­óÏ,^ë?à´Y­«J?å“åéîh ?àç ï¹êR?éʬí~G7?éµ®ƒhÆž?ÅUëÈ_d?Ø*°ß=®Ö?ÆvÁ*¶x?Ñ"F2ˆ³?¶Êu¹Èê?Ñ7`™¸?ïeõÊo¿Š?ìÑYèD½Á?Ú@À6–»¾?ê¥éíæp´?èYÈ?wæ?Ï¢†Ii‹Ø?èÞ6[D]?·êßÞ›óà?ŒÅg /Æ@?ì×öÅüœ?ïAì/ƲM?ãŽ(n œ?çZ.É¥*¯?âk&Üëq?å;ÛˆÇ?î\ˆ(Óe§?ä è×`?êõƒ‹ßW?¯5 8?×QI^ F?é0Ú){ÓJ?êdV„7%—?íHîÀG8?옛òñc?çØ® ‹m˜?è«¡Œ?ߥ’‘8åÒ?Òi6­,?êÒ›ÕZ/{?à ÿ‹¢c?ѸÙË[1–?ÒìˆÍ_ó~?ϵà2—Ç@?æŸ Ê þ?”cú^ÍÆ@?í’Ì… ¢?í— È»Ú?èwÿ/“£?ß—õ"¯’$?Ê;ÚBbD?ɞǪª `?ÛoŒf²P?Êýø,1?ÛqÞ]Ê€ê?㻑bOeŠ?¢'Ò'v6Ð?ì¶Û÷¤Q?åp[–ho?ІV´/Ôú?Øv?f¿Î†?ÔðwÙS'ð?ßøâ–âÖ6?ÍýÑÂ"€?Á-ÖÔx?Ã~&ºÖ?ìù†ˆp?‰]„aIüÀ?ï´©©–¦?ê$ýÏÓ}d?‘FÉ{7úà?º«ÿœ– È?×+ƒ²§?Í_¾ÎM¼H?ãlÝqnB?¿òùà°D0?å½Efò|?æN£ä>°’?Ò‹‡üBÖ®?ÖáqßÊÜ?ÐÁË–?ÕŒ-á=?•ñFM„Œ ?ìÏŠo ì?Û_Šu˜p?éx¼{fQ¿?î¼8B¯Þ÷?¸éïÅr@?ʇ_ÿÓl?ÙíNº Ž?ÓR¾Ç7’?êh•É~?莯HÓ£÷?Â÷7EBð?¶=–TÐ?ê*ª ´IÄ?Ü=mĹ’8?Á€Å\‚$?½Ôè3h?°ûƒ]ðÊØ?‹©3ümÈ?¼,!|u ?ÑÅœ¼) t?ïÄ3G}U?îùUŠ `´?ÞjY·È}¼?¸À3÷DWÀ?µh}åQÛØ?æë‡q9F?Ø#ž‹ðÔ?å8|ôé°O?ݳöDˆ?åÓ‚¹Ÿ¶?çxµß¢5 ?ª0>I3ÿ?ѹ»koÞ?È|Bó” H?¦aÇzŠÀ?ä0Ó¹9?ã×fô}“–?à¨Ïtú)?Û§üˆº`?¾çU:L]?á¶¹‹BÍ?ÖÁö‘ö?îã/{?ÑQ”‹¶Ö²?ïyUÄiè?ã^ª×_ÖD?ìßP8.H?ÒŒ…?^ðÌ?æðÒž±?ï M«ç?Ö©jë²?å¼¼ʺ?ÒmYc—„?çÖû‘¶9?à6y —Þž?âw` V­?è6\³›?ÌÌ {ÁH?î±Ú Ÿ…?ã´§{¥K?«ž;ü¯$?éxœ†¼CÌ?°¹ŠÈ?â-Àc_?Ã.V Jß ?¿·~À)˜?êõßkà6?–âߊ ?ÐÙQå»P8?ÚkæhÚ?ætß‚ÕÌY?¿×Ê7x?Ô`}³ÎV?×ÑžboÀ?Êë°wS?ç%¼ `^/?é£Í3Κ?ç÷É­u_?äíùƒxŤ?Þ1 •L>æ?â¼µËü¿K?Ü)²€9Þ?Æ…Ê–x?Ã;ãƒL?Êꘌ³Z?î,íQp?âUóþêMU?Ð3{r†;°?æh ,O…?à3§¡Ù\?årªFê]?ç‘…×ZM(?éšám |õ?‚¶Æv7°@?êºå?Œç?ïS¿AÐL¬?Κ•÷Ò`?ÑJjCƒª?Á‚³/1PŒ?ëEMJ?Í£1}`À?èÁ®Ÿ~?ßY$m2?Ë{ÞEY‚p?Ö´>b=Û?é¶X\˜#?º¡žüÊ ?Áægíù\?¢Sí=ñy0?×ÅÅqßš?é‘;—?Ñ–ã+ûf?Ê›R•^¥ì?ä).¶*˜?³*·ã8?Ó‰µÎ¶¿X?Ç2!ݯt0?ï¤@"XD/?î`ƒ¯N••?ã1©F¸”?¶Xðxñú?郲ø'?ç 4 S?Ü¿£Hš?áwB鬷?ãBÏ&ûþ­?ÕjàP[Î?œ\3b¢€?ʈfX•O`?ÛÛ.4eËF?ê°R…?Ò‹ö§¹È?ÐEœÑM² ?·=b$˜?ÊAI„öt?æ—ÏȆ w?ÙW llä?º|òç v?ë×xD?Ç'LU)¹¬?σj}É?ä]eÛsÍ?å¹-[Óüt?æ/á¶ß¦?Ýsç Îà?ås­ÿ$º?ÆUD2¿|Ø?¯¼z“†´?ܸZ˜?×5­yZV~?›h­’>?¶áò 1H?ÅÖþ–z@?æ™”‰ˆ?§lrfGb ?îæ…6 -?ÞÏla÷Íê?Ö?G!™B?ž¶Ç/Çà?í,áÀ(o?ç/gîƒÅ??îLë×ÙU|?épÂbØ?É(Åæ›|?Û·ˆl4ÅÜ?ÒTil•”?ëw~Ç&ã ?¤f52 P?ÎaÌŽõáx?êG>ØÁËË?Ëj[éq€?шzL3?ã÷/ 8â?ƹˆÀâð|?ß¾³ ¾?åˆV3Q9?é^NCì^?ê8l¢°àÚ?íør”[÷?ÂÉPµÚ¸?Ñ›WLä:?Ë? øtMü?×xðû-x?ß&5ϲ˜?ØÔÖ‹T .?êÇ1Nõgˆ?ÑÀ߇åô?ÏÛ¡dQeÌ?ãý﬒õ?ë’O{í ø?åO8èZíé?ïn Í>ÿ?·*Må͈?Æÿp˜1´$?åæ0‘š J?¾½ö«ñ[ð?ÓµùZx?×èÓjßn?ä!H)Ì?âØx¦i‰?ît׿¼?Ñ]¯±(Û¾?æ(*TÊõ~?ìXÓ?á— ·:‡ó?ïÝe}ûß#?ÎËògô?åAž1s?áW…U•?Á ™Þ~ƒ4?è•Ñdœ?ç<Ë.@mÂ?Æ/Ríê¨?æ"ét{Â?êé\¦ä32?è×ú°à(??¡£Ið?Ԅƨ׉€?°uÁ;Ð?Âu=¶t?ïçÚ ¨Y?Øg•Eݺ?Ùw;³B?ÔߢÅLô^?¶£6å_’?â%1(E ?ê—b³ÏÈ?éL`t³Â?êÀËôÚoB?æ ö?P‹z?á8VÌ CÐ?îÁYÒ=£?àZeï;Éq?ëÃ~1Õó?îÏn]ù3 ?í.Œ$þ£Ñ?®ÁƸ;—à?׌÷JY$?ÙÚŠ aÖ?è Ì™»? ?épÍ­)…Û?Ø¿c¥êŒ?é)&zûßï?º*Qá ?º@ìZó2˜?Âä_ËÊ÷?ƒ@¨‰7Á@?ÜAn¸ˆÐš?ÀðÀûÝH?Ô~OCÜ*?ÛÒÊDÓD&?Ýó»J@?âtÐè[…±?剠NX!Û?î¡¥má?å`+ŠŒÑ7?˪¬˜ä?ß^—‰8¤8?Ùl=jŒ$œ?çÑNæZ©?ÑÀ™Œ©*(?é@¡HÌ?ìhv Ì =?éÃÚùÑóÄ?ÐôgÇÛî?â“‘´,í|?Ò_–0„?Ñ]!ªìðZ?éÿ µï¸?âß=`¾P?»/‡|D%Ð?éºÀ$ø'?é®åsD£P?¹äÄ_ °?¦¦iÿ ?î_jw¬Î¤?’}ÍñTÃ`?é ¯)‰W?æî}Îò?ánç’¨ý?âr\VÌ?Ù03p~?éé{æú5?åáÓï~iV?´ZÅÓRµ¨?êQˆ!M+?År=m§š?ìãéûì-?åm€w‘ˆý?åvùÕ!?ëðfê‹÷?éjŠÕ¾¿?æñ¶GV?«p?ª0?íüûÒmâ?ä 9£‘¿?ì'ðÿŸ½?ïÆƒŽMpf?É6Ÿ·8?ê~us|Ú?ãŸõe/?äJзÒ}‘?_ Üf@?àv¶ž³Z?Ý ”«5„?Ý¿ùÃWe?ÐiöÀ<°?Ø”[½9?Ï1ö¾a?ʰòq~Œ?é?ÎË¡‹?ݨSóM7¨?ì·í/ÔŽR?áÎ N?ê²£g+%?Áäø.Qøø?Ó½(¾“f?âRZÿÏ~?Ö¨Þ•P†?ïºÕVäÕ°?çÓH‘û?ÚnBi“fT?å\²é©|7?Ý„£ñI?àÅ‹_Š­Ð?h<Ðöu?êk¿A(Š;?ï¸+‰?æ,Ðæ3Gf?Ñ|ÉØ¼ÖÂ?Ý}~’òÄ?Ø.©"C”?á¡y‹Si?Ñ©fìýWD?ê®?õ9HP?ÅÞ3S†¸?È4˜¹&(?îfnôÎõ?õºK ?êgJ1+s¨?ÝKït?æ¯Ý¸N?âWŸyY?Èûn ?Äp6hzl?ß—ÙÈÈ?ì-j,ùª?Ä ¶P‚j?ÙAxà?âXn:¾Ìi?æ zé“`8?å[^³Çõ?àtWÖVž?Ýa}zò?Ó4B¶Pv?âþ+­qŒ?ä…y›È+?áðn¢qË?ÑÉä2éd,?äÖ~}hê ?ä(ë@óo?îÿ}Èì?ÞøÜ‹~Ö(?æû^YÄ=6?ï9渢Gr?ì§Ô¯‘ò¥?ÓäúÜÅÂ?àjªB5’c?ç:¸¸?ëüÒx_B¤?ìõ×NÈ?ÐCç&BÊÔ?À0†ýFÿ¼?¤w-à ”p?à°_…;$?ä_óÝè?è¿“Ö%ö–?ãkî+( Ó?Ðçàjò?Ýb"+Èàò?Â{ªë«Ô?ÜPŸìDZà?ä=0Ÿ´?ë.²{Ô©ç?×Õq©@|¢?á§ôÌŠQc?à‹å‘Ùõ$?É9}4Ÿ?Ùðø 2’?w4ôßLh?Õë4œ±xD?’o3DÄ® ?àæ7ën³Ê?íû›re"?ÑÇò·}ŽŒ?ï¦sZ€}?’¼;”g+`?é—à¢dê?ìS_ß¼?ïhâŽ]®Ê?ê¿)Á!NP?á|9„òÛ?è]ÛÃÙ¥ì?çó(ýØî?ÈÿªÙf?äµ1ƒ^??¬ûÚÊ…u@?¯C\cP-€?ës¯‚¯ä?»?#¼‰ÒÈ?ߑܬüx?ÓTGo'?à¸9 º?íÖéE?ãê¯x‹)…?È«xt?éR–Žåµ?¿¡~z–‚?ï5…O8?¶ƒÝöÚÙ˜?êfÕ>L ~?â,ô&f?ÙÖ"|‹?ê ïe˜¢U?îw;ªÞ$I?ír޳pÁå?êï–Çn×?äú™«†ÿÃ?åæD7nkl?¬/T"¡@?Î% ‹Û¬?Î)µ ì}?ÃX+’%P(?èBùIaü?иðs ü?ë•zŠÎ÷Ä?ÄÊð°ƒT?î¬³Ô ?½?íZû‹ˆˆA?èB»y?Ī5FÍE ?âóŒÂLÏ/?åÅxy›fó?¨O$ú)#à?î¥6Ï?⯘+²T¹?㳎è&üÊ?žHEdQ ?Ñãñ¥¥Ð¾?ähy’¯?쮩>¾tŽ?Øp)mëfŒ?ë9Ü¡ûd?å$:Ì’e?Á·1añL?èûdg_¹?ÙÊr÷Áz?ʰ×) ?à TUèv,?ébyÌ"‘?¢Þ!Ö¬ð?Þ¶³×ðÜ?çZ×ïëo?éë%¯®Cf?ìm¶wÀ?ìÎͨßo*?ÙbtÞ¨?Ñ Ýê±¹‚?Òî*Nz ?Ü1T0ŒØ?¨ðÕÕÜ– ?ÖÎZh Þî?â–8µU†%?áv•aMÙ?½d-Ȉ0?ƒšH}¹@?Åcuíø¼?Ù <•ý„?ºÜ¯‚Š~p?àTx°‰Ñ?îó;Øs"?Ñk„Û‡7Î?ã™Ï7¬?ä9îkÞ?뤊0KÑ?Ðq»„£ð?äÁpa¼W?ïlÄâ8BÌ?Ë8nº¿`?îC[½A]#?èE…Ê?c?Ðé’‹Úx?Þ/zž\?â.Æõ'3y?í5)c¶´O?䦟ë·Ú?ãŸ-Ú¿"?ÙR/A¿z?Ù$óe)Œ?æPK_‘yÔ?Ù1nŸää?ÌÀ Xü,˜?É?óÛï´P?ÜÈø­2ì®?æhfCo?èîIuJÜ ?ënH¡è?æÅ¯¢•¿Ç?íµ’úÖé?ÛMÉÅáaò?¹ äøŽx?Íráš7)°?Ùÿ\Ð ?À™òOÏ*ð?Øú=%hˆ?¿±Fy¾bH?ß]“*o$ˆ?ÈèÌ(÷j?º@| o?ܳ*éÔ?ßXÿ-L@ ?ÐOZgË42?½p%~>h?Ä}ÚŠif ?à iâ?ãÎVœW?xäÇóö$?äPt€"Ð+?ícƒ[3³º?íåT½¡¿?Ânt§êH?×ýÜ.°¸?Ì—•[Å”€?˜»îSZG@?êy¦A ?îYØ—·„?íøßï*±8?”%yN ?âPøà\?¿bH–~?ÓèܱkÈ?ÃN=F ¸?ƒÌRf–ë€?Ó\ʲÝD‚?À`}Få?æqšð EÞ?y¿çÑŸ4€?ß,s«r”?lK³à8£?Ð`b ¯@?Ýì°8A&?Ê;.ÐÆ÷P?ÞGÅbæéö?åˆ`7¸?á÷вkä?Ðnù´éjP?䜴‹mœ\?â«×\ÄW?Ô÷­†ð(z?èS¦á?ç¿0°cM?Ï¢-Í‘?ëA8eÂ*?ëƒBêªPr?Ô‚»Šˆ?Óf-ø?è²á‰f(Ä?ç —:Î?éæÊ_c?ä2뿯?ãA(©?¥Ï|ñ£Z?åe5Á~³²?ïô¸ñŒ‰Ï?Ôÿñ)(x?³~âé÷"Ð?ºB¨†Q%p?ÜŽŠúi ?Ó~¾²MV?°–{y½”ð?ËmÖÒÆ7?£ÙzŒÑ:p?¹:„ ?ã,Y2d¸Å?ä;øQ°œt?Á ›J –ô?çCErÓ4?î”ücdàë?ëµ^c­X?ã W(gø?ä*%ÄŒk?ï…¡¤P£?ã™fý?ï`VéŒ?ß<"³H‚?ävðù?ÐK“³P?W¿]è`?Îå†~ä`?ê‰ê­ƒÂ¨?ÆE¢‘ªe`?å ¹lˆ3r?ÓÐy:o”V?âÖÌöW'?èL±õšŠ ?ȆNY"¬?Úô*üÎ^?åjH+„UÈ?æ%gk>KA?Ðh´ezn?ç• ±Y?Óâ5‘°”?œ‡*B4O ?éMâ˜Eî?Ýþ¡á¯À?ï¥rw¿?à‰t«IôS?ä ¶õÓÓ?ÙÞJQcrb?åðÑEæéD?æ.baâ¼?¨ªÄ2wñð?­°¼Œ¯?ç#&??îàÒ€«ï?åD…Ä4Q?놥¼A+§?ã/$—?ãÑá?Ô©þ:éü–?¸þsë- ?Ó½HfÌ‘´?Û!ŸÎ1îJ?ëÈÈGÆb ?¾µ/^ú¢°?ÑòéÌ­t²?Ùaeæ@­?ç¶”Õ¡«?éxéM¨?èÒYþ¾]©?ëéc³¯?ìfÐÏO³?ƈô,N]”?¼à;‹¿?×õÀKþ”Æ?ۿň0$?Í`(H¯ü?†“¡ðºíÀ?¼\ƒ7áVX?îS*r 2?à¶~mo?ãzG¤z?ìdÜy{š?Ìy½íž$?ÂQ¤w8‡d?áÚ¶3ë80?á|0b@«D?¦n7É‚5?Ó`œ t†?íž0 &{?î e{“Mä?ì3 Dø?ï®ioÐJ?àˆm| Rt?Úoâa”¶F?çz†a:\ñ?›}ÿã÷ ?ÜæÇ·ØÖ?ÃUÇÛE€?Þ2§…<±$?êŽö;ŒŽ2?ïÿ´ùËD?Ò\u:oMü?ÉëðâóO0?éÍ^3îFò?ì,À÷?Æ“Ãa/‹p?ç‚“¨å^à?ë×z§iJ²?ïsÅesi›?ߨ.æ{Þ?êz`,·ë/?ë:lšœ}?çÆõM{?‰IxþÜ¥@?Ȉ™Jè” ?äôyK.÷7?¾fËõà¦p?Ò «¥qˆ6?©Æ™¢§y€?Ý'¿ ?Ì“™˜º?Ó´}Ôܸ‚?íZKس•m?Þ”Q£–O"?æ|ÂÛà0Ö?Æ`|Ä9h@?Ú¿±oÖç6?]b8ÁÜ”?ÊÈÚvä?ÙÞ5b>?×]<œÐ?ߊ§zuà†?é Š-Tÿ?Æ$ÅR] ?â†X7Žp?ìÙ•¬c®?æÑj3ùKK?¼ü4[”rx?Ø$)Ïɱì?ßc;=¢ÒB?Åí6ª1?ä)r †?Ò–å•GgX?Ý/²¿™oò?ç]¦¬h±?⎠:š{X?ã´X¢*®?Ú=8 ?Öðs©r?ÜŠLö:ô?ì;ed¹?Ð õd÷׎?é û˜ºG?±²ÑEÑT?à«VØ.ež?¼t$h,×È?Ëén:¨7€?ÜÅý{ÜÄ?ÚÆ“lèê?ÊFY@Ð[?Þ|ÿ¸œß?ÐzN÷,È?ÙŠ’¸o?¿³{ÚîÈ?ÂÎC™¡Ì†'|ëv?é›ù"x>K?á¥ËIÖY?åTF}I˜?ç#2$|M?Òºr.³Ïö?çc~…eª?좜ª§Æ¨?ë–iÕ?çÛl(N?érðȹ?ѹ¦+XX?èÌÛ™‰|?º ÑÌ<?ÏÍËÔ{Q˜?çàÆÆ(È?ì½L¹{ ?í¼Ö¾s?¯ú¨è°?¸Û×V&‹?æÅ*ž©Ï?€¨Ž2|&€?ãQóÍ™í?ÞðOôУ?àò@7KKE?ã2,¡Ô?ÞÛ܈š…¾?Ò‰¸÷m#Š?ÔCâ¤éc^?ÄcOIl„?æçu÷šj?ÙŠ“?<6?ÞKÓM&÷¼?¤È„Dà?æÙnj¤Ú?ÒJ9l#L?ÁQjÆ[Ј?áßòKñV?Û൓4d?ƸGM ½”?Èàû ƒþÜ?º h©t=8?è’É29^W?©ë“g?Ù°˜F&7>?ÝqÖkÔQâ?ÃÁ®g#o?éc€ó€a?èÔú"ö-?׫d¢0L?ÕFÙÓn?ÓÒ÷¡—dX?é]ñ."È®?çÊ©ú§Û?ëI,æ³Óm?Ò€œ« Ãò?’ÄŠ {q€?Æ´»Ö\À?ÛûƒðB6Š?¨/uÒ—£ð?¹ÅÑ% ߨ?¼)êàVúh?Ì;é¸lœ?ÚßíøËî?å0‹ÜòÜ?ë?ë[¨f&º?䡤Qò?ë´ý5èN?ÍÂÆ Œ?ÛÛ׈‹Gè?ã±¥Ú©8?äûCÈÜ{)?ï œB £È?µ$öùÆŽà?åoH Å«¯?åø¥  c?Õ»¬"o@r?Ìb5Ó±ˆ?è%l» Mò?×JwÃ.ò*?îŽ}â†I$?ãeƒâE?æÕÒú1?Õ‡ªÏY¾?• Ç=ôN€?§·ÿëDp?¹Çž.ðx?Èý‚sàKä?ÝÄÈ¢öÛ ?Ú/¡àöd?ÙW]~^ã¼?îÝuÑÁœ?îb;×Hìÿ?ÂFðã Ð?ЧŒ‘Žw®?àü  û‹M?â9]´mö‘?âyªÀbÏ?è¬EQŽt?Ûš¾Ñ»ÎV?ÓÕŸYsˆ?Öz4ÝdT?â÷R•Eš?ß—×f ¬?×ÃZµ¸è†?î+=î6?Ã’¤?Ö`àÖ¬Ž?裛é!?ÞÇýs‰ˆB?ê³é<£ÎJ?Ù®¯¹,>?êÌ‘]3Nû?ãÌÀúÂa¾?Õºí¯ˆ?â¾V7ë?íO4éz9?ÚrEy(‚Ö?ï´e"5?ÂJÌƵô?·L}"•(?åïaå@å¨?«Ás¿W?ÅA²`ל´?îAÇ?Å^Õ‰:Œ?y*qEwÌ€?ì;õ˜>}Ò?éi'tx4?ìRÒ95†?â‘'"¨?«ý_Tq>Ð?ÁE)öj›ø?åÎïnTç?Ø_OZ®¸?îÊPÙö?Ü HË 6?à¦2þ8 ?àNtQÚ)Ñ?ÍëŠsê,› ?ên"üX?íª¡Œ ï[?æÈDß]ï?Ë`žtÿø?ÚõÉ"Ó¾?黕^Þy)?ßO8ëר"?×ê¸ ¢À?ѽo™Íãà?Ý#³–’c?Übã©À ?ê/?:DÓ?îß{Ãþø+?¿>¬/—ˆ?á ŒÐò?ïë1#¡è?ËÇŒoù,?í1:Áƒ*?î·Ó2D?Ò¯¾]cL?î\“#‘?ÁÝpñ˜$?àíé=ïÍh?߯`y­d?‚ÇŠSg?ºé§,ÄFH?ØúêªFä?â“¡UÐŒ?ÑÍ€îQ¥ˆ?à©É%Ʊâ?êü>ÌÄV?êì.àmt?í~~ðYåq?樟þ[?â{_òëŒ?ê0eY”?è× åHÜÉ?ÍÑ`Æ\?߸wYZ€?Ü“ÖO‹®?áöêך¦ð?îvûʃA?ãv= çs?îeJ¥K?ì1VövFé?鉸¦î3˜?âÐjK-ßê?ÇDN·l?¾ÁÐñÔ?`?æŽÖgˆ9?Þ«ÀC?àîx3H#Q?àEyÈôv?à·mHgO™?â?Úå]`æ?o¡QŒî?ç½ ¦Åæ?Ý $Œ§(?ì6¤÷¯?쨨„"(5?Ýmí»4 ?ìóD3l?Ö"ß1G“X?Å+…iJÀ?àáû%þò?€äoÚÙ¨@?çm‰Ú ?Ùÿ(ix†?ë*×Îüó%?Ù׳ËÅJ?œƒÖÕŸÐ@?íµ{HV¯?»¥Â*…UÐ?š2œÁ€?©é–ó‰1?Ü1´\T?à7ó¾ÅÕW?ݪ§U„?ÝŸ†üÙîÊ?ì¥×ÚÞúë?ꢚœ2”?ÏÀR¿zÏ?ÞupwÊN?åKmä ?Ç8~ˆŠÐ\?ÝðI¬©ý¤?às. ,ü?ÈŸL¹¬Ü?ÕHz)ÆÜü?¢ž}Ð@?¸Ò|Ý?ã)g4; û?æÖ¡)Í\?˃zªz>\?Ù_Šú–Ï ?ãÆT¸RüÌ?ê´5¥Ñ?êu|:A4±?ݦጊ8t?ÇéÒæ-Ü?é‘£Tn?ìÿ˜Ú¥Ì"?;îí@àP?ã˜NwåA?°üchxT€?èŠÊÑ´‰?ÈÕ%ñÐ?é`°¢%'»?çJ¿{aw?꺀.¬-?åzÇ<´Ì?åj”HÖ>®?âFVìésŽ?êu•€B|?ÖwùéŠdÞ?áeEw¦»?á”ËÕU=L?ëKû-eÿ?çSŸ6I?ïã ³…Â8?Ô@PÚÍ?ïòûËÌ(–?¸ëùòð?ɆMg†þ@?æ*M´ÚÅé?á0-,ÉTE?ÛxÆ{3ÕÊ?屬Ë7Ü?×€Ýý°Ðx?×>þ&?¨œ×Ó‚&?éàÇ¿‹1ž?á,ÈKŰ?߯@úä?ã3›RþhÎ?áÆ„Þ’é?»tþÕ³ð?ë—œ^?ç?àÀ *^Î?âÜ-ºõ¨C?îÔ"KûÁ?ÚO u]è?à3„9ÂZ?Ý{ žÚ$?ÒÁ¯è¬_@?Ôå´ÀŽ?‰ù6ŒSéÀ?î6üÞÎ?àê¹Ûrë?ëm¡2 ?µ62 Ä"`?¬áÄkŠc?ä1y!.Ï?ÑÎó³?æÜc¿÷?°/'Ç÷ß?éâvB#•?îÃÛµÔ·0?î]s˜ËÆ=?¾´K´3ðÈ?ãǫߕ]½?Ûø+ mŠ?ÔƒªºTÇX?ìïÖû)-?ëJfC/ ?å_Å‚À?Ï*2 Ikd?ãdŠÎÉ~;?Ç‚Ð}ß ?ëìñêÏxÊ?žÉÑ¡À?ÑYh«Ôž?äºQ–Tr?äe“½š?Ùë~ÿ®ô|?áµAÔñ’?¦àÁ»ô, ?â‹l&,r?ż0Ód$¤?¼Í‹$1Ò?Ú?äŽ% ÖŸo?½“‡GP?¹ü Ò%X?Õe PCwÞ?Ø<åFÆz?ä`ø3¼Õ?¼ZÒf’¸?쩨ÃÉ þ?æ"{ÓÌt­?‘P•Q@?è]£aD@?ãPëÎÔ‚]?ÛUKÁï.?áçö<*P$?éR‹<κL?î#å Ÿ5S?ï9áåÖ?çÍåf?ëp ?鯆îÆ7?ã¹€Wi—?îÖì…?Ë]Ž!A+|?ÒÈA±ð?Öð“÷ÖV?âø!1“X?Á:'‰Öà?êl:ùÕ˜ã?Òçi`?î­Q+–ä?Ü R³¨Þš?é¥h_ÛnA?¶þÎÒ?áþµÀ4Û?é|ùQ×ã¢?Þ®·š?Ól6Hl?ܘãn?äüÉ5ráå?Ôë˽³¯À?Ýúîþ½ ?ῇ[¿ù\?áШrÌ“Å?ãk³ÒA9Ö?ß~ˆõä?ÍÆÊ…ÊHì?¹ÖÎh:5p?Á³&ÈÉÄ ?ȵ¬K—Ð?í¦ÔÓ‰§L?Øê&h7›š?êÀ„r{…?íi ŒQÑ;?s ]ƒR ?è2Èr¢ñj?ç«æ6GÆö?ׯÇë—&?×"p ‰Ö?ÍcÍ“ãúà?ÐÄÎådb?å £ ?áìžõ˜?Äìãh¸?âÜNVÅ?Ô¤®õê8?âO‚OÁÉÑ?î Ý TR?Á¿¤Ÿ ?ÔdÇ`²¸¬?퇣‰7 ´?ë *(lÅß?ß/~e ?‘ xoÜÀ?áBiž!?êÒøæzâ„?çW³V`»”?âðƒKõ¨?æš· %f?ècN.‚M?Õÿmj/B?æ3NáU,Ã?ì~¾ÔÄ2?ëí ò Eæ?ã´Áí8êÝ?Ø$¯—G7î?é‚wvþ‡ó?î5Ýù›Ó?Öù¾4 .?²I·R]¨?âv¬õ:ÿ?í n¨žÙuh?è¡U%°S9?ÚÜÑÎ0?½Q½{þ#X?á@YàÁ7ç?·õ—ìJS?ÊÞ†ü»‘ä?ÕHŠ’«ÄÞ?ÂÏYLAä?ÞáyÖ_¡®?ÀÒÃúSà?è×µJFÎ?î[é<Ó,Œ?ÊàÞmf/\?¯º•ƒB: ?ÐÔ(ž°óÞ?ê‡Ã H¨?Øe›×H˜À?Ê|~¼7N$?åi”¾J´W?Ï<¦åª ?Óø7l›V?æ‚PNNò?æÆ$F˜ÿ?æ;¿÷IòË?Ƶ[Ç~ï ?Ë>´ ´l„?ÕL}ÖI˜²?»¤`MÙ¸?ƨÌ&´ð?ÒiKFZ?ÞÄë*‚¾?Ô`hÅÈ D?˘"·žìÐ?äI³cN1±?æ’²SeÌ?¿J–¹q(h?éWYÃþb?Õ\¢]ò‚?Ó´}=!ê†?á§1‡žè ?í¨šeÓ?zyÀ?îK:¥w?ØÖ€ÇÂ?ÛÕÖ+‚–ž?À j¿ÓÌ?ƪ'ÀÚÜ?á84Q~ûº?î¨)qHL?ßÂg-«?êÈÇfœå?哚¼oÃ?ï\ÓKýr?ËÒ ƒ{É0?ÈY28´Ÿ?Ú\^>!h?àÊ8º£Ñ? ØHæìn@?àa!uÑ?æJEl ó?âBQwùàG?ãáßt´7?®¨‰X_²p?éø‡‘’N?ç‘ÀÇû ?Äd1ÿ…]ä?ÐÁVÁ±‚à?åÏPZ“¿?í´÷YÜ?É^ý1¯Àì?Ôø¾wÚÌ ?æºçW)?Ñ’Z))bN?æ ‡ŸÉî,?äd6uÏ…z?ÙÈ,ߤÏ2?éÁß¡^0i?ãcÓÞÛ?¹C°/Ç— ?Ó:õ?¤–?î©jDl?Ë&B$ïäx?æbØÏ"£m?ÔZ×°»×ü?Ù‹ºR¥e?å]˜Rú?ëÜÛW—£?ì½Ú±†ÓÕ?Þþ¿I¸ø?´ J ŒŒP?Ø{g¶e)N?ÅÈ™+PL?àš:?àˆ /A=ú?îùYCÖ?ë&¢¼ø¨'?ëTwŠˆ‘é?ç’€‡\?ÒôGMóü?¸?µ[É`?ÒŸ‘8x?š?â`ºTÝnú?îÏúVª"?ÎËÊDz@?íÖ° q?ã†OÙ~d™?ëö3‚ã¾?ãO”Ý7?ã ¢Ãm?åôh$Anè?ìXäQë t?’Äa–¶À?Á b5f1?å2-9¿$?ïa©6ç¹~?ÚõyÚlô?á‘­3ÉÔ»?ì`î%B·S?îÌG% êŸ?Ãqú®`?ÈULéÀ ?àŸ8¸ÍT?×7p¹œp?áFs|ë‹.?ëH¦ö³FÐ?ï÷ÖpÓaj?å•‚§Ã?äÛsËÄÍ?Ù š¢?;M~?â8Næ–Ë?ë1CÊêã?æ² þ¤¨¸?¹zÔ=”?Í®[² \?ÀÕ‡Lê\?Ëy^Jä?Ò-£üÀ~?àâî[[?ÃËÂØ²Ü?¿ÒôGˆ0?ãJx-À ?ÚzÆÁ ‚?Ð2æXì ?ȧ¤ %»8?áåðÎòoH?ØÓœÛ«ÑÌ?쀱­<ß?Þ$.¶Í7¦?çpÌ‘ÒI?é. ¯?à\.%ßÄ?í=UK{ôØ?Ú²,uèf?ëgU[À ?áky‡av ?Æ”94õP?îœÿ&j?éØˆÜ§?áQi[Gœ(?»;ÐO–€?âFœ¼0?Ѥ¿³.?ç–ûáÒ†?é6_dÚw¾?ë)i=ˆf?æ;>™ŠÂ?äÎQB×ÕE?¹—qa§+ð?î yc£þ?Ñ &Nû'¦?ép=¢"¹?ÔD¯£·Ü?æ·‚G?àE¼²xe%?Ù52²ê’?Á•[Ïí7?áÜgMûš?àW×2[^?é\šÑnw²?çü­µÑáy?ÖXj6¤Ä?Þ¯R¬¼?î»§Î@G±?ᓚ¤åø$?Ú¿]n^?ß#“õ á„?ÜHmU¸?Ü âˆí?Ï©ÎBlµ?ØSó »Ú?¡‘¿0?î¸.‰¥PÕ?áž’àŽ?èb%x ®Æ?ÑÊãvÇ?ã=|X ?qlÂ+fÐ?Ñâ%A‚/ž?äÀÑ8¹s?áž@¾Öá?Þ3Áæç\Â?Õ"8µî›–?ï=†ql¼ ?æ?俤°?åBÛ Íê?듇^Û™á?Î$§yÖ?¡O-Í€?Ë‚kS”€?áœpE%ɱ?²ÂlåÉêÐ?Ýr­ Vþ?ån@¾/?ÞÚõ]Çà\?…³«zÀ?Ö¾!Õ³¹Ø?Äæ[$A›?ÝT• z?±n¥¿½h?à—Ÿ™Üç?ã';>`?ã7=>Ô?Â~•Ý›¼?žj»À?í¡cjo?äEF,_¹?ç{ÃÂ?ä C½s½]?톳æø>?²`é?õ¿?Ôz‹MýD?ä <÷aêä?Þ*k¶?Ülï>44?æ¢ß?ëõáób‰?ëQð¡¶½¾?èdm"®Ê?Ø™†—™’?¦‰áŠ8ð?ç­¬Ñ1Ó?ÝyÍ+xÖ?îú†ÕÙ?ßàèC?ã1 <ŸâV?ì~û®ó?á™’AœZÑ!@?ܵ/IQ8V?ÝàœOþh?í vÝ’!?ìž¼cÄ ?ãÜŒi2öÕ?Ó85œr,?égÎÑP4?èHdHS?ê!ºrC E?ÒhííÓŽÆ?èŠÏuâ/?¸Ñ;áð?èc¡¨l?àςۻNä?ÊÊ ýW\?¼ãÃÙ1’˜?æ…’9,üs?Çß2¬›#\?î˜ÐÇœ¬?Ç6}:vÌü?ؽÝb,(à?ꃽW‚J?ÝFÃÊEâJ?áÁ–D«·?ë{’ ƒ•&?Ô•ÃédÈ?æ²øÃH6E?ͬˆ!H?êߦñ7µ¿?Öäu6ò¾?äT;z«ÿj?ïŽ~Ê^?ךOC ¸ð?ÁcZÌíD?áˆ_rÚ3?ïUœþÍZ–?ëèÌ-Úå¬?ÎêCF*ð?߽מš†?ÖáôpÄ?æû(3Æ‘!?àªÜX£”?îÿîG?ÇU’§Wy€?é‘ê†À?ïÁo#—Ø?Ò€=?ãÉúrór?ãðAÔµT?Ç»­DZÄ?é÷®c¿/?ëÏiÑYE?èò# ù –?íh}½´T›?ÆVr›b?àHH¶$ ?î]ýJY€?ëžUÿ)M»?⢡ eÆ?ï GCS?¿˜´.¿ÞH?æé3ÚÆ¶*?Ú =åzï?éX–˜ÚÚ?Ò§¿3@?Ñ6,‡žèJ?³­«ë¡”0?ï¬ÄÖàœ[?Û‘ÑÃËœ?êó°×Íï?É=“šš?Ô”‡Îæ’æ?êwbê]D?ÒÓrlʤ?ÕO|Êq&?ãÂvÖ!ì¼?É4$~RôP?Èšij9d?ïN’nÉ¥g?Ì=ÎK…pËŒä?äÜ¡„áçÆ?Ü„wyÈ?è°¢·>×?âã³g?º6ôK gÈ?ç`àÓjiQ?×·_{cD?èóa=ãUÿ?Ñ«9y”C,?äÏmÒ*?ãaþ‹§´æ?¼—&Tš+X?Ø‘É1€:?’dnèRº ?žÕÅ÷¬Ò ?Ë/{z\?é`]•†ä?ǺÐÍdh?Ñ Ù˜5¶?³¾‚Ì\vð?ÛÆíö¿l?èÃî|Š€?ìNÚõ.r–?¿4Š’ °?Üå½Ùúcþ?îžÝXº°}?î$y‹o°˜?»‘gu…>?à©‚yøƒ?Új‚¶aqN?àU€#i¹å?ÒcÓæœÚ°?éo .¿?êD°òn?Y?âó'däz?Úä4M¶?㋪¥‚^?ílʯ8Œ:?Âx_7<åì?îM\©?Âná'F6ì?ä †qŒT?ØhÓÃéä?ä·«ð“?×YŽä… ?ë§V9ë¨m?ÓŸEª?™H?¨tçéÀ?Üѯ— ëR?è›Å©ïª?è‹L8ƒ‡?î¹"&S ?Û!ï­(õJ?¾r—¯ùŠð?ªîºSÔT`?Øîx[?`8?èhvæ,B?ÒÌ&@þa,?å™›¶†ã£?·X0¬îCÀ?êÒñçÜ7¡?èhÎZ”S?ë$3µïä?ÓÅˬ²?Ö—¼E«Vj?éyŸ»øåT?ê ½(4$ ?îïRsǼ/?ï‘í糟?²¾ðÎcp?Óõx>z?èÛ!Ìz¬?éæ…Æ— ?ågӏР?Þ’AòÔct?ëˆo 3Y˜?ì]ÅR8ã?Ù„og?ÜnW·V$?Ü kûRà?Ø-s`ÞNü?¸·J2 ?ãÝÄÊ•?áßUÒϽ?²N¾MrBà?·“”)X˜P?Òéé/‚Ñâ?ã0ž‹?¥?×ÎL]âò?؈.9Ü?ÖYEþ,?ëÚO˜:&?ÞÉ8ÞŠŽ?ëà°ë€?Â>4ÇTt?´àcorp?âUаk?äØËƒ]°?î>EeŽA[?ÐÓÓ''ÇŠ?Ý4Öµµ,‚?×Àôh­X?ÙD QΤ?èÆW”"7?ÚÁ—³øº?ëþž9°=?ß ÿö.fÖ?Ϫÿ·•Ô?Õkr¦ðH?ÜÛÕï›UL?äþâÊôë?íèain?ß©Œ­NÊ`?íaìµÕ?ëZBѨ_{?쎙µã²?º\²¦[ݰ?䚸ß`Ï?ä•>ŒÔ„?¶I<_j:?Ë@¯Ä?ë?ûWŒ2©?먅×ÍÑ?ïJè¸-?æÁ™–?ã®·XØqO?ØÔŒ)vì?í¬?Ö¦(ÈV?è '(#Ón?ïoé=•W?âý˜Á¾ºË?½Rõ/—x?çÈ$Ð!†?Ø—ËýÇ>J?ÕàÀuµ€?ÅTa×s¯è?à;ð[0%?Ú4˜??Ð^ûdàG¼?â¯óHÎÞ?Âë®ìXÝ`?â:k•?èíìíE²\?ÛàjýÂ?ÑÑ_9 ?︶Ë5ؼ?¤”ñd7B?½—Þh?êc©Ç‘Ô?Ómt#_^:?åê2¯Qª?Þ¢uMr†l?æç›Båe?ïmrÅß–?ׂEöè°Ž?ÅöY~Ë]œ?ëpClUn¥?é{õW?é$V‚ÒÍ?ç6`)gþå?Òè¼Öcå”?Æ{oP ?âÑÀ>ð…?¯æt(5ÈP?Ò“8›5å"?œ>ÜíAÀ?ÑÅ=ÜíZ”?Ëië¨e?Ò„x(/:?¾˜…-,?¦ŽÕI?jP?Ô^™ò‡?ÇjØ©Œ?å¦ï;cY?êٳݻ֌?Ñt!NéN?îgÓõ?×hýfš0?ÕØDU&´?ïFtë츮?í–èYµ.?ë||A„ 7?Éä&6î”?â ðü×K^?Õ*BZ Ò?Â~”Ÿ‡çØ?ÞE˜î@R?Б•Dlp?î$‡áÅe??Ý¡†•ÇkÖ?ÜŸÅÀˆî?×ÚÌŒoÆ?íàšTx?Ó¦&+Zh?í:zu@„3?îïÒ© ’?çÖ¿»ñ]?'…Ýcù°?ÑÀ=i.ÒÒ?ê³ÍÍ=?ÁLZ˲Ê?ÄùN4´h?çäƒ$Ñí ?†ë9½V€?â“ëŽ{½Þ?âG3jù?í-úAf‹?¶³uÔ8?ᡨBs?ì(:ü¨?æ;¥œ‘Û?îÑQpœÍò?ÔGÆÇsûð?Ü& ÊÞb?ëµÂùQÇ?ßn­ôrãÔ?ÝØœóïeä?Ø« §Ü ?á°´á6 Ü?åî[rZö?ìµ›ãë?áT—æ$?Õ½¦Ø ·º?ŠÚ©šÀ?îW€DX·ö?á>l‰~3Ý?“#޼äà?éÀõ vd“?àîÙ¶Rª?â›­aÂ|¡?Å7ý—dÕÔ?æD²†c?ï•zȱg?¡ž™ e À?ì× Â}Ë?¯Ú£æ!ð?è7ç5mü]?íáÎð¹é³?ä‰põÎÏ?ÚH:ò'£?çŒ#»>üê?ßþ ‚ð?Ïô5 Œd?ïJ†Üø?êy°¾ç…Ï?å² 6ïì`?æþûÞ{í?Ùn…¶õ°?¤Æ–çr­ ?Ûm:••{ò?Ê.]+Ñ+d?èsSO³y?ÏI×Xœ Ì?ו-áº\?ï=Ï!¡ƒ?ëe ¨Ëë?胆ÙDy?âÀìI±¡?ÞÃ#ç8?â,€ÉVTö?è¸1ÈV¿?ÈçX(Ô2 ?í£áDòA?À¼ÁZoCØ?ëZÏrÛ?êM±Ó°îÃ?Øÿu2Q0?×5¬Ôñ*v?ÇŽ%§¥Ä ?Ýw’æ ?ÃÀøÁúâÄ?âfÍCŸ=º?ê A%Ä¢?Øow~ÓÆ?È7¿»p?æ\b±$?à~¯uaÎ?±©kÊg°?êÐû)I{?àŒyЀ ?G<˜™?ÓöÌŽEP?Ô úP¾Ö^?ë‚cV‹u ?ãN Ðö]Ú?µÂ¹®¸?á¤7lÓÆ?Ð}4ØOì?¸ÑÞÀgúH?«v³¬åŽ`?ç;L§?e?áÔõõÖí–?ÔÃ24xɈ?ï8¢±µ?ÜÓPúöhº?ìHE9oÞ'?ÔV_¾®Ø?ßïú^u:?Ê‹DQ{`?êt%³sÂ?î‹ÿÂÀØ?Õ.Ñ]»¶?ì¦ß ñhï?¶ƒÝ:HrØ?çXÒLÊk?ëÛ³cH˜Ë?ÈzT€ÁBì?Óϼ œ?ÛûÑÁ˜Ø?Õv»÷T?Ð=õhnÌ?ž+³€?°¼„¼4Ø?ì“™:{ºá?íXüz?âÖôîÞK?Þ$ ëúp?ݼû’A!Î?æ*¿ÀÏë8?à5ÓlƒF?²ÕŽ=ñø?ÄœöTp?ê¹ñzß!?¿+W»ñ©?ĆŠÿÎì?ì´U?èIzUÿ~V?Ôäò—Cv–?äb££H…p?æâl% ?ìӮ一Á?é,°«×Ð?ác‡'Ö ?¼Ý®ê>@?¼øh~ RÈ?ÓòÀÿ±óà?ÀÃ…x5õ`?ê¶.½I‹?çù_xì¶ ?äÚZùÓ?ˆT‚ ô?מ³bj ?åÛo—b?è~M+“Ôí?ãÞž„Ëzz?Äy^Ý„³ì?ëbÆù¯ð?Ê“C±ü˜ˆ?êðwB¡ý(?äLuLçN?ãm.Å/m­?ê‡Z3H?à~ÜÛ>Ö?î]ªP=?ìFÙÔ,ÿn?ã…jÔÇFJ?¬’á äŠÀ?àßM/GA?âš™^j9Ç?Û™Ó²D´?á@•í;w?àVìþN?캻sËú?æR ‰ëúÉ?O–oCw8?í3Jš+©(?ªùŒ¼P?Èpð3f”?â?²‘À‚e?äß9_-?àËdó§ZÌ?ê¯ØëùõT?êñP¾‡˜V?á,Žã²%?Öíò^Q²ú?礀=F™Î?ãó½Óƒ„?í1ž‰É ?Ê)Éë–P?çGç'ª´?æ`êps“?Ôj ¬¦/ö?ÛI δ?ãèÕ±æb?ã"C|ÔUà?ãÀ>Y¡õ?Ç.ÌçL+l?ê8šò'8˜?¦ˆ”×) ?ç¥h¡ê÷â?ÙªL0«‡?žÇòEÐ8€?Þe´p?ºÚhKMP?ë‡Ð„ˆH? 7Ó?ç_á-eº?îÕ-Ù4B-?ì0xŽÞÆö?¾ä¢’ú¸?ï?â€]d?ÑÌt|Aм?ìÕôì @5?Ã×Åjöð?滌{‚?ÒñùÿD?ÖÔo:â¥R?×Â8§÷¶?Ä™*h¬?çv(À`˜?ç³# èß?Ãe‡ÿÚKD?ìôïðà¬å?ë‹XnÙš@?»<äldp?ëUÌcÑT.?ä s‹«“´?Ç‘ˆ·sé8?é[Ô—ˆÅ?×ÀdÁKÕv?¤Éˆ$l–?á³N~Ò?ä•5²câ?íº`O0i£?ÈøÚV¹Ì?ÄWpƒN€È?ŸyUEo[à?îDÖ0¬ ?Ìé÷%}l ?À)ßž)ë®?Öy‘}ªª?ÂaëœçêK?à<+WJ5+?Ôp çÀ|?ÑaÒÝyJØ?Ðvb¶€?à1í°0&ª?à;ÿà¯{Í?ÅMfzPŒx?ß§Ív@T?ì-áKÿçÎ?ÚNGY`„‚?È¿"t?äÕŸ„QÄ??åÃb•1í?áÑ=\\{?€çªá?ê˜Þ©æ³?ê2:ŸbÜs?è n‹Ö?Ù,’ ?ë|í«é?äÔaÆ$ÿ?îìP¦`?Ô¬9{}Ø@?ã8¶ãÑ?ìx–Ãå‹ý?è0̲Ny¤?å´,L„ò?ÞéXŒÆj?Ë÷'±ïˆ?߃A~s–Â?Å}@â‘8„?Ø”Evõ/à?ÚÁe .kà?㙥g$¼˜?ËJè^`µø?ÔF.TÿX?ì@Šüûœ3?Ö¦æe³þ2?Ô*F,`®ð?ìÒIÿ|8?ïm0s«Ï?ä48~0§´U?Ì8(³Ž¹Ô?¾ÑmUÀäà?즣÷Ǩ=?ÝS§²º?ëØËÜŒœ?í´—œOð?Ò´ ò³ˆ?åøŒð ›é?éºpwÍï?áë ¯AE~?²«^Â}@?ÕÏ-.’;?äºÌ6¹Õî?Ýa¤±²§ˆ?ïä°ôxÏ?ÇjïÐql?ìyë8OŠ?ä+kà¥I?Ξ¡™H?è?÷y?ÈWýFÞH?Æ>^AJˆ?îÇœŒLº?äXý6R[?ââÒΞ]Æ?àeâÊ?îêoã(1?íKæ¹°?Ö ^Ù©N?ì¦=³Ná?®©‚KkL?ÆâZ8óH?Ù}š¦$Iœ?Ù_•@V?˜?ÙQZy†?ç–rÉò?ÙšÕf•S”?ÍÕv(sŒ?Ò‰®„¢#?å¬Ðï:ña?‰0°¦fÓÀ?ÐÍ*`d™x?Ûõ"Áº"?Ñøav$.?ÏBQ~†@?Øp«>Pû~?Ó4öƒîR?Ñ ª¥†nv?ã]˜â ?äC2B‚”`?Ì€êݵC\?ÖGÅô~t?­©N - ?é2Ü¿Ô?©¹úF2p?ë¨4ç"¼ˆ?Ø#!ôÏ¥"?Õ§¨7ŸYz?êK½”?äTüÆŒé?íµôx+ž?â‘o©Ý©x?ÙDxÍVœ?Úþæþi?Üíoñ?À]Ê¢Ÿ\À?ÂTp#‹ëÌ?¤*ýü\?àÔ.æz¸ð?èÑ3PþO?àö±Þ]“º?ãW/;£/?ÌŒW¯pÄ?È?øRÛ,T?ãã{D§ñØ?îUO'’‘?ßú½SÂ0?ï(Øðg)?ÐI$?¯îmUp?ï#2q‚›X?Ï%eK™˜?âîö”@A?èì¦Iû?¹¥æ,¢Ú(?Éslؤȼ?ì%/‰KY›?éþÜÌ=?ØiƒAž·Ò?Üá ³ªÞz?ìC¯øäç?â7ðª¸S?פeèš?Î(¬ Ž#°?â8p·Ýû®?–žæ¸p¥ ?Îj¨·TuÄ?ê’½Œp£¡?âŸ/¼ç²§?ØÝÎúÍ~?ÙAjæ Ö?ê×ïVßB·?á òO ]ý?å˜þ¬2z0?Ì7.¢çè?ÞqQÐ óŽ?àÎVÇt×?¡Yšú;Ð?áÞî0¹)Á?梞I=–?ÁsRC¼¿ ?•Y{Ê €?ê`{ò*¡™?̹Êë¯è?À_š•…|?ãÄõ´Ö?æ×²ÆÙ¡?ÏZÞš˜ÂX?Î %c°¨?©³É™0?ܰ³à-¾?ÔÔØ"8Q:?æâšNý?²KsÛ /?ÕI[K?¿QÜP´p?Õ‚‰²ÜH?îØÎÓ°?é{_-Ÿ?ßÔQv™?±Ž.S ?Á9ÎSfVœ?ããŠãêñ?è+{,?ë]x"þçÑ?Ñb½¤BMŽ?Ñ… ÂþFv?å³àrS\?͸áFPÊÜ?ãBhZA¤ö?ÓÎ$·¨`?ég.v)¢?çl†×Â3?¸F v•ˆ?;ÊW?éDòuJ$?äf+kÏpä?ãB 5®z¾?êK¤Y»ñ?Ì‚ Ø™ ?Ù`6röH?îÞ'÷ÒpP?ß'ˆ9͈?ì-ˆG¸û¸?Ø\¦1%nL?Þ¢œwvéØ?ƶ×Î%µ¤?Õ€`z.Iø?…îæ"qD€?ê*b«Ñ½T?³û¸pL?æïº)®?â÷.& Í?éu›„ko(?Ö–;v7½¨?¤€~BÁ?á íp‰ëo?ä¸é'ýc’?Öº8 ~?ïu?©õs?×R-M~?èòM:.Í?Â+F‹žó¸?ΈoFAá¤?Ô>0Ÿ(ð?´]ê±S@ ?㮢ýˆk¨?ÝÕ’,Š?Ü^2«Š?¸®ú°?Ò*‹!˜¥ú?åMÏ»}…?Æå¯eñ]h?ï¬^äÜÁ°?ÝI—¨¨Ô?Ñkà\-ÜÈ?ÔÔ”:„ïÂ?â€Ç7EŽ?Æ9X‘Ú?äi‘:7±.?ﲿKÁõá?áfÏ‘¼|F?í+ÙDy±-?Úâµ/–?É0Æ//áÜ?â ž o¦?ä°×°Ïç?âY@¯‰xÁ?ÁGå»ârP?îú³—e?ÎÙBde+?â<@rD?éf^²²&·?ìÅ ]?Ì-Ù·´²À?ä!žÀ\WÍ?í -èdª‡?åí/~Fb´?ÛGxfVP?Ö²¸ÆûýŒ?Þ ££Ð?ìb…½D²?¹>Pª±9€?ïî>•©öv?çô…Š~4?·=¥Ä?ä?ÏoOÑþ?Ñ况4?¤Ïî„V?ÞlMD„l?Ó¯Û êp?ï‚¡î´(?Ú„Š|¬?ìuøB2§M?çÔ¶¸¥?é@â´2_Ó?ã:‡ê?â¤c}†À?Ù *"{²?âæIg¿ŠÉ?è"¡É r%?ëlßʺÀ?å×ôÓÇL?â§=ýšeV?âø¬HU?ËwÌ”^ðÜ?éפi[oŒ?á§E,?ëfB8té?í° ä0?êõ–˜€??êÃõ»9Ά?² àIl=?á=Å:`?Ë–*.é„?ã±0ãH?ê’¯W,ˆ§?éèdž@Ð?ƒž‰§@?Øj$ìƒ\Ì?Ò?}KÃF|?×Ó?ä÷PÒ?à0¥{fì`?è¦ùêL Ä?îb£WˆyZ?æ•p9è»J?Ë~sHK~°?Ä ­û‘o\?ÛÓ]ñJ?àéôRÃÂt?¹e¨åʃX?Ù¹äW—b?ï8È?æî¹Ÿæ¨q?ãå8'Òsü?áÁ ³.š?â=>Þ×R?ĬÊ~Œ?¾A&´:ª€?î×ädÖþ?ï­Ÿ«JW”?æ<^3Ù­@?µMÆ£<Ð?Ó¡‚ ùs?ë2ã ˆ'?íŒ$é÷Ø?çmèãÙ?ÑíãØ$@?Ý}Xð¬L?Ô¥œÝÿ{¾?èþÄí?Ù^ÿà×™ ?•ôëÎ ?µ0VвH?°„6d$ à?Û› N6ž?Õ\òÎè (?ã Rïe]®?®ù ……1?ÞÐ/vp–ˆ?âpQBLÂé?уeL­ ?«µ åÝ& ?߻̘µ®€?¦XÊL´0?ßqs _Û?áYú.0V?Éž×yËѨ?çø¹Œ1¼ä?꾕ž×ˆ ?댞ü‡=¯?ì=L3ƒ^l?êÜšbd8ˆ?ælóyK×?å–«5¸«?ì žeGø?ì_âZìã?ææ¿v”?âVðiE~î?ç <€sÌ?õ¹Öö¼?âbÀ‚aSB?Òta{ ê\?ãêwiË=?Òq~'¬Ê?Ûß&÷:…”?äeüêÀT?ë7N=•?âËÛF_{ä?î]<¤æ?´-8dZ‚h?ç!~Q9Å?èfñÜ`©?Ò¿ô;áó¸?¬B±†Aà?ãIƒ°ôß*?‘¹0#@?¿Š+iþÒ?×. ‚?ÔÌB¾öú´?Ôg µØçè?æ|ÑV ©?æ~D>,J®?倉×ݳ?Ô°$ˆ.ª&?¦XáJ?ã‹4xA?¸e–×À8?ìÞøo4úV?¾·r(?ä¯$,¼HH?ëÚzzã·?åªCB“Ï?ëì+\€{ï?é'ìòþXQ?èvh†•©?åtišdæ$?ï co¤?¸l§›<¨?Ûï %j?àü¶ü ]B?æB)´P„‹?ÅEMò)D¸?ÃÀÈ E¤?à5àî=Ùæ?è±NêT ?¾,Úd…à?°ùM°Çˆ?çí÷fº·z?Õ!ejÄêÂ?ìbÿlÂ?áv‹ï6+?º°8É0 ?a9¡¤?Ò+÷’SYÞ?éLG¯ü?™}‰Íò ?â]¬zß?çzþ,û?ê”G#8#|?ÞŒ¢“yðÒ?ÝÕŸl+Þ?â…²lÏ’ ?·ü‡üUxø?䨖Õç?¹ƒyØ\è?êÓ\Y·?Ò®ã@Q?gO‚ǹ"?ê…ý‰ =Â?×{ÉÁºœ?ç…ÿ¬±õ?侺¬óFH?Ѐ%çì(~?êüÕboã?ÖÑiw±b?â8EØŠEË?âm®e,Fê?ëº)<°R?Ì—œ?ãØÚY9°¹?äÏAØ<ñ?Ÿ;£m- ?ïVÚ«Î?ïåèCç@ä?ßwÜ|9&ô?î+R%Èœ?‘Ø^:óÀ?ÞP`?³³Ì?Ê‘9Mò’L?Ùz®³ãº?™¨æÈÂç`?îg¾v —?°&‰%›ø?ípߨ¬ô¼?á0!Œ•bJ?×ñ²ÐŠÃ?ÒdÂ69?¤ ¡j!?’N;D?`?ß²¹Ü¯Ò^?îóVr[]?èwíV‰u?íÌøèìë?Þ®(¼¢á ?îŽ#ßù?ëûÓß5MQ?ÚSìÉ*tÆ?¹ùv#h?ïðPÖÇcó?çž1޽`?æ¯B|€N?Än¤bRl ?Õ.‰%Ñp?îñ“PT~?ì´Pvõx?ïЗMÔ²?è ]DÐs??éƒd?écÚå»Ò'?ÚIOb²˜?ì´EÆ@?Ç]âoÕ” ?²pô¨(bè?äÎ|Wpï?à W“¥Ò?ÀÏä)¼?¡5 ôÜT°?ãõöŸ !L?Ú&+Ž'?»å]¡?á󪕖Ȕ?×öK€²œ?Ù·?^ ‹ø?±/\l¸?킪ό;?ëýžþ{,$?<LwŠÀ?ã<@ÊvŽ˜?çÌy‡?å ¿Zœ]4?äéÔ½à#?íë8^q :Mû?ÅÕ½úuÝ`?Ù Bw/è?ßqB{¸?ïâ˜~_-î?Ô"<X¨?ÞÿÛiD8?ÑèyâC)b?ì$ŸGY8}?´cxw¢"?ÜQ¶Ä–r?è|?Éô:(?ÑMÑnY#ô?èöº=…?åc0¹Ä[??çJõ À?Ù’š‹‹q?á-ÂNøõ?Îmt·˜ãT?æ!ðÊù?„dkBE€?ÙÃÐ/²Kf?Æx±•\Šˆ?ÛjËüÄ f?äî„UE½k?Æì¤Œu¥0?ëjùÚÿ?éæÒ‰?§Ž/³„Ð?ÉZ›(Ò¾Ð?äJöŒ f?æv%N 4 ?ï÷ OÖ4?í,zJBW?íÎÀÛŽ¬7?œÁ…#O€?àl7ÿ¾×è?ÁÃSDØ?´ø}àŒ˜?ÈÿUB†Rœ?î>¦!4.?ÝëŒ!ú>š?ØŸðw–?äå/gÁ)?ÞÔ”—ÇFÄ?é‰jèXê?´œŸäð?ßs“ÄûøL?ÕyF†i¨?àγu!Ù?’£`I”`?¼å9K³Ñ`?¼îõ _ŒX?ÊÛÕ.àµ?í~OGGÂû?ØoÅü‹á.?æQ>Äw?ì«vº†*?ÔTùÿ4C?àkÀì®]Ü?Ì¡¾!HÌ?·)Ŧ6Nˆ?á{WU-•h?¤M€* ð?Ùž|Plcì?ÖAÖÑÒ?žÃ tœ‹À?гEt?×R÷÷6´®?áF‡yƒ‡?¬ZÏ͹ÓP?í¸¦"­Ý¢?¶š‰5çè@?åbSœ„ë?æ²CÊïã?Ü!¦®š:?éI6Ýân?¸mVQŠØ?Ýý4†‘õF?ØBpG³inË?êbàñ&ùˆ?ÄKÇL_gH?éL€ ƒX"?Ü$@¦j?Üw3gLâ‚?çašu¤l?¨ú^ûzÐ?ãò¹·’7?Ò›ïÇÍ<ª?î~Ù1N|?è;0#€?ænKÆïØ?¦¯wtsð?Ñ¡Uó–â,?ï{GCœ{?Ñ„Ô=i$ ?Ô*Õ—?柰K¬M#?Ôf1 {Ê?ïìšÙߊò?ÅÀÒÅ™ˆ?èrú}ßž?ßîP$£V4?ä?Ÿ6Ó›?çóП/h?Þ#ÔÓ‰œ?Ñ\€àòìJ?Ö{óW¢?»Ì¿B‹?â~Kd ?ÁB}ÄôÌ?븱LeJ?ê“*‹0?íëÎßõ?Ó OÑÓh?ÚÇ$ŸQ ì?Ï‘;öJ8?¹¶~ þˆp?֓ê?áñ¤º5²„?íM†9bF±?Ñ×ãå'†?ëþ“<Ü·?êu¾ä˽?¬e¬ÆåÀ?ì—¾…°?㎣WzN?áŠù-ž¶?í©1ÃS ò?êØØÇn?ï…yéÙ?ÑÑËß¼”?ƇÎ{Ð?ÎŽB[¿¸?Ù{#Ø[Ä?Þ ~tƒÁÖ?ì”%vW}?îžýsðM*?ÎÀK/˜àÜ?Ú¿Ü«\DÊ?覮ÂÇ¥?ãz{uœÑ?àW\m$?î.±l¿6?áÀ¸Ü“°?´ðvMr?Ø?îd*ÁÔ?ëRÝß\Ä:?ç°âƒ Š€?ìÊJ¦=Œ?ìA5¸/Gô?ÔÒP™·ì?îãèb0]`?ï±NúsŠì?çqדàj?Â*˜X\?´Lú¶¨€è?Á˜Jê’'°?Ú›µ£&,?äXyÛ¸ö?áÇ@ÌÂêÓ?§õÃÛFÀ?ÝäEzž‘V?ïã[§Jì?Í—޼˜?Õ—mWpf?ä±ÞÆ2[?°9x?æ~GŸË «?çeÍWõ¾?à²6%Áéó?êZŸýª?×)zÂ}ò?ì/"ŽŒŠ?é1x…-’É?îI(²lBB?á|â¬QB&?Ã3‡î°%?Î@Úv6µ¬?å „èp|D?½ãñÙõßè?ë.µ¾‘ú?ÏŽ6ÅîÜ?êRÚê*’Ý?ämYÎΩ?äRÊæ¥º™?êªe×ð?à€Ô%x¢ß?ÂqÉ–;‚x?ì -á‘ñO?î\Á˜›A^?áî¸l qz?êoƒ,â«?ÔýKUQqâ?àžT™.ÚŸ?á¾£Õï¥?Ú€(N[ÚH?Ĺ~Iõkà?ïÒˆ¹#È?ÛoÁ´0?ë'"e™À?Ó:ø¨¬„?Ó‡Àêp\?Æñ>cMФ?å0Òãâ«?ãað» ·D?ï·ãàn?Þ?âI;²?ëŠLõ?ª¨ç$£¿Ð?äûÊ’ÏÀ’?ã=ìóNEX?×~C—û Ð?Âòq¸ÈÐ?æiÎÝhÛ¦?æu݆i?îB,Ìf¡?á{©j VM?êd2´  ?ÐØ p¹^?€ãé…ª@?Éèç¢ÇÔl?çB¡Ç¸›î?ãzåäW‰?Þ³„(gæ6?âúBÆzˆš?ÍO¤Æšm¸?ÐOÔ¥ŽKÄ?èáª, Ý?éÉ„š§eB?êy}”¯ág?î¤G†I'?çìGC©hŽ?ÈÄVD(ôˆ?ÛNY‡Y?·v'¦àp?Õ› å:Œ?Óa¿ÇiU$?Ö(‰Íh\¼?Ò‘%w¦Ç®?É÷I)1äÈ?Öb £g&¢?ëf¾ov›–?ÍhŽ~¥óà?篸:€¹‰?ãhD%œz?êŽGW‰ü?æúf°;dÀ?Úåõý†?ÀâiJêÚ?á…Ì*?«Ñ ¬ç­€?ä$Üåé?ÞÞbß2?»OÑ?ênh?Ò;5!èÑf?âÖ±J4Î?á“Ä#ªP?Юă¸?î’®SÂ?0?àz“MøÍª?À´v´K?ì=?®‘Y?ë·±þV‹B?Ñ\ovË l?Úé'îÍœ?®¡®þp?àë¾(…a?ä% › å]?ÛÏù™q°"?èzÒÜÚ-â?à+q:?¬– úÄ8P?ïŽîÿ£ïû?Ôô$H4„?álcp[?æUB2µ?Чlaà?Ÿdòi c?“é5aÝG`?äìÞŸâ@:?èÇÈe¨'»?ÒgßâÑkú?ê{p85Ïp?ÕÕî¶ðÍj?Ø ãn‹„?âëni«??ÑF ?ú?í8:]'äL?z¦Ü&C€?ÏPC.Žìˆ?ç³’êLòb?æÂÌ@È?â}gØø$?Þ>µðž[z?ßP8zQ™ú?à€i½”?l¹NðãŠ?Ñ}Ò¸ä?îΉ>•ž?èˆÍ”Zé?åúh•H’?âxÞBæ»?ãÄ.5N¾?Ö¿Wl‰º?ç:3­i u?çetI(Oè?ÀÆõE`È?àÚ™8šˆ-?ç®êØö±?ä t?æœâ@wã?â"±pm ™?Õe}qIh?ª6=Âó ?æé×Þ?ä[Á?&?¼?æA„Î7å?Ùª&øÚ?‰O)ÄÄ?Î ù(šrÌ?áãzwY?¯¶…\ÆC?íSó¼vb‰?æ¬À¬¬hG?Ú†–CQ–:?¡JâÇa?Ì!1ì`H?ë„Jûmu ?ábO%G˜~?žÌçœÀ?Ü­™8c‚?ãÙRÍn„?ÜåF©’fˆ?æbhzw?Ðv'åÒò?àE<'?ãŽ~à”?êÞЀ°÷?îå+Ìcôœ?ÐZ¸›úæv?¡×yß“s?×]¼Éï„?è/2­½åh?¯…Ùà•Ë@?ÛºéÛXþ?æã`lÑ?íðfy~?î™7IrÃ?Úâï»ûÀl?ÝÎú¥fûb?¯Óæ¡Qõ€?Úù§kö4?܈»³‘ÕŽ?âã(o4.?ßhSçÍò?Ø {Öׂ²?×UÀÔ§Çx?ÖEkÇý"‚?©Ä§ÝT°?ìäR%e¼ö?ÝRÃtPô?æ-Óà‰@é?¹dÑ÷¦¨?îá”ZÔ?Ão5u‘Ä?ÕØ¨ƒQþ?ç á€K€Ò?èfo ??äÕ®iFåZ?Úk[Ü­}†?,};Ú°À?Ú={{C)À?êT| ³‹´?Ö¹Ïs…°?Úsi›N[€?à´›¶Ý§q?½š!€H?Ø•K+Vú?»®P´\Ï@?Ý+5TîÆ?©ž?f47P?Æ©ÇgLÔ?êff ®3?×ó´Z"øº?ç÷Hð\[?Ènt)h?Ð,MôB0 ?ÙžOƒMø?Ø+–°A82?ëD‰ýá'?”tÃm–’`?ïz¾„ô?ØôÐè¥'R?äÁOŽûˆƒ?íq¼_ò ?à”‹Iî?ã•%çªÌZ?Ùh¿çD?á_^­Îvþ?æ}Ä“«K°?ðEW)÷À?â<¤—Ùg?¿üÀ»Ë6è?ÙŽ1xa†?âã.k Ý:?æ¾k6 à&?íARø(?ÎÊo÷4”?îÄ a……?Ò=䃀Tš?åo‘ñ¤l?çÀ35b³Ë?軸ñç×?½¸>\(?•`ZàT ?Þ¹ ¯!$?ÛÁ‘GÇ÷:?ì¿éÒ©™?Ñ¥Û+q|?৯9³?Åçü¤Ö¶,?Ø¢ ¬¶$þ?ÚNcòÇåô?…í±‹Ñ]À?²Õ[HH?çìOªî?轟ütc?ÝÕê¢xv*?èÄÑ©½?åÆ ²jÉ?Ø¿ûÅ\Ž~?é#¥!Ï2…?î!ú°ÿ™?îöLí µ~?Þ$èžØ?Þ‹UÃv¦P?ï@Ui,.Ô?·šÂ"†‰h?îõ”p'g?ãê5³±Y?Ôéà¬å?ëß+ úÕ¾?वTÃ$?ØÝvL¢+†?Ûcv³ ˜?ï²;z»çÒ?‚ý¡Ïp©@?⮂D¥Î‚?éì’ꇄÖ?ÝV T:?ØŸAÂ56?Âz¶B«î?ÉÇâìnÐ?ãÝ).j"Ÿ?áy‰2¨g?Ò xÙ×{T?㜥ËÃà?¨3žå³ ?ìœô* ›™?¢Õj~*y ?ÔÞ‚­(-?ë®}w¯†?Á¡Á¢È?×8ö Â;€?Òâ[Æ0Â|?Éô§õŒ*„?æW¼ß5&?뎹ü6Ö1?çŒ ®Z\?YÑÙú?µ¬€ýP??É*•PðÄ ?î|îJ?Ò»TŽßHÐ?Ã嵨HT?áU¸Oàpy?¼´~Êêð?âAOj• h?ëÚÅ•5£?ëRǺoë??·\m/à?ÅaaBÑ„?Ü&“ËØ?ÑAI`Ê?æ¹@†k¿¿?Ñ@zÛÖ?’å&æOo`?ܹê®ö?£ñ,ŠØÀ?í •ÿ]‰?ÜÇ_YêW‚?îHÚþH£b?ãü„h$>b?ÆõpÀQ4?ï"»x¯Å?àXû<–ã?ßÇ{&;‰’?Ñcó]À@Â?ááP¿§*?ïP³==E?ÔO€»\ÂÌ?•½â0X«à?ÀÈXm\?ÛÒ”)d^?Ȳ¯€å?³Wñ†›?á Oº¡®?êÂù:×,?Ù‹cª!ê?âz¼{µª?·€ý-îÚ¸?êœ;âø÷¦?ÛÍŠ?â|’–å¨b?ïp넦Í?â èå?Ø‚/6 °–?À}röD¶ ?çu¶?Ïç?þÏ%ÿ­4?Õ³ŒÄD?¿è5—±n?Ô0¼º÷Ô?èu8.¸Ö?ÒÉÅCz†?êm@\ô?í'®u¶86?Ô´!\¥MJ?⼬ýpÝ?Â_7hZ(?äM-Ä€*?×ÿ<ý¿Ü?ìNf¡RJ?½­zjø@?Ö•èV× ?ãvg[`?ëg¸¿Æ?¦‚þìfwð?äeAÃþ’Ú?ì…¨jDƒ?“¾0b¼ ?¾1jÚMGh?â ù4 ?à©Eëåy(?çÔ´G¯Ô?Ö0šaQ?çè¬7?Íœ!Cí`?çá Gˆ˜Ú?Ç„R#í=$?Ù¤c'¬?ÅDcö±>à?Ð*o+å?áB½6U…?™‡¢½XÜ@?àè̽É?áxŸ«ó?Ë&´äx=ˆ?£ke.)’0?ëùÈîȳØ?é›”[¼?Åxk¨î˜?î«äŒæ\?å&B#$ÉvZ?ã L«í•?æÂÞÄ-;Ð?î©ãêJì?äÇÞÔN/?ç¬MAr?ᥒhŠ2â?à¢3¯‰”i?ÖG_îÚãV?սݺ?à;~y ý-?èK\m°?åÚ–sÿ© ?â¿g;™Î)?¶iŠçνH?ÂÅ"(–Ä?ØžÞßúj?ÑotL ?×äÌ^ ¢?Ó·@mÆ6?éÄCü»þ?᯺Š\É?êy±)Ë8P?䎦/qŸ×?ì\´v ?èSÎY\C?ÙwU$3Ýâ?Ï¢¥¨Ÿ¤?è6ì}Dí?ÇäkŒ™Ý”?Û™t[V?œi&?ÛiWÍÍ4?ÔdÙÌI€?ãO'R—»8?ïCͺû{è?×r‘Ø¢?ßâeÇä`?ëWÚÜ6”û?½š[¡¦X?à·2b?n?ê?Ú©c?ï™÷è’[š?Œ> ?ã®È¢7?êNõ€¢ùN?Økk&æ`?îu;GY'Ÿ?½kÇÌ´?æ n†Z!w?®t½Vü›°?Ý ZÓe›V?Õ¥n•ü´?¾I»`I|?ãŽë´ï^?í·TåZ€?æÕÓ}b?С­uaJ@?Ñ?­WT?ÖˆûÈ#”?å¹Mµ-Èý?éñaíVˆ!?äó¸3×ñ?ÚöY’4p?ÝõZWÁŒV?Ü„Ø b4v?Â÷ü1rƒð?ÐgÒÉÆŠ?êœ`Ó?èŸæã3·?¾@u[}è?ãÄm1U»?é&14 Û?å$68’˜ž?ï÷ä.?t?ìø"]Ý߃?ébø-¼{é?è®ç€Q8?ï%žƒ=Ƀ?Ód”¼U7²?èk/ýùpo?ä)ääÌ}%?·2ñ0jÅ?Ы/[ÇNî?çØ«7o-?ÜÔÆB¸`?‘;ûvfà?ÍHÊòNµd?×E×ðm˜(?쯪²`Ç ?Ý#žo¯¡ð?èÏ¿GÕÓB?Œðûž%€?èÄ…©7ü?¿0‚‰` x?è`‰°vˆ…?çÓ²J±¾,?àHC£_h?â()H8è?íQäÞ™bF?çgÊW‹0?Äнà 4?Ð;´Ï,kD?êÓ|–­o]?Ýàz^˜á$?ê¬NYŸœ¨?éÑbÏÝŠ?áôÈ+¤»?ë£éBÖ4?êz-g*—‘?ï^¹aV¾?Ôb7ôt@?éÕ Jº?ìÜûå'î¶?í'6Aîl>?ãÉ'¸…ð?µQûG°?åd!4¦'ñ?æ¨?áŸüxþL?èÿ¤DÙvO?Ø>Š,ü?¶'ÒÿP0?ïoaÇx¾?ëܽ6"EY?æðˆÉ Í?ïÅÔ¥Zã?äÆE©«JÔ?˜ S/U{@?èe¾îÌ)_?Ö‚½¬N^?áK¤à€-O?â„ÁÉ…?å´­Öµ n?ãà¹1??š"V£?Ùº©*ïèÜ?–g:IÈ?É»¬*WC?áQ»óàÔý?ë4kuó_?à ¸Ñõ?íº]ˆU?Ýù*îc?ÕbÆW¶?ÕÄ \4q6?κ™°÷X?ÐÌ‹&¦?ã}'úÐéæ?Âå(À!`?âñÐwC[@?ÚÜ·X_ š?™¿åÍŽy@?쳆¸B;Š?æ“'èd ?᪈†p»¶?ëö8ÔˆÁ?æ¶xgôñ?ÏaEj¼À?»Ɉ¶¦è?⦋¡÷?ÐTº¹áD?Û‹Ùñ"Z?â`WÑÎÉ?²Ÿ ¾ñ#˜?³vì–k°?æ>RÎkÂx?á³³‚­µ?ÒpœHÀä?³wËÁfÀ?ÂoÑ+ù)|?âé‚Ñödå?â"/$Ÿä?ë;ÖÿÀžû?ÑV¤1È&¶?îòÔiÁ´€?ÇÒDΑ¬?ÍzVˆk°l?Û^øï:?áËžsÅ?ì¢CíLš?àçï ñ±þ?çáM=9%€?ÍÜŠØŽø?ïxúÚcŠš?僮0P³@?Ù0øT±Éä?îðÚMQ?ÄK;Vô?Û˜¸cô?³õÔKÓX?é©mä¡zÎ?âÄ-©L?áë»ÉÕ?î}Ä-û8?ëúÝΓþ?é~¼|–ž›?î^tî˜zÜ? éj'>¨ ?ähVDm?ë ,ž—d?à ®ÿR(l?åR&&*‹)?ºW’t…$?¼»Mãò?ÜÊã[ð'˜?ëÖÏœž¥É?¦„Ôª®/P?ÔS<¿ýPR?ËØÃé×Ü?êµ›Òª ?ÕSÊ+Ú?ëù6®T?Ðh iY{š?Ùg‚¢´°?Þðg$Æä?ìwŽ…Èo`?é‹1DòT?í´8jHÞ?»¤ªß«µ¨?ãÒ°!H,h?µQG%8Ïp?б¹Pôd?Ùêû9B½v?g£ºOI?ïˆ7_ÀV*?Ê»±\ÏSL?°Ts$à°?¿ñÄà9Ð?äÓ•º:“£?ß!PR»ˆ^?È >y¼ÝT?æM•}tÊ?݆.ü ¤œ?éÖÓV¡9ò?—ÄŸy@?Çx€êJ8Ì?±—*'•H?Ýk°tI?²ZZøà?ÔnOUÔ›î?³æI°z4È?êi‰½pÏ?å(#%"Y?êGþ8%ì?íž,Ø}£™?ËQ|þrx?߀Jïè?Ïæ¿¹Ã<ü?ßOÁ,ÒóÈ?Ú>ö@‰À?æµ°‹ð?ëq[ÓÔט?ä¬ÚI1kB?ìšÃ—o¼‰?é:—Þ€aþ?Þ&5}??ÖR™Dl,?Ï=œ;‚(?ÄòÕÞÄ?ß¶Iæ°?ˬƒh?ëÜÔ¦îì?ì!}úXâh?Ýzh¾óÇn?âv(g*?¸‚Å– x?Ížc7¿ È?QÆêÏp?äRƸٖC?Û1{5´?êö^®UY?ÙòÄ%ØL?ň] âl?ã|så†?нþ3¨ª?Ô¨Ç]¼l?é…ȸ Ê?×à÷ÑåHì?ÞÇ_øA”?ßÀ¡%žm?¿3R¹.µÀ?ºSªJz¼?ïHx Ïÿ?ßTÖT_4?íŸÊÚ|Šq?™‰½7Î`?ä£>F¬W?ÑCÓnl?Õc#(òj?Àhô°é”?³Ìü>à?Ö‹ëcóêV?àBæ«óÇD?äm,’Øò?×ã=9€†L?×81Zg|¶?îêw2 F?æKW¾²?îÙ=Ah„k?ß úO?Ù–)üÀ$ ?æA·:§?ép²†,?Ò¾JA?åË ðigo?ÀtÌ>T?ä1 ûKþ°?Üxidp?¿VoŒ±õ?î¥Ô&`8?ãZW?×?ècÄÅ 2?Àµš@?×¾_Mv&?㦖‹êzo?³8OÏ=þ?êGGHp°Ò?ånHjÀ+£?ÛIÚ¬ã„?è'ßè,ù?ââ)«ß ’?É)i©¡Ð?Øæ2ðOÂ?·ÕÔÁc*H?àØ+ÚeRË?Ìo³¿"Óˆ?æ pYËÍ?Ùª·Ûù†?Ò-Øùíl?åÚ¹Þk×þ?ìà¥Æ6f9?ÓÒÑ#÷>?Ø­Qï–á„?Ѻý«®?ÇGX6X?çþL?–Ù?ÂævÎK.Ü?ÁÄYX¸Ä?Íí0@áù|?»: òtð?’àiÑTÇ?ïÛ?@]^?̵ôÿ\?¾~{î¾ô˜?ëÀax µ?ï°tFhÃ?íA¨]ôd?ã¶*öø$?â:1ÌÄ?ì/Î’mÂ?éuèš9'?Ôu”c}Â?ï,‚z¬Ê?ÕW: â?å^/ì?Á\‰ûúf,?Ë*ù5ÉÐt?×ÜI=??”ÿcÅÍ]`?ì׃ìgÙ$?ïMìjãÐú?â·¶B(”?焈ÈXr?ÌîÄw`p?á0§í?/a?¯i åð?íœã7€ ?í@Õ0í¢³?êÉh¯Ü ™?í‘_ÀÜ‹í?Ó?KÏ””?Þ˜’ðøfþ?E¾â!?äª?ãÄ]?ãzÕ _M ?ëcy)ËU?àßúë…³0?¾lËo½<?–|Àô£f€?í¿¨ûÁ¸û?áÀ8F QÇ?æ#®ÉœžÁ?äÔ ‹¦»0?±p“‚ ¸¨?ÈŸXW?âLR•:›?µ`Ý~ÛØ?æpiaLLü?ï‘eÓa?ì¼Dª¨Ô?á,lÖ×K­?åćõô‹ª?Ó,Zž/O?æm‡}“.?Ãv¡Ô¢y€?â•já|?ÕŒ­jÓ˜?àíà™G^?êúÑ‚ÂG?é"·âf×i?êªd…éPò?¼uó<‘•¨?ÙUíöïÖ?ãâaŒ®FZ?Úï:¶ÿnÈ?åQ€¥kÖ?å]ŒeW?½€ÀÁyn€?|­² )£€?íÙKªÊ…0?Öš o´òD?Òð¶tàäˆ?ìì#Úƒ¾Ž?ê¡Ñ_×e?éåÍD6«!?ãoºZL?Úˆ£0œ?Çœdîæ¸?ˆ5Õ‰‰#?ï®Ð¦_?æ þler?ïæT]–¯?ì 4Ä o?âËÕ¯ÆTþ?ét­‡UJé?éT¡ÕaVo?Úbä¶„ð?ï™fÈÖ1C?Œ ñb–xÀ?ïV¶ßM .?çáX蕈Å?ì «Z‰y?Øœˆˆ$ãÄ?¢dÔ¬•ð?à¬×T÷®?ïùJÒ°Ú?ç¸î9]ÈÄ?áÐ!ý!?ÏSmšúƒT?ε„.Š84?¥ÓVÞ†„?ïD,*²gÁ?Ÿ€"Ý'ž?îQyi¶QL?Î2t9î× ?㮟³’a?¸9u†±c ?×q\È¢¦,?»|ˆÅ4{À?º-¢Ðç”@?Ó‡ÿäÔp?Ú¹â;A½4?êêºy ¥ó?Ïczíòh|?í­AºægP?Ùx¢·d?à flÕ?cýü?äæ(SΑ¥?ìT”{M}·?É›£p?×ã=½s*?åþ­µÖJÁ?§Õ©›Ñà?ë3û0þž¢?ìŸëåˆ")?ÂW÷3BáÜ?Ö“â÷…È?ᘟ=úV›?ÝÎ5aóøœ?îöøÇU?ܼ¦ËáÃô?ÌL‚÷½Ž¼?æCuŒ=â?çô6—»¹?í £åÜ€V?³&­È²mH?ÌÇÚÕ$Õè?ç9=[ î?Âû%jDTÐ?à¾tO#(¶?Ô¦N³UÈ8?èÔ·mÂ?½y ·€˜?ŸšÄîB ?| ˆÍ_ó?é°Z±n?ãórAù?î‰÷ZâW?ìÙÎÒo?Ï ²dCˆ?ìh´ÎÅ•Ó?Ûné<ª?åÍÿµÌ–Â?£6<°@$°?´A9Áhfø?ÚBªñª?ß[óiÉT?ÅüŸik?ÀµÕâ¾ú°?ä=óÞké€?ÛçßÂ¥í¬?Ü«¤s¶?ÊE&B¸xŒ?ç &PÈåZ?¼†äS8?êY†r6x?¯Å{ÝÔ³°?Ê:Š®ÚGx?³ÃÑÖëí`?Ù Q¨‹¾?·Ú!ve˜?ËÍizÖ¤ì?ãmÒÐS£˜?ì> ó ‰'?åæ~JZè?ÉØNÛ0J`?åõ3ßëö?醿Ih»m?Õ»]ØdÄ?Ã.$Ý¢P?ÐQü=X.æ?çç˜Ä2?ÞU˜y?æí¯Bn?ç‰ ªfƒ?ÑW(¹à?Æ2”X1"D?¨¹ rÂy ?ßcw}|>4?âJAmÓð?¹1ú¬?å±mh vž?Ñ>Ø-$ž?î̤üä?êÄ.*ûÌ?ì–˜íy¢?ï2Y¶Í?ßÑ;Ñú­P?À`ì¶a?ê _„1M?é.}¬pÝó?ÚoÅ’ÕÕ ?æ&`¾â‘ö?ïË{íXžÊ?ÁÃwX0P?¥, @yp?íHf 3M?ì@ž)MçS?ïI>(BT?ïÐÃ×g?Ú4ÝË"X?ÚÖyˆ¾-:?Ђîs*ÎJ?ï òQ4ç?ÒÔ¹!™h0?¯~c˜~€?宥*µ`q?êŸô‰Âê?±œ{"–?îh1g¼?ÁÊBD¡¶|?çX'+‡?ÞÒÿTvà?Ó˜U—³ÎÄ?ÑÝ@…•äl?æ³%ÓÌð?ãÃjÏrç?ºw^ s!p?›• ‘¬‰`?îé e TG?ëuy6Šz?ë”qµ`?Õ{\h?Ò¬i›â?á ‰á©.?ì ¾†Xð?á?—næ!ó?ËzWû„Œ?ì3yêˆ?Å|8.¡h?Ï2UÔ%€?ÝhÊyè¸Ø?Ó=Õ$Ô5¦?åj@ ˆ?Þ?Þí~^ÒŽ‚?æÐtІõç?Ð$;*MØ?ÝrŽáÜš?ï*·Çs•?Õ@E.«º?èuž64C?æ|É­µr?í,.6ºç?ÝìgA¥?éÑgGƒY?Ô£s¯É †?Ö!‚{‘! ?ÈÐ,±[(?ìît ô“?ê×1¹¶x¦?Ä](µÐ0?㸞œ¶-?íè•ÒèÜ[?å0 똌?ºy€¥„ø?ã÷‹ÉÆÁ˜?ßb‚RP÷Ì?˜<:9JÛà?å¬_‹„ž{?ç$ãø–ˆ?Ù¥ŠŸ¡…Ü?[™âÆ6?ЪÐÑŒ\¾?àœž×&L?äâ#Õ‹bÍ?΃N§#MÐ?æX3?…?ã9·*ÌãM?âÂÙ’gÔ?æáìÔú??ëï(9®ó?ì‚O?ìyhÌYdE?àÚþ ‡`D?í‡Dq³T?Ü1\á§È?ï†rQL¢?æõ?uÚÆº±.?àÆ'°çvô?ïß…«Ñiv?¿ÉŸ¦¢Ìð?à ™…'(?ì:°¶!ø?êNÒäŠ'Ö?é!ζ?æZꞪzá?ÜÆ¯Àvò?í©‡™þj¥?ä‚¡ ižÝ?â³®áÃê?ØþÝœcvv?“tZh%j@?°^…dr?ÝÀ"Ó»Ò?Ü !’Éÿe?âl:˜.Ñ?ÄaÙýÍ?Àÿõ¬3Š ?ÂþáAªö\?ä ·ú™?èJŽB¹?êùÍòÆ9?à‡ð‹Ä³?Âú­'Ðx?ë“Ø$s ?íß8ú‰}÷?àh…[±±Ü?ë˜dÄùS?ÜuKãyŽò?ÑŸ&^$Ó6?ÇzU'³,?S> †QÖ?áðñY‹?àB_‹_?å(œrÒê?åÚPü–¢+?ËúÊÓ«¿´?é#Ø„‘M?蹨áw©?ÔjÛ t§Æ?Vxb¤?ÛÍ2çÇF?ºœVta¥ ?í¤£.4ÒÎ?æ\Ú"ñ4?«ñéðp?Ü.zW‚1?ï1'•I…?Á¨}?í¬Õ×eÂ`?ê¢Øƒu)?Ûö6*xÎ?á|×HñTv?¢Èˆ Ã{p?ÝĬ}=d?㣅¥#}.?ªë<Û§€?í‚õfÄ?Îú;7ˆü´?ì*͉«,?çð9#B ?°®ªÏ«Ã¸?ç]O£€?×1^}å®?ภøXJ`?ÕGËz¾Ïj?Õˆ€)䃄?êÑBѼ)»?Ï(ÜFÛL?‘L™›Ïû@?¿¿œGæþ¨?ÔÃá@ D?ê‘ɼý,O?¿h©#.P?ãŽÃLã§?'€Õ?ÌïòÁ4Tø?â§ö¤ßô?ÓQŸ3{€?ä„9Ô'_s?â9Cš¯Ñ’?š\ÿÖ`?·øapôBX?è–Ã’€Zƒ?Ð]B#åS‚?Ó.¢£C\?êáØë?ìÊÙa#S?êz@¨?’?Þl’”¦þ?ã÷¦Èm‚,?ãÍÍ«³ æ?æ'Í–êpþ?ÜmT˜?á8&0Õ!R?IJÿ¯é?Öh©Û;Ž2?Øn*Ø_@?Ñ}–tÁ?ã ¨*û.Ñ?ØzO»åz?è?±d$úo?äY"ˆYY?Шnínìº?ÓõýSÄî?¿<‚Ar0?íëNÜ× ?âVÉ ‰ª?ïL ¼¢‘*?àÝ](â´?r=éÛÙ?ÇÊ~Šç”?¼Ïˆ(ÜH?ݺ;#6®?“+¿ÿX@?åpÌÙ±|—?å&@ª¡?î ©œ8±?á„ш ?ïfÆè'ù?ï6b0?Àë×üUw1K£?«ý:r7 °?Ùp’  C>?Ñìkž„R?æ/(Úÿ¥?«e‚Ú‘T ?êá–B{Ù¤?ÒçaÐΓr?ã?œcì’a?êÜÎ#D’?îV*”±›n?ÀÊdbán?àæot…2?ËjLÈ ¿$?êOã Û"e?Öb Îmz?ì¢þ`>ëz?ÙGM‹ÁÊ?Ñž4Ê5G‚?åoÀ$9Ï?âúc°|Â?ï?^'m?æuÛ|”Ë ?ϲ]H !“‘?êÐ;Æåà?ÇfMãWä?ìd#ìº1?Óò ÷!n?Ãeoõ)!ð?ìþ:ö&Ð?ÊëkðÔ°?ìÚ!0­å ?ï_³tþÙý?ê|A˜»n?ʹT°¨?ä e®(?Þ©™»v"?ãÌZm.8?ïyGФµ?êZv‚Ò?í9ÓÚ‹Ý?Ë߀bH?Ò÷…%2ÄÊ?ÀÊH’®ä?ÃÞ^£´?ÕÉ•˜Â‰J?ÒŸ>W1Ϧ?å7ï©o3®?ÄaHâ9Æ`?¼ ñî²@Ø?äx£d¡‚´?¿Ír»r(?Z÷Ia?д6(€:?æœ5+¹m?ÚÄ5Ñ’¼B?ä#pó{›?çÆ -êû,?î=SdâAß?ªdÃZËCð?âè%Ê1~Û?ë½ó¿…s?Út9²x?ÓàvŠ~?´KZŸ°ZH?áîOJ…n˜?è1à/b^?äöt—?‘ãŒD”Fà?ÞDD£þª?ár‡¡?潚U ª?ØÖ·Û‚Z€?ÜfuQëØ ?ë\‘<ùñ?í½·W{3_?îOúËa°A?ì¦çÂ8µ ?î'/´É?í0@LÕ!æ?Á B¤°?Å *ÚÇp?Ö¢Ö™ib?Ü,übîfâ?èç7‰«#?ßÑ×ð¶[x?åãŠìX’Q?Ç”87ŸÜ?¼£¦#?ÔeYÙ¹cÊ?ê:ÂÖ‰?éö¥@Hµ?ã·Yáö*•?ßÄ=bdð?ì,¦º´2ù?ë ‰4æ,?Àö¼Î :ì?ºL‚ A˸?Á^¦ÄFT„?ÐZ/oš?Ð>Ë“2¤Ð?×Û#{eß?é=CâùI?²M/ç«â?×dŒ',æ?îî¹¢Ã?ÐÊ%¨£þ?êÿX÷×K?Ý˺¶ö?뀶Ô=Mê?ÂSˆLzžœ?Ô‰X£Î’?³ôþ ?^_wχ`?ä\/ò<‹?ã¢çmëX•?€Á :ñ?ãû•hà†r?Ýv7/ËÊ?¸»m÷}Å?îZž=f‘?oCm`Þ?Ͱ|÷-È?äçÃã–>Y?½ ýxTÎÈ?Æ…øÇ¨|?ç¯-¤l{u?Óry¥â$?Ð[Á±V5†?ßBm#F `?Ùz•ìßUl?ì´ ðæ?ì|w¶U“s?ïÑFà¢òñ?èMíÉË?ʽf<Ë.°?åÒw³%¶?Ó!2×çëö?àú‰BKjÊ?ï8T Ä?Þ=ÎJ¾?ÔR~?/"?â/A9?Æ®h´Fh?å1Lx.ö,?ÇR‚@‰ö ?é_N¶¥.?à7}M4É?æð¯÷Íê?À­µÔü?æ¨3+JÚ?Üê¡ñUx?¥ûÕÏž|ð?ÚöY±Uä‚?ÖPLjs,>?À:¨Ý?¿]s†›`?ØUņ˜¶²?Ñ‹(“iˆ?åäÅ Õ¨?ë§8z™?ãs€µË†?à&¤H‡Œ?•ÅX²üµ€?áw»'ƒÇw?ëž>:Zž–?çXáÒë »?Ú‚ÿŸè?Þ8)ŠÅþ?¹†oÅ0?ïL r®?ÞÂð§?×x¿kæ>?ÔË|—‚ì?ӟż¥Ê?ÕD¶æ?׎?è>1#h?Ã}Róµ|?Ï(Šuô?眨6}\˜?áåu«x$?îÉžrd¤„?Ù„ Êêî?ÛR°Q?ì¶eù:|?ì)Þ³.¸?Þë¾ €ÍÈ?Ó8d®#Ö ?èZŒ÷ŸjŸ?æ½( 8í6?æ×åÇÔŠ?Û±ªÄªÞ?ë›Çƒ·ð?â¾!{t?­üÉ9pP?Ò" cÓ2?Ò–ÀÁ”  ?Í}÷ñiœh?ç ë ?/?ïo©Ú¤I ?á™±œ4?ìÇöÏ×ó:?À/\ŸKü?è/ùé>?¤×®” ?Þ;&vªgÚ?ë^6ç¬\?ãÄnœÁB?Ðy¯&Õy–?ìé"›U±?Ƚ;“Pt„?ç)³I5vo?Ñz\”Cr?Ì*C™/?ÛB,ýÝþ?éÕW ?« ?áhã°hwú?çRÁ©YÑ?çK•~À?Õ©ÔT˜0?棰ó!ÃP?×ß&ÝãÚœ?ªgg©à?Í‘‘^)æ°?àÿ9$ŸLD?Ò(i4íyŠ?ÓbÑ)d?袚ʵ¨?×—`IäúB?ãe^€}‘x?艦šûGù?Ù–ó£ùÎ?à²0\Û-?ØH‘FÄô?Û×/yò8?åŒü¬aÆz?ç@ü£#%Ì?ÙAÔê‘4?ìøaì“e?‘¦!S·À?êô#Îóf—?Üþãg¿ËŒ?ä‘*ÆSÉ>?àZhäÚ‰¸?äú 3ÁŽ?Ú¦òbSêî?æÜÊ;®ðß?JƒWÀ?ÈÙ›‹ ø?ʨÙ*óø?í6|‹¶z?é»O bXE?×®d%Ê?Ù+7‹}V?íᘞ<ˆ?Ú×+0 æØ?¤xÝðVÐ?͹ã§;\?Û'ªvªüº?í|•ò¹Žä?ã’Ão;4?Ó‡©7Ïô?ÐîÂ1Ð?º‘p€±¨?Þq(¡ r?íÝÃ`ôùê?å„ÓoÑh?ìž0?!Å7?ËÑÁøl± ?ë ’_¤œR?áÌ«(É Ž?á‡Î3vð?äy$¤ßþ?ì‡ú•?ÕÇ8{Þ6:?èíÂþjÀ ?ÏÁàgRõ@?ì!àÌZV?¿ ÕÐÕ ?ÅÙ0Œ?ï €ÄO?ÀxFl?ÕÔvp8¶?îfä?ÐA_v¤r\?ëY›C ?àÇÀîÖg?àÝÑvv’?äðA/bƒÂ?”óžù@?ω\4ÁL$?â’ ¤šV†?Ò’q¤Î@\?Ó\‡KÓ‰?È*÷#²D?çV¬í®{?ìô‚Rútò?é$Áû?åsz]Aq‘?íDB=1YU?ÉŠ µ(AÀ?ÒŠF¤iÖ?îKÁPzEY?Ô©ÁêüȰ?ÎÆ?€¿¸?¹„é,¶Ø?éà<»zÖ?ä#½Ý¡)?à^.yøõV?ÕQͯJþ?á¬á(Ä>?éáJl?ç™Dém?Óe0‡’ˆ?»§)Ï.ð?–äÂÀä?Ô‡’è?âü€‹l…?ç^e"/|?Ħ…&*Ì?íâ¥ïŠÍL?ïÑ´ÔÒÒ„?îBãqËOr?î*5@yC÷?ÄÁ# ?çfâõömy?¹S;ï€?Ý‘³pÁŒ?˜CR}æ ?èzwo?ÖÜXÔ=œ(?︜#eÙE?Ý»‹øž×*?ËgLVŠÃ„?à€,ˆ/‰Í?â óSj­v?æâ£e{?Û„ÐîÌ<ž?íåULò°$?æ6€·Žuu?î°áû>be?†.¤H‡€?çÿˆ@EVÕ?êöãCŒN?æV¡®VÓ?ãP…&G?Ñ‘}ÞÕƒì?æ4±’ä»?á>ƒ/§"?µò¶{ÑÔx?Úîw[}áš?é°{QÚY?ëyxav0?λ?Ò‚´Ä‹¶D?íaŒ×–¿?Ö3’}^ê?íLJ|ê ?ïÍ9æŒ?ÇúµÙAÀ?Á&w7ùœ?ÁvÄ™m?×÷Çü!&0?ÁÐw?ïŸnõ?ÙòíCŠ?»vìóÕ€?Ñõ¨Hü¯r?á¸Êr´Ž[?Â!Ê͵8ô?±¸Íf#p?ЛÛSÙQª?“uO sz?ëðg;U©?ãáó%õå?ëY5¤^&?íB¥âÌ?íãPX-+î?Þ“¥: È?µËʾõºX?ëû¤‰™"?ç±cºˆ„?ÖNf°ü82?ê^fUâÄ5?´´]§À?Þ ý j‚?×ìÌ”ÞØ6?²½mn?ét·Ø/xé?³[3I}²?áÔúW£¬K?æ4£4xF?º Ê(ÁAÐ?êqfújs?â3l’Pc±?ÙÍ‘Šß—È?Ö?eùbaR?éüó›ê ?ÜÞHÓýü?ÅnÞ[FÑ?ÜÖ=e34?Ížkò–Z?ÉIp•y?À1Õwèθ?åCa“ÿ? p™¾äd?• ÈÙ,e€?ï#L¾Æ‡Ö?‡áã+X²À?Ê®ò@7 d?ï|•À|÷?ÅÑê„?â4ü?§?ÐZäôÊ16?êß|¯žç?À4ÏÕ1Át?¤è@,#9P?ã[$k,À"?팥Yj?Ñ]²ƒs?ê_oNëq??æ;˜µQñ?¾'e*ºJ?é½DŇ™?êêÞ¤Ö†ð?ÀÇÄt¢€?±Ÿ@ J˜?Ä«R5ámì?ËVÂA*ñH?¾ ¨{­ñð?ë±àpFp?è!öLÏi?ád³¨°¦¾?ì#€½©É?à·! Ê‚Ê?±Ù¾Œ?«¤ Qy?Ö_OÒ_-ø?ä;¨ÝM?âKl4¸KV?Þ¡OÜjð?ÈcÂD-Ƙ?ã‰ÑWæ‰i?ì—‡°‘?ˆⴳe?éÖß9[.‡?ÄiÎÌ\¸?Á Ö&°?Ö¶W ›p?Ñ@üóéÊ?Þ›5½š?îBßf¥t?Ǫ,Sè(?çÑžø´æ ?Ôóu†‡À?âÑ•’øsI?ç)îš@³Ò?ÞK1E]?×^–µQm?Ö­†\±H?áE|¤šÞ?Ómàuåöl?àì¨/@­ê?ìV–Î×X?ßÍL|9Ä.?†þ¤Jƒô€?Çn6˜ì”?íé˜ó)È?íáÄ£Ôô?Ü6+•$x?ìbÃz³Õâ?ãi 4ê9?Ç ‡¸«Ä?æ‹`Íof?ꉭyoJ8?áíZ&*B?æ£ò—Tdƒ?Ô›_ƒ@­?Äç½²Švð?Ôûá)ûì–?χAŠÊƬ?˧e^­¾?è¾ø{ôt?Ñ^oe3?ãél!=f?èÒ†“Œ³?°,bŒóí8?ÕrÑkBü?äD×| ¤?ÞK4ÿ f@?¶ÜܨÅÝÀ?è•3ӽߦ?㸵¾¾¹?ìÊ\5W>C?ìL›¶?àuŸmÛ?ÌÒªΠü?äSGÕN°?áÇ'ë¯á?ç§q&h“?Ò~bYõÐV?¢¹krÍ®Ð?â·`@cÛ·?ë¹Lçó$?ä@ƸIi?ÜKúû9‹Ð?ãêŒÅRª?¾-rʶ?ì=Àb6ÿ?Æ Ú±rx?ÛÌçDjŸø?ÕƒU“à0?ã@ÉT?ïãô¤±þ?ä)e‘›õ?ä_ô¤›ãî?³Æá*»Ë8?蘹òYw?ÍÀxwãúü?é³á¯9¼³?Î|W* 3d?ÒŸ|–îjb?ª¼´øw`?¨! } ?º z$7´P?烮ÿ³>­?ÆW¶ãæ”?ãkOH]VÉ?ÐbÊ‹ˆ3z?éúòó°Ö?è4…ë?ì&}äåâä?îfŒ‚‰Þ?ÅHÝþÕ.Ô?ÕDUb9„Ø?¨ˆå¶ ?ࡲE4¥©?± ѩʰ?âÑò»hô?ëYš¸ûC"?¹Æl÷ë?ª@;u`?Ì|Ì$”…ä?Õ°,íCZ?è¿õ?î?ädµÎ£P½?ä¦vž +?ÛÐ’„hsÀ?îÏ”¿§?Ø…A(‚?×#ÜYÿ&?¹ò"ï<ø?ãj¡|›?íò¼±å5?çÓ‰NŽx?檲¦Bì0?ë\ Àz"ï?¥¼[ßü«à?êß$Dÿ.?ç˜1$®Ec?ÛÂÞìÇz?àÏʯó¬X?Õëc ž?ë_Ù9 ¯È?ÝqgGPX"?ÍQÿÏQÞP?ÒiЉÀ„ü?í+Ñp ü?ÙðcÏÊJ?êï×¹üº?è:|oÎ_?Þi¹ûê&?ÖÜÍyƒZê?ÈUð™?êʪÖM?Ûù]Éeÿª?ég ¨Ý<`?éØã÷qê?ÔPÁT„?Æd„ÝæÏT?äç$Ãàˆ£?áµá@ó0?µítùQúÈ?×Ñþ°"â?À¼îŽÃX?Ø«á½ÙH?Ò•>‚ˆ?رèµÈt?ïetî•ø?èb£ˆ.ô?áâÖŽ÷Ëc?åâ“χ¼?ãa gáhZ?éŸïÉÂÅ?ÌÆ±-À?Ølç§?»+®Hk³è?›EWÌ€?uˆi4?Ãrݽ‰D?Õ•ã”E‹ ,?ç8CÆ‚?ÀÞLYSS?ÄÈwíNœ?Ëá@Àà?ëc3 éÖ'?ç &¥oŽ?³1—¨aÐ0?¿JÐGò‚0?וr.G J?´ Y§þÐ?Ë|pŸÊ€Õ2?Ç=Ø>Ää(?Ö£”Ñ@xÎ?ÕÉ|ãÒ#¤?®¼¨ê\U ?ᛲ è ù?åã©jFll?êXsM£¤²?â§àó?Ĩ VL?æ³½C?âeÕúºš?ÉCF|˜ï?²!+z¤ð?Â4GÙ¤Eœ?Ëøcøé?ÙÐ\ºCí”?¾íßyAú¨?ÖmÚsÌ~?ÞL- ˆ(æ?ßÔP‚?sÈ“ñþ£?Õ´88ák¦?ݧíe`Š?ÏsŒO·p?Ö6¾Ai@?åŽw"Ð|”?‹Yv"ájÀ?çæ‰÷Ô?’Tð… ?Ý­þvp¡¬?âa!$X&ä?ÖÝï0éê?áˆâdn90?ÝÔ°åK¾?Æcú5߸?ä––Áû:?»ÙÍQýö ?îN–`.´–?ásG»^Üõ?é[Ë4ii­?êÒÏ==§×?êTøny?îÎû­øb?Üę̂§ ?âÍþÏÏ79?çl§¢Ç?ãæ«¹i?WžFÄ{?ë_7 :Ý?à®ê¯´ò\?е«Æ:4?è©}¤í ?èDIäÎæ?áOˆ¡à×7?Òj̺Y¥?Óßöá3ª?зE±Ÿ×p?åTŒ'JRG?Õp^<–ˆ?ÚyL=Ïd?ÕÿÎÂ/Öv?Ó'ó;ÁO’?ßÄCˆî?ës•¬Ó?ã+˃f?ÂmðØL?¿ ç8ÏS`?ÓN…¤ÃºT?¤(Jc¦€?—h,CÀ?ç><5í]?¸ êxTP?Ñ‹ñûkh?îÍÇ)Š^6?Ôé›þ¬ÊÈ?ÎqŒ¦&Hè?å!~Òé¹?Ú–Yã\J?èðL`?×€¡aMˆ?Þn5æ1Ø?î’Iµ@Z#?ÝL…1ì¼?ïNiëÃ?Ô½¤ÆƒŒ¬?Ã9IÝ•Òä?äiØï0?æÞU‘p?Ú¿¯Iz?îí´ŒÎdì?ï3wµ?ÃhUÚI´?á)“MÍ?Ë£?æÝÒ8?¦Ât@¼tp?ÇžaÉô?îËRIˆî?ä˜ï_Ô?ï‘‹Q‡Á,?êQv Úêô?æªaãë¡?ëUõî±?æ6êxìw?ØÛ9f ¤¸?ïÙrWý9?æ§–Œ3ç?ÓxTV .?ì™9<ífz?åZoÝôS?㇎yȼÅ?î³1¿xsP?éÓ°©0Y‹?ïŸPÙ¤®ù?Ýé}âÍê?î—qÊç‹~?µ/ Q7Ú?ç¹B–H?‘ç?2™Ó€?æOŽ‚ŠÒª?دPVCà«D1€?ÇN›Ü?åÎ ®(ìÂ?ìº=žå?Ï0L®±&¸?ìºê ”F?Ý«%×*ø?¾%øAQ@?°ôÔ2mŠ€?ÕdέVêÔ?ͳ¦ìc?ÝZ¡àÊö^?ÞàR•WI?Öó”Ýì?Þ·Ü—h€d?ÞØŒN%J?í‘й5¶?æm·;O•Î?׸æ{¥¢D?ÝaîÃÇÁ®?åþçÔ9^8?äM¸è;\P?Ó÷±æ|=¨?©E9왚À?ß®Dðý1X?鹦ºIÀ?Æý¯Xq®\?Õ®Mwù`?Ñ |oZ?ã Í î8¬?éÎ?ÃH¥§Ä?ØIvT× 2?ë33 ð û?Àp“MjEè?è*ùлõµ?¿‡C«“€?é¸m’[‰?á}ò™Å?à–2œO¢b?à½Sª?ç~Ì ?ÜË¥h\æ?ë,%ÝÜ?áIö5oÊ?Òä€Qa_¨?Ò¤X—Š˜?É]"SŠSØ?éTq¨•?Äë&Åã­T?ëÜO ¼-?ÞÜk˜ê²?ìóqšè?ím9ƒ`œB?ï.ˆ¾®D ?ØrxñÎ+.?Ð;'PÐ9ä?çÄB‡‚ ?አ‰·+?ä™Þ úL?à€,·Jr?Þ¶1Øø?æPLoTø?¶«É ]&X?ăr0j@?ç€Co-%?åäÇülJ?å´ 5ŽÌ¿?ïe+BÌ÷?Ë•bIïØ?ê ö`Geî?¡ÇˉÍi ?ä耭ɟ?Ò†Þ5Z¸*?¦i m}`?³ ÑH¨?Â0ïëPÐ?ÙX-–p?éß& NÅ?æR*Ö¬:\?Ñ-J™îè ?«õ"ñÖÐ?Ëz™ÆF¤?ëb­ù÷ƒ ?´¶Nyà?ÅÊÞ¨d¨?ÌŒ?ÍP$?ÖˆÂÃö ?êéq)N‚ë?ä­6¦ffž?Ì 'ªd?Ôò*ò=ö?Ê+…™“ö°?é@%èðlÿ?Ë\H:2Ÿˆ?ágfÄ3í?Ü«[³Ò?œ@7| ?àÍLÿP?Ô7;±õÓž?ë8ÙU‘H?覯¥ÚcU?Ó»{|Òä?ç}HÇê ©?éÅF-ó¿¸?³éž‚Ð?éNâ8+$_?àß¿Cí?á¾BΓâF?ìœƾq?âB—Øv…p?å/t?ÏÉlJ^ŽØ?ê½¶${?×ú²ÁCú2?Í{Z->#´?ÖøP·ú)r?Úðfð*™Ü?Îy7ÐËü°?Ô'f6ƒœJ?™Áþe¼¿ ?ÇíÇ¿È?ÅqDòLH?çªk¤.?è5Ö| ?ãÙx¢ˆa?Æ¥LMo±?âWÕí²öþ?ê#`*§š?Å“¿ý÷7?Õ@F扒Â?îjžáÓŸ?¶üùáX7?ë|è+Îì?Øi;o§ 0?ë ŸPÚ?Öé$]8jÄ?´!L'Q£€?é½£ H\?äŠbÑ2?çv!`D† ?×Å\nüÎ?Μl™(?ÝÏWQŒrš?´þH„ú?•is¢»Ù@?ä0˜T§-?è›&X¦Ÿ?çÎë4Á?â>ecÊ™Õ?ä­óÒ'?è µ0oX?ä!Ò3Òj?æN2+Qà?´ä„joVH?ïv<è¦z¥?í׿ޮUÝ?à3j¡„õ?æÄâÒo?w?쯃güÜ?¼‘VÄxh?ítÖ?Ã\K?ÓŠ@&Ý–?Ê‘XQ¥p¸¸«?H°ž¬ÅÐ?ⳈÈdt?ë µÔ_¦?™ÿF©ÜZà?«AÚË ùÀ?Ñ£Ÿâ‹ø?Ïò’1f¸?äÆ » ]-?ÜÃ0$5€?î󉙑?Ä/ä]Ùô?æ ‡0áé7?Óä_~ÚVÄ?qñ c—?å ‚‰.?äÜo˜×ã?ä,¿ÏÿØ5?Ö—ÝÇÝG€?íÄù{Gg?¿R>IVÐ?ïl?*×Ý?ãÆ1F;é?èÖ{< "?१‰¥?çæ„×nýÇ?äî„{úô?ᇶí?Þõø=,ûÚÇ?ì‚ ‹Ôí­?Þ¨ÊÙÀ\?£ËœZÂQP?Ü(º4SÁV?ââ Óº8?åŸtTw´?ÓéaŠ ¬?Ä ±Á•á´?êŸYÛ#qG?•Ü‹»°i?Ó™: óž?Þ8ù="a?áDy˜áY8?íTÑ­ê‘;?â¯SÔU…œ?èfìÉB(?ìpzœfÕ?µÿ½QÍC`?Ð1^¹ÓL?èf k/+ý?ä-§j¡r?”.|€@?Ø|X{Š`j?Þ~ÙáŒt?Õ²j3Ô†ø?ÞíúÍâ?â"å&y?áºd´=A?Ó<¦Ç\£ž?àøSRöÀï?Ò[$Ñ â?æ$–œZê»?äî—+U›?뛪â‚?è{zå2?ÞG÷wúR?à›²“wÒz?ÓåóÃ?ä2ÀFëob?°`V!Ø?¾m=M}@ð?ëîä‰9?é~ÿ|ÀAÚ?º)Ëá©È?æ¿TVHü?Þrl(™VŽ?îcÿÕF?íù«¾äv?ÍNøgŒñ?Ò’Ÿ<¡ºb?èŠñb?Øùöv„J?ç{XëÝ‚à?çg+ xuz?æ…GÛñ2B?«Ac0 ?ï9äz?æ§Å^ûp?ª ÏYÕ€?æ:*!Ä ?Û¥z¿ßþ?§Øm3í| ?Õ¾>»õh?æ¤O$°à?Ç—yŠ20?Ü»÷©>'$?êørçt?æ C=D ‰?§Œß+z?À±éÊxIà?å3'D„_?áiÜ”WCß?ÆtZ¤<4?æ{HIÀ D?àÉ1 ³)?Šb°˜8?¯Fíf¥Á ?Ð xMéÀú?ب' R74?Û¨r¬¹?è„V)óh0?ÁÉ\w޾H?­ÍG¹þð?Æ Å«lÙ˜?ݨ—CEݬ?ï3žÔ9Aâ?Á´»&X ?»ð |`è?Ó‚ –êF?Ü·\7øåŽ?Ôê§àß%?ä{‡¢¥®ã?µÀˆ’‚?à|ÎÕà ?´ Æ@ð?éÞËGÛ˜‘?Þ!¼KÓÔt?çÕém€çë?¤ùËÏ=Ð?Æ8%Ð2Ü?åïì'?¼NÈé´?Õ¸jª¶ƒê?».lÒ°,ˆ?à/TÝJù£?Õú¾òŽä?ÙöÃQdtB?Ìš½,À?禶öš€ ?ßïšø6½T?à•áä!›x?¸íI‰þ” ?íPg@'ÀX?ÎUdš)æT?ï[¢è*U?ÞgÿA<ô?í|Ÿ‚ÐfÊ?Ô¬~ê´?é^EÃÚé2?¨¢-ò(š?á’“ŸÝZ?ä6†‚þ?ì±äãb»?ìðâŒæZœ?éš9vL­?ÎCU±’p?íæÊMŸ¬A?åÛR“ï7?«™Â:G—?á/ý9h?ÊÄi2³t?ßÙöLº`?ì_¦„͸>?ç«ó„?Ó–•rs–?±U8Ç3*¨?³Ã 0ÿÕ@?nFô:#?ÁnŽë@?à‘ïUí?Ó¤PÀì4?ã÷M¹|k?êu»æ·úÌ?î ¯×«n?½ðÈÂgP?Ûóà Ö?ê[½ÑA?ÇË`zìè?Úf'ÑN?篣A²Y?à @—‰ó?Çï+(” ?Ò@™»í¶?íò »:v˜?Â3êH,a8?ÉrG o¸?ë½d ,+P?ìíášÞCM?à˜oEÏf?ßRùѯv?סÀw°[Ú?Åá ”Ò”\?×y$®u5?àÓÑcUòZ?ßùöÃ?Ù¨ ™ ?à#Ë?Ó™_x‚j0?½»XmÃÍØ?曓aç?ØF@ÅVÝJ?•åÒ|3 ?ïÌk5Ýnf?¾\ H3ˆ?ã4Üê~?ÞѲ…Q”?ÐwÀiÑú?á^«5¸`¼?á`böóÔ?ïÞl@Óþ?é¿¶ø§©Á?íÌ5´Ÿ€?éÔ3×úA.?ÕÌñèø™ ?ÔÝT¹í2d?ìŽHÙïµ?Äcït?׿kcÉ€t?ÅñQ6¤Ð?â†'ÿ7§\?à˜|'=˜_?èa†U]Ä¢?ÝömLLö€?Â*åQGØ?ï[|C.Rç?ÜÎæ Ÿ(?èÔsü™G–?ê ÃËkÝ?êCCvÄ)þ?â£DÎ+X?Ø= î,(?ÛÓÛ´ ¤–?á(tW'¸ê?êu“ë\¾ç?ሙ§z,?è>Žã(!L?àA“ü“È?Ãß=hàgÄ?ì 6¾Ü€¡?Á“ššGÝ?Ýô_gÎ?Òµ¸YsA4?ê2 Jè)¼?ê{—Î,?ïÿO,&l?ß›´†¿â?߇cÙT"?ä/#ëËäP?éÛó8×®?»‡]”3x?È¢ EG?êE\±E ?Ùà)£eŒ?èïC¯å ä?®Ñ2“Wµ`?ëTöˆõXß?Ýö®ºZœ?åÎ;¿Yw}?Ø ¡]ÙÑ>?çæt71¬?è¨Å“'*f?é üËc?í2„¡&Û?ľÆÃ›ýT?ç(»nFWR?í®Ã.Œ2?à4à ÆÜï?äDýwx®?ÎB.UŒí ?£»œlÁÀ?à9$¥YÈk?ãœäŒú˜"?êk/¹~™©?å4¡ëßé?çÅÙÇÇ­ù?˦’10´0?ì(M~Šé?Ð"jñb?áf6H8Sà?ÙíV;ð•J?î\z߯?ØŽo]PÖ?ì¿ÄTEçÁ?èÚ4ˆ—NÔÎ…?ë¶õ6¦`U?Á‹Ÿ Ïõ¼?ïò{$ÃÖè?í*F½¤[?å¨iNwù?Æ[¬NÍ4?¬®ÊèyEp?è⌃؊?íX¤&ûæ?àíåEŠHú?æöÎFÕá?°«{Õk ?âÄùÐ9Š?Ä\Õ¯ÊPô?âùKšÿ>·?å« ËÑJ?äN¢8òø8?Ø¡&*ùV¸?îȽ·ÃC§?·%FÆFsX?Âc¬Ô7?ÛT‡ÊÂP?ÚÌ=Z|>Ô?îÑ.äÕ¦¥?î°B ;k?îv¼uRV?Û qhÑc~?Ã+AØ(µ°?á>JÑ…'B?ìÇxk©ÁG?XS`Ç/j?Ó©ý¸hÍZ?Üè5øÂ?áÉxÁjj?Ì¥•Ø‚H?uö|Уå?Y®SWAF?ãŸraY?á‡Ab!?äÓ¨'~c*?áÊÏ~–?ß_"CÁ ê?ìÿq“YH??è—räûe?ÚÈxç‚?âà1À`É?Ñk]£A ?å.é#Ö?Êvpø›ì?äx6ÚÊÇ7?l)>ܧ?Ĺùò;°?éD“Iÿv?§‰sµµà?ã j· f?ÞÃöveþ?s:H—j?îÊÏÕõÔ?Î[ Ï]DÈ?Çj°Oî\?éŽ%4Õ…?ë@Y´Ýõ?À<®=L?èƒï9\º?ê’Zæsžf?áÿÌí˜í?ëï± /P…?ÔøÆàš‡ð?êÞÜžGK?ðû¨&È?Òú[T%f†?å¼i^£+[?äˆ9×ÄY?ÔZP9•˜Æ?àWÏä†ûß?ä]>Œ,Â?¤¼Ù/p'?Ö8=s+pV?¤åÖµq ?äPíò­EÔ?ß%θ1£?Ñ]È…ýÖ~?Æ£Üa[í`?íž¿8ýs?ï"š,ž^+?èž%eä—?惽¡eÔã?åVVD›?ë¬ß" àª?½‹¢k™ˆ?· 7Û½£?äƒä/?゜º2hè?ÖôiÿnSJ?Ç÷• X?ïµ3bª™?áMØ(7nq?²ž3«9§˜?ÙfÃÒÒdh?´q¤Å!è?äÂv¢„U?Þ)ï~|×Ò?Ó%”¡AAâ?Þœ+€˜”@?ÐQVål?éÚ]ßiÉ?ÄçéEà?à˘hIûÿ?ïèåpkÎ?ï ÐÕ`ãú?îôí\V?æÔL¢Ò?ìÊÿ6JQ,?éö<èõ¬¹?èëüEl?ÀSºì´?ã¤l"-IÒ?ÔeÙKî ö?Ì¡9ªÒ·ô?ê Ï·½{¾?ÔE²òÒ?âJm¥!1?íïzUH?Öbt?´¬?ᆠ2,ë?Ý|$«½ˆ?Ü 5ñ ?D‹+·`,?¯h8]Ž`?ãË!ÿÝ}?ÑJ5èÄ´²?äWýu#‡¾?ç£è¯ƒ ¹?Âa ½ÛH?ïÆ¶—Ñ>D?ì[lö¿–”?Ä{¼¬¿Ýd?ÒôufQ^¶?îŸJ84ª°?æ>Ó[Éd"?¾7}Úê˜?á>Rü™œB?Øçw¥å•?àåý@í:€?jQ™?Ѷ鈮?ïpÁeB–ƒò?ä~ßçL/?ê¾ï¨xk?Çd>Ù?à=½r?á >…«Ø¶?ãuž}^GÝ?äöFäòÿ‡?䎸@Á½?ïÂ:JƒqX?é¹FÓ?–0?vU ²ãÀ?ë."/ôœµ?í¨Ø •K?ËEB•› ô?²‚Î %?ÍgñÞȨÜ?ìÂâ„4ÿ@?ÌÂõÒ;d¬?æ@¢K8y0?Ö ,D³¬Î?à’ËP&RI?Û.¶¥_ä?Äy¤>=˜”?ºÜ혀ð?ÎÜz¶>ÇÔ?Æ@ÃÀ ]Œ?å2¸P“Èá?î)eäÖŸ‚?ÐhQÖr?ÜCúg>4?ègp÷ˆR?ça•/í?áÆÁèì?ÈÎÐ^ûØ?Ì- 7h?Âæª‘üý€?å&´zs?µ§Ú7tòx?ÎS¶T 3t?Ü鼎”?äð}´AŠP?ÐUxô†”?Ñ‹—Ïo$?Û:©|-€?„V¹'€?Ĺàô] ?ÒŒ¯œ°Î?²ÅŸ/À{ ?°¼¶­½(?Ãò_ÿ~-H?ëy@í„\?æÙ£s*š?Õ莶@Î?åü1;J?â§‚\[¿?î Žû XA?Ýÿ°g f&?Þ_éɆl2?Õ\/ ?ßÝp'£Ø?ãÚrì,ó?»æÿÃõ¨?æÁ¿­SY?㘠›±@?Þ˜¦~ ð?倰?ÙÃ&3u°?Ôñ’Æ8ù–?ÖäÎyý¦J?Ú¬bþóÍ*?×>fò~ïf?Ç}v"Üàì?Õsc/5ýÆ?áŠj³ üç?ë ¢ëp¨(?Öš<ç”D?ïuê…?ÉÏ”ŠŸ?ÛP„G{Ò–?è‘"²ìh?Ü+a.óN?®(W¦âp?Ò%«‰N¶&?éŸ^#– ?ã]Î)[ÎÏ?Ø‚«×þž?ç×X»ná?ÀH‰$bt?±{#™PcÈ?Ô€‹„ù[ö?Ü·Eü©ü?Öî,œ ?ë^æL‡ñ—?Ͳ†ìÓÒh?Õ©&+]›L?ï –MœŒ®?¤žM¬'ð?Ïð' ?Ô˜?£dÚA39ð?ëãM)åÔ?å3&Ù´ü?çÆe£Ã‚?ÎTóïJÎ(?꨻ðõ«Ö?Øo½ÍÐcB?ĪRä\D?íý•—¤¨?ɽ‚wÍH?ÑåÈ"åÀþ?½Óÿ µ#@?Ä )ÈÈp?È|q¨Ê@?ÓäŸK2?ï2#LQ‚”?êL.· ˆD?íöÁ]Á?èˆFðUv*?ëiµº«h?Æ%q6RÐÜ?â©÷1/cÍ?ºzJžujà?è}ŽÄ}&?ê’M¯xU?ÀåW= 8?¹ýè±?×y_Ø£n„?ÕZÕ·Æ)p?ã¶Æ\Kÿ?Ä3]ˆæo?èØÕ<˜·>?åE,E}tP?ÙÒÀxÓØ?èÍ…ÞÙ?ëfùé5ÅN?ÜäC†X?ÁÙ;ØP ?ݺ¸ëÁQž?æd‹g-w?ïá k”M>?Øy'€cΜ?ßû•m»Ød?ìwô,õT?¶Ä¯žiy ?ïx¨¸\¯Ç?Ö>8øºh?èóÅ?Swó?îÐÝұÐ?Ý})»¸˜2?î }¡¿$ø?éÞ»¨o;?çP;hf™?êS|Ä36?ݜĊQêR?à‡ˆU£S?çÞóš²G¡?äò[“8«,?èeìR„‚¯?§CEµÀ?Óºloõ.F?ë5•ÉçOc?ä?,ɱà?ã,éLæš?ëÿ楣J?Ôy+Z„?ë$U6¸­Ç?Æ(ù”}„?œbÈ¥¾ŠÀ?ëL¹xëé?À97·— „?ņêô ¨?è3_0EÜŠ?âÏM0Mzý?ÑävE0ÑD?î=ØßÔ/?Üzôâ¨&?ÒÑ#ÛmB?ã(YËöš—?Ýp}“Þ¤?âT»uDYï?áV ×u¢]?ìi yh®?í/góWY?Ñô¡m2À´?Ó»¾Ãkø?àFÛ÷Ð\Ë?º^™´U-h?ïüÈ4»?Πϳ‰˜ì?Ý.ÙÇ f?Í_µ#ј?èKêØ[i?æ‡/9.–ä?ÒôsÂRš?ÕU{º?Ò1‡B³9t?Ñ5(w<ü?æLgíâ?¾T¢¥U&p?ì+Ï„&{?Ö'>Jîê?˲ú$|ç0?á{ åX_?íOÚÎöç­?ØZñÆä-`?îrâ9&ê?ÁZpDxh?äQpÀ+&ú?Ñf-²F¡z?Û .7~?Î â a„?íUl‰?ÇÀæ¹sMŒ?Ö!…½âü?äx´€]VŸ?ëÜžr”?î`°¸¨-?ì;\iB?’ªœ"÷«?ßA¦ííK~?äáÍÊæÍ?×zÍíådè?Ñê(ÂÚ8?弑w§?î0• °Ö ?ÚYŠ*‡ê?çòWrj“»?ïð‹j¯?æ²IÈpô÷?›^ˆOw`?ìÌ%ïWŸ4?Ô"{Ô:¬?ä8 —r—?¶åˆü@à ?âò@”ú?âLÁ‰5f½?äÍF’´@?Â,¾‚Å,?›é¬gu`?ÚÑvFWÚ?µËœb£A(?á:©f’?éhU=þk?í¸iôóÌî?å¾WÒBÑÝ?êiÝ(8ð?Ç} H5‚˜?­œÍÍßyð?ÞmÕÐ’*ú?ì©Üˆ' ‡?æ¤ëg½6??ã?,¤ˆ?å\Ô0±õ?Þ¸½$Cü´?ê[9Õ‡2?ïb…“‹?Öâ`Ü›ˆ?ì’@Äù|?ãS2A¯Ø?Áù—èÊP?ßwÅB_¤B?çì*KðN?áQ¡Z±?ãrâÊÂК?ÛÏ•ø€¥2?Ù4?j­?¿¹7÷÷Ù ?î¦f·ÑÉ ?éhù¡\Ÿ?Þvß)j(ô?ä"–új{?×Ð|—¹þJ?ÜœêhG†f?ß’YY|ä€?ï-ØÒÈ?èUzÊJ ?к $Ù@?ï˜lÌ?â=O%Õ ?Ì'h›¨3¬?ßlyÚIå†?¨#þAiP?Üé?øÄ?µ°*ÂP?Þ½^ê†Ò?ê~¹]·«J?Ùég5†<²?ìÄ¿•ýýˆ?à²îÏôÃ?ãöÃßFÀ9?éUFvG6©?ìÀ§·tt?ãIBu5×Y?à YÞ`?ë˜TTë§C?âÕû? q?ê½]8Ð?ÚÆ*.è=X?ºÖ"Eã?Â{^ë )X?å§¹Ï|H?ÅÁd ' ?^qqþ?ÚPÑ?†W?ÆQ¯¹õÇØ?å¥ó)²æ´?ï{f§„Ñ?ç…äöRÜÛ?碱›p0?Ú,0í D¼?ä2åÀ‹ÿ|?ë-JhE?ÕLÊÈh?ÑM¯H“ô?ÙìÛ‚®h?çIÚòî„?ê)8®<[?í¥¦#¢w?´YšE£O€?Ù)FQ,c?âÒ¥”Ò ?âü{<^À?î}œGSó?ß‘'y{b?â»LxÜàI?âK¨ì\ð?ç^,ÆUå‰?Ô¿BM#ˆ?í)¤fLp?¸ˆAÔ.Ø?À–'J’¤?æ‘^ûy©?«öÀ¸Ñ@?æN«< #¶?Öñ™Ín?éè·ÿi?ìÐ=焇k?å`-u Éo?ãuRªÇ×)?¸qU<ðè?ï»íJW?郫Åô,ƒ?…ôo’¸?á¶¼ÎÀ__?ÞËÕ@àV?ÝÜו¶ÛV?àé\¼,?拽[dª?ÍI 34?œ pd²@?í)'¥«Åg?ánʬÓb§?圶ëøÐ?ì^»P?çý•Õuâš?Èwu`3\€?è©OMŽú#¸?Ñr[þÔ?Ôä¼`J(´?åVK*¯Dž?ÓÿÝÆ‡Kœ?Û‚ó‰_\?çg²ÖÒÉÌ?阖² eü?éXaª*æÎ?«º8`Dð?êfÚпèL?㲩dÖóc?«|¯­ƒ?Ç–YDó"p?åÕ’šã@?ïñM¢¨åˆ?áà&/dÖ«?ê¢ú‹T‘r?ÏÉî]} ?š\]f…)`?æ‘1¸éÜ?æcyâ3€È?¢2\a%ï`?ê÷\¢~?Ú ÝB&§¼?×Føj?Õß=’ˆ?éó™Ð?ìÈ5yû×?àG;&£‰‚?ÑRüsµŒ?à=”¨?Ô'j¹ý‡Î?ìIi˜“Ta?å*3µß?ì& è+•e?íLöð9²?ÚWjâÈ?ÝR#[p5º?ÜÉT?µ}?Ø âû¨?àûƒ‚2?Ú !ás*?Ñ›‰ƒuj?¸sÊ!w)X?àÉo<Ÿ1?¬²`è(#?å0'…8èš?ï"àËmÙ?ãÈ6Ѩ?Ñ;KÛ¦¥x?âníÙ"?Ø›GAw:n?Óm |"p¤?å¿g+}?îÚM§Ü÷«?·p¶U~²P?ïÉš *Rã?ÖI·9?õæ?ØF:O¦Ì?èfuí¸Wd?ذ6 óH°?Û[ã¦ä?àWúP?Ø‘QQFV®?ÙÁšðÑTD?ÍîŒacÝL?Åþf\Æ–Ïè?àcå5Mƒˆ?é*TÆ#;?çÔ¸¼GËL?ã °jƒd?äðqÕÊ?âK¾zÄ]…?ç‹ú¥˜’?Ò[Î3Ÿ&?Â/‚-Ü?ž“Ä©ãî ?ÁéCÆ#5`?Ën3Ñöp?éY£÷þ?â0ÁbÂ,ç?á—_{=¾?à÷6ØÞ?˜“²´l‡`?æ5.ZbAV?ï²þUN?¿·ûvØ?Òß+ÈUóX?A­`?çÎ¥q2ÔÍ?ï *G´Á±?î?5¥+‰”?Ï×”¤uÒ´?ä:“ÓÁ¬?¼€´w$?¬ Ûô¾0?o‘,!@?Æ`Ž œâˆ?Â1ÆJè|?à‚:h¼\?ä/$5lü9?Ö†Sw;ê?Òï–ž%R?Ö8f³`º?nñÕmJV?èoó"2IÏ?átáuÙ)?¾HîfœÐ?ä ÑÕ>­?â³ÈoÍ[Þ?—˜o ˆ) ?ÉØÃqF/?Úgå0?ㄲT†ÿ?íù¥Ö¾òé?ÆbW¸?œû¯ R²@?Ül¡#_¬n?îëÝ£$n?éÏé–§Ü»?ìÔiRÉ?Ú¶1©ÿy?Ì©Ku}’$?×Âiú´(?ïÐû_œ1D?ᓌËV+?ß›\XÛr?Ñfp° Æ?éx-°™?‹Ó6Ò3±À?ê.l\ï?éI%óaá??àG˜=5¦?ÉE.ÿ„,´?î’6qíH9?ä\Öl4?¡‘ÃW~Ó ?¼NŠù¨5à?ÍÌIœþ ?Ù5[• ®ì?ÚTœVéÒ®?ÏÞKÂmÀ?Éʇ¹"]˜?Ã^öÔ߸?êþxºh¢¬?è¬>¥_?¼ÚßžPÈ?î–{†j®J?æ³[¦tûI?Ñÿ (ñ]ž?î>p‚éÇ?è^®Ë¯Ä?ï uó-t?ë_[ÉgU?Ýž]ÎU@?î,+‡}[?ØW#Ó:_ ?ì×þy?B?°ÃISeˆè?îÃhägå;?Â%-`&pü?Æ K=RÇì?Ðô& U.?¦–õ{ ?â##s|?ç>ï.ÌEÿ?·IP&’K˜?ît.æÈ4?¬w…Zá’?æ9žÖz?êç炯?è>Ús‘UÐ?à ¯*F޶?å«Õ mr-?× *=ÌAX?κä&}ô?â'z ò`?É·š;I¥ ?íÈòÖ‰«?Î\X¬åØ?Ôsyd#ßN?Ýr Šo.?ç'y£)GÒ?ÖkÓ@ üæ?ϯ+²v´?äÅ.©¯ÔQ?íù}ûÚñ?åI¿ÙŸ#É?èËL ›Ÿ?èŠêùˆç?é…Е±9Â?ÝKï™BÂ?ëŠnV:?ˤŠvrð?Ø}ïü?Ë>só:?ØÎC È®?ÙŸH22?ë¶'u»§?ïÙÆÊÜÜ?êe,ŒkD?Ô?3Ëß®?±³(Œ?Ô‡]b…¤?à;0ãß??äHî«ÏCë?‘z69´?×X x.å¦?Øwˆb ‰x?ê|‹¤?·àYØ/Õè?çŒSÎJ•^?âËL¢6?êÂÛ è‡?íùž.¤Q?êƒûø¬ÖÂ?í“L~?íuo1áD-?¦õjdq@?îvõZC?ì£Õ(–ã;?ØiªrD?ÕlªY2Ì?¤ƒÖÊßmà?æsêª\Mÿ?ªÀø¨IÀ?æ'ÉîÙcL?ÊIb­’p?×KëR’½h?ì?o×é[?ÞúGŽÇòl?åøÑE ¬ð?ã`JP+B~?ØËº_ç ?Ç¿Þs–.œ?è[fƒn?ß»‚LZ?°\(F1•`?æí2j§u?ß“q‹æ&?ÁÉBÇn¬?ЭٓfÀ?¼|ÈËKÿH?á_•ôñ_Ø?ÞUÛ£&¦?Ø©\ƒ n@?ÈÜæLy?í×¼ù D¯?׿:þ'žD?âu#à{-_?ÖrUO%„?­1\?ßÓ 4zë&?Ù‰’¼S§¬?¸¨¸¯ã(?Ö26(©~î?À¼ÙÝ\?à]çÈqº7?Î_X÷ß.`?¯£\ðÀ?Óê—?rr&?ß!XfÞ&?è™¶6ôcV?àÃLš6cê?Á‘ìç8?Û¶À–âBÞ?âo$ûJD?Ïq–¼5÷l?‹Hyß¾€?Ü­S_¥|?ìH8bÃ]?™Å8þ ÍÀ?Åi•ÎÛ4?³Å5ýÁô(?èÇ ØT ö?×¢ðZœ?Ùnø:bz‚?Ü ;Å ?ØÒN]Þ¬n?ÙP¹Ø×Ö?ê~7a²fC?ѧÚå&R?Â&.a¹c ?ÉŠÄ`-¨?Æpؘ/˜?í1Ïü3?å°¤ zÜ)?镓͘ªÌ?ɳ}R{C ?ãEaG¦´?²ãÿ%\  ?½»Œ0R}¨?Ì+«í:\?íµMßf‰?¯&ã(žà?èë8Äú~+?ìñÀƒá±?Òބ׀ю?äË=î„e?ßZNµ× ?êcÅ"Ó?â8ç±I?ÙÏñùî?ëÅ\RE=!?ÐV±ÛhŽb?à9çÄ/)%?é-VV y?Éȧ¬„—?ÑAAå#?ØEü„,?Ø%²ÚD˜?à+ŵo;Q?ß×r >?µÂ´A¢@?Ö²EŸz?ØziV±z?ÊÉ –,€?ÜquT­fn?èyo3 ?åî˜^CÛ?á4]eH$o?ÏZ· ä`D?éÈ’9.à8?ÉSx?+?Å0ÔWÅÑ$?Ô9VK Þ?Ö£Þ«æ+?ê¤m»‡¢?ëmî¹KÊ?·HY»SQ?Ñb%YN¬?Ùžÿò@,?Ù‹môÆÏ”?ßÎŰ?ÞÈ•‰èö?ÖÏó1[ Ô?ïÈçðß[¿?ãpa+¢?ß!jsØþ?ÙbÕùþdô?ì©Îœ3Ã?ÒWo%ê#Z?Ëîkͤ?á,Ö]í>?ê>#7(8=?Ê^Ò/(?H?àÀL~T@ò?íöƒ=Qd?ä^Õ±°ºô?Ó¦Ýð˜~?Ó[¯çRì?ÁØ»'Ï|€?ƒÎmα@?áãƒU›ÎN?àñ&tOÝ¿?â68c•¡ ?áA¢ôQ?ç¨55?쇌qè?î¿áN¡Zè?ïõǹÂ?âá'Tý?Û”»R:Òü?Ûµ,\46?Ùðñû b?ì +hI0?ßz‘zÊwÖ?2%?“‰4p€?Õ²UÄ?áô9kj¦?µ¨·¼!ûh?Ò‰Ê øÛ’?¼¶S;rž?ç…ÃÞÐJ?ëe#úL–R?éJUïxÚ?ëbˆˆîzh?áºð˜îà?ï¾c·33?Ñ_Ãß,?ïÙü(ÛëBµú?ÕÚSDR?£ˆ̨m ?çWzEü#?ê•4›z?‘gAUµø ?×ÒƒLÅ?ÖOYívô?â8ªNœë?ÙòeÇË Ê?Ðr e´4?Õ. #*?âç<õÝ?Ôøû}H?äÑŽbD=X?Èðâá8?èû2˜Ž®»?çcwF–•N?ÐW6|xõ˜?Øàû«—02?à“{^¿«“?åR×ùÉ?à®KŒ&×?àñ«‡Êb?æ;R?Ùy>Üêf?ê™J`<åÕ?ª-Hi@?:þ9áP?´ù€?âŽ&þ ?¡J© î¾À?ÚªMu?Ì*²™·P?åž9èvÖ1?Óvøwƒ§:?è Æ?öL?ÑÝbÔÈ?íffèÄ‚K?Þ!ñªm¥t?á˜ÝTÔO?åÉÇA9?ÁVT‹üÒô?ÆT?©$Ì$?ázDXI‘?뵡j?Ë—6DŽ¿?Ò¬ƒÑt±¦?ÆhÌ Úñ€?—JKÀ}à?ëôý_?ë¦íËsâ†?îoòF8¨ø?䰬܃ “?éÿL€ö?äÓˤŠsê?ÀÜ3S4?ïÑéé›®Ê?ÜP¬QP?Ò×RÔ–n?â8ébW?¸óÄÞ`?ÄD—4ß!ì?¶àéê% Ð?àåöüë’S?éÉzN???Ûÿ@W! Ô?Åò ¶Ä$Ì?·dT_¢`?äD ÒÖ…å?åþ :n1?ÐDn Z?ì½I÷£ ?áH33Í{’?ï<Œ)x´Ï?Þä+˜6“?é²8Ò^?³”PZè>0?ì¸ ß£?$?äítåmHâ?Ý öZÃþn?¡ŸÒ ¿6`?ÞÄ̵‰¼ª?àâjh­Ðj?×ËO8YÑ´´Ó?âðÕL'ø?ãV=2´8…?Äàâ5y\t?Úcz¥ª§.?Ìcˆ›·Š˜?¾6ªß+°?åd¦iot]?ïK??ÙYÂå2ùÒ?èÍÏܬ5?Øñ ð“ÌÔ?Ì:Gæ|¬?ÝKëû™?ê.í#´€e?ãµ9aމç?á8h^W?✾Ýâº&?ïPI"ç?épÖïú.?¸äÊÄ ?Ó~ï{(?å«2¬²š?É+hüÜ?âªQwwÏ?àrÏ.›8ú?Òäc~Àeè?ìå^üv:?Ä#õ›ÌÚ9b?Â@JKîfÈ?ïc‘Èg?èm àW?â)¦—?„YÅí?ä£4Ǭ1ý?²µ_8à±€?ÎhŒ á6ì?Ýqä;‰‰0?â³ÃF¹ql?Ü:uÞºr?ìç< €½??Ãsog?çø ‰¯·?çµý¡¹?ØA.æÕO‚?ÄikOÈz¨?Ôu —»ªÒ?Ýž„™OÐ?Á)dA1¬?×è(q¦?Ó²Déf?ɼkG\@?Ølõnõ?Èܺ¡ý3x?çpCéXN?î!Ó†¶¥m?æiœü‚äê?æmDë߃?Ýi¬'{WÞ?Ý‚UǬ?ç‘pâ%F?ÛÇ"¦Zú?ßò÷S“r?æ{F¬ó4?êG½SX?Ýf¸Þ?íõˆ^ë°?ך²±§iÆ?Ìþ”10c8?ã? Mü?é¥Nà­?魯ڒÏU?ßg'z’º?Ö@Ã’Vp?éè×5´“I?Þ©«ûžû0?íÔÚ÷„MÇ?æ'/5¶j€?äJtLz’?ì¼ü´ H?áê ¦é??å4•Š4N?ꉿM%R?ésuÈ„c)?ØbhØ<–J?ìÂèc¦?î+»ÁÁ>?Ô&`æóT–?ÖZì©ÆP?ËU@X¬Rd?ë:e}„?ˤøÜÜo¸?Þ¦Š‡q°?ä¤éÀ Bƒ?îÕYRvÞÖ?Ñ ùëw¼?ïŠW®FÌû?äR:Þ\eî?ÞÃz¥Ó¯ ?¡Š_8#Z?Á>•§ê”?ÏÅUÞ­¸?ÂkäÖÇP?Ñ8”ÄØú?ë×NMî?êĤ¬QÃ*?ÓîÍÜ3äà?îè7¥!»?åàȲ¦#?¥_¾fÿ}p?Ð+œ ‚?â0F¶Dˆ?á{ýèrP?ç°†À7?Ü B„?äa»/‹–?ßêB—M0?«Åžåú?Ö“ñ̬?ï€Z9²á?ìYž¼JŽÏ?éÎÛ4¾?é‚‚î€(?¶é¶?êyý+í??ëœé–?ØsZó¤è*?ÐÏ×Z£"?ÉðëxÃð?ÙîNàÌà?Ùé€êÚ!Ü?î,„\—-?êÍ.ÈGdÿ?矨Ÿ?©§°¬@?àqì½"Kã?ØpÍooì?ÜΠºâU¼?æªt 4$–?éigùlc?æ$>”®A?åýsÚ¾’?æÖ™€ß¤?Ð žGmMKž?äü€í‚)ÿ?îÿr¨,ÿõ?Ú^y÷¿v?ä’“›7¦›V ?åÈÞYÊú?ë$…®_?íh â£Ë½?Ü‚¨3ú?émy-× ?ãÜÎÜOÀ?íÚ§ßç×?äB!ˆ™ô?Ø7D7§Ç®?æXTTÁ,´?忨oÁ6\?Ê^Z¿cP?ʱóÈPQ´?ìwl– ûç?Ȫg·Ç¸?çÁ^ÞÔä?âqrTßQ?ÕÇ„úÆr?´u~¨Ìyè? ¨+qƒl?í -«–‰ ?ÄðÀT†Õ˜?ßYYOŽþ?èšùÍx™?áS¸+V½¸?¾¿ý§gÐ?«¦g|ZW°?â¥Tˆð—Ý?Ç€›5Ié4?­tP“Cð?í[£ `ØO?éÎÁÐÁÖ?Ú=KR?ì ÑÙþk?Üí$‘ôœ?è Ixl=?âýò+)G?ÓþÂ¥ (?ÑHAi®?ãö¾y†˜Ù?Ñòo9Ð\?ç6§Àé?ë7ÿ†{1S?И&+v?ÜŠ·rWp?çä`¨¯Àb?êˆÜ½¾ ‚?ßNâsHø?íöÀ³˜I)?Íæ˜^’¸˜?Á>ú™ È ?åõñ¿ÔU?j%´]÷?ë:ž4 ÁS?ë#Œº¹—Ï?ÂR`nÌú´?çásÁáì?ã"øÞÕX?ÁÔ’ôÝk?å&ŒM8K}?Ðü['“Ø?ƒÿi¼÷€?×P½«q ?ìãÇ!nV?åRŸ£Ü)?å&y¶c?ÁÆÞ¼ãt?Úé£2¢:?·ËªçR&¸?ÄF¤>òwT?Ù"X”štÄ?ç®@§›à?­w;pa½ð?ÉDø{Á„?ÅúÈ ä?ívéXĹD?æ™Æ 8l§?ÞÎÛÁ4i\?ê Ľ«K¢?å!í{µá‚?Ç­R!ø„?ÐæM< ,?ä -©ü>Â?Ò}ç@Uú?äf û0M?ÝÂ’äפ€?ÏNÊú½$T?èZWý~t?ïFë]t™?…˜åü=@?ì†Õ_¥ç?éßÜ$oÆÒ?ÙÜcÑ:ˆ?Ò<«h°Êì?ÆÕiŒGà?»M‚ïïØ?•Jˆ ‡p?Ø’áÐŒ ?ÁUv‚s?á`›i|4?×ß~Ûì6?ék?ôµÞ+?éæOç'?èÝ[}2˜?êÑeêNß?ëfƒ1iÎè?æÍƒÀ@|?¢ÏºJíÐ?äm䇘?ÊîuM78 ?뇃D¿A?ÉåÄ.åÄ?åò/[`¦8?¢q´À?ÓÒes‡é?êdž÷vL?âÊm 4ÂL?î:¾ÉÖïp?”.ÞÃ̸ ?ÒõÄUM–?©³z`?äfd‘¢·U?íæ™ÝêÉ€?æD^ ˆ?Ôõ?¸bh?̸Ücuêœ?âvoŽ7*Ï?í]—¢‹UŽ?åE軉?­íOäõ@?ì_b.ö>?ÙƒqgÉ Œ?ìA| µ/?Î}mØÌÒ,?ÔÝûRýq4?äžæ«æ?§âQ Cè`?‚š`¾}Ù@?°p‰9غ?æçÛuiŸ?ÞÈüµ»!š?Âù£™Gl?ìr±jt!Ÿ?»óù†w°?è§ìº·–?âpC¶1Âs?ëWòiaç£?¥—˜_ð?ÃÄë$ʤ?Ì«]¬-|?èC¾fÞvÏ?ïàMJ‹?ì·§[à?Îto…b(\?×âæB-š`?Ýl¿$v¬?ÃÛÒÕx$?ë#„Ó×­ ?ÑøK{‚uV?ìÆ° ²-®?êoSÔÒ?èŒÔ«N…?Ö#Âî—/Þ?Ýl»]sÂ?î8ݵ/û?»)×þžè`?ìûŠ» NC?Øt½š ?æ[7²A?³ñkÝ×eð?í¢÷ÈU?íùCÿÀß?ªb£rg-ð?íK¯}?îéjð*7í?ÁÈU¥Òôð?ÞlñØÙ´?°VǯË@?à ñZÍÁ?ÖžÔá EX?à÷ìüÌk?íL³ÊyÒ?äN‰ÒyŸ?ïᣱÛ“?ásuG)”Ý?¯´ÞÒ‘²À?ןKŠ?ïôÏpŽØ?àe¾¡ìš!?Ýçi¨¥x?èéC5ˆãÿ?äÏ 8Ìk¾?ç®äSƒõ?âÔœbþå?ë3:T.y”?鈺çoûö?·ºhhMä˜?ìˆëpèÁ?ÖVR Ć?ꢾ#2?Ú…±ÜÑ N?ß$k©®?즖òvè?Õ„õëä@?Í«Hâw,?æ2pRSØ®?îïµÀÏ?ï´œÎ)-?ÔC ©;Fº?ä6½q#©c?é‘“ÙRáE?çÇÍz2ž+?ïû³÷né?èéÀ~Uu?ë£ÙˆþRõ?ìîA˜õo?ëXRú¶~)?ב$+6üˆ?èA ì­?ÕÖC¹Kʨ?Âk‡|ý1L?í¡7qÍ?“ÐY2’›à?áŽÏÓcÝ?½ v/âoP?Ó ï‚*(?ІAcN|p?Þð”i–Ƕ?Ô¶+¶À>?ã«ú/?ì)5ãØ­o?î{Ï#³ å?éåc%“W?àäÄÑhs?ÜZ©¸Át?éÿyM„?Á„@?è]Ìë°~?⨸'Ó‡-?ÕaÂ;±ß\?Ü®} …ð?ì&«E©³?ç¡0› éô?â¢0f¨@?Þ%°Û­?ÚV½Ãti^?æ!É`»>«?ÖÙ{•ÿŽ®?ÝbƒŸ?ÕZ?Ýlù­ÐdZ?êŸãŒgq?ä KGŒit?àò0fÎÑ?è¡pí4?ê3ÓZœ?ÊŒSÆ“Qh?ã¹Ö.?È™ Å)½@?àWù7 s ?Þ¼™lv*?¶ê8cËP?æ¨á›ì®I?Ëø%!x?ß:k :?Ü«—ȼQv?Øž“±hÜþ?á0µ¨^>=?¼ÞžçÒð?í)qÚÄÔ®?Ø?¦{Sª¤?Ñå]´`°”?éQ%ÿv|D?ÑõëK ¯Î?ÓâGŠp?æžc}¦P?ë¹´,FQ?är¯H?¬ávYH@?æ¦=% ²Ú?Þß‚éh–?ÉcXÑDt?ÏPv]"t?Ì­oY© ˆ?°ñàßMˆ?åqƒ&Eç?Â.ˆöPLœ?æÓò}c?ß%õ[å€?¿Z­”À?èJ÷OwÒP?Ê¿nÍ ¬?Ç\yíç»4?Ó!‚ ?ÛKpî"r¦?àNxåK?Î/¼§Mm#VW?ßk_ͯßà?Ç``÷vxÄ?èÍ3C3Ü$?ÆÀì°ô"˜?œ=ó5‡M ?Ûòœôº?拜l?ãg&qzR?æšôÒAɉ?í“CCoâø?êØ;5"›?Éžmø€¤?ì™kOøNn?ê«xén3?ÔHÄ—Kp?âMуåÜ?×8Ïb×Ä?à}3Wp?ËètV-P?çÐ&»—?Îáã&]0?³„Z³A8?íæáaaÂ?­à$© À?édGÉïµ?éÇs·?ê'Íæk:ô?èƒ÷Î Qû?Ö&¢8rJ?ëhõî¹(Ø?å¢Í²i˜?íhÐê‘xf?âÞ¸ÖAý?è“Á~h›?èr([£&?ßžJàÅž?å9 &‹«?ᳮ݃?á˜]÷Õ;â?êN å"' ?ïôì¤ù\x?¡$t–°¤ð?ï>éñ´)R?çH ö#¸:?éµhí™7?¼G'~3Ø?äk°å1r?îÒ6æÛ}–?Ô¸©–¨?îêP›ib?z:“ðš?ÈŠGÆÅ?ÖßÀ—œÙd?èܱ°Êi?ìS"]S³·?ÌM•ß¶„?à¦÷7]„è?×Gþ0?Ñq)–Ñ?ŸGÌÙB| ?ÒeGÄr×b?è³_Y>Š,?ßcù¶\ùP?ÝÉ €ž?¦ó.¸`?Û&ºp'r?íEkñ?ß{–0ÞI?æE?Õ>L?ë…l:8?á&ÙäcËs?Ü£eÈT1ò?¸$‡^à?Ô†–kÊ?È¥kÄj6¡™?êjòVa’‘?ÐFû`©¯ê?å!u«Àº?ãžÿ€oü?é[2 ß?¦aJ¡Ó?èác‚?ÒŠq#;!$?ëBöë­Ï ?äu]jŒêÚ?î[i‹—l!?뤅¥?åÞë!;÷9?ìwJ?Â?íâ.W ’½?‚Ûì„ ?äãÇu†?Ó¾ô_…2?ÞÐAÂŽü?ÐÁ–gˆô?íâHR¾R}?ÖÝçG›d?ê‘c³å¯?Ë6b¥Z8?¾ ×¹Éd`?ĈϦH?ã9?äýlò¾§9?ïÛ°’HM?äU‡„¡5ê?çº(Ó5µf?á«’6ÏÛÒ?┹c“aô?ÕÎmØdæ°?Í?uÖW„?À}ˆåw)?ÝZGÂé ?°Þk¢þØ?àä ½?%?ÐŒ74 À?ËÍÒ¡ö?î@¾-l Â?à:¬óœ;«?ìJÛ{Ê<¥?³/Þô³70?φvõÈ£`?ágÛÉ#?â¹ÆlŽê?ê2ˆýi³`?ä•vЕ?ဩè*ã?Ú n6ÖB¦?®AT ?ìÍÑŸÇ€Ê?¸ לú˜?¼˜B£ø?±éÁ`0ð?í¥¼‹Wû?ØRtŠEp?ä+Ó±¦Ç:?ªÆ„lç„À?ÏáÝYØ$H?à ‹ƒ£õ6?íÿ®ÏS¾?äÛF˜mÇ@?Øa¯Ø?èM©ö3ÔQ?§ ðe;­ ?îPTÒZê?èl†u^]?àP\– X"?Þt‡Î$êÂ?Æ÷eØêÃP?Ú$sHªN?Ôcµ!¦äD?ê³Ëfjt?äEìQ­sV?éÜ ª ?êq%)VÀ?¿·mbá&È?¸Húõ§Ñ?×ñu>€Ø2?¸b\¨àý(?Ëfý;umÜ?˜ƒt)O@?àƒøÄË¢?ç„*ׄé¦?èÞ/F°?©›#$‘@?ת d>B?Á2áÎ<½¬?î(±³ó›ò?Ê´´\£,?ãGû8wSÈ?Ѷñýóš?ßêÍáÃ,?Ù’¹ÎmÃ6?›¿â=y¨@?Ét[?ïF…´´³2?é&¸6eR?Ú£LäyÏæ?ÓÀuËtz?æ-ä¾ô¨ª?éu[kÅÏ?É nì ü?íf`¤9–?å¦m“¡³æ?ãLc2‘ë?Õ`Ý:¡J&?­^a" P?Æÿ7Õº L?ã)ìò\?ĵ¤À¾~ô?Ç“÷~™µø?ÝG8â.¹æ?Ü T£'/Ö?ºš˜CÒÈ?ÞQM¤‰ZÄ?å¨Ä9Î?Ü»ÕïGš^?Þõ9ms`Æ?œ¡Óχú ?ݘÐ$Ï­„?ᾤA£Ò?ÕQkv D?äžù<ŽVÃ?ìçK¨#"?ãÐ#5Æk¹?Óû“Òð?ìwµý &D?× =M#t?èæQÒ‚?éÜè§Q΋?Ø3Ò˜?Âó‹)§Â`?È¡ï$?ãÝ-U’Sç?ïzÎ, E|?áy ´Û3?²°ÎSþ X?ï‰$ÀG‰?ÞòkrÚ¿Ò?¿²U½7øÀ?ÃÏ…$ÿ·œ?¯¥ð72°0?¯£ã,ް?ê„ÔW•О?å£M–YF?ä *9$?ÓØ/"š6„?Ø’±µ~ ?Üì鬈†?ïòl=Éß?àR‡Ôiá?½ÁâÒ ð?íû¦¶âÈ?¼ôP $oø?±ñÉØ2 ?ꑊ`ª|+?Ž­ æ‰â€?ã›ÿÝä'?ÜñŒnÍ6¸?Üו@Yºö?Þ߸ ÛÕV?ÍÓkyŒ €?Á¥¯²G¦ ?æ<¤]Ó%?£*`‚Òq`?èž1kX?ØTVŠ\6Ö?©“ÁÐ{ê ?Ü×TW?Îù(œïÝô?áæÉÿdqj?æø>ÌyÖÐ?ÛQ¢ñ(Ëp?ˆO1ÂÀ?»ÒE¹X?ãŸE›ó’&?ëôñhg…Ã?Æl¥‘@>¨?âßÚ¹¨Ø?ßP«¥ þ?Ìvÿ3ŽÄ?ÓcdëP?ÉÃ{çW´?င½º=?æxáBp½?Èÿ9]kT?ëÉ s?땾Hׯ?Ù×ÛLvY?À^&n¹0?ãI o[7?×#-¶„¨,?æý³m“?ÝRúK<²?¥“V/|]p?©Í…=•ù@?Âió¼çÖ?/J7?Å0*Â+˜?é2ÖÖ¦ã?™Ã°Š@e€?×´z$Ç7?î Õݦ?ï†àÍšø?Ù2Hä$û*?íî5`8ß?ɼR$‘t?æ†qóóÉf?Ò9i/t%ü?îã&{9]5?î]p36*É?³EwÛ“ ˆ?å&êïd®Ñ?çƒtuƒ'?ÔtІÝóú?äb-/(?ÀCš)0Ìp?à´œrÑLØ?ÌПö|?î¶B;™ ?Ùk¥0–?à…—`ä?ÊÚMS ?ÍìjÇih?×ÞjQ|ÛJ?æùÉçF?¡زƙ?ïi¨F~3?çËÿpõÛ?Ã$ø®px?£¦õü<°?Ö)ÙÛíP?—„X4…¬ ?àmðoAD?êquùV?ïm˜:@©§?ás_­Úµ?ÑùvÃ!cº?á¾ééSã½?ÜÈôÁ¨î?ߨ "V?ê3"?é?Û¨œÔSëŽ?ç­®úWÇ ?OåcFù@?ímzœ$h?Vt´Ò?ÚVEþK÷²?Ô2«E4ý4?µó‘ÅR<?äN_7-?¨ä¹9Ø7 ?äy ´q2?Üi{Ø~Í\?ç¿ú˜›Œ?w~1yð?éÈŒ±?Ç ò`­”X?ãðL’îò^?è\ú SÎ ?º¤Ái$¾?À¤Ôø~ÙkÏ$?êÿ«Cù0?ãȇ·g¡?èy‘Ùv8?ª¢ðçdf`?Ó²?kHµ¬?ä%^JþÎ?ßP+ì?àç.A?ËÚùsžïD?ÉQÆi†Ó$?æN¸  b?³!ì8õÈ?ãênëFÛÖ?åDaBü¸Ë?éê•Îá6_?Üyð$צ?ÜÁWš %¬?Üg¼ÈÊ?ÒŽIÚ®?æ Cõ†?Ì`¦IBÐ?Åšr¶ì?ÂzG´ñt ?¬$hOù·€?ßfŸz?Ãì™hïH”?Út=ä÷°”?ç'îmÁm,?äü1{Âj˜?ÛL7Ç8‡ ?ÊEr3¥x?åÿ3uõHF?Èì“™÷"|?½:(ßã¹P?ä=•úZš?îdCWžV?ç”L¼3kÝ?àX£®”?ìQpŸ¸‰?ÖÜP’Š?ÉCÔ–µ³\?á‚ÞX&ªC?Ò_jÏb‰Z?é³ÿqw¦?ã7#Iiì?éy¼l—?äv‚DWT?®¥ùUÏ ?ÎÔh:®8?é‡b†Ò ?ænN þ?Ñ:Ñ$8ej?ÝXÌ<ðõÐ?ÔUˆÈÁ¼?£-Zu3ÅÐ?áɰ½N?â–bÂïÌ]?῞“ÓE?ï íŽ/›?âpV]¬× ?ÄÐqÆômð?èp9¶dŸú?êªY¸z•?ÜJiafÆ?ê4è¹€A½?ç€ñQ9ñ?êt ¡çî?çŽÿÚ7?çl•]¹?×Zû8,`¤?Ð^m¡¾±”?å`hæ, (?Ïš¿4?ÕÏ&Ýžî?ã…^YC­ƒ?Ü»ú1ó ?í?›ŠÏØÝ?èÌ’¤ì?ÐU35|?êKˆ–W×?àÕÂÜ{™ð?ï?ƒj$&B?àÏU^Ô¶º?áAÚUfšä?Ñøo0”œB?ÅÏÜqؘ8?﹜÷I…?¼e´û-ð?¨&þÿÈ€?èÝsv÷ÁŒ?ѬÚpH,?ÑÊÌ!Á?Ѫƒ!¾i"?àc» 5×?f¥(Ë>?퉔Ú[®?Þ‡O¨å'ª?È>WÏ„|?Zœ+z?ÞÈÞ;N?ã:OLS&?åe‚vTÓ?èØƒ~R³?ã‹<.Ѩ?œ—a¼¢À?ÔÀmã:~?ÜÆ´òƒl?Ú¤Œ%¬Ub?؆Ȋ¡ò?ßâC…Ff?ÔþKÉÚ?ç̳Wþ¨ô?à)±$‡È6?Êæv¨/È€?åSǯ¤ ?ÚCg,ºÞ?ï|8ÒT?â˜ÏOIŒÐ?åŽÄ€@ ?çhXAZ?ºÂ›Ÿ¢ °?Þ½ÓþÚS„?µŸ‹ùß?ßW¯‡Dà?ÍQјˆ?ç‹4¢ª?á ;ž9ó˜?íYÿœ1'Å?ÑÛú²´2?ëÑêKUÖÅ?î48Že?½ÒŽ;3x?Ä÷}äÛ¨?ée.%{*ý?Íà«ùNF|?ÒG°€åÒ?ïŒÙÜ/?ËŒkÕ%ýL?Ú…‘Éàf?늻Šz«»?ï¿êú?ÙsLÃŽ?é`ö^· ˆ?´1Ù…:¨?êeõt¡?äñ(- ?êõ 9ÉÇ}?Ïægfœ¨?áßDRBG&?à§$V=?Û?Ü dsøL?Æfx+¢ ?©\º‚šF?²¤P¨û‘H?¬¬ˆB¨M ?î@ÚiÙF?æ/ïÍÚ|?Í#’ºrix?%àÑê ?éà б_?Ì̪_Ùä¨?·ks[7SØ?è ÝÁüÙq?º ³®Û¯P?ÅÎŽç´= ?áýãc:w?çlÎlï8C?¸¿b3Ÿ–È?ÃÓdEv?ß+ z?ë[ü%*?ÅǶ5¸ÒŒ?åå.›–Põ?Þdw¦KÜ?ìõÎÍÛJ?Ó¬×.5nœ?É/î„-!h?Ä8?{dF´?Ô6» Ü ?Ü‚ÀÓr¤°?¿F,õlYX?î‹òýƒ…?ÎçdUX?èmÑÓßí?¡ý¨»ú`?îqj> ?Ô2¼‘Ý·[?ÝNØç3k?Éûî¹úõ?P0çç³r?ìéOVÓu-?³65Iz0?ãy$Ihïx?Äʽž=ØH?ítùM$|?Õ%É0k·@?ßú¼øqôP?à³N?¢‡?âzU>Q?áS­°¾k?é¼xbB¥ö?á×.õ[Ä?ëURîvYô?êóâQ5*×?ìä?>jÁà?ÌîUHl?Çg(ë ”?ë|^ïQÝ{?°žÓŠx?ï¾g`t•Ÿ?íƒÚþdá?Öý1OZ*?ÓXÒŽ;ª?ïqJÝ¡k?îsÔ®¹F>?åÎÉTŸ*?ãâ{!c¹?â;òÏ–H?äh¨Ú´;?Ú-nOm`?¾ƒ×Ÿ ?í0>¯ïê?âfZÎ??å… rP?Új¦iÿœ?ä6rⲜ·?Ë;ž6$?í_©šu?Ö÷¿Êúî?ÓXÒÎŒúd?ía€îZN?Ûä÷€6ò?íÔm!äwE?ƒlñµÂ?äȃ(®Sk?Üï¿Å^P?ç<ª¦ð¨Å?îKköZ71?¥Lg\öÃ0?æLò²Q@?ÉxÈ9/Ì?اµÿlD€?Ú+óÜÚ†?ëÊ6ÖÆ`?ÛE ºX|2?ã÷ø·Á?é 6šÌ–?½^5,{˜?å:ÞJ§?ä1ðãH»?Øå¸'/H?Ôn‚bt’?ëPâëZý?ê B£8 ?ãÚ,crf?¯}?Onà?íì;QëO?åjÆC6­?ÏÉa|]°?è ²çÉm?Í2ËÐøÔ¬?±êÈö(?Ý &ê´I?ï•\#h#Þ?èÇU¤i /?íjx¼Moð?¨—¨Å®P?ﲦ­}Àè?°ê¾ø ˜?È +U­|?ØîO]ÐÞ?ت˜ÍYÀ?æäÒÖ0[?¼ÿpk °?í;&­‡%R?ä2TÛ»~ð?ÀŠ•¶ç?领jnÀë?§eˆ,% ?ÕHº­:Ô?×Z%óâ?tlŸë€?©.ŒqÑ ?åØñà.?˲P‹úø?¼~1Ë!€?è†Ú? ¶?è¥ßÜYßÅ?ÇM|Z‰è?ÖGSùµ`?ÞNØnê©Æ?í ‚îQµV?êÜ%›ß?àÌÉy­Ï¥?Ùøj ¶ ?çe:“žA„?¼÷µY"À?ãu ͼçÎ?Ä5 »€d? ÕCóAò°?áÇ૱Ü(?§…ÐP ?ìýŠös?¹>ÔZXþ ?ÎWÈ5WHX?¨cÓÓ…Øp?âÅu­ãÁ/?ëìGc­23?¾m‹I&À?åBt+§™?éhdÀµøµ?ÞòP;Ìäp?ìðç !B?ÛèšÑ"Ê?ÜRç þ¹ì?Ý(©ÑŽàÜ?æU7ÒAß?î•óþ)t ?ë%̘‰è?˜[N?å*t¸ØÇ*?Ø|ó¨¤?³Ã¦ª%?áÇÑò=É?éÙW¯×ÄÌ?Ó–î´&L?Ñß“1­ú?åU/‘U?Õ(†}¦¸?¸¸îõ=?áö›“‹´?ì²SiÏß?ÒõžËDP?ãºFÎ?·mí$*.?Ö¡–äd~r?ŒÖ‚*ò@?µ¼?Ïn8?éÿŠÐŽ C?ÚízŽ$þ?ÒdÀ¢z?캭ÊA˜V?âr7?Ô±¬/â2¼?ë)xœR•?èeå[«&f?ÏU ”P?ÞÐ#.:´?èÜ/¯Å?àmÇÁÔ»?íòû¾bì?ÕºW»Z>h?ÀºÑ0dt?âg¶vî»[?w­ »"«€?Þm‹ZcwÂ?™„8- S ?âP:ÊS O?és#Ï9AÅ?β|Ô`?™edÀ?çg¿Ê x?ÁBÝ‚Á¼?âó¦±h„?ëÈÎ>B?ƒ¹Ûe?çR•ô,‰c?Ì¡z€E¼?ɰ4úIQX?éÈÑ4ã­º?ìÉ)š© _?º Ky¡p?Ð…Žô)V?ÔUÀt?ç7E| °?è\þâaëi?ç–Ášl?ã_Ò5Ôàw?çÝæÉOYŽ?ÖÖq¡¶@À?昭Zx†u?ï=ŽsRÚ?ÊQ¶¹”¾¨?ØMý'oÊR?Á’|""€?Ë·Ù¡ØP?Ëx?ßÂN™°?æ áYaƒ?ÛM™T?ÑbÔ´7¯(?Ý à&ÓŠ?ë[÷oÔjõ?é 3¹T,J?ç_D…[?W?࿊„à™?âjîàžº~?É~¤‹÷@?ËLKÿ¸'$?Ù7dùï@Ž?¢ðJ{„€?ÓukòЧ&?Ù´VÎ=œ?Õ0*Ÿ = ?Ñ ÌÂ%²?æí¤5–W?Þ¹+¼@?é\‰—(FS?íˆà¤˜¤?ÖVÞS΢?í¯N©Ykn?Õ?„¢ —è?éÜ(gá¶7?ëµÓ<ši?æTjý¬?ï%ƒinÈ?Ô m©#j?Ø_Q­¸¥’?ê]ÔqO?ê«í]s1°?áÑ1^Uê0?ãVpŠF¢"?ï¡~@tƒ÷?…š…î,ãÀ?꡽ù,aÌ?ìñm?Ì]¦ rãD?Ë•åŠ`$?äë&|sS?Ôƒ ÂOH?Ý€¿¿˜SÄ?ÀùŸ± ¶œ?Ñšw”‘0Ü?Öp5Ù÷EN?Ðe–öj †?çA¬L?êÍ)wwõÆ?Þm?ù¶?Û®A[Ä·Æ?ÖWÉO5î²?ÖÀƒ¡õX?ærY·(•?×tîý!7ü?ÕÂ"ßj ?Ø÷ÚÁí~?Ú;ÅJ»dr?Ê*Æ«5é4?ä@OÃ$D?î öŒd9é?âÛwìίb?æ‰/5K¦j?‘œäÈÂà?é^ÝÖTP?³éý=Ä×à?ä~Õð‘ Ë?îR­¤ö€?îhÂ@ÅÎ?븤Ù0?Çò’ÔMAÄ?¼y­I`À?è‘V¹>?åNJ߯Pf?ä®”HS„™?ïjÄamœ?ï-–®?çbj¸å~i?²pŠ® ?áýsK©pÚ?暑ÝPâ?î ŠïM?Óï€$ÔR²?¹Ye3í~@?å mölw?¨^Šúœ^°?Ê×Y¿Ã)t?˘ í‰ó?ìã˜ð™?èr®ŠÞš?–©/X½«à?î¶åðxÍ?Ópÿ vš?èÊBÃÿœu?y0ëô€?× º$?L´?Ü?Õx¥¾#ÇV?êù1:I–5?í ¦µƒUÈ?b7_áÜ ?®Z:Hh?îÎÕÅEÞ?àûofÄY?ÈžI­…Mø?ÏÓ‹Dq[ø?Ê×L{­L?ï]ÏÆS7O?æ[ÊS¾Y¦?àí¡Ì˜E?ãV0F£y?ß+µºøÄ?êaK#4›H?æºB¢d+?Ý—Km@À?ÊšTÂo°?î÷! ­?ÕU˜ ì˜?éGÛVçŠ?ãÆ'ºÜ¥?çƒÅÏ•ä?àiVŒÙQX?Ñmó¹Ò~?徿•9m?º޲Ģx?åkv«^Á?ÒA–Cf?ÖLiÜÐÄ?Ã(î| ÀÜ?鼡d4å?â =œü?è®8Ä‹¹?¹Íë#ÿ?jHÙà?éVÅWMç/?ì=R¸&‚?ìÿþUÌS?å€{«|Ù?ÙAã[AZ?ÆÝ5[Y|?ØP¸‰‘*R?ÅuºDî`?ë5JjL­?ÄWÙu\?靸¥ËdR?×Hüñ‰2Ø?áü:†ç_?ÛkkÔÉÚ?ÝË7Ö× P?ë)|ý*/?î?`’÷>p?¾•l3e¢@?Ü,oÍöÄ?å&B¼$­?å䬔$?×L¶"1æÂ?æÙ¬#r?â„yüe ö?àw!î°?ìk_B½p«?é0XÆE$?ç!™ÆQä?؈AƒŠn?ïÊ9<‘k?Þ/ú[0›î?Õ”=²–Àn?±ù£ê›A?î]2íø:«?ê gH4÷?¿[]p$KÀ?ïÜuJ?‘µÂ'H?ÖjCRf?îÜBÙQ5?àNïNØ1?Û± I²ê?èIÓtM¨Ä?ÐÇ¥µ‚š ?µÌ/^íÈ?î j)nû?ÙÏ™Ÿ°º?ç ôÔ”/ä?îKÓv2?ÙfªAqHr?×ѬÝf?æ¼d^‡ÿ?ì=¥›‡>?ì²-Sä?¯•ÇH&kð?àBk6Æ ›?_Z>˜câ?Ã3ú¸€è\?âwêG04ƒ?Ö»yÇ"j?åÅ'Ì„¤h?ܳg%àÓ\?Ê]í…ø¼?î…fÆ7°?Õòi,¤8?å§gBÎ?Ùß•r·ªì?ã-íÈS ?ëÌ€æ¾×š?›ìˆ¶ŸI ?á:“ §Ê?Ïqѱ¥îˆ?ãíRÓyÕ¾?ëuà_]?ê|ZÛwp?ç%âÅ—Í?íÃ)×’Ëú?ÙÚPß±É@?ìG+NaåW?Ä×·»?ÏD?ìÍP·æY)?ãÆ#!‡?çà kÒªý?¹ØízA¸ø?°œ¼BåY?ëüíœ<­?ã'NMÝà?è¥ B€d$?î"Áah ?œg•+– ?ìb–)+Qò?ì,Å9ÛöR?Ûþ eò?ÊùýˆDº£œ?|„ºÉ¬?Åþt\k³p?á½²î@z?×ÒL6žµ‚?í#¯ºë0Ó?âå㺫Ù?Õrÿª'Ü?çáÚsÿâ?Ô"9¯"(®?ÎW{¨±@Î[Î?ëTkÔÅ!³?Ÿ02Ws ?ìÝ{dó(¿?ß‚ªýç¹Â?â&žÞß„D?è¼#Lu½½?ìù¼}) ?Ðq~Ü$?¹Åò1\qè?ä)áè§?Ô“Zød&?È©¦pOL?ïÞŒd/Ÿ•?êMªIJ±Ó?ÝOëå™EÞ?æ×xæSt?á(7õ ?Ë2Aü?—5¯Êœ( ?ï#í_‰¥?ÝÑSâzF?ÕÜÕÞ*J?á¶%ŠCa?Ém S•%À?éþèV“Ð~?çg7=17?àeŸ ç?È&‹ž ?ãW:ÛØ?Ò )Yßà?ã]Aë¦?ê ÀCÿº¸1Îö?â¢éàê?ÛK…f¨"?è‡)æ/)?ìŒbð9å?í‘'ZÓŒü?ÙWÒ8ön?ëgÜ5TÞ?á {t~å¡?Ùoo›ªOV?äjÁr/Õ?ÝÈ*{x¥J?ܯêÿË™B?é(9ÚQ'?? ÄÛ3D€?ÁÊÀ Aì?æ¡)aÖ* ?É·>O³]?ÍšUl?ÞàаÖ?®pËG  @?·ž¿ø:˜?Ñ%L[üÜ?ïi ?!ú?ïyEáýë?íSÿ<²¡-?Ûº×1Œú?‘{J Ý‰À?ÚÖ&øâé^?èãÜdžP?íÊ$`´Ä?íòÜx·Ó?è™-3y˜c?Ó’K´¾Îž?íF+¶V?ÇÄÏuï\?åÛ&3;‰?ïÐß-·ßË?ÔÌÈÓNT?µ TÇ`?Ö§Xl•eÞ?Ù+†þòÍè?³ÉH’^àø?åG­u£A?êƒ\u4î?Ýdì5Ÿèp?åìÅu?âùl‡K0Ÿ?ËÃC^þäÌ?ȥݫ›˜?àÓ¬ßá‡j?é£ü´/ĸ?ÑôÞ%rW?ØcKò%ÓÄ?åN¾%Ê Þ?æfG:žÁ-?ßIJ­ŒŸ¾?ß̾´à„?é=+^ßîÿ?Þ?‰4zéö?ç0žG­>ð?Ñ_¦4´Ì?䊪Wýé?ìpQǶi³?Á ˆ+;A?Ïë}ž…:?É'ž _tÈ?ÒΞ4V&H?è©6Ôû3[?è´q7 Ø?Ó;œµ«¨>?Ï N;Š~h?ëžâç¬Ü?è&;Î0À?âÞkéj ?â&™öH¾ž?æ[Ηý£?á8 ›ÌV?é >÷÷8?´­¨:p¸?—„ñÙ™‹?âÚïeZ?§ ÷‰öŸÐ?Ö9mßq?¤„ëpìñ?Ê@§Lä`Ô?âZê#Më–?ÛK½E×A’üÞÑe¹?ÜìAÎë+?Òn8ƒhL?èô#Çß?Îy®ëÞ ?Ú¹vÑ×V?Ö•RAÚ?Øc¿v™¸?ä$;Œ›°ý?µ,Ÿ8ïp?ãYh¦Gß]?݃r 1ªš?ÑÀ[©“Ý´?È¢4ç¢ð?Ä;!L‚,?ÏìOGýÖL?ª,W;¾ú?≘¬eèB?ÂÒ=*êêØ?ãk³39¶?é ˆ=íb¥?~×¹ Ð?ëtª¥„Àå?ã¤÷98—6?p4*ɘҀ?ÔÉ&ömjô?åèÌ-?ÎùÞŒ‰ì?è­²wn \?êx–¿yéœ?à Ü2wL?ÕÃg·ur?™m¾ò@à?ÅV•Ö,Ô?âõáè¿õ?â²îàÚÎ?ÙÕÐÏßRˆ?ÑYUÇd?Ò`iåòøð?¡ŒÍ±]Z`?ä‰Õý]Š?ÖÄ×‹í¹‚?ʰ3ç¡:à?Ä+}5å?æöÑÿM•V?ª¼¥6¾$p?ì®\m…æ?³W $k°?ã|fhXM?èÝ¥ÿà³Þ?ÜRˆnxv?ÂA¦àXØ?䆴…²³¦?Ó“a—Ün?ék´À°,…?Ü•skÅ¢?ë€n¿É9.?⨌6ÍK?èʼ–G´?áË!¶}¼?ìQíñô9?ÀÝŠšn@?ÖÄ =Ì?ß»kAj?¿•ïË_˜?ÔÀMý¦nž?Ým;]8h?á°×鎮?ìÛ_ñ×?Ü©y7OB?éR_0?ØY*‹«$?×LòFmn?äÙ“¨ Y?Ûâ¾°è?ïúcS¿Þ+?¯Ê€U¬Œ0?ÓÝt2<òÒ?劇%òõâ?ÑÂRÂ?åÁþõõ ª?ìÜ~ÔÃ?è4|ªØ\?Ò÷Plç\p?ìXRÏaŒš?ÞH¨Ý:0?ÁÅm¦?Ú\×Éî?ì9P•>íþ?È~Å5T´?ï, ¿ð7?ï¯)èÏEÅ?Ø?uKu~Ò?ÙÑå¿d?í ãgrÄ3? ^×X?×ã¢L˜?±Ù ¢÷@?êƒTqdØn?Î äVœ?áK·Uò?ê)Ê}?Äè?è’"30?ãýàz2D9?âfâ1?ޞń'Îø?íñs Ûå¿?èÞq Y²h?ê{üò!?í_V™ï?â\>àu?ßiõedÚ?ê‹1/jéö?×HÝ{Ж?Ã!ÈBÝÏ?ï*˜9 Ì=?çtFȤø?ä¶²I<ë?áY#_øß?±Ãa0w ?Ü=c¢16?å­À6jíÍ?ßíœúvªü?Ø¿Y©QVN?з;Æüh?Ôü£Ÿ¨d6?×uë/Ø?ããmˆbD•?ÄŠÀy,LÀ?èl PÜ?×4¯4ð¬b?àÍO¡¶¶?ßñê¥Ô ?ëØ­%r¢?Ë,oóL£Ì?ÒÆ«Xvz?䊲¾*1ý?Ψ'¿ÓBŒ?îŽË]æh?Ünlé#-Þ?àM…æËm¦?ç>+,ƒZ?ã‹$¦Rã„?”-ÌÌ|º ?ÁUkÓÜ%°?Û&NÙ¿†?íü 7u?­‹ÅäÉP?áî)¥tø?œ‘|Î&°€?Ðv"o„?Õn S‚?ÈÕ_ÁðmÜ?åÑ:ÊÞÆ?áƒ3ÖÝBî?ºq–Š–ýX?é¨T(?é²aŇW?åC;«—·?ïg©‘K{?âmGͰi?×_x„W&?á"´¶òû°?Ý‹‹½$?{ÐZ!B€?î0b÷LŒ?˜WAHq ?Û@ó¬¶?±E Jf[(?í½†ÄH°õ?éKå±êý?äA?l5G?´;¬d®þ€?äÓ–Ù8¨†?Ñc%§fV?çþ…Ö€ë?í(Î Ê?íá¦T¯?îϨèÿq=?Õ::æSDB?åí½‚»?±ßÒ›fè?ÕïX†X?Ñ„î9ò?ßùÍékœ?æA°ÐÁ“˜?é@ß`ÌN?ç.`v°l?ëj'ú„ñt?ÕlÁ&Iö\?ÒÂþrF0?ç[=žOûÕ?íï*ê?¢ W«ÅAÐ?ÝÛ5¨Ôk?á^R¢…³û?Þ²`ß$þ?Ò Ø¨?Ðvjÿ.Ö?ìŽ|QMO?¤k/ù|?ëCt0Ò$?É:b¢vL?æéº8œÒì?ãÇ:.´oË?ÙmLºÿ_¤?ËÿN{T?·m¤ÎÐT€?î[?ËÈ[X?”5Øl?é •ÝIý?ë*ÝÏCzà?Õ󣋖·b?ÒÞW8B¸?à£í ‚ +?ìxÐtd•ö?Ñßãf9?æ TãÛ¢å?÷˜Åov?â×\ïÜ?ä§t¹A?ÛxÉ¿ƒjp?Ö¢t‘Fü?Ô¼v €?à×¶“?Ù â`Ðìš?ãús÷”§?èÛÑØ6Ü?êÒä~ð ?ä0w%f´¾?ÄÈžµ$?ì4ÑÅúãª?ëöE‚ qà?ñ½!?éL+©–Pv?Ì\'µf@?ê´&3|1?à“aykGo?ØH8¿»}?Õ.:«Ñ:?àφ¼p©?íº´v ?¸ÀÔtð?âMá$½k-?åp˜¿9U?äî/1.?ÖÎlÔT ?ç˜! Õ¹?ÙÞó¼?çGÃüð?ÖP4)Æþ?ãœD–ÀxÀ?âeË7MæY?Öö„G-#T?¼Oè™C0?•„¿¾@?ÞÕV@>?Õ1<‡Äx?Ú›CX‹2&?ÆA“ý‘¬?ãnÒçW3Y?ß´Zzç1?à*Ylé?᯲%Gc—?ÒqUú&’˜?ÞáÖ–I¦?Ë{Y}ÉÄ?èxý:_?é#GoÃx?Ð;C¢uÀZ?ç×@à,MÛ?ä#Ыé¶?ê¾4‡[?ë…_/Á_ä?ÇÍðl•Ô?‘Rom‰À?íü¨ÔÚ.?Ýø çÖþ@?Þ3—bd˜ô?㘭 ÓÕ ?é EÑFq?줱 ã[?á7Ùt¬?æ§UݯÛ?â 2FtÐÄ?ç>|P­§?ºË×n‚Å(?î07Š,ï®?«÷é@?ÏÔÞ÷ Ä?Þ;aëð@?œ'œóˆª?íœ!#8Õ?ÙôÏÆÐ°j?«bºAèßà?Áz0ÞÅt?æ×OŒ-#?—B€?Ô kÌÄŽ?tŽö|f-€?£‹~¸ùo`?îÌß@Ô?ëƒKTܶ¼?Ù«‹ tZp?ãÁà)Ø!?â¤LXñ†§?ì&ºë£,?ë IcÍh"?ÐMðóÚCÜ?Ñ,€(‹’*?ÀÉãæØ?è$ädâuÞ?mø€˜Èé?ÏÖ¨JÑÐ?êP$‘W›?â—Ê?¥œÈdQ0?×å©àn?ƽt!¼›$?ïÏ¡¾÷$?ÀÖ¡4[±?çmu»åÚ?éj”©Fq’?å-~*¹)?êY¿ïq€?ã!¶ Ôèè?øQêcØ?ç… úûXZ?ØŸí[&h|?ßϰ­ûu$?»Ëöyuˆ?ï‘<¡Y¾Ç?Ê·w{Ú¡H?êLöFTÐ0?É@ ö<ü?ïëhš«K?Ècúq è?ÊVè@‡Ò@?à4DM]ùd?â ¤§Ó”Ô?ê#ãOÞ`?ÒeÌ+¹ðº?àõîÅÛ€¹?å%ʺ‘Àt?í¦dTV¥? sn§¹Æ ?ÓÃ@t.?è¶›±ËRœ?é‡ '!k?ÛøïÍF8Æ?ç¯:ÿDVò?ë‘Él°Y?íè%è’U"?¹"]Þ3Øx?çêÏóñ¶?¤Øb.á°?ä%u ?ÐöMÕ +À?º•âaw¾ˆ?áp) 8Û?en$Îù ?â¿2[Ü?è?ßUs8-Šf?ÖÃÉFŸNÔ?ãËG™f¤p?àñ¡‘­ö?›öP~c?„¯µY á€?êIH%êŽ?®QWÑúÜp?éèOå ?¼èŒŸéœ ?î=orã‚õ?áx®æ  ?çu¦yŽ?íD@(ÀÉÇ?å-V/Ìè?—÷ø¨?Õ—Ìlö"?ëH%à õ?å’ ô×Z?Ûn‹~Kán?ç®rçjÏ?ì±N“Ýæ?ÓzÁ–ë ª?ää3(#üd?ÈÉ‘”XŒ?â*ɓޙ?ֹ丧?ÒÒMv+²?Ø €Ëã ?ã.dxb¡?ê,]p¨Y?냫‘§G ?¼Òôëj@?î„f%d»?áy0¹dQ\?ã å^å¸?ÉÃK jŠˆ?ÌV!^®!d?Èb²ƒ¶M?ã˜\™¨¸?é„–¦Ösá?ëâR ¤òD?ìtpAÃ\?ã–C?{?Ü·FsìÈ?ìvº(j0?æõo¹/½-?åbýÓñÍ?¨ê®æ>`?¿ $ø\ï€?êý¼®I?ÁÔ.…Âð?ÒkˆÖÄ?Îfåÿ@¢`?vÓ†ƒo?ÎC]ɱá|?à¼:±?ç„”vR†v?览{‘CÐ?Žwlü'@?ìÛÛ8è?ìµÒv‘á?Ô&ÉÙ\?Ën¦&1ɼ?ß¶_îà{`?è¢95Ëßï?­›À!rä€?ÉùÒ£\`?îÛC†ƒ?Î’‘Op,€?Ë5õU€?î x?¶.Œ?î@ÆÅ’h?ïnZEdô¤?é;[»Í@I?ÞIA;(.?‰çùÒTØ?è,û a¡c?ç3¬2?׬ߥ 1"?éCK>€?à#!Ë, }?âÈýÙ›N?èårÔt,Ë?瘰E…t?ßý,Ðû?³×È\ïØ?îg›”½ƒ?æ’Ä·?Õ]‰YÆ?àòÛoå\?Ó/ÉÖ?ÃɦØðF?íŒdëR”ë?×@EÈ->?èÀeò'í?Ñ,‚!®?ãº^y E?ê$bn9¶Þ?áýŠRäK?ÐÅ+rxØ?Ñ)ÞƒºVÆ?éÙu5½GÊ?ïÐ2N½ê…?ácWíøØS?îîðÓc%?ŒúÀ²`À?޽ƻ±Ó>?Û>¬nÅòö?âIv¯s?æÅSFhñ?äÓØ:û¶?投sF?¼^næÔ5È?à{±bçr?É.ý12ˆ?Óþé½Zº?ápoïb‡?ëþœ8Ý ¤?É ß4ˆ.¤?æhSaõ?ì÷† '€ ? ˆ2þ±.?àRí‡1@?Ô Ü!?»,$7ó?ì”0)Í ?ëŽå§HJZ?ë°µÔo5„?àx>:ÿB*?ìòå U³Û?Ú¼ÍÈ‹§?ÓŽO­þBÎ?îl€Ía‰?ëqWÑŠ%?éÀ÷Ü:˜!?ãÇ`¥?¥m¹ åÂ@?´(ëȵP?ÔÙço®?ãך™Èý=?ÞÖãßß/–?Ȭ;·þ¤Ø?éö"9¤?ȳ¤«rFP?°«ßf‰Ù?èÞb««ë?ÞlJ5 n?æÚ]I½#?Û¶h^Zú?ïà*ã±?¶XÖÔÆÂà?º¨âàC6?³re[šé?×=f¨'š?Þè†-'p ?ÜXøø%$?ã£XV ?·“ƒ.49€?Öèæˆ*?ÇÆB0Ü ?í0Dx†?À]hlÍÿ¸?Å ,r`|?È,ÈÞKh?Ý£:Ñ ?í-4j2Lw?×.ÂÏ'•(?æŠøêºó3?Ë ¨±4?ä „ápc?Ùås L?¦ež;|Ð?É„$¼6à?é‚ÒQ°?Ëõ~ òZè?È1P &È?Ø O¨|?ÚØÛ«À?·—W˜Wè?ÕØ0Õ„×{=’?Ð^ éΪ*?ˆH{ÿs\@?èfÅg3¹?˜yUD×À?Ã… *D?ì‡ê¹½Ã?·ë‰§»h?íµQÛO8?Òçô9zó8?éò‚L½?Œ³q ü3€?ÂN}>ÏÔ?îèr¶ IÌ?Êw h²è?ìK¾Å.÷6?Þ Ñƒüö?ϧÝüÿë\?Ú`HË%éú?Ü (ýjý0?àX4›ýÀ??ê/"‰ ?êFu u¡B?äÔ’A?èàTíë?Ñÿ¦þÃd?à‰Jœø¢J?ìD‰g§}?Ãà3ˆÃw?ã8‰žuÎê?êÖÄF.|?ÀY‡¿\úÐ?ä'îvr‚?„ŒÐxwÎÀ?ÓÁì¨Àsú?ÊH!Ï L?ÛášÞ`?ä=&ºj?É•i VÁ4?ÞÉ7ÂÉü?î§ÆøÚ?¦µ• "À?ÖB¤‡ ?Å÷–ð{4?Ý•‘‚éÖ?ëx†i×™?œg K§·`?ï ¥±0±?ÈwG鄬?î øŽ›‚@?êæpkñ?ãþà‡ún?¼ƒI°~`?ïød%’D«?ëùjóH]3?ï(Y€ôcx?ÍⲞ¼?¾z„ë»:x?Áýi–)+¨?Ä .‹@`Ü?Ö"_¾¢j?í*Ž÷i—I?”BÕe!L ?ϲ> á?å”ôNÄ[ã?êxkëñr?äž½ìŠûä?ß®oìPQ ?çj\&Ńš?àÁÜ)ÿ?’“õ¯À?æŸ ¹­Z?Ü#"­&Jä?Äl¶ˆK h?ãäE‚¯§?¡è’:2`?çÆ×>ôY?ìØù /÷?çÝÞq’³?èÁ¹Ú=?Ýmå¶+b?TÇ÷FH?·±¬OéfH?ÓJíq¨mò?áK¸ û?ê°ü‰$?¹?êøªÄ€?äS×Å~®?à}ÞP÷ï?º9¤––ˆ?ºÜ!MƒæH?ëÅ#´çK?åzÔƒ4î?Û5fu#—Î?Û£~"”?•³%s ?è¥À®; š?³Ž_ÔÀ—@?Ö§xÚ>â?Ñh·`^?ëꮳ᪜?Ôh%DU}ö?êßœ´=?á%Z ÑÞ"?ß“^è?ÔÕArŒŒ?ÑÝRŠºŽ?Ü"ļÖÌ?Ð`èݨB?îXM"|Øö?ÒZƒY×@?â6Vê?À(ò}5?¦E†š¨7`?â©óƒ#?Â@x^Û½?Ì‹@Uîˆ?Û…òÍONÒ?×áÝ6Õ§ê?ç ¨DÁ?Ð_lâà•–?ÜB:üY¼h?Ø}Zø î?â üÿ¦?Ó2±ëâù˜?àóêýC‘b?ÔÛmJ ?ÔÁØæäÎX?êÂŒ¹‘?ߊýïkt¦?á•8 ùt?ïå À$(Ü?žñ\¨ ?å =ƨ?³áAíÝè?∛lÍž9?ÊäU“‹28?ÐÉr´?í‚»ÝÎ>Ù?Ò¹Fù¨ÒH?í*ÏãÀ‰T?Ð3I•“g0?ï0ï(ÁÌ?í«5³J~?éÐiY*œ?ËI1$»?×f'ÆWb? €¤¨)?ê*lõž›á?À½ûÃÂô¼?Þó¿ävà÷˜6?é›°¥ ?ÃožYØ?áC|ø«¼?Ï„¿Yø¼T?êÌÊ­>êª?ÙµtEYô?Ìn–Ì¢ãl?Ü(*6àÚ?žþë%ÿg?çxçfž–?Êᄉ/¨?Ã_ÿ8Œ?åŽÎ¦ÚOý?ï ¨´ºI?à®2¬=›Á?îøŒÖº?æ Bg®Ž?ã”þg(n?ÍÆÎð(?ÂxJ˜L?Ñ&Â\‚H ?æ¼ãøQvŒ?Ëœ|¶z» ?ïÕfÏé?Þ­ ï<Ââ?î{ÌÛ~*ã?æ.Åhe6z?Æ’¸Ô™R$?èìé}3"?ä=˜ñ¸÷?Ä=Æ+?Ö?ÚlV¤“Ð?â7TàbŸ ?îÔÊ@Ù/?ÔUÿ#@œ?î-*ÁBÉ?â—“¹Çí?ÙÆV%u£–?æªóƃWõ?âÉ­‰ÿ¼?Î6q` ?ìÕzïõP?ÅA>LÝÞˆ?å`44I²?å Ú5?Ä‘½í0+ô?á(¥%Þþ?Éó?Åå¹ü?ѸԞ 7:?Û’€èÊ?àÂ?MEô?á´‹Á„†?­Œ9°&p?Ó'Cøªx¸?ë{H´3º?ë½ÕÕc±?¬cµ_ïP?Ø/…ÎVþ?¼ñ"Æ{?¥Ÿ 6§à?ì+Xt?Òš«>«2?“£fï5€?î!¼5µòÅ?äV‚”®˜ý?é[4‚·¡&?â÷®§1Ô?ã®øz/eØ?íG^,)?ÑÌË÷õ"?âUª˜ëÖ?ãÿ¸k›Ä}?æÌñy¬µ?° Ö9¨P?ÂÃ,“.?— ó…²À?ßDJÍ–?îó^x£ÂÁ?âãJ_ì)«?Ð`ñ²è~Ü?¶c¸nâ?Ò5Iù®ºP?¸¶åÝ'>ð?áõ² ”Ib?Úà*G¹tö?îù%žiî?Ü&úqÃ?ØêÓ‚7°,?¹‚©ØC` ?í¦ ß|ÿ?ã¤é|#ô#?ì äïÿ?ë£Q$³È?¸é4-_H?©Yé‚« ?ïÀ/qìk@?íËaCä]?ìˆÿ<†Î?æŸ5 if=?“Õ-Š]%@?¥/3híaÀ?â̵—ÆJ?Ûßòß¾+|?ãåULŒ Ÿ?áèIe˜ó?«nš@x„?Ô;á°Z†?¶ÍL:IØ?Þ%&PÊ?ï¦JÐ]‡Å?ì\Ã1?¹z .Éø?Þ¬pDéŽ.?éÀmgº?×ö„1ì?ïn·kŒ?åÞ>©álæ?ê¾Íþ ¨?äõ¸__˜?ãý_ª€?í>sâ aè?ç'í¦¾?ȳŻJe,?âA9=´úÒ?ág:vÝ6`?ìÕ Ùÿ?ËOÊ&;:Ä?ìø£ë~ó?í&.z?eÏ?éÛøà'€Ü?ÝÛÑŸá€?íNs7¦µ?Òdà˜®?Þßmè[óà?ê#´.éª?¾ÑòŽ*è?‡rJÎe„@?ÑéØs â?ê“ ã/?ÂÛ¬­)|\?‘"[jº`?ÞÀ—§qÅ?âu§ &9?¶£Ü<Þ³X?æ¿lc‹?é?ÎCx÷¼?u”«P€?Ôöï~ÓÒP?ãªVÑ·x?è¤Gé,{?ïëBé¶Ø?“étÒ?ä×Ý9àç?ÁNü±F\?­ZvÒÆOÐ?Ë©O$’,?·õïµh?ä~^›Ã¹?Ó?⫹Ð?ÕWvòOvà?ç“ÜMÀ?Ý–³Â"Ìj?ï³*˦²?íѼ÷Ï?áwï¿XE°?àq Çp™ý?Óâ›¶TØ?áýβÆ?Õô¤zàž?߃^®ÄNŽ?䮘ü)vþ?Ì`ëà„?Ø6Ñ›ñŽ?ãL¦hµB?×¥ŽRö%¨?ܾ£ÊÒc?ÀfÃ:R% ?˽FµVö”?ßg¦Á7¤?ãQ­ËD³œ?Ò~ÁA?·ÝæÉsÇx?ã)mÑÒí¼?Õ~?DmÎ?×Xá{eð?é@¾G%‡-?ɇëmO ?êèøHÆ?‰¹´nÝÃÀ?×óÁˆnV?ÒÙSØÞmÆ?èª\%RN2?ìdy5ì‚ñ?ÃcNQO(p?°f)=˜?Ö×粯À?Ù,È‚;^l?Òžðrþ?Àö¹ž¨BÌ?ÊÞLí×¼?àR Wùÿå?»Ôx¸¶¨@?‡B.‚®À?슗ûSOO?Ù­«ƒ‘¬°?Ékóî+ô?è8Þ?mXÞ?³î7±Mš?Å 0X?ì«Aîù—?ÕàåA©•t?îlÛMö‘?í3mÇüt?éóKDNE?—ÑÞuO ?·c»â_y?ßiHôÃ(š?énŠ}à4?טã’l@?æŸ(qÇ‹?àöÊUì?íµ¡Þïü?ç2ë´Üƒ?çí?ÂvÊ?î® SÊ&?ÙÒñ:7ÛP?ãlÕü4í?جpK`Ð?Ë?¡£·3Ô?ÝÜ›¥5Ä?ÑSpÆe8¦?ÚMÿeý,È?àÁè™Õù?à ’®1ô?Èžñ‹ˆœ?‘UìôGÀ?ì`î °¸?Ĺ€‹Ôç”?ÖŒ§€øÚj?ìù 棱?ä½ Nëzu?êg„=-`D?~A°|ÿ€?¬Ž.Ƙ¬?³°Ëíl–?È©Þ!Ó³€?á‹QKÐz‰?Ð<75(wd?ß¿ªµZ&Î?ßÌØŸÀËð?çw¾:a’"?ïTùKMy?¼—*¤ ? ´FªIQ?Ðڱݹh?ág~=ðsü?îWx­&þ?ì*õn§Â?è̉59?܈@µUJR?çõ äÒ ú?çšA[°íá?Ýv9óSt?鄱#”d¤?æ½Òƒë-g?ãp·2"Ö?ë`JØkµ?¾2¤ÙÆ{h?Ð.{÷&n?Úîš}ÛÁð?ÓÈR[šM,?áÒ!‡& ?ãN";’:?ÁÙïÏa˼?°Ï˺~?𤋮>À?ÈIyj¸ˆ˜?Û4´’ô4?çC«O®Ì„?ì¹!Hq—Ë?ê%J`^®?¾Ê°ðNú°?ìÔô‹?ž*?ÃbØhVœ?ß”F؆?îS—õà¼1?ïL6V™¥?ì÷›®l6½?Æ÷í¼Ú¨0?êÓÎò³U¾?áQ³í×?áØœ6Bï/?äÚLLÐx?í“HZÐ3Ö?ì'ýcIp5?Üùïý’?Õ)ßË‘\œ?Å'LdTˆ?àTØ Õð?Ç0ü9èód?ÓÜö?½£ ?Ú:ñöàÎ?鬨¨ R?éÚÌ@ïi?Ö“T`+¸â?íquh[á¬?â«ËʱEl?쮪PdÆ_?À~ɉ»ä?Ò%‚šxUÄ?‹E.‘?íz²ý‹³&?²WÇdå`?áS².¯þ?èQ×5`ðH?ßÍïžN1wMö|?ã_tŤ3ù?çx·óWÿN?¨1r`5÷à?ÊGÅ8ä?ë ?‰ â*?ÕÇM;ý…²?éu]Nª¡?©w‹‘½ûÐ?êñ˜ÖSŸZ?ávÃZg?éwˆi8ïZ?ì6ð›Ílh?­C&K€†Ð?ãÎ|Phoa?ê—Á…þ§?ï·W3íÝr?åY|~ô¶?ÞØbæ°ï?Äj°· 4?à0‰ö§¥Ö?·å°>À ?î2¸Š}ü?äúú:¢÷ß?è5ÇTð?à—™]ø$2?ãxË÷q+‚?ÎP—¹Œ?îÃ]íÛz?îú³KAy?èÍbvîj?èî¸éÓÝ)?à¿$7$fà?áJj€?Ññd+Z2?ã³§"¼>?ê¼£·ïÌž?åN’@6À1?È…¨°-}8?±\K¶Ìs°?»1úO…‡8?£¿öDFð?ÕMû¸&1Š?æ× üý?Óå*åD€?é÷BØÚ(j?êŒ22-~?Ôÿ²Ø¬Æ?Í—]"ј?ÑZș¾?ÌðVAUÀ?×bPdë^¢?êò9šü/?Ün\#&?çd´IcÆ‚?» :=ú?éô#Êmó÷?Çjø/›+?Ø+ÏNŠî?å[h÷E·¿?Ët¹Y%â?ÙþT¾Úö?à/ÝA?àCmñÅ6?ê^¾±Q_®?ä—É ‡W£?ÒÒdÚ¦È0?ßhHòm0Ô?ÒE>ô"!*?í4Õ^¿)?Ô{Å9º¶?¹Ýæé“P?î4/Éœÿ?égŠÀt?âb³ Êw?ìù%)ÚF?çd‰={?O?ïó4î–¹?íiMÎ7À ?²ò/fñx˜?ÐO‚y;ª ?×Sn†Óئ?è0Œ=¬k«?Ém/ŽüG¼?±®G¦v^@?æ„á&ö?Öfl¼„?ÆÅø¶X8œ?Él O¡h?æ2€Âwäì?Øn"4Xó(?ìT®?ÑB§XN F?ï2\&b]Á?á©æ·xþ?êþL:Ñ>{?Õ{ûµdõŒ?Ų5á’Š`?±mWÏqF?épñÉ ì?àþ+QCÛ8?ÕêS/D?æ¹e#Y¿Ù?é…-Ÿë±?æGeW7c?à™H†Òiÿ?µ4öñ8‹0?Öå³>î€?ë«» žÞà?Ñw+½ì…0?äÆò3¨?à»’K}‘?áF>yNõ?Íô«@SÈ?Ðéßë¨î ?Êß ßóç|?Àe3f–=Ä?㔋u¶‰5?Òé[ªü ?¿ Rõu=˜?¶õÓÒQ`?ìFÍþweu?ç¾ p£'R?ç@Èâ~,?ÍÝÛ“žÛ@?ÌÍCu#4?šîÿ„?Íÿ6<È¥?í%°íÚÈ„?î>Yáë’?Í ŒËÞѼ?ä@o«„£?ã¡jÜÝ%`?Óô UW²D?äù ZX?ÒÄd=¥p,?ä+ÒhcƤ?îÀpÝe ?Ň™›ÿ)Œ?ÓFþ1ê?Ú–pL?ÞK©p<Ü?ÐJÏ+ûR?ÛTÊEÁâ?åÕèb›»?ìÓ Ï¸Ð‹?Þ¬™3ÀYØ?½ò‹ux4À?¸Œ2™†(P?ëŠdeK‘?Ûø=³·|?Ûþ-˜o^?ªò§2|?ØýoÿqÈ?农¾ü5¯?ÞÑaß?¿p.¬pbà?Ù ÝžÂ?䨙Òð}r?Ó%³6ý`˜?·¾FÀžx?æ'ë?é]#$ç ?°¸çæø?ÄÔyn´ž|?á±;c‹|!?íŽòòÄO—? 8^SQì€?ÕÜH5nœ¸?îj “Dêµ?äó+ÆÔëa?â,}€v¦?éÀáÔϤÇ?å÷Âgvƒð?è>VòŽF×?ÆOh€I?äe°D¡Y£?ŵ “Ÿ…¼€?ºO-[¼qP?Ä·B[{JÌ?ÆN޽¢êp?§˜^Yƒz°?´^Ž„Pà?À°ÚØ?Äè?é²R?ŲQ¬¥$?ëÄl žÇ?ç{ºàÁñ'?á9õØ¬Š’?íS¢ØÔ‰?ÌêÀÞ?攪\’2È?í!­Ì *?äF“×7ŽÐ?ÓŠÑm°d¢?ÓXüXâ?×âõ0b€?ÁX”pôÔ?æ0»ù×?×Þ| /‰Ò?³ü%AvÏà?ÚkìãR(?Ü e¿'ð?Ñû÷¨Ëì0?Û‡y}ÆÔ¼?î1wݽ?ì µêPà?Ò;©0:¾?Î×Ö= ?åË߸´ÅÖ?ÔØ—0¦/z?¤ñ,•Jò€?¿šïq?íÃe¨?ëæµ!¬J¡?éùLë^¸3?äø¥«—Å?åO"C!Û¾?Ü'ÈhH8 ?î©j –Ù?ÛÛ6g„ƒ®?Ñœæmýs—?Ñby´ˆe‚?ÃJdgWT?Ú\­•xN?Ø\ÀRRî?Ÿ`½L ?Óüs“Ÿº€?Ò’=§xô?Ó\Y["4?ä‰k.s‘R?앞DÜ??áÃCû¬?Öõ@þz”?ÙÙaÉ?H?à u—n?ேÁZeô?áfÞèy'%?æBÿ¾ËU?Ü& >í?ê¼&¯2½?ã¶B‡Ãk?ëì™ fk?¼Qî{Üû8?Ãã]B/Î$?Û¥ˆ1ìïâ?èê2[1Ì?Þ¦-ü{;z?î£7:ÿ±3?Ú¸¨oCEX?Üu ðÀäŽ?ÄzÊsõ€?ê EºyûR?ɰµ½!¹°?ì_}FèÑP?îØO“uH?Ô°7¥áŠ?ÌóZêÁ|?âh¯Ë®¯#?±¹‰»p@`?º8þŸw(?ëKc„Ôë–?äŠzÎf6À?àï}°¾I?Ý&/å íô?ê·L¸¹UØ?ÙkΫ“Ï(?ïô—®fó?ëórŸÔl?µÂ0 ”ô?à)»…ˆ?ç§è ó‘»?ÀŽ4Kd(0?ÐL ËRà?á •µÐã?ï:¸êèŠ?ºýûÔþÐ?Þÿ2ã ?ÆîÕÔ¬ø0?éÍF$dhG?Ødm?ªê ?í(L éåW?é§Ô÷…¢Ã?ä¡C»kĹ?ï~Â%Ï. ?ÓÄ>Ôœ!`?Ê@ÓBàL?㢌šÒe?ê¡ù“±?ëfL¢ø?ª=ÌÄë?ó°ç™m ?”èXªV@?£¾ 0Ÿ@`?äUdA„^Ø?×¹ç@?âüiÇ ?äÍçàä^?æJˆ2ò,?³9†N$Ô ?ç²¹h=„ï?ÝqL¿¬ÍÂ?³ø³ù*ðx?èÃVøSˆ?É!ó;×À\?»[0¼¸Ò?Ù&U!òÚ&?ìfË(!ûÝ?ábK9ß[3?íÉúøW¬Î?©.´wus@?jRB¾FA?À{°_”?Ù¯½^«Š?žUö+u§ ?ƒÉ£¸Çô@?×ò P‡ø?Ì€¨‡è?îöÁ !x?ßôGÂ-?Äõ¤„?扜kv?Õ@x… 5¾?ľƒØž,?µËfòñw@?æ+*øg9?íR¹Ù!Æ?ì³>F;¯?ìÅü"ü&ã?àãD—Ü[R?°$JªÓŽ?ÓÀÍÕDæÖ?ÇÌ›ãʃ\?èíÝ7o?Ћïäü¸?ÔB%Ó=uL?îTÓê‚ÿ?ª9„lc0?‘²ìœþuà?ꆟŸ—$?ã®Ç{¸³?ÚBùÉ£(?§êôep?ä©ÏÎ&’?µxÒ¦¾¨?£b@ëIý ?ÖoAŒÌ’?ÑÍá@Ï$?äÀÑ5&W?ªWb%§CÐ?ç¾q÷…?â-å$å?’gR„£Eà?ÜlåžHÝL?¼æ°-Ýw ?Þí`›Rz?ÇPÕ‚nÀX?Àv::Ÿlà?çOý´?î&^¼ü_;?à§ø|?ÅöIñƒd?êTÔª¹³?í˜ëµ-?Ô%³?ì´“Ùe0D?âP$䵨?èÈÞ€ÿW?ÛÒŠá Ç–?à~p Iñ?åk7it%?í€Æ†ê\?ê´O(#?Û5;?|?ãÀÖð^Õñ?Ü{NƒçqŽ?ï@ÝmÄ?Ó}4†â?Ôꉣai*?Í ù¼X:¼?Ò½ópn¨Š?æ²éV˜?í‚ÌâZúb‘?ãÂŽÞ¹È?Ì‹$j ,?ï_iÖŽ“?ëó»a¨¢»?·»™r”Ø?äWÿDŠ?ß•M$æ’?åXjæCD‚?Òÿ/剂z?àQ‚Ëî£?Õ‰ç>$¶?í¹vÚ$•?Þ!ã¾0êè?¼i ‹ïò?ê:¦‡wÃg?Ó§I–N?˨4Næj„?ÀlNkÛ?Õ›ˆè´?îá¥4[‰?×ï‘j¦Ýü?ç‡â…ØÛ?ïæ]¢³f(?ß4R+«j?î”Sá ½û?äºq$<á?È:Šã9«˜?Í\õr@L(?ã¸F»â!?Çõ×&Ô"\?ÏJ¡Ó¿.„?Õ`SŸ ô?êä©¿Ô œ?éJœê#Rù?î,¤ƒò?çp’çmL?æV©³lx²?íQ/`´ñ?íóýŒn·Ç?ÖöÀßT‚?çQ{ÿNA7?èïäTµ?å3Æuð?êéK¨Ch#?ʇœëØ´˜?½þ¡Ê%k?ã~ä'ì?Ø@ŠÜ$†?s©˜u*V€?èÐ’îõ?Ñe¦–ítn?Ð"ƒ•‚¸?ëQ¦]Z5p?åb»â~‚±?ØV$ÂKÑÄ?(B[ú@?äÃë3Óé?ê,"€{ÔG?Ó:e¹ž?ÓåÈþÛ ?äÓÐÚ,?Çá>ïBc?ê÷=”­êŒ?äùr)Ûˆ˜?íFC£¹ëò?ìÿ¿‘ýf?âì€é¶p?Ýí+U¦ôš?Þ ¶jYÔZ?—UA–1€?ÖZ"飂~?íë¬_g\?ÝYÁm©în?Õëcð)?Õ,ÞaDl?È¡¹ö‚(?ÎF®Û0?çx&£ÐƒÍ?Í=/ÃxÒì?íDç¯g°?Æè{¦÷ˆ´?¶þ"?Û”?š-Í ?â¾oŒ5_@?•Š<”†–à?‡Ç=[o߀?âÒÃGù-n?éàs•'?éÎCêT¨?ž›w~@?Ç€—p..¨?êçne3p?å-碂?Ù¢+ä$V?Øš> R–4?ÕšìéüÀR?Û_AÌ¡».?×cñ†ÄÜ?¥¢Ô’ØP?à xÏÎ(?Ö&fÊSÀ?ÔÀÇço%æ?ܤ¶Q3šL?Ò{ÁÕÐñR?¾ÆñuÇn¨?Ó 2Úh„?íeäê|:]?¶±Ü„«Mp?éy§‰U?ä'iü?”?Û²:tiˆ?ïþ×ræ?Ð%AcüÌ?»HGå"?µJOI†0?â¬Ünˆx?ÖÆðZ?âÁ®ž#³?ÈfŠÕcÁ?Þ5„ ®?Òbad?ã‡Ò¸Q·—?>ø,û†?Â*ÒÊ?êyrB0ñß?¯Š¼3ðLÐ?ì:lËŸ?áÞk™+¢—?¹=à;÷¨?äÀ Í-€ ?èÁJ€âT\?Åÿ©ùéod?è íj¾'?ß3 ÔÆ r?îÖ C€¼?é—_bÐñþ?ë:[)ƒ¥ã?Ñ®Fýù0x?íÃʯ ?å~ËÅ3;?åßwò—Ü?Ï™ !wì?îãwD@?Ü-‡Ëþ?åð4¼ôÔ?ÏÆlûß”(?à%E@L^U?ÞD,‰Ÿz?íÏ/–U¸?ÍBæ–q ü?Úe4 V?Ç”LßL?펣B»BU?ç<#Ã4?Ô@ܵ/H?Ëû7c’h?·E†‚ìà?múÃËÒ†?Ý=0£)´|?Û•YÜ~Tn?âÙKNä2?è’€Lò°?ë5{^£g?¶Gth»ôh?ØRsmX?ç×™›²¹?Ô³Âüíœf?ÔŸ6J Ä?ëmÔÄÊzá?é2jèYÙ?–±®4`?×%ø ôR$?ÖJ™åp§(?èƒ`Š=?ïyÇ®'áÞ?㡤Vß'ó?â«1»©š ?°Lµ÷“?ÑÚ®G!î?ìtÙ¢ò?çdä}ï0º?๣}4®?êñå;M&?â3£c#ú?é0ݯj¼¼?ꑺ]=âr?Ö ÂÇ~T?ãÈÃÂYÄ?ã/_©@n±?´ig<,g?éa­_ŠÈ?á]íN Ò?á§Ñhö¤?Æ/uTcD?ê–÷ÔÿO?äÚÓµL&?ÐA·Ò}6Ò?í15Åú!â?êÒd‹Ï?âšÜó3­?Ëœ0J·X?Ë/k(œè?åØ&A÷Õ?åN®•í|Þ?â¬ßZŽß?Æ cß ;p?ã1'“ž?ѱœ’ ?æËÇ,6?Ç/JðÞÀ?߉ÁÁ2h?íÑÜÄïP?ï„ ?êL!¹c;[?ëD%/žâÏ?èD‘(Ðû?Ñ>Û8vOT?Ó|)²Ã2?Èßç=OTT?ãQƒ¢÷?íî±ÉàÑ?ÜÁœÁÉÄ?ÅT[Dtô?ák2íµ2?íPUõÀì¸?¸ìß-õÐ?à‡?Ü©Ú|TÒ?Íx™ïd?éÔoöŽƒ¨?î죊sk(?ã+@߉Ä?ç3-…>mK?äZ·£”±š?æž%{ä??排Âxÿ1?¨b|ø¥à?ïJöŽ:‘E?»ª (ï£Ð?ëC¦Ö£†?ê]wÁMÃ>?ÔâÑßí\l?°4P(  ?Áðáw“?í¶´ü¥!?ºÏü÷¨?̯ÄxÍ´?ÝpM 1ã€?¡ñ,ªƒ^?Ü¢1öÚ?ê \ áŸ?ê2‰«’œï?ê[·%¶K?¥úÄÊ@?àÞ¤eŽj?ì¾ÀÞa?á#Ù Óqå?áub¯ Š?ƒ½0À?êÊPÞ¹ØÈ?í:=ÝØ>g?ׄ.¹Àn?ïÈIŠD ?Ò(VÃf?àÈi’©ˆŠ?Ð"ë‚ZÄF?¼—V|Óx?ïÈf¡˜z?Ñ+d`pÕb?®WÖP?ë6ÂjBfR?îÂB Þ,4?ãéÓÚù…}?âÉ?¦Y?ºIò*äl0?Ò!\y¿0?Ñüü<“t?ÕŠŠÝ›xÒ?ë –ß{Az?èû˜?ëiVJ.?ëI–Ø ?ìpcN9æ?¬Õ‘Jì?ìÎn¥†?ÉÏN ¡4?ì šÏn ?íÐ#‘Ý»?çïtö; ´?¿‹*vÄ€?ݪ>Å”®ê?ït¼.%?ìó’ykÑ.?å«ý)Š$T?በÁ·¤I?èŠ ì¥Ó?íà_:o÷?•¾•.ñ` ?ß’’0·©,?ß¾1Vb?Ò3-ÏŠæ0?‘t €?é®M[Ò(Î?¤‰oW¤œ ?îúLŽ—Ü?ÁÁq‰¨ø?Ö¸ü‡<@?ã‡m ­?áîlr‚#Ì?}¸ú*?éN"·ïF?¹ËÕP?Æéšä;5ð?ÜX‚U…Iî?ÁŒ§óvPÔ?ëW,A‹?Ï“ Ñjà?ÞGå¥W¬?߇ _4’Ú?Ðw7â;z^?èË%á¤a?à|ºŽù{?í.R*ß?Éê>o”?棇òø"?Û¾j `?ÑJ€é·â?àxh7?¸œ\Ò8h?ë½ÅÑjTØ?ç_‡´´?áY03̰?ÑW P#:?îR8xý°9?éi Г?êž-f$â?ä;Ϥ@t?ïÏt˜¨¸š?ì¶iöa?ÜÆ³ Ü?Þd\&xF?ç縲~v{?åÿÿsß®†?å0k+BË?Ó™IÓ_ìš?ì#ñÑAÃ?¥\ÊU“0?è¶ :—”m?” ó(ïÕ ?ß,Í cº?æ^•¤*-?Æ)F„޳,?áè?JƒMÏ?îóRäuÕ?ÐçŒÓR ü?Ëöz­Ô,Ü?áaßêmŸ,?å¬ jXÉ?·´UôH?è€j¾ÅŠY?ì?•¤K°?Ðúè7è¼¢?ÌÙ±sœ€?ÒÚ¼¡ N?Ô]$¶Åp?áÏÓ@ø&Z?ÉÁ¤•K­ô?ØÙ€¸ U?å¹Mߌ¡ž?âl‘ÒÔñu?êf%ÄÏ?ÛlB»Q1r?ìäÎ\6Õ?ÓR-"?ºõ™mJ^0?ÑMé·‘8?ྈäE›i?äz´ñ¡t©?¯Vo±Ð?Û)¡ˆ² ?ÂêW;á:î?͆ô²°À?ê;(ÔïA?ëÒ”ßùé?Ãgq±®h?²Á3)¥È?ØTŒîâ]$?çÝ?Å8wD?æ _Çc}R?–Mþ, E€?Øþ·óEi?ذdU„?ÓsGf#í ?Ú…‰Ö<Œ?äé©(©+U?Ä5’™C\?ãÝïÖÄ'“?éÛBà'ÀÎ?ì1xmðI?xÞ?á ì^‰?ëzÌš“]ÿ?ÆäQhº$?èdXŠm«?Ûá§³8š?Ç¢ï—6Ã?Õ±÷“o)~?ìøpZX}?ä¦&MmçØ?âüÞ§Ã<Á?ë=A\ÛË?í€\`ý|¨?ì'ÿà½"?锋¸mX?ã´ÔRÑ0ù?Γ‡qýØ?Ô?JfÖH?å£0‹ÑWO?­sª_}‰À?¸´YgóÓÐ?Õœ‡À$?±{¹í ?â_±µxÁÐ?Ô'úärź?ásŒZ\?éËàK†6£?Ó¶c /B?â·îì“?áûØŒØ?°†^#gÈX?ÞɤÏuÈ?У6“ Û?ß}D~>ž?ÎÑÜ×ýã?Ç!™t•¤?ÏÎ…ücF4?ãñx^]õ=?íF†>žu^?Ç4oôe(?ߘ¬g´?Ó±™‹;á ?ÌK$H¨\?φ¥M?ãþQt'?é˜Í¥× ?ÆùÕ¼ðop?âe ’ñú»?ÒÓìd¡@?Õðƒ…Ç(?ÊÁy=*¬,?ä©§)àú?ïíBH"Ú?ên­•í0é?ï˨j.G?à¤)Nú?é5 ž€x?ßËÊ Á¦?¯&÷á)ˆÝ?ãIU€×>?›£„ù`À?áÁ“|ФÏ?â\Œªwuf?ßÀù¼wÅB?Ã)¶fÓåx?¥“±Û£xÐ?ï]¦î ¡÷?ÅC2#F@?ìî3,67?Éȵš– ü?Í {:o-0?ÒÂjÑI6?Ù“‡gÒ?æò°Ecþ?áw¯‡gá?ljyË^¨?í<)De°•?ÖoC-Gà?×JFÅ•`X?ÊlbK7?Æö;ùÜœ?æ‘B¼v¹?ÙÉݣ¤?êAÆ%Ä;Q?´ ü¡mø?î=ï//,”?ÏPÉÂây?ÜþÏGÔ~?êÿԉ߻?ç¢-œ F?ãÄ8Ýÿ ?Úžw™Åïð?äÍuC„“1?ìe‚ã°?ãuÏj·u?Ñtˆ¢‘(?ÈŒH#݈?Æs–øÅ¨?îßËi|†í?îäF Ðò?ÚuÕþ?ê/JÓy?ȉZ @?åoØþÎxè?¬9­dÞt?z`0—«?ê¿u»£[§?äá .{?ØSÃoÏ?Ñl’ÂÎ!â?îo¹«%л?é³øXH˜?É[¼’«ò0?®L±îc9`?ãZÜnb?Í`سHÕ?ï/.3u‹?Óœ«—/j?ÙKyžrª$?Äp"µ> ?ÚWøÉ¾ó´?ÐÔâØ!nŒŒµ'?èäQÑ=å§?íHº´jmš?ÄTË9îÐ?Ýú†±‹|N?Ĥ%Å0Gx?îH…à2Ú?á~™š2´4?§}ØfSÈ?êÈøŠßê?àùâv !?ìq`êý?Ãaè À”?êlÏ EK?Õ^§=ã§ ?å1’ÕØ² ?ÙP^ úž€?æë€²!m?ÔÇÖÜxº.?ïü¨Á+4^?éÐWø?áYïn?äz-þíœX?äþ¥ÜTD­?ëö‘2áG?¾.ˆX?Ñ=¤RçDP?àÀ -z!æ?ïÂáYD ý?Ý“X™!iª?Ð/õR5mb?È™éb*<ü?ìa\'"ƒ?â^D¸• ™?ꉵ$„¤?×ùSY§ËV?çyW®6{?Âü|£bIL?ݽÀ´xd?°Aú È?¼þ©J¸w˜?ÜmÈÄü?Å Jùa°„?ß݃L[l$?°Ø'%Öoø?°Btacð?å§¶CÇ-U?å¨ý »5?ÃÚ÷_¸à¸?íte ʇÉ?Ü@èÚÿ÷b?Ý€:üÑzj?äÏßFÙõ¦?æù/:ÝA?ÕG uÐÄ€?è*œkM?êBÁðæ?ëÓ†×Â¥?è GI?ØÓNk>´?ØïSgÄÔ?Ô²>!¸à?Ãt³Ùîœü?åÛ{Ä4÷?í—"κ[??éômCÃÃ?è`Áo>Ð?¼Ló0‡`?æ"ò^€Ý ?àÚõ›.Ãû?êÀøªÅ³?è-Þܜ߰?Ð3m‹.¤?Æ–d²Ø¸?ì¶:ûYŸ?¥–Àlzž0?·ËüÕc¼à?Þ!™3uøÈ?È}ëft)P?ç­~ ùFM?ÊR+I(:à?Èk ¤K¸„?ǵ)‹'g”?ÂWs#@?ìÝ3è'|.?Ù3õ0Òb?Û¥4Cæáö?è©ßŒEÕ»?èú)I;Õ?Þ©›¸<`?Ýt\}˜‘^?äÃg¤Èg?½¼âµ„€?àñ\Á¸˜‚?Û5co¢*?昰)2 ?è~n7ùˆ?¾—E3gÄ?Ú¬¯ñ~üR?ÒŠ!Rʼæ?ű_RªÎ|?ÔÆÅ„r¢?Ø—]öäB?Õg•4õ¤?ÁômFð{¸?âtøÈ7gÎ?ÏGyh©é°?Û©ûÍÀð?Åå›c‚o¼?¢ø±ˆ°à?íC"òJì?áHhTe?ãýá^*Òa?ÜÁ8‹MÉú?Õ'N|æ|?½´Á怳è?Âè ]Ø?ÝÚÅæË|?ît(ÚN?²_ŽKÜëÈ?è˜ò3²?áË^Ó?ÀØÜ[®x?ÅÉxÈ~?åB. VÇK?Ò…™DpÝr?ï£Û¦ ë–?ç½µ7*YG?è…¤ü/?æ dïÚ ®?æuÏOÖ³?Øô!•Èv?íYŠv¼?Àªñ½sÄ?çî,âìKÒ?Ç=x8@ð?»í5×С8?áNŒ®Æª?ã‚ #˜?ÎH€VcÈ?îÆ2¨Ü ?ÞmB“ËX?ÊëÌñ#od?´Í_•î¯Ð?˜«†©”)À?ï/zÝŠé?ž8×bÖ‹ ?âò°1ÿ<Û?Úâý½-í¤?ꃑ -1?Ùê¼µ!p?´™¿à²É8?ï⬱Ò0¥?àÕ²vá Ð?îmbf#E?ÝÈ I%vN?ØžÛ!\À?è TFù¦?ÜÀ6mëçø?ç8b1ëº?çß+zl²Ø?Ä€Â3”œ?è&]r¢?ÄBñö¢T?¢¼ƒ6™R°?Ûh³Ôr¥Ü?Íü`Ô¬?Ö>²·ˆ?ìY3v«?Ñè‹Þ|Ú^?çw={ Ü?݇pEâ?ä}a¯BÂ?ƒ8Ôå‰ì@?¢þ^,% ?í€íK×ûB?í$êÍŒõS?؉ù“­ÿœ?ÜÕÀé@?Ò-ÕÊDÀ8?áX%þÂ?Þû€W)f?â³Â¬Þ'q?ÄÓLêÚkô?îÑ“†Ó±?Ö»`F’Ä?džͫå}Ì?ÝP=:·?æ³'ìaî·?àûÔ´üW?Å™„íô/œ?ë;wœ¸ ?¶®Ô–ø`8?æÐ£E†øv?à2uÞ,Þ?¯ûU”aý?é hEI?ç$4ÂY4ú?€÷ùõ@?çT]ŒfnO?ÝÊùžKŸÈ?æê“W\$?íµ7ä±?¼4‹—C¯€?±ØÚ&Ûð?¥Ã©ÄåL`?È0Ë*.eD?ç¹4ã‚¶?ë½õO£:?ÑÏ"„b?ÑN¨1/à?î*=õó?çáµ™¥“?ëK7‰?ÛùÔÊ?3æ?á­Ëç¹èª?µ6Ø9‹¨?Δ»nñà?¸œÞ8svÀ?Ü,@[qì¬?Á@´~«?« GAMÐ?Ó»&¬Íh?vƯ$“ø?Ù+­Ù~"?´:ÓϦ|?À¾¯ ðŒ?âËœt'úÏ?ÌùàC×P?˵÷ïFÁ¬?á"zrþc·?Ö÷×(™‡´?Ô•WkRL?âù‘ûò?äÓ<Èh¹w?¨¼Šô„Ÿð?ãÃ`¡”Z?в ×÷¹Ø?½³&öF: ?áÆï ®?Ð_ÿ-¸°?ïä5°‚?»×47íc°?îµP?åOQ„å¿9?Å—J«»:Ô?à»r‰Ö?äokφ?ɦ ¶  ?×#½™@"?³V´ž½ˆ?Æ*"©ð¼ü?ájš4bHÝ?à/k‰Žw??·ÿ¼jO?éŠ=TU@&?í›\¿¡ê?ÁõóÔfJx?èÅLV¬‘?åÊY½ œ?°³ÆF…Ó?åL¯L‘H?ëx¶¸©2Â?“.È~œ¨À?ãr¶^FíF?çúÌÒâÅP?åÏÁ•}\i?íÆª¡+?çÿ½ ýŒO?Ñ»ÕãIpÞ?ï tP)›¼?ÝÎä7²¤"?Ïf ²•D?æÀ̇?ïxeÍØA?îNïöáÂì?ä·x2íÊ?á•ÚüRm?ÃñôxLl?êÈýa+?ä !òïê…?å…_¨W`?ùôÏH'?ÑpL‰^®?çy(îóð»?©(šäSZ ?ã)ƒÏ?Ý¥%¼¡J?áÒs¾¤i?j*Ù|ÄÐ?ì©Wbj‘?îâ´v)ô?Û°_g?ÙŒÀF`š?› LC g`?î—ÊÍXz?ßÄs,‹gN?Šöº‹K]À?ìùQj¯?ã¯.¤H?éKlRó}þ?ÂY I ]h?Ý+qëd²?ÞwLV~(ì?átÃKܽ?ÒË›i>M?äúÅÅ‚·?Ôö{ÇÄf°?éöýnµÉ»?ãʬîÓ­?š?8pDv@?Þ1 Œc¸V?ì8AÚ?£ÚÐßxÑ ?äËêôÙ/N?嫌$„¬;?í£/¦:ÉM?ìHäM/Cp?Ö NøVš?ïW=½•©?ЪŽi‰š?°Æãt@ ?ç"ñ ¨?Î)JìàT?ìíà ‡G)?Å`Ÿï:š?á4cƯ¶i?Úje¤F?Íanž x?Øp"U?–%°‚>?·î‡4P?柄Çt·‡?ª³ÿ¥G<ð?á®™^ôÍ?ìp+Ї;÷?ÙÌ}ᬸ?Ç[–ñ_­€?×òaÄì¹²?î%rCל?çY[‘ð•?ÆÇ¸Ðà?â$¢ð?蘶©±#ö?Ù\™–&^ ?Ôr‘Íà€:?æeNåú²?é›5c2Eë?ܨOÉÈ>®?§d'¼h¸À?ã½þY¦e?ÌQO.Q T?âLy,M•0?é`E-%*V?ÒÔÀE‚?®—ñ6?ä$ç3Mìl?Òö´b~†?ÆŽ} dt?×»ÛXô?ãà± ¡DR?銽%˜Àç?è }²!¬ã?¨L²ç×L ?åÜbP?î5 ,Á £?æÅÌa'âe?ÓϘa9„?П~—m­.?Øu@E.`ä?تY¿`.?i?Óu?è² U?àߦ í?äo¦.¹ÇL?Ä;ˆ†pÀD?ëÖù\¹QR?é2ÔT´¼?ìß¼jé=„?åÛË`Åpw?Õl«ay*|?êŸ^vÊ?¥éèèmwð?â”öï.¤?årí$~o?ܼAÚ­fÜ?ì˜ ǾÚ?åv`ƒÖ1)?ÍH[냅?ÙÙJŠ?¸?èÑìÿ,E?ï°†"ùÝæ?¡o¶³à?à"–jà”?åoB DÏ?çr ×7Çê?ÅÏÞe(Ô?åé4阆?áHPüÙÍ¡?áÑtÙfS?Ãç£ï’ „?ã㥼ü.º?¸U§föÓø?é—YÏ–?ã9h_?É|z9T?ï)ýtíÊ?Âè–”3#T?Ü•@æɰ?áD‡çÓ ?Ù¦~¿ ~?ΖÞúhÖT?Ü)âgœãˆ?¶œH‹’?Ëà^rˆ?Ô¬Lm À?ÄO|€è?³ma—8?ìûåzŠ?Ýs5>à“˜?͘ÊYÐ?é­’"úé†?y6×î%g€?æŠø­3·?°K­Ý`$¨?ê”æRj”Ö?åéH´2?îDg÷“zš?»3c$ÂP?êçÓÑ?ÑáÍ5rü?ÑT_jž2j?Ø4S·NQ ?ëÑŒEl?Øøëfü|?ìD6ùñ?ÑP溓ø?êjûö¬:ñ?ݳ"â÷À?©´ü_î@?íb­ªà?Ò5ó51ð?Ó&òÝBÏž?îå÷g¤?­õSä–°?ïƒÖ #‹é?Ù©òÛú„?à'wШÉÃ?Ú,á×Ü ?Õb—Ë ?ëOÉ;rå?Þ¬3 ?äŸc˱·?ï„MÇ=[¤?Ö÷Šà'mH?бjÄSô°?Ò „K¹Ëª?ãÞ™ñ¹Î?à\ùŽ*`?Ììlåš„?É£ :ÀXÐ?ç1h㯒j?ãIÏ&/5d?îLA×Â>ä?Ýyæh6ÂÞ?Ý`ëS@?íxa®õŠ?äâ@U/‰?ê·L6ù®?¹ˆÚlt¸?ËÓ$/=š¤?âýÊ(ÒÁ?¸Ý|ëÕ¨?Ò G?ÝÏïÁ@j?ì[ù)ý3æ?ÓéÙö?êJÉ#>B?é•Å©ú?è_%¯uT?î™]‘£Œ?ÔSŠ W1†?äº/'&Á?àCu¡BF?á×¾âmÄ?Î=ß)fý`?–<ܾ*Š?ÚÂÍ7{X?ï ¨£_Ë?ìŠO‚î·N?çlÇHÙ%4?æóŽúzÄT?ÅÊ0!$Ì?Ý^\imØ?èê(•=Ö2?Ò2ñy°µ?ä2Ž’aÒ?Æjx+ç ?æF{!ls?â«?ÌêqCå†?Óµ±<(` ?晋÷?"e?ìÍÑá\ŽY?çM!5Éy¹?Ó®¢ä?×C‚|92?³õH@Ý£¸?ÒÝÚ¢À¹Ô?ÑØdðpÁ0?çÄ‚Xv À?íêèÔïV?Á¯Ï‚?Üui¯uX?ïØN†?ìÈâ¿™V.?ÜzèJ¼Œ6?½ fÙÝÖ ?ï„ «7° ?Ö\.Lò°?è YA2r?î²e.Ëm?ç#WƒìDÆ?Ƶ#ÂÚ\L?×`½àô8n?ì`êQž‘Ì?àÞu~G?Ü/gÑ67è?åóÄ_}ö?bÔ§'G?ã7†ÿ?È?Ï-ÌÅÀ? “æ?䨹ýÈÉâ?â0Ðcô§?¿> Ú¸ñ?ê²eµZ÷?ä_Ç?÷z?ÜhZ·4?èe‚zD ?å}!’??ÅĆ•iD?¦])ñ5ð?çÒ¼ß iü?à}A7È‚?ìò¾ásfÇ?éFº†J?êÁ²pŸ¹Û?âòE#FÆ?Ó¶£ óœ~?ÕÌ äC„N?ÔP²óæª?ïç ÿ(Ž?Ù,“q!H?í¯Ûþ?ÝÞKÇ}ƒf?îAe¯”Æ?ÔâR†^m?¿¸–M®Ê ?Øõ¼£—U¢?¸ÁMHH?§¢’è —?‡ Áwq’@?ê°«üºò?ìBº_Ï[D?Ù‡¸[Új$?꛳`©Gú?ár=vî·?î¢:·Ò„?Êšå‹Ö?µa¸jÁ˜?éôõW§7x?߀TN?âßñ¯\IÊ?ìè˜é k3?Ô–Œæ•E(?ÖI܆:›þ?áâùbŸ?Òõ"Ê£Ä@?é’ïÌÒõ?àñYv¢?ÏÝ B´‰X?̯¹ÀrÒÈ?æ¹ =û,?Ë£ Á  ?ÞîW¯a´?ã‚:»?áü‹@:I?êUC þ?áý,8¤—?»%3áÓ ?ê , Cf?Øõã†þˆ?ìO½RÅs¿?½%ðBw´?ÞÚ‚?úEL?êáïÕøÏ?ÚmÛ¹õ®?Ñž»Pƒ–?ÚBffn?ä.}Úæk?ä|°\°Ï?¬|Ì/~7€?ω‹Æ®¤?âv•Ä“%?Ñã!Á”ýž?â“RðL 2?æŸvœi`?Ñ?“VoñÂ?çIñ?ÑŠÝ?êA’©0[ ?é!u5;-?ÝË”¼¡f?Ð4÷‚ý@?ãg‰;É…?¶¿ Óˆ@?Ï“´n‚Qô?ËôW|^ü?¿ cÚYÑÈ?»Ûä¨Û?䌂 ^Ù?ä°^>Ð?íÈc (‹?Ò$:fçÝ‚?Ú"?Uì­F?ܶfëã¯Ì?åK6†k S?ã¹µêÒ²?½Q|,ŸVø?§’ݯb ?íz“F51i?í‚ð¸ép‚?è¥ÓA˜o?ڎŨ³$?ÓÁÌ߮ڼ?ê¡Â!Y?³}áLá°?ؽÙy™Ù~?Ú÷CŠ›¶?°­J,ÁT@?ímú#õ³]?Õ`Ó˜`\?à|ÔQWu?Ї줟•’?ﻳÞR?â¸DÕd¨ž?í—Mñžð—?œkÝà?äTØk‡?ÓÔ¡¦‰Þ?Á¯RäÈêt?éCüûx?䈤ŽuÏ?îŽ:Ùá?ê­%'˜8?‘Ð \×%À?Ù:¦ú ?Ñ—ª|Fþ¢?Ç ÌcÖð?¥åó#E5`?ÃØsÏœÀH?Ûb¶¼îÖ?çã©.¶É‚?µC?–x?íÎyL?·?—‚?ÆëÍ)`–¸?Ѽ÷öâo?å2üjw6¾?äÌ.(Ú²?×£ï!Ó”?×Ñß„ˆ?F1*†%?Óÿs‚ºø?Æ[¯ú§W”?Í'|œ'Öˆ?é8Èd‘?êCsAÚø?ÐÁ÷F{€?ïÅþ7äŒ~?äv&"ÕÛ?Øåhs¢½ò?×ÿË{ Rr?Î#´¯õ@?á½Hm7‚?ªF¯œn7 ?È„ÛÆ?ãòì•ïK-?Ó™‡€‰†d?Á¸Ç ^ŸT?ê­ñ k¯?ìZZ»û{?⸫,™?Ð^ëü´ü?çãj—mü?Ò›…ë0”?¬<4—q© ?åN ™?ãC•ô2?Þñtnò'Þ?ï”ïYfv^?Ù_ÙT2zR?íðFœ[™§?Ü›’Ek?~?ìFG<6µ:?ã˜^Fœ÷?à?º§hoK?ÛaQ½Ð}¾?âøËäeÎ?ç0¨…Yž?Æ_§UYÖ,?ëúÞ Oƒj?âKÿ#–×@?à}øEè¦?èÖÙŸž1?Ìe".Ü?ÖɦéÈü?æEU¨?ãW\­ÝP?ìÆ¢ßÚCF?î6"ñ´wl?ÇrÛ+7i?ÓÔlÜL?äµ3 áÊ?á.ÿŸ?ê«‘öÈ,®?ì^&¨þ-?æT7+T?Ù*fÅ1Zþ?íeíks„?Ò1ÖÌïM$?î±-ru?ãiÜÈ6Y?Û÷a%l?Ûf k|Š?쵯H?ßýœQdò?ÖËdD?áD”:ºö?ï† ý˜%?êD‚0«W?‹VW1úe?éçH͈eS?æknΨiÊ?áF…BÑ#?ÌñB–ÞÚ,?éäuî[½?ÓòiqôOÂ?èÇ„ç”]Öª?æ‡@=V?±Ê*¥ 0È?éFÛFÙ?ä!…ACâ?ÎïÀ®ì?ÈóÌ ?ª°á¤sp?ß‚¥'EÖ?߆k¸½@?Ð-ž%Ò˜?bøpµç?Ûø¨DX(?Ñ"PÐ<ê ?íV‡r·´?Òw³‹€?äo•ëä›?án]­?é ø.ÍÜ?ÂV¤Ãö „?ÝÃýªŸ{ü?çbÂ÷¿?ãø Èã†?åû˜ÜÛ–?ÂñOˆ¨Úð?ÕmêQ¬?ÎK·¹IT?¶„×ñý°?íöFRÅ(?¶nÑ\‘x?îÌyn3ä?ådo¼'?ák'¬‚0?ço¸:}Ù?²|2/¤?í(z®¯-?àÕ]Áòóy?í(‘¤ûG?å R+Or©?âŒÞ?e{ ?å”ênÛ¹œ?ìü¾Bô”$?À¤«T `@?רs!’ìÜ?öšªJ?àH²\’C}?ìFÇÔ¢$?ÒRa°ÎÓÜ?€¡2"R€?å@!Îð_?îôh¡»fF?×Þ.dN|çpÑ?çj_ÈÙ~?À,–2Ø…X?Á#ú Lnh?Â^¯µ~SÈ?Öl\O‘Ú?íöÍ€ó¶z?ÒóÎ ½?Ð ‘sÙ×x?éFêÑÖd?Ò#¿†À“´?á8Rüd?æmÒ?(º?ÒD'FŽ˜è?æ¨ÝöR'?ëÀBûåÞ ?ʃE˜?ÛÁE¬¢P(?æÌY„w?é„©µÁ(’?ëÀsD9‚?²pqìÀ?Ø}6î##˜?°Žþ(ø?îM7í&M÷?ºòUÜÐå(?è‡Q<­Ê?Ø4 ߀.?ìï„A{?—šÍ0Ex€?Ý5ù¾P@?´D²»bP?ÜÉ”×¢¢N?xiÐh ?æï`3?Ó øNO„¾?î#l“l+¬?ÍŒÊW??îGÆaóÇ?èÒ ^ù?Ü*:ñ¥-|?£ÿ³åÿ0?ຂ¾¥ $?Øt)b‡´ð?írOƒ¡¦«?çθx„o?³aVîRœø?ÐÄ<à—>T?Íz»Î­'@?§éôÉ#\Ð?ÕóZDr?è˜wÍ~?í…R°ˆßj?Á7"¢qól?Ðd©†>½¦?ÒjßÂqìJ?å`t}û&ˆ?Óydšélú?åòvo½X?ÔNàZÇä?é£ «k®U?ÅÒÍ ÍØ¤?ÌBïýýÜ?ÙØêCvØ?×gÛê»Ê?†7 Uk@?ßKìîÖût?êìÿH%äõ?Úý8Ø kØ?íç¾0Éë!?áZ´Rã+?Æê[¾úܤ?æ/#¦§?œûþEoÀ?éì…@ë?ܶx0·pŠ?âR8«œü ?à-1b9¼?Û‚¨^î?å쵞V?Ú¹ª5…¿*?ïæßÖɤ?ØKËè Wf?ß-†&¶?Ój4æÛÀ?§@â^I?éµþ=ÔÐü?ÞPUg€?ëù…WŸ?⥒iȸñ?å;òÇdÎ?Ú’ÆêÞÌ?é«~M<`m?ã4=êc÷i?ë£Ò¸W–F?äøUø€G3?ÌŠc÷?¸n®ºè¿ø?Æj±ƒíè?×Ï"óÇl?¥Ègšð?ÀZNGc¬?à”ŽBJ-ó?ë÷Ìú„¹ø?ìH~ÆWÿ?¿Q05è?ÞíÚ b?Ú¶2íL?µ’ß^hø?Ê=TOê¸?Õèò°?Þ Gso´?ì8Ü9›tI?Š6u;Ö¬?Ùöl$½ü?ÝOgÌÔ¦?éD²B;Š?”ÆâíÖ&€?âQ Ê9¹?Õr²ñ ?ëÅŽ¾Áj?Ú±;¯Ç—º?ï[êzs\?×Þ+Ú:?ä sxdò?ßI=Uó˜?ŬÿOš¯Ô?èx…·"PË?Ð dT¿?ÑÕ[2)´´?Ö}ÒjÄL?ìÖEpæ¥{?îTˆïkmÏ?é Ãzš`?ÔôÅN£N?ÂyÀÒF×0?Ù%­xÏ!"?È>]M0OP?ß^‹ó…T?ä‚Aòüõ³?Ô·L¼4?èõ^+æº?æz¦×e?íf0Ü×Ð?׳ÿ,Ð?ÑzÒc |Ä?ÆÈN›ÊŒ?áÜ/½±_³?íQŽ<Ý!?ÖP·„.Z$?Ñ_vÿHÖ?¼x?j€>`?èèм²ý ?؃ßt?á(8‰Ò¨?Íq\<?ÇQóËØ_ø?ªB¦ßzð?ê¹þi:B¢?Ü…¶#½8?Ü72"i‹*?×ÎQ|ZÃf?êu&½ÜË»?²»>‹H?ç^2y(Åc?æÞæ ä(¼?ç=ÀØ~?阑0ñÑl?èÊ‚ô ‚Â?èD¤”Ôy?µöE—ÌÇØ?ѳê‰ñp?À'kF ÞÔ?בNOÖ?ã~ežÌæ?êCj=*‡ì?ª áõà `?íû 2¡íû?Í„u®ë¡?Ç—âÄ~¸?ÕM˜DQ]2?«4r³ð?êWrk/á?ÔõŸ{â-.?Ï,ä9SÏ?Ïg¹˜¢Vx?è6ªÊèÖ?ç‹HÀhtú?—CºÿŠ€?ãJÓ¸H;$?ÚGy³)i¦?ì ™'ÿ‹?Âÿ!üÿ¡¨?ë$YŰ‹”?í¸)²­?ÁÏçsß´?ì\v¢ú>?äÓ”fÉ—ƒ?Ñ`á˜ç\?äw Wgò~?ŵO 0Œ?§û[ïÆ@?ï,òÁ¦?ài¬ù»?êû Ö[?èH½sƒ)è?ÓÐRXCŸX?åo†²„?ÁYÁ¥jì?ä+{Tc‰?ïÅÌ™†üç?çIÃéÏÎÚ?ÅÈ9’A’t?ÑP¸Ðl?¹Îôÿ<Ø ?ßt±ÖOöÖ?çDxÛ¨?³óùƒ&m ?ë¡K¤5Û?ݼÛ)}øD?ïˆ ²)ü?æü™j×ýå?ìBï Ø6?ênÊ+×|³?Å ‚P´D?ÐWã|Ä5h?ÎiMûì¥h?Éd!’Sl?Ò†41f?ê,² È?ѹðV›~?ÖzNÁn?ç5­´×?ª‘ÓP?á&Us$K£?íJâ¡»$;?å‚›0|ù?çшÛXj?Øjhÿ²?îö„M Œ?ßAÀŠÞp?ì¿ÈXeW?ÑkГö?ß«ýâ2?Üú›¯¢Ø?Ñ8LÑ6:?ï¡‘#Ūh?Û:´{öô?ì/ž$Rê•?Ýzy¬FÙâ?äP«/­…à?ç/E•ŠšÔ?¶¢]²?ÞwpRêÊ?ÚÈ €™Ïâ?À1hqßáÝ/`?žjÀ2hà?è%C%º\?µ”ûžîX?Ä{F€³|?Ù*u/ó?Ì$MßÿÔl?ÔÛ½y4®–?ï®w¡*e?åPýÐýIt?Ä?´ŸŒ?ÕŽG·[ÈØ?剀Aë…›?èƒæ1„?æX$ú4"Å?å*[/ ¸Ž?ÑŸ§" ¦²?ëN@$ôQ?×iZsD?îÄAÏ™²ˆ?½ÄbÈð?Óxg*?Ôúmí?ÑFUs[n?Ð1-­›—?Ò„ŒÃJd?ê1Œ í ?à°bfÒ¦{?Ó$ÁŒW4?èCŠÿÏ\?ÎíøX’Ä?Ôã/Q9g0?ÙªET—B?ܦq/šŽ?ã“bûd?éEÓ)‡Ã5?° ¥Ìë‡Ð?ä(R1Í?ÝÈAØÔù”?ÕÉÔÆ¡f?é”ER$+?í¯iˆd?ßr„ÊÚb?Ñjù‰ØÈ?²V1×Z÷ð?¿•. ZÐ?Òÿ”_ξ?åÐÂve™?éo¶ãŠ[t?Åss]M‰È?è4ú ÁöS?ãÙaØ Ä>?|20Ë>¨€?¦Ëƒ–´ö€?á¥F·¸o?ë×,ªïFß?æZ€­£¹?Öh7Æð¶?éVx Ï?å¼ A¤?’Á&,à?ß”·`íS8?Î+k3{ ?æ,dÝ>P5?èÆ¦KÆ€?ê·êã¶Z’?šýÖ$ö&`?½jï—à’8?í×d·»†?áQ ŠÎ¹¦?àm¹ñ&?(ÈK?áH<•‚ò$?îþW`™ü?ß^Z©S$?Öb‹¢–íd?¥7i•ï(p?êC˜ô²¼?Þ~ÞHr¾?ç¨ÍMT[?äÌRÃ{L?ïPŽ"[?Ü:Ý ý‹?ÄZö)Ã@?îÚ«†Üu{?æÖ¬w!k?î'gd=)?ï‡õ̪”?ë C¡£?êüÆáÜb?ëÆ“WR¡¹?À-õžüx?Ë/€†Œ?×—"ÙV1À?‹§Ú’é©€?ïÞ¼F90?ívtGƨ?ÉÅ,rC˜?ÎP «Œ¥?Ç[!SÞP?â Ô½õ¼?é¯ÙtF?ÏÔÌŒ¼m`?íæÄL¤s?æû ¤õò?ê‘j][mw?Ó†=Àî?ëö³%Úy?ÄQ3NÊGø?éaÏ¥þ¨M?Ã~tß]’´?á~[–‘›?Ð}øÃ©Ãº?Âоþxì¼?Ñgô)-Ï*?ì7Lú2?ÕþÂ=±Z.?¼û‹…Þ?Ù|̲š@?Ñø7$žÆ?èÇ…*ùƒ?Ü2:O&i˜?åÕ­£˜„C?í1$”[n?ïé¾ñwk?»ðä^¬.¸?ÑßÉÊÄÀ?ÎWµÆ„?Ó|цÊUD?À&çÔ18?ÕÃ[Ѳa?ßkCf½ø?Þ¹JµÅ0?ê”–!ßy¿?âFäÏ®F?Ó‹Ü·8»Œ?女Lcî?*ýòßâà?Е”ÿnaœ?èc›òI?èUÀú2æ¾?Û¤†ŽÚ4"?Ûæg_”ž?îJ¹x®?Úg37\º?ãm«‹6É!?甩é»Ê?ÕYù¨³•[†ì?Ϋ/Ïßµø?äK³ËÙˆ?x¸À¡s ?ã¿6IÊG?Û~›åÄoÎ?éÙ|,â &?ä«ù%ŸÌj?é&µìè#5?æ(¶sc–?çý.$äÀ?Ñ,\aµ€?¶ ÷½;Û8?í>…2t"¹?ãTwý@?Ü?Ìò 0›ªˆ?Û÷#7Zn?í¶Ñº5*´?Óp{‡âøž?éa–/T2?ä2 ¥’[?Óô—p‰¨ú?çÝŽFï?ÕgÉîøM¶?ÝÀ 9t?à‡a‡§&U?å̯ûlxÑ?Ô"×o¤þ?ÊQg(Œì?åèÿê?±æ]šR:0?ÛýxîjÉT?Û®‚ Ò.¢?å]|C¢Bë?æ£o½ÎB4?ƒyþ²qÌ?àWEÆq?äµïÎÁ?Á0<a#?í@&§ý’?æ‚ûç?­®Ô²Í@?ß¾ÂWÏø?ìIm¿Éž?ß-mWî?ë~>ºj?Ç­ZŽ2 ?å½>šõªV?Ù6 ÈbZÒ?Óœ×i­X?é#§æ?èâvËGé?Êe´ìÖÜ?Øï¿QìŒÈ?ËêgEµ?àE ¯UmÅ?Øsâu7ûV?ãñÅì'ž?áï9æ‹fÒ?ÑÅI#„?ç_¥_ Õ?ëœGí°??í>HGŠ‘Ï?Ùùn¤æÏ¸?á£p2ñ?ÄÏøÝfðp?ß»ú€Ö‚?ßÇßH¾Ò?à‡-e?îÿ;°ƒ?ã°å^ÔŠ\?Üñù¿Äël?Á cKë ?’²Ýö×™ ?îQWõü?îcGù¡b?æ²3Úñ ¿?å¨(ø5¼?á0Xó“Ö?ï{a}ßó!?Ù¯«JþØ?ÚBçÈy#v?ÝüL6ÀÒ?é¥ÍU“xÊ?æ.õ;4G?êóÜŸ“T?îÊ1Ÿf8×?Â)½3§4?áD‚’zÿ?Ô©X奕h?æ•ÕR„?êhǯ?æïã›?Ü%±Þ/„?ÛDz{R ?뺓¤$z”?ædþ+(¾k?Ð&~%á0?ëª×tÆb·?Ú¥öâá·’?ç)V‡?â÷peX¸K?ç˜Ø±–S?ìíJÝ!É?¼š÷Wnøè?ÛâEÏí4?蘿õv!¥?Ò:n©ì:?ݳ¼îZ?ß.yÝÖ?ÙE P~‰Ø?ä&™´ ñ—?àÛf NÆM?¼6:FÑ‚€?„ÜÍ×%hÀ?å®ä©#Õz?à%d˜x=¦?ßÄÆ›©…ž?ïþ•Çð ©?Õ~¶ÊcëÈ?ÕôÍq}˜?ë=uGÙ?æ@¦í,„,?à âýç|?ãaO¬á¹Œ?ÖŇƒí7ø?ÜÄ€ƒZ”?à%)ȯ3¦?ÌXgê÷\?å±5vÑDÄ?ãÝPv™ô?Ñ݉Iúx?Í®™o‰?Ῠ¦·;?FÈáÖËt?ÓSË4bab?ãî ©™Ê?è †Œô}\?Ó-T¹â<¦?ÚqN‘šj?â¶Â–%MŠ?鏯 ó?±ÿ£†Šæˆ?âÒZîeá?çâÀ¢Dî?Òûs–¿ ¾?Ús–Wâä?çäçÇßw?âH¦Ÿ8?ËUûܳ\?ácNPù?Þɤªr¦d?ÒFÆ%j¸À?æþÚ½…Ý?ØÈzÚ`e?Ñwˆ \?ÐU|©0²?ÉžmƒwºD?ÛCjaò2|?±¨Ô[¾?cÂz„c=?Ì®Z˜[j€?âT ü¼ò?éäƒ8àÚ?Äw½*ÏÌ?çÇCûè?çz^”Å?çè^Š8>?çK°×›‡?è°¹cîé?î¸àâ…ÿ?à >ƒ±Ö?â>»à.™a?Öµ"†vëˆ?äôRï’”?œ8>Îd@?î۔̒[?âm9zí–?ÜÜ?´œ?åS>a¢Q ?ìkºŸŠÄo?ïÎ,6Ûê?ªô×Â+±?·­ÿv¸âð?Ôž_’Ý^?æMÜv€ö?ÓvýƒáO`?®Ñ§þщ ?ÙÍ*pž’ò?æƒS®¦™5?ì%îyL‹X?jPÍ?âàQìñg?ìh²`Uà~?âX±SŒ?³äîH{Ö?Ô‹ÊÌEè?眘ƒÝýË?Ö<‰\`æ¨?ÑôƒD‹?ã´Ë+–Ši?ܬ˜\/š?àøíǦX‰?ß0Ì¢|?¤©Õ(8 ?ÅË`Ç,h?ãkcû‹{?ïñlGœþ«?ßÁMÌ?kœ?ÜÓ£h?ê‡RºÜ=ç?ìÐµŠ«†Ð?ÞôrXZx?ê†Æ]ò?ר¹~vô?¯SWÀ˜Hp?ÓüNèá?¾½0Ó=˜?äTÄp/µn?à¤SŸì³1?ìÓø’¤»?ï¶í“«£f?æ\ž¦.»¾?å³Ó>??×ã,, .?ÍOjkÃp?åT¿ê‹S?íLé 9î?ÙP€†g«´?ÞmÆ|ø?èÁXbcË?Æg;¯¶Ø?îëÆÏïJ?ÓE¬DŠÐ´?él*ÚÔXû?“Ç\bØ™€?ЋFñâQà?ÎÛYYƒ!„?ž¡Üó‹h?•\˜ ?Üt«žÎª?á¥òÇ;?¤I_øf@?µÂ:6ì/8?âõóId{?æP`6Ê?ë¹tÜëàí?à¥Ö³EO?ë$½DŸé?î÷е®’?ÎaŸù jø?éÙKjbð?æÌÞNI»?ãòŽ£Yƒ¼?ï}»¯Q·ø?Ü Æ{ˆ ?ä`3M¾Ô?جiZz!:?Ã’‚ RT?©‚çE¡x`?Ì&•P1d?Ö€¶ºÿ ?Ñ.ƒ ´V?Øv]˜¼Œ?Ѳ«*È»¦?—äþ^M?莥4A™c?æ«ã%¡«?Ö~yd l†?ï*Ê=œêÐ?áæ¤ø©¥?ïy)²±AÇ?ïŠ@_ÅgZ?¶Í¤ÝÛí?ãê¡y²X?Ójæ.:œÞ?â·V­¾>¯?ÍÿïðìL?æ0 2µrÀ?éV=vY•?êàƒðtZ?«IEJ;~ð?á…îvR×?ެ¨g]@?ìö…ÏÃ|n?ÞR;tX¥>?˜œ>ýøÀ?Ôܼ9œ’ö?ÇZEžÀ¿œ?ÕÈœåž?íE3ìRñ?Ø3àÐÐ?Ö¢Ás%?Ó?œíÕì?ÈÔÓKM"¬? È­ ?åðjÞPêr?ëÈBR¼Ú?Óè‹\©µ$?êÔé#õͺ?ÙF±ÞðÃ?ì÷Ÿ58ï¾?£˜=¼çÐ?¡Cö^F4?çä.ÈÛ?à"›³9ñ?Ò¨0»»Òâ?ªüÛC V`?îÝh,‰¥A?έFsw2@?åÇKÿô?ÝQr“°´?ÐÏ¡ÕÊ(?¾¼A±?é"øX ?ËKÄ‘€`?¼ê’±°?ȹ{áY/„?è3¢ÊÎ>?ל aËï&?âaøä¼?ã˜äiªBW?Â0ú³Müè?áܵ»öf?Ú%:õÆ ?çÄs_xƒO?Øáë2žÚv?·Îã¹Ñ¸?ànˆ§¢À?ËÕrýŸÑ?íώܳ?ä>Ýa4®ð?§ ¡Ïä¡à?Àí=èpãì?Ó!ƒæÚ?ïú Ý€?çüXÑ _?ã=¥…¦Ž?åt»~Š­K?ÌZÅÑS€?¾*Àgy‹à?æÂí`Þì?¥lžÜ)D?ë7†_îû^?Égçg¸ˆ?êð¸øÜ©á?ê†<ú=±?㸟´ ø˜?í‹Î´¿o??æ¬ÈC=o?ë­ ÙõO€?åX:×–™é?ÞŒÚèâR?Ý–zéþ1f?ïa—|øã'?ë_²ÄÅäJ?åIGªèþ?êLP^=†/?ƒ+1ø­øÀ?èꦖf^?ì;P æV?ã°—2,˜©?æ^ùgÛ?ⶃL Ë?ì® xç?Ö¾±µ/— ?ê-;«¤?ÓÜ©<±†?ªeùã,À?êÚ›$´?ÀÌðz?Ï&%üÅá ?¼Îú¸î€?Ù´ÄìuÛ(?ïQadã*?ç]äSãV ?ê‹8æ®Ù—?âÍTߊÙ?ãeë-ë #?É~ü)•#È?Úá{XýB?Û= y¨ê?Ò Å´ά?á½Nò=²&?ÔøŠ*ÝuÈ?‰l*à¹@?í^+§?¤?ʼnº/{­Ü?â>ðµÐ?ê|º]¾Y?è\và’X?马8 ?â‡;ó»¡?Ô0hôVÈî?Ë6Ï;ÙX?ç²6B6Ð ?ÔϽ¼þ&$?ä*Á·j?á¦Þwæ©?ÒÜÆ+«B?ßv0«¢¸?ï=§£p¥’?½ÅÛf°(?ä4—^UÅ?ê“Äý|]?wÌeš«'€?ï§âHJ_?Ê[³}ç},?ÚÉ ,N?åKòšÇ¾ò?¼(*ñ‘ð?Š_GNô@?Ä//iü™?ÀÂÉÍäÀ?»¯” Ã?ÀfÛVzaô?è6¥ ö½?á­”HÇ/v?Þ>ÅM²>?Îß#´ò7ä?؈5šOÜö?柉Î8^‘?ãã£òGz?î¨ÃÙß1Q?ç~¬Ýâf†?Ô”;±a?л™âÑÞ?Ô‹oX?éi/oh/î?꜆7=Êô?åOí'¥Œ?•x5ëÌ@?çE‘g ›?Ñ,›*@åd?ê2檶J ?m×ð?ëcǃ ½k?Þ¹½”aŠ?á}h”:Q?’8¨”,#À?Þ¹¾ hßj?é\YQ6./?íµjWáݳ?åÛýÊ%þ?×0qãBïì?ÔÑ4Ù7¬?Ç‘*¿¼@p?Ê_±ÜH?åj¾Ù2?ä³f0©ðÃ?à_Åhëæ?ÝsxµÄX?æä¹{Üê‹?Íku$¨&ä?Á©—R)h\?ÕÙçÔG~?º¬ÏbSð?ÅÚqë?ç¤íf†‰?×ÿ_×fÔ?ÇzǼè¡Ä?â¸Åâ„?ÙÖÛ ò΀?í‹<ÍþI…?éår›Íc3?ëJúGJ?Ý0zyØ?çXtÕ÷?Þ~wN¾Ý$?Ù$]5÷bj?ë·W:ü›‡?âôCヶ?ÎjæÙ[9l?âòæ]Œ \?æ(µ Â+Á?ØÌ´ßú?æ:îq?Å«?ܦJ‡ß—&?åÅÅ×MêS?ňŸÅc/p?Õ•cš©N?Õ(„¡Œ¬?ïlyÆ¢?o?àhi‹±7?ÚA¼Ò:õŠ?ÚŽøòÎ;,?çóUä…)?ÔWl‘ïü²?äšêŒ •?ÛÄH÷?Ê?懽c˜Ñ?äV”•Îß¼?é”…jzY?ã®–ßH?È”h˜) ?ìt•f9ý?Üéj,b?ÆAß;X˜Œ?ïÃBm¼¶”?èp(â¥ÿ?²Ü#Ò ¸?äýq¦¤?áUýº ¸a?éL½U"/$?ÃKš²aÖ ?Öƒìî¸?ßX2‹Ã ?À¶§Þ5dh?—'Ì=à?åQ»&E•Ë?íÃë¼oE?¿ÙâÄFÆø?ík²•å¼?ì*‚;{è?ʵrdèÑ?ÚÐhEyûž?Ô‘ÀEš”?í¶®‹”M ?âç%ðô?œt³˜mÚ`?Üd¡M<å˜?ŸÇÞãnÀ?о„5Ûº?ÝíJi`&®?Óãµyò?Ùª»?D¹j?ë‹H»xÌà?¾¼0"q¤ ?ÜU9 o*?ÒØ1Ž—,?åë¦ôwB‡?èŸo¢‘åª?î·Ìnp;?ÎúÙa9?ëÁðÛ²´?ìÑeyUga?À4AÅÄá¼?Ñ¡cýüÓV?î-’z &?æÙtùL?±ˆ{Q¶Àˆ?ËìÆÆ‡Ô?îI( ¦?íˆñhë‹?Ö÷bðÀß,?Þ¨óª˜?ì‘}Ë€‹ª?¤ßÒ`À?ïh 1×Q?àV_Ùõ%'?åÁè­¤Ôž?æC5³ZG?ÑÐÆ×¶¤?âÁ4äEà?Öö 2ZÎ?ìg'ÞœºP?çÌjÎHnî?Ãnu—Í:@?ã"%g%>?é‚‚_È„?în@K¦?Ÿ0×ÚÇ¡À?êªúx²g?×,âgöÀ?ì´#µ?¤@ž €?ÀyTWz¼?àÈq»‘Ÿ?Ñt¯™ÀÄ?耇ó„ñ0?ÀQä§É€?ÚAC5(Ò?å3è¹l°Ž?ì {?È(U  ?èyR露?ׯ8 ‡zò?ß>Ü0©H?¹ÝêþÏd?è‘Ôö½?ÛßôøjÄR?ÂúX- |?ÜIjû!Ì?¤¥]9rƒ?íÞ M¶'0?áá]êJÄ?Ï D3 d?Û×NLn€–?ájCGë]?ä B> K?ìaÎIx?Ñ¥èYOþ?íxùiS[ý?Îß0ù70?–šþ´?Ø0Æ o?†?ã f±…$?̓6ãc?ç»l ¼?ÏÒg\1X?ä¥gØ–éç?¹}'’£Ÿp?ì’ø¥Ó[€?Î2§ŠÄ_?éx¬Ö@‘?îóµjá Ù?ÛŽ¹ikV?»_µV´h?ªˆÞp?²¥Ì3¥#(?ÒEÖ3A׌?°s_ñ¬!h?¸ý,30?äžœ-Œ?´‚}Š:s0?Ä ”&9n€?Ç=FdÅ ?ÀµÇ·ßÓx?ÕŸ½w$ä?Äi¬-ÚkŒ?Ñ+Šþ–?渆ëYÛ?Ïxªp¼(Ü?âŶñ€¹? Álu¾€?ëô}t…?ç\«ë¼òk?ÁdgÜDü?Êgöþ)L?Þ D5r:2?ÝÙÊ1¥„?Ó¿Pg¾§2?å(œ¨âŠÊ?Ø^V<ã?ÕPÌŸ¼$Ä?í¯2G²y?勿Øà?°^­ãw®¸?Úk1ðÕÐX?²ÔsßÇ~?ÔÚ¼¶ˆ¨,?×¼ÑðÿÎ?æÅGä+N?Åmœ-¯ß?·gT3t€@?„N45×À?îÖ¨PqK?æß g¤ ?à‰²>l8?Ûr¿åu3ª?âšë†bõ?Êrp¼í`?ãº×H„<.?Ë&$ û¢$?†eqÄQ?íc¿Nõó'?éR÷ä™5?à¤ÍÒ¹åK?ÊÁù\°?é†ÈÝ‹=¤?4þí=R°?î91ÎóV?ì÷ÿ@lò$?ËþbB®D?ìoú"@¸Ó?ïÐF@¶5¨?Å,!\èúˆ?À ÐÅK…?éëÚ«“Ç?èré–A&£?°騌$?ÃÏiWœƒø?å<=9?ï2ÌÛQd?¸uË?Œ’¨?ÞRÎ}Z,.?î/fúD?ÚóŽ!¶ê(?ï&:©ä?ÛË>Æû9j?ãÌ*µD¥?Ö·E/H?ìV&,7Ù?qp›g€?êGmÖo4&?äa+Ö‰Ø?êÐwÔ§+?Ø¿¬™¬?ÒÖbhr?âi $-³¢?ÕqQüRH?쳄ÿÎv?Ç”É@ÇH?ä•U&ËêŽ?çCž›Þû?Õ7 ªZiL?¡>ÔÁ4ð?ì¶Ec¨29?ƒ¿m¤@?ßø¿ÏÐ¥?ê†]{¼¾¨?Þ"Ÿ÷6Ö?íoÂGg ë?¯‘¬/ ?בšu“È?ÜAÞºd¼?ç•úà=¯¾?áî.½*b?™F-ζc@?è’Y¶L•?ÁLx_x ?ë³r¢¥ü?æ&ÓÆÆ÷·?¨ÎØvÎ_€?àñ’Þ ?åLM¤8?§À¤~8`?ãêM¸v±?ªŠÉrûa ?çŒY—uª?ÙÚEvÏ ?Âî‰AÜ?ã x€x?­¡4:"n?ë + Y?Ð$—[Öä?éJ=²`?Ð<`Îeš?çx“h/>€?Ô .Ùƒ¼?Ñê}l„4È?¾ÍU ÉÎ`?Å̈àx?”ÈARÃâ€?™¨£/%?€?Ê¥¬þŒª?ÛÔ"0gn?ãB˜—>©‚?èÏp¥þæ}?æÏe7»m ?¢ü?Ë `?×Ö¹Oœ?æßÍz ?ÅŸ³Qb?í,â%‰?×d7P¹nB?ëÈk ]e,?Â9­=c«”?Ó b˜kÒ?Æ{Í}²\0?íÂ8ö ­º?µý‘j°p?îV$-™w]?âˆ7ÿ%$ž?èUmæsÒž?ߦ!>¶?ÍrÄ€À',?Ûu²„Ê÷?âtRÜ:?u Í?êˆØvÿ?Û½X¸?º‡š?}‚?ØlÑD¨Ê?å *ÁS$?ëøLñ[Õ!?âkWSŸ5?Þñ¬ @ÓR?/¤@…,@?ÖmÄ¢X?â,,Áf4ü?Û,›Ìšð?á%Ò*æÊT?Ì ÇW ?ëÛõö‡?ט¾‘ªOÚ?±hÚ' Iø?æj°NKT¢?è2téÐ? Š§4þ ?Ý¿}"Ž’^?ç½?ÖÞmÀ/6?ì^[¤Âvæ?ÇÔÃΨ?ºþ%é3œø?Û/Š8ââú?á­I )‹ø?Ë&Fçúè?ÔâE¼#~î?åÕL x?Øqô3áiÒ^N?èá•é´?ÏP£ÛÂÜX?ß6x‘—ŒÆ?áên°}êY?סœ‘*BV?‘¤™³³ ?½]üÕ p(?Ö…”M‚ÐÐ?íPWîõ—?Ñ:™*?“}*Bx@?‡€f›??ìå0Xþ f?â-^d,l4?ÑqV7Uü?×U§°:Åî?êl ø(dÝ?ØŽ Œ³¹F?ÛiiÜÕú?ÕçÁž2?ãÝÂÔÅÇ[?ëyœ« ú?ãÌá[;d;?­€œ1•¶ ?íê he?Û@ÖXçŽ?±3oÌ¥ð?ç·Ìæâß?ípÔªGh?Êôd˜?徑(3?Ö´àmÄ?µ—]V6x?é%³&*Œ?Ë/Ñué2X?ï…xýJ?æŸ$›Dl?î$¦0þ؆?íU'¸Q?éSÈÐÉv¨?Î K}´?ÂÃ}ß¶JÔ?äFRp§þÃ?äàîÝ?ÜÜvŽÞ°?éò`õæ?æy-eûT?ìéR->h?Ö-¯Ø¹?Ø™ÕØ(¥ò?ª×pŒ\Ð?æXê¿ä,…?ÀJH΋Ë?åòËKC0†?È CrD?·"=ÖÜzˆ?̱OðŠyX?íIôœ*AV?ÏOÀSt?ؾ31.?îóÞ ‚»È?á5d„•q?êl«ýü?Ú¬},å`?ï''-o x?ì9äí8?î"6 A¢?Ùê<Þ$?ÝùLB5Œ?×ÙwÙ%&?ÒòÈp/OÈ?Üë5Õ2ü8?ÛZÓ¯…„?ãLȈD?èlÓ¤‘É?Ó~@.H†?Æà©£mô?ì0ÉI?îšýa?ÎÆÛ’ÛÀ?Òrƒ¯fœP?íÇRÃ"9?šH·€ ?å6õòq?ì?êÒ©™«Ñš?ë·S/­1?âförˆ«?ÈèöG ?Ö²-°Àù”?¼Õ|>Ò’È?Ôyq´‡“ˆ?ÎŽ6*—@?¹˜¬=L¨?Œ…±%e£?Þ[¡L÷T?Öù5y)Ï ?Û-ֈ͕J?í5½üˆH?ê¾´•æÎ?ëJË›§÷?èÃGÌ`bÛ?˜æšÏ} ?´²?îžmSØR?çŽf÷Ó¤j?Æy„~›ŸÄ?ïÎìRΗ_?ßrT3½C?ÝÓšë]zö?äX4•qŽþ?Ù ðQÔ°˜?Á¸þ¡À?Ý4ä¢cÐ?Ïð¶®ð?Ȧ:8ÔF„?À2®¼„?Äcª_Ÿ?ëuKÿ¦³-?Õ@¡˜ ™þ?ì¼Ä~ʺ?ëYÙà ï,?ìC5¾ I?ï"·ð‹OÔ?´G"­aÈ?çòq‡¡M?ÄÝÌ‹£„?勉 Z\^?ãv4ýç~’?ÐØ¿öøÞ?ÙÈùk‘öJ?å¼`”UÈ?â"(œòWÀ?ê@0ŹƟ?Ñ0Ã5)´ì?ìr%jÚ {?Ñ›ý«9‘ ?Úå›2g|?åÙ½ üì?Á¯1ýX?ïP„.,?è™öE+™M?èzˆâÚ(?ïßadCò?Ù5×ÙÛ:?ì+V‹–©?× DX¼z®?°à×Ù§?n‘?ìx6—2¨?íÔ°NyîR?Úö?ÔŽ¬È?èï·CöÎ?ãKóñI?ä(@MÎHÐ?Ü ëP3:Ð?È >³²?¯âeõb( ?éþOó­‚ë?ï ›Ç™.Ì?¶í¡Et–ˆ?ç¹.ަfÈ?ãÃæbW?è†à '?ÁàuŒÀ?˜$ÂIhZà?Úûll?º"¾´]Óx?å.¥Gò?ëäÚ_q`?ÚvK<Ív4?–â–“€?é¾Kk;Ä?ÛgV6š3Î?å.Úàrú?¿ª ×pè?åWú¥4ç?Ò 8†&{D?®˜…må``?Ú¹ÌÃÒͨ?äõrîX\?ÛOø÷ÚÉÀ?á4Æ&Êâ:?æ„Trî¹?îU]Y:Žw?ê–×@ øœ?â§%W~Q?åË„”–4î?½®º°àظ?µH`„Óy?ÚEjd¨?éÜu “† ?ÇZQË_æ˜?é¨ÏRÒ‰?Ú¸ð°.ûì?Í͸’é„?±õésÛ£à?äˆot@üº?èœà)*å"?ç¨.ÊW\²?àÓXl¬â?µ•òu „?ÌuJ|¡¨?ä☭™ú?žZãÂg?hÝ?¯fq˜.?ïäªÁ)•?èæ'>Ð×?î’jxuÑ?êeÛ™Ip?çÕæ…ì!’?ïðýk¿º?¥¡Ühµâ?Ý|F91¾¦?ÉË+ç°?ÞÑGY¸?èNÍáÁä?äk7ë<çŒ?èjÜ»óî?æ4Ð.騢?í¶:¦2Ä?ëPÊÈ#ßÞ?â’5uš –?Ï‘ÎK´LÄ?¸$—ˆöK¸?µ7/uÈ?Ç6êµyfL?Ì^D’NñH?ÆŠ9ú0*ð?ÔP5žð?ç¾ÃC&?éÃýüÞõ?áó„AÄk?ßÉÙmÇ ?±j]føè?ÓP:°þš¸?Õ.ó'÷‚?èú•RŒZÜ?és[õÕBJ?wgï¬Ìç€?׺a…¬ú?é°Ž¯†?¼êø\ôÿ¨?ånóLº§—?±i–ò¸Þ?ÁPF|iÄ?ÏË~ñ`θ?º7Í3=?Ð.”%›¸~?ïÃ7›$?Ó W¥ùî?ç@¡±\¥ß?èÁZØØæ5?Ûc#²€ß?èÖüýØq?ÞÜPýÂs”?ØjŽ©(??ìš#àc;?é÷d0Û‚/?çµ, õ­á?ê85E·?â Oë·ié?¼¸ï?äI(?ëIÕhŠÌ ?ã\åå_?8üù3?æO‰„ãt‘?ÓcÈScQö?´Ú¦½ôp?æü€b‰?î6M«Ý*?ïŽ +fbZ?ØÎøeûb?á,JP?ÛMµEáBP?Â5âX ?Þ8 ï™ðð?Ûݸy. ?çA.%Žý”?¢› ª/íÀ?êï ä?ÅÀaÌÄH?ÂÄ_„ú„?ÚÓ-Ç~?çzé>~³?êIY‘æ%?ÓºLˆïœ?Ùaînõ2H?î󳤜¨N?ÒÝ ‡€?䂳 Ùq?ÛµfžGÆØ?ê SgŒø?ÔþÛS7›:?™,à?ïß±F¡Aõ?ÒEc¦?Ô/+Iƒ b?ß1àïCŠ?Ù(µ§Å<?ÀãT&ä?Á(áõ%›°?ì²ÑŸ()?ê(r‹È?©Ø+¯òáð?ïÐͨûHÍ?às'ú ?ì0óŒ?ÒGŒ@æ¤?ᆓ w)‚?àz2€`}?Æ> Ò]Ó¨?âȹº KE?ß,gÍh?Ü7‚Ãl->?ì¢Ëã¯&+?¿}pð_@?×ÇÚ·ì¦?Ê / ¡¨ä?îB@²;?ëZÇDUOø?GdR&ð?áëˆÓüÉ?ÞßyÚ’x?ç­‡•®—í?é%©TRÌ$?ãy–:µƒø?ë&`¸”[¢?Ð.t†`?íêE-›Ä?ÍœNIÿ‰ ?ÜÔé÷0˜L?îÞ·ÿQE?ì1ZËóxZ?å>_S² ?ï=+š–?ì¦C¨X‚]?ÁY2[7Èx?î£d%’øH?ÇûÉHŽãœ?Û†lY?æYoIÃ)?ä]ƒ‡Ú‰ù?ìqn‡f?ìßY7]Æ?¢ÉkÑWp?è§ýàß¹?áÚÇÚb®?ép¤j™!?½ò @¥(?Ò‘ëî¾Iþ?Û³W¡Žt?Óà ü´?Õ6¬*Ã?¯rR°?î5…¡äqò?æXÉ¿?ìü»[r¯Y?ìL¿¿o—5?ÝáŽëó»:?ÝA{ 4¤ø?¶“ò·•YØ?͹3» ?èPe¾¹]&?ìg•N?«R>½/r ?×\ügÝË ?è]9Ì?åñ¢´’?àÏ“HOæï?ïpÌPÁÙ?Ês 9PШ?äîËã;k8?îÑfcÊïi?Õ¹§áAýÕ”?ÙÝ @Û)˜?Üþ¬æêž?êŽ>+Dáž?ä…’GˆBî?ß®ãE¸@4?îy0¡Ãr–?ÔÔãà;à?ãVt/ô?ÓÐÓü?Õº4…ý²?ÓQX¨ù)D?é=‡Fí›?ØzÝp–ÅN?®Ê#RMÜ@?äX¹- ?Öbz¿W ¤?ÕgÓwÏ:f?í~«HË¿?Èy¶Ëx@?ÛÏ´W½à?á­Jv¼s?Á.ý Hœ?ÑèâŠ`?Í•ø¿Yd?è':æ!6º?¡þÞž€?ГiÁÆŒ®?–7¬#€?â,Š$í?ï?r„™Ä?îå¶"1Ÿ?Õ6~5É2?é!"T%?âÖ³FH?ë­Ç»jO4?ÙC›2‰ev?ç` d„?é‡7Bnnê?Ô¶.Exåv?k¥kZ³”?ÉõÖ! Yð?íg¶©¢V?ä!ßI ?ï2V2Ï¿?éûÔAf×j?Ó܃‡Ö®?ëÎv®¨Mº?ÌðÖ T?ﵩ#êˆí?æaœé¯e,?ì“|û@ÿ?åë8#’ ?ìnÓÃ…?ÞX%ã‚÷"?ëÌçtV?Âgß¿×áÈ?³=³°âšÐ?ì¢À„ †È?åÁ;0?Ùä Ï©¹:?⣴êå{û?È;P~“J„?ÝPi¶ûTÜ?ìß ÑÑÃ?î*ì[ÊH?ã'³h“üä?ìì°ßGÏ;?îÿ.ë "–?Æ+ ‹ø×Ô?Ùjx´X$?à€ÁþCâÔ?ìœ+8€«?Õ`¶Óx™Ê?ã&í&‚}?ïšGø‚?Ësm2@‘ä4?Öï –š‚|?à„le£?Þs|ý;ؼ?À˜IÁaDô?é«M›êC?é<áºñù?ç5ø¸«+?îçÄ ú?è¹*:#ç?ìôlàç„f?â¼¥õ~Û}?ëYî$D?Ùn¨_>?ï‹}¢`G?æ5˜±u^?â¦^Æ–—G?æ!ιÅUÓ?ËøÄš°˜?Á‚ôYæØ?Òîö‡çƒä?܉UKQ£ ?ÙnfÃÀ™ø?ãH8uý?åY’ÎŲ*?á7º[þNY?èÙý?à§G7ÚéÞ?Ûˆˆ€&ª?Úæ—.Ø}v?½lCþäœÐ?îP·˜‹?ݵkÎ@Î?ÑsŸ‹¢Rú?ìð›1ÙA!?ïlþ8_?à–â–c´Ó?é¼I±Ë’€ì?Ôv Ëñòä?Þ&,¥I)*?‹¢Ü.*߀?Ù•D›Uë~?çO‡KÒ?Ûàæì”S ?ÜÚÛÂÿÜ?ã8Š%ª—?ÜXXK©>?ê+ýÈ^?êeO׋2?îçæÌ‚‡?îÉ\II7æ?éÏFç(ì?îè>ß? œ8N?ß« <‡ƒÞ?ØiV» ½’?ÕUQŽÆ?é …‰AoÒ?Ö “‰fJ?ÒgܪÚ?Ñ$Š¥M¾ú?ß²õ‚þèd?ä ¿pk3?ç4Àm-¨ü?Ó*×'ÇÆ?Ù®Ùɲ@?å2YÇpÌv?ÌÓeha ?Û!vÎ7Ä?á ybýY?¤^ÁjhlÀ?¡ÚäaÀ?̇my<ñ?ÅeÌV@?ÓÜ”1ø?ÁýYa?æÏ.aB"?âfàa(þ?íj@ßÔÐ?ì5>û“?àKª-£l’?ïHbÕH›*?îžÓ ¨4Ú?ìh;ÅË<ø?ä¼ù5…D?ÏNÿ0Ù|?¨wz]Õð?émZÍŽO9?×Ô½7*Vª?áÎ.îÐ?᣹%¸?áSg-ACR?¨`ÊÙˆ€?ç"çÓ´ã?æß.Ã<„?Û´3²,C:?áag÷3÷?Ã8t«@?Ü)J†nŠ?ßÓGPÅ ?ïˆ<ÿß4s?êÝ‚=“ ™?ËxDl‰>4?ÚÞƱÎ?â)ÜÜXÕ:?êj†tWÅ?í´ñ!W?ïoú0†ô?çÌô¦ªzm?ï4À£ôê?çPÁð—‘?åŸ#Q›>u?ÖTK ÇØ?ÝŠÙ8¬}?ã¹ÁNÃÀS?ì†VZ‘;L?ä:ɜܪ?íâd X!?âžÕðìeÑ?Õ hmÂ?ìÑA.nO³?̧àʘæ ?àÊKº‚|?çÍÌшÅ?ƒôî®éC?Õf™ÆÀ?ÉÚ¬_st?åÔQã̧ ?äÛ儯ˆ?éF‡;Yð?á~™~ ¬ú?Ô©!}qº?ØÐâÛ|?è¾ÀÚŒÔè?ìð’Õ¿Aø?é£Y)÷¬?ÞäçÙÁV?ëË0wy¯§?ÕUH%lQŽ?Þ$±Ëƒì?âÌit•?ÏÑ6_æŒ?³¬yD )0?§;ûLŽ?â»A ‚Ç?ÝÝ … ž¸?á2S©e<#?ÜO!£N}4?ÝÔ¬¨sû²?ÝB‹‹]0*?ÎØŒà ›?ÔƒS&RÖ?¼¼Ü'˜?ï7­¸”‚?Ý&Où) ?á±UÉ=~?é7NΊ•É?ʉ\àG5l?é “Oé2?Ü…,ƒÄ?éW¨#™À?Ý`R•·è?ã)±’ÇB?ÆNŸz¨”?èZ§{|Z´?Æ{4®Ä§`?‰±|1h€?æO8Ë" @?å Ž!`=t?ïxró ªE?Õ²-Û?ëÅDÚÚ?íúµ7ñ?êB·wÓ-â?Ë(¡¢ŽÐ¬?éêõ¾~¤j?Ëžte{Ð?§—ÊÄZTà?æâÛ1å6Ð?Åõ¾aŽ`Ä?è¨Òuçh§?ÌH‚ŽjŽÀ?µ¸ès* ˜?éèv¬+`¢?Ã;Ã~¦å@?í+ô €TÑ?ÖGÛ½” 4?Âcò(ö°?ɵª‘|o¨?áAª"»H?á©ú¡{±q?Þ ›Súê?áKy¬¨Iù?íq Å8à?ï[Ì5s™?è»Y2Ð?¸½¼ 5¨?ï¯Ë}£Ó·?껵%óéÇ?ë‘]9©Ó?Ó»«) Jz?ÒÜ÷”hÚö?蘊–`‹w?ÛÔ×s6?ʺ"6À?Î{Ší €?³ëßâ(?à§&1òN?̦•ƒn\?çeUý*²‡?Âm+ªxT?Ã}øþôÈ?äà‹‘Ö?ÑíÿÁC2?ã¤TLŠŽ?×!íþå?é0í_zÏ?ãð’¼JNI?íe–ìï Vð?éâ(µø?ÛÜ© ·êL?ì&G« â?èôsÖ1é?®Ä¤e?À?ç ‚îáã?Ü,j\Œ?Ñ0kUüªh?Ûxùü-­˜?廋їÖP?ê0è©×­Á?¦7Bƒ{Ép?ì?ŒîB?á« ñd•Ú?à¿8>ý¾ý?ï]V3kÐ[?šp›Ð ?Óˆ2A!i?Å.‘Eñˆ?ä1†°ÙX?©2W ^h ?â•{+£p?ï8kúýÌ?ãO«4¼?íF›˜ò?Ø& Š#f^?é2x™?â•8ÞtfÙ?èFbþý?Äպ ´?í$¥rÁ\?ÞÓ6Ï\˰?êû¤V:Ï?ß÷«AŸ”?à1LJ£A?ëàÇ™o7Ï?é¥\œÉ$¼?¢•xCºð?½A®]åôp?§WèG`?æ/ˆêŒÛ¸?Ð0#-?átDw)?w?â(òOˆ´?ë耂»£?áù£Óx?Ó]f€ì?í‰5çµ X?š¶ß¤Æà?ÝâˆÄQ2ô?â0Áƒ8¦?íýtÿ‚Ï?åHõ%áb?䊷ÆQP ?Ï=6ZQ ?ãC+­Îú?ÓTþ q"?àæüë°;?Áxz/*ß?Í´ˆB3L?é²Ô"¶ž ?ï(À!Ï?é]&ÕaÃ?à¶8OSù?ÚÍFtêó¢?çW’}.݆?èÛ"„/X[?×Ì>@Îf ?Ðæ1?½X?èF68¢† ?ÚiC\¾Ê?Õ„ü…>ÏŒ?ç¸] î?¯I+§0?Âã$sbˆ?ÛxeS(?î«õïA@Œ?Û¹þú?ߨžˆ?Uª?ÄÍRŠXþ€?æ1l2Oó?æí§Mpq\?î„wøðÁt?Ý^—²¨"V?Ñð(à·,”?ÁX4>üœ?Í\ä€,?ꃼÌ7}?Ð$Dæ%ÿP?îñ8äUÉ?ãþó1 +?æ˜o¤—ž?Ö:¹ ‹Ùö?߃d@šéŒ?é\s[ßè??îÄIî•¶~?Ñó͈½Ö?ãµb¡§¾z?í͈®y?â±÷úà $?ÆhqÏm¬?êƒ_¿“¡ñ?çÐ$• bá?ÆdP1Á¼?žé&¡ºÀ?ÍBzàQ@?ÞötƒÚðP?ç”KbC?ªqÅIsÉ@?ÙÙ}T3\?ì›zËAÙT?ç†ld„ûÏ?±PÀ€©ð?ØL­ßš×"?ͽ’üT?׳‹ëªx\?ï»ÆÝt|?Û+<N?ß¶r\¾?ïuŸÄÙ!†?Ñ+Ý^«:?å½ñH0¦?ìê•ÿ#”4?¤ ˆ´¢L`?ÊT{ÿ ?ä“ñ…ù5?Ñe¦›Ðþ?¸‚¥Ü—„'æ?êËŽoò>?áýô€ÜÛ?Ö:Wb÷k¤?ÕÄ<ÅÈ?À_JÒ_C ?è¥$–öN;?çäÆêá?ß¶–ds4?ÜéÞ(Ó¨?×–Y#ßÛŠ?¾¼Lhñ$¨?çb4kÚA¨?ÞñŠ5Ïð ?â®û,V?ÞDnb0?îÔ®æÞ?Ðë†cE˜?Ð+yÏs:?ïÆÄþi!?ËAáÛ¤cü?é°¼ùZ?ÒÜòEd?ÐU ‡áI^?Õ“`ÿ¢„?Ú`·Ù.ûj?Îi)­Ð?ܳbåŠÎ?è×O0õ„ß?å&`º*?·å‰üjè@?Ï= Kè?èx—s?ï`Ny0†?éTZĘüŠ?æy7€ö¨?åüœš|¢Ù?¸@ññð»@?æÂ}2F|¹?Ü\ Å4Ä?ïÐ/7äqî?º{$GoØ?Çñ^LÕ\ô?Ð~–’/®²?íµôk3?püP »d€?åºKâ5Ðu?ÔÙ§îk”?èA9œU?ä>êpo¦L?ÏÈ"ðÕ¢œ?U É?â|î‰#Á?ê°\7µ9?Ø*8Yùø&?´ùSŠÜø?à‹Zº?Γ V ?îª{9Ê?çÎCÔ?á ;³¢`©?¼Œ@(Xªˆ?äOÏMgl?ÐæNž©ê?ãf›¹’¼l?ÂðÙ&(À?äð"Ý®V@?íýfã?ÌÉû6q·|?ã˜B¬0.'?Ã6p€ô?à#L¿¬ç?Ú@í,mú?Õk*£eŒ?ÜÛ üˆüv?á!ãf5È?Ä J}©´?´vwMÀˆ?Þ…†æZx"?Ö-ýÜœü?ãi}¾,¤È?_὚Y?è±mýî5?Ñ1ßVuª?ä`-í~Xƒ?ÖØU)ŠÊV?åñeÿè+?ì5¡"]uÉ?à¿ã%d³?Ú¶6›W²?èl¸cK"?Ý%qöj2?Õb?_¦´?×) žÏ¬b?á‰äÉ’?Ù9‘¦àð?éZ$LÇ?°~v|ÈP?ßeÉ:ó?â»åD¬û?éáªÊÃØ?Þ¨î‘ù?ÐÇ×èä?Л¼D´P?è™t=A²?ØÔ„’Ææ?ì™nÐç ?æSæ4NR?Ø–«6.t?ÒDEš œ?ÈqâMâÄ?©7ßmÀ?ﯣÊ?ÒÚy¦ò?ãnøÞÑÐD?Õ¬~³¾9œ?옚¤y…›?ÏR^4¿ @?È-dO ,?ÐARd?âŽrDM›C?éD‡Šï}?æ:1Á @Ä?ØOáFI-„?àîÄw?á`šúC®?Å »™ü?î¤zšÇ?Ì_ A®?å¤|—WP?ÔVy.ùÀ4?xLTf’¢?ÛA‰MyÃð?Ò+ß“*?¦¡Pß¨Ó ?»«}F`?®"Ò9K°?Êo*Œ?à© FY‰?àƒûKç¾?Ó.áÈãà?ìQ2¦ú’?Ð9tæ†Íz?ïv\hìEÃ?ï ¸A¼?åõ2¿3]?Úõ‹@§Õä?æ Œ`5\?å·xü¯ñf?ékÉw˜{?ï ?ô'§ì?Î~kqYp?ÁF²FB§L?êàq¯ä8g?ܹîN›Ü?æh9†¡Èì?ØþuPØ,r?À{&W«¸?éÒ²{£<¼?ǨgÞõ?ÄìÜQ£Ù¨?èè4µXÐÈ?¼rä•z´@?°ýŒ­q?Òê¤Àp?Ô¸÷®¹Ä?ãÞvÉ.Õÿ?áeq7د?ìãh³žÖu?ás‡lC?»ñä}€?Ü0z±Ä-æ?ìh2“¥Ç?ÚæÄ\yNv?â ÔŒð>?¾}G:ð@?ßÉÅî Ót?éï‹xßÄ{?Ù ’Z™|?îDEX•0§?¢†ùZüØ?ç\¾:´²?âRDä³Ý?ïlÅã”?·Y/ñoÒ ?̽u`‚œ?ì4£´Zö›?Î{ã’v*D?í"Ƚ?Ä1õª?ä§{rùµ?Ç}F‹˜3?æŒÑ¥(Ð?Ñ€6¦þ?èºÞÉ´ž?¨ûÌìAüà?ÖûÆp:Ê?ìÇá°Ã?ËÓ&‚&ô?è’³ZZ´ ?׎ÿGB?çÞ¾.ñ?­øéØà€?§Û%P_°?Ó<VÝ ?Ñ@ü¹›Ú"?á1‹˜£?Ý´¡Ý²œ?Œú?ÕˆúÆÑœ?Ë¡¤ËZ¤?êì¹â ¡?ë×ÛÁ?ísÍ<î“.?Þ.ÜþJH¼?Ö²ÿkÈ”x?æ 2ÑcÀ?à5¬Ú1`?×¾o·fŠ ?㻥èú‰?…~#© yÀ?Ô߯Ȯ[2?äM¢¶sá¬?ÝfÏD°èH?îRð?? ?íýút’Mã?í俵B™?éàû;–å?¬Qg s?毒tìOÍ?Üø^|h?å¶•‘Ögp?À9„Á©@?ÖŽ]B¾¸ø?ÝUU;2?Șëá˜L?íy/J'F?îÎÒùŸƒ?ÔþàB¿ôò?ê6èmmV]?àa‡‡Þ‰û?©ÙÕÈ2Æ?ëM!–j€?ã_8Q9¡?ÈÑÇ`²Ép?}¾[…€?ßù8F±;D?°,Z‰e=?›ÆÈkà?ºü÷RyÐ?èQ‹ìÉ¥L?ÖÌhà”ª?çß ˆhÖ:?ݧ±Ü:½?¸ö˜ ¤8?Ð绘ð T?íp®Y•³?ìåàöøRþ?á›ÚDmk?æm·ña v?ÍLçÔ?ÝøjœR?ëËF¼óŽU?Îî­¶*Ø?ÜÊåÝD?íÑ0Âɪ?èIï’• ?á~Nk!¤?â숛8Ä?å—S¹à?íFj!zÿ?ÀØ'Gh½ì?Ä86üÜ?ÚÏ*­Ž?èOñËÖ?Ù묷jz?Ö8WqRJ?îÿÎPNÞ6?Ù4Áâœtö?ã»·:±?Åp±¾àd?í= ˜Ø?ÚËfõ:L?é#ÇÄE?ÙÞ]j*?åÒŒuä?å/Fx­?Ô”±hÛ~?ë‡/õÃ%?ÌJ, Ø?ì:Dk È?Æ„BꩈH?áÖÖêÉ?ìµA!¶ë.?¸žœ¾ÿ?ÌÐR°Ê¨?æ Ùa78?ÌbJ7¤?áOÕW—â+?ì¬Óî®6?Ô‚*UV?˜lìPL9€?íG¤¿…Í?ë½Kñ6?áÔˆa¯z?æŽ$&•Ð?çݳ JUb?†ˆ‹"ý€?âÿÏÜÅ?ï×›¹LB?åÅ}ìÍêm?ìŽ&eß?ï'£ =Ãq?äfÕ4u?Í|' pQx?ï‹´ºÈí?åϺ³×Ƙ?é‰}„"¹Ž?Á)y•Eð?åXª!voy?ç*-éß4?ï]W0Ó?ï¿3ä"Þä?ä ï^ÊV?°«O¢Ñ± ?çóòý#%?Óyáb&ð?Ä)ùjTT?å¬<ß™?è^¯¢¶ˆ?×¥ÿMQ˜?èI1q}ô?Öªõ_þÀ?ÍQïÂTH|?ê»öèm}Â?âð¦1`ýÅ?íHݘâ?æs²-6>?å– @À½?ç™Î_Â?ÜÀy’] ?צ¯ré=N?ÁåH%ØÌx?ÀúÓ~’´?é{œ¾£Òé?ë<¹q?°G_5~È?è¦ NV05?Õ£ª<›²?æîÂÌéï?Š™ð €?í~y8Fw ?èÿænr‰?ïæO=dÀ?íùVþR¸­?пӑÓ\|?äÂïAsXã?ï!W·hL¯?înL·×µ?íE…Õx?î÷´sSþ?Ö^AúË1j?ßûNv Ò,?ì_oÍ>M ?푃qs( ?æ…õˆV/?ê§/9½È?äûB[Ft¹?áÛ^˨IÁ?¸œÃP‘gè?ÊK¸dÊÒêËÎ!ú?ÃËîg€X?誂”úm?ÁéG”\?ÐSÿy‰ö?ÎÍJé¡ì?ëÿiɲBF?í/Oðdìè?Ù»Ý3‡>?棡XÎxô?ã-Zµ™~?ßnÉ ÒR?í / 1E?¾ÒºÃ±È?ã$ßÌÇ_?Ú¥¡P9R?èšv ñu?ï=b¥P'?ä,¥ÈL+?îòÔ±Ô?á˜5“h%|?âõN§ƒ2n?¶RºµyäP?ÞYùM•ú?ìš5Ùϸ?åç0lg?ë!Uuµ…L?ત+–?Ù°Çï8…2?ªÞ×ðXp?ÕüIÓ7.?ãò QNñ?ßëƒ}–4?á=Gä³U?Þ©WgZÍ^?áUñ\jÞK?êô*×Íâ?âÈâG]ƒË?I´%Ô?ï˜ß½F©?Ö礻àˆ?×r!¢ïÈ?߬屆\?ÈÎàˆ_Äì?—&‘eV€?²ü²Æ‡?Ú”Q@ñØ?Õ&æûB2?Ù Ý%ÿ|F?®1F¼ê€?â¸ivLŽc?完Aiˆ2?ÚýQôdó^?ÊÆÊw×—?Û1UiÁT?Ø¿x#}0æ?ã+áÀ}?ã„ù ^º?ïì_¦«†?૨ êãØ?×EwÇÍØJ?¶ÞÿÜ%P?îì²) -?éÉ>Cºac?ÑOÆ üVª?¾°éÄ–à?à¶ÀWÓQ?êŸ;’ê÷?Ûƒí?ÍmN‡kÜ?Ùò˻ȭœ?á†åÚÛ3À?ÝýÄ(p$?îH¶»º?çâqËžC¡?ì‚Ó¬?êò,B.?²…Þì;–?âRô凯N?Ñ„¨r0?èi§O÷?©_fJûÏÐ?ãKC?å³?Ú‚mÚèv?åø^²?ç±oyc‰?íÃ>½Û?ÓÍsÖð?™ìød!5?éž$±9Q¿?ßòâðThÂ?ãõ{¸ ȧ?ÊKÑǰ?êôjXŒ‡¹?Àü"b ¹Ì?èÒ¸ !œš?ã=HÀЇn?ì.iÕ¸?s?Õæ¡ 6?èJ¥ Èw?ÏkAÞaÜ?׈øðn>?æ»,Ö¾Vò?ÁŒÓý@=¤?¤Öô è0?í8ì€æ+?é=`S £C?ìþ†më¹?Õ`|3»qþ?êðè.Ç¢?ÚçïÇÔƒŒ?í5¬b>?ÀyÎðžÔ?ÜAëvœ±X?Òé0”ðå@?çZãV“½g?éšGIk  ?Öç¢{ÝGF?å&-ßÄSG?äÐ% ª.?»6n²~<Ð?Ø%ö<‘šì?Óö`Ï›-|?æ«qÛÇ?Û²ÃüèÎ?ÃuD‰)òD?Û9Èj+³t?ãÖwaý?æÓ˜GLUS?Ó†¤KB?íÂ8ø™?¤–Nº?¼¯nP?æÄB—É ?јÖ/_&?æaðK_?ëè›]æ¨ö?ÕqO…§?í‚¿C)ü{?Æu´¡Ll?Ñÿƒ¹Ò?ÚUíêײ?Nj֩ØÐÀ?ërNŽª„ä?ç c;_?Èfw4J–k\?îαa€×³?ïÃîj‡xŸ?Á' Ã_ø?Ýý)Y©bÒ?§v(U½PÐ?íæ(oóË?áÞ‘S¾ù?ê>õfGª?¢Õ$?)ÎP?áXâÐì?Óˆ7D:?½~¡pöÐÀ?“)qD?à?ì±ôžÚpû?éŸb8pT!?ßÕ¬>7S4?é\Ò}Pà?êg§ÊÐ{O?æP‘OÕ"?ïâ!ì,¤?â(¼Ïщ‰?é¼5eë³?È#L¢+8?ÝðaefR?¶f@²H(?î­UU¹^â?í8Io/v?r##œØ?äÅÚáï?ë/‰Óó"?àožÑBzU?æ°êÄjÛ?äK8ó=¯Q?Ü£³Ò ÂÒ?½ýÇjÇGà?ÖÏêYZ?×Él t`?â-C5Ípq?ÆeYûÄ?ÐqJ&ë?ïÆÍ‚<l?èH“Lcdô?îÁnà´!§?ç€ue§ ‚?é}Íp7É?ë‘B! {?ÛnuZ"b8?ä />̆‹?Úl†A7rÎ?ï/RûœA)?ê¿áõ ã?Þ/YÕùHÀ?å; nò?¨—øUmb?åÇwÁ¡Ð?àZ_·ÖQ?ÔN8*œD?Ü—€IÊ¡J?ë+i¹+Ój?ÒõȉΒ?é™q.6¸0?Ì¡¨_x?»ÐF•ˆ?´¤T—›´È?³»%mX?êtÚÕG2?å‰KY¥G?ä8–Úƒç?âòó…ve?ìaZkÓ4?Öa&vÀz?‰O üŸ?åQ¤ëë?âwÄêÛË(?í+)qn‹?çŒæ™=z?ÒŠj ê;?ç%ëd~a?ë®ÿ7 h>?Ñ{гþ?哱ý?´â85+?Ð1âe¶Ø"?Èd´Wbü?×x‹ë§‚?¹P&@?æmò­Ñy‚?èU­×Å–?’ë³ô€?ÛÂH¿Ø?Äap¤–|?à{u‹û?ìßVHz–?·!úÓ_&(?Á×F«˜ ?¸ã?QºØ?ÝSÜžfw,? ºg¶s¥?î%ìvwÑ?à§”–RC~?³‘¸€t7@?â#ù¤[º ?åÁï ÇÃ?íʽJõj?ÕQ1MåX?ä.5ý—íL?ääršŽ?ç÷Ò©îý?Ðèýî?âFO“sÑê?Ò“Z?íjrZœ¾±?Š]ô±@?ÒíµÓ>ŒB?á’£µ ®>?ÁÍ2Oï³X?éÊÛ?E?áRq`Z¬?ës‚VôkA?á ¤Z[?âÆ!Bd†?íÖ*pa!k?TZ+¥À?ê8Ãù©vÃ?áÏ€HXk?ÀC¤Â\?ä>»ŠM±j?€ºR@\è€?îcª¿{RÐ?ç=ly žè?Ø´‚®G?èNªÂO?Ä?Ârp?ã#}Ú'?Ü:ét’È?ès¸ó¹Ù–?å݈ŠK€#?×}i¹yÌ2?ªkÑ€?íO»5«]â?ÕX*RNT?å’  ˆd?ÈD´©“†ä?åL²Ô‘€×?åüð£?³²¼´³°?Ú[n§?ÅovÒÀ?Åw4ßP?ë”Ð9žö?Óò\Q>?ĺŽ 8?åŸõÒð×'?Ú’ü +l?Ûƒm~'F?ÖA‚pí&?쮿 ±8ø?ç,)I$öá?ëÌ©©C?À• wx?Ú¿.·l3?ëg®“÷Oø?߆s Žâ?ÙÓïw…6?çP…_tt?שã†H™?âîèü*?ґʽ¼¾?èië° A?´ì\y±X?íÐo=x²Î?æ*ùï¯pµ?î:üsP›ï?嘒ۖ1‘?⵩~&M?˜-÷Ùª] ?ËÎ)K‡ä?¨#+¿*¯À?­ógÃé@?æ =>»©?Î lÐËJÐ?âøËí`k?Ã_úÂRÚ8?Üfì\W=´?暺±¥aq?°UW×›€?à@à ޯ?uvˆÍ—€?íwYX²?êƒhG»~µ?Öº6¬Òê®?Ñ¢Ãidq‚?ðÚ.t?Íän£§ÑØ?×xݰƒ?¾þÚ¤ê½ø?¯U“6÷@?̸^סAˆ?ÉÿWÞÂ^@?¾N,ž@Óˆ?ì_ͯck?çÕsë?Ù…¸ ?çùÞdǰ­?ÑÏÎK3£p?Ï—ÎÓt£”?åz‚÷"— ?è} îÁþ?×3Ë=ËÀ?çàÁ+JÕ?´6çÌòÀP?Ú÷~¦è¶?ˈßÿÛö¬?ä[˜({¬ƒ?ãÏ¥|¯?ín#w)?ªÑgê.b€?ãwûo\¥?á#žE†Š?ÜR¢xQ¢?¿¿˜?àçì·[ˆ?ÃÍtš1TH?îD áxï9?Ë’¦'ú²„?Ûé³ Òj¸?ÈÕBzf°?é‰Kê$?åÝ$34÷¡?í…pëù¸[?é“P®÷¯†?Ø'9±EÒ?Ú¨Owì´?Ü1Mªßèœ?Ø–Wyö´?êg¯º™?ÖÏç™R|~?ä´}7Óï?åo;_×2?ÎñD8Ð?ʳ”â¯Ø(?êÔ‹Ô ?ʵõïоˆ?ÂŽ”ëfÈ?â¿1VjŠå?ëÉŠóz·ï?Ú˜·,d$?ÕØàY?ö?Ã^xE ?Ó±>YiŠ?à¹3™“š?ß‚©P®n?ÚrCA©8?êr·Îà¤ù?À¾Ö“3è?Å_b‡Müô?Ò–“Žô?èÞÛV¥ª?å Ÿì±H½?ßÏÓ þ?æ¿ZSi¡?É–‹% ·l?©³HÈ´p?ç5X®í—•?ïnM•hT?é–·3Ô|C?希²@7?ä,ä+£Ò?´dDÛÚ¹‡?êÿ¸æ;ܧ?ë.Khô¿?ç|Ý ^ûš?ÑŒ¯GÚ¢?Ä:3GäM?Ô×4À?ëŸîß@“?Í «»›t?âšâÑJ??ଢ5…7L?Ô»¼7>Ü?Ãݤ#@?½ôüÇ&è?š4dðkQ`?äÍô=;?Ãuu¬‰¼?ÖEkÿTò?Ög7°(»‚?ëù»f]FR?Ñ q¸- ¤?× 7%eÊ?Èóm}•Ôà?Ý{OÖj?ï´¨ëKÒ?ßAž',`?×õ¸)ýâÖ?év|CD7?ÕÕèa‡*?åjrv?Ñ7_oR¢?Å ½y±œ?âx÷} ?×ïÖŠøÒ°?ªfä N“`?éÍ›&Âh?ÏÈçGÇd?ïÓg JO?ÞQ•! 0?ÈçpˆÊœ´?Ë|±È?ê1ÎÈ\[£?ÚýH²m¿Ö?Í̆3 ?é<ûJ "í?Ó'ˆ; ?êI{á[¤?å9_šöÄ?Úr7±—tœ?ãö-ºÌ ?4 r?Ówå Ož?×¶†D ­?ì"Äq?èVço5óÎ?åßb@ÉÇ?×5Ü09¬?°þ"çÛˆà?íOû—4)?×*†‹Ë†?î „O£§?Ò†|>!Û.?âà;|§?á*S‚Ö?ÌååÎ,Hô?ÞT EÂ?ée÷ÏwÙ\?îÒI6„u?Ïh@ÚõÄ?äÇü¯LQ?×ÚÓS¶gf?Æ}«¦£?܃wzäø?æâ ¤('?ææl—|ðG?Ëæñdì?ÌSåJC¤L?Äír´ò,ð?âôfó §ò?ÔjÖ€æF0?çµIý¶wU?âÎZ´-?îäv¿óqO?ÑÀ—Š'0"?ë9ó{ð:?Ô>ÜÚç?Öd ¢q$Ú?ìFÏHþ?‰€€X's@?àFoïI1Â?ì­]²TY?¢+T´½p?îw"×’'?©ŸÝ¬Œ?ÜŸž†Tl?£ÜRÈaÐ?îí<ÈD5a?á­hw¯Òï?±â Xƒòè?Ìý´ ÃèD?àLG90ø>?à¢65sèN?Öþê…“‘®?½£‡z3`?ÕˆŽþ¶ç~?ªIé>JP?â²ÜTÃDo?ÎV —È?Âå€ÌPÜ?ÑǪ́lG?×u ©=?ì­uâ™8»?•Þ§4z€?êOµ•ÿE?æèÅ6„L?ÍU;l?Ì^¶‚2?«s˜‹Ó?Ï»€Ž,¢(?ãÃ[÷Á?™T¾ÜcÀ?áëwЫ?í¡ð'ž8?ë<7ú—Ð?áßlˆÍþ?ípâ`€˜?ÒϹު?ÃËRJ•¬h?µHóÄx?ÅTþ3¸4?êftš[æŒ?²ÀºÔ«i?×f˜0Kè?¬Íâc_Ø?ã+M øäL?ÔáÓ¥ðN?ã|úÔ6¨0?îŽþ”K¾@?À’yeëõ”?ͳXb* ?ÛL‹Lp?ΞnÝ1ø?ÞOƒ2~¶?Úš%j©>ò?êÏKÓsO?ß(çW?v?Ù7znÀ?èÂÁC¿¬Ÿ?ÖusýÍÜú?ç/fXê‚•?¼s5‚Ùý?æ1ç‹Èfl?á¶o }?Ó?ž»É,2?î¦ÀêÄõ³?êÜN©Nî?å½€aî?ê8)…”èS?í¢ÐÑçl?°@yûõkH?ÙÀö==,?ãíM|‘?Õ„˜— ?ço‚e‚T ?Ëþ¤Îì`?ã–Ó`Ó•“?ÕD¦zvÒü?Þpr¶½¨ú?;ÿK?Õ\Ã[ü>?æÑ¢sÐÖ?ÔÀoòÅš?ØÀIŠð/Š?Ü{ÈÂ¥X?è¦P, »m?åÍ×Ê?Ö«pžT»h?ËD~;X?éFú§?º³•¤"P?æÞdK³€ø?Åëô4Qüð?è3Ø!žkõ? q»‹ª€?åhÿÖ$Ú?Õ¾Dõøc‚?௣kgL?ÈK1sɸ?ÝÐߪ`ÜÂ?è¥fHÉÁ?í®ËIÒW?ÓÜóR€qV?Ñå VÎù?ÑwS:´‹È?Ñ¥½~©ì?ê…º{?ÏòéK+Ì?Òýcù¡P?ç‡1dßàû?Ѥ ¾Ù\ž?î‚S VŠ:?Ù7å26Ÿ6?é$~Ǽ?æÁh²'ôQ?ËÕd)]?ïÜ6Â2Ï?µqÂ}Þ€?Ëé(¬¤ƒS¼?ÝÀ7ªÇ,D?Øtï?í¾?íÙJ G@Ð?Ó¹ |€?âÔË`V¤¸?ÓൾL-ø?åMŒ•yŒ?çÿŒ¤ll?á‡42 ?ì¿Ï“j…?é%:Mš?Î9Þ\ñ†è?éG¬‡0ø?Æg™l6Ô?ÞÔÖq[ü?®†ÉDî4`?é89`§ÏK?­£9ÀŒ@?Ãͤ״£\?äi9lÚ%?Æiäqs#Ô?âŠß¼ÅK¾?éÁ!âú×±?ÙUÒý¢ ?ÝrŠA)f?°ñ^Œ*ã`?åÓvÂn?çÄ$«?á²§U[tµ?èËëSoæ$?çØj+-6U?èl÷S¡/Ð?ÌŒûé·îå`¸7È?Ú ßqÊ?ÅJÌã8\?àjO4?É’X Bh?è;@ xòF?ç´É ‚Ê?àÇàÊÛ©o?¾ôžçIj?Ìö#$üCˆ?èü/ŸGÃ?í7œ“ËJ?åµÓ-T"ä?µ þÁè?΋Tæ±?é/TiÞù?á¼ö`ˆŒ?áÞè€ó˜°?çhûîSVR?Љ¬7ùoJ?åîLU]?éËãÑÐ?¤b°p?ÆÅ¼5X´?çbÛõé‚?ÜÄ-¼Ï€²?Éãck à?ß>ñnD-H?°ËIN­® ?åqH»:2C?íïíˆA™Œ?ë÷ F%Ðô?ÃXq4Ë $?ëÜ$Ùûc6?æÂU©•ç?Ì]<¤?ã}æsŠI$?ÅaÐÝkôD?éj »¶r6?Ú¦¯beº0?å"b¸XÄ©?«ßf•ð?ì¾wy‰J+?ê,]f†ÊA?ÍYÒcvb(?Ö<—g5ôj?Öâ˜Ü· Ê?ä/Ùt)j?èÆL꜃$?Ü8¡Àî?쵪²ÿ¸?Œ¹à )€?èÝãÈ?î*ƒž;?éS2ÆÑ?ë°Ó2l?á6µòÔ^?íkmåT?ºéTo}ÄH?à†9u94?ã–ÂŒA6@?×,ç…"?ì¬ Æôïö?ê‚‚†?ꪞcÇ?Í‹<Í e”?캾àÀ]F?à.6!ϵ?ÙÛNTÀz?æ}—ƒ£?ÔÎÇ`?ËÇõÜïiÜ?ݘw¦Lã²?âP¹#Í!Ž?ƬnØ_Ä?çD Ch>-?ÑÿÙ¢"\?º<¤„ è?î)ýÓ—˜å?æËæMôâÔ?íÜFÔÌÒ?èþF¸“_?Õ6Tòe ?á"¦£f?äw×kZÓ?ëèŒê:d?èEÆnùµð?ÜÕ.…¯Sú?íV”bV•]?ØÑâÏ9YR?çÚEòØÝ?åë ?¿ˆ?¶WðÌ×^X?âsü.×ùB?ï,ëJÌÚ?æxR7@Ä?»üfD<¹ˆ?Á+–rHŸH?é_Ý•Ï?à ’VÔÈi?஺»o`?î‰ øhÎ?Ó*Dàa!?ÊÄi Ù0?êc>–pþ‰?ä% Vš#Ë?È,ÿ²½Ç ?¼’R©²J8?ÅèJò5?ï'ùn&÷?檵?¬QD?ïÛîk ð?èó Jh«õ?ßÚ|¹ ?ïÔ)úÔ&?ÓäXlú?Ò.aJê¶?ÜžæV\®æ?ÅØ:·…xP?Ý2³ë?êºùç)ôì?¿êÑAGÐ?Ð ¾û™–T?î18F ¨f?ÖèLœ`&?ë®wq§jp?ÑÙÚir9ø?è‚#á.Ñ5?äønžê?Ù¶oâø?åÐ5«¨¹±?Œ®^¥ˆ€?ïÒ~rÕm?Áwí‰4%ä?²p;±~Àˆ?«’2œîw ?ë\{ìn?Â-HW¯ˆ?Ñ<‘¥Ö´?¸¶Eô< ?×t]7h?Ô TKa¶?Ù³pŠ3ç4?ÕÔÎñÌ?šÍ7Rà@?ÔV´k¡KD?Ô3ïB„?£§„^TIÐ?°d0xñt¸?êX4qëG?ï€Gþ÷ï\?ãÿÎMís|?ËÿÏKqÄ?Ô˜–س•z?ìÈïè„?°Éê|‰°?êÞòë´b?Ýv›U¶^?時Å÷¦?ávÍ'cß?᳑Œ9'å?äúÀ‚)ü?àS ä0?èuI6´˜Ã?êÚO,Ø+M?ä¾±7=Zv?Ñù(`øä?ŸlU¸ ?ãæšpGj?ã"çÏ”?ÙïÄŸ[êì?Ôc,m—Tî?Þ¼¬–³Àð?š²À…É`?éÙ›€C?ëò(~'N!?Ó<èsº?éEn¶ºq?æ–Q/¢z?ÚÇ6äÀh?ÛhVVÖ ?ì¹ H´7æ?áù0l¡'?ßí$ã3/?Ýáåbï¼J?âáYŽþ…7?ë±d3D´Ç?ξ9t†ú¼?áÈ»Ù@/Þ?ˆX½ªãÀ?뎣%o ›?у¢PÒÚ?¢)nlË`?îHÿó}X˜?ÕèI‹9†?²¡JÈø?§¡£o7p?ÒQ’ë#9¾?ÅÏ24®ü?éÀG*æ%?í»÷\JÔ?ç˜àˆaž.?ÙÔŠOmz?Š“ ÕB ?ï¨F 9Z?ë`s3ˆ6?áÎæ-9 ö?îúXX> ?ècŇ ?ÙÔ£ è]„?êÜ4Ãv?Ý šzÄ?ëÊ#Í‚º?erQ2VÀ?á €Uë?Ý¡Ì.X”?åŽuµÇ.Ç?Û‹ÿ]æÄB?Ådö9øX?îç»Û—•?æÒù1Yi?Ó–`”UsÌ?Ú4‘ )ë€?½°zULô(?á’ZæÎ‰S?ì(æÆ±?ëÇ+ÿœyž?ì)ðG»(?Ä^ î\?Üè/.2å$?戂~šög?¿4Ùâ ?À&Èú:eD?Ì;(O$?£Çœ=† ?çƒ:Ñè ¹?ç‡QÂMI?ï¤Ùfà6?ïÑçVÒš?ìýG•d{O?ì-Bäᯤ?ì‘£oêe?ÙÌ6ìax?¸¤Úâì0?ätmT·V?Ózdd« Ö?ïö¶ÅB ?ß|m9L‚¶?诅Mñ ?îVBžêö€?èÒÞÄ?àöJ‘8ÚÂ?³ò} ñp?ë“5ƒU›?Î5ú'?á|?ãüÏà‹+?ÓÆ‹” p?Âá€rt?ë lj–¶?Ƀgæb°?¾Œã–´p?ê_¸žu„?í}ôWU×°?Ý?ZF.?ÝFc)>.€?Ý<ã£_©`?¬ qÎÅ0?ލ £ìI@?Ù7Q6–º?Ë3Q„†H?æjr¿ßoD‚Î?ÑÀ¢-AïN?Ö-<%û">?ÓD •6Ô?ålr¤©?âªßÀ¡;Ú?ï[Ól¼ ?è®'šâ¸?¦˜íâð?ïRû©l?î!d‹z?Ômç'/Ü?á_W= ?æ.æ00?ÛUà‰ŸD?îêÚ±YÌ?ïÝ?Ý׺h{†?°2L{¨©Ø?ëÌef]„?èEpÝôu?Þ$@.S †?ÜéçUŽü?ق¬’?Æ•ñànûD?ÛÖÀ!Ð9?Ì5n1Hž?·ÀE©kp?É?"í– 8?º§hh?ÆL¾Ýé@?ìUÎyþÔ@?ÍÊ Žah?§(#@?ÝÈ?Öþ?Ö4×ç%bâ?®öù|Í€?ã]Ô’‘¥ì?沫 W…×?裰DtÁC?ãàÀ¨Ÿ–3?¯›Ž[b?ç‚ZsÎ:ª?ÃÂc•’8?‘´Â0›@?²ƒÑ;Ü?¢Œ]Vì?¯åK'®. ?éÛô¬…_x?ÙX ]^?»æýJ:¸?è`›î´–?Å®›üUDp?Æ“Ú Ô€?ìmAâýÆÎ?ÚÃó·ì?éRÊ®Jii?ºùÇ_ÛÈÀ?â¥ÅÅ«ü?ãÃ&KÒôó?äÃuŸ\4D?ãLdû g.?çY®a ‡?êÅ&5ýè’?â–Ù°EŽ_?â"'pœ‹ç?¥]Y¡AÐ?ÝQoÌÜ?ëòSï­¾ö?êÒFGW_?徎#F9?ÚÚ7„m9?Ô{ýZoO0?ÑËþ!%>?ä³ãh«?æ˜Ûnâ#2?Ógx+Y|?Í%[gVè?îDÝmß)?ßé%œ,d¼?Õ]Ä1?ÖÛš¢hÛú?íç…o†?⡆%¯°?âç— ¼Æ?ìÇO H9a?ë®hBVv÷?ÊÍý¶îo”?èÖú§c0?ìëÒÕOSŒ?ⵌX:Úµ?ê¶ ‹]d=?á˜a_9?âˆê#‹<¢?æUà †­A?âô2j‰ƒ ?êUÉR¬¦?딲¨Yõµ?äjY~m1h?嶦âôêÍ?ÌF‘êÇ¥4?ز£ÕFZ?ßWU½0ûV?ë’/_Ùù\?JtÞ¡º<?Ñ6X[¢?à¤52ñ¶?Åʦ°%T?Ñ$‚J)ãœ?¶U•™µ<¸?ã [Ø6[?æf*#Š­?îÔ|·(x#?¥²ôÓÙà?ÚI.àŠ?éù! ž*?áé+9€|W?à{[sJëá?æ˜FÞ¬qJ?Ë8÷ˆ"p?ØZ½ÞZ?æ³*ñUœ?¶_5TѸ?swÛ–ôã?íõç3jä.?ÛØ8IÛ©x?’}ƒ@?¬ô‡Ô\0?¦‘gï1Å?ï_ &MÁr?êö­OàY?Ù.æ“F–?ÌÔ!,ÐŒ?ï!é·ÌA]?ÝŽöŽ8?ê–1Ú‰&ÿ?ÊÏJ™=Š$?ç­¬Ðû»Ë?äÔšv’šc?ÑJí4»?×ö[–lSª?°G¿@ ð¨?™¡p6‘’ ?ïèVRÆå)?äÔa&)Àt?è|8égvú?ã»B…ÑY?é!ßEP'?ç† ž^5E?á¶u‡'ÏV?™ørÔÉ@?ïà|x?ºí—Ð?Þ£°z»Ú?éŸÖCïM?æ |+º—?îè9Mâ?ît­šþèæ?×ÚUÜR?åº|ðtÏ?çÑ 5ÐÌ?Õ? Ò-ý¦?Êó´`Úyô?ã&¸ïä’?ÒûBéº$²?Ø2©Žý!Ð?éÐxÏÝég?Ϫÿ¿?ë™ ñi€È?æ5©?Ûb|=´6?²r’ŸTKÈ?ç8(Á?Ýߘåð?á¥'fÏ?æ^m•Lô?äâ _s/Ì?²¶!X`?Ñ!!³Í!2?åHjYíO?ãÆeAÅ[p?Ú!ÎoBHš?ÖܲTDî?âäiçÄ™?Û—Žn5¸?íD¶A²_Ä?î£Ë#ÚVc?âÄDÛO?Çb™TQ \?”áÝtÓs ?à#rê›E?Þ´Òs•Ä´?Ò½Iõ+x?Á̬‡ ?ïEúÄ`g=?㉠Ðßn?éZî Á¼?Ãïm ,Ä?Ùöp¶:­V?Ç´ÚÒ»7?衚äàNC?Ú=X5¸qö?àP§=½òx?àçu[Ž%?Ù;• ÷š?ãÇö.í?Ö°)¶ÝöŒ?ÃX¡?îß±<Ú¢(?ÔÐÍVf?î_€&³?ÐÈ‹²X?¾ºh ¨?í{´³Sê³?ÁQiBtø?ÌV‡¢òÞô?ääW£TA?ßqWᵜ?Ô­ FN]ü?ìÃ&ì㨿?á–ÂÐßs?íéž|”Šj?½#uTm¸?Õ­}`ÝQ:?èa‚„ù?®V¦kY–°?¾çt’‡Ð?¾ùäX† ¨?ï3GtÕe?½U?x»?§Íuxl$ð?¿û™dð?í阧•÷?åòWÐOǯ?ì$ÜÍ—ãç?ÐHÎåìJ?Ä­ùãT`¨?×F8„EÌ?ãZ^vd§?â\‘¤Ëô?ê9ë{UY?äP¸—AYw?Æù½Ó'¨?Ù?BA¼ž?¥ÒñÌ@?è¥@¸' ?äPÌ’œö?ÕM Tÿ `?äµðÝŠ?Ìœä8›?¸W®ümð?äÈ>T÷ƒ?Á°´h?Á§„•­D?Óýº(À?æe•fK?ÏýõL?† eÍ?ænØâ{U?Ü©¬Twð°?ßÀ©ÌåØ?Ú‚ÆØïú?ç´zÓ ³¨?âB¤TÀt+?Ü™áð/4n?§Û˜äà?ìèÊò¥*?Ð[èŸLº?í÷ ÝÅ¥\?¬À¾ö“0?éwÛÅj“?צ÷Û Ò?æõœ Ä—=?Üù>YÖ?áÛ ^ø'ç?Ï㨈n”?é¦Õ3Ð#?ìËR³”6?ä0€çS>?†ÝŸ«O€?Ì>Ë7X?Ñ}èÑf?é2¨Év ]?ë _¥'ô?ëú=œ! ?à&‹< <Ö?éÑ$®X~f?Ä­1IÔ¡?Ó„µ¾Ém¸?×(· «(?Òm®½?jÐ?ဢV›?Õ`ûª8?â(=žóI/?éádÇ.h£?Ø­Qœ;;¦?Ó)Ýa“Ž?બTPr?ä›ïö”*‚?âŽËÄ›˜Ø?!¯Õì à?æ'ÌTX—?ìc`?­o?˜7.›})?à#L‹-Á?æqìÞk ƒ?ë,“k]??ï!oIÌ×?áñã¥Ç=?âuÿô(©?ã'ø-ùÿ?Û|”»LRN?«Ý¢¹?Í;V¶:˜?Ü’1Ëm¦?µ¥}Ê*ø?ḥ-ãvÆ?ÜŽW£·>?Øà&iXÔ?Û²0>± 2?ëŒt ¤:?Ì#"˹d8?¯-žn7à?Ôd@ñkŽ?’(ûD~ ?Â9¶Ð‘³”?Û$†Sw?é{œ‡[ñ ?ÖiW¥øQÀ?àOæf†>?Ýò’t'ã„?ÎT3 CH?éК¼Cƒ?îZnMõê?ìáÏÕs]?Ôÿ†Ý 6œ?˜,µœŠ ?ç-5†Œ°[?Ôj†@Ç``?ã³b¶D?¿ÖÓâ9H?ÜK=0© ?âŸ·ŠŒ?Ãr•þìT?é:Va#>?ïúNQFáF?ÝrG a¢ò?à|oLU„Ä?èVÆZ¿;\?êÒb‚Æ??ÌÈ:üá?Ñ-ÔТ?R?é7Í®PG?ß‹˜¶Ò?ÔvÀ–Ï%À?Üàaü´à?É¡«fö|?ᎌÜ8?¹!›™§T ?у¿s°éV?åÚ«áZ¡Ñ?æ°=Ù¾vL?Ò…‚^ÄÂ?ãxooó¼?ΰL‰eèÄ?¼7TG{M°?ÖÀ2¾erh?ÂIül¢ð?ê¶ŒPf¬o?âøbÀË?«çÀˆ€?ÉßÙkp?¾wŠ °À?í¤49Ø}E?ëpn\4Q™?Ð6(Ê>?Ù!ÿ Ü^”?æ§ÞŸW*“?ëÔ6‘›µ?Ýp ½f†?ß¹{sQN?áEX(¹ç?íxÒÝóz?àÄÖ_7¡9?Ø&dGef´?ÐùùÃ"€º?àÖ:+[±¦?æÿêÞ°¸?çKÏêÅ5G?½‡¼äŠÞð?Ò†Îÿ\ÊÀ?ΑµtöÁ°?äaK¢·§i?ã­EºE©¸?ç¡øgù„ü?ãï¨3hdó?ÙÖËSr‚Ö?唾vK€Õ?Ô%­gä:H?ãßtÊ”/0?ÉBµuØ?ï _glé²?Òk?9ų¨?ä_¥Y{?à ÀX"ž£?è'®“èØ?ïŠî4à{‚?Ð̺eæùd?× ’b\|,?ã…[ô*ín?¦Ã~t0?éfÉرƒ?áÌOz79¸?åý;ÍÄY©?Hæ?æ:ÆŠØ—˜?âC9¸3FV?í@&Ub|µ?ï—æÆÍ…?ÐÝRG×:*?‡µ.Y‘:@?æXg@íŸ?Çá׎ñØ?ÓÐTÄbwÈ?ÕJon¨r?íü‡Ëìm?ÙüvìS•"?îÎÀF À6?Ò©—¸Z?áQâ3è-°?›imø³€?ÀœÁút‚°?éUS 6¢¥?ì‹VÃNð-?ãFgwŽÁ?îTà†9: ?çEĽÚËð?ë-« ô?ʺ+~È?Û¬üÔ¯DÄ?ÙcÃN4d?ëBm<­˜Ý?Ô²‰Ž6:?ÜÕ ˆv½Â?ÄCþzmn|?ãqóòI?ʘžÖ‰´?ßË=üU§v?Þ{,牾?ÙSN_½Íæ?Ö¢†©;Èà?â0+ÿêÈÏ?âŽ_´} E?ëThOi??ÊG?í;H‰*‡?à×ßóå?î©äË8°¨?áèn C>?ÜŒA·ùu”?å‘ú„ÉŸ!à?íε6e¿?éÂ6TÈ?ãQ/]Ò¹?¾ Q(Ìœ(?ãZË®aï™?îÍ¡EK`X?ÐhLQäÀ?×q,]T´Ì?ïð½Uƒ4S?è—yéÓ¦?דүx$?×ÂW› û¦?ßRTá~×?»–è?ïÖÐÕÅ"å?í%8*Zs ?ìõ4Úéõ?Ú“W]êâ¢?à‰1м÷?ÜÀdú‡B?áæduu©?éЈ=Èn?ê±åõw>T?«Õƒ™HY`?ÑB<¡t?íí­ç9?è^1{~º?Ò8"ÉO(?§íÕAà£`?ˈ,å1é?åœÚË?ƨP…¬Ü?Ù*¯?/x?ë+ÏàyêÛ?ãpi­¿ä?ê,ô6Ž£¬?ëÃmzIlÛ?È·©o¼p¨?٪ܘhË"?Öˆ^"˜2?¸XQ’²+Ø?ÙYšk¶†Œ?Ñ"š¯´º?ÛÔ­î?i¨Âà?í[‘?}·?¯‡+¡¡|ð?㌓ÖD¬U?ï÷C©ö)?ä–¨›’?Åà‹Î \?çN“Î=?ªl˜óøZ?çÈæ™{ë?Ü[ëóa?çV¼”ÿ˜?áÔªU3—s?ì¥F_¡>Æ?äÒU·x?ãß–5›ün?íwEPß?ê2q@„?³ºY¡S»h?æ¹Å’¶ž…?Å&¸ƒr%Œ?åbb¢ùÃ?ÎÒ.y­p?é]˜×ô?åé5›‰hL?­¸èà?ç6ržš„?îŽ'î?´’Š©è+ˆ?×ßvc ÊT?ÇX¤ŒèØÐ?åí_¼„?¬'Yap?î¿pÇù˜[?Óô›Ëâ?ŒQRxâÀ?à/œŒ?Æ®wä{RØ?â¯è’ó?Ò¿4Ýuž ?¶!áø¨ˆ?ì•Æ¼ Æ>?ç×ÛÓÎ?½3fw˜?âC%‘UC?ÖŠ-Xñ¶À?ë®fÛ1l?×þ'¿X¤?×>éEÇÒ¬?åA{ë!f?â9FfL?ætÄÓ£Ç?ÔQ¦6³Ç’?²=¬¹É7à?ä&„jç?£?å§ÃÈUåû?›x~M…ÎÀ?Ô0ÐÁD¯X?ß qßeÒ?¤cáfF'@?áež]œP?ÖÓ:ŽQ¡ˆ?Ëeb ì¸?çÚë—,ih?Í<-> ?ÓââÙ%B?ç+,¡?ÍE¹_H˜?âxKéÅ*?Ò Ôõ82?ÕT ;Ž?›r©òÅeà?îF̘lœ¸?ÖÆ:ÌVÔ?¾ETÞúÚØ?ÜÖ *Ïo?Öð¸?¡H´?ç Fž’ˆ?×í—”Ý_?çeÄ21À?ÁC¡}ïÈü?Õ—¾‰J7x?æçÌI&?ä?È$†­+´,?µ].K0Ö ?ë`86“—â?ÃVbzP?ïèx’…ìô?Ø'¦Ó½šº?² ll½è?àH,»Bÿ­?­Gä%–¤?ÜɘoÓB?éŠ".Þ†1?ç Cˆè?Ó鉽ñ ê?Å㲕Ÿ´?̰ª‹Qæ ?µ#°#û?ï>VÎiÈ@?胇ÛGïe?â‹ÌÙÌ?ëF»Á‘ë]?ÙTP–ÓŠ6?âÜ€¥)×w?èžC%´$û?ØYœ³2é„?êá²Ï?ÑÄ}#æ?àáÓ6:rH?£m ·rP?Êû @"æ¬?Ù•œ ?ᦥ¶CdN?Ò5Wÿ-&?Ì®[˜%?áH¡Ì§Ý?éì­Â­9=?ã*0,(?áw!qî±?í Àìáh?ÝêËUÒÔè?î "æk!”?ë¸|ü?á£Q  þ?Ö¬;vÌp?±ÒšO?ÔQûÃjÕ?¾ò Óyˆ¸?ÝH×þ‚N,?ߨ“ËcÚ?í³2Üc¯?æ¾\ Á¨¿?Õ—ø¢Æíè?åCÁQ{þù?»®<£?ÅóÄBžL˜?ÍÉk@Ñ®t?Ó»,Šìñ?ë³`º=?â°è÷?á Ž›(?êv€´Z—‰?çÂÊ( ’t?שUÑ`?NãS•˜€?í3²0’I?½ojlM@?ê— .8C‹?çv‡ªâ©?èP=eª>?âÝþíÂjÆ?ï]{ÌD@?à)±|I´Š?Ö*5»x« ?î£ïÈ!Çì?¹<ò}R”ø?·ÙìTUl@?ÒKnÜ )’?Ô2fÙ3*¢?¼5™äZØ?æ¹\sj ?äГŽ4ž?ä…UµÀô?쀎Uß0â?©Qâà`?Ð;¸?°†?êu.³Ó?ë7?nÁ†?ä®Á^•< ?èûc«s%s?Ìõ6Eaô?è;MU÷È?ï³&w"À?îyœ2v<]?Ö… ŠúZà?ã °¨€?Ó3µ}/x?ï¦aOÒ*?×*Qƒ˜:?êÅ;*ǃ?Õ¯ R„j2?°y/üÖØ?à;¤±G¡?ÖÅò–Ì ?ÒºPcùã˜?æÕ.P1w?äMêVŸ¼¤?âKŒÝëÈ2?Ը͈!9L?ºª- ëH?Ósî~(î?Ó鼺¬'?áz”*\?Û [3uäH?Þ¯7K&T?è_‹ûˆB?Ï â–¿ L?á-DB¢?ÍL~r`?Þ†\6L?רšùû¦?ìî…ƒ_¥?ã¨@–Àž?ìÇ#Œ2l?äÔ<âîï?åê¨$MS?ì]ý¼¨”?ãž+çÃ?Ó3ö›TÜš?fñ “Á?ж +l·˜?Ñ%»‡É7Š?à:èd?êã?:›®ˆ?àßMpEêê?æ¸'sö—?ÒÊïÞÙ¾®?àL{¼}½a?äày"»-?é7œŠqü?Þ—7:òF@?°mÖý5àÐ?âAkÔ`ô?ÅêΉ–ÝÕ?Ô7ZuSN?Ë$ !Ÿl?Ì%”ÞP?éâsݘ°„?×}ð”Þâê?ÀŒhª €È?ÖSïØâ Š?ìM‡ö€Á?·Çè/tIˆ?ß$̲v H?Å,N©Ô\?Û¥Æã„O–?êÑó9§áy?îÝ_q‡j–?ïáçúHwÊ?ë4ýM¨2j?›IÕÖ4Ð?ÛvH.ôX?Õ^r\?æ0: ?þG?ì²ç-Tù‰?±O‡š‚”à?äV馺d?áµ,[æÐ?à í{F`?Òy¦"bD?ÏW ևϘ?í˜Êû†òÄ?äÌšÜ.SÐ?ê^úX¤<:?è%ºÄT“?èé ?jô?Ì1¤ynX?Å ¢’" ?Ä ÜÔÕ“@?ÓwÒm„‰Ö?Ô%z‡e–?áÍÎCŒ?Ùê¬t§Æ"?ïq², Î‰?½¿*ëT§`?æ±C­~Š?ÕSk0}î?ÝIR1B\æ?µÊ¶æÓ>8?â ð ïÆ?åK¢dPëÀ?àF@á…––?壨õJ¾@?ïõ£†ƒÎÜ?Äo•Í0kp?ÑN@"Hñt?º²&ã1h?Ç4…Z"¼?ºun^j@?ækÞªð#?ÏI/> ?­u‹T7¤0?Ö6{Û¨?æCÎ"/?íÂ6LwÒ?ìåÐïA%˜?å{]-éMo?áuwÿ¤ÿG?ãÞóÜÌ™?ã(Ã’?Ùu·p¦à¼?醯v?éF>cU?âÑ 6xõü?çD\&¥?çIJïs%¿?°=3±sà?êÌ+ºÎ&?Û{--¾6Ü?Ëö>H<î ?áôùï|9ž?Ëÿ´Ä?è½7‘¤^Ð?¸‹z´WîÐ?à=¤í Éû?âÅ{…Žù€?â¦ËA+Ô=?Ómˆx£€$?Þ08rcø?Ó€â{êób?åÀ»TŠÑ?Ë£A4“ô?Ò¬Ãä]Á0?àmÀx˜¹Y?ì|iƒ-]?ÈÕKB?ÒZú?Í,Êõš¼?°0£‘?ÎÖáÀÍž\?Ûí\B 2?çäy‚jj˜?î2”åüóá?ë‡Ô5MI¼?ífWÝu¸ý?©ï@?îHîîõVl?ãÉݬåIT?ä1¬‘Àú3?îÏÁªÉqL?Úí]:‘r?ìÌ‘W¾/?ãžÒKœ¶?Ð÷ªE=?åè,d$ù?ë­€åWë7?Þ]<‰A„?îhÁ,'³½?¾bø*œë˜?Ò°NñÌBj?£•RŠ ?Ê‹¾¤\P?à]0VZøƒ?éMã)*o?én–Å W?ê~™‚è-?¯÷iHr™?ç½Ðky Q?Ùˆ„¡†bš?Ò <ŸÂ?Ê}.ƒÜ?äÉ"?„SP?¢rê5 zð?ÔÖNÅÔÔÌ?îwµÁ3mí?ªÌò®‘0?´H>Zð?Í`–åFZŒ?åÊå™/²?êd°ë)?±·Î¬l0?ÙîªØ°2?àT‰·v9?Ñ‘Íã¼"?ã2¦7Ð0?Πùò›L?äC‰ ÕŽŽ?vï-DŠD€?´ðUÐôÀ?ɵ ¼?í=”™ ¶õ?¥´;G1Àð?ÝŽÄ14?ÄEºa Y¬?ãôÓ6ùt?æõ®ÅøÂ†?ÏlB‡^Kì?é¥<´Ö©?èØ™½™`:?⪮ïÂÌ?Ö³¸¦žÎ?Û¼þÕ¼²t? ­¯Îä?Åž®ñ£p?ÃÜY¨ îh?å1©2Eõ?ãðnù=v?æ­6ÿãYO?íµáL×?ÒwðÄwG?ïîl…ƒêò?ƒ¹ßú8ÇÀ?è«•”EâZ?¹T–{ (?ÎÈ’Éy´?ÆÝõ_<ˆè?ãP°0´+I?Ú¿qN?ã½ ¶½ñ9?ɣ݊WÏ”?ë਴ŽR?îW/õZ¦«?ÓšÃvxö¨?é¹G“@?ÆZk*µà?ç)¶îþ?ç£b'Pl?ì3p07úQ?ëPƒ ³¶Š?ÜK²Æ?âoE–µ5?ë{Lò¦p$?ÏW(ÆúP¼?ëS‰]ÿø—?‡dàðh@?é°SVº?æ+”?Ú -¾TÆ?îC“ƒ?âÀ y»c?¼¦¤fÁð?¥Ò L°?²Ëp¡Ÿˆ?ïöÏÞP-?¸Veª ¨?ίïö§{ˆ?Ñ’Ý63Õ®?À£ûÄg>¸?é«@±ç!7?‘h\©`@?çsʦ?ã*‚“»<?Õ&x>(ðV?èrMÒ Ín?ÑñÎf°?ä §¯o‚…?ãò*äò?íFG¿SÅi?å¤o“ è~?éуƒÁN?×¶±o;SŽ?àÿ[Ú=?ÂHá ÷Ø?á¼$¡â±Ó?»‡–i¤h?Á§kÇ[¶,?ë©&OU8ô?˜{Íy´n`?Öà üø?è$̼¸Ý?à3¼ýÿ¥?ꂊ6?Åò;B× ?Õú…µ°õZ?Õf( ŽÊ?ä ’[t?ë;j”`Ò?蹆fÿ?±rkžà¸?èï­M_g?äá(Öþ?åN„î´©î?ì^裹?K?ãTÓ˜p7Ð?ã#ÂòÔi†?èé4Ñq…ˆ?ÃŽWªÞ"€?äc9¸¿?ì3ÔÖ“½?Þ|ÉËéOl?æQ!¡’¤?âVD¹×?ê5à’§½>?Ý•Änö“X?á’V¿¾+?²EMÎ+p?ç_ç4üO?ë,NxÅœ?È‘™à³^¬?ìÎá,* ´?挪ÎLê•?ÝÍ»zHb?êwް#³­?ìÊ\1J_?ë¤ Ð²t ?ß0—ßš?ëö÷3!Ѓ?Óœ¨²‰l?ëøœ Øžê?Ø5çü¦?à†¸7˜?Ð3\šHc˜?³G†½Ox?åÔ³E U?ÅlMÄR~ ?àÔÝèú^?£Ø½³þð?×äI?Ô#é{¨ì$?ê ¾´¯i?ÅL¾ÈÊ$?Û1?S‹?Ö)¯ƒ+¸?çn1çTû~?àD&] Q?ëõ ñÚãº?äm%N£àß?Ò€x>8?ÅV,c¶ ,?‚½Ü Ñ0@?×Ö¸Þ-ô?àdïÛ -?åj‡­`ñM?è^ ɓܾ?ãª]ë²??¼|pÎD¬ ?äH$ïÑÍ?ãj\Vb]?Ó¾uö?¦0òøRf?çü"N…»?àulˆm×?Í••wd|?ê™ÁéàvÁ?¢‹ôb Ì?â(‚(W M?î} 8aNb?Ø@ŒæVz?ذúÀš²Â?Â./ÙÅ]ø?æú³4TÔ?ãÉ*†PM?äëºtu@?ìu§õ,í¹?ä2]ùF‚?çt7úU$?ÕíiÄ–Eb?ÞR¬6)h?ÝÃq`q<Ä?ÃF¡ã$(?œÅêM2ä?æ%ù‘‚ß?Ý3§ ¢Œ?ØRÔ¨:¢´?áRà@Ê&°?䵨™§^?íìøjn°?ì‹ Ý„˜?ïø¹•·~Ë?Úñ’‘4¤Ø?žR6Ÿe ?*ëð­ø ?äWæ@·¥?Ù3‘¤EÁä?ÝrK›¸?å'•÷p"Õ?Åí4=ZŒt?ënáTS€?æi=ÚĽã?ÂÆl"k°?æ*€>r½?âs Ú}q?Þ%¦TÌÄ?ãÌ1ħK?èõ}Ð]¿V?Ô8~NšAä?Ò¶!Ÿ V¦?°NQ;Ï0?Êç õØ ?ÙxP qp?êò×ðj?çŽ ‚ýªÀ?âXwœäA×?ÜÆl¡CÊ ?áú°|¹—N?¬þ{Üp?½ñ?PÿpX?Ô¶—/Lú?ádüêÐ ?ÝDµ¹/:Â?ÜÒèM'?ÎèýH¡?´.²"¬»?ßæF´b4?]]q c?ÑšýðìTD?å.)8üS?ÑA\úì±$?œ¦®ì0 @?£–-ã€?®shÿãñp?ášéʈ¤@?à3$Ëó†U?áŸ}]ö ƒ?ëo~?y:?é4¿V2-z?Ù­äQ¤}4?ĈüänP?ͰäC$ð?¤ Àð¤À?q8¬Mê?ÃáçÈ7#$?ÌYm“¤á´?³AÙ±fÎÈ?×8ø$T’?ÓÙÿ0Ó¥Š?ìy¯gi?í- ÃÑ?%?¸‰ªäˆ?å¬âªº»?Èån×|$?èyéSWw?ì^£¬ Å?ìQ§=7£?âACœ e?ê±ù³_˜?Å›P&˜²”áð$?ï:_íÒ^?Ø–êp?ÔjûuÞ×Ö?Íj.e÷D?ààé[àƒã?ã5ˆ6Š£^?é ‘ï¹õá?áâTA½?Ù‹`åïðþ?ÀÇ1øyìD?åÚMº¸U“?ì2[‚Õâ?í¡¹¯ ™á?‎t+ª?ï|ÔáºÐ?îÞ3rE†?ÍZ<þ €?¢XsqFå0?îm|/1Ä?Ân˜pCÉ„?êBTÛáE?â§r‰Vˆ?ÜÀ]T" ?äzÄ‚¦•h?ÙÕÜ…Ù­è?”NòœK¾?Ù · Ú?æ‘@kev?ïíq× ›ý?Óiîåƒ~2?ì$ ŸbÃ?æ Z×ÊX?âW‰´nÁ ?è>t­ËLÆ?ÊDG(«|?â‚h© ×?Ù¸Ò/þÐ?Ù›äÛÖ?ªÌDgÔ&ð?Λ“lÔ! ?ĽÅk]•?ÌA]}²e?Ç Œ—Ïd?àWSÔG?Ä6 *7Œ?™™]Š ?äüÕ›ñÙø?ÑV¸q–É ?Õ1s.’Z?Í¿’ñ$ì0?å&Ù&æÇÚ?г¡Û²™(?ºëç™]H?àþôçß?¸ž4DÚ¸?ÙXñè³f?éC/Ö%]ñ?Ú‡%8¸_¨?Ö2ûƒGü?éhÙBÕwÕ?ÒZNò ?è{·ñ_EW?è«ó°?݃»p­Yd?íì8 ß??ê]WRfS?î¦*!UNä?äàõ‹gí?ïðÅ=ÛR?BºSé£?áÍjÉ?ÒÅ¢4êš ?晦GŽÝ?àK*žv¼?æ.rí<¯?î± oW¹¢?Ú:?2j²?í˜MÅIÄÛ?î® t®é(?¸¿¶t1¨?ÚÆ² 'j?á2”Rt"b?ä+—UWe¾?뙚ó‘&?ä±¢“¨H‹?‡Äu7ö@?áA-IÖ÷Ù?žX¦{@?ì›ôâÅý+?Õà ÂY„?ߌå†kHê?ê‚r$Ál?¤q9 i ?ãté YDU?Õ€Švê¢?ä#!6¡3,?¶¡P­Ùlà?Úšr °¦?䌙`#Að?ãÍHŠÔÔ?àWÄaXÏ?ÓplOÖiþ?Ù¥yµàú?Â)!Y|?è¤Èf©ä5?À`–4ÂU?âC@(0=?Úkç\T¢?ŸwmXÝö@?ÑiÎÚÕ:?æ˜NAc”?Üt^“¢z?ì„m±L?Ù7ëãàGì?ï“NÒ£œ?è5+¢i?ä3®(Š?çWð ý½Á?âU¼‘ú®?Úo&(L?ÔÇÛäRÒ?ˆÕ!kk@?à¹Dê]›Í?æ£ rUWd?Þˆ ~ ŽV?ëld\O'?ÓðS2çÆ?×âñf\ˆ?ßhÅaTÝÒ?ßÍq¼Ð™î?ßµó¬F?íÚž½o¤?Î “SBï¸?èÁÔl«c?ßͰ×E&?Òôe|5én?¼èoâg?Ô0i^2ê?èü:έy?ïÖèÑ´­?ÖF3t¶.?ÖÌ"RèÂ?î¹êÈôÄ?c? Ên?å3›¹Â5?Ù©'#»œB?î¹ _9"?¨Lå¡¡sÀ?æFãKÖÞ‡?ÜWŠ¿„Ïv?ÒoÏ®b?ïÜx¾ÿ{?áî´H ½?Á§žfì?ÝyßÏ6Ï0?αDàUå8?׸µ=Iº?ì*)Ô™€Ø?ç)×É1 ·? ôË¢?Úºe•Škì?Äë/,Cd?âW&ô„f?íUPS!Â?âs#N“ ?ëèÛÜ?¢ó®É Ï@?Þ-M¹Ofð?Àôž0 ì?ט1•f«4?íÔ—Ü6î?Ôä£í`´:t?ÛâçìÚ?Õ@^/P?Üzû~ñÞT?é*Nw§®ä?ë´Ô¤üs.?æKHJSÙj?ÂC¥ ©‘\?Ùœ¹zd2z?ìÙ AÖjž?ã…ö}=ã\?âWæBð#Ø?ÏÍìí Ø?Ê‹ÁL­`?¼T|Âfp?Öy)u‘2?êÀÓ@}¿?®ßæîs}à?Î 4¤gX?Û§1 Uð?±<U:è?ã¢iF ˜Œ?§ðJ«Y@?Òmÿƒ| ê?è!œ;/êã?¿›ÉEÛØ?Ô¸Ž„ „.?Õö[jwXª?䱨|ù?àÿE`hõ?Ê•°Ûr?Ó|ä#¿Ž?êýÍ礊(?ç/ÎÏ©?íRðÀÁ »?‚OvÑ$?¸ÙðÊš)¸?ë>8²Ð\?ÏNCB+iP?ïJ®mr#é?åbwcÛ4ù?ÐË?²— $?Ä"ƒ–´D?èÀ–g0?ÛË´…:?ç‚”w“……?½œÿ3§?ëc r¿ö2?î7ðX ™?ÔBŒ¨‰Ö?ã‚TeC?â£O0û#m?î×°unд?ØÒ鉴ÜÐ?Ö§ti+Z?ï! ÕhË?ç[ =dˆW?함yÉ$Ê?Öw`vP–?ÅŸŸ Ý?èÿš¥H¾?Ó{ý,i4?ÆBnÁ*¶4?ÔÒBOí©€?íyr¹ç?ÔB&%4»b?›#¢=oÑà?æŠC ´?áKmû†ÄÊ?âÁ)fóï?ßK[NÞ¼?ÑΩ¦ž ?à™ï9»óæ?ì5ܤ…IK?ÚÞÁ‹v7’?ìÉ«ôïÉá?É=˜x¤˜?â …\ñª?Ö×B6>1‚?åë—ièþ?ê™Ô1¨ã;?âz8Žr?­àÿS€Ð?æEì&—*?әݸfŸŽ?ã#qÕI|—?åÿfŸ÷?Ýõwv§–&?±óþ¢4ö˜?æÑæ,·ÛÍ?ÔâÑ„P’?çØp±¦2m?Ü¢ÊîÀʤ?ÑH5ÌV°Ö?¥,×òë`?æîm.‡8c?Ç ªî§¤?Æ«ÇRÈ?ã’PÀð?Іø…¹“€?ê_>Šl£?ãL,“µc?½^.{ƒI ?›¤GÜ.Ð@?êoôŒ©¯[?t([Ÿ9c€?¥ù$Áq¬ð?¬ª/z"ù€?àmCH%YÁ?á—ß-ýí1?“ë«úBL ?âq MFU?׿±›ÊðÎ?¿5²Uñݰ?ÝV)iJ?Â[‰+¦V?éêäãÀì?Ú7¥»ÙĬ?éG†©3Á?ÜýŠP¢t?î8&ôA“Ÿ?ã|ö°úP?Óäÿ±Ò?ÓªM¶_rÞ?é_«ží?Ï(W½ÿò€?âxÛ"7¼Õ?ã*Ù¾•?Ó_xœ¿ ?è «Wª?Úi(ù¡ ´?¹Ë@}cap?ïÂÝ·ü?Ò…ƒ\ h?ÚO:î¡U?á )æè_?à h0?вÓài|?à­oèÙ¶?å­!-Ú¼í?âò]@vø#?â…X{fÙ¨?ÎïBÔ<«@?ˆiDßC?èŸí¸ R?ãŠ/cŒŽ?®ƒ6ï ®€?ÔwB‹u>?Ë‹Í'éá¤?Êh¾CÀ?äXø†ì? ¨Ð€î‘ ?àg˜u¤?èóâªw¸?ͦ÷¼ ¸?ëHF‰$x¯?Ω‰“Œ?á©×ÆÇ ?Õ–ûÂéÊl?åèã‹N³Ä?ßRŸàqÀ?ãÁ\ýa?à¥Tº«?ïYâ©Á=i?ï7u‘Ïb?ä@%Ñ`±Ï?ç½î F+?í.ÊE±i?ÜõÂyâ”?-"þv@?ž$, ?«#ú°\ô?ÐɃâ”´?èrÏe}ª.?éè,@˜»?Å¥«#h„Ì?禘 Ú ?ìyÈúÅn1?àê|o¦×?å!©Ò?Ôcð/ö¼?çPºD0Ð?Á‘½R{ôœ?ç$³®N?æ³uôk›±?¿¦ZBŠ`?ÞC-Ôè[ ?ÎÉê ÓÈ0?à·pvŽQ?èkŒëÕ1Ë?àp©2T ?ær‰¬>žë?å¾x™þ?åix­ç%´?ÊeiÂú…¨?ëÎh¶è“^?ßtEÀøÄf?Ö›´»á›¶?ãHÕEš#?ÖNŽê?é rμ†?®gYóÇš?ÙxUY×"P?´.ÈïðØ?½ì§®ªß8?êÒ»'`¦?äEaÝÖy?ïkìëç4?è±Ërðhã?à44ÍÉó?ÜÅÊOCoš?ÕB3•§Œ?¾ÏÑ^Y ˆ?è™ËR>T^?ËÊ»Te?Ü/<ýƒ,?ÝB£ß°?ÇÞ¶†™À€?îüé|‘ý'?Ú0äÎFôR?Ò.,S6f?ãX-hÆ?ë<®‘ì‰?âÝ>v¯\?ךp74:?è.]™²?·V6£H%X?à¾ÐW1?â H‡á:1?W0 4!Š?ÉßÙ"TÃÐ?íÖrØ öñ?íÁ``)Æ?çÑèwT¾?¶V@8"$€?ï³é4þ9µ?Ø€û ú~?ÝžTdI^¨?Û•éÉõÔô?Í=dAŠñd?éÁ~<é?×Ä3Ëùqê?ë°»©±â?È›qŽvÄ?ëdmè?­ˆýÔöî`?ßq⸠i ?äŒa£²?äO>÷ýg?à¶±ì”\È?ßc¢eYÎà?îXéÈ+Ð?ách\¨ë?Ì<¦H¾–|?×ÏI•.I?ÑBf^|Ô(?Ëýt>|?ìëõáG±9?ã £y fü?êÚ bEµü?Ë+èÏŒk@?ÌR±w…h?ë£bÂt?ºDþ¹îP?æOIO<¯ý?Ù!ò¦èâ?àÑYÏÔ?çÍ`¡—®?ï2ײvˆ?î·V-+?ãUGV{?µzTÞâf ?À—Õb‹à?±”ÖYÍð?ë¡Ë*tït?íz›Ó0-?îaA+³é?ì €d J?À.Àë*L?®Q"/Âp?æF*Ÿ4?Ý~ˆÇž?ÆT•AêT?ε5kYÔ(?èx’‰ÃG?½ì6› ?ÊÞ%^TI,?ìÄÂŒ±Ò?Ðã{Å-ìÔ?Ü4c ˆ?ÈÎ(ÏeH?ã{/¹ó`Ã?ç¨k÷y?äQǼÑÐ~?Þ™¨ ^ãL?³§ù*³?êèéºV?æÂ•’ÿ£?ãfL1‰r?ê|%“MÝm?ꔜ)îÆ?áj"Ÿ©?èÜaôG%?Ñ‹IPÅ߀?¨â’êà?èJù€YI?ê²ÕÞô?Ú-:_Ó]?ÛZÌàsX?âå• ‘¢?äZ;ÙÁ?ËÈL¤ï,?ÑÐ`9™&?àåÕ¯ìT?Þï¹€†hÐ?µ¿ET}˜?å rïéʵ?àaé‚w®?ÓÁËë- ?ÞÑÁ§¦Ep?ÔsPKíµ6?Ðõv@‘Ä?Þª’ 4‘2?«7Âb[p@?ïà¦oùS?Ò¬y¸÷4?æsé"x «?¨C\)ª§à?Û77óu‘¬?×ý?/Ùà?î<#ŠÙß9?µªØ` o?É2lB/T?è6…W,ød?ípqqxüÂ?ÛÝZï€?ì8±°zZ?Üù‚:ÄZ?ÓߖØ?ïT´2ãë?âÎ6+:u?ïËGèRÕ?帕âÖÌ?á±48?á’± tãÊ?éåˆlÜmÞ?êÏ ¾$›¼?Ñv•5ŽX?á*ÞÙáBv?å5-;¹äï?ä肨,¨»?Å7æ;d?° †6žè?â#+z;•?Ò÷¤-f®?¶\ ÐÓeH?èMï­ë‡z?嶈ËÙïÕ?Ôí|'‹ò?åÏWmg €?ßÒr÷ö–?ØeÀ !Ì?À¿@Ñ@. ?æ3ê“Qz?Âð¿Gb/?âƒÙù·Â?áµ1ÕR!ó?Â*GÊ—zü?Ìá—8E¥$?èØlV%n?ëàøº!ù0?é˜]'q?µDÌ$6;ˆ?ÐÖÑ<î{F?í\Vôš@?ìM·é%@?àØêrEaj?á–Ë q‘w?ß )m.ß ?ãìV+Aús?q(Êò‰U?ß@2ÞÈ?ëLœ§È&È?ë­/`æåB?íR ¿—?æÀ *—Û¥?ê0u«@ö!? û‹òæ2ð?ºº5ÕÊ ?ê3×)/¶Ê?é×ÖW×Ý¥?Ö_,MР?ìsü—% o?è7´ÒP?è|¦Nç†È?íý½©Zt/?è²j®ŒÆ–?ÚHç8à?éŸìs”>?îD›\ºzƒ?îBÉÁ`EÔ?æHvŠÕ?âÄJõeÕy?ì‡ð˜nx+?ÆçäeË|8?åÇ€¬ÐR>?ì·Ûf‹V?ïã"ÏMÝ?ÜþÐŒ Èd?íÖsÏ9?ÝÆ|´ñ%6?ÙEŠtÈ?ÜMÀGâ›r?±žAù"è?Ìzæ üb\?ÍMœÃ'0?¤£Í/„8?àÒèØ3y1?ëJ`‡·X&?ÔÝìXÉÚ2?Ѽ*¾CSÒ?êØûý|ã?ϣËœ?Æi™–Â?ít›ºBš1?7`cSç?Öº”¹|Ê?Ò$6Òì?ÜF’¹ Ë¢?Îe2‘O“?Û$ØsG?ëizùi#?ßSœ|:Ð?år:^‰¸?äw‡g?åãcp?åRTÂñÑ?áåÞ,¥o+?îyÁa…ùÂ?èá^°0­?êLGH’’?Û¼ý!ë±^?í1”ÖBtõ?ëµf¨c$E?ÞÅ!Úp?†ªmjƒ?èk) ƒ,?èê‡*=?îß¡‘Ÿ¡(?ãÂSü•h?Ϊ Yš%`?Çã„(hp?Ã×_ùG[?í!Ž YÝ?ĸÞF‰q8?ì°ýœ‡Ý²?Å0†ä_H?íñòS’]?äXöLS,?Êq¥‘)öD?ÜÞ9]‚‹X?Å~ÒäXf`?åïhté®C?êàÀÑ‚Ìn?îîÁíê¿?ÓµŠF‘}¾?Ø{™`'ŠŒ?ç‹t;ç\þ?íWÛÀöýh?áL:÷ʆš?¶'žm|Lp?î‡v=rõ$?Ï0W±Bö¼?Ú¡ãÖþ¶˜?ïèöé’wÏ?ç4 ¡ÈL?ÕËŒVï„?íUM%è=V?Ç©Â=nè?Ìû;7˜?ï×ôLÞ7q?ãÎØeÂQî?ä® ºÛs?Åú+xæ ’vt?ã\Rú¶ñÎ?á]khnb?râ¾=s'€?ÏL›þ—t?ÁÁò[)˜?Ùç]ÈÛ¾?étBãyHå?ÉŒGÌ €?îÊ4C[X~?œ›œ#­ ?á=–½ëŒó?ÆKÎô\ìÀ?çi‹IS(“?ȃ…nxT?Ëõ¡×¨Œ?Ûb:í%«B?Óa¬ï]4?ßb*1Hݦ?åIã ¢›3?ít–’7`?×ÝÁ:© †?ÜPâè2?éÞÌ2ÜÙ?åä;ûE2ð?Õ¨‰1hì?ÁÌë]t?ë^ÜÅ&I~?äN _œ¦?éPíɹ†?äA_Ï’?èEÓ'‚ ?ÏæV²*z?ÓŽ«º?ÚPå­ "ò?ßþ‡Ü6?á¥RŠ7?Áˆî1Ï ,?Ù-Ô±èÔ€?Ù?–3[ˆÜ?ããæ ú?»QŒÕ3 ?Ì‹Ÿ^%C@?“ q ñ»À?ÕåFV¨¶?ß®àÛmï ?ÎÍ`?ëø§ùǪ?²9M¦Ê ?ØÙÖÂÈ?Ð*éäé4ü?ë5a´ÞÙ?²® º4m ?êD<ßqÿ?ÓÇ’£x?Ó`!u£ÙÀ?à*œùAÆ?ÒÌÅ EdÀ?ÏÚß?| p?èçw^+?ÓÃÇ*?á ÿ ¼?ï¿ñÙý„ ?ìÈM܇¯?Ý·É^ö?í.”Ó;?á k´D?ào·šë\?éÒ þ‡Ï€?æÔÛQ>u?ê Õdî(?ð2)™9Ü?çÛ¯žÛ+?ëµÂüoÈ?Ú«Höd?à°¼Ú|€&?ÓsRAó`:?­‘‡ÿ9ð?Ê׫´Bè(?¼+ H®“¨?Y$[3åâ?áRV˜7×?ê^ç<¥?Þø Õú•ò?àË€¹‘Å?é7!М?ØyúŠx?èœeáYè?ä·?áÕ—µ7?çFÆ Y½­?ÀŸÍ?Áˆ1GBïô?í¸šNL??ê_‡ãþá?Õ5ÌÿÝ%\?Èã½ H¨\?²K•  ?Ê9qᬠ?í½eÜš4?¡ñ,ÚèÐ?é<ÞÙ)­š?ë’µ@´z?·‚{Ý&F?½é)ÅɽÐ?ãßʹ9çk?â…ÁÝ6á?™‹OÿÏ@?âM¶§(e?Ð3Ý>5‚?¯]îN¶µ€?ÁÒYr<¸?Ø÷88Ûí0?ïý¶}Eó?ÝЉ?Qv?ì* '?j ?Û=5Ø×b?Ù˜™.º¨?§„»æTÀ?Ý0ÜrfÔ?ãÞL$fÂþ?æ”ÇLå\n?â 8ßé³?ÇLCÈ=0?ã.ú4,hR?«›ã¹±áP?ÛúHëÒ¸j?Ü_MŽvºà?ë˜L«m!4?×AµðǶ?í 2<¿·§?í6ÁËô ?ß\|dZåÁé°?èlP–wä?à`:t?à'õWTòÄ?—>s©Ÿà?îäÄmˆHÈ?ÅŽXîä…à?Иœ?™*?ÞrÿdÖî2?ïû¯+ôÇ?íOÐ_M>?Òî¯ÐS?Ú8,3¿¬ä?Ù/ÏónŽ?ë#oKkd?âI'x}Ñl?Ñû|W„ Žš4?ÊFWRG®ð?ÆèɤF«¼?äG¥xš ?êw{ÁOá›?ã%íÜu²?äçu \?È$€D]¨?™ŸW–ŒBÀ?â¥}©òlq?è@¥gè?±"–£ï=À?ê,;–¶ø?׺‹ݬ¸?Õ@†uP¹H?´érÛ?éòûçžôz?ëþ]ã?ï­¨GÆv?ÙMÌßÎ?ÞÙxa/F?èqµe46ô?ådwkêì?à°µv ?ëä.«ÅÊM?èXL×xkí?Þ€y’ ˜l?æ„Æœ)mŠ?îˆþq•äØ?ÌÑ‘{´.0?Ú«*ŸŠ?À®ÝÖh´?²óü¬D÷?ÔÒv^:&?Ôj°ëTRš?ãFñ­Òj?àhå€é”?àmÌnºçÓ?ìm_äép®?ä‘úšh@?ãß„Á˜?îcéÜåëš?×˼Û½,?î¾è&7?È.êoŠäT?ãW”<(Z?êñ¤Ë¯,ó?ÖV˜÷ÏH¾?Е;$2ÖÐ?Çc`iê€?§óþ2 ?äÖbÅök‘?åwC>jõí?¯êÁP4 ?ãw€‰¦?Ý{zÓL?áÙËÞ«eˆ?âÜàf½£O?ç/?åûÓ_nm?ìóÞ_‘?àH?Pçð?Ø*ïóF‹à?ÌWƒf‘ä?ëFá.ãÝü?áÎjÍQÐn?ä&ᲊ?꜅׼i÷?¹D÷ ñ`è?ä¡ü} ‹?ÔBÃ⎴?îý“ÃúR?Âm`z €?áeŸ£#Â?ì½!°¤Q[?Û½«|~?溾s•­?ëSð”#qn?ïºÓ¹ý>?áµ²;‡?ê…î[×u?ãóé3ìò”?é'µd £«?ê „BŠM?ç¥Û¯†‰?Ô"0¬f°?àÕlL‹xRDEÜ?뎧 ŸIj?èaמw¹?î=K 7w?ÑB¨ÿPö?ßËUE‹OB?ëÛR²ê„£?ï —›±Z?ᡘ¸&O9?ÒyõnµÀ?áÇ|Í»?È×K‹ú@?º6Â…rà?ß‘wC¬œ?àûÑûrõÉ?Þ¿¸Z$Ì?¥ÕR‘Vkp?픳>ü?ìØïÛûóÛ?뛾Qûƒ?UH..?æS›f‰À/?ß“6(\d¨?Óo¤;ñep?¾4+9s¤8?ãн¿”ò?¥@o®á­°?æL˜”¼K$?›f7îè`?ÔÙˆ‹?Û‰‹û9?æ³²ŸÏ.\?à÷Ä +†Š?Æ[ ¬A`?Þ’´°\º?ÛãTñ¨R?îöîÓW³+?ÜR±Waa’?âJÐÔ—‹¶?ß•ôäøÞ?Ù%“‚o+†?é®BiÀÊ&?⬽nº»?Ù4a)³þ?äì'?åm£c×Û?ïídþ('N?ÖÎÆ$ ]º?ÚwAÿBT?ᨯùý?è5 Ò‰8Ê?ÞUþ?îÚðuÒ›}?Ó†âÞ)O?±x‘ñ2—€?´#êÜþo?îÃ2.ø¾?ßWÖæh?Ñ¿°Cˆø?áwérC]?ç4Ûãšü?ÏǺ¯ò”?ÊÒg‰¡€?î ìäÖÏ?è@~ýZÁ ?ÑàôSér?Þó¿1+˜>?êzÆ!ª•ý?Ó»nUb`h?ìiŒgÜÛ?èR¢·IEc?¿ÕªxUâ°?ìü‚îüÊn?ȶ¼™Œ?Ù`K˜°M˜?ØúŠB§rD?Ýãõs/Ùò?êB NË|?ã!9~Å?ßúJ<íJ ?ìÍÄýÍT°?ê’£]„<û?è- «&?Äq.ºÜ?êK”lÓc?ËÕ¢Zˆô?À®[M> ?صlAâ¤?è.:ri¹å?éÏØ"ZÛÁ?¡&ˆŠîõà?îKCHé?ÊÀçE–Ä?á0LðÕÈb?Þ|ÚÑ H?çMU¤ˆ*?îÜg|_{Å?ÕWOïoˆ?Ú¯û9“u®?ÇÌNs6ø?Õ§cåq8L?ÑUnÍ Ú˜?Ô[zú> ?â »–íy?ì²… $&?Õ)ĵ–ëT?ÞÂð½àð?ئb/¹r2?à1–(û¶?Útçeº?ãªÌÀ.R?Óæ3TÄš?먋ËÂZ.?ét0'f?ÇsS ¬?âëQíUd’?ÕJ˜Ì~?æ½ø·'b?éZJH?3]?ÇÛoÖßX?¨àOl?ÛàC,qP?íYNèj(Ø?âû¯‡ÚD¶?å)þ&R¯?ë8ßjT?ãò’Ë·?ËàV¼Þˆð?Ôoc{]º&?Ð %þV€D?äµW_Ê$x?Ýúo˜@6?ÙÇ‹ßM†?ãAgp[©Ó?èUûÕ¢N?ÞL40˜&?µ ³Â ?™…ݲx`?Ð5üÛ Î?ån…ó.ZÀ?É¡éQü?Ó—*X?¼=ëÌ‹ø?Øb@r2\ª?ç*evq?¸ÕɵÈB°?¾½_l8?ãºPuDM*?éÜ>yE¤/?ä´èæK~?×ù(‹ð²?æˆÚm&)9?îÿEú?Ùª»ª”.?çj}ÙFkÊ?Ò€ôÁð?êAØkYÙd?×#¶ z)˜?â e…¸yî?ï1RInÏ?×Àþúo‚R?ÊR‰d\¼ì?dö¡HÍ?à×I]â€Ø?᪠Å2õ?äEQXG c?ݸô †£ð?åÜw\ùv ?âó±Í<Ȥ?ãÈè½…ê?Í<§ðóQÈ?Á!ßXX8?ç{ݬxµ?æÙe³»ú_?â1í;(]S?ÏÜ´’O™ä?ë`šâZQ—?èóÑ i?Øi@›Ò\?ÆF¼¿¾i,?ÝvUt[€z?æg‡ ýÐÇ?ÃE€þc5˜?ÁI”Ç• ˜?Üd¤•[ˆÌ?Ç¿eCëH?ÝD •1‚f?ád‚+Mƒ®?ïç¾Ê Óµ?˸‹v™1ì?å½ÙÌ(E?íãBÚ™Ì:?À}Ž<› à?¹Co¢ð?íŒü˜½ü?¿óòÒ˜?íÃ+;Õá[?“ ÑÒN€?¨OQt“@?Ò~ä|OtJ?ß௽¶&¨?ïnüÿOš?ï àÿ –,?µ¦¨¦\ €?ÒDª¦Ê?ÅÒQÒÀ¨?Ѳïðä´?åÞ¸‘rÉ?í£þ¿ò¼Ê?çà9Õüê?ÙêÂ$ò‹?åEרâ?äŲ·b ?âÓp¶ö2?ì\Pi§t?ÌïZáE„?í- ¢ Ò°?æ—óÃY?æÁw'­.?ßo£DÁ?äÀ}7^W?áÂc€?êˆ] sŠø?âp5ðÉ?åÍ úß:"?Ð#\ !Ýj?ËÅ':”6ü?â˜,åw?£T²¬Ü1ð?äæ›zG?¬ öÚ½ ?ç³Â@Ðv?î O³¨-?ç u7‡b?êÿY¨Uo?èù*ßn(??Òœ:×ø‹È?Óñͤ»?èmøM¼º?íB–”ç^×?â(žã}q?èZš^µ6£?è_·È–ç?{£hz™?è>‚.¯Ë?ìxu€ˆ?ç÷èÀ_®t?Ó‰ê‡øà?è%öZu’?×ÈS)†e?ÁuÒ2ìfS2?å bÿo!?è—f_õ?È $sn@?éÛJû§³?´”#bD €?áüYî2m¦?åjCTZ8®?à%¤E©xç?¼øÕÀ×Ñ@?Ò¿ïÉŒ?Á0’dÝúì?éCɾ+FÐ?Û“öÀl1?è+Á¢àž(?|hfœ/?Õ*å½E`Ü?â¢Ñä±?p?ÔÊÊã®ÇÐ?Ýrï¬Æª?µu(±ª…ð?ãØçð¶5?ÛÕ€ œ§>?Ü×`DÕ¶?Ü‘l b?¦ä¿_  ?çÕ{›0?ã{ñzŸáý?ÀÐÓlï ?Ý^Õlynˆ?ëC7#¨R?ä+.vÚ¥X?êBÙÃ'?èkÓÊoÓ ?ê ­šÿìK?ã·l’ö?Êmœb,È?Ú‰z€Ö?ìU³_Æfý?ÆgÁ¸U!T?ãF¿ùÚG?åt:@CK?çÎeÝΚ?ÇJË)ÜÀ?á*˜ÆË*P?åú:º¶õ^?Ìuü×?æGµ±Ó„?áø0³Ë;?Å/Fi¨€?æóh¤ Ù?Ü*èÜ:V?ÉkTpõ}`?Ær95+ˆ?á©/R ÖÒ?ï§ÑŒù†°?¾8ôð?Ò²Qå?Ѱ<ÌAˆ?áñà¿åç?ÅäiÖ+Ü?ïQóg}W?íf`&y  ?âz¦JÏð?Ä—ØÐˆ˜x?éÿ?½?§˜ÍK¸?Ëk½,?ÙÍ×–à?Ý3MDc|ð?hd#Åœõ?²@àÄ‚Zè?è‡Uó=?ì%ƒi¬?á)ÂjÓAk?çŽæË?Õê¾+Ú ?Ý4wô·Ö?âgâc.2?Åî²U ø?†>häó ?éì•¢UlS?„¾—`)Ÿ€?Ö§)Ì€C$?ÎÍQØ´áä?ÝžQ¥:"?â႟NŽmi?ää뺩©?ÒRð7;^b?çï„ûˆ~Ê?ÊfSZ ?æ?É 3?ìåÝ='Ð/?Ø—DI[ˆ ?ãÞ.xÕþ?Â%~ÿ¦mø?âÍ6}Rk?飯«ÐTT?ꨪ,²??ÝñÓÎ?°?•-Ö²à?ìh®ÓKE?ÚË¡-“ü?âü(C¹?ÔXàWCš?ÊL~lëœè?Ûxý "#?è>™›„7*?Þ5³j'ú?êÂh_^ß?Ñn2l;¨–?塾oJö?ÈÆN£D—,?Ø™ön¯P?àUÐð1áÜ?·ã·$ÓÞ8?Ä ‰êôì?Ý…0NžÁ6?Òý1@f0?Õ‹ÏÁKœ?ï«›ç3`?Ü›j†` ?½ÖX”¶?ãÁçbsÿÓ?íæ)ŽFœ?俤HiÉ?ÜÚ¿ óT?çcÖhú†?Á[P‹•˜?ßÍ&èq”?ܲ9Qà?Öý3LN²?Òf„‘”«J?ÐjJF ä?èÒUÉ£¹P?ê;˜?ä&›åÉn?ØÐ>Š!Æ?ê’–D(?æë¸ö)ÐÛ?âKì‚Hn?ÅšÔ@ ظ?Õƒ†„œ?â(Co“-Ë?´=»oH—¨?çN‡^/tÑ?æÛÔtwh ?àüeÊ?ä{ U@­?‘i}uýà?Ýö¬Þ°¼¼?ãMÚÐ?²ã̤r?É ÏÊJ„?Ù`àÙÉl?Þ€ZP?ÅMºå!?Þsœ{ù,?àdz N?í;Yõ$?죦$ó?æíœtÅê ?ë« DQÒ?ë@v¯Úe?ç@¹É‹‚Â?Õ6PÜá"?ì^8±¦.?ê³oQäŒ?Ò:-½,Èb?ë,¶@ ?¿ 4ûi`?è°})‹‡à?æ"ºÑ@Á?èMâhêiS?éùæ'hˆ?ìÆ2~Î?ªmY Þ°?ײn£&°?í´—óšÓ•?âÄÑ&@ÿ†?çѱ1`k?à¾-r—ý?èöëÈÚúµ?ã½ôZì?–¢}lHz ?ÛÛj¶1Ò?Ö”ò ¥‚?Ñ Vëî4?ï©WÔ>p?é[Ï<¤K?êÊ÷3·f?Öï(Gz8?éÛÝu¢ïÓ?×Qëê?áX!“ ¬ý?ÏÑ»GtŒ?¼èü£vð?¹4 Z§ ˜?½âÓ¯»ò°?r¹L?Ðún»±ƒ?áCp)#.?ÝkÔG›¯ü?sÔ$R7À?ש¼1"”`?ßjÞWàaþ?ïN#U ?åy·H_ù?ÑW\¨Ù?ÖD›&ÿ²?â¡«Á·õ©?éx†úF@ô?ⶪ $±?¡(-x'SÐ?è‰é±$Œ?ì4©m¡!F?æŠ'g¹Ý?îÔ G×?å$º[3pî?ìwH]ï]?ட7[êe?Õ€$Ó»±b?¾ú›‚)€?åä­Öâ!?ãÝ B¬?ÔJ înM?ÑØ€1ë¬P?† G¹…?àÄ*O@ ?À+$e|¥è?é·˾M÷?îÏ<ʽޣ?²:vrˆ?èÐ$ ÅIÞ?ΦÃ' ô¤?ÙùsOÚx?ÒÚ%úBf?ÑL]±¢¶?ì¤>±¢ü?ÕVSÑoƒö?ÅŽárð±T?Ú ¢J=?ÙØi·t ?Ó-´R¢á8?×7P¿Èf?䬰.öÖ?µ*Ï Úx?뾯á>?縫ו,?àèyå¡6?ÉÜàö„¡0?Ü“ñ‘T£t?×¹¦ë0~n?çz•?Ù+t£«®?Ô‹7*x?êX}°ËL?º±¨ÀÉàÀ?ìFKE Ä?ÆQ9d ?ºÏqÀnp?Ð(c¼#˜r?í°÷™Ð·?Þ­¨âi\æ?á®äùȈ?ÃËi¾E˜?ía”A«?èqð~~6?Àg8„#°?Û¥»â<½Ú?á8^}÷¬Ò?åÔ×ùK?æòBŽ˜Át?é'¯ïTÜ?“šÐN×T?éù£·1¡?êóNг?ÜSkpW ,?îyæaO·?ïP)Û¬Û˜?¤Òz¸“°?äòwçÃ?ÒM G˜þ?îÄ{er?ÐO çîHä?áyôùs„?ÛÔ'´jÚ¨?ßc% Ð~?ê•wBxÒ?Ô'ç[t ?¯4°©é^`?ßÐ=hiQ¶?² Ö=š0?ïDQ±?ãÑjè8J‹?¦|ßÝ5tp?é шÖ?æµ¹Kàk9?ØÍ¢ª3Áò?Àq¼ñ2šô?°D¦¼}̘?¤¿ÛØð?ÒK”l§c’?ÔJUøÁh?àþ7²ßÔ¼?á68ÀÕJ?ç-­†¬ƒ?îÒ®ê‚Ø?ÅcßYK Œ?è6I\÷Œ?äÏ ²­¡,?ÐvÊxÀX?βM}R@?émÕ g©ü?Ó%ÎZÚL?Ù×ÄO*ýd?è/˜wçö?½'z„¾þÀ?{ >Þ€?Æ[Íøž¼´?á¡=2s^g?è½7T3?ÞwòÕÛÒ?äìš±t…&?ÚOOOŸì?ØÑ‹û<?Ρ\:vet?é¯ÕÜPÚ?äઙ™?Æ&fI1¬?Þ3ܾGº?çÓ…zí>?í€ Šæà?áÈ;²*Ð?®DH=,¤0?Ìèð@à?Ðòzal?Â\„\ì?å±¢ôNÞÉ?¡#kØ[“?äl÷!^È–?ì–:½3Û?Ñ2R-Q?ãaŽQC†?±Ÿ{ËQà8?¯yÌYÿZ@?í—ªâ¥zô?ã{ôf³ÿ?è£Þ^O?ØüGÍLS?é Õh ?î1T4krÔ?׿¹a'd?ï€/æåµ?ÜÙþ§kv?ν!í el?íñT» ¨e?ïõ*7ÌÕ’?ÒÐgŽ?Ðm|à&ê¬?ìflÑ_ ¦?¤Zc„<à?ÌÞç ¶R?Óýïüdf?ÕÎRÒŠ4?ï ÔØ[+o?­n HÛ€?âÒw™!À?ê„mròŠ?׃¦Á‚k?Ü×UhZ?Ü躣²¤†?qA?âõÍvnŠ!?ÛÊ þRŠ?é¾ê¯›Û^?ÐûÍæ?æñšÅîÇ?ÆÔdøãT?ß"Àg¹än?äî.™T?ìuº 3 ´?ãB ‰£@?á! ѯÓ?´Dî•Ï?äí‰òÕ?ïø|½433?ê%ÛV!#B?ç}¾Ñ»4Y?á–OAŠIÚ?ˆŒC0 €?§SGýÍ ð?Ór˜vº(?Þèw·Êû¨?Öå ü8?Äm4ž*¤?Ó¡‘Oh€Æ?ØŠÊÇÎö?ëÛP‰²a©?æØn!#”!?Ö Û[C£@?ãt0œd< ?ÖA}¶Îü?ï¬ NÈ+Ù?؇Í?ãµT?æÕ–2ˆûÿ?íìò¿‹?íãÿâéd?­¶²ª0?æ¤\J½?ÖÝ[ùY+~?ê†d8Qõé?ÞF1S%²?ä[!ÁÔ·b?× ¤j8·â?ç’: P™?³B¤h[?µdÓì¿W(?º» éîÔ?î·oæØŸT?ç:ÅÔÚâ²?àäÍb>‘?âcó¢ èÄ?±oãîÄp?ê΀Ò@i?á(/ iŒ¤?åú0ç´«¶?×@€?Õ$±>ãt’?ìª(‘j?íÙ”¸N£?Énh¼2ì?›ðå"Ø€?éˆlQ‚èx?ëžE8ÓÝR?Ùê·£³4?ÊYÕ_;¸?Þw¢™³U¬?çÅ#DdY?æ÷ &„?³{UXñ2@?äà‡.æ?éµ°t®^?älKQÛ^?Ù)E¨Õ÷^?êz?½@‚?èyÂVû!P?îÎ@‰Någ?Ö¸´‚šÜÖ?è,]ÖŠ )?éæGÛ 0ë?ä\òŒ=}?ÂÍÍVnKð?ÁæÄ’+¼?Ê&'ºƒÀ(?ï(1ù|?Ö=;©î’?¥b4€´( ?è_’‰dI?ëåªñ¢?ß½ú{Nô¼?ï·Žx"ò?æAÓT%?è·Â¶´~?i©Ôœió?ê…ÇîØ?Ò¼¬|`) ?áJ¦ý?àíJCÆL?æïö£š?âë{\~[D?âвhÅ,?ìÄÏRkõt?è¹ÉK÷AÄ?í”%Ïý“R?¬MOhv°?æön*Ø_"?Ø@†4&Ú?˩նq˜?Þõ*Oà°?à’l³fE?ë‘«UF?ÒÕ&X?뢢…_íR?Õ³ypú‚À?ìAÃæôÆE?Âp‘ U°?ì¼8é–ÚÛ?æ©íˆÁPN?Ôàr€¯´?æïßgI?Á“@aÆô?åõ¾NÅ?¶Rʳâ2ø?Ìø³ì?Þ{?W—VD?äS#³Ö©?ÁMêJù×À?ä[húcÏ?Ù+R €B?î?W©|?£Ë2Pžp?á”·„€K0?Ë_?½{Ø?³îÓK?Ñ*=ÅþVà?ˬo€U€?ØÏæ1d>Ð?ïÿ¢uì}?Ùb¹ ‡°€?¬d”¿ËÀ?åYÃliaÞ?²ÖÙû b?êîÖühŸ?ì£æ³F?âû.ÌŸõò?í:5tâV¡?äÜÖVõ{5?´³yþ‚€?É›äiqÕœ?äÖ¤™ÆÄ?ï©t œ%?ìÿiƒŸ‰X?åú#DÌGÀ?µéÍÊ•¼ø?Ë>Ú™ˆ¬?ÕE¿f›çb?ÌîKðÁO`?ì[6?×à?äÙ¾Aºÿ‹?ï†i·U[V?á8)Ÿ9a?ïtR~¯Œ`?ä$l(ÞÃ?ìãéå6d¾?훳/„øV?Ø*¡ ]|Œ?裭«?à ?½š D )?ÒÈ3‚Ý2?íA´VÌöÔ?³ڦÂì8?äXšŠvP?? ÃÍŒóýÀ?ÏP²Œ)£\?È_z? @?Þ"ø0Ax@?ëdázˆöâ?~]¬ dí€?ìIƒמ|?ì­-÷³.?§iŽ‘/wp?¨Jƒ¾ ?è\zʦÒ?Ñë`84¶ª?è¾|ýµQÍ?»z7z€;è?ÄgÏ"€‘ü?äDû{{?â¤+oz0j?Õ ¡tdF?ì† Bh:?Ï×9MÞœ?íúbýÕߤ?í0ÈíŽk?¹ˆM)‹û`?Þ‚ÆäýOî?à'Åëd!Ë?³D|RCá˜?ë7[w.æ•?Â]ŒEõL?ÕT!… q?äÞ=T«?Ѥ…¼Î?íÞ4nÙìÙ?Édé6ÙªD?ï+†Ü©©­?Ж`é‡N¦?Øà º× ?ë²Ät:38?ÑIö—i1 ?á¸sËß9ú?ÛêHvÝÂ?çsæ@Î?ëŸ S‹SÛ?ãøý梵„?î²QÙdòE?ÁD‘ª@?À°l‘q”?î¾Lžšu?Ü ¥[&)^?í{ü;³^?àQ{zèÿ?ì/‰Æƒ·Á?æ«/<¥(?ʧØ6ÖS(?ÅHtD?Ù"íÔ±Ô?¶ÏÕ¥äÑà?çGÐvI?è<áQú›²?ç pYc?èæë(d^à?Ú¸íÊ6J?ëË~µ]L?{y\ùs7?´ÓYM¹ÞÈ?ä„É\¹¦?ÍôúW‡ž€?ê™e•Ê»«?Ëo©— ?ÁÊÀ" ©?ì»ñÜgˆ\?æ 1‡ª?á(ÏžE‡]?æS„Rs<0?ïµÎd?§B¥Ú`Yp?¤cÕÒ>^ ?Ñ”Ajl.Z?ìÖH‹=?ߌ‰»¨Þ’?²5G·,ø?à…RC9€ž?à’ED gm?º$ÿ©Iû ?ä«à£ÄÞR?æF5¨À$ß?㊎/‡fê?ã)Ðê––ü?ÁR¤!“E"ø?ž;÷Þàº`?ç4ã-wL?ÀiÙÑú‚Ÿ1n?í¶?$g”b?ìêÏ9µp÷?ìl&öÊø¬?Ð9‡Ëœþ?æ1ìῤ?Ùºé-º?–Å\­î ?× `å­ì?䯧@Òø?ßâ³ð‡¼T?ß–ÕÏkÝ?ëϾ Â?±„2hÚÈè?ï=3-K~.?å»T»*#Ê?ï¼&¸ "É?ÑkÛƒ?䌈Å)Û?Ïê`˜å?À" n‚T?ãÆ?¸À¯?¸ðû­3-P?회@u?ì{Ìó²Ý?í`^Ú7qá?ë‰þ_D ?â—7#Ã|¼?Ôð¬vRùº?Ün}% ¤?í'Ÿ­+ôK?ÇÐìt„?ݵBRW ?ÏºŠ d?­÷a]ÌÙ ?¥ ã—Ó`?é)Õ$ªíP?Û ‹ ö‡ö?ía? ¥‡?ã\Rðd?ÝÝ{ŒÜhà?çʉž`S?Ò;SåÜÄr?ê+H´Ž?Óé¨Üßø?ÙâpmÖT?ãËD§Ä0U?æ›_aϘ?áýêÙ("?Ê9j¿Ž[D?åÉæ‰z#”?ê“aKËp?ËG6âìƒè?­Ob£$²À?ê -Éü"?åa@+}í?êèk"@?sš,1ô?±³9Y¸*X?àà¾fþò?ÀÜGáh?ÚâÙjÍ´(?炯£Kô?à$Â9&±?ÅH±8?ÒæxL'?ì’KÆŠu?䣴pr>L?âùh̵?®üäÝ À?ãé Ô‘ÙŸ?×§-Â&L²?Ú(=:~κ?Ø iœ¨?êls4i‡k?ߺ‚TJ:?ß‘À À™"?èDBbjÂm?äµìyÅ[G?©J!ÅwÀ?„ Ü 0?éÑƆòØ?Ÿ’_&À?¥ô.2`¤ ?’{Ê_þ ?ÐêM\º?ï \'Å'ã?åÛÁw(š?¢¢®õ?ëˆ\n—ò?ÐàdÅÆæä?éì5ÝD4?ém‚| ß?ÜtPÞ’?ìùRÚç?¢q@Ja1Ð?ß‚5æÖ ?äÑ-¼!ÃO?È—5’Åð?ìƒÑW¡@ú?ÒJM4Ψ&?ì03kìžã?²âP–ïø?æ¼J‡Q(?á›Ò;×·³?ÚÓ[ɰ?è5s»Ð®Ø?è´­ A¤‡?ë¿*$R1—?ˤâøÍ×´?â`šFºØì?éÖ–æŸGÿ?ÖGÕ¹û–š?ëºÑ=ˆ•?¿? ,µk@?ÚŠ‹˜žÎ2?ÚÆAÞž¾*?×KäU¨?Ø|ƒÓm‡,?áS´Þ¸Ê´? ¡8Ð(öÐ?ÚaXîHö?Ð$hì¯ >?åuV#EŽÜ?âóß8ûz”?ÏëçBÔ;t?§’1lz?¶à*NçÈè?áp‡îû”T?ÇoŒºž&œ?àÇ`uÁ&?Ž$'Ì?äõ“ˆ«ß?T–pP^?èü!GUÐ?ç]»-?Ïdi…•`?íÚ{?~Åð?²ˆ7‰0(€?ÄLTmå"¼?ã“ÐL!‹Ù?Ù›zÑm?ʱ4*/½?Òõd›(?Òo•¹ÐPÌ?ĤTF?ä×€Ø5}?Õ™Ícg n?Ów?É!¶?ä,Î?ÚYý–p?à+Wíj1?êWÊ•ªA?×6c'Ñ(–?å‹+„ì´*?áôš¥‘yß?Ú˹“ÍP>?æ„Õ Ûa?áLaò} ÷?î¯Ootk*?Ù¿ ß®?Ö5‹oïž?éBûj‰ä?Ы¨~˜?Ó‡ñ´®ðä?æžÚ­Y·Ô?¬ÒNóBP?ïÊ7ŒÒ·?Ññsoš¤à?ÊXÞ•ÝX?ÃxzuñÌ?ë— ·î­’?§¨8-0Ð?Û퓺ËR?çp õx4?Ó¢ßСÖ,?ê-†"! ?åðBÊ?ëð$q^ v?´7,â?ë‚RÓy?ê‹àœj¹?ÖÅ„ Ì?Öë0wºÔ*?ï¯i•"±?à -Ÿ?G—€ã?Þ{¨®ºë8?àÂxãß ?Ǩ 19DØ?ëÆœ x„?Ýþ{¼®c®?±Ï’ ?ÜÕ' Ôx4?ä<×Á#ìH?ÌHr/©ËÜ?ã›cBÁ ?ÊOê¶öÞÄ?㽜3à«î?Þi¬ƒT?ì ‚;+¯?Ú†A‹ äx?ì˜ÈiÁ”?Æ0ù‚¿G@?×£è“Äx>?ä)nÍS?äÒhÜ?ä|ï-?r¦Â0aO€?áK 46ü’?Ø>(ŒkÎ?˜º?¡G&€?دû| 0¾?Û}ŠõXiÚ?èÆ.ÌÅÿ:?éÛÏWT‹?ܤëKÐ ?èÇT¸ò0ù?Ùþ‰m¿V?àù'Øò?ܧ¾C/Jê?ë÷À«ñ?è•9J~@?ïÛF2©o?ݹvt”xú?Å9.uĪÄ?ïõA':+?ìs™¬Â?íY é]¶?™Á¯° ?ÓOyœë*?Òð"´U?ëb ;‚?ÜàZKxˆŽ?î q K[?ÝÅÐc¬?츷°Çì ?Ô%ö¼ëHÐ?â½;ïíâ?ßbm§^€?ëÂb•­7M?¡Kñ;p?À öØ™!|?¸­Èo&£ˆ?Ó½ªy£P°?áP5H„?é€@sÁ ?ÒcƒlIwÊ?é7:Eã?çnøÄöÎ?¢åº?ãÃ'ƒ±Ôl?ã›8°þLõ?ÒN,!\ô?Þdãàj?Í„µ?ì?ë¹Hí&õ‘?Ä(üÄY?áõDU[É?è„“´$À?î’A:¡¨?ÕJ4ù—cV?× Þ$¨D–?ë–þÊŽ®?àNO?Sþ?áéšÝ Á“?Â.ð§´?åâóºn~?ÆRQÏ ?âøl~ìB¢?î ;BÔ"?í¦t:?/ò?ï‚éÄß?ã¿}iO7?åÕB´1Ù¯?Ò±HæbF?Ñ‹…VÌp?x‰¤ÿ5?аÌ\áD¼?àðè ÎÂ?߸_°“…ž?ájö4"½½?Âò-°& ?ã^ ÿ"?Ò°+“ÏJÎ?åßÍÊ@P?ÓßÈÿ?ßk—ýÀ?ëž©¾œ°§?à±Õ•Ü-á?è‡Y$ãìd?ç§Æ¡ý&N?ã^4Ÿ0K?¼çÿ&R@?ì2û{„?éÉÔ¶•?ÕK­û½²h?ç ¯ÅÃ1€?Æ>»ìò|?ÉR@¸?èSöïè‘ö?é‰hŠ®†?ë´Š ¬ c?ÊÖѰ]mØ?ÚYžÞJ?èÉX`oŽƒ?¥üv¾ë^@?Å4=º$?Ç·ý'¶?Ü«¨õ<~?ïqmxEÍ?â@ÊîP!(?éS£O¬hÌ?ÛàTÈiŽ?±É·¼`¬°?ﵕ†?ç©-·ö?¹‹¾xÊWð?¼uz°,£Ð?Ú< 5rì„?Ö_é–'"‚?ÛH j<¸?ÐÎiÓל?ëif…9ús?ës@YÇ9?꫚Ö?ïúøÇïWÊ?í€UwѨ?«M·ãg0?舭hk}?Ú̯X¢þ?ÌëH‚^i ?îjDW‚à?ÑÏ1ïAè ?tdh €?Ø0À²B?Ë›ÙnyK8?éŠ$mûcï?ÚL¸BUÔ?è&¥.¾$‚?È´U^*l?ëУ"¶?îê|(e}ú?ã1†‹¯G?¦Ð0}¦`?帷Í(?Ö„uŠM´?Ù¤)XtG?ìoª˜®K?ìöêö¶Q?â@}󨔃?åÇJ}pç?â—ñ4ÝÏ?ê _k)‹4?çá¥rOâ?è ?1?áj5d’¿? |?䙟P™?¸O¹ãƒÃ°?‡º9Ä GÀ?¶9¯ÔÐÈ?¯ÀŽ4Œ"À?ãzaæ—’?åÏg S?ã9õ¤æ`ç?±Žá"ê@?Ís §Œ?ÅÏLZîÎL?êݘT?Ò'ë½÷?åXÖM>Ã?˱"»€É´?ãâÀP’\?ãp}ÛjD?îSºdgÈ?¨=د«Ð?ë¨[š}±\?ëq¥ ×Ì?½§ªë£à?²Â{3¶ð?é -éì*I?í¬Ì¹ê'?ã‹lrŽ»?Â*/ÄŽ€?í(Ò’ëcü?êÒ¨Sq’Ì?î/ÔÎ9$?ßï0¼GR?æ»I¾LÇ?ËÙÝi€:`?ï¨+Ù”?Äãn=L¸?ëNʪ6î?ï°Š .$?ã–¯Y_\˜?×»’ 4²?áC6¸ßîQ?ƉW®^£¸?åAÑ@Óò?çLè)¹ØX?ìT“!§?“Ôé€G?ã p7ÅR9?Óöðœ[0?Ürëxˆ?çô™·ú?è.µ{¦ ?ìZëû î‹?Ö7jø(?îa/h?ïÝÆWpcj?ß—êÆU Ð?ÜËêøâä?ê{fd?Å^ |?Øajއà¾?Û3?%Ë(ø?ÙN™!r?À¤úÍò8p?ë}ë=Y¤?æßD„€‰?äÍA¿Ø­«?ì3§ÌC0Á?åù=„q¾?㤵ËÇsÑ?ïÄçÞ4;?À°}DîmØ?Æ•]9ˆÌ?ÖÁ…c:ip?à-°›Ô ?¼ÇŽ;Eà?︅ü™ç?Ô®(*?À]¶cè?ä-ík”?éð%ëá;¡?î¿4¯¶É?ë«3ŸuWþ?дń T ?ézè½g?ÐK[¹Ñ¢´?ä_aaˆ?Ûÿ¦‘ê?êɤA¤H†?vs [U²€?Ü;$¼é:H?â4Hz’*û?æUi›G^t?æ§›¶/Ä·?èq;À®¸w?ío¼ý1?ȲZÔ¿Öp?ÙÊë¸Øtð?émÙDÿq?•¾¯Lz~@?Å./J¦e¬?ßNÚNy´?ë`ÉâF?£â%‘¦°?äB™w{Â/?à.AtƒLx?åçÖñÈÖ?à‹‚ÂÁ]?Ê µ:1\?ÈAÅET?à" Tž…l?á”FÈlé•?âSšP7í?íÙPÿŸ?Éùè zËà?ïØtg¾W?ÓY¿æ¸‚?ÒÚ½ù— ?íjÙéh?¤å*A?Úƒcú£–?ãír–ý¡?Ť/ÐK ì?ÝÀ(ý’–â?£qräs¬ ?åâºâgÈÍ?èÕÝ/Ù(M?Ç¡L¶ É?îR,‡ÿ?ç Ó‚)?ëÕ.Æ~Ô–?ì´)kŸ·m?ߤ ª…ô?ÝäÕÈ‹È?ïó‡m?Ó]»—,Mr?ì!”òc¬›?á¶Îì×?àèi°?ïåÂk¨X[?ëÕ #:•Ö?à-âíÒ?ë©HsñžÉ?æ”q…É}?Ðë¦ß©H?ÑL×}îÙl?êíjnvM?Ê«sòöot?êVñ‡`_?ì%YñYÎ(?ååŽ`ÚD?Ûs‘¥T´?Þ¢âmÊ?ã^)±Im?ÉÌzÐÙ0?дÙZ‘?îb\¢ðMÂ?YoÅ/ÞÀ?¥ŸÅg¿0?à l¹[Ù„?ØÍ<Ž ?ØJ‡š(¶?¡¢X\0?Ò”0ÄOCž?Ê9“f]üÀ?êÊø¥„?ì³jå’|?é̇vÁÃ?Ù¨“5’ð?î §hRðŽ?¡N¨X[à?¾ÿ/.!ø?ìôíËÝ÷m?á[œm-ü"?êGƒZ™E&?É]>8[¡¤?ÜÓªƒJd?ëÈ¥ŒÎ4Õ?Õ$¬Ssà?à¦7²_á?ÒÜ:s¶?á¿ap BT?á ƒ“v‡Ü?Ú ü÷ת?Ù}³’ƒgì?¸ûoœSX?Ùœ‘ÞÖÝÐ?Èß½§?¬µ—Ìõë ?ä3S3–v¬?ÂÚøÝ-H?ä†-ô§Õ?â¨h Ò*?Ñ[Zàºíì?ì¢6™3 £?åA©÷ëÞ?Ýuñzl?è´;Tê ?êÓ 'xqr?ì¹-‘ë ?Ù&Yd "?¡^fZ?à?Á9Žá×—|?ÄøUk,8?2䉯— ?²tnx?ìK—K¡Ó?¼¬Ì Ç·€?Ùä×aï@æ?ÓÆ4-F?Û4…÷c/Þ?Ï++˜)|L?ãôŽÍøQ?Ùc:x`?ëmŒâ65t?ï ÁGvð?ïT!2‰Rû?ã9ã$ð—?äØçœg¨?Î}Õ2 (˜?⤯º’Ÿt?æîî)›ÙU?ë|—MÜž?ã¾+ŽÌÔ½?³"sh;t?ËøÏöAñP?¼šÌj$€?ì‘ ˆ^ù?ÐË;éçT?æñŽ(<p?ãÓD^!`Ì?åœq9Ì$I?¢2 [Û€?è <áAÒü?åéÚfw^ã?ã™6lÂÃ?ëe‚* ‘?áÛ=rwŸy?»m­êU͈?äˆj†<©?Â&‰ã\$ ?žë*ƒà?Ÿ#ž/{Ë€? } >Ð?í™xJIIÄ?ÉvhÊx?ë:˜ñ·¡?Õº@:À]Ê?æ»ãü7un?ìç’¢WÞû?àLÅBÐÍ ?âwå=Û·?æ®f$¾/y?Ñ-Ÿÿ’?æù~ºüÍË?ÖRÍ«*ùZ?äžÊ·Ç{?ÄcÏIìÈ?¸ –òŽ7À?å ðÝ.@¦?Ìå·v¢[À?ÑìX‚ü?íŒMƒëÇõ?¶BÀfœÌ?ÇS´¨Ê„À?×`Rã?ÖmaG,oˆ?Úhp”>?í>%œ°ù±?ï3TN?Õq躑à?åYM”;?ÏyõU–÷ ?îDƒÚm\'?îþ6–tæ?⤻ÚB?®ˆ•ûfRÀ?è™+˜ù??· ýžî¨?ä 2Š:ËB?áæñX'—û?ΜÖÄïØ?â¶~‡ŠÑ?çu­2q–?æÆQÏàÂ??æ $"ð¨?éû[" H{?´9 j‘Ì?̉ûTÐä?êFxNºV?æàh×I‡?ïÆ‚Î '„?ÞÑ¥Cëïè?ækÂB9?æáäJ{­H?éX`ºJU¯û6?誛?á˜V*} Q?çV¡»8%?³gµl…î€?Ó-½¥³ž?îÄ×– 0Ï?äã ßé&?Ø<¨hZ?ßÃùu"c¤?×ížÅZ™8?ÙýJ·%Ÿ?â„.˜wˆ?ÛÚtfÙð?àŽtµj„?íaJðê?à¯OL‹?çwèËZûE?àr.BÊø?›€žS&É ?ìQ¡È©?ê¾þHÊY3?âSZù;|”?ãlöÁì?î†Ï`a?éD¥6~ÛL?Û÷ˆçT¸?â³·Þ„¸¿?îå°Ü Ñ9?Ëä‡?ì8?ëè˜Ép?ì…¶<û?¨·· @0?Õ«npPx?áÃó~Џ…?ëG?b?Þ:¢eŠ/b?ã£ÙlÕv?äF ‘–?ÞœÞC¢–h?ÔÕG°AP?ï±Wœ'?ÙÎk:c È? >¨ÿFQP?×Ü•ÖF@?ÜSáuU°ä?é`–'9¬?ÛLÕÒ?ì*þ–½?´ØL©Üˆ?êÒé _¶?çá„…?à+ίÐK?ßòÒNP—J?¡1¬Ðp?íãÄBD³v?ÏL’óW”?×Y/È¢h?ïÕ]¯°ê?à¦9K-Ï?½H¾x¥˜?Ô`n¥‚¿Ö?å6˜&Eu?ïëIŒïP>?Þøh ÕùÜ?¬pMèR|ð?ßà ®¾?è‹P >ï^?ÞGùo ½@?âø¥nM?ïc—ƒÓ†?ï[¾Å´jª?ßF˜q¹Ú?è.¬ËÈv­?ÏÕý;ëwì?ÏEX0¾¼?ì‰^z[ðÜ?ÓnÛ?ÅJD?ÚY˜Í@(¬?å~»üˆ?Õ¸Tz?j?ì§™Ë_<]?Å|@ð9è,?æn€DyŸp?é ¨X?ຠ…wòÈ?ÑC¶R>?Þ¿ð„ƒŒ?ìæ›H?ì<Æ»@?èíå|D?ê*Iœ€q'?ä4gĽ ?µŒœ+Šþp?ï=õ¿S ?Þôñùøp$?êuìÔ¡æ2?ÐXöYÿ†ä?é¢Òç`~7?£×à ¤À?ÇȨº?Þ2Î O×d?éVRy¦¿?æ—VzÄY?æ`Óä<˜?Î/–MÓM@?Ø•½€Ùú´?à ²OîP?ÃZhòíl?à7ݢ¾d?ç/oÝm?Å„¡Yp?Üj^è5 ?ïUPŸù?Ý_OÇþý?ãà/fî. ?²ÆÐ:Úæø?îPWy_«¼?“bXèh@?×gÃä :*?Ñ¢<ÉhÂ?â‡dÑ©?æœáõÝ•ù?ä$Àß?ãOõNµÔÜ?Еìßëˆ?ÉÇ€ÍpÈ?çƒ Ý $?¡Ð*¾db°?³4gP>>p?à2{ – ?ÔÈÔeŠl?ãѻƴ{Ã?ÞNÕ—R à?áX6ñóZ?˜²Q„p`?ç|˜(¥Çb?ÔŠšWÖ°?넪•¹Nº?Ê÷w­#Ô?ÔÌîVé±Ð?¸ìFbJ‚x?æ$y¯ÌA’?ê§)\™k?Õà^ ‘‰UzÉ`?µvõˆ8Ð?ë”— (X?¿``q½?Ôú’Ö˜?Ä#ð¤HÝœ?ºlÉñŒU°?¾®á­·8?ÞP—Öw`D?¯5¢¥¤ð?²à6ö+›¨?˨~ˆü?â#XþÚb?Û›õìhâ?Ès£ôôÝD?ÙœÊ]¹å`?àËBYqK?èX’1Kf?îoL³ì¯`?à!?Q KÀ?ç´jâƒ>?µ;æ™2XH?ç» BH|?ï4ùp*«Ç?˜å°ì£@?•„w v ?×Bª¶$5z?᪠ _|A?×p÷›0ãn?Ü ø!Êw?×P­ü¹Êb?ÝY-å*Ð?âÜ}ºä}p?äW¸{[ý˜?Ö䦒 j?É]‚w•œ?Üèjwê²â?ëŽ|vA·1?â]ˆˆ?ßámñÉÖ?ãh¿òpšÑ?Äß¼I®×?ÂrÑ`?Þl~=!R?’]b2Z?ÊLš9Ÿ?ÅÒÒ@X?çQåfšè?àöd¯.Ê{?Ó ³O$‡¼?Þ¼TMì‡T?Û;êð”â?ß­Cµü÷”?Ù{Ð×ï|?å#"9MF7?Ëé«’|?çv©à=Ãb?î÷D÷¬q?ʪUPÊ·\?Ò[Nüö8?»ëƒYÀ?꘩ù@hH?È™!ï‚îP?êŽEOÜüq?¤XЈh“p?Û\¬‚$ä?äõ>ÞjåB?ïí7g5’?̧ñÈÜ4?épo6²‘?⺿¼P‡ë?áòÔÃ7?çTÛýé•?ël÷n€ ?Þ°ÞJ ?”?ÚP$@›Ö?æàñR÷È?ï?¥zO8?áBã>†^ó?ßc„îvä?š1úi&€?攢Иô¨?Û°ü`¶i¬?çóØÜþ?ÖuÅ@yä?»Åc[L(?°ö·Ä-¾ ?ê{u{ß8?ܾQhÑËZ?æ­—mè‹?Ò€q›Hn?ÉTºõŒ?îúÇmÆG?Ú:O°¬pÎ?ÄO›ƒ~Ü?Ò5j08ä?Ί*@"„?ßÖìOó²È?ÞEh(?ª2øv…?äâç[ùÜ?Ãý,ðô“â?ê×u–Õ?ÍÛFÛ , ?íÿö Ýõ#?åBt!ëæ?Ô|ot¦?«e(¡aÐ?릤”G±„?ÚÕ¸=|éD?îƒ mÜùP?¬È^P‡T?Ç¡Íhdû0?Â…äÂb0¬?Á{–Á 8?é¡7H}?Ýkj R¾(?¾\@?È6˜`Á$?åå«MQƒ?î·DX@^?æŽf«\H«?°y{:w `?àN©Šô†²?â]¬1,é?Û|0`ƒZ?Àc†òt?êVϘ?äï—4ÓNp?ì”oƒW¤?Î"1¦[¬?Èú™"Õ†(?Ûñ¸.A+Æ?ˆcà ÖÏ€?ÐÌö-ï œ?ÏŸôsíÇ0?ÕD¢¥ˆ¥?äÎŒ¤ÙŸ!?í–.Q¹?ê´Jtdû?ãé°Y^úï?w²l·Á?×*º,Üà?×s.˜¢X?åJ…]Ž?éæÃOD#?æF¶Eƒ)l?ì™*$UK>?Ø2‘Óaý?æ4ÂÐ{G?Õðç`S>Ø?£ôëܨ™@?ÒÆð¬Ø®?ë=·ß–?ïÏK¯R:?ÎÃ:/L¸?Ë W¿¬¸?Óñg)ûÝ?Ò‡_ðÒ‹Ì?è/pˆMÒÔ?î·ýbD´?Á¹[~í ?Ð>èaã¨:?ÙÑÙᣴ?à^ïC +Æ?ìß £J†?é™"À¢“ ?ÜsW3€¡Þ?ìI}ØÈD…?à,%ê?ÆVuQ]ãœ?ÔýÙ‰º?¸å°lúÈ?ëL˼Q?àŒ#ªÍ#A?Ó¡Ky„Êú?É@SàL?Íw2Eù68?çØi÷ÿB?ѪFx„ûd?‘08ƒ ?Ù,õœíS.?¡ØÍÓXáÀ?оj­?âýšª›Ž?îÁ‡ÍVW?á7ääÞÔ?‰ÄøŽ?Áø²µŽS?îuy9JeJ?â®N³ý°?ãÍ%ß·k¡?ï·Èž&T­?ç¨WÖ²â?шXãŒ>?æ¡ã¤Å?µ³/BÁùP?ß0ÚkÀuê?ä6_eÅ?ìµqÓnE?Åa*¤Þó¤?ë €Åå€Ü?ÑÊ*HÜîD?Ì* ¤,,?ê -ë Õœ?ÐlÞÇœÙÖ?â™í=õ1?ÖE0ªÏN?ãm<®Ä~?³¤ãÀ qh?Äö.Ps,?èHÎûß?µØg|È?⽬Ô9?àý²Y\}?ïôxÎ4Ûu?åÕ‡+¿uì?Õg@¡$’?ÛÍ̵\ä?à»gÊ’e?ê¿ïêèPì?Ö;Tœç±h?± vúˆ?Þ1‹<¢?܇Wît?ìbmÓµöf?Îñõ¿ý)ü?ßzJøm~?â’5N‡Ë?ÕÒñîæÝþ?î;ªZ€Ä»?ÅKÊfSi”?Õ¢É+4]Ú?á@$Ù?ïôdn{þ!?èÇ[N¸Ìq?íŸÃÃ\g?Ö_m‘Œ³F?êŽ(~O~X?ÁA'¢~ê4?ÖZ1‘Ü?ïÁ}5Wu&?â5«ëN¡P?Ø)R=óø ?½U;O]ô(?Ú+”¯»rÊ?í“” žh%?èx`† ñµ?À½‡¡Þˆ?ÖÖCwF°$?í˜#Õ7æ?ã§î2^êY?à:[å—«?ïÒÖ%«Œ?Ëצ}›8?¡„ë]K†?ÖœMÚôâf?àeLVBc?Ø%ò±¯7r?Ú¤±Ìv'(?Å(œL”|?ʼŸWO,?îçB4!¿?ï±4ßµ?ì°BL¤3?Èd‚Þškø?à]AJ”Äê?Ö¡+„œ04?ÇÛ½¸U8?ël!.õ„5?ëbŠÕŸcG?¿o…»äÑ?Àãz~‡¡ô?ì»› ðð‰?íSÖde„?Í©2áÉ@?ÓáÜHJ¿ò?î!29B_M?ä>’uë3½?ìÿ¦ çÀy?åK¿&€œ?·‚Q¶nJ8?ÑÎÁ­À‘¨?È÷ üš±T?î0Ëy4+U?Æ3‰æÁ?ØÆiò;,?áoþ´?å'%y&ö?ìL%»Û¢£?ìRÁñuH ?Ü/cqˆ?ëLjó;É»?àŠŒ~?êÏQágàE?êãÕN ?ú?í¡l™“[?ïÛýÀ?å¼ìFñU?Ý-„T'Åv?ÞR¿Aø?¿›çìp?æ°Ž¯™‡?ÜÈÚ3È?ÍF›Ûü?¾C´šËøÀ?Ü5<¥†U$?êw»$ Ï×?Õ×Ħ?ê`£l©i?éú ž3g?Ó(æ[*Ù?±¯Öu˜?Ù H§ìâþ?Â/–~}?ß³jq°R?ÑBxÿÜÚ?ä÷YzÉô)?¾ xB‘“ø?ÚFÇœ±¶?ÐHûÞÞ?áÇù6¬ª?µ]P ŒjH?Ã:Hø v?­ÕJ QY ?ïwe• ?Úñ^ÓÆZ?ÛyÈå!¡8?îSŒs¾›?Þ ä“ÃÛ"?á&ºšˆyÌ?èÐö=Å3?î°V~Éí?èñŒwÓ(?­Ù±±Òu`?éµÍãñÌ?ìjiq×ç¸?ƒ»^‹@?×^IÖ…Ìÿ©?æ¨}h¼?Þ±jæQÓD?á¬NŸ4€Ò?Û{ãÄô[ø?è#²Ð¾· ?í(QzU!j?ÄÖ̘uÀ?æÑ'`¡›y?ÅðЇl?ãqHQ?»…ó8ß;8?ÛD1Ï áb?ìþ5m?è¶àÌ¿D9?ëžÞ8Ú^Œ?”tNj_?á=ueåÿP?ã·ÀÞG?ÑF#ŽBœ?ÀY£Q:&?á1«“Yè?êDWi m?Õº j¢®&?î²rßL~?ïrPkj>$?´^¹u/7?áH1‰M«?®ÄEÄÓ0?ém¹ÙiÂm?Ž  $É¢À?çêSÙlè?ÓhÔo$p\?é„3b¤¨?äçÛ/z?·WAˆ˜?¸–M‰“@?Ö˜Úx}Ð?É[h­tyx?ä\2Ô~Iÿ?Ø!¯ þ‘°?Ía‚d?âp„y«dý?³¶ ©cJð?îÑÅC•¶?æqà ÖZ?áF‰€‰~‡?ã@x­°:w?¯Ê©<ñHÐ?îæÌ&¼EÌ?ÊôUî"ˆ?çxcñE?ÎEŸóçâD?¼¡*k'h?ïÌ]»Vää?äÂÄ"ŠŸ?êíÌ¡ëδ?ÐKí´æð?Ì…Ÿ7D?ë¯Üú âö?éãoUµ|$?èR ?$ ??ÕW†Ê¿J?âèÑÎdh ?ÂiŒ—×Ü?ååÇW‹×?îÒë%ò^?ãÊ1¿Q:?êe ¡zç?Ì8þÎ(WÔ?à6ëÄ»f?ÜüÅ"ïÀ?Ø$R™ž?ãéê–#EÎ?×íøõ0?Úr¡O檀?ÙbïRNÔ ?áÏL~ÁÛn?îv4„Ì n?ÔþLÐÁ*æ?â8¹׳·?ÜÖ”(Í"?ÆŒÊãT4”?ï¶GdCÄ?íRrRKÒ?ÎìÆ¹¤?ëë»õÙ?Ú”;Ò Ò?ï {¡ÒL?ܾ#v t?êYZÀX(?呤‚f?ǰ<„I(d?æÞÔ]óU¼?î¯Wó¤2?×nWàÀR?½žMýUæx?ì¶ë»1‹?Óv÷ÓbÑ¢?Ѭ±ñíª¢?Õ<@(Ñ$n?áø³™ân?⽿X‡¡ç?¡çj­èPÐ?ì¹fÃ,ƒÿ?å u»q?äô6ô€¶ã?ê@î&!åy?¿ÀÆ`4CP?îÙ{ôWV?ìUm :£?»dôLQp?áзÅþé?ÝŒ¾LÚ?ëþuÄC#~?®b/wSáà?å‹@ýi?¬ãJÏÀqà?îÔ$ök£Œ?î"žcI_?âl4pW>Y?¸ÃWØK‡À?æÎ{ÄA?ïJ?QX?îBð²Vi?ë›äÿ<©c?è´Cõœg?Åx\)®Å¸?ìü´hö;?ž—™=©@?Ü+•è´Ä?êËÈÛF?Ûhš4<?âF¶WOÐ?Ô°®ŒØ?ÊÒ>©ÔL?ÕŸt$”¼˜?ªÑ'Ÿq?ÔÓŠä³sÔ?²ÑýXh?Ï‹¦«"sä?Ýîñ: >?戂ÚL¢?çEö6•ÛG?äU0Ï›ì?é)Mç¾>o?ìÙú:µ2ð?Á0…@‘?îŠjŠPÇm?æª3´E¸ú?¾Ù¸ÑâÍÈ?×&WËþŠ?ÙyyRûo¼?Ð1HÀ¨ ð?Ê®È~Xð$?Ô EP¶è?ëqAXâûà?ìÖùEá ?Ý;sŸ¶x?ìÌ#Ìý ?ÆD8Ì(¯œ?·+5Ÿ?éùÓÏÂÉS?¡¥ŸÆ„?ÊŠœèÙfL?ár2%›’U?Öt„tñöÀ?ß<*³Ã¢?ë|w/\Ë?ã4u‰exä?ÍmŠ@|?êCjÍ?àDÒaä ?ì„‘`K¼g?äiø·ër?×­'Yú?Á€U$-'ð?¦ëæ^­í?Ðq»^çP?îÍH?æ<ùŠs.¨?ë É”X[?åßm|+?Êu9þ§ä?ç)Óþv°x?íZGºH…·?Öï¥y]C¶?îBu{à ?×’ôØ{P?äºN2'?ÑÎ8W¿8?ÛÒ`²˜ ?ÇÓ,Œ?áwòä Ãý?ÓkzÀ±„?êêŠá¯þ3?Ï#娷ñÌ?ß³€©^Z?è¡"IW(?×¢!ûz°r?Áñd¢7D?Ña6®`q?ãÊö½–ð?“ƒGØùØ ?áÕ(½•rV?ìúƒ¼¯h?ÜçþØìl2?ÀFõ›Ì?ê#óÄz?·Ô,‡GË?ëÊÍ]EQò?Þ÷t`'ø?ÍÓ†÷Ƙˆ?ëš}®ÉD?íš1Ëਠ?ëFãßã©?馸ÑÓw?ÇÛ ãëÙ(?àƒ^uÉ?çXy 7?ɉÈiñ£4?å÷oŸž?ìÔÈ‚ÈFâ?îPä‰$‡m?ZÕž²?îx’‡é?î/LŸ×?â¼¹ÿ@Á]?ãÜH™ÍM_?Òšª9NÃ"?áÖ¨‹Ä?èéfà„M?àôÚÔd°ò?ææ8ó!ü?î{ð¿ëK?Ò¸u±è¥œ?ê<5õ­W?ç ö©¨9¸?»X¦‡#É ?ÁÊÄYè?Àê(u’Nð?ãâK˜¥Ï?ß{¢êWé4?ÈT±#R@ø?íèL.À…?â„MN“pÄ?­%A“ÑH?åªô,Kq?Þ7B톄?çC U)ê?ãü°ƒk[?í4¿^s’?ØM÷2Š>?æ Ý¢ ì?è{iÀ ¢?ËèŠ!Ò‹?µ:+G+îX?ÕÇà„Á6?èø|½)??âU ¨ˆ?çk\¯ÆI}?å>ÒŽñ4H?ç>šÙ³om?íÇë({?Âf”'ö„?ê§ÿÂyj?Ö,n½ö\?ê{…8ñ?…UbP²€?ÒÏâ`/\?ê›LŠ?ÀWµQ¤œ?ìð):X?ÞIŸþV>?îAËe8?ÙE~È Þ‚?Øñ`þrb4?âb6ŠpÄ}?êµúl•&q?åFûÐzºv?f`rŒöË?Ûž>áM’?Óåû¦ \?î^7)š¤?ãf2Euïu?çJn=:²?å즴ÞP+?‚¿û@þ×À?ʲMÖLðÌ?í9óÜ{*?Òº@‡^{Z?Þ?¿Î$Õ?érãé\½?ãõêÐ’?åN¼¤{­è?Àctß#a4?Ãâ¸]p?ï×#b'?⃷÷wR”?ìC¹îa'Ã?ÇL¶à?ëékª\vÆ?à‡Ê:ö_?äŸ7Ò0?ç*ü–Ÿ,q?â}í^ÿjª?îÕXMô¥?ÁÙhÈÅè?å×ΓÉÁ?Æ_‚z§¸?çÒ®~#ä^?ìõ8u¤Å9?¿ |°ñŽø?ãÜ~.gz/?Ïþ2|Á¤à?Çž]'eÀ?î)½ :·Ç?åpâGEí?ä ‡õ‹¥R?áMÅö?•Kzô|Ð@?²Ÿ¶Q>ˆ8?Û’©?øÈ?ã.Œ)ëö?¬ûhG—“ ?Ï—BÇ1è?ÊÆ=N$H?çE ÝüF?Óÿ9;%ˆ?ÜPN<;?äPýéœ1¤?ë$ú F¥Š?ïGvC.o?ÚÙû­«Šz?·ÕÛKß3H?æ0½ÍÎkù?ç‚ý,{1?»ñuì°?”YŽ„´Ì@?áRôÕO?ï%¶Ê¿?å”{—ð3?Ñ và»Rˆ?Ò²š”ò˜"?䤗–z?ݺ§wëIš?Ð'oÂ÷¤Ø?ã=2ìtæ‡?ìM«‚â]t?Õ°ýDõ² ?ÐÍ-åkF?èXTªÂkY?帞¾Ç?æŒ\N0LÔ?î_ûDSì?ã>„ÁÄ#(?ÌzNÔ#$,?ãÕ&qœíS?í.‘Ÿ ä˜?Ò‡—›Zê?àwŸ‡}žª?ËÞ’×U(?Ôÿ³2O¶?ºVdÝPü?¸F¼yôA?Ï[ØÖÒûX?ÞH‡³Î?ßï `BJ?ìµG³§·P?Æ»Æjó¬ô?Ò´snŒ?ëfÇ_gí?ÌÙO·>è?æÙ@ÂФ?Ὄt'Zƒ?Ú™N*rÊ2?Î-æÌ«ô?ׂQ%8÷Ò?ÞuYÎ?ò?ê_ÞKû]?ààI‰,­Ž?Ã_»~ãF´?Ù®œ­j þ?Æ76½üç?쿉Á)??ÚÂ-_·H?ÇC4ιè?­l3™â€?Òdȹ~?á ã!Ý?ÕeÚß`Ý&?×C-Ýî†?ÓüðŒÒh?àHjÒæ¬Ú?àsØŸ—À?ëqu^+Q?¶P'ÅØÐ?°™vµŽ?àƳàí«?í#†<&?Ù3i¾µ¨ð?Ói›øpª?çeÇ•‘v“?펲 8Ä«?ãÝ&dS?á[$ ¯?߈hî Ìf?åAÔ•‘s]?º°ÙÀ?ï ´Y§™?âU¨zóN;?ÊIÆm¹Ü?à§oozeM?Í9L5sZ„?쟾²Qc?ç…»•×y?º¥*¹´?â¿_¬‹Àâ?Âî~õ¡ h?ç ,;å?äáI\Ü5?ªžD $ ?ÝÔmoèKn?ΧՇ8‡$?×LM XÜ?êk[|ïF?àF”ðªòï?áìÓd ?ÚOÀCr-z?˵Ɇ4Ö ?ÁÙXfì-Ô?ï[Ìmm·V?Ë*y 0±,?ã%V«óœ(?å¼£ÊL€/?å2ŒMî÷?ÓÂÿ‘áÿŽ?ìO™x¡Ë;?åÖe$7?ã$¸Wh¹ô?çI(úJ½?åuÏ,y‹”?Ö?ŠÜºu„?Ïo!=Ú`?ë{VkfÑY?ä”QÓY•¢?¸h\†µ ?îù"=Z³?è&VûÅË?Õó ƒgÖ?ꪛk¬ ?¯® “÷Q`?ÙÕx¼ðÄâ?¼öÖÎ"äP?컵8*wÎ?éšÈTF#?Þü­\Ö(?Ǹ9)!ï@?°±Ü;ë+à?î*OaA7 ?Õ€3^?Ù£× ú?ïÉÜîŸ?뉰R“•î?ìZáT§š?â&·®æ{ã?çp½¿‚z?â»-öY‚?ŸÚëÄZ?¨3Wt"Ð?ç©öùî§P?ïû·ì6«Í?ãö¸"??ëÏ#kø?à ?j&y?À“1dkMä?¤H„ÉKyP?ÛÖYSáK?ΉUmT?âêiLЃ?í%Y}vP½?Û"¢(F?ÌQðúV?é{¤‰¿*¿?ì‰ÝAy²y?èî°¥½X×?à õrªµ+?Êܦ•OÝ?É‚åtô^?íål1Ϩ?Ô”!m}t„?ï¥CÄò?ÚëÔÑy¤?Éñ¼A3çp?í:àŠ»Å|?éPÁª±»*?áÐÐ¥L§Ò?¬"*»’?ë‰_·¯z?ì=…;”t?Ûàsá>?èòÚœ˜–þ?Ô5ÃL6?·-š¤±(?å(eyóº{?íq$ûýH?æ“ ¨L?íbɇ4üW?îMïSÓZ?à[íF)­Y?å-r~m‰¡?çjçÞbwÃ?æ FˆøY]?êùàMÚè†?ì ™IÎu?Ñ1”~›×`?¹¥,ê¢Æè?À3Öµìoh?äøl%1/?ÜÜ—+Íê?ëÄèaÃP~?äiŸÒÎ5m?ꟹ‰=~Ä?ÚQVnw}8?Ó«'±¤pÚ?܆ó®LŒ~?æXã >l?ÐñÝ¡ø?àù2´¾¿ ?éœ ñX%?·…éâZè?ëf4»æÖ&?éLÁĤ6Ò?ïkgN]?æf®ný4?ÜS6ËìàR?ÛZ¬KÆ?¬Ç8UÆ@?ßF%tuì?Ñ=0[Êô?ÖÈšœÜ?Àæ¨#Å¡?¨<Í€o/0?Öð‚I¦ ?Ô 'ǨÌÔ?î1ï›D­*?§sGlÒ‘0?æ_‡h ô{?«½úãP ?‡¿'€YE@?˜ó•;:`?Åz4ƒ.¤?™® VÆ7 ?çSµÊk…ê?ÄZÇYÜ%0?éTa”Ì??Ò@((‡X?íçYlNj?Ù@Ší¤?Ý™8ø Ä?åÞJö‹ •?Ò‘ƒMz8?ëÜ»+qþu?äüCC›!E?àÆ±ÊÓk?ÁYáº÷ÍÐ?ã‚ØfòðÖ?ÙÅÉ"Ç\?ÅÒ}»íèp?ÖX àÏà?äž¾Ñ2?ïHï¥-C¨?Ý ©ñ0Óh?ç/~?­I³?âÒŒT»Þ?ÎhÊÓh?îaáv´hR?鎇¯ÃÂá?îäa1×´?â¬c`¶Ï?ÜO·ÅXS˜?Þ e¥ÌüL¸?åÎ%Ï/¿Ò?á)‹?êÀCãêä?æA=›ÓD¶?Ê?T]¹Q|?Ý2eGÔf?éKjÚ¿Ò?lF7Œ?ÖX+ùÒ©”?å[+oc­l?­}õ&ˆ?çš ÔÌ ?á7ú׿ª!?ƃq{òp?ìÚͤ2V?èÝ|§ÖÛa?Ô]4=蘞?¸ApîªÁ¨?Å‘lûÔç?ê9¸EYä?èŸ!·Ít?ÎB‡‚}Óh?Ø·º‚T—@?Ä)qA}¸?í£Ó€ ?åžëÓY—?èJ:mICß?îQ0ј :?ç²xS†hÈ?Щ29yJ?Ý£d2ºn?ï­ íGµÅ?äGˆ;Ho?ÅA È¢‚?íÊûB:?Öæv@`ãÔ?ê ¦-.’?ÇO<?ësŽÿn?ÜŽNîÓl?æy^Û¦?çþÒÛ¨?èÐí7¾ùÈ?닜Ñ@oÖ?ÎÚ?ä:¤hùŽ©?ÊFœ<€”$?ÇHCjh?« Ët\@?ʸ„@½l?êóÌôý>?ÞÄÐy7¦²?ϰâ[ãWÐ?¤®ö¦èà ?äó0ü,?«µ"KÊ3?Ê ðõJ±”?ßqÒŽ¡p?ÚÎ’ _‡¶?Öhg¤j?ç’Jàth2?ëÖ˜Y³ÓÅ?ÌØèÑ8¾ä?ìÀéŽa?°En7¥h?Êôñ ôôD?æòHKÙÒÖ?剳Ö3’?ýH¹ ?âcàÔ\eÊ?µ¤»íó»`?îEäÀÂ`?æ;¯e&Ýñ?â j©U¶?ì-nñ‘ÒŸ?à¦;ÀU²?êRýët8?àm\"x?魧혩¯?·úLiЍ?Ùä;‘ÙÜ?Íü~Èoi0?é²D÷Ÿp:?ê)è4o!?ähá©ýÈr?çìâJžÚ?Â3aÙØ?éé¯'»ÝQ?ähkR¦ØE?à-LÎ4Ýž?¯°_v¼ ?Á‘íì?ëç ÔŸa?à¦^Xn¶æ?Ø<8,ÂÖ,?ÆZa]¿ùX?íR`Od?ïà›†i—?ÅeUäS¢@?ÔI\r?áíÐÅCü?Ȫ8šùýä?ãiõÛ_µ²?ì“9fqç¨?±nÃábk ?w?°6/w€?ëÚT6$?áÌÀÇ )Š?ìQwáÁ+û?ãJuUk³ï?âG<[§?ï”åøüÅ?¢F/Ñë÷?åéNËäº?æúùaÅû²?Ìð•¶HV`?ÉJ”^’·¨?íb«ØŒ¢V?ça¯Ú?—?ëõ‹pàŠt?áfù=eä¯?Ñ<«^Ý©j?ëùÅcƒˆ¾?ÓÆ óèî?Ä'Q¦”l?²ø1—I`?ÓÆO{´?îIcôüF:?ê,HQá|š?ïWSM8?ïyÛÕá<Æ?æEÙž¿¦?Ï[,2ŸO?èê,FY†?Ï2lÿeh?ï§ZÑ«f?íéŽJCÌ"?ë´_M^q¢?ﻆ‹Á!?áþ­×n7?íßYÇ®?î9~X÷?Ü8¬ÓϺ?„†!üüa€?¿\›,ºà?èê¡î¬a?Òî¶X Ê"?Ü›*BÙõX?ÌwãéŒ[D?éÂd~,>?ßÌìPûºè?Þ˜ìPÄK8?¸¬LRÇŠÈ?áKÍoçØ?¡Ô(` à?·îÛ m4 ?ÌðûaMê¬?åÐÒ5[s?éÚ«™Ýs?åT&ªl?Òì…¾¾F~?ƒ¡yªø@?ªÓMÄe0?é"¼‚ºw?¿ŽØ*l6À?éÿ°Üc‰?Ùru:ö ?Íœ2ëBt?à ìO?â·•T”ÿ?ÓÒÓÀ±j?äš4'ØŽ?çÁïƒ Ó?ѲX¸ÿPp?Ô4@ø*F?Ôµ“èÉ(†?î¤Ïëd“?´¹u=¥˜?È¢z3ãè?Ï6å$ŒP?ê÷Þï?ëÀ:ò€:?ÝúzV£¨?ä1Gš Gö?à _U¾w?Ìn¿ 70È?ïZöŒú?Ñ|ñ÷¿h’?â’Ê/H›‹?ÉU Àž=8?ìtÞY&’?ê¿ ­™]?˜]Ž-à?äÆ@bÑõ?á|7Ô£3?ê¸ñA÷„ ?¿î®ªyƒˆ?ì’q EŽ?êE( öI[?àå–Czù?Â†Ô Ù[Ä?͉¸n!›@?Ù}úª•–?êÕ}3Cz?åSâÁ1­ä?áÙª§÷ï ?æ5=†Þ®ë?Ønf£RXR?îÿµ¨0YÆ?è=¿LÕ—ô?ÄÐ ¨Ìi?ÂvRÝØ»ä?½-ìòÛÐ?„]L"C¤?†)7?Û,Ú‚èSÀ?× ñ¨ ?r@£úp?ày7ì›?î[FM¿©*?ØÆpäé‡ ?ÔEã{¥š?ç³ðp ±?Ü7N- ¶?Ýx±ˆv æ?çúwÿ»b¤?„l£Ïh€?² ¯û.„h?Íh$>µŽ?êƒz¹?çÉÚ.¬?Íöökäæè?ìBW ¼Ý?é×2>?Ò± Y†?©[Pæð?ÑÓæ} ?è\„«Pxß?Ñp›¾Íæ?ÊÃê=4Ì?ÌíÈãD–¬?ï™s Y†;?á¶H¾‹?á•Âl]y?ÓÒÝgDr?æ©“9»§?îh¹£ð?Ðü ?Ênô?æ÷LÿšS¯?âXÜŸ3!æ?êÕZ{l3?Å‚_ßuzx?·VRhE3à?ÍØú¹VW,?Å;"›Ü?í‚›”uÉè?ÐÔ¼b>¨Æ?êóùh¡`?á_’Ûê?×zpgçÖf?æx`˜o›l?ÞB(Ž#p?âlh”P?Û’ãÚ‡0ª?Æ( Ú6?^>”ø”4?Ý"n >?ÒHüù6Ý?æzc_x?Þ’ºëqž?à¨:[Æ]?ဵPèú^?â ×xÙ‚?É\ÚýìÛÔ?Ý“G—»Ô?âRe†í ž?ÛÜâÓòÒn?ú@éz˜?ÔYµ,A°?Ù3520¨?à,Ô?ß%E£ÎÖ?àl*zfU?ì—A÷™¿?ȧ¸àk„?ÀƒÐ¦%¹Ä?Ϋ[;ÏËÜ?ì+è0}ÿ?ëÝpåõ=T?ãÜ-W[‡–?”™v×¢?ÜÒàw2t?ÈC¡ú"»?êQo.w?̧­ãÆŒ?ù Ab¨Ü?³o-œO‘?Ð⨸[€ø?Û­rTï¢?émN?&Ë?Ùµñ²È?î[}0MT?Ûäq®ù?ÚSê”$ïN?ê]ý£û?ç|OP—Üt?àEƒ&-›?×ÑhÒ.`?æ0Ä@?²ol„(?æhI(ʃ?ãì Lªú?¶1O­6x?ã‰,¼9‚„?¸E¿­×Ü0?Ü—F’?î(¡Zä¦?á·ù/nÝ€?¶­ò’Y&?íY-8­„z?Ü&êUÕ=?âû’ägjR?åòš+x?æ0³_èÖ?áwH{Z®?âàÇd22>?ãcU6®¢S?ìÆ¿®GçL?åª|c];?á%SA#¥l?˯k‹åòŒ?èôa,öu)?íÐ@©7ù?Íø†ÅìM\?Ö3è‘ü?»5tjК?ç>'¯œÛ?Ü7N°î?Á·È `?ç§ž~Õ?ëä§kËV?à‡ÕºjƒR?èîvVÀÌ¥?ä_Ã3xöŽ?Îv7=ýWì?ÛA7ÌZŒ?ÖÜ×ÚVT?ÜÌT#¹¾?2 Âx¡0?ãØä_»ö ?º¸ŽR9°?å4›ðÐ?¼½ÊâqP?0W‘?á}þ8ô?áâQ H?ì—ï{Ä?ÖäŒÕ\b?Ñš‹½Œ?ž?dÑ?Ô‰÷˜Û[ˆ?Ù*g–t\?Þ8w›˜¬?ä©óàS?Û¦b,ñ ?áÃÈëÛòé?Þ_!%øT?«o!1!ð?äE[$Ú~?ê#'ÄqË®?éI!V?Ï?ë á“Æk?æW*† w?é“PB¬;ð?ÕÓ‹ÑýTš?ÂÄÚja&0?í+Ä€µ¦œ?ìÿÅ’ ³í?îãV¥}Ú˜?â:>š’¦b?âQ85ãt?Щé.—ÿ2?£ÓéJPoÀ?Ý>[ìÄyÀ?ãJš7?°‚µ&ÏÈ?ꊊå›L?Ò{ïè.?Ü¿öBâ)Z?Ý®(ƒŒ?Ã=âz–ƒN"æk0?“#´Ñ€?ÞöJ”°H>?ÙA¿î× "?åa*Ón;ð?è£m©?Ï?Óöµ¼;(?á~sS5Mü?ï—#—‘'?ÎBŽ”@?í){£¯(¨?ã'_œe‚?Çx¼óU¸ø?áÝ/¼¥P³?æs—W`f?Ôá” ÷Ø?æÕ\ÕtŸh?Ñá©G%»Â?î²:¼Fk¹?ÎL]X‘œ?äoÓÜû·?êLÍf'z?×@íÇ€?àk6Ñ(m?Ö¼ Œ?êI¤/Ký…?Ø[ò8ÁÀ?ÃŽE,h?¶“$>®@?ïJq!¥#4?í¥IAc!?Å¥Þ8ô¤?è· £ˆæ~?äê±·Zf?šoZV?æ×ÿgðéÙ?⊨-KÝÕ ?í ¨˜ð&&?›¶‡à-?— 7¦€?ÊòºÃ± (?æÑha¤J?àÈFuøA|?ä\íå?å­Ñù¹?ç÷õMBD ?å!ÌùÒ?á oIX?Ø\*Ì×ýØóJ?ì肎c)o?äþ›Ai†I?ÓÒRÅš?îŠF ±­‡?éÄokݤ5? •‡ªÀäð?ÝR™Ö§?âN ”ƒÙ?åðûº4¸?·ÿf[ŠFP?ÜéÏ™A Â?èz4ß7}î?ä?©+®?à£G†€&©?ÞÙßÃÑÎð?êŸl>ÕgŽ?ìÇ·ô¡…ˆ?ê&S•7Î?æÓ£}’?Üþ|Z¾?Ø?àí9›Z!ù?êkÎAî/?ßš\•a?í9P;¤Ó…?c=vŒ‡Ì?¶à0:¨?ꔲÔWÛ?êÅ/g?ì(u*Ì?ç ¯ïüà?Â@ô;ÌÜ?ÊGVžLx?•Ýéd½Ô`?ÌmòV/ÅÔ?âæK?cÞ?æ!o6Ì?ÉW¢Tb}ô?âÙÐÿL?ìàZ+k• ?ãc›`a?ïOß"# ?Î2Õ45Óh?íÎódÀ ?¾Öâ-ÈÐ?ÍÁk}¤Ì$?ë^Ï(§ƒ ?âñ1Ìè‘?èM­C¾1?â@ªé1?å?%5‘?Ó#1‚Öi?éËççRÐN?ÄÅ#ùçÌ?Ô‚Ÿ—Ô¤?äá†å)×?ÞÄC¥š5ô?ãM ƒ Ð?¬_ËíYÀ?—õdpK–?į€\}I˜?ÛíͼÉ÷”?Õ]q7š’B?ÕN%‚x:?à¨ù>e¯Ð?ÌÑ)ª3”À?ïÔ]i,Û?ì‹Ý4š’?çÐÆuYp?å:ê{nÝÝ?àf ú†??´Ên¤NÌÀ?å¯4k±Ô?ïrönMqP?æšµxä.iRqç?Ù/zKïIp?á=CþŠ„q?ìU”ï”ò?ãDÎRÔ­Ø?ìË¥=â¨?æduìayº?Ñw†Ÿ¿ªb?él$ªÁ?æeGcɨX?àô¨:™l?Ù·îk¢‹h?í§wòÌt§?攤Ë*ª?·q¿Þ¦­ ?ÖRÛ#``?»@:¤et¸?ë²îQ* ò?èSE¬qØ[?êÓ<ÅFxD?æ¢ñN›ß#?à(Öµ³«C?ìž'Õï9?Ò¬…¦’^?è«%ûƒ—–?¶{Æ­À?Ë[ Ⱥˆ?¾lgÑX?ÙùÉ‚,¨?ïk7ëµ¹V?Î\Bu„g¨?ïÅ13 8?Ø¢ž&·°˜?ç§ÒÕÌÒ?í¼a†Ln?ìtŽø”ð’?æwЮ+õ$?á ­A^št?Ý×uéß{ì?ÑÅnxáþ?á4J’Y0M?êÆ7jökC?Ϊì‘ÑÔ?§^¤=]Ð?á`ÙM?é“ÊåOW?Óœ°zÖ'Ö?ÎÄ9…ÓŸ?–àåø´ãà?ä²m›µ¹P?§Úà ?ënN¥ ?æ<­©’X?êeÂ8' ?è¿æ8@ã¦?ÚóÓ(Ë?ÑE&àǃî?Ývê!už’?çÅžìµØ“?ױϹ‹".?Ýæ$yìUt?îQ…—V ?·J²/‹†è?vH‹TãÉ?äã|hªn›?î ˜kÀ‰m?„zŒlêÀ?¢V“;?Ò94ér_¦?éªÜÊ¡,u?åœ4få€Ï?ÈWJ–æ¸?ÙîF¨ŽÞ?å2ÜÞŒ?æeFÆçº?Èúý´FÌ?î.Â*ˆC?ï K‰¼ÏX?σ¾…õ`È?òX1#?âÖM—¡þ«?ÄeÕѧÀ?Ö· ÓR–Ô?âõœYã²?Îaþ*ð,?ΣLø?Á©3îÕ¼?æ8Ý‚;-?Ñ{±êŽÔ?åS-­~1¯?Òh ÐÌ?Õ¼‡il–?ásŸ¢ò$?áh ÑH=?îäÏ [‹ø?Á¶á¦ªL?ÂZ8Iê°?æË*$¥*?Àºè¸=H?Ú¿â\Op?ÒÏZÛP˜"?ë‚/:’?~?Ï÷hjîÝ?æ¸ê™PÓ?ä9bõS?âå…)DŸß?ÒZw‡hâ?⮆"n™?Àdá+ˆ^ð?ÙfGHxf?à_t0µxz?ÚnÃÉ>_2?ëEùÊÿ¶?¥å—tþÆ?élè$·?˜¥¬P@?îŠk¸GQ?ìëäàšÄ?Á8jñ·„?·£çsªçX?á¯3$jå‘?ËÇž¹C-¨?ÖHc6Xÿ?ïcQÄ{5‚?ßMÉ>Ì P?Ò\ÿø XV?Ý$‘¼Ôø?çörÁ#Úå?å&…ë´$H?í¼EyÈÛ?æòm~8QÖ?˜†#_è ?ÁµJI?ê †Ä“qO?ãµÑeíóü? à¡IœŸP?ØÞs͆þ?Û½$|_¬?ë¼>ÙëÆ?ß]Ór ª?ÓqÉŸ¤?© g•x°?­„¢­è¾0?ís×}c,?±Õ%:8¬P?è€ÐÜÔKp?Ç6Q[t?æDݲí?î¹hKSõ?ØZžáwÝ?¸ýizf˜?ãé늺fÂ?è¼/P‰ŽÍ?чÔÇ?ÌŽ?Ó1oè,-¾?ʞǓØKp?áÉpµ¡w?àŸ#)ÎIí?º« È»´Ø?侨ª7B?«‰`¿äà?éfŸQ°´?Ðæ,Ø ž~?Òr7³ç2Œ?ÂËCõ¾|?Þ€Ón¥H?ã|«XÉ?äÂq¾¸»?à.i6—`?ÝìÉ×Ùw°?Üwç?ïS^U°=#?§†vcÂ0?Ц,`´ú?í`©'C?þ?Ù’J`fdÖ?åEguÐß?Ð0J- .?ëÍŽ…?îWßËÅ»§?ì#ª¸óúU?ìÀ¤jÎÙT?Ëe䯔?з—Kƒ„?éYÚî•Ñ?¾G7âÝ ?ãžJ€Òq?ì‰? ?á@iŽp›?é!Èmï?ææÔwÉ?à)³¤Tw?îTøªÕ?äR‰R‚Ô|?äéÅДô_?Ô»}(;Ä?ßú¼*ÎŒ$?æä KéY£?ájeM’íz?ÃB²ñ-q(?×SL Ô?æø^‘`°Â?ÖA¿Í/Aâ?ãˆÆ|‰›þ?ØSÆ(<*ð?Þž„RL?á9ÂÊÌÔ«?êÊ6À“ÍX?ÚSÓÛ†Ô@?êéˆë“?âcÕû‹?Ó£qg³â¢?ãÝGÍ?çù­ùè?–`rô¥ ?ëÃ5î¡ÆÈ?æÐŠo=j[?ç³7Iîp£?È“×ÓÔ?Ä\ù¯ÞD°?ÒOpáÂ?Û­µœ{Àh?î–ðˆ?Às ¥Mv?Þü…%-D?Ø6cƃ%*?ï4Nû;2€?á¦àïs¡?Þ” oNÖ?±‘Òˆ ?į‰ˆ®]?ÕÊ;)ª?Üêîõœã^?é£c$Í¥±?íØ±^}U?Þ¾Ôë‡ä?˜ý*éá£À?ÕÓãq>Ø?æ ëÑ €?Þ¤«É–?Ú$vݲõ¶?çóª)¤?çßÝ<¼Ñ"?ÐWKøÎÖð?Ð=<ÕC?éM!11?Í¿UTH?Ô]ÃEÄ.Ö?à†çö¬ë9?È[¥¬À?èc¼î?Ìl°Nª¿?ÚvyK†ß?èø^½ß†?íoGŸ¯?åLÐ?Ã$?󩾼 °?Ð_‚èÞ?ä­xú†?èÜD¦PI"?ÓV&mÕ4?âÅÕˆ¨?á$ ž/"?äGó"L¿?í<`~ú‚þ?Öi×|?æŽuh¬\î?æ&é/:ÉÄ?Ø-Xç ¸?º¢‹Ò [?ÚäÜÕJ?à”µør?äÞ¢NÊ®¤?ëû_4û»?Ü€¡È%`?âm^ú>u?ì… ¸0Q?ÐbnÚ&ó„?ãNq Â6?·÷]WËÂè?î-+1Í’?Ô»¸ï’$?ͧUZô?áDÇ%_æã? 7Ñůð?ê7îù˜o1?Õ®Éð¬æÄ?«”õ¹H ?æí5:?á7Õw1äê?ïáðÉž?Ö IE_?ì7J l l?A®û•—L?Íç¿Õ|?âïT‹?î3ƒÜC?¿ ® €€?Ùüñ „B?Àsž·£?ìšœoÙ-?Î;³•q¹8?àV{¼£«?ãç(ÓÂ;?ÑÑ+í’?î& nj?âWC–ž(?íÐóJ<Õt?Ëc‰iöÙ°?ïlÍŸéA§?ë&mµÝUû?Æ[[np?c£™Wû?킾»„Â?ÆÕnšÈ§ˆ?ê™K=;Œ¨?Ö¡ÅÐIŒ?Ì«f œ/È?ÓD¯€§²?Ϭv,(@4?²'õ¹VOx?ëÈÔrñ>Q?ϤÎúne?Ûm¦é›Ãp?뎫¶4æ?íVgã·@³?âŸçÍçõ?ؼ~rd¸¦?ìõ˜Ú$ ?æA|)bƒ!?á\*‰N¦Í?µ§ c1¨?Òl+f+Ì?íÃÎöAÉ?éè;-°HÉ?Ñ%Ä)Dd?Ü‘ÚáºO0?ï9|ä·³˜?Í8Þüˈ„?ÞCv"?л©6?âµ%¸Ç2?–/$˜Ä€?é.ec<›?Ô¼v­=ÎÔ?î<º¾0. ?Ÿò|¾Ä² ?ؼ`ÛAù^?ànÃ+Wÿ&?ì뉭åÕ?ÜHæmGGÞ?âÂ}wÅ’?Ù³ §=.?ÇölT¤’D?Í®±«˜nä?ׄ‰}HÑF?À{ˆ‡l×h?皎…0k?ÖoÖɸþz?ÜG^…R?ÙT¾Ê/5Ü?á[ÕVùè±’~é?ÔMºÞ ?å,ûÐV?€À»kEL@?Ö“Éæcþ?åwÞ‰Ùß?ÀíLó?¯ÎŠ— 0?åa•òŠ×?Ðúá•Äuú?ãŽß°DK»?ÛID>8eü?ãjÌãP?Â`=̘±L?’¼!Ò¢?èo!N á?Óaļ$?ÈÒÅ)¢H?kÓF˜(å? XlÍðW ?×¢mäxÃÞ?Þ}¬ì {?Úÿ[p×'º?¿Ê^§$"p?ØCˆEçÛä?âÏ0¤šT?ÕU×Ïa^?ßàãVÑ®F?÷ ‡ [è?³¸h³ j?´I ÍR?ï ½Rm?¶ø †0?ïÄ  òH?ͨ•Y’q€?å‚Ñþ–Z|?ÄR?Â1Gð? ‘Õ;æ4 ?Ék>ùkQü?ÉךּªH?ϰ“Ý­`?Åyƒ”æ#è?êJ^ØÝ)?ãþÆ»M?ÐóX»væ?ÃtÞçyB ?ÀЏdÖIð?•bÄX€À?ìiiƒç.?ݪ4õP4†?åèSd sq?èX….Åê?­zî†?´¶våí ?ä< 4ü§h?ÒÿßP8¿8?ÑNëy*SF?É»ª¦A¬?¿¿y¦?àÈ]dÄ=?Á½3º2T?ÏÂqûÔ+$?îÇß{wÌ?éæ3ÚYÞ?ê:>êâ?é_u7´ð?×G ïËŠ?ÂY‘\½¨?ÐÚ+yÀ¹&?êëJssè1?Ö+`G3 ¸?çŠM&;îC?»˜ü81‚ ?í\ ó,ñ?àbY@íOÓ?ÓÐë jg?ï@—x6«2?ÅÙcÕͨ?Ò妞Øù®?èDåôØø ?ç”þÍQƒù?å±])íbˆ?äQw©.«?ÒÑ@ðÜr?ß®^ñÞCì?¡!ÀÀýø`?» \½ög€?첿üñ§?ÃÆ"¼—ød?ëÐ;?Ú;JBðñP?í+kýø/Ì?à_•}sv?š³àDˆÀ?q³í´‡?ã¨[Z –Ý?æ ÀÃÖ?¤r£†QFp?„–b8ÅgÀ?é\õ&‚?ær!ÁZ]Ã?Ò1#»¡ïÎ?´øE΄¥H?¾Îx2*9?ÀÁדNHœ?Þ/ µF¥ ?Ùë:Xf"F?ãÆùÍéLª?˹ïõÌ?Ä!B¾?Ôâ1r?ê?à×B´oóÞ?äZÅZ–òX?Õt’)4v?ìÆ ž“þ?Ù$·${¥P?ØŠ£Fsd?ת¨ªQg.?êO|<{¶*?Ï©Q“8n¨?î‘–si—?åu_2{¦?ïã‹VÙ?µH$b¨Ð?Äó8Æh?ߤj85sê?ÚH=Rëo6?’+ó‚f ?é¬nÎf ?çÆ/¿Èw?âÄZÝÒ?å±þ¨Ø!?⦞û(>+?à4©™NBÛ?ê9ž £y?ê…¨ÖÃ8]?ëSÝQWwH?ëB_/s®‘?î>³-·À?À¬ÑŸ³üL?åÎ+OfÍP?âî¥&qˆ?ÀD˜—íÌ?ЉèÊ \?à]Òiß°E?¨ð€8Y?`?àrX°â™?ÖÌ‘„S_ê?Gèã•h?ëq§‹Cf?Ì©ÊEj£Ð?î¿-Íþ?ç†Ì¹q?âmÅÿ¾Òý?ÜVHæ–õ$?‰§Ÿ>€-@?é&ÊÙ@?î‘\®ˆ¬?ÓדðnÙÚ?ì)EQÒÙV?ëT2/6ù?ຑŠsZ?ã·ÏÒ]?ìš4¸¨-2?ÔTÃIC?éÝanxTM?ê[‹ÆÆßY?Ð8›+¶ü?ìÿ‹D'2«?Ï”7S47 ?«õmøÐ0?Õþ¾W˜Ø?êŽÚTw,»?é…ƒúbS?íÖÙôÁbÊ?ëEäq]*Ø?åÖûP•\O?æê‹G8+?Ý+{d¥ë?í)ÍÏ?ã_ìwî±$?ìáš~S?åÝ)?w¼?à=±Ýn?èØôÕü?áW ÛŠ{?æ˜ùŽÀ…?Ù9s½rrÀ?–M(±² ?è;Ö?Ïh‚?¹â~©3?á/ªEû=n?æÙt£4Ä ?êMÆΤ†?æ¡.Öo¹?ïyü‡A?ßÂ|Ô.?Sb~J?Ù‰!мÊ?ÖN¾î¬õn?€ØühÔÀ?Ò›GUxÆr?Õ ‰#Y$d?Ô¹ y¡Þ?Ó«(ßšú?¼]  Èø?ïómöô ?ãKwŸ9?ê!Rv l?‰òóNš8@?ç†kó&0T?ãLFL§ÈJ?ÐE½ÑRá¢?ä¼y˜î$?§h!/άà?ïo ÇÝöû?ÂW×3Ít?Þ ½¾K?ÄÂ'Ï&A$?Ýh%p{Ú¸?ê°•‹ÿ:?[ÝËn²$?è}31‰–?äÎ|å,÷­?æÊŽÇ¸aq?ÂJñ^@=P?¹$%–Q‹h?¦,UÝ`?ѵ„+÷`?à¼!Ê":˜?‹±ÊwkÀ?Æ\È0­áê†?¨©ì=Vø°?ãç`—Ô"?…ü<Õ‰7@?ãÈ=Xùiª?êÐêb·?³à9@šñX?»Ó…4‚X?Ô¡5~Äî?éæ?·"Ge?¥M6¤²à?ïßSM<7Á?Ï\|`MUÀ?à.ééê?³éíÝ 0?სc5ט?ãß»öŒŽ?äݼ’â?S?Ú™kT(t?ä 4^–Ê?Û ²êhÀd?×ì< ­UÒ?îê“§æ~?è.!bõ\d?Ð!hB ¦†?áOÛæV‰½?îTdm&Z?íð11a?îÎVƒ›Ç ?ÙŒ¢ßXM?êv£W†?Ú¦äÛs1¢?áLrc®{-?âá­D,ÍO?ê!qfÐ;ª?ä¤ü:T[?í¹(hÃÖ?ä±åfš%?Ë—ÛŒ³ø€?ߟù°; ?㛫8æ ³?¬žŒ‚J@?¿~WÄÌ?Â,Ÿb?»iêÊB´¸?Ô- ÿ·ät?ë¯}1G’?äX¿µýDë?åñ$cŸ?éýÅ„;‘C?Ú›µ'©l?ziW¾µ?²Î~ùº¼È?ßÄ‘à?êI´¤  ¬?æüg›y6?ïè¿“D ?èu´åóÿ?º=„°?ÔPK•ø«H?Ç"ÇMÀø?Õ™ðÄ?ã@1Ð7G–?ãnÔàšô?é8XØ=ù>?<ÕÝ ?ÛzºùyÅÐ?ÇvýØ Ä?å=îB5?ë8üs?å‚ÇŽ ˜ë?ÖHÊÕU|ž?–\ðàÏmà?—‰{Ë@?¶sè$ò(?Áé^Œ½?ãÀ¬>Êá°?»É¥ýT?±›Ma,gH?½ÈÿÕÈÝx?äOìpeH?Ã+Bõ%„?âÑ>û’ËU?¤Â¼4ó@ ?àœ4ì»ÙÐ?êɾzÒE?熂;dY?ìeLlŽW?çDBö_¥?ã¾Þ'?׎Êk?âöXCŽŽ“?áï V%ª?ãx©ðÙƒ8?À}•kˆˆ?à~}²ä‘,?Å$Wp–?ݪÒïÞ?ÃåCÏÅä?©Pòžß@?âëå=.›?Ú- Z×Ä?èùÐIbt?ìó÷`zÄÒ?ÞB±ÎÑŽt?­Ïd†ù?ÂóºœÊ#˜?é›c9)Õ?ÌÙÇüâvt?ïPÎÆl¥{?ºêƘ»Ž(?ïª/>ŒÛ?í„ÎÓ ?ÄÁ£LËX?Ïó÷ØÐ+t?îO5)=«?ÁŠ0Ïe¿ð?ê~5í/Œ¯?ìb»®PÚ¸?ëº(á?ÚèÀºŠt?ž3e¿ ?ÖNt Hº?æ{þ‚/ÍÌ?Üô7˜"g®?ïÈ¡Ì$Eq?ÍBohì4?ïˆûaר?ÖþASÅŒ´?áôЉ„¼b?Õ ãÍ«(Z?jÕywQÊ?Ôk­IPÎ?Ë]© -OÐ?Ý÷° O 2?Ý w?jÇÈ?ÖsnÛgß^?ÏkŸ&-Çì?è}Üõ¿óÓ?ëx„äsX7?Û%7…Õ£n à”?Û÷ ¾ŒWž?î>Šº¬¤Â?Ò?ÍøS`®?Ï€Â!1x?éîp¬My?ßÛ-HSéò?íBhÝ1)4?ç1ûòö¢?åž*CÇc…?ÁšgB@?Щ¥¯à?«Þ§þ<€?Ä‘oÏýÓ@?æ¢.u¨öÕ?Ñø-íÍT?ç¶„t?àÂÕHòò?ã /²…Ò?æ® |¶ª?á ùñ2{?â1ØÊÏZ?Ï[Ëã’°?á³w«;)°?áŠæž¤þY?ïçN;gy?Ï#eöX?éSeÒP?æÁ c °_?Ç)Ãa´?™ÛKtXØ?äår„Y/£?²O‰c7 ¨?¡ÕîüFÀ?Þ?YìÚ¢œ?ïôÙv?ì:·ÚŽÍ/?Ó¥÷ÑðÙ8?ÓþZ÷àƒF?Åœ¯“* ?én@¶M`Œ?áËÉ/Ú!?ï}%ß=Ü?ᬺ?“?ë·ªâÄj?âNÉôÕôÍ?ï ùˡœ?æXö VŠ?œЄFèà?Á sâDü?à4žøªö?ÆÕ*Ü~˜?àuâÈa¾ú?ÅÞppG?Ù1½Ðå:"?à¬\‘q’}?äÁ€ÃÙ~M?×¶##˜…–?áÝNZçù²?ŸZªÆR; ?áÓÉÇëH?ë?ùá˵G?ë,eÿaH¿?ÂV|¬ˆ?çYš L?ä¡äW¼jk?ãT‰®N?딡Jf?Ô“š”Rè?î(bê¹È©?œð£Èaž@?î`ÖF¹ä1?âcqR:OÛ?îצ€Éû9?½ÝÃk¨>`?Ö…e‰¹M¢?°7Ñf,¸?âô6B°Ô?ÇgÜÒ(D?¸y­SŠ0P?âšh8ü?çFúÅѪ?í¸¦°æ`??ß'ùˆ06?·1ë’) p?å{cáßù?Ï!ŽZ)ÐT?Øg§ÁçÆ?ëP”FÌîk?èÂUjÖÍa?ÓcZ1ÌÖð?°Š<2À?ì©6ñbÅþ?Ö•V©±Ü?ë¶O°Åj?æÛTdö¾?Öç‹åït?èðÞvî ?êç¶Úi‘?êb|ýHÐ?ãà˜É?îýá{ùu­?¥ˆ bUE€?ãaVšC&?̧ú=–çl?@âI[d?ëR(Í»s?ÕÒ­C+Ø?æž '*»Þ?Ó„C’˜?ç ~7?äøW™ÞÄH?à:²›¨DÚ?Ì(ºùN?î›ÍñIÝ?èbW÷”¹?ËnÍÌÊl ?ÐQõ¤”QL?˜>º)@?ïwó ÷Ê?Üê;n¹`‚?âãñ™??ž„®Ûà ?܇Nx†¥”?Ðʸ2-5*?¶w'iŠø0?Õ v{Kž"?®Áv:ïq`?ÕÏ<Š"?¿—<\Ô߀?æÁçIýÏ?ëËÚt]=Ê?ÍLuÏœÈ?ÔÛùÙCZ?Çã<æüT,?åØrOb¢÷?é=/:ž@g?î×™w!{à?Ìl®Ë¹ˆ?ç­Ù¾”?×/Šx$5ê?Ãðµþ+cÐ?³–+Eø+8?ÏMûŒ¸ÿ0?²ôÓœ`?ë|~;o1?ìwäJŸ?Ý}§mâ?îVÁåW?ä÷bXŒ0?è§ã5G?œtˆ+¸€?Åu–ÿä?îC$×á?ï¿‘j5?Ô Bˆf‘Þ?ïÛ@¥˜=?àÏ“åÊæ–?¸ºªÜ”€?ݘز3¬?é6qÌ/Ò?Ä¿U¯¿ °?ær®aÉV?ìØ¶ˆ˜ë?±ê¹'ëø?ç¶I (;ç?îÏ(V#7?Äæ„IÐ?ÒoЯ®[&?ÅBWÙ™à?Øsøfs$ª?ÕkÕ4)–?ï´dÜê}´?ÃnÙ•NOx?ï=rœdé?Ô[Ò$“¬?ê*žTÜ5c?ë`U·IãÛ?Ý…-j49”?×A(«¹*?Ë Ñ2ëˆ?íBIð ?Ø»¹›çÕô?íÙÏ9[|?í<ºßkTÃ?âcqÖž:?홣êøÂ?Ê" ¤r©?Ò­ºþ B?áDÉ(Ïê?æs•ã)Ø?Ñþ¯Án‡d?à[ÜVÜeß?ëÄZ°ã‹?Ì@KC¥ü?È4¿bš&?ïsø“ÊrÕ?ј˜koÝô?ày©ªW?ǯÌÖÆ¼¬?e@´¿€?⮩Z¾¿?º¬³W™âø?µ%FÕ’´(?´}å¿ ?æ[=¶þäŽ?ß+‡¾68´?¯Ñq_˜.€?èòù´/‘?¹ÍÇ[•(?äkýxã0?ä5·mpb\?Ö¶?ë"Z?äöÒÿ?ÉC¬ð»QÌ?Ì7¾¿2ShŒN?æ˜Y ò6?âù¯·ç?ê¿Qà ¤?êcŠáèSÔ?äaOg׸T?È׎dP?â§(·ŒÃÅ?ë_ Ú?®?²5›ßp?Ófº”<Þ?ëÒe‹c?²×=j¡@?âKÂtÛù¨?Ð4Ø‚û8ü?Æbδ˜‘e¬6?ÖÑP Ð?ësÇÓlÐr¢*?¥º¼,ˆ¡@?à¼ÀÖ9h?“€p,)&à?â0e—Mµ?Ï&°,aÁ ?èáû-“ë-?ì¶c  9à?韒8]?æâñ*éë¾?àXN~â%‡?å|¸þ?ãƒoš„/Æ?æµ^¸YJ?äTÖŽ]?æÜZøHSâ?é?‡^‚í?͆Ùg.oä?­WMÔÜ?ïf¬·&`¦?µœªì6"à?Öqâo^ ?Ås¢Ù”ò,?雊üªK?ï*·DÐÈ?ëAÀà"hè?Ä÷£‡ ¬?àësÌá*Á?Ä“;P”?ËþÿMG‹?èþ«8I?ê–WhÓÝ?æûtð’`?î³ ä@ ?±úúñ`?ᕉJ[¦?äpÙÂ|:?å¿äÒ¸Ã?áê¥LÇf?é„SÎÅé ?Ì-)$A3x?Òß!ªÍPì?ïÎ:NÉ?Ùࡵæ;2?ÍbOÜô?‚îh™1À?æïÊ›%0Ç?×PL4¼ \?îÞúf*š?Èù៼?áõÜ1Alø?ã×@TúO ?×’½’Ùˆ?â;l‡ø;À?Г[hYÌ?ÀÂtÛ?îiÃF¬²†?íµë!üÛc?íøÔp6¿?Óò•š ?îÓŠÈø¹?Ã]éhX?Ó}ùˆØ?¾Ï…µ;ð(?²öI8‘Ø?çMIHD;?í‰W×U+a?ܻ٪ ÀÄ?é¼E»®5¤?éJð'Xã?ã½RoÄZs?é}¦ ?¶è¤öp?⮿uèÈ?åµèîQ†?×ÔjÝ~à¦?×%;Ä÷Oz?ï]årb?ë€3‚=Ùö?Ò¹Ž¶V ?æŒÝSŸA¿?Þ]BÄ,?ç¸â:Œ·?mZ ø'À?ÜOÅË»“ˆ?å˜iaÐã?Óh”±’¶?íÓÃé˜?Ãiþ~ŒW ?Ë,ÕRT\?ÖÇ_›Ä4?ãŽö‘G?Ù% v ?ækŠN/œ™?ÔɆɮü®?î„B³²H?ꎲÎê?¤z€Ä ?ØÓD[¹Ü?©vÏøµŠ?ï½üWÁH?ÕèÞsCv?¾EâÊ9Å?ç²Ôϧ¨ß?á¡ÖíT3?íeU³±?áßÄWwß ?Ü @U\?›€a\»Ú ?è13Ò£¤³ƒŒ?ë.Œ[  ±?ïøs6%·?Ú÷ I!Åd?êWµs§S?âu"ú{+æ?î²’™RL ?áÉ<}GÅZ?Ôh*U¶Î`?ä†Ud‡½U?îÁ$Nعv?Í - Ñ¥?©ñ²v®ð?î·ÄŸ°µ?åºë2úv ?ÝãùsF?칌¿vô?Ödë93ˆ?êDC´\?àºõŒ®l?㸽¯ùR¯?œð;£u?ìŸ`Æñ3g?Á0¬l/(¼?Þ9íÊ-¶?ç˜U~ ?äa-G_âc?èkÁB´É?Ôkæìôð?qÞ},H€?У'B‡:Ê?ÏâÜ'(~?Ï %˜2ôø?àæÐðç¤?áÞ3SÖ?èÅc©–| ?êñðOêÖ?ꞎjÔ^?Ò%"ÓmãÞ?Ò¾jòÉÆ?áM‚¤¯3>?ìàt†ö7W?ëÖøþA?À·ùãœL?ã>³8Ë?îAu/ƒÇÔ?ÕÒ ZON?ìäËöm¬?âPV—@ý,?ܸ¶ÒŠ•r?ßFëØè J?àÅ, ª`?ãäZÇæ®?¾tnV]Ð?³ÁNÛ³À?àüŽ4Í£>?â$ø&»Ê?Ðì_sÊ?´gÂ0n5x?׆޴ÛÒ?ÝFÄŸ|?´eLè³ ?çÖÕÙ$x?°Š¾Ák€?îlOÄ”ª ?ŠðlŽ(´@?íh—ºª4Á?ëëŸ2Mô?áã`ñU½?èÞžW€r.?ÇL\\°VŒ?Ø ¥Ôèœ?æWñl?ô¥?î€Óü?èŠÈË+]Å?îQ‡(Qp?·VS«P?çŠe¤!è¶?è‰i7:C?à5 IP»P?âÈ·àw–?åÀh? vñ?éÔ&¾¿k ?¡€IÖÓ€?é&á£cê?Øôø}Ș?×}B3Ë«º?ìîö ƒÛv? "Ü(»gp?®ÕW¡@Ê?î’]i&Q?îk B5?½ã’$v(Ð?ÔJdµŸb?ˆ‚»øEt@?ãŠÚÿ$5?æ–ç¥á:?ÙxØQ{jà?Ò»o°@Ò?Üèp›í2?[ñÅ/À?ØO-ãã£Þ?‰€Ñ!8§À?äÓ…j-Ì`?îQ¶É®¯?赓žqË?ÛJê5›6?¬í¯óÒ)Ð?㿘–@?¸q¢ÞÀÈ?ÚýkÖ!Ü? _»¿”š`?ïª nLG?ã*ÁáÓ4?Ûºìñ-â°?èg̃?åú‚±9 ñ?ÏRíñ´Îä?¥Aº5E¡ð?îwÜü:ä¾?èiͪõ¾Ü?ç<3 ]"?ÄØÆ²AÌ?æ •n¼¼…?ä™2,Ú‚_?ëà/¥œEB?èÐ|:;?Ê?<_û”?îìÚÚá5?á=.lRl?çA ÿìç?±Æ‚ˆ6Ûp?䓞¸éM?ë­Aðú ?ÇGwÞ… Ø?Ó?Í äæ†?Ýãj¾`?ÝO] ÚÀl?Ç¥ëÄ@tP?êíBÚ¡~?Áê=FEE˜?ÊÃ;ìjT?»ÂPäiX?áÐÊý•<¢?†eÝBf|À?Ùë}‚q„?À’Q1T½h?éä%&ýãñ?âÀŽó^ßî?æT®èI?ÖÓÝÉ…ùÖ?¼i¶æòç°?×8þƒ 9?ÅïÈ=^våL?Û¿ òýƒ8?çáþååå?›QKnÀÎà?îWtìŠ ?î¤|—T”?ã?fúþÇ?ܤˆ{ñ@Ž?áuœâ$š?½¦;È’—à?ên¹å/ÊL?ÓëK#xq&?í(vH‘‘Ã?ä!@‰¤!?ìïÂÙ_dX?ç?1Ï{qS?æÄÆR?ÞˆÚHË^?éæ¼ !·?­y)ð½@?î¡Bxy •?ê`Æ¡g ?Ó€¯š±gt?êŒòÐÒÎ?ç.-uJ??ÇÀŒlœ}€?ã +ÂÔc ?Ñ»l¿éž?—`{MÖ@?ÎOãLäáô?©P“™@?êkÿŽ‹b?ëéyxû}?îný¶#_?í`ó© ¯?ÁQ†‹c|?é»u¨Û²?½…ТÆˆ?ëǘCøŠú?äñAJ?ÂÞû¸eÿÐ?»›–•Ç ?Å,@ÖñÌ?Þ×Ý–ò6?ÎLývº“H?ÖËEû}ð?âaäiõ?Íi|éê?ÑŠyZp?âÞ“£€?ç×g4UAŽ?è̃JV'R?ã¹0mn¼?äTÏaÈ«"?ÌQ61?î ‘_]û?ÃÉòÃ39œ?Ù›»“;†?çtNº¶Š³?ë„ Zî?ïÃužc '? Šû]Ð_ ?Å̈‹Jép?è™2É®U?å’ò²ÕÊ?ÒmK(?›í Á`?æœ}&Ô²?ß5$£Š"?´t$t.!0?¬<Ö×°à?ÑQ T÷?Ý'®âà~?¹âãÏÜÐ?Ò ëBÞ\þ?æØÙK[Œ?¶ýŸÛAÈh?âê _‘B?ævÿ¬ò’n?åõW­§;?&¤7;?ì¤æp<¼é?äu xVÒŒ?â ª•|ÿ5?Ùàa ;„?á¹cx5?âíyÌU?êõ…æ#âä?ëÉýC@»>?  _AÐ?È#ze— 8?ƒ»ÉéËz@?æšS«@)¹?º_8îX“?ê#©ù3?ìE]ëB®?×fl5—Ch?æŒØÆ?ÆQEtJ#¬?Õk Ë'5L?˜ 'Y7© ?à÷û­!š?à÷¹,k³N?âTÆî[?Ún$P&$?ÁYè“¶d8?ÊÁTÀ¯“t?âaÅhBü?ã]G¯yŸN?Ð)ÑÁ€Æ?½¸'{²é?ž?±rp?¨I«]?ÚØAä¯íº?¬Å=–ÌÚ?ÒˆB“‰L?æîŸ=%?íÎ0Ç¡X?ävÞg9T€?â„¢rR?ë/ŒRr:¼?¡.Q´Ð8ð?ädº¸Â¡y?æˆ-gÜE ?à~âBž8?ÔÎ×þ?ãr7,VaÛ?×®ÄcãÞ?Ü}\À”Óô?Ýñœl͸?æiIxáð?éÑõ&æ®?Õƒ,Kb»,?×7ùš?t?á§³/Þµ?Öm¨ªN?èíÖ‡–?ï“­¬F?ÖízMñƒ¬?ê:Œ?Ò• U ²®?×@­¶3v"?ë*w?(Á?ÁñiFŸP?Ý·ÖJÑþ?º€êL¾Ÿ?ÄÀ´]Ê,?ç’hër™?¦òzÔ»¤à?Ù(§Ö ¨?êòUç)â?Ù¸ÑHO†?Ò£ˆ6+‹H?íŽ=èò?ëÞdaÉÆ?Áƒ&|¶ï ?ÑÀ/?tÍô?æå奺qd?ªÕs¼.ãÀ?Õ áÃÖÆ6?è=ÌÔ I?âKG¦9¥¶?Ö«&¹Ò ?¼)+ß– °?Ô‘Èr ð?̤aŒÜ0”?ç©pêõNJ?é'r›h¼?Á[(½ ?æ(²²yá?ÊFô?ìoí5J÷?ëvë¼È?åâÌi9R?à¶Å ˜Eè?ê¥±Ðæo?ç’§Ý_¾?ìóƒõX° ?á>FÓ«_?ì&ü¨úT?çìtT,²'?à~Òìç6?Þ†év·v?Ë2Mär_$?ï×½b„Ã?Ärßn,?á)¡\zE?刓BÊØ×?ëªí0ò¢?Â[(Ž¿À?äs9tS{w?زuw\P?Ä=F~›Dx?Ü(á©Âh?åÕ|»¨-±?ê© ˜ÑCÙ?ß·ÖªTä?Ï‘#Îh#?Çhå—)?Ø·´C#û4?ëh"¼Pý¤?ãvMÊìW?ë#ðl,©?ÙÕ)òNKö?ß’É3Ewš?íáëz&?Á°\q@?±äBySˆ?á¬DËf?Áp)9,?ÂØ{&ûL?У¾ 7è?ìb.>'Œ:?ëüX¤JBª?â´ßõ~0-?ËòºÅKx?è)Ú.•ûF?ßÞ …bB?Œ¤JS=r?ÞD³N£öü?»3¤˜ZL?ÕQÑèI$?¡V¤â¨@?ÁlíoY’x?éÿxëë°?áµ!ø`–2?ètþõîÝ™?íš­Žm1?Ú”ˆ÷áˆô?èKÜTA{²?Ê»pÎÐ?鸾@å'?åíz«½ 9?®Ãæyj‰?ãËc¹èÃ?⇑Íç¨?ÌxýªqE4?º”DÏ„À ?àÕb‘©?Íô½ iÌ?Ów¦îé{ž?³äÜ/0‹P?åt:áé˜?í0áJñµ?íE®ñ. ?ì¶K0ôPà?㺇ق?âªØÚÎ?ÞÞog*ˆä?ëYŠgÚ?¤ß›ægt?Ú5riæ?ª|ÅWeWð?áñ…‚-‚b?åY»/<?Éçêì•p ?·2:MZ?ç…8–‡†B?Ý8o&ß?™‹sãå ?”ÿIåØÀ?É>Ú¤6x?î‹ÆÛ?è¬Þ®83I?çÜm ÓÆ|?ÙŽ÷ø  ?·ô‘­b[?íˆî ð…T?Ööж/hà?°$L•,X?ÇðÑ…Œ`|?ì¦]ÝU=?î|€— $3?™~TàÕüÀ?å©‚{‹Ÿõ?ëIïïô? „0M¾`À?ÁÈ¿¯šÔd?í:!ðLˆ?èNzí:ö½?è3ÓlÝ?å|©,peÅ?à›AÌ“h?ç—´¼„Ýt?áâF§Í[|?œ*¨Ó]à?Ê3[O0?µ2^ZH?ߺäÙ‰Án?ܰ’ñV?¹”ËîW ?ç+FUFÆ?™ Ȭ§à?ÝK¼ Uˆ?í¤º¹rgË?ïTÃ?°¾?ê¦ÞÞ%®×?îø-÷eú$?ÌûÒ•Kt?ïɪÍc?ï,ÚQ?×ãÉéK:?î>’‚„n9?“?K¹h€?çE‚à‘«"?틬Ȧ„?ãþB÷–A?ëJ²„T° ?Ù8CW ?×FÀ²òÙÊ?×Y•óé!R?ç9›+¡)u?êm×r˜\?ãX©šv?éí>@±g[?áZÐÈHm+?ç`|ù‘–?Âp€»8r?ëüHK;S«?%°ÒÑ`?×:|ûÊ:Ê?ê(œåH?åá<:u?à­wüÃÏ?éo¦"`b$?áq`‚,?à5kþui?çœL¶?ÜÁ|l‡î?Þøy\Î?È ‹s™¬À?Ø«4 $?Òíš+š?ÌQ¢›˜€?Ù8Vë?²?µáYLIp?ïê[ûRžV?ï\™ºÔŠ?ç"L%mMa?ë)\λò¤?À”GæÆt?ë ’á±?åÕ—‡—?˼ìѸô?âÐÖ\s@›?ìm执?ëæAÖíò?ÆõEÀÀx?êìAÐÖà©?ïãsÈ–CÎ?ãÁ×dǧ?î 'o-8\?dž’èÙ+l?×2ûPÎJ?Õå…3Ù8?ï±UæÔÙP?솿µÿ‹@?ç¥îíâß?ÜþÆdŠþ?§Àûhåæp?Ú¶rF°ˆj?ïHtO^Äu?çù^¢À9˜?¸`“,]Uø?íÕìúm4?ãÞ:·ü?Öý·Æ up?ÀC°É”Âè?ÞNSCÇ^?Ñ0·îd}?å'"gdE?í®yÿáTz?æ­Ý}㜽?â•jÞÙP ?ì€6•¢d•?ã¶Zc#ªž?ÇH!úÌ?·ðeõ ÞP?ã5>$?)?â±Äé‚??‰ Ü?Ì"x2áÿ$?ܺ™±UŠ?Ût(ÿôV?æ2§Mdœ§?ã£àcˆ(´?í Õ) ù?ÊC_%ì)?lDÔnÓn?Õ€Çåf£h?ÄTÓ¨”8¨?ï2Љµà?ãÚ‚+ƒâå?Ó¢æ37Œ?îfQ+?Ì.´Äü?Η4{¥N˜?éL*z¼:-?îŠ#Gæ[°?íò[… Ì9?ÞÄ‹šM9”?ëMPïÒÍ|?p+ƒ¾æp€?ã{`ÉÕ*?é¯}]zØ?ÛoƒX\–?ÛDi.Ïp?ç+”X^Ù?è´K·å?½š¤ÙÓãÀ?ã½''Å?âºZcÍF[?ç¶Ô|ë?”6¥u‡À?Àõ9}T?í·ékju?ãa ŒŠ"?ëfV.¥Œî?¼×\±©A?² …(`?ÈùÑhž”?ê xtÆ?Å€G-ž€?ȳì¡ü?Ë'‚À?Ôõ{ë&8?ÒE à¬1?×|!Ÿè?Ø©ÿ*:éÎ?àù»¤S?ÖZ’G]àV?ítõ§Ð\?ìR*£õ1?éÄð'´•?íDF‚Ÿ L?Ñ d JL?ß íëŲÎ?伨” 8ð?éÎE&Ö·?µ´:îBÙÀ?®L;$‡0À?ëºjžqÿ?Ò “ZR‚?¬e}Ð?é »þ×?íM ´æX?ÏkÍ<çTè?Ýó4]„?ä Œî@í{?á¸9ß‘±?ÑTîäI8?äìC¡LI?ÑÈÝ¢^?™¼•ØL]à?Ù|ëøÏšÆ?àçV¬í¨?Òf<Õ`¿ê?è‘Pí˜?Ò…Tu7‚¸?ÚêFiB?½ŠÞ¼»X?âç¦pp™Ä?É[åd¿6?ÒÍkCb?íÒg)Þ?éŸx¾î—å?Œ "k‹Õ€?Øx¤“£þ?æDFëgmµ?ï X±y?Ú NhñN?æ–?ê õ>^9?ïtA2 ª¢?Ól¹ªºÞ?Ø– o8F?¼OkQ…ØH?ÞV\õUt?Üß«B>?ÉcX"$è?Ía2z* ?Óf•è4d?â¦ÙZøWK?Ù{u¬qÀ?ê‘PÑ?Ñ ‚» (?äZý Àž?¹Ú.ˆEÈ?ƪ“:³?ÞÎoÅ,`?êvê×?áÕ[©òµ?âŦ²lÿ?íÀÜxv'Á?Âß«¸l?ëKðʹúÐ?âúª%Z?ëM/ñFÖ?ןù{°@ ?êØj›‰ž?¼Ê;Ûˆ°?êØ, ge“?ܱ’7íl(?³pû†hÈ?ìnîIZ‹?êd*~®Ù?ヽ®+ˆ?è×Å‘f±»?íϰâä b?ì.» ƒ?à“FLÜ^Ä?ä‘nÂ|ˆ"?Å¥#ªZœ$?ß¾ç+ôñž?¼”¾ÚØ?Ü(Ï#«à?À¤ÃvóÜ?¡Ó¡`?ä­IaQ?æÜaÍwç?Æ*&£U+„?ÚÔU_`¸.?åÅ5éoäp?È Á–dŒ?æ„HH‘:?¯ØF_*^P?§ÔtIÂ$ ?æi^4I‹•?êõ¢.¤?íà/±@J+?íh#¼Ÿ%=?»Îj-¤Ž(?ÚúÎù(Š?À Ò%ŸžØ?ë8<$”§?çqC Tcæ?äìe½«!Á?ÓPOCkwr?ï› e/?è*K>Ù.?ê?ùôÈA?ëúdÇr¿Ò?Úϧ#:­˜?ÑÈNl’l&?ÖGñ&,Ü*?®ãñ® @?Þ|þïNŠÄ?Ä nI#:”?Ï¢6»,?„uÓ³E@?à°~ip¤L?çnM‰u–?×>‰ÌÂ?àœ³¾@³?Êš™nIœ”?®«úCž2`?àÌÖsé ž?Æ:‘E‡„?냳ùÕº¨?ê(hy6C[?Á7·£ǘ?ã‹çSÕñ?îHÊ‹Ö,?â, ™ØË?܈"Y´?ïŠ † ç?é7Ü Ñ‘?Á$ëUù\°?íµ:Îf¬?çx´ÆŠo°?Ëd3«Š˜?êúïì²) ?±©ÄúµP?äÔ}7H«?ë7Tý&†í?¦*?à–ÖÑFôp?âÊÌZ3?æ‚ýè@8?ƒ…¾ö¿+€?ͻݻ`?Áw7ùÑðP?Ö UÉaì?Éõyk¯??ƨwðõœ?íúb{Èߌ?è$†ö¾a:?ÖQJ&ò®?¤÷Žgú0?Þ…h–¨ J?¢uáä?»§G,’Ð?/ÏÞZÀ?过™(”ý?éá~>Óz€?íPsú)[~?áÖ`OË›?Õ^Á’®D?Ã‰ß ¨?î±?Õ\€ ?±\wbl ?ä °^èOÅ?æØÍäü¨?àSÒ=x?“ߨ^ —€?ëw‹»ãâ?ã ¬WwX?Ù\}ËÎ?ÃvéºÛ |?§ÀÇ–Á± ?çHœ^—š?·>hŒ˜ˆ?å¢m:þj?äû4RÝMs?ÚMÜþµHd?ïòaV¼á?×E(é¾?Õœw<Õ¤?Æ¢ueêd?íš²6’¬?¼¦¼´k¡x?齦 Hª³?Ô×óö?£]Và'šð?í Mc@ê?Ĥó£Àô?æ †è?êRïs×Ü®?è j¼óvþ?ç!Õr÷?çOeÖþû>?áÓšc„i.?îÿ®\{z'?àþ_oUÁ?Ùù©–¨w6?ãDtEx†Z?çøãZK5`?æÌëBŠT0?î.sÏDrÌ?Ñ ¼éÇý?½E$PáØ?âÀ“[dg?áw²3/uï?Ù°7¥É¿X?ì=×RÑf?¶£lÅ üH?Õ_dûþl?és(‡«"ò?èO"Ät[?Ö´ª9j|?êÿ¼{>b?çj<å?Ìf¦«É?íå|ŠÏ‡m?ȇ’t”­L?ìÃl>R~?é c…D?ß,»æ€Ì8?íéÀ;÷?•w± £-@?ìß ©Aä?νh9’À?ì eîè¢W?ŵvÑu ?êTxvÆ“Ü?ç ½í!Μ?ÝÅ]Œ®?çAÑ ë@?ä¶ýeÐÝ?½m8ÇÙ2ø?Çàó¤Ý5? ;é—À¤?é"…>–1?Яg3:€\?Ñí§4ä§N?¢©cI`?âÿˆ!ÆÓ?¾ý&{0MÐ?Ýk‰-Ù™À?Àg´ƒ³È?åïZ+Kþ ?ÕÕN?ìùÈ&Záî?åHô_æøy?Òq(?éÜê?á(2Ÿ_ý?΄Ëà lT?á®G´Öª„?ï›!^ú“?çñà ý`?èsž9s,?ÁOÞ,\ب?ÜÑ,?PÌ?™Þ{­é€?ÀøUõbÐ?ìàb• >÷?Æ qd"ùÀ?ïJõUu—a?ÎñÑcQ?ê &®ÅŸ£?ë ¢º?Óˆ"§)?奔?hj/?Á›mgÄãà?é¼»ÌâPm?ã+9Ðõ?Å/_úó¼?ëM…àÎ?Úv÷LþÎ?ë°ØZ1à‡?ᣬ´·3 ?ïb¬ ?èI]]Â?î2Ö¡ˆïÆ?Ò •¯öœè?å nèÊ ?Üm®s¦l?ÜZŽÜ²?ÒlCÞêB?ï‰f(æ?ÄÝ‚'ÍãL?çì:ÄGúv?Ø}—Ëf?î¼ñ\Ûª›?âľ>ÁXð?Õ`®yíä?ÖEŒ]Äoî?êf$á¼CÖ?àÈÒLGa?Ç8HuðŒ?Û¸c&jž0?âüÿôÿã°?Ú¯²§2T?Ô ðˆÜ¨?îhɵ;2?î'Õ¨¿ê©?â1»Ûx›j?ëŸA~ß?Ûп *?Ü`‚ñt?ç-†íQƒ?Øe£–ò&?ëà‰%À 7?â¨u &²?á~º˜¤š!?é3uªL+?ãw¼µf?îÕ¡²ø¶Ô?ïŒØ·Ð§f?Þ9¹Ÿ…¶?ê Ëÿ!k?å ŠPL?ëû;Ÿ»vY?é%ž¶=ºR?ëÄß‘"Ø?Ü|0»{å’?⌫;Êø?ÚNT¾Î&?ïóh²i,?ÔVA—üt?ººÿY¢è?ׄÛ6X?Þþ—‹ze`?éõQHîþ?ä’MÒŽ?ì¢óPÿoB?×5R›Â,?ëSÖJ5ãÛ?Ûç€ï!õr?ìž{5-”Ñ?ïp6=fù?â¦G¡?ïΙ‘e‚?ÑL ›¼íæ?ã†!«]³ø?ëðÓ›K\?ëH þ {?ìSGñü¯!?¨# ›ð¬ ?ç¾Ò³b5?ºä#ÉØè?ܤ¥öÅ¥–?îh9 ÙÛ!?ë“%Ï$vì?¿9ëÑgP?埪é¾Ê?âeíï–™ó?ظÔRüƒN?îÆ¹_çË?ç›Ðm?ÇY8V jÔ?ê0\È f?ÈçÏ·zd?àŒÁê„ô?â((Íÿ&?î6³q Ê?âG­Ö?í®½ú€Ö?å7ºz½Ôæ?èЯ`}¤-?Þ8NÙè?¼za¿…¤(?Ó|g0u‚?î5ê;Z¢?Ø®¢ðŠ9b?ãœôOg£?ëÀ¹3æ©?äîègsK?ÔÜö°ÇŠ0?æáŽéïR×?ãÌ<ýcVt?´ßO«÷Ð(?ë¤}+fýn?âÅÀóŸÔ?àa›½U€?é°ÏŒ .j?ëÞcú³P?Òtº}¨s²?Ò~WÚPj?æÂБ€ý?£!G$ÔÀ?Êö*À_ä?å}ûÁÍ ?íõpÝŒ Ž?Î{ê­ïj8?ÚõÑÛåÜ?ÝúK§62?Ò¤9nÁF?ã~¨â9·Ô?Ð̺8’±Ì?èÙ*Õt—Y?¹¬ß\—Sx? ž$"¶ ?ªbcºîù?Ú‰œðù~?ÔA<–?Ü’pq "?¼J¯Ñ?Ҟ˞^¨?㸈&o?£çy­[ó ?¼HoÐÐ?âé[¼E’?äp†ŠÜï?ãz™ÅÀ%~?ÒÓÚð~pb?ãr³dù?ãDÒäz?Û qpÆl?¹à!Ãd¸?Ý|Áf-mD?æ>ó б?á¯zõϵ?äXä`Ûß?å¤SÔbl|?è¿0nc?ßμ‚?éÝ¿õ?¸X yùRh?Ï3®‹¥ì ?“ïW±¤?O;c?åefnþ?Ý{mô„†?Ù=¦c`kÊ?àÞš$र?戵LV€w?Qúd4å?ëaEh¶?ã¾÷Tëw?àJ/˜ßŸ?Ðk Éÿ?°0æk¨°?Â\yvn `?Þiõrg‚?¡+ß3 ZP?Ú¨–Gaþ?æåztúôU?ÒB ÷»œÔ?åG =»„?î€ÿŠ»t?Ï¢`Ã*º¨?Ú/;íØ?Û&/M4X?ê')ß'_?é{Ëò®9U?{ÝŽ&ã“?äV¨Ì j\?äÊd-±É?ê„+¡UÕó?áðª±Nt ?ç»3}aÍÆ?ÑϨËŸ²?è$7¶?å‘íÛœ*[?§–£\ƒÏ?ÞÃæü?ìºÖã± ½?Ûʘ Áj?棿Î?ë—Š¸…¯Y?ÔbЕíã ?áÐE%f:9?ã{—’ºÚ?ìÚ¬#áÜ?çi¨Ó!6?êZžÃjùF?Ös‡~ßtt?ÂQaRÛeð?çüÇ ÄÀ„?ÔõÿÇ=&?æv~Û¢Ð?Ðêg !ŒÎ?ÃLuøì ?èP!|X$¼?Ñf­w^÷ü?࡟}S- ?ÑØríÒcø?åóÝÊO`¡?ïu^cÙ?–#&ûD??æx¼8åU?îumMõõí?æ„Ì;[ƒ?ì„h¨7?Ö !J8.?ååìxqá&?ߨgœÅ.?Áº ·Ö?çÕö.ebÛ?Õ4 CˆÖî?íÊ@ñÛC‰?ÆnÞÎ÷HLæ(?溨ÿÝ?ØnœŽG?¡ªÐà´?™Œ;œ ?êZŠ(×;?å†«Ñ ò ?êˆ95ŸLÃ?â»j[M_‘?è¶ Ú¯ð&?ÍÿË×@?ÅèQé ˜?äÛÀüB!?îþ¦}K… ?µº¦brÐ?îP2?¼øòA}LX?ÒuwçÈà?ÚΉלJ?á¹´9;‘…?ÉÍé¶HÔßeR=æ?ãËò»|(j?ê3©¿'Ø?ÕGÝà¥pR?Ú×MCÇ(?î™3œ ›–?ÓnytgÓt?ÚSy!û`?æ;3MNP%?äF?:Ù–ã?äØýÞçýµ?æ,9.¿+è?tj–A?éÜfŽ0@?è„~¬¹G1?âq7xí?¶?íš¡ÓRÞ‚?̶B¼ý?é½Õ¥—?Ï%{½nÔ?ÖþÐCZ?ä,ûÀã+?ï(•[âL?Ô8tš’”?à¯gN*¬î?ÞÇ]ƒ¥ÇPªQ?ï0;­ ¦?í8°í`t?êmØÕ]Ô?½–qÈP˜?ï^Þkh?í¶_ÿC‡?}æR €?Ã2ÿ)æ„?ÇQݸ˜?ÒKÊ'Šò?ê0Éœ®h?ï6Œ:%×|?¶!9¢j´ð?Þ„VËú?ë‹(Åb‘3?Û#“Ó¼b?âÛ=‡/›?›HP'.š`?îØ"ð$2S?Ÿâ?’w* ?ã`~n`?°ÚêŒ#`?㬞UáO?±’FNRX?áWѱ§ƒQ?ê„| ?³?Ù6@GIF?æ’ÝU°¥K?°B]U‡Ph?å^•"€Õñ?îoö™;?ÓZ^gy ?Þ>õ¢h"?Û077/?¹› ”оà?Ò>hUÊ?µó¸-Ò–?ìOãÐô©æ?Þí zœ™¦?áÀ kµ?´·/ôˆ?çÓ©ÖË?ï<´úIUl?¯¸DªÔ¡ð?æßæaÉÇ?æÓùTGR?®j7Ž÷ú°?å«Y’§à?ï0p ód?ëÓd¨ß—?ET?㿵Œ­¯+?çæS€ØÏ?Ñ1Œæù@8?ÑÌ×Ã?îqÑŽ,R?áùQ±d, ?ã˜Õ$Ò©q?à «Rµå,?ã=‘­k`?硨%Ñ¡ç?貄êsÎ\?¬ÉÛüGá ?ו´©RŒ?ïZ^o 7‡?Íi5o²èl?åGìÞ¯ˆ4?ã PÛ¢?™xß&ö¸À?ÔI¨¤Î?è —"z*c?ÀÐE,\?ì‰`ÈV:{?îyxÎWTô?É2±äA?ÒH£a«D?Û|Mê Œ?×rh›d¨?çRI=wº?Ÿá/ô£à?ÙT>ðt?Üë%„l’ ?æqåÔ³Ú?êL¸Ò¹¬E?™ÃO†ˆ?Ö…T°ù6?ë¿[¬?æ¬zX¯?æ  Æ©?ÐWŠlxN?ë“ì<§é?æ2*Äß?—!¦éûÀ?×"Ì¡x?âÙZÇž‡ ?åLaZ˾?Ìtù;Íïü?Íí~'˜?뜶<\?ì¶$uÕ?èž’ºSç?ï:¹  oÕ?礎Qƒ=R?Ï€à3Pÿ?îá*à—yv?ï2q(®?ìvÊï®E?ÂëvQߤ?èçÌG­µt?Ã¥¥â•x?Ø©õL?ØrÍŸ¬š?æªôp¿?ä!Ä]S?æñARgD3?æù‡/?‡!•#L:À?ϹZmÌçØ?™INWµ@?æqæŽÛZb?Ę$‡€™Ä?Ãñ™ox?­°œ+{:p?è+^VcÎ?ÆY{óöUü?©[Á¸Üœ€?ç^yo qé?Ëø¨µâ€?Ý·{8Oàú?ÜŽ8·Uñ ?à’4™\åŒ?íW!s,§?ÕÌ4Ë‚à ?Öâp!ÉÈ?è©»XÉ‹?Ü‹zì[â?ä·7Âza»?äX»g­?ë¨{BuV?àç’›:?P?æRb(½_´?ÑKA‡[ä?Ø9?¢¤ÓÞ?ê‰>´æšA?ë©<4{?ÊÀŸ1Èý?á ]Ø5>Œ?Áˆ´z?[P?ÅçŠùQ+,?îäÔ[ô¦’?Ò¹l§±ï^?éÇåHü°Ù?ÛõìEß5T?ÖÕ& s?àQ{ýF?˜ÖÞÉ*Þà?ÓêV"w(?áh¹hBÀ?ßN9Ô¦Ä?ãè°Cøþa?ê–³¡–„:?é¾XOâ­?èÙqéIç?ÚTK¾\?ïzQ~ÿ?ÄUþ¬3Gè?ãÝ0³°Ú?Í€[6?ßÒ”‰ý£$?Ø7ÚƒÜ?ìËwÈ•¬?­0Ú+ÍLà?Ñ1ê«K5|?Õ ›5±À?¹Cu´ñ°Ð?î—¶š‚?ã÷±ÓÞ0˜?쥇$ ß?ß„bCî?ØŽ×ÀÖè?áydNi¹?ïy:ð“Óæ?ÀSÀ %à?Ú¾u4?éŠìš#ñ—?» „Ñæ\€?àÏ˶HDŠ?Ë—7ÞP?Üp Rºx?ìëŸîk^?Ú„#Lì4?ØŒùZnMB?Ä—„Ë$Ø?ì®ÇU£úy?í^éÜÈÇ*?Ë¢HôUX?Æ>âH ×d?àË"(¬?ÞO;&©2Ì?ï3å߉YÍ?Ù&°Ê—"?æôz ˆdÌ?¾=/àD È?Êk˜ ¨l?ãH¨rˆ¨?îÍÑœS?é,_žÉg?Å–vžn˘?»ÅÓð=H?ãÝv×û ?éÂd0M/?°ìË£ñ?ÖÐð¬ä”?ätp§î‚?çÃ)5OÌ?ë:œ›d¡®?Þ¨›î˜v?Ø')­Ø¯ ?æ;Œ &–Ÿ?â~Bo®v-?ê¼L·²x4?ê? ÛÛ'?ÊÚ ÜÁh?܃ÅxÐÉL? £tUÝò@?ÕHkº/~?ϳÖSÂÀ?å6§(AX?·ÕkÀ È?¾Ù¸ãå°?åÌwä"?ÊII@ÀSØ?홬mÝ{¼?în®yb×?ä@-¼ìX?Óo Ú…é$?€³zß~€?ÁFD¾ð?\7ž%–ò?Õ«â@?ß¶öªXÒ?çúo–ƒÿ[?ëAÒTÈå?ÍBH ¹ƒô?ÄÀZ9óù¼?ÓdYi„ˆÌ?Î%§à"dÄ?Ó®D'Xߨ?ä¾Üû„?êΨÂñ¾?á¡q½°M?Ü <±‹˜?ïäªNÃ?ë?¨.ƒ«l?è7Ò›¶¯?Õ\„·Œ?ã)9AŒT?¼ŒôÁF ?Ò÷ÑØy¬P?ÜðÔƒ»Úx?å÷.–9?ÇÍ S4?Ù»›ƒxãn?ât‡¯ä¿?èãX?úÙ?ÚcP¥šW²?ï‹QŒxT?ÓvõŠhÂ?¿ÿ˜ÒȈ˜?à^m¢­¬Q?ÅÑ``AU8?Ò …Š ?sÛåoâ†?Üg¤K&¨?í_rEv?ÍÕZÎT?çŠø\#?ÒxØ^yÎÐ?ç q%_?æhðÛSŒg?îX[ùÇN?ÖH/qÞñH?àa™!Fëê?ê…=O£ö?db0Ÿß@?ѬôDÉy‚?ïµfL§ùÖ?â8m}O?æ¸Uý çã?Ýò:¦ð³?ëQd”“g?Ô)‘ö…V?ïå>C#7?ëÐâ¸L~?ÁWOƒ?wÄ?îñ=yQ½?îê®ä² ?凊_dx?åÑy×KÕh?~ÝÒkŒÎ?ä¬zh&õ?Ä´üšBH?Ë]§µWÔ? ­†RP?êÖ <Á^?»°UvL¨?ÀQ[~=†L?ºUTò1rp?ïNìY©Ù?Ê>vú^ˆ?áCýÕß~\?ëŠö¾E%?Øm~Ÿ#v?Õ¿‰¤Ÿ4?Ú³2çp?献 z[Ñ?Ï&šÂ ?âfÃDhçu?à†pß•}?Ñøx‰0?é[À$þÏ?Ö°‘ ò?Ù’ëU?⬆%6 Ó?Ûe¯ ·RÀ?ÓÉ©¥j˜?ÉËŠ.Æè?á çꤳ˜?ÓàÈ·›”?¾¥;Fª`?ëBù@ÊE?êÒai(?äÎ÷¾›¿ý?îèäqîòü?Э™tQï”?à^pN¥”?”5Îüz`?äö%0Ê?Óp\îăÚ?~ȃ;€?è~ÑÎójO?›Š¡-¼Š ?í¡’T*Û?äÊ” q?É$e#^h?Ѫp¤lJ?ïìD´7Ô?îÏj Îe^?è¤?1µ)?:CÅà?Þ7¢=ðn?îkR²ñ?Å.ÉÊ9˜ ?×°(Ú´g ?ãž!D²&Œ?ã-¼Žv¾«?ÜÇåw,?·Žï¨ Sh?Å8x¡`?ã„Ùu ^?ºLÛ Íõ?ßZã:YÃ?¶¯38?íᇠLƒ®?ˬ¸ü»öÜ?Öðq¿ã>?ã„^sH-³?ºîž­jÆ@?ïQ?-…ï·?劕Á_lf?ã¹ß¯€Ös?ÇÝ•´!€?è/(ox¡?«ÊßÒ˜`?ÝŽ³Ž¶t?ÉÅ÷ÐmÏ(?åòÑÊ(H0?Ö²úmBœ?Õžãt®<?Â^FÑ„?ïÖ‹ÊÒV?Ë0æ¾ô}è?ä:®ÓºK?íëeŠ˜?ïZ›Ì+åü?ïJ´Â‚²Å?ïSýâЂ?æq«åƒ}¨?ÐQª[=ð?Äu7Ì´?äsHý ?ؾn®}{‡{þb?Ƽæjçƒ8?Å| %ˆ?Õ&ê0d&˜?ì<£RÎJ&?Ë'sø D?î¹èß1Ýõ?åao†Kgò?ãÂøŸ^ ?šÚv<Ì?ìW¯yþ‰S?µåTä?áþ`ýü?ÑiLGâ*?îžvÎ?ã•W4È’ß?Û”È8oM?ïß_“!“°?ç(m•oõA?åÝ@QúX@?Î,¸5µT?¨øÌuPD?ìh°£”?°B"E ñ°?èÀјÉ|?œÏÚ=R@?ÔŠxR’ ?µÀZÖ{¹?×j $(ˆ?ãe%}Ýêä?×–I£ïH?X¯–?º!¥æ‡à?îˆÃ#ä«2?Ði§½3Tæ?²“bµPx?ݪËQ²?Ó;¦ í˜?æÖ¥Þ ?ãòïch?×GÛÉø–Þ?è¬ÿ›„±À?äo  Op³?„é´Ÿìè€?ÛR•\w¶?ÔÃÌ"±&F?娅‰ ›?Ü'gÍr?çn6þî?Õß9Câl?ÁsMĬt?Âm¯X°@ ?ç1¢´xÞ?Â}_–?  ÙjáÐ?á¯3@ˆ=?× ød§jÆ?±û'-è´Ø?ç}Tž§D*?ÛÞZ$`˜?âYÏé^kx?Öâ݉:ü?½*ýÝ^Ð?»ÐÕO°À?ÈÔÈ?îonxÉ?Ñf¤¥Tyª?ÐøyIE„ ?ä¹´³?ÉI~ckCô?Á1nqô?Ú¹­Ëö?ãùÌ*‘G?çHÛö_ä‘?× ñZÞ?ÚMáþÌ?ìf嘡‰?ÏvibÀ?ì¾KéÒûÍ?×Z(½spB?묣ɒ©?ãmu\ó‚?Õ6êxì+Ê?áíj=ºñ5?ÚeVPô?¼–hz Ê0?£(›ú ð?×T±bn?áКd=-?ä)'-þ '?êˆ ?Uô‘?äš6>ï?·|¡$¼¨?ÛyºŸf†R?¾4+Eodx?ë9ýa‹˜?á¨O0 ´?ïm-¥ÊÆ?Ù…ÿÜî`ð?êV XºÖ/?ÙX˜m†Ò?¾A÷è?Ê™T ï½D?º€šõä” ?ä÷>Bzô?êrÃe(Ó)?æoËTNóî?ìÖ2b:§?Ü@ã€&Î?éiÛ¬?Å'ñ–ÁåL?ä€Džj·?ÔaZiV"?çæß³s"œ?êýö»€ù ?Ñ&‡+/^?º„5Æð?ÓM#Ó¨À?ë%ä(iž°?ì‹”*«¯?Îåúúh?H?¾ +DKå?ÙzvЪ ?×G5Ò?ê*D3ËŸ?Õ‹|ð˜ü?ï_½{|Ûø?åtvãÁm?á{#å+е?ìËaÒxží?æëRÁvUm?ĕ̌¿ Ü?±£æÈðQà?ÐÔ¿NPk?Ùªª 6%¸?ïêŽz?ŸløŸŽ.?åYúr7o?í¡ÝžˆW±?3f WÀ?Ø…Öºã5Ú?ì¦Whæ¾Æ?¾qŸËMX?奊¡súÏ?ãPÞñ´jg?ès¦jw~?挄@˜2?¸êÙy.P?ÂBbõvûð?Ø2Þ&?¿8#nÞ/ ?îÏÏ?¥¤~?Ìý´Ò4 È?â¼ü5<øÅ?ÎbƪS­H?Ù‡p„\Nz?嘆º_{?eÁácX:?à[ ,„?¥ÏvÜà ?ë…86‚f?á*Mé)¢ë?Û×»üÅ ?ëþ[{ûˆÞ?¼PénÊ—à?äÎÚ}cÑ×?Ñ2Ó{n@?ásç*¦â?Øæw‘’SL?ã•>8z?ßö]ØSò?ΨyçÜ?È3*˜äS¸?í¿ N‰û?Î(Jú.Ð$?å‰ÚHýÿ¶?éTñe%?èª}4îIZ?Ò1Äìµ…4?ê¢uÕ?î(¹<±µ?絋£Ø{>?ÛÐÍaB÷Ú?í> ¾øã3?àý½ú­Ö?ØÎáÞ?äOŽž‹"®?Üùÿ Å h?ì\Á9»?îãi’ˆƒ?ÚñõÌ 5H?ÖóNV’Çn?â±BKî??ꢔNèq?æÑ®7⤠?îÖd‘©Öx?ë<®9oþ?æß «™à?ïð‹#D:Ò?åù²gd?Å^a/V°?èò`kå3?èGµ«Ydg?Ï"ǨM6X?Ýrƒõϧš?Ö;‡ï#4?äÛÀæôá?ä*V 0X?ë½sÿ±?×ÉI™ŸU²?ãù‘Je[?Û‘ìYT?Ò¦{h×j?Þ•)½^©ô?Í›¡Ô ˆ?“ó¬Tz ?åi–zçJA?ºíÔø?éHU¥nª¢?íÿøüº¾¦?à®e#Mw?ÝïÌ%~@€?ÆËpbsäx?íØÐ®ç§?ámô_—?ÝJKáR(?α«LpŒ?çÓƒhÁ,@?Ú# ”77†?îý–SP?ÒÜ‚’É ?Çpô‹CY?é±Oü.Š?ãÉ‚Å×\?í[*Âòám?ïá5£äÍ„?º%8¹Ê=Ø?à½k·šŒ"?Öv„pr;x?ìõ³¦+ž?é ›vøD²?Øíáòþ?ÉÇÀ8œp?í>î™BŠ?ÔxS‘Æîj?Èæ&çflX?Óµ ¢ì>„?Êf%Èèô?ßn›ä2?éá^Ï@©¤?Ñ×vvÇ$?Æ€ÿl¬?ä”Ɉڸ?ႱyzÙ?ìòºýÕrå?½„lp?ë]l]w*å?¸é])â±È?»€Ksç?î­ ± =Ù?Àç8ûn:„?Û]ã9Œ?ááG÷—°œ?ïÜ/lx”?é²$ÅÖe0?ïMªíxça?æRENeî?Óó¸Ò€ò¤?ÔÆÊaÎ?Ûšër):ì?ä,´m2Y6?Éàæ8º?ï_@¹þ{†?åŸ èR±?æ•Åi×Óä?ÚäX˜?Ì\éò¢â`?Ö»w4ËL?йv œÞ‚?ÔUÁv1ë`?ìƒ6ï&.?Û ¾Ò|¼ì?çx|ƒ?ÎÌTÇÝÄ?í¡³Péé»?æ4é†pK??ÚVgºïÛÌ?à YÂÜ”q?½QÍù=?á²ýG®Ð?ë]­c¥?ÉprKÇä?éDNP:?ì@³£+w?ë³NPMì?î8E,Ž%?À”`±o‘Œ?àã½åá–?Ë”yË’ô?îX³sÂ?‚{ïÊ¢À?Ó®Ê2d?ä¿ ¼—æ7?£`´ÇÀ?ÙÊ¢ûÚåª?è¬ËN’…?ïÉ!×õHˆ?é÷д?Ýu“q³2Ø?ï ä \%?íµÛ˜¾âK?ì8Öÿȵ’? xí„Ð?çc‘Ü ?êÕ@ŽYóU?ä6e¥?Ýe÷Œ?ÄnæWEl?™Þè9œ@?äqÕ8F†?Í¢[ËN¿œ?±l6Zöà?äŒÊ_†æ?Ùßç©GÏ ?Ù%köX?ékz‡T^Å?è×.­gMà?ÍÑŠ{­d?ëï¯Nà&?ã+@ެÛ8?Û1W_5\?Ñb†9“H?ÀBaÿ¹ã ?Ë‚/IYRÐ?ÏßÞÚåÇ´?íkŠ6 ?È«¼ãh?ÜËéjª":?Ñw $<$6?àpkl„ð?Ð`ã=ÀŽ.?å€wqeœ?éy-;°ô?Úœ‚Ÿˆ‡?¶,+1‡š ?ÍÌЛY?’¡ŸØYÄ€?¾?›«MãH?Î(Ú¨í(?ìÍæ£–•?ÙXÍ"Pœ?çW)æpqÊ?ãizK§?v˜X¨¯Ò€?å”öլ΄?ÁÊ^z¾G´?Ïü*b%‚Ô?ç„tñ+ÝW?âÃÂàHºO?ë+†ûYäw?蚊Á\bo?ëáI£õÊø?îŽ_i?â!™¯.0r?Ùù8Wðè?ï¨?ᚊ“?ÉL¢ÛF ã‘ w?èóN ¨Ð?èS2ŒØ?á |Ê0+ê?Ò§Õ¸tÆ?ë Ýá]'?àcN™#kä?Ãñ$)ôöÌ?ÇÜXÓ‘l?ëeßQÌî?ì»¶ W²?Ù\SµN¨?â>¢­?Ôò¤în5¸?ؼbbО?îBŽ L®?ɼ3ÙÊ ?šû…ÏÛ?ïŽ7 â™?Úïx?Å­¾o,U?ïSŸPlé?ؘ-ìOé®?Щ bÚà?帻Âï7?ÇW®„â˜?í©NbmäÊ?ÐÖ†«— š?‚©òß@?ÁÜhúuõð?Ò¿Nôœ¢d?Ï\.à¼É\?¦m·tÖ—°?ãTd3x õ?çí¨;=éT?â…Œ@³aW?â”þ„Dx?ÑD¤³íX?¹eËÓ2¸?èÆ–7žê?ß yæ?ͧ N 8H?Îüa"dsü?ÏD1Ógü?²í­P?ŽLUi ð?¿dwš-ü?Àbæ@?ÑŒ§ª`?Ã\ýà?ÕçZ·x5Œ?á“Ô˜Y¦‚?é<Çþ€Õ?Ç|¸?ïö–bçÆ?É’xðÚt?ê»MÎö¾?­ehGpp?åš¡«(MÈ?å&µs–‘;?ïŠqø­ê?ã·™""= ?Ãr–5lì?²¦ Ò*°?s}¬<Ï”€?Õ Šöý%2?Çù?Þï ?êöVÇîQH?ç×còk&Ï?êE¨T”ëk?ì;-x¡²?¾<å-rr?Ô™'@(?åá·h¦¡%?àMÞPãÍ?álâ` j?ËmÜHϼ?äw.±Ø½B?Ó %–؉N?Ê¥X$?éáè$?äUœûf?ÆØTjÇþˆ?ÅÞ+ß1 X?×Ù$É\¸H?æ¦|0ªi?ÐÔ÷Të”?¸¯eÞ ?ÑÔHð©{X?ÔO ¸¦Pø?â3°‹¦ê?Ò{šÉ'‚?æˆúG|…y?Ò¬Øn,]¢?Ð’4°ä?ì·#:/?É#Áýíƒ$?ê~*‰8ø?Мc7Ù.?ÖÊZ¯ç0?ß, úX&ü?¹ŽQР8?ÒQj'L†?åi( eš?í!i¢]–B?½ŠÝ°|а?âBöƒuV~?ë—iܯ”ù?áÔúš¥Ã˜?ꤜ)Ç?àâ„¥£»?ÐÌÈå^ö?âVäx|¥?ç_¥B.s??ægÏQy'?²‰$}ÊŽÐ?ï„é{¸—®?Öæ £®iü?¼ï3¾B€?îÍEƒEp?в‚x/ð?à—¾Ã‚3Ó?Éýrï?ï#òÂ5?ÁÏm­íÀ?ç­ì…U?ï¢:¬¶ó1?Ј08‚ò?ÚóSÜÃj?ë`ö”Tã?ÛùÏœ7×à?êœkyÛß?ž3ø?•`?ê0—ìUY?ÈJ5Ȩ?狱éÚo[?äªí_V§y?ï´¯$Ó–?åþÛÉR?ؽ;tëÖ?ïFá)\?íø±xÆ?‡9¢¬¼?Û/J꺆R?í>ýentA?éðþ¥~?ºN˜ÕP?Ø& éœ?çtÁ@›´?È¢ÃR”t?Ñ€Ð=$kH?ëýØþ 3R?Ø][……Ñ?ä‘ï¯Ùn?樬Ãm ?Ÿ¬?«+<€?í°Ì?¢Z?Ù}ÃU²íÂ?ï7=ÀÄ1ñ?Ã&^Âênt?áNòÈz#B?ïwƒ.i¹?ËvGÜ[ˆ?ï!;½èlR?×Ä̤ä?ë¥ /‘+€?׎˜Ý ”?µ¼‹àæP?ÕOYYn?ìj}ÄðÎ??Õ–uv__æ?çÇøA)?èG¦ìÁÝÚ?䨲C# ?íj·$Ç?æÔ…F®(q?ã? ´Ó?êÎû\{ûT?½#ýM€. ?ÜTëSt@Ö?Æ7AW7· ?Õê:™?b?ÐißÙž§d?ã[·Å?îA#Ž"}?½9ÿ?à6⌅?Á—ß§ÅH?ʉô8R?ïœê—t?çÜm»ºª?á› .Ù \?ÂÆ3 ¤Œ?ÛŸ·pî?¾)¡ÕΨ?Àéb­_Þ|?îÙÞH†ËÂ?çÓÕ»eÐ?ÚÔ“€ä›ä?êR¿‰„®?Ì‚%b|yä?í}]žYÒ?îÐëÇCú?Ëf¾ÜhwØ?{›y Û’€?ïÏJ@'õÉ?áI É( ?¼û‹î…p?¿¾˜Õï™0?Ü¿{6+Ð?«?'zJD@?ë¹77†Îí?¬…—?ÎÇtj=(?ã¢`£ž?è³Kýàäá?í¹kdf›‡?ætSÕÈ?Õþм.J?Ø8é ,º?Ô±¯Æ4áZ?³™“²8?ÙWZF8?Ø |ªyð ?ìqÆ[¸?ÂU\Ä'Ì?ìUuÑ?•x¢n?»¶¡$wp?ÕÙ ‹ò?ëº!¿9@!?莑ó›¸?ïjp„: Å?³;ÑŽJ?…á`f&Z€?éQÛ5x?ç"Íp¥?ÐÑrŸ¨L8?ÊN|yÆ(h?èÁc‡{?Å¡|ÛhQÜ?ÇGÄRûH?ào‹I”Mø?êbQ»u›N?ؘÔ*.¯?ߘ§XÎmt?æ¼^%?ãP¼ð™Ò?è g?ÖE U0ÿ²?Ó«ðþ²sâ?ë¯ysn ?äß¾Ê ;D?ÕPÑ£'¶?îÚĸ?²/~wíô?çÜiE µã?àáj`ºþ?ÒœÃ?ÐTˆ?áIÓz¹¶?×!D–š?â²Ì }È"?ì7ú5mÍ¡?ãÃÙçªæ?éÏp¬ å ?ëfnÿÒšú?îÐ'í?áÖ}w\Ûî?Ûp“Ê8vÈ?Ø‹]Òv?íWRÞèº?A§®¾eà?íG‚Ïoq?à –Ô¹?æ6 œŸ£t?ãèèéÇt.?çŽ]ðñ?æ|RRpìÔ?áwZ%Kí‚?z ’j™5?Æ+Fã¤X?ë=˜eÈF€?å¼± Û©~?ÚÊ_É Rx?âõdž©æ?âþµŠ<}?æøö•Ž?t%kmÁX?¡âX2õ;?Æ$ÆJ ?¼”ƒ°„?ÃìcÀw»4?À§GôÐd?¿àxTÎ\€?Š|­gç@?áà“÷s[K?ÖM_ À*?ç×Ëù—Xù?ÓGüt¶X?µ6­ ø?Ḧp–{¨?èë†0rRß?ì^Fwáç?ȼ­ß3Ø?ÛìE@Š&?èõ1‚¡ã­?Ù\ ”?ÂE~‰§ï¬?ëÍ3¼º(H?ä<¤a½¼?Õ{—ë´Æ?Ô4°ƒÑÄ?ìxxˆþ¡/?æЦ±÷ ?ï¸Kû”FL?Öëµ ÊƒŠ?Þ?˜P5`?ä OÅ3?×ÁäÉÈ?ìÌa‘¦p?ác3©a›?à Läat?é'?´ðÓ©b/Ø?Ê<¥h*À?ív ÇGG?îšX !W¤?ɺ@yÓ(?ïL"º– ¹?y@Ød?ìà{±ª¢Ä?Þq¹¶?ÓÒ‰ç…qÒ?é—6 Ý³C?ÞÀ16?ïC½?v»ñ?æ÷m*‹ œ?Кz•ò„ú?žá+Ó° ?ãÆP:Õ¶f?Ó ¨&uo?ÚwB6ëcF?Õ«8giò?¸çæÕô0x?ãÖM‚ð?Õ§-³d?ïû#nÈ*?Ïßpò‘ü?à)v¯–û3?ìé‹ï©"K?äzˆHmÃ?à ÄHÊÙt«T?×I%¡MÔê?êѪf3y?ãaøCb€?СÉô‡0”?îÊð ×g?Æ~ˆjž7ü?ã9°.¬?ßnÀ°[z?ægÖ£Ðþ\?Û ã Èz”?ê—´©Î?ì\ÐC|® ?ï¬éˆ0!ÿ?í9TQ'o?èC,D¢P?«l-kà?ØAi&m9?Õ!Î¥?Ø?q_ôŸ¾?Ü>‰ù€?è´µò]ygÀ?Ç”mΡÌÀ?å§[UÖw?à”£» ç?ç¶G˜­?xŒÅE{h?ê ¼õ?ïcÙ nï?Åo÷p/H?æLDôŸ?éri·è?äL†±²”ñ?æ£ôZ=`ø?áBP#wûá?¨±T +°?èæ A£?î Ñ-î@?çÒžÌÁ?äíé-Ì«H?åeîØÌ??Ò¨ëÏÖ??Óн5]UÈ?Φú&t?èLÈT§G3?ÖÖë¶cè?åW†•Œ°?±±äØ‘W?â‚R̸bŽ?“7™GQ@?æôÅ?üþÞ?¹ê«Õ§nH?æŸö­†N¯‚ ?Íg,ʽöˆ?æ}Å…ò×?¥2ƒÂ?Û}“΋c4?åó0-®jÝ?·×Úhœ…Ð?çÑEµR+{?Òw³«[&l?¾ÖJ“3Û?ïOˆdâ?å¸-ÔÏ?¼px¸_ ?³AèDp?Ýö>^O²Ì?Ù|.9\l?゜P@?¿¯…UDQè?åòÆj ï?Ïš/¶W`?ârF&?äœwÄ/æ?ÐaY) =?Ü‚r(¥´?ì+»ŽJD…?Æ]¡0 >D?פή?¾êKU¼X?êl5ºÏb¹?éÙ9ˆ•?íÑOrÖ?æÚj^WÒ?ãЙGì©Æ?ꆄÁ˜L?ïd’"³9?Õ´ƒ-6~?êÇ`û¤º ?ÇÝ–”Ö?à½1¥Îi?¾ ¿7³ ?Þ ô 0à?åŽå”N©?纆¡a°¤?퉽ä6?â Ëȼ ž?êNáAà9?Ç žŽÙzt?ë|ÕHâ?¹¢ûdW˜?Ð!ºY „?Ùófrwx?ê½lS¦ù?¹]5˜¥ã?èÈ–û>?å+S*F¤?±q :G ?ãzÈp×?îjâÑ"$?ì5M,e¸µ?áíœYm˜’?àå¹Au”Ë?érŠäÓ?ê(ÿaî¸ ?仳úI?ïÕ í¢k?äv?tÖ6O?Ý>ù5p?Õ „äZÆ?“ªÑŽŒv€?ª޸γD?ØL¨¬T?ìÿYù›?ÅrúŸài„?ß{$‘7;Ò?ïþrp«^ò?îùgw)–¥?ëIé}â•¶?æ•êgë?нgӺʪ?é¾¶Ü5?í'Â:Éç?ÌäÞòŽ=ø?á¿óì&Ý?ê”ß·?åµi£©Y?Õ]R]¡z?Ñ®|:ép?â•¯ŠœË?îþ)FÙ ?á¤_û"–Ô?â[´áß—?ÝÖ#j…öü?Ð:åç?§ü¬ ‹°?ä­Á¡Js?·‚ؤP?é®ÊA3À§?á>ÚÍÕW?Û-Ò ,´?¼‰Áv+ 0?±úÈÂÂ(?ïδŸó?ÞUsu†p?ß„"ê’?íÚw„‹¬?å‘^mA#—?ï¡þÜG1;?Þ´^Öä?éͳGX?²ïoðyÿ(?ààÈ@t¿i?à’Ê¿pÁ?çÍ‘¡H?§é.CZwÐ?ë ›qIë?Øún"Cª?ãåËœ®}Ç?æý7ý!Ì?¼‡‚N‚ûÐ?ÆK%8©~ü?ïq„3tÍo?ã_.i§=¡?ìþˆxßÄ?ëßÏn±ô?´³[*˜?æs ØDóá?Á÷†Âšì?ɦ?púçX?íRôq|€í?Ó•0ràØ?ì·×0úÒ?Ó©ëk´ûJ?¸V5ù ?Ð ×¢•6?ÚÀ= NO†?°r§½7å8?çß]òj‰1?é=ÍÕÎyl?Õ¼Hl?çXÃÞUð?ì67³uù?áCvyóAh?ï)Ø} ˜?É”nä®l?äáBdžü?âåé V?Ðsïh,?ïãgm¿·?Ùçƒ^8?àŒ”¶ƒ”?ç§ ¹³Ÿ?àF9iÚ:þ?©I”g—ôP?ÁÀð]ЄH?Ú—2u.¸?íbGõ–±!?ãì/uÇ´?êŒã'aþå?ÞžYQ™?Þy–^ %N?åÑ5µW.?Òä™w5/?Ђ¼ùûØ?Þ+H™~?â‹ô¸eb??íŠØ¨$?Њ8±ŽVÚ?éã~½°è?íÅê‹0bI?îô HLÉð?Û.¾2kØ?àR8$°|t?ïAA鸬ü?ÑÑg¦aÌH?赯úJ7?¢>=“½?ëÅáb/?è=ýÒu¶8?Ñòµ‡}}R?âƒpËî‰X?½é1|Fˆ?çÒx±¢„?à^§›?ênq—î†-?¶‰˜CØ?áÚ\~ ?ìz[Û+?¯íuúXð?® 4EC³ ?Ê¿c³œ?µþ8B¡“À?Ýš Ér„?ÈÎâãã$?å½¾‚â ?ÑË œ]ò?Á²Ï-~8?ê± µÓp?¨ÞMüLñ°?Ç'otð?éf(|0?è²cp(?àøYü4]?æcj‘iÇ ?è˜"‰ ßý?î g –ý?ë"ÿ²C†?ßHößµ2?¡P?‰H§ ?ÔÙ“g’?ÙÛ&)ñÖ?ê‘Ú^?Ñv¸4=á^?ÌG:>’8?×°“½aJ?ïHËoòO'?Ñ–\‡™6?îVhw ƒy?ÖȽÐ-è?Å)Ï Yœ?̵/®£ÐÐ?©¢D²?ä¹1Ðþ?؆ °›ÊT?×Ä|cŒÆf?ȨÑôëÈ@?»Áô%†˜?íàn$l$P?u§§9.¸?Ö½nòŽ ?ÖDa"jͨ?°>ŒL¤… ?çÖ/>çü:?æùÁi;?âÿà)qsš?ì4ì>?œ?äRú:þç?V··6;†?Ø„ƒƒû?Èǵn*´?Ñe› HÒ?¹‚´"È0?ánœZ•?ÆNvŠBp?ë)¯ødLæ?ì¥xctª?颸æV?Ï~gF”°?äÁ·_hJK?ÕþÔL•xô?äjB]Á~?Ü‚·ÿk0Î?ã\׿žg?×òCã’?ç‰àc“ ˆ?éÆ-×BÜù?¤¶©lZ€?Ëâr\ê½?¶0ee†?×Á7–?äN_?ê¡/z㣂?á£Úà²?éRÒˆ¼¶ƒ?ì`ªÍÿ!?¶–'C ?ÞªÔ5[âÜ?Þ™Ì?ã,¡²¸?çDP ¾Yy?ÜÇ• ÓD?Ô«íì­Ž–?¹á5âuü?ëËÀã~ ô?¤¡Žé£öP?ÛŒ‚eˆ"†?çDh]¬¥r?ë™W«»¿?àȪ¢­?ëÛÜ抖?·y¬Ñ`«Ð?Ç˺?é@>äà#á?ä½Ipš7 ?ïo£"@“è?ä:õ Q5^?æ—¢ÿøìÍ?áµ')áu?éŸêaµ?é±œÔ ¼Ý?­îv%‚`?ÅR$ ?èIÊwÇá;?æ*|~;÷?ÝïÇ €’?åf— ?ÛÍÀúìfè?ìiÂJøR6?ê³ñÆy£È?ß³j#ÏŸ¾?Ò«eb?èÚp£?¬†Y›`?â ’@Ò@?ÇÞA` À?ײÌåÛ5p?ß÷:Åújâ"©?àž ¢fk†­Ð?ààÅ‚%e?éeøâ?ê‚×h Ø?â™ëKÇ?ÌÁ ›õ¼?çÏyöFê„?oü“lŸÔ?Öpîôiå?È©:Ø0?ß—B¿&?î¥ÌÙâ5?±©6š×A°?Þ>h]4x?ÍKÉT±HÜ?Õ‚á=¸Š?è ±­¯ìí?ÜCX\¡Ø?,=@!Ì@?âBtÞñF…?ÔrÅ=WGª?ज़³k®î?Ñ^ㇵžÒ?êè[zÀ?ë“‹1$g÷?åRà\ d†?Ãdûëߎ¸?½9†)y`?àfSªëÞ?½¦’õ0?È[<}71ô?ÐY—ZÆDJ?ãp–z É?¿Ëmk8¨?Ò =^P¥ê?ìa˽‡?ƶ… —?Ñ nª?ãc+ï0Íu?ÈBÓgB} ?í“àƒêö?ÛÓ>ÓŽH?é^“_+±?â?¥¨dj??æÊU°fÜ?êÙ½™iÐ?“!ÄJc$@?ƒ ¡Ê;?Ð¥ É"È?äÈNš¤ih?ðÝ5§G€?åBÓ?côŒ?»¹$›ß=?Ï>˜SŠä?îû¿D«È?Øã ¥¼Ð–?àéà×Êè?Ô8n?ma>?ÒÊL#àxâ?”úF^r ?¤eëŸ[Y@?ãšÆU ø&?èî1Á~?â^ Wƒ¯?ÛˆòBj~?Õ¾ƒÒrö?¤²Î˜P?ë¥OæƒZ/?á‚ÀZk6M?ÌNÇoO)?Ͳع0?¹™†²/)°?íBš`|D?×F:/xTz?¥ûªkî7°?ÂײŠã­´?å-<€¨Ø5?ÑœÖÍú6?ªµÖ]‰À?Þ2|üèjè?ÞI">`ô?׳tN[N?âÞÈ“.“’ð?È”BñÐê ?ÖÑ:gG?âwdª‰Ö?×Á¡²„Þ?¤˜T)©§?àÞîš¿_Û?Æ0ʘ.b¨?èvHhÚo8?°’qÊAþ(?ã<÷³CQó?áþýHºëÕ?ÓOñö?ì×\/C³)?è»i–Ž?r^ö,?á®6­{?¹7_ JM°?îópŠ?üz?éñd6lý?жp&çl?Öºïcjö?éß‚ÑYŠ?Ú8/ÍúqT?Ô“Fõ§>Ì?î_qÄû?íù™š^Ý?×Rþ ?î1-úÛ ç?è&vÞÈ3?àÒåÐ9Bg?ÏŠ×]¾ü¨?ê“»“CE?į̀w^?ÑøÒÁøJ?à:V¥Rå„?çMËd+ÿ?âݦ  ?äÀE²¸ð”?掳ᣘÐ?Ú„6†¨?ÛÚÄÖè?Ùl3”Ü1?×¾µì?ㄳ7?æ1ÿùk ?ךϯ¶?ݰU£=z?émRv½¤2?Ø*=²yZ,?Þ;ÏÁQ;Æ?Ø6«ßXõl?àˆ÷¢¹b?vsO €?íÜ<ï~5?Ñ´ZÖõf€?ÆñY§}X?¥º&¯¾ðÐ?åbú§?ìÑ×ë8Ã?²q4Éù?íïá:qð?¼¨¹Y‚PX?Ç4žB­2D?àãÓÅ&8ÿ?çÕ û£ù…?Ü…0&E?æ¬À¦I?ºahñæP?å’Dš2?Ó€<rf ?â*“ç7à?Ê(hÌ®d?ëvߊ5æ?á÷{=¬¶Ì?¿«¥æWH?ãéι®2?ã½\B&¦ÿ?åÒšç·]?ÒÚÕÈD ?à¢âáy ;?׎–Ûè?å¸KêZ?ÕÚÎ`Sí~?¾lNÏ?ÏŒ’Üš6˜?ÊÙNS¸?Ù¾ƒ­Ëƒ?Ö’/L'„?̱ /Bõ¼?⮞Ÿ¸?Ê×vÃáL€?åÈÃË?ᆳÆvÑ?á§E›Ör?Òu¾|õ?̳þi;”?·ûP¹¨à˜?è,"Ï„Bã?êûL;·¡?ÛGþ ÛœV?ã­<Ϭ?È{د¦d?èCC€?Û£ãª)‚?âÐÚŽF/o?çU‹Zvªs?ì½ÎmAå‹?ÍŒøÂŠg(?éÆDÓ3S[?࿃"}ÙÂ?à*eßÄ\?à¤R„Æ.?å·¶½0˜?ØJ¼è”=Î?Òið(“lð?ˆªþD€?ëuzer€h?¥éæXVP@?â`ó}ô?ë]3þêþ?áœBb²^x?Óªc<œV?¦á#MÐ?äÓ»´h?Ôîë¹í´Ê?ám‹É2[?ᯠ|O,?ˈ†¾éü8?âÉ’&Äš?íÿÏÊ~L?å?ÌåÁˆ?ãsÿ„ãê×?ãž Uhv?Ëùó2s9 ?À:oÿš@@?Íÿ;G(@`?»,Üó0bÀ?à®gA-N}?ë„}ÁMu#?ÖÄP%L?ÈÔôfÚñÐ?âëãƒÛ2î?ÓX.°í)Ö?ßlÌŽ¡?ÜœPêTf?ë]ö¬³òh?ìg‚v¾2Æ?áYðó²Îå?ÓúWÄ(?á<> vÂÿ?½ˆG…f ø?Öw’¼º?˜`'ɵ ?ÝùèT†!„?Ú Ôã­„Ú?ÛL´ƒ£¸~?î# 8µÚ_?Õ¡C+—:R?ÜpvD¢ö?Þ¢€q³T?ï J¤Ø?íö×=ð½ã?}²!- V?ß Œr˜¦´?ííŒ`‘ >?æZÖòÆ ?êŽdò}b?m7ãk³?ÝÔN'`œ?çNÔëLÉc?‘ì0nì< ?Õ¡4F?ï%H¬"?ç‚éP ³ž?×ÛìŠÍt?»ù…_Kâp?áôFIé9ª?ÍwI=t?çë-–È£>?Ú°”Ò:Ü?¢‰ånîP?Ø‹?HÍp´?é[œfRÀC?èJâÍ飿?ï´‡[€B4?ævž–ñ?ëÌ|j H?Ú+»±‚~?ê[½(ìw?Ô¾'G³Ž?ÓßÀù·Æ?Õqž×¹?Ð:ÒɘÊ?Ô gjÓ•L?áìEd‚@é?èGdǘÂ?íèà?ïÞ@Usè?îo¸eAÔ?Ñ…¾˜˜*È?áõpj±V?¼Ã/ÙÈ’À?Ï[$‰ë|?Ób¾êª?ã!Î?ƒ?àZdÜo”®?èU縄 ??Û1‡ÞtŠ?ݲhuÀ¡‚?¶Á(§ÌLP?åð0D *?—•?.®`?ì ”±w6?ÖBð|.ŒB?Ð7£S“‘P?ë„óPâ?⾞¦ŽŽ?çú±âV ?ºkêE lØ?â9>sK?í–G";ýà?æçF õ?â£õ=X?Òä>:+Õ?×ÜA4?§ héHb@?Òâ×È»;’?îæ\Ÿ†óY?ÀœT– [¤?æ«EI®É ?ßŦÅ˲?µÌZ˜ÀÕè?Ñz‰ˆ`h®?âÞ~,3Šù?߸]{ê·?îC{ÊiAd?åop¹?Ó4"øVìÜ?í3´Ñ?Ÿ:?çÄ_Tðb·?ïÕGO?æ‰ ÷›k?ÔCYCQ_d?Ò°Ÿ§QP?çÎ5ÇR2)?êÊWÐ7þ ?í4¾³šè?ë*¢‡ˆÚ”?Íf.b ”?îÏF²Û?×­Õ ‡´\?Ç$½…Y\?ÖÎg¸Uì?ظúHa?è"úäC–?ßI_`ìÔÚ?ËßçÜ4Y„?qºiSù?Ú†£õÂÔî?§0ƒ}€?²ð5ä<?é‚ ý;‡?çRX­c2Æ?ÆZ— Z3ä?Ã½Å¡Š˜@?ÓíNcY ?Ü 3nü@?æŠPØc‰e?êäß\&V?èH©Þ‚s(?ØŒ¹3XG¤?î¡Ò« ‰?ЩÔèÌ?rÇ=7Tr?è25`["ì?¿üæ¸ÈªÐ?áW7ß÷¾?åÄ©þ{³?˼'úÊ,x?âÔ eÆgx?ì¯'e¿tò?íQÚ–8„Æ?É:jÕTûl?ã»ëOzš?ÚP¼¿¥ Œ?ßHƒe6Àh?Ò!ø§£ ?Ø¿éH©à?ÃòÔÌÞ¤?ä†|½%?ßÎ.íŽ °?ÉŽGV-?æ"+SB÷?¹‚ýT÷0?‰ 'Vñ@?ÖË×e;?Êã‘Já>?ˉ½dé@?Í€ YN­¸?ÅEÍâ}¨Ü?Ó„¹–:õ0?×Ì,¤ £j?Ÿ®à[F< ?ïa»®•lù?ã«þ¦›V?â|˜Ûäúö?Ø1(F¶Á&?àöµ<ð?Û™ÅnÀåV?ï%’ôÙ?¥’ y{€?Û™÷û°ð”?ãâ¯ÓV_r?íUV ÙŠ—?èt”öÍØÕ?ëÔ’´òÿ?èêÁª0»½?B¯Â?ØŒdFæšà?âÝâaö É?èÔ"‘˜•?äe«ìåMÃ?ÑDB•Ú~Ð?¿†‰“{Øh?åHh|ﺞ?ÐÕ§¬T?ägÐÌ…?é¦,, Ê`?íTví-!?åôg†u†ž?ëìë]Ó?îŠ!3ß>?ã Ëbªr?â3O[ëI?×g-ù£ä?ÁVâ?½+À?ܱ§É‚ˆ™oø?ÓRN ³f?‚Ë,3J×?ÝPñü>?å¦ÐÄú6m?ïðW W?ïtøÖ5‰?ÛbïžÅï?Ü=Lϯӌ?å*Í/:?ÔŽ—F(1Ö?Πq™¼8?Îä¢ÝN9d?Í×ï6å°€?ä]…–ð$?ÛC«Èˆ¸?ï)›§žý?è~5fœ?à¢%ýa##?äª×eví?ë²x".?äTC`/] ?ÞÅ&®03ò?ÖðÞX Þ\?ázˆ`M ?àƒGu-Ž‘?ÅÔÈÂS¸?ÐÇﺒž?ìnTÍ÷CS?Ï#ª"pkT?çdK`’Qœ?åòÅtQ?Ûü§õ´?Íñì Zä0?â¹¢¬ƒëÂ?×­ô¿`B?îÞQ6mÿ?ËŒÉQbhx?ëRˆŸH§ä?rÉ€mÿš?¬ ÞÅR—Ð?í“)F×ò´?ãís.—-?Å:Ð.ðï˜?ê{ò¬TD?Ï1Ó¶ä]ô?¬ÛS±4B ?Õ²€^O?¢Ð•°Â?Ùþ·Éœò6?Æ)Á@¹_à?ÊP¨Y„fð?ÍŸHBpê(?ÛÓBáþìä?ìög‚Ï¢?ʪ¤ŠwL?ì(Õ†÷…'?Û©až?ÞÅ+È9Ö?Â{*éY>x?êÈ0<,õ?©æ9»  ?é`Šå£"ù?â¶ù*,£ ?ß ìÖfèÔ?ÜA9Ãc?íœ"ÅDÈw?émɆï?å«Å& ?æàÙæøò]?ä±ãæȼ?顉XŽ?оºf|Ú?݇&òºt?ê¢Ù'4S?°•nï ?âZJ¢Z™?Ðð‚ïœ?ìá¿2ñ&¤?ȃ¸¦š´?¥ þ ñ£°?>3¨1?¶yæ©Úrø?çôPÔ@*Û?ìu;b`rš?Ôiƒ)‘t ?ΦѤ?ä4+™!AH?å¦NĆÇ?ëÒ¤åb(t?רޡ6M`?ë¾;(v%?Úl9^¿¼?æ”9©?ëÓ£kY¸?ìhwT^ ?êpm'´Ð?æA e”¤³?Ôª™NÒ?ãJ³ \·"?âê,?w·0?ÛƒÁãÚ?߉0ß`Ò?äŸ ƒH½˜?ãGaWƒ?àSjÀÆq÷?»µr[<)Ø?ï×¢e)s?Ò-£‡?Ò SØq0?ï$'Þ-D?ÔÓ†%aB?ÒaÑeóf0?Ð$wAŦ?ÔXàÒªØ?ê r$Î×n?…“tFKÀ?Ú²U1°º?è˜Úyó¤N?ä¬Q.´ú?͹ß…¬?ìÅ!Òã§Ã?¤Oõd0Kà?ÆÈO,É­°?°‡Þ>Z¾°?îÎç†&?çâaäÙÁm?ßj¼®ZÀ?åíôV7Œ|?étVÑ¡ M?ã«P`†"?è΋9g\í?æw{‹†6?ãb-f·?éZÞÔuí?—ÛÀûd ?ïX[Y´5?éx<ôI¶Õ?ïÆªýÁDa?î=Žõ?çžØf4Ï?éÁ¶ ƒ´B?æ, )…X?ØçV?”ßS 5À?í£SFÖ?Ø=‚ûX–Â?àýÛ´1ã³?ÊZ³½j£?Þgj؊Ũ?÷ê½þà?ç®&3¦Ç?âEéâ×å?|D,0ˆÝ?äm?iÏ?ã× Þ[(?é7Z$Z?ÙHýÏ \?Ú(9ÝæuÖ?Ò Dø…ΰ?Û¯£W7®ò?çB¤1S"œ?ܨh"Ââ?îµ<òÔl?ë¼DÁ9Ï?ïB`ðd%b?ÛÚh¾­Ž?é\ŒY-Ã?ÔÅLþÊ*v?Ý9Û-&¤?Ç”1¤5À?Õ¾YùhÌ?×[iØhþ?Àt>†&Y(?ë…ÿ+Œ?Ú$ÉW{´?ÈS寖b@?âŒä—·?Ê¿F9‡?ÞÎ¥ÏTØl?ܹË–6?ÚxŒ™ð†Œ?Óš4Êʾ?î‘=TãR?’Qר ¸ ?ÇÍ 1+|?å”Ѿæ°ó?ïk¨ICæ?Ô¸X°ªºL?á]Nˆ• ?°Ž&!µ}Ð?äqHx¦lÉ?ÑDT”ã ì?Øu¯é¢ò?åè©VqÚÆ?ë.žâQðD?ãÔKá*-å?Û#ƒ‘K?à¡§:»¯?¡ÿшÀ?ØRwHXi¶¡K,?åò<ƒ¹m¯?È#ZøAt?Î)2KŒœ?ÃY7:ì?à&O{¨‰;?à&sj±ª?ê2Ž}?é#<:á-û?ã’˜¿=;?ççÇ*± ?ë— .på‰?âÕQ‡o·?Îø0ÝÿS¤?ä)øåw†?Ã\ÄR‚¸?ã|»Ø$(?æÝÚ?M˜?Ù7ñB}°?€a?è3ôöD]?¸À‘GÒÀ?ÒæÕfÉsæ?ÀCâ" ?éÖÂÐÌüB?¾Ì£¤»‚0?¦m@K³0?äö-0#È9?é¸îw´l?äÒþº¨F?Ýè<5ð–?á“ ²Ì(Ê?ÄË=Fà“?ã¶í[mÇq?Þì} Y,?Ðzß·Šz?í`³Z‡Ø?ÐÖ:§Hô?ç¤ýiu¬B?Ù‡ìðÕl?ì¢à©\½?à;Ýå|?×÷õÐ>“Œ?ãó‡­Øœ{?ÓB{©p›|?½ðñ¥¼ê˜?Ø0=$g`?в.Šz"Î?çÐò…Cæ%?ÖB{ »È?ë' ÊØ¢Ü?çQšøjl?ÁªD¬7¤?ïúÂxÛÅ?¶ mÁ?îû}¨+q?Ø`t'‚t?éÁ2Ü?é=ššÒ#?Ó¦ãyqçT?êá°?î ˘J6?⤠oK4?âR¶žñ]?϶²îîœ?˜ÆÝZC€?Ÿ¼ë¬ d ?çð¿ò¨?Õ²vÛËd?àxWVÀî?ÎÊ!a÷n?©&e^eÐ?ÖÑý:%©’?ã4®ø`®6?âÂÒyfp?ÐAÝi[b?äI&«T}?§ÏAž­Ð?çû«¥÷-2?Ñ­5Øò?Ïš¡Ÿöt?ãÿLja¼•?Û/'¯O8?í:WZÁÿ!?ÞVÚVd?ä~ÈDÖ‚?×ì)”ñÐx?æ&:Ÿp+Ü?ÚŽµ†©fî?áü‹kíX?ÖgD,¨Š?ä´Wï?ÿ×?Îûr Î>ü?¡‰/·\]Ð?ß<݉ÕNÄ?¾Ô€\oÔ?ì£æÛé\?ìÝ ” Èx?Ü2pü(Á(?Ú!?.Ž Ö?äÀñ”?ê_ˆ_ºå?èIbX5CÑ?É­`Ã_qÌ?ÖoÜ¿‹µ ?ì˜oÒÊ(Z?ØÛ`¢äDN?Ýù ׈Œö?áMÇnb?âiR´Y$?—Y+Ë£œà?¶3n/˘?¿Å“p‹À?ÓuHˆ!‹ˆ?Ù›"-‚Kv?áO—  f?à)[ˆk°?æ* 9äêƒ?àójêC?íœI·ÔÉ?×-©Édž&?é (‘·¯¥?Òö‘ñk”ô?Ù­ÒÍQ˜?æ!üN÷§?Å7¯éàð?Ì™Tªü?Ý‘é’j?çí1æ ?Ò:Sbšä|?Èj‘`¸?àå–rRî?çâÎ?Û÷C?çL “ž?Ù ©xñç´?ãðÞÕf?ÈȺµdÁÀ?´`~6/P?Ù Hù'€?ç°»5g?Çx” ?áÙ­’¼¨?À\K¶´†Ì?äéqVÐå?å&ust„?æ”´ ïpk?à*Â5E?ÔÓKë™t?زª>t?ÛÊ_¡·ð°?Ù(Ü‚¯|¾?߯mJ*?æMá}y»¨?èDÆØ­…?ÐixŒtÿø?Ø-ìØ´^?×"ךöx?êw¯°b?Ö1 z;æ?§BÿÆѰ?Ô“Ž…]Ü¢?èMæŸÁÀù?µ¶P¢.?Þ“ºØrÂ?îæ«K†q?Ì~5"<<ì?à,-½u>?Áùœ+•˜?Îé×½ØAh?àdÊñjû?â#|š?íB­Žÿ¹?îºÀ ÷Io?íŸtá“™ ?ëlº•Æ·?¡æ€¶›P?ë&…/Þ@>?ÂÊ E/,?¹)eÓ%(?ïÒ\dºˆ?ï2åR·î?ëy<™!_?Ĥ©_Dè?å‘ Ãê#?Ýõ•t¶ ¶?ãQv„v«%?Ñæ2Ë9ä ?êhpã3ù?ăI€?Дådç ?ëÝv?‹|?­Fë š`?êK¤Ñy¶?ï7û×4?ÖÌn 6TÆ?¿…nägø?Óš…À¤x®?Þ  } ‚?â¯ß´îjm?À_M*˜üŒ?à½Ö¹Ìè?à×¾ÚB¹ó?Ól¨ÛðÐz?Іu·~£è?íàÜþ¢¼F?êkÍ£'ÏD?ìu­×¢8?ãx}Sd§?ÜŠÉ.Ì.?ì5w_°)?Щ6Kp?è O‰?å,E¢¢¹?ì‹ü¾Üß?Ôž½Hù„?âÓ7f'?á¬i]Q?Ïü¦uò´?ûÒh?ÆåˆxÉmÐ?¼P±HÉÇ€?ÞgJ^p?ÔîüÔ±Û&?Ò?"<Ÿœ?ÇœgâÆôÜ?Í˰ÆÎG¨?ר`Fâe?æaãFÁ‰Ì?À—UïÄ?Ýí _Ç`?Ýkm\,fü?ºÕ@î¶p?ã]ŠÔ?Ô¸)¢àåò?‰Yˆ¹?átá¼YÙ?ìÜ…ÖÝ+?âlÓÞx1?´–%HÉP?ݵ¨é6îì?ëXF2ׯ?눎š´Ù1?ä&é x÷?á~7êŒ?ÔwÒ¼™U?ØÂ¤ˆÀnÀ?ä7t1à U?ÓJRØn`(?ì…þ£¿6?åÌHX†?é6E„9²á?â+û‹#û?àÉé<þÛ?Öyè}Eã?ÚëÔ„j)Š?ÃéÃÚA?Á¯Ú°tÉd?¦ä‚C2?ߢ«ùêÚ?ÏrÓcå¼?¿-‚Ú_8?ÐR*…d?ÇqÞLoˆ? §y\ê@?ì]h79?Úbz5Ç!~?ê_àÆÀÞV?î–Æ|.2?н…6åìÆ?êg‰7‹ü?ÝgsÍ3ì?ìˆØG“?àœêã˺f?Øe}¥²?©\?vÌò?ìùÙý¶ ?ºbñN¿Ð?æ™$­—á‹?Üë”D©Gì?¤ŽLZÂP?çÇêònö­?¯-$}M“À?áÝíáÈÄe?âêÂTtç?Ýr(™ÐºŠ?¶G˜??ì³ÁzÀ¨?½ö91ÝF?ÇË€¦G#ô?µ1Èàiß@?ëñ¯I{pV?ÚÆU_f=l?¨wù4†– ?ϱscà?Ó@”Tj?”˜S­¬ ?Ænÿ&'?æ¶pݳÚä?ÚžØÃIò?í=³G·à?àñ×ó&‘!?æ«tuö5Â?Ü0SUfå?ÄÄ@‹ëðà?âñ¨É ß?߃ìâÌ߸?ÉÃ-LªM¼?ë%ô3‘ê?ÓUQ‹rf?ëÓDèòZ?ì"½~˜?àÈŠîMHÁ?ìWC’Y?åÚÖõñt?ÕžBžR~¤?ÂÔ!ÆNc„?à-S&Ó?à c;oc?ÝU†Y†ÎV?áÞcKµ ?é™q!™9™?îù™BLû?èO ¹V ?ÆÊþG1ûl?ãÈ‘¬ºÏ:?¶ª‰hWõ?£Ü{Pï0?ìø ±œ¢?êq#J¹?±Å°¦zŽ˜?æï°ž:?ÒÂ=×-µÆ?ìì.\…cÁ?ØàÀ‹K•T?ëfÙÃt'ñ?礔<€?݇5´FÐ?àê_SÓ_‡?Øà»Û*ÿ–?áõ™‡UªQ?Ø¥eaHf?å´îðâ“”?ÁOTOÙ À?¢Ê2(ä©?é·g,Û’?à.nÌa@G?ï§«œA§ö?ÃRÀ!¹Œ?Õ1ÃãO/š?Ý Üº &?Óð=Ìì#„?Ä[y-/Ä?꨺J˜d?蟠|¨ö?îý/wõo?ïÝ0´ž×¬?ê_®·á ?äÏê8 ›G?ÉÔS,öŽ€?àçdÚ¨R?ë‹Â `±I?ÀfýÁl?ÖˆÛ5âÐ?ä´ñ¢¼?êR:éÉëè?ê©•Æô?çóÌ8…?꣱ª­ª?ë ¢¬ l?—šC rr ?åÕÞ÷y Ó?äE[íI?ë5Ä´<•?ÖžÌ2¨L?èüžµûQº?µå™¢\È?îk·“f?à¸e*oJ?Øý¿Ìö?ì÷&Õ‡3a?Ó|¡³&?éíUqfº?ï áïá²/?ךƒ«pç?ìËK>€±?ë)<€( ì?Þq•< ¾x?ä[6;?æ”y2?×eŒo[†?Üÿ3ØÄoê?íC˜0ÄEr?áöcVB?é‘›éù¥”?å pþâŸ\?휱ô3ÖÄ?ìô–GL|š?âJw‰B^?í6+"H?Ñ3ôx˜:n?Ѻ¡1õ¯¦?Û¶£•žÚj?Ä|Zc¼gÄ?ä*#(Ÿ1§?Û ¸zN?s¡2L·ç?¼w‰–u`?í®Æñî?åÑplÒXÊ?ºÌnšm±X?×êße©P"?ÎïÍùɪ˜?ÜOÈ/娞?án³¬"Ã0?ØtlÊ?Ñbæü½>×Ê+?ÛtÐÌu>Ò?¾/B î?éÔ¸4Wz?û‰ÿ«0?°ð¶Vex?îLTøÒ?ÀÝrÒuʤ?Â{€¤\?â$á­èÏþ?ɳƒ^{H?ÒÐ:ö;¬´?à@®9ÍÊ?Ó*©ËG?í¶í‘ÿu?™¼ü"»â ?Åc¾ÚvZl?ï¾~Bs>?ìºa×õÙ–?ît¬±™›?áñìë§@è?$b¦9kÀ?¹…z¶ž¸?ÂQ蘱l?¾òVEÙa?í%’†(Ô¢?Õ9Q”‰É(?V?…ßœd?èkŽŸ}Ú?ßs²¯.ðt?ŒX ;À?ã6#²v§s?ÈóÈßpp?àe ypƒ°?¯ÚUí@?Þ‰=‘@?ÜÕbÊ¿¼?½ÓÐ[U×P?…M £kzÀ?ߣïE{¼?çõŸHïrÌ?ã˜N] 8?é#ë¶ål-?“/rÜÏd@?Ú~Öø šò?ÚÐ;„̆Ð?¶ï°Å‚Úh?°$=Oøt?åe¢ˆ{z?Ðl·e³¶&?Å·é·®$?ãÍ8í? ?Ú x¥ù¿N?âÉ£~Ü÷Ï?àægz‰Tñ?çÑDr!†?ÍÍÅîòw˜?‰¸¬Œ¤?ÀtˆHW¼?ı 7½õ¸?ç§!„ËØæ?妿ž?Õ*ñ?j²r?íÖaæ“L?åØt@ô¤­?æ¤ÒüÁÛ?Þ*ðš£ë\?íj”07|9?ì¬T%7 W?ÙO•å.J?¹pÇÞëø?ï¸('ö?â ˆ£g„?à,sB7S?ßöQ˜1è?Ó_=4\H?°Î‘7 ?êR²m g?ÞÅ‚¤G5ì?à±O\c?ÆóKÃú׈?ê—ÌŸ§Î?ヹ/¥–¶?ã‹«//g)?Úé!šJ"?ì2º3&Á·?Õ‰. 9`?æÙsëLÏü?팦ôÃnÛ?Ó(øôļ`?á¾$³AZ?îšf07>?â‰%ÅP©Ü?ã\o˜d#I?ïÛiŒúæ/?˜-ÛM—ÙÀ?ÚŸNDö²?ÅØ¬gç»Ô?~áSö€?Áúr‘èì?ݽUK šT?àS7³Ëf&?å¢M»Î¼Õ?ÆÖˆîk ?áŽÀѹ?ìFöH±KŸ?æ$m ôŸ?äÄhȲ?ÙcP£ ?ì#}<éÞ?Þˆ­P.>?¾FNðÙ$x?ä;  *?¹˜ºÍ/8?ÔÁkÚÕ?êxsÈŠ?Y?Õ NJùv?îw¨€Êkí?áÂ6ñÁÃÂ?í?¼¯VÓÔ?á/N¹<É?éãÝJªâ ?º[m™¯(Ø?ÙLñ$Iü?ÌÐ.­DÌ?ÏàÂçÄ?×Ôv_ƒó¶?ÇíÌuynÜ?Ù< A¢?îÈnÆ?Ý»^sb&?ß@/zêV?éeîT®+?ĤàÏsôÜ?³o˜÷Àù¨?ãóŽÝ+3M?żãk9(4?Û*_0åŽ?¶>Êi5p?Ñšyƒ¯–?Ù$wš à?Àõ ,·†ø?â6^b§@A?v!ോ?îò`äÚn?¹„æ’ºx?Ü;¸¶Ý¬?¾,1“Ô?ˆ™cÖVP€?ád~ÖžL?£GäåçÐ?Çò­,´‡ä?â×n7sžc?ÊùÂ_.|?Ý#nN³J?æM·ø±?èí‚η½_?ÞL˜ "ÌÞ?ê©t^˜uí?äf¥¤ñÑe?²e¦`»)`?á8nEj?Ù)AÎR?•_õµ@?¿bž®‰H8?ÖUèH}¤Ú?Ófí®´·”?ìÁÅo® ?à\ÎʨÞ8?ÞŒÒòD:?× ß ¸?矟rtî?Ü£À>¥¬º?îž:–ø(?Æ+6–ž÷ì?Ï€ðj©Ð?Ï kéÀ?ìÕÏ2÷®×?͇Ž_†³Ì?ìµV=™ƒ—?éD¥‚žŸ_?áòôƆÀ_?ì3‰‹Ìú•?ÝèC³¡gœ?¸Û³¸µ`?½õÕ{Ð?ÖŽ‹`àÜî?½"·†ä¢È?äeV?x†?ÚiÓ¨ñJ?º¶æ€¡¦?ßCŒ¬‚?Ñ-+Œ;t?Ç_ ×I&Œ?íä’làœ†?]‘7è‚?ÊÿùÿïšT?èFD0f/_?Ìxý@È?ÌÃÊ ÔËô?Ö¶CW¦_t?äûIÖ‰?½ï5Cäx?ÄäúPü€?ïNj[û??æ Áeçê?Ⱥø£Gà?îˆ1¼w?朤É{?å’\ËfÎ?é§äsÁÄ"?ìÇÇkÛ’6?¸½ØÜ?èÎ&šÞ~º?¹[zÙf¨?Âбðl ?ëÄeßW–?é¤ÛIv›!?³®PÝc è?ƒŸÍ^x²À?äR> ,?à ÖgÁ©ð?Õ»N9»¢¨?ßôé±ÔI ?ìMǨ=­?îU¨;î¤Ù?ãzÍÎy¼å?íaé4×Ñ??îŸc*Ò?Æ>?7N3(?Éïé²jmÈ?Ç\oc=¯ì?ãS”çv?âçpÀ£Ù®?çô-KEA?á8'az?¤ÿö„'&p?¤ åhÙŸ?é3žê À?Ì.מ3”?ÅeµéÂA¸?ÚT´ñ{Ç?”Ñ7\¹Þà?á-æ¦ñ*?Ó @ý/O°?ÆþJ“¨¦l?è㋦æ§?ÜÔ” ôÅÞ?ÏXÊÄ>¥è?î#7ñOâD?ãžÕh¡?ïᴞ˖9?à'îmy¿?¼1ìõ0Ó?”Üë£\Ðà?âò-œj˜?Õfn·:6?Õ :¦3ð?¾‰jU~ P?ÛLü»þ t?×Ym&E+4?ÍÓˆzør\?çnêÂH Ï?êÒz…œÙ?ÔD„T×è?çEÞGÚ?ÐQûÒ¤î~?Þ;z•Gš?ä¥ÙÉö°?ѽÿâç?Ù©* £¡ø?Øò¢¹¾Ì?³Dõf<ÙH?¼m (t??Ô×n!2?Ñxo|åþš?âoßWþTD?‘Ã[DSÀ?å³I fé?áæÆ/ÚQ?å­å—Gr?ç eÎ9²1?ÔŠƒkLd?Ùî&ã™+Z?˜/owv7€?ç°Ï(Z?íuÿhœÍ?Ý“À²²Zü?Ñn vØ?¶IøímZˆ?àSÂ]q^m?׺„≌?éª ©Ë·z?êZÊ,>¥?éƒ?eõÆ…?¶ÎÔØý ?éb?«o?³gPeØ¡0?¢/FØNm ?Ô…Tæy?ÆjòàÊ„?ÖoÒ9u¾?Þäe/#ª?íÏŽDÙ?á )—¦<è?Ù·li›“þ?Ô¢‘y|ú?ÐZˆø%\º?Õcì!Ûæ?ì¥þY‰?¿XÂfà’ð?ãÞ9Bö§?¯²fÕÐó?í©AÏn’?å°ÜBP­?Ûɲ…›÷V?Y³çÑ"N?Í¢`É{A?ÕnÛŽ¥Z?ÎJ|-1|?äÒý¶¬¯?°ü» B5?Åb)HÅì?ë8ï˜å?Z?ÎØÈ5¯?é%äc¤?º—*þÐ?èBñþn÷©?³Ça…˜?Å=¿ÝCSl?º ¹ux`?Áamvì ?ê_7™Br?ȱ¬Oÿ-€?äÅi¨C#?뫌{ÆJÛ?æ$8ꦮÇ?éLa< Ë›?è5¯jnM(?ë¼áL6a,?Øäwù7ô?Áð4à8ŽŒ?æ¬Ä?Âfv?ãϽ-‰§8?æ\úæëc?ÝN£¬L?ãE„‰‘á^?é–P·Ü?Ù½³Á… p?ãâj¤t>?æÓóvB y?ê°\âѵ¥?ç¥?üŒ?ëø-Ú4?âi“u:?ÃÔÇëºü?æÜÅMl?Â{ß*»•?ëÂ:¬0ó³?Ó[³z/á?É1l÷ÜÐ?°Örx?é0>ûX%?ãCCœ¤ ?ì`Çù”†ý?å™*H?Ãx:WÕp?ÕÔÕÐà¶?Ùɪ!GŽÎ?Üí¦?Ç@?Æ`žFu ?»æYìx ?ÀGI=h?ÕjûŸ¿?àõ2]­a?îvÃÙZ‚?ÔÅl—Î!Â?ÔÉu zr?ë Ã2È'¶?·•Lù-Üè?”AÆ×ÂI@?ìÜ#±fN?ë­’g¿*?ä 3{{ýá?âEÿ6í{0?ê$½¨<>£?îåÏ-/ù?Ê´okúsp?à:>ÛÕzÔ?ëz|SÖb*?Íâ.z?âËXàÑJö?ܺ–™TR®?ÑÂßlÜ?âϘ&þ•?ì†÷þ^©?ØœEÀbÊ?À ÕQ²°t?êÛ\MxÍ?É8Ó~‰Û?áøŽ°ã×>?«€ý–@?í=âöÅÀ?b f,¤?· ãƒajp?ÒCÇ[%Z?Í/Úa5Ð?ïûìO‰ö?ãŸàEz©î?‚ÀçÇñjÀ?ÚxV¿øLü?±…Þ!€è?â8UqÇȲ?í ¨\ 5?×µmkwlZ?·:´ Èj°?懋*Èc?ЕUÄNÕÌ?ã‘Ä’Rú?Øò•æVä?Ö¢ÊÓÓ|?Æt%mZùÌ?É {/°<ð?暊?å%?5Ya?³WäzÞˆ?åXx/'p?è‚ç2¤bP?À:wôŸ¼ ?ëŒÿ¥…¾?éáC-fÑ?ÛáMbæ¤?®Çþ2‡C°?Õ-ö¸ïâ?º/’\èûÀ?¡Í ´Q ?Ù44»[èÌ?¾îÖùÍÀ?êÆ” œ?Ü œ#¶?â×ÿ g¹?½ ><ÿà?ãÃCgŽ ?áS=ѽz¨?ħg-0Ä?ÊSµ€÷R`?ºÈc„7@?ÕoFΑàT?íÂDI¢†?ŽUË=€?êÙZ¤ ?áX½ELoG?ÖG"¦¬gB?Üú¦#¾(?Þ”$R¢éš?çMÊâö–?“òiciõ@?ʦpzäp?Ê@Í _ì?ÛMø¶è'–?ÐdjQx?áÃJb¹q¹?á¬xþ¨?ØÊŽ“Ù» ?êxš]’„?ç¢4[ˆ†?»íIÖýø?ãÆXìPáš?Ç~‚ºQg¤?ãåŽä?Ö^(< 6?Í›2º¾ì?îºÁ0xå¤?àž3ðøò?áõHdý±0?Õ2׆7`‚0Ç (?äæŽÞŽ?¹Ô̪ùp?æŒèžf˜+?ÛH„ØÍN ?è.eô,:ƒ?îÛµ%êûþ?ëo–»án?î:³FLc²?ã÷çt¼?íÃÁ!Yú?Ë–àHmx?Ë¿ý8?Ébê^n?›ãͬ! ?çŸT#†?î.¨Ì©hó?ÇSÖ¾xb?Ó~Åý=ú?é5MØ9`?ãzlx4fÌ?êÆRPÊâ²?Ç_¿üz4?èiË×ä?Òêߣ¯¢?ß«4¶‡Ï¨?ㆪä(Ä«?áx¡Z ²?뙕ýs7?äp`w«D>?äŸ~À;uþ?ìKŽ‚Ú~|?íÇ8PéA–?¹IÔ¡?àcŠãÜLä?ç˜ðºW(Ú?ì¬Ø¯œ£Ú?Ð'#ž¯¨²?è!\ÈÊßU?ëTåe¥?êS ßÙ#²?ëì«™kÈ“?Ýø1Ý>X?é«A ­,7?à™OŽ©z?ÀÒß\óD?²¿0š•€?âËé–$—?£BÒqI ?ÛøüIú¢?ÁëZù»Þd?Ò^V þÊ?ÛYqÈ­“2?ëéî'ý™b?äñËãǃ?ÕÙŠcüÄ‚?…h ÛHÎÀ?Ðï H@®?çqŸû?á„p}„1?ê Œ<Ývá?墿éšd?æoTçƒo×?Év ꬨ?Ó¦%1N0?ã`>ë'Ê?ãVÈÍH¯?âFlçÒ?æ[é œ¿›?ÆaÅ ÇIh?Ö¤ëÊz?ÕH‚qÒF?äµëÆñÏâ?éa£Œ#=´?ÅM Åbì?ÙWA{c ?Ã^›G/ð?扵â3É?‹«Óø–»?áLðhLX?çÎOŠ”¿\?ÍtÊφL?É×ÅÇñUÜ?ëÌÀ,J?áS¡\qß?߉·ab^R?ì< Òá?ÌÖ0*€?î2u^Lá*?¸Ê!†êìÀ?Ï6Ïmšd?çšÄ)ô‚q?íý¶ÈQpß?ã‡åEp„«?íMÙf=Ê›?£~‚ 0ð?çv€¥ˆ"÷?çàŒ!­¹?ÞN¸‡d¸Þ?Ó¦ñÇiÀ?çq"é-‚3?îQÀ5X|?êdÂæ ?ák-À‡QD?Öèö÷.ßf?Ï…EÄç­?ßLê±{FŠ?Ù²>ýÐsd?ìÅ¿.ˆ¦•?Ùå1:ÒcÜ?Ï 2MÚl?Ý}…@Õòª?ÛØr. * ?ï2רmm~?¼sdw÷}ð?Úh‹DIR?Û•v¾*?àê@»l `?äœK¨Q=q?Ú¤íún—?è«å6Úw?å#cÈÇE?°ÃÉÛx+p?¿—Ì.Bð?îÎ3ƈt?µ~ü)”û ?ãE$ŽJ§?äu/|t»?ÓÞšw'\¶?襻ËV1?ê<}v|ìÁ?ÏŧrU”?ᩉI]Ý&?àƒÈô—(?욢#|å ?ånƒ‚Ù Ù?çûή…4?绊Ʀ ?Þ&ýÿ\?ýkJõ‚?Æ)샵ð?áÔî†wÃë?Ø ë€°Ô?ë>iã¾Ô?ífü(P©ý?ÁÒ0.A³Ì?ìö9úd̲?Ð]ÃFNf?ëÅ¿»¸?±÷©lnM@?æ×¬x?ïÖþj°ùd?à‰ððö³É?ᆜH®c%?ë1ìnï/?î‹¡J„ÞÖ?ÈJ6²wT?æd°‚Šò?© ”ËYÝ`?¶¬ØcZè°?Ò>P>ÛxH?Ô¶ç>®<Ü?Æ÷­md?îŠØ,òá?ç¨ÿŸÌ©s?ãÞ5Ù¿ ?­¦åk©ö ?ÎQi½ÄD?×þlò¼ž?î×iŽ¿4€?³˜ËÓ„ßx?ÃÐkîõF¤?ݘOÇw€?È%«-u²Ì?å'¶Üãp?î£KJ§C?×´ Ը–?Žý=K~>?ãŸçÀ÷aT?Å‹ ´ø?Áyë§´?Ò¹:p¶Ö?ægéEG¬e?³*ñ³à?æ«äæé?ï/ud 1Ÿ?­O\Vð?àFJ¬n?ͬÌ¢Ä\?³Î1(¤¤(?Â$Š^Iä?Õ'Ç,qÌH?Þšd:>î?´!ù¦à)X?æ”xÜ·ÐÎ?ÝYý¯¯²?×M¨µf?ëßàp`?ßÃP½2x6?îmi:ù?Ð-òºöå?ï0k29?Û_Qì†?ãnÜ3^?ä•Ú¥YG?áÚå¶ñÉ?êLúÇ[Þœ?íâP À?ÐÈJÍçñ.?â‡<Àr|?Ãgñ,i‚Ü?ï™Xš+W™?ßÑV`Ѻ?êDYl{Áã?ß±¥0ÓJ?¯ïùMé›ð?Ò1¦Q”ú ?ݹ'’ø?é[¸†C?ê1kt}öß?íu.›É·E?躱þýiŸ?àéúy¾?°,œ#2Î ?åùÖélù?ÍŒ¾ {®?éHÉ"/ô?¾L?™È?æä=C¥E ?çCÌÈË2?îy°ÛÏ?·ZÕÂéØ?ëâÑš!ù£?îÙˆ‡M?éó‘(Ðh?íjú¹=¨Ä?äX­ØÝÇ?Ônñ¥ÕdJ?×ÊT«Y\?Í®±¢º4?â3’Þª0?ÊüãÔÀá”?át’vû´q?¹:Z¾“~ ?ãKH «D‹?ìdÜ‘?î]¦(pl2?Þ‘k¾íD?ê`'¡@/?ã5wÒ¸!?æBw0‡j?Õ–ýŸ3?êÝæWÀ÷ë?甪Þ|?êž¶ƒÔä?ÞGÍÌl”Z?ÜBŒ Œ04?˃xb½?ÔÑ82†o¾?ÐÉ©€A0?âz›Ì(v?îà¨Ît#?åÄäøãV˜?â¨Ë VG?Ê*jæ‚ä`?êab9CÂ?ÜÊT Ê‘J?Í×öÔœP?á¶j1ßnP?çÇôRÅ?ë÷ † ›?çgÈ€óõ(?êuCöî?ä•4<ý`'?æQÓc?á?dç“ǘ?îL§¶¸>?àÆ2BœB?î{`D~®s?Øø*€J ’?íG Tao…?ß³ Fˆ‘ ?ãIÊ’T´õ?»Ý×§ŒGˆ?Õ†Ÿð®¸ž?Þfy-†û?×däÛB?ߨrÖø?¨¨lx@À`?èVC#É÷¹?ÜùýŒ`ŸN?Å +¨zú¼?ÙÐ4Ê«¾?ëúÚµ?–?íFëÙɤ²?¥¹Õ``ð?Ý »#aÍ?Ü­Á@j¢?àýùõ^®?ë" t±?é'›ˆ\‚E?ëÆÜ ²µ?•bjJìÑ ?¢õúZЂÐ?Ä`½ÕGœ?æ>VÍ‘Œ•?çXƒNþ?¤©Ç!ƒð?µ´Ôæžø?Ö$>|0Æ?ÐDÌWæ?È»oXš?æíÆêÞÀ?ï r:¤¯?Ôþþံ?Àr¦p“Út?àÐ&4É?åçGÅKo8]r?À4P½ã`?êðø?ÅÓ”4òÑ?Û4[Ý?Ò ‡ùí´4?çJ¶þ;Á?ÆÃ&á««Œ?âirg V?×]÷_Ä ?¾>.€iQ?Üßtƒ(?á­f:‚qS?ÝB˜[?Ö'›êcP?×r_`?¬•iƒƒ€?¾9'ûJü¨?æÃþÒ7Õˆ?Ñú­ÞÁon?̶ö€ÿ„?ž» ç_ÆÀ?è/³ŸÚ5?×Hs­P•>?Õµ îïn?Ú12Öì²?ï˜ä…~ˆ?ãq ã¢Û†?랇7)7O?™+ë@m@?ØQJ±R†Ü?«Ù–‡no?ÜÔu° Jž?¬Eë&Eº0?­›ðÀÒð?Ùþµ“fBH?âꟻøº©?åÛ*p¼Ø?ÛNøëÂ?±Uì5[¸?ê³ðˆËz?êæû$+3?ÈÀ¨»ÜÀ?ànŠÈD?ê+­ç‡p?î}Õlb&?Ó’+2¬ÑÜ?Ê_"Ù½8?u~ T`€?çü4t¬SÞ?ïvîúqf?陘=®Q"?¶ØÉjP?µÏ ×ÙÀ?êN(‹¬?çag¦³?Òb*Î *?µ.Ú€‹p?°Eåã’1x?ïO/ö_„¬?î`mTPŸè?Ú¡ .h~?äšžõáЛ?à§åœêI?ØG†>-*?Ó×´xú:?Çé D½Th?â…\WL`?¶ÛN¼9Yè?çžßÞýÌO?àü3 .˜?Ü3:À§’î?çñY€?à—sËù'?éÐj_¸\P?Õ ìœ?Í|s+Zå,?æ€vaX.?ç5[ V,?í²ƒÐöM]?ij8̺a ?Ù„ç4évŽ?íA¾Ñ¦ ?µ‡‹ Að?ÞÅ`Ñú n?Ó]Îòpˆh?šç ºP° ?ÓÀ¢R¾˜?ؾð{wr?ẔïÚê?Ù±žX`,?çÐkVŒ¯?ÔXõЦì?Û6rs}`?ØG‰‘³Æ?éëý1ºÒ?è~q®!Ø:?ÒrqÂm?´#'1¸?â ÌsM±?Ý{–C ü ?Ú!f2TËv?ÐÅXy0fÌ?ê‹÷ºÐHó?¹M˜Ætç°?Œç ª6ÒÀ?Þ­L´:Žd?êéù¿vZ?ËV±V»ä?³û-mªø?éÒÛ€\h6?ÛT.¤ ò?íSÏûÛ·?Þa.{óbZ?‘qÙæ˜zÀ?åg.¢Cþu?«•êbò0?ëZ¹ïõ‚?Ä3¨o›ð?‘»^ì™ ?ÑäÜ-“Ì?Õð?‡ ?æï$À?í'×LÙ‘?êhÎÙhv?äPç³a@C?μ5Rô?çKlw`ür?–Gžº$ ?ÝÇ'Ôùn?Ø À/w?Ú P4h¾?dóÇùaø?ç_P]n?Гê_~?ܬÖK^?×ÞèJþ?çðñSÉd?ãIü„æ€?àו "¬?âI‹w¿¸¨?ä(N°a£?íšéOªø?Äìe]©– ?î FvÀ3¦?Ï«lê Ì?Õâ2;ø ?ãÞ Hb’À?î¡ÊH@/³?埧2¨¯Ð?í&¦½‹ ?àÎ߀çÈ?îCQžî€ž?èÅ& qÍ?ï,0¾ê±?ܘêP©Rô?ÓN#%EvŠ?ÇvÏ*1h?á`œŸ=wõ?Ùì„z<?à'” vM?ì_+ëcŸ?æû…Ã*?蟃 :¬l?à@¾Ÿ73?É~Ðq‰Ô?étœ6s[[?ÚÉE`¤?㧑ų÷?Û50Cô–?Ù }sÛ¬?ך¶ÉÔyÚ?²AÈ3ä€H?ç¥!¢?×£…%X¤?ç=³ÍfÆ ?½ÒOŒv¶ø?²´QM¯à¸?ík°_¿À?èž/’Ž“?å"„Eº½m?ämñˆ}_?åg_E…·?éßuCâ1Õ?Ú¿Ëõx?ÀÃk™¼?äÎÍôûàä?ìBE"³R?ÐÑ ¤Vv¾?Û ˜O¯°?ëà=ØÆ¶(?áRrš‡—t?Ú¾1 ˆÑ®?æ9º@_’ß?ÞF°&ÒkŠ?ì ñP-’?Üc }§2?²rX4À?¿r±«²…X?çk·áJ›?îy49—÷í?ª-Ö™üv°?TDžÂà?¸“²¿Oø?ÓÇÍó³p?Ð ¯äÌ@?æïh¦ C?îê­$‰þ!?ãŸ'zÚš‘?å'EþÉ¥?âêFw€j?Ó.-¢H?ÄPtØŽ6Çm?ßAjŒà<:?ç²îéC„Õ?ê<š%[Ó¯?ÅJßGŸÜì?–Ôw¤S%À?Áί —h?Òcܘ™µŒ?åÔVâ] q?ï<Œ¼uÝ?æÌYÄSÓÄ?ÚÓyaÒÇ8?è»Ê  _8?Î]¹V§Ü?ÓUGU¸È?Á‘²Â¤°?Äf£2¥Aœ?îŠ Íg‚0?Ô/ ”6ý˜?è[[O¤v?Ó±øc–?ço(·e ?á¥Êçžo¬?äåD?Û¯Jü¯Õ^?ш~¤“ñ ?çÔÂô#Ü?ìâÿñæ÷©?àìRNäˆw?ï1H_›Œ?ç©“Y˜†?ë”ýéd²?î…´ÆU¼M?äÐca5(?Ÿ÷A!Ì×À?çzƪŒ ?¶P ¤Í˜?çÒusų?v™ ¸?ÊAAÝ@?çå;Öê®?èD¢'œ5?ã¾î9Ô?ìI1—?ì2(fxK?ÐD[ºQµ„?⨢ýç?é]:=‘?Ðp~‹¸" ?Ñ9DVÍì?Õüp$?â·ë:§A?ï‰ rï3O?áîùÉÉâ«?ã°´¬»^…?Ë×Ϻìø?ÝH©Ò5\?ÜžØ ¡ö?zQ@!J0?Í[͋Ƭ?å©y¸Ï?äIºRúu?Ñn’Ôþ'n?Ô±KC4Z?×¾¾ÞÚÒò?Ø5[È?Æ:Új/w¸?¹fð “1ð?ïV!e¹?ÔöÌcJz?Ö~°$¤¡4?Èô.¦õZ8?ܪÍ5v?çÌiš¸9§?ÂD?V߆ ? ï¿”Eà?âƒ[Wt½?µi»Z½àh?䡼ƒƒ8ä?ªaf£®@?¯œd“iÄp?èDkœ¢Ë(?çÊM€Ý‹?ë H³lÌB?ÓH£n™ô?îÙµ­rªë?ÚþcÀãŽ?ÖQ™Hp„?Ì])ÄA?åÑTl€?ß„ÚÝ?µé“!ÅFÈ?¢@ u´#`?è –Ã!^¬?â¹ üxO?íW0s~á?è…C¬›¡?ãÀu&Äž?í0Å´?Ãcß-gÐ ?Å•XaÃÈÈ?è Ž¾ ”?êLÑ%{_?îò!»×Ÿz?¼®4;@?ÄpIs8ÝØ?å£0‘gš¼?ã®0¥‹ºA?è½É1Ñ?ÕŸ¼­Ø?ãYaR®®1?ä0Ä>ãêH?ÛèJ÷E!$?êïGþAÆ?¢?åPÎ_P?·æ~«åpø?âfñÏ*eù?Øþ»÷®(8?¶¢YöKé(?Þ;à£+ìè?ã¯H{«?Ï´Þ´z°h?Ý<»³©?ÉÂ÷àêú?ÓwÅÌ?ßm H:Ü?Ýâ¿°t?×$âÛÂ?íM&:ÙOi?¥Ïûw?Ä1™?¹úk‰€Í@?ê"óÕôË£?ãÆ\M¿ ‡?Æu´ãX°?Îæø¾2H¤?×7k-í&?ËèõнK¼?À;Æ ?¨|"C0?äÛ5μå5?Òp «³·Ô?É’‘†]Ä?ç™KI.‰b?¹÷‚¾žÊ@?ãD8íðG ?ã†|>Á¸?Žä&§ÿÚ€?ÎOgõYl?ë¿ñµãb?ìw‚¦—Ð?Õ /4«?¡Öºð>mp?ß•Ùq?ëueôç}O?ægíNæ N?Þ’[Ù¯1æ?ëɽ\/N´?Í_1äì@?áðá§2ÂW?Ú©‚òlx?äÖ8*U@?¸þÈ”X?áÕ eS¸F?âÉ-=%H?ìtrÇ!nƒ?ÊÀu¹Ø?Ñ^Vmb>?êv\k¸?ë|—¾‚¹?à×V!ä?çJT}^è)?ÒÒÀÔ;þ?î¤Ö.DP?²Ú¨)“¨?åúkì“çy?í ˜b9á:?ìÁT÷‚ 6?ÜËÜÊö¦?Ò^ʾkq†?ÇÁU%/Ã?×óçm¶§>?Å—§"¢$P?íÜZ&<¬?¶AúÎ.º¸?à\Ð5è­™?å%zƒðÅ?Æûàþ¿ÅÄ?êâïøÈ•h?ïþQûXÛ?¤_R±G?Ä#ã°.Ô?£dw!xÐ?å޽ª|A?ƸU¹(«?ÂW›äãÛ`?å°?´@ŽÂ?ìÍ, œ³ì?³Ãš6¥Ð?ì^úøœCí?ÑhÏ–í&?Œ©Fµ‹À?äØákwÚ?Ï}}ºì]è?ÕKŠŽ¢6€?™l²ÂÉ ?ÔÉãƒzuˆ?Íë–ɳ?ât8âïÅ–?ê9úÌý*~?ÃÕh4lø?ïZ#ëol?䕯BJeO?¹È¥–9ø?á2hAD?ÌwѨ?±ÄÝþ`?‘½5+ ?á²9[5à?ÌÖ•7°dt?îx×1¾]Q?í íJÔ³{?ؤï97ª?㸓×W7?¬gh–S €?Öc’QÏ4î?àñ Ê?È®Á1àÔ?ÜT7Qõ$à?ç‡v•ãÇì?éî¤ì:”?ä½²¿Ox?í³[*O:?àžvÍ­?Ïájk)"¼?Ìb¡OÊ,?Ø›ƒïãoà?Ç«D¾Ù!À?æt¥s‘.Z?½ÒAhRtÐ?ßϲ莄?æ1æM ?¾6eyzè?ÕéW.“ ?åâÝt‡Ã?ÛmKq§±0?î%ÚL 1g?Øô뺲R?Ã…–¾Ÿ T?çe ¼sV?Þ›ÒkHòÐ?æuФ<‚e?ÈèÎF{D?å°Á3N;ÿ?ëô?ðÍ Z?ë™À u°Ý?âot¹È;?퇮5F%€?ê%OÎb »?Êéaô²Éœ?Áç¯|t?àpékp¥Z?Å‘~ô"*ì?Ú¼Ï:8Rú?Á¦åôß´?à$Æ ÁÖb?ß÷îŒBí¼?ÛñÔ\¸ÑB?º¬,ÜÐ?¼è9dz¸?ÄóÁ`ÝÄ?ì»ÕzÛøÆ?‰Á–”evÀ?äï8^/…?Ò1a k”?¼ô1Ä÷kÈ?Ð?i«.&?é:2ç?•%í@À?ÒK¥†œÐ?Ùï1ÉÂL?ç­â„w}?º“@ Cß?ÓjŽQR¿Ð?²õ…ÚðjÐ?ÂW”cÕÆÜ?Æ6›ISݰ?ã…NµÑÈ[?ï›3AIÕ?ÞÃÑßq?ës¼‹ [?å ûÉ?ã¤7ÒJ ?ÓmÍœ"^?°êäv?ã3H‘E…¸?àß•TkØ?ç)7“eÇ?âÅdÂV5?ÐcdöIR?ɵ=ñd:(?Ö§jøS2(?ïøòª¥¢?ÚˆõGH'æ?và͉s€?Àa,U=d?é=q(!âB?ærwp¿ô?ȽÃü¬¨¬?æ<þ¡¶îñ?ì%mñ¶³??è‹w)´ª?Ó¦Úƒ¤|?н¿¾cÈö?®^•˜^E?îÈΰ̞?äZ~?ÉU:²ƒH ?ßL}ÀÝ"?¼^ ö@?¦Ñœ‰xÙ?Ì­]ÿþP¬?ུGÇ??ëš k:[?Íóê„–€?×&¶,Qm®?çNhÎ+Pm?±rÒ?¤ûÀ?Ù¤H"¸>?âã±F ‰{?ÔͯQVÅ?åd/œ¸bã?åmËyòC?ãû˜û4½ß?ãCEžî 3?¨ñ¤LB)ð?ëð<Œ´S{?ëé4öÉU%?áßf¦>?ä&$ O!?Æ¡ŒÌ˘?ůeÛ9M˜?à‡·Éî ?ï>gà.!?âxΤï?ä‹Ëß‹XÛ?ÉÃkƒ ?後]ÿõØ?ÕN©ÿ7wÀ?½ÌóéXˆ?çR¾í H?ë oÎJ?èYisµ ?èJog+ê«?Ìïã%™D?ítK÷´á?Ñ‚ãéø?ÓS¥·X€?í4„è3*?Ì¹Ž¨" Ä?Æ}‹Jï€?â?‘*&+ø?ä¦Qf>l?énÈ[e#?“·ËýeV?Ôúüš´?îןv™×?´û¸²r0?è%{Ì?è”5™Tib?ïÒ]í ?èöU f…ï?Ò Jv¤–b?ëA9)}I?Ú¡ ó¸­Â?×óödø"?Ö”à[$4?È6¥C¸?Ü}¡=>b?Øyƒ`USœ?ÇuiЩô?°H<Å–¸?žG6H¯+À?Ó¯Y Éà?ìLŸÉ7»Ç?±­¬Ƙ?Ík4$Y:„?T‡`¾½X?¯I©WÓcð?Ù‰«!Éò?·qüò0?ÝOW¿Ë™\?²i º˜¨?éy|!ÇÈ?Ò‹v³rPÚ?Å¢¤¸œà?ë𢀻?Ö?Œ·ô?Ùm è?§Þ ¿Ù ?×L5ÁA\?ÕÈ¢ÂÑШ?æN]ì/ñ¬?æ«M˜ #?ÑâÁÇ»œº?Ñ`‡ìþX?àŒDà?êÇe¡®?Ü5€õ§ÄŽ?É<¿!Œ?é$~…ï7‘?Þ– _=ƒÈ?Ññï“C¯È?ä"rÿ»òU?ÝGØ‘&ŠÞ?¹­E;iá?Ó`éý§\?ì8eó»d•?á—SŒÍ?æãc›]rÑ?× ß¦uîZ?ÑdsŸ¬?Ѐ÷ÑØ|?é=cÍ+?áMY…àP#?Æ‹ <¥;D?êØ*$jߢ?èó’\° ˆ?Þhú(Vp*?éÑK(K?íÿ… „ZÈ?ÀÎ …ûhì?çÿP ÿ×I?æÕ¤lìº?¿:zÊ?Ô i¢yÔH?×–Ò*á9Ð?ß9zS= Š?½ó‡Á÷›ð?ÞÁÈ$™p?á¾ÕLTÓ?ê© õÉyà?Æ•ÉPîË`?ìb¾é¬1?ì)’÷Ü?ÀB ,x"?áb#šÙ-?é›1³»&?ïÌHƒ|˜?Ð*ÿ<¢àü?q²I4”?ÀA½!)sø?ÄÉ¥Í{à¤?îÛ´¸NK?²-ñ…þÏ(?ÒͺԺhÔ?ç•…ÚrŠ?ÈÅГÕÊt?ìp±b¡¨?¡ë¸¬?= ?¼yJMÑ}°?Ôìh1¡‚Ê?ákÂä»Õ6?Õå8lF?°¨Žõ!TÈ?ØKˆ„Ã*?ãç¡#?Øy†Ù\?éæþ½^U¼?èÉN·\?ãðd×P‡ë?ÜAΔóR®?•^•ÝÉ@?µÅ»I 8?ë‚V!k?ì É–Û»´?ã¼ó~ö´?¹ÚY|¸?â¦åð ?à¿lÎóÊ?ጦÂÿá?êŽç{ëœ'?á_§Ú[ýò?ÕJ†&+Ǭ?æ&ºö×%?ï%³!@?⛓Xiä?×áªÂÚ?ßðßmD®?À÷‰°™ð?î–| 3±?à–+A/}?Þ¿QJövˆ?Ê;ÈÃ/?¹/:´?ê¤Þä6Ì?æ\y`óë?à©ò8Sƒ&?ç¼#?‹ÿr?å»Ñx¤?ÇÏKR˜è?âÃÜá™ì?ìá(Ðz1¤?ã/^IgQ½?îá ç š$?Ûy:ñ÷%T?Øe‡!|@j?Òaˆ(?æþË3¥‘?í”$wš?Áúü¥êNÄ?í­ô}(”:?çî5P°?½ž‹z¬^À?È•hš›Š8?ÔØ±jϪf?ß"?ÿ&[ ?èxÓtç?ä é›f?êÙ§:‰Z?á£÷¦Ø£?ÝhJóüCð?Ëä7º¥ÁØ?éÎãež&??íR‚þ”?ì¡|-—?ÏtPÍAœ?çÕ#ÔFgt?ê@LŒHÑ?à¼,QJÐ?ä§79žd?çéÿ:ÖNT?×é-ˆù"Ô?“áomÈ@?²ê|5¬-?䙲3)[B?Ï‹ #Är?â’¯S ¶?éIßÂSìÊ?ß#3ÆD\?¾‰F¡¥Œ€?ë“jUGÒb?é‰Qk€Ç?Óì ¢5¦?ÊP•<¼ÝL?âÊ'õ w\?ã–%"J©?ÝöÛš=GT?ÞxQŸT®?ë7˜¹•%:?ůÜì?àªÚ!½ ?ØRw=*T?±5?ë cÌr?é^€PÖB?äÿ£O¼?à ˜Ád*û?èzŠxͼí?…b`Â?ïºÚh¢u ?îèãÐ(æ?â2‰OAÙÓ?é¦|Ä—ù?Ñ­ŠøÖ¾?Æt¯¶¢>D?èôÀ¡Ý´ë?æÎdÝt…?Ýxq’$3â?ãß#î>ß8?³{…q`¦@?Úð C{=Ê?Øg>@—Ä?Ï/áAë ?Üé4 UÈ?ÕOz.Èš?®Ma?±ëò®·È?ç]{–Çl|?ÏÝ®qX_$?Ù‰™ƒ64?å'; áõƒ?È¡5Å T?År’JIo|?îŠØ†ƒZ?Ýó·Ä.¦?ÃÔæœîX?ë ©Êì?î–”œÐlÔ?ÁW Â:h?èßg^'?Ûßdoàü?»ÐÝþ!´8?Ù5*º-ŸŽ?è3$tè02?ï'‘vˆÄ?½Z;zé@?ìFÄ\²?Èt-À¯6l?ì»82žÅ/¤?Ôu;±?ë›Dò?èjxÆ Þ?äi´A?°çÌù}ð?êeÐÄVˆ?æR×ó.¹ ?²;Å=åò€?ÔŒvõ œ?æ™ÊÛÞNÂ?ÆøâË?ãZA_§ ?ÄŽÇ·<?§fÙÇ“?㈽„NH?ê¤Ã)P·?ÞaÕͺ?ê,}_ú®?éí äâˆw?¸´v,q ¸?Ø(ÖUÜ%,?íÆZ¸}îo?ì·DiŠ¢?ΞÁÃý0?ë¾KeLUb?ãR__èüw?Â,øðµ>Ì?ÕÂ,Là?Ék+Ð(üÔ?íˆ#¨‚?êûû2jîé?Œðq€?ÒX³*î?Ø™ðátL?âçe0jr?ïª}ÚUž/?êÊ®ÖKß—?à æÏl?ÓÔáh?ç ’æÉ”?Üx)rw:?Ô¦ÄvE³?£+:ŒN ?äå¡ï!ö?Ù˜àeç2?çûEÉÍÕ/?ëL—©°Ñ?ਾ@‹±?éZè6à?Ž_0–€?º.þ\è?ñÖXeÀ?íqâëìá?ïùu?Q^epyvo-1.2.1/pyvo/dal/tests/data/scs/000077500000000000000000000000001416757633600171325ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/tests/data/scs/result.xml000066400000000000000000003463251416757633600212070ustar00rootroot00000000000000 ROSAT was an orbiting x-ray observatory active in the 1990s. We provide a table of all photons observed during ROSAT's all-sky survey (RASS) as well as images of both survey and pointed observations. For ROSAT data products, see http://www.xray.mpe.mpg.de/cgi-bin/rosat/rosat-survey {'SR0': 0.5, 'DEC0': 2.0, 'RA0': 78.0} Written by DaCHS 1.0.1 SCSRenderer This resource contains data associated with the publication 2000IAUC.7432R...1V. For advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/rosat.photons A table of x-ray photons detected by ROSAT Right Ascension, equinox 2000.0 Declination, equinox 2000.0 Time the photon was detected, in Julian years. Energy of incoming photon (corrected) [keV] Total positional error, 1{sigma} arcsec Galactic longitude Galactic latitude ROSAT cluster survey exposure time Photon identifier (a combination of observation date and detector coordinates) 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 MzAwOTc4MzkwOTM=
pyvo-1.2.1/pyvo/dal/tests/data/sia/000077500000000000000000000000001416757633600171165ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/tests/data/sia/dataset.xml000066400000000000000000000056021416757633600212700ustar00rootroot00000000000000 OK Access key for the data MIME type of the file served Size of the data in bytes Epoch at midpoint of observation Object being observed, Simbad-resolvable form Approximate center of image, RA Approximate center of image, Dec Synthetic name of the image Lower limit of the bandpass (in BandPass_Unit units) Upper limit of the bandpass (in BandPass_Unit units) The pixel scale on each image axis
http://example.com/querydata/image.fits image/fits 153280 18885.9416782409 Test 288.95078924817 15.0322239971381 Test Observation 3.8e-07 5.2e-07 0.000403806 0.000406123
pyvo-1.2.1/pyvo/dal/tests/data/sia2/000077500000000000000000000000001416757633600172005ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/tests/data/sia2/capabilities-basicauth.xml000066400000000000000000000020121416757633600243070ustar00rootroot00000000000000 https://example.com/sia/capabilities https://example.com/sia/availability https://example.com/sia/auth-v2query pyvo-1.2.1/pyvo/dal/tests/data/sia2/capabilities-newformat.xml000066400000000000000000000022571416757633600243610ustar00rootroot00000000000000 https://example.com/sia/capabilities https://example.com/sia/availability https://example.com/sia/v2query pyvo-1.2.1/pyvo/dal/tests/data/sia2/capabilities-priv.xml000066400000000000000000000027241416757633600233360ustar00rootroot00000000000000 https://example.com/sia/capabilities https://example.com/sia/availability https://example.com/sia/auth-v2query https://example.com/sia/v2query https://example.com/sia/v2query pyvo-1.2.1/pyvo/dal/tests/data/sia2/capabilities.xml000066400000000000000000000031611416757633600223540ustar00rootroot00000000000000 https://example.com/sia/capabilities https://example.com/sia/availability https://example.com/sia/v2query https://example.com/sia/auth-v2query https://example.com/sia/v2query https://example.com/sia/v2query pyvo-1.2.1/pyvo/dal/tests/data/sia2/dataset.xml000066400000000000000000000236761416757633600213650ustar00rootroot00000000000000 calibration level (0,1,2,3) publisher dataset identifier short name for the data colection telescope name instrument name internal dataset identifier type of product timestamp of date the data becomes publicly available RA of central coordinates DEC of central coordinates size of the region covered (~diameter of minimum bounding circle) region bounded by observation typical spatial resolution dimensions (number of pixels) along one spatial axis name of intended target dimensions (number of pixels) along the other spatial axis start time of observation (MJD) end time of observation (MJD) exposure time of observation typical temporal resolution dimensions (number of pixels) along the time axis start spectral coordinate value stop spectral coordinate value typical spectral resolution dimensions (number of pixels) along the energy axis dimensions (number of pixels) along the polarization axis UCD describing the spectral axis polarization states present in the data URL to download the data estimated size of the download UCD describing the observable axis (pixel values) format of the data file(s) primary key timestamp of last modification of the metadata
1 ivo://cadc.nrc.ca/TEST?C190508_1442_SCI/C190508_1442_SCI TEST TEST-1.6m TEST-INSTR TEST-DATASET image 2000-01-01T00:00:00.000 253.0637009871805 69.94853437563255 0.7176383627131244 polygon 252.33774699999995 70.20847500000002 253.83481099999992 70.19265699999998 253.77173199999996 69.68570399999999 252.31050299999995 69.70114700000002 2048 BYW1651+6953 2048 58612.30703703704 58612.30726851852 20.295 0.1 1 1.1699999999999998E-6 1.33E-6 1 https://example.com/datalink?runid=i4oh43a0oky3dyvp&ID=ivo%3A%2F%2Fexample.com%2FTEST%3FC190508_1442_SCI%2FC190508_1442_SCI phot.count application/x-votable+xml;content=datalink f0a8f0ad-be05-4adf-ab3d-8b13c45b79b1 2019-09-19T22:17:07.594
pyvo-1.2.1/pyvo/dal/tests/data/sla/000077500000000000000000000000001416757633600171215ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/tests/data/sla/dataset.xml000066400000000000000000000261431416757633600212760ustar00rootroot00000000000000 Splatalogue SLAP Service small description identifying the line the name of the line catalog this entry was drawn from the wavelength in the vacuum of the transition originating the line The molecular formula which may include notation of the common quantum state of the transition The molecular formula which may include notation of the common quantum state of the transition Actual chemical name of the species The type of molecular given as an integer identifier sijmu2. Einstein coefficient Lower state energy Upper state energy Lower state energy in Kelvin Upper state energy in Kelvin an integer flag indicating whether this record provides the recommended frequency for this line. The initial and final quantum number states that produces this line Known interstellar species a description of the spectral line
JPL: CH2OHCOCH2OH v29=1 65(10,55)-65( 9,56)JPL0.0026007993198247656115269.3542CH2OHCOCH2OH v29=1Dihydroxyacetone0131.249668558294-4.74809778436645442.7856446.63057178378637.066044526917642.59806942928565(10,55)-65( 9,56)0
JPL: NH2CO2CH3 v=1 9( 4, 6)- 8( 3, 6) EJPL0.00260079801795189115269.4119NH2CO2CH3 v=1Methyl Carbamate017.1236909189353-4.83754596637333130.4111134.256073708445187.631403639604193.16343131112 9( 4, 6)- 8( 3, 6) E0
JPL: NH2CO2CH3 v=1 9( 4, 6)- 8( 3, 6) EJPL0.002600797618590801115269.4296NH2CO2CH3 v=1Methyl Carbamate013.6709044372638-4.84357552571736130.4111134.256074298853187.631403639604193.163432160581 9( 4, 6)- 8( 3, 6) E0
JPL: (CH3)2CO v=0 54(33,21)-54(32,22) EEJPL0.0026007950374124845115269.544(CH3)2CO v=0Acetone15230.27724514961-3.02603304293211835.60529839.4502681148261202.242703660791207.77473767207154(33,21)-54(32,22) EE1
JPL: cis-CH2OHCHO v=1 14( 2,13)-14( 1,14)JPL0.0026007933722844356115269.6178cis-CH2OHCHO v=1Glycolaldehyde021.9273878887541-4.87033282331431231.969235.813980576529333.749727368876339.28176492197714( 2,13)-14( 1,14)0
JPL: C3H8 N/AJPL0.0026007911904735396115269.7145C3H8Propane00.635151099856094-6.7094715707246130.94892134.793903802094188.405202200504193.937244394447N/A0
JPL: C3H8 N/AJPL0.0026007911882172737115269.7146C3H8Propane00.423328037153043-6.97957609404102130.94891134.79389380543188.405187812818193.93723001156N/A0
JPL: NH2CO2CH3 v=1 23(20, 3)-24(19, 5) EJPL0.002600789356130706115269.7958NH2CO2CH3 v=1Methyl Carbamate05.01323226119246-5.72089974485859279.3062283.15118651397401.85700719681407.38905329251523(20, 3)-24(19, 5) E0
JPL: C3H8 N/AJPL0.0026007859830224104115269.9453C3H8Propane01.69346180808879-6.4646252884359130.94896134.793951500753188.405259751251193.937313021783N/A0
JPL: NH2CO2CH3 v=1 23(20, 3)-24(19, 5) EJPL0.0026007822579477637115270.1104NH2CO2CH3 v=1Methyl Carbamate05.2265567985742-5.72089656247709279.3063283.151297007897401.857151073676407.38921226771423(20, 3)-24(19, 5) E0
JPL: NH2CO2CH3 v=1 23(20, 3)-24(19, 5) EJPL0.002600781919510257115270.1254NH2CO2CH3 v=1Methyl Carbamate04.80745869862592-5.72021293919008279.3063283.151297508243401.857151073676407.38921298759623(20, 3)-24(19, 5) E0
JPL: C3H8 N/AJPL0.002600780777848383115270.176C3H8Propane01.05845801182539-6.20136303548129130.94894134.793939196077188.405230975878193.937295318201N/A0
JPL: C2H5OOCH-trans 21( 9,12)-20( 9,11)JPL0.0026007731630344477115270.5135C2H5OOCH-transEthyl formate058.6767590539827-4.6139139381576178.957782.8027104538654113.601864252006119.13394479168221( 9,12)-20( 9,11)0
JPL: C2H5OOCH-trans 21( 9,13)-20( 9,12)JPL0.0026007731630344477115270.5135C2H5OOCH-transEthyl formate058.6767590539827-4.6139139381576178.957782.8027104538654113.601864252006119.13394479168221( 9,13)-20( 9,12)0
JPL: NH2CH2CH2OH v26=1 18( 4,14)-17( 5,13)JPL0.002600759664053141115271.1118NH2CH2CH2OH v26=1Aminoethanol02.00560091486674-6.01486204317833267.4658271.310830411005384.821410750999390.35352000438218( 4,14)-17( 5,13)0
CDMS: CO v=0 1-0CDMS0.0026007576334647012115271.2018CO v=0Carbon Monoxide10.0121216495404374-7.1424633520481903.8450334130820605.53211357267721-01
JPL: CO v=0 1-0JPL0.0026007576334647012115271.2018CO v=0Carbon Monoxide10.0121216495404374-7.1424633520481903.8450334130820605.53211357267721-01
Lovas/NIST: CO v=0 1-0Lovas/NIST0.002600757628952286115271.202CO v=0Carbon Monoxide11-01
SLAIM: CO v=0 1- 0SLAIM0.002600757628952286115271.202CO v=0Carbon Monoxide10.0121242121-7.142360865160203.8450334197533405.532113582275631 1- 01
CDMS: FeCO N=14-13, J=13-12CDMS0.0026007539084712634115271.3669FeCOIron Monocarbonyl0131.500969428903-4.061336764522968.408872.253838920225398.4244375310149103.956559027197N=14-13, J=13-120
CDMS: CH3CHNH2COOH - I 29(11,18)-29( 8,21)CDMS0.002600753536198126115271.3834CH3CHNH2COOH - I&alpha;-Alanine02.70687445003096-6.2029243806737686.4611190.306149470606124.397535405638129.92965769369129(11,18)-29( 8,21)0
pyvo-1.2.1/pyvo/dal/tests/data/ssa/000077500000000000000000000000001416757633600171305ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/tests/data/ssa/result.xml000066400000000000000000001173331416757633600212000ustar00rootroot00000000000000 DALServer proxy service for JHU spectrum services Degree of match to query parameters URL used to access dataset Content or MIME type of dataset Datamodel name and version Dataset or segment type Number of points SI factor and dimensions SI factor and dimensions SI factor and dimensions Dataset Title Dataset creator Data collection to which dataset belongs Creator's ID for the dataset Data processing/creation date Version of dataset IVOA Dataset ID Instrument name Band as in RSM Coverage.Spectral Original source of the data Dataset creation type Dataset publisher Publisher's ID for the dataset ID Restrictions on data access Target RA and Dec Target name Object class of observed target Target redshift Target variability amplitude (typical) Spatial coordinate frame name Equinox Timescale Spatial Position Aperture angular size Query Metadata Access Metadata Estimated dataset size General Dataset Metadata Dataset Identification Metadata Curation Metadata Target Metadata Coordinate System Metadata Spatial Axis Characterization
1.0http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261170552832application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115923.80+005905.16 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422611705528322000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261170552832SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261170552832PUBLIC179.849160 0.984768SDSS J115923.80+005905.16GALAXY0.4519410FK52000TAI179.849160 0.984768
1.0http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443407863906304application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115923.80+005905.16 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434078639063042001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443407863906304SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443407863906304PUBLIC179.849160 0.984768SDSS J115923.80+005905.16GALAXY0.4517070FK52000TAI179.849160 0.984768
0.2182701723871967http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261472542720application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115955.84+010937.46 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422614725427202000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261472542720SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261472542720PUBLIC179.982660 1.160404SDSS J115955.84+010937.46GALAXY0.07839570FK52000TAI179.982660 1.160404
0.2182701723871967http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443408233005056application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115955.84+010937.46 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434082330050562001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443408233005056SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443408233005056PUBLIC179.982660 1.160404SDSS J115955.84+010937.46GALAXY0.07828230FK52000TAI179.982660 1.160404
0.2152962973906383http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261447376896application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120029.86+005857.51 SKYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422614473768962000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261447376896SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261447376896PUBLIC180.124420 0.982641SDSS J120029.86+005857.51SKY-99990FK52000TAI180.124420 0.982641
0.2152962973906383http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443408224616448application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120029.86+005857.51 SKYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434082246164482001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443408224616448SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443408224616448PUBLIC180.124420 0.982641SDSS J120029.86+005857.51SKY-99990FK52000TAI180.124420 0.982641
8.695981252317388E-7http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443408262365184application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120008.29+010848.68 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434082623651842001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443408262365184SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443408262365184PUBLIC180.034560 1.146855SDSS J120008.29+010848.68GALAXY3.19604E-050FK52000TAI180.034560 1.146855
8.695981252317388E-7http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261464154112application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120008.29+010848.68 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422614641541122000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261464154112SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261464154112PUBLIC180.034560 1.146855SDSS J120008.29+010848.68GALAXY3.05799E-050FK52000TAI180.034560 1.146855
8.497366575010945E-7http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443408249782272application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115943.32+010204.53 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434082497822722001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443408249782272SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443408249782272PUBLIC179.930500 1.034592SDSS J115943.32+010204.53GALAXY0.1740460FK52000TAI179.930500 1.034592
8.497366575010945E-7http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261510291456application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115943.32+010204.53 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422615102914562000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261510291456SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261510291456PUBLIC179.930500 1.034592SDSS J115943.32+010204.53GALAXY0.1740790FK52000TAI179.930500 1.034592
4.841872020928674E-7http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443408237199360application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120020.57+010207.33 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434082371993602001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443408237199360SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443408237199360PUBLIC180.085720 1.035371SDSS J120020.57+010207.33GALAXY0.1985670FK52000TAI180.085720 1.035371
4.841872020928674E-7http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261455765504application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120020.57+010207.33 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422614557655042000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261455765504SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261455765504PUBLIC180.085720 1.035371SDSS J120020.57+010207.33GALAXY0.1986180FK52000TAI180.085720 1.035371
2.7872930478268343E-9http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261468348416application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115938.50+005726.95 QSOsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422614683484162000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261468348416SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261468348416PUBLIC179.910430 0.957486SDSS J115938.50+005726.95QSO-0.0002556920FK52000TAI179.910430 0.957486
2.7872930478268343E-9http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443408270753792application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115938.50+005726.95 QSOsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434082707537922001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443408270753792SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443408270753792PUBLIC179.910430 0.957486SDSS J115938.50+005726.95QSO-0.000136880FK52000TAI179.910430 0.957486
2.367640751371186E-9http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261459959808application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115949.74+010446.07 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422614599598082000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261459959808SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261459959808PUBLIC179.957260 1.079465SDSS J115949.74+010446.07GALAXY0.2004570FK52000TAI179.957260 1.079465
2.367640751371186E-9http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443408207839232application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115949.74+010446.07 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434082078392322001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443408207839232SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443408207839232PUBLIC179.957260 1.079465SDSS J115949.74+010446.07GALAXY0.2003520FK52000TAI179.957260 1.079465
6.785416172617944E-12http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261162164224application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115904.60+005656.94 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422611621642242000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261162164224SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261162164224PUBLIC179.769180 0.949151SDSS J115904.60+005656.94GALAXY0.3960870FK52000TAI179.769180 0.949151
6.785416172617944E-12http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443407893266432application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115904.60+005656.94 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434078932664322001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443407893266432SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443407893266432PUBLIC179.769180 0.949151SDSS J115904.60+005656.94GALAXY0.396050FK52000TAI179.769180 0.949151
2.341439286296514E-14http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261501902848application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115944.85+005628.47 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422615019028482000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261501902848SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261501902848PUBLIC179.936880 0.941241SDSS J115944.85+005628.47GALAXY0.1009130FK52000TAI179.936880 0.941241
2.341439286296514E-14http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443408212033536application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115944.85+005628.47 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434082120335362001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443408212033536SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443408212033536PUBLIC179.936880 0.941241SDSS J115944.85+005628.47GALAXY0.1008910FK52000TAI179.936880 0.941241
4.041185654538269E-15http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261187330048application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115928.97+005619.92 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422611873300482000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261187330048SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261187330048PUBLIC179.870720 0.938866SDSS J115928.97+005619.92GALAXY0.1638470FK52000TAI179.870720 0.938866
4.041185654538269E-15http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443407914237952application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115928.97+005619.92 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434079142379522001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443407914237952SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443407914237952PUBLIC179.870720 0.938866SDSS J115928.97+005619.92GALAXY0.163890FK52000TAI179.870720 0.938866
8.581980694287659E-16http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443408279142400application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115944.81+011207.06 QSOsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434082791424002001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443408279142400SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443408279142400PUBLIC179.936720 1.201961SDSS J115944.81+011207.06QSO2.000140FK52000TAI179.936720 1.201961
8.581980694287659E-16http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261480931328application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115944.81+011207.06 QSOsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422614809313282000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261480931328SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261480931328PUBLIC179.936720 1.201961SDSS J115944.81+011207.06QSO1.030260FK52000TAI179.936720 1.201961
2.0502337296517507E-17http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443408258170880application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120044.06+005553.57 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434082581708802001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443408258170880SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443408258170880PUBLIC180.183580 0.931548SDSS J120044.06+005553.57GALAXY0.1255930FK52000TAI180.183580 0.931548
2.0502337296517507E-17http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261506097152application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120044.06+005553.57 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422615060971522000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261506097152SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261506097152PUBLIC180.183580 0.931548SDSS J120044.06+005553.57GALAXY0.125550FK52000TAI180.183580 0.931548
1.4806720665249466E-20http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261489319936application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120034.98+005517.51 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422614893199362000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261489319936SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261489319936PUBLIC180.145770 0.921530SDSS J120034.98+005517.51GALAXY0.08604780FK52000TAI180.145770 0.921530
1.4806720665249466E-20http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443408216227840application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120034.98+005517.51 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434082162278402001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443408216227840SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443408216227840PUBLIC180.145770 0.921530SDSS J120034.98+005517.51GALAXY0.08602110FK52000TAI180.145770 0.921530
1.6300048361147802E-21http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261174747136application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115922.31+010453.49 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422611747471362000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261174747136SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261174747136PUBLIC179.842950 1.081526SDSS J115922.31+010453.49GALAXY0.1035140FK52000TAI179.842950 1.081526
1.6300048361147802E-21http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443407901655040application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115922.31+010453.49 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434079016550402001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443407901655040SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443407901655040PUBLIC179.842950 1.081526SDSS J115922.31+010453.49GALAXY0.1035230FK52000TAI179.842950 1.081526
1.33654114566609E-22http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380725178694238208application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120020.40+004752.35 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#807251786942382082001-03-31 05:48:15Z6.2.5ivo://sdss/dr6/spec/2_5/#80725178694238208SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80725178694238208PUBLIC180.084990 0.797876SDSS J120020.40+004752.35GALAXY0.139860FK52000TAI180.084990 0.797876
1.0976232720625123E-25http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261485125632application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120022.76+004741.46 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422614851256322000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261485125632SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261485125632PUBLIC180.094830 0.794849SDSS J120022.76+004741.46GALAXY0.1398420FK52000TAI180.094830 0.794849
1.0976232720625123E-25http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443408220422144application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J120022.76+004741.46 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434082204221442001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443408220422144SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443408220422144PUBLIC180.094830 0.794849SDSS J120022.76+004741.46GALAXY0.1397970FK52000TAI180.094830 0.794849
8.441184510333563E-42http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380443407868100608application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115918.12+005113.61 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804434078681006082001-01-21 11:23:50Z6.2.5ivo://sdss/dr6/spec/2_5/#80443407868100608SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80443407868100608PUBLIC179.825520 0.853781SDSS J115918.12+005113.61GALAXY0.07704420FK52000TAI179.825520 0.853781
8.441184510333563E-42http://vaosa-vm1.aoc.nrao.edu/ivoa-dal/JhuSsapServlet?REQUEST=getData&FORMAT=votable&PubDID=ivo%3A%2F%2Fjhu%2Fsdss%2Fdr6%2Fspec%2F2.5%2380442261136998400application/x-votable+xmlSPECTRUM-1.0SPECTRUM4000sA10**(-17) erg s**(-1) cm**(-2) A**(-1)SDSS J115918.12+005113.61 GALAXYsdssSDSS DR6ivo://sdss/dr6/spec/2_5/#804422611369984002000-04-29 03:22:00Z6.2.5ivo://sdss/dr6/spec/2_5/#80442261136998400SDSS 2.5-M SPEC2 v4_5OPTICALSURVEYARCHIVALELTE VOivo://jhu/sdss/dr6/spec/2.5#80442261136998400PUBLIC179.825520 0.853781SDSS J115918.12+005113.61GALAXY0.07709410FK52000TAI179.825520 0.853781
pyvo-1.2.1/pyvo/dal/tests/data/tap/000077500000000000000000000000001416757633600171265ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dal/tests/data/tap/capabilities.xml000066400000000000000000000273251416757633600223120ustar00rootroot00000000000000 http://dc.zah.uni-heidelberg.de/__system__/tap/run/availability http://dc.zah.uni-heidelberg.de/__system__/tap/run/capabilities http://dc.zah.uni-heidelberg.de/__system__/tap/run/tableMetadata http://dc.zah.uni-heidelberg.de/tap Registry 1.1 Registry 1.0 Obscore-1.1 GloTS 1.0 ADQL 2.0 ADQL 2.0
gavo_simbadpoint(identifier TEXT) -> POINT
gavo_simbadpoint queries simbad for an identifier and returns the corresponding point. Note that identifier can only be a literal, i.e., as simple string rather than a column name. This is because our database cannot query simbad, and we probably wouldn't want to fire off millions of simbad queries anyway; use simbad's own TAP service for this kind of applications.
gavo_match(pattern TEXT, string TEXT) -> INTEGER
gavo_match returns 1 if the POSIX regular expression pattern matches anything in string, 0 otherwise.
ivo_healpix_center(hpxOrder INTEGER, hpxIndex BIGINT) -> POINT
returns a POINT corresponding to the center of the healpix with the given index at the given order.
ivo_string_agg(expression TEXT, delimiter TEXT) -> TEXT
An aggregate function returning all values of expression within a GROUP contcatenated with delimiter
gavo_to_jd(d TIMESTAMP) -> DOUBLE PRECISION
The function converts a postgres timestamp to julian date. This is naive; no corrections for timezones, let alone time scales or the like are done; you can thus not expect this to be good to second-precision unless you are careful in the construction of the timestamp.
ivo_interval_overlapsivo_interval_overlaps(l1 NUMERIC, h1 NUMERIC, l2 NUMERIC, h2 NUMERIC) -> INTEGER
The function returns 1 if the interval [l1...h1] overlaps with the interval [l2...h2]. For the purposes of this function, the case l1=h2 or l2=h1 is treated as overlap. The function returns 0 for non-overlapping intervals.
ivo_healpix_index(order INTEGER, ra DOUBLE PRECISION, dec DOUBLE PRECISION) -> BIGINT
Returns the index of the (nest) healpix with order containing the spherical point (ra, dec). An alternative, 2-argument form ivo_healpix_index(order INTEGER, p POINT) -> BIGINT is also available.
ivo_hashlist_has(hashlist TEXT, item TEXT) -> INTEGER
The function takes two strings; the first is a list of words not containing the hash sign (#), concatenated by hash signs, the second is a word not containing the hash sign. It returns 1 if, compared case-insensitively, the second argument is in the list of words coded in the first argument. The behaviour in case the the second argument contains a hash sign is unspecified.
gavo_to_mjd(d TIMESTAMP) -> DOUBLE PRECISION
The function converts a postgres timestamp to modified julian date. This is naive; no corrections for timezones, let alone time scales or the like are done; you can thus not expect this to be good to second-precision unless you are careful in the construction of the timestamp.
ivo_nocasematch(value TEXT, pattern TEXT) -> INTEGER
ivo_nocasematch returns 1 if pattern matches value, 0 otherwise. pattern is defined as for the SQL LIKE operator, but the match is performed case-insensitively. This function in effect provides a surrogate for the ILIKE SQL operator that is missing from ADQL. On this site, this is actually implemented using python's and SQL's LOWER, so for everything except ASCII, your milage will vary.
ivo_hasword(haystack TEXT, needle TEXT) -> INTEGER
gavo_hasword returns 1 if needle shows up in haystack, 0 otherwise. This is for "google-like"-searches in text-like fields. In word, you can actually employ a fairly complex query language; see http://www.postgresql.org/docs/8.3/static/textsearch.html for details.
ivo_apply_pm(ra DOUBLE PRECISION, dec DOUBLE PRECISION, pmra DOUBLE PRECISION, pmde DOUBLE PRECISON, epdist DOUBLE PRECISION) -> POINT
Returns a POINT (in the UNDEFINED reference frame) for the position an object at ra/dec with proper motion pmra/pmde has after epdist years. positions must be in degrees, PMs in should be in julian years (i.e., proper motions are expected in degrees/year). pmra is assumed to contain cos(delta). NOTE: This currently is a crappy approximation that does *not* go through the tangential plane. If you use it, let the operators know so we replace it with something real.
BOX
POINT
CIRCLE
POLYGON
REGION
CENTROID
COORD1
COORD2
DISTANCE
CONTAINS
INTERSECTS
AREA
LOWER
OFFSET
CAST
IN_UNIT
UNION
EXCEPT
INTERSECT
text/xml application/x-votable+xml;version=1.4 vodml text/html html application/x-votable+xml;serialization=binary2 votable/b2 application/geo-json geojson application/fits fits text/csv text/csv;header=present csv application/x-votable+xml;serialization=tabledata votable/td application/json json application/x-votable+xml votable text/plain text/tab-separated-values tsv 172800 3600 20000 10000000 100000000
pyvo-1.2.1/pyvo/dal/tests/data/tap/examples.htm000066400000000000000000000104341416757633600214600ustar00rootroot00000000000000 Examples queries for HEASARC's TAP service

Examples for the TAP service at HEASARC

Simple geometric query on rosmaster with circle and point

The Table Access Protocol Service at HEASARC allow for simple geometric queries. For example, this query searches for observations in the rostmaster catalog within a circle of radius 1 degree of the coordinates (ra,dec)=(50,-85) -- i.e., basically a cone search -- and an exposure longer than 10000 seconds:

            SELECT * FROM rosmaster                      WHERE exposure > 10000 and                            1=CONTAINS(POINT('ICRS', ra, dec),CIRCLE('ICRS', 50, -85, 1))          

Simple geometric query on rosmaster with circle and point

The Table Access Protocol Service at HEASARC allow for simple geometric and cross-match queries. For example, this query searches for observations common to the rostmaster catalog AND the chanmaster catalog with a minimum exposure of 10ks.

	   SELECT * FROM rosmaster as ros	            INNER JOIN chanmaster as chan	                ON ros.name = chan.name	            WHERE ros.exposure > 10000 and chan.exposure > 10000	            ORDER by ros.exposure	             

Simple geometric query on rosmaster with intersects, circle, point

The Table Access Protocol Service at HEASARC allow for simple geometric queries. For example, this (slow) query searches for observations in the rostmaster catalog where a circle of radius 1 degree of the coordinates (ra,dec)=(50,-85) intersects with a circle of 1 degree radius around the center of the pointing:

            SELECT * FROM rosmaster                      WHERE 1=INTERSECTS(CIRCLE('ICRS', ra, dec,1),CIRCLE('ICRS', 50, -85, 1))          

Simple geometric query on rosmaster with polygon

The Table Access Protocol Service at HEASARC allow for simple geometric queries. For example, this query searches for observations in the rostmaster catalog where a pointing lies with a user-defined polygon, in this case a triangle with vertices (-5,-5), (5,-5), and (0,5)):

            SELECT * FROM rosmaster                      WHERE  exposure > 10000 AND                             1=CONTAINS(POINT('ICRS', ra, dec),POLYGON('ICRS', -5, -5, 5, -5, 0, 5))          

Simple geometric query on rosmaster, chanmaster with join on distance

The Table Access Protocol Service at HEASARC allow for simple geometric queries. For example, this query computes the distance between rostmaster observations and a given point, selecting those observations near it, and ordering the result by that distance:

          SELECT DISTANCE(	      POINT('ICRS', ra, dec),              POINT('ICRS', 266.41683, -29.00781)) AS dist, *	  FROM rosmaster	  WHERE 1=CONTAINS(	      POINT('ICRS', ra, dec),	      CIRCLE('ICRS', 266.41683, -29.00781, 1))	  ORDER BY dist ASC          
pyvo-1.2.1/pyvo/dal/tests/data/tap/lazy-table1.xml000066400000000000000000000013331416757633600217750ustar00rootroot00000000000000 test.table1Test table 1Lazy Test Table 1utype id Primary key unit meta.id;meta.main utype VARCHAR indexed primary test.foreigntable testkey testkey Test foreigner utype
pyvo-1.2.1/pyvo/dal/tests/data/tap/lazy-table2.xml000066400000000000000000000026231416757633600220010ustar00rootroot00000000000000 test This is a unittest schema test.table2Test table 2Lazy Test Table 2utype id Primary key unit meta.id;meta.main utype VARCHAR indexed primary test.foreigntable testkey testkey Test foreigner utype
pyvo-1.2.1/pyvo/dal/tests/data/tap/obscore-image.xml000066400000000000000000000632171416757633600223750ustar00rootroot00000000000000 Definition and support code for the ObsCore data model and table. Definition and support code for the ObsCore data model and table. The IVOA-defined obscore table, containing generic metadata for datasets within this datacenter. For advice on how to cite the resource(s) that contributed to this result, see http://dc.zah.uni-heidelberg.de/tableinfo/ivoa.ObsCore The IVOA-defined obscore table, containing generic metadata for datasets within this datacenter. The calib_level flag takes the following values: === =========================================================== 0 Raw Instrumental data requiring instrument-specific tools 1 Instrumental data processable with standard tools 2 Calibrated, science-ready data without instrument signature 3 Enhanced data products (e.g., mosaics) === =========================================================== High level scientific classification of the data product, taken from an enumeration Data product specific type Amount of data processing that has been applied to the data Name of a data collection (e.g., project name) this data belongs to Unique identifier for an observation Free-from title of the data set Dataset identifier assigned by the publisher. Dataset identifier assigned by the creator. The URL at which to obtain the data set. MIME type of the resource at access_url Estimated size of data product Object a targeted observation targeted Class of the target object (star, QSO, ...) RA of (center of) observation, ICRS Dec of (center of) observation, ICRS Approximate spatial extent for the region covered by the observation Region covered by the observation, as a polygon Best spatial resolution within the data set Lower bound of times represented in the data set, as MJD Upper bound of times represented in the data set, as MJD Total exporure time Minimal significant time interval along the time axis Minimal wavelength represented within the data set Maximal wavelength represented within the data set Spectral resolving power delta lambda/lamda UCD for the product's observable List of polarization states in the data set Name of the facility at which data was taken Name of the instrument that produced the data Number of elements (typically pixels) along the first spatial axis. Number of elements (typically pixels) along the second spatial axis. Number of elements (typically pixels) along the time axis. Number of elements (typically pixels) along the spectral axis. Number of elements (typically pixels) along the polarization axis. Sampling period in world coordinate units along the spatial axis Nature of the product's spectral axis
image 0 Carte du Ciel potsdam/data/fits/POT032_000002E.fits POT032 000002E 1913-08-26 ivo://org.gavo.dc/~?potsdam/data/fits/POT032_000002E.fits http://dc.zah.uni-heidelberg.de/getproduct/potsdam/data/fits/POT032_000002E.fits image/fits 435344 3.50857212362378 32.5520448642212 2.62789597705705 Polygon ICRS 5.0880992953 33.8657594349 5.0355038987 31.2453170186 1.9726562093 31.2287678614 1.9153724039 33.8626908007 0.633652077522129 20005.0 20005.0 NaN NaN NaN NaN NaN em.opt Astrophysikalisches Observatorium Potsdam AO Potsdam, CdC 32-cm refractor 14930 14929 -1 -1 -1 NaN
image 0 Carte du Ciel potsdam/data/fits/POT032_000002F.fits POT032 000002F 1913-09-27 ivo://org.gavo.dc/~?potsdam/data/fits/POT032_000002F.fits http://dc.zah.uni-heidelberg.de/getproduct/potsdam/data/fits/POT032_000002F.fits image/fits 435344 3.53452561567638 32.5695561136923 2.63052286885795 Polygon ICRS 5.103047601 33.886686541 5.0917765511 31.2555119167 2.0160910239 31.2347269366 1.9365250319 33.8649731746 0.634285487467423 20037.0 20037.0 NaN NaN NaN NaN NaN em.opt Astrophysikalisches Observatorium Potsdam AO Potsdam, CdC 32-cm refractor 14930 14929 -1 -1 -1 NaN
image 0 Carte du Ciel potsdam/data/fits/POT032_000016E.fits POT032 000016E 1913-11-24 ivo://org.gavo.dc/~?potsdam/data/fits/POT032_000016E.fits http://dc.zah.uni-heidelberg.de/getproduct/potsdam/data/fits/POT032_000016E.fits image/fits 435344 35.1868032690563 32.4808618261433 2.63817216226016 Polygon ICRS 36.7551716874 33.7680816314 36.6569941298 31.1022837509 33.6625182329 31.1788382583 33.6735378399 33.8410154025 0.63612992526032 20095.0 20095.0 NaN NaN NaN NaN NaN em.opt Astrophysikalisches Observatorium Potsdam Potsdam, POT032C 14930 14929 -1 -1 -1 NaN
image 0 Carte du Ciel potsdam/data/fits/POT032_000019E.fits POT032 000019E 1914-01-10 ivo://org.gavo.dc/~?potsdam/data/fits/POT032_000019E.fits http://dc.zah.uni-heidelberg.de/getproduct/potsdam/data/fits/POT032_000019E.fits image/fits 435344 41.9674003552431 32.3991901793566 2.63199545777752 Polygon ICRS 43.548354499 33.6930243809 43.505828469 31.0660423298 40.4307731342 31.0878159639 40.3821684028 33.7082053158 0.634640565840527 20142.0 20142.0 NaN NaN NaN NaN NaN em.opt Astrophysikalisches Observatorium Potsdam Potsdam, POT032C 14930 14929 -1 -1 -1 NaN
image 0 Carte du Ciel potsdam/data/fits/POT032_000023E.fits POT032 000023E 1913-11-24 ivo://org.gavo.dc/~?potsdam/data/fits/POT032_000023E.fits http://dc.zah.uni-heidelberg.de/getproduct/potsdam/data/fits/POT032_000023E.fits image/fits 435344 51.013271521456 32.3592083837928 2.63320798636414 Polygon ICRS 52.5854005932 33.6698086892 52.51655884 31.0228597137 49.4658779108 31.0489341391 49.4582217525 33.6839678682 0.63493293710053 20095.0 20095.0 NaN NaN NaN NaN NaN em.opt Astrophysikalisches Observatorium Potsdam Potsdam, POT032C 14930 14929 -1 -1 -1 NaN
image 0 Carte du Ciel potsdam/data/fits/POT032_000024E.fits POT032 000024E 1914-01-14 ivo://org.gavo.dc/~?potsdam/data/fits/POT032_000024E.fits http://dc.zah.uni-heidelberg.de/getproduct/potsdam/data/fits/POT032_000024E.fits image/fits 435344 53.2710128701656 32.3315125241693 2.63161394905183 Polygon ICRS 54.8696536533 33.6223099336 54.8100487496 31.0070068952 51.7281712497 31.0126204922 51.6981281808 33.6237338407 0.63454857445322 20146.0 20146.0 NaN NaN NaN NaN NaN em.opt Astrophysikalisches Observatorium Potsdam Potsdam, POT032C 14930 14929 -1 -1 -1 NaN
image 0 Carte du Ciel potsdam/data/fits/POT032_000037E.fits POT032 000037E 1914-01-23 ivo://org.gavo.dc/~?potsdam/data/fits/POT032_000037E.fits http://dc.zah.uni-heidelberg.de/getproduct/potsdam/data/fits/POT032_000037E.fits image/fits 435344 82.5782914160801 32.0756686823358 2.63224704496679 Polygon ICRS 84.1734494156 33.3485377418 84.0849626303 30.7322269305 81.0277353071 30.7779028646 81.0221467846 33.3910659111 0.634701229864731 20155.0 20155.0 NaN NaN NaN NaN NaN em.opt Astrophysikalisches Observatorium Potsdam Potsdam, POT032C 14930 14929 -1 -1 -1 NaN
image 0 Carte du Ciel potsdam/data/fits/POT032_000041E.fits POT032 000041E 1914-01-28 ivo://org.gavo.dc/~?potsdam/data/fits/POT032_000041E.fits http://dc.zah.uni-heidelberg.de/getproduct/potsdam/data/fits/POT032_000041E.fits image/fits 435344 91.6034594938728 31.9863773920912 2.63157744935597 Polygon ICRS 93.1854668029 33.2901563606 93.1207735598 30.6519541351 90.0617359171 30.6701913547 90.0404624178 33.3040260012 0.63453977345489 20160.0 20160.0 NaN NaN NaN NaN NaN em.opt Astrophysikalisches Observatorium Potsdam Potsdam T-berg, POT032 14930 14929 -1 -1 -1 NaN
image 0 Carte du Ciel potsdam/data/fits/POT032_000042E.fits POT032 000042E 1914-01-23 ivo://org.gavo.dc/~?potsdam/data/fits/POT032_000042E.fits http://dc.zah.uni-heidelberg.de/getproduct/potsdam/data/fits/POT032_000042E.fits image/fits 435344 93.8580667241656 31.9665743279601 2.63161025563022 Polygon ICRS 95.4495587754 33.2578595127 95.3683729818 30.6303045167 92.309936229 30.6592222838 92.3026865321 33.2851196812 0.634547683876008 20155.0 20155.0 NaN NaN NaN NaN NaN em.opt Astrophysikalisches Observatorium Potsdam Potsdam T-berg, POT032 14930 14929 -1 -1 -1 NaN
image 0 Carte du Ciel potsdam/data/fits/POT032_000043E.fits POT032 000043E 1914-01-28 ivo://org.gavo.dc/~?potsdam/data/fits/POT032_000043E.fits http://dc.zah.uni-heidelberg.de/getproduct/potsdam/data/fits/POT032_000043E.fits image/fits 435344 96.1095474818101 31.929532175206 2.63162090137484 Polygon ICRS 97.6853052447 33.2333654587 97.6308154 30.6046273426 94.5763673352 30.6070206617 94.5432016023 33.2334262897 0.634550250833854 20160.0 20160.0 NaN NaN NaN NaN NaN em.opt Astrophysikalisches Observatorium Potsdam Potsdam T-berg, POT032 14930 14929 -1 -1 -1 NaN
pyvo-1.2.1/pyvo/dal/tests/data/tap/tables.xml000066400000000000000000000013311416757633600211200ustar00rootroot00000000000000 test This is a unittest schema test.table1
test.table2
pyvo-1.2.1/pyvo/dal/tests/make_testdata.py000066400000000000000000000076401416757633600206200ustar00rootroot00000000000000from pathlib import Path import numpy as np from astropy.table import Table from astropy.io.votable.tree import VOTableFile, Info from astropy.io.fits import ImageHDU def _votablefile(): table = Table([ [23, 42, 1337], [b'Illuminatus', b"Don't panic, and always carry a towel", b'Elite'] ], names=('1', '2')) table['1'].meta['ucd'] = 'foo;bar' table['2'].meta['utype'] = 'foobar' votablefile = VOTableFile.from_table(table) info = Info(name='QUERY_STATUS', value='OK') info.content = 'OK' votablefile.resources[0].infos.append(info) return votablefile def votablefile(): votablefile = _votablefile() return votablefile def votablefile_errorstatus(): votablefile = _votablefile() info = Info(name='QUERY_STATUS', value='ERROR') info.content = 'ERROR' votablefile.resources[0].infos[0] = info return votablefile def votablefile_missingtable(): votablefile = _votablefile() del votablefile.resources[0].tables[0] return votablefile def votablefile_missingresource(): votablefile = _votablefile() del votablefile.resources[0] return votablefile def votablefile_missingcolumns(): votablefile = _votablefile() del votablefile.resources[0].tables[0].fields[:] return votablefile def votablefile_firstresource(): votablefile = _votablefile() votablefile.resources[0]._type = '' return votablefile def votablefile_tableinfo(): votablefile = _votablefile() votablefile.resources[0].tables[0].infos[:] = ( votablefile.resources[0].infos[:]) del votablefile.resources[0].infos[:] return votablefile def votablefile_rootinfo(): votablefile = _votablefile() votablefile.infos[:] = ( votablefile.resources[0].infos[:]) del votablefile.resources[0].infos[:] return votablefile def votablefile_dataset(): table = Table([ [ 'image/fits', 'application/x-votable+xml', 'application/x-votable+xml;content=datalink' ], [ b'http://example.com/querydata/image.fits', b'http://example.com/querydata/votable.xml', b'http://example.com/querydata/votable-datalink.xml' ] ], names=('dataformat', 'dataurl')) table['dataformat'].meta['ucd'] = 'meta.code.mime' table['dataurl'].meta['utype'] = 'Access.Reference' table['dataurl'].meta['ucd'] = 'meta.dataset;meta.ref.url' votablefile = VOTableFile.from_table(table) info = Info(name='QUERY_STATUS', value='OK') info.content = 'OK' votablefile.resources[0].infos.append(info) return votablefile def dataset_fits(): hdu = ImageHDU(np.random.random((256, 256))) return hdu def main(): dirname = Path(__file__).parent / 'data' votablefile().to_xml( str(dirname / 'query/basic.xml'), tabledata_format='tabledata') votablefile_errorstatus().to_xml( str(dirname / 'query/errorstatus.xml'), tabledata_format='tabledata') votablefile_missingtable().to_xml( str(dirname / 'query/missingtable.xml'), tabledata_format='tabledata') votablefile_missingresource().to_xml( str(dirname / 'query/missingresource.xml'), tabledata_format='tabledata') votablefile_missingcolumns().to_xml( str(dirname / 'query/missingcolumns.xml'), tabledata_format='tabledata') votablefile_firstresource().to_xml( str(dirname / 'query/firstresource.xml'), tabledata_format='tabledata') votablefile_tableinfo().to_xml( str(dirname / 'query/tableinfo.xml'), tabledata_format='tabledata') votablefile_rootinfo().to_xml( str(dirname / 'query/rootinfo.xml'), tabledata_format='tabledata') votablefile_dataset().to_xml( str(dirname / 'query/dataset.xml'), tabledata_format='tabledata') dataset_fits().writeto( str(dirname / 'querydata/image.fits'), overwrite=True) if __name__ == '__main__': main() pyvo-1.2.1/pyvo/dal/tests/setup_package.py000066400000000000000000000015061416757633600206200ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst import os def get_package_data(): paths = [ os.path.join('data/query', '*.xml'), os.path.join('data/querydata', 'image.fits'), os.path.join('data/querydata', '*.xml'), os.path.join('data/querydata', '*.xml'), os.path.join('data/tap', '*.xml'), os.path.join('data/tap', '*.htm'), os.path.join('data/scs', '*.xml'), os.path.join('data/sia', '*.xml'), os.path.join('data/sia2', '*.xml'), os.path.join('data/sla', '*.xml'), os.path.join('data/ssa', '*.xml'), os.path.join('data/datalink', '*.xml'), os.path.join('data', '*.xml'), os.path.join('data/mimetype', '*jpg'), os.path.join('data/mimetype', '*fits'), ] return {'pyvo.dal.tests': paths} pyvo-1.2.1/pyvo/dal/tests/test_adhoc.py000066400000000000000000000202121416757633600201150ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.adhoc """ import datetime from astropy import units as u from astropy.time import Time import pytest from pyvo.dal.adhoc import AxisParamMixin, SodaQuery def test_pos(): class TestClass(dict, AxisParamMixin): pass test_obj = TestClass() test_obj.pos.add((1, 2, 3)*u.deg) assert len(test_obj._pos) == 1 assert test_obj['POS'] == ['CIRCLE 1.0 2.0 3.0'] test_obj.pos.add((1, 2, 3, 4)) assert len(test_obj._pos) == 2 assert test_obj['POS'] == ['CIRCLE 1.0 2.0 3.0', 'RANGE 1.0 2.0 3.0 4.0'] # duplicates are ignored test_obj.pos.add((1, 2, 3)) assert len(test_obj._pos) == 2 assert test_obj['POS'] == ['CIRCLE 1.0 2.0 3.0', 'RANGE 1.0 2.0 3.0 4.0'] # polygon test_obj.pos.add((1, 2, 3, 4, 5, 6)) assert len(test_obj._pos) == 3 assert test_obj['POS'] == ['CIRCLE 1.0 2.0 3.0', 'RANGE 1.0 2.0 3.0 4.0', 'POLYGON 1.0 2.0 3.0 4.0 5.0 6.0'] # deletes test_obj.pos.remove((1, 2, 3, 4)) assert len(test_obj._pos) == 2 assert test_obj['POS'] == ['CIRCLE 1.0 2.0 3.0', 'POLYGON 1.0 2.0 3.0 4.0 5.0 6.0'] # test borders test_obj.pos.discard((1, 2, 3)*u.deg) test_obj.pos.discard((1, 2, 3, 4, 5, 6)) assert(len(test_obj._pos) == 0) test_obj.pos.add((0, 90, 90)) assert len(test_obj._pos) == 1 assert test_obj['POS'] == ['CIRCLE 0.0 90.0 90.0'] test_obj.pos.pop() test_obj.pos.add((360, -90, 1)) assert len(test_obj._pos) == 1 assert test_obj['POS'] == ['CIRCLE 360.0 -90.0 1.0'] test_obj.pos.pop() test_obj.pos.add((0, 360, -90, 90)) assert len(test_obj._pos) == 1 assert test_obj['POS'] == ['RANGE 0.0 360.0 -90.0 90.0'] test_obj.pos.pop() test_obj.pos.add((0, 0, 180, 90, 270, -90)) assert len(test_obj._pos) == 1 assert test_obj['POS'] == ['POLYGON 0.0 0.0 180.0 90.0 270.0 -90.0'] # errors test_obj.pos.pop() with pytest.raises(ValueError): test_obj.pos.add(('A', 2, 3)) with pytest.raises(ValueError): test_obj.pos.add((-2, 7, 3)) with pytest.raises(ValueError): test_obj.pos.add((3, 99, 3)) with pytest.raises(ValueError): test_obj.pos.add((2, 7, 91)) with pytest.raises(ValueError): test_obj.pos.add((-1, 7, 3, 4)) with pytest.raises(ValueError): test_obj.pos.add((2, 1, 3, 4)) with pytest.raises(ValueError): test_obj.pos.add((1, 2, 4, 3)) with pytest.raises(ValueError): test_obj.pos.add((-2, 7, 5, 9, 10, 10)) with pytest.raises(ValueError): test_obj.pos.add((2, 99, 5, 9, 10, 10)) with pytest.raises(ValueError): test_obj.pos.add((1, 2, 3, 4, 5, 6, 7)) def test_band(): class TestClass(dict, AxisParamMixin): pass test_obj = TestClass() assert not hasattr(test_obj, '_band') test_obj.band.add(33) assert 33 in test_obj.band assert test_obj['BAND'] == ['33.0 33.0'] test_obj.band.add((50*u.meter, 500)) assert 33 in test_obj.band assert (50*u.meter, 500) in test_obj.band assert test_obj['BAND'] == ['33.0 33.0', '50.0 500.0'] test_obj.band.discard(33) assert (50*u.meter, 500) in test_obj.band assert test_obj['BAND'] == ['50.0 500.0'] test_obj.band.pop() assert not test_obj.band assert not test_obj['BAND'] test_obj.band.add((float('-inf'), 33)) assert (float('-inf'), 33) in test_obj.band assert test_obj.band.dal == ['-inf 33.0'] test_obj.band.clear() test_obj.band.add((33, float('inf'))) assert (33, float('inf')) in test_obj.band assert test_obj.band.dal == ['33.0 inf'] test_obj.clear() # error cases with pytest.raises(ValueError): test_obj.band.add(()) with pytest.raises(ValueError): test_obj.band.add((1, 2, 3)) with pytest.raises(ValueError): test_obj.band.add(('INVALID', 6)) with pytest.raises(ValueError): test_obj.band.add((3, 1)) def test_time(): class TestClass(dict, AxisParamMixin): pass test_obj = TestClass() assert not hasattr(test_obj, '_time') now = Time(datetime.datetime.now()) test_obj.time.add(now) assert now in test_obj.time assert test_obj['TIME'] == ['{now} {now}'.format(now=now.mjd)] min_time = '2010-01-01T00:00:00.000Z' max_time = '2010-01-01T01:00:00.000Z' test_obj.time.add((min_time, max_time)) assert now in test_obj.time assert (min_time, max_time) in test_obj.time assert test_obj['TIME'] == ['{now} {now}'.format(now=now.mjd), '{min} {max}'.format(min=Time(min_time).mjd, max=Time(max_time).mjd)] test_obj.time.discard(now) assert (min_time, max_time) in test_obj.time assert test_obj['TIME'] == ['{min} {max}'.format(min=Time(min_time).mjd, max=Time(max_time).mjd)] test_obj.time.pop() assert not test_obj.time assert not test_obj['TIME'] # error cases with pytest.raises(ValueError): test_obj.time.add([]) with pytest.raises(ValueError): test_obj.time.add([now, min_time, max_time]) with pytest.raises(ValueError): test_obj.time.add(['INVALID']) with pytest.raises(ValueError): test_obj.time.add([max_time, min_time]) def test_pol(): class TestClass(dict, AxisParamMixin): pass test_obj = TestClass() assert not hasattr(test_obj, '_pol') test_obj.pol.add('YY') assert 'YY' in test_obj.pol assert test_obj['POL'] == ['YY'] test_obj.pol.add('POLI') assert 'YY' in test_obj.pol assert 'POLI' in test_obj.pol assert test_obj['POL'] == ['YY', 'POLI'] # test duplicate test_obj.pol.add('POLI') assert 'YY' in test_obj.pol assert 'POLI' in test_obj.pol assert test_obj['POL'] == ['YY', 'POLI'] test_obj.pol.remove('YY') assert 'POLI' in test_obj.pol assert test_obj['POL'] == ['POLI'] test_obj.pol.pop() assert not test_obj._pol assert not test_obj['POL'] # error cases with pytest.raises(ValueError): test_obj.pol.add(None) with pytest.raises(ValueError): test_obj.pol.add(['INVALID']) def test_soda_query(): test_obj = SodaQuery(baseurl='some/url') test_obj.circle = (2, 3, 5) assert test_obj._circle == (2, 3, 5) assert test_obj['CIRCLE'] == '2.0 3.0 5.0' assert test_obj._circle assert not hasattr(test_obj, '_polygon') assert not hasattr(test_obj, '_range') test_obj.range = (8, 9, 3, 4)*u.deg assert test_obj['POS'] == 'RANGE 8.0 9.0 3.0 4.0' assert test_obj._range is not None assert not hasattr(test_obj, '_polygon') assert not hasattr(test_obj, '_circle') test_obj.polygon = (1, 2, 3, 4, 5, 6) assert test_obj['POLYGON'] == '1.0 2.0 3.0 4.0 5.0 6.0' assert test_obj._polygon assert not hasattr(test_obj, '_range') assert not hasattr(test_obj, '_circle') del test_obj.polygon assert not hasattr(test_obj, '_polygon') assert not hasattr(test_obj, '_circle') assert not hasattr(test_obj, '_range') # error cases with pytest.raises(ValueError): test_obj.circle = ('A', 1, 2) with pytest.raises(ValueError): test_obj.circle = (1, 1, 2, 2) with pytest.raises(ValueError): test_obj.circle = (-1, 1, 2) with pytest.raises(ValueError): test_obj.circle = (1, 99, 2) with pytest.raises(ValueError): test_obj.circle = (1, 1, 91) with pytest.raises(ValueError): test_obj.range = (1, 2, 3) with pytest.raises(ValueError): test_obj.range = (2, 1, 3, 4) with pytest.raises(ValueError): test_obj.range = (1, 2, 4, 3) with pytest.raises(ValueError): test_obj.range = (-1, 2, 3, 4) with pytest.raises(ValueError): test_obj.range = (2, 1000, 3, 4) with pytest.raises(ValueError): test_obj.range = (1, 1, -91, 4) with pytest.raises(ValueError): test_obj.range = (1, 1, 3, 92) with pytest.raises(ValueError): test_obj.polygon = (1, 2, 3, 4) with pytest.raises(ValueError): test_obj.polygon = (2, 1, 3, 4, 5, 6, 7) pyvo-1.2.1/pyvo/dal/tests/test_datalink.py000066400000000000000000000126221416757633600206340ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.datalink """ from functools import partial import pytest import pyvo as vo from pyvo.dal.adhoc import DatalinkResults from astropy.utils.data import get_pkg_data_contents get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') @pytest.fixture() def ssa_datalink(mocker): def callback(request, context): return get_pkg_data_contents('data/datalink/datalink-ssa.xml') with mocker.register_uri( 'GET', 'http://example.com/ssa_datalink', content=callback ) as matcher: yield matcher @pytest.fixture() def datalink(mocker): def callback(request, context): return get_pkg_data_contents('data/datalink/datalink.xml') with mocker.register_uri( 'POST', 'http://example.com/datalink', content=callback ) as matcher: yield matcher @pytest.fixture() def obscore_datalink(mocker): def callback(request, context): return get_pkg_data_contents('data/datalink/datalink-obscore.xml') with mocker.register_uri( 'GET', 'http://example.com/obscore', content=callback ) as matcher: yield matcher @pytest.fixture() def res_datalink(mocker): first_batch = True def callback(request, context): nonlocal first_batch if first_batch: first_batch = False return get_pkg_data_contents('data/datalink/cutout1.xml') else: return get_pkg_data_contents('data/datalink/cutout2.xml') with mocker.register_uri( 'POST', 'https://example.com/obscore-datalink', content=callback ) as matcher: yield matcher @pytest.fixture() def proc(mocker): def callback(request, context): return get_pkg_data_contents('data/datalink/proc.xml') with mocker.register_uri( 'GET', 'http://example.com/proc', content=callback ) as matcher: yield matcher @pytest.mark.usefixtures('ssa_datalink', 'datalink') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.E02") def test_datalink(): results = vo.spectrumsearch( 'http://example.com/ssa_datalink', (30, 30)) datalink = next(results.iter_datalinks()) row = datalink[0] assert row.semantics == "#progenitor" row = datalink[1] assert row.semantics == "#proc" row = datalink[2] assert row.semantics == "#this" row = datalink[3] assert row.semantics == "#preview" @pytest.mark.usefixtures('obscore_datalink', 'res_datalink') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.E02") def test_datalink_batch(): results = vo.dal.imagesearch( 'http://example.com/obscore', (30, 30)) assert len([_ for _ in results.iter_datalinks()]) == 3 # temporary hack while astropy <4.1 is still around; you can remove # this and its calls once that's no longer true. def _debytify(v): if isinstance(v, bytes): return v.decode("utf-8") return v @pytest.mark.usefixtures('proc') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.E02") class TestSemanticsRetrieval: def test_access_with_string(self): datalink = DatalinkResults.from_result_url('http://example.com/proc') res = [_debytify(r["access_url"]) for r in datalink.bysemantics("#this")] assert len(res)==1 assert res[0].endswith("eq010000ms/20100927.comb_avg.0001.fits.fz") def test_access_with_list(self): datalink = DatalinkResults.from_result_url('http://example.com/proc') res = [_debytify(r["access_url"]) for r in datalink.bysemantics(["#this", "#preview-image"])] assert len(res)==2 assert res[0].endswith("eq010000ms/20100927.comb_avg.0001.fits.fz") assert res[1].endswith("20100927.comb_avg.0001.fits.fz?preview=True") def test_access_with_expansion(self): datalink = DatalinkResults.from_result_url('http://example.com/proc') res = [_debytify(r["access_url"]) for r in datalink.bysemantics(["#this", "#preview"])] assert len(res)==3 assert res[0].endswith("eq010000ms/20100927.comb_avg.0001.fits.fz") assert res[1].endswith("20100927.comb_avg.0001.fits.fz?preview=True") assert res[2].endswith("http://dc.zah.uni-heidelberg.de/wider.dat") def test_access_without_expansion(self): datalink = DatalinkResults.from_result_url('http://example.com/proc') res = [_debytify(r["access_url"]) for r in datalink.bysemantics( ["#this", "#preview"], include_narrower=False)] assert len(res)==2 assert res[0].endswith("eq010000ms/20100927.comb_avg.0001.fits.fz") assert res[1].endswith("http://dc.zah.uni-heidelberg.de/wider.dat") pyvo-1.2.1/pyvo/dal/tests/test_mimetype.py000066400000000000000000000027151416757633600207000ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.mimetype """ from functools import partial import pytest import requests_mock from astropy.utils.data import get_pkg_data_contents from pyvo.dal.mimetype import mime_object_maker mime_url = 'https://someurl.com/' get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') @pytest.fixture() def mime(mocker): def callback(request, context): if 'mime-text' in request.url: return b'Text content' elif 'image' in request.url: return get_pkg_data_contents('data/mimetype/ivoa_logo.jpg') elif 'fits' in request.url: return get_pkg_data_contents('data/mimetype/test.fits') with mocker.register_uri( 'GET', requests_mock.ANY, content=callback ) as matcher: yield matcher @pytest.mark.usefixtures('mime') def test_mime_object_maker(): assert 'Text content' == mime_object_maker(mime_url+'mime-text', 'text/csv') img = mime_object_maker(mime_url+'image', 'image/jpeg') assert img assert 'JPEG' == img.format fits = mime_object_maker(mime_url+'fits', 'application/fits') assert 2 == len(fits) # error cases with pytest.raises(ValueError): mime_object_maker(None, "not/a/mime/type") with pytest.raises(ValueError): mime_object_maker(None, None) pyvo-1.2.1/pyvo/dal/tests/test_monkeypatch.py000066400000000000000000000006031416757633600213630ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.datalink """ from astropy.table import Table from astropy.utils.data import get_pkg_data_filename def test_monkeypatch(): Table.read(get_pkg_data_filename("data/monkeypatch.xml")) import pyvo # noqa: F401 Table.read(get_pkg_data_filename("data/monkeypatch.xml")) pyvo-1.2.1/pyvo/dal/tests/test_params.py000066400000000000000000000157311416757633600203340ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.datalink """ from functools import partial from urllib.parse import parse_qsl from pyvo.dal.adhoc import DatalinkResults from pyvo.dal.params import find_param_by_keyword, get_converter,\ AbstractDalQueryParam, IntervalQueryParam from pyvo.dal.exceptions import DALServiceError import pytest import numpy as np import astropy.units as u from astropy.utils.data import get_pkg_data_contents, get_pkg_data_fileobj get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') get_pkg_data_fileobj = partial( get_pkg_data_fileobj, package=__package__, encoding='binary') @pytest.fixture() def proc(mocker): def callback(request, context): return get_pkg_data_contents('data/datalink/proc.xml') with mocker.register_uri( 'GET', 'http://example.com/proc', content=callback ) as matcher: yield matcher @pytest.fixture() def proc_ds(mocker): def callback(request, context): return b'' with mocker.register_uri( 'GET', 'http://example.com/proc', content=callback ) as matcher: yield matcher @pytest.fixture() def proc_units(mocker): def callback(request, context): return get_pkg_data_contents('data/datalink/proc_units.xml') with mocker.register_uri( 'GET', 'http://example.com/proc_units', content=callback ) as matcher: yield matcher @pytest.fixture() def proc_units_ds(mocker): def callback(request, context): data = dict(parse_qsl(request.query)) if 'band' in data: assert data['band'] == ( '6.000000000000001e-07 8.000000000000001e-06') return b'' with mocker.register_uri( 'GET', 'http://example.com/proc_units_ds', content=callback ) as matcher: yield matcher @pytest.fixture() def proc_inf(mocker): def callback(request, context): return get_pkg_data_contents('data/datalink/proc_inf.xml') with mocker.register_uri( 'GET', 'http://example.com/proc_inf', content=callback ) as matcher: yield matcher @pytest.fixture() def proc_inf_ds(mocker): def callback(request, context): data = dict(parse_qsl(request.query)) if 'band' in data: assert data['band'] == ( '6.000000000000001e-07 +Inf') return b'' with mocker.register_uri( 'GET', 'http://example.com/proc_inf_ds', content=callback ) as matcher: yield matcher @pytest.mark.usefixtures('proc') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.E02") def test_find_param_by_keyword(): datalink = DatalinkResults.from_result_url('http://example.com/proc') proc = datalink[0] input_params = {param.name: param for param in proc.input_params} polygon_lower = find_param_by_keyword('polygon', input_params) polygon_upper = find_param_by_keyword('POLYGON', input_params) circle_lower = find_param_by_keyword('circle', input_params) circle_upper = find_param_by_keyword('CIRCLE', input_params) assert polygon_lower == polygon_upper assert circle_lower == circle_upper @pytest.mark.usefixtures('proc') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.E02") def test_serialize(): datalink = DatalinkResults.from_result_url('http://example.com/proc') proc = datalink[0] input_params = {param.name: param for param in proc.input_params} polygon_conv = get_converter( find_param_by_keyword('polygon', input_params)) circle_conv = get_converter( find_param_by_keyword('circle', input_params)) scale_conv = get_converter( find_param_by_keyword('scale', input_params)) kind_conv = get_converter( find_param_by_keyword('kind', input_params)) assert polygon_conv.serialize((1, 2, 3)) == "1 2 3" assert polygon_conv.serialize(np.array((1, 2, 3))) == "1 2 3" assert circle_conv.serialize((1.1, 2.2, 3.3)) == "1.1 2.2 3.3" assert circle_conv.serialize(np.array((1.1, 2.2, 3.3))) == "1.1 2.2 3.3" assert scale_conv.serialize(1) == "1" assert kind_conv.serialize("DATA") == "DATA" @pytest.mark.usefixtures('proc') @pytest.mark.usefixtures('proc_ds') def test_serialize_exceptions(): datalink = DatalinkResults.from_result_url('http://example.com/proc') proc = datalink[0] input_params = {param.name: param for param in proc.input_params} polygon_conv = get_converter( find_param_by_keyword('polygon', input_params)) circle_conv = get_converter( find_param_by_keyword('circle', input_params)) band_conv = get_converter( find_param_by_keyword('band', input_params)) with pytest.raises(DALServiceError): polygon_conv.serialize((1, 2, 3, 4)) with pytest.raises(DALServiceError): circle_conv.serialize((1, 2, 3, 4)) with pytest.raises(DALServiceError): band_conv.serialize((1, 2, 3)) @pytest.mark.usefixtures('proc_units') @pytest.mark.usefixtures('proc_units_ds') def test_units(): datalink = DatalinkResults.from_result_url('http://example.com/proc_units') proc = datalink[0] proc.process(band=(6000*u.Angstrom, 80000*u.Angstrom)) @pytest.mark.usefixtures('proc_inf') @pytest.mark.usefixtures('proc_inf_ds') def test_inf(): datalink = DatalinkResults.from_result_url('http://example.com/proc_inf') proc = datalink[0] proc.process(band=(6000, +np.inf) * u.Angstrom) def test_dal_query_param(): class Test(AbstractDalQueryParam): def get_dal_format(self, item): return str(item) # check test_obs behaves like a set but also holds the dal representation test_obs = Test() test_obs.add(1) assert 1 in test_obs assert test_obs.dal == ['1'] test_obs.add(2) test_obs.add(3) assert len(test_obs) == 3 assert test_obs.dal == ['1', '2', '3'] assert {2, 3} < test_obs assert {1, 2, 3, 4} > test_obs test_obs.clear() assert len(test_obs) == 0 assert len(test_obs.dal) == 0 def test_dal_format(): iqp = IntervalQueryParam(unit=u.m, equivalencies=u.spectral()) assert '1.0 1.0' == iqp.get_dal_format(1) assert '1.0 2.0' == iqp.get_dal_format((1, 2)) assert '1.0 2.0' == iqp.get_dal_format((100*u.cm, 200*u.cm)) assert '1.0 2.0' == iqp.get_dal_format((100, 200)*u.cm) assert '0.14989622900000002 1.0' == iqp.get_dal_format((100*u.cm, 2*u.GHz)) assert '14.9896229 29.9792458' == iqp.get_dal_format((0.01, 0.02)*u.GHz) # Quantity intervals are corrected in terms of min and max .. assert '1.0 2.0' == iqp.get_dal_format((2, 1)*u.m) # But unitless intervals are not with pytest.raises(ValueError): iqp.get_dal_format((2, 1)) pyvo-1.2.1/pyvo/dal/tests/test_query.py000066400000000000000000000377131416757633600202220ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.query """ from functools import partial try: from contextlib import ExitStack except ImportError: from contextlib2 import ExitStack from os import listdir import pytest import numpy as np from pyvo.dal.query import DALService, DALQuery, DALResults, Record from pyvo.dal.exceptions import DALServiceError, DALQueryError, DALFormatError from pyvo.version import version from pyvo.utils.compat import ASTROPY_LT_4_1 from astropy.table import Table from astropy.io.votable.tree import VOTableFile, Table as VOTable from astropy.io.fits import HDUList from astropy.utils.data import get_pkg_data_contents get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') @pytest.fixture() def register_mocks(mocker): with ExitStack() as stack: matchers = [ stack.enter_context(mocker.register_uri( 'GET', '//example.com/query/basic', content=get_pkg_data_contents('data/query/basic.xml') )), stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/query/missingtable', content=get_pkg_data_contents('data/query/missingtable.xml') )), stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/query/missingresource', content=get_pkg_data_contents('data/query/missingresource.xml') )), stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/query/missingcolumns', content=get_pkg_data_contents('data/query/missingcolumns.xml') )), stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/query/firstresource', content=get_pkg_data_contents('data/query/firstresource.xml') )), stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/query/rootinfo', content=get_pkg_data_contents('data/query/rootinfo.xml') )), stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/query/tableinfo', content=get_pkg_data_contents('data/query/tableinfo.xml') )), stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/query/dataset', content=get_pkg_data_contents('data/query/dataset.xml') )), stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/querydata/image.fits', content=get_pkg_data_contents('data/querydata/image.fits') )), # mocker.register_uri( # 'GET', 'http://example.com/querydata/votable.xml', # content=get_pkg_data_contents('data/querydata/votable.xml') # ), # mocker.register_uri( # 'GET', 'http://example.com/querydata/votable-datalink.xml', # content=get_pkg_data_contents('data/querydata/votable-datalink.xml') # ), stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/query/nonexistant', text='Not Found', status_code=404 )), stack.enter_context(mocker.register_uri( 'GET', '//example.com/query/errornous', text='Error', status_code=500 )), stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/query/errorstatus', content=get_pkg_data_contents('data/query/errorstatus.xml') )), ] def verbosetest_callback(request, context): assert 'VERBOSE' in request.qs and '1' in request.qs['VERBOSE'] return get_pkg_data_contents('data/query/basic.xml') matchers.append(stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/query/verbosetest', content=verbosetest_callback ))) def useragent_callback(request, context): assert 'User-Agent' in request.headers assert request.headers['User-Agent'] == 'python-pyvo/{}'.format( version) return get_pkg_data_contents('data/query/basic.xml') matchers.append(stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/query/useragent', content=useragent_callback ))) yield matchers def _test_results(results): """Regression test result columns for correctnes""" assert len(results) == 3 assert results['1', 0] == 23 assert results['1', 1] == 42 assert results['1', 2] == 1337 truth = b'Illuminatus' if ASTROPY_LT_4_1 else 'Illuminatus' assert results['2', 0] == truth truth = b"Don't panic, and always carry a towel" \ if ASTROPY_LT_4_1 else "Don't panic, and always carry a towel" assert results['2', 1] == truth truth = b'Elite' if ASTROPY_LT_4_1 else 'Elite' assert results['2', 2] == truth def _test_records(records): """ Regression test dal records for correctness""" assert len(records) == 3 assert all([isinstance(record, Record) for record in records]) assert records[0]['1'] == 23 truth = b'Illuminatus' if ASTROPY_LT_4_1 else 'Illuminatus' assert records[0]['2'] == truth assert records[1]['1'] == 42 truth = b"Don't panic, and always carry a towel" \ if ASTROPY_LT_4_1 else "Don't panic, and always carry a towel" assert records[1]['2'] == truth assert records[2]['1'] == 1337 truth = b'Elite' if ASTROPY_LT_4_1 else 'Elite' assert records[2]['2'] == truth @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") @pytest.mark.usefixtures('register_mocks') class TestDALService: def test_init(self): """Test if baseurl if passed correctly""" service = DALService('http://example.com/query/basic') assert service.baseurl == 'http://example.com/query/basic' def test_search(self): """ Test (in conjunction with mocker) that parameters arrive serverside, while also ensuring data consistency """ service = DALService('http://example.com/query/verbosetest') dalresults = service.search(VERBOSE=1) _test_results(dalresults) _test_records(dalresults) def test_useragent(self): service = DALService('http://example.com/query/useragent') service.search() def test_http_exception_404(self): service = DALService('http://example.com/query/nonexistant') try: service.search() except DALServiceError as exc: assert exc.code == 404 else: assert False def test_http_exception_500(self): service = DALService('http://example.com/query/errornous') try: service.search() except DALServiceError as exc: assert exc.code == 500 else: assert False def test_query_exception(self): service = DALService('http://example.com/query/errorstatus') with pytest.raises(DALQueryError): service.search() @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W53") def test_format_exception(self): with pytest.raises(DALFormatError): service = DALService('http://example.com/query/missingtable') service.search() with pytest.raises(DALFormatError): service = DALService('http://example.com/query/missingresource') service.search() with pytest.raises(DALFormatError): service = DALService('http://example.com/query/missingcolumns') service.search() @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") @pytest.mark.usefixtures('register_mocks') class TestDALQuery: def test_url(self): queries = ( DALQuery('http://example.com/query/basic'), DALQuery(b'http://example.com/query/basic'), ) assert all( q.queryurl == 'http://example.com/query/basic' for q in queries ) def test_params(self): query = DALQuery( 'http://example.com/query/basic', verbose=1, foo='BAR') assert query['VERBOSE'] == 1 assert query['FOO'] == 'BAR' def test_execute(self): query = DALQuery('http://example.com/query/basic') dalresults = query.execute() assert dalresults.queryurl == 'http://example.com/query/basic' _test_results(dalresults) _test_records(dalresults) def test_execute_raw(self): query = DALQuery('http://example.com/query/basic') raw = query.execute_raw() assert raw.startswith(b'') @pytest.mark.filterwarnings('ignore::astropy.io.votable.exceptions.W03') @pytest.mark.filterwarnings('ignore::astropy.io.votable.exceptions.W06') @pytest.mark.usefixtures('register_mocks') class TestDALResults: def test_init(self): dalresults = DALResults.from_result_url( 'http://example.com/query/basic') assert dalresults.queryurl == 'http://example.com/query/basic' assert isinstance(dalresults.votable, VOTableFile) assert isinstance(dalresults.resultstable, VOTable) assert dalresults.fieldnames == ('1', '2') assert ( dalresults.fielddescs[0].name, dalresults.fielddescs[1].name ) == ('1', '2') assert dalresults.status == ('OK', 'OK') def test_from_result_url(self): dalresults = DALResults.from_result_url( 'http://example.com/query/basic') assert dalresults.status == ('OK', 'OK') def test_init_errorstatus(self): with pytest.raises(DALQueryError): DALResults.from_result_url('http://example.com/query/errorstatus') def test_init_missingtable(self): with pytest.raises(DALFormatError): DALResults.from_result_url('http://example.com/query/missingtable') @pytest.mark.filterwarnings('ignore::astropy.io.votable.exceptions.W53') def test_init_missingresource(self): with pytest.raises(DALFormatError): DALResults.from_result_url( 'http://example.com/query/missingresource') @pytest.mark.xfail() def test_init_missingcolumns(self): with pytest.raises(DALFormatError): DALResults.from_result_url( 'http://example.com/query/missingcolumns') def test_init_firstresource(self): dalresults = DALResults.from_result_url( 'http://example.com/query/firstresource') assert dalresults.status == ('OK', 'OK') def test_init_tableinfo(self): dalresults = DALResults.from_result_url( 'http://example.com/query/tableinfo') assert dalresults.status == ('OK', 'OK') def test_init_rootinfo(self): dalresults = DALResults.from_result_url( 'http://example.com/query/rootinfo') assert dalresults.status == ('OK', 'OK') @pytest.mark.xfail(reason="ID lookup does not work") def test_repr(self): dalresults = DALResults.from_result_url( 'http://example.com/query/basic') assert repr(dalresults) == repr(dalresults.to_table()) def test_iter(self): dalresults = DALResults.from_result_url( 'http://example.com/query/basic') records = list(iter(dalresults)) _test_results(dalresults) _test_records(records) def test_dataconsistency(self): dalresults = DALResults.from_result_url( 'http://example.com/query/basic') assert isinstance(dalresults['1'], np.ndarray) assert isinstance(dalresults['2'], np.ndarray) _test_results(dalresults) _test_records(dalresults) @pytest.mark.xfail(reason="ID lookup does not work") def test_table_conversion(self): dalresults = DALResults.from_result_url( 'http://example.com/query/basic') assert isinstance(dalresults.to_table(), Table) assert len(dalresults) == len(dalresults.to_table()) def test_id_over_name(self): dalresults = DALResults.from_result_url( 'http://example.com/query/basic') assert isinstance(dalresults['_1'], np.ndarray) assert isinstance(dalresults['_2'], np.ndarray) table = dalresults.to_table() with pytest.raises(KeyError): assert table['_1'] with pytest.raises(KeyError): assert table['_2'] def test_nosuchcolumn(self): dalresults = DALResults.from_result_url( 'http://example.com/query/basic') with pytest.raises(KeyError): dalresults['nosuchcolumn'] with pytest.raises(KeyError): dalresults.getdesc('nosuchcolumn') def test_columnaliases(self): dalresults = DALResults.from_result_url( 'http://example.com/query/basic') assert dalresults.fieldname_with_ucd('foo') == '1' assert dalresults.fieldname_with_ucd('bar') == '1' assert dalresults.fieldname_with_utype('foobar') == '2' assert dalresults.fieldname_with_ucd('baz') is None assert dalresults.fieldname_with_utype('foobaz') is None @pytest.mark.filterwarnings('ignore::astropy.io.votable.exceptions.W03') @pytest.mark.filterwarnings('ignore::astropy.io.votable.exceptions.W06') @pytest.mark.usefixtures('register_mocks') class TestRecord: def test_itemaccess(self): record = DALResults.from_result_url( 'http://example.com/query/basic')[0] assert record['1'] == 23 truth = b'Illuminatus' if ASTROPY_LT_4_1 else 'Illuminatus' assert record['2'] == truth assert record['_1'] == 23 assert record['_2'] == truth def test_nosuchcolumn(self): record = DALResults.from_result_url( 'http://example.com/query/basic')[0] with pytest.raises(KeyError): record['nosuchcolumn'] def test_iter(self): record = DALResults.from_result_url( 'http://example.com/query/basic')[0] record = list(iter(record)) assert record[0] == '1' assert record[1] == '2' def test_len(self): record = DALResults.from_result_url( 'http://example.com/query/basic')[0] assert len(record) == 2 def test_repr(self): record = DALResults.from_result_url( 'http://example.com/query/basic')[0] truth = b'Illuminatus' if ASTROPY_LT_4_1 else 'Illuminatus' assert repr(record) == repr((23, truth)) def test_get(self): record = DALResults.from_result_url( 'http://example.com/query/basic')[0] assert record.get('2', decode=True) == 'Illuminatus' def test_columnaliases(self): record = DALResults.from_result_url( 'http://example.com/query/basic')[0] assert record.getbyucd('foo') == 23 assert record.getbyucd('bar') == 23 truth = b'Illuminatus' if ASTROPY_LT_4_1 else 'Illuminatus' assert record.getbyutype('foobar') == truth record.getbyucd('baz') is None record.getbyutype('foobaz') is None def test_datasets(self): records = DALResults.from_result_url( 'http://example.com/query/dataset') record = records[0] assert record.getdataurl() == 'http://example.com/querydata/image.fits' dataset = record.getdataset() HDUList.fromstring(dataset.read()) def test_nodataset(self): record = DALResults.from_result_url( 'http://example.com/query/basic')[0] assert record.getdataurl() is None with pytest.raises(KeyError): record.getdataset().read() def test_cachedataset(self, tmpdir): tmpdir = str(tmpdir) record = DALResults.from_result_url( 'http://example.com/query/dataset')[0] record.cachedataset(dir=tmpdir) assert "dataset.dat" in listdir(tmpdir) class TestUpload: pass pyvo-1.2.1/pyvo/dal/tests/test_scs.py000066400000000000000000000024621416757633600176360ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.scs """ from functools import partial import re import pytest from pyvo.dal.scs import search, SCSService from astropy.utils.data import get_pkg_data_contents get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') scs_re = re.compile('http://example.com/scs.*') @pytest.fixture() def scs(mocker): def callback(request, context): return get_pkg_data_contents('data/scs/result.xml') with mocker.register_uri( 'GET', scs_re, content=callback ) as matcher: yield matcher @pytest.mark.usefixtures('scs') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_search(): results = search('http://example.com/scs', (78, 2), 0.5) assert len(results) == 1273 class TestSCSService: def test_init(self): service = SCSService('http://example.com/scs') assert service.baseurl == 'http://example.com/scs' @pytest.mark.usefixtures('scs') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_search(self): service = SCSService('http://example.com/scs') results = service.search((78, 2), 0.5) assert len(results) == 1273 pyvo-1.2.1/pyvo/dal/tests/test_sia.py000066400000000000000000000035351416757633600176240ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.sia """ from functools import partial import re import pytest from pyvo.dal.sia import search, SIAService from astropy.io.fits import HDUList from astropy.utils.data import get_pkg_data_contents get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') sia_re = re.compile('http://example.com/sia.*') @pytest.fixture() def register_mocks(mocker): with mocker.register_uri( 'GET', 'http://example.com/querydata/image.fits', content=get_pkg_data_contents('data/querydata/image.fits') ) as matcher: yield matcher @pytest.fixture() def sia(mocker): with mocker.register_uri( 'GET', sia_re, content=get_pkg_data_contents('data/sia/dataset.xml') ) as matcher: yield matcher def _test_result(result): assert result.getdataurl() == 'http://example.com/querydata/image.fits' assert isinstance(result.getdataobj(), HDUList) assert result.filesize == 153280 @pytest.mark.usefixtures('sia') @pytest.mark.usefixtures('register_mocks') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_search(): results = search('http://example.com/sia', pos=(288, 15)) result = results[0] _test_result(result) class TestSIAService: @pytest.mark.usefixtures('sia') @pytest.mark.usefixtures('register_mocks') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W42") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W49") def test_search(self): service = SIAService('http://example.com/sia') results = service.search(pos=(288, 15)) result = results[0] _test_result(result) pyvo-1.2.1/pyvo/dal/tests/test_sia2.py000066400000000000000000000140421416757633600177010ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.sia """ from functools import partial import re import requests_mock import pytest from pyvo.dal.sia2 import search, SIAService, SIAQuery import astropy.units as u from astropy.utils.data import get_pkg_data_contents get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') sia_re = re.compile('https://example.com/sia/v2query*') capabilities_url = 'https://example.com/sia/capabilities' @pytest.fixture() def sia(mocker): with mocker.register_uri( 'GET', sia_re, content=get_pkg_data_contents('data/sia2/dataset.xml') ) as matcher: yield matcher @pytest.fixture() def capabilities(mocker): with mocker.register_uri( 'GET', capabilities_url, content=get_pkg_data_contents('data/sia2/capabilities.xml') ) as matcher: yield matcher def _test_result(record): assert record.obs_collection == 'TEST' assert record.obs_id == 'TEST-DATASET' assert record.instrument_name == 'TEST-INSTR' assert record.facility_name == 'TEST-1.6m' @pytest.mark.usefixtures('sia') @pytest.mark.usefixtures('capabilities') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_search(): results = search('https://example.com/sia', pos=(33.3*u.deg, 4.2*u.deg, 0.0166*u.deg)) result = results[0] _test_result(result) class TestSIAService: def test_capabilities(self): # this tests the SIA2 capabilities with various combinations: # - sia-basicauth - one interfaces with BasicAA security method - this # should fail because pyvo does not support BasicAA with requests_mock.Mocker() as cm: cm.get('https://example.com/sia/capabilities', content=get_pkg_data_contents('data/sia2/capabilities.xml')) cm.get('https://example.com/sia-basicauth/capabilities', content=get_pkg_data_contents( 'data/sia2/capabilities-basicauth.xml')) cm.get('https://example.com/sia-newformat/capabilities', content=get_pkg_data_contents( 'data/sia2/capabilities-newformat.xml')) cm.get('https://example.com/sia-priv/capabilities', content=get_pkg_data_contents( 'data/sia2/capabilities-priv.xml')) # multiple interfaces with single security method each and # anonymous access. service = SIAService('https://example.com/sia') assert service.query_ep == 'https://example.com/sia/v2query' # one interfaces with BasicAA security method - this should fail # because pyvo does not support BasicAA with pytest.raises(AttributeError): service = SIAService('https://example.com/sia-basicauth') # one interface with multiple security methods service = SIAService('https://example.com/sia-newformat') assert service.query_ep == 'https://example.com/sia/v2query' # multiple interfaces with single security method each (no anon) service = SIAService('https://example.com/sia-priv') assert service.query_ep == 'https://example.com/sia/v2query' @pytest.mark.usefixtures('sia') @pytest.mark.usefixtures('capabilities') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W42") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W49") def test_search(self): service = SIAService('https://example.com/sia') positions = [ (2, 4, 0.0166 * u.deg), (12, 12.5, 34, 36), (12.0*u.deg, 34.0*u.deg, 14.0*u.deg, 35.0*u.deg, 14.0*u.deg, 36.0*u.deg, 12.0*u.deg, 35.0*u.deg)] # each position for pos in positions: results = service.search(pos=pos) result = results[0] _test_result(result) # all positions results = service.search(pos=positions) result = results[0] _test_result(result) class TestSIAQuery(): def test_query(self): query = SIAQuery('someurl') query.field_of_view.add((10, 20)) assert query['FOV'] == ['10.0 20.0'] query.field_of_view.add((1*u.rad, 60)) assert query['FOV'] == ['10.0 20.0', '57.29577951308232 60.0'] query.spatial_resolution.add((1*u.arcsec, 2)) assert query['SPATRES'] == ['1.0 2.0'] query.spectral_resolving_power.add((3, 5)) assert query['SPECRP'] == ['3 5'] query.exptime.add((25, 50)) assert query['EXPTIME'] == ['25.0 50.0'] query.timeres.add((1, 3)) assert query['TIMERES'] == ['1.0 3.0'] query.publisher_did.add('ID1') query.publisher_did.add('ID2') assert query['ID'] == ['ID1', 'ID2'] query.facility.add('TEL1') assert query['FACILITY'] == ['TEL1'] query.collection.add('ABC') query.collection.add('EFG') assert query['COLLECTION'] == ['ABC', 'EFG'] query.instrument.add('INST1') assert query['INSTRUMENT'] == ['INST1'] query.data_type.add('TYPEA') assert query['DPTYPE'] == ['TYPEA'] query.calib_level.add(0) query.calib_level.add(1) assert query['CALIB'] == ['0', '1'] query.target_name.add('TARGET1') assert query['TARGET'] == ['TARGET1'] query.res_format.add('pdf') assert query['FORMAT'] == ['pdf'] query.maxrec = 1000 assert query['MAXREC'] == '1000' query = SIAQuery('someurl', custom_param=23) assert query['custom_param'] == ['23'] query['custom_param'].append('-Inf 0') assert query['custom_param'] == ['23', '-Inf 0'] query = SIAQuery('someurl', custom_param=[('-Inf', 0), (2, '+Inf')]) assert query['custom_param'] == ['-Inf 0', '2 +Inf'] pyvo-1.2.1/pyvo/dal/tests/test_sia2_remote.py000066400000000000000000000154561416757633600212660ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.sia2 against remote services """ import pytest from pyvo.dal.sia2 import search, SIAService import astropy.units as u CADC_SIA_URL = 'https://ws.cadc-ccda.hia-iha.nrc-cnrc.gc.ca/sia' @pytest.mark.remote_data class TestSIACadc(): # Tests the SIA2 client against the CADC SIA service def test_service(self): cadc = SIAService(baseurl=CADC_SIA_URL) assert cadc.availability assert cadc.availability.available assert cadc.availability.notes assert cadc.availability.notes[0] == 'service is accepting queries' assert cadc.capabilities def test_datalink_batch(self): # Maximum batch size in CADC SIA is around 25 # Test whether multiple batches can be retrieved results = search(CADC_SIA_URL, pos=(2.8425, 74.4846, 10), maxrec=55) ids = [] for i in results.iter_datalinks(): assert i.table[0]['ID'] not in ids ids.append(i.table[0]['ID']) assert len(ids) == 55 def test_pos(self): results = search(CADC_SIA_URL, pos=(2.8425, 74.4846, 0.001)) assert len(results) > 10 # limit results to 5 to expedite tests results = search(CADC_SIA_URL, pos=(2.8425, 74.4846, 0.001), maxrec=5) assert len(results) == 5 # check attributes of a record record = results[0] record.dataproduct_type record.dataproduct_subtype record.calib_level # TARGET INFO record.target_name record.target_class # DATA DESCRIPTION record.obs_id record.obs_title record.obs_collection record.obs_create_date record.obs_creator_name record.obs_creator_did # CURATION INFORMATION record.obs_release_date record.obs_publisher_did record.publisher_id record.bib_reference record.data_rights # ACCESS INFORMATION record.access_url record.access_format record.access_estsize # SPATIAL CHARACTERISATION record.s_ra record.s_dec record.s_fov record.s_region record.s_resolution record.s_xel1 record.s_xel2 record.s_ucd record.s_unit record.s_resolution_min record.s_resolution_max record.s_calib_status record.s_stat_error record.s_pixel_scale # TIME CHARACTERISATION record.t_xel record.t_ref_pos record.t_min record.t_max record.t_exptime record.t_resolution record.t_calib_status record.t_stat_error # SPECTRAL CHARACTERISATION record.em_xel record.em_ucd record.em_unit record.em_calib_status record.em_min record.em_max record.em_res_power record.em_res_power_min record.em_res_power_max record.em_resolution record.em_stat_error # OBSERVABLE AXIS record.o_ucd record.o_unit record.o_calib_status record.o_stat_error # POLARIZATION CHARACTERISATION record.pol_xel record.pol_states # PROVENANCE record.instrument_name record.facility_name record.proposal_id def test_band(self): results = search(CADC_SIA_URL, band=(0.0002, 0.0003), maxrec=5) # TODO - correctness assert len(results) == 5 def test_time(self): results = search(CADC_SIA_URL, time=('2002-01-01T00:00:00.00', '2002-01-02T00:00:00.00'), maxrec=5) assert len(results) == 5 def test_pol(self): results = search(CADC_SIA_URL, pol=['YY', 'U'], maxrec=5) assert len(results) == 5 for rr in results: assert 'YY' in rr.pol_states or 'U' in rr.pol_states def test_fov(self): results = search(CADC_SIA_URL, field_of_view=(10, 20), maxrec=5) assert len(results) == 5 # how to test values def test_spatial_res(self): results = search(CADC_SIA_URL, spatial_resolution=(1, 2), maxrec=5) assert len(results) == 5 for rr in results: assert 1*u.arcsec <= rr.s_resolution <= 2*u.arcsec def test_spec_resp(self): results = search(CADC_SIA_URL, spectral_resolving_power=(1, 2), maxrec=5) assert len(results) == 5 for rr in results: assert 1 <= rr.em_res_power <= 2 def test_exptime(self): results = search(CADC_SIA_URL, exptime=(1, 2), maxrec=5) assert len(results) == 5 for rr in results: assert 1*u.second <= rr.t_exptime <= 2*u.second def test_timeres(self): results = search(CADC_SIA_URL, timeres=(1, 2), maxrec=5) assert len(results) == 5 for rr in results: assert 1 * u.second <= rr.t_resolution <= 2 * u.second def test_publisher_did(self): ids = ['ivo://cadc.nrc.ca/CFHT?447231/447231o', 'ivo://cadc.nrc.ca/CFHT?447232/447232o'] results = search(CADC_SIA_URL, publisher_did=ids) assert len(results) == 2 assert results[0].obs_publisher_did in ids assert results[1].obs_publisher_did in ids def test_facility(self): results = search(CADC_SIA_URL, facility='JCMT', maxrec=5) assert len(results) == 5 for rr in results: assert rr.facility_name == 'JCMT' def test_collection(self): results = search(CADC_SIA_URL, collection='CFHT', maxrec=5) assert len(results) == 5 for rr in results: assert rr.obs_collection == 'CFHT' def test_instrument(self): results = search(CADC_SIA_URL, instrument='SCUBA-2', maxrec=5) assert len(results) == 5 for rr in results: assert rr.instrument_name == 'SCUBA-2' def test_dataproduct_type(self): results = search(CADC_SIA_URL, data_type='image', maxrec=5) assert len(results) == 5 for rr in results: assert rr.dataproduct_type == 'image' def test_target_name(self): results = search(CADC_SIA_URL, target_name='OGF:t028', maxrec=5) assert len(results) == 5 for rr in results: assert rr.target_name == 'OGF:t028' def test_res_format(self): results = search( CADC_SIA_URL, res_format='application/x-votable+xml;content=datalink', maxrec=5) assert len(results) == 5 for rr in results: assert rr.access_format == \ 'application/x-votable+xml;content=datalink' pyvo-1.2.1/pyvo/dal/tests/test_sla.py000066400000000000000000000024271416757633600176260ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.sla """ from functools import partial import re import pytest from pyvo.dal.sla import search, SLAService from astropy.utils.data import get_pkg_data_contents get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') sla_re = re.compile('http://example.com/sla.*') @pytest.fixture() def sla(mocker): with mocker.register_uri( 'GET', sla_re, content=get_pkg_data_contents('data/sla/dataset.xml') ) as matcher: yield matcher @pytest.mark.usefixtures('sla') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W42") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W49") def test_search(): results = search('http://example.com/sla', wavelength=(7.6e-6, 1.e-5)) assert len(results) == 21 class TestSLAService: @pytest.mark.usefixtures('sla') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W42") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W49") def test_search(self): service = SLAService('http://example.com/sla') results = service.search(wavelength=(7.6e-6, 1.e-5)) assert len(results) == 21 pyvo-1.2.1/pyvo/dal/tests/test_ssa.py000066400000000000000000000023001416757633600176230ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.ssa """ from functools import partial import re import pytest from pyvo.dal.ssa import search, SSAService from astropy.utils.data import get_pkg_data_contents get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') ssa_re = re.compile('http://example.com/ssa.*') @pytest.fixture() def ssa(mocker): def callback(request, context): return get_pkg_data_contents('data/ssa/result.xml') with mocker.register_uri( 'GET', ssa_re, content=callback ) as matcher: yield matcher @pytest.mark.usefixtures('ssa') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W42") def test_search(): results = search('http://example.com/ssa', pos=(0.0, 0.0), diameter=1.0) assert len(results) == 35 class TestSSAService: @pytest.mark.usefixtures('ssa') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W42") def test_search(self): service = SSAService('http://example.com/ssa') results = service.search(pos=(0.0, 0.0), diameter=1.0) assert len(results) == 35 pyvo-1.2.1/pyvo/dal/tests/test_tap.py000066400000000000000000000425611416757633600176360ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.tap """ from functools import partial from contextlib import ExitStack import datetime import re from io import BytesIO from urllib.parse import parse_qsl import pytest import requests_mock from pyvo.dal.tap import escape, search, TAPService from pyvo.io.uws import JobFile from pyvo.io.uws.tree import Parameter, Result from astropy.time import Time, TimeDelta from astropy.utils.data import get_pkg_data_contents get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') job_re_path_full = re.compile('^http://example.com/tap/async/([0-9]+)') job_re_path = re.compile('^/tap/async/([0-9]+)') job_re_phase_full = re.compile('^http://example.com/tap/async/([0-9]+)/phase') job_re_parameters_full = re.compile( '^http://example.com/tap/async/([0-9]+)/parameters') job_re_result_full = re.compile( '^http://example.com/tap/async/([0-9]+)/results/result') def _test_image_results(results): assert len(results) == 10 @pytest.fixture() def sync_fixture(mocker): def callback(request, context): return get_pkg_data_contents('data/tap/obscore-image.xml') with mocker.register_uri( 'POST', 'http://example.com/tap/sync', content=callback ) as matcher: yield matcher class MockAsyncTAPServer: def __init__(self): self._jobs = dict() def validator(self, request): pass def use(self, mocker): with ExitStack() as stack: matchers = { 'create': stack.enter_context(mocker.register_uri( 'POST', 'http://example.com/tap/async', content=self.create )), 'job': stack.enter_context(mocker.register_uri( requests_mock.ANY, job_re_path_full, content=self.job )), 'phase': stack.enter_context(mocker.register_uri( requests_mock.ANY, job_re_phase_full, content=self.phase )), 'parameters': stack.enter_context(mocker.register_uri( requests_mock.ANY, job_re_parameters_full, content=self.parameters )), 'result': stack.enter_context(mocker.register_uri( 'GET', job_re_result_full, content=self.result )), 'get_job': stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/tap/async/111', content=self.get_job )), 'get_job_list': stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/tap/async', content=self.get_job_list )) } yield matchers def create(self, request, context): if request.method == 'GET': return self.get_job_list(request, context) self.validator(request) newid = max(list(self._jobs.keys()) or [0]) + 1 data = dict(parse_qsl(request.body)) job = JobFile() job.version = "1.1" job.jobid = newid job.phase = 'PENDING' job.quote = Time.now() + TimeDelta(1, format='sec') job.creationtime = Time.now() job.executionduration = TimeDelta(3600, format='sec') job.destruction = Time.now() + TimeDelta(3600, format='sec') for key, value in data.items(): param = Parameter(id=key.lower()) param.content = value job.parameters.append(param) context.status_code = 303 context.reason = 'See other' context.headers['Location'] = ( 'http://example.com/tap/async/{}'.format(newid)) self._jobs[newid] = job def job(self, request, context): self.validator(request) jobid = int(job_re_path.match(request.path).group(1)) if request.method == 'GET': job = self._jobs[jobid] io = BytesIO() job.to_xml(io) return io.getvalue() elif request.method == 'POST': data = dict(parse_qsl(request.body)) action = data.get('ACTION') if action == 'DELETE': del self._jobs[jobid] def phase(self, request, context): self.validator(request) jobid = int(job_re_path.match(request.path).group(1)) if request.method == 'GET': phase = self._jobs[jobid].phase return phase elif request.method == 'POST': newphase = request.body.split('=')[-1] job = self._jobs[jobid] result = get_pkg_data_contents('data/tap/obscore-image.xml') if newphase == 'RUN': newphase = 'COMPLETED' result = Result(**{ 'id': 'result', 'size': len(result), 'mime-type': 'application/x-votable+xml', 'xlink:href': ( 'http://example.com/tap/async/{}/results/result' ).format(jobid) }) try: job.results[0] = result except (IndexError, TypeError): job.results.append(result) job.phase = newphase def parameters(self, request, context): self.validator(request) jobid = int(job_re_path.match(request.path).group(1)) job = self._jobs[jobid] if request.method == 'GET': pass elif request.method == 'POST': data = dict(parse_qsl(request.body)) if 'QUERY' in data: assert data['QUERY'] == 'SELECT TOP 42 * FROM ivoa.obsCore' for param in job.parameters: if param.id_ == 'query': param.content = data['QUERY'] if 'UPLOAD' in data: for param in job.parameters: if param.id_ == 'upload': uploads1 = {data[0]: data[1] for data in [ data.split(',') for data in data['UPLOAD'].split(';') ]} uploads2 = {data[0]: data[1] for data in [ data.split(',') for data in param.content.split(';') ]} uploads1.update(uploads2) param.content = ';'.join([ '{}={}'.format(key, value) for key, value in uploads1.items() ]) def result(self, request, context): self.validator(request) return get_pkg_data_contents('data/tap/obscore-image.xml') def get_job(self, request, context): self.validator(request) jobid = int(job_re_path.match(request.path).group(1)) job = JobFile() job.jobid = jobid job.phase = 'EXECUTING' job.ownerid = '222' job.creationtime = Time.now() io = BytesIO() job.to_xml(io) return io.getvalue() def _get_jobref_rep(self, jobid, phase, runid, ownerid, creation_time): doc = (' \n' ' {}\n' ' {}\n' ' {}\n' ' {}\n' ' \n') return doc.format(jobid, phase, runid, ownerid, creation_time) def get_job_list(self, request, context): self.validator(request) fields = parse_qsl(request.query) phases = [] last = None after = None for arg, val in fields: if arg == 'PHASE': phases.append(val) elif arg == 'LAST': last = int(val) elif arg == 'AFTER': after = val doc = '\n' +\ '\n' if phases: doc += self._get_jobref_rep('abc1', 'EXECUTING', 'def1', '21', '2018-12-20T00:23:15.79') doc += self._get_jobref_rep('abc2', 'EXECUTING', 'def2', '21', '2018-12-20T00:23:15.79') if after: doc += self._get_jobref_rep('abc3', 'EXECUTING', 'def3', '21', '2018-12-20T00:23:15.79') if last: doc += self._get_jobref_rep('abc4', 'EXECUTING', 'def4', '21', '2018-12-20T00:23:15.79') doc += self._get_jobref_rep('abc5', 'EXECUTING', 'def5', '21', '2018-12-20T00:23:15.79') doc += self._get_jobref_rep('abc6', 'EXECUTING', 'def6', '21', '2018-12-20T00:23:15.79') doc += '' return doc.encode('UTF-8') @pytest.fixture() def async_fixture(mocker): mock_server = MockAsyncTAPServer() yield from mock_server.use(mocker) @pytest.fixture() def tables(mocker): def callback_tables(request, context): return get_pkg_data_contents('data/tap/tables.xml') def callback_table1(request, context): return get_pkg_data_contents('data/tap/lazy-table1.xml') def callback_table2(request, context): return get_pkg_data_contents('data/tap/lazy-table2.xml') with ExitStack() as stack: matchers = { 'tables': stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/tap/tables', content=callback_tables )), 'table1': stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/tap/tables/test.table1', content=callback_table1 )), 'table2': stack.enter_context(mocker.register_uri( 'GET', 'http://example.com/tap/tables/test.table2', content=callback_table2 )), } yield matchers @pytest.fixture() def examples(mocker): def callback_examplesXHTML(request, context): return get_pkg_data_contents('data/tap/examples.htm') with mocker.register_uri( 'GET', 'http://example.com/tap/examples', content=callback_examplesXHTML ) as matcher: yield matcher @pytest.fixture() def capabilities(mocker): def callback(request, context): return get_pkg_data_contents('data/tap/capabilities.xml') with mocker.register_uri( 'GET', 'http://example.com/tap/capabilities', content=callback ) as matcher: yield matcher def test_escape(): query = 'SELECT * FROM ivoa.obscore WHERE dataproduct_type = {}' query = query.format(escape("'image'")) assert query == ( "SELECT * FROM ivoa.obscore WHERE dataproduct_type = ''image''") @pytest.mark.usefixtures('sync_fixture') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_search(): results = search('http://example.com/tap', "SELECT * FROM ivoa.obscore") _test_image_results(results) class TestTAPService: def test_init(self): service = TAPService('http://example.com/tap') assert service.baseurl == 'http://example.com/tap' def _test_tables(self, table1, table2): assert table1.description == 'Lazy Test Table 1' assert table1.title == 'Test table 1' assert table2.description == 'Lazy Test Table 2' assert table2.title == 'Test table 2' @pytest.mark.usefixtures('tables') def test_tables(self): service = TAPService('http://example.com/tap') tables = service.tables assert list(tables.keys()) == ['test.table1', 'test.table2'] table1, table2 = list(tables) self._test_tables(table1, table2) def _test_examples(self, exampleXHTML): assert "SELECT * FROM rosmaster" in exampleXHTML[0]['QUERY'] @pytest.mark.usefixtures('examples') def test_examples(self): service = TAPService('http://example.com/tap') examples = service.examples self._test_examples(examples) @pytest.mark.usefixtures('capabilities') def test_maxrec(self): service = TAPService('http://example.com/tap') assert service.maxrec == 20000 @pytest.mark.usefixtures('capabilities') def test_hardlimit(self): service = TAPService('http://example.com/tap') assert service.hardlimit == 10000000 @pytest.mark.usefixtures('capabilities') def test_upload_methods(self): service = TAPService('http://example.com/tap') upload_methods = service.upload_methods assert upload_methods[0].ivo_id == ( 'ivo://ivoa.net/std/TAPRegExt#upload-https') assert upload_methods[1].ivo_id == ( 'ivo://ivoa.net/std/TAPRegExt#upload-ftp') assert upload_methods[2].ivo_id == ( 'ivo://ivoa.net/std/TAPRegExt#upload-inline') assert upload_methods[3].ivo_id == ( 'ivo://ivoa.net/std/TAPRegExt#upload-http') @pytest.mark.usefixtures('sync_fixture') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_run_sync(self): service = TAPService('http://example.com/tap') results = service.run_sync("SELECT * FROM ivoa.obscore") _test_image_results(results) @pytest.mark.usefixtures('sync_fixture') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_search(self): service = TAPService('http://example.com/tap') results = service.search("SELECT * FROM ivoa.obscore") _test_image_results(results) @pytest.mark.usefixtures('async_fixture') @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W27") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W48") @pytest.mark.filterwarnings("ignore::astropy.io.votable.exceptions.W06") def test_run_async(self): service = TAPService('http://example.com/tap') results = service.run_async("SELECT * FROM ivoa.obscore") _test_image_results(results) @pytest.mark.usefixtures('async_fixture') def test_submit_job(self): service = TAPService('http://example.com/tap') job = service.submit_job( 'http://example.com/tap', "SELECT * FROM ivoa.obscore") assert job.url == 'http://example.com/tap/async/' + job.job_id assert job.phase == 'PENDING' assert job.execution_duration == TimeDelta(3600, format='sec') assert isinstance(job.destruction, Time) assert isinstance(job.quote, Time) job.run() job.wait() job.delete() @pytest.mark.usefixtures('async_fixture') def test_modify_job(self): service = TAPService('http://example.com/tap') job = service.submit_job( "SELECT * FROM ivoa.obscore", uploads={ 'one': 'http://example.com/uploads/one' }) job.query = "SELECT TOP 42 * FROM ivoa.obsCore" job.upload(two='http://example.com/uploads/two') for parameter in job._job.parameters: if parameter.id_ == 'query': assert parameter.content == 'SELECT TOP 42 * FROM ivoa.obsCore' break elif parameter.id_ == 'upload': assert ( 'one=http://example.com/uploads/one' in parameter.content) assert ( 'two=http://example.com/uploads/two' in parameter.content) @pytest.mark.usefixtures('async_fixture') def test_get_job(self): service = TAPService('http://example.com/tap') job = service.get_job('111') assert job.jobid == '111' assert job.phase == 'EXECUTING' assert job.ownerid == '222' @pytest.mark.usefixtures('async_fixture') def test_get_job_list(self): service = TAPService('http://example.com/tap') # server returns: # - 3 jobs for last atribute # - 2 jobs for phase attribute # - 1 job for after attribute # Tests consists in counting the cumulative number of jobs as per # above rules after = datetime.datetime.now() assert len(service.get_job_list()) == 0 assert len(service.get_job_list(last=3)) == 3 assert len(service.get_job_list(after='2018-04-25T17:46:01Z')) == 1 assert len(service.get_job_list(phases=['EXECUTING'])) == 2 assert len(service.get_job_list(after=after, phases=['EXECUTING'])) == 3 assert len(service.get_job_list(after='2018-04-25T17:46:01.123Z', last=3)) == 4 assert len(service.get_job_list(phases=['EXECUTING'], last=3)) == 5 assert len(service.get_job_list(phases=['EXECUTING'], last=3, after=datetime.datetime.now())) == 6 pyvo-1.2.1/pyvo/dal/vosi.py000066400000000000000000000133411416757633600156230ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ VOSI classes and mixins """ from itertools import chain import requests from astropy.utils.decorators import lazyproperty from .exceptions import DALServiceError from ..io import vosi from ..utils.url import url_sibling from ..utils.decorators import stream_decode_content, response_decode_content from ..utils.http import use_session __all__ = [ 'AvailabilityMixin', 'CapabilityMixin', 'VOSITables'] class EndpointMixin(): def _get_endpoint(self, endpoint): # finds the endpoint relative to the base url or its parent # and returns its content in raw format if not endpoint: raise AttributeError('endpoint required') ep_urls = [ '{baseurl}/{endpoint}'.format(baseurl=self.baseurl, endpoint=endpoint), url_sibling(self.baseurl, endpoint) ] for ep_url in ep_urls: try: response = self._session.get(ep_url, stream=True) response.raise_for_status() break except requests.RequestException: continue else: raise DALServiceError( "No working {endpoint} endpoint provided".format( endpoint=endpoint)) return response.raw class AvailabilityMixin(EndpointMixin): """ Mixing for VOSI availability """ @stream_decode_content def _availability(self): """ Service Availability as a :py:class:`~pyvo.io.vosi.availability.Availability` object """ return self._get_endpoint('availability') @lazyproperty def availability(self): return vosi.parse_availability(self._availability().read) @property def available(self): """ True if the service is available, False otherwise """ return self.availability.available @property def up_since(self): """ datetime the service was started """ return self.availability.upsince class CapabilityMixin(EndpointMixin): """ Mixing for VOSI capability """ @stream_decode_content def _capabilities(self): """ Returns capabilities as a py:class:`~pyvo.io.vosi.availability.Availability` object """ return self._get_endpoint('capabilities') @lazyproperty def capabilities(self): return vosi.parse_capabilities(self._capabilities().read) class TablesMixin(CapabilityMixin): """ Mixin for VOSI tables """ @stream_decode_content def _tables(self): try: interfaces = next( _ for _ in self.capabilities if _.standardid.startswith( 'ivo://ivoa.net/std/VOSI#tables') ).interfaces accessurls = chain.from_iterable(_.accessurls for _ in interfaces) tables_urls = (_.value for _ in accessurls) except StopIteration: tables_urls = [ '{}/tables'.format(self.baseurl), url_sibling(self.baseurl, 'tables') ] for tables_url in tables_urls: try: response = self._session.get(tables_url, stream=True) response.raise_for_status() break except requests.RequestException: continue else: raise DALServiceError("No working tables endpoint provided") return response.raw @lazyproperty def tables(self): return VOSITables(vosi.parse_tables(self._tables().read)) class VOSITables: """ This class encapsulates access to the VOSITables using a given Endpoint. Access to table names is like accessing dictionary keys. using iterator syntax or `keys()` """ def __init__(self, vosi_tables, endpoint_url, session=None): self._vosi_tables = vosi_tables self._endpoint_url = endpoint_url self._cache = {} self._session = use_session(session) def __len__(self): return self._vosi_tables.ntables def __getitem__(self, key): return self._get_table(key) def __iter__(self): for tablename in self.keys(): yield self._get_table(tablename) def _get_table(self, name): if name in self._cache: return self._cache[name] table = self._vosi_tables.get_table_by_name(name) if not table.columns and not table.foreignkeys: tables_url = '{}/{}'.format(self._endpoint_url, name) response = self._get_table_file(tables_url) try: response.raise_for_status() except requests.RequestException as ex: raise DALServiceError.from_except(ex, tables_url) table = vosi.parse_tables(response.raw.read).get_first_table() self._cache[name] = table return table @response_decode_content def _get_table_file(self, tables_url): return self._session.get(tables_url, stream=True) def keys(self): """ Iterates over the keys (table names). """ for table in self._vosi_tables.iter_tables(): yield table.name def values(self): """ Iterates over the values (tables). Gathers missing values from endpoint if necessary. """ for name in self.keys(): yield self._get_table(name) def items(self): """ Iterates over keys and values (table names and tables). Gathers missing values from endpoint if necessary. """ for name in self.keys(): yield (name, self._get_table(name)) def describe(self): for table in self: table.describe() pyvo-1.2.1/pyvo/dam/000077500000000000000000000000001416757633600142705ustar00rootroot00000000000000pyvo-1.2.1/pyvo/dam/__init__.py000066400000000000000000000001661416757633600164040ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from .obscore import * __all__ = ["ObsCoreMetadata"] pyvo-1.2.1/pyvo/dam/obscore.py000066400000000000000000000056001416757633600162770ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ A module for representing data in ObsCore format """ __all__ = ['ObsCoreMetadata', 'POLARIZATION_STATES', 'CALIBRATION_LEVELS'] # to be moved to ObsCore POLARIZATION_STATES = ['I', 'Q', 'U', 'V', 'RR', 'LL', 'RL', 'LR', 'XX', 'YY', 'XY', 'YX', 'POLI', 'POLA'] CALIBRATION_LEVELS = [0, 1, 2, 3, 4] class ObsCoreMetadata(): """ Representation of an ObsCore observation TBD setters to do validation and unit check. """ def __init__(self): # OBSERVATION INFO self.dataproduct_type = None self.dataproduct_subtype = None self.calib_level = None # TARGET INFO self.target_name = None self.target_class = None # DATA DESCRIPTION self.obs_id = None self.obs_title = None self.obs_collection = None self.obs_create_date = None self.obs_creator_name = None self.obs_creator_did = None # CURATION INFORMATION self.obs_release_date = None self.obs_publisher_did = None self.publisher_id = None self.bib_reference = None self.data_rights = None # ACCESS INFORMATION self.access_url = None self.access_format = None self.access_estsize = None # SPATIAL CHARACTERISATION self.s_ra = None self.s_dec = None self.s_fov = None self.s_region = None self.s_resolution = None self.s_xel1 = None self.s_xel2 = None self.s_ucd = None self.s_unit = None self.s_resolution_min = None self.s_resolution_max = None self.s_calib_status = None self.s_stat_error = None self.s_pixel_scale = None # TIME CHARACTERISATION self.t_xel = None self.t_ref_pos = None self.t_min = None self.t_max = None self.t_exptime = None self.t_resolution = None self.t_calib_status = None self.t_stat_error = None # SPECTRAL CHARACTERISATION self.em_xel = None self.em_ucd = None self.em_unit = None self.em_calib_status = None self.em_min = None self.em_max = None self.em_res_power = None self.em_res_power_min = None self.em_res_power_max = None self.em_resolution = None self.em_stat_error = None # OBSERVABLE AXIS self.o_ucd = None self.o_unit = None self.o_calib_status = None self.o_stat_error = None # POLARIZATION CHARACTERISATION self.pol_xel = None self.pol_states = None # PROVENANCE self.instrument_name = None self.facility_name = None self.proposal_id = None pyvo-1.2.1/pyvo/io/000077500000000000000000000000001416757633600141365ustar00rootroot00000000000000pyvo-1.2.1/pyvo/io/__init__.py000066400000000000000000000001001416757633600162360ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst pyvo-1.2.1/pyvo/io/uws/000077500000000000000000000000001416757633600147545ustar00rootroot00000000000000pyvo-1.2.1/pyvo/io/uws/__init__.py000066400000000000000000000002551416757633600170670ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst __all__ = ['parse_job', 'parse_job_list', 'JobFile', 'JobList'] from .endpoint import * from .tree import * pyvo-1.2.1/pyvo/io/uws/endpoint.py000066400000000000000000000102021416757633600171410ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This file contains a contains the high-level functions to read the various VOSI Endpoints. """ from astropy.utils.xml.writer import XMLWriter from astropy.io.votable.util import convert_to_writable_filelike from ...utils.xml.elements import xmlattribute, parse_for_object from .tree import JobSummary, JobList __all__ = ["parse_job", "parse_job_list", "JobFile"] def parse_job_list( source, pedantic=None, filename=None, _debug_python_based_parser=False ): """ Parses a job xml file (or file-like object), and returns a `~pyvo.io.uws.tree.JobList` object. Parameters ---------- source : str or readable file-like object Path or file object containing a tableset xml file. pedantic : bool, optional When `True`, raise an error when the file violates the spec, otherwise issue a warning. Warnings may be controlled using the standard Python mechanisms. See the `warnings` module in the Python standard library for more information. Defaults to False. filename : str, optional A filename, URL or other identifier to use in error messages. If *filename* is None and *source* is a string (i.e. a path), then *source* will be used as a filename for error messages. Therefore, *filename* is only required when source is a file-like object. Returns ------- `~pyvo.io.uws.tree.JobList` object See also -------- pyvo.io.vosi.exceptions : The exceptions this function may raise. """ return parse_for_object(source, JobList, pedantic, filename, _debug_python_based_parser) def parse_job( source, pedantic=None, filename=None, _debug_python_based_parser=False ): """ Parses a job xml file (or file-like object), and returns a `~pyvo.io.uws.tree.JobFile` object. Parameters ---------- source : str or readable file-like object Path or file object containing a tableset xml file. pedantic : bool, optional When `True`, raise an error when the file violates the spec, otherwise issue a warning. Warnings may be controlled using the standard Python mechanisms. See the `warnings` module in the Python standard library for more information. Defaults to False. filename : str, optional A filename, URL or other identifier to use in error messages. If *filename* is None and *source* is a string (i.e. a path), then *source* will be used as a filename for error messages. Therefore, *filename* is only required when source is a file-like object. Returns ------- `~pyvo.io.vosi.endpoint.JobFile` object See also -------- pyvo.io.vosi.exceptions : The exceptions this function may raise. """ return parse_for_object(source, JobFile, pedantic, filename, _debug_python_based_parser) class JobFile(JobSummary): """ availability element: represents an entire file. The keyword arguments correspond to setting members of the same name, documented below. """ def __init__(self, config=None, pos=None, **kwargs): super().__init__(config=config, pos=pos, **kwargs) self._version = None @xmlattribute def version(self): return self._version @version.setter def version(self, version): self._version = version def parse(self, iterator, config): for start, tag, data, pos in iterator: if start and tag == 'xml': pass elif start and tag == 'job': # version was not required in v1.0, so default to that. self._version = data.get('version', '1.0') break return super().parse(iterator, config) def to_xml(self, fd): with convert_to_writable_filelike(fd) as fd: w = XMLWriter(fd) xml_header = ( '\n' '\n' ) w.write(xml_header) super().to_xml(w) pyvo-1.2.1/pyvo/io/uws/tests/000077500000000000000000000000001416757633600161165ustar00rootroot00000000000000pyvo-1.2.1/pyvo/io/uws/tests/__init__.py000066400000000000000000000000001416757633600202150ustar00rootroot00000000000000pyvo-1.2.1/pyvo/io/uws/tests/data/000077500000000000000000000000001416757633600170275ustar00rootroot00000000000000pyvo-1.2.1/pyvo/io/uws/tests/data/job-error.xml000066400000000000000000000024711416757633600214560ustar00rootroot00000000000000 1337 ERROR 2018-01-01T02:00:00Z 2018-01-01T00:00:00Z 2018-01-01T00:05:00Z 2018-01-01T02:00:00Z 7200 2018-02-01T00:00:00Z ADQL SELECT 'test' doQuery We have problem pyvo-1.2.1/pyvo/io/uws/tests/data/job-implicit-v1.0.xml000066400000000000000000000015301416757633600226140ustar00rootroot00000000000000 1576511540079_32840 COMPLETED 2019-12-16T10:52:20 2019-12-17T10:52:20 600 2019-12-17T10:52:20 ADQL-2.0 tap doQuery SELECT ra, dec FROM table pyvo-1.2.1/pyvo/io/uws/tests/data/job.xml000066400000000000000000000024561416757633600203320ustar00rootroot00000000000000 1337 COMPLETED 2018-01-01T02:00:00Z 2018-01-01T00:00:00Z 2018-01-01T00:05:00Z 2018-01-01T02:00:00Z 7200 2018-02-01T00:00:00Z ADQL SELECT 'test' doQuery pyvo-1.2.1/pyvo/io/uws/tests/setup_package.py000066400000000000000000000003071416757633600213030ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst import os def get_package_data(): paths = [ os.path.join('data', '*.xml'), ] return {'pyvo.io.uws.tests': paths} pyvo-1.2.1/pyvo/io/uws/tests/test_job.py000066400000000000000000000015301416757633600203000ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.io.vosi """ import pyvo.io.uws as uws from astropy.utils.data import get_pkg_data_filename class TestJob: def test_job(self): job = uws.parse_job(get_pkg_data_filename( "data/job.xml")) assert job.jobid == '1337' assert job.version == '1.1' job = uws.parse_job(get_pkg_data_filename( "data/job-implicit-v1.0.xml")) assert job.version == '1.0' def test_error_job(self): job = uws.parse_job(get_pkg_data_filename( "data/job-error.xml")) assert job.jobid == '1337' assert job.version == '1.1' assert not job.errorsummary.has_detail assert job.errorsummary.type_ == 'fatal' assert job.message == 'We have problem' pyvo-1.2.1/pyvo/io/uws/tree.py000066400000000000000000000272651416757633600163010ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This file contains xml element classes as defined in the VOResource standard. """ from functools import partial from astropy.utils.collections import HomogeneousList from astropy.time import Time, TimeDelta from ...utils.xml.elements import ( xmlattribute, xmlelement, Element, ContentMixin) uwselement = partial(xmlelement, ns='uws') def XSInDate(val): if not val: return None try: return Time(val, format='iso') except ValueError: pass try: return Time(val, format='isot') except ValueError: pass raise ValueError('Cannot parse datetime {}'.format(val)) InDuration = partial(TimeDelta, format='sec') XSOutDate = partial(Time, out_subfmt='date') __all__ = [ 'UWSElement', 'Reference', 'JobSummary', 'Parameters', 'Parameter', 'Results', 'Result'] def _convert_boolean(value, default=None): return { 'false': False, '0': False, 'true': True, '1': True }.get(value, default) class UWSElement(Element): def __init__(self, config=None, pos=None, _name='', _ns='uws', **kwargs): super().__init__(config, pos, _name, 'uws', **kwargs) class Reference(UWSElement): """standard xlink references""" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.type = kwargs.get('xlink:type') self.href = kwargs.get('xlink:href') @xmlattribute(name='xlink:type') def type(self): """the type of the result""" return self._type @type.setter def type(self, type_): self._type = type_ @xmlattribute(name='xlink:href') def href(self): """the url the result can be retrieved""" return self._href @href.setter def href(self, href): self._href = href class JobSummary(Element): def __init__(self, config=None, pos=None, _name='job', **kwargs): super().__init__(config, pos, _name, **kwargs) self.jobid = kwargs.get('id') self._runid = None self._ownerid = None self._phase = None self._quote = None self._creationtime = None self._starttime = None self._endtime = None self._executionduration = None self._destruction = None self._parameters = Parameters() self._results = Results() self._errorsummary = None self._message = None @uwselement(name='jobId', plain=True) def jobid(self): """ The identifier for the job """ return self._jobid @jobid.setter def jobid(self, jobid): self._jobid = jobid @uwselement(name='runId', plain=True) def runid(self): """client supplied identifier""" return self._runid @runid.setter def runid(self, runid): self._runid = runid @uwselement(name='ownerId', plain=True) def ownerid(self): """the owner (creator) of the job""" return self._ownerid @ownerid.setter def ownerid(self, ownerid): self._ownerid = ownerid @uwselement(plain=True) def phase(self): """the execution phase""" return self._phase @phase.setter def phase(self, phase): self._phase = phase @uwselement(plain=True) def quote(self): """estimated completion time""" return self._quote @quote.setter def quote(self, quote): self._quote = XSInDate(quote) @quote.formatter def quote(self): try: return str(XSOutDate(self._quote)) except ValueError: return None @uwselement(name='creationTime', plain=True) def creationtime(self): """The instant at which the job was created.""" return self._creationtime @creationtime.setter def creationtime(self, creationtime): self._creationtime = XSInDate(creationtime) @creationtime.formatter def creationtime(self): try: return str(XSOutDate(self._creationtime)) except ValueError: return None @uwselement(name='startTime', plain=True) def starttime(self): """The instant at which the job started execution.""" return self._starttime @starttime.setter def starttime(self, starttime): self._starttime = XSInDate(starttime) @starttime.formatter def starttime(self): try: return str(XSOutDate(self._starttime)) except ValueError: return None @uwselement(name='endTime', plain=True) def endtime(self): """The instant at which the job finished execution""" return self._endtime @endtime.setter def endtime(self, endtime): self._endtime = XSInDate(endtime) @endtime.formatter def endtime(self): try: return str(XSOutDate(self._endtime)) except ValueError: return None @uwselement(name='executionDuration', plain=True) def executionduration(self): """ The duration (in seconds) for which the job should be allowed to run - a value of 0 is intended to mean unlimited """ return self._executionduration @executionduration.setter def executionduration(self, executionduration): if not isinstance(executionduration, TimeDelta): executionduration = InDuration(float(executionduration)) self._executionduration = executionduration @executionduration.formatter def executionduration(self): if self.executionduration: return str(int(self._executionduration.value)) @uwselement(plain=True) def destruction(self): """The time at which the whole job will be destroyed""" return self._destruction @destruction.setter def destruction(self, destruction): self._destruction = XSInDate(destruction) @destruction.formatter def destruction(self): try: return str(XSOutDate(self._destruction)) except ValueError: return None @uwselement def parameters(self): """The parameters to the job""" return self._parameters @parameters.adder def parameters(self, iterator, tag, data, config, pos): parameters = Parameters(config, pos, 'parameters', **data) parameters.parse(iterator, config) self._parameters = parameters @uwselement def results(self): """The results for the job""" return self._results @results.adder def results(self, iterator, tag, data, config, pos): results = Results(config, pos, 'results', **data) results.parse(iterator, config) self._results = results @uwselement(name='errorSummary', plain=True) def errorsummary(self): """The error summary of the job.""" return self._errorsummary @errorsummary.adder def errorsummary(self, iterator, tag, data, config, pos): self._errorsummary = ErrorSummary(config, pos, 'errorSummary', **data) @uwselement(plain=True) def message(self): """the error message""" return self._message @message.setter def message(self, message): self._message = message class JobList(UWSElement, HomogeneousList): def __init__(self, config=None, pos=None, _name='jobs', **kwargs): HomogeneousList.__init__(self, JobSummary) UWSElement.__init__(self, config, pos, _name, **kwargs) @uwselement(name='jobref') def jobs(self): return self @jobs.adder def jobs(self, iterator, tag, data, config, pos): job = JobSummary(config, pos, 'jobref', **data) job.parse(iterator, config) self.append(job) class Parameters(UWSElement, HomogeneousList): """ Parameters element of a job """ def __init__(self, config=None, pos=None, _name='parameters', **kwargs): """ """ # Note: Above is a load-bearing empty comment. # Do not remove, or else the Sphinx build may fail (see PR #193). HomogeneousList.__init__(self, Parameter) UWSElement.__init__(self, config, pos, _name, **kwargs) @uwselement(name='parameter') def parameters(self): return self @parameters.adder def parameters(self, iterator, tag, data, config, pos): parameter = Parameter(config, pos, 'parameter', **data) parameter.parse(iterator, config) self.append(parameter) class Parameter(ContentMixin, UWSElement): def __init__(self, config=None, pos=None, _name='parameter', **kwargs): super().__init__(config, pos, _name, **kwargs) self.byreference = _convert_boolean(kwargs.get('byReference')) self.id_ = kwargs.get('id') @xmlattribute def byreference(self): """ if this attribute is true then the content of the parameter represents a URL to retrieve the actual parameter value. """ return self._byreference @byreference.setter def byreference(self, byreference): self._byreference = byreference @xmlattribute(name='id') def id_(self): """the identifier for the parameter""" return self._id @id_.setter def id_(self, id_): self._id = id_ class Results(UWSElement, HomogeneousList): def __init__(self, config=None, pos=None, _name='results', **kwargs): HomogeneousList.__init__(self, Result) UWSElement.__init__(self, config, pos, _name, **kwargs) @uwselement(name='result') def results(self): return self @results.adder def results(self, iterator, tag, data, config, pos): result = Result(config, pos, 'result', **data) result.parse(iterator, config) self.append(result) class Result(Reference, UWSElement): """A reference to a UWS result.""" def __init__(self, config=None, pos=None, _name='result', **kwargs): super().__init__(config, pos, _name, **kwargs) self.id_ = kwargs.get('id') self.size = int(kwargs.get('size') or 0) self.mimetype = kwargs.get('mime-type') @xmlattribute(name='id') def id_(self): """the identifier for the result""" return self._id @id_.setter def id_(self, id_): self._id = id_ @xmlattribute def size(self): """the size of the result""" return self._size @size.setter def size(self, size): self._size = size @xmlattribute def mimetype(self): """the mimetype of the result""" return self._mimetype @mimetype.setter def mimetype(self, mimetype): self._mimetype = mimetype class ErrorSummary(UWSElement): """A UWS Error summary.""" def __init__(self, config=None, pos=None, _name='errorSummary', **kwargs): super().__init__(config, pos, _name, **kwargs) self.type_ = kwargs.get('type') self.has_detail = _convert_boolean(kwargs.get('hasDetail')) self.message = None @xmlattribute(name='type') def type_(self): """the type of the error""" return self._type @type_.setter def type_(self, type_): self._type = type_ @xmlattribute def has_detail(self): """whether error has details""" return self._has_detail @has_detail.setter def has_detail(self, has_detail): self._has_detail = has_detail @uwselement(name='message') def message(self): """The error message""" return self._message @message.setter def message(self, message): self._message = message class Message(ContentMixin, UWSElement): """The actual UWS Error message.""" def __init__(self, config=None, pos=None, _name='message', **kwargs): super().__init__(config, pos, _name, **kwargs) pyvo-1.2.1/pyvo/io/vosi/000077500000000000000000000000001416757633600151165ustar00rootroot00000000000000pyvo-1.2.1/pyvo/io/vosi/__init__.py000066400000000000000000000002131416757633600172230ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from .endpoint import parse_tables, parse_capabilities, parse_availability pyvo-1.2.1/pyvo/io/vosi/availability.py000066400000000000000000000034171416757633600201470ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from astropy.utils.collections import HomogeneousList from ...utils.xml.elements import xmlelement, Element from .exceptions import W32, W33, W34, W35 __all__ = ["Availability"] ###################################################################### # FACTORY FUNCTIONS def _convert_boolean(value, default=None): return { 'false': False, '0': False, 'true': True, '1': True }.get(value, default) ###################################################################### # ELEMENT CLASSES class Availability(Element): def __init__(self, config=None, pos=None, _name='availability', **kwargs): super().__init__(config, pos, _name, **kwargs) self._available = None self._upsince = None self._downat = None self._backat = None self._notes = HomogeneousList(str) @xmlelement(plain=True, multiple_exc=W32) def available(self): return self._available @available.setter def available(self, available): self._available = _convert_boolean(available) @xmlelement(name='upSince', plain=True, multiple_exc=W33) def upsince(self): return self._upsince @upsince.setter def upsince(self, upsince): self._upsince = upsince @xmlelement(name='downAt', plain=True, multiple_exc=W34) def downat(self): return self._downat @downat.setter def downat(self, downat): self._downat = downat @xmlelement(name='backAt', plain=True, multiple_exc=W35) def backat(self): return self._backat @backat.setter def backat(self, backat): self._backat = backat @xmlelement(name='note', plain=True) def notes(self): return self._notes pyvo-1.2.1/pyvo/io/vosi/endpoint.py000066400000000000000000000273161416757633600173210ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This file contains a contains the high-level functions to read the various VOSI Endpoints. """ from astropy.utils import minversion from astropy.utils.xml import iterparser from astropy.utils.collections import HomogeneousList from astropy.io.votable.exceptions import vo_raise, vo_warn from astropy.io.votable.util import version_compare from ...utils.xml.elements import xmlattribute, xmlelement, Element from . import voresource as vr from . import vodataservice as vs from . import availability as av from .exceptions import W15, W16, E07, E10 __all__ = [ "parse_tables", "parse_capabilities", "parse_availability", "TablesFile", "CapabilitiesFile", "AvailabilityFile"] ASTROPY_GT_4 = minversion('astropy', '4.0') def _pedantic_settings(pedantic): """ Controls the pedantic parser settings. Based on the bool passed in to pedantic, create a config to be passed to astropy parsing to raise exceptions or ignore them on pedantic errors. Parameters ---------- pedantic : bool When `True`, raise an error when the file violates the spec, otherwise issue a warning. Warnings may be controlled using the standard Python mechanisms. See the `warnings` module in the Python standard library for more information. Returns ------- A dict containing configuration settings for astropy, which for version 4.0 and after use 'verify', and previously use 'pedantic'. """ if ASTROPY_GT_4: if pedantic: return {'verify': 'exception'} else: return {'verify': 'warn'} else: return {'pedantic': pedantic} def parse_tables(source, pedantic=None, filename=None, _debug_python_based_parser=False): """ Parses a tableset xml file (or file-like object), and returns a `~pyvo.io.vosi.endpoint.TablesetFile` object. Parameters ---------- source : str or readable file-like object Path or file object containing a tableset xml file. pedantic : bool, optional When `True`, raise an error when the file violates the spec, otherwise issue a warning. Warnings may be controlled using the standard Python mechanisms. See the `warnings` module in the Python standard library for more information. Defaults to False. filename : str, optional A filename, URL or other identifier to use in error messages. If *filename* is None and *source* is a string (i.e. a path), then *source* will be used as a filename for error messages. Therefore, *filename* is only required when source is a file-like object. Returns ------- votable : `~pyvo.io.vosi.endpoint.TableSetFile` object See also -------- pyvo.io.vosi.exceptions : The exceptions this function may raise. """ config = _pedantic_settings(pedantic) if filename is None and isinstance(source, str): config['filename'] = source else: config['filename'] = filename with iterparser.get_xml_iterator( source, _debug_python_based_parser=_debug_python_based_parser ) as iterator: return TablesFile( config=config, pos=(1, 1)).parse(iterator, config) def parse_capabilities(source, pedantic=None, filename=None, _debug_python_based_parser=False): """ Parses a capabilities xml file (or file-like object), and returns a `~pyvo.io.vosi.endpoint.CapabilitiesFile` object. Parameters ---------- source : str or readable file-like object Path or file object containing a capabilities xml file. pedantic : bool, optional When `True`, raise an error when the file violates the spec, otherwise issue a warning. Warnings may be controlled using the standard Python mechanisms. See the `warnings` module in the Python standard library for more information. Defaults to False. filename : str, optional A filename, URL or other identifier to use in error messages. If *filename* is None and *source* is a string (i.e. a path), then *source* will be used as a filename for error messages. Therefore, *filename* is only required when source is a file-like object. Returns ------- votable : `~pyvo.io.vosi.endpoint.CapabilitiesFile` object See also -------- pyvo.io.vosi.exceptions : The exceptions this function may raise. """ config = _pedantic_settings(pedantic) if filename is None and isinstance(source, str): config['filename'] = source else: config['filename'] = filename with iterparser.get_xml_iterator( source, _debug_python_based_parser=_debug_python_based_parser ) as iterator: return CapabilitiesFile( config=config, pos=(1, 1)).parse(iterator, config) def parse_availability(source, pedantic=None, filename=None, _debug_python_based_parser=False): """ Parses a availability xml file (or file-like object), and returns a `~pyvo.io.vosi.endpoint.AvailabilityFile` object. Parameters ---------- source : str or readable file-like object Path or file object containing a availability xml file. pedantic : bool, optional When `True`, raise an error when the file violates the spec, otherwise issue a warning. Warnings may be controlled using the standard Python mechanisms. See the `warnings` module in the Python standard library for more information. Defaults to False. filename : str, optional A filename, URL or other identifier to use in error messages. If *filename* is None and *source* is a string (i.e. a path), then *source* will be used as a filename for error messages. Therefore, *filename* is only required when source is a file-like object. Returns ------- votable : `~pyvo.io.vosi.endpoint.AvailabilityFile` object See also -------- pyvo.io.vosi.exceptions : The exceptions this function may raise. """ config = _pedantic_settings(pedantic) if filename is None and isinstance(source, str): config['filename'] = source else: config['filename'] = filename with iterparser.get_xml_iterator( source, _debug_python_based_parser=_debug_python_based_parser ) as iterator: return AvailabilityFile( config=config, pos=(1, 1)).parse(iterator, config) class TablesFile(Element): """ TABLESET/TABLE element: represents an entire file. The keyword arguments correspond to setting members of the same name, documented below. """ def __init__(self, config=None, pos=None, version="1.1"): Element.__init__(self, config, pos) self._tableset = None self._table = None self._ntables = None version = str(version) if version not in ("1.0", "1.1"): raise ValueError("'version' should be one of '1.0' or '1.1'") config['version'] = version self._version = version def __repr__(self): if self.table: return repr(self.table) elif self.tableset: return repr(self.tableset) else: return super().__repr__() @xmlattribute def version(self): """ The version of the TableSet specification that the file uses. """ return self._version @version.setter def version(self, version): version = str(version) if version not in ('1.0', '1.1'): raise ValueError( "pyvo.io.vosi.tables only supports VOSI versions 1.0 and 1.1") self._version = version @xmlelement def tableset(self): """ The tableset. Must be a `TableSet` object. """ return self._tableset @tableset.setter def tableset(self, tableset): self._tableset = tableset @tableset.adder def tableset(self, iterator, tag, data, config, pos): tableset = vs.TableSet(config, pos, 'tableset', **data) tableset.parse(iterator, config) self._tableset = tableset @xmlelement(cls=vs.Table) def table(self): """ The `Table` root element if present. """ return self._table @table.setter def table(self, table): self._table = table @property def ntables(self): """ The number of tables in the file. """ return self._ntables def parse(self, iterator, config): super().parse(iterator, config) if self.tableset is None and self.table is None: vo_raise(E07, config=config, pos=self._pos) self._version = config['version'] if config['version'] not in ('1.0', '1.1'): vo_warn(W15, config=config, pos=self._pos) if self.table: if version_compare(config['version'], '1.1') < 0: vo_warn(W16, config=config, pos=self._pos) self._ntables = 1 else: self._ntables = sum( len(schema.tables) for schema in self.tableset.schemas) return self def iter_tables(self): """ Iterates over all tables in the VOSITables file in a "flat" way, ignoring the schemas. """ if self.table: yield self.table else: for schema in self.tableset.schemas: yield from schema.tables def get_first_table(self): """ When you parse table metadata for a single table here is only one table in the file, and that's all you need. This method returns that first table. """ for table in self.iter_tables(): return table raise IndexError("No table found in VOSITables file.") def get_table_by_name(self, name): """ Looks up a table element by the given name. """ for table in self.iter_tables(): if table.name == name: return table raise KeyError("No table with name {} found".format(name)) class CapabilitiesFile(Element, HomogeneousList): """ capabilities element: represents an entire file. The keyword arguments correspond to setting members of the same name, documented below. """ def __init__(self, config=None, pos=None, _name='capabilities', **kwargs): Element.__init__(self, config=config, pos=pos, **kwargs) HomogeneousList.__init__(self, vr.Capability) @xmlelement(name='capability') def capabilities(self): """List of `~pyvo.io.vosi.voresource.Capability` objects""" return self @capabilities.adder def capabilities(self, iterator, tag, data, config, pos): capability = vr.Capability(config, pos, 'capability', **data) capability.parse(iterator, config) self.append(capability) def parse(self, iterator, config): for start, tag, data, pos in iterator: if start: if tag == "xml": pass elif tag == "capabilities": break else: vo_raise(E10, config=config, pos=pos) super().parse(iterator, config) return self class AvailabilityFile(av.Availability): """ availability element: represents an entire file. The keyword arguments correspond to setting members of the same name, documented below. """ def parse(self, iterator, config): for start, tag, data, pos in iterator: if start: if tag == 'xml': pass elif tag == 'availability': break super().parse(iterator, config) return self pyvo-1.2.1/pyvo/io/vosi/exceptions.py000066400000000000000000000336271416757633600176640ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst # -*- coding: utf-8 -*- """ .. _warnings: Warnings -------- .. note:: Most of the following warnings indicate violations of the VOSI specification. They should be reported to the authors of the tools that produced the VOSI file. To control the warnings emitted, use the standard Python :mod:`warnings` module. Most of these are of the type `VOSISpecWarning`. {warnings} .. _exceptions: Exceptions ---------- .. note:: This is a list of many of the fatal exceptions emitted by vosi.endpoint when the file does not conform to spec. Other exceptions may be raised due to unforeseen cases or bugs in vosi.endpoint itself. {exceptions} """ from astropy.utils.exceptions import AstropyWarning from ...utils.xml.exceptions import XMLWarning __all__ = ["VOSIWarning"] __all__ += ["W{:0>2}".format(i) for i in range(1, 36)] __all__ += ["E{:0>2}".format(i) for i in range(1, 10)] class VOSIWarning(AstropyWarning): """ The base class of all VOSI warnings and exceptions. Handles the formatting of the message with a warning or exception code, filename, line and column number. """ class W01(VOSIWarning, XMLWarning): """ The attribute must be a valid URI as defined in `RFC 2396 `_. """ message_template = "'{}' is not a valid URI" default_args = ('x',) class W02(VOSIWarning, XMLWarning): """ The attribute must be any of the accepted types in the VOSI spec. """ message_template = ( "'{}' is not a valid datatype according to the VOSI spec") default_args = ('x',) class W03(VOSIWarning, XMLWarning): """ The attribute must be an positive integer. """ message_template = "Size must be positive" class W04(VOSIWarning, XMLWarning): """ The attribute must have one of the recognized values 'indexed', 'primary', 'nullable'. """ message_template = "'{}' is not a recognized flag" default_args = ('x',) class W05(VOSIWarning, XMLWarning): """ A ``name`` element can only appear once within its parent element. According to the schema, it may only occur once (`1.1 `__, """ message_template = "{} element contains more than one name element" default_args = ('x',) class W06(VOSIWarning, XMLWarning): """ A ``description`` element can only appear once within its parent element. According to the schema, it may only occur once (`1.1 `__, """ message_template = "{} element contains more than one description element" default_args = ('x',) class W07(VOSIWarning, XMLWarning): """ A ``unit`` element can only appear once within its parent element. According to the schema, it may only occur once (`1.1 `__, """ message_template = "{} element contains more than one unit element" default_args = ('x',) class W08(VOSIWarning, XMLWarning): """ A ``ucd`` element can only appear once within its parent element. According to the schema, it may only occur once (`1.1 `__, """ message_template = "{} element contains more than one ucd element" default_args = ('x',) class W09(VOSIWarning, XMLWarning): """ A ``utype`` element can only appear once within its parent element. According to the schema, it may only occur once (`1.1 `__, """ message_template = "{} element contains more than one utype element" default_args = ('x',) class W10(VOSIWarning, XMLWarning): """ A ``fromColumn`` element can only appear once within its parent element. According to the schema, it may only occur once (`1.1 `__, """ message_template = "{} element contains more than one fromColumn element" default_args = ('x',) class W11(VOSIWarning, XMLWarning): """ A ``targetColumn`` element can only appear once within its parent element. According to the schema, it may only occur once (`1.1 `__, """ message_template = "{} element contains more than one targetColumn element" default_args = ('x',) class W12(VOSIWarning, XMLWarning): """ A ``targetTable`` element can only appear once within its parent element. According to the schema, it may only occur once (`1.1 `__, """ message_template = "{} element contains more than one targetTable element" default_args = ('x',) class W13(VOSIWarning, XMLWarning): """ A ``title`` element can only appear once within its parent element. According to the schema, it may only occur once (`1.1 `__, """ message_template = "{} element contains more than one title element" default_args = ('x',) class W14(VOSIWarning, XMLWarning): """ The tableset element must contain at least one schema element. """ message_template = ( "tableset element must contain at least one schema element.") class W15(VOSIWarning, XMLWarning): """ Unknown issues may arise using ``dal`` with VOSITables files from a version other than 1.0 or 1.1 """ message_template = ( 'pyvo.dal is designed for VOSITables version 1.0, and 1.1, but ' + 'this file is {}') default_args = ('x',) class W16(VOSIWarning, XMLWarning): """ The table element is not a valid root element in VOSI before version 1.1 """ message_template = ( "The element table is not a valid root element in VOSI below v1.1") class W17(VOSIWarning, XMLWarning): """ A ``queryType`` element can only appear once within the ParamHTTP element. According to the schema, it may only occur once (`1.1 `__, """ message_template = ( "ParamHTTP element contains more than one ParamHTTP element") class W18(VOSIWarning, XMLWarning): """ The QueryType element must not occur more than two times. """ message_template = ( "The QueryType element must not occur more than two times.") class W19(VOSIWarning, XMLWarning): """ TAP Capabilities must not have an ivo-id other than ivo://ivoa.net/std/TAP """ message_template = ( "TAP Capabilities must not have an ivo-id other than " "ivo://ivoa.net/std/TAP" ) class W20(VOSIWarning, XMLWarning): """ TAP Capabilties must have at least one `language` element. """ message_template = ( "TAP Capabilties must have at least one `language` element.") class W21(VOSIWarning, XMLWarning): """ TAP Capabilties must have at least one outputFormat element. """ class W22(VOSIWarning, XMLWarning): """ The `retentionPeriod` element must not occur more than once. """ message_template = ( "The retentionPeriod element must not occur more than once") class W23(VOSIWarning, XMLWarning): """ The `executionDuration` element must not occur more than once. """ message_template = ( "The executionDuration element must not occur more than once") class W24(VOSIWarning, XMLWarning): """ The `outputLimit` element must not occur more than once. """ message_template = ( "The outputLimit element must not occur more than once") class W25(VOSIWarning, XMLWarning): """ The `uploadLimit` element must not occur more than once. """ message_template = ( "The uploadLimit element must not occur more than once") class W26(VOSIWarning, XMLWarning): """ The ivo-id attribute is mandatory. """ message_template = "The ivo-id attribute is mandatory" class W27(VOSIWarning, XMLWarning): """ The `form` element must not occur more than once. """ message_template = "The form element must not occur more than once" class W28(VOSIWarning, XMLWarning): """ The `mime` element must not occur more than once. """ message_template = "The mime element must not occur more than once" class W29(VOSIWarning, XMLWarning): """ The `default` element must not occur more than once. """ message_template = "The default element must not occur more than once" class W30(VOSIWarning, XMLWarning): """ The `hard` element must not occur more than once. """ message_template = "The hard element must not occur more than once" class W31(VOSIWarning, XMLWarning): """ The content of the `DataLimit` element must be byte or row """ message_template = ( "The content of the DataLimit element must be byte or row") class W32(VOSIWarning, XMLWarning): """ The `available` element must not occur more than once. """ message_template = "The available element must not occur more than once" class W33(VOSIWarning, XMLWarning): """ The `upSince` element must not occur more than once. """ message_template = "The upSince element must not occur more than once" class W34(VOSIWarning, XMLWarning): """ The `downAt` element must not occur more than once. """ message_template = "The downAt element must not occur more than once" class W35(VOSIWarning, XMLWarning): """ The `backAt` element must not occur more than once. """ message_template = "The backAt element must not occur more than once" class W36(VOSIWarning, XMLWarning): """ The `resultType` element must not occur more than once. """ message_template = "The resultType element must not occur more than once" class W37(VOSIWarning, XMLWarning): """ The `dataType` element must not occur more than once. """ message_template = "The dataType element must not occur more than once" class E01(VOSIWarning, XMLWarning, ValueError): r""" The attribute must be a valid arraysize according to the VOTable standard. From the VOTable 1.2 spec: A table cell can contain an array of a given primitive type, with a fixed or variable number of elements; the array may even be multidimensional. For instance, the position of a point in a 3D space can be defined by the following:: and each cell corresponding to that definition must contain exactly 3 numbers. An asterisk (\*) may be appended to indicate a variable number of elements in the array, as in:: where it is specified that each cell corresponding to that definition contains 0 to 100 integer numbers. The number may be omitted to specify an unbounded array (in practice up to =~2×10⹠elements). A table cell can also contain a multidimensional array of a given primitive type. This is specified by a sequence of dimensions separated by the ``x`` character, with the first dimension changing fastest; as in the case of a simple array, the last dimension may be variable in length. As an example, the following definition declares a table cell which may contain a set of up to 10 images, each of 64×64 bytes:: **References**: `1.1 `__, `1.2 `__ """ message_template = "Invalid arraysize attribute '{}'" default_args = ('x',) class E02(VOSIWarning, XMLWarning, ValueError): """ The `FKColumn` element must have a `fromColumn`. """ message_template = "fkColumn element is missing a fromColumn" class E03(VOSIWarning, XMLWarning, ValueError): """ The element must have a `targetColumn`. """ message_template = "The element is missing a targetColumn" class E04(VOSIWarning, XMLWarning, ValueError): """ The element must have a `targetTable`. """ message_template = "The element is missing a targetTable" class E05(VOSIWarning, XMLWarning, ValueError): """ The element must contain at least one `fkColumn`. """ message_template = "The element contains no `fkColumn`" class E06(VOSIWarning, XMLWarning, ValueError): """ The element must have a ``name`` element. """ message_template = "The {} element must have a name element" default_args = ('x',) class E07(VOSIWarning, XMLWarning, ValueError): """ Raised either when the file doesn't appear to be XML, or the root element is not tableset or table. """ message_template = "File does not appear to be a VOSITables file" class E08(VOSIWarning, XMLWarning, ValueError): """ The element must have a ``version`` element. """ message_template = "The {} element must have a version element" default_args = ('x',) class E09(VOSIWarning, XMLWarning, ValueError): """ The element must have a ``form`` element. """ message_template = "The {} element must have a form element" default_args = ('x',) class E10(VOSIWarning, XMLWarning, ValueError): """ Raised when then file doesn't appear to be valid capabilities xml """ message_template = "File does not appear to be a VOSICapabilities file" pyvo-1.2.1/pyvo/io/vosi/tapregext.py000066400000000000000000000335171416757633600175040ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from astropy.utils.collections import HomogeneousList from astropy.utils.misc import indent from astropy.io.votable.exceptions import vo_raise, warn_or_raise from ...utils.xml.elements import ( Element, ContentMixin, xmlelement, xmlattribute) from . import voresource as vr from .exceptions import ( W05, W06, W19, W20, W21, W22, W23, W24, W25, W26, W27, W28, W29, W30, W31, E06, E08, E09) __all__ = [ "TAPCapRestriction", "TableAccess", "DataModelType", "Language", "Version", "LanguageFeatureList", "LanguageFeature", "OutputFormat", "UploadMethod", "TimeLimits", "DataLimits", "DataLimit"] ###################################################################### # ELEMENT CLASSES class DataModelType(ContentMixin, Element): def __init__(self, config=None, pos=None, **kwargs): super().__init__(config=config, pos=pos, **kwargs) ivo_id = kwargs.get('ivo-id', None) if ivo_id is None: warn_or_raise(W26, W26, config=config, pos=pos) self.ivo_id = ivo_id def __repr__(self): return '{}'.format( self.ivo_id, self.content) def describe(self): """ Prints out a human readable description """ print("Datamodel {}".format(self.content)) print(indent(self.ivo_id)) print() @xmlattribute(name='ivo-id') def ivo_id(self): """The IVORN of the data model.""" return self._ivo_id @ivo_id.setter def ivo_id(self, ivo_id): self._ivo_id = ivo_id class OutputFormat(Element): def __init__(self, config=None, pos=None, **kwargs): super().__init__(config=config, pos=pos, **kwargs) ivo_id = kwargs.get('ivo-id') self.mime = None self._aliases = HomogeneousList(str) self.ivo_id = ivo_id def __repr__(self): return '{}'.format( self.ivo_id, self.mime) def describe(self): """ Prints out a human readable description """ print('Output format {}'.format(self.mime)) if self.aliases: print(indent('Also available as {}'.format( ', '.join(self.aliases)))) print() @xmlelement(plain=True, multiple_exc=W28) def mime(self): return self._mime @mime.setter def mime(self, mime): self._mime = mime @xmlelement(name='alias') def aliases(self): return self._aliases class UploadMethod(Element): def __init__(self, config=None, pos=None, **kwargs): super().__init__(config=config, pos=pos, **kwargs) ivo_id = kwargs.get('ivo-id') self.ivo_id = ivo_id def __repr__(self): return ''.format(self.ivo_id) def describe(self): """ Prints out a human readable description """ print("Upload method supported") print(indent(self.ivo_id)) print() @xmlattribute(name='ivo-id') def ivo_id(self): """The IVORN of the upload model.""" return self._ivo_id @ivo_id.setter def ivo_id(self, ivo_id): self._ivo_id = ivo_id class TimeLimits(Element): def __init__(self, config=None, pos=None, **kwargs): super().__init__(config=config, pos=pos, **kwargs) self._default = None self._hard = None def __repr__(self): return ''.format( self.default, self.hard) @xmlelement(plain=True, multiple_exc=W29) def default(self): return self._default @default.setter def default(self, default): self._default = int(default) @xmlelement(plain=True, multiple_exc=W30) def hard(self): return self._hard @hard.setter def hard(self, hard): self._hard = int(hard) class LanguageFeature(Element): def __init__(self, config=None, pos=None, **kwargs): super().__init__(config=config, pos=pos, **kwargs) self.form = None self.description = None @xmlelement(plain=True, multiple_exc=W27) def form(self): return self._form @form.setter def form(self, form): self._form = form @xmlelement(plain=True, multiple_exc=W06) def description(self): return self._description @description.setter def description(self, description): self._description = description def parse(self, iterator, config): super().parse(iterator, config) if not self.form: vo_raise(E09, self._element_name, config=config, pos=self._pos) class LanguageFeatureList(Element, HomogeneousList): def __init__( self, config=None, pos=None, _name='languageFeatures', **kwargs ): Element.__init__(self, config, pos, _name, **kwargs) HomogeneousList.__init__(self, LanguageFeature) self.type = kwargs.get('type') self._features = HomogeneousList(LanguageFeature) @xmlattribute def type(self): return self._type @type.setter def type(self, type_): self._type = type_ @xmlelement(name='feature', cls=LanguageFeature) def features(self): return self class Version(ContentMixin, Element): def __init__(self, config=None, pos=None, **kwargs): super().__init__(config=config, pos=pos, **kwargs) ivo_id = kwargs.get('ivo-id') self.ivo_id = ivo_id def __repr__(self): return '{}'.format( self.ivo_id, self.content) @xmlattribute(name='ivo-id') def ivo_id(self): """The IVORN of the version.""" return self._ivo_id @ivo_id.setter def ivo_id(self, ivo_id): self._ivo_id = ivo_id class Language(Element): def __init__(self, config=None, pos=None, **kwargs): super().__init__(config=config, pos=pos, **kwargs) self.name = None self._versions = HomogeneousList(Version) self.description = None self._languagefeaturelists = HomogeneousList(LanguageFeatureList) def __repr__(self): return '{}'.format(self.name) def describe(self): """ Prints out a human readable description """ print("Language {}".format(self.name)) for languagefeaturelist in self.languagefeaturelists: print(indent(languagefeaturelist.type)) for feature in languagefeaturelist: print(indent(feature.form, shift=2)) if feature.description: print(indent(feature.description, shift=3)) print() print() @xmlelement(plain=True, multiple_exc=W05) def name(self): return self._name @name.setter def name(self, name): self._name = name @xmlelement(name='version', cls=Version) def versions(self): return self._versions @xmlelement(plain=True, multiple_exc=W06) def description(self): return self._description @description.setter def description(self, description): self._description = description @xmlelement(name='languageFeatures', cls=LanguageFeatureList) def languagefeaturelists(self): return self._languagefeaturelists def parse(self, iterator, config): super().parse(iterator, config) if not self.name: vo_raise(E06, self._element_name, config=config, pos=self._pos) if not self.versions: vo_raise(E08, self._element_name, config=config, pos=self._pos) class DataLimit(ContentMixin, Element): def __init__(self, unit=None, config=None, pos=None, **kwargs): super().__init__(config=config, pos=pos, **kwargs) self.unit = unit @xmlattribute def unit(self): return self._unit @unit.setter def unit(self, unit): self._unit = unit @property def content(self): return self._content @content.setter def content(self, content): self._content = int(content) def parse(self, iterator, config): super().parse(iterator, config) if self.unit not in ('byte', 'row'): warn_or_raise(W31, W31, config=config, pos=self._pos) class DataLimits(Element): def __init__(self, config=None, pos=None, **kwargs): super().__init__(config=config, pos=pos, **kwargs) self.default = None self.hard = None def __repr__(self): return ''.format( self.default.unit, self.default.content, self.hard.unit, self.hard.content ) @xmlelement(cls=DataLimit, multiple_exc=W29) def default(self): return self._default @default.setter def default(self, default): self._default = default @xmlelement(cls=DataLimit, multiple_exc=W30) def hard(self): return self._hard @hard.setter def hard(self, hard): self._hard = hard class TAPCapRestriction(vr.Capability): def __init__( self, config=None, pos=None, _name='capability', standardID=None, **kwargs ): if standardID != 'ivo://ivoa.net/std/TAP': warn_or_raise(W19, W19, config=config, pos=pos) super().__init__( config, pos, _name, standardID='ivo://ivoa.net/std/TAP', **kwargs) @vr.Capability.register_xsi_type('tr:TableAccess') class TableAccess(TAPCapRestriction): def __init__(self, config=None, pos=None, _name='capability', **kwargs): super().__init__(config, pos, _name, **kwargs) self._datamodels = HomogeneousList(DataModelType) self._languages = HomogeneousList(Language) self._outputformats = HomogeneousList(OutputFormat) self._uploadmethods = HomogeneousList(UploadMethod) self.retentionperiod = None self.executionduration = None self.outputlimit = None self.uploadlimit = None def describe(self): """ Prints out a human readable description """ super().describe() for datamodel in self.datamodels: datamodel.describe() for language in self.languages: language.describe() for outputformat in self.outputformats: outputformat.describe() for uploadmethod in self.uploadmethods: uploadmethod.describe() if self.retentionperiod: print("Time a job is kept (in seconds)") print(indent("Default {}".format(self.retentionperiod.default))) if self.retentionperiod.hard: print(indent("Maximum {}".format(self.retentionperiod.hard))) print() if self.executionduration: print("Maximal run time of a job") print(indent("Default {}".format(self.executionduration.default))) if self.executionduration.hard: print(indent("Maximum {}".format(self.executionduration.hard))) print() if self.outputlimit: print("Maximum size of resultsets") print(indent("Default {} {}".format( self.outputlimit.default.content, self.outputlimit.default.unit)) ) if self.outputlimit.hard: print(indent("Maximum {} {}".format( self.outputlimit.hard.content, self.outputlimit.hard.unit)) ) print() if self.uploadlimit: print("Maximal size of uploads") print(indent("Maximum {} {}".format( self.uploadlimit.hard.content, self.uploadlimit.hard.unit))) print() @xmlelement(name='dataModel', cls=DataModelType) def datamodels(self): """Identifier of IVOA-approved data model supported by the service.""" return self._datamodels @xmlelement(name='language', cls=Language) def languages(self): """Languages supported by the service.""" return self._languages @xmlelement(name='outputFormat', cls=OutputFormat) def outputformats(self): """Output formats supported by the service.""" return self._outputformats @xmlelement(name='uploadMethod', cls=UploadMethod) def uploadmethods(self): """ Upload methods supported by the service. The absence of upload methods indicates that the service does not support uploads at all. """ return self._uploadmethods @xmlelement(name='retentionPeriod', cls=TimeLimits, multiple_exc=W22) def retentionperiod(self): """Limits on the time between job creation and destruction time.""" return self._retentionperiod @retentionperiod.setter def retentionperiod(self, retentionperiod): self._retentionperiod = retentionperiod @xmlelement(name='executionDuration', cls=TimeLimits, multiple_exc=W23) def executionduration(self): """Limits on executionDuration.""" return self._executionduration @executionduration.setter def executionduration(self, executionduration): self._executionduration = executionduration @xmlelement(name='outputLimit', cls=DataLimits, multiple_exc=W24) def outputlimit(self): """Limits on the size of data returned.""" return self._outputlimit @outputlimit.setter def outputlimit(self, outputlimit): self._outputlimit = outputlimit @xmlelement(name='uploadLimit', cls=DataLimits, multiple_exc=W25) def uploadlimit(self): return self._uploadlimit @uploadlimit.setter def uploadlimit(self, uploadlimit, cls=DataLimits): self._uploadlimit = uploadlimit def parse(self, iterator, config): super().parse(iterator, config) if not self.languages: warn_or_raise(W20, W20, config=config, pos=self._pos) if not self.outputformats: warn_or_raise(W21, W21, config=config, pos=self._pos) pyvo-1.2.1/pyvo/io/vosi/tests/000077500000000000000000000000001416757633600162605ustar00rootroot00000000000000pyvo-1.2.1/pyvo/io/vosi/tests/__init__.py000066400000000000000000000001001416757633600203600ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst pyvo-1.2.1/pyvo/io/vosi/tests/data/000077500000000000000000000000001416757633600171715ustar00rootroot00000000000000pyvo-1.2.1/pyvo/io/vosi/tests/data/availability.xml000066400000000000000000000011451416757633600223660ustar00rootroot00000000000000 true 2000-00-00T00:00:00Z 2666-00-00T00:00:00Z 2666-23-23T13:37:00Z foo bar pyvo-1.2.1/pyvo/io/vosi/tests/data/capabilities.xml000066400000000000000000000077671416757633600223650ustar00rootroot00000000000000 http://example.org/tap/availability https://example.org/tap/availability http://example.org/tap/capabilities https://example.org/tap/capabilities http://example.org/tap/tables https://example.org/tap/tables http://example.org/tap https://example.org/tap https://paris.example.org/tap QUERY=SELECT%20*%20FROM%20tap_schema.tables&LANG=ADQL Obscore-1.1 Registry 1.0 GloTS 1.0 Obscore-1.0 ADQL 2.0 ADQL 2.0
form 1
description 1
form 2
description 2
BOX
POINT
text/xml text/html html 172800 3600 2000 10000000 100000000
pyvo-1.2.1/pyvo/io/vosi/tests/data/capabilities/000077500000000000000000000000001416757633600216225ustar00rootroot00000000000000pyvo-1.2.1/pyvo/io/vosi/tests/data/capabilities/multiple_capa_descriptions.xml000066400000000000000000000022101416757633600277440ustar00rootroot00000000000000 one two pyvo-1.2.1/pyvo/io/vosi/tests/data/tables.xml000066400000000000000000000026261416757633600211730ustar00rootroot00000000000000 test This is a unittest schema test.allTest tableAll test data in one tableutype id Primary key unit meta.id;meta.main utype VARCHAR indexed primary test.foreigntable testkey testkey Test foreigner utype
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/000077500000000000000000000000001416757633600204435ustar00rootroot00000000000000pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/datatypes_tap.xml000066400000000000000000000107421416757633600240330ustar00rootroot00000000000000 test test.tap _boolean BOOLEAN _smallint SMALLINT _integer INTEGER _bigint BIGINT _real REAL _double DOUBLE _timestamp TIMESTAMP _char CHAR _varchar VARCHAR _binary BINARY _varbinary VARBINARY _point POINT _region REGION _clob CLOB _blob BLOB
test.taptype _boolean BOOLEAN _smallint SMALLINT _integer INTEGER _bigint BIGINT _real REAL _double DOUBLE _timestamp TIMESTAMP _char CHAR _varchar VARCHAR _binary BINARY _varbinary VARBINARY _point POINT _region REGION _clob CLOB _blob BLOB
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/datatypes_votable.xml000066400000000000000000000075501416757633600247060ustar00rootroot00000000000000 test test.votable _boolean boolean _bit bit _unsignedBytes unsignedByte _short short _int int _long long _char char _unicodeChar unicodeChar _float float _double double _floatComplex floatComplex _doubleComplex doubleComplex
test.votable _boolean boolean _bit bit _unsignedBytes unsignedByte _short short _int int _long long _char char _unicodeChar unicodeChar _float float _double double _floatComplex floatComplex _doubleComplex doubleComplex
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_column_datatypes.xml000066400000000000000000000014141416757633600264530ustar00rootroot00000000000000 test test datatype int INTEGER
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_column_descriptions.xml000066400000000000000000000013471416757633600271700ustar00rootroot00000000000000 test ucd test one two
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_column_names.xml000066400000000000000000000012621416757633600255610ustar00rootroot00000000000000 test test one two
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_column_ucds.xml000066400000000000000000000013071416757633600254140ustar00rootroot00000000000000 test ucd test one two
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_column_units.xml000066400000000000000000000013141416757633600256160ustar00rootroot00000000000000 test test unit one two
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_column_utypes.xml000066400000000000000000000013211416757633600260030ustar00rootroot00000000000000 test test utype one two
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_foreignkey_descriptions.xml000066400000000000000000000020111416757633600300220ustar00rootroot00000000000000 test test foreigntable fromcolumn targetcolumn desc1 desc2 fromcolumn int
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_foreignkey_utypes.xml000066400000000000000000000017631416757633600266620ustar00rootroot00000000000000 test test foreigntable fromcolumn targetcolumn utype1 utype2 fromcolumn int
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_fromcolumns.xml000066400000000000000000000017451416757633600254530ustar00rootroot00000000000000 test test foreigntable fromcolumn fromcolumn targetcolumn fromcolumn int
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_schema_descriptions.xml000066400000000000000000000012011416757633600271200ustar00rootroot00000000000000 descriptiontest one two pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_schema_names.xml000066400000000000000000000011041416757633600255170ustar00rootroot00000000000000 one two pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_schema_titles.xml000066400000000000000000000011431416757633600257230ustar00rootroot00000000000000 titletest one two pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_schema_utypes.xml000066400000000000000000000011431416757633600257500ustar00rootroot00000000000000 utypetest one two pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_table_descriptions.xml000066400000000000000000000012621416757633600267560ustar00rootroot00000000000000 test descriptiononetwo
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_table_names.xml000066400000000000000000000011671416757633600253570ustar00rootroot00000000000000 test onetwo
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_table_titles.xml000066400000000000000000000012241416757633600255520ustar00rootroot00000000000000 test titleonetwo
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_table_utypes.xml000066400000000000000000000012241416757633600255770ustar00rootroot00000000000000 test utypeonetwo
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_targetcolumns.xml000066400000000000000000000017531416757633600257750ustar00rootroot00000000000000 test test foreigntable fromcolumn targetcolumn targetcolumn fromcolumn int
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/multiple_targettables.xml000066400000000000000000000017471416757633600255720ustar00rootroot00000000000000 test test foreigntable foreigntable fromcolumn targetcolumn fromcolumn int
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/no_fromcolumn.xml000066400000000000000000000015141416757633600240430ustar00rootroot00000000000000 test test foreigntable fromcolumn int
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/no_schema_name.xml000066400000000000000000000010321416757633600241150ustar00rootroot00000000000000 pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/no_schemas.xml000066400000000000000000000010031416757633600232760ustar00rootroot00000000000000 pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/no_table_description.xml000066400000000000000000000011501416757633600253500ustar00rootroot00000000000000 test description
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/no_table_name.xml000066400000000000000000000011041416757633600237440ustar00rootroot00000000000000 test
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/no_targetcolumn.xml000066400000000000000000000016031416757633600243650ustar00rootroot00000000000000 test test foreigntable fromcolumn fromcolumn int
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/single_table_description.xml000066400000000000000000000012601416757633600262170ustar00rootroot00000000000000 test descriptionA test table with a single description
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/sizenegative.xml000066400000000000000000000013621416757633600236640ustar00rootroot00000000000000 test test.sizezero ZERO INTEGER
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/wrong_arraysize.xml000066400000000000000000000014071416757633600244140ustar00rootroot00000000000000 test test.wrong_arraysize wrongarraysize INTEGER
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/wrong_datatypes_tap.xml000066400000000000000000000013501416757633600252420ustar00rootroot00000000000000 test test.wrong_tap WRONG WRONG
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/wrong_datatypes_votable.xml000066400000000000000000000013601416757633600261130ustar00rootroot00000000000000 test test.wrong_votable wrong wrong
pyvo-1.2.1/pyvo/io/vosi/tests/data/tables/wrong_flag.xml000066400000000000000000000014241416757633600233130ustar00rootroot00000000000000 test test.wrong_flag wrongflag INTEGER prmary
pyvo-1.2.1/pyvo/io/vosi/tests/setup_package.py000066400000000000000000000004521416757633600214460ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst import os def get_package_data(): paths = [ os.path.join('data', '*.xml'), os.path.join('data/tables', '*.xml'), os.path.join('data/capabilities', '*.xml'), ] return {'pyvo.io.vosi.tests': paths} pyvo-1.2.1/pyvo/io/vosi/tests/test_availability.py000066400000000000000000000012431416757633600223430ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.io.vosi """ import pyvo.io.vosi as vosi from astropy.utils.data import get_pkg_data_filename class TestAvailability: def test_availability(self): availability = vosi.parse_availability(get_pkg_data_filename( "data/availability.xml")) assert availability.available assert availability.upsince == "2000-00-00T00:00:00Z" assert availability.downat == "2666-00-00T00:00:00Z" assert availability.backat == "2666-23-23T13:37:00Z" assert "foo" in availability.notes assert "bar" in availability.notes pyvo-1.2.1/pyvo/io/vosi/tests/test_capabilities.py000066400000000000000000000152011416757633600223210ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.io.vosi """ from operator import eq as equals import pytest import pyvo.io.vosi as vosi import pyvo.io.vosi.vodataservice as vs import pyvo.io.vosi.tapregext as tr from pyvo.io.vosi.exceptions import W06 from astropy.utils.data import get_pkg_data_filename @pytest.fixture() def parsed_caps(): return vosi.parse_capabilities(get_pkg_data_filename( "data/capabilities.xml")) @pytest.mark.usefixtures("parsed_caps") class TestCapabilities: def test_availability(self, parsed_caps): assert equals( parsed_caps[0].standardid, "ivo://ivoa.net/std/VOSI#availability") assert type(parsed_caps[0].interfaces[0]) == vs.ParamHTTP assert parsed_caps[0].interfaces[0].accessurls[0].use == "full" assert equals( parsed_caps[0].interfaces[0].accessurls[0].content, "http://example.org/tap/availability") def test_capendpoint(self, parsed_caps): assert equals( parsed_caps[1].standardid, "ivo://ivoa.net/std/VOSI#capabilities") assert type(parsed_caps[1].interfaces[0]) == vs.ParamHTTP assert parsed_caps[1].interfaces[0].accessurls[0].use == "full" assert equals( parsed_caps[1].interfaces[0].accessurls[0].content, "http://example.org/tap/capabilities") def test_tablesendpoint(self, parsed_caps): assert parsed_caps[2].standardid == "ivo://ivoa.net/std/VOSI#tables" assert type(parsed_caps[2].interfaces[0]) == vs.ParamHTTP assert parsed_caps[2].interfaces[0].accessurls[0].use == "full" assert equals( parsed_caps[2].interfaces[0].accessurls[0].content, "http://example.org/tap/tables") def test_type_parsed(self, parsed_caps): assert type(parsed_caps[3]) == tr.TableAccess def test_stdid_parsed(self, parsed_caps): assert parsed_caps[3].standardid == "ivo://ivoa.net/std/TAP" def test_dm_parsed(self, parsed_caps): assert equals( parsed_caps[3].datamodels[0].ivo_id, "ivo://ivoa.net/std/ObsCore#table-1.1") assert parsed_caps[3].datamodels[0].content == "Obscore-1.1" assert equals( parsed_caps[3].datamodels[1].ivo_id, "ivo://ivoa.net/std/RegTAP#1.0") assert parsed_caps[3].datamodels[1].content == "Registry 1.0" def test_language_parsed(self, parsed_caps): assert parsed_caps[3].languages[0].name == "ADQL" assert equals( parsed_caps[3].languages[0].versions[0].ivo_id, "ivo://ivoa.net/std/ADQL#v2.0") assert parsed_caps[3].languages[0].versions[0].content == "2.0" assert parsed_caps[3].languages[0].description == "ADQL 2.0" def test_udfs(self, parsed_caps): assert equals( parsed_caps[3].languages[0].languagefeaturelists[0].type, "ivo://ivoa.net/std/TAPRegExt#features-udf") assert equals( parsed_caps[3].languages[0].languagefeaturelists[0][0].form, "form 1") assert equals( parsed_caps[3].languages[0].languagefeaturelists[0][ 0].description, "description 1") assert equals( parsed_caps[3].languages[0].languagefeaturelists[0][1].form, "form 2") assert equals( parsed_caps[3].languages[0].languagefeaturelists[0].features[ 1].description, "description 2") def test_adqlgeos(self, parsed_caps): assert equals( parsed_caps[3].languages[0].languagefeaturelists[1].type, "ivo://ivoa.net/std/TAPRegExt#features-adqlgeo") assert equals( parsed_caps[3].languages[0].languagefeaturelists[1].features[ 0].form, "BOX") assert equals( parsed_caps[3].languages[0].languagefeaturelists[1].features[ 1].form, "POINT") def test_outputformats(self, parsed_caps): assert equals( parsed_caps[3].outputformats[0].ivo_id, "ivo://ivoa.net/std/TAPRegExt#output-votable-binary") assert parsed_caps[3].outputformats[0].mime == "text/xml" assert parsed_caps[3].outputformats[1].ivo_id is None assert parsed_caps[3].outputformats[1].mime == "text/html" def test_uploadmethods(self, parsed_caps): assert equals( parsed_caps[3].uploadmethods[0].ivo_id, "ivo://ivoa.net/std/TAPRegExt#upload-https") assert equals( parsed_caps[3].uploadmethods[1].ivo_id, "ivo://ivoa.net/std/TAPRegExt#upload-inline") def test_temporal_limits(self, parsed_caps): assert parsed_caps[3].retentionperiod.default == 172800 assert parsed_caps[3].executionduration.default == 3600 def test_spatial_limits(self, parsed_caps): assert parsed_caps[3].outputlimit.default.unit == "row" assert parsed_caps[3].outputlimit.default.content == 2000 assert parsed_caps[3].outputlimit.hard.unit == "row" assert parsed_caps[3].outputlimit.hard.content == 10000000 assert parsed_caps[3].uploadlimit.hard.unit == "byte" assert parsed_caps[3].uploadlimit.hard.content == 100000000 def test_multiple_capa_descriptions(self): with pytest.warns(W06): vosi.parse_capabilities(get_pkg_data_filename( 'data/capabilities/multiple_capa_descriptions.xml')) with pytest.raises(W06): vosi.parse_capabilities(get_pkg_data_filename( 'data/capabilities/multiple_capa_descriptions.xml'), pedantic=True) @pytest.mark.usefixtures("parsed_caps") class TestInterface: def test_interface_parsed(self, parsed_caps): assert parsed_caps[3].interfaces[0].accessurls[0].use == "base" assert equals( parsed_caps[3].interfaces[0].accessurls[0].content, "http://example.org/tap") def test_mirrors_parsed(self, parsed_caps): assert len(parsed_caps[3].interfaces[0].mirrorurls) == 2 def test_mirrors_have_titles(self, parsed_caps): assert [m.title for m in parsed_caps[3].interfaces[0].mirrorurls ] == ["https version", "Paris mirror"] def test_mirrors_have_urls(self, parsed_caps): assert [m.content for m in parsed_caps[3].interfaces[0].mirrorurls ] == ['https://example.org/tap', 'https://paris.example.org/tap'] def test_testquerystring_parsed(self, parsed_caps): assert (parsed_caps[3].interfaces[0].testquerystring.content == 'QUERY=SELECT%20*%20FROM%20tap_schema.tables&LANG=ADQL') pyvo-1.2.1/pyvo/io/vosi/tests/test_tables.py000066400000000000000000000344301416757633600211470ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.io.vosi """ import contextlib import io import pytest import pyvo.io.vosi as vosi import pyvo.io.vosi.vodataservice as vs from pyvo.io.vosi.exceptions import ( W02, W03, W04, W05, W06, W07, W08, W09, W10, W11, W12, W13, W14, W37) from pyvo.io.vosi.exceptions import E01, E02, E03, E06 from astropy.utils.data import get_pkg_data_filename class TestTables: def test_all(self): tablesfile = vosi.parse_tables( get_pkg_data_filename("data/tables.xml")) table = next(tablesfile.iter_tables()) assert table.name == "test.all" assert table.title == "Test table" assert table.description == "All test data in one table" assert table.utype == "utype" col = table.columns[0] fkc = table.foreignkeys[0] assert col.name == "id" assert col.description == "Primary key" assert col.unit == "unit" assert col.ucd == "meta.id;meta.main" assert col.utype == "utype" assert type(col.datatype) == vs.TAPType assert str(col.datatype) == "VARCHAR" assert col.datatype.arraysize == "*" assert col.datatype.delim == ";" assert col.datatype.size == "42" assert col.datatype.content == "VARCHAR" assert "indexed" in col.flags assert "primary" in col.flags assert fkc.targettable == "test.foreigntable" assert fkc.fkcolumns[0].fromcolumn == "testkey" assert fkc.fkcolumns[0].targetcolumn == "testkey" assert fkc.description == "Test foreigner" assert fkc.utype == "utype" def _test_datatypes_votable(self, cols): assert cols[0].datatype.content == 'boolean' assert cols[1].datatype.content == 'bit' assert cols[2].datatype.content == 'unsignedByte' assert cols[3].datatype.content == 'short' assert cols[4].datatype.content == 'int' assert cols[5].datatype.content == 'long' assert cols[6].datatype.content == 'char' assert cols[7].datatype.content == 'unicodeChar' assert cols[8].datatype.content == 'float' assert cols[9].datatype.content == 'double' assert cols[10].datatype.content == 'floatComplex' assert cols[11].datatype.content == 'doubleComplex' def test_datatypes_votable(self): tablesfile = vosi.parse_tables( get_pkg_data_filename("data/tables/datatypes_votable.xml")) votable, votabletype = tuple(tablesfile.iter_tables()) self._test_datatypes_votable(votable.columns) self._test_datatypes_votable(votabletype.columns) def _test_datatypes_tap(self, cols): assert cols[0].datatype.content == 'BOOLEAN' assert cols[1].datatype.content == 'SMALLINT' assert cols[2].datatype.content == 'INTEGER' assert cols[3].datatype.content == 'BIGINT' assert cols[4].datatype.content == 'REAL' assert cols[5].datatype.content == 'DOUBLE' assert cols[6].datatype.content == 'TIMESTAMP' assert cols[7].datatype.content == 'CHAR' assert cols[8].datatype.content == 'VARCHAR' assert cols[9].datatype.content == 'BINARY' assert cols[10].datatype.content == 'VARBINARY' assert cols[11].datatype.content == 'POINT' assert cols[12].datatype.content == 'REGION' assert cols[13].datatype.content == 'CLOB' assert cols[14].datatype.content == 'BLOB' def test_datatypes_tap(self): tablesfile = vosi.parse_tables( get_pkg_data_filename("data/tables/datatypes_tap.xml")) tap, taptype = tuple(tablesfile.iter_tables()) self._test_datatypes_tap(tap.columns) self._test_datatypes_tap(taptype.columns) def test_wrong_datatypes_tap(self): with pytest.warns(W02): vosi.parse_tables( get_pkg_data_filename("data/tables/wrong_datatypes_tap.xml")) def test_wrong_datatypes_votable(self): with pytest.warns(W02): vosi.parse_tables(get_pkg_data_filename( "data/tables/wrong_datatypes_votable.xml")) def test_no_schemas(self): with pytest.warns(W14): vosi.parse_tables( get_pkg_data_filename("data/tables/no_schemas.xml")) with pytest.raises(W14): vosi.parse_tables( get_pkg_data_filename("data/tables/no_schemas.xml"), pedantic=True) def test_no_schema_name(self): with pytest.raises(E06): vosi.parse_tables( get_pkg_data_filename("data/tables/no_schema_name.xml")) def test_multiple_schema_names(self): with pytest.warns(W05): vosi.parse_tables( get_pkg_data_filename("data/tables/multiple_schema_names.xml")) with pytest.raises(W05): vosi.parse_tables( get_pkg_data_filename("data/tables/multiple_schema_names.xml"), pedantic=True) def test_multiple_schema_titles(self): with pytest.warns(W13): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_schema_titles.xml")) with pytest.raises(W13): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_schema_titles.xml"), pedantic=True) def test_multiple_schema_descriptions(self): with pytest.warns(W06): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_schema_descriptions.xml")) with pytest.raises(W06): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_schema_descriptions.xml"), pedantic=True) def test_multiple_schema_utypes(self): with pytest.warns(W09): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_schema_utypes.xml")) with pytest.raises(W09): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_schema_utypes.xml"), pedantic=True) def test_no_table_name(self): with pytest.raises(E06): vosi.parse_tables( get_pkg_data_filename("data/tables/no_table_name.xml")) def test_multiple_table_names(self): with pytest.warns(W05): vosi.parse_tables( get_pkg_data_filename("data/tables/multiple_table_names.xml")) with pytest.raises(W05): vosi.parse_tables( get_pkg_data_filename("data/tables/multiple_table_names.xml"), pedantic=True) def test_multiple_table_titles(self): with pytest.warns(W13): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_table_titles.xml")) with pytest.raises(W13): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_table_titles.xml"), pedantic=True) def test_multiple_table_descriptions(self): with pytest.warns(W06): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_table_descriptions.xml")) with pytest.raises(W06): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_table_descriptions.xml"), pedantic=True) def test_multiple_table_utypes(self): with pytest.warns(W09): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_table_utypes.xml")) with pytest.raises(W09): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_table_utypes.xml"), pedantic=True) def test_multiple_column_names(self): with pytest.warns(W05): vosi.parse_tables( get_pkg_data_filename("data/tables/multiple_column_names.xml")) with pytest.raises(W05): vosi.parse_tables( get_pkg_data_filename("data/tables/multiple_column_names.xml"), pedantic=True) def test_multiple_column_descriptions(self): with pytest.warns(W06): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_column_descriptions.xml")) with pytest.raises(W06): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_column_descriptions.xml"), pedantic=True) def test_multiple_column_units(self): with pytest.warns(W07): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_column_units.xml")) with pytest.raises(W07): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_column_units.xml"), pedantic=True) def test_multiple_column_ucds(self): with pytest.warns(W08): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_column_ucds.xml")) with pytest.raises(W08): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_column_ucds.xml"), pedantic=True) def test_multiple_column_utypes(self): with pytest.warns(W09): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_column_utypes.xml")) with pytest.raises(W09): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_column_utypes.xml"), pedantic=True) def test_multiple_column_datatypes(self): with pytest.warns(W37): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_column_datatypes.xml")) with pytest.raises(W37): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_column_datatypes.xml"), pedantic=True) def test_tap_size(self): with pytest.warns(W03): vosi.parse_tables(get_pkg_data_filename( "data/tables/sizenegative.xml")) with pytest.raises(W03): vosi.parse_tables(get_pkg_data_filename( "data/tables/sizenegative.xml"), pedantic=True) @pytest.mark.xfail def test_wrong_flag(self): with pytest.warns(W04): vosi.parse_tables(get_pkg_data_filename( "data/tables/wrong_flag.xml")) with pytest.raises(W04): vosi.parse_tables(get_pkg_data_filename( "data/tables/wrong_flag.xml"), pedantic=True) def test_multiple_fromcolumns(self): with pytest.warns(W10): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_fromcolumns.xml")) with pytest.raises(W10): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_fromcolumns.xml"), pedantic=True) def test_missing_fromcolumn(self): with pytest.raises(E02): vosi.parse_tables(get_pkg_data_filename( "data/tables/no_fromcolumn.xml")) def test_multiple_targetcolumns(self): with pytest.warns(W11): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_targetcolumns.xml")) with pytest.raises(W11): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_targetcolumns.xml"), pedantic=True) def test_missing_targetcolumn(self): with pytest.raises(E03): vosi.parse_tables(get_pkg_data_filename( "data/tables/no_targetcolumn.xml")) def test_multiple_targettables(self): with pytest.warns(W12): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_targettables.xml")) with pytest.raises(W12): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_targettables.xml"), pedantic=True) def test_multiple_foreignkey_descriptions(self): with pytest.warns(W06): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_foreignkey_descriptions.xml")) with pytest.raises(W06): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_foreignkey_descriptions.xml"), pedantic=True) def test_multiple_foreignkey_utypes(self): with pytest.warns(W09): vosi.parse_tables(get_pkg_data_filename( "data/tables/multiple_foreignkey_utypes.xml")) with pytest.raises(W09): vosi.parse_tables( get_pkg_data_filename( "data/tables/multiple_foreignkey_utypes.xml"), pedantic=True) def test_wrong_arraysize(self): with pytest.raises(E01): vosi.parse_tables( get_pkg_data_filename( "data/tables/wrong_arraysize.xml")) def test_no_table_description(self): """Test handling of describing tables with no description """ tableset = vosi.parse_tables( get_pkg_data_filename( "data/tables/no_table_description.xml")) nodesc_table = tableset.get_first_table() assert nodesc_table.description is None with io.StringIO() as buf, contextlib.redirect_stdout(buf): nodesc_table.describe() output = buf.getvalue() assert 'No description' in output def test_single_table_description(self): """Test describing a table with a single description """ tableset = vosi.parse_tables( get_pkg_data_filename( "data/tables/single_table_description.xml")) onedesc_table = tableset.get_first_table() describe_string = 'A test table with a single description' assert describe_string in onedesc_table.description with io.StringIO() as buf, contextlib.redirect_stdout(buf): onedesc_table.describe() output = buf.getvalue() assert describe_string in output pyvo-1.2.1/pyvo/io/vosi/vodataservice.py000066400000000000000000000752311416757633600203370ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This file contains xml element classes as defined in the VODataService standard There are different ways of handling the various xml tags. * Elements with complex content * Elements with simple content and attributes * Elements with simple content without attributes Elements with complex content are parsed with objects inherited from `Element`. Elements with simple content are parsed with objects inherited from `Element` defining a `value` property. """ import re from astropy.utils.collections import HomogeneousList from astropy.utils.misc import indent from astropy.utils.xml import check as xml_check from astropy.io.votable.exceptions import vo_raise, vo_warn, warn_or_raise from ...utils.xml.elements import ( xmlattribute, xmlelement, Element, ContentMixin) from . import voresource as vr from .exceptions import ( W01, W02, W03, W04, W05, W06, W07, W08, W09, W10, W11, W12, W13, W14, W17, W18, W36, W37, E01, E02, E03, E04, E05, E06) __all__ = [ "TableSet", "TableSchema", "ParamHTTP", "Table", "BaseParam", "TableParam", "InputParam", "DataType", "SimpleDataType", "TableDataType", "VOTableType", "TAPDataType", "TAPType", "FKColumn", "ForeignKey"] ###################################################################### # FACTORY FUNCTIONS def _convert_boolean(value, default=None): return { 'false': False, '0': False, 'true': True, '1': True }.get(value, default) ###################################################################### # ATTRIBUTE CHECKERS def check_anyuri(uri, config=None, pos=None): """ Raises a `~pyvo.io.vosi.tables.exceptions.VOSITablesWarning` if *uri* is not a valid URI. As defined in RFC 2396. """ if uri is not None and not xml_check.check_anyuri(uri): warn_or_raise(W01, W01, uri, config=config, pos=pos) return False return True def check_datatype_flag(data, config=None, pos=None): """ Checks if the datatype flag is valid """ if data not in ('indexed', 'primary', 'nullable'): warn_or_raise(W04, W04, data, config=config, pos=pos) return False return True ###################################################################### # ELEMENT CLASSES class TableSet(Element, HomogeneousList): """ TableSet element as described in http://www.ivoa.net/xml/VODataService/v1.1 The set of tables hosted by a resource. """ def __init__( self, config=None, pos=None, _name='tableset', version='1.1', **kwargs ): HomogeneousList.__init__(self, TableSchema) Element.__init__(self, config, pos, _name, **kwargs) self._version = version def __repr__(self): return '... {} schemas ...'.format( len(self)) @xmlattribute def version(self): """The version of the standard""" return self._version @version.setter def version(self, version): self._config['version'] = version self._version = version @xmlelement(name='schema') def schemas(self): """ A list of schemas. Must contain only `Schema` objects. A named description of a set of logically related tables. The name given by the "name" child element must be unique within this TableSet instance. If there is only one schema in this set and/or there's no locally appropriate name to provide, the name can be set to "default". This aggregation does not need to map to an actual database, catalog, or schema, though the publisher may choose to aggregate along such designations, or particular service protocol may recommend it. """ return self @schemas.adder def schemas(self, iterator, tag, data, config, pos): schema = TableSchema(config, pos, 'schema', **data) schema.parse(iterator, config) self.append(schema) def parse(self, iterator, config): super().parse(iterator, config) if not self.schemas: warn_or_raise(W14, W14, config=config, pos=self._pos) class TableSchema(Element, HomogeneousList): """ TableSchema element as described in http://www.ivoa.net/xml/VODataService/v1.1 A detailed description of a logically-related set of tables. """ def __init__(self, config=None, pos=None, _name='schema', **kwargs): HomogeneousList.__init__(self, Table) Element.__init__(self, config, pos, _name, **kwargs) self._name = None self._title = None self._description = None self._utype = None def __repr__(self): return '... {} tables ...'.format( self.name, len(self.tables)) @xmlelement(plain=True, multiple_exc=W05) def name(self): """ A name for the set of tables. This is used to uniquely identify the table set among several table sets. If a title is not present, this name can be used for display purposes. If there is no appropriate logical name associated with this set, the name should be explicitly set to "default". """ return self._name @name.setter def name(self, name): self._name = name @xmlelement(plain=True, multiple_exc=W13) def title(self): """ a descriptive, human-interpretable name for the table set. This is used for display purposes. There is no requirement regarding uniqueness. It is useful when there are multiple schemas in the context (e.g. within a tableset; otherwise, the resource title could be used instead). """ return self._title @title.setter def title(self, title): self._title = title @xmlelement(plain=True, multiple_exc=W06) def description(self): """ A free text description of the tableset that should explain in general how all of the tables are related. """ return self._description @description.setter def description(self, description): self._description = description @xmlelement(plain=True, multiple_exc=W09) def utype(self): """ an identifier for a concept in a data model that the data in this schema as a whole represent. The format defined in the VOTable standard is strongly recommended. """ return self._utype @utype.setter def utype(self, utype): self._utype = utype @xmlelement(name='table') def tables(self): """ A list of tables in the schema. Must contain only `Table` objects. A description of one of the tables that makes up the set. The table names for the table should be unique. """ return self @tables.adder def tables(self, iterator, tag, data, config, pos): table = Table(config, pos, 'table', **data) table.parse(iterator, config) self.append(table) def parse(self, iterator, config): super().parse(iterator, config) if not self.name: vo_raise(E06, self._Element__name, config=config, pos=self._pos) @vr.Interface.register_xsi_type('vs:ParamHTTP') class ParamHTTP(vr.Interface): """ ParamHTTP element as described in http://www.ivoa.net/xml/VODataService/v1.1 A service invoked via an HTTP Query (either Get or Post) with a set of arguments consisting of keyword name-value pairs. Note that the URL for help with this service can be put into the Service/ReferenceURL element. """ def __init__(self, config=None, pos=None, _name='', **kwargs): super().__init__( config=config, pos=pos, _name=_name, **kwargs) self._querytypes = HomogeneousList(str) self._resulttype = None @xmlelement(name='queryType', multiple_exc=W17) def querytypes(self): """ The type of HTTP request, either GET or POST. The service may indicate support for both GET and POST by providing 2 queryType elements, one with GET and one with POST. """ return self._querytypes @xmlelement(name='resultType', multiple_exc=W36) def resulttype(self): """The MIME type of a document returned in the HTTP response.""" return self._resulttype @resulttype.setter def resulttype(self, resulttype): self._resulttype = resulttype def parse(self, iterator, config): super().parse(iterator, config) if len(self.querytypes) > 2: warn_or_raise(W18, W18, config=config, pos=self._pos) class Table(Element): """ Table element as described in http://www.ivoa.net/xml/VODataService/v1.1 """ def __init__( self, config=None, pos=None, _name='table', version='1.1', **kwargs ): super().__init__(config, pos, _name, **kwargs) self._name = None self._title = None self._description = None self._utype = None self._type = kwargs.get("type") self._version = version self._columns = HomogeneousList(TableParam) self._foreignkeys = HomogeneousList(ForeignKey) def __repr__(self): return '... {} columns ...
'.format( self.name, len(self.columns)) def describe(self): print(self.name) if self.description is not None: print(indent(self.description)) else: print('No description') print() @xmlelement(plain=True, multiple_exc=W05) def name(self): """ the fully qualified name of the table. This name should include all catalog or schema prefixes needed to sufficiently uniquely distinguish it in a query. In general, the format of the qualified name may depend on the context; however, when the table is intended to be queryable via ADQL, then the catalog and schema qualifiers are delimited from the table name with dots (.). """ return self._name @name.setter def name(self, name): self._name = name @xmlelement(plain=True, multiple_exc=W13) def title(self): """ a descriptive, human-interpretable name for the table. This is used for display purposes. There is no requirement regarding uniqueness. """ return self._title @title.setter def title(self, title): self._title = title @xmlelement(plain=True, multiple_exc=W06) def description(self): """ a free-text description of the table's contents """ return self._description @description.setter def description(self, description): self._description = description @xmlelement(plain=True, multiple_exc=W09) def utype(self): """ an identifier for a concept in a data model that the data in this table represent. The format defined in the VOTable standard is highly recommended. """ return self._utype @utype.setter def utype(self, utype): self._utype = utype @xmlattribute def type(self): """ a name for the role this table plays. Recognized values include "output", indicating this table is output from a query; "base_table", indicating a table whose records represent the main subjects of its schema; and "view", indicating that the table represents a useful combination or subset of other tables. Other values are allowed. """ return self._type @type.setter def type(self, type_): self._type = type_ @xmlattribute def version(self): """The version of the standard""" return self._version @version.setter def version(self, version): self._config['version'] = version self._version = version @xmlelement(name='column') def columns(self): """ A list of columns in the table. Must contain only `TableParams` objects. A description of a table column. """ return self._columns @columns.adder def columns(self, iterator, tag, data, config, pos): column = TableParam(config, pos, 'column', **data) column.parse(iterator, config) self.columns.append(column) @xmlelement(name='foreignKey') def foreignkeys(self): """ A list of columns in the table. Must contain only `ForeignKey` objects a description of a foreign keys, one or more columns from the current table that can be used to join with another table. """ return self._foreignkeys @foreignkeys.adder def foreignkeys(self, iterator, tag, data, config, pos): foreignkey = ForeignKey(config, pos, 'foreignKey', **data) foreignkey.parse(iterator, config) self.foreignkeys.append(foreignkey) def parse(self, iterator, config): super().parse(iterator, config) if not self.name: vo_raise(E06, self._Element__name, config=config, pos=self._pos) class BaseParam(Element): """ BaseParam element as described in http://www.ivoa.net/xml/VODataService/v1.1 a description of a parameter that places no restriction on the parameter's data type. As the parameter's data type is usually important, schemas normally employ a sub-class of this type (e.g. Param), rather than this type directly. """ def __init__(self, config=None, pos=None, _name='', **kwargs): super().__init__( config=config, pos=pos, _name=_name, **kwargs) self._name = None self._description = None self._unit = None self._ucd = None self._utype = None def __repr__(self): return ''.format(self.name) @xmlelement(plain=True, multiple_exc=W05) def name(self): """the name of the element""" return self._name @name.setter def name(self, name): self._name = name @xmlelement(plain=True, multiple_exc=W06) def description(self): """ a free-text description of the element's contents """ return self._description @description.setter def description(self, description): self._description = description @xmlelement(plain=True, multiple_exc=W07) def unit(self): """the unit associated with all values in the element""" return self._unit @unit.setter def unit(self, unit): self._unit = unit @xmlelement(plain=True, multiple_exc=W08) def ucd(self): """ the name of a unified content descriptor that describes the scientific content of the element. There are no requirements for compliance with any particular UCD standard. The format of the UCD can be used to distinguish between UCD1, UCD1+, and SIA-UCD. See http://www.ivoa.net/Documents/latest/UCDlist.html for the latest IVOA standard set. """ return self._ucd @ucd.setter def ucd(self, ucd): self._ucd = ucd @xmlelement(plain=True, multiple_exc=W09) def utype(self): """ an identifier for a concept in a data model that the data in this element represent. The format defined in the VOTable standard is highly recommended. """ return self._utype @utype.setter def utype(self, utype): self._utype = utype class TableParam(BaseParam): """ TableParam element as described in http://www.ivoa.net/xml/VODataService/v1.1 A description of a table parameter having a fixed data type. The allowed data type names match those supported by VOTable. """ @classmethod def from_field(cls, field): """ Create a instance from a `~astropy.io.votable.tree.Field` instance. """ instance = cls() instance.name = field.name instance.description = field.description instance.unit = field.unit instance.ucd = field.ucd instance.utype = field.utype datatype = VOTableType(arraysize=field.arraysize) datatype.value = field.datatype instance.datatype = datatype return instance def __init__(self, config=None, pos=None, _name='', std=None, **kwargs): super().__init__( config=config, pos=pos, _name=_name, **kwargs) self._datatype = None self._flags = HomogeneousList(str) self._std = _convert_boolean(std) @xmlelement(name='dataType') def datatype(self): """The type of data contained in the element""" return self._datatype @datatype.setter def datatype(self, datatype): if datatype is not None and not isinstance(datatype, TableDataType): raise ValueError("datatype must be an TableDataType object") self._datatype = datatype @datatype.adder def datatype(self, iterator, tag, data, config, pos): datatype = TableDataType(config, pos, 'dataType', **data) datatype.parse(iterator, config) if self.datatype: warn_or_raise( W37, args=self._Element__name, config=config, pos=pos) self.datatype = datatype @xmlelement(name='flag') def flags(self): """ A list of flags. Must contain only `str` objects. a keyword representing traits of the column. Recognized values include "indexed", "primary", and "nullable". """ return self._flags @xmlattribute def std(self): """ If true, the meaning and use of this parameter is reserved and defined by a standard model. If false, it represents a database-specific parameter that effectively extends beyond the standard. If not provided, then the value is unknown. """ return self._std @std.setter def std(self, std): self._std = std def parse(self, iterator, config): super().parse(iterator, config) if not self.name: vo_raise(E06, self._Element__name, config=config, pos=self._pos) class InputParam(BaseParam): """ InputParam element as described in http://www.ivoa.net/xml/VODataService/v1.1 A description of a service or function parameter having a fixed data type. """ def __init__( self, config=None, pos=None, _name='', use="optional", std="1", **kwargs): BaseParam.__init__(self, config, pos, _name, **kwargs) self._datatype = None self._use = use self._std = _convert_boolean(std, True) @xmlelement(name='dataType') def datatype(self): """The type of data contained in the element""" return self._datatype @datatype.setter def datatype(self, datatype): if datatype is not None and not isinstance(datatype, SimpleDataType): raise ValueError("datatype must be an SimpleDataType object") self._datatype = datatype @xmlattribute def use(self): """ An indication of whether this parameter is required to be provided for the application or service to work properly. Allowed values are "required" and "optional". """ return self._use @use.setter def use(self, use): self._use = use @xmlattribute def std(self): """ If true, the meaning and behavior of this parameter is reserved and defined by a standard interface. If false, it represents an implementation-specific parameter that effectively extends the behavior of the service or application. """ return self._std @std.setter def std(self, std): self._std = std def parse(self, iterator, config): super().parse(iterator, config) if not self.name: vo_raise(E06, self._Element__name, config=config, pos=self._pos) class DataType(ContentMixin, Element): """ DataType element as described in http://www.ivoa.net/xml/VODataService/v1.1 A type (in the computer language sense) associated with a parameter with an arbitrary name. This XML type is used as a parent for defining data types with a restricted set of names. """ def __init__( self, config=None, pos=None, _name='dataType', arraysize=None, delim=None, extendedType=None, extendedSchema=None, **kwargs ): super().__init__( config=config, pos=pos, _name=_name, **kwargs) if arraysize is None: arraysize = "1" if delim is None: delim = " " self.arraysize = arraysize self._delim = delim self._extendedtype = extendedType self.extendedschema = extendedSchema def __repr__(self): return '{}'.format( self.arraysize, self.content) @xmlattribute def arraysize(self): """Specifies the size of the dataType""" return self._arraysize @arraysize.setter def arraysize(self, arraysize): if all(( arraysize is not None, not re.match(r"^([0-9]+x)*[0-9]*[*]?(s\W)?$", arraysize) )): vo_raise(E01, arraysize, self._config, self._pos) self._arraysize = arraysize @xmlattribute def delim(self): """ the string that is used to delimit elements of an array value when arraysize is not "1". Unless specifically disallowed by the context, applications should allow optional spaces to appear in an actual data value before and after the delimiter (e.g. "1, 5" when delim=","). the default is " "; i.e. the values are delimited by spaces. """ return self._delim @delim.setter def delim(self, delim): self._delim = delim @xmlattribute(name='extendedType') def extendedtype(self): """ The data value represented by this type can be interpreted as of a custom type identified by the value of this attribute. If an application does not recognize this extendedType, it should attempt to handle value assuming the type given by the element's value. string is a recommended default type. This element may make use of the extendedSchema attribute and/or any arbitrary (qualified) attribute to refine the identification of the type. """ @extendedtype.setter def extendedtype(self, extendedtype): self._extendedtype = extendedtype @xmlattribute(name='extendedSchema') def extendedschema(self): """ An identifier for the schema that the value given by the extended attribute is drawn from. This attribute is normally ignored if the extendedType attribute is not present. """ return self._extendedschema @extendedschema.setter def extendedschema(self, extendedschema): if extendedschema is not None: check_anyuri(extendedschema, self._config, self._pos) self._extendedschema = extendedschema class SimpleDataType(DataType): """ SimpleDataType element as described in http://www.ivoa.net/xml/VODataService/v1.1 A data type restricted to a small set of names which is imprecise as to the format of the individual values. This set is intended for describing simple input parameters to a service or function. """ def _content_check(self, value): if value is not None: valid_values = { 'integer', 'real', 'complex', 'boolean', 'char', 'string'} if value not in valid_values: vo_warn(W02, value, self._config, self._pos) class TableDataType(DataType): """ TableDataType element as described in http://www.ivoa.net/xml/VODataService/v1.1 an abstract parent for a class of data types that can be used to specify the data type of a table column. Subtypes must be decorated with ``register_xsi_type('ns:name')``. """ _xsi_type_mapping = {} @classmethod def register_xsi_type(cls, typename): """Decorator factory for registering subtypes""" def register(class_): """Decorator for registering subtypes""" cls._xsi_type_mapping[typename] = class_ return class_ return register def __new__(cls, *args, **kwargs): if 'xsi:type' not in kwargs: pass xsi_type = kwargs.get('xsi:type') dtype = cls._xsi_type_mapping.get(xsi_type, cls) obj = DataType.__new__(dtype) obj.__init__(*args, **kwargs) return obj @TableDataType.register_xsi_type('vs:VOTable') @TableDataType.register_xsi_type('vs:VOTableType') class VOTableType(TableDataType): """ VOTableType element as described in http://www.ivoa.net/xml/VODataService/v1.1 """ def _content_check(self, value): if value is not None: valid_values = ( 'boolean', 'bit', 'unsignedByte', 'short', 'int', 'long', 'char', 'unicodeChar', 'float', 'double', 'floatComplex', 'doubleComplex') if value not in valid_values: vo_warn(W02, value, self._config, self._pos) class TAPDataType(TableDataType): """ TAPDataType element as described in http://www.ivoa.net/xml/VODataService/v1.1 an abstract parent for the specific data types supported by the Table Access Protocol. """ def __init__( self, config=None, pos=None, _name='dataType', size=None, **kwargs ): super().__init__( config=config, pos=pos, _name=_name, **kwargs) self.size = size @xmlattribute def size(self): """ the length of the fixed-length value. This corresponds to the size Column attribute in the TAP_SCHEMA and can be used with data types that are defined with a length (CHAR, BINARY). """ return self._size @size.setter def size(self, size): if size is not None and int(size) < 0: size = 0 warn_or_raise(W03, W03, config=self._config, pos=self._pos) self._size = size @TableDataType.register_xsi_type('vs:TAP') @TableDataType.register_xsi_type('vs:TAPType') class TAPType(TAPDataType): """ TAPType element as described in http://www.ivoa.net/xml/VODataService/v1.1 a data type supported explicitly by the Table Access Protocol (v1.0). """ def _content_check(self, value): if value is not None: valid_values = ( 'BOOLEAN', 'SMALLINT', 'INTEGER', 'BIGINT', 'REAL', 'DOUBLE', 'TIMESTAMP', 'CHAR', 'VARCHAR', 'BINARY', 'VARBINARY', 'POINT', 'REGION', 'CLOB', 'BLOB') if value not in valid_values: vo_warn(W02, value, self._config, self._pos) class FKColumn(Element): """ FKColumn element as described in http://www.ivoa.net/xml/VODataService/v1.1 """ def __init__(self, config=None, pos=None, _name='fkColumn', **kwargs): super().__init__( config=config, pos=pos, _name=_name, **kwargs) self._fromcolumn = None self._targetcolumn = None def __repr__(self): return '...'.format( self.fromcolumn, self.targetcolumn) @xmlelement(name='fromColumn', plain=True, multiple_exc=W10) def fromcolumn(self): """ The unqualified name of the column from the current table. """ return self._fromcolumn @fromcolumn.setter def fromcolumn(self, fromcolumn): self._fromcolumn = fromcolumn @xmlelement(name='targetColumn', plain=True, multiple_exc=W11) def targetcolumn(self): """ The unqualified name of the column from the target table. """ return self._targetcolumn @targetcolumn.setter def targetcolumn(self, targetcolumn): self._targetcolumn = targetcolumn def parse(self, iterator, config): super().parse(iterator, config) if self.fromcolumn is None: vo_raise(E02, config=config, pos=self._pos) if self.targetcolumn is None: vo_raise(E03, config=config, pos=self._pos) class ForeignKey(Element): """ ForeignKey element as described in http://www.ivoa.net/xml/VODataService/v1.1 """ def __init__(self, config=None, pos=None, _name='foreignKey', **kwargs): Element.__init__(self, config, pos, _name, **kwargs) self._targettable = None self._fkcolumns = HomogeneousList(FKColumn) self._description = None self._utype = None def __repr__(self): return '...'.format( self.targettable) @xmlelement(name='targetTable', plain=True, multiple_exc=W12) def targettable(self): """ the fully-qualified name (including catalog and schema, as applicable) of the table that can be joined with the table containing this foreign key. """ return self._targettable @targettable.setter def targettable(self, targettable): self._targettable = targettable @xmlelement(name='fkColumn') def fkcolumns(self): """ A list of foreign key columns. Must contain only `FKColumn` objects. a pair of column names, one from this table and one from the target table that should be used to join the tables in a query. """ return self._fkcolumns @fkcolumns.adder def fkcolumns(self, iterator, tag, data, config, pos): fkcolumn = FKColumn(config, pos, 'fkColumn', **data) fkcolumn.parse(iterator, config) self.fkcolumns.append(fkcolumn) @xmlelement(plain=True, multiple_exc=W06) def description(self): """ a free-text description of what this key points to and what the relationship means. """ return self._description @description.setter def description(self, description): self._description = description @xmlelement(plain=True, multiple_exc=W09) def utype(self): """ an identifier for a concept in a data model that the association enabled by this key represents. The format defined in the VOTable standard is highly recommended. """ return self._utype @utype.setter def utype(self, utype): self._utype = utype def parse(self, iterator, config): super().parse(iterator, config) if not self.targettable: vo_raise(E04, config=config, pos=self._pos) if not self.fkcolumns: vo_raise(E05, config=config, pos=self._pos) pyvo-1.2.1/pyvo/io/vosi/voresource.py000066400000000000000000000402561416757633600176730ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ This file contains xml element classes as defined in the VOResource standard. There are different ways of handling the various xml tags. * Elements with complex content * Elements with simple content and attributes * Elements with simple content without attributes Elements with complex content are parsed with objects inherited from `Element`. Elements with simple content are parsed with objects inherited from `Element` defining a `value` property. """ from astropy.utils.collections import HomogeneousList from astropy.utils.misc import indent from ...utils.xml.elements import ( Element, ContentMixin, xmlattribute, xmlelement) from .exceptions import W06 __all__ = [ "ValidationLevel", "Capability", "Interface", "AccessURL", "SecurityMethod", "WebBrowser", "WebService", "MirrorURL"] ###################################################################### # ELEMENT CLASSES class ValidationLevel(ContentMixin, Element): """ ValidationLevel element as described in http://www.ivoa.net/xml/VOResource/v1.0 the allowed values for describing the resource descriptions and interfaces. See the RM (v1.1, section 4) for more guidance on the use of these values. Possible values: 0: The resource has a description that is stored in a registry. This level does not imply a compliant description. 1: In addition to meeting the level 0 definition, the resource description conforms syntactically to this standard and to the encoding scheme used. 2: In addition to meeting the level 1 definition, the resource description refers to an existing resource that has demonstrated to be functionally compliant. When the resource is a service, it is consider to exist and functionally compliant if use of the service accessURL responds without error when used as intended by the resource. If the service is a standard one, it must also demonstrate the response is syntactically compliant with the service standard in order to be considered functionally compliant. If the resource is not a service, then the ReferenceURL must be shown to return a document without error. 3: In addition to meeting the level 2 definition, the resource description has been inspected by a human and judged to comply semantically to this standard as well as meeting any additional minimum quality criteria (e.g., providing values for important but non-required metadata) set by the human inspector. 4: In addition to meeting the level 3 definition, the resource description meets additional quality criteria set by the human inspector and is therefore considered an excellent description of the resource. Consequently, the resource is expected to be operate well as part of a VO application or research study. """ def __init__( self, config=None, pos=None, _name='validationLevel', validatedBy=None, **kwargs ): super().__init__(config, pos, _name, **kwargs) self._validatedby = validatedBy def __repr__(self): return '{}'.format( self.validatedby, self.content) @xmlattribute def validatedby(self): """ The IVOA ID of the registry or organisation that assigned the validation level. """ return self._validatedby @validatedby.setter def validatedby(self, validatedby): self._validatedby = validatedby class AccessURL(ContentMixin, Element): """ AccessURL element as described in http://www.ivoa.net/xml/VOResource/v1.0 The URL (or base URL) that a client uses to access the service. How this URL is to be interpreted and used depends on the specific Interface subclass """ def __init__( self, config=None, pos=None, _name='accessURL', use=None, **kwargs ): super().__init__(config, pos, _name, **kwargs) self._use = use def __repr__(self): return '{}'.format( self.use, self.content) @xmlattribute def use(self): """ A flag indicating whether this should be interpreted as a base URL, a full URL, or a URL to a directory that will produce a listing of files. Possible values: full: Assume a full URL--that is, one that can be invoked directly without alteration. This usually returns a single document or file. base: Assume a base URL--that is, one requiring an extra portion to be appended before being invoked. dir: Assume URL points to a directory that will return a listing of files. """ return self._use @use.setter def use(self, use): self._use = use class MirrorURL(ContentMixin, Element): """ A URL available as a mirror of an access URL. These come with a human-readable title intended to aid in mirror selection. """ def __init__( self, config=None, pos=None, _name='accessURL', title=None, **kwargs ): super().__init__(config, pos, _name, **kwargs) self._title = title @xmlattribute def title(self): """ A human-readable title for the mirror. """ return self._title class SecurityMethod(ContentMixin, Element): """ SecurityMethod element as described in http://www.ivoa.net/xml/VOResource/v1.0 A description of a security mechanism. this type only allows one to refer to the mechanism via a URI. Derived types would allow for more metadata. """ def __init__( self, config=None, pos=None, _name='securityMethod', standardID=None, **kwargs ): super().__init__(config, pos, _name, **kwargs) self._standardid = standardID def __repr__(self): return '{}'.format( self.standardid, self.content) @xmlattribute(name='standardID') def standardid(self): """ A URI identifier for a standard security mechanism. """ return self._standardid @standardid.setter def standardid(self, standardid): self._standardid = standardid class Interface(Element): """ Interface element as described in http://www.ivoa.net/xml/VOResource/v1.0 A description of a service interface. Since this type is abstract, one must use an Interface subclassto describe an actual interface. Additional interface subtypes (beyond WebService and WebBrowser) are defined in the VODataService schema. """ _xsi_type_mapping = {} @classmethod def register_xsi_type(cls, typename): """Decorator factory for registering subtypes""" def register(class_): """Decorator for registering subtypes""" cls._xsi_type_mapping[typename] = class_ return class_ return register def __new__(cls, *args, **kwargs): if 'xsi:type' not in kwargs: pass xsi_type = kwargs.get('xsi:type') dtype = cls._xsi_type_mapping.get(xsi_type, cls) obj = Element.__new__(dtype) obj.__init__(*args, **kwargs) return obj def __init__( self, config=None, pos=None, _name='interface', version='1.0', role=None, **kwargs ): super().__init__(config, pos, _name, **kwargs) self._xsi_type = kwargs.get('xsi:type') self._version = version self._role = role self._resulttype = None self._testquerystring = None self._accessurls = HomogeneousList(AccessURL) self._securitymethods = HomogeneousList(SecurityMethod) self._mirrorurls = HomogeneousList(MirrorURL) def __repr__(self): return '...'.format( self.role) def describe(self): """ Prints out a human readable description """ print('Interface {}'.format(self._xsi_type)) accessurls = '\n'.join( accessurl.content for accessurl in self.accessurls) print(indent(accessurls)) print() @xmlattribute def version(self): """ The version of a standard interface specification that this interface complies with. When the interface is provided in the context of a Capability element, then the standard being refered to is the one identified by the Capability's standardID element. If the standardID is not provided, the meaning of this attribute is undefined. """ return self._version @version.setter def version(self, version): self._version = version @xmlattribute def role(self): """ A tag name the identifies the role the interface plays in the particular capability. If the value is equal to "std" or begins with "std:", then the interface refers to a standard interface defined by the standard referred to by the capability's standardID attribute. For an interface complying with some registered standard (i.e. has a legal standardID), the role can be match against interface roles enumerated in standard resource record. The interface descriptions in the standard record can provide default descriptions so that such details need not be repeated here. """ return self._role @role.setter def role(self, role): self._role = role @xmlelement(name='accessURL', cls=AccessURL) def accessurls(self): """ A list of access urls in the interface. Must contain only `AccessURL` objects. """ return self._accessurls @xmlelement(name='mirrorURL', cls=MirrorURL) def mirrorurls(self): """ mirror(s) for this access URL. """ return self._mirrorurls @xmlelement(name='securityMethod', cls=SecurityMethod) def securitymethods(self): """ the mechanism the client must employ to gain secure access to the service. when more than one method is listed, each one must be employed to gain access. """ return self._securitymethods @xmlelement(name='testQueryString') def testquerystring(self): """ a string to be used in an interface-specific way to obtain a non-empty result from the service. """ return self._testquerystring @testquerystring.setter def testquerystring(self, testquerystring): self._testquerystring = testquerystring @xmlelement def resulttype(self): """ The MIME type of a document returned in the HTTP response. """ return self._resulttype @resulttype.setter def resulttype(self, resulttype): self._resulttype = resulttype class Capability(Element): """ Capability element as described in http://www.ivoa.net/xml/VOResource/v1.0 a description of what the service does (in terms of context-specific behavior), and how to use it (in terms of an interface) """ _xsi_type_mapping = {} @classmethod def register_xsi_type(cls, typename): """Decorator factory for registering subtypes""" def register(class_): """Decorator for registering subtypes""" cls._xsi_type_mapping[typename] = class_ return class_ return register def __new__(cls, *args, **kwargs): if 'xsi:type' not in kwargs: pass xsi_type = kwargs.get('xsi:type') dtype = cls._xsi_type_mapping.get(xsi_type, cls) obj = Element.__new__(dtype) obj.__init__(*args, **kwargs) return obj def __init__( self, config=None, pos=None, _name='capability', standardID=None, **kwargs ): super().__init__(config, pos, _name, **kwargs) self._description = None self._standardid = standardID self._validationlevels = HomogeneousList(ValidationLevel) self._interfaces = HomogeneousList(Interface) def __repr__(self): return ( '' '... {} validationLevels, {} interfaces ...' '' ).format( self.standardid, len(self.validationlevels), len(self.interfaces)) def describe(self): """ Prints out a human readable description """ print("Capability {}".format(self.standardid)) print() if self.description: print(self.description) print() for interface in self.interfaces: interface.describe() @xmlelement(plain=True, multiple_exc=W06) def description(self): """ A human-readable description of what this capability provides as part of the over-all service Use of this optional element is especially encouraged when this capability is non-standard and is one of several capabilities listed. """ return self._description @description.setter def description(self, description): self._description = description @xmlelement(name='validationLevel', cls=ValidationLevel) def validationlevels(self): """ A numeric grade describing the quality of the capability description and interface, when applicable, to be used to indicate the confidence an end-user can put in the resource as part of a VO application or research study. """ return self._validationlevels @xmlelement(name='interface', cls=Interface) def interfaces(self): """ a description of how to call the service to access this capability Since the Interface type is abstract, one must describe the interface using a subclass of Interface, denoting it via xsi:type. Multiple occurances can describe different interfaces to the logically same capability--i.e. data or functionality. That is, the inputs accepted and the output provides should be logically the same. For example, a WebBrowser interface given in addition to a WebService interface would simply provide an interactive, human-targeted interface to the underlying WebService interface. """ return self._interfaces @xmlattribute(name='standardID') def standardid(self): """ A URI identifier for a standard service. This provides a unique way to refer to a service specification standard, such as a Simple Image Access service. The use of an IVOA identifier here implies that a VOResource description of the standard is registered and accessible. """ return self._standardid @standardid.setter def standardid(self, standardid): self._standardid = standardid @Interface.register_xsi_type('vr:WebBrowser') class WebBrowser(Interface): """ WebBrowser element as described in http://www.ivoa.net/xml/VOResource/v1.0 A (form-based) interface intended to be accesed interactively by a user via a web browser. The accessURL represents the URL of the web form itself. """ @Interface.register_xsi_type('vr:WebService') class WebService(Interface): """ WebService element as described in http://www.ivoa.net/xml/VOResource/v1.0 A Web Service that is describable by a WSDL document. The accessURL element gives the Web Service's endpoint URL. """ def __init__(self, config=None, pos=None, _name='interface', **kwargs): super().__init__(config, pos, _name, **kwargs) self._wsdlurls = HomogeneousList(str) @xmlelement(name='wsdlURL') def wsdlurls(self): """ The location of the WSDL that describes this Web Service. If not provided, the location is assumed to be the accessURL with "?wsdl" appended. Multiple occurances should represent mirror copies of the same WSDL file. """ return self._wsdlurls pyvo-1.2.1/pyvo/registry/000077500000000000000000000000001416757633600153775ustar00rootroot00000000000000pyvo-1.2.1/pyvo/registry/__init__.py000066400000000000000000000004251416757633600175110ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ a package for interacting with registries. The regtap module supports access to the IVOA Registries """ from . import regtap search = regtap.search ivoid2service = regtap.ivoid2service __all__ = ["search"] pyvo-1.2.1/pyvo/registry/regtap.py000066400000000000000000000365421416757633600172450ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ a module for basic VO Registry interactions. A VO registry is a database of VO resources--data collections and services--that are available for VO applications. Typically, it is aware of the resources from all over the world. A registry can find relevent data collections and services through search queries--typically, subject-based. The registry responds with a list of records describing matching resources. With a record in hand, the application can use the information in the record to access the resource directly. Most often, the resource is a data service that can be queried for individual datasets of interest. This module provides basic, low-level access to the RegTAP Registries using standardized TAP-based services. """ import os from ..dal import scs, sia, ssa, sla, tap, query as dalq from ..utils.formatting import para_format_desc __all__ = ["search", "RegistryResource", "RegistryResults", "ivoid2service"] REGISTRY_BASEURL = os.environ.get("IVOA_REGISTRY") or "http://dc.g-vo.org/tap" _service_type_map = { "image": "sia", "spectrum": "ssa", "scs": "conesearch", "line": "slap", "sla": "slap", "table": "tap" } def search(keywords=None, servicetype=None, waveband=None, datamodel=None, includeaux=False): """ execute a simple query to the RegTAP registry. Parameters ---------- keywords : str or list of str keyword terms to match to registry records. Use this parameter to find resources related to a particular topic. servicetype : str the service type to restrict results to. Allowed values include 'conesearch', 'sia' , 'ssa', 'slap', 'tap' waveband : str the name of a desired waveband; resources returned will be restricted to those that indicate as having data in that waveband. Allowed values include 'radio', 'millimeter', 'infrared', 'optical', 'uv', 'euv', 'x-ray' 'gamma-ray' datamodel : str the name of the datamodel to search for; makes only sence in conjunction with servicetype tap (or no servicetype). See http://wiki.ivoa.net/twiki/bin/view/IVOA/IvoaDataModel for more informations about data models. includeaux : boolean Flag for whether to include auxiliary capabilities in results. This may result in duplicate capabilities being returned, especially if the servicetype is not specified. Returns ------- RegistryResults a container holding a table of matching resource (e.g. services) See Also -------- RegistryResults """ if not any((keywords, servicetype, waveband, datamodel)): raise dalq.DALQueryError( "No search parameters passed to registry search") wheres = list() wheres.append("intf_role = 'std'") if isinstance(keywords, str): keywords = [keywords] if keywords: def _unions(): for i, keyword in enumerate(keywords): yield """ SELECT isub{i}.ivoid FROM rr.res_subject AS isub{i} WHERE isub{i}.res_subject ILIKE '%{keyword}%' """.format(i=i, keyword=tap.escape(keyword)) yield """ SELECT ires{i}.ivoid FROM rr.resource AS ires{i} WHERE 1=ivo_hasword(ires{i}.res_description, '{keyword}') OR 1=ivo_hasword(ires{i}.res_title, '{keyword}') """.format(i=i, keyword=tap.escape(keyword)) unions = ' UNION '.join(_unions()) wheres.append('rr.interface.ivoid IN ({})'.format(unions)) # capabilities as specified by servicetype and includeaux: # default to all known service types # limit to one servicetype if specified by known key or value match_caps = set(_service_type_map.values()) if servicetype: if servicetype in _service_type_map.values(): match_caps = set([servicetype]) elif _service_type_map.get(servicetype) is not None: match_caps= set([_service_type_map.get(servicetype)]) else: raise dalq.DALQueryError("Invalid servicetype parameter passed to registry search") if includeaux: match_caps |= {s+"#aux" for s in match_caps} wheres.append('standard_id IN ({})'.format( ",".join( "'ivo://ivoa.net/std/"+s+"'" for s in match_caps))) if waveband: wheres.append("1 = ivo_hashlist_has(rr.resource.waveband, '{}')".format( tap.escape(waveband))) if datamodel: wheres.append(""" rr.interface.ivoid IN ( SELECT idet.ivoid FROM rr.res_detail as idet WHERE idet.detail_xpath = '/capability/dataModel/@ivo-id' AND 1 = ivo_nocasematch( idet.detail_value, 'ivo://ivoa.net/std/{}%') ) """.format(tap.escape(datamodel))) query = """SELECT DISTINCT rr.interface.*, rr.capability.*, rr.resource.* FROM rr.capability NATURAL JOIN rr.interface NATURAL JOIN rr.resource {} """.format( ("WHERE " if wheres else "") + " AND ".join(wheres) ) service = tap.TAPService(REGISTRY_BASEURL) query = RegistryQuery(service.baseurl, query, maxrec=service.hardlimit) return query.execute() class RegistryQuery(tap.TAPQuery): def execute(self): """ submit the query and return the results as a RegistryResults instance Raises ------ DALServiceError for errors connecting to or communicating with the service DALQueryError for errors either in the input query syntax or other user errors detected by the service DALFormatError for errors parsing the VOTable response """ return RegistryResults(self.execute_votable(), self.queryurl) class RegistryResults(dalq.DALResults): """ an iterable set of results from a registry query. Each record is returned as RegistryResults """ def getrecord(self, index): """ return all the attributes of a resource record with the given index as SimpleResource instance (a dictionary-like object). Parameters ---------- index : int the zero-based index of the record """ return RegistryResource(self, index) class RegistryResource(dalq.Record): """ a dictionary for the resource metadata returned in one record of a registry query. A SimpleResource acts as a dictionary, so in general, all attributes can be accessed by name via the [] operator, and the attribute names can by returned via the keys() function. For convenience, it also stores key values as properties; these include: """ _service = None @property def ivoid(self): """ the IVOA identifier for the resource. """ return self.get("ivoid", decode=True) @property def res_type(self): """ the resource types that characterize this resource. """ return self.get("res_type", decode=True) @property def short_name(self): """ the short name for the resource """ return self.get("short_name", decode=True) @property def res_title(self): """ the title of the resource """ return self.get("res_title", default=None, decode=True) @property def content_levels(self): """ a list of content level labels that describe the intended audience for this resource. """ return self.get("content_level", default="", decode=True).split("#") @property def res_description(self): """ the textual description of the resource. See Also -------- SimpleResource.describe """ return self.get("res_description", decode=True) @property def reference_url(self): """ URL pointing to a human-readable document describing this resource. """ return self.get("reference_url", decode=True) @property def creators(self): """ The creator(s) of the resource in the ordergiven by the resource record author """ return self.get("creator_seq", default="", decode=True).split(";") @property def content_types(self): """ list of natures or genres of the content of the resource. """ return self.get("content_type", decode=True).split("#") @property def source_format(self): """ The format of source_value. """ return self.get("source_format", decode=True) @property def region_of_regard(self): """ numeric value representing the angle, given in decimal degrees, by which a positional query against this resource should be "blurred" in order to get an appropriate match. """ return float(self.get("region_of_regard", 0)) @property def waveband(self): """ a list of names of the wavebands that the resource provides data for """ return self.get("waveband", default="", decode=True).split("#") @property def access_url(self): """ the URL that can be used to access the service resource. """ return self.get("access_url", decode=True) @property def standard_id(self): """ the IVOA standard identifier """ return self.get("standard_id", decode=True) @property def service(self): """ return an appropriate DALService subclass for this resource that can be used to search the resource. Return None if the resource is not a recognized DAL service. Currently, only Conesearch, SIA, SSA, and SLA services are supported. """ if self.access_url: for key, value in { "ivo://ivoa.net/std/conesearch": scs.SCSService, "ivo://ivoa.net/std/sia": sia.SIAService, "ivo://ivoa.net/std/ssa": ssa.SSAService, "ivo://ivoa.net/std/sla": sla.SLAService, "ivo://ivoa.net/std/tap": tap.TAPService, }.items(): if key in self.standard_id: self._service = value(self.access_url) return self._service def search(self, *args, **keys): """ assuming this resource refers to a searchable service, execute a search against the resource. This is equivalent to: .. code:: python self.to_service().search(*args, **keys) The arguments provided should be appropriate for the service that the DAL service type would expect. See the documentation for the appropriate service type: ============ ========================================= Service type Use the argument syntax for ============ ========================================= catalog :py:meth:`pyvo.dal.scs.SCSService.search` image :py:meth:`pyvo.dal.sia.SIAService.search` spectrum :py:meth:`pyvo.dal.ssa.SSAService.search` line :py:meth:`pyvo.dal.sla.SLAService.search` database *not yet supported* ============ ========================================= Raises ------ RuntimeError if the resource does not describe a searchable service. """ if not self.service: raise dalq.DALServiceError( "resource, {}, is not a searchable service".format( self.short_name)) return self.service.search(*args, **keys) def describe(self, verbose=False, width=78, file=None): """ Print a summary description of this resource. Parameters ---------- verbose : bool If false (default), only user-oriented information is printed; if true, additional information will be printed as well. width : int Format the description with given character-width. out : writable file-like object If provided, write information to this output stream. Otherwise, it is written to standard out. """ restype = "Custom Service" stdid = self.get("standard_id", decode=True).lower() if stdid: if stdid.startswith("ivo://ivoa.net/std/conesearch"): restype = "Catalog Cone-search Service" elif stdid.startswith("ivo://ivoa.net/std/sia"): restype = "Image Data Service" elif stdid.startswith("ivo://ivoa.net/std/ssa"): restype = "Spectrum Data Service" elif stdid.startswith("ivo://ivoa.net/std/slap"): restype = "Spectral Line Database Service" elif stdid.startswith("ivo://ivoa.net/std/tap"): restype = "Table Access Protocol Service" print(restype, file=file) print(para_format_desc(self.res_title), file=file) print("Short Name: " + self.short_name, file=file) print("IVOA Identifier: " + self.ivoid, file=file) if self.access_url: print("Base URL: " + self.access_url, file=file) if self.res_description: print(file=file) print(para_format_desc(self.res_description), file=file) print(file=file) if self.short_name: print( para_format_desc("Subjects: {}".format(self.short_name)), file=file) if self.waveband: val = (str(v) for v in self.waveband) print( para_format_desc("Waveband Coverage: " + ", ".join(val)), file=file) if verbose: if self.standard_id: print("StandardID: " + self.standard_id, file=file) if self.reference_url: print("More info: " + self.reference_url, file=file) def ivoid2service(ivoid, servicetype=None): """Retern service(s) for a given IVOID. The servicetype option specifies the kind of service requested (conesearch, sia, ssa, slap, or tap). By default, if none is given, a list of all matching services is returned. """ service = tap.TAPService(REGISTRY_BASEURL) results = service.run_sync(""" SELECT DISTINCT access_url, standard_id FROM rr.capability NATURAL JOIN rr.interface WHERE ivoid = '{}' """.format(tap.escape(ivoid))) services = [] ivo_cls = { "ivo://ivoa.net/std/conesearch": scs.SCSService, "ivo://ivoa.net/std/sia": sia.SIAService, "ivo://ivoa.net/std/ssa": ssa.SSAService, "ivo://ivoa.net/std/sla": sla.SLAService, "ivo://ivoa.net/std/tap": tap.TAPService } for result in results: thistype = result["standard_id"] if thistype not in ivo_cls.keys(): # This one is not a VO service continue cls = ivo_cls[thistype] if servicetype is not None and servicetype not in thistype: # Not the type of service you want continue elif servicetype is not None: # Return only one service, the first of the requested type return(cls(result["access_url"])) else: # Return a list of services services.append(cls(result["access_url"])) return services pyvo-1.2.1/pyvo/registry/tests/000077500000000000000000000000001416757633600165415ustar00rootroot00000000000000pyvo-1.2.1/pyvo/registry/tests/__init__.py000066400000000000000000000001001416757633600206410ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst pyvo-1.2.1/pyvo/registry/tests/conftest.py000066400000000000000000000012561416757633600207440ustar00rootroot00000000000000from contextlib import contextmanager import pytest import requests_mock class ContextAdapter(requests_mock.Adapter): """ requests_mock adapter where ``register_uri`` returns a context manager """ @contextmanager def register_uri(self, *args, **kwargs): matcher = super().register_uri(*args, **kwargs) yield matcher self.remove_matcher(matcher) def remove_matcher(self, matcher): if matcher in self._matchers: self._matchers.remove(matcher) @pytest.fixture(scope='function') def mocker(): with requests_mock.Mocker( adapter=ContextAdapter(case_sensitive=True) ) as mocker: yield mocker pyvo-1.2.1/pyvo/registry/tests/data/000077500000000000000000000000001416757633600174525ustar00rootroot00000000000000pyvo-1.2.1/pyvo/registry/tests/data/capabilities.xml000066400000000000000000000074561416757633600226410ustar00rootroot00000000000000 http://example.org/tap/availability https://example.org/tap/availability http://example.org/tap/capabilities https://example.org/tap/capabilities http://example.org/tap/tables https://example.org/tap/tables http://example.org/tap https://example.org/tap Obscore-1.1 Registry 1.0 GloTS 1.0 Obscore-1.0 ADQL 2.0 ADQL 2.0
form 1
description 1
form 2
description 2
BOX
POINT
text/xml text/html html 172800 3600 2000 10000000 100000000
pyvo-1.2.1/pyvo/registry/tests/data/regtap.xml000066400000000000000000002604531416757633600214700ustar00rootroot00000000000000 The parent resource. The index of the parent capability. An arbitrary identifier for the interfaces of a resource. The type of the interface (vr:webbrowser, vs:paramhttp, etc). An identifier for the role the interface plays in the particular capability. If the value is equal to "std" or begins with "std:", then the interface refers to a standard interface defined by the standard referred to by the capability's standardID attribute. The version of a standard interface specification that this interface complies with. When the interface is provided in the context of a Capability element, then the standard being refered to is the one identified by the Capability's standardID element. Hash-joined list of expected HTTP method (get or post) supported by the service. The MIME type of a document returned in the HTTP response. The location of the WSDL that describes this Web Service. If NULL, the location can be assumed to be the accessURL with '?wsdl' appended. A flag indicating whether this should be interpreted as a base URL ('base'), a full URL ('full'), or a URL to a directory that will produce a listing of files ('dir'). The URL at which the interface is found. Secondary access URLs of this interface, separated by hash characters. An identifier of an authentication method required on this interface, or NULL for interfaces publicly available. The identifiers of authentication schemes recommended in the VO are declared in the IVOA recommendation “SSO: Authentication Mechanisms.“ The parent resource. An arbitrary identifier of this capability within the resource. The type of capability covered here. If looking for endpoints implementing a certain standard, you should not use this column but rather match against standard_id. A human-readable description of what this capability provides as part of the over-all service. A URI for a standard this capability conforms to. Unambiguous reference to the resource conforming to the IVOA standard for identifiers. Resource type (something like vs:datacollection, vs:catalogservice, etc). The UTC date and time this resource metadata description was created. A short name or abbreviation given to something, for presentation in space-constrained fields (up to 16 characters). The full name given to the resource. The UTC date this resource metadata description was last updated. A hash-separated list of content levels specifying the intended audience. An account of the nature of the resource. URL pointing to a human-readable document describing this resource. The creator(s) of the resource in the order given by the resource record author, separated by semicolons. A hash-separated list of natures or genres of the content of the resource. The format of source_value. This, in particular, can be ``bibcode''. A bibliographic reference from which the present resource is derived or extracted. Label associated with creation or availablilty of a version of a resource. A single numeric value representing the angle, given in decimal degrees, by which a positional query against this resource should be ``blurred'' in order to get an appropriate match. A hash-separated list of regions of the electro-magnetic spectrum that the resource's spectral coverage overlaps with. A statement of usage conditions (license, attribution, embargo, etc). A URI identifying a license the data is made available under. IVOID of the registry this record came from.
ivo://cds.vizier/b/cb 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/B/cb/cbdata? ivo://cds.vizier/b/cb 4 cs:conesearch Cone search capability for table B/cb/cbdata (Catalogue of Cataclysmic Binaries) ivo://ivoa.net/std/conesearch ivo://cds.vizier/b/cb vs:catalogservice 2017-05-23T11:05:12 B/cb Cataclysmic Binaries, LMXBs, and related objects (Ritter+, 2004) 2018-04-05T10:00:00 research Cataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, and stellar parameters of the components and other characteristic properties of 1429 cataclysmic binaries, 108 low-mass X-ray binaries and 619 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 2035 of the 2156 objects, and a cross-reference list of alias object designations. Literature published before 1 July 2016 has, as far as possible, been taken into account. Old editions include catalogue <V/59> (5th edition), <V/99> (6th edition) and <V/113> (7th edition); the successive versions of the 7th edition are available in dedicated subdirectories (v7.00 to v7.20) http://cdsarc.u-strasbg.fr/cgi-bin/Cat?B/cb Ritter H., Kolb U. catalog bibcode 2003A&A...404..301R 29-Sep-2011 public ivo://cds.vizier/registry
ivo://cds.vizier/b/cb 5 5 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/B/cb/lmxbdata? ivo://cds.vizier/b/cb 5 cs:conesearch Cone search capability for table B/cb/lmxbdata (Catalogue of Low-Mass X-Ray Binaries) ivo://ivoa.net/std/conesearch ivo://cds.vizier/b/cb vs:catalogservice 2017-05-23T11:05:12 B/cb Cataclysmic Binaries, LMXBs, and related objects (Ritter+, 2004) 2018-04-05T10:00:00 research Cataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, and stellar parameters of the components and other characteristic properties of 1429 cataclysmic binaries, 108 low-mass X-ray binaries and 619 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 2035 of the 2156 objects, and a cross-reference list of alias object designations. Literature published before 1 July 2016 has, as far as possible, been taken into account. Old editions include catalogue <V/59> (5th edition), <V/99> (6th edition) and <V/113> (7th edition); the successive versions of the 7th edition are available in dedicated subdirectories (v7.00 to v7.20) http://cdsarc.u-strasbg.fr/cgi-bin/Cat?B/cb Ritter H., Kolb U. catalog bibcode 2003A&A...404..301R 29-Sep-2011 public ivo://cds.vizier/registry
ivo://cds.vizier/b/cb 6 6 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/B/cb/pcbdata? ivo://cds.vizier/b/cb 6 cs:conesearch Cone search capability for table B/cb/pcbdata (Catalogue of Related Objects) ivo://ivoa.net/std/conesearch ivo://cds.vizier/b/cb vs:catalogservice 2017-05-23T11:05:12 B/cb Cataclysmic Binaries, LMXBs, and related objects (Ritter+, 2004) 2018-04-05T10:00:00 research Cataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, and stellar parameters of the components and other characteristic properties of 1429 cataclysmic binaries, 108 low-mass X-ray binaries and 619 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 2035 of the 2156 objects, and a cross-reference list of alias object designations. Literature published before 1 July 2016 has, as far as possible, been taken into account. Old editions include catalogue <V/59> (5th edition), <V/99> (6th edition) and <V/113> (7th edition); the successive versions of the 7th edition are available in dedicated subdirectories (v7.00 to v7.20) http://cdsarc.u-strasbg.fr/cgi-bin/Cat?B/cb Ritter H., Kolb U. catalog bibcode 2003A&A...404..301R 29-Sep-2011 public ivo://cds.vizier/registry
ivo://cds.vizier/j/a+a/506/729 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/A+A/506/729/table2? ivo://cds.vizier/j/a+a/506/729 4 cs:conesearch Cone search capability for table J/A+A/506/729/table2 (Properties of the targeted member stars) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/a+a/506/729 vs:catalogservice 2009-12-30T09:41:09 J/A+A/506/729 Abundances in globular cluster Pal 3 (Koch+, 2009) 2018-04-05T10:00:00 research Chemical abundances of 25 alpha-, iron peak-, and neutron-capture elements in the remote (R=90kpc) outer halo globular cluster have been determined for 4 red giants observed with the Magellan/MIKE spectrograph and from integrated spectra of 19 stars obtained with the Keck/HIRES instrument. The resulting abundance ratios show that Pal 3 is very similar to globular clusters of the inner halo and very dissimilar from dwarf spheroidal galaxy stars. Its neutron capture element ratios are compatible with a pure r-process enrichment. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/A+A/506/729 Koch A., Cote P., McWilliam A. catalog bibcode 2009A&A...506..729K 10-Sep-2009 optical public ivo://cds.vizier/registry
ivo://cds.vizier/j/a+a/530/a28 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/A+A/530/A28/targets? ivo://cds.vizier/j/a+a/530/a28 4 cs:conesearch Cone search capability for table J/A+A/530/A28/targets (Priority targets for follow-up) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/a+a/530/a28 vs:catalogservice 2017-06-22T14:29:01 J/A+A/530/A28 Priority targets for the MUCHFUSS project (Geier+, 2011) 2018-04-05T10:00:00 research The project Massive Unseen Companions to Hot Faint Underluminous Stars from SDSS (MUCHFUSS) aims at finding sdBs with compact companions like supermassive white dwarfs (M>1.0M_{sun}_), neutron stars or black holes. The existence of such systems is predicted by binary evolution theory and recent discoveries indicate that they are likely to exist in our Galaxy. A determination of the orbital parameters is sufficient to put a lower limit on the companion mass by calculating the binary mass function. If this lower limit exceeds the Chandrasekhar mass and no sign of a companion is visible in the spectra, the existence of a massive compact companion is proven without the need for any additional assumptions. We identified about 1100 hot subdwarf stars from the SDSS by colour selection and visual inspection of their spectra. Stars with high velocities have been reobserved and individual SDSS spectra have been analysed. In total 127 radial velocity variable subdwarfs have been discovered. Binaries with high RV shifts and binaries with moderate shifts within short timespans have the highest probability of hosting massive compact companions. Atmospheric parameters of 69 hot subdwarfs in these binary systems have been determined by means of a quantitative spectral analysis. The atmospheric parameter distribution of the selected sample does not differ from previously studied samples of hot subdwarfs. The systems are considered the best candidates to search for massive compact companions by follow-up time resolved spectroscopy. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/A+A/530/A28 Geier S., Hirsch H., Tillich A., Maxted P.F.L., Bentley S.J., Ostensen R.H., Heber U., Gaensicke B.T., Marsh T.R., Napiwotzki R., Barlow B.N., O'Toole S.J. catalog bibcode 2011A&A...530A..28G 30-Aug-2011 optical public ivo://cds.vizier/registry
ivo://cds.vizier/j/a+a/530/a28 5 5 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/A+A/530/A28/tablea1? ivo://cds.vizier/j/a+a/530/a28 5 cs:conesearch Cone search capability for table J/A+A/530/A28/tablea1 (Orbital parameters of all known hot subdwarf binaries from literature) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/a+a/530/a28 vs:catalogservice 2017-06-22T14:29:01 J/A+A/530/A28 Priority targets for the MUCHFUSS project (Geier+, 2011) 2018-04-05T10:00:00 research The project Massive Unseen Companions to Hot Faint Underluminous Stars from SDSS (MUCHFUSS) aims at finding sdBs with compact companions like supermassive white dwarfs (M>1.0M_{sun}_), neutron stars or black holes. The existence of such systems is predicted by binary evolution theory and recent discoveries indicate that they are likely to exist in our Galaxy. A determination of the orbital parameters is sufficient to put a lower limit on the companion mass by calculating the binary mass function. If this lower limit exceeds the Chandrasekhar mass and no sign of a companion is visible in the spectra, the existence of a massive compact companion is proven without the need for any additional assumptions. We identified about 1100 hot subdwarf stars from the SDSS by colour selection and visual inspection of their spectra. Stars with high velocities have been reobserved and individual SDSS spectra have been analysed. In total 127 radial velocity variable subdwarfs have been discovered. Binaries with high RV shifts and binaries with moderate shifts within short timespans have the highest probability of hosting massive compact companions. Atmospheric parameters of 69 hot subdwarfs in these binary systems have been determined by means of a quantitative spectral analysis. The atmospheric parameter distribution of the selected sample does not differ from previously studied samples of hot subdwarfs. The systems are considered the best candidates to search for massive compact companions by follow-up time resolved spectroscopy. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/A+A/530/A28 Geier S., Hirsch H., Tillich A., Maxted P.F.L., Bentley S.J., Ostensen R.H., Heber U., Gaensicke B.T., Marsh T.R., Napiwotzki R., Barlow B.N., O'Toole S.J. catalog bibcode 2011A&A...530A..28G 30-Aug-2011 optical public ivo://cds.vizier/registry
ivo://cds.vizier/j/a+a/537/a83 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/A+A/537/A83/stars? ivo://cds.vizier/j/a+a/537/a83 4 cs:conesearch Cone search capability for table J/A+A/537/A83/stars (Properties and stellar parameters of target stars) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/a+a/537/a83 vs:catalogservice 2017-12-18T08:57:20 J/A+A/537/A83 Abunbances of 9 red giants of Pal 14 (Caliskan+, 2012) 2018-04-05T10:00:00 research Chemical abundances of 25 elements, which include {alpha}-, iron peak-, and neutron-capture elements, in the outer halo globular cluster Palomar 14 have been determined for the nine red giants observed with the FLAMES/UVES spectrograph. The abundance pattern of Pal 14 is similar to the inner halo GCs, halo field stars, and GCs of recognized extragalactic origin, but differs from what is customarily found in dSphs field stars. The abundance properties of Pal 14 as well as those of the other outer halo GCs are thus compatible with an accretion origin from dSphs. The neutron-capture elements show an r-process signature. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/A+A/537/A83 Caliskan S., Christlieb N., Grebel E.K. catalog bibcode 2012A&A...537A..83C 21-Nov-2011 optical public ivo://cds.vizier/registry
ivo://cds.vizier/j/an/331/349 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/AN/331/349/table2? ivo://cds.vizier/j/an/331/349 4 cs:conesearch Cone search capability for table J/AN/331/349/table2 (All values obtained from the catalogues cited in the paper) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/an/331/349 vs:catalogservice 2017-12-05T06:09:54 J/AN/331/349 O, B-type & red supergiant masses and luminosities (Hohle+, 2010) 2018-04-05T10:00:00 research Massive stars are of interest as progenitors of supernovae, i.e. neutron stars and black holes, which can be sources of gravitational waves. Recent population synthesis models can predict neutron star and gravitational wave observations but deal with a fixed supernova rate or an assumed initial mass function for the population of massive stars. Here we investigate those massive stars, which are supernova progenitors, i.e. with O- and early B-type stars, and also all supergiants within 3kpc. We restrict our sample to those massive stars detected both in 2MASS and observed by Hipparcos, i.e. only those stars with parallax and precise photometry. To determine the luminosities we calculated the extinctions from published multi-colour photometry, spectral types, luminosity class, all corrected for multiplicity and recently revised Hipparcos distances. We use luminosities and temperatures to estimate the masses and ages of these stars using different models from different authors. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AN/331/349 Hohle M.M., Neuhauser R., Schutz B.F. catalog bibcode 2010AN....331..349H 03-May-2010 infrared public ivo://cds.vizier/registry
ivo://cds.vizier/j/an/331/349 5 5 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/AN/331/349/single? ivo://cds.vizier/j/an/331/349 5 cs:conesearch Cone search capability for table J/AN/331/349/single (Input data and derived mass and luminosity for single stars) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/an/331/349 vs:catalogservice 2017-12-05T06:09:54 J/AN/331/349 O, B-type & red supergiant masses and luminosities (Hohle+, 2010) 2018-04-05T10:00:00 research Massive stars are of interest as progenitors of supernovae, i.e. neutron stars and black holes, which can be sources of gravitational waves. Recent population synthesis models can predict neutron star and gravitational wave observations but deal with a fixed supernova rate or an assumed initial mass function for the population of massive stars. Here we investigate those massive stars, which are supernova progenitors, i.e. with O- and early B-type stars, and also all supergiants within 3kpc. We restrict our sample to those massive stars detected both in 2MASS and observed by Hipparcos, i.e. only those stars with parallax and precise photometry. To determine the luminosities we calculated the extinctions from published multi-colour photometry, spectral types, luminosity class, all corrected for multiplicity and recently revised Hipparcos distances. We use luminosities and temperatures to estimate the masses and ages of these stars using different models from different authors. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AN/331/349 Hohle M.M., Neuhauser R., Schutz B.F. catalog bibcode 2010AN....331..349H 03-May-2010 infrared public ivo://cds.vizier/registry
ivo://cds.vizier/j/an/331/349 6 6 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/AN/331/349/mult1? ivo://cds.vizier/j/an/331/349 6 cs:conesearch Cone search capability for table J/AN/331/349/mult1 (Input data and derived mass and luminosity for primaries of Pourbaix multiple stars) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/an/331/349 vs:catalogservice 2017-12-05T06:09:54 J/AN/331/349 O, B-type & red supergiant masses and luminosities (Hohle+, 2010) 2018-04-05T10:00:00 research Massive stars are of interest as progenitors of supernovae, i.e. neutron stars and black holes, which can be sources of gravitational waves. Recent population synthesis models can predict neutron star and gravitational wave observations but deal with a fixed supernova rate or an assumed initial mass function for the population of massive stars. Here we investigate those massive stars, which are supernova progenitors, i.e. with O- and early B-type stars, and also all supergiants within 3kpc. We restrict our sample to those massive stars detected both in 2MASS and observed by Hipparcos, i.e. only those stars with parallax and precise photometry. To determine the luminosities we calculated the extinctions from published multi-colour photometry, spectral types, luminosity class, all corrected for multiplicity and recently revised Hipparcos distances. We use luminosities and temperatures to estimate the masses and ages of these stars using different models from different authors. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AN/331/349 Hohle M.M., Neuhauser R., Schutz B.F. catalog bibcode 2010AN....331..349H 03-May-2010 infrared public ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/578/405 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/578/405/table1? ivo://cds.vizier/j/apj/578/405 4 cs:conesearch Cone search capability for table J/ApJ/578/405/table1 (Chandra X-Ray Sources in the Field of NGC 5139) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/apj/578/405 vs:catalogservice 2003-03-29T10:46:43 J/ApJ/578/405 Neutron stars in NGC 5139 (Rutledge+, 2002) 2018-04-05T10:00:00 research The Chandra/ACIS-I detectors observed NGC 5139 in imaging mode for two continuous periods (2000 January 24 02:15-09:46 and January 25 04:33-17:24 TT) for a total exposure of ~68.6ks. We combined the two observations and analyzed them as one. We searched for point sources using CELLDETECT, using only the 0.1-2.5keV energy range, excluding regions less than 16 pixels from the detector edges and keeping only sources with signal-to-noise ratio (S/N)>5.0. We find 40 X-ray point sources over the four ACIS-I chips and chip S2 of ACIS-S, which are numbered in order of decreasing S/N in Table 1. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/578/405 Rutledge R.E., Bildsten L., Brown E.F., Pavlov G.G., Zavlin V.E. catalog bibcode 2002ApJ...578..405R 09-Dec-2002 x-ray#radio public ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/714/1424 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/714/1424/table1? ivo://cds.vizier/j/apj/714/1424 4 cs:conesearch Cone search capability for table J/ApJ/714/1424/table1 (Candidates RASS/BSC sources and identifications) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/apj/714/1424 vs:catalogservice 2017-11-06T13:23:26 J/ApJ/714/1424 Isolated neutron stars from Rosat and Swift (Turner+, 2010) 2018-04-05T10:00:00 research Following selection of the isolated neutron star (INS) candidates, short (~1ks) follow-up observations with Swift/XRT were obtained on 92 of the candidates; these observations decrease the X-ray positional uncertainty (the systematic positional error associated with Swift blind pointing observations is on the order of 3.5"), and obtain (where possible) contemporaneous UV observations with Swift/UVOT for counterpart identification with off-band objects. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/714/1424 Turner M.L., Rutledge R.E., Letcavage R., Shevchuk A.S.H., Fox D.B. catalog bibcode 2010ApJ...714.1424T 23-Apr-2012 x-ray#radio public ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/714/1424 5 5 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/714/1424/table2? ivo://cds.vizier/j/apj/714/1424 5 cs:conesearch Cone search capability for table J/ApJ/714/1424/table2 (Objects observed and detected with Swift/XRT) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/apj/714/1424 vs:catalogservice 2017-11-06T13:23:26 J/ApJ/714/1424 Isolated neutron stars from Rosat and Swift (Turner+, 2010) 2018-04-05T10:00:00 research Following selection of the isolated neutron star (INS) candidates, short (~1ks) follow-up observations with Swift/XRT were obtained on 92 of the candidates; these observations decrease the X-ray positional uncertainty (the systematic positional error associated with Swift blind pointing observations is on the order of 3.5"), and obtain (where possible) contemporaneous UV observations with Swift/UVOT for counterpart identification with off-band objects. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/714/1424 Turner M.L., Rutledge R.E., Letcavage R., Shevchuk A.S.H., Fox D.B. catalog bibcode 2010ApJ...714.1424T 23-Apr-2012 x-ray#radio public ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/797/21 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/797/21/table3? ivo://cds.vizier/j/apj/797/21 4 cs:conesearch Cone search capability for table J/ApJ/797/21/table3 (Data for literature stars) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/apj/797/21 vs:catalogservice 2017-08-29T07:03:13 J/ApJ/797/21 Carbon-enhanced metal-poor stars (Placco+, 2014) 2018-04-05T10:00:00 research We revisit the observed frequencies of carbon-enhanced metal-poor (CEMP) stars as a function of the metallicity in the Galaxy, using data from the literature with available high-resolution spectroscopy. Our analysis excludes stars exhibiting clear overabundances of neutron-capture elements and takes into account the expected depletion of surface carbon abundance that occurs due to CN processing on the upper red giant branch. This allows for the recovery of the initial carbon abundance of these stars, and thus for an accurate assessment of the frequencies of carbon-enhanced stars. The correction procedure we develop is based on stellar-evolution models and depends on the surface gravity, log g, of a given star. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/797/21 Placco V.M., Frebel A., Beers T.C., Stancliffe R.J. catalog bibcode 2014ApJ...797...21P 26-Jan-2017 public ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/804/114 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/804/114/sample? ivo://cds.vizier/j/apj/804/114 4 cs:conesearch Cone search capability for table J/ApJ/804/114/sample (Simulated binary neutron-star (BNS) signals of detected events for 2015 scenario using recolored noise (table C1), detections and sky-localization areas (table C2) and accuracy estimations (table C3)) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/apj/804/114 vs:catalogservice 2017-06-22T14:28:22 J/ApJ/804/114 Parameter-estimation performance with LIGO (Berry+, 2015) 2018-04-05T10:00:00 research Advanced ground-based gravitational-wave (GW) detectors begin operation imminently. Their intended goal is not only to make the first direct detection of GWs, but also to make inferences about the source systems. Binary neutron-star mergers are among the most promising sources. We investigate the performance of the parameter-estimation (PE) pipeline that will be used during the first observing run of the Advanced Laser Interferometer Gravitational-wave Observatory (aLIGO) in 2015: we concentrate on the ability to reconstruct the source location on the sky, but also consider the ability to measure masses and the distance. Accurate, rapid sky localization is necessary to alert electromagnetic (EM) observatories so that they can perform follow-up searches for counterpart transient events. We consider PE accuracy in the presence of non-stationary, non-Gaussian noise. We find that the character of the noise makes negligible difference to the PE performance at a given signal-to-noise ratio. The source luminosity distance can only be poorly constrained, since the median 90% (50%) credible interval scaled with respect to the true distance is 0.85 (0.38). However, the chirp mass is well measured. Our chirp-mass estimates are subject to systematic error because we used gravitational-waveform templates without component spin to carry out inference on signals with moderate spins, but the total error is typically less than 10^-3^M_{sun}_. The median 90% (50%) credible region for sky localization is ~600deg^2^ (~150deg^2^), with 3% (30%) of detected events localized within 100deg^2^. Early aLIGO, with only two detectors, will have a sky-localization accuracy for binary neutron stars of hundreds of square degrees; this makes EM follow-up challenging, but not impossible. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/804/114 Berry C.P.L., Mandel I., Middleton H., Singer L.P., Urban A.L., Vecchio A., Vitale S., Cannon K., Farr B., Farr W.M., Graff P.B., Hanna C., Haster C.-J., Mohapatra S., Pankow C., Price L.R., Sidery T., Veitch J. catalog bibcode 2015ApJ...804..114B 26-Aug-2015 optical public ivo://cds.vizier/registry
ivo://cds.vizier/j/apj/829/20 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJ/829/20/table1? ivo://cds.vizier/j/apj/829/20 4 cs:conesearch Cone search capability for table J/ApJ/829/20/table1 (X-Ray point source populations in 343 nearby galaxies) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/apj/829/20 vs:catalogservice 2018-05-16T07:05:17 J/ApJ/829/20 Chandra ACIS survey in nearby galaxies. II (Wang+, 2016) 2018-05-16T07:05:17 research Based on the recently completed Chandra/ACIS survey of X-ray point sources in nearby galaxies, we study the X-ray luminosity functions (XLFs) for X-ray point sources in different types of galaxies and the statistical properties of ultraluminous X-ray sources (ULXs). Uniform procedures are developed to compute the detection threshold, to estimate the foreground/background contamination, and to calculate the XLFs for individual galaxies and groups of galaxies, resulting in an XLF library of 343 galaxies of different types. With the large number of surveyed galaxies, we have studied the XLFs and ULX properties across different host galaxy types, and confirm with good statistics that the XLF slope flattens from lenticular ({alpha}{\sim}1.50{\pm}0.07) to elliptical ({\sim}1.21{\pm}0.02), to spirals ({\sim}0.80{\pm}0.02), to peculiars ({\sim}0.55{\pm}0.30), and to irregulars ({\sim}0.26{\pm}0.10). The XLF break dividing the neutron star and black hole binaries is also confirmed, albeit at quite different break luminosities for different types of galaxies. A radial dependency is found for ellipticals, with a flatter XLF slope for sources located between D_25_ and 2D_25_, suggesting the XLF slopes in the outer region of early-type galaxies are dominated by low-mass X-ray binaries in globular clusters. This study shows that the ULX rate in early-type galaxies is 0.24{\pm}0.05 ULXs per surveyed galaxy, on a 5{sigma} confidence level. The XLF for ULXs in late-type galaxies extends smoothly until it drops abruptly around 4x10^40^erg/s, and this break may suggest a mild boundary between the stellar black hole population possibly including 30M{\sun} black holes with super-Eddington radiation and intermediate mass black holes. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJ/829/20 Wang S., Qiu Y., Liu J., Bregman J.N. catalog bibcode 2016ApJ...829...20W 06-Mar-2018 x-ray public ivo://cds.vizier/registry
ivo://cds.vizier/j/apjs/179/360 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/ApJS/179/360/sources? ivo://cds.vizier/j/apjs/179/360 4 cs:conesearch Cone search capability for table J/ApJS/179/360/sources (Sources list) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/apjs/179/360 vs:catalogservice 2018-01-31T07:09:53 J/ApJS/179/360 Thermonuclear X-ray bursts observed by RXTE (Galloway+, 2008) 2018-04-05T10:00:00 research We present a sample of 1187 thermonuclear (type-I) X-ray bursts from public (archival) observations of 48 low-mass X-ray binaries accreting neutron stars by the Rossi X-ray Timing Explorer, spanning 1996 January - 2007 June 3. For each burst, we list results of analysis of data from the Proportional Counter Array, including observed count rates, time-resolved spectroscopy, evolution of the burst lightcurve, and details of the persistent flux and source spectral state at the time of the burst. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/ApJS/179/360 Galloway D.K., Muno M.P., Hartman J.M., Psaltis D., Chakrabarty D. catalog bibcode 2008ApJS..179..360G 23-Sep-2008 x-ray public ivo://cds.vizier/registry
ivo://cds.vizier/j/azh/81/209 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/AZh/81/209/table1? ivo://cds.vizier/j/azh/81/209 4 cs:conesearch Cone search capability for table J/AZh/81/209/table1 (Stellar parameters of the selected sample and the final [Nd/Fe] ratios) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/azh/81/209 vs:catalogservice 2017-12-22T06:32:10 J/AZh/81/209 Neutron capture elements in stars: neodymium (Mashonkina+, 2004) 2018-04-05T10:00:00 research We determined the neodymium abundances for 60 of the 78 stars studied by Mashonkina et al. (2003A&A...397..275M). We obtained spectroscopic observations of seven stars in April 2001 with the UVES echelle spectrometer mounted on the 8-m VLT2 telescope of the European Southern Observatoryin Chile. These observations cover 3800-4500{AA} and 4750-6650{AA}. Spectroscopic observations of 53 stars at 4100-6700{AA} were obtained in 1995-2001 with the FOCES echelle spectrometer mounted on the 2.2-m telescope of the German-Spanish Astronomical Center in Calar Alto, Spain. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AZh/81/209 Mashonkina L.I., Kamaeva L.A., Samotoev V.A., Sakhibullin N.A. catalog bibcode 2004AZh....81..209M 10-Dec-2004 optical public ivo://cds.vizier/registry
ivo://cds.vizier/j/azh/83/542 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/AZh/83/542/pulsars? ivo://cds.vizier/j/azh/83/542 4 cs:conesearch Cone search capability for table J/AZh/83/542/pulsars (Luminosities of short- and long-period pulsars) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/azh/83/542 vs:catalogservice 2018-01-05T09:56:22 J/AZh/83/542 Integrated Radio Luminosities of Pulsars (Malov+, 2006) 2018-04-05T10:00:00 research The integrated radio luminosities of 311 long-period (P>0.1s) and 27 short-period (P<0.1s) pulsars have been calculated using a new compilation of radio spectra. The luminosities are in the range 10^27^-10^30^erg/s for 88% of the long-period pulsars and 10^28^-10^31^erg/s for 88% of the short-period pulsars. We find a high correlation between the luminosity L and the estimate L1=S_(400)_*d^2^ from the catalog of Taylor et al. (1993, See Cat. <VII/189>. The factor 'eta' for transformation of the rotational energy of the neutron star into radio emission increases/decreases with increasing period for long-period/short-period pulsars. The mean value of 'eta'=-3.73 for the long-period and -4.85 for the short-period pulsars. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AZh/83/542 Malov I.F., Malov O.I. catalog bibcode 2006AZh...83...542M 01-Jul-2007 radio public ivo://cds.vizier/registry
ivo://cds.vizier/j/azh/88/22 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/AZh/88/22/pulsars? ivo://cds.vizier/j/azh/88/22 4 cs:conesearch Cone search capability for table J/AZh/88/22/pulsars (Pulsars studied: initial parameters and calculated {beta} angles) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/azh/88/22 vs:catalogservice 2017-07-05T07:00:11 J/AZh/88/22 Angles rotation/magnetic moment in pulsars (Malov+, 2011) 2018-04-05T10:00:00 research Data on the pulse structure and variations of the linear polarization angle at frequencies near 1GHz have been used to estimate the angles {beta} between the rotational axis and magnetic moment of the neutron stars associated with 80 pulsars. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AZh/88/22 Malov I.F., Nikitina E.B. catalog bibcode 2011AZh....88...22M 27-Jan-2011 radio public ivo://cds.vizier/registry
ivo://cds.vizier/j/azh/88/954 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/AZh/88/954/table1? ivo://cds.vizier/j/azh/88/954 4 cs:conesearch Cone search capability for table J/AZh/88/954/table1 (*Calculated values of {beta}1 for 10cm and 20cm) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/azh/88/954 vs:catalogservice 2017-10-18T08:24:25 J/AZh/88/954 Geometry of radio pulsar magnetospheres (Malov+, 2011) 2018-04-05T10:00:00 research Data on the profiles and polarization of the 10- and 20-cm emission of radio pulsars are used to calculate the angle {beta} between the rotational axis of the neutron star and its magnetic moment. It is shown that, for these calculations, it is sufficient to use catalog values of the pulse width at the 10% level W10, since the broadening of the observed pulses due to the transition to the full width W0 and narrowing of the pulses associated with the emission of radiation along tangents to the field lines approximately cancel each other out. The angles {beta}1 are calculated for 283 pulsars at 20cm and 132 pulsars at 10cm, assuming that the line of sight passes through the center of the emission cone. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/AZh/88/954 Malov I.F., Nikitina E.B. catalog bibcode 2011AZh....88..954M 14-Nov-2011 optical#radio public ivo://cds.vizier/registry
ivo://cds.vizier/j/mnras/287/293 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/MNRAS/287/293/table1? ivo://cds.vizier/j/mnras/287/293 4 cs:conesearch Cone search capability for table J/MNRAS/287/293/table1 (Unidentified EUV sources) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/mnras/287/293 vs:catalogservice 1998-02-08T13:48:38 J/MNRAS/287/293 BR photometry of EUVE sources (Maoz+ 1997) 2018-04-05T10:00:00 research Most of the sources detected in the extreme ultraviolet (EUV; 100-600{AA}) by the ROSAT/WFC and EUVE all-sky surveys have been identified with active late-type stars and hot white dwarfs that are near enough to the Earth to escape absorption by interstellar gas. However, about 15 per cent of EUV sources are as yet unidentified with any optical counterparts. We examine whether the unidentified EUV sources may consist of the same population of late-type stars and white dwarfs. We present B and R photometry of stars in the fields of seven of the unidentified EUV sources. We detect in the optical the entire main-sequence and white dwarf population out to the greatest distances where they could still avoid absorption. We use colour-magnitude diagrams to demonstrate that, in most of the fields, none of the observed stars has the colours and magnitudes of late-type dwarfs at distances less than 100pc. Similarly, none of the observed stars is a white dwarf within 500pc that is hot enough to be a EUV emitter. The unidentified EUV sources we study are not detected in X-rays, while cataclysmic variables, X-ray binaries, and active galactic nuclei generally are. We conclude that some of the EUV sources may be a new class of nearby objects, which are either very faint at optical bands or which mimic the colours and magnitudes of distant late-type stars or cool white dwarfs. One candidate for optically faint objects is isolated old neutron stars, slowly accreting interstellar matter. Such neutron stars are expected to be abundant in the Galaxy, and have not been unambiguously detected. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/MNRAS/287/293 Maoz D., Ofek E.O., Shemi A. catalog bibcode 1997MNRAS.287..293M 24-Oct-1997 x-ray#uv public ivo://cds.vizier/registry
ivo://cds.vizier/j/mnras/342/1299 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/MNRAS/342/1299/table1? ivo://cds.vizier/j/mnras/342/1299 4 cs:conesearch Cone search capability for table J/MNRAS/342/1299/table1 (*Positions, flux densities and widths for 200 pulsars discovered in the Parkes Multibeam Pulsar Survey (PMPS)) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/mnras/342/1299 vs:catalogservice 2017-06-14T07:31:14 J/MNRAS/342/1299 Parkes Multi-Beam Pulsar Survey. III. (Kramer+, 2003) 2018-04-05T10:00:00 research The Parkes Multibeam Pulsar Survey has unlocked vast areas of the Galactic plane, which were previously invisible to earlier low-frequency and less-sensitive surveys. The survey has discovered more than 600 new pulsars so far, including many that are young and exotic. In this paper we report the discovery of 200 pulsars for which we present positional and spin-down parameters, dispersion measures, flux densities and pulse profiles. A large number of these new pulsars are young and energetic, and we review possible associations of {gamma}-ray sources with the sample of about 1300 pulsars for which timing solutions are known. Based on a statistical analysis, we estimate that about 19+/-6 associations are genuine. The survey has also discovered 12 pulsars with spin properties similar to those of the Vela pulsar, nearly doubling the known population of such neutron stars. Studying the properties of all known 'Vela-like' pulsars, we find their radio luminosities to be similar to normal pulsars, implying that they are very inefficient radio sources. Finally, we review the use of the newly discovered pulsars as Galactic probes and discuss the implications of the new NE2001 Galactic electron density model for the determination of pulsar distances and luminosities. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/MNRAS/342/1299 Kramer M., Bell J.F., Manchester R.N., Lyne A.G., Camilo F., Stairs I.H., D'Amico N., Kaspi V.M., Hobbs G., Morris D.J., Crawford F., Possenti A., Joshi B.C., McLaughlin M.A., Lorimer D.R., Faulkner A.J. catalog bibcode 2003MNRAS.342.1299K 12-Sep-2003 gamma-ray#radio public ivo://cds.vizier/registry
ivo://cds.vizier/j/mnras/402/2369 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/MNRAS/402/2369/assoc? ivo://cds.vizier/j/mnras/402/2369 4 cs:conesearch Cone search capability for table J/MNRAS/402/2369/assoc (Positional and kinematical data for OB associations and clusters (table A1 in the paper)) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/mnras/402/2369 vs:catalogservice 2015-02-06T11:52:18 J/MNRAS/402/2369 Kinematics of young associations/clusters (Tetzlaff+, 2010) 2018-04-05T10:00:00 research Given a distance of 1kpc and typical neutron star velocities of 100-500km/s (Arzoumanian et al. 2002ApJ...568..289A; Hobbs et al., 2005, Cat. J/MNRAS/360/974) and maximum ages of 5Myr for neutron stars to be detectable in the optical (see cooling curves in Gusakov et al. 2005MNRAS.363..555G and Popov, Grigorian & Blaschke 2006, Phys. Rev. C, 74, 025803), we restricted our search for birth associations and clusters of young nearby neutron stars to within 3kpc. We chose a sample of OB associations and young clusters (we use the term `association' for both in the following) within 3kpc from the Sun with available kinematic data and distance. We collected those from Dambis, Mel'nik & Rastorguev (2001AstL...27...58D) and Hoogerwerf (2001A&A...365...49H) and associations to which stars from the Galactic O-star catalogue from Maiz-Apellaniz et al. (2004, Cat. J/ApJS/151/103) are associated with. Furthermore, we added young local associations (YLA) from Fernandez, Figueras & Torra (2008A&A...480..735F) since they are possible hosts of a few SNe in the near past. We also included the Hercules-Lyrae association (Her-Lyr) and the Pleiades and massive star-forming regions (Reipurth 2008, ASP Monograph Publ. Vol. 4 and Vol. 5). We set the lower limit of the association age to 2Myr to account for the minimum lifetime of a progenitor star that can produce a neutron star (progenitor mass smaller than 30M_{sun}_ see e.g. Heger et al. 2003ApJ...591..288H). The list of all explored associations and their properties can be found in Appendix A. Coordinates as well as heliocentric velocity components are given for a right-handed coordinate system with the x-axis pointing towards the galactic centre and y is positive in the direction of galactic rotation. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/MNRAS/402/2369 Tetzlaff N., Neuhaeuser R., Hohle M.M., Maciejewski G. catalog bibcode 2010MNRAS.402.2369T 09-Mar-2010 radio public ivo://cds.vizier/registry
ivo://cds.vizier/j/mnras/419/2095 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/MNRAS/419/2095/hmxb? ivo://cds.vizier/j/mnras/419/2095 4 cs:conesearch Cone search capability for table J/MNRAS/419/2095/hmxb (High-mass X-ray binaries Catalogue) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/mnras/419/2095 vs:catalogservice 2017-11-28T14:21:30 J/MNRAS/419/2095 HMXBs in nearby galaxies (Mineo+, 2012) 2018-04-05T10:00:00 research Based on a homogeneous set of X-ray, infrared and ultraviolet observations from Chandra, Spitzer, GALEX and 2MASS archives, we study populations of high-mass X-ray binaries (HMXBs) in a sample of 29 nearby star-forming galaxies and their relation with the star formation rate (SFR). In agreement with previous results, we find that HMXBs are a good tracer of the recent star formation activity in the host galaxy and their collective luminosity and number scale with the SFR, in particular, LX~~2.6x10^39^SFR. However, the scaling relations still bear a rather large dispersion of rms~0.4dex, which we believe is of a physical origin. We present the catalog of 1057 X-ray sources detected within the D25 ellipse for galaxies of our sample and construct the average X-ray luminosity function (XLF) of HMXBs with substantially improved statistical accuracy and better control of systematic effects than achieved in previous studies. The XLF follows a power law with slope of 1.6 in the log(LX)~35-40 luminosity range with a moderately significant evidence for a break or cut-off at LX~10^40^erg/s. As before, we did not find any features at the Eddington limit for a neutron star or a stellar mass black hole. We discuss implications of our results for the theory of binary evolution. In particular we estimate the fraction of compact objects that once upon their lifetime experienced an X-ray active phase powered by accretion from a high mass companion and obtain a rather large number, fX~0.2x(0.1Myr/{tau}x) ({tau}x is the life time of the X-ray active phase). This is about 4 orders of magnitude more frequent than in LMXBs. We also derive constrains on the mass distribution of the secondary star in HMXBs. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/MNRAS/419/2095 Mineo S., Gilfanov M., Sunyaev R. catalog bibcode 2012MNRAS.419.2095M 26-Sep-2011 optical public ivo://cds.vizier/registry
ivo://cds.vizier/j/other/sci/292.2290 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/J/other/Sci/292.2290/table1? ivo://cds.vizier/j/other/sci/292.2290 4 cs:conesearch Cone search capability for table J/other/Sci/292.2290/table1 (47 Tuc X-Ray Source Parameters (MS 61135)) ivo://ivoa.net/std/conesearch ivo://cds.vizier/j/other/sci/292.2290 vs:catalogservice 2003-11-11T20:38:15 J/other/Sci/292. Chandra compact binaries in 47 Tuc (Grindlay+, 2001) 2018-04-05T10:00:00 research We have obtained high-resolution (<~1") deep X-ray images of the globular cluster 47 Tucanae (NGC 104) with the Chandra X-ray Observatory to study the population of compact binaries in the high stellar density core. A 70-kilosecond exposure of the cluster reveals a centrally concentrated population of faint (L_X_~10^30-33^ergs/s) X-ray sources, with at least 108 located within the central 2'x2.5' and >~half with L_X_<~10^30.5^ergs/s. All 15 millisecond pulsars (MSPs) recently located precisely by radio observations are identified, though 2 are unresolved by Chandra. The X-ray spectral and temporal characteristics, as well as initial optical identifications with the Hubble Space Telescope, suggest that >~50 percent are MSPs, about 30 percent are accreting white dwarfs, about 15 percent are main-sequence binaries in flare outbursts, and only two to three are quiescent low-mass X-ray binaries containing neutron stars, the conventional progenitors of MSPs. An upper limit of about 470 times the mass of the sun is derived for the mass of an accreting central black hole in the cluster. These observations provide the first X-ray ``color-magnitude'' diagram for a globular cluster and census of its compact object and binary population. Observations were made on UT 16.31 - 17.22 March, 2000. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?J/other/Sci/292.2290 Grindlay J.E., Heinke C., Edmonds P.D., Murray S.S. catalog bibcode 2001Sci...292.2290G 31-Jan-2002 x-ray public ivo://cds.vizier/registry
ivo://cds.vizier/v/113d 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/V/113D/cbdata? ivo://cds.vizier/v/113d 4 cs:conesearch Cone search capability for table V/113D/cbdata (Catalogue of Cataclysmic Binaries) ivo://ivoa.net/std/conesearch ivo://cds.vizier/v/113d vs:catalogservice 2018-01-05T09:56:04 V/113D Cataclysmic Binaries, LMXBs, and related objects (Ritter+, 2003) 2018-04-05T10:00:00 research Cataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 572 cataclysmic binaries, 80 low-mass X-ray binaries and 142 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 761 of the 794 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 31 December 2004 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated lists by Ritter and Kolb (1995; catalogue <V/82>) (1998; catalogue <V/99>). http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/113D Ritter H., Kolb U. catalog bibcode 2003A&A...404..301R 24-Mar-2005 optical public ivo://cds.vizier/registry
ivo://cds.vizier/v/113d 5 5 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/V/113D/lmxbdata? ivo://cds.vizier/v/113d 5 cs:conesearch Cone search capability for table V/113D/lmxbdata (Catalogue of Low-Mass X-Ray Binaries) ivo://ivoa.net/std/conesearch ivo://cds.vizier/v/113d vs:catalogservice 2018-01-05T09:56:04 V/113D Cataclysmic Binaries, LMXBs, and related objects (Ritter+, 2003) 2018-04-05T10:00:00 research Cataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 572 cataclysmic binaries, 80 low-mass X-ray binaries and 142 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 761 of the 794 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 31 December 2004 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated lists by Ritter and Kolb (1995; catalogue <V/82>) (1998; catalogue <V/99>). http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/113D Ritter H., Kolb U. catalog bibcode 2003A&A...404..301R 24-Mar-2005 optical public ivo://cds.vizier/registry
ivo://cds.vizier/v/113d 6 6 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/V/113D/pcbdata? ivo://cds.vizier/v/113d 6 cs:conesearch Cone search capability for table V/113D/pcbdata (Catalogue of Related Objects) ivo://ivoa.net/std/conesearch ivo://cds.vizier/v/113d vs:catalogservice 2018-01-05T09:56:04 V/113D Cataclysmic Binaries, LMXBs, and related objects (Ritter+, 2003) 2018-04-05T10:00:00 research Cataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 572 cataclysmic binaries, 80 low-mass X-ray binaries and 142 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 761 of the 794 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 31 December 2004 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated lists by Ritter and Kolb (1995; catalogue <V/82>) (1998; catalogue <V/99>). http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/113D Ritter H., Kolb U. catalog bibcode 2003A&A...404..301R 24-Mar-2005 optical public ivo://cds.vizier/registry
ivo://cds.vizier/v/90 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/V/90/table1? ivo://cds.vizier/v/90 4 cs:conesearch Cone search capability for table V/90/table1 (Low mass X-ray binaries (LMXB)) ivo://ivoa.net/std/conesearch ivo://cds.vizier/v/90 vs:catalogservice 2013-03-06T07:14:45 V/90 Catalogue of X-Ray Binaries (van Paradijs 1995) 2018-04-05T10:00:00 research The objects described in this catalog are X-Ray binaries, i.e., semi-detached binary stars in which matter is transferred from a usually more or less normal star to a neutron star or black hole. Thus, cataclysmic variables are not included. The tables provide basic information of the systems as well as selected references. The tables contain 124 low-mass and 69 high mass X-ray binaries. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/90 van Paradijs J. catalog bibcode 09-Jan-1997 x-ray public ivo://cds.vizier/registry
ivo://cds.vizier/v/90 5 5 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/V/90/table2? ivo://cds.vizier/v/90 5 cs:conesearch Cone search capability for table V/90/table2 (High mass X-ray binaries (HMXB)) ivo://ivoa.net/std/conesearch ivo://cds.vizier/v/90 vs:catalogservice 2013-03-06T07:14:45 V/90 Catalogue of X-Ray Binaries (van Paradijs 1995) 2018-04-05T10:00:00 research The objects described in this catalog are X-Ray binaries, i.e., semi-detached binary stars in which matter is transferred from a usually more or less normal star to a neutron star or black hole. Thus, cataclysmic variables are not included. The tables provide basic information of the systems as well as selected references. The tables contain 124 low-mass and 69 high mass X-ray binaries. http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/90 van Paradijs J. catalog bibcode 09-Jan-1997 x-ray public ivo://cds.vizier/registry
ivo://cds.vizier/v/99 4 4 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/V/99/cbdata? ivo://cds.vizier/v/99 4 cs:conesearch Cone search capability for table V/99/cbdata (Catalogue of Cataclysmic Binaries) ivo://ivoa.net/std/conesearch ivo://cds.vizier/v/99 vs:catalogservice 2003-06-08T16:50:32 V/99 Cataclysmic Binaries and LMXB Catalogue (Ritter+ 1998) 2018-04-05T10:00:00 research Cataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 318 cataclysmic binaries, 47 low-mass X-ray binaries and 49 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 394 of the 414 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 30 June 1997 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated list by Ritter and Kolb (1995; catalogue <V/82>). http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/99 Ritter H., Kolb U. catalog bibcode 1998A&AS..129...83R 16-Dec-1997 optical public ivo://cds.vizier/registry
ivo://cds.vizier/v/99 5 5 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/V/99/lmxbdata? ivo://cds.vizier/v/99 5 cs:conesearch Cone search capability for table V/99/lmxbdata (Catalogue of Low-Mass X-Ray Binaries) ivo://ivoa.net/std/conesearch ivo://cds.vizier/v/99 vs:catalogservice 2003-06-08T16:50:32 V/99 Cataclysmic Binaries and LMXB Catalogue (Ritter+ 1998) 2018-04-05T10:00:00 research Cataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 318 cataclysmic binaries, 47 low-mass X-ray binaries and 49 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 394 of the 414 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 30 June 1997 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated list by Ritter and Kolb (1995; catalogue <V/82>). http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/99 Ritter H., Kolb U. catalog bibcode 1998A&AS..129...83R 16-Dec-1997 optical public ivo://cds.vizier/registry
ivo://cds.vizier/v/99 6 6 vs:paramhttp std get text/xml+votable base http://vizier.u-strasbg.fr/viz-bin/conesearch/V/99/pcbdata? ivo://cds.vizier/v/99 6 cs:conesearch Cone search capability for table V/99/pcbdata (Catalogue of Related Objects) ivo://ivoa.net/std/conesearch ivo://cds.vizier/v/99 vs:catalogservice 2003-06-08T16:50:32 V/99 Cataclysmic Binaries and LMXB Catalogue (Ritter+ 1998) 2018-04-05T10:00:00 research Cataclysmic Binaries are semi-detached binaries consisting of a white dwarf or a white dwarf precursor primary and a low-mass secondary which is filling its critical Roche lobe. The secondary is not necessarily unevolved, it may even be a highly evolved star as for example in the case of the AM CVn-type stars. Low-Mass X-Ray Binaries are semi-detached binaries consisting of either a neutron star or a black hole primary, and a low-mass secondary which is filling its critical Roche lobe. Related Objects are detached binaries consisting of either a white dwarf or a white dwarf precursor primary and of a low-mass secondary. The secondary may also be a highly evolved star. The catalogue lists coordinates, apparent magnitudes, orbital parameters, stellar parameters of the components and other characteristic properties of 318 cataclysmic binaries, 47 low-mass X-ray binaries and 49 related objects with known or suspected orbital periods together with a comprehensive selection of the relevant recent literature. In addition the catalogue contains a list of references to published finding charts for 394 of the 414 objects. A cross-reference list of alias object designations concludes the catalogue. Literature published before 30 June 1997 has, as far as possible, been taken into account. This catalogue supersedes the 5th edition (catalogue <V/59>) and the updated list by Ritter and Kolb (1995; catalogue <V/82>). http://cdsarc.u-strasbg.fr/cgi-bin/Cat?V/99 Ritter H., Kolb U. catalog bibcode 1998A&AS..129...83R 16-Dec-1997 optical public ivo://cds.vizier/registry
ivo://nasa.heasarc/rasscndins 1 1 vs:paramhttp std get text/xml base https://heasarc.gsfc.nasa.gov/cgi-bin/vo/cone/coneGet.pl?table=rasscndins& ivo://nasa.heasarc/rasscndins 1 cs:conesearch ivo://ivoa.net/std/conesearch ivo://nasa.heasarc/rasscndins vs:catalogservice 2018-09-11T00:00:00 RASSCNDINS ROSAT All-Sky Survey Candidate Isolated Neutron Stars 2018-09-11T00:00:00 research No Description Available https://heasarc.gsfc.nasa.gov/W3Browse/all/rasscndins.html Turner et al. catalog 2010ApJ...714.1424T optical ivo://nasa.heasarc/registry
pyvo-1.2.1/pyvo/registry/tests/setup_package.py000066400000000000000000000002721416757633600217270ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst import os def get_package_data(): paths = [os.path.join('data', '*.xml')] return {'pyvo.registry.tests': paths} pyvo-1.2.1/pyvo/registry/tests/test_regtap.py000066400000000000000000000134711416757633600214420ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.dal.query """ from functools import partial from urllib.parse import parse_qsl import pytest from pyvo.registry import search as regsearch from pyvo.dal import query as dalq from astropy.utils.data import get_pkg_data_contents get_pkg_data_contents = partial( get_pkg_data_contents, package=__package__, encoding='binary') @pytest.fixture() def capabilities(mocker): def callback(request, context): return get_pkg_data_contents('data/capabilities.xml') with mocker.register_uri( 'GET', 'http://dc.g-vo.org/tap/capabilities', content=callback ) as matcher: yield matcher @pytest.fixture() def keywords_fixture(mocker): def keywordstest_callback(request, context): data = dict(parse_qsl(request.body)) query = data['QUERY'] assert "WHERE isub0.res_subject ILIKE '%vizier%'" in query assert "WHERE 1=ivo_hasword(ires0.res_description, 'vizier')" in query assert "OR 1=ivo_hasword(ires0.res_title, 'vizier')" in query assert "WHERE isub1.res_subject ILIKE '%pulsar%'" in query assert "WHERE 1=ivo_hasword(ires1.res_description, 'pulsar')" in query assert "OR 1=ivo_hasword(ires1.res_title, 'pulsar')" in query assert "'ivo://ivoa.net/std/conesearch'" in query assert "'ivo://ivoa.net/std/sia'" in query assert "'ivo://ivoa.net/std/ssa'" in query assert "'ivo://ivoa.net/std/slap'" in query assert "'ivo://ivoa.net/std/tap'" in query return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( 'POST', 'http://dc.g-vo.org/tap/sync', content=keywordstest_callback ) as matcher: yield matcher @pytest.fixture() def single_keyword_fixture(mocker): def keywordstest_callback(request, context): data = dict(parse_qsl(request.body)) query = data['QUERY'] assert "WHERE isub0.res_subject ILIKE '%single%'" in query assert "WHERE 1=ivo_hasword(ires0.res_description, 'single')" in query assert "OR 1=ivo_hasword(ires0.res_title, 'single')" in query assert "'ivo://ivoa.net/std/conesearch'" in query assert "'ivo://ivoa.net/std/sia'" in query assert "'ivo://ivoa.net/std/ssa'" in query assert "'ivo://ivoa.net/std/slap'" in query assert "'ivo://ivoa.net/std/tap'" in query return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( 'POST', 'http://dc.g-vo.org/tap/sync', content=keywordstest_callback ) as matcher: yield matcher @pytest.fixture() def servicetype_fixture(mocker): def servicetypetest_callback(request, context): data = dict(parse_qsl(request.body)) query = data['QUERY'] assert "'ivo://ivoa.net/std/conesearch'" not in query assert "'ivo://ivoa.net/std/sia'" not in query assert "'ivo://ivoa.net/std/ssa'" not in query assert "'ivo://ivoa.net/std/slap'" not in query assert "'ivo://ivoa.net/std/tap'" in query return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( 'POST', 'http://dc.g-vo.org/tap/sync', content=servicetypetest_callback ) as matcher: yield matcher @pytest.fixture() def waveband_fixture(mocker): def wavebandtest_callback(request, content): data = dict(parse_qsl(request.body)) query = data['QUERY'] assert "1 = ivo_hashlist_has(rr.resource.waveband, 'optical'" in query return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( 'POST', 'http://dc.g-vo.org/tap/sync', content=wavebandtest_callback ) as matcher: yield matcher @pytest.fixture() def datamodel_fixture(mocker): def datamodeltest_callback(request, content): data = dict(parse_qsl(request.body)) query = data['QUERY'] assert ( "WHERE idet.detail_xpath = '/capability/dataModel/@ivo-id" in query ) assert "idet.detail_value, 'ivo://ivoa.net/std/tap%')" in query return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( 'POST', 'http://dc.g-vo.org/tap/sync', content=datamodeltest_callback ) as matcher: yield matcher @pytest.fixture() def aux_fixture(mocker): def auxtest_callback(request, context): data = dict(parse_qsl(request.body)) query = data['QUERY'] assert "ivo://ivoa.net/std/tap#aux" in query return get_pkg_data_contents('data/regtap.xml') with mocker.register_uri( 'POST', 'http://dc.g-vo.org/tap/sync', content=auxtest_callback ) as matcher: yield matcher @pytest.mark.usefixtures('keywords_fixture', 'capabilities') def test_keywords(): regsearch(keywords=['vizier', 'pulsar']) @pytest.mark.usefixtures('single_keyword_fixture', 'capabilities') def test_single_keyword(): regsearch(keywords=['single']) regsearch(keywords='single') @pytest.mark.usefixtures('servicetype_fixture', 'capabilities') def test_servicetype(): regsearch(servicetype='table') @pytest.mark.usefixtures('waveband_fixture', 'capabilities') def test_waveband(): regsearch(waveband='optical') @pytest.mark.usefixtures('datamodel_fixture', 'capabilities') def test_datamodel(): regsearch(datamodel='tap') @pytest.mark.usefixtures('aux_fixture', 'capabilities') def test_servicetype_aux(): regsearch(servicetype='table', includeaux=True) @pytest.mark.usefixtures('aux_fixture', 'capabilities') def test_keyword_aux(): regsearch(keywords=['pulsar'], includeaux=True) @pytest.mark.usefixtures('aux_fixture', 'capabilities') def test_bad_servicetype_aux(): with pytest.raises(dalq.DALQueryError): regsearch(servicetype='bad_servicetype', includeaux=True) pyvo-1.2.1/pyvo/samp.py000066400000000000000000000066731416757633600150550ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ A module with helpers for broadcasting results to samp clients """ import contextlib import os import tempfile try: from astropy.samp import SAMPIntegratedClient except ImportError: from astropy.vo.samp import SAMPIntegratedClient __all__ = [ 'find_client_id', 'send_table_to', 'send_product_to', 'send_spectrum_to', 'send_image_to', 'accessible_table', 'connection'] def find_client_id(conn, name): """returns the SAMP id of the client with samp.name samp_name. This will raise a KeyError if the client is not on the hub. """ for client_id in conn.get_registered_clients(): if conn.get_metadata(client_id).get("samp.name") == name: return client_id raise KeyError(name) def send_table_to(conn, table, client_name=None, name="data"): """ sends astropy_table via SAMP. """ with accessible_table(table) as url: message = { "samp.mtype": "table.load.votable", "samp.params": { "url": url, "name": name, }, } if client_name is None: for client_id in conn.get_registered_clients(): conn.call_and_wait(client_id, message, "10") else: client_id = find_client_id(conn, client_name) conn.call_and_wait(client_id, message, "10") def send_product_to(conn, url, mtype, client_name=None, name="data"): """ sends SAMP messages to load data. This is a helper for send_spectrum_to and send_image_to, which work exactly analogous to each other, except that the mtypes are different. If dest_client_id, this is a broadcast (and we don't wait for any responses). If dest_client_id is given, we wait for acknowledgement by the receiver. """ message = { "samp.mtype": mtype, "samp.params": { "url": url, "name": name, }, } if client_name is None: conn.notify_all(message) else: client_id = find_client_id(conn, client_name) conn.notify(client_id, message) def send_spectrum_to(conn, url, client_name=None, name="data"): """ asks a spectrum client to open a remote spectrum via SAMP. """ send_product_to( conn, url, "spectrum.load.ssa-generic", client_name=client_name, name=name) def send_image_to(conn, url, client_name=None, name="data"): """ asks an image client to open a remote image via SAMP. """ send_product_to( conn, url, "image.load.fits", client_name=client_name, name=name) @contextlib.contextmanager def accessible_table(table): """ a context manager making astropy_table available under a (file) URL for the controlled section. """ handle, f_name = tempfile.mkstemp(suffix=".xml") with open(handle, "w") as f: table.write(output=f, format="votable") try: yield "file://" + f_name finally: os.unlink(f_name) @contextlib.contextmanager def connection( client_name="pyvo client", description="A generic PyVO client", **kwargs ): """ a context manager to give the controlled block a SAMP connection. The program will disconnect as the controlled block is exited. """ client = SAMPIntegratedClient( name=client_name, description=description, **kwargs) client.connect() try: yield client finally: client.disconnect() pyvo-1.2.1/pyvo/tests/000077500000000000000000000000001416757633600146715ustar00rootroot00000000000000pyvo-1.2.1/pyvo/tests/__init__.py000066400000000000000000000001001416757633600167710ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst pyvo-1.2.1/pyvo/tests/coveragerc000066400000000000000000000014001416757633600167270ustar00rootroot00000000000000[run] source = {packagename} omit = {packagename}/_astropy_init* {packagename}/conftest* {packagename}/cython_version* {packagename}/setup_package* {packagename}/*/setup_package* {packagename}/*/*/setup_package* {packagename}/tests/* {packagename}/*/tests/* {packagename}/*/*/tests/* {packagename}/version* [report] exclude_lines = # Have to re-enable the standard pragma pragma: no cover # Don't complain about packages we have installed except ImportError # Don't complain if tests don't hit assertions raise AssertionError raise NotImplementedError # Don't complain about script hooks def main\(.*\): # Ignore branches that don't pertain to this version of Python pragma: py{ignore_python_version}pyvo-1.2.1/pyvo/tests/setup_package.py000066400000000000000000000001401416757633600200510ustar00rootroot00000000000000def get_package_data(): return { _ASTROPY_PACKAGE_NAME_ + '.tests': ['coveragerc']} pyvo-1.2.1/pyvo/utils/000077500000000000000000000000001416757633600146675ustar00rootroot00000000000000pyvo-1.2.1/pyvo/utils/__init__.py000066400000000000000000000000261416757633600167760ustar00rootroot00000000000000from .compat import * pyvo-1.2.1/pyvo/utils/compat.py000066400000000000000000000004051416757633600165230ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Placeholder for compatibility constructs """ from distutils.version import LooseVersion import astropy __all__ = ['ASTROPY_LT_4_1'] ASTROPY_LT_4_1 = LooseVersion(astropy.__version__) < '4.1' pyvo-1.2.1/pyvo/utils/decorators.py000066400000000000000000000010721416757633600174060ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from functools import partial, wraps def stream_decode_content(func): @wraps(func) def wrapper(*args, **kwargs): raw = func(*args, **kwargs) raw.read = partial(raw.read, decode_content=True) return raw return wrapper def response_decode_content(func): @wraps(func) def wrapper(*args, **kwargs): response = func(*args, **kwargs) response.raw.read = partial(response.raw.read, decode_content=True) return response return wrapper pyvo-1.2.1/pyvo/utils/formatting.py000066400000000000000000000035361416757633600174220ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ A collection of routines to format metadata """ import re from itertools import chain import textwrap _parasp = re.compile(r"(?:[ \t\r\f\v]*\n){2,}[ \t\r\f\v]*") _ptag = re.compile(r"\s*(?:)|(?:\\para(?:\\ )*)\s*") def para_format_desc(text, width=78): """ format description text into paragraphs suiteable for display in the shell. That is, the output will be one or more plain text paragraphs of the prescribed width (78 characters, the default). The text will be split into separate paragraphs whwre there occurs (1) a two or more consecutive carriage return, (2) an HTMS paragraph tag, or (2) a LaTeX parabraph control sequence. It will attempt other substitutions of HTML and LaTeX markup that sometimes find their way into resource descriptions. """ paras = _parasp.split(text) paras = filter( bool, chain.from_iterable(_ptag.split(para) for para in paras)) paras = ("\n".join( map(lambda l: l.strip(), para.splitlines()) ) for para in paras) paras = map(deref_markup, paras) return "\n\n".join(textwrap.fill(para, width) for para in paras) _musubs = [ (re.compile(r"<"), "<"), (re.compile(r">"), ">"), (re.compile(r"&"), "&"), (re.compile(r""), ''), (re.compile(r"

"), ''), (re.compile(r"°"), " deg"), (re.compile(r"\$((?:[^\$]*[\*\+=/^_~><\\][^\$]*)|(?:\w+))\$"), r'\1'), (re.compile(r"\\deg"), " deg"), ] _alink = re.compile(r'''\s*(\S.*\S)\s*''') def deref_markup(text): """ perform some substitutions of common markup suitable for text display. This includes HTML escape sequence """ for pat, repl in _musubs: text = pat.sub(repl, text) text = _alink.sub(r"\3 <\2>", text) return text pyvo-1.2.1/pyvo/utils/http.py000066400000000000000000000011571416757633600162240ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ HTTP utils """ import requests from ..version import version DEFAULT_USER_AGENT = 'python-pyvo/{}'.format(version) def use_session(session): """ Return the session passed in, or create a default session to use for this network request. """ if session: return session else: return create_session() def create_session(): """ Create a new empty requests session with a pyvo user agent. """ session = requests.Session() session.headers['User-Agent'] = DEFAULT_USER_AGENT return session pyvo-1.2.1/pyvo/utils/tests/000077500000000000000000000000001416757633600160315ustar00rootroot00000000000000pyvo-1.2.1/pyvo/utils/tests/__init__.py000066400000000000000000000001001416757633600201310ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst pyvo-1.2.1/pyvo/utils/tests/test_url.py000066400000000000000000000004651416757633600202510ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.utils.url """ from pyvo.utils.url import url_sibling def test_url(): url = "http://example.org/tap/capabilities" siblingified = url_sibling(url, "tables") assert siblingified == "http://example.org/tap/tables" pyvo-1.2.1/pyvo/utils/tests/test_vocabularies_remote.py000066400000000000000000000035271416757633600235030ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ Tests for pyvo.utils.vocabularies It's hard to write meaningful tests for those that don't require network connectivity because essentially it's all just wrapping downloads. Hence, I'm just giving in rather than bother with a mock server. """ import os import time import pytest from astropy.utils import data from pyvo.utils import vocabularies @pytest.mark.remote_data class TestVocabularies: def test_basic_getting(self): voc = vocabularies.get_vocabulary("datalink/core") assert "progenitor" in voc["terms"] assert data.is_url_in_cache("http://www.ivoa.net/rdf/datalink/core") def test_label_getting(self): voc = vocabularies.get_vocabulary("datalink/core") assert (vocabularies.get_label(voc, "coderived") == "Coderived Data") def test_label_getting_default(self): voc = vocabularies.get_vocabulary("datalink/core") assert vocabularies.get_label(voc, "oov", "Missing") == "Missing" def test_refreshing(self): voc = vocabularies.get_vocabulary("datalink/core", force_update=True) # first make sure that things didn't break assert "progenitor" in voc["terms"] # now guess that a download has actually happened; we don't want # to reflect cache name generation here, so we just check if there's # a recent download in the cache directory dldir = data._get_download_cache_loc() with os.scandir(dldir) as entries: last_change = 0 for entry in entries: last_change = max(last_change, entry.stat().st_mtime) assert time.time()-last_change<2 def test_non_existing_voc(self): with pytest.raises(vocabularies.VocabularyError): vocabularies.get_vocabulary("not_an_ivoa_vocabulary") pyvo-1.2.1/pyvo/utils/url.py000066400000000000000000000012011416757633600160350ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst """ URL utils """ from urllib.parse import urlparse, urlunparse from posixpath import split as pathsplit, join as pathjoin def url_sibling(url, sibling): """ Replaces the last path element in an url Parameters ---------- url : str The url for which the last path element should be replaced sibling : str The replace value """ parsed = urlparse(url) newpath_segments = pathsplit(parsed.path)[:-1] + (sibling,) newpath = pathjoin(*newpath_segments) return urlunparse(list(parsed[:2]) + [newpath] + list(parsed[3:])) pyvo-1.2.1/pyvo/utils/vocabularies.py000066400000000000000000000041661416757633600177270ustar00rootroot00000000000000""" A shallow interface to IVOA vocabularies. See http://ivoa.net/documents/Vocabularies/ (>= version 2) for the larger background. In this module, we essentially wrap the retrieval and caching of the desise files. """ import functools import json import os import time from urllib import request from astropy.utils.data import download_file, clear_download_cache IVOA_VOCABULARY_ROOT = "http://www.ivoa.net/rdf/" class VocabularyError(Exception): """A generic error that occurred when interacting with the IVOA vocabulary repository. """ @functools.lru_cache() def get_vocabulary(voc_name, force_update=False): """returns an IVOA vocabulary in its "desise" form. See Vocabularies in the VO 2 to see what is inside of this. This will use a cache to avoid repeated updates, but it will attempt to re-download if the cached copy is older than 6 months. """ src_url = IVOA_VOCABULARY_ROOT+voc_name if force_update: clear_download_cache(src_url) try: src_name = download_file( src_url, cache=True, show_progress=False, http_headers={"accept": "application/x-desise+json"}) except Exception as msg: raise VocabularyError("No such vocabulary: {} ({})".format( voc_name, msg)) if time.time()-os.path.getmtime(src_name)>3600*60*150: # attempt a re-retrieval, but ignore failure try: src_name = download_file( IVOA_VOCABULARY_ROOT+voc_name, cache="update", show_progress=False, http_headers={"accept": "application/x-desise+json"}) except Exception as msg: base.ui.notifyWarning("Updating cache for the vocabulary" " {} failed: {}".format(voc_name, msg)) with open(src_name, "r", encoding="utf-8") as f: return json.load(f) def get_label(voc, term, default=None): """returns the label of term if it's in the desise vocabulary voc, term capitalised otherwise. """ if term in voc["terms"]: return voc["terms"][term]["label"] else: return default # vi:et:sw=4:sta pyvo-1.2.1/pyvo/utils/xml/000077500000000000000000000000001416757633600154675ustar00rootroot00000000000000pyvo-1.2.1/pyvo/utils/xml/__init__.py000066400000000000000000000000001416757633600175660ustar00rootroot00000000000000pyvo-1.2.1/pyvo/utils/xml/elements.py000066400000000000000000000310661416757633600176630ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from inspect import getmembers from functools import partial from astropy.utils.xml import iterparser from astropy.io.votable.exceptions import warn_or_raise from pyvo.utils.xml.exceptions import UnknownElementWarning __all__ = [ "xmlattribute", "xmlelement", "make_add_complexcontent", "make_add_simplecontent", "Element", "ContentMixin", "parse_for_object"] def parse_for_object( source, object_type, pedantic=None, filename=None, _debug_python_based_parser=False ): """ Parses an xml file (or file-like object), and returns a object of specified object_type. object_type must be a subtype of `~pyvo.utils.xml.elements.Element` type Parameters ---------- source : str or readable file-like object Path or file object containing a tableset xml file. object : object type to return (subtype `~pyvo.utils.xml.elements.Element`) pedantic : bool, optional When `True`, raise an error when the file violates the spec, otherwise issue a warning. Warnings may be controlled using the standard Python mechanisms. See the `warnings` module in the Python standard library for more information. Defaults to False. filename : str, optional A filename, URL or other identifier to use in error messages. If *filename* is None and *source* is a string (i.e. a path), then *source* will be used as a filename for error messages. Therefore, *filename* is only required when source is a file-like object. Returns ------- object : `~pyvo.utils.xml.elements.Element` object or None See also -------- pyvo.io.vosi.exceptions : The exceptions this function may raise. """ config = { 'pedantic': pedantic, 'filename': filename } if filename is None and isinstance(source, str): config['filename'] = source with iterparser.get_xml_iterator( source, _debug_python_based_parser=_debug_python_based_parser ) as iterator: return object_type( config=config, pos=(1, 1)).parse(iterator, config) class xmlattribute(property): def __init__(self, fget=None, fset=None, fdel=None, doc=None, name=None): super().__init__(fget, fset, fdel, doc) if name: self.name = name elif fget is not None: self.name = fget.__name__ else: raise ValueError( "xmlattribute either needs a getter or a element name or both") def __call__(self, fget): return self.__class__(fget, name=self.name) def getter(self, fget): return self.__class__( fget, self.fset, self.fdel, self.__doc__, self.name) def setter(self, fset): return self.__class__( self.fget, fset, self.fdel, self.__doc__, self.name) def deleter(self, fdel): return self.__class__( self.fget, self.fset, fdel, self.__doc__, self.name) class xmlelement(property): """ """ def __init__( self, fget=None, fset=None, fdel=None, fadd=None, fformat=None, doc=None, name=None, ns=None, plain=False, cls=None, multiple_exc=None ): super().__init__(fget, fset, fdel, doc) if name: self.name = name elif fget is not None: self.name = fget.__name__ else: self.name = None self.ns = ns self.plain = plain self.cls = cls self.multiple_exc = multiple_exc self.fadd = fadd self.fformat = fformat def __call__(self, fget): return self.__class__( fget, name=self.name or fget.__name__, ns=self.ns, plain=self.plain, cls=self.cls, multiple_exc=self.multiple_exc ) def __get__(self, obj, owner=None): if obj is not None: val = super().__get__(obj, owner) if self.plain: return val elif not isinstance(val, (Element, list)): element = ContentMixin(_name=self.name, _ns=self.ns) element.content = val return element else: return val else: return super().__get__(obj, owner) def getter(self, fget): return self.__class__( fget, self.fset, self.fdel, self.fadd, self.fformat, self.__doc__, self.name, self.ns, self.plain, self.cls, self.multiple_exc) def setter(self, fset): return self.__class__( self.fget, fset, self.fdel, self.fadd, self.fformat, self.__doc__, self.name, self.ns, self.plain, self.cls, self.multiple_exc) def deleter(self, fdel): return type(self)( self.fget, self.fset, fdel, self.fadd, self.fformat, self.__doc__, self.name, self.ns, self.plain, self.cls, self.multiple_exc) def adder(self, fadd): if self.cls: raise RuntimeError( 'xmlelement cls parameter has no effect when adder is' ' defined') if self.multiple_exc: raise RuntimeError( 'xmlelement multiple_exc parameter has no effect when' ' adder is defined') return self.__class__( self.fget, self.fset, self.fdel, fadd, self.fformat, self.__doc__, self.name, self.ns, self.plain, self.cls, self.multiple_exc) def formatter(self, fformat): return self.__class__( self.fget, self.fset, self.fdel, self.fadd, fformat, self.__doc__, self.name, self.ns, self.plain, self.cls, self.multiple_exc) def object_attrs(obj): objtype = type(obj) attrs = { getattr(objtype, name).name: value for name, value in getmembers(obj) if isinstance(getattr(objtype, name, None), xmlattribute)} return attrs def object_children(obj): objtype = type(obj) try: for child in obj: if isinstance(child, Element): yield (child._Element__name, None, child) except TypeError: for name, child in getmembers(obj): if child is None: continue descr = getattr(objtype, name, None) if isinstance(descr, xmlelement): element_name = descr.name if descr.fformat: fformat = partial(descr.fformat, obj) else: fformat = None yield (element_name, fformat, child) elif isinstance(child, Element): yield (child._Element__name, None, child) def object_mapping(obj): objtype = type(obj) for name, val in getmembers(obj): descr = getattr(objtype, name, None) if isinstance(descr, xmlelement): if descr.fadd is None: if descr.cls is None: fadd = make_add_simplecontent( obj, descr.name, name, descr.multiple_exc) else: fadd = make_add_complexcontent( obj, descr.name, name, descr.cls, descr.multiple_exc) else: fadd = partial(descr.fadd, obj) yield descr.name, fadd def make_add_complexcontent( self, element_name, attr_name, cls_, exc_class=None): """ Factory for generating add functions for elements with complex content. """ def add_complexcontent(iterator, tag, data, config, pos): attr = getattr(self, attr_name) element = cls_( config=config, pos=pos, _name=element_name, **data) if attr and exc_class is not None: warn_or_raise( exc_class, args=element_name, config=config, pos=pos) if isinstance(getattr(self, attr_name, None), list): getattr(self, attr_name).append(element) else: setattr(self, attr_name, element) element.parse(iterator, config) return add_complexcontent def make_add_simplecontent( self, element_name, attr_name, exc_class=None, check_func=None, data_func=None): """ Factory for generating add functions for elements with simple content. This means elements with no child elements. If exc_class is given, warn or raise if element was already set. """ def add_simplecontent(iterator, tag, data, config, pos): for start, tag, data, pos in iterator: if not start and tag == element_name: attr = getattr(self, attr_name) if attr and exc_class: warn_or_raise( exc_class, args=self._Element__name, config=config, pos=pos) if check_func: check_func(data, config, pos) if data_func: data = data_func(data) if isinstance(getattr(self, attr_name), list): getattr(self, attr_name).append(data) else: setattr(self, attr_name, data or None) break return add_simplecontent class Element: """ A base class for all classes that represent XML elements. Subclasses and Mixins must initialize their independent attributes after calling ``super().__init__``. """ def __init__(self, config=None, pos=None, _name='', _ns='', **kwargs): if config is None: config = {} self._config = config self._pos = pos self.__name = _name self.__ns = _ns self._tag_mapping = {} def _add_unknown_tag(self, iterator, tag, data, config, pos): if tag != 'xml': warn_or_raise( UnknownElementWarning, UnknownElementWarning, tag, config, pos) def _end_tag(self, tag, data, pos): pass def _ignore_add(self, iterator, tag, data, config, pos): pass def parse(self, iterator, config): """ For internal use. Parse the XML content of the children of the element. Override this method and do after-parse checks after calling ``super().parse``, if you need to. Parameters ---------- iterator : xml iterator An iterator over XML elements as returned by `~astropy.utils.xml.iterparser.get_xml_iterator`. config : dict The configuration dictionary that affects how certain elements are read. """ tag_mapping = dict(object_mapping(self)) for start, tag, data, pos in iterator: if start: tag_mapping.get(tag, self._add_unknown_tag)( iterator, tag, data, config, pos) else: if tag == self._Element__name: self._end_tag(tag, data, pos) break return self def to_xml(self, w, **kwargs): if self._Element__ns: name = ':'.join((self._Element__ns, self._Element__name)) else: name = self._Element__name with w.tag(name, attrib=object_attrs(self)): for name, formatter, child in object_children(self): if isinstance(child, Element): child.to_xml(w, formatter=formatter) else: if formatter: child = formatter() if not child: child = '' w.element(name, str(child)) class ContentMixin(Element): """ Mixin class for elements with inner content. """ def __init__(self, config=None, pos=None, _name=None, _ns=None, **kwargs): super().__init__(config, pos, _name, _ns, **kwargs) self._content = None def __bool__(self): return bool(self.content) __nonzero__ = __bool__ def _end_tag(self, tag, data, pos): self.content = data def _content_check(self, content): pass def _content_parse(self, content): return content @property def content(self): """The inner content of the element.""" return self._content @content.setter def content(self, content): self._content_check(content) self._content = self._content_parse(content) def to_xml(self, w, **kwargs): if self._Element__ns: name = ':'.join((self._Element__ns, self._Element__name)) else: name = self._Element__name try: content = kwargs['formatter']() except (KeyError, TypeError): content = self.content if content is not None: w.element(name, str(content), attrib=object_attrs(self)) pyvo-1.2.1/pyvo/utils/xml/exceptions.py000066400000000000000000000021061416757633600202210ustar00rootroot00000000000000# Licensed under a 3-clause BSD style license - see LICENSE.rst from astropy.utils.exceptions import AstropyWarning __all__ = ['XMLWarning', 'UnknownElementWarning'] def _format_message(message, name, config=None, pos=None): if config is None: config = {} if pos is None: pos = ('?', '?') filename = config.get('filename', '?') return '{}:{}:{}: {}: {}'.format(filename, pos[0], pos[1], name, message) class XMLWarning(AstropyWarning): """ Base warning for violations of XML specifications """ def __init__(self, args, config=None, pos=None): if config is None: config = {} if not isinstance(args, tuple): args = (args, ) msg = self.message_template.format(*args) self.formatted_message = _format_message( msg, self.__class__.__name__, config, pos) Warning.__init__(self, self.formatted_message) class UnknownElementWarning(XMLWarning): """ Warning for missing xml elements """ message_template = "Unknown element {}" default_args = ('x',) pyvo-1.2.1/setup.cfg000066400000000000000000000033331416757633600143550ustar00rootroot00000000000000[build_sphinx] source-dir = docs build-dir = docs/_build all_files = 1 [build_docs] source-dir = docs build-dir = docs/_build all_files = 1 [upload_docs] upload-dir = docs/_build/html show-response = 1 [tools:pytest] minversion = 2.2 norecursedirs = build docs/_build remote_data_strict = true [ah_bootstrap] auto_use = True [flake8] max-line-length = 110 max-doc-length = 79 exclude = __init__.py, setup_package.py, conf.py, setup.py, ah_bootstrap.py, astropy_helpers, version.py, ci-helpers conftest.py [pycodestyle] max-line-length = 110 max-doc-length = 79 exclude = extern,sphinx,*parsetab.py [metadata] package_name = pyvo description = Astropy affiliated package for accessing Virtual Observatory data and services long_description = author = the IVOA community author_email = sbecker@ari.uni-heidelberg.de license = BSD url = https://github.com/astropy/pyvo edit_on_github = False github_project = astropy/pyvo install_requires = astropy>=4.0 requests # version should be PEP440 compatible (http://www.python.org/dev/peps/pep-0440) version = 1.2.1 [coverage:run] omit = pyvo/__init__* pyvo/conftest.py pyvo/*setup* pyvo/*/tests/* */pyvo/__init__* */pyvo/conftest.py */pyvo/*setup* */pyvo/*/tests/* [coverage:report] exclude_lines = # Have to re-enable the standard pragma pragma: no cover # Don't complain about packages we have installed except ImportError # Don't complain if tests don't hit assertions raise AssertionError raise NotImplementedError # Don't complain about script hooks def main\(.*\): # Ignore branches that don't pertain to this version of Python pragma: py{ignore_python_version} # Don't complain about IPython completion helper def _ipython_key_completions_ [entry_points] pyvo-1.2.1/setup.py000066400000000000000000000103521416757633600142450ustar00rootroot00000000000000#!/usr/bin/env python # Licensed under a 3-clause BSD style license - see LICENSE.rst import glob import os import sys import ah_bootstrap from setuptools import setup # A dirty hack to get around some early import/configurations ambiguities import builtins builtins._ASTROPY_SETUP_ = True from astropy_helpers.setup_helpers import (register_commands, get_debug_option, get_package_info) from astropy_helpers.git_helpers import get_git_devstr from astropy_helpers.version_helpers import generate_version_py # Get some values from the setup.cfg from configparser import ConfigParser conf = ConfigParser() conf.read(['setup.cfg']) metadata = dict(conf.items('metadata')) PACKAGENAME = metadata.get('package_name', 'pyvo') DESCRIPTION = metadata.get('description', 'Astropy affiliated package') AUTHOR = metadata.get('author', '') AUTHOR_EMAIL = metadata.get('author_email', '') LICENSE = metadata.get('license', 'unknown') URL = metadata.get('url', '') # order of priority for long_description: # (1) set in setup.cfg, # (2) load LONG_DESCRIPTION.rst, # (3) load README.rst, # (4) package docstring readme_glob = 'README*' _cfg_long_description = metadata.get('long_description', '') if _cfg_long_description: LONG_DESCRIPTION = _cfg_long_description elif os.path.exists('LONG_DESCRIPTION.rst'): with open('LONG_DESCRIPTION.rst') as f: LONG_DESCRIPTION = f.read() elif len(glob.glob(readme_glob)) > 0: with open(glob.glob(readme_glob)[0]) as f: LONG_DESCRIPTION = f.read() else: # Get the long description from the package's docstring __import__(PACKAGENAME) package = sys.modules[PACKAGENAME] LONG_DESCRIPTION = package.__doc__ # Store the package name in a built-in variable so it's easy # to get from other parts of the setup infrastructure builtins._ASTROPY_PACKAGE_NAME_ = PACKAGENAME # VERSION should be PEP440 compatible (http://www.python.org/dev/peps/pep-0440) VERSION = metadata.get('version', '0.0.dev') # Indicates if this version is a release version RELEASE = 'dev' not in VERSION if not RELEASE: VERSION += get_git_devstr(False) # Populate the dict of setup command overrides; this should be done before # invoking any other functionality from distutils since it can potentially # modify distutils' behavior. cmdclassd = register_commands(PACKAGENAME, VERSION, RELEASE) # Freeze build information in version.py generate_version_py(PACKAGENAME, VERSION, RELEASE, get_debug_option(PACKAGENAME)) # Get configuration information from all of the various subpackages. # See the docstring for setup_helpers.update_package_files for more # details. package_info = get_package_info() # Add the project-global data package_info['package_data'].setdefault(PACKAGENAME, []) package_info['package_data'][PACKAGENAME].append('data/*') # Define entry points for command-line scripts entry_points = {'console_scripts': []} entry_point_list = conf.items('entry_points') for entry_point in entry_point_list: entry_points['console_scripts'].append('{} = {}'.format(entry_point[0], entry_point[1])) # Include all .c files, recursively, including those generated by # Cython, since we can not do this in MANIFEST.in with a "dynamic" # directory name. c_files = [] for root, dirs, files in os.walk(PACKAGENAME): for filename in files: if filename.endswith('.c'): c_files.append( os.path.join( os.path.relpath(root, PACKAGENAME), filename)) package_info['package_data'][PACKAGENAME].extend(c_files) # Note that requires and provides should not be included in the call to # ``setup``, since these are now deprecated. See this link for more details: # https://groups.google.com/forum/#!topic/astropy-dev/urYO8ckB2uM setup(name=PACKAGENAME, version=VERSION, description=DESCRIPTION, python_requires='>=3.7', install_requires=metadata.get('install_requires', 'astropy').strip().split(), author=AUTHOR, author_email=AUTHOR_EMAIL, license=LICENSE, url=URL, long_description=LONG_DESCRIPTION, cmdclass=cmdclassd, zip_safe=False, use_2to3=False, entry_points=entry_points, **package_info ) pyvo-1.2.1/tests/000077500000000000000000000000001416757633600136745ustar00rootroot00000000000000pyvo-1.2.1/tests/README.txt000066400000000000000000000001321416757633600153660ustar00rootroot00000000000000This directory holds extra unittest tests not to be run as part of python setup.py test. pyvo-1.2.1/tests/testLicense.py000066400000000000000000000033171416757633600165340ustar00rootroot00000000000000#!/usr/bin/env python """ Tests for pyvo.dal.query """ import os import re import unittest license_ref_line = \ "# Licensed under a 3-clause BSD style license - see LICENSE.rst" license_file = "licenses/LICENSE.rst" class LicenseTestCase(unittest.TestCase): def assertHasLicenseRef(self, filename): with open(filename) as srcf: lines = srcf.readlines() self.assertTrue( len(filter(lambda ln: ln.startswith(license_ref_line), lines)) > 0, "{} does not have license reference line".format(filename)) self.assertTrue(lines[0].startswith(license_ref_line) or lines[1].startswith(license_ref_line), "license reference line is not 1st or 2nd line in" " {}".format(license_ref_line)) def testHasLicense(self): self.assertTrue(os.path.exists(license_file), "license/LICENSE.rst appears to be missing (what dir are you in?)") def list_py_files(arg, dirname, names): return map(lambda f: (f[:-3], os.path.join(dirname, f)), filter(lambda n: n.endswith(".py"), names)) for dirp, dirs, files in os.walk("pyvo"): for fname in files: if not fname.endswith(".py") or fname == "version.py": continue path = os.path.join(dirp, fname) name = re.sub(r'/', "_", path) f = "lambda s: s.assertHasLicenseRef('{}')".format(path) setattr(LicenseTestCase, "test_"+name, eval(f)) __all__ = "LicenseTestCase".split() def suite(): tests = [] for t in __all__: tests.append(unittest.makeSuite(globals()[t])) return unittest.TestSuite(tests) if __name__ == "__main__": unittest.main() pyvo-1.2.1/tox.ini000066400000000000000000000066561416757633600140620ustar00rootroot00000000000000[tox] # Please note that not all the combinations below are guaranteed to work # as oldestastropy and devastropy might not support the full python range # listed here envlist = py{37,38,39,310}-test{,-oldestastropy, -devastropy} egg_info cov linkcheck codestyle requires = setuptools >= 30.3.0 pip >= 19.3.1 tox-pypi-filter >= 0.12 [testenv] pypi_filter = https://raw.githubusercontent.com/astropy/ci-helpers/main/pip_pinnings.txt commands = pip freeze pytest --pyargs pyvo description = run tests oldestdeps: with astropy 4.0.* devastropy: with astropy latest deps = devastropy: git+https://github.com/astropy/astropy.git#egg=astropy oldestdeps: astropy==4.0 astropy requests mimeparse pytest-astropy requests_mock pillow astropy40: astropy==4.0.* astropy41: astropy==4.1.* latest: astropy astropydev: git+https://github.com/astropy/astropy.git#egg=astropy # # Linkcheck is broken with cryptic error with Sphinx 3.1.0 # # https://github.com/astropy/astropy/issues/10489 # # It also emits a warning from BLS docstring that we cannot banish with numpydoc 1.1.0 linkcheck: sphinx<3.1 linkcheck: numpydoc<1.1.0 [testenv:egg_info] description = ensure egg_info works without dependencies commands = pip freeze python setup.py egg_info [testenv:cov] description = determine the code coverage deps: # had to pin this coverage==4.5.4 #-rpip-requirements requests mimeparse pytest-astropy requests_mock pillow commands = pip freeze pytest --pyargs pyvo --cov pyvo --cov-config={toxinidir}/setup.cfg coverage xml -o {toxinidir}/coverage.xml [testenv:docs] description = builds the docs extras = docs deps = sphinx_astropy commands = pip freeze python setup.py build_docs -w [testenv:linkcheck] changedir = docs deps = sphinx_astropy description = check the links in the HTML docs extras = docs commands = pip freeze sphinx-build -W -b linkcheck . _build/html [testenv:codestyle] # We list the warnings/errors to check for here rather than in setup.cfg because # we don't want these options to apply whenever anyone calls flake8 from the # command-line or their code editor - in this case all warnings/errors should be # checked for. The warnings/errors we check for here are: # E101 - mix of tabs and spaces # W191 - use of tabs # W291 - trailing whitespace # W292 - no newline at end of file # W293 - trailing whitespace # W391 - blank line at end of file # E111 - 4 spaces per indentation level # E112 - 4 spaces per indentation level # E113 - 4 spaces per indentation level # E301 - expected 1 blank line, found 0 # E302 - expected 2 blank lines, found 0 # E303 - too many blank lines (3) # E304 - blank lines found after function decorator # E305 - expected 2 blank lines after class or function definition # E306 - expected 1 blank line before a nested definition # E502 - the backslash is redundant between brackets # E722 - do not use bare except # E901 - SyntaxError or IndentationError # E902 - IOError # E999: SyntaxError -- failed to compile a file into an Abstract Syntax Tree # F822: undefined name in __all__ # F823: local variable name referenced before assignment skip_install = true description = check code style, e.g. with flake8 deps = flake8 changedir = {toxinidir} commands = flake8 pyvo --count --select=E101,W191,W291,W292,W293,W391,E111,E112,E113,E30,E502,E722,E901,E902,E999,F822,F823