From 74242c91e4d88583dac15152ec6cd9ce3ba5a610 Mon Sep 17 00:00:00 2001 From: Luiggi Tenorio Date: Fri, 26 Apr 2024 15:45:09 +0200 Subject: [PATCH 01/14] prepare v4.0.0b7 --- autosubmit_api/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/autosubmit_api/__init__.py b/autosubmit_api/__init__.py index e7eae9a..2eeabb7 100644 --- a/autosubmit_api/__init__.py +++ b/autosubmit_api/__init__.py @@ -17,6 +17,6 @@ # You should have received a copy of the GNU General Public License # along with Autosubmit. If not, see . -__version__ = "4.0.0b6" +__version__ = "4.0.0b7" __author__ = "Luiggi Tenorio, Bruno P. Kinoshita, Cristian GutiƩrrez, Julian Berlin, Wilmer Uruchi" __credits__ = "Barcelona Supercomputing Center" \ No newline at end of file -- GitLab From 87b6847066675b4d1228e12a8781a45a5b50f2fc Mon Sep 17 00:00:00 2001 From: Luiggi Tenorio Date: Tue, 30 Apr 2024 11:32:08 +0200 Subject: [PATCH 02/14] disable pool --- autosubmit_api/database/common.py | 19 +++++++++++++++---- tests/test_database.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 tests/test_database.py diff --git a/autosubmit_api/database/common.py b/autosubmit_api/database/common.py index 6891df5..defe705 100644 --- a/autosubmit_api/database/common.py +++ b/autosubmit_api/database/common.py @@ -1,6 +1,15 @@ import os from typing import Any -from sqlalchemy import Connection, Engine, Select, create_engine, select, text, func +from sqlalchemy import ( + Connection, + Engine, + NullPool, + Select, + create_engine, + select, + text, + func, +) from autosubmit_api.builders import BaseBuilder from autosubmit_api.logger import logger from autosubmit_api.config.basicConfig import APIBasicConfig @@ -14,7 +23,7 @@ class AttachedDatabaseConnBuilder(BaseBuilder): def __init__(self) -> None: super().__init__(False) APIBasicConfig.read() - self.engine = create_engine("sqlite://") + self.engine = create_engine("sqlite://", poolclass=NullPool) self._product = self.engine.connect() def attach_db(self, path: str, name: str): @@ -51,7 +60,9 @@ def create_autosubmit_db_engine() -> Engine: Create an engine for the autosubmit DDBB. Usually named autosubmit.db """ APIBasicConfig.read() - return create_engine(f"sqlite:///{ os.path.abspath(APIBasicConfig.DB_PATH)}") + return create_engine( + f"sqlite:///{ os.path.abspath(APIBasicConfig.DB_PATH)}", poolclass=NullPool + ) def create_as_times_db_engine() -> Engine: @@ -60,7 +71,7 @@ def create_as_times_db_engine() -> Engine: """ APIBasicConfig.read() db_path = os.path.join(APIBasicConfig.DB_DIR, APIBasicConfig.AS_TIMES_DB) - return create_engine(f"sqlite:///{ os.path.abspath(db_path)}") + return create_engine(f"sqlite:///{ os.path.abspath(db_path)}", poolclass=NullPool) def execute_with_limit_offset( diff --git a/tests/test_database.py b/tests/test_database.py new file mode 100644 index 0000000..518523b --- /dev/null +++ b/tests/test_database.py @@ -0,0 +1,29 @@ +import os + +from sqlalchemy import select + +from autosubmit_api.database import common, tables + + +def count_pid_lsof(pid): + openfiles = os.popen(f"lsof -p {pid} | grep db").read() + print(openfiles) + return len([x for x in openfiles.strip("\n ").split("\n") if len(x.strip()) > 0]) + + +class TestDatabase: + + def test_open_files(self, fixture_mock_basic_config): + current_pid = os.getpid() + + counter = count_pid_lsof(current_pid) + + engine = common.create_autosubmit_db_engine() + + assert counter == count_pid_lsof(current_pid) + + with engine.connect() as conn: + conn.execute(select(tables.ExperimentTable)) + assert counter + 1 == count_pid_lsof(current_pid) + + assert counter == count_pid_lsof(current_pid) -- GitLab From 0d1e5e248d557dd9cc7c5eeadb993e972056e3f2 Mon Sep 17 00:00:00 2001 From: Luiggi Tenorio Date: Tue, 7 May 2024 13:08:17 +0200 Subject: [PATCH 03/14] minor fix --- autosubmit_api/experiment/common_db_requests.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/autosubmit_api/experiment/common_db_requests.py b/autosubmit_api/experiment/common_db_requests.py index 187cd45..e8aa22f 100644 --- a/autosubmit_api/experiment/common_db_requests.py +++ b/autosubmit_api/experiment/common_db_requests.py @@ -110,9 +110,10 @@ def get_specific_experiment_status(expid): tables.experiment_status_table.c.name == expid ) ).one_or_none() + if row: + return (row.name, row.status) except Exception as exc: logger.error(f"Exception while reading experiment_status for {expid}: {exc}") logger.error(traceback.format_exc()) - if row: - return (row.name, row.status) + return (expid, "NOT RUNNING") -- GitLab From 085dbfc8040a547dfd2e76a5ef7217c88f2a8b83 Mon Sep 17 00:00:00 2001 From: Luiggi Tenorio Date: Fri, 10 May 2024 15:24:50 +0200 Subject: [PATCH 04/14] reduce status_updater writes --- .../bgtasks/tasks/status_updater.py | 26 ++++++++++++++++-- tests/bgtasks/test_status_updater.py | 13 +++++---- tests/experiments/autosubmit.db | Bin 20480 -> 20480 bytes .../metadata/graph/graph_data_a003.db | Bin 8192 -> 8192 bytes 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/autosubmit_api/bgtasks/tasks/status_updater.py b/autosubmit_api/bgtasks/tasks/status_updater.py index 186be6f..971cd1f 100644 --- a/autosubmit_api/bgtasks/tasks/status_updater.py +++ b/autosubmit_api/bgtasks/tasks/status_updater.py @@ -1,7 +1,7 @@ from datetime import datetime import os import time -from typing import List +from typing import Dict, List from sqlalchemy import select from autosubmit_api.bgtasks.bgtask import BackgroundTaskTemplate @@ -50,6 +50,15 @@ class StatusUpdater(BackgroundTaskTemplate): query_result = conn.execute(tables.experiment_table.select()).all() return [ExperimentModel.model_validate(row._mapping) for row in query_result] + @classmethod + def _get_current_status(cls) -> Dict[str, str]: + """ + Get the current status of the experiments + """ + with create_as_times_db_engine().connect() as conn: + query_result = conn.execute(tables.experiment_status_table.select()).all() + return {row.name: row.status for row in query_result} + @classmethod def _check_exp_running(cls, expid: str) -> bool: """ @@ -113,7 +122,20 @@ class StatusUpdater(BackgroundTaskTemplate): # Read experiments table exp_list = cls._get_experiments() + # Read current status of all experiments + current_status = cls._get_current_status() + # Check every experiment status & update for experiment in exp_list: is_running = cls._check_exp_running(experiment.name) - cls._update_experiment_status(experiment, is_running) + new_status = ( + RunningStatus.RUNNING if is_running else RunningStatus.NOT_RUNNING + ) + if ( + current_status.get(experiment.name, RunningStatus.NOT_RUNNING) + != new_status + ): + cls.logger.info( + f"[{cls.id}] Updating status of {experiment.name} to {new_status}" + ) + cls._update_experiment_status(experiment, is_running) diff --git a/tests/bgtasks/test_status_updater.py b/tests/bgtasks/test_status_updater.py index 6d23029..c6975a9 100644 --- a/tests/bgtasks/test_status_updater.py +++ b/tests/bgtasks/test_status_updater.py @@ -6,22 +6,25 @@ from autosubmit_api.database.common import ( ) from autosubmit_api.history.database_managers.database_models import RunningStatus -class TestStatusUpdater: +class TestStatusUpdater: def test_same_tables(self, fixture_mock_basic_config): prepare_db() - + + with create_as_times_db_engine().connect() as conn: + exps_status = conn.execute(tables.experiment_status_table.delete()) + StatusUpdater.run() - + with create_autosubmit_db_engine().connect() as conn: experiments = conn.execute(tables.experiment_table.select()).all() - + with create_as_times_db_engine().connect() as conn: exps_status = conn.execute(tables.experiment_status_table.select()).all() assert len(experiments) == len(exps_status) assert set([x.id for x in experiments]) == set([x.exp_id for x in exps_status]) assert set([x.name for x in experiments]) == set([x.name for x in exps_status]) - + for e_st in exps_status: assert e_st.status in [RunningStatus.RUNNING, RunningStatus.NOT_RUNNING] diff --git a/tests/experiments/autosubmit.db b/tests/experiments/autosubmit.db index fdca9705b5a01cac55d77fb350ce34b868e060df..ad4dc9a816ae5371c0d7c7d82e2927a0dba93f74 100644 GIT binary patch delta 50 ycmZozz}T>Wae}mg$Nji06%387OpUFKOeP!pp9cW*XbPnO delta 50 ycmZozz}T>Wae}mQM*EEk$Njhr6%5U+OiiqejV2rVp9cW(0}74+ diff --git a/tests/experiments/metadata/graph/graph_data_a003.db b/tests/experiments/metadata/graph/graph_data_a003.db index 41b2c4f84c4a700e3a35394a2aea257543e762d4..e8afa84d90dd6c44b6accd5fdb53d4552a1376b7 100755 GIT binary patch delta 17 YcmZp0XmFSy&1f-E#+lJ#W5NP?05FdQUH||9 delta 17 YcmZp0XmFSy&1f`H#+lJ*W5NP?05CNLQUCw| -- GitLab From 1a0743e2e415a6de818a7b42733302906987a359 Mon Sep 17 00:00:00 2001 From: Luiggi Tenorio Date: Fri, 10 May 2024 16:17:49 +0200 Subject: [PATCH 05/14] update openapi.json --- openapi.json | 1060 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 773 insertions(+), 287 deletions(-) diff --git a/openapi.json b/openapi.json index d5b2417..9b19e49 100644 --- a/openapi.json +++ b/openapi.json @@ -9,177 +9,772 @@ } }, "paths": { + "/v3/login": { + "post": { + "tags": ["v3"], + "summary": "Login", + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/tokentest": { + "get": { + "tags": ["v3"], + "summary": "Token test", + "responses": { + "200": { + "description": "Success" + } + } + }, + "post": { + "tags": ["v3"], + "summary": "Token test", + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/updatedesc": { + "get": { + "tags": ["v3"], + "summary": "Update description", + "responses": { + "200": { + "description": "Success" + } + } + }, + "post": { + "tags": ["v3"], + "summary": "Update description", + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/cconfig/{expid}": { + "get": { + "tags": ["v3"], + "summary": "Get current configuration", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/expinfo/{expid}": { + "get": { + "tags": ["v3"], + "summary": "Get experiment info", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/expcount/{expid}": { + "get": { + "tags": ["v3"], + "summary": "Get experiment counters", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/searchowner/{owner}/{exptype}/{onlyactive}": { + "get": { + "tags": ["v3"], + "summary": "Search owner", + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "exptype", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "onlyactive", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/searchowner/{owner}": { + "get": { + "tags": ["v3"], + "summary": "Search owner", + "parameters": [ + { + "name": "owner", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/search/{expid}/{exptype}/{onlyactive}": { + "get": { + "tags": ["v3"], + "summary": "Search experiment", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "exptype", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "onlyactive", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/search/{expid}": { + "get": { + "tags": ["v3"], + "summary": "Search experiment", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, "/v3/running": { "get": { - "tags": [ - "v3" + "tags": ["v3"], + "summary": "Running experiments", + "operationId": "get-v3-running", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "experiment": { + "type": "array", + "items": { + "type": "object", + "properties": { + "completed": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "failed": { + "type": "integer" + }, + "hpc": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "modified": { + "type": "string" + }, + "name": { + "type": "string" + }, + "queuing": { + "type": "integer" + }, + "running": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "submitted": { + "type": "integer" + }, + "suspended": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "user": { + "type": "string" + }, + "version": { + "type": "string" + }, + "wrapper": { + "type": "string", + "nullable": true + } + } + } + } + } + }, + "examples": { + "Example 1": { + "value": { + "experiment": [ + { + "completed": 25, + "description": "Testing AS 4.0", + "failed": 8, + "hpc": "MARENOSTRUM4", + "id": 8192, + "modified": "2022-10-03 10:05:27", + "name": "a4yd", + "queuing": 0, + "running": 0, + "status": "RUNNING", + "submitted": 0, + "suspended": 0, + "total": 385, + "user": "root", + "version": "4.0.0b0", + "wrapper": null + }, + { + "completed": 88, + "description": "TEST_AS_4.0", + "failed": 0, + "hpc": "MARENOSTRUM4", + "id": 8202, + "modified": "2022-11-30 11:50:29", + "name": "t0an", + "queuing": 0, + "running": 0, + "status": "RUNNING", + "submitted": 0, + "suspended": 0, + "total": 91, + "user": "root", + "version": "4.0.0b0", + "wrapper": null + } + ] + } + } + } + } + } + } + } + } + }, + "/v3/runs/{expid}": { + "get": { + "tags": ["v3"], + "summary": "Get runs", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/ifrun/{expid}": { + "get": { + "tags": ["v3"], + "summary": "Get if running", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/logrun/{expid}": { + "get": { + "tags": ["v3"], + "summary": "Get status and log path experiment", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/summary/{expid}": { + "get": { + "tags": ["v3"], + "summary": "Get experiment summary", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/shutdown/{route}": { + "get": { + "tags": ["v3"], + "summary": "Shutdown route", + "parameters": [ + { + "name": "route", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/performance/{expid}": { + "get": { + "tags": ["v3"], + "summary": "Get experiment performance metrics", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/graph/{expid}/{layout}/{grouped}": { + "get": { + "tags": ["v3"], + "summary": "Get graph format", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "layout", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "grouped", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/tree/{expid}": { + "get": { + "tags": ["v3"], + "summary": "Get experiment tree", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/quick/{expid}": { + "get": { + "tags": ["v3"], + "summary": "Get quick view data", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/exprun/{expid}": { + "get": { + "tags": ["v3"], + "summary": "Get experiment run log", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/joblog/{logfile}": { + "get": { + "tags": ["v3"], + "summary": "Get job log from path", + "parameters": [ + { + "name": "logfile", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/pklinfo/{expid}/{timeStamp}": { + "get": { + "tags": ["v3"], + "summary": "Get experiment pklinfo", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "timeStamp", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/pkltreeinfo/{expid}/{timeStamp}": { + "get": { + "tags": ["v3"], + "summary": "Get experiment tree pklinfo", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "timeStamp", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/stats/{expid}/{filter_period}/{filter_type}": { + "get": { + "tags": ["v3"], + "summary": "Get experiment statistics", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "filter_period", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "filter_type", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/history/{expid}/{jobname}": { + "get": { + "tags": ["v3"], + "summary": "Get experiment job history", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "jobname", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } ], - "summary": "Running experiments", - "operationId": "get-v3-running", "responses": { "200": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "experiment": { - "type": "array", - "items": { - "type": "object", - "properties": { - "completed": { - "type": "integer" - }, - "description": { - "type": "string" - }, - "failed": { - "type": "integer" - }, - "hpc": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "modified": { - "type": "string" - }, - "name": { - "type": "string" - }, - "queuing": { - "type": "integer" - }, - "running": { - "type": "integer" - }, - "status": { - "type": "string" - }, - "submitted": { - "type": "integer" - }, - "suspended": { - "type": "integer" - }, - "total": { - "type": "integer" - }, - "user": { - "type": "string" - }, - "version": { - "type": "string" - }, - "wrapper": { - "type": "string", - "nullable": true - } - } - } - } - }, - "x-examples": { - "Example 1": { - "experiment": [ - { - "completed": 25, - "description": "Testing AS 4.0", - "failed": 8, - "hpc": "MARENOSTRUM4", - "id": 8192, - "modified": "2022-10-03 10:05:27", - "name": "a4yd", - "queuing": 0, - "running": 0, - "status": "RUNNING", - "submitted": 0, - "suspended": 0, - "total": 385, - "user": "root", - "version": "4.0.0b0", - "wrapper": null - }, - { - "completed": 88, - "description": "TEST_AS_4.0", - "failed": 0, - "hpc": "MARENOSTRUM4", - "id": 8202, - "modified": "2022-11-30 11:50:29", - "name": "t0an", - "queuing": 0, - "running": 0, - "status": "RUNNING", - "submitted": 0, - "suspended": 0, - "total": 91, - "user": "root", - "version": "4.0.0b0", - "wrapper": null - } - ] - } - } - }, - "examples": { - "Example 1": { - "value": { - "experiment": [ - { - "completed": 25, - "description": "Testing AS 4.0", - "failed": 8, - "hpc": "MARENOSTRUM4", - "id": 8192, - "modified": "2022-10-03 10:05:27", - "name": "a4yd", - "queuing": 0, - "running": 0, - "status": "RUNNING", - "submitted": 0, - "suspended": 0, - "total": 385, - "user": "root", - "version": "4.0.0b0", - "wrapper": null - }, - { - "completed": 88, - "description": "TEST_AS_4.0", - "failed": 0, - "hpc": "MARENOSTRUM4", - "id": 8202, - "modified": "2022-11-30 11:50:29", - "name": "t0an", - "queuing": 0, - "running": 0, - "status": "RUNNING", - "submitted": 0, - "suspended": 0, - "total": 91, - "user": "root", - "version": "4.0.0b0", - "wrapper": null - } - ] - } - } - } - } + "description": "Success" + } + } + } + }, + "/v3/rundetail/{expid}/{runid}": { + "get": { + "tags": ["v3"], + "summary": "Get experiment run job detail", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" } + }, + { + "name": "runid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Success" + } + } + } + }, + "/v3/filestatus/": { + "get": { + "tags": ["v3"], + "summary": "[LEGACY] Get file status", + "responses": { + "200": { + "description": "Success" } } } }, "/v4/experiments": { "get": { - "tags": [ - "v4" - ], + "tags": ["v4"], "summary": "Search experiments", "description": "", "operationId": "get-v4-experiments", @@ -210,11 +805,7 @@ "in": "query", "schema": { "type": "string", - "enum": [ - "test", - "operational", - "experiment" - ] + "enum": ["test", "operational", "experiment"] } }, { @@ -229,11 +820,7 @@ "in": "query", "schema": { "type": "string", - "enum": [ - "expid", - "created", - "description" - ] + "enum": ["expid", "created", "description"] } }, { @@ -346,55 +933,6 @@ } } } - }, - "x-examples": { - "Example 1": { - "experiments": [ - { - "completed": 0, - "description": "DE Model App", - "failed": 0, - "hpc": null, - "id": 9, - "modified": null, - "name": "a005", - "queuing": 0, - "running": 0, - "status": "NOT RUNNING", - "submitted": 0, - "suspended": 0, - "total": 0, - "user": null, - "version": "Unknown", - "wrapper": null - }, - { - "completed": 115, - "description": "DE downstream", - "failed": 0, - "hpc": "LOCAL", - "id": 11, - "modified": "2023-10-26 11:44:07", - "name": "a006", - "queuing": 0, - "running": 0, - "status": "NOT RUNNING", - "submitted": 0, - "suspended": 0, - "total": 115, - "user": "ltenorio", - "version": "4.0.95", - "wrapper": null - } - ], - "pagination": { - "page": 1, - "page_items": 2, - "page_size": 2, - "total_items": 9, - "total_pages": 5 - } - } } }, "examples": { @@ -456,9 +994,7 @@ }, "/v4/experiments/{expid}": { "get": { - "tags": [ - "v4" - ], + "tags": ["v4"], "summary": "Get experiment info", "operationId": "get-v4-experiments-expid", "parameters": [ @@ -471,14 +1007,16 @@ } } ], - "responses": {} + "responses": { + "200": { + "description": "OK" + } + } } }, "/v4/experiments/{expid}/jobs": { "get": { - "tags": [ - "v4" - ], + "tags": ["v4"], "summary": "List experiment jobs", "operationId": "get-v4-experiments-expid-jobs", "parameters": [ @@ -488,10 +1026,7 @@ "description": "Data view selector", "schema": { "type": "string", - "enum": [ - "base", - "quick" - ] + "enum": ["base", "quick"] } }, { @@ -548,9 +1083,7 @@ }, "/v4/experiments/{expid}/wrappers": { "get": { - "tags": [ - "v4" - ], + "tags": ["v4"], "summary": "List experiment wrappers", "operationId": "get-v4-experiments-expid-wrappers", "parameters": [ @@ -588,34 +1121,6 @@ } } } - }, - "x-examples": { - "Example 1": { - "wrappers": [ - { - "job_names": [ - "a6zi_18500101_fc0_1_SIM", - "a6zi_18500101_fc0_2_SIM" - ], - "wrapper_name": "a6zi_ASThread_17108563159474_528_10" - }, - { - "job_names": [ - "a6zi_18500101_fc0_3_SIM", - "a6zi_18500101_fc0_4_SIM", - "a6zi_18500101_fc0_5_SIM", - "a6zi_18500101_fc0_6_SIM", - "a6zi_18500101_fc0_7_SIM", - "a6zi_18500101_fc0_8_SIM", - "a6zi_18500101_fc0_9_SIM", - "a6zi_18500101_fc0_10_SIM", - "a6zi_18500101_fc0_11_SIM", - "a6zi_18500101_fc0_12_SIM" - ], - "wrapper_name": "a6zi_ASThread_17108816522924_528_10" - } - ] - } } } } @@ -626,9 +1131,7 @@ }, "/v4/auth/verify-token": { "get": { - "tags": [ - "v4" - ], + "tags": ["v4"], "summary": "Verify JWT Token", "operationId": "get-v4-auth-verify-token", "parameters": [ @@ -701,9 +1204,7 @@ }, "/v4/auth/cas/v2/login": { "get": { - "tags": [ - "v4" - ], + "tags": ["v4"], "summary": "CAS v2 Login", "operationId": "get-v4-auth-cas-v2-login", "parameters": [ @@ -803,9 +1304,7 @@ }, "/v4/auth/oauth2/github/login": { "get": { - "tags": [ - "v4" - ], + "tags": ["v4"], "summary": "GitHub Oauth2 App Login", "operationId": "get-v4-auth-oauth2-github-login", "parameters": [ @@ -867,10 +1366,12 @@ "type": "string" }, "token": { - "type": "string" + "type": "string", + "nullable": true }, "user": { - "type": "string" + "type": "string", + "nullable": true } } }, @@ -950,23 +1451,8 @@ "err_path_remote": { "type": "string" } - }, - "x-examples": { - "Example 1": { - "name": "a008_20200120_fc0_2_SIM", - "status": "COMPLETED", - "priority": 4, - "section": "SIM", - "date": "2020-01-20T00:00:00", - "member": "fc0", - "chunk": 2, - "out_path_local": "a008_20200120_fc0_2_SIM.20231027153508.out", - "err_path_local": "a008_20200120_fc0_2_SIM.20231027153508.err", - "out_path_remote": "a008_20200120_fc0_2_SIM.20231027153508.out", - "err_path_remote": "a008_20200120_fc0_2_SIM.20231027153508.err" - } } } } } -} \ No newline at end of file +} -- GitLab From 7aaac3ab67d0b322620b3c446183b0966acb28ef Mon Sep 17 00:00:00 2001 From: Luiggi Tenorio Date: Mon, 13 May 2024 10:28:48 +0200 Subject: [PATCH 06/14] update get status of /v3/expinfo --- CHANGELOG.md | 5 ++ autosubmit_api/experiment/common_requests.py | 74 ++++++++---------- tests/experiments/autosubmit.db | Bin 20480 -> 20480 bytes .../metadata/graph/graph_data_a003.db | Bin 8192 -> 8192 bytes 4 files changed, 39 insertions(+), 40 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a8414e..da7cd1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # CHANGELOG +### Pre-release v4.0.0b7 - Release date: TBD + +* Reduced writing time in status updater background task +* Minor fixes + ### Pre-release v4.0.0b6 - Release date: 2024-04-19 * Added filter by autosubmit version in `/v4/experiments` diff --git a/autosubmit_api/experiment/common_requests.py b/autosubmit_api/experiment/common_requests.py index f5a9095..f730d58 100644 --- a/autosubmit_api/experiment/common_requests.py +++ b/autosubmit_api/experiment/common_requests.py @@ -59,7 +59,7 @@ from autosubmit_api.builders.experiment_history_builder import ExperimentHistory from autosubmit_api.builders.configuration_facade_builder import ConfigurationFacadeDirector, AutosubmitConfigurationFacadeBuilder from autosubmit_api.builders.joblist_loader_builder import JobListLoaderBuilder, JobListLoaderDirector from autosubmit_api.components.jobs.job_support import JobSupport -from typing import Dict, Any, Optional +from typing import Dict, Any, Optional, Tuple import locale from autosubmitconfigparser.config.configcommon import AutosubmitConfig as Autosubmit4Config @@ -69,8 +69,7 @@ SAFE_TIME_LIMIT = 300 SAFE_TIME_LIMIT_STATUS = 180 -def get_experiment_stats(expid, filter_period, filter_type): - # type: (str, int, str) -> Dict[str, Any] +def get_experiment_stats(expid: str, filter_period: int, filter_type: str) -> Dict[str, Any]: """ Lite version of the stats generator from Autosubmit autosubmit.py """ @@ -151,8 +150,14 @@ def get_experiment_data(expid): 'db_historic_version': "NA"} try: autosubmit_config_facade = ConfigurationFacadeDirector(AutosubmitConfigurationFacadeBuilder(expid)).build_autosubmit_configuration_facade() - _, experiment_status = DbRequests.get_specific_experiment_status(expid) - result["running"] = (experiment_status == "RUNNING") + try: + _, experiment_status = DbRequests.get_specific_experiment_status(expid) + result["running"] = (experiment_status == "RUNNING") + except Exception as exc: + logger.warning((traceback.format_exc())) + logger.warning((f"Warning: Error in get_experiment_data: {exc}. Trying to get the status exhaustively.")) + _, _, is_running, _, _ = _is_exp_running(expid) + result["running"] = is_running result["path"] = autosubmit_config_facade.experiment_path result["owner_id"] = autosubmit_config_facade.get_owner_id() result["owner"] = autosubmit_config_facade.get_owner_name() @@ -181,7 +186,7 @@ def get_experiment_data(expid): except Exception as exp: result["error"] = True result["error_message"] = str(exp) - print((traceback.format_exc())) + logger.error((traceback.format_exc())) return result @@ -199,13 +204,12 @@ def get_current_status_log_plus(expid): "log_path": log_path} -def _is_exp_running(expid, time_condition=300): +def _is_exp_running(expid: str, time_condition=300) -> Tuple[bool, str, bool, int, str]: """ Tests if experiment is running :param expid: Experiment name :param time_condition: Time constraint, 120 by default. Represents max seconds before an experiment is considered as NOT RUNNING :return: (error (true if error is found, false otherwise), error_message, is_running (true if running, false otherwise), timediff, path_to_log) - :rtype: tuple (bool, string, bool, int) """ is_running = False error = False @@ -225,14 +229,13 @@ def _is_exp_running(expid, time_condition=300): expid, APIBasicConfig, ConfigParserFactory()) as_conf.reload() current_version = as_conf.get_version() - except Exception as exp: - # print(exp) - pass + except Exception as exc: + logger.warning("Error in getting current_version: " + str(exc)) look_old_folder = True if current_version is not None and (str(current_version).startswith( "3.11") or str(current_version).startswith("3.9") or str(current_version).startswith("3.12")) else False - pathlog_first = pathlog_aslog if look_old_folder == False else pathlog_tmp - pathlog_second = pathlog_aslog if look_old_folder == True else pathlog_tmp + pathlog_first = pathlog_aslog if look_old_folder is False else pathlog_tmp + pathlog_second = pathlog_aslog if look_old_folder is True else pathlog_tmp # print("Experiment {0} version {1} \nLook {2} \nLook {3}".format( # expid, current_version, pathlog_first, pathlog_second)) # print(pathlog) @@ -313,8 +316,8 @@ def get_experiment_summary(expid, log): job_package_reader = JobPackageReader(expid) try: job_package_reader.read() - except: - logger.warning("Failed to read job_packages") + except Exception as exc: + logger.warning(f"Failed to read job_packages: {exc}") # Basic data job_running_to_seconds = dict() job_running_to_runtext = dict() @@ -359,7 +362,6 @@ def get_experiment_summary(expid, log): queue_seconds = job_info.queue_time if job_info else 0 running_seconds = job_info.run_time if job_info else 0 status = job_info.status if job_info else "UNKNOWN" - energy = job_info.energy if job_info else 0 # Identifying SIM name_components = job_name.split('_') if "SIM" in name_components: @@ -536,7 +538,6 @@ def get_job_log(expid, logfile, nlines=150): error = False error_message = "" logcontent = [] - reading = "" APIBasicConfig.read() exp_paths = ExperimentPaths(expid) logfilepath = os.path.join(exp_paths.tmp_log_dir, logfile) @@ -752,7 +753,6 @@ def get_experiment_tree_structured(expid, log): """ try: - notransitive = False APIBasicConfig.read() # TODO: Encapsulate this following 2 lines or move to the parent function in app.py @@ -812,18 +812,12 @@ def get_experiment_counters(expid): # TODO: Update to current representation standards and classes def get_quick_view(expid): """ Lighter View """ - pkl_file_name = "" error = False error_message = "" #quick_view = list() view_data = [] quick_tree_view = deque() - source = JobList.get_sourcetag() - target = JobList.get_targettag() - sync = JobList.get_synctag() - check_mark = JobList.get_checkmark() jobs_in_pkl = {} - fakeAllJobs = [] total_count = completed_count = failed_count = running_count = queuing_count = 0 try: APIBasicConfig.read() @@ -840,8 +834,8 @@ def get_quick_view(expid): job_package_reader.read() job_to_package = job_package_reader.job_to_package package_to_package_id = job_package_reader.package_to_package_id - except: - logger.warning("Failed to read job_packages") + except Exception as exc: + logger.warning(f"Failed to read job_packages: {exc}") logger.debug(("Retrieving packages {0} seconds.".format( str(time.time() - now_)))) @@ -872,9 +866,9 @@ def get_quick_view(expid): status_text = str(common_utils.Status.VALUE_TO_KEY[status_code]) jobs_in_pkl[job_name] = ( status_code, status_color, status_text, out, err, priority, id_number) - except Exception as exp: + except Exception as exc: raise Exception( - "Autosubmit API couldn't open pkl file. If you are sure that your experiment is running correctly, try again.") + f"Autosubmit API couldn't open pkl file. If you are sure that your experiment is running correctly, try again: {exc}") total_count = len(list(jobs_in_pkl.keys())) @@ -884,9 +878,9 @@ def get_quick_view(expid): job_name] wrapper_tag = "" wrapper_id = 0 - wrapper_name = "" + # wrapper_name = "" if job_name in list(job_to_package.keys()): - wrapper_name = job_to_package[job_name] + # wrapper_name = job_to_package[job_name] wrapper_id = package_to_package_id[job_to_package[job_name]] wrapper_tag = " Wrapped " + \ wrapper_id + "" @@ -909,8 +903,8 @@ def get_quick_view(expid): # return {} # quick_tree_view = list(quick_tree_view) - except Exception as exp: - error_message = "Exception: {0}".format(str(exp)) + except Exception as exc: + error_message = "Exception: {0}".format(str(exc)) error = True logger.error(error_message) logger.error(traceback.format_exc()) @@ -989,7 +983,7 @@ def get_current_configuration_by_expid(expid: str, user_id: Optional[str]): experimentRun = historicalDatabase.get_max_id_experiment_run() currentMetadata = json.loads( experimentRun.metadata) if experimentRun and experimentRun.metadata else None - currentRunId = experimentRun.run_id if experimentRun else None + # currentRunId = experimentRun.run_id if experimentRun else None # Main keys = conf, exp, jobs, platforms, proj # Can we ignore proj by now? Including it. # TODO: Define which keys should be included in the answer @@ -1199,7 +1193,7 @@ def test_esarchive_status(): clatency = result[4] DbRequests.insert_archive_status( status, alatency, abandwith, clatency, cbandwidth, rtime) - except Exception as exp: + except Exception: print((traceback.format_exc())) # error_message = str(exp) @@ -1225,9 +1219,9 @@ def get_last_test_archive_status(): rtime) > 1 else None else: str_status = "OFFLINE" - except Exception as exp: + except Exception as exc: error = True - error_message = "" + error_message = exc return {"status": str_status, "error": error, @@ -1247,14 +1241,14 @@ def enforceLocal(log): try: try: locale.setlocale(locale.LC_ALL, 'en_GB.UTF-8') - except Exception as e: + except Exception: try: locale.setlocale(locale.LC_ALL, 'C.utf8') - except Exception as e: + except Exception: try: locale.setlocale(locale.LC_ALL, 'en_GB') - except Exception as e: + except Exception: locale.setlocale(locale.LC_ALL, 'es_ES') - except Exception as e: + except Exception: log.info("Locale C.utf8 is not found, using '{0}' as fallback".format("C")) locale.setlocale(locale.LC_ALL, 'C') diff --git a/tests/experiments/autosubmit.db b/tests/experiments/autosubmit.db index ad4dc9a816ae5371c0d7c7d82e2927a0dba93f74..fb254ee0a2cee918a93f7f38363570a6b28ca2ce 100644 GIT binary patch delta 35 icmZozz}T>Wae}m9FarYvD-gqg$V44u#^8+!3;Y3iD+aFs delta 35 icmZozz}T>Wae}mg3;Y3gnFf>q diff --git a/tests/experiments/metadata/graph/graph_data_a003.db b/tests/experiments/metadata/graph/graph_data_a003.db index e8afa84d90dd6c44b6accd5fdb53d4552a1376b7..52344533245f1563c9bb8feaa2dacff14fea50f8 100755 GIT binary patch delta 17 YcmZp0XmFSy&FDB$#+lJ^W5NP?05KK?Z~y=R delta 17 YcmZp0XmFSy&1f-E#+lJ#W5NP?05FdQUH||9 -- GitLab From d8d844c9863e77a5d1a2ad9487573b8d5181c4bd Mon Sep 17 00:00:00 2001 From: Luiggi Tenorio Date: Mon, 22 Apr 2024 15:12:58 +0200 Subject: [PATCH 07/14] sphinx setup --- docs/.gitkeep | 0 docs/Makefile | 208 +++++++++++++++++++++++++++++++++ docs/requirements.txt | 6 + docs/source/_static/Logo.svg | 67 +++++++++++ docs/source/_static/custom.css | 19 +++ docs/source/conf.py | 24 ++++ docs/source/index.rst | 5 + 7 files changed, 329 insertions(+) delete mode 100644 docs/.gitkeep create mode 100644 docs/Makefile create mode 100644 docs/requirements.txt create mode 100644 docs/source/_static/Logo.svg create mode 100644 docs/source/_static/custom.css create mode 100644 docs/source/conf.py create mode 100644 docs/source/index.rst diff --git a/docs/.gitkeep b/docs/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..0ba74d9 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,208 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = -W +SPHINXBUILD = sphinx-build +PAPER = +SOURCEDIR = source +BUILDDIR = build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source + +.PHONY: help clean watch html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " watch to make standalone HTML files and watch for changes" + @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 " applehelp to make an Apple Help Book" + @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 " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +watch: clean + @echo + @echo "Building and watching for changes in the documentation." + sphinx-autobuild "$(SOURCEDIR)" "$(BUILDDIR)" \ + -b html \ + --port 8099 \ + --ignore='**venv' \ + --ignore='**.gitlab' \ + --ignore='*.egg-info' \ + --ignore='bin' \ + --ignore='**_includes/**/*.txt' \ + --watch='autosubmit' \ + $(SPHINXOPTS) $(O) + +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/autosubmit.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/autosubmit.qhc" + +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/autosubmit" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/autosubmit" + @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." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @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." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +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." + +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/requirements.txt b/docs/requirements.txt new file mode 100644 index 0000000..5deaf0f --- /dev/null +++ b/docs/requirements.txt @@ -0,0 +1,6 @@ +livereload +pydata-sphinx-theme==0.15.* +sphinx==5.* +sphinx-autobuild==2021.3.* +sphinx_rtd_theme +sphinx-reredirects==0.1.* diff --git a/docs/source/_static/Logo.svg b/docs/source/_static/Logo.svg new file mode 100644 index 0000000..729c06a --- /dev/null +++ b/docs/source/_static/Logo.svg @@ -0,0 +1,67 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/docs/source/_static/custom.css b/docs/source/_static/custom.css new file mode 100644 index 0000000..3d6e35a --- /dev/null +++ b/docs/source/_static/custom.css @@ -0,0 +1,19 @@ +.bd-sidebar-primary::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +.bd-sidebar-primary::-webkit-scrollbar-track { + background-color: transparent; + margin-top: 1px; + margin-bottom: 1px; +} + +.bd-sidebar-primary::-webkit-scrollbar-thumb { + border-radius: 9999px; + background-color: rgb(163 163 163); +} + +.bd-sidebar-primary::-webkit-scrollbar-corner { + background-color: transparent; +} diff --git a/docs/source/conf.py b/docs/source/conf.py new file mode 100644 index 0000000..5b92fd8 --- /dev/null +++ b/docs/source/conf.py @@ -0,0 +1,24 @@ +# Configuration file for the Sphinx documentation builder. + +# -- Project information + +project = "Autosubmit API" +copyright = "2024, Barcelona Supercomputing Center, BSC" +author = "Earth Sciences Department, Barcelona Supercomputing Center, BSC" + +release = "4.0.0" +version = "4.0.0" + +# -- General configuration + +extensions = [] + +# -- Options for HTML output + +html_theme = "pydata_sphinx_theme" + +html_static_path = ["_static"] + +html_logo = "_static/Logo.svg" + +html_css_files = ["custom.css"] diff --git a/docs/source/index.rst b/docs/source/index.rst new file mode 100644 index 0000000..8ad301e --- /dev/null +++ b/docs/source/index.rst @@ -0,0 +1,5 @@ +:html_theme.sidebar_secondary.remove: + +############## +Autosubmit API +############## -- GitLab From ad5bb7ee93bbc60ccb94438317caaa99f563fff9 Mon Sep 17 00:00:00 2001 From: Luiggi Tenorio Date: Wed, 24 Apr 2024 14:48:48 +0200 Subject: [PATCH 08/14] Include redoc plugin --- docs/source/_static/openapi.json | 972 +++++++++++++++++++++++++++++++ docs/source/conf.py | 14 +- 2 files changed, 985 insertions(+), 1 deletion(-) create mode 100644 docs/source/_static/openapi.json diff --git a/docs/source/_static/openapi.json b/docs/source/_static/openapi.json new file mode 100644 index 0000000..d5b2417 --- /dev/null +++ b/docs/source/_static/openapi.json @@ -0,0 +1,972 @@ +{ + "openapi": "3.0.0", + "info": { + "version": "4.0.0", + "title": "Autosubmit API", + "license": { + "url": "https://www.gnu.org/licenses/gpl-3.0.html", + "name": "GNU General Public License" + } + }, + "paths": { + "/v3/running": { + "get": { + "tags": [ + "v3" + ], + "summary": "Running experiments", + "operationId": "get-v3-running", + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "experiment": { + "type": "array", + "items": { + "type": "object", + "properties": { + "completed": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "failed": { + "type": "integer" + }, + "hpc": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "modified": { + "type": "string" + }, + "name": { + "type": "string" + }, + "queuing": { + "type": "integer" + }, + "running": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "submitted": { + "type": "integer" + }, + "suspended": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "user": { + "type": "string" + }, + "version": { + "type": "string" + }, + "wrapper": { + "type": "string", + "nullable": true + } + } + } + } + }, + "x-examples": { + "Example 1": { + "experiment": [ + { + "completed": 25, + "description": "Testing AS 4.0", + "failed": 8, + "hpc": "MARENOSTRUM4", + "id": 8192, + "modified": "2022-10-03 10:05:27", + "name": "a4yd", + "queuing": 0, + "running": 0, + "status": "RUNNING", + "submitted": 0, + "suspended": 0, + "total": 385, + "user": "root", + "version": "4.0.0b0", + "wrapper": null + }, + { + "completed": 88, + "description": "TEST_AS_4.0", + "failed": 0, + "hpc": "MARENOSTRUM4", + "id": 8202, + "modified": "2022-11-30 11:50:29", + "name": "t0an", + "queuing": 0, + "running": 0, + "status": "RUNNING", + "submitted": 0, + "suspended": 0, + "total": 91, + "user": "root", + "version": "4.0.0b0", + "wrapper": null + } + ] + } + } + }, + "examples": { + "Example 1": { + "value": { + "experiment": [ + { + "completed": 25, + "description": "Testing AS 4.0", + "failed": 8, + "hpc": "MARENOSTRUM4", + "id": 8192, + "modified": "2022-10-03 10:05:27", + "name": "a4yd", + "queuing": 0, + "running": 0, + "status": "RUNNING", + "submitted": 0, + "suspended": 0, + "total": 385, + "user": "root", + "version": "4.0.0b0", + "wrapper": null + }, + { + "completed": 88, + "description": "TEST_AS_4.0", + "failed": 0, + "hpc": "MARENOSTRUM4", + "id": 8202, + "modified": "2022-11-30 11:50:29", + "name": "t0an", + "queuing": 0, + "running": 0, + "status": "RUNNING", + "submitted": 0, + "suspended": 0, + "total": 91, + "user": "root", + "version": "4.0.0b0", + "wrapper": null + } + ] + } + } + } + } + } + } + } + } + }, + "/v4/experiments": { + "get": { + "tags": [ + "v4" + ], + "summary": "Search experiments", + "description": "", + "operationId": "get-v4-experiments", + "parameters": [ + { + "name": "query", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "only_active", + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "owner", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "exp_type", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "test", + "operational", + "experiment" + ] + } + }, + { + "name": "autosubmit_version", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "name": "order_by", + "in": "query", + "schema": { + "type": "string", + "enum": [ + "expid", + "created", + "description" + ] + } + }, + { + "name": "order_desc", + "in": "query", + "schema": { + "type": "boolean" + } + }, + { + "name": "page", + "in": "query", + "schema": { + "type": "integer" + } + }, + { + "name": "page_size", + "in": "query", + "schema": { + "type": "integer" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "experiments": { + "type": "array", + "items": { + "type": "object", + "properties": { + "completed": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "failed": { + "type": "integer" + }, + "hpc": { + "type": "string", + "nullable": true + }, + "id": { + "type": "integer" + }, + "modified": { + "type": "string", + "nullable": true + }, + "name": { + "type": "string" + }, + "queuing": { + "type": "integer" + }, + "running": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "submitted": { + "type": "integer" + }, + "suspended": { + "type": "integer" + }, + "total": { + "type": "integer" + }, + "user": { + "type": "string", + "nullable": true + }, + "version": { + "type": "string" + }, + "wrapper": { + "type": "string", + "nullable": true + } + } + } + }, + "pagination": { + "type": "object", + "properties": { + "page": { + "type": "integer" + }, + "page_items": { + "type": "integer" + }, + "page_size": { + "type": "integer" + }, + "total_items": { + "type": "integer" + }, + "total_pages": { + "type": "integer" + } + } + } + }, + "x-examples": { + "Example 1": { + "experiments": [ + { + "completed": 0, + "description": "DE Model App", + "failed": 0, + "hpc": null, + "id": 9, + "modified": null, + "name": "a005", + "queuing": 0, + "running": 0, + "status": "NOT RUNNING", + "submitted": 0, + "suspended": 0, + "total": 0, + "user": null, + "version": "Unknown", + "wrapper": null + }, + { + "completed": 115, + "description": "DE downstream", + "failed": 0, + "hpc": "LOCAL", + "id": 11, + "modified": "2023-10-26 11:44:07", + "name": "a006", + "queuing": 0, + "running": 0, + "status": "NOT RUNNING", + "submitted": 0, + "suspended": 0, + "total": 115, + "user": "ltenorio", + "version": "4.0.95", + "wrapper": null + } + ], + "pagination": { + "page": 1, + "page_items": 2, + "page_size": 2, + "total_items": 9, + "total_pages": 5 + } + } + } + }, + "examples": { + "Example 1": { + "value": { + "experiments": [ + { + "completed": 0, + "description": "DE Model App", + "failed": 0, + "hpc": null, + "id": 9, + "modified": null, + "name": "a005", + "queuing": 0, + "running": 0, + "status": "NOT RUNNING", + "submitted": 0, + "suspended": 0, + "total": 0, + "user": null, + "version": "Unknown", + "wrapper": null + }, + { + "completed": 115, + "description": "DE downstream", + "failed": 0, + "hpc": "LOCAL", + "id": 11, + "modified": "2023-10-26 11:44:07", + "name": "a006", + "queuing": 0, + "running": 0, + "status": "NOT RUNNING", + "submitted": 0, + "suspended": 0, + "total": 115, + "user": "ltenorio", + "version": "4.0.95", + "wrapper": null + } + ], + "pagination": { + "page": 1, + "page_items": 2, + "page_size": 2, + "total_items": 9, + "total_pages": 5 + } + } + } + } + } + } + } + } + } + }, + "/v4/experiments/{expid}": { + "get": { + "tags": [ + "v4" + ], + "summary": "Get experiment info", + "operationId": "get-v4-experiments-expid", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": {} + } + }, + "/v4/experiments/{expid}/jobs": { + "get": { + "tags": [ + "v4" + ], + "summary": "List experiment jobs", + "operationId": "get-v4-experiments-expid-jobs", + "parameters": [ + { + "name": "view", + "in": "query", + "description": "Data view selector", + "schema": { + "type": "string", + "enum": [ + "base", + "quick" + ] + } + }, + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "jobs": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Job" + } + } + } + }, + "examples": { + "Example 1": { + "value": { + "jobs": [ + { + "name": "a008_20200120_fc0_2_SIM", + "status": "COMPLETED", + "priority": 4, + "section": "SIM", + "date": "2020-01-20T00:00:00", + "member": "fc0", + "chunk": 2, + "out_path_local": "a008_20200120_fc0_2_SIM.20231027153508.out", + "err_path_local": "a008_20200120_fc0_2_SIM.20231027153508.err", + "out_path_remote": "a008_20200120_fc0_2_SIM.20231027153508.out", + "err_path_remote": "a008_20200120_fc0_2_SIM.20231027153508.err" + } + ] + } + } + } + } + } + } + } + } + }, + "/v4/experiments/{expid}/wrappers": { + "get": { + "tags": [ + "v4" + ], + "summary": "List experiment wrappers", + "operationId": "get-v4-experiments-expid-wrappers", + "parameters": [ + { + "name": "expid", + "in": "path", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "wrappers": { + "type": "array", + "items": { + "type": "object", + "properties": { + "job_names": { + "type": "array", + "items": { + "type": "string" + } + }, + "wrapper_name": { + "type": "string" + } + } + } + } + }, + "x-examples": { + "Example 1": { + "wrappers": [ + { + "job_names": [ + "a6zi_18500101_fc0_1_SIM", + "a6zi_18500101_fc0_2_SIM" + ], + "wrapper_name": "a6zi_ASThread_17108563159474_528_10" + }, + { + "job_names": [ + "a6zi_18500101_fc0_3_SIM", + "a6zi_18500101_fc0_4_SIM", + "a6zi_18500101_fc0_5_SIM", + "a6zi_18500101_fc0_6_SIM", + "a6zi_18500101_fc0_7_SIM", + "a6zi_18500101_fc0_8_SIM", + "a6zi_18500101_fc0_9_SIM", + "a6zi_18500101_fc0_10_SIM", + "a6zi_18500101_fc0_11_SIM", + "a6zi_18500101_fc0_12_SIM" + ], + "wrapper_name": "a6zi_ASThread_17108816522924_528_10" + } + ] + } + } + } + } + } + } + } + } + }, + "/v4/auth/verify-token": { + "get": { + "tags": [ + "v4" + ], + "summary": "Verify JWT Token", + "operationId": "get-v4-auth-verify-token", + "parameters": [ + { + "name": "Authorization", + "in": "header", + "description": "JWT Token", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "authenticated": { + "type": "boolean" + }, + "user": { + "type": "string", + "nullable": true + } + } + }, + "examples": { + "Example 1": { + "value": { + "authenticated": true, + "user": "username" + } + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "authenticated": { + "type": "boolean" + }, + "user": { + "type": "string", + "nullable": true + } + } + }, + "examples": { + "Example 1": { + "value": { + "authenticated": false, + "user": null + } + } + } + } + } + } + } + } + }, + "/v4/auth/cas/v2/login": { + "get": { + "tags": [ + "v4" + ], + "summary": "CAS v2 Login", + "operationId": "get-v4-auth-cas-v2-login", + "parameters": [ + { + "name": "ticket", + "in": "query", + "description": "CAS ticket", + "schema": { + "type": "string" + } + }, + { + "name": "service", + "in": "query", + "description": "CAS service", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "authenticated": { + "type": "boolean" + }, + "message": { + "type": "string" + }, + "token": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "examples": { + "Example 1": { + "value": { + "authenticated": true, + "message": "Token generated", + "token": "...", + "user": "username" + } + } + } + } + } + }, + "302": { + "description": "Redirect to CAS login form" + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "authenticated": { + "type": "boolean" + }, + "message": { + "type": "string" + }, + "token": { + "type": "string", + "nullable": true + }, + "user": { + "type": "string", + "nullable": true + } + } + }, + "examples": { + "Example 1": { + "value": { + "authenticated": false, + "message": "Unauthorized", + "token": null, + "user": null + } + } + } + } + } + } + } + } + }, + "/v4/auth/oauth2/github/login": { + "get": { + "tags": [ + "v4" + ], + "summary": "GitHub Oauth2 App Login", + "operationId": "get-v4-auth-oauth2-github-login", + "parameters": [ + { + "name": "code", + "in": "query", + "description": "GitHub code used to exchange for an access_token", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "authenticated": { + "type": "boolean" + }, + "message": { + "type": "string" + }, + "token": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "examples": { + "Example 1": { + "value": { + "authenticated": true, + "message": "Token generated", + "token": "...", + "user": "username" + } + } + } + } + } + }, + "401": { + "description": "Unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "authenticated": { + "type": "boolean" + }, + "message": { + "type": "string" + }, + "token": { + "type": "string" + }, + "user": { + "type": "string" + } + } + }, + "examples": { + "Example 1": { + "value": { + "authenticated": false, + "message": "Unauthorized", + "token": null, + "user": null + } + } + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Job": { + "type": "object", + "title": "Job", + "description": "Base experiment job", + "properties": { + "name": { + "type": "string", + "description": "Job identifier" + }, + "status": { + "type": "string", + "enum": [ + "WAITING", + "READY", + "SUBMITTED", + "QUEUING", + "RUNNING", + "COMPLETED", + "HELD", + "PREPARED", + "SKIPPED", + "DELAYED", + "FAILED", + "UNKNOWN", + "SUSPENDED" + ], + "description": "Status of the job", + "default": "UNKNOWN" + }, + "priority": { + "type": "integer" + }, + "section": { + "type": "string" + }, + "date": { + "type": "string", + "format": "date-time" + }, + "member": { + "type": "string" + }, + "chunk": { + "type": "integer" + }, + "out_path_local": { + "type": "string" + }, + "err_path_local": { + "type": "string" + }, + "out_path_remote": { + "type": "string" + }, + "err_path_remote": { + "type": "string" + } + }, + "x-examples": { + "Example 1": { + "name": "a008_20200120_fc0_2_SIM", + "status": "COMPLETED", + "priority": 4, + "section": "SIM", + "date": "2020-01-20T00:00:00", + "member": "fc0", + "chunk": 2, + "out_path_local": "a008_20200120_fc0_2_SIM.20231027153508.out", + "err_path_local": "a008_20200120_fc0_2_SIM.20231027153508.err", + "out_path_remote": "a008_20200120_fc0_2_SIM.20231027153508.out", + "err_path_remote": "a008_20200120_fc0_2_SIM.20231027153508.err" + } + } + } + } + } +} \ No newline at end of file diff --git a/docs/source/conf.py b/docs/source/conf.py index 5b92fd8..1af25c7 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -11,10 +11,22 @@ version = "4.0.0" # -- General configuration -extensions = [] +extensions = [ + 'sphinxcontrib.redoc' +] # -- Options for HTML output +redoc = [ + { + 'name': 'Autosubmit API', + 'page': 'api', + 'spec': '_static/openapi.json', + # 'spec': 'https://petstore3.swagger.io/api/v3/openapi.json', + # 'spec': 'https://petstore.swagger.io/v2/swagger.json' + } +] + html_theme = "pydata_sphinx_theme" html_static_path = ["_static"] -- GitLab From 3a11d2fa160a549b4f385a320dd7f7f663e796c2 Mon Sep 17 00:00:00 2001 From: Luiggi Tenorio Date: Wed, 24 Apr 2024 14:49:03 +0200 Subject: [PATCH 09/14] update pages --- docs/source/_static/Logo.svg | 50 ++++++++++++++++++----------- docs/source/configuration/index.rst | 33 +++++++++++++++++++ docs/source/index.rst | 8 +++++ docs/source/installation/index.rst | 23 +++++++++++++ docs/source/usage/index.rst | 31 ++++++++++++++++++ 5 files changed, 127 insertions(+), 18 deletions(-) create mode 100644 docs/source/configuration/index.rst create mode 100644 docs/source/installation/index.rst create mode 100644 docs/source/usage/index.rst diff --git a/docs/source/_static/Logo.svg b/docs/source/_static/Logo.svg index 729c06a..0777169 100644 --- a/docs/source/_static/Logo.svg +++ b/docs/source/_static/Logo.svg @@ -11,11 +11,11 @@ height="2.23333in" viewBox="0 0 1200 670" version="1.1" - id="svg3" - sodipodi:docname="as_short.svg" + id="svg1093" + sodipodi:docname="as_api.svg" inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"> + id="metadata1099"> @@ -26,7 +26,7 @@ + id="defs1097" /> + inkscape:current-layer="svg1093" /> + id="path1914" + style="fill:#4e8490;fill-opacity:1" /> + id="path1912" + style="fill:#4e8490;fill-opacity:1" /> + id="path1910" /> + id="path1906" + style="fill:#ff511c;fill-opacity:1" /> + + + diff --git a/docs/source/configuration/index.rst b/docs/source/configuration/index.rst new file mode 100644 index 0000000..79042a9 --- /dev/null +++ b/docs/source/configuration/index.rst @@ -0,0 +1,33 @@ +.. _configuration: + +############## +Configuration +############## + +The Autosubmit API have some configuration options that can be modified by setting their specific environment variable before starting the server: + + +General variables +************************** + +* ``SECRET_KEY``: The secret key to encode the JWT tokens from the Authorization Module. + +.. important:: Always set ``SECRET_KEY`` when deploying the API on production. + + +Authentication variables +************************** + +* ``PROTECTION_LEVEL``: Default ``ALL``. Possible values ``ALL``, ``WRITEONLY``, ``NONE``. + + * If set to ``ALL``, all the endpoints will be protected by needing a valid token inside the **Authorization** header of the request. + * If set to ``WRITEONLY``, only a subset of the endpoints will be protected. + * If set to ``NONE``, none of the endpoints will be protected. + +* ``CAS_SERVER_URL``: CAS Protocol server base URL to request a ticket and verify it. Used for **/v4** endpoints. ``CAS_LOGIN_URL`` and ``CAS_VERIFY_URL`` can be empty if this variable is set (the API will append the protocol URL subpaths). +* ``CAS_LOGIN_URL``: CAS Protocol URL to request a ticket. Used for **/v3** endpoints. +* ``CAS_VERIFY_URL``: CAS Protocol URL to verify a given ticket. Used for **/v3** endpoints. +* ``GITHUB_OAUTH_CLIENT_ID``: Client ID of the Github Oauth app. +* ``GITHUB_OAUTH_CLIENT_SECRET``: Secret key of the Github Oauth app. +* ``GITHUB_OAUTH_WHITELIST_ORGANIZATION``: Used to use authorization based on the membership of a Github organization. +* ``GITHUB_OAUTH_WHITELIST_TEAM``: Used to use authorization based on the membership of a Github team in an organization. ``GITHUB_OAUTH_WHITELIST_ORGANIZATION`` is required \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index 8ad301e..e6ee816 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,3 +3,11 @@ ############## Autosubmit API ############## + + +.. toctree:: + :maxdepth: 2 + + /installation/index + /configuration/index + /usage/index diff --git a/docs/source/installation/index.rst b/docs/source/installation/index.rst new file mode 100644 index 0000000..16dcb95 --- /dev/null +++ b/docs/source/installation/index.rst @@ -0,0 +1,23 @@ +.. _installation: + +############## +Installation +############## + +Autosubmit API can be easily installed via pip: + +.. code-block:: bash + + pip install autosubmit-api # >=4.0 (recommended) + + +Then, you can check it's installation and check server options: + +.. code-block:: bash + + autosubmit_api start -h + + +.. note:: See more in Pypi: https://pypi.org/project/autosubmit-api/ + +Continue to :ref:`configuration` or :ref:`usage` once it's installed. \ No newline at end of file diff --git a/docs/source/usage/index.rst b/docs/source/usage/index.rst new file mode 100644 index 0000000..6c87577 --- /dev/null +++ b/docs/source/usage/index.rst @@ -0,0 +1,31 @@ +.. _usage: + +############## +Usage +############## + +Once Autosubmit API is installed, the Command Line Interface can be used: + +.. code-block:: bash + + autosubmit_api start + +``autosubmit_api start`` will have the following options: + + ``--init-bg-tasks`` + run background tasks on start. + ``--disable-bg-tasks`` + disable background tasks. + ``-b BIND, --`` + bind BIND the socket to bind + ``-w WORKERS, --workers WORKERS`` + the number of worker processes for handling requests + ``--log-level LOG_LEVEL`` + the granularity of Error log outputs + ``--log-file LOG_FILE`` + The Error log file to write to + ``-D, --daemon`` + Daemonize the Gunicorn process + + +You can go to the API reference here: `Reference <../api.html>`_ \ No newline at end of file -- GitLab From 28d378d225a602ec96d7139436d5a033c280cb67 Mon Sep 17 00:00:00 2001 From: Luiggi Tenorio Date: Mon, 13 May 2024 15:23:09 +0200 Subject: [PATCH 10/14] update README --- README.md | 46 +++++++++--------------------- docs/GUI_Architecture_wide4.png | Bin 83304 -> 0 bytes docs/Total_Autosubmit_Diagram.png | Bin 319173 -> 0 bytes 3 files changed, 13 insertions(+), 33 deletions(-) delete mode 100644 docs/GUI_Architecture_wide4.png delete mode 100644 docs/Total_Autosubmit_Diagram.png diff --git a/README.md b/README.md index 85fcb05..0c5b1a2 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,10 @@ # Table of Contents -1. [Overview](#overview) +1. [Overview](#overview) 2. [Installation](#installation) 3. [Configuration options](#configuration-options) 4. [How to run tests](#how-to-run-tests) -5. [Autosubmit Big Picture at BSC](#autosubmit-big-picture-at-bsc) ## Overview @@ -37,19 +36,18 @@ autosubmit_api start The Autosubmit API have some configuration options that can be modified by setting their specific environment variable before starting the server: -* **`PROTECTION_LEVEL`**: Default `ALL`. Possible values `ALL`, `WRITEONLY`, `NONE`. - * If set to `ALL`, all the endpoints will be protected by needing a valid token inside the `Authorization` header of the request. - * If set to `WRITEONLY`, only a subset of the endpoints will be protected. - * If set to `NONE`, none of the endpoints will be protected. -* **`SECRET_KEY`**: The secret key to encode the JWT tokens from the Authorization Module. **Important to be set up on production.** -* **`CAS_SERVER_URL`**: CAS Protocol server base URL to request a ticket and verify it. Used for `/v4` endpoints. `CAS_LOGIN_URL` and `CAS_VERIFY_URL` can be empty if this variable is set (the API will append the protocol URL subpaths). -* **`CAS_LOGIN_URL`**: CAS Protocol URL to request a ticket. Used for `/v3` endpoints. -* **`CAS_VERIFY_URL`**: CAS Protocol URL to verify a given ticket. Used for `/v3` endpoints. -* **`GITHUB_OAUTH_CLIENT_ID`**: Client ID of the Github Oauth app. -* **`GITHUB_OAUTH_CLIENT_SECRET`**: Secret key of the Github Oauth app. -* **`GITHUB_OAUTH_WHITELIST_ORGANIZATION`**: Used to use authorization based on the membership of a Github organization. -* **`GITHUB_OAUTH_WHITELIST_TEAM`**: Used to use authorization based on the membership of a Github team in an organization. `GITHUB_OAUTH_WHITELIST_ORGANIZATION` is required - +- **`PROTECTION_LEVEL`**: Default `ALL`. Possible values `ALL`, `WRITEONLY`, `NONE`. + - If set to `ALL`, all the endpoints will be protected by needing a valid token inside the `Authorization` header of the request. + - If set to `WRITEONLY`, only a subset of the endpoints will be protected. + - If set to `NONE`, none of the endpoints will be protected. +- **`SECRET_KEY`**: The secret key to encode the JWT tokens from the Authorization Module. **Important to be set up on production.** +- **`CAS_SERVER_URL`**: CAS Protocol server base URL to request a ticket and verify it. Used for `/v4` endpoints. `CAS_LOGIN_URL` and `CAS_VERIFY_URL` can be empty if this variable is set (the API will append the protocol URL subpaths). +- **`CAS_LOGIN_URL`**: CAS Protocol URL to request a ticket. Used for `/v3` endpoints. +- **`CAS_VERIFY_URL`**: CAS Protocol URL to verify a given ticket. Used for `/v3` endpoints. +- **`GITHUB_OAUTH_CLIENT_ID`**: Client ID of the Github Oauth app. +- **`GITHUB_OAUTH_CLIENT_SECRET`**: Secret key of the Github Oauth app. +- **`GITHUB_OAUTH_WHITELIST_ORGANIZATION`**: Used to use authorization based on the membership of a Github organization. +- **`GITHUB_OAUTH_WHITELIST_TEAM`**: Used to use authorization based on the membership of a Github team in an organization. `GITHUB_OAUTH_WHITELIST_ORGANIZATION` is required ## How to run tests @@ -72,21 +70,3 @@ pytest --cov=autosubmit_api --cov-config=.coveragerc --cov-report=html tests/ ``` You will find the report in `htmlcov/index.html` - -## Autosubmit Big Picture at BSC - -![Autosubmit Big Picture](/docs/Total_Autosubmit_Diagram.png) - -In this image you can see the flow of information in the **Autosubmit environment**. - -* **Autosubmit**: Machines running Autosubmit. -* **Remote Platforms**: Platforms (HPCs in most cases) to which Autosubmit connects to run jobs. -* **Experiment Database**: Starting from Autosubmit `3.13.0`, each experiment generates a set of databases that save important (reusable) information about it. We have the `historical database`, `graph database`, `structures database`. -* **File System**: The file system where the experiment files are stored. -* **Data Process Workers**: **Autosubmit API** implements a set of workers that periodically collect information from the experiments or complement that information. In the current **BSC** implementation, these workers are running no `bscesweb04` under `webadmin` user. -* **Main Database**: **Autosubmit API** uses a centralized database to keep track of important experiment information. The **workers** fill this information. **Autosubmit** also writes into this database. -* **Autosubmit API**: See [Autosubmit API](https://earth.bsc.es/gitlab/es/autosubmit_api). Currently, under **BSC** implementation, this API is running on `bscesweb04` under `webadmin` user. This API exposes a set of requests that **Autosubmit GUI** consumes and serves to the users through the front end. -* **Autosubmit GUI**: This project. -* **Authentication Server**: **BSC Central Authentication Service**. -* **Users**: Users that access the GUI through their web browsers from any device. The current implementation requires that an user generates a token using the Authentication server once every 5 days. - diff --git a/docs/GUI_Architecture_wide4.png b/docs/GUI_Architecture_wide4.png deleted file mode 100644 index 060fffbf2e07ab674aeb620ecfd446a260a97687..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83304 zcmZ^~1z1~6+btYQad&qL6qn-el;TjJ6sJgWcP(DLKyfHgtVnQocZxe9xV!7wJn#E_ z-}$fW{JRM|O?Gxh?pd?$HEY6Elw{G6iIG7d5ZZe=DK!uXb`u1G`H2V*yhFZ6Jq(=S zjX%grfu3Lf{c0(Q2i`%lm;2-d0-<-mJYf=<&`E$d5uD#EN+WE%B1J_IoY5b>0Nx_| zs-f*HX=h_&YU>RA7X*@YG&OQI{X*&X)!Bkl_PwIY7gkdQ5Qq}=UP@fUec@o)O&iy3 zP4wiN$JJ=JFbpmBkDO|`Q8-%DE=Q6t|0Is0^3gAv3g@Ft(hSkAZ|J~(LJo}@)fj8ei>ZKFJo z6Nj>yh-1dd#m^JSMj_+B#==sipf$z9#QNvpNWf9$<De;U;NKS|MTMiarOUv_CGKFpBG)jmX@** z5))88+&{HJ^iEs^?8|kkmDKY~t zKC$y!$#aTwxyHi@K75)~zdkYi^&zC07t-u}Y|C74DUz;KaN@@%a*yrnwqL1#KOD%7 z!0rS^)h^Y1cz9%!Q<87kaZ}q}Q5#=R5Ghy0`-qp*hva}HTuY(ZQi)CBbB6^IqmDCt z9!0(>eiYQJtu4ckH&?_Z7k%vJsy`mRza7cvx_i1muCSh;&x-iT{OQ}6$o)aiLhs(5 zr9uiPoMtf|39qe`rKKhK=lFX#IJmHwnB&VsF5;-UCO7a2A3uKz0uNTW_3fshkQ-z| zUF0}dqf?ZUkj5CB-FDELxdE#5IuyP6*S>CpTfs@46t%d7qi0Nu+f}1oxn)n3p6{}G z+kwoNgF^jf+p2-Ey~n2DK8M^%chKaUTrI0Xt(LQ9hFDlJ4^t1Y?cX80X4K+o>TPSDk_Rf##!BW6}YV!hSepT&KV2azEauZa})xn zN9uaKvYfYRKAP?^ZnOU9V{y>2k+HEcI0*{`#8G;Z7&_?9n>Xe2)91KivkGQhEExs^6zy^+e_HZ^6yNT7u*Z`^MHmgYb78Td+xJHUX%c5{Q~jp0ED;5mpDiF$J>qUhtXEJ)1TS|~we@Cl3j zs-7(}UY1^xI!^b*MaKaWs0}=YTPc9mVt8BAgYqJ>CmZ$bs zCWd?j_8ylMogO8C^?fD`ujzwE^Z7Jg%yBSm>d$qCrFwKbur7MUJgUt;QuEaY+08-H zvX5~Fj(Xqqf>(i3a!B2CL&exZvCkXn94Ai&>d&I%dAVAagDjdT`o53S&{G@UWx5AF zhwrIp4>{hd6q|qc7{R8tP4}A6TgbzeC-j-(_OS~XE&;{1^%FEDhj>4Q#~mduM1Wv> zzP?PV-;7RUx0NT(k%?(9bU@N}T&8Zm?+~<@u6AvVwz09f*{ApGaN#uw9H^qBHdA=_ zgHy(+_uH=fL6NMg&#ynSb^E`C$+`OmOw?39Yen>B`J%2Dk zyP6%CGX~MBB@lEyY>%pg_>b>~%VqMxyRo#vx?H++T0PxQ>M%FhVy#UYb2#+6mw4~; zSJ%`ajq&o3;kRrz8q8!&`tB%Zoo|$4V2zKK)ve?AD{(e4XTG#7@}!6I}QQGqDfa3!iYn+VPQBH+*g*uKqC-;_8(# z`crDqhYtg+Ix9h=Nm9L(MN5kJxer9G=G&Hoi1}A!a7M&oYt`O)}njLR#tkAx3?=%?S)agyqh{<`CGvn0DbZnNk=-avwg=TRE4$7)mRa{97RK@+JGX42-ilKY?-BE3 zmr|jtL_|N?9+yKIv*iHCadX}oGO4GKn)>_i;o1qr-y3qL>c5)3TJeJ#?Yv{jXqCN+ zfviE(whUD*8So2&p{>PS70}RUSdgj*YD9GCV9d62qw|Hl;%z||SVqwX4Mb`7h56`i zd0B$Os8lJUH@_>4P-r6oDxar8CBV3FZ#bQ5MT9x2t3cTAHiz7@86Keyd_Nd>1q1 zov<-W^vEaszWSkOgUBTYO)$qkH>@k($74ApSbq2SeSde}x!>2g>AG=VCxx$^ZwR=V zil%eEcHR+%B&zsU?%p*VF@bJws$x#h_SrfuYrfk>9x(M}`sCe=HByvsJ-134iv2p# zt&t@f`ofuR!5^@1*M#obvVwP`*6V7OQMf%lI~&otTko(wdRO!DG zQ>(c#BAp$92&dCp21w7xpS+gF`{QV^@bO)hOsA$*Rx)h(cA=pZz1vxStaoi>g08EX zUPl4r7EOIvrlUKva1H6eCzl)7plUo|0tzv=I48-|8QO07XAdbp4DuA=(k}fLMvo&F_5hk z<=3NM)^xF?S)J zP=|>^j!sCL-)M*1^Mk%O{n0k*I}ILcH_6r$KS8&{?rC2AH$h8Y$ITc$X?58-zmc=N z%ZbGU#LIBxCykcQSC@0*hjGS4SYQ8XsM@A-^C3q+DDCK_sNxXuc?D`WWMA!>)x4Z@ z%|I>6+^^WWx2rfS+E!I7Cs}lIGv0D`6P?YPeGdAu{3d7i80?JTn-_x(Zn>28K7$q% zG8A=Yw6zTR!073PYw7zDJ>OsY^*`|=c-19_uXv4ILprCPax3lH1QCm;Ev2Hu_9lG! zGM2sE+z>Ylo;rYeAO~9Bbnv6^x3iUj&*|9M>BG<%Qout60!3fuT1&rPR_I0b#gz>t zRO|WT`;JTEbYdq23fpyhM#8q9xcwaV{Rd-0lE#`_9gE<$OU}x81=tywzL*%72;M-U zQ0*E^Jbk}MmlwbcMJMajb6XAu!pd;q#~TSsgH~^T*TaQi$xw7?1Y4_^ipqV%)`=1G z=h|Vb1GKTRSUFmEXfVOaJ>;2udU_flNo-rgDKtWDzK@=&?yL+9n5m^+PXQR8%Z`XMJ{(ch&$LtTU|R8ZuSYk7@`}V5AW6^ZH+C-&ynCZl(pg^ zS=ghfsMNCt_W=Z=$z7@$-ORXPg4FqCom>}69Sf#x;@wLVl#yAf3=J;V)FB7I8jo8e z{u)0J=0(x?*}}K^B6a^12vp;p*ld;J>Ex^$(DjN(mTdA$1lb{X8+;&4!|msw?My#U zyqsJaiQQZ&3EfvK-j|AzN~BTzRh6;tEF&$1o0|0Uyt)Z`*-E|PW)03sP)XS_1G^B` z$MIq!{9b=Q>&|Xo(wi}hAc`q;$uVIqnMi#TS z$+(X~?SExIZUt=fyy=a>zH|_s^yR}DOFaX!HdG3phlHV{W%?uK%pVDkqxXL*cG)#s z_Rza|SzC}WL{AVUBqXrNxUs<{o*&(hAkUv*o0g9p;s;trqGX93j>)dqQklvEbV@_o z7AVxhFVbTu_Q(KmM!+DCq>>CtzqGnObfS2Uii*+(BK0S$96-l)+lNKVubbUJ<{AL$&SqgnC1@`YY|pOr}0uU90o zGZ^zpbizYBwjo$QYmycFFAIaOo8#Cysfgqg*;=31Bp=$6$njnscCkH)>N+^h7NDG? zK7cUsAT=t!zm|NKP3z{%9~$Z$_FdTG1yb9O*bGSzQP?;y^G(;jTR%Q-rF?kC z<6VwQJMzKKhDD%pUNsb|-_z4BU2_t!8r)Tz%pI9!DrP#}Y-^1VAX4{FE9Aq!mg z(k1Z7tf})a<~Psl!~L9#)2xhby17OSsZXv)A8TSuFv&5YOp4$=90IrD-YI^d#TGhi z&(+W3aJo}?I2{9jf8}yFhq|+Pk@HKVu?{z`i)NXAWQVZCU|%@&i?Vf+xtyYsd`FH) zgw&XuH9BO1`lxIDlR5=AwS4`1$Fp-Gy^0HaW9tBWtHL@My%&gCqzQ6%~3< z(!hl|BAX_?k%^!ct#A)!*2JAU zAn6mNWIm<~rhT&lrp51_Hs;*rd+4z8$qHpE0+iOEPKmC+-ksCUXDbNDz1ui+>y=-* z*j>)v{ibvCUE2viJhL8caqln&&o;>{x~dmx97X6y5KSX2KV}ptwB#?JkgvCEt6bDY7k zjmjZboD7^l#mkT)CUEnF)h)Q~N#{n8n;VZtCh|mNwop)XHXXG%^RWV4-+7;WW=%|v zjr|Rve-UjYlKVlN z@jQ}2-{uUfPoEM{Aitm@V7^C)66?xH{B#bbwoiY`6(3lSuC z^t_};vfdZj^$YRX%03T#pDtq2Zx0rE0t71aw_YE3cx+b~UMCljd+A(wNA~^tiuWSS-6xzR-1Ng#vay3j{ClE5Hn4;b&n+mQ}L8CkJ{k?7>uq}0}9 zg9VyKJti0+d+yCqreR6_?Bb%E^6ajY{xjK%i@km6?7F7K>6sZi4TN!8P^ ztU&nS2wPuZK1$A!tnPUdYtbyb>jUb&i(7l@y=KK5fcrOiE1muY0=z$2hyu8#uZgAX`&;I1o$Laa}c>CL6+vs6zenZ+M)fPO*1v~ft6ZD?1nF|Ap`zR(wrv~qLVfctboqelA{ zuU<$2I&8(^N-C4*%CA}1yGDpYL}sv~{CWQV#j9x^3O!X=m{m zN(>n~LM3Y!O)A~qO6Zc0L8J_<<-V05nh7idYPUc8ag#~rc^Z8bzCqB;%q%jE9;}#m zNqtCdQPF$nHKC89+o|X@CNYt&vp@Bndbn>^OEEZTJDYm*TeHby9-fSvuc1u^s43f( zdR|wDSfy^>*6FkR#X|5zu#}chNAts^Aho{Vo-NPsVLRas0S-lGOXyzm`5xq)xdZsA-4jD6WW(p; zDl%HPbfaHrN%kk|IOn3a8gsO2wIV6q^c%tXxjBYbxrp%HhczH~KFA#M@C}io-mT7G zbV`ZNzW0F+Z6H3{HYiFje; zEuPtz6v6cJ2wQ6w@91LG%f7ec(|}9sLuDP;BUC7@N<9dJ9$C$}7=S~%)_d7OQyNEy z?_yyw(VAx}ghHfyT#AH>uaEH)^_;!c=!e{c&Vo23JhX*Ice`Xg4M-MBG)c=`>Leme z845nA#7reTLuL(f9&pcNvgAE_e2u1T$B4(Gb7NrJ0|KXW%tpwPPD^ay{e$Y=$4zWP z1tT&?$b}D2k|&tjML}=LBo6Q*z})~hE_dnEw4SRb=Wj@p-hbM<_j{qA=rD(hK8*l% zy}OP1BZm+-MZSI^G@IpJ36#?!VE~(Pd5xZIY#xxpBWR$Y@fmx~JWePoD4Jhcnc3 zCE&zqwJ$qe(SYfrGF}^qaz}>nP_;i@9Gc%8onr)KbTkfaWsW~G)Nah+h;SUZiwV_B-n>24>)_p216x={Y#0k*#cyY55UJ_+Hpelcf2opeCme zNMD4l6cR<`rD{VT<0Za*>j_ZLJ-tH>?Fv9kn?Z?5(s%MHfcXHB^og7I?pxvJr)|&H z?FNv0ZRhM={+3T}bwf@YE=|jF4vHyb`1|xs4|g`U z`gl~UOx+l+cbZ5<_aYbP64ygLMHAdKQM?2)YnsTq?9Kb^t*opHwo?s!Z>8P60Z zD24Bh_(k%_Y z%m;(zS^Hd}E$r*_1I9<$e!v^ZTvhikl*;rH$tHoN-g4L!PrpUG0Q9t|cGK26j2@SR&(t$4y) z&KBJ&zUY9YW@7{@E{ZQO*4?XDXC>L?sH`)GtjA9#z?8+23r|nYtOmwBXPvm;ltU%_ zR^p?1o9-c~#P9m8SWgQ3EmS8@qtaSr8}-j0>yBda34^?j>j^+7hi;J7yTzZzYmuk= z=jyQS)d~)1hXcMl!WDX%-18un<`(S>J}{-$6u}+u>Rf44NQK?~){?but22@s{hM_tM3fd8DRVOp^LUxISg;S{5`8Rxo-8fP?M;H)46WBj ze_Rfz$*2n+Y})#CXJzDj`0E!Xvq9@aLe@Bky_>f_b)0+Dci)HldoMzA@|DeFqdrc7 zk2nuiECpq@lJ4&H7V~G04ooGDjRM}MJp@O`3UY`*qS*_Z7N$fbp{xb)aX6A$r1NlC zv5ETkIjze8naDi6o%?u@xp%Rly9Qzx5`bwXuj$X^9;Ua$Z*Fnq*DS5asvA?rL;JSX zFzP_w;XImnwBNLrZeaf#sxmv&m5bk6T(cn-n!g*qf=8A4IPeBLoE^b)hw@bHH}}Ui z%|uyZbZFc2os>H%A?f!MDjIhXj--dy)XcQ;C1ly)_vUp8-{Dy%cR{98qSw>&0>yLS zBi_9cXWGe7NS4F$$Sn0-ZoZcW{p9!C;zwzM-`q9ae|KHj>y$?*JR%XQ*~0+oPTnK8kOaVM9T(ms+c?00;tdg{LUK(eGsG1W4xbM0GONgSSt-~G4<2Z%^%J*BZC#KvA88Jzm*(d91oNKT%JkC)z&#}j z9Nah}cbOBCn!rpnA+lX{kE!eetnZz1RsmKDP*6Db9hbRJBjTuA( zlMMV+5p}=5{hFN0e|V9-l$+mtXINuz8V zcULNPofzKb3RW$SqNB+l&W!A?IL$%nx<78D_#m{k<9j%w6_>z){GKTHWEF?Wke!g- zVwKYS>69SnsT+rrZVeDl-7?x)@P$r?*9p0(kj8Uq_`K%4|MdcJ_^iBpFwZC^+Wbq^ zb#i587co;TxcITrt*-Fxw3nYJMPF(R^epcKW)^;gm2Ic)*7Zy$qBE}3KE>I&CzISeX z!Z`(sYQM3AB}a?BgH$%IRQu4Q3m z1t1q+>)jp`Acmb(XN`Y45mjfoIGC?mhDhdO5fKpqi(Y5MRZ#08i;+}rV4+NKy)7~_ zl6)Q>AYF+}TFA>bscC5yh8?e@WMtO%iov}sbxYr3G2J45+}ya6&q>ivIH*(^%y>tq za3GJjdE~;{4;_r(tS0su{cVEpQ;<{YvnrmIC_3vwa}#Dw4+Xf6kn_4VGa*jU_E8IZ zTf;ubZ)F!{nx?BP3L2(yjJ}w98Lu`#`-**M`vdbyYsF6(KR?Lu)@5>BW&MwRcqCcy ztR@&wBzIlF3*B{Vo5KIC6RR7-B3SfrV#KK{A!iV1wSa{w8s(w*fdv$_{V87=tp zK56hv{e8Gr(BV`%U-agzVqeabije1!5Ob?9(Km^u<@VCF|gnpRUeX+HDTE`KhV=g$$!hrqJT#y4D)c>TE7STwxi81GZ5QbOVJ1V zMSb|t*W~Ak0r(VD?ihfzLyoVVv_W197rXI=kQs5Z&+ZcQL|J2<*wJaN2F6s z4ias>5zzFzA<~flSYS%JO0oKpd>PQxJji76j^!DyQGdX|z!X?>vcwORdtO?W=(iA8 znT<$jC-3WW*{_NzWC-Aao6nGeb%gIJT;`cqTvL`V1&f>htgXe2F3rY6b?x7aze)$)~{kqbB8d zdAd?kuQ9BtvH8<(>k}Cbf-r~zx)V^D>#yqEZ^6&Kp%6U76ZY8}OJE*%zt19xduNO7 zoxu3|bugvPnsf7A9fke!F?n~?wNUu!Waa99L5Kot-^q@9P*6jen})At^W`R3yW)&2 z@_iQSvp;437tYu4q11pCVd;4|>on;Y1&fn%$s}X>JpLX5K0-zh!M{PP!D>#K)Jo#$ zj>5BANFbiWMagT`HPjKv4niVNTJ`z0k6OzP=C-{Tnu|~F%tfhvhxu+85>GHtW$qH@ z-Peyrp^c^(;*)DfjO>)&3>b!uwC{--Nivw>bDqSvXaYM8dcRRp$I(@>MHAyOBT`f6 zh{z36Q&RtP7&FlS&x@Q0buD;bs+?^_eREoJmnC<6&;d)IV`k zY$|Drtfajxhx7&k-ek@6JosyO*v>>(z)IMiI>WXYpob%&U&uH^$r#wA->ag_NAQ?j z&**~M%Z=gy6AGV-Ui5g;I)}&TX0pIFvJtL3^-CE-9A8d3td0U1eA*QVP2X#O(LQS( zto%eU5EcFX`!~%SZrFjMT|^8DYGyl5qKX;@0=V1xIi2)~zcA4L;YQMwDz?6z3LL69 zIqkw17Zu>2dO1xI0lCOtr5-Rh2L5=6nrjiJ5Et)|d+!o_Qn5})#YcNl0)`wp3d`A=amu$^(~ zoak@A63LMW!UP0#2%kUNSc@I~L}Tb5lQF#&p)D{s9$aDq(sxHxLZJk~z_9G}Fv7ub z;8f^WwP-!p=0)O)*C27zs`r`0{X~Vf0H`br?AszDL`1}c%gevJ)eNk|;^MwMwRR(Y ztJyT{K-2Z7x4h1spes)id@*jlxVR+w$9u*sD}GsPak%1{=F3*@YA_87p3u4;V<$N0nAnwxiO6rwiZ2~7Flvk%6De&rvzaX9g@monIX9f~za6mi zz)`zf;kA#SfNN#~)WZ@(gOb(v-H%0CSqg3eIOO1%+5H3&M}|aX23+8;qujlFvI}1Z zI}r=BrlpMzP@oevMbu)%Yngfd=#6l}6Zol6+)W^3&Omc7 z)t1GNi+t+FYO+Qzq6oFUWY-60P2h8p|TqS11;2>Igt_eU9mgi%IpYG{DsQ@8=Ehu z=C7YqD`@;^T=C6J+>Cg1lt?8flB=)8=Q-Iq>B!ZJ-2CiP6p-`OUQE#C(qy-dr{1Ou=nsq$qq$P+_@;LYc^p%& zT(p@}Z^VJ~NK?@+C!$Y{F**26^a2O!Rjji8{`UCf|2sY|wYU?#R8q zK@LWRvBZ0LAcXfyoi~o}NxUQ%}$$H(2Ukx+%=?^F{%I9%#PW(dUx%TB@l2jb%@ z&HTff-{%2-)61{uO=JN4B&XC6f(+jgWydm6#t$ehY6Wu~tr~TeKNZyct<5y-_^)4eyl2>~uFI^hF4T@_gOlhBC;u0< zx4+ep9;O*z!`r_*IhSUP6U$R;x8&}$;0s~#fU^*Bz~xC(Y);pBRS+L#|IZ)_3oC?_ zFCGF95VH!y2BF9o5UwMCx{_F@3}uVXk&YfywGNuICkv{LCtrG*$d+%bBk3+?{|m^5 z0mog#s+cHWhLU!PCJ0y{2nHSsjKZc|ZUTaUIZxo_+bqtWXs97PeB&Oa*C$4jst|iZ zO?amlAOem?DOR0L&YR*M#Th`=CPhcE2GL@N%Zepc;ysYvy0&|Ro)nvy}dDitMA!e_N(!ba0YXL%LPmfB3Z{zL&>u-=BH-^%G>$G?Ldz*vw zI#|a!Z3MowcC#d(zA5&LBhh^#&VO9Rs($%ux4PwHA_g@(n#FL$icHl4Kp&w+%5+Ir z`FVeo2io>O&6~3_s}88S@mM+;GRZVcUwHJZO>@+WKo;)ynE&2uqgdl&;Brr%#nVn% z*;QP!L2V!~;omkW_Vc^O3&9`>sjq(>Nl1=Vq_IFhTV=x1IASTS_b9$IHhJ;oA4UMw ze`?)X0Ik+mFtT*n9Cu5+ga&##Y8IgsNle~@2{EH-)h z3)Cj@6ig0CQ06F&qA|nnQ7F*iTph6VWVYnR4s8%(5d{YUH|e7nE4?y@(F1W3t-t=S zrTX%7m6=&~jY(ibjHG-j!CAhaLc_wS7oE+lXIyNRjl0URd=H$A9;P$@w6XHwpUuq5k^beq-)O2+C?bPph$Yo4F!Z9)p zIRNSCcqI!93j-sol&S-jw~r4N2}#Ti(3X+W0TS7UM%e$Y%Qz96hVtY)0cvA_Mur&P zRTI6i6YyNj;2`qU4EeWZBZ8lRhnj(9Ie211FLr1%>^pJzO}%?}-^qM}DTe%_OBEtc$9qO_c{N>r%B*FZ3U$wVH z|Bn8!(afwY;;&!VV}J6X1Mq}kh5ifZ?dgw+7F^XxL!U}DH8g(a0`G{*(-QJH^R2C6 z$0o;yt*&C?)Bd|hz$H{78}lw6R?NqTjImgEWGO8z24#ppLuqPyHm9r=pM&xN`rjX>{@)k>MFgNU05k}I)5#~RF|jf>?D>Ew{%3c@)FQ2#Z(ev|JcUrcB#i8~GekUL&CykUR?D+;%C?_Ji!y=?>H%Nop$mpdomuUA)S2S%5 z6razWDqOrc9;Tk;l!!tTE)%b*b#x=e^vZ~w*GW@oKS zZM=@{aBg$`D=&}ewju3gGu7^7!%3N%!w7e4EG4w$lT#dFR)2=rl=1|915334`fg1KSg}GK1ieR|3(^+NFZ(#Z0hN`WK6v1(63&0b` zz|1UlwZ+muG!(2ki42lcrikf@AfRSqLdlhJ@J6C;aDXT5*O zCnBe)n^QUMF#{CjfQ?DosKe~RXqt=9vl?rXtH9(b{kA_fvB&I4$|tM~D)#m3+q3iY zxE2qTT6_X3N=if%wO*<>E}XWvhk^R*AG}YX2CKzqJ)OZQpIa`YD12;Apa$wes9tXNF*+I zIz<|^`QetaAGiI#PLe7p@2HxVqksIs-q_qUI^SZMtF>X0=z^!_?{Q&GVRzt^ zkm#h0A5!v)E@Xg&F0qhQn4W_zECnJ{s?1CV)`F9Ty?7oTA3yzl)c9w^l=ZEY&upKa z5SqFZj&1Yh5f`iAJ8D#s@2v*l-*%HZfBuv}j+?f&aOPUfDL{rpy_YwKG;GGbomL(y z00%MP1BQ>FyelP`0iyxVW6q!zLv`Fi0+Avk0Xev{X*W>mP8bks zCjGHgfMsS0>ru)l4MR!$BQxS2LH1IgY;<;D7vbQ2SZb;csgTAHun!E)x^?9cWYr5e z?B{-DMKtFKX=rLv((z!uE!x%goYa#eO+;;2YD!N0-&FNXg!?*wLiVWfFNS@Tqvg9# zM(^Hon9O)9WN~1ihmv{8yXCO^agqC7U0d)wpiXkKbv=}LBy(}0WM@ReD{qG?jDjzu zy;wQYRCRSDmzIP!Hmt?J?%GPpL`iw}zSebnWVt#2OhHXaSuQKeW!)~u-121h@=R8s z+t}VToXo!jEWV;ftL*{W)fQO5zK*c!>USVRxwd4#gH6u%LC0TD9mW;V8zdI^Aoxml z0D~XY(4dR8c0E7832oqSL03C0yXk4E-f)xEEwz%KBIQygeow>rkcZ9Sg9{`d*?dIq zY}BocaNZx0L3>yJw&DwOr*iK{+V!qQzTY(x0~xu=Wm4AqX#s`o#14mq=!Gg0smAw0 zF2Fe}EiK(YGSah^uA7i}C~d7E#M!Idc{p?=4b-e~dK=8&AfMM+GVjD;b)^f8*n}h2 zj(kND`)lFroXu{e;Ve;#4?mfEhf}zyl7@)>hVOiv*o`_-?VoQ;54(foF%X3XT)bo1U0itfzL*YbP2B)G08mfs|&r-TnBG4}#6frX9T>FXR@sjWqZ5n|)T;O0h%dq?*&6?M|Yhy+(x?4F!9@ZCLQ zL=%2Xvu!2gUG^3P5;N<8`Jm@gh`)K37kXTrs&=J2$JSU@=yckUdHOQ6@+>?fvm*8{lhVchmR$>ea8OK3wpj!ZPq$D9fsNH}6=>ry^L1qZn8UdrC zf2EpSGXf3;pS3$D7=_*AY(uGU@)t@V_vX}WhLs}!>K+{*J2RqhtIxj7cAlELeq}K( zODQp^`l3 z3G-_>xYJ)o4D@@zP8&4?t3ltQptGfB32hsmmlW?zeR8k5pKZ8nt63Mvq&$QF@bj;c$F)r27%CExzxUMmLDYIglQ*ax=!$%d{Y(Kj{ z(_H8Nb|&Zr#Aj|6Sd_9xr0i_i(Y+eAqSwBy@;CRzbMIQx1g=DR35PAXl8x$`?lKv1 zMUweE1n879(LoH5HUvPTzFCcLTN@V@`c^$v;SN}+WBEDagWqo}nwq`=X88(!a};D0 zWJ8|M>~yB26TQ)W6p(tPfwyl}`aNJbG=LPT!hPVQcJl@!Fq*6vb;1olB}#9sXgc0SFqk#gsUjU)966!)5S|qJquAepu(dQMc4%7g5nS z-vS@zv>t?18NMK*X?E>iNSaJy9V}EK$j0zMZ%%2-wU-|MK2BLi?|8Voi8xwb<51&hzfrk~Q!U3uNybR&*gyXAupv}+O zp2G2%$fe{hiGMP?ay!L@g&7)Qjq_J%TU%II%V^7qWo2-didsxtXuqV}+wS5=&h5r7 zAWbHaSl)&Bjlbc|9iw2zQKY8`=I;Mjb6J<0q%z9>BZuaV$4(LVMZFB@tIM6r2SVG~R zgD$fyJ=u~jgz-P3hrgcN&ps+=xO#^JQX4QhwC%T3B%py`C(Vr)E>hSDhZ&d|WdIR! z$?X|gBjLDfu44V<;hc%XWlsahEHk*{2fl^$ngKEy7Ga@TL_c}wcU%BEGMPXP3R5Km zyY`*%f`)aHuj)G+6kZic!Dn`jMNeA>%Pb=6c`4S9TlnLclW!Q%B^kB*vuAD;_3d7G zj^AKArjVi+z^aA2#XHwz{Rn8rI5}50p4#~mB#YW}LxGdq@vj%){bae@vC_j$7Wd0G zR3J~xh{snk>#=e>LS~(4c+FT#I#GjIv48fX(N9v zKW9&W{WWW4^p0rswj~6OtW!lvcyxZ?2D==jR-}QrOTUeau}T?3kT7oO50tvJ3~w6Y zk7{L;hP%??@!08`u)@#QJb?MwDmV*_ZIlf|ig*NU65uU2rNNT)z_4l7oyil-%h7QT ze+_Jp`B5UxON{z=M<;vo>#s>G>A*^tq_#Fk!A^j-2DSv0#$O}90yT>Rl(v1wmq@+^1`-bLz9QXM z0yO&aS`5(JMEQl!J#rouGx6K;JS^|Xw{g-QrvlRSbixXG`ALZHwXv%=B;hMBaW5P<^1R#EMhpuyn{)PB@ zGuM_&r09b00QnNoi3QLW7MwGpBYj2S5D?DNJfdmUM)Q2iUMV?YZ9OS9y~=Fg$W|e3Fraoyzc?^ z*DC=aF+%!gTO_EL@0RBwDK)cEU@0zI%N%p_&q#Mqi#CuXIKppfxqIK zRz_6r56;^!Pg&vhCbJVRj9NB!9RcADdeN<+56y56O=N0CxHdNM2W;RCZXzIb*=*`d z?B1Qb@R4@niVBb0O@HC6jrnr0*Y=f@gl+IKSIzNBMIdH7ki7Bzwsl)<17TxXx((v2 z#pfVQ+jqpH9}u^1{lo4o`7nUZzr0TAB&hHf?}!OeWwey(I-Oy@s37n7HtZLB7}PzUpadn}=LeO;%&q(Nibwynmt8#lJC zHnwf6v2WPePGj3P-;@6{-ZAbT|9;5}jR_lgU7AJ4LkkVBQ&&wo zskLjvmdIcO%1(&NaSBbFU;V~HilL0cJ&9OMl0iaSzM+xd#7)Jat2B2bf(Iy0>HmDc z`z=zVNms+08SD603wYM5OT5GJpS6E&n|l|UFV?U4JcO#Jn{un(4Z1c2S<*5$J`wrI)dE zppzyc?x(gMDVoq$jnLOJW%x82IF=-wy5E*V zum2I%Yvr*w=80_tkL=jkpPC2En*O@$6MzVzVsxf8KKDD*rw%Ix_HM?eI4T-`P*Tb`M~Vp2IEz4|3f(;J&7 zf{czGRa$BeXn;h@IZlxJ`LV9L9i8u41$#2MS zzkQ;o8gBm&r>xOP;B_*XP%TJ)V-^Z)#A8>Hquv zy+%K?yeIAEfXUdNIc8OVpi8f`hxHNdH9;ok$fM=kK!Pq)Hu**6_EK5(b%4J7X5?&f zz4ILuotFc1{e(Ulj|>q~zW2tXj{v}^NCQ+!t>z>Op%@7=hwbv;0XbYSXo&yNFcD3^ z8zO^8gkL=czBGQf&o{v0F)_)Yrd^37>yXyd6966%o5LBa+aTPW==XObq+2Pnzj-6x zXSA58(2q~^|E$cNqR8Awt{SD=Amu5&{u&c_AG(ZixY&<3Q`8uaa_D&<%1?CNyG}d& z_Zw+%)4@gIc=rKH)4ltHYyUl>hnTez4XoDJNIp zJftWMiAXHi^_?vpcwp#fh;X{N_{=_yE=T6^DCP;l2l&^5$(}ThT)WKNiftTU1{p!k z;dxxa&4mX!B2xOK{;p>Zjn!8_uD)eWqQi}RZ$HU+QF(a=pk9{E-~pdyD_hqBP$h13 z-jTAhrJ#Rl-bV&(Y#dWli+{Z?J}|YChbJbEq;XPmG=7zb7h^(4b0UN!%qj?`M9zWj z?X4^-H>Fi-k3viI=)SOVa@Kl|ORHCFg-xCqU2dWTCnmDkZxT5W5{j(aHk(5LCO_=k zagB>h?;(fn>ht<@{InM%Kw&bVHZ;+R>AOdj-aYY5uj6{Z!gs%oXWMy&%Xhud#&uGz zZSNUqR`#7p^hrn&E$B;-7#tPdPY$PPwkZ50^i#m<9%9_^@OS(?(I#4_%Z&-TZLW2e zci&Xi$OXHIh-aYS$S5f_$f8i8qYp$&%M%k5m6eslZB|ZKwZ@a>-R_I`i>uyx;+ReZ zo>ES1U!}XMuhb0rIVef{tH2A0d^+=7jr zy{^a_7TC>8pg%Y(O<$&5vgm;yfcY1AcBVoAOE;+Y<-tM#p5u^M<}ykwrG6{H)c1Wy z?vYa0K{&H{TTTqegBg?2JrFY`dpPaJ^lE?B&)~gi10#zDDZgD`?-sM}(XutzBDJH* z*`q^19FA}}bc^(hxrL44plw`dL8c@biFoQ}YMnOIw`e>Iiz8VX8MEcNBT*9MktSPH znI&LSr`c^UbCDI{?aXbRgq}Vtz8f&1GH~)bF9VTpe}jY?et)-T*>o(`akxqe>zB2C z8nCRJc+{C%ZjIixzdghJhQQf5-Ho{@Nr$b!oVZ4+f(lik|P8M%&%3aOl2RE1U>4RVNHJklZHJH+r>KMxuLOtZ+| z95<_^jNDdTeM&6zpIKqsm6mc2WLpH}qbd8BEGh;{hU$dUvY#XJWF@FeM~BZEt~^5A z0!0*in_$br@T*=6X5J4?aqZ9hEKQaAqq#~dqLi?oZ*e-&uBWZto8I^b*v;*$uT^lz zAdtsU-RjPcRJ^FEDMnhFmTWd#BW;y;GrG^ggr)2(8ayLcK6Jz>F&)CLh!tx{Z+C3G za^3rTOb>=gE4gi3)oda)sOsc12G$nft5O|LmoI;kIi_bSkOz7==rb9xV|vLp6C6O>#*b{kFKvJGIf{A9Z8=wD z2jkf)yeG57f?HWVkE5^R(FiPtbBY4q4<@GBFX+=t{}GRTeUX^mwq8>on71(jdu$hg zgrhn}IqJ|=1bR=xBcPOY_$1lR-yuuvZ_qPyPtilxsryE0N80-HG}JVd)pVE8LpoQk zvokU%+X;YE`5kDxX@jSw@7{56`uOmbUgzF8x(8KKsU}I3R-X`1EG_3JB%g0icuBCl zG|2MsIFF2yjHM>Xn>OL*=yz|$*3vOKM?@n8JTGHqa5^I$O+hzW%&Cei{!=$jK{fju zRm2slB@cXETCz}b<3?OcC%BH<{=LyLsq2?Iwv3olR9P0i+dwyc1iaY`sX$Ile7rIZ zEp6za7sdmAbl_6W6)T7JE8MT|MBg2*3?R`kl-LZ2e7p47P7Svoo&cZ-1)i8I4+!s( z*sRgaMglP+8x0oV+RaJG5&f;p&8FK zJMK!;^fpGTVM6*oS?V?s<;M6fwuP}N=<+KXo+U}3$^v~pa>R2hU=YsP<-%!2{N5uc zR6-^^GLS~f{t%XIf5?YPZ>y=PLQda{UDx0Ch)(Kf9U@VWE;PS)Fic%{=42Bkef@=` z%*ygs6x{_c=g8>j=&BZ_Uw~K*1MTy#FJdh^=K@Y0NxZJHNl8JYXBb(GNO&ThSRr~H z_2u;h&&jq9htuYXcR9Yod<15O@BR5(z+au)CBTW67PcdS3Xj`<`{2kTFX&b6L#Eb0 zg}Uu&b)%)KA-<@E{dF@e#0}|~$^9s&trf=c*MO%@wGsPVzeQ<;N)t5%+kZ&1F2CT5 zEsWARrbDG1!vhjkDY4TSs@hGNEU+2QAFm*{#Ynw;qNJy--yi+#Zb}BtYW4#ZN~;+t zS^aVky@6BshW@|sP0Y(1Ql?UDlup6xrtTJYtIN(?OZP`&(9+tnu(mAjLC~GiVYMQY zAuc;d-+oM|o}GT8sZyJIr9JKX+Of%cS&}X}wRA8t>+fY8DHg9U-_a5FPaxkKM3Rc9 z8e%LY>WcMnI&d4vqg-8eJ6on6S%CqJ00y`y>RAe>$w@(CkG`?D(jP(Yt0X8KfQNn+ zW_$|L1DmffCz&(cyr&ZF2}w3+Y1G;{Xqq?8x~?=7@T?B{aC@-Fqv_jrAWQk9G3Zvj zKmFs(HMxFim5d3^veEo;Rh-s}XwS>* zlz=rGty@&9PXJz7tI_jod3k(}{*;<8Juh#GM%o%8mqSy7Vv`B0_UOoBrwuJH4Gk7k zO{&8VrPFl32D5DsT6{u)XaVxNc3XVX=*Cu+{%dAop|N-jcJE=W5j6puW?%g`h{4p! zohdWt{yYg@{oK!2&;1~lQT(ASdsfACA~rSJE> zsFOopIbQnc5-fSiXRX!Mj^@j?|VC(BgZ!ED$%n!=(W zJYL^pm`WPwht5EBPUHsRqLpCG;AjQ+O&YtI09a1dN9sS?jlBy6emM~z`W*^cfuSPCy%LHm6G$VC9xJ2F*B#2L(XjH`QCP=oVMV!;`lw@z4zIb zXZcoM$(DR|tw@BEiTYi&TrjHEM+P?_97<8EDO*W6@pEh3T5p{iJzmDa5oU+xSlCz< z<^SYGN8bYyMj729nE?Xii+KXj#XF4Jfl#d}S84MXs2`n3&&d;03Vfs-RkY4Sm4xAAZ4mF_9Ley&i%!$RUw1mnP2z}DoGYytf*`z*|_1jUh8^Yvyh z3iKB%toNcy5?k%UePe9FpWG~ajQ3A0^pJEVTt_J{b7b8kq&GS9y11T6@DozY8q4%! zD9LiePLSuu|F?ydH60W8>r2p60~_EJqhdMuygpuNXyR(7_c}W%JJ9zA)e;L4_t%== z$2B_jq-A<>&1<3Mo86Vjk@9uyxf06A;?mN@fNUy(QckWf>0)__e8%m(e1L7-$W@@& z!Z01<2OgQ0uo}9mn7EQL*RLAaHhx{(^Cp{mhhEAGop*#uz9%%fsJlpP&gi&;K_t8Y zb)R}Ju8~n+q75*j2>Z=#BbiHELPzQpu=yRg z@eq@EG(rF3)lN)khL@Fg1{N1^7D64nl}P8-M@AL+hw5YAzpT{^W%+Oy__~u$%(Zu5 z%CbD_enSu&$dlwUh8b^y@l^BA?sFWeu^yYqS^MCW%_y}s#3y2`n8h_1x~<1%;a55@ zKc4+(t#d`AF+n(dNL>%Q963pI8Tgvt`;6RL#oE#m3U%>>#BDPpBnp!DYKs<(ZAkfk zURmS~_=oeBJyuA>yMliD?JLnYC%O90%eJMn2lKu@Hk;kX3zsTt6Ed*@abacSU4CCY zU(O$%#PPGBg$J*?2(8A3WMZRlnq7NFfX##xb5_nyXtXbIma+H|9a(D_C%*qIYHoZTk?^(Nm-Qm)83?(IiTXSq!7Ef$-`i{VeSYFEZP%6>B& z4KO>7nTto_1bUke?SXkKz;f+ zvoRL;;*p=)A}ya)L7D9Dp7V?*VL?%6Rs%BBlD<-y#JJBuBIW9W-0K&YoV$SsGVVj; zrwqEhb{bf7fkm3QzWJaF|^wEud z;3z%wWxPDXkU<6H=Y1VSUt{`AmEV3vH(|U#MqJ$FU}h89jig|Co<(taQ$uvnXnlb? z5|D`bdY>K0hMJ?oUFfuI6V_}^d8U+*Tq;Cn`}0C1Gv{s1YYDXJn9TQRRFx?h4~T(g zurmH22O@kANB$H<{q@mk!qC^m6nHllf z*81w=rg1Y^J6(9gg^x;DS#9%m2nbFq@)G#PV<7?VL_r*`-jBYA-xlf#H0&I>J=ZK+ zb1Ty3J6pp954-JIk`X^+A|{ArafF@ew^j7H`hF^{e_YV0(|Kj+uV1P7Q&a0Mtwum% zMDQxxpB{h%r_DbhTR~7~{G;uh#M%u-#O{%{^NW$>RXLor(+^{=riojd<2Ef*cdtk{w-fkSCoVbpI9qObeCMAtPDwH6iZ)q# z1QZtXIR4KORG0&Os4F42;;*9pCl1?pTo!EPJ;8zau%stE2(W0L8vqbnU;$|k8850K z=PbtGlJPR8b(6|%rPnj=vr_`Z6b=Q!E3$F9s7M0d=xHNyR_i`V2RDNMnoPcgn?rxT zf5-mm`-mXHJ3iw3Ma)p9FEhw&Ep%be*gm*~mU|`6z{@Gpx+_8TVvBILas;gi1k*2P zxx)U_)9s6q%(wNj6r~@|-!cfg(!|W7cNSvWMIDZ)n5Pty`#~hAmoH0d7~m3<@n2Tz z{PQKf`V+w)-)O>VP>+S~UApwelF8y#GIj2vey<5+uoN6fd4mrl1jj5lr*XM=a4!~U;kZB_q4_)@1J}OIX&jl}`%9H`NlHFi+-feEZJ9lw{TFJ8Hr_bMHV}`rsxmLBTUf-+nE{%zltC$8@>OETY?&g>FLa zYuAE|h!393nO17fv8p}Dc8Q=FDX!{p;(Z8q(kY^vrTbFZ$0_ia?Vo6G$7X+ zV~5W};MPt4x%zgPfqEhws3%NEgYWq6CQHHwe$u77@f3(hVz^ap4uxN*BJKUxJsgM; zmcv=0v*CgZyr;dKZ;G^QU5dR9B^oDmzcbvZd}6U; zLX8g$ZEKNO>`w>P-oMm$>-0QvbQ9k%Zi|mC@+H zj@I6iT1MgY!6o>UX~b0S8;%#Ux7raGN}`ZDd0SgW*8P!NIk~Ce)+l&ZZh4uvGPf<= znXy})VSH{aDhgBkle}rqH8e6o$yxF%b5*!qZv)0hH@yn=TZls&-I)0#T|a($&%mTG z-!-7$dYi1Uq=ik6Q7?(WQzMHjRR`m82*n>gS#6-@8Uyhpg#Kjr9|M8b+5Rs$UZeE}Fh9g`PbAh@331b*tldi%K zU0YhMej0FFtUF>=r}GQB*zjcq90}0c8^gNKXt3Xq*0M(6paJXI1vUc*H!G?p%IB+3 zj)o8+j)a#u(5mbGQ1{dz?jl{KFFXAAzi<9kJB|#@YsKaK@(v^KIWjK9QN@yzbnz%m zTx$W7Wi^e&ts24i4N?chy!?ER87qKw_JRpFX6>GJ7hKB!jFeT;KoMcdl5;l4X0HA> zGh2^{CA~noP+BaHF9U3I_J!pK|^XBN@n*NRD6Fd_fTe0xp8HN5nYJF^9p($kVyJfrS)zzW$y^G7K zofyX*`VGU?#j8w*<^LwQ&fow#rVpRt5OfGD7Sz~|XcW4N;vXTP2&6Nd2(tGR; z{wjZO1;ce5R_N9?#%7*vNO1JI*|=Oz#^g zx2!pzb7znu+SeOcHJ2aS85TA+rhxNv;KDODJ4ndj{FRycA0L6;M$Uz7LbQGA+$~Z3 z`rJ+ztQn%=aLL_bYtZf`F*ly11&v;5ivX{^6VS*wMQR#nT*477o?_6`kILIv31p*#~Z+4md?PN5y7Y6!G9v7 z>54RdkMn#`_tYQWc5Q1VJcM_%wB$L+bVL4JtyMSOUVpSe+xX`lA9?^iqRC|U1$Lj_ z;8qejgn^661|K;--utbbCg8h$U2eb8s`o!Fw#J4ymNRK(w5->{b$SPH`Lq^8BfKry zJA8+FnMAifcvqLh)Q~6quR@r}jX;XDdOYrU4RpVYFmphtsllv;*aM~E7l+Y-aEaJP zEQH=32k6?vwuF9U1!MU2+3?N{sJPzlxug129v=)a?NN?e%YNR~+Z}BS%L=3O3J+kT z9c8k-p#kOMq8G8jQbTh{P@@hJS2q)U0HM#@=xHexrO9&=L;!UpR;pZsE!2AE_S?H| z@rIE2-`_Gx4nBDU?p|X=wu`EbeWAD^l)0p>K_)Ba#Xh1CPqxx5e4=a-(LQsm3IqZf zUoh9YeFR?+I=`dbOm@8%p81I>4GmKhQI>#Fe5ab5sLDz@T~?Fwd8_KEIHaeS1De@u zx9Vf;d31q2NiOPX`^DC6qc-2oIZzV+NIVA5_b|E;faEBgFpaO@?7YV=2=JOWd~~Zs zkJzdeh*3Bs<#?N<6e~4T3(+{iwiGorKWn6ik|1{xBU~+PA!Z!UP?aPpHQmBz9nIvd znp`)ENLC<3CM)s@T#{8Brst9NlVrI}lPBtRg4NRD%CJuHuC1ztgqM@mfe5L});8nw z;25w+k|L@KDjS1b%e6>L|xSp_?S)R@}r6M6#+;1 z*)Ys$wr*)1ueX8wr$65JWU^p0ucuO;28|}yUvpPxd5!;^9x4}r{_BycY1Ef~_sf?A zEM=Z};v!OJxq#MI-MQ29p9@ve!unLzMHUV;w9P77AbhEKXvo?7P_ap#D)rmXQ_e;? zZ1KBSAeoeXXr}qZ{q<>>?>WWM*K^dfhWtmm%a3&S9~q5RAKJ;|jT;OD2O2RlI-nvk zYV2%rGL-(at5D_YPs|=Q&OGxz8d~a0wRz+^!#CqFvX}s}81R*1RxKUj+(91QX_J3n z-giZHoj*72Lrwm}`nc`_oGb6?9b1N%BU4cQ1n3vAzrUPMS6Y>qlsSerjrCtQ%-@-XoSi*NLL#Gi4F`7>ERFb(6@cI3o7aIFcNq%z=jD$< z7J-c4a=Sg|WqCzV?x4x}7YJiDPn>noDS8w4w`c@z^8R|bis@zMWyz_ULcKnX&}T>Z z{eFPwRqAaNERTu?1Pa>S$6)!5-O${utfJBnY}2`Ubw5KNLqI-OQbvX}$LHR#1f4&p zY<52%Z-*?G1L<3keXFXDe1f71dR2qSq;OSnVNHEr9OXxAz@IMW*pK!fKsuKRz~t0r z2s*Z33q}1wm>-=9l8dKkdxHYtUhTfPMP}|6=GG*n&5E*)pGL){w;^7&rIZgbj~5Y( z|GT4l$%W4HUv7rF2A-!TYmE)yee^EfQELxd5o(#j4L2Le3-wH$FOtV~G zK!3^uhE+_NJVxL;-EI`9HuMHY_AcyC6zmGBY%!hW(?+#!CXsB<-x4)tQ5laQ{84`a z{q&9t1EX;0b$ru-6O@lroV+SNO?Hf+Q&O*pXzVNU}KhEZGTuu)fHrbu$cBmB;Ns+GRk`OnU?MH>e==6k>ey8k5fX0n>WI>zEb1@Zlm?1Opj-+p79PsV!as{2p?SC z2&a`s{ed{8z-o6(VQ{DosPXR&&D|;b#R0BPetW4AP-;+q@dWuQle`3UY*xe<*yOUg`X$gUZurwclT;i%Qe&U2NG*wybu45+FlnetHLJ zv#DvUU?CeDV7@_ZaJ>F+o#DwnekQjc13^q6vZe4{3I4r9R$3a=x{y++gq-)%xsfe( z%s(5W`&GJQTpR}v@5gvisx%-)_KhgUW@~ni&8CrN!jscM_?jX@Jbux$nnhPt&(Qi$ z%WUoF{@04g;#pBIFgr&NPmMu7zn(lawhk-X+rvf|dNNcuhaKU&X$|0r20euqvZ-uQ zxLt0zyfjVqpV9h0B1f_QPxw;F*q-&)zOVA+S9X{2T@#=jQ&e!%R zz+&nHzm%5h1!Y`j9KwGuo;7*KSU$Dysv*)TYg>34;u0{RO(3k*6 zgwbceO6cor{?0N*lZ}eT#!w_ki|)-G_q|)X-B+@5z*}P^3=hoJ*Y^{MBze)jmyrPEc^$b$06`ZbZqnhxbe^ZE z9ZQ~xiD+qYMzerP#Du~ClI%UGCXw)aDtKWrMBvLYvuOO^6IBO@4r2a<2-p`b;^fM3X_Gh>8ioqepfGww+*m*@51LgM0eZU6cX2a~H z>3rs_g{7sza7MMm3%=m)@n|(lmV5lf*B-C^M}P|P+L#{_V+2LPN zT0>Lg);)PbHYrQ>|H#x@tQf0j7<7$edoEPz8;HU4AI4P1kZ&!z415HfN^4|joMDIR z3nuA9sq&0m9b5@24yinS`F$dWaB?SW;8P7uaT{lvoYtGd@WP|tdV12AkG!sbMe!%4 zeFXgBBiNj)Z}Cbcjmv@um2&bgA(zMgad9$-z`HRx=lYM4s0BJ+ihMpi>6Yq+1^oBb zmFcQ_Bd@^lGeerDpru-V|Ai7J+n=%Igyh#jSX&sois)v3PpW#43mJ)#Ig}K9pVaO7 zX*BJ)qzpz{YRq21^0Jo_u}l~luRw`EJOJ{CCL0vP|xL*V*ouT4S*7c(#6jewKjhl8;GAyO}iF zf4!-($&fo)H~JT^;eOVL`8ey-_46>aRyLI@%7S%27DO25myfjIoLr?j?p8%O(Gpf> zUHXou@UBFMUQA`~fLg5~q~>WFyR72wccrgekEM88P`W5HO++|rR>J&oYHj;8VOILy zccZ$}6p3q#Gf-;1en$ zbD^!cg9C+$r=de$e)cl`MqTJwXtK$EzOj=e5P*_8>U4JC^>Wp1lndj!<_~%jSfRn` ziIlLXC@E-Z*Y)=nkt>`WNC00f4jY}X%}2J@y`bppk{qewo@4Y&#LRL3HQMQM!YsHj zzYpnqUn%qGepXjyBcBpM+vVd`9YYSFr33P&i;KhFXT|!8`YQb+oT#?vlYCc5THGF4 z7`JI~*gV(2@+^Fs?8w8^tOPe#nxl6|Zr1tB^L3Qb8d8UQXuqWjdQgi5Yt&y}d-E*2 z(2Tlix09YyDZFae@<(DcQ{f~ct%HaA$mS#s6lq{?yN@R6>7-?7Hdt3b@n+hb(i$LQ16$&F9Uhd31U5M!r6ZX1bd0rh* zAS9L{Yg3C~3v+Kxowg8LsHhT43=1r4CEgT=fpE}YSPcHH2Ya#z>s+7FguMrmVajZfgOv^G6~55HbBPO_SgRP+k?n#zCC@4WWx^xnJcBQcz3c;oz& z+&=R0{yYfKR((>lX-pP8MuQ67dyY9sJNmQm>Xkk@M=BKd`(MTAKAiE-{R=eG{~bxU z)O0;VBfwq@haE25yWFCk{|eI`)do zJS2ey4l~OCx$`qj6Zwb&gK$=on=V7{_$-g#S#9#OY|m@uX`g?`_xFnsTaRMk6E89b z8`jkqheb9NqON=G>sPn;gJ1_PlC8(|;TO2qba%*(wD5MRmPF zf?b89mcHI-pdfVqnv-^T(Z=j9K1qBZNcM~Oq`eQ1-zt-!$5fqx{X4?T-s&tFD;1H2 zrpQch-}=XY9r5k>Fspim^^@(fOJ;hZCR*P2TbAmK9!Xt-H&|U=2WF8tykTLeC9D?5 z)DQt>KFC<;ikk_Fapl416w4kM83TjN?mg(XeNPN}Ro?YCJy-t*5Gj z<`ik`ur1;}e?mWZyo%CtdRUWNC;~EGY;dtFPY*N8OuT%m$L0>Aph16~iS=4*kfH>X zZF7cFfw&S|Zmi8p)76RoI~*_`Fg|KFw&*aH;m0G;^}!W>tkXRT~N<4eVjmhETgL?$SB_s{JgPdevL# z7ZJ+X_&D1C3z+MuVFO|R%*mkIArjv5g`&asmE;c_%<8!8bJJW?GQ7qlshn|PqySwC z2!5SKx7PZHJC98b!4K-am1d(A4nQc_`)JkaX$#SBXeiEWkV4?~vX}2}PKD0n242ti z%EQ}Nus;Bj+2)yAHk;=zHQP;2w*$-gEz=DUyvNH1n`rp*vPOxs;6*=z*!uk%@-GYX zPh>j&b$aa=2gSW10!CN9rb*FKFy@Yj$;rg68_kz(#zS)};@C{bxrz5XKZgD6mFkoG z$Q+gfxbw%I4F|927${-&bubKu);QoI7&1Idv$MA9`r}HCr=v5@?Yk#HeghK7J`5g* z8~~}hA}iHdk7Gi{>$Q`v0r1JOy=2^X@$1_Hm2mcCUIx`Y? z`R0x9_TWWoatL@CLJBtYi4i zL$uYp-Z0YGGaak4Ht#E&Pj3PyRi)v;S;WwYzMGe$z~; z*U$f&S#bSUw*r4oO6a!H@@n^b6ZHf@jJ3cdijMsn{?B|=XeEYpA|YTT@POBuHpMV? zZmtpO(hHj6B~a#t*nr@mPNHs(6jA7RuEfoEOX*w%^1ue0R2CB+{5&fBJW=o5(Xwqv zZhKHB*PPF!R!~sT>wRwebf=aa@}8^ffe)HGB?+?k85!5CpRfA)|@8l_me4V?gU=}YJ&Y8MalH|q~tedw&( zyr^-$2ma~0`FK7}O+XK-RWW0AJ+`judiy9{?o3OP(c7!!)Zc%9@$IicHu_AKRf@+c z*w2OroHL50jC|q0o{AcOgt~s8 z$?-OCA>GE(vbd;G4zAdDqP0=x3W8PX?Fh;@SQ8`3r4sF+`0Or?k{?k++V$u3j-2ov zBw%?_b+pW3Y_3-*w-td{bHVff*0u^62t+s$$45s6?NJCj94V7c@M|3nYs~|BJ6)Kq zHs0J8IK-4%jwYbEZt}$_=dkFg81~|~l^HqxEnFpqq`aL)hc-Rswfd~kEjy)z?Ud2^IE}77w1F3*J`p7Vf z^7A9Z!&$%pIf_mj9h`1d;9T7iAnPMfijxt5oP<);Ji_9K zXubopV`PMtNdXT0$B;u$LnaC-}@d`>qP4ZgV8_j>dQ7S-)Mpu7DJ%4mQU{n zO6v!ZskNO|QC?Lr(7uCnax&e(B_g4)naKJPGM!+?Y`ptOkivn_c_5Qmt>2q*QMDic zr6yL zb5~v|srxJ@4@&1=QR$ z58wBvNx$oRZM*A%lj<$kHf%+<*s@tuCZqX^w;y{WO*WV&QxIU@HJ;RUe&1v6|G_0x z^5SAE$38ug44&~Hp}MKF4Tj=!)U5dTou zli>g##aQZKv!5s93TL(1UA%_JRe#sbN}FHLp+f>Tk2M*tz+3A6fcUYc8;Yc~;bRMR zrq8ojWH#GQ&FEivJocm(jDxa+_kI)1?C~AONt5ZXF{oHh9MUzp3JnQbp!lBe@NS(f zDZmslf!DDXFww_BJoFXF?GV-Yez46gOeyO3J}ayb0;73pNh{r6K1;y%p@vuZV2uigk z{Ao@l507@Pb4{_kP6=7d7BGUtUp;&zOIq3EHszj$$6h3x6yq&tXYj>n<2{X~Yt<0;43ZWCGnxq@tIBaPSGnwdff%2>jrBjInWkvOQcJ!ARo27z|*CUA}C zG(hUodS!Hkg5xvR(Z$kYp zreNx&hR1dg{hnYo^j(Q3yL@=u*53ti1-%eK_8gW(XDtmO>KfwKCoB_fR5{f;yxH&> z&2{^|lbW{$f}z85pG|Yn@*F=hj{%nV4+^%HPbb(Cch=S6k_XpA9Fq8KBtwMO--Gjo zWT)8%ra*GpDOl^3;(~&J`T6;(oTjEGpZAZ5t_O10gDgn|cNoYwO5=5y(WbBgw*1;a zEJbwel+mT5i>J9!}l+hrx$+XaXlW_RW2rRCCqEDE^oxt_M*d00}kd2t!(sL7@o_C?bIRz=1MXww~O zbs8{FHiRu-x2ACCxgh*Q(2F9vKKEqTmz+|hyckNK&y!oQoYeanpRX{uV& z{#e$w%L&dZ`QLSkmmb;vL^rqjJ+qTV45zwbB4d$pO~MIbnyl^bm_|ZxVL7YJo2m|7 zS?f>FB9UU>5@4gvS!Z)1P9{Y{PTnC?Xl86od~wwzfH51|&jxf{yiHWDHFYz=#m!X` z!k*mU-xI(b`GlQ|;B!hz`Pdn*&m-rNW+EL>dMZoyHZYMe_rwMMY3t3~K93Z0<9T4{ z*mvduZ3W}DYz2#opVif|oP!PsKGVc`zgK}A?^^-@-?)vW3zrFIGT1b5xVaUvEFX1% zV)fF+=w+gxw^{2?+zOJUv>-+4H6$*?k{z)DH; zMT86pl5RdQ`>lh(9=!#;1@u#>ph6{jq4-k(sBaK}{6HBCE1C5e*9Be#{lt1z_^g?> zjF>(zDHTr-tQD^p5@Trsaa|p3DV%y`+l*aacp9$M(XX|oodqf}dUlmUwE9xwOcTu) z1mZ`bX!Aa;aR+)Yj60@T{nYgb;qoXza1^}nDFA_f@9#r$c;6!fGbM3xv*a@Y-J*Eo zw$1nNBojex&r)?*4HdQ+Cr0EIh<2xGJ`MC|RfVwv)i0&3jf67e)hCdxwo^ir($z_c ziI)e0AE1*5Kv?f)H$kD!bQ~wSt0Mq?M!V3&m}HnGy*MnRCPz`b1H9kO+@U1TJQK0` z)ObF(mQuIvFnK&UoypMV0;K8+dI+b5N)`0`0t{tsxq_smrHd;&&~+E62^QBXS1&HI zQ`MF516Q;!$%{^%DsM`7?e>@YA6!;CfzERszn2euwu|V^L#De(8DNIU?1-0fTV25L zK2nO$@BHX>=gKkL@0nXT*gstW+HAlevkVkcyT~3kZ#!tYEZtI^iM&$}I)r+X%}gHN zue0HMT=W~l=ZXyCe1$7nq2>9+EnXjuupj|a2$0PGvU%k`JTgMcOPK?7#H`vXq;MfV zu2QN|v#-cQlZ@5{VqF*kch#M0NH#Y&yZLl7#;s{c$;pvp!J)uGO3BNgKY#eW-zRot-8g3gmMx(~I&BnIvG`6wxG`78k#t;X50ZS%eJo$s9d_Tx>FC#-`N9s-mdgIeIXR8%v-h9p z?Y(7mlY(#D-uq<4#HMINL~vw3go#eb5I!qml-JoE+f{V&92KisH)z{7OsJR5X=^md ztKMPsB=Xl{!z~@}oV-472L{G|`Ya;ZbKO$uyt~tWy>jlncK;}F@4SBBl-<}ixbir3 zt?LF17;p0rB1Gc!lv|${w0mF~&_DTyRvTXJn>su;JSO6^)wzkW)BdI_GL~T#x-4lX z_cFEOXGuaz)ecdu5GjQvd%WhZ@W97xN21j)`j$QVYt{!_MU0ztP@MU+)nPzkd=Mo+ zzr5Z5Uf}JEo+Kn|RVR#yWJ)vkhi~b?YFnMx_L3`_alUM~*6wR-%3Pou`Xg3yke)oW zf4zPEC|XiiXJtY-K2DLACI?U~%8tvWRG5!N@5%Sy)G*d9tDls1LM= z9_F&M{aeNEpMNfEZ(r-ZsAAT;&HLD)Q>yywbu8M^hXJN)A*$EP?ml(SW@{R}S7+OM z)Oe~&L*Vshurtvj%eJB~D!T=1j3%L2YmF}Brx{X`6WmAaD4W8OQf8O&U&~VeK*Joy zX;oq25tD0!eA);e8^^MeH$Lh<6J%ytv5fno!2+wdO~X_7a=FZN%Mz$>Y z-Zl**;#l)Cxm)XwRujSFu#pt{Y2J9M$ zfcL%=joyypO---%`~AbqNojRFN+mIkWLTeBz@8P^S9XxudWyQv(n)UfynOQ60}GB* z6hZ3C4GbP2D*YkVz6tw6&_RHl{@Yhd)`~BuLA;vx+Z+P#=BOee28bAKRMsz2kgUVZUCkavyV67Bx0PtJH-J6c(zZuBL8q=!|vTc?X7sG=1GS>90eX z-`^u3N*)C%dqe<&sp!mE49PIbqY#TRv>k;fOmliw3(n^q_fCL)ad@~e(g*FTb-sBK z8-Um&;a|C7H4t*0}k%1R=xs*EloV=OFl|JxxGGBf)0U)TNQPH9ssb%nd3yZfsr z@4wbCfXq@c+dRtgzduBzCUt`~ord^lzZYG))(02t`DKm*wO;P_B7pv&t+%}Bz{Lvh z`pb?N*gs3i9)X;mH@W^qx1E49B*M+9dFvA*dq}m`_+o|m3CDNs%;@TBCOS-bfN(Z> zCQRP`M;_~+x$oF0s4`w_U!eQR;qvZ?({QbpY8(-DK$^iNm1$CSdq72i&fi~b+yf|w z7R}`V9IYkgba@W%6G)@XkIpVVsObd8qF4I^ zk#Hv-hV?sNZVYm#@d8wr@2?WMPSnYWiv)dFwY9>{4e6XRYkFCL8-8}g6IrQ^b~An8 zbqI-3HYy{PnMv_{h=>;mMq(mih&(t*VHI#QHO1(i5wEshK;ok(wy;Z1uwVBs$s{6- z=gauH{uX>OgnbEd95A%=H8|g#g^c~W`DYMeTLDgbf1oUbL>Xu9zk|T;C!!=Xn8g}P z#5Rs9v%vv&w%K_m5??mBFltCK@!FFacaP0DUhK5QkwBbl>}1~bKDM|bF<=5O+0upu zj`YSja#a%~Q=)2&z+%h>ZGympX2WKTV0Ebvg9FFW*ujY#0EdqvtU3D$pf=^n^a#Dv z7{laE0vIorI-;sS?@z+s*Ql(LqbbsSJ7MG-dWzz8YynS_IPu_r1Uh^AYnPW%L#Fz- zZ#VL~NZ-Fcrk0pnn^6z+O;cJ(%FA+a>R7)(>Xaj}P~rU1aHv%2e*DiXBAuo#f+9VH z6-QXcVr}5S5*~Ebg7E!!PgY0UW=cB~1Sv^ablA4!qtU?b#Fjf_XUv2l24X`tKvy<} z8)?zsaO#Z5urwGgXT8)2g5u?<=s$Ie&x(`s6328V^bCF=mcln5Ygx4et!V$~ZdK!Z zSt}!oV_~r8Krb|q-3#tqMbFsafdR+(Sy5Wb!fl}8O2`UfokZj#4B z{wkiw-I1OnOD&R<92ViQ7U~Rd9#H_kYx0~CH)X-eW3BUgb-#b^K6G*3P!xj^Li!b$ zhAjBvkbGA#Z83G|a&Y^EwAE2J$)n?T;td2Gd6w0CK}RA)-2>LY`YOQ!ZrChpgDH-F zqG%{7ZeWY+DU0hr#R(`zicCX)M9WT=yo<+o3r0?Imrn*x`8&>OZ@s5m(iOeO5FFIv z(>T6pagv9O5wQM7{LZ;?30YV}t44G6bE2Ozj`=xUM=>-%{7W~t5A+lDQd@^w;Q7iG zgi~q;kR1PGt!+N4EenhK?lkgBh4FPDIvuF{Cw!)2SRM?%EqhpikGbkw?T;MG>I=ld zVs?Du>wy-7?}b-lK)J!s^4O8$)1SnFxBj)ETjO$Qtnc|KCM*KOWG2nf;`u0>E)WnK z+qoNc@5NuluC{L1WYPpKDJwf}bXF{zqx^P7iT<1k2kOv|(FK9{Ym=-H^{bvE8bz5@3vE?|GPwm3AYqZ|Nu2bgB`L0uoLyImO2ZtM2z>Gz! z?8m|Zf<=An-)ECR@4-nI3s-11ZT_RYQJsakym=ReROSZtkU4MT^rm@|D(=X~4LcwD znR121om1JG7T?7c0V_KEjytCk$RN54|NjP8Pj9npe|t2AI%$wX2n&1VpGuLTp#@Xa z+Ja+F1*)i4DeW@82yq%VX)iXI>6O7UuDp^eF$YK~Oqx!VM|eEs2%=zM`26#w!e9Xe zeZGnrZs-;$*RSjs44D<(S$Ve$w6FdBlQVN@_j-K!^oiWWxsZv2Qt_#}*@E%=eAV9e zLe}Qt`pVynNah{cuF%Uz=P(6nbS%~XUClTpC4gT%>cg5>?Ko^#{*EM#ejGhyfeXJ+ zWaQ+)3_#RMyN{C-#UJI{ESLG5oSeX5xAWQO!oouN{^!ech5Ct0#M#JHNzAFNygoc0`SZD=VTc`KTM@U{ zA@%5j=aeeI%Z{gE5DR6)&3)2GwIP7&xLYywAsce{5lS?J8T!lX)comXwyIObKV?Z~05F|W^L{D@3{ zaB+J&r!c)5i|_7)zn}xHsSn14Hb5W(0E~pep;KO7kaiVSR{l1VNv?LeXwM9h907;#l zFG5%rYD@VU5Z_BV_vm(dRcfqM+)cp^9YJ9x+m+k)Nc^7KgoUr+X>VQI5N*Lg* z$moRGpn(Jmm@P(*hR@}sbWN)s{&XbSL>q<={l{K$zV zKHU>dSfwE`Q{K`3rfq8&oUyt&aOS`a+EN{eLY8%Aq*>_&V%g)-YVzap`56hZCl~k3 z9t&t$EZ;QpP%&5Te=ZU%$iI3FH$iSb#RlZO9ss-=0ZhjLuow?#;Gp*VGhToMdcZV> zoY5W^@Z$M}h*-hAGLmHR^O2_#I0v&R)*3JQuRJ#MCZcV-fjw*H>`idbzi;setJbfY z>hgV_em4)NJczE0v*U|-#}3{3CibS8l8j&_q?z_$&o*#*)h)>a;xiC1;(zAceE--i zoMi%(&FupAqZ=_X53|!-B(RWwbGAB87VCeXLeVY(`JcH8dP%PYkm>Yyba_Ss%6J&z z(KF5LR%T@=g1GQ&8q>w!EM~v{SfH5-DL|m4=8noX@Z*h&x-EYvhi*wxFD=E^i0LvPG{UZ!CH9&Pcc2{KO3?Dlp`(?~q>qwFlo z;#pi(E5z=cP5j^el!e3^#SWZme_+Ef2Y5cSWW$8ac#hlxk|N(Z?EW6QeEMbcCTO$V zGmD3Vib`3PYiPv*$lQU)ZJ0Rc;kV%@;M)lltfMYIHn^eTQ;BL%=#4CkxVdA$f0?AD z?BPudd4kk*agqhw2#CH%0Z_&f0<-k5Zr^TJw^c7^{+E_Tt6zV3rw?7mvV4i_ej333UE^;9dcfbx)B$$m z{p?-9$f>A8$w$@E@$pF!+yo-zS~3DRQ&r~(?I=f1+080a7oawhCBM|c$qTv4u@l4; zt^R~z>z%S&?OFM~z8yAYRgW)>NEhYW^WYB}jXBn+cD_b_X}04Ab5s&@nSMINNi{V$ zb?R+sVq)9uyC(_~#zfh&GRw}6U#rMfp%AOm$Xh78^zhZBLpnji(yxli-(ic7pJ~2( z;=OomKUr$X^!Hceb30D=XxDeTVl>?vlNrKhg-dPs8`1b5|K>0uDfeC8YT3cA?NuJo zpgUfuFuOfc>tXuxsg`o@s%x_A(?Anw&vp4iQ|{FXw{2y=hm^nLN(husrJANvx$oBE z&<0+xyOzXQK0YRW=F znxJFXk$iOY_3M1amLTI>7G=aetJMh^#YB6eqo*?yw#fg#WgApMLC;I=wlHO!Z<2a* zs4pNvIBL=%Le8{lQr6H=E?2x-?FtG;KOWD=nIIvkPo|NneS`L0|C9{xNRM9N!^WzHyaY}a>CF6190t;f=^?4irTK3}M!K(0}m2#9#DoN?H< zOlw7r?w-UK@sn`{J_R>!FP2kG|A6xSO$e`k)f>;a)M7~=)YgQG&ze%dNt()jE&O)= zPC!m!enEXt44l^n*>OzamoZD)hQeNR=SGS!UTINLjBAFDaL;7@pkAY&$9uOnns?;y z4>R^*q0uHik)E6(SsD<{Y$pi!>ch8=9xG?rig_u&E+s@ z==k{Hyr#@_H-EX`;rT4y3WNZoh>EzwzTAT2wAgjvC8VCQ$DRkDJZF9bys=(p*Td`8#TqM7NVQv#c1@xX?_R|pED zCLIM&zK*s3gez?*M-VG{T$}`P$4mH6IoeK}udxauA$^lMvwcG^raq5#-AIcITz&x* z)QZSSZoTAW3LS;qo!H)1_U}#Vcxsk2n*pJ4v5I*nBV_?}id~3mzjcQB3cZPQ`|KEL z>y2{*TZ~-YsitbK6;*aE9E@`Gfdh#fReYoF$MHhKCg&Ns1yufRjxC0k?8`7x#nMC| z^G6e&1HJMWIdu=O+xzBYQ+B^&JGuhgxjq_5I zALH}gDZm~|bnQLW@;$5?GeFcIe0t`R_NdeY9Z0M(w3%{=&@kvPZ9-HGzdOrQPn+YL- zs^j5Yc-y#zy&p%b)t{WlhBo`T5FJW$NtG~(p_@%+@;OYVX)521Wp+j)-{ zWnw*l{8d=2yBoM@?;D@T%#OfP1Bn7KG%JAI#b<|ZsJgf&GDc+@wF6aY;r1v~wsPb8 z>51kV?oas$GX1A+4PcGxI@|(jXJw%^t5NtpBEdr01YL%oBReaVh_M!6?-@NLUN;%% zs)ozba{*FDp>8!5G_Y@{+i-Fwh=Hr?(xZb*SH9fsyLvi6WED1e+IlZtj7_=RWMt{s#RK6CeOF=G~hcR#f zBT3fdO3dZVVZR(IOJU+-t{!5hmXtJ>DVQBvzO?ePwLrNdk+2#tzDqt(EKG0z{r>jx z)#Fovvh+o9swtm9^iTcP>^YgP-P^7XvPi%Ab41_!m7)plzwj|DL3L-JN~?)qubwO# zw9O~ede=Ip*%yAsxIudGX%F)g6n-NiTqA^E8+_)6|N7gnt|9`1kqk!?b)BxSQaOB~pMm3R=f0Dky{iU>7`D<_>43PE2hPUV3u28mpYMdP z*XLVbV0nPti`8|$z-FdiO;=v3c^4o9l#wpzHZ7NBK)9 zP?#JPdF&<`LB_1vN>@l>b0&!CdQpn`?Y-P)8_?XH;g6Ds)U_TnxZN#cXedLIM3NvK zCz%f$^)_?y+-+VrWy4{_k=8tKT>K1#Mjpgn9q2Y^@fhEVeqU( z-`uf(ZM2(qndDFGZOK;@ zlmrG~43?@%g`|GDgw>hD8WIF)SvO?a_V57O_kLew!I5hPL2?HFKPn)%>ng3sI%>!Q zIgwn&?1jcy+T~U|>4Nz3F=l?ZlQ49OI@814c~fVCrid+kCg^>>dmVqi@O3Z(m!x|(C8SocxUvje5``t8{3{Pr;g-tVo;^^uLm zyYnpu zFL`Ui%Yf~t0xB%#U4M014$7dUD6Ul!*0vuG0`ZB7W4$piSwK!zXFI5`|1i29DmzN- zWJ(aHG`(1gj81P!q+9i)DDm?jm61?3nlQpCC8|uxSVA+46zCRJVbL>0pC&8*2#qQ% zETJjt-hXx2zXhOW9Cf~5^4R(|nS4D!{HgvAkko|TVbMB%uQgfAwgrkQ)V<5e__b-c zldVL8=<*mUAQs$XYme*67>Ah?r7>KBz93SOmfaq@x7VW?u9KqmHB7%Zflo~<_Y!vP z_m1(wG2(eMfJd6fi8PfT+DESP8@ch+fVg<{uG+fwXudzP+##p(IJ`8-bXZrf3rj8G zxkAIR(Qm82eOZ5)30PtC#;B9PZXp`~J6Tk4HTd3^)uX4Q)ATw6!I_Z!=T8m;kqtvO zTVOjRRF&ZMUxnJiX^&U$Dx^T+2Tt=e0yb?p~GGhcRNmv>xMZTZNn6gzGy_CaGSb(SVSeV(_0VYrY@tO;8ra79x z+$^>bMo|lf&rb>R3>G}QJH6jJTNGDV-Fpsq;wPSfyKAciw(JQjh^X?d8{OJ6G{=95 zdcaX1QtI7Lgk+nXB{jvy#z)IC?E6D4)Y$e~snfkMx(hxf%NNyG8FZpFjf!cCVx*#9 zm6Y-H;9pZJYUoYdb&$eDa646}>>Bv>iA;9Q@O*OMILT3jyh7(b;rQ))ORTW!t#{1Q zHa^ny?i&)`Oa5|rYTta`s&%s7QsC;@zp1?D^`?}sOs%o%_RejOtXz^Gko=+w%g6)N zqS8LRYkIY2TFp}V!{HlhxDYBT8%OF>(rI9k?$l-B7u8f740Sd`=hh%0NdId!$W;&e zZWBzysYY`DQdTWTcFv6&_U#&-i)V!eGq3CvoldZmaU5+~|1BJr#*^Ilw z(Pt#M2*aJl;e!DGUq75gqSS%zYxKBvvP;rqeCjIOzhPn?3khH4T*H*dBxT zx*oe|YRN zIR0iUT=aTq#FFVf-SIl|p#f7;QBjy*AA8EnQMWsIi}CHeptbNz*|?KBB=-*o!J9-N z(s2Irq{g6kd_XyMqMHstebO^B()}=Twvh) zH!h$bc#-Qr+>=m@r${I|P(eV8vuwv(d)%Gc1L{8IS}#y$1!WtC2rLY*R}g2~ zOmX&tp6LTmX)1O_(}$@n-a?~|gl-tZNWAIlFw)W!%{#cCr0?ut4Bu|uS!sUK@C2Y1 zNXrRJL&tR75C#|gM8(DI-ekylPhA%Ir@Y=)`a(3r*pg;_=7EygE$Lvv#kq2g?FdKx z>81LHHtXs69Xl&EK)8fNfI6zp?_T4R744{{RWbj4ms(V*&b|9=#F?A7Lu&@tDlq@Z zC}6ODG_!1@URp{+MYlFOZ~Ohh@flhg>7=N!@@re(J~RvJ#+_N&=5NdG9DJyXv3PY>|W!ewFkfC5QNiSS`9!P1PipH9WKv_y^~c#<{UK&LImB zg0hjDX67aW$iBx8bqT)um#8@Ri=ns}iq1ni{WKVuV0@QcVO%>w->2)2SvCwLJ`mJ2_0a(#cRWB{pL#d zbizN+@Q4;N9TyOUrM?2x5g`>tH%QyY>$NI9i%HR#r8RP~LzAe4laVaJgv%I}k zW`BC2<)e%nB6Am)#r~_fIS2nYe*ens4~K)6%wN;1x$V6wQ~QGfFzxg>tK`c0wSU*w zl-#&@~!n6N#_*JU`K-hO-qwS(-fu~S58gec-jl15_h472C=uZ=l4 zO{_SKYEr7T={ll2I`fq$aakXvj_sDcs+)Cnf4yQh|XkWj#GPOG~&gI4P>6k?i{S zfB)j$W;PLtH}_>@v&Z8t%vB5>E*gr?_Zx~7vP{bxb5H8;2~qh|($9ST0sB(6)OS_^ zb+Xo)g`YnEQNlY})BbC3-{KZ;b4#$nWM)XIuz-BMuxO60g*_d>{*wcFM= zc3-`|M0il`k1FORsxnR$Wn1I*IA}M#N)rt&ezBw|ykgru$-E%wi0yK?tL>ULU)A*0 zM0V~Pu8vSxmyd0@6!{!(BH9ApHoN~t^TJ}*grB!|RM71?Yki&7UgdU%$z~HRcu><9jL_-s%l9JxI(Ou07b%FP-y6k#|I$*!%)9)uDHF3_xrf>`Fe}jd_2_fUjy!1&|{) zn5?5+k0}OkHeZ410+Wsjf)3QA-1`T**Z&swdrvPn_$Z7r&Jji`x%K3&j;*M;6^HIJ z)0f&^@q_xki%SLk0Yz;U|8_wVzFmJ%1o*gUU`yQS9;Hy_k5VWz)vrIacvLF^JzT}U zgEEySMN<8+0a*O&g{-Rc|OGKQ6>63+HH zMYn4fuDEy2ic_SIF+GmXRX4j@LaIj3CAoUcb_()v_85rS?Q ze^+TrdwMQO$t>MMx6_*~M0-u2y74~4yVsc=do`Y~jQtYnpJkuD;T2jVL zsqCG$9G(N2A^j7G;)Z$q!ob$xE$A}UX&dUg>bxH5j=8AeX-^LIs`Z%R&76TP<833> z=hD*(HH>Bc&>Lve!MygOY^$}~u?ufkT;ag_K%zVt(tvuPxhEGxQlQB@VT6GWbz>_$I?HY{@U>Bwx zMRJ%-@?3E;!qis)Dz+w)MECw}Vj1|yYOZa1KUWES!v+SRf%?jJ$Nl=IJ>z>&&^k!W zX!>nlF?ub0{d{nHtS;=Y@Zw5db&-mdhG1a0pPao$y!~+zkg`q;Smo;tJ;7V z6i;a7b=V4b@<*9u)oODBDq*quiuXhv9%y^4>cD#({Ek>^ccTWn_lGEhz9f~cryyZy zgg#>q$4Rxv_WLUpjMF#NwmJXFeFh;UD1sXY>JN#>YOy zfXB-eUZD@TT={(z5rFVcwbT>e* z)TpIY0Tmm&E zB!%rk8JC`s1eqdcYTRmSyQ&)a-R8$(JKuV~yD(T(djgP|z~gVmnxa$GW&p~r%a0N_ z>i5u)CP|)gSY)JFj^f?(IYD-!@LVMXWRbl1H{389wptmmr_Wn9$Hv@0q51_p!-osh zT-2|vi#B9@4=aL?ubIhp+u80+H+Sx_mIxhtFXiDVxUZ;qJU*e_jsXfSARs;q+JVDW zY5EPBVzW8%OKxTbFcPRyc)c)+dWBSdSQ>%YG`PJvS|uRi51Aw$MeKs&NNuuM=T3_h z63`v6ts~}XKN9TQs6?g4_jV+~=kSVGI)Z!!PG>x;j+U<21d2A{odpCBC9sHuec9`; zzdxS7;k^azz`*^7QR)f;4nd*w%>X0QbS%4JgQxTTM9-=$8UT9W936*ARTA+mU>BA1S&>z5*WfS3mTX8lY zFQ~QLL4F(tf*L?jLU;R(rIANc=H|o}~5x^54(77`pC&Z>FMORj@n+k)gpE8KKgD z;g6o0db>qgYqul?o(I(1gEf00w~{;IS-j1Y@C3*#9Rw1q#LCJuqT9#v*LT+rK#O&R zaP1*6#J(f3!+u@rC5n-B=8m9d!);OLY?895{Di6P{>19r7gtwAx|cH@hE|6&>L#FJ zJ+Nz)9$Y?u6e@!!?|R6f%YgOKnQL?B1OO?iy1xcc`~|o$teqiL_SeUn&iNE#rzIsF zBn^*_nQQ8ug5nQyN?uzL$@5JwCeJ}T2~BU(-Qo5nbiDsf?vvAzqycN*{PNp7%<_=X z%`>}%^l>2<|HF^X(?19Q^X0WHuIM>+%Kc{n7ZFO~`Cw5v)|wc`x|iv2L2hzln!6RO z?AV-WiKRDf*-~>t&FXo5JnnPbEw~6=*IV|aMO#e&$Q&{x!hWdhDssQGZ>No(8w&3m zk0JI&F7FI%Jp6DaI6vnIe1nwoSa8^B(3`;H-2nv{->{T*l>__#2~Z!#k?!JgD^G+c z$-p7v|8V-p6rT``ijVKCk7$)CbK}JyB}W19-0_N=zyhD%-~s?$Qe0JLhk6Le4pklA z4iiEa0Y^c}$O-jZz9_}%GpAyhswkixz6k-Nq@p5aVxkjI*0ru+Yx}LCLG5I*6Rts9 zMD@my1g0MaXYRh^Kqi@CFDco8jEf60M#8@?rxZpl2|-Jes*&_LOkVOEVl`Oo_;Fgu z=W0&DV@pG$ZaXSHtm{w>qdUN>-;>)np5Yc}WMp(%F5*_241?owsof0Sq_$R}wL-f> zyhOF}t8*A+q7@=Db*j(nc=89vBVGd3MVQ=>N=jc-B;OXr&AB%CuJ7$1m;;BAjFI=x zLP;_o+aHF>XhO~6W}jl_vWYi+!lJFD4y!shKabVyU!-Ry2nhubccKEBZyc~y+x;rV z(iGn%#IeqkVAi#eajO9U3J@pRd~l?r(5$a3{MG&ajIoH_;^JxlSfTmFw$#I4NdRx;*ro^gM9Xi7 z=5{j;%>t4_eUBX^ z^-d7!C1+Q(m*ESyAY+W`QUUeBp!Zfg2o6!7ULra%A&Gl0e~mLrd`AA^xm{mZ{`=R0 zw1)>`1R42{Cus4U6`K{JO5slJ1=!w!>jZDPDRXQkqWLCzQ1i9FYbb>cUc`Zl$Al`_ zkeU8o_j*2?uzOZ>GC%b?6hEF0!Rhz&bEZHZ8Cot$UTAov@yL!Y9VY8D{JoN@Zr`Q| z%%umoumxD;nzGNHu0bB zvpQ8`Ump@Ng&XWA^|GMSky`b*GqeJjr{7HXk0lmv#1w+C(GnH&EG`F3!AOXai3@XT zDq2e7X1hkX-;Z^8y9d3epN;8S|F4x_VpCsRQj1VE6D;fM#)}$X__caoWa>wLR7i^V zBf|6r4zH9sm^3B%wu+$F3G`Il#r$h@^TQM&+Vrn)vA3 zZ+NPxbi-5$j%pCTK%~kJAl~y)M9#=e9V42WnI|NrMuATYZ+^f5Cod5L%ZQ(XGHGzT zu(-dC;qmQzZf>qlQA-4%66Z-evi>^gO{Y_n7!-kdwJ33pf?-NV>rG-ZAZM<+*KEiC zTfT^rm^mr1PZjuUqM}??)u6Ygt*y&0AKP;qGA&`siUM0SsGPb>c%L^n17MK}MF)mX z61=9Lz386OtJ+0v#(r!uv|pbP3|T?}2k!ut&CWnHu|BNDnGrKe?jqswQ4blFmo4?@ zSr?APgqf(W1D53ExT-{vtVG@Jtl6}GfC!b~KlNofhD+2k8;T*1qX&pgh|xRdO&feRF#q z_wSYWv0v=8_nV#fg#u7Xg5AzA!?>F1k^m6b!Q@3ublgyYw-f7+Qzr%_`kcq?XZ>XH zo>%}Vb!;L=${qnaKJC_25Y>5CU~u47-DC1KU=YGl&rKNHRy%$ zsq6%&%(nz>dD{fIxbhYjT$a5O+qYiDC6zXExC^thMA~ao7al7BZTAP#=v1~vHWBXG&yrG>(3PXte?|hCU^=xShdJ?`D z8$b;f47Q^w*WMx~@iD{_^&AvB2`+U?L?cvEn$EOC$HW|%BK~lxs5sw77c-=6z_q`C z#p6Z7Mu4T{5C~h$>HT8t3#{;^6i~oBVKZsopoA4E_*${{-{_&CgD{Q8DoAjKp;Z~X zkTNjtq-b|9PLfPiVh{x%U*v4oCoNqL1M{?~xHz`gEabuqoZ$lKciJpgXCZ!{huNA! zkN@I$Ac7`}*9wg3q#t^+retwK0N}Sqe6VJ%59+$_BWl&lE%m?P7~s63ZBxjT)6wPX z#Ly-TLlD#!FaGUaGAgR=j{tQJ=03lI_y~{*n!YPUz$QzXS-5KZ2MAAFxmvK}it@V) z8T=WK5V%XMIeo_Oi*mK zigz18r@u`pYdTYi$c2aWDN&l7R3e&Zw^6?et3~)%QNc{roYnLY`A%fI$G=nYDBP$y z^Mc$hSZV-Qn36G|@&5eZQ|lf3dis&IWoeZeP`En$#UJsT zVe8eeLtOU6uy#P+cx*9@jI6-z8A7aJ9z~EW44C%V&ph=72@*8H$AHmMwh1`D27Sqt zpZqUY5fB@vDUe<z>MSge+1JDV=qhls9vVZR7_Xae(A~ zZiwu$B<+jYaNx_PPB7R07jk4VCKWKKYX}pq`1L+m$n=}FvdE^wp&0;|Cv~d@n_scII z>O>M16L+3*<@_*{25qfIC+djb^jn9NXCgU@EaoSoz{--C%wq32F=y_$TzGYO@SUmK zH!mCm5NwmFW8fekxbW<-Od~-31YTeIL&uDQBDS`OCe9ShPA*8>lzXn!@^#(=kURsq z8X6imIM2TCuV|I6+nl2MmuxH*mpASk*F-fOkfKrGr3sNW4@2Iy@Kv7x*ru7=E<;UZ3a z*Trf;I4>l#QN<9bJNa}S=l~ZGh((#PVGBj6uoq@V09!S)oJf@t5!j z5{44!Pv}*ESRy`E{>u;4aXo}yXP%S9v-PDz7Y~!6PsYJyP<+QC@nN=^XxVgyz3>w_ z{|IR4Y2zeAqrylzD57854^w32e%YLf1pzO*YS)hK?I~bvh(a!7Y$$Si%lMWx5SIrj zQ+}`?Yhrr~et+}Ui+WM@Z~ShA=lf}LNky5N%N|#)wrH!qJqk2$bl%!|9?8o2ecrSM zGj8O8i?)k4K3Z6D0sVp2$9VgP0jWs$$B=RJh0dDKtEch|%g|WX-;|n!(5UbKO!o8C zt#SCcY9<#MxjnJpJ#Qy<+0IFz^)F<42K1e@!7{ibe@eEA`nuKLyX{K*mApeeu_h`0 z579bjf=}B07@}OThjsrR7g5y`<=1t^CiCV6g_>7rl;N}u$G`tJrAhYt=|9RBP1V+f zuTK9-YO&@?Oz`E&Kd0Upp`j-LI_!O?PCx=BscftRN1r^}|F1v>n~lnUY>fG|aka%6 zM!pC=YT}3RlO~bkAP=#tX~?!_S~{0%d(2fpP$D5+VR?PES~D;H9YbbWNezLD34dD? zri&&AP~Tf5mLiK8viWudpaTQl^&IZbkw=_Kqap_k2h8`GICxqNeW9mRZCD=+M3W?W!)nupoik{0lew zH7p_5L3>>cp|){1ShQJ{Myzbk2mwwQ7&%0}-0;^2aAD8@#n+18`>U$Ddac8zaHm0i zsQ0>WK=A=~t#e^)DmyT*k=mm<7#ANeJ^f}}*}Ti(*6~V*JX&gQq|n5*vf?Cl6aMj{4QLbGMrNSwi>-Gq_L!6@N>x)1`$7LgC^1C4hEEm$Yx z_|ZAPJru3#hfMjCZ+%S%s76LdYc$7F#`oMt=PL{%mi|SStwibO5RrDsIdC?5bY&ue zsbg}GznXiPBlWU6FWpkWomOYngN0B%91$bZJifIHT)gFa7DzyITH`jYC zn1mo$bCT@dYyi z#OQ{@SN%R+E~xMK-GVq=RJ9E&+R9GaU9vV?_s@=mls(_RLV0Bp=t)xXR3H_E!eHH? zl8}xjCp$)pzE8~;x1OTGOETD03EBnH94TZ zyYH)RRXw7o6&q2xcK_niahB5&cU^bPv`<26Yrs+2^lG1bre1s?4d{W;s#ci^b_Soi zZ#i&jcG=OFX;h&FW8PqI#xbv4Kdd+3RfaqQfB>zhUGI~(mzX}YN%1TW2st0~bSC8J zqh^Q_JUHYYNWCRIQNy9Z?=JJ^G zs*+HS1B;ifMI`v)LWr4UDdW#1Ns@F}#CKqB!?197G9MUdF?X(GiUdet^MKURso$Tr z#kf0(OHY3OtvXn26!UVcuB&(ZHkREDNWTG(ugdXN>>Q^bYz?DG#xf0833a&e z;s>aBfmD|u2BtweO20~C0S%eqxax9a>(N&~XU-~>*Bt<2PW10z*I3R_bUvT)3cT;& zzuonqN8%;PncqPI*8&9(&ua~A{T779^sWenEO14&-g(Oh3;?^DvMi^l)}x9{hlp=9 zf~)5UyVdo=^I9Qg#E6+iLN2e%DmTw~^^aY;{%>pyD@u9ldh+%{NY{BV;KLG6Rww>d z37EcabyXL6Fe;TSQJIJn#o&aQE0T=FM!R;s3PBJT=Up(=c`oUw{>#g4Z{eP@6zsI~ zR5c|7SOQMw&3lB6!S1j+N37N^(7@Dkt=&WpX~Jk&m;wofKv>3|7k*Lin&rz=79ppL z<@z8+I-tt!3kuI0-ZKtq?5jYQqM#9oBOdM*J9QPxCZ(g(CG$oH>fS9R}&Y~ODt+PlFDKw z%}(o!MZY+;-~l*Fd8;2~>UrvAlQAa;py|p<4FGeqJrHHG((K6h_OOk|;}UA$`50{9 z^&0K>_WHiWdtOadc^2b`**IOMEGmjh_n&bNt$&AvN$x;#n58}1jNDebLE0fd^Bl%C zZh{5dG0Bm^X-q@}wgq$H%3?(S}+LAtx8 zq`SMjySux4F8|E9cx!>c$NTQP_r%`&oP%<--I}`fw~(FRSJ68vj?g|eC4#dyqli9z zZ04F?MOl<0MtObfq<@?*Rx`UY6Esh2a=tPuZ^pvF{1nv}A=+9aH?)%1+L|hwZ4Dm; z9{^kOi)yGw&Hx?(Va$jHPgGU1clC_zgh$*+Vdv2jYgfbiXF>|IeTGCn80&9;R8 zaI%<;462otRiR2vCduaQIbJ(qb(cg$Sq*f}{E*jfGB${4g;VU_Xik)?!?aU?g> z$GCr175>fp9X-**p5_|)n2ZS4S|%=^lIn|qf-(S_JC>ITxLjZg%`kS$(u*9h=BuyL z8!7xJ#B%r6SF*?M;}e}D)EXR!BSh(OLPWRVRg+V!97>MHPUfprcv|dulX>DK%+0^t z{mRe#gHUQ$TNS|%-fE3KzNN{GXY-TE@I}d}QJv#)B_-6eYGhx7`!O@t2w4UdrSa(V zP}R(hSxK3yPX{Q%1I)-r0&{}F_-hEJ9GJYnw z>9ePqlPuYMiHlLe%-t!rx7p+3*b<)%vuC+DCzxmwQ?U=k$C# zG$aHmOC(t9GJxSV@Gy8GSZ6KTd7xX#{aac2kH8s&$HjNqvYol9In(cVaZtZFr0+Ll z_@GHq2on>IYkTp-BMgcUjJmRv{Lj4Gk95E4?!c(vAB8N$6?UEF!lH4McPih$z03Y5 zOG865_*O0BhbB>f8k{mE0Mch?e`@RK+?{ryaM&MWA50hN9L?*w-p#2%T^$OZG)MUO ziEL~h&JzzC-IcHO_4R4B{>H9{f%+3f^PU+sL-1sMHqh;I@9Ja#=V+lNtbZV~qORs7 zxFL+s`!jFn0Qku1U|!nQ$sCLh6$@(fvhvt@5ThcUX@VuBIDSw>Auln~ukt(Pa}P z5M4plv5=EZ2hctQjKUHNkT^cQEUymEF_{L3=`1Dcxt{eUUGC2LFK0Z#!X5a#LGD|} zVqirir3B{2u}O1t27=yFUS7`Vs2>D{bZL-7rR>ZNp!)mmqGJwv2cZ)N#}B{NRLN*+ z5w$giARL>iN}!Mw#YRzn)Q!u_kN!nelmDw=Nt6CZ@t0gxHDokUqCH46t|xo;6|GYJ zEhHoyBI2emmii}ha{nrmnR5FhPWR^(CEL@pY=;%md%vrmT%C&|X?0oUb}oyNwUnB+ zuCACjklNS`*32?bnPoLta1l^m-R&JcY3Gpw*GDTNE4*$Nj(l@-bDNvGNiVc=6mYn_ zs1PPxF!w7~gkmt&QMRAqJosLmZz^nN?E9y-YMt#r*|&QaO&?>%##SDTCfMV1&WN+- z%EZ~69a755MGjs}%gIHGN{R`n<$wc>U|m7cJG6e9T2!@sx47U?2=9ASvS#F9XF+Zb z`@c)wHZp_4r@=?yq5JvUH{VXO&NA~2XZPnb1Ww!2YzGBahwu4h!dVeskKEQ3jFi12 zB;?ePz5@I!%S7B~qdGp9aM^M_Ql=|)DOX9Xr-SG>>zkY6Y2g$C9g<`V`&pTpk&j;1 z=Lr1(+?k#0Evt~zwkY`eB`#B*Vt1-4tM1A7(sWoK^M`rmSN(&4t}P<#*G?872NMy? z-^gT0?|*j24aQK*vP|cIa2vvRQA#Ws_=y#|oqSnHZj&+bRZrwGcJm>AQ!L_=hixV{*~`iBVRqemAJE8`LU zVbZj=k_wHYE0HjQjMDV?CMqt_!7VSV%58EJ@jylPK%mDK%FzHVXuPQK z@KfR)cSt`kbHM$+?Q~=%Ghbig7|{X;7XIwiP(wsc9eW7WmKsx*EEZ)^-E z*xx$jq2)xpp(icRzYmjXqQ0UWNSE-gT@Aaj;DkiyRf3PdkmA0RG^1vPTR^$OS!t6c z$i)UBKG4tM#OwXYh!5>cYfXKijFMe`Zr$H6>80@{E~#l(_B#UxF68(8QXQL)`T4{M z5)nr0P0?WCth&Yd^|Y4H)Jy~1C{5C$r2W*#2`Zkz43Y>3Yj?uR-R>taiIJLzl3Url z)$q9DNOOIBBQ-pX7!XSK+5VF^G)h~aSahJtHHu3p-2peg?bTYR& z=4OsTwWqk-64qS*azfz*<*nUyR(d)_id2xq=N^Eg944Dy#yC?AC}1N&zwc8qS=-+Z zEJz}6YS%HQnNgAtcPF}wRC-d4oNG{zPFqNKD;SU`#pn7uUItk;J%xpQvUfzCdL!v0 zrQ}%^BY+J?m)8Au?z(cZS>EXE+o-fS2}vnhvO6Lvb$Rc(FIdM{~m zceue}dxRsJHtH@U)IB;ql(p<;Sn15H{GrZ?iiQ^Kd#XWVHL9x4;qJuI-^2R+X|_b( zm5*r5z2S2lpXzAdB##*i6-;GL8B=!4J0Dro)r(@18-{?VA|NOThlI3sHKRceimO^) zo|9NiW*ANeZgw$8qn6#WV1oj>=dzt9iLNd#dPYXl{0W^9Lxej(|N7ZR4$sa`sONhV z4zxg@->sjtwV~0_xx&N4OZB&&uwWCfzQ;?1f`b4K+nrtPDkF2Nph`$p3M3g>S2AB( z`x=RVICb<-QN3HceZ&55kQC9=#09r@8hjt|IUTYDcjiAH4ak$JO7QBP7b*>@Nb|%A z-TUfR;@Ej#Ygn*1%KtHVklGGDozh!s@FujvCnQ3l?n9AL<`yTv>@wP9*!Pr zs^3(`O0%~;V;G8|0=;lAeNEw+ooP%D!~2cheJ2mD@-Cg_^)fdTSFbbN9` zwoYU`#IO3o(70^opBNZY-@PP_C}|9L4G)L9KV=36;&-OE30gTgU|}hLs)bi%wa=T{ zVi9r@6JzM=>iVgoBB!h@t|dd%#^W;eerN_=e<3FYB{c<-!)l*`ky^!1%IR&O@4FY8 z2ZAESpo%0cEkSZkqReR=BwQ7j`gi{0wCt7L=iPZt>iIKCJm*~K)2a-q`^f$`*GKa- znPs3b7+46-AH5$CL-E^Jf66_LWc7r-$0F<*;d5{6nnbwV!{uKYb@%bR=@}l*SbmBw zpr%k#3XhTdBX8{4R79E7P!y8CnONbCkIHj6`1Wz~4v{gafAm*x#2n}3X;4t4iPr+E zi;K%~^Mm>8MMXt5Tc!hJGE=N~EK&j_utQg)kY3ItMI@$Wd8NOT3nk#st^0=h1c*JG z-2`hr<}pAy1~!krMApq*$3)cL&5-838&h6hp5{p^Xu#54;bil+Lcujf2SSMqBGil94G9X-<=&O0ADRyr1 z^vbk`{{uW(Yqzrbzd-X`q5N==#KRpPN?sw>7d8q+PFzq-dHYr^ebCr9iBqkpE=SWk z_EHQ1#eJ>6-ymYs{|0T1e`kq=m4kh#_~ju`dfCHQ-K~9hcfnVu2l+>Qnuwx4r`bX! z86#sPm>z+Kh9i?fKOQEEUTI9i0;aDJfQhV**2F99HsfxnI8m<#W=%uRPoCEulcB6H6tzrNjwYpe zShaFu`L(kzfQu_~YaOrUi|knKuN5**)dmB%8(kkyuaEu+%-!?u8!~e;%z~Ke z;5CDTP}RD>SKQ>S8-BLo4oKldFRQe&T z&i@e;4X(Nx{;&Y8yH78c;;*dpy#sxX^w98*tKysN7_`6B*P>sjJ4o9X-_?*57Z*z; zv4$8;Fiw6bDIV(Wb! z1_I*aJ#7yNK7FZPt^TU5#s6Z()H~4lb=p^#suG7LTh>_!sbFfFjvWo8=I3i_x7Wd~ z!(;DML=03Hn|z5Z}5TegsKEWDc#tE zHB$JvUeI`We8gF~Yw4)wOHd~vO8RQdR3!Md-UP)y_jeB^&3b6k6`L&@?rcdK$|I^D zxfxeZ9bD<^=R_nV_z4lW_4U1TxUqM1cGS|bxk5aH&WebXMIy__>80rwr|cM3^lVB& z!!?m>Pr5e$Qt4px=4;WI)w(ORo-&VK3>r<*QN&OApkV5bMcN?(+iU@=C6+PYWUNY7 zT}H|>NaDQ-z)EIy(_4;eK0ZELh-u*A;bF5KOLd1dpl6Nso^6N}>}QgnwmqDj4lh`Q z*Xog{9OUKGysuPL<>6f2A6rWVapJeN6>5-_T1rMMPTL+6NbDT9RjpiER}7|JeP@}C z>J{Y?$yWCma>ES~wq}~>9g^5+4fRPJNx~#RE*aZ>Z6qM`rS=Ms*E#+UVF#UnCH&#R zhmBn&cg*l_`lm22FK(%1_TZu-wHTNt{4YopCx55q)2HRbqjKBFWxZ00@)r|RiqP^W z-%@8M^QzIgVNg)YMcFbWJzC=nXCuYN>DjVjQ&B3#$rXQr354>MFh|=J&&~_{QcDY3 zsOnGTNIqUpNV{^Kd|!5QK{i{cXRw|$^h3ty|LF+DI5&ji79&au1%3UAz7$59`wmf0 zPtSCvxoXZAG^2dWZ_-{D!ZmERxc70srTbjGDK&V~W*g0Xs&89XZum!d(p0*e1})z5 z^fKy+lmcz$@9SiatIWQX$Yf&5YwM$JsO1RtfV8994+}VkYiIGxN zOW+bT=NVqjqKW5{lw@dMUyDx+^}S_1}VT5P0`u-bB|Lq{aB6yAJCprDH}O^Y#m zV;l-5CMMeuG-nEdn;w~LM1=aQZ&C!9PVZ2k_8HyE*z{0TZ{E+hkS?g$vq6!O#O3AV zeS_kF9$)2jU$y<4okC7~#0_4g(#oy_7!dR0)Sr|kPb}q)sv=Hxp@qo+P@%N9|4dgO zQiT`T$*eTp;tlhR&kfN_M@2-*5=Wf!CNKs+HqH$yPX=90+f#r@B>#uDol|-3!Q|eQ zP3|UR9rjl*OwXhwT$}Adt>I)2h*v28TM*{iwMxmwV`1*u#f8CTJQp^%E(Je7k8c}@ zO;%ZZ`nzL`dG5!nL{@MHLWD``ei?1Qzum{#&)@P= zcxBDaSx4JkmDq4qUM-@Mfs55x632c2bQG-yXp2Y-eTmx&S~m!)3gCIrJ|v9rxkVB1 zJOJtAZ?HO#PmrfKC|?Vv!V?mN!7izDnnNm1Fs8@u9quFLB1aGX?d^>YOlxgJO~=^T zJW&Bo5kZLJH}h10KEhSAvP5;gsb!x>Uo*UCV8ISaW{;CnEK7t>K-<$J(+n1d#0h~8 z5f((vDVGxWMZ>MSuQ%1tyO$YN*!7{usuTrt8e4tfa&US9U+(&JHAC~DL#g4;fMsH0 z;)jeoT)IXQ7)tP|{O@ZwtJYv4;*25@mwD&PT!+n8oC7Lb&T+crIvOrlw0z2(a`P_V zJEZv*sRA;xJ$6d59+RR1I=tluIV{~7QC?RTaRp;Md{dvA#smO=DG${FBasINg}lpf z>wrDN?WU${?(domDqN`zMLNTce_6`Cy}d=lA&>-2h5Pf;+1XyOdI>ojT~cA8ZFvRL zs4=d3W_oRH`1-nl6ghrR|DaLQ?f+{5`scY(mZqwXSUO@5{Sy1uG2ru^2V}$i(xH z{ty@cK3nNTVs&OkYAz|1FOP=F@VoT%4b%;?AXSVuGY%!qAW4NWLA|(wvtUo8c=oon z3BmDExLPhu{d|zQl7hYDmy#!>f2vtqLgM;Gx>naEPgvQk7RKZsvVMG68+Q7)4vcCGPJk6cW~=YJYyfOiN0brU2!| zMjeB>>cq7UvkD7U7nVjc3A0oCjNoxKxGjqz6K0p@#kYI8+M7%2-W^|Jx_oJu`%?Sm z@aVA4<`C)_kLyj7`baSkSK#-6jRp(e^z`)K%|x$2AUY<2gGq`LS8{OxQj~*Ye!4@{J%2kZZdN_^we#m$njg1^XbWhAlYpgk|rOu zqZ!Z6soqb1v$UjNal66SgvU+d^WddcD%KqVC;DfAxY!KtNDcm3X_<(NVx3 zxNdwTNZd9p9Ga4X#-;M^4|U^i{@ynXjHy9VD(+Md4 zcgJ)-a_eHN)!Ujy>cC4ob-Ygn?GQ)j>r&?rip_W&ZMP9-E~6pYXMb%R>dr6j^wvWXOg_ze+8Ep4(0%{z{ zsi>*@`iAO{opzzUJr@^Et!*keoG*V<$|SpRy{^0FNxyWKzn*{;&^P~63j=NV?6-$SInD%Ty zgwVGukuO+qs1~20y>FkvBvxg%t0{GufBQumi8bzqJKNAFHMNz1z4}uW5<_1O25<5s zJZRZk>yP{NNhH#LRPzljTBs>!APT)%aYhARN^5P*M_6d0L7E*Lo98KRTbs<*EP_D~fz|23jb4mE{T+)rgOxL>DxN83e(tL7na(?3 zY1Cm-($ozu=y>sBTJ^^Gom3|zfO z2!lK{*Ke_x6PSV|tvooYyQ%aI zN{A3K(0eTR1QX)-sel2!es&%*s;ag_&p08%mod;*YfxUoy6rx2uTD`eSE}6Y!Tyo+ z;e4q^108ibY1duL^|q}6kJB-|je{IGfUlowe_wB1o9yCzJ;PDzoHPDr2VYXo;dXhhPDl#hNn+!j1-P|wi5NLsW zAFC032h*QU{OXKeE`7EYOyp3ECHC$#(*JCmZ9|ohZL40VhJm| z7qW!r_s_?!9)5`yMGFg7c~Vf6O0PTk<6t}kvWu9;bofFN+ z6o<9_`5gX-Xi=K4jdUP@^GuHz+q=}&#{%(P>G% z+E?ZTdW((qPuuY;0`hwQ6zzC3NfXn*Su$J^-UHAk@~GcCvEGB-5_Aug`BEh*Xwtc!UaXH z3s>Md80Hz76t`k5R2NY99(G^r$KWUEE<^ympIDt=ig7P4TG`s7`JuulzLCq3(CUw- zY=2+#8w4uHxM%@mhMn0(FyCuZJ7ni;OVES1-C7^RG}dm+C@arS(S$8@aR!=axG;sG zIWoVLaOsq1%l}F7Mo)Q!+~YIlCLtgGTKpq%rsaGWs@g)eYn3bK^gI`#>l+3$0wOfY zT-~?-bvxvU*65T}ROSjhBw(4KkkVD+%)z)JsJCxQjmI27OGuEepW86bH5(~p5pHZ| zEVYk@wEjj#pLMOyjE!q7J6wp@$&f9{rQnN$Bv(pCo;aK0)m^7r^Og ze$l5He759G8d03Q4dVLMO?O7_xO-OsQp!|C6b@#A~4bb3wsN-P`gsz}4yv-9I?yp83kA~CJxo_uvzoVv*9E{yY%FZ##-mItao`;(0uNQJ@ zsbGDHQfd+xc7}^$_s*B5zlsfJxJqaT)Eje@-Vn3(TJOR_5e#(0NgTd8UW|DVX4HN{ zflv@b)o9@fa)G{Os7yk->9*GzYeb>PG0B0uH(0U;x4nqIbXR}4FsqY6)Vpa799r#7 z*&O%tIXML0{1r+*rPz8mdL@9cNPN5W{_1aLjP3jICk6~2;{E?~SWGQcy~KwgIZ5?w z%3^x*5A88zKEJWxTdd^8Tds(K5r(Q*-?4aQ0}EubWa6R{BRl`3wXC&8G_l)j8ibgg zmybK?O2B^ixQ&kfyJ0xFwOffZK0;n$w53geOW2kZ6NFong$C#Gat&EBlH6JL#3d7h zne|1^YJJsw*!pKAXJ!Y)vNroH3Q> zovomF=-w5} zU$l6v#I|o&eBizw_lJm%!Mxa(lcP|IS>KpRx$#i#N^=?iRYwqeIP(!VkP1g8y zDPM_G<;3^h{niJtb&YNf=X05og}l){e(2eQ8Wm}?W9SUnh_1XlM$A{FL=C8w`_|1b zt7OM+rmWwqQ^}5XKfb6qgr{aaz4=M+fb8@uj`5v}aw6K_4<9zqhPdcXM=vZY?tc(a zU+Y`0$d$acG`zuFPO;I%`pKH$*WrGR~nDXURT+*+~*s_Scr73Y0HXwF01yh_dM#Pt_|U)yw~HStQQX>7 z!X@2!{}G}t!3g8SX7z1Zc&&cI-OJNk=fEWC(M(jLqY&!e?+Qg1kp7_A|EoWPEfzPj zB1)QhL~h-s3NvKMBIko*mTa$~o~zJk>7ZMMuP!*5#1-6$YhQ_}1mIgyjgxH|#Rfn3rX81o>5i;Fcix-H6XFkL7nb ze~)K+VRB$nT{$z#$^AUUN9{sJh- zUU%u+Hicg;rbNmii3CJX#;{+1YdJ^>W>l{4HXkMP*))nhSP|WkwkmYl zHy#e}F_lG&&!yC+KKMbGtyXa0E!E(=eft)5rBM81bd0Zb*lszc9wIy@QPv~{Fm?p$ z_$IV9<<)Omn?mjS|JmhWz5LPV!{l{5BeIEX+;3@9D~w0m7;!jx!AemSyjlIB-^3)n z=<22DFPuff)DYh2g~qV*$jR=+nLic7|9ans*{TUnO5pY-T996j9kS;ye#Py~47UZw z%Q!$vp3o}AV7$>h*;KW_<$~GySKYO(2U<}v?i7&K)*O7*H-_i)xI&he{IeF?Y~FZv zIjJ1Dh6Bk3V?aZ5kcwiavQ^YiD=)zwXblU~op z(`5(OvP;5>6ezE0(R^`9W9QWOJ4maOdrTOZA8Ph(qW=ugye=-t6|OB7gy!#&5ATYwo%b6Vzg2siI)S0B1M3 zS{(G4Ja}*%ROF2g(dB#9k{*MRFg?dHd0j59$4CqlvVG^!vIU|7*BWcKvMlnqrw219 zR=OwE&^KGkPjs|j3fY|V3;Q=LbPQH9yJh4;-g&Ot_aq~J;fc%C{s4`77oeE6wYrv7 zm98w6JH>UrrQo{~e!Znj*W3Nl?)L3yXy;_tJq$O}ZP zd}IMHK;|{Fj;2mg4u?$A=!k7w=^?;)0Y|acmw{)K$*sTHq*G01Q;Uw$7Ap(dG{6cU zpzmPG+L#}dURPcsULW(#8Z#BWj+prG>9jpIZNh-0_Uw4l7wrGydHc;y7|_TmnYTXe zuMSM9gDpc~T_H2Tx{a$e?mNisj(5%j(*FEO{P?E>8WBcwX1i)rH)onCI?TrO1sOsh zOHzP~iN!aUyytv0k5_&=inO<_Z_2iDfU#o5@P*FcYMju7_SJ*0O3CTprZ>y5Jte9S zHA}K!f`fQv!!^vIl;6*8drM&uIa0O%*ZluFW`8n#fBy%5n&ycRBI`4cb+Np-6fTgtSb^y-^>E?-7fB3%VKbXh>K8|Ve8r9(%E$(3; zuB5V6e*LwAFsZLuUwY=JLwB_{Ebi@^65W!FU!RKy-Ef6Xkg^#iOOfzE{)EA7!%I3x zMiR&fuLR(8LkZV=>4`N3@<~a&kFk)qo5t4&2|W8J%?LSYkcM^dJ^XxLFQ@x(eJ3T6y6&GV1{2 z%e#Y^gd-wtlXr4aN~Zi-kB=Om2D-Kpw}F4cT7F1XB4~zsn?pxg z-5kI6yVp1haj>`3dA#ho+s%GC-N-GO;#}6Da|`gUIFM{9R;sX&3w;MTbSpVHs24Bm zs#xnPOaN_or?5;<_hY7D6w7LenXB{unw!Jpa1EHe*y$Y^02Te|6UL(lSFd`m%*?mc z)Fy?6g&@rDUS5Vvk^1iB^wHSv;}+EioDdunY7=27j!#hoGRkwSoBP6X>AZ-|I`D1} zNUy_1UJnERKo)1d(&TCxJ7Y-_|2~YNw_M|)L#ABrA<%VKMim;=<8*{~+XYc?h0?s$)A!+WOb*@bV zN!XZ%p5t!IB!yXjMrAp%<$;{OuMxYcE?qIK73aSnS{aT;30WGPO2xiB?(dD)GX|FC@T z=5n+cabI-}BdJ;Y!_hb8OcRt;G@6&SVzvj<-suExr4F42D0`5Z~v__snG@ zm3a%l=Q4x}<6%gm4aEJ~bnbwrM4Mq^NkQjc37|lLeOmu4)qEqIg_f8**Fyl(qB>P|gN9qj2~{;f7z+rzMJJak ztXSF}N&*2j@c;C>z3&;eUk6-#GK8W+f|i{aPm=TqCFE?~lk54&;rw>OfLrF|p=0PX zr#|)=Lk9&VrFI*N27Pl0u3(S!Mp+zRvz{B;+|0YT{N7+r5zVi1C@>NrN}AUQlSZ=b z`RT#8Eh+q<>ZDXFXIz#l=8sx~{S+6k{qbU;tWly)Qh4}}ljnakzCJ#yhle!X|GR=k zut3*s{~QGbLRbh`MOzs!+%u+7cU!XyT<4dCGw}~oCAz6RZGs)%t%d*`vNY)(7}+R7 zS=L?c#pb*@?P4n>d4d)>-z+3&cYYLYT4=mEYsfM4;vCD4BNXgLT)(i`&QvTgsnTfB zqCI-#j<-BQ`tu$u-S>1S%|ljR9;iB?m<)!6GJcfm4PXwZa48u) zthhfQVPRoqX6_ev6pR^KT3G>+sc#gy^xIbrx~i&bZ(rY=PZSie;D^**iuAYFD=V4x zM^Yt!{=`;SSFf~KNd@!VUjIW`SvjR=U})$+c^R0S2Z%JAyU(`r?rg@L0enqG}m)D zp#Ge}OGB!%lMB7e{vP*wKLMyD5I-yQkvjZQdceQM+?MD2g0X7!|H6~Hhy>>dGK7|$ zgq@w!OPdmwJJ+-B)}<_bx|U~#iIcRxfKMXVpNm`e+}^Jp)I5YlrS$E>k@WQs|10C( z5`d?~lD###g6DnNMF5;iTjTNOUX(-vLqhUmGR{IWyPX$$u2kvz3E!`>Te{@rFHWtS z)^c7%Rmwx4ugKO6S&maaCgys>kM9}tg5V^}CnqOk^EfjP#L*e7wfi=nb>p%X5pvld zf~M7!(Xp}9KU0&FC9JI(K?98~pmil@X1*L}9~so`4JXpo*Pou0X zVq3AiS#n?#CnQ6I<9oV9uh1X*SLV9X>~^?N6LxuN`}$NatP>8$pUO<<7@sfFUgBqf zvbD@`jCeSWZv+(m)m;p8nUJz_c|3E!E;djNg6Wy{eTTfJv-Hh(+qkS|^YS}a%aumx z5D^g(f3vg8fMf}okXNEay~((e%X%~5F01u)E$3X0Tq=3BxZ#+Xi>pC+VWTI^=JD1l zmR6-Zk;P>H@}EXYQIhqbk_a4lkL9*|vY>3@*M?4Cv)hB?X&Vd};>zN({4!+!U(&}+ zF5g9_o0D5%{IrZY_fi^Qi22eSI9EX+V5Il$$L#MUd((^nbDL(+3ij9BFWc*@jWCTk zoAXwqVS?{k8!KnQ_;xUWSy5VcoIA`PSJ-uQ-1gqw++Lj;4kB#1BkZ|JU2VMY=Mi6 zjLdf;SNdW-i0Dp^mAk zn7@BXQ=PUGgv(x!b&&)YSE3p-LG@)~m-!O8xi9xW+C8c&ukB zTpQhtt4>g7y_=f^|IJVH+}IxGS+$?i24rRuSG=zU2f(DT;2Q54h?dy0>86M+Zco?j zV$aXd&N4s}1p&5SSL0$^8}l%m>FkeOe_4Mp4-v}@H`0sV2g1;h}#0q|;&E=%2r&z6FAAjcs6I6QCm@nQ}XJ@bLd`YMWecpe1YuaR;U)IkrotbNBQ7CnqO` z7o=XZCoh$*z%2jM)6@1A6U_pyn%($}=(t!*O_4?*5zNWf(Di73Sa)fhcd`O}mQBlZ z@Yzi;34JA37~cc-1M;NAdTGxkj6M0Xz*4FLgmpU`bBa>8G;aKQ%s9`oZr&MQ4J)pPu>Lfad}*UP#&*$hvfFlDBsXnsVqjd}t&WKh7Rk}mf;jy5ipNV6e|Ew1)SW^|3-y4<6b50= z!&?8~GiYj}d$Qa_qg)vPB&utBdtydLlwgmLgG!Or6o+M_OZVpm)*&Pypu4|5QV}!- zm5f1v^#xy;V1`=unYcSOo$tSt4A;9i+2>KCYUluEV)x_JKXG{xY1({E8g|q0_pcA%%VR~`Q3;L5)O$R9{5OLv4F{P(*CV_@-E()k*6~{9{Thb=6L+@J z19`fan^q30zJ>Q(KzV8t-O3cf*3?&lXj%B{@1hp|AXZVIhrFDz})d zEE;gxuQ?hJLE1Fz_xinhZ6Jj$cvcwUvk+Hd>yB?xPW#uBTTozYe^YB*Y^#f6vO8iE&^F! zc3MzE*TAK>p%DbC0|UGkX#n;uc2SD?jxQ$QRu|GUFi04&=lQf~w#jG_;abYoUp2HHiy+kRM@UWyC~9M6}&s9lWME zR|;L@6(hU|lM?OK#syEjtoUa3`i;><8KYO7D!M!K8x@(IM4KMY?AWgpo1!sqTU&=@u_U5JHGJdYFej z*A^uOCot1Wggmxw8f+|+{ELbR7D7WlX zc(-o_JT2l)*Ex710q2;5w+s$%PiOX9W<5%ugBus@O}9oAK3fcTa*-#*X-G8nrpR?O z=?3#g zxFO&4$)e|R>+#;?i2eY46Niv|e_gny;X^bgR=H~%7R2jfUs%%-@-@0jh+W&iR5TBp zp&UKKq$qX(F8+t|uZog>kmts^jCH_-{wph{=kq7zbxr`xEfaTZstiwxlc7AJ``x`7 z^S+66_FVb1bZRp8P`sv+@U^A(w%Sv`i%Xx~LI&sGXYjDJx+`o>5q7~G8(KhV%+7L* za#??}7*gp58Ul#Y^_>zEr-70i)oSyf{J``X9Dfw`l^Vz`;U2#IA)SNFOeX8Lo$3kL z_1pE3+=C+re)Cu-A1X0mR)0AbQ%ChPOIak_R8rZA1|r`K4Ehn@gv&@ z=@Y4BF1P4TyMa!@pPvl*foi0x|AG-G1fcH4LnKVkg1Mp1yI0PiSNH7QG!x4?I} z+<;J1ZN5%i^#c?!4X$f~(0#`AWMe}|>RjQ7<8UksCN?$}aP6t?_eMb8?5$X^1tO%^ zI*P`|Moz)OqobptcB`R87SK(}X7|_!4*m4}T%bsi$!cBb`EG~sPf$?b(2!n-9}(yB4zDm*^-WZ)lV)YXA-5g&w&b!7j+u@r)S@w~%sAlnCPsjaQOpNs+`gb;Zu zy^&O&?JzQ>Kj&P>wU8Pb8o+CV+tC4?CxGG>d;#o>-uY(VYr!nY{T7#&k_M+k7`Fc_ zs13rT{Wq2iTr)jDCP3&oJv|+atJJ`}8Dj2G@U!L70N7%v>%dmJbfplx2!-Wyo)^w-k{cUpd*^m!l;ITlubq)-wxxwuU`8pV+UWhHv0l!hL*@-;PHh3;)T?OMeXi zOaY6DfdE=#V1yGZgnxnZA;oqk|7{Dq_ip@Q`$=amCSIT%E~9Z|2XA<6iL1h9XW8_8 zF~R9`bvn76sYXL|SP$ZQdtV1BS$9-oa%b0s$lakwN%?WE#h+)jga|3?Ommb4ZEX6@zqmY-!ic>ORHR>3@2G5KF)w3UtF3owWDALg?c!$Lk^wK0!h^Vp)SqTHEL zTZ##-E*F6*Yg8PZW4&1lo=45L*X&vK4Hpk3E9mw+&>#2qz#q0bKY40ASxDGg85*=} zESnJq*_ur+F2rNmIn3QRnocHCDk{))DR}3k)4H6Vfig+;6IwK1$KcS=ua^U795z!4 zadCK?=7-4PCQg}>d}<`_rQNX>T)yYV_`yL5Wv80;nk^Fu4T;+ zF^QVL#F>qPd;>$z#a*FOiWookp=N8!voL>fc)MpU26=)(soQw z#{vLsqQ*kQc)Cywcv);tTMCC`kfybHf+YK6`Ol=p#B$BHx4@e}KR;jYj(LLwRJP7q zZ*g%kp4*Ah$jIpOWMzdO&BAoyisTGru(}|%b_GZB6)W7`6$KuZ-CeaNsSN-Th*=kU zMWxTQRBoC@8p7#m&o3Gv(RXxod{00C8Zc5!{Zn8v{gn&qYkoGna>P(6tOL*$k$@W; z#G=V5DNZ2A1#PDJwzsznRqMt}R~|QZ55{YE2%pVU8FYk;S*rlL`U=IK-tDCAEPU1( z;Gu+ZFq`CYb)vKoV0+5D9-?j&@>}X7rHV-~Hy31JP-y!9w072EQEpwsM^OT9A~;HJ;~vpXa^4`0Mj{u4_P;x$nK#Uin+=mQpbkIJ3f2mlylKyhWPfR(+Wl z`Ek6?KENWQHrk@PPf6+M-7jS=Czl(mmkWvy68FH=4J-Aw(k7#J z>o8U9AhnaD&J+s zFXM9I4idrbHm8%N@rjdZ*#J%Jsa-|;(6j5?cboIMxtrUjT=FAc)5$c9N@?1sP?z@> zcSEIOjBDdZF7rZnQGcEifsG9ojGX;7 zkmO|7o^xb2E zaA3PJ9uLu9UyYN^bE@T%k`fI&hF67X4h{}oU0sFc<(WcW9*1?NgSmvBo}LgJegx^% zH84Pp7}#GOGCV!nzH;Tt{e#TG)t)ctAizOn{6sKj&(zHB(5dAk{xWWmJ4Ak|egy@z z$;nCRQPwjv3yzH?Fd58!GhF!Qc+k+alA3~nGT!6Ya*Qm8SuZC78Jtkw*fGlaQYVi9 zG@65jW;)1bc4hw;ryM!lkWS*L)y#T9KB+p3F$?d>D&N*FjdHDOB@5HF4n6Iko^ozl zZ+?9zjf;!BRdI+bY(A&CW68w%F{JhyoADn*W&7NaEHzo|p=+++9q|@oRNtm$+E^ZL zif#m+Kbq_-HCeR?S{{nfB#yCS;>?!N59TLm@$w7#Ql8&iwD_RvfZVgSi^N8H0+DWZ ze51l;H71l~6e*sJkgXu-9MP+CWoJ4dQj|ar-hnHhr&nIsrTmn&FRUjsKt!jU)v>zi zAv~6UR#-%j2zXYnSjibOV4^ru#KX z`m>tA4+(UwVKF0TH+qq;Fqq8ma_`-W?O2%^RyR#OB=AA&Do-PiQT@9wJ?#XtJ;+5< zdo7`s@{kmHj@;aZ{{?p{Zs5}~>$ToA=!#QFa}Hi#ZF53EU`;=SoT#!(g)3{x9~!pS zUtWmT`CeQMQ>XiLKRJw+DW*53${OOVjkhaY2rjcYM$Pb_McIdPR{61;%c|?V(eF-Y zYm*47_bbg~eB@!R%SV7%is4^kt3oH?E+p;=&gS76>ewC0#~yz-z0rLfDTMlVW`f-= zNooq!88dP9P6g6-+M?df7r~(T;(YXJ1m5iH-B}XGB>rFN#Z{ZW+0Y0!RdN;kQ+ac$ z9d)*{%}=E=_FtlcD*T(P=-gyW;$VD(5{_QyAL1OFQS#Db#q#XK_Rd~L$X>iivx^mo zd;My`$z$PgRqD)DgSY~Z(B9940MS#lsB`QCX1BScF(?Rzy!?IZNm&GIZ|*NHsCh`ryk+rwUBA45o2 zq`mv=1x5M`X6sX#!Be~Vmu+&Xs>s4(N&9GdF z)^BOodAQFBm}OqC<>HC{h6bWmPoyE40WI{VvxRnT+G?!Y{>OfTbSnWIxhg+`8H(~b z3|W7}uu)~7==2*tl7nmGQyTZL_ROrUt&NWA;d$aL8kY=;58nj03$k7^lF&?dStJnEw zolM!e1#BOpL4xeDdmMjOkG+_m&zw{DXxTId=E?qK>sqyXWj0$ua7v5GtYLWKefh1d zM^{pKx+-Tq69u=qeq@Gh{aCGawAnHB4N6v~Tl~tx*48!taB7wz&urUhBEJ66jM{Qj zRm(}8;1xA>s}0=}lje)boUPA%6apJUnw+95UJ=Qm=O<{7CqpC2*(s70Zs6hNKIwmJ zX!5iDLsxEQd7e}{CXo`JGF`F+v-uKRr5W7&bp;Yy$*N|1Ri7&+oG{#RN~D}LNnq^c z80HnpN@lp@F+ItRubbELq@4xczu7zq3SvJN!uvy*sZ7T_L{s?vg--SdR*kP` z5=5mtLSs?iqU1RrU=Y$02w$fVVR`-PHG0^d4sYRylBJ%cU23nVWYcX+wAw_M&CZ;y z`NbF2l1t?`*VL%{7>7tW-oFX^^GswHzt)2I;y#~6;(K4r9FJSoSC zl(g*3MmPO&ox^H^Id-YuzM5#Z31T7IRlxoJYK%K_N$?tnfpV@Q!^`Q{zipiEvSCR# zjh=r#R_NL65H{Bjxl>?M;MNqex(uRJrQ-FEO9^cQ|xDgSWy2Rd5;S4nPDcM68z3 z=bMpMMpz@~t?41eIC30N&!2Ie*2=$<(pu(vb)|x%+a_1sWMb(!KJ`42*Zq2XlAR`^ zx|Wfxc4}~{f&edm(JfE4Gi^rm*vMAfT(dULqS`+9f)ZhJsGIuK4LUnPl|E4v)Tnlh zaT^;%J!(j!-nOhq&*Ic(lG#j?ye6i#lJBGY4P?=KeiGbqX)$M_ZZ-R^-NHwLTI*WB zqxUZ&dY{@nvr6mR`-4__enyzE6bGKglz3t zs&ZC^C96MH<_B9Lt+pB=r)u-FtOZ5C{<+7K%R?ViF&rTL6EU{F11g5uPMHaMu-iuT zJe9w#8PQ~FGilZ7;-8Q2(dQ7j3AK0Azcom+IosjRs2>O|>A(9VH}_p%x{-Pi4k3Sl z^+B|RRFL6#7*4Ln5#dWOd3axMPTo&P75DQs`I;;Q-CHhvZ6EXU5`#5**PE{%@GJeP zTFL6i=u!s5(5tsfJTRVxmlLfHn_S1wQKn>j5e4`(%-gnPeVW%TxAWNk{A$b-&B?Csawz-)J{|c8tT&>OM#rwhW z+$oHcZ`(6)!jjUZFVyRV^|i#+FvBjUcjo>o!b$xO%h5B zClNzz5;(tWfbUpig6<&jx~4Zwc5>K;7DuVnHzvus$Z(hLz(U)vwJUKj33)dwH@@;J zTfH`7E_|ZGe*5O;UMH{DXR{&qntlt%tVDTuKM1FOG&g&2a{Oqp%k%KqCVCf3SpV)~^LRRNH92yhM zY~?T`V)|7r6~AB24+O9L?=;ad4Sm+%irBb!tFT>zUk47(E=*nq^WMeqQ3mOQ_#2B09;4Cx%Ti%Ef+PuWq8zi6Ru2(K+?uUb+K;CN8$2ax~_@0 z99Hq^pSpQi&dI#g1|D!w#-}(WejdaMp1(#Q2K4Stmm+~L3lL^0q=+&C=HPEzo1W?`xd*S0FMYI6^=!08$Rjwo5MnLh)A3aic=o zz&Hl@N0^nax?}}`dPg4yP%El+Z70Xa+XrJ7D3WPqs6c+cBRWf~mIu;ssNig(+JShm zj%anX)I|B)i%T%s2(k$6&dg>nqfXUgOC2Vi{M^q@ifk6;0FW}X<)@4O-alqwrXJ${ zXbN3tz7a7`b%*l1#VQ0jb#mQR*zbl)>uvoVR~}PR-6Fg9kd%T9i*V;-1{qGoNaCjN_fVEisAr5r`>Q zZ{aV~weh=?)OC32+K$(Mu>cR6o8G2r zTn{fe-d%*c5-B7*CtGaw6(ihYE@RY!xDx*$U+s(Z>` z881@Q{b`%A_x6{YZYHe3{OZzv{+Vj__V;FHC=z+_n}3n6j+E_lg^*)So43nC+Bn_I z`^vnq|8J{{bGMi$uP-;i=+QvUNf`N+A^T|uP^+y;m#XDFxIt=&5)nmk!LBFEnI$kO z$ao-o2IeTh**gLu1dfMxi%l*?p!<_Won)$5u%)HtXSGseD4XxXb>GIrQ_`t~jf4`1 z6f6Zuei}U1VGs5n5Q-)i$oc-5oJ{`qjRuW~)6^fh4**`7tK^3Yv~e5umiyv)?C64t zI2t=TZukhJM(vr6mb?Lhzj^<&baE-6RjC;mc$C z78df50>Q?;qUF3y2}FXWy?q9-W>DiMPgi9W1SJ9BN-~vf!hO41DQgS96*YpvGN`Vw z>UZ3QocK4@JR*=q$g;7(H#R0~KP?^sP61S~e1TR~P``Kx$rq1{^NOmfKadg(4F$$v z>v>%#!8IHb|G+>j0w%4uK#|H19EyTMo4l~St?-7Ti-dPLY+l3v>u`ms0J1DET|ZMR zh(u7DM})65H`mP4@>|T}{@k1h&$ZBYm*e1}h#@8`=x5L2G z(#O=)vrt)vHJ4Hz`YhyyqF0xfm&fbeK0!T?c(U4Y`ynt2)Bwu7j0YC+gO}F`pl!Sk z8)>e`J5HAoaC#SC=eW;z;OA>pHbU8cxY~h9C0qID{&|*C=6!afTTn^$9fF$E_TgdM z)Kp3U9yP1oO26VJ0&u%KczBmAZEWcGhUEp0z27wX&MYh#^zYf7eXA%aV1hk@USzUU z2+U6b8|zAlKE%~xW7FIz0A6CSKpO#DWqs8L#nGWg|2=-(%)Fx&VcqhkYoGOCk|zK2 z=Lax`$G9Tj88&bhlo<@Bf#;%dPA@ONb42v_-|gu(*xKDiQDBs8yHg6$P+j+1?#r~< zoa7fc-D=Xl;{zpDwoH~HAH&T%A7Z5^s$@y;j31$0N+Q zZ)&<`G*rh6Q%XfdeQ%T97Iu6ExY3~vDFG>|kge?%Lj+kQwM2nD*5Cf)f^PF1khbrPtOb3_||Nd97wzY4jENYf6nu=5=N&^I?iGP z{b>Y~K_SQH?c-xL(|C2#yc%XSIpkt9-sc6r-!NO6VPUc z(C(l3)anD!w3jbm-rD)CpOM7xVxRxms5OQ@`;SIJ#5i%Q#;UjX6*$wP07$^dVtvT9 zXwNr|%g zL{-Pk=lbCqCrX#|@vh3^HYkVESSh}w5URZOhdTyRo^Y3!j3DbBu&Q2d&wvJsTRG=o zv!np((7>T%L-paW^??kLMy0iKmZA^n=h7hF>IgI;JSq*OXBgGyTbT#&kN$mdoiN=(+)Oz++h&CgnB z2~SS`1=+pVMY>lZO?zn?j8Io;+s1K8Tzn}f3V(ebfDrW`36 z5r?s|ks{-n)rBT+jmL#Mn)BY0XL`DRvUMmg;pmt}y(}>KP{f%9;lRKQ&Mhoa8> zILyc6z_eJOpE`khrq+HX3^fB57M3r%lo)iX)}Iyh|`k z1a?~aE!?VRwW~0;a}gE`l+U6wKa6xH<+a~xBloa8JFx@qPXZuZdiu^VlJ$C%j~AdN zH9TLxR-(Bplf;7$#Z}cjwU!i*^Peq&1eH#^R9qI5Z=u+V2DK#SH;q?#po*G%;(=V} zQdCmfJ~+sLvsgJv%;(6Q;&wm?rf~)!`hFPJAnye8TCtb_^qByta}BI0jA&J)Kcs2Z zV$$2d)*BnFu$sLbYGq?H+u(_Q9OC#XE^f|6i;9X0N^4=@)|%uUH$iFY5_nE!uCFmE znw8{ISyB!1ocnWCLK727HYNfo_%zDz@pE$0!Mt>DZ=|>HWXxv`SS9ZUW?@5sL;qA= zyLrDMjN&=yPqXC1jj16@v3LQulSk#!E{?L+(Cz_bmd@eEM2m5tyIFN`a5vt%HXH@; zhFYN~M*^scqwQG|Ui%=R?rrAUZ-!cP^s2dN=bF#YnR$76 zoewv<0dz&x*dWXO^DyoMS>qD&2`z0_e+Pfas{UH7g2wjtHk#9&TLMsMv#tzri-U#$ z3I#29Pp3C~`zs#qkg&VIs4!I?I=kBuTOe_~gAYqYO-~=WwN>ry=XdKinXt8WgvMRW z4xd}X;wiGDqoXI`ZSEImhc^jXAIm#gSXeYRHD!S_R(HwC%7aj#CVDi2Qu?OQOYldb zA0ZuPRe*a5)hNIfI~>#s+*e%PF-wx~5)%{i*sn>zWGif3a&V5CQ9=M2dLX=|>rzKA z?6#(bz;VY}8q5a=anTTj0)-92Zq1De9`}ZhE)Yl%sc$F*Rcf_P61SdHynGcwcD5w` z=1dPp_o6>jQ%gW?qj$KP{Yv-OW9?f6#6B)I770!z&7GMH_V)9gjMtUo|I8_)Q&Uge zsXID)8WC|PWkf)Q?y<^iNr_EN3hQ2s*^7yltf%w!CoA-5_ZT&dUh$r3pWLn=DK^9- zCRSe(JUg*@4|F-&)=no=F*u5FfTh6-03`}U!(uhTNmI(p9<_`S#)q?BBDjflH8jnI;}1(? zd4gpnOXQ08cRxReEJVmAuhQ|^D;hyFUa?0hAtZcDZQowH?ELWNI&y0&7_YJ_?HYS) zqMn?sk_5LkU?el&8u3}4rk)Rx5uuJ5oQKmqEhP#P579J7N zjb{Kd@49KHc(2y)nK)uOOT18q!M$lHv~Bq}<<#N6OTHjqpAMK|D8!A1X;w2EK(TJ_ zjVK`{4i?rdkk?mqU~7E@#_tQd^SytQjcig>RIIRHSF200S{-C~R<5c3F52a;UVd!R zp_tY3P|vCZ%tQxkZB44Kw%2zOJi;n}oub*peW-#%|EMDL_+1+&CwZ-O%I!_-*#m|Q zS+Z{4)RSV@W!GQH0#u}wsQgw`9_Uk|^CQHsUz}CRa3pk0Ogd415McW|H3hhdD3b-u zZ}MTO8Uus4)5Q%iyccMh)xFBi%1(y5Ehv~)wh14I}ILbx>So&sGo5Enqj z8`<*1N*O>>7!3uK0%x=6T<@?s*`KWv2n`8Uw#y$cQO!Y8w*Xa6JQ&ZEMKSqHS_}Sk6fRQnTQM2m4*mrH0bq*XdJ_+dIAz;+d zfs6}0{7pw+UlclKZkoAo)*gO)RrC-O6B9)>fG?W>k#u-eln9KD0~ZyA4MFQ4p~3zB zJoUqH!eM|YurF;xOT|gM2{^l`AoJ#r()nh zAWo!~Pil>EiTb03a!Idht~QQ>@!|l(MEKP50r<^9XCzpLT)gHiBy=6C8II>;)k;W~!i|nm-EjDHl_VVELQ9H(-+h<);R4Njh4`Ygm7F5 zj%C!mJPn@%zgOR|zXL^cT~y`?Ee{0M_rdjs&dxxHXyI8n?O@GzWy{hPvtE6FE1CRk z4`A?{DA1^#9Rj8?JC2k^~}PUaa=8rGdq9>fZ1gFJ-Uu+;(;Rw04kuNRLsm_ zFSXt90Vg>>tiK@4sJIvcthNox@i#B(VXXF@Xd950pg{{@Jz=)~f^&D=s!D`Q>Sq(p z7h{0s{(OH4eWyDgXL@?N0U!WtGq(lkPyv$#0y6_`mB%qTN|`tinVJq4{s=>Ru?e@% zZZdci4-XI8yh6Rao`-v6Jo?=oAQipu4ka%|mfK&htc?iwz<7$ACs@>r3674XUn|9> zHC8zsznTSxhJxFnseckrJoF@U^ZlDWC#MH;D)a>R{iz>Q;ic$km=gqx1xKfI&#&cn z@_iX!OzEE68|lmC-a_b|kw8i64|jx8<5}$f-lciSYe_4ILcs^*vjs>e2!eJ{oQ(6- z|C3ul;D@bx#Q;m&2kiy0jBuwvCMJ^L{4sl+yF%#-)qXTG0%dhsNQT_h2YCM1m*;-> zS#+;}$1I+w`Y*fzcyzaXG+flAzl!Q=Jy83QP{Afzavv!(pGbff9%#rw1I6$`D!mc% z9;j?6Y>2D4FEP8(GnhFI9)B9JBA`-r-n{Wt%xWGTMUfmQhnomEyB(l7$Oyxl>M#kb&DA2%`;nW`6Gq*P9D$UC`m z4hoT{Zj*64l#=lyt{g5zslJB>+l@@z?t8Zg370PlkhJPKlmaaA#O00GF@sro9$-kw zBOY)vCVwh#^bZJRDz=f3lzl`?TPY(TE!N@V7!oxoaSVx)cm3aP!vQ=(A_ZBW-A3e} zish3Va=#&gvGqWEp}b#kfFN^K{tB3Fjq4O-7l(T-Y~q+ZV`4q$>muW|vZ)zl?1x4H zelJZ-P1ng>h?9N8ce-+)Y)r^Mrl5#lQzUwF!bC4^ldW9lk(;{kZkcc#JNQp*%7V@Q z2|lW}8O0BtqgW^zb_0y~Vjz9kj8_I`&wR2*5>)i^M0L5XKSW;oAQ0H&wN5r21i8a5 zp4w-O(<4P(;vrYJ7yJceKAqnC#FabuYn>P|e{5)AfJa2u9jyLlygKD*__Fo;v^iyA z;Z(9Q!zJ{cHYc2m^ayea3K4ezYTCfpMNPhkei`2@Z-o87M~8(qK!4;%;V(Ksi$b1% z`7VUy9V+=NG8aRwy%(ickEtmw=NcG49GDrl_7@Gu(97H4lJoJY&!`n#y3tb1A(s%I zET{bTX>a)Lw}#91D?htB==#!3mzN2>y~Px=K9Js9Fi2P3tVIThw2ag53Phu99}_)2 zJ)|UsA=)M6wSNMa1APUOZPyiA!4(yO)G`=AXnPgs5xGv0%o3x@X}iW97s8JbnH1ep ziRX8HXRH->3PC~3l5EiJX0*{8LDgN;W7L&gbpQ_@y@O9EXKMSHrB~tcc)ffu4^vNn zCOTKXrjzdaZ;XX|3q+=-xrN`^xs0V;%2cHlt?7!2w&kCURil!nmz|uQcVJo_E95V< z!0vIH4!@V8)Fu{=iiQXY^_o$k8_e8a&0w%q0Aqe10?_2Wq-bkw}>r--JQ=D?w&V2L+R@hybyC>2Y zQXTe~se0An<5?8KMZ`tHH-E0|cpsknz-~Hu=P-u!T~8PB;^@B3y8TY!$R;lJ(Hw<9 zO7T%;4b^7t*$uC$#P*)@Oo6wi@d4fw> zW1di-t0Ch(N}8bpjL?9O4>+lO01Z62^67)$FFa7GmuDCd^h=cc|n;1UET za$s?Vh~ylJMjw08uz?loLCgu^&wqcEf9CMObRXQ95ZsvXrbcFf3s!>5QBPMB29|Wr zWv?BNAusXUc%-7%x|e}j$;gryCvqxl?VccJ+l`PFOhL|!XUUV|{Jh*joR9k9do0tKs%nO>$=2ANy`rFKkW<=ntx9 zdW*93DD;u-8h;d*cwJXaa87c(eSt<%TzG-4VSgH;lkYEh@u%|PBRB-7?GmsQ{@-np zC;F|p>k?|#cbEx;YdI_?LQK8H0!x&J76xFsA_MY`&4 z@H3WNN6$ojeRTi+`3W!0-E8X7jH4r$T+MyFa*HWQW<_Ea6U_D%E#jF)!m|9gD0w@Y za$Z!0b<^Lweb3tKV{~@Ub_-dFY2R&W`c>BB)8ROY59b06o^I6@9!xl~qfE?4d6Kpp zvqPA2jpvsUq7n;b)EWbnV`srl9ZHtNKcQKt{9NyMmauS`)_8CyEK?%?5@CPE0{;2GB;-F{{yhf&$jyJg{AY(z()6#*{`>MDnf~8i z{#6VAeD^$+|>s`3i*ynVMOM?FSIdhw*~D z{G&sx^K({JNQPERe0U%4vm@59Sr2} z|EP_Vs8cV-g$bv&6GM#2Gg_umwmZd++7bl+x<8Q-m!iWL&e(2|Hf^{?dS^^dlepDx zNtNWaO%19XOUj53=Gg1^`|9zL<$2w9cj5l^TTbOaY9gAxv$CN8 zYTq)O^j)l&y=_aK1Ml0-qT=@_!kv zNz~gIw?mdkRqS7--RMym%!H@e7E&+xuMYfsZ&DeXTSaJVqlHg~R>8}z;r&J`jSpV{8rbmI&4s^(<18kT;mZ$LC4_ny*5V0sL9sx?zjUUiMTtxQQl=G>aL4gFwe z^0WQp@lZCBPtfsD?KN8DzN~RAmwxEas zPzb5>&98^_7FN4b%s{@gSGm_Sn0!+lh<`bGj8?sa-y0X-mnN#-+O76XO^P-1!#OJn zax9_%#dZ|bUtnrt1T~MAkpP0ry4;y!G+aYj&yd`dv>HqK7Xw1A>l;2^q|_YBBlyBG zgTgchBg6NIx6SkQR5CJv*$UnY`}EdOpZ~kL-s-!tQtjlSgmUNG@0Elwg7UTXjipR& zp8|ll$WteZG&kiZlmtWwyI_5+3Ob#CNT2yFzLQ>zb%XYsD;pChUD_UhJ%Yc&F8@N+ z;2N4#^t=2aro@}NKwWAGI3!jqUH`49)c&gj1^c{*DKb&n;(oTR{YnGr_Q}q4Jj&<~ zPB&yzSIIfH*%oBnlN9(9`btE3$K7~(`m6cvh&h{@=cX9=fT|Aww&tTswyxew0eN-f z0h24wfNuG>ZefQfOT4@OCgTCvC#a*4NW;~r3)y< z<XtX~A&_u+&f7ivl^IRmrBcwx__J5At?3EM&VQ7Qd5FmXKzYb&=-pI4JfFdu zFNtH;efYWNk$Bnz27Lu0bfOPEyaCf)wW#7}&A-O-BEs8&X1lUiUY^GR1`sP}qofVz2&|vm(&i1gflI;m2puVf({E+c(Nj*PRQ{%T z{46Z0p$eY!HH~0^AQdz2#Xuz|Y=hqPw?h`T^8faoQSL2N9K&6QjsqffD9xZ~hQYd=ND s`*bMpH;*Z*9R}|G`#)((mk}T*LF_bn)jFf9OAHkE?^6r}WU?rAYMn|M1I5QcAP^7) zG8qJ&41(}M=olyl1_drq^b{xpBn4gr{k0Z{^WVN6k7tU`qO{9AQxq1{zi(w4mHB^O z!>53N?*A}k3Z2<$acE{JiTC*7%YJyIIZ1c0$PY@)D+MZ7!r<}0tU7Z z0r6yNnO*n)OcS6$<&$?0i^pMUWzDaK8P%ZSosc|!R0s0iT=s| zPGXh;yZy^=Ho&mS;D0AUa=}t1+6Ie(V4X^j-0k9!S-`V|3$pY0Cb^8NW%KwhU_~q( ztCeerPQ8GK(n5&c{!=sEWv0vk%;6-dPPQe$cp&qwMq;lHyVu_fo z0R#+7XTs4YtsH@7&~Y#&*l(2Z{9X{-uCX$Kw`L)m3=(jtZoV95HV`lx4;rggAdqf| z$Ode{OrU5nCM8F%P`hmatBJrruh~vO0e3YUDtDn1CW=JmAuG8mw+#tadf6Vb-s)oOZ8#G_=~O`YTnR83Yg6g%U<~kpBXGPL zE<%0ojaabmpQ%I5lbK44N{5splNAUH^TzR_S7 zDFO8$s*z+cAbnUnSc$eX=p?tsA!fp0A~*?&g=zROol^qzVqq~{D1$BGlVNfTNW(GV zgdPnDulE|9bP$*f^dRAI8k|W3QeoXN1|DSB2sBtfj=;jm;Y_fCOCn%IR-hXe%`l({ zY=K@)U~qLlo!=)?L0D9{)@+7@+#zVi4y0MU~o1mj22i6k73y9NS6;I#8cIF8_(l1;z=Ho2SI~5aAJ(yz!mu@B&XBk zbYMw#IRnDSIPD^;+$^BV*-#jWE|p>J5rvg)0__v0@Ahts<#8 zWD^>K!4hD28B#+rn-o+FAwZ&8ZS=CtTC|>khj29_kXGmtgER;moktfKaC9-#=*Cn1 zYzEG0!IAMSwSx-t@mNwn7KAammaftx&R# z%P??60Oth~5sbk1B9U}c!1^IEDi?(8mFi3ciOa^)iG3V5$bdCjTt+kr=GCx_d>s=* zqXIUAh%h@Ocpi%)mg^}HibaAz=~Py}-Xc*^0SZ)dkHG^$Yy5B-kAbiYtwtdhB!^?o z95h6#)45P`CD$ZkG4w1xQw1j}8DyNEi}#qtA}z#Ah3e=^HejZ(9D@!)74jV}4{#<# zm!1yg;7BMslOlFuoJ^uxCO0yCPz%&a^Vp1DtC{b{8e9~S3hfi(k$RFyATSY$1{D#m zf*UDXj@l})kdY9YgXqQi!E6smZ$Q!^et{W>hp=EoB0XU3crFr3C4{OSJed^5HyQ&H zszu@jc$dqK);lNh$?$SONS!~){UmiU~HFMWM|^ITBMC_Mrvdjhf-^d5V?rqST0rTsW~bYObV*QhsYYnR0w$K|RVY9pt3@b*(x@sW zl*SYaynY#uF0}ZCLZ_X=q9Y(ItU=ASIg~);z~*Q;5-|fw6Ot7KHq1*yAp}Z;h@hZy zZDbsdDpRA_dV+*$WCL@fjBKx%DA9n$ex%9f0a!&8d4*^w74OAkF(x4iB%+x){D8Mm z6Fg`X8zO+P7+|uTXC)J4GKWC|Aqiw4gw-l=sZk0V9O%gNbFF4Mp2PA=unZ+srE*JI zbdW;}OoA1HL{PR=Bd}rQbf%VV_P`ZhmkH$6Ipj7AkARS&1r$%<8uLC`NB99h|kctpy7TPV-LM2AHRU&6= zSaOgRLnre@6cdgIc%r`!Rt4gr!6KX+*f5P~)oOJvItIaT8&pD|MGr&xnP8z@sG}j& zSiVhcb~1D{vluLJil7!S1?pu0N=Ot-DH^BJVlyb2PK?L}v{+4CGn#If1Lux#$f-;n zglz*GtR6T;D^_a*W)>A@10#e&ij z+*G@kD)2)^7y%pz78pQBkr)Q&@u4_@!sZ9&B?2)V7DAAF{bY;FsnAn+DvHl0CWyIM zGF^rB;k`1c(c=S%k)d#EouBJfh@5t2NnzOa`J-C(+Na>pW5@TCb)FIT*6a6A*1Z1t11% zm!TavCdv*xx|Q;P^>!nmz?FxytDzv^fx*C;L~x5rz_QwOIEaA+apOT?JQVEJdeK;m z#iG=x#B#OA?MAVADwP2tbO`Jc1xAiw1i}C=QDw9$#ZH`z!iJzx9l zQL$<_M2aTylp2SgDInv`HYE)&_J{)`wNML@3`giCA}-!45*rC(n^)l10&fH^hL-_` zb5VhKfrICo_!bwiEiui*(F=807XvJpf_+eyf=QDag)WfRFW`a%Ac+S`^8$j7WnnCG zCPv1>I6yLx8tp^jAua}i;3JFZBr;#a^NXM)pc|bJL@ih`nvNDh5FE5#sP|)q3Jb^p zafp;Wq#a5!V-Os$7{%sFl~}6Ws8MRrPAE$T?22qtfDKME459)dU@#-XE)p9wRH;hO zqT0=T9a6@V;^;Otj;m+Osa$@*E6K!4rvyZE0#ZU$$z&unN{F&*6>bE>Pq&#E3WCEe zWB4T$K=FxAl3(pXODPnS!iL0a>0B|!;BxBRrhr=kCL`jVJg^F5uu&{*6kIQq(x_e{ z&xs&H>>4uzX_CRM3=v+8b?{sPhEOd+x75l)S=kP_8Z1ZYrARlO4X5&vas>%XvpSI! zf{La9BXm}W*`oKsF>t*}f`=*n0k4cux)FaF1%uLk3}|3~b~SJTN!cKzP0X?>sAMt& zriH*TP7j2~C6Xi%fnO@rF--=$)M){_Qea{=3e0qa&`=h@dZHMNGD9F_q8x@XBZMFe z9`JrByN5+~NhN?TQ&Cp6%Z+EDJV+wUgU}*$be$Q*Q=l1GwbW@ed&p=tkYy1K5Ht-V z_ZU%NBL(4OflOY8!T|_1)&fP@`AB-eaC4y^Jd5rmlc7SC8l(hxpvGF^JeH2bprZ6< z6hUqAkv%>$0_6p>V0u4`$OGg@f>L9sEQ}jzK)RhExq$2esa+tFjtLVP?IfwiueY;- zb%+F}5ez65me0^R2wa2?ickW-Yy`CdZPHm$A|Rl1s$n{=mCq!(X@FW{p?DOFtp^@h zWSD{h6Zv#1V4GNoSc~)n+eNEEXstlWz_4gAHrylC1ylt>a&jybgB&B~n$%{x7UR)l ztPH=4@Ai-+R4twAR%6h5xQ6D?u<1TH&E#kMc}_A@CD7S`;UEngEd%K|3aA_S1*EiC zmqvtF2Le_tpXg%R2|SgMM|Q%!941lfQ$dtKN=GzGNOm(ANHzQfG+Bc4!9aL3ib>|N z>_E(Bba<3bC6^7y2;_K)fMGRAfW88y2;hjq%uvaw2#?U=a|unaZT zwi9hYvPAR?6>yqE2-mo%TCG4x5+M|TyWkM$2mxCF2M$E+VQ{EgED0t=!emsKRx1&b zaSA((FBKZ?WI5k1)eGE0noe$$8>x09*y}O5a7CFT`3hnu}HQF0{7uSI-$t`)|NgOR!NVTvOLcQ0Cqnf#V7D9_bLOo!X)PpsfJv6DY|l?WFQpkgJ4=>lL81Kvqv>(Mj^ zOpAd_sZLKoyAcEe(j{_(aTGaG$0quKCI}s{YgiFMZ6*ZrZnMJl3_%H47N3cL5lg{pa6o2kbf-y)BdPg1m>&>h3XK&Y~qJfO@ z$oxvSCm)C|LQbS(IT*SD2ZHdVRJVo&_K_%3qfY0> z5xG1+4=a*zO(?pQsj}fXwSgHo3}6=b$-QjY~-~`y^f#L8>-s zBrXEQ=w=DjP@Ns=$LNtDfkuTCA`nIm8p=i>bV!&3i}Tt2B8?6JWxy&40;Gb`pkgB2 zg_T1Ya4Q+d2_RfVxSa&!^9cwsLd^x!-83Q-q4OL420IUBhxmc0%z@$(0^X0y@(Jj2 zf}ajS>F{KePNe6GP;M^KAhRO8N~}}@qwx4Dx|t}3@wg1CMy+%+;VKUu@S|*)!Rb-) z04*SLg#Z|2&^g!`rQE=`^Gqg%5+$S~I94Z{V+UEW77c*Z*mMwq5ogp1NK~Oq2eoo} zEQLkuM~ay!o!O>W;%org2bO!(Xtf>3v!R`Sp$|j^leuP*kw6miunK=b#5{D1Tkep1 zZAc8DHbezaKvrnTQk=(6Q7Yh4tDGmZLSRq=N<}4ucrdb7hr{xTV1x_^tmOd7Odf*l zSIc~MnoWRofRR=*Nb4e#>=v>`C`5r2EF?n$$LiTwJA|O|@WeI;gAC^a!et=?up-=s z#VHQmkf@g>WRq%MDm6HOB2j_ybQIsTnYVSfpGG zcu1mzOVeX`0t1aL;u5_&n3X|Aa_oK*)q{ZecqoJmX4G13M!b#ek|=2orx*b{skE50ZTri*)W&RkrB)kzn-IW&(_=#V02X(={_5DXQXv1%_yjx__hgqrDBORX@6%7C;2Fbdxf4j2qzs}8Y>Kvj!~ zXq*Jg<3=Ry*$Li5~9FD~f zWF-hmAZkSi>>3AybOS^Y0pK3E{)gTF1@eL4|5F@+62kwfT-2pYL>CGk!}lh?d(x-k z0IwtQqp1)w=*HG@s;m4peM32UtG3Z2ahc?(4aM7Q*-h9Q{H~}qkvtfO%%7;(b$NZ{ z&pEB{&$PCd*Z-Q)@Ok>Juk$Kj@9XeCxp(?&!RrU}-q(*UJUwIH{-eeI@2}R)VGfzO zYomT|pX-;k@`&J|9^KMsMu5HquaB6ObEtQUcIdw?ffuuJbN4RAmsU5G8eUGE*!OQw zpdHd}Ao9hJQHvt~XE1Q9nbr+cn*DX`iZ49_(*<5k$4AuWk6jop=>1vt0ng?I!F#c-^4r(8o z9wGAgozEZp-+r?#K(7%Ezeerv_uo#trHgf0* z{|;0POkX$VLjTz%5u&UWvnxjYU8FT6tckSs>wusE-O@`VgBz*$wys$Aztk;VJTo_L z$btHz3;#{YTwaT2PPjn=xC9HvZQV5&UKXu%-5)zjr76$I!5bK(CYY zpAR1VFLl>Pbeno+Qo@9B!C{YpSCC^rV$1%Q%FdAhD>h!r2Mz1=YZre4RtFgNV%pzT zWYGXK4@PEp``>NO+}bDo{?Oj#gO5c2UG8~Aa6{hnt;1X0Lx5>cE_L4y{g0z`P!Bn8 zbmQe7qdwhu4D2^d222Y%zkp~f$^vLD>SY=_`oF$Cx*eJ@&>o}4{AFtuCZaOB3N!WT z`|$v6&LQu2$Nfj!`nf^XyHK_HeGrXB<-lG+=Yy&}JD@Xn{>9!# zfr~&~z?9MtMuyi70HiL22rw+Vzji26A2?tAb>g`y!m~pc$I^JL>8_2AYv{$Z`1hX9 z2Nd|$@~M^UcWrh*EWPs}XIWwDmj~?)e|~$er?$1n({ZznYhK{`tJ+&kkSH1`Sy->hsFP-``2QD_-Y)Q5O`)%8E$jEk#fkKm1835D@9h6R4`>@-2e~q- zxqkj{hyU}YhJ-R~d`ipD&-E0P|>NMR&Oy@Uz)ag#=UJPSC2jQ=l73WEy-U`*4%qjabei3 z9rIdGdkzu?efydCyKQBA$(&#Mv*7E^j_yLSZ|0^MpYm4j=(sz}a+B52dH49PQy)&o znNBwEYQD{5ZQh4cXg8UTQABf6UBAEYJ92GfCBU{_Pu!0tkGR-*Ab($F=Ud&*d?EG6 z`{Q%sTlO8f8M7{F6?5AAGUumDvBh=BhJ-WrTMXn*Pvz&$&8J&aE%9F;J4P+tlvgmd z)mK07X2-obTjtJtpj!9p*y&f3EtKO8Y4gV4%#9A(v2y;;m(3NQuWhEde`!==F=T_+gErhq7xsPjmO_kO+9pj zIBI98P#pPHl-K!lQTS}+1Lf*-{ZADp8YVyVzRbCW8#EoZ_hi|u17Dta8rr{}`7?d9 z{qlsOT~#^Ar|T&)gDGyp=kRpl$C-Qgo&NH$dC>fCxUmP`k3(G8f1^(l(L^Sl3#jw8 z;3XaQ0@oXqnVB1>*yreXEY01hEEI&W7I+Kb`$nnR3Gc{%mukYSV z;7a+#p0H!<41C37Peba4T;H#jIa~T1irta|Nd+ERt@9dwj1TD>6rA{{I(A0h^zdPG zQrh12JOqecF|Z^~<%7z80KMjp_pM0${jIEe zFm0To_1Gixl|NHH2Te&h>js3)d7DF0VRuotMr6Ekbv74kw(s3LFZM+9@=@j!k-r*a z6E|Fq+d1P;XMPeU;<4}b<_%XzF?7e1f$h(~qC8X?J{deC_{ZIcC;6|>luJIIXxeDF zIk9Bls*4+a51De_+DYHKPE#|8hY3TmN@EwK-q0BX{Q9cYsH{9M-a0KD3Q( z-I%m)w&w|a9swi_8PFf5to?Ll>K4|Dys7;W#J9GKW7g#)y}11uuuS!lBbh5l6c5|$ zIo&e5*|FtEQhfV$+!0dxe5gL$`z+m9J@Mo|- z`d-&n*HL0OugU4*(hfI5#6Lfk^=N?Jb8toNQ579BWAXK{*3SYmcn&J$A(9qT%1Kc`8@C@5>e^3=0m)cv`Wh-FK%% z^D19-E%j@0;xFAz@e|FK)bV+7wS5&MDQCN6=7U>y`~viba*LIiIvyT&=FHDmQ+pTG zou89ETY=fqwgkK4amweq4N9@?LMZgc0#FHcNI7=uxK&_jtmt;kj`s|UpJz_o*B;7g zuwR+H?$L!uJ-{)}nv{-xiTx&*vD5CNGM4(ZN%^*{j0uf>pXB9N@Z67W7ZVzmX|4dr zvuVEiY1_WN*N)#L%EJ3Ad(_F7Pew={g)Ae3U*7))>3v6&);9j;m#JxO%O5=2O?Lg> zFeC_~Eco>6`FnZY2K7eW$a^dOnqyK;a>rhg3fs~>{M*d&Mf+woo%~)jD8zI8v7I({ zRCwq0#gJY{>JYQc7oW~+-FyxGx`6)Hw+<;t9i0NG@|Bi;mT~Wqcf);+dCofm(JO!U zg~J2WT4ps|R?1KLD(?tq?NqIsji?`v`UkhAdG*_q!n;FMH_nA|Rw8b^4)8UZRbogv zSMsF7+%aZmOo8sCHrzmqiR!dd0n>#I5SU8ed(%Wl-( zm(@->dYh{Q_)&KwdF z?@hv+_|mgE;PO{%XQ`tWk%ATb_JoJ|1TyE%^sdVb=E9gTM1|H5NE%AhO>s)nl zp=U+Hr&>yV+wSYTu-b?XdPRw{n_oOXH*;8N&BsYfYFijMt0XeEiB`h%R(I*%wyEK#`h}^g zcDQ_zcx%6I)de@R_LfD7g8O9)@T+aJV@0`!rYObjpZq~D!@x_WyRcCYxuG)JoX(r;Am`+j z=h%<-_od->*(I)BgtDF;}i(U6o!|0OwtLSmte5zDX!?Wzs-~$iqK0{Vy z=a9lvVXL`s318N9Tt1lvo3uT-$IYZ0CoG<=per3)V;5PAq|TX|7uE9SGjm<)D.DTcPWbk0 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

^ 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

*#<+<*Qa8Rm_~(}F4_d?kxa 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

    BzBmYT+#&pS~wI@gH}X_0%K8V;9iYuf>( z`)U5c63ZR)gXa6qK5+}JWhazpq%k4+ z4+Q)1Sc}A^>!?Lnp1naw!kR<13Tf~cwSAsbIivKht1Z5xo|DHG=UM*PT2UBua251y zuF>A$(0=~y(jY`vGGQ>1p=VI5arhP>gFd}B8utyfpQk?hIHWd9C0r8t^2h8Wxo%T> z^EQf@$nIKYwjG%&6kos1`&vqu{|+hj!4KmOZ+)e}WQ_y)_cnv2mdP6U=cdW3xE75c zJpjW}T!5Ky9N3TFe7m^gi|T?;dOcU<#&~%M(cxl(K!!)>c!SvvFUs&55DEy900MDR z-@g0yTX0T>?K|5vuH;A^&=mmOb2!Sl=c@##sWP)jD`OTyLb~5!nkt>Wr$wSuUfg5q z*=JYo304jQR<(L`T?nCA&BB4WHo~I!smZpV#(LJ6)L9F@JKT_ht%lP}@?XcuBOYC) zM-RbWF5cJslY`uO>%im&tV+B^C8aRQA?J0)j?=dF!NOdA{_u0T0rt~b;FcHPd=c?$ z2_eYrN2~SF*)YH5p3j+WKf}^DFyU(I`*UhP?_Aa%^jf$>wl&p08C9Q92n5r{m41ZQ z2a6xB_`+)--*gJQgjr*t*1j$sb9X;VhMX=Yds zUltcm;0*w&NvIEp#8-5o1MAExj2|)(BbQ8<&EnZ|C~H1ON>q->ex9$1*P<2ENrhY` zLry%8NdpBAiFTKsc`-41(kzphwR14ia&BU)&&i|UtYiMmUp*}rS)y{VBbVdp>EW+0 zh8Q0|y;0ug=3EY*BQu^Gt&#(!iB#~JGhHtShhHi5gHxpk(Dipd@M}|V!AI9VpX~uuG3C4bQG8J^~_zq`41#Y8Ds`WnfuNb-DA6;mrO%=wEt;nExDidZx8D=Fa