From f46dc5eecb6c02850a4ebe005d1ddee2bfa180af Mon Sep 17 00:00:00 2001 From: Kay Robbins <1189050+VisLab@users.noreply.github.com> Date: Wed, 8 May 2024 11:29:03 -0500 Subject: [PATCH 1/9] Updated matlab docs --- docs/source/HedMatlabTools.md | 188 ++++++++++++++++++------------ docs/source/HedValidationGuide.md | 4 +- docs/source/HowCanYouUseHed.md | 9 +- 3 files changed, 119 insertions(+), 82 deletions(-) diff --git a/docs/source/HedMatlabTools.md b/docs/source/HedMatlabTools.md index 9227742..e328463 100644 --- a/docs/source/HedMatlabTools.md +++ b/docs/source/HedMatlabTools.md @@ -1,52 +1,81 @@ +(hed-matlab-tools-anchor)= # HED MATLAB tools +The goal of the HED MATLAB tools is to provide access to HED tools from MATLAB without knowledge of Python. +The HED tools allow validation, summary, search, factorization, data epoching +and other HED processing in MATLAB requiring reimplementation of these operations in MATLAB. + There are currently three types of support available for HED (Hierarchical Event Descriptors) in MATLAB: -* [**Python HEDTools in MATLAB**](python-hedtools-in-matlab-anchor) - calling HED python tools from within MATLAB. -* [**HED web services in MATLAB**](hed-web-services-in-matlab-anchor) - web services called from MATLAB scripts. +* [**Wrappers for HEDTools**](wrappers-for-hedtools-anchor) - call HED python tools from within MATLAB. +* [**Web services for HEDTools**](web-services-for-hedtools-anchor) - call HED online web services. * [**EEGLAB plug-in integration**](eeglab-integration-anchor) - EEGLAB plugins and other native MATLAB. -Python support in MATLAB +The most direct access to HEDTools is through the MATLAB wrappers for HED tools. +These MATLAB functions take MATLAB data as input, transform the data as needed, call the HED Python tools, +and transform the return values back to MATLAB data. +HED wrappers are efficient and easy to use, but require installation. + +An alternative to direct access to HEDTools is through MATLAB wrappers for the HED online services. +These wrappers do not require any installation, but require access to the Internet. +The web services wrappers take MATLAB data as input, transform the data as needed, +issue remote calls to the HED online tools, unpack the results, and return the results as MATLAB data. + +A third option is to use the EEGLAB plug-in integration for HED. +The EEGLAB plug-ins use one of the first two methods to perform the operations, but provide a user-interface. + +(what-to-download-anchor)= +## What to download + +The MATLAB HEDtools can be downloaded from the [**hed-matlab**](https://github.com/hed-standard/hed-matlab) +GitHub repository. You should add the **hedmat** directory and all of its subdirectories to your path. + +The following table describes the directories of this repository: -(python-hedtools-in-matlab-anchor)= -## Python HEDTools in MATLAB +| Directory | Description | +| --------- | ----------- | +| *data* | Data used for the demos and tests. | +| *docs* | Source code for the documentation. | +| *hedmat/hed_wrappers* | Matlab wrapper functions for HED python tools. | +| *hedmat/remodeling* | Matlab interface for the HED remodeling tools. | +| *hedmat/utilities* | General purpose utilities. | +| *hedmat/web_service_demos* | Demos of the web service direct calls. | +| *hedmat/web_service_wrappers* | Matlab wrappers for the web services. | +| *tests* | Unit tests for MATLAB. (Execute `run_tests.m` to run all unit tests. | -Although MATLAB began python support of python in 2014, you must be using -MATLAB version 2020b or later with the HEDTools because the +(wrappers-for-hedtools-anchor)= +## Wrappers for HEDTools + +Although MATLAB began python support of python in 2014, **you must be using +MATLAB version 2020b or later** with the HEDTools because the current version of the HEDTools requires Python 3.8 or later. -With these tools you can incorporate validation, summary, search, factorization, -and other HED processing directly into your MATLAB processing scripts without -reimplementing these operations in MATLAB. +See [**compatible version of Python**](https://www.mathworks.com/support/requirements/python-compatibility.html) for a listing of which +Python versions are compatible with which versions of MATLAB. **Note:** For your reference, the source for `hedtools` is the [**hed-python**](https://github.com/hed-standard/hed-python) GitHub repository. The code is fully open-source with an MIT license. The actual API documentation is available [**here**](https://hed-python.readthedocs.io/en/latest/api2.html), but the tutorials and tool documentation for `hedtools` on -[**HED Resources**](https://www.hed-resources.org/en/latest/index.html) provides more +[**HED Resources**](https://www.hed-resources.org/en/latest/index.html) site provides more examples of use. +### Installing Python -### Getting started - -The `hedtools` library requires a Python version >= 3.8. -In order to call functions from this library in MATLAB, -you must be running MATLAB version >= R2019a and have a -[**compatible version of Python**](https://www.mathworks.com/support/requirements/python-compatibility.html) -installed on your machine. - -The most difficult part of the process for users who are unfamiliar with Python is +The greatest difficulty for users who are unfamiliar with Python is getting Python connected to MATLAB. Once that is done, many of the standard `hedtools` functions have -[**MATLAB HED tool wrapper functions**](https://github.com/hed-standard/hed-matlab/tree/main/hedmat/hedtools_wrappers), -which take MATLAB variables as arguments and return MATLAB variables. -Thus, once the setup is done, you don't have to learn any additional Python syntax to use the tools. +[**MATLAB HED tool wrapper functions**](https://github.com/hed-standard/hed-matlab/tree/main/hedmat/hedtools_wrappers) +that take MATLAB variables as arguments and return either MATLAB variables or opaque objects that +can be passed to other MATLAB functions. + +Thus, once the setup is done, you don't have to learn any Python syntax to use the tools. You should only have to do this setup once, since MATLAB retains the setup information from session to session. ````{admonition} Steps for setting up Python HEDtools for MATLAB. -[**Step 1: Find Python**](step-1-find-python-anchor). If yes, skip to Step 3. -
+[**Step 1: Find Python**](step-1-find-python-anchor). If a version >= Python 3.8 is found, skip to Step 3. +
[**Step 2: Install Python if needed**](step-2-install-python-if-needed-anchor) . @@ -61,7 +90,7 @@ If already connected, skip to Step 4. (step-1-find-python-anchor)= #### Step 1: Find Python -Follow these steps until you find a Python executable that is version 3.7 or greater. +Follow these steps until you find a Python executable that is version 3.8 or greater. If you can't locate one, you will need to install it. ````{Admonition} Does MATLAB already have a good version of Python you can use? @@ -69,18 +98,18 @@ If you can't locate one, you will need to install it. In your MATLAB command window execute the following function: ```matlab -pyenv +>> pyenv ``` The following example response shows that MATLAB is using Python version 3.9 -with executable located at `C:\Program Files\Python39\pythonw.exe`. +with executable located at `C:\Program Files\Python\Python39\python.EXE`. ```matlab PythonEnvironment with properties: Version: "3.9" - Executable: "C:\Program Files\Python39\pythonw.exe" - Library: "C:\Program Files\Python39\python39.dll" - Home: "C:\Program Files\Python39" + Executable: "C:\Program Files\Python\Python39\python.EXE" + Library: "C:\Program Files\Python\Python39\python39.dll" + Home: "C:\Program Files\Python\Python39" Status: NotLoaded ExecutionMode: InProcess ``` @@ -97,20 +126,16 @@ There are several likely places to look for Python on your system. **For Linux users**: ->Likely places for system-space installation are `/bin`, `/local/bin`, `/usr/bin`, `/usr/local/bin`, or `/opt/bin`. User-space installations are usually your home directory in a subdirectory such as `~/bin` -or `~/.local/bin`. +>Likely places for system-space installation are `/bin`, `/local/bin`, `/usr/bin`, `/usr/local/bin`, or `/opt/bin`. User-space installations are usually your home directory in a subdirectory such as `~/bin` or `~/.local/bin`. The `which python` command will list the Python executable that is first found in your path. **For Windows users**: -> Likely places for system-space installation are `C:\`, `C:\Python`, or `C:\Program Files`. -User-space installations default to your personal account -in `C:\Users\yourname\AppData\Local\Programs\Python\python39` where `yourname` is your Windows account name -and `python39` will be the particular version (in this case Python 3.9). +> Likely places for system-space installation are `C:\`, `C:\Python`, `C:\Program Files` or `C:\Program Files\Python`. User-space installations default to your personal account in `C:\Users\yourname\AppData\Local\Programs\Python\python39` where `yourname` is your Windows account name and `python39` will be the particular version (in this case Python 3.9). If you don't have any success finding a Python executable, you will need to install Python as described in [**Step 2: Install Python if needed**](step-2-install-python-if-needed-anchor). -Otherwise, you can skip to [**Step 3:Connect Python to MATLAB**](step-3-connect-python-to-matlab-anchor). +Otherwise, you can skip to [**Step 3: Connect Python to MATLAB**](step-3-connect-python-to-matlab-anchor). ```{warning} **You need to keep track of the path to your Python executable for Step 3.** @@ -126,17 +151,16 @@ for your operating system and version. Depending on your OS and the installer options you selected, Python may be installed in your user space or in system space for all users. - You should keep track of the directory that Python was installed in. -- You may want to add the location of the Python executable to your PATH. - (Most installers give you that option as part of the installation.) +- You may want to add the location of the Python executable to your system or user PATH. -#### Installing in a virtual environment +```{warning} +MATLAB installs add-ons such as the HEDTools in a specific user directory as described below. +This makes user-installed Python modules available to all MATLAB projects. +**For this reason, we do not recommend trying to set up a virtual environment.** +``` -https://www.mathworks.com/support/search.html/answers/1750425-python-virtual-environments-with-python-interface.html?fq%5B%5D=asset_type_name:answer&page=1 (step-3-connect-python-to-matlab-anchor)= -#### Step 3: Connect Python to Matlab - - -C:\Users\username\AppData\Local\Programs\Python\python -m venv C:\Users\username\py38 +#### Step 3: Connect Python to MATLAB Setting the Python version uses the MATLAB `pyenv` function with the `'Version'` argument as illustrated by the following example. @@ -144,30 +168,14 @@ as illustrated by the following example. ````{admonition} Example MATLAB function call connect MATLAB to Python. ```matlab ->> pyenv('Version', 'C:\Program Files\Python39\python.exe') +>> pyenv('Version', 'C:\Program Files\Python\Python39\python.exe') ``` ```` Be sure to substitute the path of the Python that you have found. -Notice that the executable listed in Step 1 was `pythonw.exe`, but we have used `python.exe` here -to indicate the command line version. Use the MATLAB `pyenv` function again without arguments to check that your installation is as expected. -````{Admonition} Example response for pyenv all with no arguments after setting environment. - -```matlab - PythonEnvironment with properties: - - Version: "3.9" - Executable: "C:\Program Files\Python39\python.exe" - Library: "C:\Program Files\Python39\python39.dll" - Home: "C:\Program Files\Python39" - Status: NotLoaded - ExecutionMode: InProcess -``` -```` - (step-4-install-hedtools-anchor)= #### Step 4: Install HEDTools @@ -175,14 +183,15 @@ The general-purpose package manager for Python is called `pip`. By default, `pip` retrieves packages to be installed from the [**PyPI**](https://pypi.org) package repository. You will need to use the version of `pip` that corresponds to the version of Python that is connected to MATLAB. -This may not be the default `pip` used from the command line. +The right version of `pip` is found in the `Scripts` subdirectory of your Python installation. + ````{admonition} Command to install hedtools in MATLAB. To install the latest released version of `hedtools` type a pip command such as the following in your MATLAB command window. ```matlab -system('"C:\Program Files\Python39\Scripts\pip" install hedtools') +system('"C:\Program Files\Python\Python39\Scripts\pip" install hedtools') ``` Use the full path of the pip associated with the Python that you are using with MATLAB @@ -224,6 +233,38 @@ Similarly, the `pip` package manager might be named `pip3` instead of `pip`. ``` +You can also install the Python HEDtools from GitHub if you want the version that is under development. + +````{admonition} Command to install hedtools in MATLAB. +To install the latest released version of `hedtools` type a pip command such as the +following in your MATLAB command window. + +```matlab +system('"C:\Program Files\Python\Python39\Scripts\pip" install hedtools') +``` +Use the full path of the pip associated +with the Python that you are using with MATLAB +```` +If you want the newest features of the Python HEDTools, you will need to install directly from the GitHub repository. + +````{admonition} Command to install hedtools from the GitHub repository. + +```matlab +system('"C:\Program Files\Python\Python39\Scripts\pip" install git+https://github.com/hed-standard/hed-python/@develop') +``` +Be sure to replace the path to pip, with the one for your Python installation. +```` + +````{warning} +If you have an existing version of HEDTools installed and you want to install a new version, +**you must uninstall the hedtools first**. + +```matlab +system('"C:\Program Files\Python\Python39\Scripts\pip" uninstall hedtools') +``` +Be sure to replace the path to pip, with the one for your Python installation. +```` + The following MATLAB statement can be used to test that everything was installed correctly. ````{Admonition} Test that everything is installed. @@ -238,16 +279,9 @@ Using HEDTOOLS version: {'date': '2022-06-20T14:40:24-0500', 'dirty': False, 'er ``` ```` +### Calling HEDTools from MATLAB -(matlab-wrappers-for-HED-tools-anchor)= -### MATLAB wrappers for HEDTools - -The [**hedtools_wrappers**](https://github.com/hed-standard/hed-examples/tree/main/hedcode/matlab_scripts/hedtools_wrappers) directory in the -[**hed-examples**](https://github.com/hed-standard/hed-examples) GitHub repository -contains MATLAB wrapper functions for calling various commonly used HED tools. - -#### Direct calls to HEDTools - +The wrapper functions provide the basic functionality for the common operations Wrapper functions are provided to some of the more commonly used functions in the HEDTools suite. @@ -343,10 +377,10 @@ supported for your version of MATLAB. The MATLAB `matlab.exception.PyException` captures error information generated during Python execution. -(hed-web-services-in-matlab-anchor)= -## HED web services in MATLAB +(web-services-for-hedtools-anchor)= +## Web services for HEDTools -HED web services allow MATLAB programs to request the same services that are available +MATLAB HED web services allow MATLAB programs to request the same services that are available through the online tools. These services are available through the [**https://hedtools.org/hed**](https://hedtools.org/hed) server. Alternatively, these services can be accessed through a locally-deployed docker module. diff --git a/docs/source/HedValidationGuide.md b/docs/source/HedValidationGuide.md index 36351dc..558a546 100644 --- a/docs/source/HedValidationGuide.md +++ b/docs/source/HedValidationGuide.md @@ -171,9 +171,9 @@ Use the [**HED online development server**](https://hedtools.ucsd.edu/hed_dev) t HED validation in MATLAB is currently done by accessing the HED online tools as web services. #### Direct access to services -Users can access these services directly by calling using the HED MATLAB web services +Users can access these services directly by calling wrapper functions or by using the HED MATLAB web services functions as explained in -[**HED web services in MATLAB**](./HedMatlabTools.md#hed-web-services-in-matlab). +[**HED MATLAB tools**](./HedMatlabTools.md#hed-matlab-tools-anchor). Download the [**web_services**](https://github.com/hed-standard/hed-matlab/tree/main/hedmat/web_services) directory from GitHub and include this directory in your MATLAB path. The [**runAllDemos.m**](https://raw.githubusercontent.com/hed-standard/hed-matlab/main/hedmat/web_services/runAllDemos.m) diff --git a/docs/source/HowCanYouUseHed.md b/docs/source/HowCanYouUseHed.md index 3938b85..ebe45b7 100644 --- a/docs/source/HowCanYouUseHed.md +++ b/docs/source/HowCanYouUseHed.md @@ -616,9 +616,12 @@ for more information on installation and use. The project source code is located in the [**CTagger**](https://github.com/hed-standard/ctagger) GitHub repository. -[**HED services in MATLAB**](https://www.hed-resources.org/en/latest/HedMatlabTools.html#hed-services-in-matlab) explains how the [**HED online services**](https://hedtools.ucsd.edu/hed) -can be called programmatically in MATLAB. The HED services are deployed online through a docker container -as described in [**Web tools and rest services**](web-tools-and-rest-services-anchor). +[**HED MATLAB tools**](https://www.hed-resources.org/en/latest/HedMatlabTools.html#hed-matlab-tools) explains how the +users can use the HEDTools in MATLAB using one of three approaches: using MATLAB wrappers for the HED Python tools, +using MATLAB wrappers for the HED web services, or by calling HED tools through EEGLAB. + +The [**HED online services**](https://hedtools.ucsd.edu/hed) can be called programmatically in MATLAB. The HED services are deployed online through a docker container +as described in [**Web tools and rest services**](web-tools-and-rest-services-anchor). [**Python HEDTools in MATLAB**](./HedMatlabTools.md#python-hedtools-in-matlab) From bc9ba32e7c904364e9a9cf3003895e8721b08fcf Mon Sep 17 00:00:00 2001 From: Kay Robbins <1189050+VisLab@users.noreply.github.com> Date: Wed, 8 May 2024 21:18:49 -0500 Subject: [PATCH 2/9] Continued update of the HED-matlab --- docs/source/HedMatlabTools.md | 45 +++++++++++++++++------------------ 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/docs/source/HedMatlabTools.md b/docs/source/HedMatlabTools.md index e328463..4f03ad4 100644 --- a/docs/source/HedMatlabTools.md +++ b/docs/source/HedMatlabTools.md @@ -187,26 +187,23 @@ The right version of `pip` is found in the `Scripts` subdirectory of your Python ````{admonition} Command to install hedtools in MATLAB. -To install the latest released version of `hedtools` type a pip command such as the +To install the latest released version of `hedtools` type a `pip` command such as the following in your MATLAB command window. ```matlab system('"C:\Program Files\Python\Python39\Scripts\pip" install hedtools') ``` -Use the full path of the pip associated -with the Python that you are using with MATLAB +Use the full path of the `pip` associated with the Python that your MATLAB is using. ```` -Giving the full path to `pip` corresponding to the Python installation that MATLAB -is using ensures that MATLAB knows about `HEDtools`. -(The version of MATLAB that Python is using may not be the same as the Python in the system PATH.) +Giving the full path to correct version of `pip` +ensures that MATLAB knows about `HEDtools`. +(The version of Python that MATLAB is using may not be the same as the Python in the system PATH.) -Also watch the resulting messages in the command window to make sure that HEDtools +Also watch the resulting messages in the MATLAB command window to make sure that HEDtools was successfully installed. -In the case of the above example, the Python being used is in system space, -which requires administrator privileges. - -The first line of the output was: +In the above example, the Python being used is in system space, +which requires administrator privileges. The first line of the output from installation was: ```matlab Defaulting to user installation because normal site-packages is not writeable @@ -215,7 +212,7 @@ The first line of the output was: On Windows these packages will be found in a `site-packages` directory such as: ```text -`C:\Users\username\AppData\Roaming\Python\Python39\site-packages` +C:\Users\username\AppData\Roaming\Python\Python39\site-packages ``` On Linux these packages might be found in directory such as: @@ -233,36 +230,38 @@ Similarly, the `pip` package manager might be named `pip3` instead of `pip`. ``` -You can also install the Python HEDtools from GitHub if you want the version that is under development. +You will need to install the Python HEDTools. -````{admonition} Command to install hedtools in MATLAB. -To install the latest released version of `hedtools` type a pip command such as the -following in your MATLAB command window. +````{admonition} Command to install HEDTools in MATLAB. +To install the latest released version of `hedtools` type a `pip` command such as the +following in your MATLAB command window: ```matlab system('"C:\Program Files\Python\Python39\Scripts\pip" install hedtools') ``` -Use the full path of the pip associated -with the Python that you are using with MATLAB + ```` -If you want the newest features of the Python HEDTools, you will need to install directly from the GitHub repository. +The above command retrieves the latest version of HEDTools from the PyPI archive. +If you want the newest features of the Python HEDTools, you will need to install directly from the GitHub repository +as shown in the following example. -````{admonition} Command to install hedtools from the GitHub repository. +````{admonition} Command to install HEDTools from the GitHub repository. ```matlab system('"C:\Program Files\Python\Python39\Scripts\pip" install git+https://github.com/hed-standard/hed-python/@develop') ``` -Be sure to replace the path to pip, with the one for your Python installation. +This installs the version of HEDTools on the `develop` branch. +Be sure to replace the path to `pip`, with the one for your Python installation. ```` ````{warning} If you have an existing version of HEDTools installed and you want to install a new version, -**you must uninstall the hedtools first**. +**you must uninstall the HEDTools first**: ```matlab system('"C:\Program Files\Python\Python39\Scripts\pip" uninstall hedtools') ``` -Be sure to replace the path to pip, with the one for your Python installation. +Be sure to replace the path to `pip`, with the one for your Python installation. ```` The following MATLAB statement can be used to test that everything was installed correctly. From 4a76be7ed9502b2c66ddc82d41275cd838bda5aa Mon Sep 17 00:00:00 2001 From: Kay Robbins <1189050+VisLab@users.noreply.github.com> Date: Fri, 10 May 2024 06:46:43 -0500 Subject: [PATCH 3/9] Continued updating instructions for setup --- docs/source/HedMatlabTools.md | 148 +++++++++++++++++++++------------- 1 file changed, 92 insertions(+), 56 deletions(-) diff --git a/docs/source/HedMatlabTools.md b/docs/source/HedMatlabTools.md index 9227742..51d67e7 100644 --- a/docs/source/HedMatlabTools.md +++ b/docs/source/HedMatlabTools.md @@ -1,67 +1,80 @@ # HED MATLAB tools +HED's primary code base is maintained in Python, but much of the HED tool functionality can also be accessed in MATLAB. There are currently three types of support available for HED (Hierarchical Event Descriptors) in MATLAB: -* [**Python HEDTools in MATLAB**](python-hedtools-in-matlab-anchor) - calling HED python tools from within MATLAB. -* [**HED web services in MATLAB**](hed-web-services-in-matlab-anchor) - web services called from MATLAB scripts. -* [**EEGLAB plug-in integration**](eeglab-integration-anchor) - EEGLAB plugins and other native MATLAB. +* [**HEDTools in MATLAB**](hedtools-in-matlab-anchor) - calling HED python tools from within MATLAB through MATLAB wrapper functions. +* [**HED web services in MATLAB**](hed-web-services-in-matlab-anchor) - calling web services from MATLAB scripts. +* [**EEGLAB integration**](eeglab-integration-anchor) - calling HED tools through the EEGLAB menus. -Python support in MATLAB +The HED MATLAB wrapper functions allow you to incorporate validation, summary, search, factorization, +and other HED processing directly into your MATLAB scripts without +reimplementing these operations in MATLAB or knowing Python. +These tools require a one-time setup connecting your MATLAB to Python. -(python-hedtools-in-matlab-anchor)= -## Python HEDTools in MATLAB +A second option is to call the HED python tools through MATLAB functions that call HED's online services. +This method accesses the Internet to perform the main actions and requires no setup. +This method is not designed for iteratively processing large collections of recordings, +but is usually fine for processing individual recordings. -Although MATLAB began python support of python in 2014, you must be using -MATLAB version 2020b or later with the HEDTools because the -current version of the HEDTools requires Python 3.8 or later. -With these tools you can incorporate validation, summary, search, factorization, -and other HED processing directly into your MATLAB processing scripts without -reimplementing these operations in MATLAB. +Many of HED's functions are also available through EEGLAB's GUI, but EEGLAB must be installed. +EEGLAB uses one of the first two methods to access HED's functionality. -**Note:** For your reference, the source for `hedtools` is the +(hedtools-in-matlab-anchor)= +## HEDTools in MATLAB + +After an initial one-time setup, you can use the MATLAB HEDTools without knowing Python. +The `hedtools` library requires a Python version >= 3.8. +In order to call functions from this library in MATLAB, +you must be running MATLAB version >= R2019a and have a +[**compatible version of Python**](https://www.mathworks.com/support/requirements/python-compatibility.html) installed on your machine. + +**Note:** For your reference, the source for the Python `hedtools` is the [**hed-python**](https://github.com/hed-standard/hed-python) GitHub repository. The code is fully open-source with an MIT license. The actual API documentation is available [**here**](https://hed-python.readthedocs.io/en/latest/api2.html), but the tutorials and tool documentation for `hedtools` on [**HED Resources**](https://www.hed-resources.org/en/latest/index.html) provides more -examples of use. - +examples of use. +[**MATLAB HEDTools**](https://github.com/hed-standard/hed-matlab/tree/main/hedmat/hedtools_wrappers) +can be downloaded from... ### Getting started -The `hedtools` library requires a Python version >= 3.8. -In order to call functions from this library in MATLAB, -you must be running MATLAB version >= R2019a and have a -[**compatible version of Python**](https://www.mathworks.com/support/requirements/python-compatibility.html) -installed on your machine. - The most difficult part of the process for users who are unfamiliar with Python is getting Python connected to MATLAB. -Once that is done, many of the standard `hedtools` functions have -[**MATLAB HED tool wrapper functions**](https://github.com/hed-standard/hed-matlab/tree/main/hedmat/hedtools_wrappers), -which take MATLAB variables as arguments and return MATLAB variables. -Thus, once the setup is done, you don't have to learn any additional Python syntax to use the tools. -You should only have to do this setup once, since MATLAB retains the setup information -from session to session. +Once the setup is done, you don't have to learn any additional Python syntax to use the tools. +The MATLAB wrapper functions take MATLAB variables as arguments and return MATLAB variables +or opaque objects which are passed on to other functions. + -````{admonition} Steps for setting up Python HEDtools for MATLAB. +````{admonition} Steps for setting up Python HEDtools for MATLAB (done once). -[**Step 1: Find Python**](step-1-find-python-anchor). If yes, skip to Step 3. +[**Step 1: Find Python**](step-1-find-python-anchor). +- If no Python, go to **Step 2**. +- If Python is present, but MATLAB doesn't know about it, go to **Step 3**. +- If Python is on your system and it is connected to MATLAB, skip to **Step 4**.-[**Step 2: Install Python if needed**](step-2-install-python-if-needed-anchor) . +[**Step 2: Install Python if needed**](step-2-install-python-if-needed-anchor). +- Be sure to pick the latest version of Python that is +[**compatible**](https://www.mathworks.com/support/requirements/python-compatibility.html) with your version of MATLAB. +- REMEMBER the installation path of the Python.
[**Step 3: Connect Python to MATLAB**](step-3-connect-python-to-matlab-anchor). -If already connected, skip to Step 4. +- If your Python is already connected to MATLAB (as checked in **Step 1**), go to **Step 4**. + + +[**Step 4: Install Python HEDtools**](step-4-install-python-hedtools-anchor) -[**Step 4: Install HEDtools**](step-4-install-hedtools-anchor) +[**Step 5: Install MATLAB HEDtools**](step-5-install-matlab-hedtools-anchor) ```` (step-1-find-python-anchor)= #### Step 1: Find Python -Follow these steps until you find a Python executable that is version 3.7 or greater. +Follow these steps until you find a Python executable that is version 3.8 or greater. If you can't locate one, you will need to install it. ````{Admonition} Does MATLAB already have a good version of Python you can use? @@ -72,21 +85,21 @@ In your MATLAB command window execute the following function: pyenv ``` The following example response shows that MATLAB is using Python version 3.9 -with executable located at `C:\Program Files\Python39\pythonw.exe`. +with executable located at `C:\Program Files\Python\Python39\python.exe`. ```matlab PythonEnvironment with properties: Version: "3.9" - Executable: "C:\Program Files\Python39\pythonw.exe" - Library: "C:\Program Files\Python39\python39.dll" - Home: "C:\Program Files\Python39" + Executable: "C:\Program Files\Python\Python39\python.exe" + Library: "C:\Program Files\Python\Python39\python39.dll" + Home: "C:\Program Files\Python\Python39" Status: NotLoaded ExecutionMode: InProcess ``` ```` -If MATLAB has already knows about a suitable Python version that is at least 3.7, +If MATLAB has already knows about a suitable Python version that is at least 3.8, you are ready to go to [**Step 4: Install HEDTools**](step-4-install-hedtools-anchor). Keep track of the location of the Python executable. @@ -101,9 +114,9 @@ There are several likely places to look for Python on your system. or `~/.local/bin`. **For Windows users**: -> Likely places for system-space installation are `C:\`, `C:\Python`, or `C:\Program Files`. +> Likely places for system-space installation are `C:\`, `C:\Python`, `C:\Program Files`, or `C:\Program Files\Python`. User-space installations default to your personal account -in `C:\Users\yourname\AppData\Local\Programs\Python\python39` where `yourname` is your Windows account name +in a location such as `C:\Users\yourname\AppData\Local\Programs\Python\python39` where `yourname` is your Windows account name and `python39` will be the particular version (in this case Python 3.9). If you don't have any success finding a Python executable, @@ -117,7 +130,7 @@ Otherwise, you can skip to [**Step 3:Connect Python to MATLAB**](step-3-connect- ``` (step-2-install-python-if-needed-anchor)= -#### Step 2: Install Python if needed +#### Step 2: Install Python if needed. (Remember where it is.) If you don't have Python on your system, you will need to install it. Go to [**Python downloads**](https://www.python.org/downloads/) and pick the correct installer @@ -129,13 +142,13 @@ Python may be installed in your user space or in system space for all users. - You may want to add the location of the Python executable to your PATH. (Most installers give you that option as part of the installation.) -#### Installing in a virtual environment +We do not recommend using a Python virtual environment. If you are not running in administrative mode, +MATLAB installs add-on Python packages in a specific place in your user space, and these packages are then +available to all your MATLAB applications. -https://www.mathworks.com/support/search.html/answers/1750425-python-virtual-environments-with-python-interface.html?fq%5B%5D=asset_type_name:answer&page=1 (step-3-connect-python-to-matlab-anchor)= #### Step 3: Connect Python to Matlab - C:\Users\username\AppData\Local\Programs\Python\python -m venv C:\Users\username\py38 Setting the Python version uses the MATLAB `pyenv` function with the `'Version'` argument @@ -144,13 +157,11 @@ as illustrated by the following example. ````{admonition} Example MATLAB function call connect MATLAB to Python. ```matlab ->> pyenv('Version', 'C:\Program Files\Python39\python.exe') +>> pyenv('Version', 'C:\Program Files\Python\Python39\python.exe') ``` ```` Be sure to substitute the path of the Python that you have found. -Notice that the executable listed in Step 1 was `pythonw.exe`, but we have used `python.exe` here -to indicate the command line version. Use the MATLAB `pyenv` function again without arguments to check that your installation is as expected. @@ -160,16 +171,16 @@ Use the MATLAB `pyenv` function again without arguments to check that your insta PythonEnvironment with properties: Version: "3.9" - Executable: "C:\Program Files\Python39\python.exe" - Library: "C:\Program Files\Python39\python39.dll" - Home: "C:\Program Files\Python39" + Executable: "C:\Program Files\Python\Python39\python.exe" + Library: "C:\Program Files\Python\Python39\python39.dll" + Home: "C:\Program Files\Python\Python39" Status: NotLoaded ExecutionMode: InProcess ``` ```` -(step-4-install-hedtools-anchor)= -#### Step 4: Install HEDTools +(step-4-install-python-hedtools-anchor)= +#### Step 4: Install Python HEDTools The general-purpose package manager for Python is called `pip`. By default, `pip` retrieves packages to be installed from the [**PyPI**](https://pypi.org) @@ -177,12 +188,12 @@ package repository. You will need to use the version of `pip` that corresponds to the version of Python that is connected to MATLAB. This may not be the default `pip` used from the command line. -````{admonition} Command to install hedtools in MATLAB. +````{admonition} Command to install Python HEDtools in MATLAB. To install the latest released version of `hedtools` type a pip command such as the following in your MATLAB command window. ```matlab -system('"C:\Program Files\Python39\Scripts\pip" install hedtools') +system('"C:\Program Files\Python\Python39\Scripts\pip" install hedtools') ``` Use the full path of the pip associated with the Python that you are using with MATLAB @@ -238,9 +249,34 @@ Using HEDTOOLS version: {'date': '2022-06-20T14:40:24-0500', 'dirty': False, 'er ``` ```` +If you want to install a newer version of the Python HEDTools, you must first uninstall the current version. + +````{Admonition} Uninstalling the current version of Python HEDTools. + +```matlab +system('"C:\Program Files\Python\Python39\Scripts\pip" uninstall hedtools') +``` +```` +If you want to install the latest unreleased version of the Python HEDTools, you should first uninstall your +current HEDtools as above. You can install from GitHub instead of the `pip` defaults by +using the appropriate web address as shown in the following example. + +````{Admonition} Installing Python HEDTools from the GitHub develop branch. + +```matlab +system('"C:\Program Files\Python\Python39\Scripts\pip" install git+https://github.com/hed-standard/hed-python/@develop') +``` +```` + +(step-5-install-matlab-hedtools-anchor)= +#### Step 5: Install MATLAB HEDtools + +The final step in the setup is to download the MATLAB HEDTools and put in your MATLAB path. +***Path to release zip to be added soon....*** + -(matlab-wrappers-for-HED-tools-anchor)= -### MATLAB wrappers for HEDTools +(running-matlab-hedtools-anchor)= +### Running MATLAB HEDTools The [**hedtools_wrappers**](https://github.com/hed-standard/hed-examples/tree/main/hedcode/matlab_scripts/hedtools_wrappers) directory in the [**hed-examples**](https://github.com/hed-standard/hed-examples) GitHub repository From dc261a7558619915808f626732d8c59386bd4b8c Mon Sep 17 00:00:00 2001 From: Kay Robbins <1189050+VisLab@users.noreply.github.com> Date: Thu, 30 May 2024 08:49:30 -0500 Subject: [PATCH 4/9] Minor type corrections started MATLAB section rewrite --- docs/source/HedMatlabTools.md | 4 +-- docs/source/HedSchemas.md | 42 +++++++++++++++---------------- docs/source/HedValidationGuide.md | 2 +- docs/source/HowCanYouUseHed.md | 5 +--- 4 files changed, 25 insertions(+), 28 deletions(-) diff --git a/docs/source/HedMatlabTools.md b/docs/source/HedMatlabTools.md index 4f03ad4..d1dbb6f 100644 --- a/docs/source/HedMatlabTools.md +++ b/docs/source/HedMatlabTools.md @@ -1,5 +1,5 @@ -(hed-matlab-tools-anchor)= -# HED MATLAB tools +(matlab-hedtools-anchor)= +# MATLAB HedTools The goal of the HED MATLAB tools is to provide access to HED tools from MATLAB without knowledge of Python. The HED tools allow validation, summary, search, factorization, data epoching diff --git a/docs/source/HedSchemas.md b/docs/source/HedSchemas.md index a63bb3a..c93d59f 100644 --- a/docs/source/HedSchemas.md +++ b/docs/source/HedSchemas.md @@ -82,13 +82,13 @@ The HED standard schema source is located in the [**standard_schema**](https://github.com/hed-standard/hed-schemas/tree/main/standard_schema) directory of the [**hed-schemas**](https://github.com/hed-standard/hed-schemas) GitHub repository. -| Format | Type | Use | -| ------ | ---- | ---- | -| XML | [**Raw**](https://raw.githubusercontent.com/hed-standard/hed-schemas/main/standard_schema/hedxml/HED8.2.0.xml) | Accessed by tools for validation and analysis. | -| | [**Formatted**](https://github.com/hed-standard/hed-schemas/blob/main/standard_schema/hedxml/HED8.2.0.xml) | Readable display. | -| Mediawiki | [**Raw**](https://raw.githubusercontent.com/hed-standard/hed-schemas/main/standard_schema/hedwiki/HED8.1.0.mediawiki) | Edited to create a new schema. | -| | [**Formatted**](https://github.com/hed-standard/hed-schemas/blob/main/standard_schema/hedwiki/HED8.1.0.mediawiki) | Readable display for editing. | -| Prerelease | [**Directory**](https://github.com/hed-standard/hed-schemas/tree/main/library_schemas/score/prerelease) | Working directory for developing the prerelease. | +| Format | Type | Use | +|------------| ---- | ---- | +| XML | [**Raw**](https://raw.githubusercontent.com/hed-standard/hed-schemas/main/standard_schema/hedxml/HED8.2.0.xml) | Accessed by tools for validation and analysis. | +| | [**Formatted**](https://github.com/hed-standard/hed-schemas/blob/main/standard_schema/hedxml/HED8.2.0.xml) | Readable display. | +| MediaWiki | [**Raw**](https://raw.githubusercontent.com/hed-standard/hed-schemas/main/standard_schema/hedwiki/HED8.1.0.mediawiki) | Edited to create a new schema. | +| | [**Formatted**](https://github.com/hed-standard/hed-schemas/blob/main/standard_schema/hedwiki/HED8.1.0.mediawiki) | Readable display for editing. | +| Prerelease | [**Directory**](https://github.com/hed-standard/hed-schemas/tree/main/library_schemas/score/prerelease) | Working directory for developing the prerelease. | ### The SCORE library @@ -96,13 +96,13 @@ The HED SCORE library is an implementation of the [**SCORE**](https://hed-schema For more information and the latest references see [**HED SCORE schema**](https://hed-schemas.readthedocs.io/en/latest/hed_score_schema.html). -| Format | Type | Use | -| ------ | ---- | ---- | -| XML | [**Raw**](https://raw.githubusercontent.com/hed-standard/hed-schemas/main/library_schemas/score/hedxml/HED_score_1.0.0.xml) | Accessed by tools for validation and analysis. | -| | [**Formatted**](https://github.com/hed-standard/hed-schemas/blob/main/library_schemas/score/hedxml/HED_score_1.0.0.xml) | Readable display. | -| Mediawiki | [**Raw**](https://raw.githubusercontent.com/hed-standard/hed-schemas/main/library_schemas/score/hedwiki/HED_score_1.0.0.mediawiki) | Edited to create a new schema. | -| | [**Formatted**](https://github.com/hed-standard/hed-schemas/blob/main/library_schemas/score/hedwiki/HED_score_1.0.0.mediawiki) | Readable display for editing. | -| Prerelease | [**Directory**](https://github.com/hed-standard/hed-schemas/tree/main/library_schemas/score/prerelease) | Working directory for developing the prerelease. | +| Format | Type | Use | +|------------| ---- | ---- | +| XML | [**Raw**](https://raw.githubusercontent.com/hed-standard/hed-schemas/main/library_schemas/score/hedxml/HED_score_1.0.0.xml) | Accessed by tools for validation and analysis. | +| | [**Formatted**](https://github.com/hed-standard/hed-schemas/blob/main/library_schemas/score/hedxml/HED_score_1.0.0.xml) | Readable display. | +| MediaWiki | [**Raw**](https://raw.githubusercontent.com/hed-standard/hed-schemas/main/library_schemas/score/hedwiki/HED_score_1.0.0.mediawiki) | Edited to create a new schema. | +| | [**Formatted**](https://github.com/hed-standard/hed-schemas/blob/main/library_schemas/score/hedwiki/HED_score_1.0.0.mediawiki) | Readable display for editing. | +| Prerelease | [**Directory**](https://github.com/hed-standard/hed-schemas/tree/main/library_schemas/score/prerelease) | Working directory for developing the prerelease. | ### The LISA library @@ -112,11 +112,11 @@ For more information and the latest references see [**HED LISA schema**](https://hed-schemas.readthedocs.io/en/latest/hed_lisa_schema.html). The LISA library is under development and is only available in prerelease format. -| Format | Type | Use | -| ------ | ---- | ---- | -| XML | **Raw** | Accessed by tools for validation and analysis. | -| | [**Formatted**] | Readable display. | -| Mediawiki | [**Raw**] | Edited to create a new schema. | -| | [**Formatted**] | Readable display for editing. | -| Prerelease | [**Directory**](https://github.com/hed-standard/hed-schemas/tree/main/library_schemas/lisa/prerelease) | Working directory for developing the prerelease. | +| Format | Type | Use | +|------------| ---- | ---- | +| XML | **Raw** | Accessed by tools for validation and analysis. | +| | [**Formatted**] | Readable display. | +| MediaWiki | [**Raw**] | Edited to create a new schema. | +| | [**Formatted**] | Readable display for editing. | +| Prerelease | [**Directory**](https://github.com/hed-standard/hed-schemas/tree/main/library_schemas/lisa/prerelease) | Working directory for developing the prerelease. | diff --git a/docs/source/HedValidationGuide.md b/docs/source/HedValidationGuide.md index 558a546..057696f 100644 --- a/docs/source/HedValidationGuide.md +++ b/docs/source/HedValidationGuide.md @@ -173,7 +173,7 @@ HED validation in MATLAB is currently done by accessing the HED online tools as #### Direct access to services Users can access these services directly by calling wrapper functions or by using the HED MATLAB web services functions as explained in -[**HED MATLAB tools**](./HedMatlabTools.md#hed-matlab-tools-anchor). +[**MATLAB HedTools**](./HedMatlabTools.md). Download the [**web_services**](https://github.com/hed-standard/hed-matlab/tree/main/hedmat/web_services) directory from GitHub and include this directory in your MATLAB path. The [**runAllDemos.m**](https://raw.githubusercontent.com/hed-standard/hed-matlab/main/hedmat/web_services/runAllDemos.m) diff --git a/docs/source/HowCanYouUseHed.md b/docs/source/HowCanYouUseHed.md index ebe45b7..37adc37 100644 --- a/docs/source/HowCanYouUseHed.md +++ b/docs/source/HowCanYouUseHed.md @@ -616,7 +616,7 @@ for more information on installation and use. The project source code is located in the [**CTagger**](https://github.com/hed-standard/ctagger) GitHub repository. -[**HED MATLAB tools**](https://www.hed-resources.org/en/latest/HedMatlabTools.html#hed-matlab-tools) explains how the +[*MATLAB HedTools**](https://www.hed-resources.org/en/latest/MatlabHedTools.md) explains how the users can use the HEDTools in MATLAB using one of three approaches: using MATLAB wrappers for the HED Python tools, using MATLAB wrappers for the HED web services, or by calling HED tools through EEGLAB. @@ -624,9 +624,6 @@ The [**HED online services**](https://hedtools.ucsd.edu/hed) can be called progr as described in [**Web tools and rest services**](web-tools-and-rest-services-anchor). -[**Python HEDTools in MATLAB**](./HedMatlabTools.md#python-hedtools-in-matlab) -explains how to install and call various Python tools from MATLAB. - (web-tools-and-rest-services-anchor)= #### Web tools and REST services From b2a829b85e879352fdf3b983a88dbe422df5b294 Mon Sep 17 00:00:00 2001 From: Kay Robbins <1189050+VisLab@users.noreply.github.com> Date: Fri, 31 May 2024 16:20:39 -0500 Subject: [PATCH 5/9] Minor typo corrections --- docs/source/FileRemodelingTools.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/FileRemodelingTools.md b/docs/source/FileRemodelingTools.md index 7719dce..7cf59aa 100644 --- a/docs/source/FileRemodelingTools.md +++ b/docs/source/FileRemodelingTools.md @@ -877,7 +877,7 @@ The resulting columns are called *stopped* and *stop_failed*, respectively. The results of executing this *factor_column* operation on the [**sample remodel event file**](sample-remodel-event-file-anchor) are: -````{admonition} Results of the factor_column operation on the sampe data. +````{admonition} Results of the factor_column operation on the sample data. | onset | duration | trial_type | stop_signal_delay | response_time | response_accuracy | response_hand | sex | stopped | stop_failed | | ----- | -------- | ---------- | ----------------- | ------------- | ----------------- | ------------- | --- | ---------- | ---------- | From 623e3e61bfed1072caa97267b9500975165e8a41 Mon Sep 17 00:00:00 2001 From: Kay Robbins <1189050+VisLab@users.noreply.github.com> Date: Sat, 1 Jun 2024 14:26:54 -0500 Subject: [PATCH 6/9] Minor update to onlne tools description --- docs/source/HedOnlineTools.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/source/HedOnlineTools.md b/docs/source/HedOnlineTools.md index 540c56e..d5d2184 100644 --- a/docs/source/HedOnlineTools.md +++ b/docs/source/HedOnlineTools.md @@ -19,13 +19,13 @@ about download and deployment information. The HED browser-based tools are organized into the following pages, each focused on a particular type of file. -| Operates on | URL | Description | -|-----------------| ----- | ------- | -| [**Events**](events-online-tools-anchor) | [**link**](https://hedtools.org/hed/events) | validation, summary, and generation tools. | +| Operates on | URL | Description | +|-----------------| ----- |------------------------------------------------------------| +| [**Events**](events-online-tools-anchor) | [**link**](https://hedtools.org/hed/events) | validation, summary, search, and generation tools. | | [**Sidecars**](sidecars-online-tools-anchor) | [**link**](https://hedtools.org/hed/sidecars) | validation, transformation, extraction, and merging tools. | -| [**Spreadsheets**](spreadsheets-online-tools-anchor) | [**link**](https://hedtools.org/hed/spreadsheets) | validation and transformation tools. | -| [**Strings**](strings-online-tools-anchor) | [**link**](https://hedtools.org/hed/spreadsheets) | validation and transformation tools. | -| [**Schemas**](schemas-online-tools-anchor) | [**link**](https://hedtools.org/hed/schemas) | validation, conversion, and comparison tools. | +| [**Spreadsheets**](spreadsheets-online-tools-anchor) | [**link**](https://hedtools.org/hed/spreadsheets) | validation and transformation tools. | +| [**Strings**](strings-online-tools-anchor) | [**link**](https://hedtools.org/hed/spreadsheets) | validation and transformation tools. | +| [**Schemas**](schemas-online-tools-anchor) | [**link**](https://hedtools.org/hed/schemas) | validation, conversion, and comparison tools. | Many of the tools require that you provide a HED schema. Usually, you can do this by selecting one of the standard HED versions using a pull-down menu, @@ -116,6 +116,8 @@ otherwise the tool returns the assembled `.tsv` events file. The online tools do not allow the option of retaining other columns in the returned file. A more general alternative is to use the remodeling tools through the interface. +#### Search annotations + #### Generate sidecar template Generating a sidecar template file from the information in a single events file From 04ef82f1fcd2b8505dc95c3468aeb13caa0f712a Mon Sep 17 00:00:00 2001 From: Kay Robbins <1189050+VisLab@users.noreply.github.com> Date: Thu, 6 Jun 2024 14:40:36 -0500 Subject: [PATCH 7/9] Updated the graphics --- docs/_static/images/HedToolsSchematic.png | Bin 0 -> 58087 bytes docs/source/HedAndEEGLAB.md | 198 ++++++++++++++ docs/source/HedMatlabTools.md | 243 +++--------------- docs/source/HedValidationGuide.md | 2 +- docs/source/HowCanYouUseHed.md | 2 +- docs/source/_static/images/MatlabHedTools.png | Bin 0 -> 56302 bytes docs/source/index.rst | 1 + 7 files changed, 230 insertions(+), 216 deletions(-) create mode 100644 docs/_static/images/HedToolsSchematic.png create mode 100644 docs/source/HedAndEEGLAB.md create mode 100644 docs/source/_static/images/MatlabHedTools.png diff --git a/docs/_static/images/HedToolsSchematic.png b/docs/_static/images/HedToolsSchematic.png new file mode 100644 index 0000000000000000000000000000000000000000..74b961a048dbea901d16a239fa71c7ee5c2cc80a GIT binary patch literal 58087 zcmeFZbyU<{7d8wCC?(x0-Q6nPB}mNBEg%ij-6$m>skAghcMRPjD4jz{C^dw1zQ6JI zexB!k-uUNR>s#+1?^?QCjB{e|bM1ZhzV<#usHw{1U{YWrAtB)?D#&OcA)!(uA)&l~ zfC7Btzxe(s@DH+!hP)I~`RJo9;0Mk}8r&NL8^|*QRK|&lpY$x-Lja54#b6k^3Es z%#o13`zp#vf;^3OZ+vROQ=c|t1MaLO!U8)kv{=XT#s#8tvOAv9c%q(AJA+mf4wxgE znICw{FbAXaKg6Ezt1T!E&3R-5DY1T6Rz*;^YbBQhCRVX4De9^9S24>mtY;j{ib!EJ zk)@W}INSZD%9!9`csjq+HshUnNRB<){6%2KU_bSj-)ZxWctAFDWX|tDN{aksM6&9? z|Ku}LVE_3zM}rUt{m;kh#S!Qse|)~4jTV}RzJGPyQr?$0{Mpk(r`*|Jc--Y+N zQr;y@TyeEH(-rK`xAwEk04T_3LI9@dV>L!eTx93@$-+Kul{=|s2S;dLuRyNcuG|hlS^MBBtZ7`5!IDz7Brgc7=hp7D1 R zk~%VH?-$4O=%CGfZGTg(g^J%RSn+!x^HUpO0u$Ik1KynZSw04=gB9mD(t8ur^7 t`*!-L$>y&WL&eG$u3B4G0Pw^rZD zm(sGi(I)nIf%A0dd!@F`+q-w>+YKyiH)@CkEK?K+4TRu^rZ1IoJJnqOo*N=LX@TiQ zD|=8+3?Ma0=C?8OY;0EWs6DGndqMY1P!l)#3JSfHT~@u1(C5B1#Wsb4REVjuGsC&V zAy&gp9W**^h{>R}xKm9Si}8y=cm%Hh4%O5Y!c(vs{?WydamB^>-l_Z><4L}L2i54~ z`3z#TykX0Y&imYpx&yG0=#a4IjZqBzWbnn8s{2B~s?BeP{akx8p1e9KxH #o5Yuk{TsHoT3uv&3b&&cM}#dwBPB? zll}zI5(Hj+r(-b5)`VD%{_lZ#z`(ex4hglc$Fv?N+3#AWqSE5YupcD3k{-Zvyp sD$tGY kPJsC@C*aHn0>(;gV<4|DDpcPg ztl(@F`J|-f?95+>h<+O3cS4?s0IO5GO`(}k%{W|QehEyC@jGNZRMgUT+^owkGY<-~ zb$nB}_7&kB-$a|(eamD1HYx=jWJR0{>mRkGea0NbL0393dVL^!lg_0<%0r}3JY^38 zKCJew)08}43Q2Tws}M(?HtC3yv3s$ {z+tTFP>+EF=z70v_M-0te4V zz-f;I?kA6=ijj;?(#1|xN?-EIkUy%du=x=()7!q|%Q(PH?z-#)V3ULzz~*^=;}~pn zvvQFoH#k BASjyEma?cN-jhq-E5h zcp6gWvz~m tIuaFQBnO8ENGxLaTN1WAy(-@V))6*P!N9%eNt zU2aPkei1W2VxRidZC482s?Taaf@~eLMA{evE{+(CD{^_Bo?o&@&A TR=71Lz^n)N(d7 zL4KsI^wlAw00kgv@sr%m(no@C-X7nr`CL(XeOKh;RwJ5v0c>=m;)k(sali^Ix!&7o z;Wy^{1bR_=Z+aMvJsn1BmwoGhT@G`BYFO``9*(j3l(fc%(&w4-F{ZP>>a2C)@&XpL zjLT+b)d6P8KiSmZXJ4os)QQS1jQ-h_y_WOdW`O0HyuoQNRqIh7*V6p$Ah-ddJJtO> z=t_I!P2m}*en^DL;Sn+XIQ)fP^Xi6p+BWo( =i~gD;wJl^NaA60`D#Hj zg19rkyJrHh6#YARF|7U0 pOp4MOtrhsRIr<>{k{Pt=wj(? QOW$KUHw=9N-5^qOl0Q*5?jKc_-0yWmQLE#$*iu~Ntf z&c~$okKWAZ(8#~+{K;+RE42SHrw9)?#Ytq?uWv#;b|wc;&5uf}epG1ZDv#DCCe+nB zU48di(D;^w*))oGMH_NXSl6sF!EwkLOHZ@Zs^7bGcydsmW#@B|Vq=E4ik{06?k`4i zu8)KxC(>u+2{VPg9*$KLvTGa0enKSsm>uv5ym}rJ_PmzZS%U4@vHGAXlP^%aBm<}O zsrmA+Wi2{Ko@cL5no VKMQ(ijIkFp6y0L@myPtN%G51}|u6roTw}N1{ zgjPAZ;=o9-Dyc^%@f0>yIN0SbtwM?y(|$~$|MI}N{OMJXg*LPVI!gh0OB@i^Bx!5f z%>HYAo16-|etDo0!kpxx9pJ4JYd~f#@FBl*;66n(ee|v&?OJb6-OQ0_J<$dt=(;hz zipe zC!e&+T$GJUh^Ik9cb}>tZ_9%DDj 3`j3NfS_9_9SxagS-}*@wqcXvRvi1Bp>`B5X i72+;vuBFf)Zo@uz tY0%K=UQZ(bY0h zK4865hGb;xl%q8J_1YV4DZ{+~M=c8XHt(@`r_w$2Pu(yW|&T#~&6d4NE~jlW0ZA zp1+l1W!aeZMPY-~<}&QIz8J7FMMs>DR~UXA`y8j!+6Ji!vLpKLO)pHy$2~&Bc_I=6 zE~?$u*EdpWAuVW;;tT}Gwq{XaEF?!d&mBiD-O$o}5uFJYp|Tdc?^^<*W(wSAF>GQX zchos{t{Cbl<9#)HPcu86glHHPf@~%_>K;kj2F2B&o5=28{PcO^B`V=L*oK<4zku5a z4H5T?4W8HaAdw&(yi0SBhTJcC@@f>SXT&` L`RVyA9o5e_Gadq9&0fiw{~!xsxY8^To-k|s+J z_$JF4?r@(SPF;{WKN-~8T?#sg_ruWZ<5+|Wmq$IA)7@t`&U@(2Qwm?e1;xfh2|gKj zLr4FBzXomp)%qI!N<1 7+G`y zC1!EnHI;pmi24EJ&yJC?kkVikFF)l<-HMxHqi`eO4AE5Hz|_AH)oGohv qY z21LOYN`IXf30!~%o*0*rq`Q>L1`>ryYk55 =2Qi>j-g@U?;KEJ_{8+e<_$ghBB;Q}`+`|gIa{n`y0xN$gD z=&0lMp&5c?z_mJZCHd{K8cD-?T;v=oOg}iP^rxY+igk0~{=@lFLq_kEL)F72y=hmf zG>2yE4GZF{1EI?My)z~ R+V@(|gz)BX zU66$~_&SQ?IdGf1vCW}1_z`Ke>3XZxXToVpFy5(tdXKzOl-af??4G)rT|@z-Ymnmg z40XWdp1Q9J*rcl!VN1L}Tb+{_FxdCRT~vS8!#69w_coOxIu0jnKUj9?O-e1HO4{?I z+a(s3QXr(nJHFS{1r2nJ!AiY7hL6{pxwA H9R-K;=^w@3Y2G@)X35ZVALqbUf z+PwS6;_Rr+%k?yz0(QX9lspBbu;nIjWM5iIjTaQm5@}T%T@j(i )e%>u;eZNxH zevKhDt&wEiymc`2>cU5RB#Eh=N0~gD8My#OBkYr~5Iyn3t~7nNO4-EafSuOUTV_1q zz*NJsSl|X{prod;ul>|^7Y?gS&WoH3=C3W18&Fh)`)2)QuXusukVao-tAiITd@+$$ zcLQz;u&`*|p6*4e(KkwKVjExC@(`)tD71P`Dmw>KyeaP6Kd?D}c mT0gxWqz$4CT&GKo2d<1||ls!$8yBtGlt!bZWQii^a(OA0X#LfaYR zuE;)P5;Xf}1TF9JjPA1Q^kA-@8-Dt;Plz1rVf@sGg@$M)P?x06xTdyGRZ;Vyl(R?{ zU3wxX3ECjfcco#vG==rgsbIuYz->_0rF;ro&OQRK!r=-yu$(TB>5Q<^`?dmmWUvsp zzCE|)ypa5@cmSEpwzT@K9hTfzW4f%%ww>GiRl`JJeIRl;iTAUgJlMLiF?rDWun(_K z0XrZ5lw!dIiQGeWiR#+i;GKC=oJ~;}*bG@paMG3Zi%r0Jh`tGSTzn*zgqAmOy$94g zW8CiRJvd2f=-2w{yeuEeKHVm&MPPhU_ar~VXD-kXyQzA8q7oHfxn53|m9e;{6yDl2 zV3y!~_@p`yDr}=Pfrd169Tnt~&nq!S=t+rObg5ibPIpv3wOx>=^~9|*?fi#8;cS$w zgvElCrv&ZzrDN-i98|?VC~ |kprTT{ITEF5&cmuV6Jpn1A4qXKSho*A*&4c z_bMDO+QNo;XL}}bfDi)C`HugCep}fK&;FkRWJ@;MUrhpm7`YdZ&&>Bsb0IUS?{g6a zz&Sxu) IlEPpHspDXqr6f`NSp-bnlB^9ciH8{MpK0ofe!hixdtSL66 z9>`E^@_ h)!F-U1KUczZxIMi7m^tFgCQIBCh<35r $v1MIwksf| z;aS6zost850LO7hZftHY6|hU+`ZVBcVgo-~FLbdXZvn|66#&2RXb!f}==)| @*PO{5L{1+M_v(T$rnM{mpIh`$L> z=(~m+)G&En-j|3l88~hedhfjxA@eg9$Pq#t>`me}K!ODJc&SjO(3T|fId-Hh;EafM zrC?Gczl*PC5&LazpeSlJZ2if-k&oA;#~@7Wq(|6qDG$D*(h7PW)3Fs);q^a>5!oJr z<`rE6#3-bC{YJgJa75crl%`jsv@?$WOIkUxJ{t{H2n|PEZ|1nk`FBdap|vnPqAH_Z zw %XNCscb;ffTr}!A!VbWr}AGiVE zuG))BVom|Bv|5BdBK$fNvzT5ECi|*}guTL_0n7qYLtAWG&7UJ8yb6E*Qtu2rm`)8I z%(hn?VxE8 8o{x_fQxQg(M)gHLhdtbkMgg 4c=NNy-m7KZAxpn9cDs*C!CfD4MY5jSo1^XER_3S$jD-*4|ITEy*2-Yo7| z@@+S~R1~w5Gjk!;)ybDUDpZ>HO+jTIBB9hk?(~p`@TU O_>S6CvvQH_}`tHCO4t{~WWJ`YiSt|N+m{lBWvRcO+_xWMP;bY7` ztQ$qGrz8ZScB0 LH6Ny@me-ePRW 0s)HjzO`$d%D5T%a!2XYUPRDx$3$NTr++ zQK>tOZL7q1pf+L+ia0;lgqmy{Bq#?soI#}3ec`@r( obNe> oE7 zP`9NepzW56 +}=C>s-_Q!Y4zpiLI+^@-L6JUpCbc_SG{ z)p)Syeb1<}U&z<(Q^{_qP(9jQa;grxTxJuI^muccLxPPas1B&ufVHyjj!2F->3mX( zj50wH*{H*5Ll0O@!B{?gCP@>GX$fIffj6=2ght4nX^wNps!uxH8g|l%nyq!u>jT*> zvDDw2sDEmhFJE{nIold;#SQv}0+tHzbh_Kmpd9D5A;escZ0Z+n(e(x5ZRD e4J$4!laZ=|^;% zn|Z|4K~ulCJS=D@ w;rC1*zP>9vo4?AH@I*sh z_EkRJaJ*f8XA|3UWmST2p&y)9bLsH72xs+WLzyq749)N?BPNTa4V;6c1yyM5c)CA> za*0=x1IgE8LKMC_^1YrfTn7hC1y*>l9T#-K;hoX|-K=j>`Uyj9nup?1QWashw)Tm7 z(Pq5a-eJ57^j#@)A7=}?^!WLb|Kz(IRxaRfsZIp~VDDdJzh)3x#&GPSC&Wi`Xtu0* z{}cUQk@I90Qc3skxXkWCN(`2uu|B2y4PmxdvK1jWeGNRTuI|?EUr-f}# Sfx2S>MFaU-zU=1>pLyXTCYI!s6Q3JP z56KQkPeUCtrXygU$&Tzz92EwkwczuhU#cDrI}QqQVY&Q7w-ppU8Tlya=hM@o=CU;C zA&!uI8-TxsR1<_Cu3&^&qE_E`3`V2>j9 9*w2meFNvM!M$20{L`}#zpEj_B4CIg zkcfh{#*<2JGvdZ+2jkA%QwSKtisJV )CQ$$;=@=-&Su{(ryfKp}LT7hNv4 z1vi^D88gQIpHpQY(AcB?eRSYv^jDjtx0g4f?ebNKXllJgu%ro9hso&<@(g~wWMRvV z&u-M#mGR_*qOwrS^=r+&?SK~ZiF+lZ@hFD#UH*^W%#j8h4^jRH>l|mIf1MH#WfiRh z5~j63iE5}1aGol&(XvozjIF+`PYEb4NEny;8*529ohuUMmAY*^45fr>O}7A%&3&kC z3su#xpU!xKf5_zS1|?3J4TGM;LCqb+zLk#4vc`TADraHnA?Ud*9I`|#j{w^e17cQI zpy1e-ReC)xEF6%+{i#HQb>%m69I1~!+TEi)qx$S}d}nbBA3wlM`=zHSedr^2ueayI z%bbNtr;ss{TB2WHl3v9r&B!>10I^ssBAj8B4WT)c2Y>mCBgXs>j=2Bo4@ayd7;C|4 zSoMg|Z(l9GE|C!LKS| 66+&KV#<;M zb||d~#wp4|63j!plQ9ocwi(P%Mvv)KHq|z&$pCEScLZHJ&Pzttt`ZSa-7W#008fX5 z2EULQ7&(M;2jC8om{INF8Q#?~+0n!sa{@f7u7uz!NfP~4i}ebMVgT`Jzt7+raa2l0 z =>F5ue} z<|IlxM&5P1)w0QFD%ol19mijnk@aa^VB87Bu#GeVqN-Uu-buxswr%L=gQgA-QYo_~ zeVpa6)&|_L2CxFdt8{@=qCOh^OYP;3?RtsHWsaU5%Bd~KLZ7cz`(o&2l+{?w)9=|> zIt^12@BiyOYq8PezVwaI#F@{ETgWtQ#at3958d$?ZlqM3t34Z_JSc=l(vu6ibsQaz zKk!KzyD8bERuR7)x83Esj0Z2EIka4(u&=aY(xjj*vM dB z(@b?h-wwIL^uJuHg$=g>eRmwbVLl2c*}3#$aNuIEC1rd}Bc;7}?0c2BiHl%gE)<0& z_Or)cq?JOC6*(P9ooalSUsrIbE1i~o%sW4Q%e-7Ra1s=Eqk%QMgUh*;ab##@7+3XB z=9Z|(BzyD+SNozWDl5->G9 dOM88lY@%s@VZBVy3eaTTS?+9{- ~-xzR}K88Xe!hs;s>&I-M|vKVubN V5$W@LG!jY01QX22*)bKuvRZ%-lcFUl!ja8da3z%z3AveY zC@Ss@U($k@M mvaK!^ShRdnmUu z9;7@33RV9$uh-m(Q4%>JBXi;( |8<%O!HFa 9)3{NJOJ+@Rr3TWPG9kpYp58fPrHMn1L?ysf{V|>MBsKFdxt* zoV0RS)nN1BX~cozJQw~tz%HzdrNJ}sv{PHvyLX0LWgrUyWxzTX}%te zzym+fPHJ%`A(j14)ej`@`bq!c`H67k!m8RQ?u#l&jCZA}FiMhR(`P%pRms7t8p~O3 zNfcjd4r^r8c=|82@{_e8s^e8tHM>yFy&B9@OPct{3b!rohyC3nbPU7hs&fQmlx1Jg zrDYS(E(utO|8wNPdr?fU7+nrU4f&(?&|*mI@IWgXa~T%h35|Dd(zJ=^9_lqZmw6KT z-!~H*1-9{|Cf-px5)6$d)EwvUWBY%R^#9i^f;xBni!2+a>D*ftplYw&xG`Gx(%$Fv zM@5TGpK_$q@1*EYelk!55(J9Fqq@x$=~(0I_h-F;a#l{j z*3aEHKI!UA?zdY~YqXXQpNcMv%|1{-ZZi-W8!CCyq#D?gyY!`=(AL_I7s;t1bWooP zp!sJ%Gba_G)@^d`Kk<9i*5%G=vYuG}lKtaio&PwwN6N4|b6!0pfC&&2Q&NsW091$e z+Fle{HTP9t5M@!{+37OStf7)4q5cF&A8);HdsBdpqF*0it@T0|=g$(x+7tJ9WglqR zPqiZ`?=b4zcnZio);dx@yQtF{g7N&*#PecXLj4LjO>0E+NB`NW@-p&sOV=*#^g8ev z?}q$##ia)@J`c|vq#+GX8?W<^_oKZYfG>^c@2`cdBm!1AWHkd9Ma%|FI&K`DKJNBq ze9+#twJT~j{9lKyhy%7CncQKT^MJX#o-R87&`Quys{>AV$}`XhAoX`)YPqVryL#e^ zZnS&hyD{6#iWe7a3~5hv+@>AH7QBF5==@i>a@)brq}Fppua7HfjY-gt=@(eKfj}Z0 z7_DSe1VMrcsa_wjzv2VbBMwyI5{%RYNO0s}Zo?V+dr_bJUhJoP`w^FhQ48l^o{{~X zH?@1(UNLFIAeKp=1j__J*1C2N2MA74yd`E!UcIBa?c{9tyucJ-<0$>1F4E-P*U#Bx z#9=_>+_Qgm>tfT))o=^b{5x&i>iXV(t?&8}KMKOP`g-n9BGhk5Px2cE #4=mj6S7XD_m_035b;p`t-b7!lm~1;GGuRw>I=# zk2#8Uc)Q+$+kAE1xyzD8$)b2`(MDQMd7MnAH<|1)!S^u@@algy{7?Z6KM??-peKcZ z4>+RfOi*lA$j;!EknnRKM1iP}3sH3`%3bo^d3?1w_d&B6@|pv6PI9Wf0bc+3O!D6*tm`y zc#3?Ng)?>|UAUk}Kme2&p>qh_#`ZzqO($jJ!-Xk9rG}3;k%@1C6lxJo3gUg8KQoJx zWi&wtwh>4H8h(%|uyf+n0f2(@ulgdonS|`nHDcs5J;(E?LH05s>U6EAmy{EutuoIW zW7DUe?L34%24T->PPO+-Ffbn#@)xJ&ps54^Ni1+8&)zM@&{oGtk^Hihg=@)FN3KUH z*ZbZ8xqZJ(Vg=+q+QA)=phcQl$R?d-XY#^W<;=_{%w}*E{2eQ}7x|rn==(9(=NvHN zUo2!D*b`8-d7q=y^OL?oIaS0Z{j>qql$@9veM`ia6qMWOG9}_sKKn5n;_WycZ-2qK z$k%=_Lx7vJ(|#J7!GO$%=mhEuL39G4Eh}gpI+E6eU6rE+(+d71dLYgN(=6U OG13-M-Y8PlV&*KH_mK%x7*DOxWA zJ(tsaJ%VYYOEzpjLPMdj0I;XVXQ9{25AOyr7T5cP9|MWQAS?Y`eCg rszF2i&S;Vz >EWcC7{o{D|5~h}^tfi?9 zG))ODM?J9vBZ4YhnCAuB$D-}sw4LFHa*MjlW`-rySUN%k8sJYy$Ei 4V0%($dzR@Y1Y^9J@BjK~F(&Iv z)Vtm4?d4Z1n|P9EBB6^|s|A`Jh8h+eNQxm)?&+kEp9S(r#c!3^=@*>XvNfpKSIWO@ zNrRU>jP2_4@<{G&JJ6(^;S13>qglJZomJ&`J^a({^kQWL@T@(`^&(Ew|XOY`!%~ zSfj;isI7tMKr724<~ 0ITiu|-fOUO`sgFfG+`S2gSb{buH4{cpXXo`&q_z2{JzS48uae8KCg@r zjyaCS8I$w!pNxr;7)45%IqUi~q4aax&Y{` i#$(s&MgV5Pt?gvhF!lXim_#4uTw*+rQtqU+@lE_^ETRZ5yX?>YLyP!xJ@HKK(5 z5HK0lH9Z)~25sv{1PoQwP!+L2$(tEVlO{4R*5cGxD~GzaD6o@y&Mi6Gw(!?)=B73m zg^c`z%)dxBAR%A*T%Ux9kF$xdTq#HoY^#t~YPKLwXl3NeP|97fMW^D|p(+NK =Ok_KgM6Ag}7OdZ<-{@n5h5yq1 zQ~pB|H397t*H}ht(%&G1eXMneukFT3+vmN90hS#z0ciqJ857e%)i6_u3sg)2tLRn~ zeF?RfAaSE{0xY=3NVpVDk1CX nP zLJzl3Sd+3L*+)UmID>}6Z4##w%Hn503#n3Ft5>^nV#W!F)?TVGLlLC%IU?na4MC*5 zQZW_1twXCgWF8I*g1gES3VoYuo xOiO`P`N@bU0RiKUN*! 4m$$(x z*+EMEod8`TuVr6jt~eBOYu60mF3@~0_{CW{S_`febB|+fZA}MBiTj90BxL(jO4%Wa zRfCnL5s>wNJGz-D51xWG5tumWn3X#^+o^9XC?t!kQ ^ Tgk4IqMhcXww=?IxD8!&o{XSY z76eL>08*A4oOBEF6CO8iEDY(SpnQJhi7kvZ?1LjW@k%CA_O~@AXI8urIX;&QF{nDU z#Bhcv0kKqKDYR%Xg|q9oOX-OkY6u+SQoJ~{Y*ti5UU?sfIZ+_2U-D|QZJ;RcE#$e& zP}$~l^sN4(Oe=0kE}P&|bj|U%HR#YmSCO^Q%j?Oygcw6Ha$mE~b= )RGldyD$*fM*kF9X#AJ>Z z(MHEL9XR?7JJdUrsmrLu=FCqSBv1BxNY6%bn9HcT6f?v5j+a6v2~IN~ooS_C_DH9} z?aE@*^$`FURRr*DR19P)27S~J6hP46m8& ;4{A6fkGbSh2>^#Xkv$aFRaX%WwetQ F5tcDTp+X6~w5>0I2T)O(;=tw9 e!EGJns!L zk?=3I^PXHPT6i)<50iVmOzeMpp;3$(j-LA-EhYBXL3o=T4DB+TXX1U`&!4-U*2bed z#72r4|K0}~)Max3ZZub$BF)5K9Zoo%*lYI!>XieE#(h-_wc?%!AI%p5f%)h> (;cr>q>V` `O_N= zNp}ERd6{{)8Eek|PoKf|z1Z@cuKcj26iNn)%- iR*A f7HCoy*r?hiDgwF&gs^CBV}ps0vbw% z#gtb+P()7$y4aYHjv>#u5J%(8T0pdq6-a^ffv`9Om5NJ9KHq=pC>qK%RFVS(A97h{ z^)s9C4(bS%tXp!o%;3?p$V)U6E}Xg3o#*V9$Kh$%n}g!aZ1fp1c9BsX9$@eF1O 2`-D8k|w+h8fkuU)38($S!exx2zx$#azf?jp3Jh}Aw_gH z19JV&Xtn+asnXXHNd|Y>Hp~IzCU^vB wvjQ-=-f)uV!mrmF=zdJRd#87fb^Rk4>zXG~Bzwr<6Jle@0sFlgv$d07V^OvQNr zD)XQxCKu#vXKLS@SehEvK-`I^crC)Jm9ANP^>BnwOcHUdvIS_XyspsowrSjfEQe+; z+qtaupw<>VqwLU6&ZNO^kK;>~SL+{EyDgg~;i^CERK=brt>}E9#|yC3X0rmz6bPv) z$&>PStTbu#b!t!b=03biwmcG4<~oZ0N%vC3npLtc1n?RXPqQ}gONfBAzZzy2a;Fui z=iLY02p4l3m6%{C)>&{6@?UKL?cyl=UPtmev(Ugg=JQxsd25pbu`Qu@$s=s^2hFlW zqe(-J3`i8%Qf9y%kgjWA25>$Je$R5aV*A^e%4`jKes1eq3BLSmMW?-|bt@}VETm~Q z^%NfJgTlF`c~_c M7uvUs!cRhm}JN*x6R)1SM+A+XI4!&BZ z5@-75ldr1N9Yto(ND*DF%xT;KEj+;rYB|QqklJXEiGZO3keWhg5qQ|D67b=hGW6u^rP zraLC#iSz+f=xp)fy*aU8BfyGGf3H}Q!0{xjx&Dw6sX4^{YpaQ%nxW~-Ab>90s8SSJ zx7?;F7Q{=ScK&6JmoK5)cS5j~7PTw0L2jOth?^4JvJ6v_L+|#1^}&*NV-)JpAwN_< zcT&?o=Vkq*S;FcKJUp~$FEGj~>yL{f10GTcQWgvWP}X3B4U_UUym%y7K89tt tyl| fvCQmXCg~TK7?^!N-G6g=+_YbtM7ww%t3N3s0 z+kIrMvf@_ac >N*muTc>`Wg@dn2-EkQ{!j$cci5oM(T$~4`@R} z0qQbZjaU B1`GjS05eytjJ=`ltSEH8kSgbx-qsYD zHO>Zz%kY&YV)SDD&n-apK*?%b@c|7$#C>7W=Afw~TV9B5y*enxHfCjL@cN~`Uyp|) z=Y 6_GnRfW|*m@E1I=EF%3hx&Q9{PO96xQR(sT zFG&TDJ^_@1rJ!OGn4gS+c=4I)=hXzw^Ts8X22~k#AgsE(PSRG{I>9@o_{UW09C|(+ zr-$KfrJQC8N}45CtqY*PCwP@y;1oF|tu9b|HEWAd#a|pQuQW&&@%(Whg{Rubc5i^? zy`?YWZDaz71xStMI#aqc)~*$A`x-JUJ`R%#_?A(+Kl;a-hW1O|RPF# fAlpXj z3p{K6a$2MjiJluB%+){0x7|aeIy!IE7FfCV56x{4-72Jx$zl^lbzN{4#{&s$biCtq zM{Y?11U%XZZA;;z-W6865k|aQeE`6b1~NW$Oxw5UGZMvv2;l1FlV0+ZStPcIvo@Wi z42ReG&7qt={>R>|=c34pTQDYu-@O(Pdt^`|wBL{cppEINbGo2(Kf?_OM~h0V=?(hy z-iEr?tj9mJGUWycQdt8SdBTk1V`w^82?r2<{WaF<$F{3Y5}cCqOkPF!j6l=jCKPu6 z-_$&x4A`)u^%mXTeYUZ@rhfaH{@H|sgZWcm?A$K^G&9!G>ITI_S*T_fT293N=fP7F z0Jn&GwNNK^Bi{-<5qR^nu}_o&7!3S&3t%uZcB6~i^ST~g{g-5d=c%d6 z+PlfG0bWsa1Ylmk5|o`q@!JeC6v}9+#sd&ROj8|^9@0O~3wIEj7auS)9Odg!0X*!j zVfbs)>x4cB8{0BA5xO4ffl@#__KVMM#1zQ?9Ex~k11xO3nAQ}=70+5{#XZE}`6itk zgNt$K9$D>)73x2v6s@&Ad*X#nx0;aOmaRkNP%o1NJSyHmG-{@E1FNyyU|a-xj8Jt1 zetYl_*v=~~y`TG)bd1wiL`caMkLb_;l3c_KM0y4UxfQCPwJrv9-)q8!mwoz(^t3 f4rUcKo}*XYH57BB0Mjp^pEE>H5lyfKRMR3g(P9iTq{?`Go!1geevxv^ z{MWAS>2XtHsIohYQUEB@dy%lNGFfjfEqLxmy!4c|y8jOe?GX xp@e1IJP!>Xrbs6pmzXLV+)*5zqe<6_jHplZc%o+MK(Kd94j|w3`OCPvOmX zlA2cU!~T0}p!fpRxFc$T=MCwshC77h*kZrT|99V#3Hea|?cqPM0YsR<@33M1V8uQD zzuOAH88`p8qUk82fk!pDGC7?J+P_ax!~fQEu;9K{#!1>&_oa55hqof% XHc>i^9_Neg~9@u?Zf;*7Y19nnWBSYbhpUM@QHNMtv z7g~-w)o)QBN|x(Af*#MOp>sB_MSg9J3j1b*GqC~Wff2X1Z?-X9OTL*rK$Kbb_b*x( z9>yQ%zSfi{>~ENrCJBkB+SmokNOFia!GFS{)i4hEDKi&)S?59PQ|k8Rdp;rGewVe7 z^LDfJy$*q2B+yhckmc-$gw_nuU5LJ@eUgx&hAEdSw$awzp?4J`nv7<>%G&HHTc<~1 z`uCMvDA4VPN0Z(??*N+QR1MtgGKj}r-S )u>5A@;`ZA;BZ(t^OLRqm2Ku(e5+|9 zw5W1#fjwv|dR$S#C?m%}{(1Yqad<{n^kL~X=0VdZ$#1SFS2;of@xqT}1l8kuTkcgt zi9eLmS`PtFeF6f$?(^Vpl-RsNzD6XBN-?y LO2G2 z;;qyi?#gj_b4K=+b6)4$t5~z+20f> hsL| zVXnF6!+eH)ulRTU7Ux|vFFALIFQz;cta|&=2QJm=CxVuj_UavmVbls|Cloc-w5&3< zWUU9uN}=fM%uh3Os^({z7-5HO{I4bxtI}S)TWl`f-rm2EJ*0tQtJ8A&;_haC rn^w>hf zx>}KeUHqEc6xIxbj|*i2hqOlCEi2&UJ&max*+47}Gn=s@FlJOcwa9%iqe$Ncge#~z zIljP2_6=0X+Ti?F;M~9KdEn)(yVlalStpfi5~A({+8YCPahh@xwn_$8^K`ff#2GH~ zQshNTJ-)7Pz(})1<|&2}rd`J1jpJT0(q_vFf2SCMCpAdU&34x6LA$AoChjYbF21B3 zI5vhv-!(_cX0_P+@OvO#*}wYo*}6PS^(`fY5z$GB1;y#j9J#i1ACc_HAA0)*DxGcu z1u$BMGcSw953G 5()KTT58a=g=}fm#n6^zl?^II9!wI& z95H7!KRrRP@>nl5 Y-@=J5EMGi7^0y{1B9?oR%r(eaQRst@av#>hG% zA$fkACF}QebONl}YZMrz+Y!Zl 9g>4AxWb369WA;f};5t3@mB^Hru`eR73?lyPuUkEE+e{YM8`j~YkCP1n+ zwSkK`XS9wDr0^?9WWydTDpqCj>(=SiIFJZ6?;fu9^S`fx71;Z-E3t{MlWI>`IBAwT znq=szl7$%~ynGK8sAl}a{qcTGuOB2ort6O}mJt@0Ff-WG&e|3pmxs;LEGbuw$$1_K zAJMU`>()_{p0rvLokjbq=Vxy^w$+riGP%lLnR0PN5)0|*hYyJVu7bIh46~(CVZ3I} zX_ZNw+n*F`OrH_OsJERBGHp@}C#9k7dYE2si+PTak$JZvlwULtbsk7cNQ5TC!KUK+ zZjw-$`}Q-Z$m?06F%XjpHCG0HofSokX$`1 8{YPv{0!A}A zd7QPmSbR&PiZt&lJIFheIPncrK~H8x6kO3+$bH`4;x@xfu7hS!7Sp3H+Do%NaOmI* z)p<=UL|MR@S(GaOW|KPp0HJ`+l7_}YMIV^nAoZV)#(xOJF(oxEq#M+=nYY@NBk@?( z2M{L{npc~ue*Ub>7KNX&1ifgX3Dm3<8DVnSmdGklZKM3Wy8YNnD~#Em{TTlFM;oV9 zar2!C>t>Uy9M!1(J4 QYDXA*`ra *(M#)baMg n}Wjq|!LG40n`dCU_{xN16G-Uj>_N~nWJ zYiipQrvS>`2v@vm+HAM9#dPD9M#e+JhOcOq&I@UtNcM-RE3l!_6A-g3xSkbd!R;J! zkYmYmUahqx1YkcnnGTY%G8$8m5*4p1ywa#8pR$WP0+p${tlieObjogD76{hP&c0oW z@^$EzhVAf|cO!i-$6tsa&xy!zI|s)jgcPeqsu5|b1FCkZ{Ylk2p`ka} <1@hh8b zSba8}J~5Io4H_Fw+cZgW(`Q)iW<{vrfLoloQ+?VES9eyO5a1pUZ?U+7k#?K7VBOoN zMd+np`ztGq2DL;UUQoX&mTE~gP!czH6Kaq**{U 3gbCrYp!7ERXp3 zi#bpv1YjN;Yy=~-Uk=#G@g!9&ddw`;JqrR$yC#j-rR>%dx60lT7jc??p)3%h9VAVU z6_RGzDluXRRc BD9&`!pkKYm;Ti-JcEU7kwDg6)4g)h0)BISz6eR?umc1wR)q8gqfNIqB`3 zq##WY^(zGVWy*fE7lPVFG02*WfV>86FFcvG2 dWiKzz0*8ceY$3R_2Y`^3r=dU0E_3vFm z!`uqu=c8ti!2oAP7&&Pm4@k|NhbEflRU``BX8XpO(NGtn&4Uk4nuf49Ak+WbUZ61U zdh_#GOf^nL5E?FgNEcw`rU%KX?B9+REWAViW-f0Nn(;mV$7gqH%VI~l{-IJ91bv{u zZ9a!J*m*vxf6aBw6-yRil$HJVtxEeXaaAk P{r;5qV6R?DAdLtP^sc|ML_z8E!lih#k|P{jZ0Q{pgoa?5Dny1 zuJB!BgYeLP@~5x;#uPxE;2$$u_Z`l-69*w5M7(T{@go;OG3?pntTFOSc>}T)KjKuL zu ;c^ho#PQyApW5b);~kp#&BW?QwbXZI__#<^>#(V z{GFyU)um1%kaYbap++o6nf&(|!E7A;#f5oiP{DjHo}Tm1mu^FOOMr?NZw-JY()B^t zCz@<%K9Qd0Ui2+69{JNe4UK^;+x3rmFRl&1!~ofo+W`KUVcF~==0B2KFa*%+04SaG zao`)b*Q8kB-$K-gCu<3jx %n{N 24AvVB5Y4SUk#OL~B!oceLQo(cA?>!mT=Qms@BWklYOFJmtsj)w z?FGe089aT2=ZAL#|JS%(yD`t8ndd~bNpxh9i1U8JgA_0J>1amH?!ys=;Vktqx@TK8 zTcT;H$2M!zBE`oCRJUu)3g2+Bop#nrkKAIDL*wKU^eEVs-M>m5=!tUS!`N=Iogf zVya2)YXyO}Ia{n~Rjq`y7jiXy00n%|&C9bqaPJ>}2<}-)TD!%H9diT8+mn>C3jb9G z-F@yzFaV*QEe7Cu!H8l=*>@~DQq9+&bW1wE^#^FzFt1|Bs=jaBVKAV{M%3J{uW=)C z`*MMIl87|W5d@|SSMHt1?l$&W-(&Zj_!O;d;oaqC&_`S)&;c?eKd#EAf1g5#8zDY{ zi#UBYL74jN@iU7PQ@moc;N`HM+6w!Q-e|qF2S x)Ip-g7SJX!c zQQXppDS1nggm4QnHU9|VHHn{A` H{m z%{Dsm@tc#l4F}DYPe*7f>vp2`4Eeu;?!|JnezO)CZ=B$Xu`U;EacxwJP$6Z)N3G*Q zGXY~e2BsB(t7LUg5zS8Tisb&YM-zQwF&)osPQ&zty3@~SrRUFoiy{{@zwUMW0;Fi?S08%a>jC4!v!?ai>Q@u9tJ(kM!yC&!Qks$Ez3SVFKt5 ztwa$fOHVRK97CSvdzkg54H@fKlQAN`!WcH _RvY%iV^o(;LE=iBp3YRjx {vr-4o3K-+@j{-r_lmw+li2j+`R8w)FLYU}tzsgSTst|%Iac7@ Dchj~& zFQC$57AyTGeq~g3#>&@kM6?sl$?2)%7 _W5KR%y6b$l_=YOJYNYEVb8pR?!e0w#?BpnGVv+%hnLhn_X4` zRHl!v=bIFzixnCW@**AD1j>D~Mb=*mm`M&O;CSI+YuGReK(ADre zX;wC0#J{)q0A6BL`uM*0Y-M7Mdf8w|d02su5dk-vHGWMuSNa-y$K^5)zxN<&JP(Pb z_1CD=J4qEv2a8G$Rret@y7SJ{X0^nXnCkLd_bBf1^2gSr`A3Dsf023l2G^2{wk27F zPR$z`C+xUoylWeAQBD1sWS*|)`b&JvHENv$_MvRz$Cq;$&O`c2#Jg ${gOYGUGBLV4cRg zJycNG$4gw7oow|Lmm)^15nlEHsc;~!&gEKIOcJZdoNo0B;uL7C9btwh>1y;Br43+g z9bDHZHDDGN#&sao=mv6X1 DkXC0p&RbC*OC&PTKdio+DyLO#{it6f z>pAy|OU@B)!Lh9Uwd6XN*b^MWeGa$-)mi>{^O>=}x;d=VQAhGB>P7%y-W=-m(duV4 zy8!G>xyFGTfM0 &HHZx4w7k@&VjkN@rF z00pUqGqah4RK(swjHBA?hzni1Pt^w5X4_&^Mx;(a{I7IWv@o%cN(1+3h<>lTxLm{R z^0QO5Ox0D{k0!E1ON~P9!{Gy~O&raOnhK`OAACX{qBARuqHp07l(I )CCGm@`Dk3q(pW+p6)tP#?Xw=hlD!g^+N)!_AHtVG58M`K z0Kvqq1yHFv`TO_?ez`07kgvCY`JOK-@-w?Q_PDR$XaW4a2X{0Z%Y|@V@CvR>yr 1W _2nGFubcPK%ZspNU_H)j8M}7~ zO3f^*USSDdWLME2be5=^3{;6{OA^FpKD(7$_0nT9Y!NPUdeT|)AtdU;R3kf{_rCOL zoTX;`8w!uaGjryau?T<%c}djRvx>_MAck!}a#sGw&12|Ys;xq?V1lz9wau+ H3EcYp9+A44Wa0~w|2x(Z zGEZdLT$DwTI;fp>EW2Po{(ByW8dWl6Wvck8GeYBL#5>Ado }8%p9g!@tmlru zW7#oiPY^fW<9Dp`xfL*0fvwHkNw&dash-LqK63r)WLF0D rkHl{^o|kZkjXdSl5@q)j6>|=N`mN*QXz*YFIU<&@o>+)YxC7 z)De-d9%}!3;b7-Q>bS(036#_G0n*J&8l}8P0IUvv;Vz~lHvQvyaS94@PV$FNOBrl4 zpK@zZ8+GgCVMS=-;+T0kw-18sg*4>~uOc@Xv{@!KC9@;%#`4rue#$X$K*kH-x{9wB z&o(bYxXELmD3~hFj->Sd;4{`}bWsK3C`G6lwp#Z)+DHeTf=LqI;{xE~)6+G8**`}e zHTi$kQ~`PtS_^IwW8E_DZZ_yeXCN2b_1-3rDDv6Dn-WhC zt9pel7P9zw;~c tqa!LEgB%+l-|T#SElDH!OP7Ydj$g zpjrO`!Y}up2^-_|>Ryr9)wewxYh22fxah8RFuKo-sSkoF2===Fiz)#4{^{jxBm!JK z;qB#l5R#8przSv`3c^qbAw~@g!onMl0 9MVHc{pj_mejvSGXBogi1V7dUa5$?5cS0@Bbk z3O}d-rrr4PR%@&cx;3xzPysM@=+6M_=GUK Q$?&^jzR8j^HcCX`p?^?~4DeQ7oBTCf!ibYaiGFx>Ff& z!B8+Oim?RZ9*w`5x^P 1TmZwK z8QgG<#`EZkv@}sSGs{I9b5Joymw5Q$^GDF$fxs%Dnrl^tSx3%%@q6`EO#z<)5BJq& zWi|Yrw~6P`O7QB6B%0g8`;TDg?nUYD &|8Z(+1)G^)N&$#pD8|u !y-+UQLk5>5Ud5w&Ut(xLA=m*wk zQCOrU4UF);Ny k-8rO+mrw0k6PNGC+ z^mX|lf09&t*ZjnvCFaUC r}}g_Ww6SXAjl zz@zRl=LV=-B*hqk2&lUcUqA!li?p*t0plZL?2mQa{YTmlSy>(a}FVOBV#pKF9%e z-r)$(s1ASH;Qllvw9{DlYCJ+3yj;`f9LVFU76(AH)WXm`XTybhhmR8tcxW@P1l$Wi z0>78@2fx>=05jTXl!vpX{7cUBpw(lRkrT?szBS4vBV6O2*=p9E!Eyy6bbFDBg< Co`OjKJr^oYy)wyTq+*i{Q2xNCQtkzuOX_qeM#c6y)B$ zusKI(LgFCqp_l?WKMk;F-rGnlJan{cnTXXr0;-V^&D~HQ`7e_Sq^t#2UOONTAKD2g zN>Ozo#yV8~Yz?N#F )k$8h8Lj=I z6tz-43C>+jf{_~VWC7nwKZHLDX&pf!e>3IwZf4ah(kYohD~??DGX5GCvq{D%N52P_ zQjx`OfwBe5digt_Kz}qY{~(=7u(j0v`BfSkV=)vHDK(nGd4R5LOva}lxNx~e%~p0h zJ)D8IAcy&RVjp1z&vAh}fs1MH9)bIAVlqo~{nOmK8NnxK-EX6yHx>kq_s`#0c%tz# zwl+2Us3#E9sJ3Eg>GMlpMYe}!0W__*DeQ)L)JY_ErD*Rrn@Abys>6?M091Nk8pV*? zK8>zP+tgiXd>bT9r#grwp~-q6pAlJ-=gQqoO_m-$(2fh89R~BaJ>a})G?9k$;I1pV z;SdEQ7S+i@GsqO0RT3BieV(Ey85YQq!#>rcO6cvmFR|B7htWV2Zlb?TF FS{3Igw_{Y&F>*eyWe4v0REv?ypy z{Yb%UV%$2XV78o1nWtFL`MQSn>&Rk@F8NKX$V>#9BRcNf#OvU$S@Oc-k)-$?fz>PM zjL))~g_@TI70i^j2_RI$+>9H^YgpIc-J?*^3}Sh)UMzT*7UD8=*>^bCI3nQkth4!X zRm6g`5slq75*9gOuE3+~O~a0x3g)nEE5l0>@dZPSfW%OnSieA&q%>*Zu%1U_&C|<4 zz9nQXvvy|j*?e={eh>CH=qoT)_!e9>JxQTE*Rl}g7`p-POfpzVcHa$TfL+PSp-H @4b(Y3w60%oid$SFg)XC|@t4#;LgtnDH>01~nTUD{f3nO?-Zj)6N!L8T?o zBOYc+KKQ;($^L`T5_N(-`Hua7Qu~Zqr=D46$L1~I%9y(Y5f3pw$5rjAYD>OjJEy3R zkq^D_vpcY_)>uaiC>2t%r-=6mPsV%Z6(g^KNe>e+Y>#o~s&D}nsggae7!?FBx;h7@ zo)@H5>kQx8JTjw9di2fRf%}-JSU>_pszJr~(K!#hEtfr<2RZ)rd6G5DifoNIQ5VoS zy4xYoW!}&ZUhPoZP}NCR_{F(0AndhWju=HNr>ANSQPkTW!nzNDqYdwq*Z>m(At?y< z&_-m{*F7!+Pz?o3Xgu1A0ghNBUt@EVXSkO+!02(C8V=bxN%#Rg?mJr|I0#AxW_?RQ zyKUcxZ(DK@(lG>H$(JF}$Fpkm;`#e540?JYh<>1cAf;OsY&fE*$5oB4uQvU(`b{qw zMMyWfwtJ137;Q1%|!OqNKc%o8_&qoU5&g= G&qv!jv>4KtZ!}zAOb_G&WL+U8FVZ3cfiwOnGz~G!LNY59aL;9wK zQio{Kl0~F`JR43I#zF=5F_x^6#=`^SLIO2^chK8Df<{B~$3!AT>0#*1=+717CHT)J z@nd{zUT#75h^F~bjG8Sy!Y>+Lf}~bhnQ(EQct4y7QW5To1kw%6tHbFZuu=U)RvO@f zB!mk2rHm!3-0LZlZ(LL!B=alvo>L7bv(FJ4wL(>vNgC`1VO4BcsZ>4g#TWSci&RuH zT{X99xlYbM-}ds5&Q3VQef-%0$Y#Z?m|fE-L4_biBEHQUI`!sLBDquK=)N W_9Ww6wX=kPl1~2FBRI`D zGeS_%HMZAj_J`A5Dcjq6;KJaIo>}i&i6G%88Dp}zcNz_`ZX)tNaDEcZ{UpGe2r6!L z&?K9~wo(nguZIRO>_d;Sfsfj4TW^sLByxcXEVv8{__d&L==~w@n=kcmI$3|lpJI89 z5fo~$J)90~(%o7gE>`cIu{A4lZpVuo5ODed41fI*VS`A^d!akT0x8@Q+bvRkgwz_I z81v@}#(>1>lS)xHs7^>%M{p%9jG>^4)=bqfEL17|WJ4#f0qLp7^WSdxx$Yw7DZ+4) zqjzz~O_%h-R& fZIu2Ov;X}v5wm@r%=KL4LPgsOu=KmuTcIWXyH}x zJbe@R{2KSiF|!F2Di>M{WLm =H^cp#InAslHeT zBE?nB=x`T8vC;djOoeGU1Q#+uY`QbDH=Om2hWoLI9|ge-2mCX4=%!Z@5t=rfuABi9 zMdcC3vQKQf7J`d5KOJgcCs7OGf8COAPn$ie>Qr#twYz{Y!2FnzgwX Pbrd-32^=rA7yI0h*!w#cs632nIZ+10J_&qm5 WE@ro#87Y3B?<) zbIs{2E=mxkvoW4?@*!<5op5Ga?!x_+SB18`tFKqS6~R<9gWeMTkem0oEW~4hkqQ zBQtxgXS2(Sm)F+S3s=4UeQwu(>Y34X!&IeW>$^@2^dzp?3*j4Uige}A5^i3n^!#dM z$VF_vph(r{RG}SzDIJ#1VwRibgPhl4b8cR w?=y&ZX!T@00L%|?iM3aa8X z8d7%wLWv0$@SY@5BwZ5reFrWQpuaW%^l{6B^~2j10{|+rQn4b13l?lrDO5>)Ku_~> z Zp+zGoY%;bvrQq8>_d+lwWSv@ItC{*aT! z)fRTew<()~t `q^47~r48MJ^ z1RY6?KphgcD2oxJij^k0R`_k;im0)c=CXJE`N4gMj9pg;D^SC`g{4;m%GmK{F(`eR znHjQ+q4POj3DxlBp%BD*`}L!>MT-<@a%JUxI5Ud(&Yq^8v@dvBi@TJcu=Drt;x9bI zs;OE7+W5MzeJ?cbnBEQC%nauTK1G>kW-3k#Wm$l9#1*{BBW01@2A?nAGZtJklB hv6=ZS zTY>$**92RvbYUhA1ep${nBH%X)TIk0FFh4xNgitx*981VJo|+{iF&K-p`pK_j70k} z>XS;>3(4y0s^J}Ut-63`>wB_kd|Nj_IXDS1qsoN~fII}RVaGf!$TUd(gET}7kk{63 ze7HOXdiWEs3RDSq(Eh$NVavrBVj%ho(eK1$vHhyBkdvbS{;{M7_x-~9D+>8a0B)3k zfvdyKIQfEY^GwFkcM9d-H)a9cX5e(9+l_$aQR@85tYlQfk9~vb7iBorn{S5#-p9z` zJLh=<8Ap+Jj fL z_Ev*g@d?{$>GUisnpH06Q&RQP+o8V+Nd%3h5Xaba!NBh=8T}5eDzx4-! @d9ZgczjNotP+Xj(-hrl8)ZoBG*&G{$QU6XD*@;V_SUm_kB$lD|wg%`= z%HBA@?|EY!M2=vm1}hHr&Y?}n Hb4)aHY~JpeyM0rjUdF zdkGZimA*`ayL5jZobsj>L1yT7*C!w<+)KLIW>LI02m{JAgEE&Y{CzST&~h1Hqm~Po zYR<%%E#kQ(eMMDkE|Aey=jF{1wwX}pDkA!VK3SR*`}O$#337E40IKm=+Y>Rf%x03E zcq!r`0>1sk1@ICm(x=yt_zwTP)DBr+#hAAa3g@fz$>79Z<|T12xMagz+v`9?qqlR_ ziS}FyL+zGpiuK284o-6gL`A+HT;8vGGH+fiC({Gh0@s{zZzm_Ueg@PkLE5GFdc&UQ zlJZ9*iUpM#@|qI}Ln`kJ^fFy>2kGdef3DMrqGDsb@oc{~=aHKA^wjiebg`L6rD|B& zhE|oVS>MB@GH|;KtS$nzPp-6CW+lxv^rITNq4vRzZuO&eUyQva5N;PDe-sqOEKxP5 zuq$=0d1RKH7$B_kAa6+n%Bo%lOmGZ%w_Dym*l~j z$=z+J*Qld+$=FqW9&*8Azf*gGq+$wmBvfpPlo$_RrfT$9xW#b$Y*N&6@_3WXJK#)z z`eo_#+3D~AOJ#{j!MrEg2cF~oF%+ZMlbph%uWpuYetc$Sr&%Q8+NNRuEqAL;Dr@>I zZpnxcV2zx)b#uI~IpEK=taU5@fI({{$uq1oew$fwLQcVGdOqVNYNMYGpiD^ORJEOF zHlt7Co7ig?vkN?OCw0e i8&>98No k)TQIZAJa%|!pyYw#BWC-O{W^d#42??*V567ef0W0%R?T32h#*JC;j?ir6 zFWaZl6OtYeFs7B1EGBVP(x8jucA=Cn<|Eb^6teL0cRnb=w6I_7;Co3Fr;f@`k)$BC zb7wNqEBlJJ|F&!Tl2gRByBEtNtn7syjH?~Q+w37duBuj*0*g%`n`%tLEUsOL&&9@l z>#r `zveW0G}$f7rb?M^T9E=+Huhi zp)u k^*n&>WHtw}d&*Cq4ZvgEk#vWpVAC zrMZQuAj%Bhw5XDHilKd&*gPDLraVS37cO)1tt=hR>JvpPOl9UmxhOj%&aoI%{ZaSs zmhP1TT}T4)39OjIOqON9B2p>KBEnIlJ9XG4{87^m1OBr*;xz1EwrNCZcqhSXKRF?k zA{e}eU8v>wcC?&tUFm9$aEf63&IUq%VT1f ^IdQO(WuZ=;vjYg&`Zg+mt=f zwC=>#3xCzjVn2p3ooN1uJo#xSk=GWBGM3DLmmJs^?g)SHeXoPR@?GUm2A6-i^;$w3 z)Li64g(dk7E? _&6kAq+xva`_G^1GLVMb9>LO2^%AEHGDwWW(~)^VnPU zqNAn**FU=nO}TI7v)dEgZ{T0}mzsKkI$sw?AY>t?q)b({6L#BYzv{$0bqR~-nvTh_ zbRm-kZi*~js)IC&4owmM?2*#a9uq%gTkh|Rc>KJLV_c(q(gG)rraL04FnNe8aYbxp zjhP@#n0yeBwn~Pjg6)q{A_4aq{(dxIpgWwmyucehsrxBz*nT@_3B!rkQnoQbQ~(6o zc{!{@DYh)~&GnCKWr_9F8{!Z_0=J#d)gt6A{1gI(9le51Jkr30^Hn)*Wpz~l4}V9B z74y0FU?fUc)D`P2|1#RQO{&r{#e$I-*rd9>g^N)u68|gX{f%PGHlE7+js@Iqk9D1p zJcr>v=F*ltw#Hl9P1@<12eFOR>-K{;JKo19y0XqxVs7G}Sxlagye955z&SsP-f~z; z>bdcH`_vkMeU5oUnileyAtk18@DGh+a1FTLPxxrbQXcQ*7%(({jV3v2 59WM1Odp-=uP0xdLCMYZ^8a+rmU3nF59xdE^i?gH zoPFN32-se#EaeE1nuw9?WZ74LFn3`+ZWq&Seh{VBnY#@ y{(-Xw6Z3PK!(f{c#RO7OxsSE|FmHh%rvNy z?gORrEc8U00!0c1gNPRkmWJKgK8bJZ_BOL4dwg9uIL;Lq(M-Q^^xh2i&Fz3&P8rP4 zijVJ(TNfApcA@ndM4-_8f3w`Th?gss?uW131SOJfmP2gsp5psfMGF|QzFO KcL@+u)tk zYArqBj9 09K`O=Enw3kTe>9>@C>dM+VVJ}S!Rs&|YX z^zjCg976HMnd0SkkMFTIsGTNB##$0Cb(^`+8d!mKt6 R6 fp8uP_Hc) zym!XWoFk1W_djzT+}aqgoS*8hM5S9EC{TP@hT1q~#NfdvLWMtNA?rspUuDDDJ7ORS z+^VZyEHd7qZ*A#>(RUg+A7_8-4?XC#Wp&v^uD+uBQO>GeLmaa$m8=jvMzzZbnT4*G zzgYZ-XUY6zxk7~9&yjyHpRPt0b^jnA^1C%&ls%n9{<^(U%GnynR|(7aDLAJA>`61; z`EEaU#VPl4iXPF;x-a<^((_s;*>`uJu1t;-&MGz)eJIW-k66h`f8hJp2E)a#jYkCy z=BPJ{a%lv;J7Qa5WJ=0ixMkw9` ^qdJk5sa28SNopsNO@a_)IZ)M y4i@*ZT|2`8NC|EAB;FIx%2gS1=5VR+2b3 z_NH}?iS=A*K0Zk f-n&aby#du>86l%?C2^TTe~n>bcN03is**wvIv?UazcB z3`9g_`nz6|AM-Wk!VR 1iN{!e8|aLKT;OQF z_TRMY_w9_M^w^DS9#sn+`iVvQAamr^_RD<5KV>pq$CZOYHj%cA0JtKbBJxlhzoqow zDbi;VcbZ`wtRMb3roR6AQ|yBrGE?W9j`>+-n8`MJubGec_$tMkrY^W_RG&$myqYxr z^0k*99|U|M-}i~q+~P@a5mV|_#* AZ+3zuA926A5Lk^g nK_b&umMIR&Ghg}14sPAQu|oq$ zEJOQzu~K6Qy8k$QjQlOmV+Hk~$M;>t*dU=79dROx|8JbG4>IxRL7DAzKIru$0=R9@ zGi7dI%iQ??$PfOPFyVWy!w1wR&Q(FbTkHSo_kX844wTJ@!m-;26oBjgXQ%l`o(U=^ zoHOa91BhDxX9w(ub^7mp{{Ndl4{ZORyLlf{nM0%i!B&OUuf2=T&e>4*=^r $-4>1X^gf(0(>}`br|RI^Q%pvsId`vdXfssz)?R7RZKkQdsN76R}*TeCKoM# zw9H6WDLnToM^Ul&$(rPU9eG(1WsomVcgvuZM6Gn2la`jCft@pug*g`tTlu`uIP5bU zP9{40q)oX#g!Wh1(X@Q@XtiCRu`8O7>PM$gS2p_h;_2Xg53>o)&EUI&PT&<19ccp{ z0xc3XdVH^ hI*0Z|HZ?zXu&9rkQmt37~3_UY)}Q%9nFAw>&Vc zk6)mK1I(@+Iul;umY(@kikl9;+66b$;V_&Po!cO;Hd@P+qo;$4DWvyYkHJ(TXirIx zg635fA34tCd x$itst`!qM^Q|f)9d29r$E3x4heguUK#>O5gggUDJwhO5B*=d|{Zn=Y*v~3!uCL z&&dFEsV%6)JYmKF%Hl-J!FqjH3|cbzWf1`W__3sPS>=_FW6p>osL<<}#xmL?-_@z$ z_bVjDQn5*_#Pp=3(@oxi5*_CRA)r@AQg~8~L}}R2Zb+n;)Ime9`1fT$6s>X~I|t&2 z?(>6mQCM~sOXvc4=?Yp7{qM_Z&y_>Vu`gT!eDBacq#g;ApqC~S%qeCIqV$fq04A*I z&It{Abt(EXSMT|QM?jewWhZ
b7^gnFiH zeGRF{FF|u=A1IZ6OkwJQhv0@y=xW`}e@aP*V?+Im?fAeq#e&8CeNmG>z%XNg6oMK3 zXGNKU(TU($kPaFDO^H0pdGN~aKnYBBLF?Ccg~Ol=^TtQ}EAvG74@~;Pg ZU|| zE46^+UzyuCJO H|Z?XOs?M*EOZC+S|tp7t3q8JQ)5us&6h(x)<84KT(*cnmyNS zc_}a^c@59Yj+)Myqwe%27=EsC0E33bvSc*JDPDZEAAD5AFM0lyQF_R(@&2ijeLDgP zVM%1sbRX~eH))5Nn}$<2@v#YRh-rHqcyT;J(yJ-h 9 z8}SAsO(YM)K~vLV&k7NLjw4%@3@= (wh%x`Nc2HOzXp(7GhUSCz zho!5U7OQp1j!8KXok}{Y9(@evu)5wE7iVZ$ziUSU8b8>& J~kn2ALO~67$()GV*Z*O&*!N|ab zF%fb8B?d7-5BS}FN}z}50Vn1gnCz0VXB9FQAAYg|o~#wE5)8%ZX5)9C?^nHK=EMb> zf^SqqGg#h{yajfEaTDrcC<4eo6=j$Y4>49d4$-@o*tg^}p3>M3+@H(B8$9}eo&MeA zMlhm#=MvwnzF$3u{(AH4sP3{u$I*aYv6GSYQcKOpyNndJ)`p-t1yJ!Avahq9Xrt*E zW6yiw$^TXs60_ihB64E6yYm+&mqG;TqB%j=tn!7Vzi3PRSf3yOoB=vu@{cE91mAgh zQeX!d_>KQALa>9=miX2OUjlOX4zKsMwKU@@;$%3af&bxArU^JXpB;ysm`9=@iHgbQ z-G?0aue+TD|EUL+;JADh9#Ef@eAfln=9Ft>iYV#s&m#OyqWHlxl{e|!L0>m;AP4Fd zFh_mAn%(W8@zcm%oO4Qv~d4zq6FO?M$zv4Nv- zZf%gdn9oytK^`uzNs3@kduW4tkBkp0-G4;DpO?6A&%-))QxWz~T$q~W3K@&G>tAfZ z!doBEuKx{a9eE2;!Gs-G6pvQ3NABgRJF7Y_;z)E-6_>r_^MQ;>c!&N+jiHbRf+l<| zA`#KA*n{CAV_tAE7&RBI9(vlJ{IKxaM;{)piT6^ZWTzP8CAaz<;Pfi-xyL{XR(o1y zFx37+kRJH N)cw}R|qW+6LI-=L-NxpDuukHjm0X1+tm_b^qLFO+) z2;Tn9cMPxcdK)~B6W!@T#(1c&x|I18-Sbbz36aF*1Fi6qt?!;^n+s? l4O)*3(l%LP?~Zn!k}$WtbtuMob>%M`7NFM$J^DThpW`xx zh*b24x-F57 Z zYJx_&4c oDR-tn*ZxP bu<;fedBaDn3FM`o)Y0agCB2n z4zjd6fvzB^qiM9wCHTbmjl65<+BoQmWS%Mw`_2+?aX=ni`Fm{VJAu{Gu1a=xNz`vk zJeOy>rs-ZKF@MGm=l^&vOH?`lIi!zjSi66+9yg$ko>2c>Jgk%G={YZVlHh=J?T;w8 ztqXo)6Xe85@yZU@Dms(2jfUf$DaSomXSsR9ja?4{tZZ7}bl?g6&Uz2H^01=ri3+7< z4Jl)x7CjoLGiy$T8hs+{&c1nzY)#x4e+S+oVexRkGapC^=6H8F?jxL=G&U0{VK5u| zJxB+1rg_&1Oi8|XoD=FcS(RZX;>q%E%dpmB-X+mgYa!$h^r@Z78vhdoZ=xE4hHJv( zW#oRcg{P0W_G^y6>cnm3_j?>HRP#{mzVS%~wg|;boWq( mtnf_DkiKqWMVE`rKIgXD|GXE; zn;xH=oh}OcyhrCDZpb A(*#77oBYktpFWuub0QJb#+g{54nRB-TF<7P__x8KMHThGLZ{S2PpGsqDW@J zX#S!j1&9NcpJ*7oK68}F`Q}tsf4JeH%UBo>dN0`e!jAVh-43w#&b+@IpY6S6dyj>> z`m|vqqPo_Jce#C+;=tl$CMep7`yte-=kbXw^Xf&6>C%JJGvjQQ6YsO>+6Ox$&h}NV z#!I(QZ(*0A5pa2xVX}#N_twBL<)63wa~4`sEH=DxL)fI+eLDEzsLiH0CxzGI)BZZC znxQ ^#g}q!2R3vDPLw|$87OCggZu&lw#+d| zJ|SNJCqZy!68_YYQgTS$EokmmG(Tl`UM?jrTzDvU^h?{EjD1!VW_f4cm;WPt!}EDyoiYLLcAp{!o16juGC5A P>4^7 z8QmJ+;Y%GURW7HjdpNDf1_u?mFIwd~cx)%f9^ZP!hh@owagw(CcIQ1m&bD6vxCkY% z5K*-pxNYwl&cxS0ybm%~wk-gg^GE7Qn}?X%uQh}~-2t!ZS|?elX=WfHyi7vH1wip` z?lNY0>qG9|ea2h@`=iehEtvXnfdLlrHf>-9q%oBLwA^h2a0t}p{qs&D>NYqClqIJ& zBQYxTTs$HaKGWUw{=a&A%eW}N?_HP & X{4da;TYQ=dFRR7U9VRiz9)4l`VWnk5{ryuGpWzkwR_SzI; ze48+*S>sPI;*o8OCw3&WdXOe@Y7mUsiX46u{leV1Rl8z>j7#qSZ{6QeM}g93Q$C5C zV>C;$6Cadg0IS@*aR-32?Mk8FI}{OMQvA8R_5KkaKkuy35An!(W(ar?Girm6*a#3j z#ne<{y!bE0)QC9Vd9R)^T%DUD74kmMBjXV;dKZl|8%Ah|2=Dvz?a-VTiB?+}#H`9x zjmH6#@d+tG?P`ru{udD&N}HKE3DTK2?3ksdR^(j&A2vUeWT4<-#|G oZG{!x6wInd`LR_`u6Ep! zMO5Pd@P6Vl5wcj}k5^Ol^y7%Y{c&|?wV(F0ZP2nltix@&P5P1wzb*v)#aC-g0EW$H zV(6Ah!waFutk&Pu;~f5<1AIh)Wi@8r+fh2Anrd${T%Ud8vD0Nqrb_Db$X1oRyj-=6 zhYD8t`ue%!DH8b?)hr*?tv6FWG>rwTKJI$qQOr2mnNL4>nEFcVYU4!>p9cIN2J-FO zFc1`oWpz3hG#cO;H RJ7en+dGHNPi??5Kf{3OhRK3^n>kk8HlBvpfl>i$y1QrK z4ksZCRn*$K0ecoAF0@zApH*?NSvElEKi2_qr>UQLs+b2VakqJILg~mC>VkfioNkxi zEm=94d2D|}!}mD#&Eu@Q6skxCO(I?u?~b1n H$cpUJEZ{U2~5S|>Oz5u&Rf*1znA<&HAa?EXh6czEct}f zivTNZRnUTJY&(g;lZbT3_-W;dH}Tgp(^Wk@w_Rh7_(-CZLyxF?u3i8wWdU{M7F*Y8 z;f>xFFVNsn=Eus*q>T7i{4RmflJS#0wgDv@ezxdr40W(cE6Of7lVA1Y8)a_PYbc+Y z?WmEp&LYBAQ8)jDV6_GABGNCdFM=}kpVT%X>OJKamt6Qwf|~FcvGTckrAH&QWCMa+ zLg{@=bwe!tX&G_*K?MOP9q4!sew69@`dbz~ezuhOlLy;Jt@7$PKx;?z#9``=D}ctT zBUV7U=hE>u4T%=TU BPWk5VEeD2H7OJjc}q6kDq)fbcon0w3&|KV2lY1j8Nn7; zQgYtoPR6$TlE+F()m%t7*xF*pWNRxxjE{qh@wvDa6}R~v5-o@(N`XUoFRo;~hn6gF zszQ#GS^568==VTfLwbvuZqs6aqbQ8QB3rEsT9mJQ-w&JI_TnKZ5gYR~XK zXlmh5sr;h6gT#q-V@xwQjDLM+eL=}Wv?Vw;h^0p>K*;wxE3h=3v+ng0*9|`k$H_T} zzkftpw!cdhW_PqPxsOgZb6k3Kp<&0-7WuNrn?}ZMk?k?cFDO->eG>BI{RaZ91yn5v zC>6JX6Ul7D{(+|XowRMMG>OW(iap~$7t0J$*uHY6774=2f5e#YIR=S^0Lrl3 %DR}j)qH3*=lj8oiSH9 zztwoUDNQQ-g0VZh+ ~>sGOnD9CWu0 zm8#m6J&bXS0ujqQUNhWvc1~S-*t+WS?RXn7Vu&r*8^YfxaP3;CMwBo &>9!&=Lp8nW^?33`1a><9T`G*TV=$W0dFEc(>Qm{Ev%JS9j zqDH-!V?lqd1d6njsN&0JcC+@?@l0ZwlnoE$3cD}f7TN_!tST}GYUgVWMgUhzg|0!4 zHasa>ft2V@3~9#6Rql;+*l|e79e**ZX)%_vmr@yjM$dCV-Wyqmx&G76xK$+*_~0v$ zMoj53@&hzjU%mhkU4u+KR-?h*_6!}Ul0Zr6kD*_PwB<`PxGJvkKhI}dl@B@~I*v_4 z9apJOy*t(9COCa6FzXp>tJRjs6}XH1falt_Q*ah;W)F(9O6Yv`6Bo-nSQr2lO~;^P zV8!~%*iKikqwrALbqejyUTw8owgSZxuWfeLaJiT=od68j(C6RFChbkiDHsLaEZrCP z6j@NyJl)-=g1wx{YpFp*dHo*aT7WCo@4g6-z`A|A(U+In^>}GP gk`>eXwAyC|peg%ZTsGw{$@O{35T KRI_!whHA zFk$?4hj|I*E%m=f2J}^pEfwE0lnue9u(GV;K7&hB`+({TIXmBK-(Ll@8>-DI3Jw)< z$Hpj#Jy3Jo%`??+FAmy2^O&*wUWA;O>)i(%DfiDtk}okUMePQp@`v#|oh-=Ep1(Ys z6wD`c$9bk_>?~Rh50CIoz>G!#EJWN+!0hG_#5gL;DCOW5nmNsUmBR1)B$1J@tHr>q z;w9k8{Z@5eu6GIFFHD)1IdARTJAabsaYwKBeFA8~48HfH*T(kPTrZ;6F$t&7 bq zpo3kulg+LSy&oWZmHJ%AKXk73QY&OW2U|d@P6pvbyMxlN7=o@(AMl(X?#3J4-Lf!b z%;2A}SiZod^KSZ8tLlITS7DfN$vxAHtE_HK<)Y$%eqIcv6W+p(d83b1j)uGT3wBr0 zzg`WR0sz1 9N)Gk@x5F+`gKOV1VQBkqUTmifPr%W5W_Z3 zIZR_}o@;%nqPlGJtz0?x^-z%?|GsUcGvBg|J8=u9We7rK@^LiL5>-`-C$2oIBtYNz zU+Wv~t{6%!ySJ&4K@6Gg-zb+*+6+hT0M}DWFEu7|52oUI*C~a{@0hC~Bi<6Ez@hnO z0-V6F@T0p@Ww2PY>ELEtx?;YPrTUjG$?1Oq<-}>hvH#=QM(=^h%bU%YePR|7HUh`^ zN@ah%p66jeI3&xV{MyPf`TtsZX9)E|0ehD7VD~k9s3*RAU 2R361GNHRfk2M< z3yHpw_Q?>DR&lDFyIp{`5_2!?*f`#S(pAiP@X;{^m&{$4E!HUG3E~j3yAzq1PP7k+ ze_v&ZRWre|FGu^*38DEWCX9RgILoI`Z{NR-iSUb)H3i6ansRJmJ>t&tzvU@tq@iA78{Z;qy>8 yF zgX8@jfs82NSrE7-NDTL~6aO>JF3>TWv!N771o)HTA3U3qno&H!_4@r|2v%om0xXJw z$QcT6g~Z(1wkB7L;E}>w*w-0X|9gBVF_h3J8Iy5xo@Kh58M_1H1(3v=n_!Cx0Ai)E zWJq*AUl#4IEz^gE4L-kDPh1`>D@QZW P0w#1}22R-r<(_ 55=|5H!HA<0qVA>))%?|nE|+-9RvKdw3gJ!Vg&&;bPr!PEk>T!#XhJMl94LY zL57eDP(Z*cznH%;+@WO`he`&|0j8jb 0x-n4ujkH>*B;mmy+GmfC7H5_WpXUH0RgW N @Hv4(vHe%6jE@+|&8MG6i6LdZCc z%y0z(xQC#(n^T}a>8N+ SZ9bcfG!>>N-}gGDLtyw9L8Gm6JE%9^Ad8B`p)?kN^h4g?7(WJ|(?&rB z!fKt*4;Tf~@esTK8V|kKfGJhnqSe33CK~+zX!(T7%a^F{cxhsppBj~2Z2wjx?=1?% z$Ev<0nmN;dQ@G^)I>bho5a;KK+T>E3Ab!YGU*1@;uvUjK#2~)`JZV9QNgyLE0s_`R zy%|g#D;GF~gvR6mjfp>QeLl_|6xhQB=a=HLAyWW(wLRQ0l}V eN1D>EiF$`RsL(+HDYxX<~!qwI^P8_ZK`%pM8`GyC#wFs#KKXJ61feYp_}!o?vc zHzg+M@0p1An$o7-bvwa4ZQ9She8rn$e{R0hyMS=KtWSJ4TR^rX2 c^#wbCoKkrv5K!$fPCCJGKy?4R z@1cgPnWrz=Xeq*hKio7$M9A7BDmc*f`;lEax`>q9{KSLJSI*lI=#$?|+;Q^>%GD7N zSrPX#6~HnFn8U_y1WL|uRIn2C5!VP3|Fsf~dkctfo{^g^i7@ 25hM DN;5x&jo z`zq^1@&LH^jdAGUaEBaL=ZC1W&k8f}57m)uOv&FUDVG0PRnrbWV2rK@+Xw(uz$$Yk zJfML|^fSq>d-dZ!Da7Q10tm|dV$Ki(pW)NU{Xg!RLRADxU1|*4mdB44sG@dmPpc7Z zOYc$g@_G%D4H#)~S|8zQylue#)^c!*J`DRF<}(FFHB!S^e_`~?To62UIQGM>Hvj;l zls`<{p !OE$yeXP5}H+RTwR<67x6l7_<}W{>*thNdGOv-pvFh>1YvYS66U~8QZ{tayT(Y6 z{Y7{u2FlGx<;in?S;mX&0^z^FD<{nOEPL+!MJtoeE1zv6aSMvDBm5BfBQ-pRiRUhn zqhmVDOgHOtr^b(!cAv;uIG%Js9@Pf4pp -6t=n zyFH6I{`(NgLRDoS-`HH|$WAZnQhp=NnFLZEttzp$dAwHw1&eaK5~UV$)NQXd+CLYN z*Y-{yJ!@@D_8*zzd;y9P &7L)(@yVA)n+b>LYFQD@s$iP54ZHz ze8AE#DIMBVvlXwEKa&BG+v~u5m)jj#wRUq0czlpW^q&d#xo6O7w3~LhQp(2EuUD${ z<`@vTfrkQXwD=@aD~Tg|HWr)TM5 aESkCAv`tvfN;b`z(E{Lcm9BibFPA8YKlXJ(t !vg1qzL0htf(vhiF#(nC>x2f4Zvn53GSMffppF-=@HB9eNL#HgyWMPy-KVM$%U> z!U=tiB|)V|l=Qv}U*c6>*Y89ZRUwRWt?Ig{wg3}otGki9^#8r^Vo)9zFqRCH4x3+> zZK~jbV?Rw%A|*8f(2K4jq)J+MA!S;#4=GdUhP&~qnIKcU`b8P4AW;b8|KC6QD9bI| z4bP)v`vamPyA*p9%20T;Bin_71Gfphj(%WPe+B(S6nj#6e-BGfP4kY%{D-plBMny0 z=HD0-0GE2=D>#W>PztwZf4Sw1EsS;!C`LOkpcq|vW(vT%niTY07aGS=0Da+6K854{ zBHKrCF61S4i}TbFSRPjs`UQ``qsx=+%}cng=Tf^(FOd)8PNfLRHi%43)xG09KgIS; z;*T)?_hXBp$I@1&@&ku#;F T4epmPV3iIC}U`}9NU{|<< ?j7lc+@2mcwSrdx(WvunIGPsg%f{BvFO*mz z8u(+)*rUbF4Q<;TD8U-+-FUIThk2(xF$f2MXWvuycm a
${JPdw7i?=?fRgkV?Jn|xer a#^@R1t4bC#ww{!m}z30pF>fd&wK7OIKYBL;_h|Ml)Y)K>W{ zRfj|uaf0-plcQ3r^P!*L+fTQybYJ4mfK2o4!V-kTcKF{q``P&xnHxbg_~-Z`uUk4! z@s*M!R<0n&3R)oYB5ab!t@oZ>G(KDWUfd3n2c;45LD1BrKxhZsxRtRgp3+zYK!;t+ zujBYRQ65&O#^W4orP3ROVwx=mcaJYVZ?kW>Hl`!7Ta16e%}hYD<*?1ZXL66hMXRHZ z_^8CWt{>_$f8au4_wW7XkNdgE$owtU;j2k{-Aw3>sMQ8py(m@;1p#W;AF7xpPuU9> zn!ZtID^LM{p>-v(OEzomNzLJt>v8M?fZ;%Dh~}!4s)Sp7O4h~V#Pp+AuNU^>hFC+a zMg3uWBZ<}ap~*LLlyrnb>l<&-1({0HKrhQ{iZ`V3$gMRnm+#TNiq{tq){g8iJXMAG z<#Zr#5PBVV`>f6gCZvLed4LN3l^`Jm_sAdlz1_x252{LK&md&Mf5rjuSaYxxK4%vH zvmSJh?=qUebsX4E 8JFeU-K5i1F%Xdo{?9`r6^i;k%iT+{m*<8< z;JI4 ba?766P(&1kKU{5oSS zyMB6|@oZg`J|fv&3Ryeq7he$tSc_Sqt>GTD!!9AE3?;13tbLsu)MZs`5pvkj$OM7E zCmsNhW4}93VX9{B)8DmiEu{y%TM3L6EykbB64&Y%xl0fet>zr-f*@`7=c~(HWyx#D z`nrs=o0{5Yt=_7grcf;_&{r%D#}34JUMLEG0I;^mv+!6m0B8R=9{UjKzM6iGoQ9q- zz!41?*7V|aiQGq)eWh|YmT$RG-!F}j;urVwXal-}FAAVp#moUnO+Y0l*y8G#&~vDC zRH2v58bquuzDHmmMF}y1t<^4aV+Jz8Rd=7)y5xXz3kCLpj`=LfmW@;!XZHK0J->u# z07#@G$F42wR%Ek-z{vqp*SYg|lP1+)J$W21CJ5@#c?hC2 yEVja(a*yq}`2GU;VrP`dGW<#$J0~zhfd+ zg;A7bJTmVCpn14W+q1NduBzpvzXi(gN=pGL+YJj)EhMqR(&VYrkS$7gg$77>*Nr5Q zp{p1dXh YKes2SE&{sfuw)I7i)*SsA= zEPp?^na~1Y4L^91`Ctu(Zw1J2a-Tpzs- LgTFu;f_MF{{3j+*|>Hn}X?q znfDkY)i?GqliniymY6?Zff^=CH~_rvJ){LH?nd57BfUYv$YX6%Ab~5(Ezuk5hjH_L z%N!|XT_9&LSK0r#@t5-;TcX!kx(1R2AP8GHHb_1Utn%*ZXKD1*>IOBWrRxRkfb>ox zsH8bq7UuI{G4qqJ4`JJ-k(3O*)fD!a@4Ej6xhW7Krkivi4&=hA`ZQ3;5sc8mE8BOM zZA32hftOP(*mGF`5!m@zL%}`+xr`Jhz^Vbv6U7U_GC97{@is8X1yq~vwZ|>z-=r4P z^ma5}TzQ>*nh*sNF`c?R5+Bq+T7^n NdzybAd~ F>q?O-E6YaMrBs`dPPov~c5ZN(s}(L7b=kwuYGo&QChk+mlNu&_UVZ+920Q z<%~}_R5T_-I%1nvRmgXf58#F#W~Me>TlF{H&7uJ-W g4{^j1gqg+0Ax1dnnY*o(T{JS{KRSFF^5PLwwtLI%htuNpL)+^l1cf?O~Q$Z zaRJivBG+dxrs2|DrW}KY;ATcC3&ASLFBW xp>H4wi84c&>C)^OzPtVykyR9=}j zfD-Aa0lXta%r-wMgW65^#khcEpcOFOHZC|GvNL&ZBaj0aMpb=MA@FdoSOP8?hYr#0 zSR4jnW<~#r#BXqw?<40*+DsjMz4qD@Tv?BxVIeED>ZTgToSWWoy$(ceIr$+u(%*t{ zDg>@62>4v`0pNMW0 i{IMyQ*OR|Z ;$c$oT}hJX5I2IWhD#`3Q|Bz8EoJ4saU#Oa5y%A5 zTJFL?=KK4%*&t%lKqv>pGCda&Ew=rurRPs2dBSNrnQICW7tldcz;WkV8ZR~^!1^=# z>BTa|(@ow`0(qQpb)Z0^bD!<#c+5dqu5>nv&wUf2rI>IWqXzeYJOGR}m9g;Z{+#}> z=WXhqC~OeycNK)t-U;IZQWeIJ5AJLS0NmZ@ @h7u95zZyaKcG$XVn#PT5;QKg z1mcnhEYicc^K3%N(xPq1+%d9_;chn#1H>|HQSsILXD$)M@&V92cUnkkF-Z;>hsruu zIW>IHg}beMo+l8?pTU5SbF#_}Xi tAg>}#CGGniTmijmc|m|_01}ILBRuMb0 >)g~7s9kR#2mc8NyNe7X<6|^)0pP^*%eo%{t z^>`OpXU9MpEgxuh0NhP58VKH6fbRJacRYgFY^mMvMv<9sesy~`-LMPbp4G)Vo%-~= z>)7r%;``I>Tb&x3Y~$d>k)xM7QKP+oYi%u$^U|JuK%0&ZHaqDHHai=v>KcVw{xB83 zJ_N7N3%4`+WHthrpr&ro0CR|Ku=@Z|of$R+1>SoK$?ojQjF6SAaDK%sV^Ewmin2cw z`t&paTsHnan|t3@APJz{h7Y9@%X6di>sS;3>IDT65vHIT5gFfQy%9uh;IA*Hnq-Pv z(2t(e(7*qk{MJf #r_Qq(-PuM>Yqxwa&wT}NEfrs0?9@$vozoBs%#*qvP_bxY z`U>a(meR{XIJ^<{Jt4}vEP2cec$74U03;VQd|P(00f2q#UdoDvem2x4G~Afv-_q{$ z*oy_AT> A zod;1a1rvXnwE3J)ry8FGp9JO=FD(6b&+#U}vgR`?jBG04d2iL&_J&&{a2~k^# ?E&9UFBR?bUvmoc`foQYTf_jN%9LWyqny_Dxjm5|3LX>oyDA|g{?i0X_uf7 zDd$)9>#4_=O$pruh*c#ILNRbI5WF&Bx<1xlP3mU%3E=$wk6RIaIh>_94J#}vaN(1K z$?a#Tf8L<1+`V8pzt5B6^@kxV#ieQiz#Ch5s7Y5s&k9_&Bg^UMofa8gUpM&t!T7kf z`OjDWxUk8N%ilJaEX@vA s>{CaA=^<)cYTI z|3)@#zlNLjFATh;B2y%1I`YDJ8O@&N)4xZ6OrUsB$CX(Tx03r>XWSkEmhq-#?I?Pa z8k*3UhST&!lh#hjPqny@Z <_|D11u (!nJOk1wpxBimDQbwUbHyUf`aNBYy z&}BZEX1crb6q(&RA(7LMbpDAMMF<2jTaqqFS*_Vp!)8PGZXTjnZ=Dtr7G45--nHQD zbNf0AR3naR2N$Nvy;T`0+edacb3c9(yYO-H@V&@Y(Mq~C`39#XihUi9!QZ ^TOCef1;a^^v!*wmCM9%zz?X=>QUFm9pSJqVw zQkOa+q$d~nLFCglKEF@O@ +};Bpxk2k=&@;?ojuW`Z7CplwqN|-=PSs_|8Rz zLuyhm`NJbI9YreA1y!TRpS51&DKi`$&0bPEyCQF|{`kK6X;`h|EI>b-s}$eq^rpl2 zR6Au#%7FW8&2%|mXHXu=C9HqP^p->&Bk<6Y(GNXpM<%pCkT&3y