From f4090570b9adf59dbc379758bee94c427152993e Mon Sep 17 00:00:00 2001 From: jineetd <35962652+jineetd@users.noreply.github.com> Date: Thu, 2 Nov 2023 11:02:45 -0400 Subject: [PATCH 01/25] Add the validation score and training time for create_function in XGBoost (#1327) Let us show the validation score and training time for the XGBoost AutoML model trained. This shall give us fair enough idea on how the model trained on the training data set. --------- Co-authored-by: Jineet Desai --- evadb/binder/function_expression_binder.py | 2 +- evadb/executor/create_function_executor.py | 21 ++++++++++++++++++- .../long/test_model_train.py | 8 +++++-- .../short/test_select_executor.py | 2 +- 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/evadb/binder/function_expression_binder.py b/evadb/binder/function_expression_binder.py index b6427b533c..bbc0f6cc53 100644 --- a/evadb/binder/function_expression_binder.py +++ b/evadb/binder/function_expression_binder.py @@ -112,7 +112,7 @@ def bind_func_expr(binder: StatementBinder, node: FunctionExpression): if string_comparison_case_insensitive(node.name, "CHATGPT"): # if the user didn't provide any API_KEY, check if we have one in the catalog if "OPENAI_API_KEY" not in properties.keys(): - OpenAI_key = binder._catalog().get_configuration_catalog_value( + openai_key = binder._catalog().get_configuration_catalog_value( "OPENAI_API_KEY" ) properties["openai_api_key"] = openai_key diff --git a/evadb/executor/create_function_executor.py b/evadb/executor/create_function_executor.py index 52a3f17c9f..cee6035f68 100644 --- a/evadb/executor/create_function_executor.py +++ b/evadb/executor/create_function_executor.py @@ -259,12 +259,16 @@ def handle_xgboost_function(self): impl_path = Path(f"{self.function_dir}/xgboost.py").absolute().as_posix() io_list = self._resolve_function_io(None) + best_score = model.best_loss + train_time = model.best_config_train_time return ( self.node.name, impl_path, self.node.function_type, io_list, self.node.metadata, + best_score, + train_time, ) def handle_ultralytics_function(self): @@ -586,6 +590,8 @@ def exec(self, *args, **kwargs): ) overwrite = False + best_score = False + train_time = False # check catalog if it already has this function entry if self.catalog().get_function_catalog_entry_by_name(self.node.name): if self.node.if_not_exists: @@ -648,6 +654,8 @@ def exec(self, *args, **kwargs): function_type, io_list, metadata, + best_score, + train_time, ) = self.handle_xgboost_function() elif string_comparison_case_insensitive(self.node.function_type, "Forecasting"): ( @@ -674,7 +682,18 @@ def exec(self, *args, **kwargs): msg = f"Function {self.node.name} overwritten." else: msg = f"Function {self.node.name} added to the database." - yield Batch(pd.DataFrame([msg])) + if best_score and train_time: + yield Batch( + pd.DataFrame( + [ + msg, + "Validation Score: " + str(best_score), + "Training time: " + str(train_time), + ] + ) + ) + else: + yield Batch(pd.DataFrame([msg])) def _try_initializing_function( self, impl_path: str, function_args: Dict = {} diff --git a/test/integration_tests/long/test_model_train.py b/test/integration_tests/long/test_model_train.py index b1afe562d9..55c5b5a484 100644 --- a/test/integration_tests/long/test_model_train.py +++ b/test/integration_tests/long/test_model_train.py @@ -138,7 +138,9 @@ def test_xgboost_regression(self): METRIC 'r2' TASK 'regression'; """ - execute_query_fetch_all(self.evadb, create_predict_function) + result = execute_query_fetch_all(self.evadb, create_predict_function) + self.assertEqual(len(result.columns), 1) + self.assertEqual(len(result), 3) predict_query = """ SELECT PredictRentXgboost(number_of_rooms, number_of_bathrooms, days_on_market, rental_price) FROM HomeRentals LIMIT 10; @@ -158,7 +160,9 @@ def test_xgboost_classification(self): METRIC 'accuracy' TASK 'classification'; """ - execute_query_fetch_all(self.evadb, create_predict_function) + result = execute_query_fetch_all(self.evadb, create_predict_function) + self.assertEqual(len(result.columns), 1) + self.assertEqual(len(result), 3) predict_query = """ SELECT PredictEmployeeXgboost(payment_tier, age, gender, experience_in_current_domain, leave_or_not) FROM Employee LIMIT 10; diff --git a/test/integration_tests/short/test_select_executor.py b/test/integration_tests/short/test_select_executor.py index b108150458..c2ac348c78 100644 --- a/test/integration_tests/short/test_select_executor.py +++ b/test/integration_tests/short/test_select_executor.py @@ -108,7 +108,7 @@ def test_should_raise_binder_error_on_non_existent_column(self): with self.assertRaises(BinderError) as ctx: execute_query_fetch_all(self.evadb, select_query) self.assertEqual( - "Cannnot find column b1. Did you mean a1? The feasible columns are ['_row_id', 'a0', 'a1', 'a2'].", + "Cannot find column b1. Did you mean a1? The feasible columns are ['_row_id', 'a0', 'a1', 'a2'].", str(ctx.exception), ) From 21aee56022143c36dae9e224683cfd464ba77ae7 Mon Sep 17 00:00:00 2001 From: Aubhro Sengupta Date: Thu, 2 Nov 2023 20:37:10 -0700 Subject: [PATCH 02/25] Add test_eva_db to gitignore (#1336) The environment created in the setup instructions in the documentation calls the environment `test_eva_db` --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 1a091b9894..697a42a819 100644 --- a/.gitignore +++ b/.gitignore @@ -101,6 +101,7 @@ env.bak/ venv.bak/ env38/ env_eva/ +test_eva_db/ # Spyder project settings .spyderproject From f56ef82f2e0dcdbd559ab138b395da68ea28c102 Mon Sep 17 00:00:00 2001 From: kumeagidi <54588820+kumeagidi@users.noreply.github.com> Date: Fri, 3 Nov 2023 11:35:20 -0400 Subject: [PATCH 03/25] Fix #1333 dependency and CMD in DockerFile (#1335) Update the DockerFile in order to resolve dependency issues along with fixing the invalid CMD that was previously passed in. --- docker/Dockerfile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index 325cc2ffcb..630b1dcb19 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -15,6 +15,11 @@ RUN apt-get update && \ apt-get autoclean -y && \ rm -rf /var/cache/apt/* /var/lib/apt/lists/* +# Install gcc and python3.9-dev +RUN apt-get update && apt-get install -y \ + gcc \ + python3.9-dev + # Install pip RUN curl -O https://bootstrap.pypa.io/get-pip.py && \ python3.9 get-pip.py && \ @@ -32,5 +37,5 @@ RUN python3.9 -m pip install evadb # Expose the default port EvaDB runs on EXPOSE 8803 -# Start EvaDB -CMD ["eva_server"] \ No newline at end of file +# Start EvaDB server +CMD ["evadb_server"] \ No newline at end of file From c296318c742ee431040b38487467d9632577f083 Mon Sep 17 00:00:00 2001 From: Chitti Ankith Date: Fri, 3 Nov 2023 12:19:39 -0400 Subject: [PATCH 04/25] CREATE INDEX IF NOT EXISTS is broken. (#1337) This PR fixes an issue in CREATE INDEX IF NOT EXISTS command wherein if 'IF NOT EXISTS' is passed, we had an unreferenced variable issue. Added Unit Tests to check the correctness of both the cases. Also reverted the index changes while merging dataframes after vector scan, as it's failing for some cases where indexes can be undefined. --- evadb/executor/insert_executor.py | 4 +++- evadb/executor/vector_index_scan_executor.py | 9 +++------ test/integration_tests/long/test_similarity.py | 17 ++++++++++++----- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/evadb/executor/insert_executor.py b/evadb/executor/insert_executor.py index 8e38aea918..d2dccd96a3 100644 --- a/evadb/executor/insert_executor.py +++ b/evadb/executor/insert_executor.py @@ -59,8 +59,10 @@ def exec(self, *args, **kwargs): for column in table_catalog_entry.columns: if column == index.feat_column: is_index_on_current_table = True + break if is_index_on_current_table: - create_index_query_list = index.index_def.split(" ") + create_index_query = index.index_def + create_index_query_list = create_index_query.split(" ") if_not_exists = " ".join(create_index_query_list[2:5]).lower() if if_not_exists != "if not exists": create_index_query = ( diff --git a/evadb/executor/vector_index_scan_executor.py b/evadb/executor/vector_index_scan_executor.py index 0d6ee58c4f..57697236e4 100644 --- a/evadb/executor/vector_index_scan_executor.py +++ b/evadb/executor/vector_index_scan_executor.py @@ -142,16 +142,13 @@ def _evadb_vector_index_scan(self, *args, **kwargs): res_data_list.append(row_dict) result_df = pd.DataFrame(res_data_list) - result_df.set_index(row_num_col_name, inplace=True) - result_df = result_df.reindex(row_num_np) - row_num_df.set_index(pd.Index(row_num_np), inplace=True) final_df = pd.merge( row_num_df, result_df, - left_index=True, - right_index=True, - how="left", + left_on="row_num_np", + right_on=row_num_col_name, + how="inner", ) if "row_num_np" in final_df: diff --git a/test/integration_tests/long/test_similarity.py b/test/integration_tests/long/test_similarity.py index 15a0b087dc..81d6054fe8 100644 --- a/test/integration_tests/long/test_similarity.py +++ b/test/integration_tests/long/test_similarity.py @@ -428,17 +428,15 @@ def test_end_to_end_index_scan_should_work_correctly_on_image_dataset_faiss(self drop_query = "DROP INDEX testFaissIndexImageDataset" execute_query_fetch_all(self.evadb, drop_query) - def test_index_auto_update_on_structured_table_during_insertion_with_faiss(self): - create_query = "CREATE TABLE testIndexAutoUpdate (img_path TEXT(100))" - execute_query_fetch_all(self.evadb, create_query) - + def _helper_for_auto_update_during_insertion_with_faiss(self, if_exists: bool): for i, img_path in enumerate(self.img_path_list): insert_query = ( f"INSERT INTO testIndexAutoUpdate (img_path) VALUES ('{img_path}')" ) execute_query_fetch_all(self.evadb, insert_query) if i == 0: - create_index_query = "CREATE INDEX testIndex ON testIndexAutoUpdate(DummyFeatureExtractor(Open(img_path))) USING FAISS" + if_exists_str = "IF NOT EXISTS " if if_exists else "" + create_index_query = f"CREATE INDEX {if_exists_str}testIndex ON testIndexAutoUpdate(DummyFeatureExtractor(Open(img_path))) USING FAISS" execute_query_fetch_all(self.evadb, create_index_query) select_query = """SELECT _row_id FROM testIndexAutoUpdate @@ -452,6 +450,15 @@ def test_index_auto_update_on_structured_table_during_insertion_with_faiss(self) res_batch = execute_query_fetch_all(self.evadb, select_query) self.assertEqual(res_batch.frames["testindexautoupdate._row_id"][0], 5) + def test_index_auto_update_on_structured_table_during_insertion_with_faiss(self): + create_query = "CREATE TABLE testIndexAutoUpdate (img_path TEXT(100))" + drop_query = "DROP TABLE testIndexAutoUpdate" + execute_query_fetch_all(self.evadb, create_query) + self._helper_for_auto_update_during_insertion_with_faiss(False) + execute_query_fetch_all(self.evadb, drop_query) + execute_query_fetch_all(self.evadb, create_query) + self._helper_for_auto_update_during_insertion_with_faiss(True) + @qdrant_skip_marker def test_end_to_end_index_scan_should_work_correctly_on_image_dataset_qdrant(self): for _ in range(2): From 6929103221ad58924e2a6ebbe72d1b867a450c5d Mon Sep 17 00:00:00 2001 From: Pramod Chunduri <43007047+pchunduri6@users.noreply.github.com> Date: Sun, 5 Nov 2023 21:11:18 -0500 Subject: [PATCH 05/25] Support semicolon and escaped strings in lark (#1339) Support semi-colons in string literals for queries of the form: ``` """SELECT ChatGPT("Here's a; question", "This is the context") FROM TAIPAI;""" ``` Also support string escape to run ChatGPT queries more easily: ``` """SELECT ChatGPT('Here\\'s a question', 'This is the context') FROM TAIPAI;""" ``` --- evadb/parser/evadb.lark | 4 ++-- test/unit_tests/parser/test_parser.py | 34 +++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/evadb/parser/evadb.lark b/evadb/parser/evadb.lark index 73474e5e74..ab4cdb6772 100644 --- a/evadb/parser/evadb.lark +++ b/evadb/parser/evadb.lark @@ -580,8 +580,8 @@ GLOBAL_ID: "@" "@" (/[A-Z0-9._$]+/ | BQUOTA_STRING) EXPONENT_NUM_PART: /"E" "-"? DEC_DIGIT+/ ID_LITERAL: /[A-Za-z_$0-9]*?[A-Za-z_$]+?[A-Za-z_$0-9]*/ -DQUOTA_STRING: /"[^";]*"/ -SQUOTA_STRING: /'[^';]*'/ +DQUOTA_STRING: "\"" /(?:[^"\\]|\\.)*"/ +SQUOTA_STRING: "'" /(?:[^'\\]|\\.)*'/ BQUOTA_STRING: /`[^'`]*`/ QUERY_STRING: /[^{};]+/ DEC_DIGIT: /[0-9]/ diff --git a/test/unit_tests/parser/test_parser.py b/test/unit_tests/parser/test_parser.py index b7b7a21978..60624b825d 100644 --- a/test/unit_tests/parser/test_parser.py +++ b/test/unit_tests/parser/test_parser.py @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import json import unittest from pathlib import Path @@ -464,6 +465,39 @@ def test_select_with_empty_string_literal(self): self.assertEqual(len(evadb_statement_list), 1) self.assertEqual(evadb_statement_list[0].stmt_type, StatementType.SELECT) + def test_string_literal_with_escaped_single_quote(self): + parser = Parser() + + select_query = """SELECT ChatGPT('Here\\'s a question', 'This is the context') FROM TAIPAI;""" + + evadb_statement_list = parser.parse(select_query) + self.assertIsInstance(evadb_statement_list, list) + self.assertEqual(len(evadb_statement_list), 1) + self.assertEqual(evadb_statement_list[0].stmt_type, StatementType.SELECT) + + def test_string_literal_with_semi_colon(self): + parser = Parser() + + select_query = """SELECT ChatGPT("Here's a; question", "This is the context") FROM TAIPAI;""" + + evadb_statement_list = parser.parse(select_query) + self.assertIsInstance(evadb_statement_list, list) + self.assertEqual(len(evadb_statement_list), 1) + self.assertEqual(evadb_statement_list[0].stmt_type, StatementType.SELECT) + + def test_string_literal_with_single_quotes_from_variable(self): + parser = Parser() + + question = json.dumps("Here's a question") + answer = json.dumps('This is "the" context') + + select_query = f"""SELECT ChatGPT({question}, {answer}) FROM TAIPAI;""" + + evadb_statement_list = parser.parse(select_query) + self.assertIsInstance(evadb_statement_list, list) + self.assertEqual(len(evadb_statement_list), 1) + self.assertEqual(evadb_statement_list[0].stmt_type, StatementType.SELECT) + def test_select_union_statement(self): parser = Parser() select_union_query = "SELECT CLASS, REDNESS FROM TAIPAI \ From bd344ed2c6a0a6ece31342748d4b1d76bcbf40c8 Mon Sep 17 00:00:00 2001 From: Kaushik <108662423+kaushikravichandran@users.noreply.github.com> Date: Sun, 5 Nov 2023 21:11:48 -0500 Subject: [PATCH 06/25] feat: third party app support in EVADB (#1033) This PR introduces a generic interface to support 3rd party apps in EVADB. As an example. the template for integrating slack has been added. In a subsequent PR the integration with slack will be completed. --------- Co-authored-by: Gaurav Tarlok Kakkar Co-authored-by: Joy Arulraj Co-authored-by: Joy Arulraj Co-authored-by: Kaushik Ravichandran --- evadb/third_party/databases/interface.py | 2 + evadb/third_party/databases/slack/__init__.py | 15 ++ .../databases/slack/slack_handler.py | 129 ++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 evadb/third_party/databases/slack/__init__.py create mode 100644 evadb/third_party/databases/slack/slack_handler.py diff --git a/evadb/third_party/databases/interface.py b/evadb/third_party/databases/interface.py index e4cd86151c..5f8c4c2ac1 100644 --- a/evadb/third_party/databases/interface.py +++ b/evadb/third_party/databases/interface.py @@ -48,6 +48,8 @@ def _get_database_handler(engine: str, **kwargs): return mod.SnowFlakeDbHandler(engine, **kwargs) elif engine == "github": return mod.GithubHandler(engine, **kwargs) + elif engine == "slack": + return mod.SlackHandler(engine, **kwargs) else: raise NotImplementedError(f"Engine {engine} is not supported") diff --git a/evadb/third_party/databases/slack/__init__.py b/evadb/third_party/databases/slack/__init__.py new file mode 100644 index 0000000000..cb882e32b4 --- /dev/null +++ b/evadb/third_party/databases/slack/__init__.py @@ -0,0 +1,15 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""third party/applications/slack""" diff --git a/evadb/third_party/databases/slack/slack_handler.py b/evadb/third_party/databases/slack/slack_handler.py new file mode 100644 index 0000000000..4022efb619 --- /dev/null +++ b/evadb/third_party/databases/slack/slack_handler.py @@ -0,0 +1,129 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import pandas as pd +from slack_sdk import WebClient +from slack_sdk.errors import SlackApiError + +from evadb.third_party.types import DBHandler, DBHandlerResponse, DBHandlerStatus + + +class SlackHandler(DBHandler): + def __init__(self, name: str, **kwargs): + super().__init__(name) + self.token = kwargs.get("token") + self.channel_name = kwargs.get("channel") + + def connect(self): + try: + self.client = WebClient(token=self.token) + return DBHandlerStatus(status=True) + except Exception as e: + return DBHandlerStatus(status=False, error=str(e)) + + def disconnect(self): + """ + TODO: integrate code for disconnecting from slack + """ + raise NotImplementedError() + + def check_connection(self) -> DBHandlerStatus: + try: + self.client.api_test() + except SlackApiError as e: + assert e.response["ok"] is False + return False + return True + + def get_tables(self) -> DBHandlerResponse: + if self.client: + channels = self.client.conversations_list( + types="public_channel,private_channel" + )["channels"] + self.channel_names = [c["name"] for c in channels] + tables_df = pd.DataFrame(self.channel_names, columns=["table_name"]) + return DBHandlerResponse(data=tables_df) + + def get_columns(self, table_name: str) -> DBHandlerResponse: + columns = [ + "ts", + "text", + "message_created_at", + "user", + "channel", + "reactions", + "attachments", + "thread_ts", + "reply_count", + "reply_users_count", + "latest_reply", + "subtype", + "hidden", + ] + columns_df = pd.DataFrame(columns, columns=["column_name"]) + return DBHandlerResponse(data=columns_df) + + def post_message(self, message) -> DBHandlerResponse: + try: + response = self.client.chat_postMessage(channel=self.channel, text=message) + return DBHandlerResponse(data=response["message"]["text"]) + except SlackApiError as e: + assert e.response["ok"] is False + assert e.response["error"] + return DBHandlerResponse(data=None, error=e.response["error"]) + + def _convert_json_response_to_DataFrame(self, json_response): + messages = json_response["messages"] + columns = ["text", "ts", "user"] + data_df = pd.DataFrame(columns=columns) + for message in messages: + if message["text"] and message["ts"] and message["user"]: + data_df.loc[len(data_df.index)] = [ + message["text"], + message["ts"], + message["user"], + ] + return data_df + + def get_messages(self) -> DBHandlerResponse: + try: + channels = self.client.conversations_list( + types="public_channel,private_channel" + )["channels"] + channel_ids = {c["name"]: c["id"] for c in channels} + response = self.client.conversations_history( + channel=channel_ids[self.channel_name] + ) + data_df = self._convert_json_response_to_DataFrame(response) + return data_df + + except SlackApiError as e: + assert e.response["ok"] is False + assert e.response["error"] + return DBHandlerResponse(data=None, error=e.response["error"]) + + def del_message(self, timestamp) -> DBHandlerResponse: + try: + self.client.chat_delete(channel=self.channel, ts=timestamp) + except SlackApiError as e: + assert e.response["ok"] is False + assert e.response["error"] + return DBHandlerResponse(data=None, error=e.response["error"]) + + def execute_native_query(self, query_string: str) -> DBHandlerResponse: + """ + TODO: integrate code for executing query on slack + """ + raise NotImplementedError() From 35b772b8723fbe242579a6620d20cb6f82e719be Mon Sep 17 00:00:00 2001 From: Hersh Dhillon Date: Sun, 5 Nov 2023 22:04:09 -0500 Subject: [PATCH 07/25] [WIP] Improving error handling messages for Custom Functions (#1330) Added separate error handling for ModuleNotFoundError and FileNotFoundError modified: evadb/utils/generic_utils.py --- evadb/utils/generic_utils.py | 17 ++++++++++++++--- .../short/test_generic_utils.py | 17 ++++++++++++++--- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/evadb/utils/generic_utils.py b/evadb/utils/generic_utils.py index b190e748db..d9af319103 100644 --- a/evadb/utils/generic_utils.py +++ b/evadb/utils/generic_utils.py @@ -75,15 +75,26 @@ def load_function_class_from_file(filepath, classname=None): The class instance. Raises: - RuntimeError: If the class name is not found or there is more than one class in the file. + ImportError: If the module cannot be loaded. + FileNotFoundError: If the file cannot be found. + RuntimeError: Any othe type of runtime error. """ try: abs_path = Path(filepath).resolve() spec = importlib.util.spec_from_file_location(abs_path.stem, abs_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) + except ImportError as e: + # ImportError in the case when we are able to find the file but not able to load the module + err_msg = f"ImportError : Couldn't load function from {filepath} : {str(e)}. Not able to load the code provided in the file {abs_path}. Please ensure that the file contains the implementation code for the function." + raise ImportError(err_msg) + except FileNotFoundError as e: + # FileNotFoundError in the case when we are not able to find the file at all at the path. + err_msg = f"FileNotFoundError : Couldn't load function from {filepath} : {str(e)}. This might be because the function implementation file does not exist. Please ensure the file exists at {abs_path}" + raise FileNotFoundError(err_msg) except Exception as e: - err_msg = f"Couldn't load function from {filepath} : {str(e)}. This might be due to a missing Python package, or because the function implementation file does not exist, or it is not a valid Python file." + # Default exception, we don't know what exactly went wrong so we just output the error message + err_msg = f"Couldn't load function from {filepath} : {str(e)}." raise RuntimeError(err_msg) # Try to load the specified class by name @@ -97,7 +108,7 @@ def load_function_class_from_file(filepath, classname=None): if obj.__module__ == module.__name__ ] if len(classes) != 1: - raise RuntimeError( + raise ImportError( f"{filepath} contains {len(classes)} classes, please specify the correct class to load by naming the function with the same name in the CREATE query." ) return classes[0] diff --git a/test/integration_tests/short/test_generic_utils.py b/test/integration_tests/short/test_generic_utils.py index bc78af0d8a..b44d171ecf 100644 --- a/test/integration_tests/short/test_generic_utils.py +++ b/test/integration_tests/short/test_generic_utils.py @@ -14,6 +14,7 @@ # limitations under the License. import unittest +from pathlib import Path from test.markers import windows_skip_marker from evadb.configuration.constants import EvaDB_DATASET_DIR @@ -50,17 +51,27 @@ def test_should_return_correct_class_for_path_without_classname(self): assert vl.__qualname__ == DecordReader.__qualname__ def test_should_raise_on_missing_file(self): - with self.assertRaises(RuntimeError): + # Asserting on the error message, but that's brittle + with self.assertRaises(FileNotFoundError): load_function_class_from_file("evadb/readers/opencv_reader_abdfdsfds.py") + def test_should_raise_on_empty_file(self): + # Asserting on the error message, but that's brittle + Path("/tmp/empty_file.py").touch() + with self.assertRaises(ImportError): + load_function_class_from_file("/tmp/empty_file.py") + + # Cleanup + Path("/tmp/empty_file.py").unlink() + def test_should_raise_if_class_does_not_exists(self): - with self.assertRaises(RuntimeError): + with self.assertRaises(ImportError): # evadb/utils/s3_utils.py has no class in it # if this test fails due to change in s3_utils.py, change the file to something else load_function_class_from_file("evadb/utils/s3_utils.py") def test_should_raise_if_multiple_classes_exist_and_no_class_mentioned(self): - with self.assertRaises(RuntimeError): + with self.assertRaises(ImportError): # evadb/utils/generic_utils.py has multiple classes in it # if this test fails due to change in generic_utils.py, change the file to something else load_function_class_from_file("evadb/utils/generic_utils.py") From 64219f10ee0ef2bd69b32f3b07d060d6ab1916ee Mon Sep 17 00:00:00 2001 From: rohith mulumudy Date: Mon, 6 Nov 2023 10:56:34 -0500 Subject: [PATCH 08/25] logging an error message for invalid files while loading (#1334) Issue - [721](https://github.com/georgia-tech-db/evadb/issues/721) Currently, we abort the entire process when the load executor encounters a corrupted file. --- evadb/executor/load_multimedia_executor.py | 2 +- .../long/test_load_executor.py | 153 +++++++++++++----- 2 files changed, 114 insertions(+), 41 deletions(-) diff --git a/evadb/executor/load_multimedia_executor.py b/evadb/executor/load_multimedia_executor.py index 03f1f7fb64..61af070069 100644 --- a/evadb/executor/load_multimedia_executor.py +++ b/evadb/executor/load_multimedia_executor.py @@ -83,7 +83,7 @@ def exec(self, *args, **kwargs): invalid_files_str = "\n".join(invalid_files) err_msg = f"no valid file found at -- '{invalid_files_str}'." - raise ValueError(err_msg) + logger.error(err_msg) # Get valid files. valid_files = [ diff --git a/test/integration_tests/long/test_load_executor.py b/test/integration_tests/long/test_load_executor.py index 0ca421cf1a..8400eba942 100644 --- a/test/integration_tests/long/test_load_executor.py +++ b/test/integration_tests/long/test_load_executor.py @@ -208,17 +208,16 @@ def test_should_fail_to_load_invalid_files_as_video(self): self.evadb, "SELECT name FROM MyVideos", do_not_print_exceptions=True ) - def test_should_rollback_if_video_load_fails(self): + def test_should_rollback_or_skip_if_video_load_fails(self): path_regex = Path(f"{EvaDB_ROOT_DIR}/data/sample_videos/1/*.mp4") valid_videos = glob.glob(str(path_regex.expanduser()), recursive=True) tempfile_name = os.urandom(24).hex() tempfile_path = os.path.join(tempfile.gettempdir(), tempfile_name) with open(tempfile_path, "wb") as empty_file: - # Load one correct file and one empty file + # Load one empty file # nothing should be added with tempfile.TemporaryDirectory() as tmp_dir: - shutil.copy2(str(valid_videos[0]), tmp_dir) shutil.copy2(str(empty_file.name), tmp_dir) path = Path(tmp_dir) / "*" query = f"""LOAD VIDEO "{path}" INTO MyVideos;""" @@ -233,24 +232,32 @@ def test_should_rollback_if_video_load_fails(self): do_not_print_exceptions=True, ) + # Load one correct file and one empty file + # one file should get added + with tempfile.TemporaryDirectory() as tmp_dir: + shutil.copy2(str(valid_videos[0]), tmp_dir) + shutil.copy2(str(empty_file.name), tmp_dir) + path = Path(tmp_dir) / "*" + query = f"""LOAD VIDEO "{path}" INTO MyVideos;""" + result = execute_query_fetch_all(self.evadb, query) + expected = Batch( + pd.DataFrame([f"Number of loaded {FileFormatType.VIDEO.name}: 1"]) + ) + self.assertEqual(result, expected) + # Load two correct file and one empty file - # nothing should be added + # two files should get added with tempfile.TemporaryDirectory() as tmp_dir: shutil.copy2(str(valid_videos[0]), tmp_dir) shutil.copy2(str(valid_videos[1]), tmp_dir) shutil.copy2(str(empty_file.name), tmp_dir) path = Path(tmp_dir) / "*" query = f"""LOAD VIDEO "{path}" INTO MyVideos;""" - with self.assertRaises(Exception): - execute_query_fetch_all( - self.evadb, query, do_not_print_exceptions=True - ) - with self.assertRaises(BinderError): - execute_query_fetch_all( - self.evadb, - "SELECT name FROM MyVideos", - do_not_print_exceptions=True, - ) + result = execute_query_fetch_all(self.evadb, query) + expected = Batch( + pd.DataFrame([f"Number of loaded {FileFormatType.VIDEO.name}: 2"]) + ) + self.assertEqual(result, expected) def test_should_rollback_and_preserve_previous_state(self): path_regex = Path(f"{EvaDB_ROOT_DIR}/data/sample_videos/1/*.mp4") @@ -262,13 +269,12 @@ def test_should_rollback_and_preserve_previous_state(self): self.evadb, f"""LOAD VIDEO "{load_file}" INTO MyVideos;""" ) - # Load one correct file and one empty file - # original file should remain tempfile_name = os.urandom(24).hex() tempfile_path = os.path.join(tempfile.gettempdir(), tempfile_name) with open(tempfile_path, "wb") as empty_file: + # Load one empty file + # original file should remain with tempfile.TemporaryDirectory() as tmp_dir: - shutil.copy2(str(valid_videos[1]), tmp_dir) shutil.copy2(str(empty_file.name), tmp_dir) path = Path(tmp_dir) / "*" query = f"""LOAD VIDEO "{path}" INTO MyVideos;""" @@ -282,6 +288,25 @@ def test_should_rollback_and_preserve_previous_state(self): file_names = np.unique(result.frames) self.assertEqual(len(file_names), 1) + # Load one correct file and one empty file + # original file should remain and the correct file should get added + with tempfile.TemporaryDirectory() as tmp_dir: + shutil.copy2(str(valid_videos[1]), tmp_dir) + shutil.copy2(str(empty_file.name), tmp_dir) + path = Path(tmp_dir) / "*" + query = f"""LOAD VIDEO "{path}" INTO MyVideos;""" + result = execute_query_fetch_all(self.evadb, query) + expected = Batch( + pd.DataFrame([f"Number of loaded {FileFormatType.VIDEO.name}: 1"]) + ) + self.assertEqual(result, expected) + + result = execute_query_fetch_all( + self.evadb, "SELECT name FROM MyVideos" + ) + file_names = np.unique(result.frames) + self.assertEqual(len(file_names), 2) + ########################################### # integration testcases for load image @@ -342,7 +367,7 @@ def test_should_fail_to_load_invalid_files_as_image(self): self.evadb, "SELECT name FROM MyImages;", do_not_print_exceptions=True ) - def test_should_rollback_if_image_load_fails(self): + def test_should_rollback_or_pass_if_image_load_fails(self): valid_images = glob.glob( str(self.image_files_path.expanduser()), recursive=True ) @@ -350,10 +375,9 @@ def test_should_rollback_if_image_load_fails(self): tempfile_name = os.urandom(24).hex() tempfile_path = os.path.join(tempfile.gettempdir(), tempfile_name) with open(tempfile_path, "wb") as empty_file: - # Load one correct file and one empty file + # Load one empty file # nothing should be added with tempfile.TemporaryDirectory() as tmp_dir: - shutil.copy2(str(valid_images[0]), tmp_dir) shutil.copy2(str(empty_file.name), tmp_dir) path = Path(tmp_dir) / "*" query = f"""LOAD IMAGE "{path}" INTO MyImages;""" @@ -368,26 +392,34 @@ def test_should_rollback_if_image_load_fails(self): do_not_print_exceptions=True, ) + # Load one correct file and one empty file + # correct file should be added + with tempfile.TemporaryDirectory() as tmp_dir: + shutil.copy2(str(valid_images[0]), tmp_dir) + shutil.copy2(str(empty_file.name), tmp_dir) + path = Path(tmp_dir) / "*" + query = f"""LOAD IMAGE "{path}" INTO MyImages;""" + result = execute_query_fetch_all(self.evadb, query) + expected = Batch( + pd.DataFrame([f"Number of loaded {FileFormatType.IMAGE.name}: 1"]) + ) + self.assertEqual(result, expected) + # Load two correct file and one empty file - # nothing should be added + # two correct files should be added with tempfile.TemporaryDirectory() as tmp_dir: shutil.copy2(str(valid_images[0]), tmp_dir) shutil.copy2(str(valid_images[1]), tmp_dir) shutil.copy2(str(empty_file.name), tmp_dir) path = Path(tmp_dir) / "*" query = f"""LOAD IMAGE "{path}" INTO MyImages;""" - with self.assertRaises(Exception): - execute_query_fetch_all( - self.evadb, query, do_not_print_exceptions=True - ) - with self.assertRaises(BinderError): - execute_query_fetch_all( - self.evadb, - "SELECT name FROM MyImages;", - do_not_print_exceptions=True, - ) + result = execute_query_fetch_all(self.evadb, query) + expected = Batch( + pd.DataFrame([f"Number of loaded {FileFormatType.IMAGE.name}: 2"]) + ) + self.assertEqual(result, expected) - def test_should_rollback_and_preserve_previous_state_for_load_images(self): + def test_should_rollback_or_pass_and_preserve_previous_state_for_load_images(self): valid_images = glob.glob( str(self.image_files_path.expanduser()), recursive=True ) @@ -397,13 +429,12 @@ def test_should_rollback_and_preserve_previous_state_for_load_images(self): self.evadb, f"""LOAD IMAGE "{valid_images[0]}" INTO MyImages;""" ) - # Load one correct file and one empty file - # original file should remain tempfile_name = os.urandom(24).hex() tempfile_path = os.path.join(tempfile.gettempdir(), tempfile_name) with open(tempfile_path, "wb") as empty_file: + # Load one empty file + # original file should remain with tempfile.TemporaryDirectory() as tmp_dir: - shutil.copy2(str(valid_images[1]), tmp_dir) shutil.copy2(str(empty_file.name), tmp_dir) path = Path(tmp_dir) / "*" query = f"""LOAD IMAGE "{path}" INTO MyImages;""" @@ -418,6 +449,37 @@ def test_should_rollback_and_preserve_previous_state_for_load_images(self): expected = Batch(pd.DataFrame([{"myimages.name": valid_images[0]}])) self.assertEqual(expected, result) + # Load one empty and one correct file + # original file should remaina and correct file should get added + with tempfile.TemporaryDirectory() as tmp_dir: + shutil.copy2(str(valid_images[1]), tmp_dir) + shutil.copy2(str(empty_file.name), tmp_dir) + path = Path(tmp_dir) / "*" + query = f"""LOAD IMAGE "{path}" INTO MyImages;""" + result = execute_query_fetch_all(self.evadb, query) + expected = Batch( + pd.DataFrame([f"Number of loaded {FileFormatType.IMAGE.name}: 1"]) + ) + self.assertEqual(result, expected) + + result = execute_query_fetch_all( + self.evadb, "SELECT name FROM MyImages" + ) + self.assertEqual(len(result), 2) + expected = Batch( + pd.DataFrame( + [ + {"myimages.name": valid_images[0]}, + { + "myimages.name": os.path.join( + tmp_dir, os.path.basename(valid_images[1]) + ) + }, + ] + ) + ) + self.assertEqual(expected, result) + ################################### # integration tests for csv def test_should_load_csv_with_columns_in_table(self): @@ -471,7 +533,7 @@ def test_should_use_parallel_load(self): # Clean up large scale image directory. shutil.rmtree(large_scale_image_files_path) - def test_parallel_load_should_raise_exception(self): + def test_parallel_load_should_raise_exception_or_pass(self): # Create images. large_scale_image_files_path = create_large_scale_image_dataset( mp.cpu_count() * 10 @@ -481,11 +543,22 @@ def test_parallel_load_should_raise_exception(self): with open(os.path.join(large_scale_image_files_path, "img0.jpg"), "w") as f: f.write("aa") - with self.assertRaises(ExecutorError): - load_query = f"LOAD IMAGE '{large_scale_image_files_path}/**/*.jpg' INTO MyLargeScaleImages;" - execute_query_fetch_all( - self.evadb, load_query, do_not_print_exceptions=True + load_query = f"LOAD IMAGE '{large_scale_image_files_path}/**/*.jpg' INTO MyLargeScaleImages;" + result = execute_query_fetch_all(self.evadb, load_query) + + file_count = len( + [ + entry + for entry in os.listdir(large_scale_image_files_path) + if os.path.isfile(os.path.join(large_scale_image_files_path, entry)) + ] + ) + expected = Batch( + pd.DataFrame( + [f"Number of loaded {FileFormatType.IMAGE.name}: {file_count-1}"] ) + ) + self.assertEqual(result, expected) drop_query = "DROP TABLE IF EXISTS MyLargeScaleImages;" execute_query_fetch_all(self.evadb, drop_query) From bb45db40c7c92d38a5a4574c00f02a6bcff64f45 Mon Sep 17 00:00:00 2001 From: Joy Arulraj Date: Tue, 7 Nov 2023 09:51:51 -0500 Subject: [PATCH 09/25] checkpoint --- docs/source/reference/databases/github.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/source/reference/databases/github.rst b/docs/source/reference/databases/github.rst index 00e706d49a..71cc9e546b 100644 --- a/docs/source/reference/databases/github.rst +++ b/docs/source/reference/databases/github.rst @@ -19,7 +19,7 @@ Required: Optional: -* ``github_token`` is not required for public repositories. However, the rate limit is lower without a valid github_token. Check `Rate limits page `_ to learn more about how to check your rate limit status. Check `Managing your personal access tokens page `_ to learn how to create personal access tokens. +* ``github_token`` is not required for public repositories. However, the rate limit is lower without a valid github_token. Check the `Rate limits page `_ to learn more about how to check your rate limit status. Check `Managing your personal access tokens page `_ to learn how to create personal access tokens. Create Connection ----------------- From 7a49bec8bf7f5a47b37d471f0c22b8e4ef643b21 Mon Sep 17 00:00:00 2001 From: Lohith <32676813+kslohith@users.noreply.github.com> Date: Tue, 7 Nov 2023 10:25:21 -0500 Subject: [PATCH 10/25] Verified that issue #1067 is resolved and added documentation for load pdf functionality. (#1343) Issue #1067 about not being able to load pdf files, was verified to be working with evadb documentation pdf and a new page for loading pdf is added to the documentation. Screenshot 2023-11-07 at 1 33 01 AM Co-authored-by: Lohith K S --- docs/_toc.yml | 1 + docs/source/reference/evaql/load_pdf.rst | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 docs/source/reference/evaql/load_pdf.rst diff --git a/docs/_toc.yml b/docs/_toc.yml index a50c653579..ca191ce42d 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -45,6 +45,7 @@ parts: - file: source/reference/evaql/load_csv - file: source/reference/evaql/load_image - file: source/reference/evaql/load_video + - file: source/reference/evaql/load_pdf - file: source/reference/evaql/select - file: source/reference/evaql/explain - file: source/reference/evaql/show_functions diff --git a/docs/source/reference/evaql/load_pdf.rst b/docs/source/reference/evaql/load_pdf.rst new file mode 100644 index 0000000000..8ced9aeb3f --- /dev/null +++ b/docs/source/reference/evaql/load_pdf.rst @@ -0,0 +1,16 @@ +LOAD PDF +========== + +.. _load-pdf: + +.. code:: mysql + + LOAD PDF 'test_pdf.pdf' INTO MyPDFs; + +PDFs can be directly imported into a table, where the PDF document is segmented into pages and paragraphs. +Each row in the table corresponds to a paragraph extracted from the PDF, and the resulting table includes columns for ``name`` , ``page``, ``paragraph``, and ``data``. + +| ``name`` signifies the title of the uploaded PDF. +| ``page`` signifies the specific page number from which the data is retrieved. +| ``paragraph`` signifies the individual paragraph within a page from which the data is extracted. +| ``data`` refers to the text extracted from the paragraph on the given page. From 1c78b221ff3541a74934915237d9f4756509696b Mon Sep 17 00:00:00 2001 From: jineetd <35962652+jineetd@users.noreply.github.com> Date: Fri, 10 Nov 2023 02:09:20 -0500 Subject: [PATCH 11/25] Add train scores for ludwig in the create function handler. (#1342) In the previous commit, we added the changes for displaying the train scores and train times for XGBoost. We plan to add similar changes to Ludwig integration as well. --------- Co-authored-by: Jineet Desai Co-authored-by: Andy Xu --- docs/source/overview/concepts.rst | 4 ++-- .../source/reference/ai/model-forecasting.rst | 4 ++-- docs/source/reference/databases/github.rst | 2 +- evadb/executor/create_function_executor.py | 20 +++++++++++++++++-- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/docs/source/overview/concepts.rst b/docs/source/overview/concepts.rst index f2905b640f..4b559e24c6 100644 --- a/docs/source/overview/concepts.rst +++ b/docs/source/overview/concepts.rst @@ -92,6 +92,6 @@ After registering ``MnistImageClassifier`` function, you can call the function i AI-Centric Query Optimization ----------------------------- -EvaDB optimizes the AI queries to save money spent on running models and reduce query execution time. It contains a novel `Cascades-style query optimizer `__ tailored for AI queries. +EvaDB optimizes the AI queries to save money spent on running models and reduce query execution time. It contains a novel `Cascades-style query optimizer `__ tailored for AI queries. -Query optimization has powered SQL database systems for several decades. It is the bridge that connects the declarative query language to efficient query execution on hardware. EvaDB accelerates AI queries using a collection of optimizations detailed in the :ref:`optimizations` page. \ No newline at end of file +Query optimization has powered SQL database systems for several decades. It is the bridge that connects the declarative query language to efficient query execution on hardware. EvaDB accelerates AI queries using a collection of optimizations detailed in the :ref:`optimizations` page. diff --git a/docs/source/reference/ai/model-forecasting.rst b/docs/source/reference/ai/model-forecasting.rst index 610461223e..48f644e690 100644 --- a/docs/source/reference/ai/model-forecasting.rst +++ b/docs/source/reference/ai/model-forecasting.rst @@ -58,7 +58,7 @@ EvaDB's default forecast framework is `statsforecast `_ to learn details about these models. If LIBRARY is `neuralforecast`, we can select one of NHITS or NBEATS. The default is NBEATS. Check `NBEATS docs `_ for details. + - If LIBRARY is `statsforecast`, we can select one of ARIMA, ting, ETS, Theta. The default is ARIMA. Check `Automatic Forecasting `_ to learn details about these models. If LIBRARY is `neuralforecast`, we can select one of NHITS or NBEATS. The default is NBEATS. Check `NBEATS docs `_ for details. * - AUTO (str, default: 'T') - If set to 'T', it enables automatic hyperparameter optimization. Must be set to 'T' for `statsforecast` library. One may set this parameter to `false` if LIBRARY is `neuralforecast` for faster (but less reliable) results. * - Frequency (str, default: 'auto') @@ -90,4 +90,4 @@ Below is an example query with `neuralforecast` with `trend` column as exogenous PREDICT 'y' LIBRARY 'neuralforecast' AUTO 'f' - FREQUENCY 'M'; \ No newline at end of file + FREQUENCY 'M'; diff --git a/docs/source/reference/databases/github.rst b/docs/source/reference/databases/github.rst index 71cc9e546b..14aaa9fd8e 100644 --- a/docs/source/reference/databases/github.rst +++ b/docs/source/reference/databases/github.rst @@ -19,7 +19,7 @@ Required: Optional: -* ``github_token`` is not required for public repositories. However, the rate limit is lower without a valid github_token. Check the `Rate limits page `_ to learn more about how to check your rate limit status. Check `Managing your personal access tokens page `_ to learn how to create personal access tokens. +* ``github_token`` is not required for public repositories. However, the rate limit is lower without a valid github_token. Check the `Rate limits page `_ to learn more about how to check your rate limit status. Check `Managing your personal access tokens page `_ to learn how to create personal access tokens. Create Connection ----------------- diff --git a/evadb/executor/create_function_executor.py b/evadb/executor/create_function_executor.py index cee6035f68..dc57bbc283 100644 --- a/evadb/executor/create_function_executor.py +++ b/evadb/executor/create_function_executor.py @@ -18,6 +18,7 @@ import os import pickle import re +import time from pathlib import Path from typing import Dict, List @@ -125,6 +126,7 @@ def handle_ludwig_function(self): aggregated_batch.drop_column_alias() arg_map = {arg.key: arg.value for arg in self.node.metadata} + start_time = int(time.time()) auto_train_results = auto_train( dataset=aggregated_batch.frames, target=arg_map["predict"], @@ -134,11 +136,13 @@ def handle_ludwig_function(self): "tmp_dir" ), ) + train_time = int(time.time()) - start_time model_path = os.path.join( self.db.catalog().get_configuration_catalog_value("model_dir"), self.node.name, ) auto_train_results.best_model.save(model_path) + best_score = auto_train_results.experiment_analysis.best_result["metric_score"] self.node.metadata.append( FunctionMetadataCatalogEntry("model_path", model_path) ) @@ -151,6 +155,8 @@ def handle_ludwig_function(self): self.node.function_type, io_list, self.node.metadata, + best_score, + train_time, ) def handle_sklearn_function(self): @@ -178,7 +184,10 @@ def handle_sklearn_function(self): model = LinearRegression() Y = aggregated_batch.frames[arg_map["predict"]] aggregated_batch.frames.drop([arg_map["predict"]], axis=1, inplace=True) + start_time = int(time.time()) model.fit(X=aggregated_batch.frames, y=Y) + train_time = int(time.time()) - start_time + score = model.score(X=aggregated_batch.frames, y=Y) model_path = os.path.join( self.db.catalog().get_configuration_catalog_value("model_dir"), self.node.name, @@ -200,6 +209,8 @@ def handle_sklearn_function(self): self.node.function_type, io_list, self.node.metadata, + score, + train_time, ) def convert_to_numeric(self, x): @@ -241,9 +252,11 @@ def handle_xgboost_function(self): "estimator_list": ["xgboost"], "task": arg_map.get("task", DEFAULT_XGBOOST_TASK), } + start_time = int(time.time()) model.fit( dataframe=aggregated_batch.frames, label=arg_map["predict"], **settings ) + train_time = int(time.time()) - start_time model_path = os.path.join( self.db.catalog().get_configuration_catalog_value("model_dir"), self.node.name, @@ -260,7 +273,6 @@ def handle_xgboost_function(self): impl_path = Path(f"{self.function_dir}/xgboost.py").absolute().as_posix() io_list = self._resolve_function_io(None) best_score = model.best_loss - train_time = model.best_config_train_time return ( self.node.name, impl_path, @@ -638,6 +650,8 @@ def exec(self, *args, **kwargs): function_type, io_list, metadata, + best_score, + train_time, ) = self.handle_ludwig_function() elif string_comparison_case_insensitive(self.node.function_type, "Sklearn"): ( @@ -646,6 +660,8 @@ def exec(self, *args, **kwargs): function_type, io_list, metadata, + best_score, + train_time, ) = self.handle_sklearn_function() elif string_comparison_case_insensitive(self.node.function_type, "XGBoost"): ( @@ -688,7 +704,7 @@ def exec(self, *args, **kwargs): [ msg, "Validation Score: " + str(best_score), - "Training time: " + str(train_time), + "Training time: " + str(train_time) + " secs.", ] ) ) From 995f7fe1d5a6713e1b20e5719c3d96a5965ac251 Mon Sep 17 00:00:00 2001 From: Andy Xu Date: Tue, 14 Nov 2023 09:25:32 -0800 Subject: [PATCH 12/25] Make Logic Operators Case Insensitve (#1352) - Fix the following queries: ``` SELECT * FROM postgres_data.home_rentals where neighborhood='downtown' and number_of_rooms=2; ``` - Improve the error message: Instead of throwing arbitrary mask error, now we raise `Unsupported Logical Operator: ...`. --- evadb/parser/lark_visitor/_expressions.py | 7 ++- setup.py | 2 +- test/unit_tests/parser/test_parser.py | 72 +++++++++++++++++++++++ 3 files changed, 78 insertions(+), 3 deletions(-) diff --git a/evadb/parser/lark_visitor/_expressions.py b/evadb/parser/lark_visitor/_expressions.py index 6ec01cf991..ff53ed4e1a 100644 --- a/evadb/parser/lark_visitor/_expressions.py +++ b/evadb/parser/lark_visitor/_expressions.py @@ -20,6 +20,7 @@ from evadb.expression.comparison_expression import ComparisonExpression from evadb.expression.constant_value_expression import ConstantValueExpression from evadb.expression.logical_expression import LogicalExpression +from evadb.utils.generic_utils import string_comparison_case_insensitive ################################################################## @@ -101,10 +102,12 @@ def comparison_operator(self, tree): def logical_operator(self, tree): op = str(tree.children[0]) - if op == "OR": + if string_comparison_case_insensitive(op, "OR"): return ExpressionType.LOGICAL_OR - elif op == "AND": + elif string_comparison_case_insensitive(op, "AND"): return ExpressionType.LOGICAL_AND + else: + raise NotImplementedError("Unsupported logical operator: {}".format(op)) def expressions_with_defaults(self, tree): expr_list = [] diff --git a/setup.py b/setup.py index ae5d6fdbb4..3334fa8361 100644 --- a/setup.py +++ b/setup.py @@ -80,7 +80,7 @@ def read(path, encoding="utf-8"): "sentence-transformers", "protobuf", "bs4", - "openai>=0.27.4", # CHATGPT + "openai==0.28", # CHATGPT "gpt4all", # PRIVATE GPT "sentencepiece", # TRANSFORMERS ] diff --git a/test/unit_tests/parser/test_parser.py b/test/unit_tests/parser/test_parser.py index 60624b825d..6241323d44 100644 --- a/test/unit_tests/parser/test_parser.py +++ b/test/unit_tests/parser/test_parser.py @@ -21,6 +21,7 @@ from evadb.expression.comparison_expression import ComparisonExpression from evadb.expression.constant_value_expression import ConstantValueExpression from evadb.expression.function_expression import FunctionExpression +from evadb.expression.logical_expression import LogicalExpression from evadb.expression.tuple_value_expression import TupleValueExpression from evadb.parser.alias import Alias from evadb.parser.create_function_statement import CreateFunctionStatement @@ -531,6 +532,77 @@ def test_select_statement_class(self): self.assertEqual(select_stmt_new.from_table, select_stmt.from_table) self.assertEqual(str(select_stmt_new), str(select_stmt)) + def test_select_statement_where_class(self): + """ + Unit test for logical operators in the where clause. + """ + + def _verify_select_statement(evadb_statement_list): + self.assertIsInstance(evadb_statement_list, list) + self.assertEqual(len(evadb_statement_list), 1) + self.assertEqual(evadb_statement_list[0].stmt_type, StatementType.SELECT) + + select_stmt = evadb_statement_list[0] + + # target list + self.assertIsNotNone(select_stmt.target_list) + self.assertEqual(len(select_stmt.target_list), 2) + self.assertEqual( + select_stmt.target_list[0].etype, ExpressionType.TUPLE_VALUE + ) + self.assertEqual(select_stmt.target_list[0].name, "CLASS") + self.assertEqual( + select_stmt.target_list[1].etype, ExpressionType.TUPLE_VALUE + ) + self.assertEqual(select_stmt.target_list[1].name, "REDNESS") + + # from table + self.assertIsNotNone(select_stmt.from_table) + self.assertIsInstance(select_stmt.from_table, TableRef) + self.assertEqual(select_stmt.from_table.table.table_name, "TAIPAI") + + # where clause + self.assertIsNotNone(select_stmt.where_clause) + self.assertIsInstance(select_stmt.where_clause, LogicalExpression) + self.assertEqual(select_stmt.where_clause.etype, ExpressionType.LOGICAL_AND) + self.assertEqual(len(select_stmt.where_clause.children), 2) + left = select_stmt.where_clause.children[0] + right = select_stmt.where_clause.children[1] + self.assertEqual(left.etype, ExpressionType.COMPARE_EQUAL) + self.assertEqual(right.etype, ExpressionType.COMPARE_LESSER) + + self.assertEqual(len(left.children), 2) + self.assertEqual(left.children[0].etype, ExpressionType.TUPLE_VALUE) + self.assertEqual(left.children[0].name, "CLASS") + self.assertEqual(left.children[1].etype, ExpressionType.CONSTANT_VALUE) + self.assertEqual(left.children[1].value, "VAN") + + self.assertEqual(len(right.children), 2) + self.assertEqual(right.children[0].etype, ExpressionType.TUPLE_VALUE) + self.assertEqual(right.children[0].name, "REDNESS") + self.assertEqual(right.children[1].etype, ExpressionType.CONSTANT_VALUE) + self.assertEqual(right.children[1].value, 400) + + parser = Parser() + select_query = ( + "SELECT CLASS, REDNESS FROM TAIPAI WHERE CLASS = 'VAN' AND REDNESS < 400;" + ) + _verify_select_statement(parser.parse(select_query)) + + # Case insensitive test + select_query = ( + "select CLASS, REDNESS from TAIPAI where CLASS = 'VAN' and REDNESS < 400;" + ) + _verify_select_statement(parser.parse(select_query)) + + # Unsupported logical operator + select_query = ( + "SELECT CLASS, REDNESS FROM TAIPAI WHERE CLASS = 'VAN' XOR REDNESS < 400;" + ) + with self.assertRaises(NotImplementedError) as cm: + parser.parse(select_query) + self.assertEqual(str(cm.exception), "Unsupported logical operator: XOR") + def test_select_statement_groupby_class(self): """Testing sample frequency""" From 1fbb74f6069c308582add2466ab3fb86c6701e63 Mon Sep 17 00:00:00 2001 From: Shashank Suman Date: Tue, 14 Nov 2023 12:25:47 -0500 Subject: [PATCH 13/25] Job scheduler implementation (#1308) This PR adds support for creating and dropping jobs in evadb based on this [task](https://github.com/georgia-tech-db/evadb/issues/1248). 1. Jobs can be created using the create job query: > CREATE JOB {job_name} AS { > {job_queries; ...} > } > START {start_time} > END {end_time} > EVERY {repeat_period} {repeat_unit} 2. Created jobs can be dropped using: > DROP JOB {job_name} 3. The scheduled jobs will only be triggered if the job scheduler process is started explicitly using: > EvaDBConnection.start_jobs() 4. The job scheduler process can be stopped using: > EvaDBConnection.stop_jobs() --------- Co-authored-by: Gaurav Tarlok Kakkar --- evadb/catalog/catalog_manager.py | 140 +++++++++++++++ evadb/catalog/models/job_catalog.py | 92 ++++++++++ evadb/catalog/models/job_history_catalog.py | 73 ++++++++ evadb/catalog/models/utils.py | 55 ++++++ evadb/catalog/services/job_catalog_service.py | 163 ++++++++++++++++++ .../services/job_history_catalog_service.py | 100 +++++++++++ evadb/catalog/sql_config.py | 2 + evadb/executor/create_job_executor.py | 139 +++++++++++++++ evadb/executor/drop_object_executor.py | 24 +++ evadb/executor/plan_executor.py | 5 +- evadb/interfaces/relational/db.py | 20 +++ evadb/parser/create_statement.py | 44 ++++- evadb/parser/evadb.lark | 35 +++- evadb/parser/lark_visitor/__init__.py | 10 ++ .../parser/lark_visitor/_create_statements.py | 47 +++++ evadb/parser/lark_visitor/_drop_statement.py | 14 ++ evadb/parser/select_statement.py | 6 +- evadb/parser/types.py | 2 + evadb/parser/utils.py | 7 +- evadb/utils/job_scheduler.py | 120 +++++++++++++ .../long/test_job_scheduler_execution.py | 94 ++++++++++ .../short/test_create_job_executor.py | 126 ++++++++++++++ .../short/test_drop_executor.py | 36 ++++ test/unit_tests/parser/test_parser.py | 27 +++ test/unit_tests/utils/test_job_scheduler.py | 81 +++++++++ 25 files changed, 1452 insertions(+), 10 deletions(-) create mode 100644 evadb/catalog/models/job_catalog.py create mode 100644 evadb/catalog/models/job_history_catalog.py create mode 100644 evadb/catalog/services/job_catalog_service.py create mode 100644 evadb/catalog/services/job_history_catalog_service.py create mode 100644 evadb/executor/create_job_executor.py create mode 100644 evadb/utils/job_scheduler.py create mode 100644 test/integration_tests/long/test_job_scheduler_execution.py create mode 100644 test/integration_tests/short/test_create_job_executor.py create mode 100644 test/unit_tests/utils/test_job_scheduler.py diff --git a/evadb/catalog/catalog_manager.py b/evadb/catalog/catalog_manager.py index 20c50c9dfb..62ad30a59e 100644 --- a/evadb/catalog/catalog_manager.py +++ b/evadb/catalog/catalog_manager.py @@ -12,6 +12,7 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. +import datetime import shutil from pathlib import Path from typing import Any, List @@ -39,6 +40,8 @@ FunctionIOCatalogEntry, FunctionMetadataCatalogEntry, IndexCatalogEntry, + JobCatalogEntry, + JobHistoryCatalogEntry, TableCatalogEntry, drop_all_tables_except_catalog, init_db, @@ -61,6 +64,8 @@ FunctionMetadataCatalogService, ) from evadb.catalog.services.index_catalog_service import IndexCatalogService +from evadb.catalog.services.job_catalog_service import JobCatalogService +from evadb.catalog.services.job_history_catalog_service import JobHistoryCatalogService from evadb.catalog.services.table_catalog_service import TableCatalogService from evadb.catalog.sql_config import IDENTIFIER_COLUMN, SQLConfig from evadb.expression.function_expression import FunctionExpression @@ -85,6 +90,10 @@ def __init__(self, db_uri: str): self._config_catalog_service = ConfigurationCatalogService( self._sql_config.session ) + self._job_catalog_service = JobCatalogService(self._sql_config.session) + self._job_history_catalog_service = JobHistoryCatalogService( + self._sql_config.session + ) self._table_catalog_service = TableCatalogService(self._sql_config.session) self._column_service = ColumnCatalogService(self._sql_config.session) self._function_service = FunctionCatalogService(self._sql_config.session) @@ -215,6 +224,137 @@ def check_native_table_exists(self, table_name: str, database_name: str): return True + "Job catalog services" + + def insert_job_catalog_entry( + self, + name: str, + queries: str, + start_time: datetime, + end_time: datetime, + repeat_interval: int, + active: bool, + next_schedule_run: datetime, + ) -> JobCatalogEntry: + """A new entry is persisted in the job catalog. + + Args: + name: job name + queries: job's queries + start_time: job start time + end_time: job end time + repeat_interval: job repeat interval + active: job status + next_schedule_run: next run time as per schedule + """ + job_entry = self._job_catalog_service.insert_entry( + name, + queries, + start_time, + end_time, + repeat_interval, + active, + next_schedule_run, + ) + + return job_entry + + def get_job_catalog_entry(self, job_name: str) -> JobCatalogEntry: + """ + Returns the job catalog entry for the given database_name + Arguments: + job_name (str): name of the job + + Returns: + JobCatalogEntry + """ + + table_entry = self._job_catalog_service.get_entry_by_name(job_name) + + return table_entry + + def drop_job_catalog_entry(self, job_entry: JobCatalogEntry) -> bool: + """ + This method deletes the job from catalog. + + Arguments: + job_entry: job catalog entry to remove + + Returns: + True if successfully deleted else False + """ + return self._job_catalog_service.delete_entry(job_entry) + + def get_next_executable_job(self, only_past_jobs: bool = False) -> JobCatalogEntry: + """Get the oldest job that is ready to be triggered by trigger time + Arguments: + only_past_jobs: boolean flag to denote if only jobs with trigger time in + past should be considered + Returns: + Returns the first job to be triggered + """ + return self._job_catalog_service.get_next_executable_job(only_past_jobs) + + def update_job_catalog_entry( + self, job_name: str, next_scheduled_run: datetime, active: bool + ): + """Update the next_scheduled_run and active column as per the provided values + Arguments: + job_name (str): job which should be updated + + next_run_time (datetime): the next trigger time for the job + + active (bool): the active status for the job + """ + self._job_catalog_service.update_next_scheduled_run( + job_name, next_scheduled_run, active + ) + + "Job history catalog services" + + def insert_job_history_catalog_entry( + self, + job_id: str, + job_name: str, + execution_start_time: datetime, + execution_end_time: datetime, + ) -> JobCatalogEntry: + """A new entry is persisted in the job history catalog. + + Args: + job_id: job id for the execution entry + job_name: job name for the execution entry + execution_start_time: job execution start time + execution_end_time: job execution end time + """ + job_history_entry = self._job_history_catalog_service.insert_entry( + job_id, job_name, execution_start_time, execution_end_time + ) + + return job_history_entry + + def get_job_history_by_job_id(self, job_id: int) -> list[JobHistoryCatalogEntry]: + """Returns all the entries present for this job_id on in the history. + + Args: + job_id: the id of job whose history should be fetched + """ + return self._job_history_catalog_service.get_entry_by_job_id(job_id) + + def update_job_history_end_time( + self, job_id: int, execution_start_time: datetime, execution_end_time: datetime + ) -> list[JobHistoryCatalogEntry]: + """Updates the execution_end_time for this job history matching job_id and execution_start_time. + + Args: + job_id: id of the job whose history entry which should be updated + execution_start_time: the start time for the job history entry + execution_end_time: the end time for the job history entry + """ + return self._job_history_catalog_service.update_entry_end_time( + job_id, execution_start_time, execution_end_time + ) + "Table catalog services" def insert_table_catalog_entry( diff --git a/evadb/catalog/models/job_catalog.py b/evadb/catalog/models/job_catalog.py new file mode 100644 index 0000000000..07a66f622b --- /dev/null +++ b/evadb/catalog/models/job_catalog.py @@ -0,0 +1,92 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import datetime +import json + +from sqlalchemy import Boolean, Column, DateTime, Index, Integer, String +from sqlalchemy.orm import relationship + +from evadb.catalog.models.base_model import BaseModel +from evadb.catalog.models.utils import JobCatalogEntry + + +class JobCatalog(BaseModel): + """The `JobCatalog` catalog stores information about all the created Jobs. + `_row_id:` an autogenerated unique identifier. + `_name:` the job name. + `_queries:` the queries to run as part of this job + `_start_time:` the job's start time + `_end_time:` the job's end time + `_repeat_interval:` the job's repeat interval + `_repeat_period:` the job's repeat period + `_active:` is the job active/deleted + `_next_scheduled_run:` the next trigger time for the job as per the schedule + `_created_at:` entry creation time + `_updated_at:` entry last update time + """ + + __tablename__ = "job_catalog" + + _name = Column("name", String(100), unique=True) + _queries = Column("queries", String, nullable=False) + _start_time = Column("start_time", DateTime, default=datetime.datetime.now) + _end_time = Column("end_ts", DateTime) + _repeat_interval = Column("repeat_interval", Integer) + _active = Column("active", Boolean, default=True) + _next_scheduled_run = Column("next_scheduled_run", DateTime) + + _created_at = Column("created_at", DateTime, default=datetime.datetime.now) + _updated_at = Column( + "updated_at", + DateTime, + default=datetime.datetime.now, + onupdate=datetime.datetime.now, + ) + + _next_run_index = Index("_next_run_index", _next_scheduled_run) + _job_history_catalog = relationship("JobHistoryCatalog", cascade="all, delete") + + def __init__( + self, + name: str, + queries: str, + start_time: datetime, + end_time: datetime, + repeat_interval: Integer, + active: bool, + next_schedule_run: datetime, + ): + self._name = name + self._queries = queries + self._start_time = start_time + self._end_time = end_time + self._repeat_interval = repeat_interval + self._active = active + self._next_scheduled_run = next_schedule_run + + def as_dataclass(self) -> "JobCatalogEntry": + return JobCatalogEntry( + row_id=self._row_id, + name=self._name, + queries=json.loads(self._queries), + start_time=self._start_time, + end_time=self._end_time, + repeat_interval=self._repeat_interval, + active=self._active, + next_scheduled_run=self._next_scheduled_run, + created_at=self._created_at, + updated_at=self._updated_at, + ) diff --git a/evadb/catalog/models/job_history_catalog.py b/evadb/catalog/models/job_history_catalog.py new file mode 100644 index 0000000000..c6c21ba3f2 --- /dev/null +++ b/evadb/catalog/models/job_history_catalog.py @@ -0,0 +1,73 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import datetime + +from sqlalchemy import Column, DateTime, ForeignKey, Integer, String, UniqueConstraint + +from evadb.catalog.models.base_model import BaseModel +from evadb.catalog.models.utils import JobHistoryCatalogEntry + + +class JobHistoryCatalog(BaseModel): + """The `JobHistoryCatalog` stores the execution history of jobs . + `_row_id:` an autogenerated unique identifier. + `_job_id:` job id. + `_job_name:` job name. + `_execution_start_time:` start time of this run + `_execution_end_time:` end time for this run + `_created_at:` entry creation time + `_updated_at:` entry last update time + """ + + __tablename__ = "job_history_catalog" + + _job_id = Column( + "job_id", Integer, ForeignKey("job_catalog._row_id", ondelete="CASCADE") + ) + _job_name = Column("job_name", String(100)) + _execution_start_time = Column("execution_start_time", DateTime) + _execution_end_time = Column("execution_end_time", DateTime) + _created_at = Column("created_at", DateTime, default=datetime.datetime.now) + _updated_at = Column( + "updated_at", + DateTime, + default=datetime.datetime.now, + onupdate=datetime.datetime.now, + ) + + __table_args__ = (UniqueConstraint("job_id", "execution_start_time"), {}) + + def __init__( + self, + job_id: int, + job_name: str, + execution_start_time: datetime, + execution_end_time: datetime, + ): + self._job_id = job_id + self._job_name = job_name + self._execution_start_time = execution_start_time + self._execution_end_time = execution_end_time + + def as_dataclass(self) -> "JobHistoryCatalogEntry": + return JobHistoryCatalogEntry( + row_id=self._row_id, + job_id=self._job_id, + job_name=self._job_name, + execution_start_time=self._execution_start_time, + execution_end_time=self._execution_end_time, + created_at=self._created_at, + updated_at=self._updated_at, + ) diff --git a/evadb/catalog/models/utils.py b/evadb/catalog/models/utils.py index 5da3a2eef5..2c2271f4bc 100644 --- a/evadb/catalog/models/utils.py +++ b/evadb/catalog/models/utils.py @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import contextlib +import datetime import json from dataclasses import dataclass, field from typing import List, Tuple @@ -275,3 +276,57 @@ def display_format(self): "key": self.key, "value": self.value, } + + +@dataclass(unsafe_hash=True) +class JobCatalogEntry: + """Dataclass representing an entry in the `JobCatalog`.""" + + name: str + queries: list + start_time: datetime + end_time: datetime + repeat_interval: int + active: bool + next_scheduled_run: datetime + created_at: datetime + updated_at: datetime + row_id: int = None + + def display_format(self): + return { + "row_id": self.row_id, + "name": self.name, + "queries": self.queries, + "start_time": self.start_time, + "end_time": self.end_time, + "repeat_interval": self.repeat_interval, + "active": self.active, + "next_schedule_run": self.next_scheduled_run, + "created_at": self.created_at, + "updated_at": self.updated_at, + } + + +@dataclass(unsafe_hash=True) +class JobHistoryCatalogEntry: + """Dataclass representing an entry in the `JobHistoryCatalog`.""" + + job_id: int + job_name: str + execution_start_time: datetime + execution_end_time: datetime + created_at: datetime + updated_at: datetime + row_id: int = None + + def display_format(self): + return { + "row_id": self.row_id, + "job_id": self.job_name, + "job_name": self.job_name, + "execution_start_time": self.execution_start_time, + "execution_end_time": self.execution_end_time, + "created_at": self.created_at, + "updated_at": self.updated_at, + } diff --git a/evadb/catalog/services/job_catalog_service.py b/evadb/catalog/services/job_catalog_service.py new file mode 100644 index 0000000000..1c8ad554b9 --- /dev/null +++ b/evadb/catalog/services/job_catalog_service.py @@ -0,0 +1,163 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import datetime +import json + +from sqlalchemy import and_, true +from sqlalchemy.orm import Session +from sqlalchemy.sql.expression import select + +from evadb.catalog.models.job_catalog import JobCatalog +from evadb.catalog.models.utils import JobCatalogEntry +from evadb.catalog.services.base_service import BaseService +from evadb.utils.errors import CatalogError +from evadb.utils.logging_manager import logger + + +class JobCatalogService(BaseService): + def __init__(self, db_session: Session): + super().__init__(JobCatalog, db_session) + + def insert_entry( + self, + name: str, + queries: list, + start_time: datetime, + end_time: datetime, + repeat_interval: int, + active: bool, + next_schedule_run: datetime, + ) -> JobCatalogEntry: + try: + job_catalog_obj = self.model( + name=name, + queries=json.dumps(queries), + start_time=start_time, + end_time=end_time, + repeat_interval=repeat_interval, + active=active, + next_schedule_run=next_schedule_run, + ) + job_catalog_obj = job_catalog_obj.save(self.session) + + except Exception as e: + logger.exception( + f"Failed to insert entry into job catalog with exception {str(e)}" + ) + raise CatalogError(e) + + return job_catalog_obj.as_dataclass() + + def get_entry_by_name(self, job_name: str) -> JobCatalogEntry: + """ + Get the job catalog entry with given job name. + Arguments: + job_name (str): Job name + Returns: + JobCatalogEntry - catalog entry for given job name + """ + entry = self.session.execute( + select(self.model).filter(self.model._name == job_name) + ).scalar_one_or_none() + if entry: + return entry.as_dataclass() + return entry + + def delete_entry(self, job_entry: JobCatalogEntry): + """Delete Job from the catalog + Arguments: + job (JobCatalogEntry): job to delete + Returns: + True if successfully removed else false + """ + try: + job_catalog_obj = self.session.execute( + select(self.model).filter(self.model._row_id == job_entry.row_id) + ).scalar_one_or_none() + job_catalog_obj.delete(self.session) + return True + except Exception as e: + err_msg = f"Delete Job failed for {job_entry} with error {str(e)}." + logger.exception(err_msg) + raise CatalogError(err_msg) + + def get_all_overdue_jobs(self) -> list: + """Get the list of jobs that are overdue to be triggered + Arguments: + None + Returns: + Returns the list of all active overdue jobs + """ + entries = ( + self.session.execute( + select(self.model).filter( + and_( + self.model._next_scheduled_run <= datetime.datetime.now(), + self.model._active == true(), + ) + ) + ) + .scalars() + .all() + ) + entries = [row.as_dataclass() for row in entries] + return entries + + def get_next_executable_job(self, only_past_jobs: bool) -> JobCatalogEntry: + """Get the oldest job that is ready to be triggered by trigger time + Arguments: + only_past_jobs (bool): boolean flag to denote if only jobs with trigger time in + past should be considered + Returns: + Returns the first job to be triggered + """ + entry = self.session.execute( + select(self.model) + .filter( + and_( + self.model._next_scheduled_run <= datetime.datetime.now(), + self.model._active == true(), + ) + if only_past_jobs + else self.model._active == true() + ) + .order_by(self.model._next_scheduled_run.asc()) + .limit(1) + ).scalar_one_or_none() + if entry: + return entry.as_dataclass() + return entry + + def update_next_scheduled_run( + self, job_name: str, next_scheduled_run: datetime, active: bool + ): + """Update the next_scheduled_run and active column as per the provided values + Arguments: + job_name (str): job which should be updated + + next_run_time (datetime): the next trigger time for the job + + active (bool): the active status for the job + Returns: + void + """ + job = ( + self.session.query(self.model).filter(self.model._name == job_name).first() + ) + if job: + job._next_scheduled_run = next_scheduled_run + job._active = active + self.session.commit() diff --git a/evadb/catalog/services/job_history_catalog_service.py b/evadb/catalog/services/job_history_catalog_service.py new file mode 100644 index 0000000000..bd1b27c8b9 --- /dev/null +++ b/evadb/catalog/services/job_history_catalog_service.py @@ -0,0 +1,100 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import datetime + +from sqlalchemy import and_ +from sqlalchemy.orm import Session +from sqlalchemy.sql.expression import select + +from evadb.catalog.models.job_history_catalog import JobHistoryCatalog +from evadb.catalog.models.utils import JobHistoryCatalogEntry +from evadb.catalog.services.base_service import BaseService +from evadb.utils.errors import CatalogError +from evadb.utils.logging_manager import logger + + +class JobHistoryCatalogService(BaseService): + def __init__(self, db_session: Session): + super().__init__(JobHistoryCatalog, db_session) + + def insert_entry( + self, + job_id: str, + job_name: str, + execution_start_time: datetime, + execution_end_time: datetime, + ) -> JobHistoryCatalogEntry: + try: + job_history_catalog_obj = self.model( + job_id=job_id, + job_name=job_name, + execution_start_time=execution_start_time, + execution_end_time=execution_end_time, + ) + job_history_catalog_obj = job_history_catalog_obj.save(self.session) + + except Exception as e: + logger.exception( + f"Failed to insert entry into job history catalog with exception {str(e)}" + ) + raise CatalogError(e) + + return job_history_catalog_obj.as_dataclass() + + def get_entry_by_job_id(self, job_id: int) -> list[JobHistoryCatalogEntry]: + """ + Get all the job history catalog entry with given job id. + Arguments: + job_id (int): Job id + Returns: + list[JobHistoryCatalogEntry]: all history catalog entries for given job id + """ + entries = ( + self.session.execute( + select(self.model).filter(self.model._job_id == job_id) + ) + .scalars() + .all() + ) + entries = [row.as_dataclass() for row in entries] + return entries + + def update_entry_end_time( + self, job_id: int, execution_start_time: datetime, execution_end_time: datetime + ): + """Update the execution_end_time of the entry as per the provided values + Arguments: + job_id (int): id of the job whose history entry which should be updated + + execution_start_time (datetime): the start time for the job history entry + + execution_end_time (datetime): the end time for the job history entry + Returns: + void + """ + job_history_entry = ( + self.session.query(self.model) + .filter( + and_( + self.model._job_id == job_id, + self.model._execution_start_time == execution_start_time, + ) + ) + .first() + ) + if job_history_entry: + job_history_entry._execution_end_time = execution_end_time + self.session.commit() diff --git a/evadb/catalog/sql_config.py b/evadb/catalog/sql_config.py index 0a460a899d..fed6630f3e 100644 --- a/evadb/catalog/sql_config.py +++ b/evadb/catalog/sql_config.py @@ -38,6 +38,8 @@ "functionio_catalog", "function_cost_catalog", "function_metadata_catalog", + "job_catalog", + "job_history_catalog", ] # Add all keywords that are restricted by EvaDB diff --git a/evadb/executor/create_job_executor.py b/evadb/executor/create_job_executor.py new file mode 100644 index 0000000000..1a614635fe --- /dev/null +++ b/evadb/executor/create_job_executor.py @@ -0,0 +1,139 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import re +from datetime import datetime + +import pandas as pd + +from evadb.database import EvaDBDatabase +from evadb.executor.abstract_executor import AbstractExecutor +from evadb.executor.executor_utils import ExecutorError +from evadb.models.storage.batch import Batch +from evadb.parser.create_statement import CreateJobStatement +from evadb.parser.parser import Parser +from evadb.utils.logging_manager import logger + + +class CreateJobExecutor(AbstractExecutor): + def __init__(self, db: EvaDBDatabase, node: CreateJobStatement): + super().__init__(db, node) + + def _parse_datetime_str(self, datetime_str: str) -> datetime: + datetime_format = "%Y-%m-%d %H:%M:%S" + date_format = "%Y-%m-%d" + + if re.match(r"\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}", datetime_str): + try: + return datetime.strptime(datetime_str, datetime_format) + except ValueError: + raise ExecutorError( + f"{datetime_str} is not in the correct datetime format. expected format: {datetime_format}." + ) + elif re.match(r"\d{4}-\d{2}-\d{2}", datetime_str): + try: + return datetime.strptime(datetime_str, date_format) + except ValueError: + raise ExecutorError( + f"{datetime_str} is not in the correct date format. expected format: {date_format}." + ) + else: + raise ValueError( + f"{datetime_str} does not match the expected date or datetime format" + ) + + def _get_repeat_time_interval_seconds( + self, repeat_interval: int, repeat_period: str + ) -> int: + unit_to_seconds = { + "seconds": 1, + "minute": 60, + "minutes": 60, + "min": 60, + "hour": 3600, + "hours": 3600, + "day": 86400, + "days": 86400, + "week": 604800, + "weeks": 604800, + "month": 2592000, + "months": 2592000, + } + assert (repeat_period is None) or ( + repeat_period in unit_to_seconds + ), "repeat period should be one of these values: seconds | minute | minutes | min | hour | hours | day | days | week | weeks | month | months" + + repeat_interval = 1 if repeat_interval is None else repeat_interval + return repeat_interval * unit_to_seconds.get(repeat_period, 0) + + def exec(self, *args, **kwargs): + # Check if the job already exists. + job_catalog_entry = self.catalog().get_job_catalog_entry(self.node.job_name) + + if job_catalog_entry is not None: + if self.node.if_not_exists: + msg = f"A job with name {self.node.job_name} already exists, nothing added." + yield Batch(pd.DataFrame([msg])) + return + else: + raise ExecutorError( + f"A job with name {self.node.job_name} already exists." + ) + + logger.debug(f"Creating job {self.node}") + + job_name = self.node.job_name + queries = [] + parser = Parser() + + for q in self.node.queries: + try: + curr_query = str(q) + parser.parse(curr_query) + queries.append(curr_query) + except Exception: + error_msg = f"Failed to parse the job query: {curr_query}" + logger.exception(error_msg) + raise ExecutorError(error_msg) + start_time = ( + self._parse_datetime_str(self.node.start_time) + if self.node.start_time is not None + else datetime.datetime.now() + ) + end_time = ( + self._parse_datetime_str(self.node.end_time) + if self.node.end_time is not None + else None + ) + repeat_interval = self._get_repeat_time_interval_seconds( + self.node.repeat_interval, self.node.repeat_period + ) + active = True + next_schedule_run = start_time + + self.catalog().insert_job_catalog_entry( + job_name, + queries, + start_time, + end_time, + repeat_interval, + active, + next_schedule_run, + ) + + yield Batch( + pd.DataFrame( + [f"The job {self.node.job_name} has been successfully created."] + ) + ) diff --git a/evadb/executor/drop_object_executor.py b/evadb/executor/drop_object_executor.py index a857f15eae..c4f108052e 100644 --- a/evadb/executor/drop_object_executor.py +++ b/evadb/executor/drop_object_executor.py @@ -46,6 +46,9 @@ def exec(self, *args, **kwargs): elif self.node.object_type == ObjectType.DATABASE: yield self._handle_drop_database(self.node.name, self.node.if_exists) + elif self.node.object_type == ObjectType.JOB: + yield self._handle_drop_job(self.node.name, self.node.if_exists) + def _handle_drop_table(self, table_name: str, if_exists: bool): if not self.catalog().check_table_exists(table_name): err_msg = "Table: {} does not exist".format(table_name) @@ -160,3 +163,24 @@ def _handle_drop_database(self, database_name: str, if_exists: bool): index=[0], ) ) + + def _handle_drop_job(self, job_name: str, if_exists: bool): + job_catalog_entry = self.catalog().get_job_catalog_entry(job_name) + if not job_catalog_entry: + err_msg = f"Job {job_name} does not exist, therefore cannot be dropped." + if if_exists: + logger.warning(err_msg) + return Batch(pd.DataFrame([err_msg])) + else: + raise RuntimeError(err_msg) + + logger.debug(f"Dropping Job {job_name}") + + self.catalog().drop_job_catalog_entry(job_catalog_entry) + + return Batch( + pd.DataFrame( + {f"Job {job_name} successfully dropped"}, + index=[0], + ) + ) diff --git a/evadb/executor/plan_executor.py b/evadb/executor/plan_executor.py index 94d290bdb3..a2921f3cbb 100644 --- a/evadb/executor/plan_executor.py +++ b/evadb/executor/plan_executor.py @@ -21,6 +21,7 @@ from evadb.executor.create_executor import CreateExecutor from evadb.executor.create_function_executor import CreateFunctionExecutor from evadb.executor.create_index_executor import CreateIndexExecutor +from evadb.executor.create_job_executor import CreateJobExecutor from evadb.executor.delete_executor import DeleteExecutor from evadb.executor.drop_object_executor import DropObjectExecutor from evadb.executor.exchange_executor import ExchangeExecutor @@ -48,7 +49,7 @@ from evadb.executor.use_executor import UseExecutor from evadb.executor.vector_index_scan_executor import VectorIndexScanExecutor from evadb.models.storage.batch import Batch -from evadb.parser.create_statement import CreateDatabaseStatement +from evadb.parser.create_statement import CreateDatabaseStatement, CreateJobStatement from evadb.parser.set_statement import SetStatement from evadb.parser.statement import AbstractStatement from evadb.parser.use_statement import UseStatement @@ -93,6 +94,8 @@ def _build_execution_tree( return UseExecutor(db=self._db, node=plan) elif isinstance(plan, SetStatement): return SetExecutor(db=self._db, node=plan) + elif isinstance(plan, CreateJobStatement): + return CreateJobExecutor(db=self._db, node=plan) # Get plan node type plan_opr_type = plan.opr_type diff --git a/evadb/interfaces/relational/db.py b/evadb/interfaces/relational/db.py index a8d66a22bf..428d0878f5 100644 --- a/evadb/interfaces/relational/db.py +++ b/evadb/interfaces/relational/db.py @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. import asyncio +import multiprocessing import pandas @@ -43,6 +44,7 @@ ) from evadb.server.command_handler import execute_statement from evadb.utils.generic_utils import find_nearest_word, is_ray_enabled_and_installed +from evadb.utils.job_scheduler import JobScheduler from evadb.utils.logging_manager import logger @@ -53,6 +55,7 @@ def __init__(self, evadb: EvaDBDatabase, reader, writer): self._cursor = None self._result: Batch = None self._evadb = evadb + self._jobs_process = None def cursor(self): """Retrieves a cursor associated with the connection. @@ -80,6 +83,23 @@ def cursor(self): self._cursor = EvaDBCursor(self) return self._cursor + def start_jobs(self): + if self._jobs_process and self._jobs_process.is_alive(): + logger.debug("The job scheduler is already running") + return + + job_scheduler = JobScheduler(self._evadb) + self._jobs_process = multiprocessing.Process(target=job_scheduler.execute) + self._jobs_process.daemon = True + self._jobs_process.start() + logger.debug("Job scheduler process started") + + def stop_jobs(self): + if self._jobs_process is not None and self._jobs_process.is_alive(): + self._jobs_process.terminate() + self._jobs_process.join() + logger.debug("Job scheduler process stopped") + class EvaDBCursor(object): def __init__(self, connection): diff --git a/evadb/parser/create_statement.py b/evadb/parser/create_statement.py index ca79a9eac4..89aee64cfa 100644 --- a/evadb/parser/create_statement.py +++ b/evadb/parser/create_statement.py @@ -12,7 +12,8 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -from typing import List, Tuple +from dataclasses import dataclass +from typing import List, Optional, Tuple from evadb.catalog.catalog_type import ColumnType, NdArrayType from evadb.parser.select_statement import SelectStatement @@ -226,3 +227,44 @@ def __str__(self) -> str: f"WITH ENGINE '{self.engine}' , \n" f"PARAMETERS = {self.param_dict};" ) + + +@dataclass +class CreateJobStatement(AbstractStatement): + job_name: str + queries: list + if_not_exists: bool + start_time: Optional[str] = None + end_time: Optional[str] = None + repeat_interval: Optional[int] = None + repeat_period: Optional[str] = None + + def __hash__(self): + return hash( + ( + super().__hash__(), + self.job_name, + tuple(self.queries), + self.start_time, + self.end_time, + self.repeat_interval, + self.repeat_period, + ) + ) + + def __post_init__(self): + super().__init__(StatementType.CREATE_JOB) + + def __str__(self): + start_str = f"\nSTART {self.start_time}" if self.start_time is not None else "" + end_str = f"\nEND {self.end_time}" if self.end_time is not None else "" + repeat_str = ( + f"\nEVERY {self.repeat_interval} {self.repeat_period}" + if self.repeat_interval is not None + else "" + ) + return ( + f"CREATE JOB {self.job_name} AS\n" + f"({(str(q) for q in self.queries)})" + f"{start_str} {end_str} {repeat_str}" + ) diff --git a/evadb/parser/evadb.lark b/evadb/parser/evadb.lark index ab4cdb6772..86798df6c0 100644 --- a/evadb/parser/evadb.lark +++ b/evadb/parser/evadb.lark @@ -1,11 +1,15 @@ // Top Level Description -start: (sql_statement? ";")+ +// create_job is intentionally not treated as an sql_statement to keep the parser clean +// because we assume that inside the job, the user can specify multiple sql_statements +// but not a create_job within a create_job. + +start: (sql_statement? ";")+ | (create_job ";") sql_statement: ddl_statement | dml_statement | utility_statement | context_statement - -ddl_statement: create_database | create_table | create_index | create_function - | drop_database | drop_table | drop_function | drop_index | rename_table + +ddl_statement: create_database | create_table | create_index | create_function | drop_database + | drop_table | drop_function | drop_index | drop_job | rename_table dml_statement: select_statement | insert_statement | update_statement | delete_statement | load_statement | set_statement @@ -14,6 +18,9 @@ utility_statement: describe_statement | show_statement | help_statement | explai context_statement: use_statement +job_sql_statements: query_string (";" query_string)* ";"? + + // Data Definition Language // Create statements @@ -29,7 +36,18 @@ create_database_engine_clause: WITH ENGINE "=" string_literal "," PARAMETERS "=" create_index: CREATE INDEX if_not_exists? uid ON table_name index_elem vector_store_type? create_table: CREATE TABLE if_not_exists? table_name (create_definitions | (AS select_statement)) - + +create_job: CREATE JOB if_not_exists? uid AS "{" job_sql_statements "}" (start_time)? (end_time)? (repeat_clause)? + +start_time: START string_literal + +end_time: END string_literal + +repeat_clause: EVERY decimal_literal simple_id + + + + // Rename statements rename_table: RENAME TABLE table_name TO table_name @@ -78,6 +96,8 @@ drop_index: DROP INDEX if_exists? uid drop_table: DROP TABLE if_exists? uid drop_function: DROP FUNCTION if_exists? uid + +drop_job: DROP JOB if_exists? uid // SET statements (configuration) set_statement: SET config_name (EQUAL_SYMBOL | TO) config_value @@ -348,7 +368,9 @@ DESC: "DESC"i DESCRIBE: "DESCRIBE"i DISTINCT: "DISTINCT"i DROP: "DROP"i +END: "END"i ENGINE: "ENGINE"i +EVERY: "EVERY"i EXIT: "EXIT"i EXISTS: "EXISTS"i EXPLAIN: "EXPLAIN"i @@ -364,6 +386,7 @@ INTO: "INTO"i INDEX: "INDEX"i INSERT: "INSERT"i IS: "IS"i +JOB: "JOB"i JOIN: "JOIN"i KEY: "KEY"i LATERAL: "LATERAL"i @@ -392,6 +415,7 @@ SET: "SET"i SHUTDOWN: "SHUTDOWN"i SHOW: "SHOW"i SOME: "SOME"i +START: "START"i TABLE: "TABLE"i TABLES: "TABLES"i TO: "TO"i @@ -567,7 +591,6 @@ REAL_LITERAL: (DEC_DIGIT+)? "." DEC_DIGIT+ DOT_ID: "." ID_LITERAL - // Identifiers ID: ID_LITERAL diff --git a/evadb/parser/lark_visitor/__init__.py b/evadb/parser/lark_visitor/__init__.py index 9ed0a1b6fe..911e886a2d 100644 --- a/evadb/parser/lark_visitor/__init__.py +++ b/evadb/parser/lark_visitor/__init__.py @@ -20,6 +20,7 @@ from evadb.parser.lark_visitor._create_statements import ( CreateDatabase, CreateIndex, + CreateJob, CreateTable, ) from evadb.parser.lark_visitor._delete_statement import Delete @@ -66,6 +67,7 @@ class LarkInterpreter( CreateTable, CreateIndex, CreateDatabase, + CreateJob, Expressions, Functions, Insert, @@ -89,3 +91,11 @@ def start(self, tree): def sql_statement(self, tree): return self.visit(tree.children[0]) + + def job_sql_statements(self, tree): + sql_statements = [] + for child in tree.children: + if isinstance(child, Tree): + if child.data == "query_string": + sql_statements.append(self.visit(child)) + return sql_statements diff --git a/evadb/parser/lark_visitor/_create_statements.py b/evadb/parser/lark_visitor/_create_statements.py index a24f1eafc9..72066b294c 100644 --- a/evadb/parser/lark_visitor/_create_statements.py +++ b/evadb/parser/lark_visitor/_create_statements.py @@ -22,6 +22,7 @@ ColConstraintInfo, ColumnDefinition, CreateDatabaseStatement, + CreateJobStatement, CreateTableStatement, ) from evadb.parser.table_ref import TableRef @@ -336,3 +337,49 @@ def create_database_engine_clause(self, tree): param_dict = self.visit(child) return engine, param_dict + + +class CreateJob: + def create_job(self, tree): + job_name = None + queries = [] + start_time = None + end_time = None + repeat_interval = None + repeat_period = None + if_not_exists = False + for child in tree.children: + if isinstance(child, Tree): + if child.data == "if_not_exists": + if_not_exists = True + if child.data == "uid": + job_name = self.visit(child) + if child.data == "job_sql_statements": + queries = self.visit(child) + elif child.data == "start_time": + start_time = self.visit(child) + elif child.data == "end_time": + end_time = self.visit(child) + elif child.data == "repeat_clause": + repeat_interval, repeat_period = self.visit(child) + + create_job = CreateJobStatement( + job_name, + queries, + if_not_exists, + start_time, + end_time, + repeat_interval, + repeat_period, + ) + + return create_job + + def start_time(self, tree): + return self.visit(tree.children[1]).value + + def end_time(self, tree): + return self.visit(tree.children[1]).value + + def repeat_clause(self, tree): + return self.visit(tree.children[1]), self.visit(tree.children[2]) diff --git a/evadb/parser/lark_visitor/_drop_statement.py b/evadb/parser/lark_visitor/_drop_statement.py index 0b397378ae..7fc96298ed 100644 --- a/evadb/parser/lark_visitor/_drop_statement.py +++ b/evadb/parser/lark_visitor/_drop_statement.py @@ -73,3 +73,17 @@ def drop_database(self, tree): database_name = self.visit(child) return DropObjectStatement(ObjectType.DATABASE, database_name, if_exists) + + # Drop Job + def drop_job(self, tree): + job_name = None + if_exists = False + + for child in tree.children: + if isinstance(child, Tree): + if child.data == "if_exists": + if_exists = True + elif child.data == "uid": + job_name = self.visit(child) + + return DropObjectStatement(ObjectType.JOB, job_name, if_exists) diff --git a/evadb/parser/select_statement.py b/evadb/parser/select_statement.py index b04c7148bb..69270a6b84 100644 --- a/evadb/parser/select_statement.py +++ b/evadb/parser/select_statement.py @@ -141,7 +141,11 @@ def __str__(self) -> str: orderby_list_str += str(expr[0]) + " " + sort_str + ", " orderby_list_str = orderby_list_str.rstrip(", ") - select_str = f"SELECT {target_list_str} FROM {str(self._from_table)}" + select_str = f"SELECT {target_list_str}" + + if self._from_table is not None: + select_str += " FROM " + str(self._from_table) + if self._where_clause is not None: select_str += " WHERE " + str(self._where_clause) diff --git a/evadb/parser/types.py b/evadb/parser/types.py index 751d2b5f31..227a768c7b 100644 --- a/evadb/parser/types.py +++ b/evadb/parser/types.py @@ -42,6 +42,7 @@ class StatementType(EvaDBEnum): CREATE_DATABASE # noqa: F821 USE # noqa: F821 SET # noqa: F821 + CREATE_JOB # noqa: F821 # add other types @@ -83,3 +84,4 @@ class ObjectType(EvaDBEnum): FUNCTION # noqa: F821 INDEX # noqa: F821 DATABASE # noqa: F821 + JOB # noqa: F821 diff --git a/evadb/parser/utils.py b/evadb/parser/utils.py index a2be06ec16..dd4567cf4b 100644 --- a/evadb/parser/utils.py +++ b/evadb/parser/utils.py @@ -13,7 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. from evadb.parser.create_function_statement import CreateFunctionStatement -from evadb.parser.create_statement import CreateDatabaseStatement, CreateTableStatement +from evadb.parser.create_statement import ( + CreateDatabaseStatement, + CreateJobStatement, + CreateTableStatement, +) from evadb.parser.drop_object_statement import DropObjectStatement from evadb.parser.explain_statement import ExplainStatement from evadb.parser.insert_statement import InsertTableStatement @@ -30,6 +34,7 @@ # directly to the executor. SKIP_BINDER_AND_OPTIMIZER_STATEMENTS = ( CreateDatabaseStatement, + CreateJobStatement, UseStatement, SetStatement, ) diff --git a/evadb/utils/job_scheduler.py b/evadb/utils/job_scheduler.py new file mode 100644 index 0000000000..74ee99b7fc --- /dev/null +++ b/evadb/utils/job_scheduler.py @@ -0,0 +1,120 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import datetime +import sys +import time + +from evadb.catalog.models.utils import JobCatalogEntry +from evadb.database import EvaDBDatabase +from evadb.server.command_handler import execute_query +from evadb.utils.logging_manager import logger + + +class JobScheduler: + def __init__(self, evadb: EvaDBDatabase) -> None: + self.poll_interval_seconds = 30 + self._evadb = evadb + + def _update_next_schedule_run(self, job_catalog_entry: JobCatalogEntry) -> bool: + job_end_time = job_catalog_entry.end_time + active_status = False + if job_catalog_entry.repeat_interval and job_catalog_entry.repeat_interval > 0: + next_trigger_time = datetime.datetime.now() + datetime.timedelta( + seconds=job_catalog_entry.repeat_interval + ) + if not job_end_time or next_trigger_time < job_end_time: + active_status = True + + next_trigger_time = ( + next_trigger_time if active_status else job_catalog_entry.next_scheduled_run + ) + self._evadb.catalog().update_job_catalog_entry( + job_catalog_entry.name, + next_trigger_time, + active_status, + ) + return active_status, next_trigger_time + + def _get_sleep_time(self, next_job_entry: JobCatalogEntry) -> int: + sleep_time = self.poll_interval_seconds + if next_job_entry: + sleep_time = min( + sleep_time, + ( + next_job_entry.next_scheduled_run - datetime.datetime.now() + ).total_seconds(), + ) + sleep_time = max(0, sleep_time) + return sleep_time + + def _scan_and_execute_jobs(self): + while True: + try: + for next_executable_job in iter( + lambda: self._evadb.catalog().get_next_executable_job( + only_past_jobs=True + ), + None, + ): + execution_time = datetime.datetime.now() + + # insert a job history record to mark start of this execution + self._evadb.catalog().insert_job_history_catalog_entry( + next_executable_job.row_id, + next_executable_job.name, + execution_time, + None, + ) + + # execute the queries of the job + execution_results = [ + execute_query(self._evadb, query) + for query in next_executable_job.queries + ] + logger.debug( + f"Exection result for job: {next_executable_job.name} results: {execution_results}" + ) + + # update the next trigger time for this job + self._update_next_schedule_run(next_executable_job) + + # update the previosly inserted job history record with endtime + self._evadb.catalog().update_job_history_end_time( + next_executable_job.row_id, + execution_time, + datetime.datetime.now(), + ) + + next_executable_job = self._evadb.catalog().get_next_executable_job( + only_past_jobs=False + ) + + sleep_time = self._get_sleep_time(next_executable_job) + if sleep_time > 0: + logger.debug( + f"Job scheduler process sleeping for {sleep_time} seconds" + ) + time.sleep(sleep_time) + except Exception as e: + logger.error(f"Got an exception in job scheduler: {str(e)}") + time.sleep(self.poll_interval_seconds * 0.2) + + def execute(self): + try: + self._scan_and_execute_jobs() + except KeyboardInterrupt: + logger.debug("Exiting the job scheduler process due to interrupt") + sys.exit() diff --git a/test/integration_tests/long/test_job_scheduler_execution.py b/test/integration_tests/long/test_job_scheduler_execution.py new file mode 100644 index 0000000000..e00b3ce537 --- /dev/null +++ b/test/integration_tests/long/test_job_scheduler_execution.py @@ -0,0 +1,94 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import time +import unittest +from datetime import datetime, timedelta +from test.util import get_evadb_for_testing, shutdown_ray + +from mock import MagicMock + +from evadb.interfaces.relational.db import EvaDBConnection +from evadb.server.command_handler import execute_query_fetch_all + + +class JobSchedulerIntegrationTests(unittest.TestCase): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + @classmethod + def setUpClass(cls): + cls.evadb = get_evadb_for_testing() + # reset the catalog manager before running each test + cls.evadb.catalog().reset() + cls.job_name_1 = "test_async_job_1" + cls.job_name_2 = "test_async_job_2" + + def setUp(self): + execute_query_fetch_all(self.evadb, f"DROP JOB IF EXISTS {self.job_name_1};") + execute_query_fetch_all(self.evadb, f"DROP JOB IF EXISTS {self.job_name_2};") + + @classmethod + def tearDownClass(cls): + shutdown_ray() + execute_query_fetch_all(cls.evadb, f"DROP JOB IF EXISTS {cls.job_name_1};") + execute_query_fetch_all(cls.evadb, f"DROP JOB IF EXISTS {cls.job_name_2};") + + def create_jobs(self): + datetime_format = "%Y-%m-%d %H:%M:%S" + start_time = (datetime.now() - timedelta(seconds=10)).strftime(datetime_format) + end_time = (datetime.now() + timedelta(seconds=60)).strftime(datetime_format) + + create_csv_query = """CREATE TABLE IF NOT EXISTS MyCSV ( + id INTEGER UNIQUE, + frame_id INTEGER, + video_id INTEGER + ); + """ + job_1_query = f"""CREATE JOB IF NOT EXISTS {self.job_name_1} AS {{ + SELECT * FROM MyCSV; + }} + START '{start_time}' + END '{end_time}' + EVERY 4 seconds; + """ + job_2_query = f"""CREATE JOB IF NOT EXISTS {self.job_name_2} AS {{ + SHOW FUNCTIONS; + }} + START '{start_time}' + END '{end_time}' + EVERY 2 seconds; + """ + + execute_query_fetch_all(self.evadb, create_csv_query) + execute_query_fetch_all(self.evadb, job_1_query) + execute_query_fetch_all(self.evadb, job_2_query) + + def test_should_execute_the_scheduled_jobs(self): + self.create_jobs() + connection = EvaDBConnection(self.evadb, MagicMock(), MagicMock()) + + # start the job scheduler + connection.start_jobs() + + # let the job scheduler run for 10 seconds + time.sleep(15) + connection.stop_jobs() + + job_1_execution_count = len(self.evadb.catalog().get_job_history_by_job_id(1)) + job_2_execution_count = len(self.evadb.catalog().get_job_history_by_job_id(2)) + + self.assertGreater(job_2_execution_count, job_1_execution_count) + self.assertGreater(job_2_execution_count, 2) + self.assertGreater(job_1_execution_count, 2) diff --git a/test/integration_tests/short/test_create_job_executor.py b/test/integration_tests/short/test_create_job_executor.py new file mode 100644 index 0000000000..9a9ce18c1b --- /dev/null +++ b/test/integration_tests/short/test_create_job_executor.py @@ -0,0 +1,126 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import unittest +from datetime import datetime +from test.util import get_evadb_for_testing, shutdown_ray + +from evadb.executor.executor_utils import ExecutorError +from evadb.server.command_handler import execute_query_fetch_all + + +class CreateJobTest(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.evadb = get_evadb_for_testing() + # reset the catalog manager before running each test + cls.evadb.catalog().reset() + cls.job_name = "test_async_job" + + def setUp(self): + execute_query_fetch_all(self.evadb, f"DROP JOB IF EXISTS {self.job_name};") + + @classmethod + def tearDownClass(cls): + shutdown_ray() + execute_query_fetch_all(cls.evadb, f"DROP JOB IF EXISTS {cls.job_name};") + + def test_invalid_query_in_job_should_raise_exception(self): + # missing closing paranthesis in the query + query = f"""CREATE JOB {self.job_name} AS {{ + CREATE OR REPLACE FUNCTION HomeSalesForecast FROM + ( SELECT * FROM postgres_data.home_sales + TYPE Forecasting + PREDICT 'price'; + }} + START '2023-04-01 01:10:00' + END '2023-05-01' + EVERY 2 week; + """ + with self.assertRaisesRegex(Exception, "Failed to parse the job query"): + execute_query_fetch_all(self.evadb, query) + + def test_create_job_should_add_the_entry(self): + queries = [ + """CREATE OR REPLACE FUNCTION HomeSalesForecast FROM + ( SELECT * FROM postgres_data.home_sales ) + TYPE Forecasting + PREDICT 'price';""", + "Select HomeSalesForecast(10);", + ] + start = "2023-04-01 01:10:00" + end = "2023-05-01" + repeat_interval = 2 + repeat_period = "week" + + all_queries = "".join(queries) + query = f"""CREATE JOB {self.job_name} AS {{ + {all_queries} + }} + START '{start}' + END '{end}' + EVERY {repeat_interval} {repeat_period};""" + + execute_query_fetch_all(self.evadb, query) + + datetime_format = "%Y-%m-%d %H:%M:%S" + date_format = "%Y-%m-%d" + job_entry = self.evadb.catalog().get_job_catalog_entry(self.job_name) + self.assertEqual(job_entry.name, self.job_name) + self.assertEqual( + job_entry.start_time, datetime.strptime(start, datetime_format) + ) + self.assertEqual(job_entry.end_time, datetime.strptime(end, date_format)) + self.assertEqual(job_entry.repeat_interval, 2 * 7 * 24 * 60 * 60) + self.assertEqual(job_entry.active, True) + self.assertEqual(len(job_entry.queries), len(queries)) + + def test_should_create_job_with_if_not_exists(self): + if_not_exists = "IF NOT EXISTS" + + queries = [ + """CREATE OR REPLACE FUNCTION HomeSalesForecast FROM + ( SELECT * FROM postgres_data.home_sales ) + TYPE Forecasting + PREDICT 'price';""", + "Select HomeSalesForecast(10);", + ] + + query = """CREATE JOB {} {} AS {{ + {} + }} + START '2023-04-01' + END '2023-05-01' + EVERY 2 week; + """ + + # Create the database. + execute_query_fetch_all( + self.evadb, query.format(if_not_exists, self.job_name, "".join(queries)) + ) + + # Trying to create the same database should raise an exception. + with self.assertRaises(ExecutorError): + execute_query_fetch_all( + self.evadb, query.format("", self.job_name, "".join(queries)) + ) + + # Trying to create the same database should warn if "IF NOT EXISTS" is provided. + execute_query_fetch_all( + self.evadb, query.format(if_not_exists, self.job_name, "".join(queries)) + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/test/integration_tests/short/test_drop_executor.py b/test/integration_tests/short/test_drop_executor.py index 632aa4a008..53dc1211eb 100644 --- a/test/integration_tests/short/test_drop_executor.py +++ b/test/integration_tests/short/test_drop_executor.py @@ -245,3 +245,39 @@ def test_should_drop_database(self): result = execute_query_fetch_all( self.evadb, f"DROP DATABASE IF EXISTS {database_name}" ) + + def test_should_drop_job(self): + # Create database. + job_name = "test_async_job" + + query = f"""CREATE JOB {job_name} AS {{ + SELECT * from job_catalog; + }} + START '2023-04-01' + END '2023-05-01' + EVERY 2 week;""" + + execute_query_fetch_all(self.evadb, query) + self.assertIsNotNone(self.evadb.catalog().get_job_catalog_entry(job_name)) + + # DROP JOB + execute_query_fetch_all(self.evadb, f"DROP JOB {job_name}") + self.assertIsNone(self.evadb.catalog().get_job_catalog_entry(job_name)) + + # DROP should pass with warning + result = execute_query_fetch_all(self.evadb, f"DROP JOB IF EXISTS {job_name}") + self.assertTrue("does not exist" in result.frames.to_string()) + + # DROP should throw error + with self.assertRaises(ExecutorError): + execute_query_fetch_all( + self.evadb, + f"DROP JOB {job_name}", + do_not_print_exceptions=True, + ) + + # We should be able to add the database again + execute_query_fetch_all(self.evadb, query) + + # clean up + result = execute_query_fetch_all(self.evadb, f"DROP JOB IF EXISTS {job_name}") diff --git a/test/unit_tests/parser/test_parser.py b/test/unit_tests/parser/test_parser.py index 6241323d44..6086db088e 100644 --- a/test/unit_tests/parser/test_parser.py +++ b/test/unit_tests/parser/test_parser.py @@ -1243,3 +1243,30 @@ def test_class_equality(self): self.assertNotEqual(tuple_frame, table_ref) self.assertNotEqual(join_node, table_ref) self.assertNotEqual(table_ref, table_info) + + def test_create_job(self): + queries = [ + """CREATE OR REPLACE FUNCTION HomeSalesForecast FROM + ( SELECT * FROM postgres_data.home_sales ) + TYPE Forecasting + PREDICT 'price';""", + "Select HomeSalesForecast(10);", + ] + job_query = f"""CREATE JOB my_job AS {{ + {''.join(queries)} + }} + START '2023-04-01' + END '2023-05-01' + EVERY 2 hour + """ + + parser = Parser() + job_stmt = parser.parse(job_query)[0] + self.assertEqual(job_stmt.job_name, "my_job") + self.assertEqual(len(job_stmt.queries), 2) + self.assertTrue(queries[0].rstrip(";") == str(job_stmt.queries[0])) + self.assertTrue(queries[1].rstrip(";") == str(job_stmt.queries[1])) + self.assertEqual(job_stmt.start_time, "2023-04-01") + self.assertEqual(job_stmt.end_time, "2023-05-01") + self.assertEqual(job_stmt.repeat_interval, 2) + self.assertEqual(job_stmt.repeat_period, "hour") diff --git a/test/unit_tests/utils/test_job_scheduler.py b/test/unit_tests/utils/test_job_scheduler.py new file mode 100644 index 0000000000..36f54cd9b6 --- /dev/null +++ b/test/unit_tests/utils/test_job_scheduler.py @@ -0,0 +1,81 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import unittest +from datetime import datetime, timedelta + +from mock import MagicMock + +from evadb.catalog.models.utils import JobCatalogEntry +from evadb.utils.job_scheduler import JobScheduler + + +class JobSchedulerTests(unittest.TestCase): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + def get_dummy_job_catalog_entry(self, active, job_name, next_run): + return JobCatalogEntry( + name=job_name, + queries=None, + start_time=None, + end_time=None, + repeat_interval=None, + active=active, + next_scheduled_run=next_run, + created_at=None, + updated_at=None, + ) + + def test_sleep_time_calculation(self): + past_job = self.get_dummy_job_catalog_entry( + True, "past_job", datetime.now() - timedelta(seconds=10) + ) + future_job = self.get_dummy_job_catalog_entry( + True, "future_job", datetime.now() + timedelta(seconds=20) + ) + + job_scheduler = JobScheduler(MagicMock()) + + self.assertEqual(job_scheduler._get_sleep_time(past_job), 0) + self.assertGreaterEqual(job_scheduler._get_sleep_time(future_job), 10) + self.assertEqual(job_scheduler._get_sleep_time(None), 30) + + def test_update_next_schedule_run(self): + future_time = datetime.now() + timedelta(seconds=1000) + job_scheduler = JobScheduler(MagicMock()) + job_entry = self.get_dummy_job_catalog_entry(True, "job", datetime.now()) + + # job which runs just once + job_entry.end_time = future_time + status, next_run = job_scheduler._update_next_schedule_run(job_entry) + self.assertEqual(status, False, "status for one time job should be false") + + # recurring job with valid end date + job_entry.end_time = future_time + job_entry.repeat_interval = 120 + expected_next_run = datetime.now() + timedelta(seconds=120) + status, next_run = job_scheduler._update_next_schedule_run(job_entry) + self.assertEqual(status, True, "status for recurring time job should be true") + self.assertGreaterEqual(next_run, expected_next_run) + + # recurring job with expired end date + job_entry.end_time = datetime.now() + timedelta(seconds=60) + job_entry.repeat_interval = 120 + expected_next_run = datetime.now() + timedelta(seconds=120) + status, next_run = job_scheduler._update_next_schedule_run(job_entry) + self.assertEqual( + status, False, "status for rexpired ecurring time job should be false" + ) + self.assertLessEqual(next_run, datetime.now()) From 2575f4f75735de95143dea697526bfcf612be590 Mon Sep 17 00:00:00 2001 From: Andy Xu Date: Thu, 16 Nov 2023 09:53:45 -0800 Subject: [PATCH 14/25] Fix python3.8 failing testcases due to type hint (#1364) --- evadb/catalog/catalog_manager.py | 4 ++-- evadb/catalog/services/job_history_catalog_service.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/evadb/catalog/catalog_manager.py b/evadb/catalog/catalog_manager.py index 62ad30a59e..8482bf1bd6 100644 --- a/evadb/catalog/catalog_manager.py +++ b/evadb/catalog/catalog_manager.py @@ -333,7 +333,7 @@ def insert_job_history_catalog_entry( return job_history_entry - def get_job_history_by_job_id(self, job_id: int) -> list[JobHistoryCatalogEntry]: + def get_job_history_by_job_id(self, job_id: int) -> List[JobHistoryCatalogEntry]: """Returns all the entries present for this job_id on in the history. Args: @@ -343,7 +343,7 @@ def get_job_history_by_job_id(self, job_id: int) -> list[JobHistoryCatalogEntry] def update_job_history_end_time( self, job_id: int, execution_start_time: datetime, execution_end_time: datetime - ) -> list[JobHistoryCatalogEntry]: + ) -> List[JobHistoryCatalogEntry]: """Updates the execution_end_time for this job history matching job_id and execution_start_time. Args: diff --git a/evadb/catalog/services/job_history_catalog_service.py b/evadb/catalog/services/job_history_catalog_service.py index bd1b27c8b9..7082c3f3e4 100644 --- a/evadb/catalog/services/job_history_catalog_service.py +++ b/evadb/catalog/services/job_history_catalog_service.py @@ -14,6 +14,7 @@ # limitations under the License. import datetime +from typing import List from sqlalchemy import and_ from sqlalchemy.orm import Session @@ -54,7 +55,7 @@ def insert_entry( return job_history_catalog_obj.as_dataclass() - def get_entry_by_job_id(self, job_id: int) -> list[JobHistoryCatalogEntry]: + def get_entry_by_job_id(self, job_id: int) -> List[JobHistoryCatalogEntry]: """ Get all the job history catalog entry with given job id. Arguments: From 69b39b82139821776a37e3ddede1f14857562155 Mon Sep 17 00:00:00 2001 From: Sayan Sinha Date: Thu, 16 Nov 2023 12:54:01 -0500 Subject: [PATCH 15/25] Add feedback for forecasting (#1258) Provide feedback when `Forecasting` UDF is called in the following ways: - [x] Reporting confidence intervals - [x] Returning a metric for the forecasting performance. - [x] Providing suggestions in simple special cases, such as during Flat predictions. Eg: ```sql SELECT HomeForecast(); ``` ``` SUGGESTION: Predictions are flat. Consider using LIBRARY 'neuralforecast' for more accrate predictions. ``` Partially fixes #1257 and #1243. --------- Co-authored-by: Andy Xu --- .../source/reference/ai/model-forecasting.rst | 22 ++- evadb/binder/statement_binder.py | 17 +++ evadb/executor/create_function_executor.py | 127 ++++++++++++++++-- evadb/functions/forecast.py | 61 ++++++++- .../long/test_model_forecasting.py | 30 ++++- .../binder/test_statement_binder.py | 36 ++++- 6 files changed, 269 insertions(+), 24 deletions(-) diff --git a/docs/source/reference/ai/model-forecasting.rst b/docs/source/reference/ai/model-forecasting.rst index 48f644e690..f339342c6d 100644 --- a/docs/source/reference/ai/model-forecasting.rst +++ b/docs/source/reference/ai/model-forecasting.rst @@ -3,6 +3,7 @@ Time Series Forecasting ======================== +A Time Series is a series of data points recorded at different time intervals. Time series forecasting involves estimating future values of a time series by analyzing historical data. You can train a forecasting model easily in EvaDB. .. note:: @@ -28,15 +29,14 @@ Next, we create a function of `TYPE Forecasting`. We must enter the column name CREATE FUNCTION IF NOT EXISTS Forecast FROM (SELECT y FROM AirData) TYPE Forecasting + HORIZON 12 PREDICT 'y'; This trains a forecasting model. The model can be called by providing the horizon for forecasting. .. code-block:: sql - SELECT Forecast(12); - -Here, the horizon is `12`, which represents the forecast 12 steps into the future. + SELECT Forecast(); Forecast Parameters @@ -61,10 +61,22 @@ EvaDB's default forecast framework is `statsforecast `_ to learn details about these models. If LIBRARY is `neuralforecast`, we can select one of NHITS or NBEATS. The default is NBEATS. Check `NBEATS docs `_ for details. * - AUTO (str, default: 'T') - If set to 'T', it enables automatic hyperparameter optimization. Must be set to 'T' for `statsforecast` library. One may set this parameter to `false` if LIBRARY is `neuralforecast` for faster (but less reliable) results. - * - Frequency (str, default: 'auto') + * - CONF (int, default: 90) + - Sets the confidence interval in percentage for the forecast. Must be a number between 0 and 100. The lower and upper bounds of the confidence interval are returned in two separate columns, named as the PREDICT column with `-lo` and `-hi` suffixes. + * - FREQUENCY (str, default: 'auto') - A string indicating the frequency of the data. The common used ones are D, W, M, Y, which respectively represents day-, week-, month- and year- end frequency. The default value is M. Check `pandas available frequencies `_ for all available frequencies. If it is not provided, the frequency is attempted to be determined automatically. + * - METRICS (str, default: 'True') + - Compute NRMSE by performing cross-validation. It is `False` by default if `LIBRARY` is `neuralforecast` as it can take an extensively long time. The metrics are logged locally. + +.. note:: + + If columns other than the ones required as mentioned above are passed while creating the function, they will be treated as exogenous variables if LIBRARY is `neuralforecast`. Otherwise, they would be ignored. + + +.. note:: + + `Forecasting` function also logs suggestions. Logged information, such as metrics and suggestions, is sent to STDOUT by default. If you wish not to print it, please send `FALSE` as an optional argument while calling the function. Eg. `SELECT Forecast(FALSE);` -Note: If columns other than the ones required as mentioned above are passed while creating the function, they will be treated as exogenous variables if LIBRARY is `neuralforecast`. Otherwise, they would be ignored. Below is an example query specifying the above parameters: diff --git a/evadb/binder/statement_binder.py b/evadb/binder/statement_binder.py index e08085a1d8..07e720335d 100644 --- a/evadb/binder/statement_binder.py +++ b/evadb/binder/statement_binder.py @@ -89,6 +89,7 @@ def _bind_create_function_statement(self, node: CreateFunctionStatement): for column in all_column_list: if column.name in predict_columns: column.name = column.name + "_predictions" + outputs.append(column) else: inputs.append(column) @@ -122,6 +123,22 @@ def _bind_create_function_statement(self, node: CreateFunctionStatement): assert ( len(required_columns) == 0 ), f"Missing required {required_columns} columns for forecasting function." + outputs.extend( + [ + ColumnDefinition( + arg_map.get("predict", "y") + "-lo", + ColumnType.FLOAT, + None, + None, + ), + ColumnDefinition( + arg_map.get("predict", "y") + "-hi", + ColumnType.FLOAT, + None, + None, + ), + ] + ) else: raise BinderError( f"Unsupported type of function: {node.function_type}." diff --git a/evadb/executor/create_function_executor.py b/evadb/executor/create_function_executor.py index dc57bbc283..9488195927 100644 --- a/evadb/executor/create_function_executor.py +++ b/evadb/executor/create_function_executor.py @@ -22,6 +22,7 @@ from pathlib import Path from typing import Dict, List +import numpy as np import pandas as pd from evadb.catalog.catalog_utils import get_metadata_properties @@ -55,6 +56,10 @@ from evadb.utils.logging_manager import logger +def root_mean_squared_error(y_true, y_pred): + return np.sqrt(np.mean(np.square(y_pred - y_true))) + + # From https://stackoverflow.com/a/34333710 @contextlib.contextmanager def set_env(**environ): @@ -354,6 +359,20 @@ def handle_forecasting_function(self): aggregated_batch.rename(columns={arg_map["time"]: "ds"}) if "id" in arg_map.keys(): aggregated_batch.rename(columns={arg_map["id"]: "unique_id"}) + if "conf" in arg_map.keys(): + try: + conf = round(arg_map["conf"]) + except Exception: + err_msg = "Confidence must be a number." + logger.error(err_msg) + raise FunctionIODefinitionError(err_msg) + else: + conf = 90 + + if conf > 100: + err_msg = "Confidence must <= 100." + logger.error(err_msg) + raise FunctionIODefinitionError(err_msg) data = aggregated_batch.frames if "unique_id" not in list(data.columns): @@ -396,18 +415,51 @@ def handle_forecasting_function(self): if library == "neuralforecast": try_to_import_neuralforecast() from neuralforecast import NeuralForecast - from neuralforecast.auto import AutoNBEATS, AutoNHITS - from neuralforecast.models import NBEATS, NHITS + from neuralforecast.auto import ( + AutoDeepAR, + AutoFEDformer, + AutoInformer, + AutoNBEATS, + AutoNHITS, + AutoPatchTST, + AutoTFT, + ) + + # from neuralforecast.auto import AutoAutoformer as AutoAFormer + from neuralforecast.losses.pytorch import MQLoss + from neuralforecast.models import ( + NBEATS, + NHITS, + TFT, + DeepAR, + FEDformer, + Informer, + PatchTST, + ) + + # from neuralforecast.models import Autoformer as AFormer model_dict = { "AutoNBEATS": AutoNBEATS, "AutoNHITS": AutoNHITS, "NBEATS": NBEATS, "NHITS": NHITS, + "PatchTST": PatchTST, + "AutoPatchTST": AutoPatchTST, + "DeepAR": DeepAR, + "AutoDeepAR": AutoDeepAR, + "FEDformer": FEDformer, + "AutoFEDformer": AutoFEDformer, + # "AFormer": AFormer, + # "AutoAFormer": AutoAFormer, + "Informer": Informer, + "AutoInformer": AutoInformer, + "TFT": TFT, + "AutoTFT": AutoTFT, } if "model" not in arg_map.keys(): - arg_map["model"] = "NBEATS" + arg_map["model"] = "TFT" if "auto" not in arg_map.keys() or ( arg_map["auto"].lower()[0] == "t" @@ -441,13 +493,16 @@ def handle_forecasting_function(self): else: model_args_config["hist_exog_list"] = exogenous_columns - def get_optuna_config(trial): - return model_args_config + if "auto" in arg_map["model"].lower(): - model_args["config"] = get_optuna_config - model_args["backend"] = "optuna" + def get_optuna_config(trial): + return model_args_config + + model_args["config"] = get_optuna_config + model_args["backend"] = "optuna" model_args["h"] = horizon + model_args["loss"] = MQLoss(level=[conf]) model = NeuralForecast( [model_here(**model_args)], @@ -492,7 +547,11 @@ def get_optuna_config(trial): data["ds"] = pd.to_datetime(data["ds"]) - model_save_dir_name = library + "_" + arg_map["model"] + "_" + new_freq + model_save_dir_name = ( + library + "_" + arg_map["model"] + "_" + new_freq + if "statsforecast" in library + else library + "_" + str(conf) + "_" + arg_map["model"] + "_" + new_freq + ) if len(data.columns) >= 4 and library == "neuralforecast": model_save_dir_name += "_exogenous_" + str(sorted(exogenous_columns)) @@ -524,6 +583,7 @@ def get_optuna_config(trial): data[column] = data.apply( lambda x: self.convert_to_numeric(x[column]), axis=1 ) + rmses = [] if library == "neuralforecast": cuda_devices_here = "0" if "CUDA_VISIBLE_DEVICES" in os.environ: @@ -532,6 +592,26 @@ def get_optuna_config(trial): with set_env(CUDA_VISIBLE_DEVICES=cuda_devices_here): model.fit(df=data, val_size=horizon) model.save(model_path, overwrite=True) + if "metrics" in arg_map and arg_map["metrics"].lower()[0] == "t": + crossvalidation_df = model.cross_validation( + df=data, val_size=horizon + ) + for uid in crossvalidation_df.unique_id.unique(): + crossvalidation_df_here = crossvalidation_df[ + crossvalidation_df.unique_id == uid + ] + rmses.append( + root_mean_squared_error( + crossvalidation_df_here.y, + crossvalidation_df_here[ + arg_map["model"] + "-median" + ], + ) + / np.mean(crossvalidation_df_here.y) + ) + mean_rmse = np.mean(rmses) + with open(model_path + "_rmse", "w") as f: + f.write(str(mean_rmse) + "\n") else: # The following lines of code helps eliminate the math error encountered in statsforecast when only one datapoint is available in a time series for col in data["unique_id"].unique(): @@ -541,14 +621,40 @@ def get_optuna_config(trial): ) model.fit(df=data[["ds", "y", "unique_id"]]) + hypers = "" + if "arima" in arg_map["model"].lower(): + from statsforecast.arima import arima_string + + hypers += arima_string(model.fitted_[0, 0].model_) f = open(model_path, "wb") pickle.dump(model, f) f.close() + if "metrics" not in arg_map or arg_map["metrics"].lower()[0] == "t": + crossvalidation_df = model.cross_validation( + df=data[["ds", "y", "unique_id"]], + h=horizon, + step_size=24, + n_windows=1, + ).reset_index() + for uid in crossvalidation_df.unique_id.unique(): + crossvalidation_df_here = crossvalidation_df[ + crossvalidation_df.unique_id == uid + ] + rmses.append( + root_mean_squared_error( + crossvalidation_df_here.y, + crossvalidation_df_here[arg_map["model"]], + ) + / np.mean(crossvalidation_df_here.y) + ) + mean_rmse = np.mean(rmses) + with open(model_path + "_rmse", "w") as f: + f.write(str(mean_rmse) + "\n") + f.write(hypers + "\n") elif not Path(model_path).exists(): model_path = os.path.join(model_dir, existing_model_files[-1]) - io_list = self._resolve_function_io(None) - + data["ds"] = data.ds.astype(str) metadata_here = [ FunctionMetadataCatalogEntry("model_name", arg_map["model"]), FunctionMetadataCatalogEntry("model_path", model_path), @@ -563,6 +669,7 @@ def get_optuna_config(trial): ), FunctionMetadataCatalogEntry("horizon", horizon), FunctionMetadataCatalogEntry("library", library), + FunctionMetadataCatalogEntry("conf", conf), ] return ( diff --git a/evadb/functions/forecast.py b/evadb/functions/forecast.py index 46376852d2..6041e6b499 100644 --- a/evadb/functions/forecast.py +++ b/evadb/functions/forecast.py @@ -14,6 +14,7 @@ # limitations under the License. +import os import pickle import pandas as pd @@ -37,6 +38,7 @@ def setup( id_column_rename: str, horizon: int, library: str, + conf: int, ): self.library = library if "neuralforecast" in self.library: @@ -53,18 +55,69 @@ def setup( self.time_column_rename = time_column_rename self.id_column_rename = id_column_rename self.horizon = int(horizon) + self.library = library + self.suggestion_dict = { + 1: "Predictions are flat. Consider using LIBRARY 'neuralforecast' for more accrate predictions.", + } + self.conf = conf + self.hypers = None + self.rmse = None + if os.path.isfile(model_path + "_rmse"): + with open(model_path + "_rmse", "r") as f: + self.rmse = float(f.readline()) + if "arima" in model_name.lower(): + self.hypers = "p,d,q: " + f.readline() def forward(self, data) -> pd.DataFrame: + log_str = "" if self.library == "statsforecast": - forecast_df = self.model.predict(h=self.horizon) + forecast_df = self.model.predict( + h=self.horizon, level=[self.conf] + ).reset_index() else: - forecast_df = self.model.predict() - forecast_df.reset_index(inplace=True) + forecast_df = self.model.predict().reset_index() + + # Feedback + if len(data) == 0 or list(list(data.iloc[0]))[0] is True: + # Suggestions + suggestion_list = [] + # 1: Flat predictions + if self.library == "statsforecast": + for type_here in forecast_df["unique_id"].unique(): + if ( + forecast_df.loc[forecast_df["unique_id"] == type_here][ + self.model_name + ].nunique() + == 1 + ): + suggestion_list.append(1) + + for suggestion in set(suggestion_list): + log_str += "\nSUGGESTION: " + self.suggestion_dict[suggestion] + + # Metrics + if self.rmse is not None: + log_str += "\nMean normalized RMSE: " + str(self.rmse) + if self.hypers is not None: + log_str += "\nHyperparameters: " + self.hypers + + print(log_str) + forecast_df = forecast_df.rename( columns={ "unique_id": self.id_column_rename, "ds": self.time_column_rename, - self.model_name: self.predict_column_rename, + self.model_name + if self.library == "statsforecast" + else self.model_name + "-median": self.predict_column_rename, + self.model_name + + "-lo-" + + str(self.conf): self.predict_column_rename + + "-lo", + self.model_name + + "-hi-" + + str(self.conf): self.predict_column_rename + + "-hi", } )[: self.horizon * forecast_df["unique_id"].nunique()] return forecast_df diff --git a/test/integration_tests/long/test_model_forecasting.py b/test/integration_tests/long/test_model_forecasting.py index 47ffe65a83..c376f7610c 100644 --- a/test/integration_tests/long/test_model_forecasting.py +++ b/test/integration_tests/long/test_model_forecasting.py @@ -94,9 +94,21 @@ def test_forecast(self): result = execute_query_fetch_all(self.evadb, predict_query) self.assertEqual(len(result), 12) self.assertEqual( - result.columns, ["airforecast.unique_id", "airforecast.ds", "airforecast.y"] + result.columns, + [ + "airforecast.unique_id", + "airforecast.ds", + "airforecast.y", + "airforecast.y-lo", + "airforecast.y-hi", + ], ) + @pytest.mark.skip( + reason="Neuralforecast intergration test takes too long to complete without GPU." + ) + @forecast_skip_marker + def test_forecast_neuralforecast(self): create_predict_udf = """ CREATE FUNCTION AirPanelForecast FROM (SELECT unique_id, ds, y, trend FROM AirDataPanel) @@ -116,7 +128,13 @@ def test_forecast(self): self.assertEqual(len(result), 24) self.assertEqual( result.columns, - ["airpanelforecast.unique_id", "airpanelforecast.ds", "airpanelforecast.y"], + [ + "airpanelforecast.unique_id", + "airpanelforecast.ds", + "airpanelforecast.y", + "airpanelforecast.y-lo", + "airpanelforecast.y-hi", + ], ) @forecast_skip_marker @@ -143,7 +161,13 @@ def test_forecast_with_column_rename(self): self.assertEqual(len(result), 24) self.assertEqual( result.columns, - ["homeforecast.type", "homeforecast.saledate", "homeforecast.ma"], + [ + "homeforecast.type", + "homeforecast.saledate", + "homeforecast.ma", + "homeforecast.ma-lo", + "homeforecast.ma-hi", + ], ) diff --git a/test/unit_tests/binder/test_statement_binder.py b/test/unit_tests/binder/test_statement_binder.py index ee2e9305e4..fb7b148beb 100644 --- a/test/unit_tests/binder/test_statement_binder.py +++ b/test/unit_tests/binder/test_statement_binder.py @@ -475,6 +475,16 @@ def test_bind_create_function_should_bind_forecast_with_default_columns(self): array_type=MagicMock(), array_dimensions=MagicMock(), ) + y_lo_col_obj = ColumnCatalogEntry( + name="y-lo", + type=ColumnType.FLOAT, + array_type=None, + ) + y_hi_col_obj = ColumnCatalogEntry( + name="y-hi", + type=ColumnType.FLOAT, + array_type=None, + ) create_function_statement.query.target_list = [ TupleValueExpression( name=id_col_obj.name, table_alias="a", col_object=id_col_obj @@ -506,7 +516,13 @@ def test_bind_create_function_should_bind_forecast_with_default_columns(self): col_obj.array_type, col_obj.array_dimensions, ) - for col_obj in (id_col_obj, ds_col_obj, y_col_obj) + for col_obj in ( + id_col_obj, + ds_col_obj, + y_col_obj, + y_lo_col_obj, + y_hi_col_obj, + ) ] ) self.assertEqual(create_function_statement.inputs, expected_inputs) @@ -534,6 +550,16 @@ def test_bind_create_function_should_bind_forecast_with_renaming_columns(self): array_type=MagicMock(), array_dimensions=MagicMock(), ) + y_lo_col_obj = ColumnCatalogEntry( + name="ma-lo", + type=ColumnType.FLOAT, + array_type=None, + ) + y_hi_col_obj = ColumnCatalogEntry( + name="ma-hi", + type=ColumnType.FLOAT, + array_type=None, + ) create_function_statement.query.target_list = [ TupleValueExpression( name=id_col_obj.name, table_alias="a", col_object=id_col_obj @@ -569,7 +595,13 @@ def test_bind_create_function_should_bind_forecast_with_renaming_columns(self): col_obj.array_type, col_obj.array_dimensions, ) - for col_obj in (id_col_obj, ds_col_obj, y_col_obj) + for col_obj in ( + id_col_obj, + ds_col_obj, + y_col_obj, + y_lo_col_obj, + y_hi_col_obj, + ) ] ) self.assertEqual(create_function_statement.inputs, expected_inputs) From 0c25a4429d23ddbe65d3a5aaf474d3838a03dd6a Mon Sep 17 00:00:00 2001 From: jineetd <35962652+jineetd@users.noreply.github.com> Date: Fri, 17 Nov 2023 05:16:00 -0500 Subject: [PATCH 16/25] Adding changes for Flaml Sklearn integration (#1361) Flaml provides support for Sklearn models like Random Forests, KNN, Extra Trees Regressor, and Logistic Regression with regularization. We plan to integrate these ML models into EVADB. Link for Flaml documentation: https://microsoft.github.io/FLAML/docs/Use-Cases/Task-Oriented-AutoML --------- Co-authored-by: Jineet Desai --- evadb/configuration/constants.py | 2 ++ evadb/executor/create_function_executor.py | 33 +++++++++++++------ evadb/functions/sklearn.py | 4 +-- evadb/functions/xgboost.py | 4 +-- evadb/utils/generic_utils.py | 27 +++------------ .../long/test_model_train.py | 4 ++- test/markers.py | 7 ++-- 7 files changed, 39 insertions(+), 42 deletions(-) diff --git a/evadb/configuration/constants.py b/evadb/configuration/constants.py index 3665a28727..126e6bcfca 100644 --- a/evadb/configuration/constants.py +++ b/evadb/configuration/constants.py @@ -36,3 +36,5 @@ DEFAULT_DOCUMENT_CHUNK_OVERLAP = 200 DEFAULT_TRAIN_REGRESSION_METRIC = "rmse" DEFAULT_XGBOOST_TASK = "regression" +DEFAULT_SKLEARN_TRAIN_MODEL = "rf" +SKLEARN_SUPPORTED_MODELS = ["rf", "extra_tree", "kneighbor"] diff --git a/evadb/executor/create_function_executor.py b/evadb/executor/create_function_executor.py index 9488195927..f686794184 100644 --- a/evadb/executor/create_function_executor.py +++ b/evadb/executor/create_function_executor.py @@ -30,9 +30,11 @@ from evadb.catalog.models.function_io_catalog import FunctionIOCatalogEntry from evadb.catalog.models.function_metadata_catalog import FunctionMetadataCatalogEntry from evadb.configuration.constants import ( + DEFAULT_SKLEARN_TRAIN_MODEL, DEFAULT_TRAIN_REGRESSION_METRIC, DEFAULT_TRAIN_TIME_LIMIT, DEFAULT_XGBOOST_TASK, + SKLEARN_SUPPORTED_MODELS, EvaDB_INSTALLATION_DIR, ) from evadb.database import EvaDBDatabase @@ -45,13 +47,12 @@ from evadb.utils.generic_utils import ( load_function_class_from_file, string_comparison_case_insensitive, + try_to_import_flaml_automl, try_to_import_ludwig, try_to_import_neuralforecast, - try_to_import_sklearn, try_to_import_statsforecast, try_to_import_torch, try_to_import_ultralytics, - try_to_import_xgboost, ) from evadb.utils.logging_manager import logger @@ -169,8 +170,7 @@ def handle_sklearn_function(self): Use Sklearn's regression to train models. """ - try_to_import_sklearn() - from sklearn.linear_model import LinearRegression + try_to_import_flaml_automl() assert ( len(self.children) == 1 @@ -186,13 +186,26 @@ def handle_sklearn_function(self): aggregated_batch.drop_column_alias() arg_map = {arg.key: arg.value for arg in self.node.metadata} - model = LinearRegression() - Y = aggregated_batch.frames[arg_map["predict"]] - aggregated_batch.frames.drop([arg_map["predict"]], axis=1, inplace=True) + from flaml import AutoML + + model = AutoML() + sklearn_model = arg_map.get("model", DEFAULT_SKLEARN_TRAIN_MODEL) + if sklearn_model not in SKLEARN_SUPPORTED_MODELS: + raise ValueError( + f"Sklearn Model {sklearn_model} provided as input is not supported." + ) + settings = { + "time_budget": arg_map.get("time_limit", DEFAULT_TRAIN_TIME_LIMIT), + "metric": arg_map.get("metric", DEFAULT_TRAIN_REGRESSION_METRIC), + "estimator_list": [sklearn_model], + "task": arg_map.get("task", DEFAULT_XGBOOST_TASK), + } start_time = int(time.time()) - model.fit(X=aggregated_batch.frames, y=Y) + model.fit( + dataframe=aggregated_batch.frames, label=arg_map["predict"], **settings + ) train_time = int(time.time()) - start_time - score = model.score(X=aggregated_batch.frames, y=Y) + score = model.best_loss model_path = os.path.join( self.db.catalog().get_configuration_catalog_value("model_dir"), self.node.name, @@ -232,7 +245,7 @@ def handle_xgboost_function(self): We use the Flaml AutoML model for training xgboost models. """ - try_to_import_xgboost() + try_to_import_flaml_automl() assert ( len(self.children) == 1 diff --git a/evadb/functions/sklearn.py b/evadb/functions/sklearn.py index 4ab2b0abfe..1333004b09 100644 --- a/evadb/functions/sklearn.py +++ b/evadb/functions/sklearn.py @@ -17,7 +17,7 @@ import pandas as pd from evadb.functions.abstract.abstract_function import AbstractFunction -from evadb.utils.generic_utils import try_to_import_sklearn +from evadb.utils.generic_utils import try_to_import_flaml_automl class GenericSklearnModel(AbstractFunction): @@ -26,7 +26,7 @@ def name(self) -> str: return "GenericSklearnModel" def setup(self, model_path: str, predict_col: str, **kwargs): - try_to_import_sklearn() + try_to_import_flaml_automl() self.model = pickle.load(open(model_path, "rb")) self.predict_col = predict_col diff --git a/evadb/functions/xgboost.py b/evadb/functions/xgboost.py index 0635294116..9705d09e4b 100644 --- a/evadb/functions/xgboost.py +++ b/evadb/functions/xgboost.py @@ -17,7 +17,7 @@ import pandas as pd from evadb.functions.abstract.abstract_function import AbstractFunction -from evadb.utils.generic_utils import try_to_import_xgboost +from evadb.utils.generic_utils import try_to_import_flaml_automl class GenericXGBoostModel(AbstractFunction): @@ -26,7 +26,7 @@ def name(self) -> str: return "GenericXGBoostModel" def setup(self, model_path: str, predict_col: str, **kwargs): - try_to_import_xgboost() + try_to_import_flaml_automl() self.model = pickle.load(open(model_path, "rb")) self.predict_col = predict_col diff --git a/evadb/utils/generic_utils.py b/evadb/utils/generic_utils.py index d9af319103..8f362e8cb5 100644 --- a/evadb/utils/generic_utils.py +++ b/evadb/utils/generic_utils.py @@ -369,39 +369,20 @@ def is_forecast_available() -> bool: return False -def try_to_import_sklearn(): - try: - import sklearn # noqa: F401 - from sklearn.linear_model import LinearRegression # noqa: F401 - except ImportError: - raise ValueError( - """Could not import sklearn. - Please install it with `pip install scikit-learn`.""" - ) - - -def is_sklearn_available() -> bool: - try: - try_to_import_sklearn() - return True - except ValueError: # noqa: E722 - return False - - -def try_to_import_xgboost(): +def try_to_import_flaml_automl(): try: import flaml # noqa: F401 from flaml import AutoML # noqa: F401 except ImportError: raise ValueError( - """Could not import Flaml AutoML. + """Could not import Flaml AutML. Please install it with `pip install "flaml[automl]"`.""" ) -def is_xgboost_available() -> bool: +def is_flaml_automl_available() -> bool: try: - try_to_import_xgboost() + try_to_import_flaml_automl() return True except ValueError: # noqa: E722 return False diff --git a/test/integration_tests/long/test_model_train.py b/test/integration_tests/long/test_model_train.py index 55c5b5a484..be610674a9 100644 --- a/test/integration_tests/long/test_model_train.py +++ b/test/integration_tests/long/test_model_train.py @@ -116,7 +116,9 @@ def test_sklearn_regression(self): CREATE OR REPLACE FUNCTION PredictHouseRentSklearn FROM ( SELECT number_of_rooms, number_of_bathrooms, days_on_market, rental_price FROM HomeRentals ) TYPE Sklearn - PREDICT 'rental_price'; + PREDICT 'rental_price' + MODEL 'extra_tree' + METRIC 'r2'; """ execute_query_fetch_all(self.evadb, create_predict_function) diff --git a/test/markers.py b/test/markers.py index 6fdd2ad3c7..8273f5f0fb 100644 --- a/test/markers.py +++ b/test/markers.py @@ -20,6 +20,7 @@ from evadb.utils.generic_utils import ( is_chromadb_available, + is_flaml_automl_available, is_forecast_available, is_gpu_available, is_ludwig_available, @@ -27,8 +28,6 @@ is_pinecone_available, is_qdrant_available, is_replicate_available, - is_sklearn_available, - is_xgboost_available, ) asyncio_skip_marker = pytest.mark.skipif( @@ -93,11 +92,11 @@ ) sklearn_skip_marker = pytest.mark.skipif( - is_sklearn_available() is False, reason="Run only if sklearn is available" + is_flaml_automl_available() is False, reason="Run only if Flaml AutoML is available" ) xgboost_skip_marker = pytest.mark.skipif( - is_xgboost_available() is False, reason="Run only if xgboost is available" + is_flaml_automl_available() is False, reason="Run only if Flaml AutoML is available" ) chatgpt_skip_marker = pytest.mark.skip( From 5aaa447dbabf89236177081672603ccae23c4437 Mon Sep 17 00:00:00 2001 From: Pramod Chunduri <43007047+pchunduri6@users.noreply.github.com> Date: Fri, 17 Nov 2023 17:46:01 -0500 Subject: [PATCH 17/25] Migrate ChatGPT function to openai v1.0 (#1368) Migrate ChatGPT function to openai v1.0. The test is skipped in circleCI because we must supply the `OPENAI_API_KEY`. The test passes on local machine. - [x] Upgrade ChatGPT function. - [x] Upgrade Dall-e function. - [x] Update unit test cases. - [x] Verify that notebooks work correctly. --- evadb/functions/chatgpt.py | 20 ++++++----- evadb/functions/dalle.py | 19 +++++----- setup.py | 2 +- .../long/functions/test_chatgpt.py | 13 +++---- test/unit_tests/test_dalle.py | 35 ++++++++++++++++--- 5 files changed, 59 insertions(+), 30 deletions(-) diff --git a/evadb/functions/chatgpt.py b/evadb/functions/chatgpt.py index fadc61191a..bf0d338689 100644 --- a/evadb/functions/chatgpt.py +++ b/evadb/functions/chatgpt.py @@ -115,19 +115,21 @@ def setup( ) def forward(self, text_df): try_to_import_openai() - import openai + from openai import OpenAI - @retry(tries=6, delay=20) - def completion_with_backoff(**kwargs): - return openai.ChatCompletion.create(**kwargs) - - openai.api_key = self.openai_api_key - if len(openai.api_key) == 0: - openai.api_key = os.environ.get("OPENAI_API_KEY", "") + api_key = self.openai_api_key + if len(self.openai_api_key) == 0: + api_key = os.environ.get("OPENAI_API_KEY", "") assert ( - len(openai.api_key) != 0 + len(api_key) != 0 ), "Please set your OpenAI API key using SET OPENAI_API_KEY = 'sk-' or environment variable (OPENAI_API_KEY)" + client = OpenAI(api_key=api_key) + + @retry(tries=6, delay=20) + def completion_with_backoff(**kwargs): + return client.chat.completions.create(**kwargs) + queries = text_df[text_df.columns[0]] content = text_df[text_df.columns[0]] if len(text_df.columns) > 1: diff --git a/evadb/functions/dalle.py b/evadb/functions/dalle.py index 7c1dc39dd0..03c2e77f88 100644 --- a/evadb/functions/dalle.py +++ b/evadb/functions/dalle.py @@ -56,24 +56,25 @@ def setup(self, openai_api_key="") -> None: ) def forward(self, text_df): try_to_import_openai() - import openai + from openai import OpenAI - openai.api_key = self.openai_api_key - # If not found, try OS Environment Variable - if len(openai.api_key) == 0: - openai.api_key = os.environ.get("OPENAI_API_KEY", "") + api_key = self.openai_api_key + if len(self.openai_api_key) == 0: + api_key = os.environ.get("OPENAI_API_KEY", "") assert ( - len(openai.api_key) != 0 - ), "Please set your OpenAI API key using SET OPENAI_API_KEY = 'sk-' or environment variable (OPENAI_API_KEY)" + len(api_key) != 0 + ), "Please set your OpenAI API key using SET OPENAI_API_KEY = 'sk-' or environment variable (OPENAI_API_KEY)" + + client = OpenAI(api_key=api_key) def generate_image(text_df: PandasDataframe): results = [] queries = text_df[text_df.columns[0]] for query in queries: - response = openai.Image.create(prompt=query, n=1, size="1024x1024") + response = client.images.generate(prompt=query, n=1, size="1024x1024") # Download the image from the link - image_response = requests.get(response["data"][0]["url"]) + image_response = requests.get(response.data[0].url) image = Image.open(BytesIO(image_response.content)) # Convert the image to an array format suitable for the DataFrame diff --git a/setup.py b/setup.py index 3334fa8361..61dc0b8c66 100644 --- a/setup.py +++ b/setup.py @@ -80,7 +80,7 @@ def read(path, encoding="utf-8"): "sentence-transformers", "protobuf", "bs4", - "openai==0.28", # CHATGPT + "openai>=1.0", # CHATGPT "gpt4all", # PRIVATE GPT "sentencepiece", # TRANSFORMERS ] diff --git a/test/integration_tests/long/functions/test_chatgpt.py b/test/integration_tests/long/functions/test_chatgpt.py index b72612d050..3f8cd9a92e 100644 --- a/test/integration_tests/long/functions/test_chatgpt.py +++ b/test/integration_tests/long/functions/test_chatgpt.py @@ -13,6 +13,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import os import unittest from test.markers import chatgpt_skip_marker from test.util import get_evadb_for_testing @@ -22,9 +23,8 @@ from evadb.server.command_handler import execute_query_fetch_all -def create_dummy_csv_file(config) -> str: - tmp_dir_from_config = config.get_value("storage", "tmp_dir") - +def create_dummy_csv_file(catalog) -> str: + tmp_dir_from_config = catalog.get_configuration_catalog_value("tmp_dir") df_dict = [ { "prompt": "summarize", @@ -49,17 +49,18 @@ def setUp(self) -> None: );""" execute_query_fetch_all(self.evadb, create_table_query) - self.csv_file_path = create_dummy_csv_file(self.evadb.config) + self.csv_file_path = create_dummy_csv_file(self.evadb.catalog()) csv_query = f"""LOAD CSV '{self.csv_file_path}' INTO MyTextCSV;""" execute_query_fetch_all(self.evadb, csv_query) + os.environ["OPENAI_API_KEY"] = "sk-..." def tearDown(self) -> None: execute_query_fetch_all(self.evadb, "DROP TABLE IF EXISTS MyTextCSV;") @chatgpt_skip_marker def test_openai_chat_completion_function(self): - function_name = "OpenAIChatCompletion" + function_name = "ChatGPT" execute_query_fetch_all(self.evadb, f"DROP FUNCTION IF EXISTS {function_name};") create_function_query = f"""CREATE FUNCTION IF NOT EXISTS{function_name} @@ -69,4 +70,4 @@ def test_openai_chat_completion_function(self): gpt_query = f"SELECT {function_name}('summarize', content) FROM MyTextCSV;" output_batch = execute_query_fetch_all(self.evadb, gpt_query) - self.assertEqual(output_batch.columns, ["openaichatcompletion.response"]) + self.assertEqual(output_batch.columns, ["chatgpt.response"]) diff --git a/test/unit_tests/test_dalle.py b/test/unit_tests/test_dalle.py index c434a4db4a..373e90e44c 100644 --- a/test/unit_tests/test_dalle.py +++ b/test/unit_tests/test_dalle.py @@ -16,13 +16,26 @@ import unittest from io import BytesIO from test.util import get_evadb_for_testing +from typing import List, Optional from unittest.mock import MagicMock, patch -from PIL import Image +from PIL import Image as PILImage +from pydantic import AnyUrl, BaseModel from evadb.server.command_handler import execute_query_fetch_all +class Image(BaseModel): + b64_json: Optional[str] # Replace with the actual type if different + revised_prompt: Optional[str] # Replace with the actual type if different + url: AnyUrl + + +class ImagesResponse(BaseModel): + created: Optional[int] # Replace with the actual type if different + data: List[Image] + + class DallEFunctionTest(unittest.TestCase): def setUp(self) -> None: self.evadb = get_evadb_for_testing() @@ -43,10 +56,10 @@ def tearDown(self) -> None: @patch.dict("os.environ", {"OPENAI_API_KEY": "mocked_openai_key"}) @patch("requests.get") - @patch("openai.Image.create", return_value={"data": [{"url": "mocked_url"}]}) - def test_dalle_image_generation(self, mock_openai_create, mock_requests_get): + @patch("openai.OpenAI") + def test_dalle_image_generation(self, mock_openai, mock_requests_get): # Generate a 1x1 white pixel PNG image in memory - img = Image.new("RGB", (1, 1), color="white") + img = PILImage.new("RGB", (1, 1), color="white") img_byte_array = BytesIO() img.save(img_byte_array, format="PNG") mock_image_content = img_byte_array.getvalue() @@ -55,6 +68,18 @@ def test_dalle_image_generation(self, mock_openai_create, mock_requests_get): mock_response.content = mock_image_content mock_requests_get.return_value = mock_response + # Set up the mock for OpenAI instance + mock_openai_instance = mock_openai.return_value + mock_openai_instance.images.generate.return_value = ImagesResponse( + data=[ + Image( + b64_json=None, + revised_prompt=None, + url="https://images.openai.com/1234.png", + ) + ] + ) + function_name = "DallE" execute_query_fetch_all(self.evadb, f"DROP FUNCTION IF EXISTS {function_name};") @@ -67,6 +92,6 @@ def test_dalle_image_generation(self, mock_openai_create, mock_requests_get): gpt_query = f"SELECT {function_name}(prompt) FROM ImageGen;" execute_query_fetch_all(self.evadb, gpt_query) - mock_openai_create.assert_called_once_with( + mock_openai_instance.images.generate.assert_called_once_with( prompt="a surreal painting of a cat", n=1, size="1024x1024" ) From 8a8fc46fd4056abfc1558af52d5ae6d71fd92eb7 Mon Sep 17 00:00:00 2001 From: Gaurav Tarlok Kakkar Date: Sun, 19 Nov 2023 11:28:37 -0500 Subject: [PATCH 18/25] v0.3.9 - new release (#1367) --- evadb/version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evadb/version.py b/evadb/version.py index c6ac2fe6fb..c483bdf47d 100644 --- a/evadb/version.py +++ b/evadb/version.py @@ -1,6 +1,6 @@ _MAJOR = "0" _MINOR = "3" -_REVISION = "9+dev" +_REVISION = "9" VERSION_SHORT = f"{_MAJOR}.{_MINOR}" VERSION = f"{_MAJOR}.{_MINOR}.{_REVISION}" From f6f3dda166c9f219472885eb4efb5e874356ff7b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 19 Nov 2023 12:01:39 -0500 Subject: [PATCH 19/25] Bump Version to v0.3.10+dev (#1371) Bump Version to v0.3.10+dev --------- Co-authored-by: Jiashen Cao Co-authored-by: Joy Arulraj --- CHANGELOG.md | 34 ++++++++++++++++++++++++++++++++++ evadb/version.py | 2 +- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8ef0b95de..374aab3610 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,40 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### [Deprecated] ### [Removed] +## [0.3.9] - 2023-11-19 + +* PR #1367: v0.3.9 - new release +* PR #1368: Migrate ChatGPT function to openai v1.0 +* PR #1361: Adding changes for Flaml Sklearn integration +* PR #1258: Add feedback for forecasting +* PR #1364: Fix python3.8 failing testcases due to type hint +* PR #1308: Job scheduler implementation +* PR #1352: Make Logic Operators Case Insensitve +* PR #1342: Add train scores for ludwig in the create function handler. +* PR #1067: Verified that issue #1067 is resolved and added documentation for load pdf functionality. +* PR #1334: logging an error message for invalid files while loading +* PR #1330: [WIP] Improving error handling messages for Custom Functions +* PR #1033: feat: third party app support in EVADB +* PR #1339: Support semicolon and escaped strings in lark +* PR #1337: CREATE INDEX IF NOT EXISTS is broken. +* PR #1333: Fix #1333 dependency and CMD in DockerFile +* PR #1336: Add test_eva_db to gitignore +* PR #1327: Add the validation score and training time for create_function in XGBoost +* PR #1322: String Helper functions in EvaDB +* PR #1321: REST API Documentation +* PR #1323: Added docs for SET and SHOW CONFIG query +* PR #1316: Adding colab notebook for XGBoost Regression and Classification +* PR #1269: Add Milvus integration for vector create and search +* PR #1319: refactor: code refactor +* PR #1298: Convert nested join in Vector Queries to Pandas Merge. +* PR #1305: Starting the changes for XGBoost classification integration. +* PR #1289: SnowFlake Integration for EvaDB +* PR #1307: Fix: minor typo +* PR #1272: Configuration Manager Redesign +* PR #1283: Fix current issues with forecasting +* PR #1304: Bump Version to v0.3.9+dev +* PR #1303: v0.3.8 - new release + ## [0.3.8] - 2023-10-18 * PR #1303: v0.3.8 - new release diff --git a/evadb/version.py b/evadb/version.py index c483bdf47d..72b3bcb59e 100644 --- a/evadb/version.py +++ b/evadb/version.py @@ -1,6 +1,6 @@ _MAJOR = "0" _MINOR = "3" -_REVISION = "9" +_REVISION = "10+dev" VERSION_SHORT = f"{_MAJOR}.{_MINOR}" VERSION = f"{_MAJOR}.{_MINOR}.{_REVISION}" From aab244671aa569f578c52566306c9d1ba568a323 Mon Sep 17 00:00:00 2001 From: Kaushik <108662423+kaushikravichandran@users.noreply.github.com> Date: Mon, 20 Nov 2023 16:55:55 -0500 Subject: [PATCH 20/25] Hackernews search in EVADB (#1362) This PR supports searching Hackernews stories in EVADB: - We treat Hackernews as a data source - Algolia search API for hackernews is used for searching - Get requests are used - We support searching within: `story`, `comment`, `URL`, `story`, `poll` or a combination of them - Syntax: ``` params = { "query": "EVADB", "tags": "(story,poll)", } query = f"""CREATE DATABASE hackernews_data WITH ENGINE = "hackernews", PARAMETERS = {params};""" ``` --------- Co-authored-by: Kaushik Ravichandran --- docs/_toc.yml | 1 + .../source/reference/databases/hackernews.rst | 44 +++++ .../databases/hackernews/__init__.py | 15 ++ .../hackernews/hackernews_handler.py | 152 ++++++++++++++++++ .../databases/hackernews/table_column_info.py | 23 +++ evadb/third_party/databases/interface.py | 2 + setup.py | 3 + .../long/test_hackernews_datasource.py | 56 +++++++ 8 files changed, 296 insertions(+) create mode 100644 docs/source/reference/databases/hackernews.rst create mode 100644 evadb/third_party/databases/hackernews/__init__.py create mode 100644 evadb/third_party/databases/hackernews/hackernews_handler.py create mode 100644 evadb/third_party/databases/hackernews/table_column_info.py create mode 100644 test/integration_tests/long/test_hackernews_datasource.py diff --git a/docs/_toc.yml b/docs/_toc.yml index ca191ce42d..eb57363f4e 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -79,6 +79,7 @@ parts: - file: source/reference/databases/clickhouse - file: source/reference/databases/github - file: source/reference/databases/snowflake + - file: source/reference/databases/hackernews - file: source/reference/vector_databases/index title: Vector Databases diff --git a/docs/source/reference/databases/hackernews.rst b/docs/source/reference/databases/hackernews.rst new file mode 100644 index 0000000000..d96112e815 --- /dev/null +++ b/docs/source/reference/databases/hackernews.rst @@ -0,0 +1,44 @@ +Hackernews +========== + +The connection to Hackernews is based on the `Algolia Hackernews `_ API. + +Dependency +---------- + +* requests + + +Parameters +---------- + +Required: + +* ``query`` is the search query for getting the results. + +Optional: + +* ``tags`` is the tag used for filtering the query results. Check `available tags `_ to see a list of available filter tags. + +Create Connection +----------------- + +.. code-block:: text + + CREATE DATABASE hackernews_data WITH ENGINE = 'hackernews', PARAMETERS = { + "query": "EVADB", + "tags": "story" + }; + +Supported Tables +---------------- + +* ``search_results``: Lists the search query results. Check `table_column_info.py `_ for all the available columns in the table. + +.. code-block:: sql + + SELECT * FROM hackernews_data.search_results LIMIT 3; + +.. note:: + + Looking for another table from Hackernews? Please raise a `Feature Request `_. diff --git a/evadb/third_party/databases/hackernews/__init__.py b/evadb/third_party/databases/hackernews/__init__.py new file mode 100644 index 0000000000..7051570944 --- /dev/null +++ b/evadb/third_party/databases/hackernews/__init__.py @@ -0,0 +1,15 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""hackernews search integration""" diff --git a/evadb/third_party/databases/hackernews/hackernews_handler.py b/evadb/third_party/databases/hackernews/hackernews_handler.py new file mode 100644 index 0000000000..11025b27e5 --- /dev/null +++ b/evadb/third_party/databases/hackernews/hackernews_handler.py @@ -0,0 +1,152 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import json + +import pandas as pd +import requests + +from evadb.third_party.databases.hackernews.table_column_info import HACKERNEWS_COLUMNS +from evadb.third_party.databases.types import ( + DBHandler, + DBHandlerResponse, + DBHandlerStatus, +) + + +class HackernewsSearchHandler(DBHandler): + def connection(): + return requests.get("https://www.google.com/").status_code == 200 + + def __init__(self, name: str, **kwargs): + """ + Initialize the handler. + Args: + name (str): name of the DB handler instance + **kwargs: arbitrary keyword arguments for establishing the connection. + """ + super().__init__(name) + self.query = kwargs.get("query", "") + self.tags = kwargs.get("tags", "") + + @property + def supported_table(self): + def _hackernews_topics_generator(): + url = "http://hn.algolia.com/api/v1/search?" + url += "query=" + self.query + url += "&tags=" + ( + "story" if self.tags == "" else +self.tags + ) # search stories by default + response = requests.get(url) + if response.status_code != 200: + raise Exception("Could not reach website.") + json_result = response.content + dict_result = json.loads(json_result) + for row in dict_result: + yield { + property_name: row[property_name] + for property_name, _ in HACKERNEWS_COLUMNS + } + + mapping = { + "search_results": { + "columns": HACKERNEWS_COLUMNS, + "generator": _hackernews_topics_generator(), + }, + } + return mapping + + def connect(self): + """ + Set up the connection required by the handler. + Returns: + DBHandlerStatus + """ + return DBHandlerStatus(status=True) + + def disconnect(self): + """ + Close any existing connections. + """ + pass + + def check_connection(self) -> DBHandlerStatus: + """ + Check connection to the handler. + Returns: + DBHandlerStatus + """ + if self.connection(): + return DBHandlerStatus(status=True) + else: + return DBHandlerStatus(status=False, error="Not connected to the internet.") + + def get_tables(self) -> DBHandlerResponse: + """ + Return the list of tables in the database. + Returns: + DBHandlerResponse + """ + if not self.connection(): + return DBHandlerResponse(data=None, error="Not connected to the internet.") + + try: + tables_df = pd.DataFrame( + list(self.supported_table.keys()), columns=["table_name"] + ) + return DBHandlerResponse(data=tables_df) + except Exception as e: + return DBHandlerResponse(data=None, error=str(e)) + + def get_columns(self, table_name: str) -> DBHandlerResponse: + """ + Returns the list of columns for the given table. + Args: + table_name (str): name of the table whose columns are to be retrieved. + Returns: + DBHandlerResponse + """ + if not self.connection(): + return DBHandlerResponse(data=None, error="Not connected to the internet.") + try: + columns_df = pd.DataFrame( + self.supported_table[table_name]["columns"], columns=["name", "dtype"] + ) + return DBHandlerResponse(data=columns_df) + except Exception as e: + return DBHandlerResponse(data=None, error=str(e)) + + def select(self, table_name: str) -> DBHandlerResponse: + """ + Returns a generator that yields the data from the given table. + Args: + table_name (str): name of the table whose data is to be retrieved. + Returns: + DBHandlerResponse + """ + if not self.connection: + return DBHandlerResponse(data=None, error="Not connected to the database.") + try: + if table_name not in self.supported_table: + return DBHandlerResponse( + data=None, + error="{} is not supported or does not exist.".format(table_name), + ) + + return DBHandlerResponse( + data=None, + data_generator=self.supported_table[table_name]["generator"], + ) + except Exception as e: + return DBHandlerResponse(data=None, error=str(e)) diff --git a/evadb/third_party/databases/hackernews/table_column_info.py b/evadb/third_party/databases/hackernews/table_column_info.py new file mode 100644 index 0000000000..aae50e18c3 --- /dev/null +++ b/evadb/third_party/databases/hackernews/table_column_info.py @@ -0,0 +1,23 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +HACKERNEWS_COLUMNS = [ + ["title", str], + ["url", str], + ["author", str], + ["points", int], + ["story_text", str], + ["num_comments", int], +] diff --git a/evadb/third_party/databases/interface.py b/evadb/third_party/databases/interface.py index 5f8c4c2ac1..cacb4110f1 100644 --- a/evadb/third_party/databases/interface.py +++ b/evadb/third_party/databases/interface.py @@ -48,6 +48,8 @@ def _get_database_handler(engine: str, **kwargs): return mod.SnowFlakeDbHandler(engine, **kwargs) elif engine == "github": return mod.GithubHandler(engine, **kwargs) + elif engine == "hackernews": + return mod.HackernewsSearchHandler(engine, **kwargs) elif engine == "slack": return mod.SlackHandler(engine, **kwargs) else: diff --git a/setup.py b/setup.py index 61dc0b8c66..0b0ed1ec97 100644 --- a/setup.py +++ b/setup.py @@ -124,6 +124,8 @@ def read(path, encoding="utf-8"): xgboost_libs = ["flaml[automl]"] +hackernews_libs = ["requests"] + forecasting_libs = [ "statsforecast", # MODEL TRAIN AND FINE TUNING "neuralforecast", # MODEL TRAIN AND FINE TUNING @@ -176,6 +178,7 @@ def read(path, encoding="utf-8"): "sklearn": sklearn_libs, "xgboost": xgboost_libs, "forecasting": forecasting_libs, + "hackernews": hackernews_libs, # everything except ray, qdrant, ludwig and postgres. The first three fail on pyhton 3.11. "dev": dev_libs + vision_libs + document_libs + function_libs + notebook_libs + forecasting_libs + sklearn_libs + imagegen_libs + xgboost_libs } diff --git a/test/integration_tests/long/test_hackernews_datasource.py b/test/integration_tests/long/test_hackernews_datasource.py new file mode 100644 index 0000000000..0cc3293d46 --- /dev/null +++ b/test/integration_tests/long/test_hackernews_datasource.py @@ -0,0 +1,56 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import unittest +from test.util import get_evadb_for_testing + +import pytest + +from evadb.server.command_handler import execute_query_fetch_all +from evadb.third_party.databases.hackernews.table_column_info import HACKERNEWS_COLUMNS + + +@pytest.mark.notparallel +class HackernewsDataSourceTest(unittest.TestCase): + def setUp(self): + self.evadb = get_evadb_for_testing() + # reset the catalog manager before running each test + self.evadb.catalog().reset() + + def tearDown(self): + execute_query_fetch_all(self.evadb, "DROP DATABASE IF EXISTS hackernews_data;") + + @pytest.mark.xfail(reason="Flaky testcase due to `bad request` error message") + def test_should_run_select_query_in_hackernews(self): + # Create database. + params = { + "query": "EVADB", + "tags": "story", + } + query = f"""CREATE DATABASE hackernews_data + WITH ENGINE = "hackernews", + PARAMETERS = {params};""" + execute_query_fetch_all(self.evadb, query) + + query = "SELECT * FROM hackernews_data.search_results LIMIT 5;" + batch = execute_query_fetch_all(self.evadb, query) + self.assertEqual(len(batch), 10) + expected_column = list( + ["search_results.{}".format(col) for col, _ in HACKERNEWS_COLUMNS] + ) + self.assertEqual(batch.columns, expected_column) + + +if __name__ == "__main__": + unittest.main() From a323af3c8bfcae576ad1130490c477f04f5b23fb Mon Sep 17 00:00:00 2001 From: Andy Xu Date: Tue, 21 Nov 2023 10:23:30 -0800 Subject: [PATCH 21/25] Fix the 'DataFrame' object has no attribute 'map' when panda < 2.1.0 is used. (#1374) Fix #1366 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 0b0ed1ec97..8e809e2a32 100644 --- a/setup.py +++ b/setup.py @@ -45,7 +45,7 @@ def read(path, encoding="utf-8"): minimal_requirements = [ "numpy>=1.19.5", - "pandas>=1.1.5", + "pandas>=2.1.0", # DataFrame.map is available after v2.1.0 "sqlalchemy>=2.0.0", "sqlalchemy-utils>=0.36.6", "lark>=1.0.0", From 0268df20f8f65c3c28160ee49fb9edcee6729007 Mon Sep 17 00:00:00 2001 From: hunteritself <104769634+hunteritself@users.noreply.github.com> Date: Tue, 21 Nov 2023 13:24:39 -0500 Subject: [PATCH 22/25] Add Weaviate integration (#1360) Add Weaviate integration, features include: 1. Initiate the required environment and connect to Weaviate vector database; 2. Create a class; 3. Delete a class; 4. Add data; 5. Make similarity-based queries. --------- Co-authored-by: Andy Xu --- docs/_toc.yml | 1 + .../source/reference/databases/hackernews.rst | 2 +- .../reference/vector_databases/weaviate.rst | 31 +++++ evadb/catalog/catalog_type.py | 1 + evadb/evadb_config.py | 2 + evadb/executor/executor_utils.py | 11 ++ evadb/interfaces/relational/db.py | 3 +- evadb/parser/evadb.lark | 3 +- .../parser/lark_visitor/_create_statements.py | 2 + evadb/third_party/vector_stores/utils.py | 8 ++ evadb/third_party/vector_stores/weaviate.py | 115 ++++++++++++++++++ evadb/utils/generic_utils.py | 18 +++ script/formatting/spelling.txt | 5 + setup.py | 4 + .../integration_tests/long/test_similarity.py | 39 ++++++ test/markers.py | 6 + 16 files changed, 248 insertions(+), 3 deletions(-) create mode 100644 docs/source/reference/vector_databases/weaviate.rst create mode 100644 evadb/third_party/vector_stores/weaviate.py diff --git a/docs/_toc.yml b/docs/_toc.yml index eb57363f4e..38309dbcfc 100644 --- a/docs/_toc.yml +++ b/docs/_toc.yml @@ -90,6 +90,7 @@ parts: - file: source/reference/vector_databases/pgvector - file: source/reference/vector_databases/pinecone - file: source/reference/vector_databases/milvus + - file: source/reference/vector_databases/weaviate - file: source/reference/ai/index title: AI Engines diff --git a/docs/source/reference/databases/hackernews.rst b/docs/source/reference/databases/hackernews.rst index d96112e815..cc5bc97dba 100644 --- a/docs/source/reference/databases/hackernews.rst +++ b/docs/source/reference/databases/hackernews.rst @@ -18,7 +18,7 @@ Required: Optional: -* ``tags`` is the tag used for filtering the query results. Check `available tags `_ to see a list of available filter tags. +* ``tags`` is the tag used for filtering the query results. Check `available tags `_ to see a list of available filter tags. Create Connection ----------------- diff --git a/docs/source/reference/vector_databases/weaviate.rst b/docs/source/reference/vector_databases/weaviate.rst new file mode 100644 index 0000000000..c964d7e878 --- /dev/null +++ b/docs/source/reference/vector_databases/weaviate.rst @@ -0,0 +1,31 @@ +Weaviate +========== + +Weaviate is an open-source vector database designed for scalability and rich querying capabilities. It allows for semantic search, automated vectorization, and supports large language model (LLM) integration. +The connection to Weaviate is based on the `weaviate-client `_ library. + +Dependency +---------- + +* weaviate-client + +Parameters +---------- + +To use Weaviate, you need an API key and a URL of your Weaviate instance. Here are the `instructions for setting up a Weaviate instance `_. After setting up your instance, you will find the API key and URL on the Details tab in Weaviate Cloud Services (WCS) dashboard. These details are essential for establishing a connection to the Weaviate server. + +* `WEAVIATE_API_KEY` is the API key for your Weaviate instance. +* `WEAVIATE_API_URL` is the URL of your Weaviate instance. + +The above values can either be set via the ``SET`` statement, or in the os environment fields "WEAVIATE_API_KEY", "WEAVIATE_API_URL" + +Create Collection +----------------- + +Weaviate uses collections (similar to 'classes') to store data. To create a collection in Weaviate, use the following SQL command in EvaDB: + +.. code-block:: sql + + CREATE INDEX collection_name ON table_name (data) USING WEAVIATE; + +This command creates a collection in Weaviate with the specified name, linked to the table in EvaDB. You can also specify vectorizer settings and other configurations for the collection as needed. \ No newline at end of file diff --git a/evadb/catalog/catalog_type.py b/evadb/catalog/catalog_type.py index d6c052126a..5da568779f 100644 --- a/evadb/catalog/catalog_type.py +++ b/evadb/catalog/catalog_type.py @@ -117,6 +117,7 @@ class VectorStoreType(EvaDBEnum): PINECONE # noqa: F821 PGVECTOR # noqa: F821 CHROMADB # noqa: F821 + WEAVIATE # noqa: F821 MILVUS # noqa: F821 diff --git a/evadb/evadb_config.py b/evadb/evadb_config.py index 9c209c0128..6117514b25 100644 --- a/evadb/evadb_config.py +++ b/evadb/evadb_config.py @@ -41,4 +41,6 @@ "MILVUS_PASSWORD": "", "MILVUS_DB_NAME": "", "MILVUS_TOKEN": "", + "WEAVIATE_API_KEY": "", + "WEAVIATE_API_URL": "", } diff --git a/evadb/executor/executor_utils.py b/evadb/executor/executor_utils.py index 40945c1e5a..26f9d14f8e 100644 --- a/evadb/executor/executor_utils.py +++ b/evadb/executor/executor_utils.py @@ -185,6 +185,17 @@ def handle_vector_store_params( ), "PINECONE_ENV": catalog().get_configuration_catalog_value("PINECONE_ENV"), } + elif vector_store_type == VectorStoreType.WEAVIATE: + # Weaviate Configuration + # Weaviate API key and URL Can be obtained from cluster details on Weaviate Cloud Services (WCS) dashboard + return { + "WEAVIATE_API_KEY": catalog().get_configuration_catalog_value( + "WEAVIATE_API_KEY" + ), + "WEAVIATE_API_URL": catalog().get_configuration_catalog_value( + "WEAVIATE_API_URL" + ), + } elif vector_store_type == VectorStoreType.MILVUS: return { "MILVUS_URI": catalog().get_configuration_catalog_value("MILVUS_URI"), diff --git a/evadb/interfaces/relational/db.py b/evadb/interfaces/relational/db.py index 428d0878f5..714593a8a8 100644 --- a/evadb/interfaces/relational/db.py +++ b/evadb/interfaces/relational/db.py @@ -268,7 +268,8 @@ def create_vector_index( index_name (str): Name of the index. table_name (str): Name of the table. expr (str): Expression used to build the vector index. - using (str): Method used for indexing, can be `FAISS` or `QDRANT` or `PINECONE` or `CHROMADB` or `MILVUS`. + + using (str): Method used for indexing, can be `FAISS` or `QDRANT` or `PINECONE` or `CHROMADB` or `WEAVIATE` or `MILVUS`. Returns: EvaDBCursor: The EvaDBCursor object. diff --git a/evadb/parser/evadb.lark b/evadb/parser/evadb.lark index 86798df6c0..4b96bf647b 100644 --- a/evadb/parser/evadb.lark +++ b/evadb/parser/evadb.lark @@ -71,7 +71,7 @@ function_metadata_key: uid function_metadata_value: constant -vector_store_type: USING (FAISS | QDRANT | PINECONE | PGVECTOR | CHROMADB | MILVUS) +vector_store_type: USING (FAISS | QDRANT | PINECONE | PGVECTOR | CHROMADB | WEAVIATE | MILVUS) index_elem: ("(" uid_list ")" | "(" function_call ")") @@ -448,6 +448,7 @@ QDRANT: "QDRANT"i PINECONE: "PINECONE"i PGVECTOR: "PGVECTOR"i CHROMADB: "CHROMADB"i +WEAVIATE: "WEAVIATE"i MILVUS: "MILVUS"i // Computer vision tasks diff --git a/evadb/parser/lark_visitor/_create_statements.py b/evadb/parser/lark_visitor/_create_statements.py index 72066b294c..175f0087e9 100644 --- a/evadb/parser/lark_visitor/_create_statements.py +++ b/evadb/parser/lark_visitor/_create_statements.py @@ -300,6 +300,8 @@ def vector_store_type(self, tree): vector_store_type = VectorStoreType.PGVECTOR elif str.upper(token) == "CHROMADB": vector_store_type = VectorStoreType.CHROMADB + elif str.upper(token) == "WEAVIATE": + vector_store_type = VectorStoreType.WEAVIATE elif str.upper(token) == "MILVUS": vector_store_type = VectorStoreType.MILVUS return vector_store_type diff --git a/evadb/third_party/vector_stores/utils.py b/evadb/third_party/vector_stores/utils.py index 2a01d57e68..9c12fc6fbd 100644 --- a/evadb/third_party/vector_stores/utils.py +++ b/evadb/third_party/vector_stores/utils.py @@ -18,6 +18,7 @@ from evadb.third_party.vector_stores.milvus import MilvusVectorStore from evadb.third_party.vector_stores.pinecone import PineconeVectorStore from evadb.third_party.vector_stores.qdrant import QdrantVectorStore +from evadb.third_party.vector_stores.weaviate import WeaviateVectorStore from evadb.utils.generic_utils import validate_kwargs @@ -51,6 +52,12 @@ def init_vector_store( validate_kwargs(kwargs, required_params, required_params) return ChromaDBVectorStore(index_name, **kwargs) + elif vector_store_type == VectorStoreType.WEAVIATE: + from evadb.third_party.vector_stores.weaviate import required_params + + validate_kwargs(kwargs, required_params, required_params) + return WeaviateVectorStore(index_name, **kwargs) + elif vector_store_type == VectorStoreType.MILVUS: from evadb.third_party.vector_stores.milvus import ( allowed_params, @@ -59,5 +66,6 @@ def init_vector_store( validate_kwargs(kwargs, allowed_params, required_params) return MilvusVectorStore(index_name, **kwargs) + else: raise Exception(f"Vector store {vector_store_type} not supported") diff --git a/evadb/third_party/vector_stores/weaviate.py b/evadb/third_party/vector_stores/weaviate.py new file mode 100644 index 0000000000..073d530312 --- /dev/null +++ b/evadb/third_party/vector_stores/weaviate.py @@ -0,0 +1,115 @@ +# coding=utf-8 +# Copyright 2018-2023 EvaDB +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +import os +from typing import List + +from evadb.third_party.vector_stores.types import ( + FeaturePayload, + VectorIndexQuery, + VectorIndexQueryResult, + VectorStore, +) +from evadb.utils.generic_utils import try_to_import_weaviate_client + +required_params = [] +_weaviate_init_done = False + + +class WeaviateVectorStore(VectorStore): + def __init__(self, collection_name: str, **kwargs) -> None: + try_to_import_weaviate_client() + global _weaviate_init_done + + self._collection_name = collection_name + + # Get the API key. + self._api_key = kwargs.get("WEAVIATE_API_KEY") + + if not self._api_key: + self._api_key = os.environ.get("WEAVIATE_API_KEY") + + assert ( + self._api_key + ), "Please set your `WEAVIATE_API_KEY` using set command or environment variable (WEAVIATE_API_KEY). It can be found at the Details tab in WCS Dashboard." + + # Get the API Url. + self._api_url = kwargs.get("WEAVIATE_API_URL") + + if not self._api_url: + self._api_url = os.environ.get("WEAVIATE_API_URL") + + assert ( + self._api_url + ), "Please set your `WEAVIATE_API_URL` using set command or environment variable (WEAVIATE_API_URL). It can be found at the Details tab in WCS Dashboard." + + if not _weaviate_init_done: + # Initialize weaviate client + import weaviate + + client = weaviate.Client( + url=self._api_url, + auth_client_secret=weaviate.AuthApiKey(api_key=self._api_key), + ) + client.schema.get() + + _weaviate_init_done = True + + self._client = client + + def create( + self, + vectorizer: str = "text2vec-openai", + properties: list = None, + module_config: dict = None, + ): + properties = properties or [] + module_config = module_config or {} + + collection_obj = { + "class": self._collection_name, + "properties": properties, + "vectorizer": vectorizer, + "moduleConfig": module_config, + } + + if self._client.schema.exists(self._collection_name): + self._client.schema.delete_class(self._collection_name) + + self._client.schema.create_class(collection_obj) + + def add(self, payload: List[FeaturePayload]) -> None: + with self._client.batch as batch: + for item in payload: + data_object = {"id": item.id, "vector": item.embedding} + batch.add_data_object(data_object, self._collection_name) + + def delete(self) -> None: + self._client.schema.delete_class(self._collection_name) + + def query(self, query: VectorIndexQuery) -> VectorIndexQueryResult: + response = ( + self._client.query.get(self._collection_name, ["*"]) + .with_near_vector({"vector": query.embedding}) + .with_limit(query.top_k) + .do() + ) + + data = response.get("data", {}) + results = data.get("Get", {}).get(self._collection_name, []) + + similarities = [item["_additional"]["distance"] for item in results] + ids = [item["id"] for item in results] + + return VectorIndexQueryResult(similarities, ids) diff --git a/evadb/utils/generic_utils.py b/evadb/utils/generic_utils.py index 8f362e8cb5..426719f87c 100644 --- a/evadb/utils/generic_utils.py +++ b/evadb/utils/generic_utils.py @@ -573,6 +573,16 @@ def try_to_import_chromadb_client(): ) +def try_to_import_weaviate_client(): + try: + import weaviate # noqa: F401 + except ImportError: + raise ValueError( + """Could not import weaviate python package. + Please install it with 'pip install weaviate-client`.""" + ) + + def try_to_import_milvus_client(): try: import pymilvus # noqa: F401 @@ -607,6 +617,14 @@ def is_chromadb_available() -> bool: return False +def is_weaviate_available() -> bool: + try: + try_to_import_weaviate_client() + return True + except ValueError: # noqa: E722 + return False + + def is_milvus_available() -> bool: try: try_to_import_milvus_client() diff --git a/script/formatting/spelling.txt b/script/formatting/spelling.txt index 239b4411da..1dd5566caf 100644 --- a/script/formatting/spelling.txt +++ b/script/formatting/spelling.txt @@ -975,10 +975,13 @@ VideoFormat VideoStorageEngineTest VideoWriter VisionEncoderDecoderModel +WEAVIATE WH WIP WMV WeakValueDictionary +Weaviate +WeaviateVectorStore XGBoost XdistTests Xeon @@ -1731,6 +1734,7 @@ testRayErrorHandling testSimilarityFeatureTable testSimilarityImageDataset testSimilarityTable +testWeaviateIndexImageDataset testcase testcases testdeleteone @@ -1814,6 +1818,7 @@ wal warmup wb weakref +weaviate westbrae wget whitespaces diff --git a/setup.py b/setup.py index 8e809e2a32..e3d211ece8 100644 --- a/setup.py +++ b/setup.py @@ -112,8 +112,11 @@ def read(path, encoding="utf-8"): chromadb_libs = ["chromadb"] +weaviate_libs = ["weaviate-client"] + milvus_libs = ["pymilvus>=2.3.0"] + postgres_libs = [ "psycopg2", ] @@ -173,6 +176,7 @@ def read(path, encoding="utf-8"): "pinecone": pinecone_libs, "chromadb": chromadb_libs, "milvus": milvus_libs, + "weaviate": weaviate_libs, "postgres": postgres_libs, "ludwig": ludwig_libs, "sklearn": sklearn_libs, diff --git a/test/integration_tests/long/test_similarity.py b/test/integration_tests/long/test_similarity.py index 81d6054fe8..2a8d52cf8d 100644 --- a/test/integration_tests/long/test_similarity.py +++ b/test/integration_tests/long/test_similarity.py @@ -20,6 +20,7 @@ milvus_skip_marker, pinecone_skip_marker, qdrant_skip_marker, + weaviate_skip_marker, ) from test.util import ( create_sample_image, @@ -142,6 +143,14 @@ def setUp(self): # use default Milvus database for testing os.environ["MILVUS_DB_NAME"] = "default" + self.original_weaviate_key = os.environ.get("WEAVIATE_API_KEY") + self.original_weaviate_env = os.environ.get("WEAVIATE_API_URL") + + os.environ["WEAVIATE_API_KEY"] = "NM4adxLmhtJDF1dPXDiNhEGTN7hhGDpymmO0" + os.environ[ + "WEAVIATE_API_URL" + ] = "https://cs6422-test2-zn83syib.weaviate.network" + def tearDown(self): shutdown_ray() @@ -580,3 +589,33 @@ def test_end_to_end_index_scan_should_work_correctly_on_image_dataset_milvus( # Cleanup drop_query = "DROP INDEX testMilvusIndexImageDataset" execute_query_fetch_all(self.evadb, drop_query) + + @pytest.mark.skip(reason="Requires running Weaviate instance") + @weaviate_skip_marker + def test_end_to_end_index_scan_should_work_correctly_on_image_dataset_weaviate( + self, + ): + for _ in range(2): + create_index_query = """CREATE INDEX testWeaviateIndexImageDataset + ON testSimilarityImageDataset (DummyFeatureExtractor(data)) + USING WEAVIATE;""" + execute_query_fetch_all(self.evadb, create_index_query) + + select_query = """SELECT _row_id FROM testSimilarityImageDataset + ORDER BY Similarity(DummyFeatureExtractor(Open("{}")), DummyFeatureExtractor(data)) + LIMIT 1;""".format( + self.img_path + ) + explain_batch = execute_query_fetch_all( + self.evadb, f"EXPLAIN {select_query}" + ) + self.assertTrue("VectorIndexScan" in explain_batch.frames[0][0]) + + res_batch = execute_query_fetch_all(self.evadb, select_query) + self.assertEqual( + res_batch.frames["testsimilarityimagedataset._row_id"][0], 5 + ) + + # Cleanup + drop_query = "DROP INDEX testWeaviateIndexImageDataset" + execute_query_fetch_all(self.evadb, drop_query) diff --git a/test/markers.py b/test/markers.py index 8273f5f0fb..deefadb294 100644 --- a/test/markers.py +++ b/test/markers.py @@ -28,6 +28,7 @@ is_pinecone_available, is_qdrant_available, is_replicate_available, + is_weaviate_available, ) asyncio_skip_marker = pytest.mark.skipif( @@ -54,6 +55,11 @@ reason="Skipping since pymilvus is not installed", ) +weaviate_skip_marker = pytest.mark.skipif( + is_weaviate_available() is False, + reason="Skipping since weaviate is not installed", +) + windows_skip_marker = pytest.mark.skipif( sys.platform == "win32", reason="Test case not supported on Windows" ) From e00887c395ecf93e0c62daf923f33732701402ef Mon Sep 17 00:00:00 2001 From: Pramod Chunduri <43007047+pchunduri6@users.noreply.github.com> Date: Tue, 21 Nov 2023 14:00:02 -0500 Subject: [PATCH 23/25] Fix string helper functions not initialized (#1380) String helper functions CONCAT, UPPER, LOWER are not initialized due to a minor bug in the code. --- evadb/functions/function_bootstrap_queries.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/evadb/functions/function_bootstrap_queries.py b/evadb/functions/function_bootstrap_queries.py index f8186d4dd3..3b50085864 100644 --- a/evadb/functions/function_bootstrap_queries.py +++ b/evadb/functions/function_bootstrap_queries.py @@ -217,6 +217,7 @@ Upper_function_query = """CREATE FUNCTION IF NOT EXISTS UPPER INPUT (input ANYTYPE) OUTPUT (output NDARRAY STR(ANYDIM)) + TYPE HelperFunction IMPL '{}/functions/helpers/upper.py'; """.format( EvaDB_INSTALLATION_DIR @@ -225,6 +226,7 @@ Lower_function_query = """CREATE FUNCTION IF NOT EXISTS LOWER INPUT (input ANYTYPE) OUTPUT (output NDARRAY STR(ANYDIM)) + TYPE HelperFunction IMPL '{}/functions/helpers/lower.py'; """.format( EvaDB_INSTALLATION_DIR @@ -233,6 +235,7 @@ Concat_function_query = """CREATE FUNCTION IF NOT EXISTS CONCAT INPUT (input ANYTYPE) OUTPUT (output NDARRAY STR(ANYDIM)) + TYPE HelperFunction IMPL '{}/functions/helpers/concat.py'; """.format( EvaDB_INSTALLATION_DIR From 3d0b647dc289611f9b897eaba641650f047b02ab Mon Sep 17 00:00:00 2001 From: Jun Yeop Kim <84053682+jkim3663@users.noreply.github.com> Date: Wed, 22 Nov 2023 02:45:13 -0500 Subject: [PATCH 24/25] Fix COUNT(*) ERROR for PDF SELECT Queries (#1376) https://github.com/georgia-tech-db/evadb/issues/1170 COUNT(*) did not work with GROUP BY, while COUNT(column_name), or COUNT(SEGMENT(sth)) worked with group by. The issue was due to wrong column name assingment while creating a tuple value expression. I added a test case and a sample pdf that is same as the one from the issue. --- evadb/parser/lark_visitor/_functions.py | 2 ++ .../fall_2023_orientation_document.pdf | Bin 0 -> 620040 bytes .../short/test_select_executor.py | 32 ++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 test/data/uadetrac/small-data/pdf_data/fall_2023_orientation_document.pdf diff --git a/evadb/parser/lark_visitor/_functions.py b/evadb/parser/lark_visitor/_functions.py index a3b5a868af..2b2c180953 100644 --- a/evadb/parser/lark_visitor/_functions.py +++ b/evadb/parser/lark_visitor/_functions.py @@ -151,6 +151,8 @@ def aggregate_windowed_function(self, tree): # Support for COUNT(*) if token != "*": agg_func_name = token + elif token == "*": + agg_func_arg = TupleValueExpression(name="_row_id") else: agg_func_arg = TupleValueExpression(name="id") diff --git a/test/data/uadetrac/small-data/pdf_data/fall_2023_orientation_document.pdf b/test/data/uadetrac/small-data/pdf_data/fall_2023_orientation_document.pdf new file mode 100644 index 0000000000000000000000000000000000000000..4205f9ec9bb19a985f6f747a69b40a49da6a9bb9 GIT binary patch literal 620040 zcmeFY1yo$i)-Kw(2Y0tXaBC!3fZ!G+xVyW%ySqamgy0e+c!CCZhv4qs_-(eFvyc4u z-21;f?t9~ntdT{puC7%zYt}bsRn2dP`rTVGMph;c6zaA0kqHz;AS(wM3z@Bf1qvS@ zvy8covA%=3hp`bEE3*t4CmRb32Me=28IYBeS(J>Eot2%HS&odIn^~ERlZA(qgM(Ru zOp^@A&Pm420@M}|Kryy4dTxsBA1)L(2V;}pdtzlnL1g*kV&x?J?TO6h&oWka4%UAu z<6!&OGEOewztrPq{WoPmwtue2#{N9u=j-qNa&dET{c{;N3-`a&;|6m4i_F|S?EfMk z%d5u}=qPadgsmaQbZ? zSWu{`Mdii*d5(Z=&%*qH15q+oHZB%sF>@;?V+Uq2D}5*9x5kFHM#jvN;9s~onPrS^ zOr6ZgxL7%umB?6GIavh+9Gx7D^{r75&3+o_>FMd~>GkXB8SBN>>7(hr0YJcVk{Ri* zjQZ9l_byrdRDuA?`ZtG1A<6`>#X@IWb85A9-Ai0#*oC|+Jn>dQ_^yeJ>_x6fu+{)m z{xu2Y>KJ;`>)?t+6FF##YOK1U)4`c*3AM~QRth=cW^$f|ro0VYnWvd#B4eiQbIrVa zQM41VIB8x{jH#{EK_LpME!sihuQe84@x}!bs6 zlE*>BalZVUpU%_?*)x^XIfQJYuYk;<=0v@mP$JWrF!3t)T$BTOyz0e$9%IA>^@0SS^$f*V=o z#vhpymR=#ue8&so77_)|)+bz79QhYHv z9;yGeY?C!DH8yalWf%^zmO76Gf-bCuN$>pNlgS*FTN-x&wh_iEU!IiPiQ)t$cBmhT zxx3egesd3+S^RHr2hye?piz*KdwTGR-@SwiRHO}p+C)O^`1%GVU!Ub=q6R@!-#05* z!hZK^hy)$OQH{)b|1B2I{2O01V;xk5= zL69N->`EJYNOPvbJLJxnX*}@8Q4}_2F~ORMn0odijyQ|hlMDbqoMi(&)Oi3$4rUne zn`j(e60d5R~p~#0_>>`2RHkog3}$4J<}=iG4N{fmGH(jH`A%{huN-KKC;2G z6Cnzs-vpRLc2f5shFFCJBWL2LkMb0Q zl^d~v&(()|;|BrQa`>Y7?9Ki_^&fuicZ>bQNZuMdIysU7S$;QSSz{-CBYh`*upxte z4%n*S>6;oq{|xp7;BU(AcE-#i;NPumP5Fz}W|lQJGS~l?(s%j};8(%Df&Cb`H$`JdTW1GDV@I&h5p{DCS8@Vd zF!))V9o#tga}@yrW-)Mo;4(1|aM^FKfy>@G*cvJsJ83e5R|#fiV>c&eNo(*pgn$1K z`Tavun^{fXz{1$@`E@lQ*r7cyA>by#4Jg_^cSXj+tmNe2Z0Pj6T#n%HzbW8ZCx0FN zbGLtJQ&`{8_*o)mq2DfgMOy<~CtF5EV^e1!T**-r$o89-wV6e2 zz<$Zx#*|so2&@5fCwE2(W+i6>r)PaX_X+OV_Pveyv-1KA`n!+)O_t|&{wm9}TK<$p zmRZi$!CK#n*-)Ph?ArcZ)_$LuKPvqj=lF+LWaj~U+&|r+TUK4tf>aj^TFCJ^mLsDT zr(-`ASwPcXo#LpcGmKF8<->Q$2~llS?6*=GhEF%=#)?53Bajcq$t$fkZOBU$VZm@KL>30Z}`QZkT}?30#~RB2_r1ccn#v3XJI zGDf_&$NRFkW5HCuRmfpnc|NkImg$+A`(E{$DO9i&U2?GP0+(vBK&^=7_G7W2NMNzp z@L|w4g;N{5g+@N2YW91|edtO2(ptvHoa!VD=@P~dkKqw2F%}``cM`q)NSYP3X4bmp za;4Tml}FOU3Qtak8(Lb0Sd84AjG-Rg8HWt+`h z42rqE*m9zSa~f%ttdH%hZmw7@J6A(dgBCL$JsTGT#dSwvd)+1mK@ggUlebxkd(m94 z2k3*R5<|IBD_^_=(Eb}^W_vcQ|2UgK4i4@=);m`4;>XIt@z=>c)Ijo5?rwZC8J<(k zY0i{Q;UjBSU!;mliz_nd0!X5vB_#ME^i#$`Ln63Ce(=lViy|jqfqI2jJyn7i^hNV6 zWW50rWB%0V*#O+nwe@P>OBz%dt7xt>d74+P{2mVuTOXG0?pV)x+0Td4)6bts&WE@% z0T2Lo9E#bV%}v}e+i**O8T}O#o~p8%)zJed6xnEqH^h2GQB0$^$<7x*1~cHtr;fFx z+O4F}*=A@WK~EcN_f|8kBFYEsao#N^^Li9tp_yPqc`|Lq_kxu!yA5BOA)HF9kEh%> zWiRtWS*&PQ@ABM%110r7(BA=pXMi%vb9xI+4EAgxKnM}h`RRTCSp+@O&pUy7*A-CN z%`Cdzy9VT4oR6WymDV=9Wr#hEJ+UW**g$8;0XSbGR}3<|8QiO>l!nPj*zbPpwwgT2vrNXv`-JrSzRJ$KC|EDfWO|?=BHYY%NrMasf4tfW zf~SQ*DPRdE+kO)ofMf1|{bm`m{--m>@aWW!sD{(j{7r-qxU4n)N&TN7**?`T z!j6xy@g9#`KX5;3sy{%apG_5-jlhK{dt)ZR-hWL95yCAC;WYEd1YP#A5R-(=v7oS- zy=XzSnS~d(OA^gN!D%A43Lu8;j@Luy{q{NjTRt)L>IM&sIjTt56_!J10$Bx3W}MQf z)x<~2CbdGGpTTrj>U(h7vQhL5L~xC9fXF&BDCOOHg(`@-zMtWgr=FaHkg11g$4O{% zA4E?=r6Km+2BF;vLpI?Dp~qPSry)dzBB;rA$mGFaio{*Bk!_&eq~p@k zr-v}y50v5f&)uW37|6p@3DZ^Z;~?5a3)6-;q#?b3hjLkkSBLsTmhK~pn{N2AWnOh< zpiqu;A{aE>SD zJv8{mQfY9J==MAu`CfF@R>Cj#^w9SxQEWsJiVBR5SCr`#=b*Me&k#n+^D}h*v>;+7 zz4Q7are{giR^ItYkYy`!$RKRK6j44ls}y*d^r$YIRnnEQsvckrvq%SnlB&o3H9Y4ZPT73lqOZL;TEK9VPGjR-Pl2DtFqP}aC+XA3DEs*J z$Ghoq&Ousc}ke|OOa@#>ThRDuJ2st9Uqo(9u;(}-G1tm^o+@!V-6K%8imcm4}RpG9D;Zs<$lHXDy4C}fY+%hb9f zl4!>dn2bb;>0hf?r(%1Tg+)_D&P8=w^%!s(R`WW+XAVS+sH5{j_YN6|($N3Z7bT@X zA_xfFSBp33w0BkmU6}xCJH^Siuosmeqa9O$`BTG|Wm@pjz|EmZGDO!{n~MuC!i}hG z#Q@{)Nn@N}ofTL4)#OO{Q3hTGCsr|}v!O5N$L@;^KpmZP&_&!TP$-sldqDpzfUxe) zZ_-H9no<+MMYJf{P8MNeW_L@kHM6&-)Tn0Docn^@x>KGke)>W=SdU-B7om1z7Z{*GkQ(+0bo~?rkwbI4gQPCOKGY; zlYz?N#2*Jn;V&hP()iUe60Ben?4-XZDT=3;4^4BnZnRAKj8s&LAE zOwmS1y>`iFAoT@qvQ+4K{-LpPUqU@;fo!#Hj7ln%c__8ChjH+l;wvtVfSP*FV29bl zDQoL7>mUBH0tfP>WGq#bs!RSDKLp>X;GS}o5?`53uU7FMgjF#xtFuwbGB6E^hq(md z#Zggj&`A4BDpIHjNmjUxTUgRF9rlSb4)N!OPA80$NT3N6Ge@Qnef?T~>4$!MhnM4IpnOa!K36%;lcO#jaUPV}r@FKt88|i1FE)>BKV5Gvhm2bCk=%#(9iouSz z$OAgcE!Ws&_yM6wAe^K-D(pgw$~#YwwU{aG1hge!lEwtsc@vyez~Tq#vZ+j z8e5*ypT>UftE_kK=^2FpjV(*i8?qjK2F@S7j^2D;s3ZFZ zQPrQwUH$pQ3iz17|0d4A$}EtkR^w$1q1nl?_UA)?0bCnQ>j$ZX@cQLz&C#l}~qz!lPLUQ~Vea&lRCet7!gJie(so z<{BZYR~+fa+cdt(ZxV*c9pcmF1493;K)3t%S%czxSa+zFvf;Piv}9tQ)@2OcbGA}* zyS*g)gr@|5kRp(V9l7OuSk1gKd2CNW z2@k=B2=T+Q6~M7$7$pLYy7p@ZT@fy}+s5sbR>hF4D{MO_f&d)u`}m;2d(&x>G>-JD zTHhstS?2=#dHR0dA&VCD;_8-=_$^<`@QDv8GsSMrMwi(vfsYZQXHpcp!l5OtA~fG% z?ICI-Ggk!csecl)jHSlce`lD7fvwJ1&VHJ~d?4ysVc%OmEzjIFX-c>G^dv8-1zo)c z`(rHU9myr{7H_Nb*waT;<9+?8Xw$N|ym*%UX@e}1pi}2S-XCUc>9(l>Q5Y9BiUZP6 z%z>Ul0r!gGpWZg_#3>kO0jR$5l?*Z}eoMEBR@_aJ8lhKxGpc$-R!EbkiUDjA4rr4i z)^Er>2na{RL_eTPoDGJSf5D$X{UjfB|#w)a;}5h=o&5veT|HruFIIM|RC! znW&SQzRn%Y`CvWadqs%|s!tzd;0IVTzm#jx?L_ILt7Nn1RA^px2M&v);!E^Sb`Lub zFpYOCCl*Oce!t$|M7}{)+JxJP)y-OB(MNry&qYmBk>EyDIgG{(aW%=WAELXIcbGrpU~QxxeRsZ`xpB*ia9A_#g0nESEaT+R2IX<^M` zR)(kvj@|{~`8gn+ASk>MenTz=A(k300nsUaNK?>Gmk3>8Ir<*M9$C_4kaOpI?brYO`I3BXyzjdzN}5+ za;h)B*J?vM4}ETn+Y$7gu_x@j-fM#|!XE+#!}Ow{ruJ(}^u}}=^lI6F1kp@^d%Y_r#|>`i%k1c;qm5C!!SSeS@e0l=x&4_U%wc zA)YjGu&#)fLy+UNFofC~*u#1@<9bd!l`c)4S&M9x(TXz6DHUpheMOWsV!`nY!(l48 z{)J|Q8R^5=eqKGiKWo4k@uH1Z1uZjk6Ys+?_8l{eSzi#?p61wu$3rQ606C&`9 zpNx|V-rq2|CMan*Z^)ZobJf*Vs!vI!UowhH^Mo(KM}ai@mDFl}?>o z)}VNhFoKS^6b(g@Nyj%)2B;CsDZ`-1?hTB?VqW$&tLnbz50+7Xp7)9 zW4keV4f}QnHwXnGuTid{QsCo{ z35_Oqmw52yULR&UQXO2RAfdKBcA#<|c_lF1UuxZ~-7uad$ISSi4o;I=e~69pG~GXP z9I|E9yxZt+s@Z%$kX!EPJ?dmNHBVXw8Zwv^V)O`?@9txP#?T91$l#6=swJS#ydJEf zke>d$uP*TfAy&Rf0O=kK4!t!CzxT?7Y8=3P;DcHSd;#orF>RSf?`@PjcJ)>tG**+v zu>>)G-DM-@#0relLv}l%k$=jF6Fj!GNo#)8n;4@Gl?#*OIr&K(Gjw)jvXFGiY&+|0 zX5p^X{q>k%-D5|cXCqwEu=k>QncE#7_*zOQ_vU=Gn95 zUhmd=+25qYEk8}Jqxp_=76Ds7ycc-iJ|z>nqsiFym}@V1;nbhopCc(x%1EGeTVZ#f z-YfjNp1sd7Ni5c~GrmB|)hwt^_bdxDb6)*!mW^DW;0NXTY?nM^g&wwKl%g7Q39U2q zZJ|uyU<-P*X!@Nj>m`+eOUtA_wFB>zu1h7$Y>%@ITG+z%7`|)l1<)x zote|kJa(`Q6iJJ+lg4x=az%M*kp$_%%4cs5wD{tZHXa;RRtq1=IV}0<>VjyXqVcdk z!^)m2T$TiA;ql_m6m{0WTbc0=!KZ2uvmPS%or+;3t#9XoUt4SNf_@?3Q;pc05d z`dwaP*`}UM{}g>p;;o}^CF(}?tID*r_dS#-2B9C5`*0Y$d$iiQDmp?aW8NEmG}%2B zlVo>9$1fHziJQ#X*#WNmyz8py*y+SVP&CE<0x&Am-fZL#ZqfFEXvJe-# ze{sVm6wW(JY&VZzkDyJ|IL79r2nvF{JbN9R=SkiDdybP9HX1fpikKP_ zYw1J0Npo(J?*>D|DztMLU##xr=lvwcA?_RvuCBtUfIR!aPNsj7m~H$fZ(|x7;XZ5| zyJold2XM6xW=V$+k!`8p8y2<7`DITu_r`T4srAmBv6m~8TulQA(74%ImR8 zbg|$gu)>n$R}+$?_+*NlpsE{0CA8v7&%6_CH0BPi3Cw}(dEDmXMLNyeZd1)eIlCdn z%~|kViG?H0Qkwhf7j(?@_;LG#Aqsy6O7v8z#6j0uR>D@kGn~&Ah(A)QH+qN=Xg$}O zdHwTgeU9Cth^-CT8+VsOmg#oM!8NS^7{e$S1VR*{7!*Hw6V;b=Ldf`0uag?24Ws4p zls7j?pPnww!b&8?d}kIxg~myU>J z@>Z|Dn7=mnxDEF6+{k%#W~dyo<(K9#tnt#X!Z2BZA|`O)os;lhgl9~);PS+h?2Bf) zz7vumtpQIYbm9Q*vvGf3X6h<8ECq`RG-E#G&}=(wKiR`1?;sR}OjHij-ea6q$`Eqa zL2)XI_?`73|DaCsE=u$f_{=e5ReKj{W-()^OAK%A=-J9KREw~E31ZX)*@z~BRFz!* z1cPg|VxTbyQ(i<;TNR%3LNfZp#A*QEG-Jd#m)!$a)4Gsm}F($hp)$eiHRX)I?+ z-qy=xe8n|8c@vU!YY$(HOe!dZ5tu`FE#0 zRFW01rNC^?O{<$3Zx;9S5P`3is1asxhvP(OP8;wVy(;j8C;MgSQ;1J6o#<7Q|1LNS zW>xbL z0uJrpUIK^sjoHAg!E>Bg@wXB=eQV?Yf}xNEb35jSLN=yWztbPa)+%6ToQaK%jT6ZE zJN@xYIXn{?4(4`Fwhn*c6@DW#{v;p%=R}Bz*S6E_z(&vPd%WI!O>?~|*|!K2B|#m>aS@!SHK z`QqkcdZyTZtHc9VC?_iyn>HtpCJ@{w4+rp>et%|mexJhUM;<0F?q_E0xp!7hE*>sz zE-r9_0vQ_z8xuHlfQy@qn-$yzCld!J2bkms0>R>fOIgW)U`(*Hf{E~FIa%0$XXn`2 zxtZ916BEq-F@eWI#?Hpc#L3A5?&0}WHclQOyY^p_AAV<<{v)rz&I6=Vr;Ns4d!gaNC&TgX-U0M8L#<4y0a)#!W-jEx$Z0?1N2 zI#Iqv__7N#tF!Em zl|-%`_f9pBiJ2mq2*Gd@hnJGLpm|9AbbHS}{N*RsLAl(5l+<``oIynfx3`o#bqs6z z-$zk(Dy&Y>HenE7>}~;`@HMc-JaPlo$}TCx9AjHiwN(j@t54Q0)ru28a_=6s0Ry8*QXGyTJaB%;9 zs-I?`Rsd*HVv=G22uJ{!%Ygs@o)!Qi0C-qfI9M2XI5;>21b9SbEEHrUBxHOHOjIml z0#XuU0wN+ZDkd5-3I<9dB3iCj3@l(Oii4Dfho75`kBOaw?YR*M1OxM64z#kU`Bos6ZEF3%nA`-Yl z9U1@<0tyNe8VUvm8X8>N8~i%}8XX3MoK*-GQ$Zh&!XAswKmG$erEv9kY{jt?Ds}^h z00cxFTs(XN>X$UMujn{{oM1D1E%H`WOk6@zN=f;>imIBrhM|$MiK&^ng`<sTv zM_^EJNN8AiL_%Uxa!P7idPaW1$HGrVpNmUszSP#$H+*eu>geq1?&2?4QPk4jvaIG&B@6-1E2~AYH*X z6go5vIV&uNkOG{(JthU4KRlLj{D~916`?%%-$WRdA$%8@%2m-EeY4iOMf8D=y@CyUKFz^clzcBC%1HUlv3j@C}@CyUK zFz^clzcBC%1HUlv3j@C}@CyUKFz^clzcBC%1HUlv3j@C}@CyUKFz^clzcBD$VxWKn zkfb;zJtREbK}o$d$wCp865ru}Gm6WoID=GtuW^!+os4_vvJSG2`zm(}${gTuD5_+0T!PJ()2MRkmn4%V6UmJSpk@+&+g% z3)ds=;r0W7>I)C&-^IZ{o0<2le>kD*ws$KIBaHxhn0XiO9o&b5! zq#!h3P=?^D&rjb`NYs0H!FySf4)4JE-o_*4->Tg|S3~~2+QkU8TfRIF$Qj7Ps4|x! zCeNrWnP+>A3;k?n;!xAb^pJhg8~i{Ka4!7?M1xj*duiKAs`0r)(M2Mans`Jm z$E`fy+%%aoT1-9L58#=o1>1fa*f}q^bFfs0KNBU=0rhyg4^jye^sS(#lSb-PQe7psA>R8}rMD=J6 zq}x#O9mPkIPM3~pqX(({=qV{m_B?Bx^T;4xwRj?d*2V*mYu3YA=uH{ZAjD@Z12X5&o$iRkHy~m zi4R)kGiGcNx1iR6o6plOzck+QMfRr8adQ{9mR(opzu@m^(*}Xv5H;reCxE-}1-h<; z`RlFBig~1L&LiHiu#Ex-{;)k1ujNzmM=6rh$FnEE4n@@K+NEywpLD&XqFAct{m({; zec}7v_Xf@22~Zg>nC-QyD}Imr1c--az6B-TOylJS&Bu0mkmm=A+GXqiMLB;})PH<_ zx8&PfwtU2OR$M|@3A)UD=y_BoXaC^?@7wzX2=m>~2g@d_)2G9ABJwDBFY*M?28$qU zaV0fg*(J&!5J6iu1Q|h__v`+@tb>>fCE{ryLl+DbRiYmZfVa>=fCc3L(M^mZu|3yo zAgMm;ep%5sNELT|By!)%Xu^wgbqimenKfDdTHNt?Vqb@bziUPnLrY8QY={!a)rDbD z-a%etr%-4>-Aey;{TMN6gqLSIsKNwSDXrY`Y~ig`9?28n=e=cWVSY0uHnx!?=Rz|$ z745T-D3&4s?AQNiH{?}v*&YG)+LHN<;zEBBkJvX`gV*SnMV1~z!|f$Q#oEE=n>~kt zfH>AHAM9LFruUvPN7LZO)4=%3gKUchF+Tw)kaaIlY0fLN=y#p~0Z)K4vhF8aqz$nKrERD>AqGU zAi3=vLp%AUnFt18l;DYY1Kw5Pb|YNwQcZBUx;ahtw*-b{-s8@f+)IK&xx$YYtCj| z-Zy?s%HM?&yD3@QKp>kwsdDB<({&c0^tOe}`QhiQ1dw2tUE-EmL!hnhQliob$@->u zloZ|Ktz3b1u0Y2YgEJ#0#C^$!m6a2VL>Uz@uCTiP*q@R8L*nPH;7a>_7_0A0SMG3| zU1h-|(i7lEAnt>g+@_kkbrPei@^ImXY%^B(;{x)OZhtX}b zRud}UeEhJjQTJz4j)BPTj{FY&_U&Hh_?^slsZu@|W6dx0@*`gT>Bzp(=9in_Iv}a4WtpMw50Ty!fYK%fSr3y(DL|N%E zqM1gVpw+nb%Mq6_lX|lvmwHUe9NQ8vyp!&$tvXyzHj-0;&5^M$y%X5q_jRFx3)JQu zrJsTDy}YPLAMeA#N4I6&U~jkxx^)f9;ul%EBJ0`Gl9Nu6fwrILB9tlR7>UaZCQ@)BG4g2ie?;BlI=CrYbKJPVw#;lh)>yh84@$t1j0giKW zwWgCkjL@SiYE?IGH+?E}EZtLDUTSpTG8pV#ZWu375cPPawq~;mRy5h)*OYxegcZ+9 zyuA;0W9BDS>?1MDOS)IFyHbh@s)kWo+3|3J_n5_?o+rRSojlVR{CS0%*JpmXQcu;f zpLi!J$*a;3)AkRn@eG7HRoih0`Wg|M}{S6wz^p%}y8fh8@>ON>;TQs&) zR%8Q7-(l4%s1pSL7I1kEy8PwF1BVuhy^H28RAMbXt%!T=R{)lm<%*EuquCvhmWTvV|@u`rJp6T~@{-bU~4+D-Bv- zt==LD3MT^A+1BoxUc_OM2D^?a z!|vBKCzafLN{{0Q2q5V_jPK*iSdiG|@-3u=APDgZa4%~bkJC(--u z7toWwC)iH_PzF!IBEubiGWZ}E`?rIj8|gnZ+!g>5HFq>zG5gTmknvN2FVyJs`|4bg zA^orf`>~8Mxot1AkA)SK{~y{JW=7J*uVayN^G3FH__b%<=DCg>RFanhB52D8h5vHQN6~#@hU-H; zeRwedq~5g6uI^xV5$I?u9_64Hd|`HCUe9_MLEhKPu+(=A?762piM>J%RaI=1(be_4 zk5LpTX^&O9BuUeMOXD61FOrd8KI0-LoO;Xj!3AEu2Ut)&|2L%G|AI%!bTQvWr6 zBX$slgauaO_@cu15%*K@6F>krw@{<#Wkvi8d%2;UQc-u+duCarM=xf<(|N&F4>R5K zRd?_>C$5wZNXGd`-sjCE`*vK6wr_WwKLLmf{?-WSkfa|RQWbC9OEPGw{7W(ENh=5Q z%?UWd+H3Y_BlonGbWecb-4DJa!P}3#;(zawKj{vR&-1^QW9*=4mS=tOQnw>Y^*;$x z`>O_ccK<#x{}=Uf{wF|6HEesdah0d6E2Fg~{21GQs0%%d{=*mV5zeT*bU z=#XZRcG)*HcryFt&)pu@OEo&`LskdE{ZTZ$pJs>g3PW^)b_1 zn-mLudS%}|ZqIcB*O!SFKMha!xA@AjvG*oaxnmx5QIBVLc5M9Uv_I0@g9sYw8Xm@zB7t@v4&Oq^EGb zv5gGgnY`H7#QhACD%8r;!G8F)Q$@gj@63r8b7(i@IHtovUXNofmW^ax@c~6jb&Gs?WhftyXDNr6f|Y+gRCHGyoS>2p zn-8no7lq`Q>`$U~9%b)pgS;&aWe1eGIBHGX$8^Y7p8(OW1&T2Ab57d_LJ-*B#z18wPe0?ZD zGB5hsi?O;U3lpXLOVSuv0M@?82H# zRD0p<@K;o;X0iu9x#_O*2M<@O0B+p#`K&~LZ^JNo=!#|p7P9Q?K3`zQ zdy8i^hw#ZbzbS-H)ah0ySBTd|A9&z)&E1Py=ZSEIYOKg4;G}gll0zm)UR6-83PxT& z*!Ezk?|CH6pdpES$40>-f8_@s=da4v$DEMo|{eA*hH${&^yMa=THocCf~BhQzv#Sqqni`WvD!aKEJA=G~jp(?2bD@uMN%5XMv%egnt z!Jn)|fa-5>A=M(lspzozaTD3oRB9=}GI?}ujC@dhP+}*TtoLqkusfVOZ6k4UOy}eK z1aT-=*T2QopZ9W2x&V;pBZe;S+?+&a`BcjsXx-pU=r#+rr?KRk*%ZHzJ(rORcsYUztEQ31R=CF? z%Ypq#0UmIea>?`wpabT;g@K!wJ7Xa9Zq+pd1!+;UH%W?PZxBQovB0Sa|BoJ$>sFos zH^jB5ckl~f{%WesV*bSUK4u>7A*lQbaA7eyvT7K!bGsD*gS|!ke4za;!1jM|%|@jG zouJ-R5}5arT7%OO2rBL|jRoMG;izqNDJKfe?$t)OX82HFFZ7JdTT(3M)Am{C1;&Dq zfbOQ9s9`uiF)breWQ{nLs_b^S@D_?FM`zxuf=SA;K$l_{ThRJ99i}NhrDBT|HgLd| zMeCd+khGBUhofRDH%*%rg2g`JoSuewzq=wHtp|rG zn!py>6@(T++ZSIfO|88VVd4fL^j`{wp`mJEw`Pp5xo&&Ro|hYH)wG{}opvfUtqI?j zd}|6Qh2$dP-Z%$kT*gMbo}t3*j+UY|a3Kzhp8`IvpOZa8mTH1VR_`CF1LXqW2Is{G zlrP5te#!wBX229xq2;~F*k=2Q)S{-C+U#IWlYf?YK$$Oc;00`A@+Q_)NJ`9L<%z09 zZDfb-=NsA?rQ!Z@>^?+RKh&a^jk+-&vUNFMKItxWRQI_OMKX;7OoYGEETcr-A$~b2 zT7!+x->EStX#G~VKq-k;_Avww9}ci`s`Uiu7Q~rzYu2oZlx76Bmax$uQhHY7f8$#Z z#u`tpvpzuSotq<>I=S6EzK19n5WtTjlyhH|RJeuEf%>%jZl4qjS3X-PKwBvA^Ew?~ zf*`rhWj=pHz$2;o6JWk3jk4a~Yg{>@te5-Sc5$~GbLeF$A#=Eb#WhB9jb?9B+qm7w z`WLUS^OKKX2DsG7+*&ZQ^}riO(DORQFt}S(`{9yg+3P@^mbm8jj(r<+5w#?sJz!H0 zfAE#Meh_$ER;~)U8kc87NOjka-<)7F zxgRX0>=RmlWJcD-mdaQtnT$0|5UCEeK?1zAqF&^hXWrC#!*1@mEWdU1{9W2K3T}nb;jfU@xDy%1swk#?Wc8$J)n~}_Sz4Q=1OE;p>i4h zi8;9Jmk)(+$f8KK{BmZ=KNT^>htfDD~iEWIHXR6VICgQ8oOUPxUnG0(`80|%Fe?_Q9`(wLO$~mkjdM zc)7K>fbEsBcOV8f)z(10I``i7vdGPJttW7G8FhZQdZ&RW91x$V_j76XeAr^9*ZZZ) zYm-U>ObpnDWWOEB#YXTsy0{JLl*`X}l=1MgR9f0{R>`uq3J1gRD;a5jvF2PklXN@p zbZ?I3{ANtSI(ykJXRI+{f5MF^AQak$>;(^{V0fhlXvCN1o-74Dg#M~{^ebr>WMbf9 z0_v*rL{Bd2$5SF4oLdG|TS}NaH9r_+c|0xCXZK+3Wis2`ub5}+t6(sR;5Y{(i8ZC_SI!j~qX-p6p&x)iKl|}Yx5{;*`lby# zHy3HkQvS#`ak0CuEdMN*?pIh3gl% z3Jj&TNW&4Gly-CwlnX9C`K_JZKI9V@w#WmV1%k;}X&T%oA2-wG;ILOok?IZwJ0Dp+ zhr}GQP;E}>t!cJQ6k*{;$7BU0)#!kOu}Yx6LXAbYSH}ccmZZjow-l~@KQ6CPfrI#p$3MAkaRh8%KuWj7FZsQPFeHgU~bwge6G!rS@-V`I1xtB?iKM%#vN{ss?asM;iesW4;_!dfqw3@`$^mTd3L_K$SJT)b z8{X;>km`V0bGFi5FZR`oNZj}j=BE&TDW??z5%ifD7ZN*pbylNbrpP{<{LgL9KYhZD zsw|*Ngqk;$2woiZpm1;{%@Y(8&*NpTEqu~iKR;nZzoJ>4+`6J&SeBieOH;w$9 z)bW2ZK_kd?7o5U&65E-vG_gb{YiPIeCDQ@2nqN|p^~Rw2_EnE8Z@!k&SdIeRw`^=( z_Px{^CdWGA;@%n9=3G=aanX|&h79e5t^<~HuEE1g!-ZLU&5NWZNq#~MaL!uMXY=}u z@~C>%QL3x6=!zINcrZWiaqcL`Z3 zlN7lY6*VrbK;9fU6tbR3WWJ%^kkqYKqf8qW*5>fouoki%jnH*0-A~ws zGgey5FE?AP95=JLp++$SZ?;-hA}D#pOvO?p zKGgP?&G-hA1!fzfPI}6v$N{MDL?uOOUM|hjek_Y+pYlNjxjb%e*Jf;WRa5oiBm3P! z{kSzrl>yPL4!layEUq|4j1%UCR=S*Lzn%G{@cxk6QcGu;t2M^8n*?>DMYE{W*yp?# zi@B9A1ko|d6)s{^X(cpxsxz`&iB1SVT@Vy;(e&z7AN@-%_*M<>c8q)WF+Qcw)Q1-h z#dKm6Br*|s{u3oR7WJVgnVq+=Uto*P`S0W*79$x-RJnV}X!##3+wx=FHD++BY(2q8 zRK;J>hJWMERnxp2z~^?(g~xWxCxDQ}#qD`zG#b7a1cRS%aSrGGg6(B#;VA{37sE|Y z1Z}0vDmbnX_h%3QL#TUDeYe#&+dHx-&S^pMHJ<7XB4`$)41SNNvXYP8p`i_Lf(a{t zWL|I(fVxMYiaEOTVR9xvf%F=YLxMf|t;#jmozW9}RXBGKi5?!;DCr=NtKPpsU9c%4i0#j8*fUU69BRg@oseCFifB->* zkJR8zN%9_zv!j10OMV0`+MoL$)p0?%ONGxM0z!wmgkcdRRG~@V*EdbAlq)k~sZysR z=3n~ikuK*O`4HgfZ=z!Rt1Ah6N2e3N2t*Wq9AdO1_Wv*D@V~K1(;jCS{!p$q7reAB z7baem$|Io=CNScE;AT)^CVYdUpu!#NwQ+d9SWWKQ=y2qCoC} z*sFsftd7rZJYb84uU5g^J^cDH?XFH8wEo+VAYd}f|BpTa_>VhG zpeJ16#}p5RXsc7Q3>}Np@!97}6gE(Q3_|Pdb_ef!=Xajuu84lSb8Qrn89Gr|@9|p6 zJz!-j4iF4kk-}*sG(~*Pcoa@>j12M6}UwpTISa6wDU21p<1-X zu@+(LA}yd>2Jo)*bgv+OqyB*8eNKEZh``nZL2TAJ0RM&;np3NaFw|OreUMk^2{0}G z@?T^R&;m>MO}vj3S6)d;j9%fhg6Wu;n}0xF2n$(FK^G5&J~f`*t?E|V%~V!|M;@Gp zKQjC<5u(V9y5)}PZpR4TFfrF8k)wG4mq1H4_J2Jqc;LA1o#(+fxN8(=SS(CoX&^Tf zkm&7}RS-(|9CF7DMn!|X=h`spBtKUYAnp}ls3V=S20DJ3QGN<_$iP-AVrYD;`mwpM zt-6yX&h-y1_$;t+!-hXfyK;(6}JMF{52OyT5q6(SwCH&mW7&JqTK&aPjR4a+gg?LKq`GGBf9 zd+LIh1KW&jrzVCdybcvG)@vs-rh}txfl7yWdApqP176^c{ZnqA+H*HB?pkTyk{EFC zymKD`LMU&>s2X#(ME+c{?@tm&Yv^xoUBywt02 zy<@z16R#=|ioYX#f~?r~xY6NHx~*IXLjBNHIaC={`8glGZX?cti!&X~8Z13|Q~*s> z@aLieT>hj3o-9qSb5*gA74H%Ss(#zRl%BMx4hw4-?&y}+*N!>=x;iq1E!MZo9G%w}5R7_{t?lwj``~^%XQ6=e#Z;tvHkUC$RSG+U~V?z#4q zntXiYVS`SJt=s0#O#gpv0MD$aqV`i5mf|mng6MirE_HEUeq2kD{ZV|VJO{nsp+VFs z@n!4?RR?>=ka$x;-+`EDXyyKa8mcDvQ0b%|rK3oab2nPP147*dS&q`)nu$!j{)XCu zl=MYVvMW}f5eOqvz#6JszFPD5)+fh5LEj(+rD_c`9ympjX(15Ah>Gsn`6906h%zi9 z%L;rPHB0zX?N+GsX1yg(vfu#>th)|?ymg7o|H+s1f6VVeiZquFow`_PwgQA>w{G27 z)Xr~U7GpZcvHY@m@}i&`SyZO&?3usg12|e>1;!z3y%Fy5Ph!%2xSt_;FFe zfM3Q^E8V=8{Ilo-{vk)KX}D{9Dg5&`g}-c${iM&rSBmq1Nmdd+Gj9TcVAjf7OKC{q}E_OqJCN0)OH4p9A{^1EEeFvU(- z-Gv)}K&j9)AY-+yp#T;6GEO{4wO$mFETjYjvUh;})c@R%_~)m815eTri^-Q-J>FAjq-_ff?(ajy2VW{Sp=L_(^7? z>ItHH=B&pj=WIvIs3AN(u~O$05x~XDiq0-qz&15qrGG2+HUNXK!^6s3n`_5j+cY)A zybPp$u-6T`WWnb(+o^}G?GUn%S$1sYY_d8Z2ag|%L^1k}wkp`^dKik2x(@kpXEqZ> z{+(om+i!y(aBZd?FOv{Hm`oMJNrA^>S|%J7494-pUN+U%Zz@}^4@I^fXj=pF+N(dH z67O>#k}iu=ZXk4rs)A285t8o$4|5}@h5V7lN+dyD9traON?Qb@@DDR6|;_GPY+ zs$WWzgayeA>8gHV>pTueL-I$0Lw9qH!mEZS7`R-Ut|r8Of-;Q%J>vftVUJ7E+u>%> zAO^0PmZzB1>U*s#&2p!66;&bZ44Z{-K=`6=xPlHjUQu^4qD<9u)E*>1o#;V~B)nO*WLqw3wA+V^+gU!|pfqAmRv`51f0 zrp${6mQ3;c_G{PObPz;};Jy`DQ6jpAdby>@Js17zWnD;SJe|tii}+Ak)?nx$oYwF5 z?NImdy3U-5sK|#EEpodSp0U_|J>^%rvUg7%szO20t?zTx{G!iE zbeVfj6Tc_TrGhcmAqRqF9HeYR3x z)*m0pyz1(c_Jnss+7rm?4KFn@QzAfhRgHqE8GS*IX$nR@9ZwT)b8q^q`N?M%J>Nbd zYtI+EpSEFGvR~qKTeSA!Ac@|sP;dq^s>P;v4VRQUrrk8QZd~#pH&9XBFsd)+)DTHA z{jun`^0aq0@(vb;QF1Wc5;pUB;+Pix;0?)Vc*E4HOjxrIw$xkk`}9{OHMPxywCL6Y zz9~3r=m>dh7_#wL`T3Kyg_q) z>sPhm2aF4&_wIB4u%)`s;!$gjbAk2!OtqV98f}W~=KS*E)+tKi;hx&QJgK4TG}uD1 z)J~`_nnkxyS(=v1kPCekxgpKFf*y?eXlyzgWR@5#!vQm=Z;0YZRUeRKldeK03lzrv z*4olE@`xX!f#n`6k1dVpR}IL`LdSmX@BX|wJNRy-`wcv1SJ8}%_Q#RfoRC4O`*lf? zf%)+pL<`23|A2(d%`jpsuV?t%HSgW%r8Eza9ao@2metMmS@jRd6nuWfqhrBh z_Z!fh>`ZLzASfO#8_3&Uyvh_yjC^(U6$i5i7rgcd~z2roi$Wo z-ZJ&_*^;~E6qT!mh*!}HW&O&B0`l5Nrp8vM9%c0gL^Zqqt9x*A9nDX9Wty3x8>0uX z83j#44Z}`)cf-0T%F9VfvwG#tJ=M*%$p*@NFHptlPJZ=6|N` z008VR)OBertcpZE8qbF%-9n>A!V4iEi%$h77~Ska;E$?q>Kr3tGnK1$veN z8ANvTsJ&Ztx0VW|l*PkVDWN1Wn=qIH#-@IG=bdN@T=+S2)zjISunZtCV|#(Ak`oHZ zSay+p5ys&lca9|}?~)Vaj90&kP-eK(^R_wJfrgG5_rLauMm%eZ8};%%x; z`=EZ{rp0`w+7}ca?lgMH@lc%D11WdoXGpZT+ClxvQ+@{;I~t9fnQsdVpMWUel9gM4 zw{G7`vH!-9EnbJfB7TSXzvYc6kx{CypV0K{f6;c4eNHU0(#leeBGDYqe9cSb`j7<4 zsUHvt=Q$~zIOOW=&#lLP$iJ*=r2BZ>2lO^=JZUD_Nr-1~M4UyU%Rx)Gro5IZw=Tv~ ztKf0(39?Y?{<1Wr%}3v(##!KNm3L*#p~`%(Oln{g`!a2kxu0y+gG&e0KN*gRz>_VX ze?h~)HoT{~Tk@vUyStO>@(j#}zpKFRa&FG+T)CdQNBL_(+s?zNtTB!#>!_G6gLlL} zK}JfN4>o6XG>ot@@aGd)jg}GAGe4i1tzPANX!R-F7iLdni${M@|O#ll8$CBP%Y5!l^9ELKN9GypY9%p;i8u78KL3bmp2w zJ^Iet#3_V?DyqlZO`3R-W+;!G23yb0&(3$Qn+`Geo^Q@Q#CK{X zVb4@i)f$w)9=PpHr^jdp7)qK>A?2i_d_prY4c=1xWX7i9#|4*+vw1%uz#ZwwTxC*J zKJQ@o$|>We7;E?l3&-w#rI$ap?f{h~ zR4K*E7_z}+@1HL>9vHaJCU_->7~d%0B)V*GavHb%^bpd~e8&W8E#o2kQW=+s%;PSg zRDK?O8sBj*Q|v~dZ2Tn_*%!J=rvja|w~!x>-&CrA8sk8M1WcZ0nq*m?jDhP8O+3e7 zmtpra=HY|8AhW=rF)rFQ$ffL9b$+KG9Y;~Sz#kFXfNGjNS3vYYY*7BX@uN5$U zFkkC)mb+!nz=N}XQ&r9`F%8BzL;=l5JKR$}zJ!wmRqmfAkH;V4ZU~u!F>QA282@xt z7Uik&Wh2CjeIHg)3W;I-ZVr8JnHboCIJPO#^-D%^jz2poKg!RQD({X0`u%CLO1=UdOX z@dJK{%pFwHJ)~2C+%JxgH~UIE3OH35aJC|>1ts<-6SH&MVij|0-LbnWtl!*-W@>Sj zE$cG#rj|Q2s3SWjd;3Yg?sU^&uG7i4Z?+j!*dha|uC@pe7ZBg1$}i1pOO>8%;`az; z%1iBkbI5P)qL1{m-Ai*;C>!9XS886!#}&p_RymlX%tjrKnMCJ_`{;dw=D=@YO7*Ep zLT>wI2EJcsO@*mkoymE8`<9h=%v~`8D|%Qb0;hy#dx6BypD*g<@^VS!x)KF6A9PP{AvX^mD@?pLMm(t{Q$4poQ;GQ64{FKA zSkP1Shcd8+R%c=~E9s&{<4(5B`*ca8rfNnhUGl0;+dZs!&PR@GXPyIG7^ncXD3?P5 zQNs>Aa1=u<_K(9EkY#QyZeOL24=!SGwDBg-62=?c#rr>La~DU+{cjXKuB}CJMrFB^ zNB-qU$QLi9{E5>qS3Z(P z=R<)Nh&Hc@h`4oWmx1LE#OKXCi7LmQZG%to)>1d@syCT0f*@>vYY(Nh-w0AIXn!=3 z8_qA1d>H5pgg{2ATI{FH?BZ^Q$BkJ#=hrR9nw0Z6Prg1*U>|q0k_q+@DYCfZ1@B18 z3w7#T`0{2%?9%W-ER~#O#P3BCy#A<^O3bXe#FRZr(5s%zB-@&L?+M7VW}R zgzGSOHaY#}Yiu~($$Q`bYeXjEuOK1-=AMeQi`Te|*kg5FJYOi%7~K4uA^UqSLr!lUY2nZS zZBZe!bO8AJ=P)Gt`@H_^_J0wR zCrZI=;KNP!&%MjfAgFF$S*?#ygJAC(_{EAs-IQzBEj z`e9m}UND5I~_j}TbS1u?Q z=l2xk_ycO0_?32PRd(4yOxe25k8S$F%og!)+wHbZ9SFWY(_DImbVa~HM5`dUh`2r}i0~u}7 z0z%(02!IN(zd<~FewGbZ+`a^p3flP=r@$GiNyy@XeNgdbVW z^cY~b!8ZlJ5MBGu03zys3LV`1$pHo3%zj9c(dnb>=Zq14m0!d7!~k?@t^XVNWV8{c zq``SBAuhtxwj364ZPbAu{`&f@ygt zzU|0&wuaW1>bQPBcg0Rtjp?7y|5zVO%^Ne(3KFJZ9N-6Xmu*1Lo63uXd}38f#a1lZ z2OjOn)lazftNcPbeCjczZR^R(=XpFdS~r9>Z{Y$oP!=u%9?)aEd3e*JQrR1-6BbNa zxccMOMDNBuW(OaRmPbhxLWNy}45gNhV}gokd0gn3Z}`J@oUYk-KSL)Z7KmR}UDCV5 zGWTW?ixxSM_7_A4026Z{yjPMV-uu^K+_^o5SD`ok_|-lj2d_#57pL8_4^l)gWaR%2 zq_f5yfeUDn&$K#S`q76v-`OQ)yL0V2%~fx4Sxq1E9X5A%#PxM%$9xdF)yuJls=*6j zo%8y$+Dl<{JI;K6K*EA5j|%IT!}m120wXIBKDa-i_K{*4<}qrTE2b)MiOxsNKED^C zi5XD3Uo%aM3Kf=Yv?QKUj8js2$fkqHAiCS)gH2qjLMPOOjyaF*y?YhpS{7ZDgmY=i zS}j&vU>aNFO;C@e!CATDi^zoRRXs(EXjWYZT5iL1UlAnA+o>tW{8M$NLbpzt8F40r zHk4jP?BD@y(!x`xD4ggu_T$SfD#HwM9TKjW<*x^SXK8t1@jRkft}0Gp*i(a*1%qh! zkqOJT8?{UFGaTalZYUU(z@*ygofgW!(tvS{a+2Wt*zZs77&Q`~tu2cSGH=Ih5S{>* zcfVRfAgt#vOHa$+GBvM>!4=pU7l1d5ZCxYcFTRCmq# zrl@jWRA36_^ee~k0;*vppc=NG=ve5X`oTB9gKr#1Upq%bu$v|5Md}cE@FJEY9lM~b ze0QP@PHmy!flLV?l|V+bP%Xfq-Aju8w`UUAS6RTpz`gC5x`-hhv_|2^6U>=v#_qn% z#pzmoCtUg7y`q9IYUAU}9e2O(%YD^4Wm1H74OQsp?IAJw>C35N<3rXn1eR=#aJwze zPj2*gVYlh(~rG1#R}=FV9T)Wl@HlwfAP zhKq(xw_MrLl1YPS^>nrjwi$hwrmbT?r0wu~5iF0P+?sfD`0_n=&*NR%XjKb|8no-S zVC3>IRVf@bK?J3@kmKPhuR6{8J0IR7xBn^${L)Fx8+-L;h?6Lo|>~7_o>s0Snw)3?S0bBRCz^;)RY)=Jn>S2G#W0)`?;+0 ztM)kmZVAfm_f0+>WRV~UE^$1Bh`6#BI>i*}dKper%Cwxxi&q>m2xE1A?HlqEqGRT^ zcAhfmt$2UxH=M%n@vt8xPnl_2-qRJ3ik`l!WyO-b+1?0FYq~ zzbK1m*njlJt=Zd@M_C%&9X>I1dlswL%@jJ&@e4}e&rMAcE+enJ1^(WkL zp+>MFEC=4mFi%*I_{m%5%XQG(==!4`vk_>Ipq*ZZ7GaDTFXHH`a$0COmZXHV(_csX?=Psz8y$AE?e2>QLtCj!g!B2z!3s=Og+YI8Bn z4nf{T>--J;oD@bzHbG&JClNq@C8#+f{(u}>kJM3P$A=_sPN(-9Am=rJjatR(~hK5sMrC1DgAKTH@>Oh4@cR*J12PwM9s(yd8}H*BV_}>6VSV0&8|M8BVWlk^G4N zYMX$}AaDO@dav+Ko#Wo+R1oqS`f?~{FY+3(f4V!45!X=D(VH79ltHsM-RBjwydQQv zOL|Abk8X@s^4`14pQNKnuC`c?7h8{sNER`4an{CXIu#~^e_B{U`&y~v^;RgWKp^im z%=VLe39K45pP{N8BirE1$6RUhKG-K2NLMI7_?f2yoV{n>Npb4;A%6L|0c4x~h-@ zkr8uE!3x3b`Wz1!B=kr*sK?=MNB2MGl$UL%(QeTu@zl?{*>G6IpX)(?PE0gPOD|GxQMgc0OR?nn0Ed~>zo+ceg8LVn|Iei zfFMf;KmHCmqBec$!?27?lpIm^;r;Y){j-1j-Tpt_QqVAh&}knQh+)Qy9X_uu>OKPL zR$WzfKX}84Gcv79prgn87;1h> zlvmUhC|DSU3Q=`Xk!eLG{rb#RDMPiR2dJSA%Lp8$F??}Eum3^&I>I$QyVOIA1#5CA z5mo$F8sa5h+=z@IP*ssgq$T;^iTVopn47^hES}krQqAuznt?&7gcupwB|`ZmZognm z>yE=g8H(_)Fb~p8SYl_lFlj6AJzF3Pju1AURXL{&%3_`Una~2u>{+G{XLSx4;7;BU zk}2DQ6QCLaH+I_25$UwNN%5muW{i6#XpS-u)9IB%$nh_H27J7C&qf+3aTSm}VX_&@ zz;9jfsYt9mt7s=Fy4eTi6F;7KGxaNiOd7Py3*;bWa8xPr*Iwj;UAq80fB*a+XPo#i z7V!U8R!ms{2e>fY{(yL5vl7pNJJkS>zxEU}^sm0hCd(xxJ~9AU$o=6*Vo2K(9=w9y z1;qO?{P!gfph^N})9vZ92qxclPJ=AK6_3i5uBav7@MS!E@>Z54&Hfa&A{Lg`zVNUy z{0`k=c@kas6{9u8xAlgy(TS|oCMO%8#BT$N_s~EI4W|XuXNldJW%TC;MH5&2@|G-a zt1tZl-QeGwjGdJIIdns+B6W3+6}Cme-Z{fsYhP(>Z@7D{*YHhoO9$&QZ9(vlZ0aBPGF9FrS-6yrTG{h2O=(?0hxzMYJCDK}*jQ3(3#}>9dFqx4{kNN!HGOxF| zVS`r1Fwu3KQEEoBfgkT|D|^UnoLu4gUmko*V8cWuo08VP3my}DUg!c5ioks$r@RkXg+^sndy6Vp zfBDg3=<=_9zwNTdx+n>)^}FUSb8Gy@4I_)2%H>gl_$Y6uj*>e^a29)RC^eup2%FnjV`_A($5{|Ctu39&L+X5Ej9)=)&|50k3p2VEj8%S zPi|V*wtQS8RmsVi;Wge)<4M~cjf(6*Wbx}`i+}YrSOT7gpBJ8nMao+yok_~!eCes9C$~5vgh<~o z7#-6~ZHTna)Xl(L3xp@b`r)@)*D|&jkB8x#cN>szfuuV@`?TXt$dTZ){mu`rBpn*^ zKfk?+Cf$#}nuFC@G1a2<%9$a^(l-B4VrO@g|ET0&!CRwt^tzF`AV*Jc%h?=;sRCnV z$D(D%(J3KYPv27JcoU3E)f`7P zQf^H?=amn%RcCpCy(Q7?yNJx$seP1mDIn^3$3m#@JQjVc~ z=itD%nH1H)=b|tWI7Lq`?ZR8y7^~W`k)1jF6eutl!jKN+tex+#w=OH=xtmD{@O`)l zU_d%1iLsR1`>qd!x5<`{1wP1t$NZF%Ona<8(8q2+VqkxLB$G7a%u>gbh8t0V>x_vSRY zOtn^rgwsiPm^;g3OZS1suDp@($BTaKy~yPsYo5IZ|**D6|r-SYI}MSFv=(B4N~ z=%*N!;tFlcC9%r{^Q0n}cTgF6Zzo;0OcHr4dCH%w7=p7qfb0n2(HDH8M@xCd{_v7-r*p8(D_az8D{)I!yqNyFDUlC{X*V_qz z+2&&;NG1pf_6W!$g<)lN8x$v(XCh?fbrQgSdYx zXzGk{uk-0o>Fme(dl#OK>trhdynz9%_Kz9PS_d2L+c6#q?rEgkhGdTp+GdsO*5EwO z9xiA`mo1T>7A(ffp|5YGnyh`4e#1M?ne^E5 zk=k~67U$Bw(Cg^CFG!d&~dpqN@`?=Jm zxRc<&q_<$+pNLSL-ZnvU>@Ml&<+!1^=*vi{b1!g|zt#fsChC#Gu!*QQxI69i(w4>X z!6G23-@T}qf}=VQ1`3!Qy+WE{f&0NG%}Zzjn2)T;+J8%kin>UMnn^^r9E#&@QF4Ie zy3IWVDE>lfA>#L<5~dXn)uj%p4;6=Q)!Lowqek;`yt%rmD4W;g?Mk0~@qJ{OMij?H z9du+kbbf5A9jiCqSL}3au!YY4exBcxvFWKRU)?y;PQt+Xw8vNcUXYIhv3hhPM|qi* z^>#6(EN}%ZORev5hOIAXBtkkod}80SiZj{w`0J-xXfBq(-Um5-VHk;3`*Fk*xW3Hq zkW=S!Ss`R9?TL`KYLOjA$;x-f`pF}szB+>Y+TyJME@O>cjm%fB?-yRw_y$9GkZ-7f zu_Aouz9hSyDyIvBj8soWMQ&t>{EcF3spzg|l5YWgU%MovW`Yx5PU~9Ud^=nF{Ib?I z@6S(4p85uSKjaGE^~wacl%O935}45bp=sP5+o@KI`{i@(=s^hCLKQpxR(-sTC^^`8h&F`^Z0gWhhY$ORG?`{P=Ffl%8vf z8iA$t%8e>e&4L*wMal~}@$_8vSvr95jHWfK^}OHG-I%Hhtq=y^*dnlx-EAtXQ>7iJ zd$Rb5btyVMBF+Tmc21-fdq7ye8%2{$$MhL@X$}SEZH`X0hNVI9R*65bVJ>NhgY=1r z-|}#iX0-HmufFB3hc(&Yj)-MH`C`=-svG9pu~E4zy5Hdq%`^d^OXlThE>*V=x)UiX z&{?vZ605O_9$ND`Hm=GhiPFB>0GDwNf*)x9g6~wd;;4~HJO9!yom2i6Z4bF6p+yhxNh^kvF3 z_Al+iH?xAMd9aS(18b+SB=fOkcA{NR#@(V$849n#(d%63^P_&6cm1=K$ybMT(w?Cz zPa|%5zo=yx^eX02ERg)FXV=LL?=+@^gfW(JT}gN-J@h#b$9Njhj9BH0{3Y=G!;`TM zV~@Ioz9pGXn+ z-tL2}r28~C4C+}s+^-f<-~RDMn4`o}0o6lz0K}8pp@8^N4>@ADQ1{B~Y;Xz{E+{R{ zljqjG8)8J~u?r$pAC&wYPpqw+e=3_`$7tC7`*SQj#gI|JP{W&_`WFOrA;diUTZjQF z(F0tc)nxJ9?ZYWhhThV2)uxI-*f2R*}PMVJe1Q+(TwBw(^gRcrG3Hq?X zYh^)B#+XmL04Ed(87g_{_Xu+Z8RlnqWnw4%S58#AHYWogS{H;iKu&j@Mgpw+x|eRHygpz{i6Y z=X5aWzui*}Cs}i8T}gWi4afTfibV<4d2eeHs`g)-(o|7Q23X?_AlDv<_6Cf!?kvIC zEuhdo$iK7=RsuLQC_Y2`7H>kO4UcLUyqK*PcJ1i(R`uQJIT&DAD3al?uJ5k@^$xrn)UW zNjL4Wa(kGu4C`ib@in?7E1y8wb6I2}a`)%h{vO}DZbjQ}AGK~YzyqLU2i+p6cTk9#YF`(-a z12bOH&n?YAAhV@&6zDH%TR;@Mb>XF`;mSw=7q~XlcxKjXe*D{N@V{$YSbHKm6Q7)r z_@=l_Eys-BirO$=_|l0Vq> zoDqsVJ=v_ZNOF1xDC9!EXSO%8*Troq);j~LN|xL zfEXxgbW9UJ?t1Z@{HV$k*-?cP7pX$8Y)YDNtssbJ#ZR^ec()Zt>pS6nOc3?Z!7Bc{OqIWq4*$ND`G5wh{|B^}_ET5i!V7xD;zdPkj_X_q<-Fp~wR_O-*ae~ZtXkqe_8+|geX}A`Y zwm|nW;HgS!?83}-6*{I@?4g{?x*}v*nnD*8FWo!?Ys#wQV|WGbQos!Y{u4X4r(;yC>78cDZKf6v`-t8IC(F z3(CV?nXN4C)xKG7QW)BJTk-uE-1X*&RYm4=V9l0#trljOpQP>e-$nF@^6EVWf<0BX zH;rDMeC%m@FI6@u6X~M7VRHVG*UEO+dLmT=-MySMo;bXdG+!x8{*-lLL9t!Z!-gcC zrE;=)T>CyO)z#J01``ocA?T-*-o9c%WwzzY(&BPV3cS`MyfyLW=&sv1A`X9%D6kL$gb>Q%n{q9c zzl>Fv2X0Dc*K2^aOoQ(vSl2w+ZqJ~I3^J)I)Zg$d+iH(7I`{*MAY7`)FzeXQ=)Y9o zai2nOT-DzeJ&X3*Hz#t1Ia^Db&dc)My5HW-Lu-u->OoeP8#q>-Ngk1U!>+VNe-M7r zy{2fV*%(m?z328RWn{G#1ex>-+H(2>s^*>PA-~4Xc3dbCfXLla98AlbF<}sF-9;Ds zmM7c3V(8LZw?DTQcU7%aQ5va~B3Xg7o%LVes`kG*zsHxu`7=aHq)^@yK)S~7`4w@Re z@|@{a-LL085vH#$g8TY91IGEGA)7H%x+i`xyU%2&p69W^886_WLU*irq z<~39{_mz)%bcpaTiG^{o1wkd6+VNvZlxYWN1*f)?hbx#I&*`~rLG^im-O~L{n{t?k z;hkya*N43@lWRb(|IRs7PG z_;Iw)4cM-kvTns_3F|g)UDE6JzGO04ZxgyU1h2|CKWFFRdDmd>p25r@m4AOATw)=` zllJ2BVjZ{A_*;+#>eoWm&vHM2-E&_;Qj}`Mv@AK%wI64?Rz$x#_0b2)ZJ0^)t_|#zuZf8!jLW#w;i_N2(ymt(~6{COgI%wgxkr)KpcZ z=5gSy@hbiA8X=(F4S+eZ)JT?|GrKNId8MtTJ<=gcIsJ0htp;AIN+I|2n`0dk!Z?R* zoBK+SBnozw>yTgkjF+M;+MtoO9=|vA}JrU`>^uK_mv=NQxTmy%Q6Q~mXats#D#h1eop6}~&} z?~S}`IW>F23S?T|x?1Sld9Z7Y{wfZxP-Ba-Jmh#?`P`BNH(oP2Z1SYcRF+wgyDj?_ zt@1GC6{BJv16P~j+;qT9X7h?BG$8_n9(vzOUP_o3tGCNS3>iYPz!~$xRbRc=XPQq=Y)4$m3l^SC-7HQ@>0yOY zDp*$BC)n1P?pO2E4%`=)tn}*SwDP`vLALGS|A}nR{F7`K2~;&h^rQ5&%WE1H#0^qu zKN4*d5k(YGg)~8kd!;1kzS4}8S-Dk385=PNUSl9;J+9()X;0{K$(}>HS^;_dWukwD zO9HoNm}ZR~O4*I?#H%$t?0K$yH!t(8j1y+4?U(YC`h-LEK-1=jKP%oQg!|kO|8|Vu z83GDd8c866q{NHFW6zW-6O_d5h+i0`c|5yi_OL^^cw~r2%u~5HWd75A8y<@)A%SZ;!LEVKmL7O(O;F)~{>uYW@HR6E(Ff=7jch~&**qLbq>fg=hu zX$4&xdL5#>sgKT5*y?V^g0eCg$NppI>x0 zx*%`Xe#W{pWbP%9J&;v!1Q~Zne!<%=vFNoyW9cGPk5(2N8VveY%U=6W68wv{O`=ss z6|CIJiyz992TFGuNR(1(yiXAkTJ?qXe-#yQaOUHxkLuev$f<8`Xm&tBb$=*(GuJ>Q zaM8b)7lV;=O*q>8mo87AbON+8MxzSrynOw>R8JM}OJzti|38O)|5QILP0CB}yHD!} z0Ygb%8&mD6gso5E!=4-UC(Nj^8OkWw@;T$8M&&a_vQ@4k*0r-ZXnG*8R|37I%BpOL zzII{O@TJk5i$T9=X{4vaYY*f;0F^IF`SDSHFpF0eMFobS0(!s$%?l<_gDK#{&DnoI zOU!V*hJ=B)KzgCxhWI`}k~Mb!L6RE_Cp`=s{3~XSXXTwP$11!@S0qkO1_@3UPr7(I zB+^>NtXy#9{eN)e4!;YIjK~Bav*86vZb@t%IT|p?l88>R^ROi5nqe~*-6$0!id+gX zxPlBll9UXts~)M^5eDR`_Ry#{r-s}foCL@OoU6pA1 zHf}B?(dC)~(^S#&PxtHkehc9(E{cEvF?{n__~yM9Wn`(;zy3w3BHLS&dfDu{5Z|jd#J)-xU6!a>e6o{67Il!?GaI1`@Dm^yPRu`0hy9b+Zq4krf z8%c&W{E#tQEoFNbCU~E4@93qZ$Nqp1W!$pab$N#w$3zFGdxGmc)~)+lak$Bz;zFp4 zq3LZhL(k{DB%KRPL7g(Jbz_`&%tBwf$m~#t*5()AvYThD_GiEl>eIJnSjNr!b!)t= zbUhMCV2J(un~HjY2kR(^ZG8gY@xdJO09ht*G|QqpH@i3^>q<%>%_4`e51*mLxZ3`J zuBx4Vl@GslK5a#GKoPNR6pU($_LM!c{ZaVfn5k~{D(vffdY)2spmSY-j%K%t zOSSpXH7IS@&?98A8{+yalUq(>!i_NRYu%rV61sC&;}BgbVxhv<3sQZfs5BC6#XWr$ zY%I4`8HD|R<4^M@5>qymre#W@)j(RKKjnEa^I7gq=H;*@Y?#LM5 zvwM7~)cpf|!Q}n_X7*$~wdlbhn1q&7rrq$5FkTLi@M5ZbV8Yeq>E=n+3orK+(;l>T zAWpeWhR!{KO4Ew|Itvw!eqtHs&!m1!JV+7Va~V~)kNn}U%6>1xU7V#YTYLh+jlB+( zBxLM9116J@`K&&lu!E5L1GjUT(cu=c&um7&Em5x+ijIX6g}?Gp|BON~V~fz+8#;9k zz5v#;VL!hIU@brR&FBqa0j9pQ^09!tG>@2-EXKmh9EdwiR+yPJ6H6N$^jxCcZUddTtM3IY8`cUs_+xz zFM)3*V`00#+)>RbP5iylB6?U5kFzvM*tRhMK3x87(agX7^8deVRg`OKsg`(6z|Q2PajCefLkECtn54(2R`_B_=gvUEE&BiDGl z#>oy2ybX&|#wx}Ig6p0$9N$rskk-tRMddV=%l|eN#ZOz^nLC<( z!I&vCGl2_DJG%)X#jBUldOLJRQcUbUetcqH{V3V8@xEenG+pT*kfpu6szgRb{A(iO z!)cEK%Vdz2c}meHgwpR0`XoZvcU&TV^svGCfM~awYBlM@D&L&|aQHHU>_O%w123Zg zi@mo1tLp3aMgc*kTM$HAKw!gW2i+agA>G}ZE)kGUQ4o+8lEq+ruQd_C%M2qntJ~Yx53py^XT(#GPmw`~B|>$D0NF8|M*$a z4T0+Qw4=}ihGTc(Q>4tnDrWL`52LSJJd7}UhXj05WUURG zo#@7RVE$@KU)EX+C-ECOp=ItUeT%M!!&{X_Tt(}TYbU4+Ph_;(RcrjD4`ZpkAMk0Y z-ffQWljO_oN?J&cI7K4&R$>t+;AOlYU0+Jzt1Rx|`7+<9P@jJ_!(o@ON!|EMuP4TK z&IwAX{a0%PwnO%O(cbqM-vD%wNTvEn$6|pbjrk6QU|Vp z$@$;*H2anfUjTaT$DTlh1YGcPyRmhEMMbr5wSc0NwdEeZ=}jv9h@k|aaVYq+;5^vn z6zRdUBkRmSskgidY5`Bwd76Ms#ijx@?O^sS-ikEYa}tYgt|cydMpSrLDC?S|zsE|11q*hJ3pKeoindhm=Angx*J367!$FFS6W~Sge8Vo08zIpqkfOiNs)k9%@azo{I zn#W0$yc_}Odrt|!AjW~O+NU4Kh>qn-a;a4V`zc2tb=FVmsArpVgwglvX=PBhlTFr~ zak}IFhOS~hj-DoMs_OTT&fNm~kzW~OSwo2&T(JUNJE4jOd%D5>AbnH2YVOwJvx zmhs1xbmGOXb^P6<(cv#ExPsl)Kcf9T(IUd>f9#Tcc*Uzdqq2SF$^O9Ir!NYm9dcQ3 z&NX51kqcCRyY8YL61Gq!Psh?6N_Q(STIUwwk9N-kJ`DfCzOS9*tSbgmh7pEJL}*ur zF;Z*t?tL78{_a-ZyHDc8Xn}u|8U0_ep#S!{stuo4V5DT2U+x#t82ZOj8Tj&4OE6yP z0@eioq&w+ax*$vEg=k)(iJO9}sgjev7+d_-Q<7mn5Z&=2CunmYDs0;+SJx*pfXifC zt;sf{6QAaar;+y9!zv1Ied1GQYG%$=7QCV~G@KL^{mQCzxv8wWM#p%!G>CRyL1qR< z`AC4UY3$RetVMf0L9+S0lXg2n>U;-~yxh9S>Seq8#zNZIuz+VS^W$xyBXOr)-z!Iw z=s@gRp6uJGu^;wHJz!BZo4$AJE^~F-6k7yUH}uDolbTL!72lu-V0Gr>V29z=0-!jn z*GJJY6FZN1s-Xt-bbM(O{DE8pTyymd$gt&p+tZ##cTAywLMsT#Xp-J0|i$;!?*&gzTz^?`}2(`uCwZWs}5PYTict&-D3I~j|eD)w-V>cc$aZ0fe$yb(xJJSPrb^kgk9A*q^~|Y z6hB4s#$A8096zzOLIPZ>@UB294Ag4WG{V|6H_CQ6=^IFC0yImfSv0Nroe&!n8HEP| zcWnFDM?^lcUrv00tzqM}J=IvL(zZSbQXV?p&Xq!^SM4Xnr~yS{_p_2t&k+kQI+w8OF@V!vFCK(4YTS>N){x%Hx8aS^p|Eh!FBQ z{n`##OuEMmWREGs1Sj;5v6n`cWSa1ac7On?9D1Io`SSc0AS60}>=1~t z73mJs&$Ik*-lN@9I1$!JJG)xpad8xYH7(%26_j)O##X+Y==DHw2<+q1llEryw~J3U zPFx0p7M(Qa;XvPhbFz#UW7aPl2WeSxB;pL9d+mK|_Sppq`Uhl#E*A5Go9qj|+q)zu zK}@n{u$mpx1#ya;VwNBOb-)eW_xPVps?z_2=A%3Ab8q$cNsp9H4uDH|?e%(qI}ra| z02_>ZK*Mx)UsfR7`j30g{W)ITd++}PdQb&wr8C4HK)Ql*pKNbYf4k=laXTQO#g8h# z=U@`R)lj=K07>87=&hmxPL=2Qy{1G;y5?Mexzt}Cu$!_Z3G8hihsy!I8LyjufHlYe z!v`|j;C82FfqrFm*J9w&@WhYn`t4$`2P0L}N2gzj^$GOwO4%*V7I&Qcb~}+2*Ud10 z?8>IJ1$CX9qJb(8hL+PoF4}J|iVZ8j{ zm^mM-uc6y>q3(WXW<}E!#gO1Uc8>2Pu=)m4u177U{kYmMc=lxNceORooYLYFE7YGI z(bmo#BUj=APw58kafm+e0mtgCf{(xFCdzb-Tl2ZNrSCi5BHvzepfBzX&>Mvz_=^Cyx?Us7 zAq{5>1K2X{Vqus72>bq1sN(rl%E2f4pHqHB3ai;=nweEOAYpMxw=zjYpM*5VEeGX5Idx?p`d!V~^r|CoiO z#)kB^mXT2%miSJ2?@Gtm7sI#xYvyXIpWN%Ug^n}mJyYtVQ};6|1Dj*|mqEPqUPZ)s zX_!y(uF&$TY=r4)MP z!aM+Md0$H?qP8 zQ?XN>9r^g!gzfC?ot?BffKQaEAm^{p^HywYPINwR3i&f}D@XCW^3k5V3dHKKm&gV4stlLznHI zsfnfGfBIC>5CQy>3dVj;n@!o&$=(HFZ0ZCkPu$&EQpMTO*%Wv$38)0hdCn1=B!mif zA*p}>n*=}__+A1Grh;;v^T;N_1-w0%h)seU_|>^Mz^RG|dt((-XKgk`F$p$RQ+H=J zX_vNuGSSlXF00sM&ABTP&Y=jvqFWs{(S0(vrb*5&}iKwJ0>q z90p?N=H}+2f0eGywzE@c}_QBx5+D^ppR zzO0?NjhVdKZ=?Z3xIu7E7$-1`a2Pv?3wkCFm=g@*WQPFQKNFGTGV+{Z@-KOQ)ti{9 zlQWy83CP98&XOJMZUyCXarl=qA#f@f4A2-A2RjFd9mWN~9|jP=48=3h|CS=m#NO4| z0|K*igIoMc5y}AwMFnAJ2Z3SS5P&2MdO0c2@cmnwa1*eNmAMPd%EZd_SDFAp4i10} z7nmJN1%q&20wZU}`CDpcZk~4RRvg^6X54naQe)=?aRLOPFc2q%6L32)FgNhQC1{?R z?QdzC*mznP!cDo1JRIS_(1dccpUoqf9UuhY32-hPmzu{j_wrkcu5b%uM}(n`nT5OS zuM{~UXYyl_aclEy|3blY6!#oVxO)Z^%f-5Hn6%+=i0&~GZz!5Na zD4gpON(J2H-^l0;1-pP9%*|mO*06ucct#HJEWk{Hxd7YbfYZp-y6SfOVcrQ+b?1i?7rP{6T6AeWlT^TqPFYUM_7dD|k&1PlY@1j8?9ljlqGZ;5hwc)&c&z(zI>9*AFvLI5Yu!OjH&16~kH1>xqt zj9UNJ?{L_gKy0jG7LJ_O&cBj_pBW(_BR7Zxm{1NX2p8aIFEy8c>v%X}+#XOvCu>)G z6V87T1>7qH2AClggaaVW2|kk&4!zu5{;l`%J{VIT+$ z4(J#H<-Fuv{;m6Q^MF}<0AZgK)Z;%81%eX@lncbg2?P8c1OhDCf4c~uhit!vjs@7! z%Ei@;-OPiX`&Su(#RHhjvo!=*J)i(ZFvsQQ@;pHNEm041E>9z8Cl416L(hK^1)Ko~ z7hs1}9Pl%{VPoQMZ1yWj_?a03lmY+4&BYF;;^5@E z++3cAzP}~P1*|0O2z!`~>3?tr98hj5FdPg5Vk>qoC?GKS5|eozWB-<(E!+X&Y2@Kx zX7$rLa;8?unHd5U0UP1s2JDgp3c2K5{%zRfY3yR*=4oorZRY0ot75@`9Rhxx8^py9 zg994ofM3ckfywxrwZzuO2@JLI^fb4!{)Hl#`^*XflAIuRFoY8VxIVxUT?#*c>we&_ zMxNHrF6_X1X!I*lF7|VZ+z>DTSn%1Filjm~}RRU?3=fKmjRXfPr2{&c6+P zU=~i?b_geD3nx?dUrBPDSs@h|3ebeIv%?|4TlULM=K0q0x7y`0H3xGUTbjB#x;y?# z6$oU&=VEdJP6&7lxrCJGd)VL7vv%ZgcQS-4ho5D;9RO(r`K z&t68e=NsnV(zLfWcQc2Z!%QqqevN%N0W-WXO9-&d=K}V1myz+O?cBeQwX9sZZP_ij zoT1jhKJ%Y@$+PXxnGFIma)Y>mPzy>0?0zm~ljm80--_t!;S4shFgNFbyZ_|VfhY&q z@Nq%`#GFT#K!gWSzoc4!@;wrkHqNF%IAsIutHn%>?Ey8)ncA5S9S)& zJ$XgfHk!N||KvfFNE+s&DXd_7A*D(0%B`A0zmtb>bVWL}q!ZtC(G?kniB(!0jr?#- zW}M~nd0m`fNKbuiX26jC#N(5A;9g`KOP_sHb)wo86nqzhoh_P94w?-QrmEA@8c(Tj zJvdoYA!mDvGh@tiv@`t~ILBivC}#BZ0LS-8Y65(`eh`IwcBU$h9H`=SW_|w^1J5UM za2*+)v_Q;@r`dx!rMz{|d0>=E-Vzr>LF4jIlZG!EIlzL)Om!zMU(Oiijxccd z5FJ5db>*e4yeSf-s2mFl@{@aL`J%-bQnO#K?2!~D85_oKFu z&7ukOn+qMCI+#+jjG&8vi*yEC(EoZk)++`=PH|$!XMGxJ5mnevsL(+bLS^QmcZ(Lg zb>4r()=uZU@0X(b1y^?__gZT)TYr$w_AN1-qM3yI$~=y8$wcV;EPg!<^o)^@i??A2qSJU~@`A0S&o&0uJe3+_h~-WhFQ{$`up~QT&6_x5=w034$e4% zYRCNqH$n^PPVLMwU)ml|@BRga@&|&u=Dp^3;ub!C@OdBs3;#-o>FviW8Oa3E&@;Q~ z(I}vz++{Gm?Ko$YM!48mqsXf4){m9Sz3CV^OPr;F6Wv^&WH4tf|A{KyvbsiFA33!acjTEl3sqa~~Db;4hjlrB$!rqAsaH?V` zIe&>u3MWDlnsY;^LMu3Dbgleto^-0q50j7bwVjx3_GqRf(z7O$g~-Nq?n@_WZh1Z0 z(w~T*`v?|}O@bGiZk9$;s6{TuAigIZ&L8k;J}iImF^P)ely-J8RvPo2nDu^NhTM~3 zd|hM_Wy|4jn-cBx%5ujP{vdnFoBo8<8&?ZhA*$K3$j`^|0zT1W6DHj!eOZ=?E$yJW zkPEl3#hm`QaXoVUc&Igz+9kep#|gJt?dq~#`?G^3Z<#z~*0BCp&yVW&#n8|-aU!e2 zTE9G3yf=i{obGAsw|j*m8@__wc(fn+?9P~e^GNn0lIoTR$7VM13>xP?fgJRwt?&zELU@ARfL)gr&fU&*VKL&^YxT(Y53vE2t=&hfm`3A zcNybQddlZ2X9=YoyHGT3XP*drlXq>?J#4R})?Fj0A`SY@tqGHazkLqGc&0?0{Y|%0 zZcfmJs;(mB{k!JSVZBDt>ezdJ!5{h@W1En*TtGn#Ryj!vvl9sNS&#v4)|zqx0)=x3sO4#{?5zuV}-b~!fu~q!>T+( zYxnT2&7iu)3fRNCy#~XHZ_Tu~pV&WSk$Hjgtyn>G$oXjF*{h~Pg{)dDB)9tukB7@< z4{|rf&_RCPatCE*u?o_z_#LtOnAj|gr#<*l-XftMCw$}_ogmXk( zWlaXDX}2WRx)eq7iji3qu8<*>xA7-;Un$qR6B+S6#A?ouU8D2Sebto-iKH&Sk#-$< zfg!}mfLP;!ILv{YJz%VJh7!3Z=5B|Vi_x*Ypv%yqN~T>PXhZ~d@SN9+FJfSA~oHk_M!j9(WwM!;juk}>^{taYKcDDht7 zqSBPDA^A0by&@?#?TmU@^+z3~TbSrw3B^mmk3` z_|+>cRUEUAgq|N}-a}BU%c`TA309kk$FSDsrM~?V){c7&og>l0;gV{|Nx#4SxlWEr zbNS6sZtAeJ*z;L2SMY(@)plQ5j&><=d=iw35g^!2Wk?CpBW8gT3DkUrQ0VP>=w4zZv1z8 zUK&a3*dtlg#V`#wiBDx9YwkQP?#9oTkk5`QKlCh_&(iZT-igwD#F~VLhO@fwka!cL z@+OmizMn`)(6%!)pO>Wi!IQfl*OsbHJ`sQ6TcvYFu+`-%vP2`fGF-dKlcA2Q85hp~ z1X)U<9sfNs{wdm)0Tb5db%e`nv4*#~LB;-+jpl?9CRyvTdX=gES?luXTEPsmn8?;0 z31z3)kqKotzb~HGjuwj;NCH0@goZT6zFQ&-nzgW1YJ#oaw;T1gFl@mL)YW^R0n-|i z$!qO+O7;$?m^GsB%{%d^_S?HfpC2X-QPGyTRm^|CN-uyA<|-4umqE+sn7}h%$EuZq zY;uFd3SZXd01JAZ?OGTu*8R3alHlq5k1~DOVIs=uQStGy4g9ratGDo}>Dm-gMJ-5q z-voX3vL)SjMdfpXIv}~N*knGV_fnfq!p6F@GstVD8$dSH5D=nrNwD)d&m>l)D+#gQ!ymWYw z^~6<%A!Bi$cjw+Wp_>qt+krw?o~sC1C&DGxk|+&HoIWPAeiq#j;)Qg#JDCS_h=(a~ ze)2MIi+JJ|RuNx|BA;lBM{1u5+Uvdl_V9Zj3cZF;)uTFn@l8u^q#lZQ8oK;G3^dVp zi4DEv_=aL@W8DVy1kI{k3n%_pU6+0QHhR7dYCmNTkD{Si!(1vN0_D64I=1rL zdWQWz0+Xp~T3W6!9>3u&IQUw3!AdPP_u%!a9HfGOd8j%vY6*(5xu!7;;q$%is zPmpn;UCr%XW)|;l$jUChYe}_k3eAlz=XQ}YRLSKR+0{OLR$#55Tgfw8%MpsOO>msW zJZ{5)$kp$*b&!@fR3aXlA`3T;9^HH7zp96?qU$WmyBtL8wrk;|2a&B2=>E21n%L|2 za<^V;Qdj=Ps+*#78&2dVQ}{D+gMM6$SpP64HQuj#0uMw!jw&~I#7UW;o9>LIQfN1| zu{~rb+nUVZddyn?){O_7ob$tMO$*pvHg?RlG>%C`IHE24ns#DCWkOcMlfbKVO0Q2K z-sHr3I0dNW;oUmP3~>~)DAzi9?W{=ca7G>au5j2kb#o*XHzB|QwpU*3+UO4>daoLd z#(g_+U=Cy{(rT4<_j%RYbwdcgnm4k+C8RH?9>c8s+Upe^lsRFB;!9gl26~U7wRH|g z4!2}2nqvD>M=1?{z~%(^owAyxr9@vvD=Y38D6jf9B6Qj&!GT_tID^nCn8M zfvU~Aw*^U~vJv@nz~ifQ&`OEcC_a4C`+Pj6cZ;P#e`)H?Oq)fPcxmUb!6vB5qvINi z-rfngXK3NkJ2O7j_bpGFE81RzA1cq;@=y;*cfal9yh>6F_?>sx;!dv$TCP|JHZ+yv zH9rNO)@~=YN4@biHj_tK>gjL?dp6A;J21?x^oG4bdCf;jWZur(eU%biwxUoUTFSj+LSgn(g?#t7-WoW1yyYZjc%`s zAKKY5Xiz59U7P)8Tjg)ZYeQ;W>ApcOG~`YYlte7A$)ak*<$?9wB;(F1A>rFSoqiYW zmxtn$!~xCK?b}79e4#{i+NML&874JdPJ1X~OG7LMi*$9d^=MxT+={-{^bcq4d?((0 zO=%-K2bJ@SwdL=~KTwl(aDptw)_SLw(HB4HHfZFpgg;PW8NBhrxiX?~bI^#(Ay@*| z9j7Y!f_3ngz1vODyRqC;+t&7MS6s1XwK)~$eM;_WnJdGbX}2E7dk1LU@KrS6DO18} z63ETcIXXTID!W@=6*rS5hWV4x9iJsSf=g_S-w0)#v~jH_|M%DK%(KFS;N2D zBOn)j2axkZJ+Ns9PEe+TUi2M6FZvFk7kvjnuHgK;i|z&JSrPy^^K3-ma4`x{Bs%}= zViefLD6orBU>BnRHJ!6lU>Bpn&PVyFi2*390bl<=-NXQh1LPFXIr-n#(7bu0lH0CZ7j`9*$j;hO-yYqjae=1?d%b(XL+OFa}MVQ z5~`d)4GRtj@??MIA`W(o{cYhYuGs0oGnZ*$LqhCykMCV#0}Km zfP~(qSUxwrOY8dI%s;}##?*<81I+d}>O8Bbumf3RIQ*==gByMcb)I{J{|;~em~(zf3|TG zQ*(r=DXRm*9zdn76PvA}6Ohqnbpk3McE+Xv`?d})KYj2!IXHkq1vlq;b)6lkLPLO> z-dP76(0X$jtp2<<|E;?J4Ost;d0oij#QK+vmUd?Lzk@P_lM@6514Rg+at2HU(7D46 z=LS}44vtGr#80gPzlZWan%RDx2vbKFOIJgi%V7p61_LE804`u4VmNOxfU?7(K=Jlc zoc>hg`+H9R6SDt;3hS9V5w_>f>o=(207^MfF3z(;8BmYn;0F3k;6SS#P^r6=2fOqd zcBa(dvdZQJ_*zRt8%xg%fBPGrfx0k=ogKn`Ufp8{D&t%rpn>CT35Hw-%IAUKrA_ib zG5sr_e_7x;&xSUv4yHhds>9iW!HTdqvUj#L{+(+9p9MU?e-17v2n^)}Pz{7WmoUcj znDu{H0-&Fi)yV^JF1CNi@tLB5Dm@g+0SDe)DsVWDuK&jvws5gEwELIqvjjSf5r*d- zwZ8)mpy#u&0s;qmL}2VNs!K%`=lg;GF~eL4TqZBwk zus>nv>k>RYcr`cedo*pY;Cn>Kf4Xv-I&*lV(`mhi?{u0?!Pn3cHvXi8{v0O<0W>QTN+0(!LGKn^zLWMZ zPI?c#4yH*SAaU~?t?gGg2?SOH4D9q-E%Y>Xh@RkOZVeFj%sU9KrDhBI;6LAK-5?n!zU>?JeH%0Hl|E{!O3}g!i6CVom4?r9;b66XOEbw^-n#?l zr#l1~!S)Z1S2j^)o%yqS58X4tOwBmM`D8W9mn}2d%TE($kdu36&s zNGI+^%z&ZB3Z{!_z)s)};uKBW?_HT<2Pca9q`57cs-yKV6&Z6vEPn|mLvFbg9DcP* zP$xs^VRDq7i3{+TqSj_T^t0NcC%~I7kTB$Jh*yvZcTjWM?&N;ggvRMn5R`6W=GGs{k?_3pnoxR zD6Z)Mv+k=JEB~>o;T`eLnb@`7#>BWs4<257QDqVBXA^OQ>TnW)PR#D&l3jc|H7t@^ zz5OcjHwU>}lbQoNCq^|?L5qDk!MZ6S`<>`bI_wM9$(#$wrwl(d4nOZJFK$h7_Y_fx zpfsI6n(*9bK?w?86d9`~!&p{tA=S!xLtxQ8`3Nu1`h_J(cj(wz__{VvON6()&5+O5 zoUlaW={j}tE=w|7n1lTNzVMgk?>Uw~49>kv?ECIhB0Putj>-LC1lOO;s^K03zu5Qi zVTG+d0cG>*pl$TLJaygtH1NJchtgyR^0#7f%&qVNa4jMq}Q?Qq@ov!+JWNJWSeQ z`Za)_cLU>jI%SI^ov;E-u&k;}^GgAiS8ze0*`Q8>{pTAnM*aEyvEn{`#;q>Pp5xM) zv?ighTRhyFQD|vKW^u47Qi|wL&PKCpk%h<`3NBclMcj!DdG?jZD?EHc$Dwy%KRmA` ztN7hSDq^|sV zBO!twGZlOaRB?@5Vv$Yf9icv|Pz%mSEQePlth8Ke`mtCZCLIlaOlo~ws@6fEL+%i` zlzVlcQ7y33I6$@@QA6|W#Cg<_E2vM`_9HEmS6#qMN!Z&@E^z4G(`{T-_4N{6=1(LB zSmZAgoF6{oKDLO~yT`TQ-d+20^l_`I#vP;Gmn03U>2+PJTY0>N?TX8_-j1az9Z|~m zLMDcs$FVc67PrAl42XuI*J#Cf@nqwt%|zbRLsza|DG9HweIM|;r@~NUZzjGMgQnV* zG_m$mUc4&j=*i}%z}M0uGXuq3bE{9Q%IjVre}g-_sR|NC)Xa7-O?V2gC%LwAU0=k0 z+t?yu_yG+)7}S_Y;+nbt_)Y%HkNF-=G&i1!t`iGaSZM?wFGo>zPPe!?WGm?rg6g_k zb)tIRv6$d3+G@n~WP@u(tx{ZY+vN`)L%B3nE$<68lwLK172Q~*LIf=(g5@3xsb?&e zZaQm;W|ACo-xsJE=A&ku&cBuzA|`nUbyU!gQ&AViW;bV@6odMjNK-t_SNv35sS(LE z>OS~UZ-&(k;;_tj9v|(t?z;13Q|aBHqS9XVdnx*cU#haEg~1Jtw-M{stdjy037uC) zr{8#AYUx{WIK8=Mf2`kR+fF8XmB*DjBp>?0>sR%{%$o}bgNAL>AnWhS9aT{fFA7oh zx@+8QGp-XkHry6Y8ll2I4HMj<(E83B()Xw@+1&aT`geg$XdC0biRyLH>ZvL@8S9Xk zfds@omU4a?=|{n}N$MIR2h<_Y6$n&u_%{$k>(}pIS;Xidn;WJsZC;L3FU1hu?Q{CnBu?ciBjs8aSevqdTi zNyD|Qp(aM-Ey8cE)(2Z?>Sl6rJ{ih)jUp5G9pGcP*t4H{J5?%)BC!VK8`@N9 zNKy+W+t>Lq6MD(;;R*T6uXf$3Y)>?O8Hn^gqWgnE)B9z|$E{S7JD&nWau|4#TV2>T zcdu?xMKk5T6GcB#EMTYPGJ!#=E_(x@|Lt z-DACpT(TyGB&F@=->``YibjGqwtr-F9y}dtEWR5`I!v8I!GuT*8B5d^hawnK?a_H# zU01SZT-8Cm-;{_W)eIUOY_h}f#%%TPIDv+uMo3l5B0z;>kXm9v-cR5efx4$g;zi*N zoqWnBkR*bZ+?|{klu4@BB2ZOLs)mAQ-*75~C?*#9hzvpo0_^+Th8-m$X_^i$J8dvZ%0__hK`DvKy-r9t@Z*$?BRA@ zK%Q+HfS#uK?N10|tk|lKn94TlYO461WU&ViqKdB;>se8>zR5=QTUicO9&p!WVTv5# zeejteWh7`+lym7#OuB)OljytL{O#42!F#4k!a7<`QL-cw%UO8RmPUa#mEv-&(#niC zLI#!>vk08Up0F8)uZ*F*wXSn>5#jSg3MS}^?Hr3-W0k(ADPx+uFk*AV;lc2T`H)Bk zaV9ICKuWY86oq#`tF=;cBDYmnB$!<^j*E~YgTfK=t zZ-QJ=Qn;jP(+zuZ3fN0mnb^i5?2)ylEwuO~-5EpHK$JH6!MUTCWr{}__+=BXaMIRf z)!oM`74?~VYp-2xo^L&sMjbO6nkx)vlDZcCT39$UDfyO$jXKFN_aTc|Ad%@kYMh{a z2X+6-u$r2$JgQ^Wq^5CY?`O#gdIzR^cMf}OMvKXi-uV*T{gOhd+45cw@GrjW?{)iB z^Tm2Zsz#0VuM`GMz9jW{iXG-UY)lgFmh$G^p04#riMK9{3Clo3hIDhfq+( zYa0u1<@Xm}o0<7?_~Avj*j$==R)Pl&kVl&hqt+)`#G!U2aXQ_yEMj}2484MQMN4N+ zgfkqk>)*y_WfC`#UAjdt*V~JYmv`emvIU)rTVEcwA}p`E!Z4{r{-*y8Kj@%V2Gx(j z&$h|!_g~Dvr!|xupdKm9KGgf(q*^bVO{3Ynm(QV4BJp^};91D}izV!Y;yz;ypTYFw zmBj83`trOfMl-=aDjDHS&8k@**YQPAGhz3J!u=|-2eg9&DsE@g>hTi@j5&K%gz9BG z!tV>SzP&F6~~L+QIKb)i$b00!C$3)zolmOSyRjkZ*@( zf4MUD!U)X^OVg))N-0|dVj(0GtjyZGKY_hPf*WdMg2nR&3_DD^s z24j7~j23sg^|nu;%OSoYEVBb08BSp~#57MQ>Qd%EFw}B}Os@pRl+}2VAS7O!xLMaL zp>B`xitM>QCtflbRZC)X)vHhWTr{VXU7}c1@$~iQz_zHQ@*$)J7rjqMu4+D`mPRBi z&wA@+xoL8W)!yMvIdqkNCh(vp-Q_Zi+A%cJD^!l|-mlgd~f(!2`CH!08~Z}b>`Cm)$) zhXR&I55I7Vg%Vz&48S6`&XI}@jbdA5`(UZc9_=h;h01uRYPmL)?uRNq+s5K+Pos$z zH|~-{!ot=?t&ez16ME_uG0FSN8Fbz0$05S^tLF8QUi$Y~O!ulKIS!d(S^|;4$&X6U}>N2RB#=$p{4nnoXk> zo*Fi14m3W^yKkD>0h1BTpd_7F3vtWv$Vwc?#rcsLSVo%@si@I*XhB=yVR-l=vUk3I z91k)8yaE2XChkd+Q9I? zqu`l?LK_jY;I1dZ>-p89_BX8%^dwodUAjNY(Bs$|YY93hR^l@bk`xkOGu(J2f!q=NKB1(N}f^$nO#HcN3bG?mltJJW&6lFEB;=d@ZF5`8&?T z-REWC+f-Ca9b&3**EmxXug0z7%vbkH#D)m#PNgW3ZHJM))Myz{DX-_9wrJQ-#zb3* zz4_`%1-B5O-gqRl5>kmsIk}eibat|wl0z9G&}tAb?h~fZdNA3{f9w!7x`ja zesC0SVB}S=6opCnNT{Ue^UxtrQq6BrSa$xHGQBbQsFiKS zrOlOxqr^%o1-C<5;bx~kAJR<{Ws7c-TvA?^5^KcTgI#p}HvxqPkYa*-F5oIgbYJYj zX!G^22Bc#pHiq=q8xKiOT5D~@s2KZry}$}PcvCm_qL3Qi%CE?n zNBA+3q~6%)&hoIQL#5M4P&sXMOQ>5p2IAQjQI}lXNseU|3cU=vxU~@M2h0zaxP8MO zw)DpeZaX-#)x4%%qrQ$16kZ`!$Mp%}tNie4mCR=QfRRI?CNAhv>N2AbafJOVo5YOc zt6Ofhez*DAFrGFY;++b=3*x(qnuZv92CZ{&;E~KmBR8074@jR?R=`7VOD~W#^&QDF z!FhU{;6(sc@?^_=zlcRi&b+@arB3+GO!d-T$n!{6lvE^UBy<&f4WgG#`7z9eLTcnz z-jb{$;3tmrQ&2BA=Yj0gR`0as!Bv&&68eL7^-cn`@9FZl)?s_oPt&tjuqh6|?Pv7I zlTm&ZaZ1>2dYu5j=V9Lsxz`Jy;ZtFy;w_#*b)3)}=zh!4{)9!b9Ch3s)`j^&_)hlQ zKJZC!p&n6ZN#CC78*pz4?W@ffjtjgs@5{Aha)%2Ecr|G6ze}y{N~NMI=#;OjsiN3Y zAbB>jhYT0a{xP^sedl`1uBusKiLfYkm*4&6825EsZ}BjJ)n(Uh(jGb&fu;rihuEr!NTxL-dGyc<{%<6_W%Yhq;g14})#)?~o@qw%ze%{;~DM8)r|h#oHtK z`Pa!z;}RnDr`ob^_j(Bb5m>?Bh!Z>vKn? zIB(iCytCDOPld8al&`8DH&2`z_@0(AsMa$Vc*m%&vkuthgZxPc&|VlM4IF$%igW)^ zMWg1ahn-;X$L#VFj zYXIrU*vz-kYt-n&sj-affpSXjI7a!8Y?@B>@dAx=YH! z-t7F}vMgJ18@76}Gjo?(T0+mbVq1lga+|qkj%1s#{88!T^N;&qk&aT*^mPnDo&>)%n zYvzw_3_5oX%>pzY#Jm#_%Cbj)nM}_t62fsGrx)WPi-^U6|9s0$I8}_2|7)~dAVeWJ1EzHI}%8;PVg=u898kAP$_p{&sh#G9~u(h zZ>{LZM+BnFW5pq?ZnT2y`?J@)LAItmLvGetCg6%%)iQU{R)W6gm7BrWtBycQyP_t3 zCecQLWQ79ncP3W4Oq*y{bWd`Gdu~5y#huX@-k%|Hk>DEaqE7J_%IAinj}1nc{J4YX zvvV*I%DUStM_XE|MQGBJQx(?G*ZCp0-sUN%BNpE~6E{EDskK}I=K4H&KWPHPtVUqe z&4_S(p|FAd-WY@F9JAvO^j8pV*{ep2vOxYF?~#lV8%d_sNX(pegWwPH_S+H3MyOA` z94DUZsce#e{V|z)_v`oD8CCj(bf|Yr7OyzFgz#m^A#dQQ6ThEoE2b8$@R@z%+m^?R z!s}M3DDJroTumiB-@+;8_nw1+jv&7~l7*!bmZLV9&S7?IV!93{gjBL}C?!9Kha0*f zB^4YqVBoy`DVqp?C+1kule$J3Jy*z`$Tm5?z;)0s2BSVWGm?p5eZ)a4tPf1e8PE9`Y;~u0B zH*L0nXnj=;R4SrHdJ_5;TNO=Ny2YHJqpn~u>1l$PvC!?YOvK%OU2{>RY_+2ti6uFT zVR44MW!<_TTPO1Uv^t(kQ++*}2}TymrO!Laqbr~%-DFBj!&lXhs6|`c^V!3+bmsAC z%0{~O=XQBwyuQy6X!9ZQwxNrO$2jv^Tt)5SLlSj=j|gyg_+TJUswM~8WE0#>Q0W1E zk0830N1?a<+^V_%^?qBWWT1ZM!gts~?;&@he_hE^l$tA8wFPM)e^fQNIpS!5t#?Rh z#Ea0*K*NQ^ON?jOKVEC6@7nFm$kgvnV>2{KE6B#~!R3w=SgHJoc~Esq#Jd=#Pf(Rj9MK;bz>6!bY3Imm1~ih@$g^#fBqI?p7ydp&tq zlcdv*`nf^z;cE>3yfrCq=jEiTFPPV;s{Ge_C!HJZU^#^+D9+Ys%GySvAdEWO^ygK1 z63B5bc&RN3)ZGQ+sumU^Nje$pJKLfteNGK~*B@WauP)JT%`3E1J8lds$4BUf*tiH* zr}@ObQP5F3<(%31oH2+Wwkv>F`Wat*aU7=ig_uVADJQS$APupR&DUb;OuBZme)`UO z5{tLU&-Wr@>IV?~1#h^W{A&BxD!w{RcZqfw0uGa1TnBJcFcp}#} z#BLN-@Znw8{_lJ$U+Tu(dXL=niPCN$L>soc^GA44UygQFJe_^~b=Tj*#*6$WZ&9mW zx}EvBMoo0-6;cB2=|&T=xv!QOHV5B$UDev9^4DrapfbFVWE5XSsy#~SAKU4DoDhJq zHZ*6A>zhY6b_EmxF43>mL=|ygURrA0yuHrPAFmJD#w4Xmr%{{tL6`F;79pr>Drhu@ z`@;$m*#V6C@j;~g3&B0gei_KHH7EaRsI|pZ7}dl=Iku5N+5@4>EX2H&BnlX^vfm(%PXkvIT3oROD4*`b4i)ta4cfl=LX( zJ*Bu}B$MBx$NFG@6U4te&KJyOTYt@uUMb+6dbIYAV;7md=2W~5{anuw1Bwgrp0~@Q z;#IF=cZD$TPbv?UL9;T616bNJ9i>loGK$!wwW>X(21Z_Jn+f*FH(9j5T$F`hr;Nlj zB$%imwnBo2zax`e?$}OEZ~5$cSVMhv=yuw07Oa1rjj?jhrtJt#c{hcp z@2S0!FT8#S{)1Qj39WK=GCx8IREF?hRyL&CxeA^$5J>EK25}CA>8vO_i}5H@AjEzwuk3 zK5qDm98lJuvhEjb5LBL#FS|OxJ#+`;KB8D)LT?Wd*uy;Lak2Mgu+iu z51!1QAJUty4$lf1fRXXNdGOG!;SS?_!{E~q*$pLUHJ3m>lo_p0`dx7ybaPFj-1oN; z>=1!_#Ru899+w&=;)G?=XwpKlpJayw;q3%ku0kI9M!Ik#b~qpTth(;}U(CIAP#)`_ z?Tbrrcb5c$ySuvvhd^+50t9z=cY?cXaCdiiclY}y*>lgHGjsRkS99*v$v>grR5h!= z{q)msr9Nvd1hrfsT~t=86>T`6e5!&fW?BgQB1PS|H0(~SFZnK$7BHoo+QMZz70!Gd zK${wwLTWgglux>_qaE5|G4 zqIOoHHc%#-pbjq!EedEFFcdLr?Bee8GzzH);YF=i1J*Gr#6$sePrG@J4X?vcwiz)w$zh+nUvV&lv;^vpNhZEP-)F2lw*Fh6n%*_rBqCqja z13wndbFZ8vp?&be`Wf?_Ai_C45gyz`FJd8yAB((u?IJr-fh96`HetakoMobMJ37NE z*ZAlG^0lJki-tOp5DTB1&3>S}v2GJN^G`7MAJo?yC>iu>UuE)`(h~CMNR>2kP2To} z4^}qQaR|v8AOhhOiEY*p_wKrrDn>aZTY(oQw2)!)M{7q>3z|6%jUG3aJkchUOf`A> zK+Z=CdMIZOp+o7xteRpyib5R4lW6r>biku!S2zykn%kV_^r)PlF=cE4{CYcXd?ac#(?UJqH(aivC#_T&f4d5g z0v3v~Q%##=WhKv}!}O54?#X;45NEylDPn|}>HQ-Wqd+o*6cf)vIEG?9JBxW4Lu<}h zYTF@3RZRWYSDqIZ1eca@T2!8i()T%3*VrK@2s}sV(b#ki$X-feFau#YTv9IE9W)0T z$f%jMeX9?>ufUyiw>^{`C@)jf4^+3(7h{)c)92N&uK*t9?NxT{%}#{vVg2e`z$KP9 zHmXFKYw*WUkNzX2G8PkU5?&m~xL;q?JyXXm{A zpJRdjciAF?uWYmms#R+*yu!ONpVS?E6|yDOb{-mHblHE~Ye^8*7? z)nCm0nNnekn&K98S=N;wjBC|Byp4y)pNXrl$30SqKxfepQss%?-Oc*P{pTknSGNk% z8-%qsp4T^E;sFrE|LBNe{yVh#J1~^_w~2-Mw}}M+TmAH_u>3Z$0I1|&N54%h0O0i3 z(QhjZfYtkT^xF!<^7||-zt6(@>nwlsxv>5^-~UZM7l2Y`x?eJBMF4UExqUw`=l{Pz zPsabu|MF}0f6Ud{8W;hRFKu;g|ITy&+lN09QCfQw3j=BZBWh+~|4-26PeT4D0|-cA zVW*=9M4kSbz2Mgp`9G-E*vef0pJe`w-(m;EM*{8?fMf+kDbX;pvi;0h{3Aa5*Gm2) zwSU=R{%w-~-{buyn8w=J`XBhpzsdY18j#(?#LCM0r=ov8Cx0aRC;$A@SMv9@@YBBo z;8v*}{%NX=0P>TLl@Y*5G66!_7y$uF>?{CV3?T0CPgv()JHme{&_WlGlVimJSgV$H zUu;dR?d|yfH?99LK?Xp&92*_o&kQ60U;8t|kCBcUuw(&z_8*|kfKaIa#stlEoeUiS z)U~aF-G9N+0)m?WNo{lha+(ofcVhaPWW>%2@QyJu{*lT*GMoH0#$TfYq#XV$Gh|`` zWZAO(R0lA=F#@vln3$LWh$=wqpUm**4*#b&*~G#E5OVt$WY1@8plfb#{I^B<4>y_- zV9{Y=qyrc&82~X?On~4-fJxxzEvNevX8qUu=YK*ZBf!$e4wxbX06J&-$*BY4&H$DX zmOq;0-`}_YrOV}~TSpIIANuz@{69>Pf#GMSFB=^o)(VhV2uNcCaMEn_jDXut4+t#$ zlMJt4@9jUGBEY)vm%LxA@&C=1{s)DO0M{KW9TVWy@mnE)@uy*=XZw{=_lFAqB}>SE zx`}`JX|vJSwfzU341fm)aB~6fD!>nbod=Np%F4hF2=8P5GnK!-@%%N%|0(4B*O#il ze&;_R=WMKu{|-5KTM8#-58rWh7v@43$BsgF07i#Vn$68H%JY2iOiBkvUxG0|djpkp z{wks`!lo5K&WI4vUtp@F(wLv3k1Tv)`&A4<{_Pd!fY)>{;O+h?;q8e`iQVn-%1Nfwf*=iK)L1d7&=bE%k?Hm zaJv~pkTF;r5bZi)v?Ob2sezxS5Lo%C>2`n8ERq^wj5$Y1qxJT@4=pG^;@T?$U}#S* z_i%sM<6Q(LbDO+B+8BF#6d2<~qr3x<=LjC*0ndJH-PkCVT+a^~2yZ04O0Roe8E;3D zFr_z?osTJfv<+%HT(1HNseZmgQy7Km9{fqs)6dT#I66WwY?8r+W2@Qj9o97w*Gp>;B3;WV5T9(2(}NKA9CxOXb&T40cCZP_E^ zMvqWtj-b_6MiF^DZSe~mkf?4&G_LnQEz^8AwnrWT6E7%39k-h9KR9bS5JSZrL_JhZ zWgrzV0Y81+UPEG-FyvgyctA}uMjYc&-)h{8vDc9g$yzl^y!-A)c;U(M-NV)+#?*oh zTSQd5{zQwaN%76F|wc26U362J5YC^|^V zPBN{GF255-gb<2ww=J(!8c(tHqNzk$zB>DFqjR!V6!TL9waC+&C+%2OdwjDc^vp5W zTk3P+7rK<(J0&VMWr6TqhnV?;UO0C(RpJqM#rxp7EVRwwWDd|RD%+STc8LemFiS>d zscvhDl)y2)sTz?Y(5mK&xMNeVEV0^|y{e{kHPIy5*xjWd9+mF8_~^sw2?d5SRNlBj zLDMG;W>>S;I*+&Z?f;ke*912K1$>L#ag=s&^h1xiZHsToo&sWwNLk3D`G@S1I*VY>Fe{zl zUEE;@p!W$eE`(|vdd_o480Yp>CRt*^k@*(|eM)BsBl!xzV!qDj9vy~rE`ih7#AR*R zF)4UhR}4wg;e}yhtVHhFwUWDoL0EX8e#YI^WJt((S7WE&QZyrd*Gg&I1N|R3!UP9> zyN!ll$c=MQXWnRAKmyJvK0PsP8wJlUG@L_yubp1+Bx~XPLJ^oI@W7>HIE&$e&fZDG z(vl@8pWx9m#kW?(l4c-~%6Zr;cb!6X8(X5IsuTDi+${w{bJ#>@i#O6aEGVaNTFX23 zm@GZ*6&lZMMmlUR{jMe5v_Lt`yqlEHVN#`BjYH9@T1^sq+0{I-uIZt6hSdJlRBL&s zmKnA>?@jD$`g++J^G4&1C&|+nvGt_WbS3)2d z9aS7x^(gIgXA5mX*r#a^S`HI7|IdpL>321)70U32rTGO#WQv_J#u(wJLTa*m?M*px zQJ!YCA`EdUU%M3YS{E|a-W#6mu1lCw+fU|ltk#Umdn7Z)s&Pv2F%%1wDR?m&=`k77 z%SA{vl6A*-ibHImUSuky_uZ?HRu`2R+B$`VtJ@P*66TMDlP8&(_^CW6q*F`Ht{bhb zSB*$rAhqOK#^EPV75O@XB);4axEt0`T-U`W>Liv0*Ot^}bg$B~7>~R1$mfg3X=ixY z+}6^FB|qS!$j%ehxFhtZpORwiSxfS?(k-vk)MMCqV4T?4JLqJHMy!hvB;oQvPJRb-P8&_VRVrY=VR(wzON) zqE>5BPu2{XJ#%VB8Lw)>(hNiXXfl;iKhheT8C4 zh}|u(mg!T}j>yq5~k8o*5)nBVxM9fX+vS#ca4KK6c!=4%8C&&Cp1ej_p{rqU{ne*-5krYy5vt+ zBaYVe{!|VlLaYeYYZAA-rkhJ+ADfl(-wEefUeJ`Ty8=Z@<8_qyFbhfdl=m(rB9gw9 znTrjtv_n)tW`ITR((H`$q5*?i^U^Ym;#IlM^qGb9EYnV>xpHm7?z0hkWx(`lM-9K4 zf~;L*IV@s@ext$0^ecAhO!cz%9jH8*bHMq4_>7ALgE2^!Uj_Ue^wF;reJg)0VU4eN zeRPYKU;+KQom|9xAMVEcR+gNL;PuDt51?9qbz+HZcpV4Qoy+s`60@W0DV{ z6_X8>Chpw>{$D`I_csr){pOucH)a=fYSfC-Hx;Zqm$4;i6gGn$nu&-`-@w%~iyoWM zecz33zuh!TR0kJ3Kgxk)cuy?#HaS?A%L%2#4$KaA>x4~oaFUC{E1`7WQ~_;A-~_U%Zy2>5CXxbSeR+_Rbx8 z{$lufx7I+#!6gV;-7C@4T+gE#esVkDJ=M4ZvR@+BfaWD@`nU>ykNh`R;ptaW-&{i< ztkZy@Ch7vUlAGjuy8(k^nCD0_r24ndGMNn+UzO+_7}yZmm;)OhXnablCC%Qs;K^ve z4@6y{esV91-?_%QY5$G^;T`$4eB29Kex9$7L7%I2Nb{PR>(wFqUdaJi2(fKWzcQl+ zna*#Zi=ZWrY=OQPMz%Xgiakf+DT{OAh*}CaMA^45Jg}VM&R{R^Y_So(!;OJ*#)47YG$RwxX<0Xi zBrTM{qI?c20)v)tzc1X8cCOZNm9qcgEHMnUdL-%wu9A06s1W&hUT<86DynQG6L1Z^ z(AGG~)N0BaMal1S@R7Pq+p~2z>s_v5p+tAw&*a{57+9-ro*BtWDK?qDpF1hjO<( zaZRjyb9UKQKl8cm#}l;4M;lEV!*8?`=6yUD7o9i0FD47zCA~*D@}sh!o5`!9>Z{{> zoTb=I9&Jbm*18lw$>}2Ql!YUTDpSA1hkg;~&C4@#^UEIACSncqZ=-|X!Tit!$7}$` z#xcY^yfr|!KZY1t<{`}r)H?F*E&RIj6CDoOo~*JPmj7@^!v3InOq-PDNCn+A2zsqs})BbWutQ=pttC^F>zL zc9c)=J;6*<>w));IuXc8AE!((Ce*IIF}+?Ve~6b%`dn);RR_Bd=Q?h~w@6y|b1SVo zececMdM*wb#7_gzMkEr?ObCBGWNZZbS8RNy2RH?nA zNE3*b(>oE`@n}MHiTcqc&wWQw=W-o;3$J6yU_N!%`Y&LUKcx8EWSg*~;YiRp2hVWI zj6yNJ*LU65#5Qg}U>ztTAQy&)qeUs#tO;d|71Q1LC0!wl!GQN(iHWR%1;J+RwrT3%=L#0_F)fFf14rT4yrtMaD+S!I2W5kMh7l zIVQDuuA#2A2F56;kuwtw?pYPI5hQ1RZzh7g&?hV&b2zL(IQoG#1VUm_QSZZKrbEL} z!?5W@cp3T3X?F++Ty(9lbhQC~dyDJps(WmLQX(Fff0)+~f(9y|dzFKfLP zbKCNTxGh)kE!H6za}!PWC*8K-oktQB%5n}SFYAiDEv0% z=}bPDBNiJfaO9z|a?~tuskc;s+ZJ9?RqbS2S8D?<`&3;g%$A=5TznGO0rhfz7NjHZ zPDMpACQ(EM&i}EQD*imU=tKq+{-&TMvSbo3i+sVIb9Old<1?O}t+G|1YUZcp42~=F zfe_zSuqsjbsU(B;eMP}k4vmQsP^yGwXb`%KkEgzEt!9!p4>>tDb+0Xu#88)Zsy(=N z#<4_~WqOZ@1#CyQ-I8TNn%K+xddb4TgaRM62n8s%{`o$ z3^5Y*Vp z?l$r$X*}{|Y_?L26_;A3R-Rvk=DU84-eY{dgfLa7`^Fr&dL-6rBOqS`^fczsI`jDN%>b`XMC;ijl{!?Vz5i<3FvFGrC~R*R$Emtpe5?X7#+hmHh| zyO_+C!L&^&2QlWG;FF;T{3+ewl$R8qG==W_IUoH?lp{;R=R1`BRizx-q-ST~hQRp) za_9QC#O_s1l+#KARCKE1Y@zRizDO{4aHd6)utga#3VgL*4YNu>A*Fr=H<^2tr{h01 zRdIF;RwYvP)@2YwZTl{XoZ!Mr4PM~pq;5VFBT;9&BNC@UWN4Hj?%Wb9aD)}hydxbK z)ooLt%-Z{ORwclamiU%=iWs2WpO-E;;+=WbliHPI>KgG_vosfO5Jg8diF0NC1mh}& zzxCZ*l?ZG33Nc}Cc2*SMEi{b<>0KDOIIRcfkZY}js%{)>8631wVvCoPuUR?E)5k}t z6=X2cU0T-pG1}y~S!`_?HRF^$KBkkkKB+T8=2wnM+k36og#KM)jtK>BS;!dj9b#=vl~t>Te7%3-y-X+MX-s0D}h zbSJx@Nfa{O<&NISdKyvfX=vy+?-WX` zikTJYjti|j<7P^FZaSOisg7d`05`sxX{@{X4sUSRPp)+6K4GP@1XW9qqqBjyT5Vd~ z50olsv72UWDX9+&*Tua5EEZb5ScV2Yj4$Gx6<^(|BC?)V4<{)NEB9hDCbw_k!FuWs z93@0;A1=2Nx^!PX@_{$15{ECSQ{KNg3S1XS%l~@~x)9znNzhZBD3CH@0d#bVTQ z_N-bkg(o;_NNEqcJ+lTevf@0HUe-Lb$Vj>Z%_NqlRHO(_HCx=citELY&u!O2P6Up; z{3z0YN%?3s$!*>upC@mVg6kwu5=cslm$lA z(3{)~QM^V-PU)nFJBo-hW=}Oqo6bsoiA>95i;v9~Np=XOp?mX+XmApUA_G<+K0+{u z?s-tU1a;&_T=Ti&pIuE2>=Y`g#qw=pdTnMQ=jC#MNB> z$TFY3xxt1Wm!&P`9$1ipXX=f7n`oEG$>M@o$w&2_02zyQeod*FB<#C~i_SSnUQ#KZ zdxlN-h~@cy0k)kG+m%YGZ>p>DB+6!HgW$#OZ6YM1B2%MyKP-V#UHTbQMjlqQ>|lU9PyL%sb(JJCR99YS^% z#+lovenw8D8r>c?SOVVkAuEcK@Yn+m+FMo?f~Fzc8HI^K)Ym1Tj!wpm zmI`B3NhS;31zWb=-S#r5D-9Z)%TVp*gos%Q&-dyQP-v(GsS~`xR9VmUGUZRPg|HP= z%$u7MTK)rri$L@$jC)P?Q|VmtW~N*4sD{*6iwTU1QKHo}u`b3XBIL~YMlHP5i>GG~-_CDC2h=aH~K8n0B6vzFFW zmR^|680v39(|a)uuFHDV$<`D@>C+41ks<@dxt$Wl6Cg~)&E@!vCUT~P z@x&ap1?X2+b0pIQP2h^)`J_0o3rD9H8_0z+9I6hr-Pu~0whGh=#?_NslN;kzS}%sO z*q=XzU9p_*qcu;;KJNKbKY;RN#1||fQkb>^Cms3J zPxgUYcN``(v{Qv79v-Ah?RtshIyAtrjvD$t{7CWPsgCzW{F1^oaK>+5(2JN9skc7@ zyaKZibj1Uu;9l@{f}oF$lMYoxqA@&7 z8c+E7=8(I+?XDn%@ywmhB+><)9!xDx9w+kJ432#hSH zf6;W@{azCH5L`(nzc+zof`FaXNFwYdDJaoC&)V3}&B5!(f~b8OL`E2(tByQu2v6Nr9ob=$#xlLtWX%&8}7$vCn!ZL9n4g zt-VCcI8Tt<+IAJ0h`QYKwYl$p>`{W+4}1|P%HHgn*Onk~4$ZxsM#CSIbbm(>8oMfI z9)TC7?UUS!)KTD0SHmJuIBys5xq=fp`XMd{%a1+SHm(p}9XcoV^i~)@^#(btw8d$x zH?C~H+#FGw#~PP8Uk+ua{%;d%uAdCiRBv6HthTwqvYh0=s3ZiLY>9R3{C12law0IE6H&6`|zn zbcs57hgf)qSR8kf>0Rp*nc)m`d%BOV$S zOy%sn%RzubAwxy-UaK93x!-s1rF=?@iRKz0SGOxk6Z?RXE{4R>lUpa`m{igL&w)lS zKG(V}RSSOQY2LjK5_*rZF&2*V!>O~x@AUJiFvZR;?HAt=Rz53?d5Nci^F6~K`ATqa z_tS%>SflFdjTRNSip*|=&p+8JUs#wbf;Ky$f>1cEaJTFM3BN#CV$??#IBtJCOTxJ_ zqI^d3fh$ZD{`x8CVEQJvw1hk`G8>z%Xcer4qj{{N$Go#=eAsZ9)N3F$`x2df27JoB zG1;Twdbpo_#Oop<6SV&01E?e>;6ICl;@v{OsqOsebgIdUi0Rp5 z6AYErF(S3a?p5Oely}exyVJeEp0mroTzh@;PWG|v5p&)iKjHQAJlP-*W1}U^P^1ZK z5waGb zP4y*OUThHsINK6~z@vfmnyk6)=KIMj9FzR+X$t?wi*@ELNJ>HzujZ*yT}SGJVx!O` zZ}@b)2i=E`BVkUJw6=8G0#x=wuS_$4w))rHBsuRfJ6MvH*{t}r02_%Z}@dep7qx7;+f6`}}b9G`mswAVaQcRk<2kJ&zEmXtMBui0L z!s@i}TfHJ;u-Hxa$yGVY;WBt(zq3!3c3cTLNF~(61-eGaIi9X`Y@!Ji)cb8Pi~SSB z-H&v@6eR#BgFfC17~X3jp=xF^>xk(PkKFq(_0JUjwJu_xZlgV75k$||1motI$RGQ2 zgq@)g+*GMab5Zahh|nm`vM{3$Gco12zT(+(;uY1lmy#?jYE(gJ(v5VWuQvKFf=Bu8 zR0-1fWK{?_9qM9cMp;C_QC2@waV|sAOMS=obrrTHb5e3F;LNN>=~s1!Gzf_B74$x* zoo_#WWD1CNJ%Nd*gkl~F^Wivx;_2>{Iuiv7szckt{J} zvqO79{s5=Kdhydxcu-5dZ*oaIRy?xk8jjk#*cBycZCk;?jT^A~zD9){x#%K&($AYB zA6I>t#)hDc^^+Mszd5SxgSWM;&Wj{(`A!$x|=Sht9PWPe;($|rb5W> zwKBd;?Jjf5FC-a?RTnQ;Esk!s3Q%|*%EW$&mN>@Dz=nUf%JD~Hgdfe`$y7%U0-pbXf&ye&J5Z~#jvi`Q{-wV;kc;}C}+8H>hxwo7^#4n+)dAGoKmlx0rhM(*1eI)=g3}U z@S_=<)P!!6Otq|d2+N%I(Dm7^se3g}45xqq%e`RF>*vak(;yLtUAM7OnAL?Ib+(A+ zvRXUX$ih$o&7k|G2aBy_U23M(-5|^a3}?D;Q_=7GT-{inklJ!{LWU(9@Uoj4qisTW$XAhOguaAxPt>FlTCu!pg>*PD{YO& z81*0pZI#ce+fG{yO2?l|Kl#mXoI4_L8y3Ku$cL+`V{$y4s(n?*y+GY3X5rLn0CxfP zoJDxx~;x?@F?-tkuy-t2#RrB8Nml8bQ@&n%NI`pYgF)P%9 zq$CyVKagt&#o`BGGUZd}9L*IFLc8+LBZtDzS1XD(qs`B~{Q`xJT#iP_bAIf+I|gxpJgU3y)tI6~sh&=#j+!gFi_1Fp3cs%cE9I)*Q~az`u| z=2eJ)J6wCF@%=a=P z**z|OxVSjrxSIOBGdR_#e>SCj#LN3>O&7IDX4Ok0r9^UQFTXH`JH;+IMj5{wDL-Gl z#H8JZW_!)IStV4KPtvz_ydBgACfP2tkV*jH@0YIkzFZ%SiM*&dV`_pT{ z`rCj2AcKD${Wc%~*y>+LzYPcgnEmGwpnvz*U%zb(Y`<*`Y`@O}AWQ-O_BV3^+pqKe z-(*hspD-ja{bz=RUxWTHaZqD>d+T5M+jd|67*(YQaFqaVmJ!fC&H{jG=>aA1Y=F3R zK()aiA<4gP{htdnvHu%_Ol$BHr2Z%Plb(@=1>k`IK>C1AV?h5lAVC`dfC6I682|t% z)1T1Dzt-d*>oe4~p|Se+8vm_(!`RA+THlJ=g!*RywIcwrrM7UUHnImC0-6OZ?f>a2 z07=w8QCooI|8*Hm41dA?e|Q=H-BkYHg&d6k6uZyF!VHL42Q=~$G65KRz~BJgGk~HK zb^u1t{F4^`6Kwg{L;uI){@+IZ4>P3yX)*ygP5^P}p7jjb#Ucun-V&GdA1Z2_Jha|0bmKsz-#AXD91 z*Vf|SKIE1Zprd18WoBjmhs*k_WCCyvjDY9v=g5C{Pyo6P0DgsEb<=-f3i!3N{?W+) z^3(i>p!yvC-$hKTSZG;J?ZHOD`KBvz`^uOn`ll4Ny1)cvgSzCx5V(e|;19|iTw+BCRgs)@Qyl|-35vYLhX@&X_2v~>ifWH`6R8J_uSa$4kC9PA*5 zk3Z=a>+$Bb&AYh%*j&%B~HZK`7;he+seyU`Bu7uSiZ-~+ie2pBM69kmNNv+HI3DR(b zh%WJb)Nf(8hPUw5rX;~xTU@JVPYhv7(affD%nJuQ+k_F+ZDu3GlBgqn!)<08$l6w* ztf=j;GMdiHvfUo2lP8!=k@4;TVCI3Zm(RsE&Wm>yjW1MkF`U=9 zf+t_aVKF1j;cwRc(RO9sy7&Zw`L#{_`8qLRZj<&qeo()I($y=t{MgR9;)y|k@IjuC zelIA-si!a^(%{4POrsI2hN@kL3|z5uo?2PR1S61(dFt4_oC#QV@Q;RpLZ*m8`*+HS zX2+6dtn8&z6xY}i*m#XhBeiZ7s}Tl!!(rf-D3#Vk;j2jPrYmiANUz=_M63%%qtIYVVzZ;#Ib8RVRnBDFD|I>jqq`4OC_k7o!nyF*Wyl~hQ!|FN2+Lcr(f2@ zsZR`iR_Q0eX4Y4`0+FJLqHnyu_x|9olrlf5l0M0WIuB|D{GlJ5ksfEN(iZOWin&zC z^H^L8H|OA39l90?`1FACLk<$SOhlD!;Zk51EO>=MXNgrJ`7locbeB&Ripy~zukKpH zu1oWaHt#hAi3^u4CYdM@MxrhYzQ{b8+J*?Hi}yn|#rq^&-&rG@{J9hhyXAvUNF>)( zeh?kzt6E&AdoGmw&=^MojIZhRiIV>4c;gyM@m;}isvo_emadB5mf zOQ&BC+e{~xie6<3;AHyZn_kGz?|NnPasfJ?v4Ld!g%S$0(XI76EZjX>|LT(ugJs#s zac4%ey_V*=CZb*k={=J}I+*^fS2s36bfup{ZDjP*%Y2}9XNEP^C@8wgCOYU84Oq-b zr7e~UqFjKtb^y2oGApnm8OZy!Wnz{@$0w7z{8L%zra6ncLK-@fiYErR+Rtc2-neM1 z!!h}f^m}QnB>ODiN1|uyCFa?r=NC;p$FT{N6=kt)w^2U-XHiCY78*< zzoA1fEWeh~3b(v@S&z7@)qKmX9T(NqGg|2FTPAvCWu;fC-YdbbvuXsf{&I!Og$fUw zJV)FYt0CxEm=R28w4`M_^p!}`fB6yzQ_kI7ZVmuh?pmprPxPd&^@W9vt)wy&C+!7#0y+yRPbko{X5A{Ih9^ z)AM7OoY1W5;C5bch2k0t?aH_GXw&^LlJ(%lR7i+EgS# zx{ARaxp7wam$X#hY)mm+Vh7{(N-g{7%4C0tm32jZbvz<|O`Omt2Dk8?e8UEfHo2O_ z>!xMayZarhb!;gK(~|8JYRU^=9GInO3Ei&NWWt(aW79*jnq)nMeU;<40ThUSKl)*% z`A@xf&m*w!qKNHRUqt#^Mzn<@hE3kzoJk5IV=&gR5lHfFjDMIw(%0aeJmbx_{0QFW zg#0s_{B7_LK zrdCzgb^@JVJ==J0$w^T^l2D@qlPE) znCt>bJ#a1(S1BL5i;%*nx&`JOzFuIcMT*BIV1{*L*<6;{!|;1UY%>}p zG-bMzvJBCkfEnXtnS@dUuvv@Ng*&JxP3raRRzBq>dY;9KhZpDW9tAFmDhk^JXixRC zWIA3It0JPX(0;s!xsh<0hcmAk2J_}`!62f(O=ys}J`r=e{5i+ZWQwOB5?~Xv7vT7DF zWxmkUd8NKqC#)PTg}y#;z|tU`rG7S{voxeL<{x;Q`b>ot+SQ4mH&M(|D=paa9R*Bd-lWjE4$y2x+p!A zGnyrqM|%eSWDWHyOrBekG*y+PLv|tTgNkeN{)0+ijL15f>!M4fDEp`Qfo*}~_e1)W z{AHUXd2l8Wf^?r1^mfD#?@wAX7I%8T8XH^>%)-Y#%!e(xNXylqd)m{ojK8R?c*TRj zl}uaR2*aM7@SCl>*Yw|XE8M3h^ z*Ux2Dl+3pi6aK`)kGi-L^k!Gr55<6Jd%lJQBqgX#fsli5DXM%5N58Gi;Jb?LOi0nB z+?-l_1M5_vf4QqIk1viJhZH6GMSU#kW8cL64J7BZ9e!LfwVt3cY-;ukPjLXPap)Iy zu-u6DMb_!8brz*7+$h0zruUS!gcab0YaCKhs;j2^+yZVB&mcn&k1&_U%=f~qbSv>3 z_F9mWaC5tzyhsJK4@v5t;P*)%!EyEw3qch}+joy^3+060A1CW5=_p8!#36PZCShGD z2_;tJuc~14W4%8??*loC|CZN-->5WGe7z6xWcE4FZXE5s&4J}-47=uNh9U|{Z+#tKsG}PCsRniRPYB-bTM7S_=eQP!fXKrL{ZVt9FVc%UNV{PTD9`%mf{9F)4 zw$GU)7)LXPMq~nAPYrzc>2#5Tm?T6WCrcb{4>h-slFpQHB3=!4aqa6e=(}fwXv^jo zxiOy*d2+83j9b*yXZkfK6xkRkg*pbDO4Z)cS->~Aphf}N_p|*N3p^NpC5>|B`Y8`S z!&y0+h_fA}id%D#sWN4x!1RwHFdy)6i*6$&MGE}g;RKg-zA=zsaFwGzd>tENsU^>rT2uq+7rx%hD8(A`!6aj3qkP!GCo%CLZK;8($S9`9SHI z8eR6B1m?JYI60*=9e-xPN4+*Ovjmj!p8uIUwQ&ztfM}9MvAioYfr@0Vi~75GDsPvy z=#d1<;gSIGdSke4StCY4j+0#ch*1BJh|K`Gh^%Rl6Tb|<`L`Dw z60)Kj=TJtLy-bjrFAa7Esji;~14pXsm!vP{2??_2A~~mzbsI_IS@gbp@2{UGSuzXD zzlhU&oSqf1%ooZRq@f_2@)l`}fgg!rhw>rve(7E7oE;O@n6@4OVbRFXMSYwQgu)QByZH z5qF-Es5^(!q~k28jR68lt1(ULs z2r8#h@xo4#aT=pS!dJT@QelfbdP-!Rn~>q9_ub3vw}i$HlJBM!M3LiIq%vmwMha(0 zx>vJy8#C`qq)X9#(6aD}T#E|ul=FMUEz3I3swo)ea2pt-k+m@TP|nQt^-G+3CJd6a z%J2pZe_TF`BemO zWM#g|SWe~HhwNn)E?R%SN_i6E2=XMghb@PpaLDuC+nw3n`kgX~=%e=*Rur zHro% zr>>q^zywMDwz}F+qsw(_APxxvfwb2~vw#K$f1jP`qFQ;bUTC2&F6+wWYW|bBHwdI) zhXbQS^Oo>&pI`AzT@_Lw5y@3Jh-KUiOCH(bjwn=va!Zq>U}SFF!m@v#bMg&YK#^X~ zE?K}Jf*>8@!nB(#Qg#B(Vwb3VVl1 zLkOF)kd&#KuZ*jPoj{J*T1>6MAwN0Xji~$BtYbAPXt6UQtWQom`bQiYWI@y{>pS^4 zxC2z5(-(Au(Oq18v(YGRbjPS@cJ^wp-GWQM>;3>fK_^+XqpLFO|kxHtPFEd7BeM1v{fUY=C9l_ ztAHo&m-tgKGMg=tNl7b8jEh6r?DD?0;mt0ocW=sny4fSHza+p@%VhlVA*(LcwY9q} zJtsg+QU=Lmm5Q&XneH=DdMtbY+-km*`AC%oJv-P`1`8`uV&@Tas5~LuE;OEg@_ry0 zstgok9|6Bssp*h-_(!7;@9HJ^h6RD#y%qFOhRz1gElPvZ_R5pB^Wh<KI$j$1tG%3khIfYfT(AYTg=pJ+L}o8jL_)K{d4^4QUWD{iLX?7( zvMc(?DCj&~K|H#`@Ro*}AHbjLJ5s!brM(sX;tgt#HJ$iI5eWu$98XsnZ?|w~$kLT5 znCgA?)!>h)3!j4nx9{PLV?RX|rb9y?P`|H>cBv=h&%AtJC=PK(~s2m@HDfc3pS2G26Cno7J{$+xBd0HfP(md$w)cwrzKx{{DaOWbLf8*IvoVKFO%0 zQdP-#GTt$2;Ju#fZX6SEjiv;$p6YSts^YXrtee7h)U=X^cj3lQ?(R`us{Gjvvi`AB$`I^vRDUcn z)|YDu&41Co+0bP;x3`>_2rVbgBn<;QB9<%i{FezX*@?;QAs#!4!TlW7-s ztF!rTUa8##pv?RJiczv`GiOgfPi`|9`k;LLGB?LQRaLj>niwQbfsYQ6^!7IvBT?wR zdH|A<|CE$S0;&!zyrPWb4O_oS6=;r8DDr6P>sPJTO$|q3^teG>Q7ntL3Y22(?bSkM z9?0FcE4=v-L_PGyPnLuVYl?ivUB@f6k`{7UtH8$dGF`hlNe}T~SQP|QF$;N63eR_H zvv1YIB5|X=b$%_xxqJc!F1)6h2S*3zv)Uu_#I@wF8}|xKvc0Em+}ecCGAf8-m~XoSeaQ@bxaQ^Ku7did z@Z%ls&)cqm=6gK;l0phm@o7Iz(zoA1G_mg{2R|wSx<7eO=KG@%lc#mT*U10s0u5hG zk-%ADhuN$%agT`znk8#(FCt_H($?4KH5{L(xgt}<8b@S*aT-W;e2Tss;#8dds;Rd4 zE%0j^DSMTf;l2KEX6uWNNCgs>Fk+8?`Dwi8*HI5-$fH}`D$N{6GRw@Zn zGvmT4=~u%04t9Ed$$w`=L+b7i_t$5u?Em~Kfuc0er$IuNE2E0dD9ncN3Vd^I@$+}J ziHM!N&GU7m^CUu!&sxs0X@-PyT>2zIa5BGPg_MV{WfR6Yp)H^>i4rX?RBmZ$F>CsC zc2(Jnb13}^?)q__{?-fTbsdE?8#XPGrP6g{_gbTfavX2(I7HiYhQw zL^5aa6=x{jT7(mTyP)$F#=0xf>4%wgFPI>Q_H~Aw`{@#5O-9>|& z7%Oc3s;#C`1d5QSyo)wuFUR@95sHe6{dMIK49*I5D3zj_>Ld692J~@lKy3pYx41Jr zjO`AO^S5P4xi1WaiR5rE<;;Rc|u;Q1O7VK>D9G0o*l&My?2DK@CpQvUopnyq@1puU0G@Lv#DUlUU6D8P2+7J z4#?T+aG`Q0^5OYND2)AqrDRzVkP8W3Q+XoXXFpW$Oz7_Zb9QI~k-|zn17de7gzSQ z87@cj=sUCc=6eKxt2V)`wh19-x9-13 zqgI3h)2k|@x$qPu0^70Fn)wq_fmV7Z?_%Yl;hPsW2 z#6$J2+7yT<4PF@u<)*+!PCv3eOaZ}IHCY*lN-yOS0!Jm5l~#bpMexJ>=v}qQ24J3$ zMhPKFo}_Y9<<1hKF&`XODwQ5^gup$JFyNvhU>nrY%61UG!^7Rkan^+SSm%$nL(0z2 z@17~gK8#x_n;2_|ne%{aP=HrBFM2)NW`>%b!S5tYdi<@;?SQ;8Vqw6lLD~k^r0LL% zqsiivIo}lxhHN_2PUu>J#tXMoyX|;=Zk!TWwljShJ=lsApW zeMw!z8H7;elh&sX%GU{q_SnouA=E{EA8`oR@J!cw{b9WmPo}ORbbw*p>*fTT5np(Q zkQ9hQvR;nER54*w?71I_pVuUk_HbsJPZ8P7@=q%(S3)NAUKZG*6;M5y$<>CO`NTcw zCctc&JSIprHMhQ0*{89nb}%u!F`-}}nBiSYi?i&y!DyTR()jE~lv%w8mu&)o&} zREFdwB%0i&#ai+z{UtjC{j58b-UMnSfpRQnPznMRNL%_2GUI2w5QFVB#DX>}wuB9B z#%6T1n4)`Mm{>E+sJJgvGESWRDeBhnR^ZHemMKt+2KD$$z9ssoDzb8?=^j&8Q;_S3 zGEghbNtHE2*XM^#mLWTu#%2GAX4W`pp#tCEwv-Zx+FD!(+;;&;nwl=)RjXlGWSX^A zIppuzkcLS@gK&wF_>;E@azfhGl7et6{OL; zucX|w7>MqXviR#`^^_{l*ZNtmO?kI}HrC?)p2|JUqOQt+QXn9NS^YWo{;Fl3Zpv{g($2<*wmV!{Ggy zG|qtxT9MpgUpfPRog_E9Xm1&R`B1E=Ik6zGbIcuvCEq9pJx!>UP7rtgO{`xfu99^W!KfGWlVI&bp7kp^e!@XdNqvPe> zsFXZ`s{A<|gfv4fp}M1O9`!SY&cc+x;?%<%{A{YSXHtg8d|TH zVMw>Bk8LvJF4MESUw&+lrv(p(dA;G4Slk`Wz)d9}64d+42OQET=q?}!3G`^S^y8g& zBTRdBCi)ljO|RM(WY+WA_}R>33)nIi&o3C`jasHk1F)HYz6;Dp*h(w4fDX>VM%eP3 zdh2@`fR_4-Os357wS*o9)&fuK#x9!JDacE$qJWr zc0zm6BoO6_b6NPn3G#s111V7#^H(b?Ez>V)!$&Ocuv9ajU2LPf1bCBL!6XH_qir7L}t>XEyI zc76u#loAF_ccmWrD4(pXS+@tMS{!>iVJ4|{2xQicP&Mi_I|N>bwm-5ftTaWMWyE7I znn7pN<>%x}1PtE-Fu_`{H(uA{e*5!FgG1LR!2yX1ODrJPjKcZE(*nb0AwxXM-(0wW zj@#ESU*$swhAHgLczE@F$2Fss|UsL{^?DWooXZ;hf#2&T;5;Si{T=A z1S4*tlY64+{>NnA2o2~9aYJ2_!n)p~W3&zE+$cOi)VHtb9e9!mw&jXT*c|L_M_0s2 znL1wV=IMHDtIDXJQm7~EF;>J@zVwRemBZ!0q(swE?rEf*FF z01OdeTj$G3w1eYUZM$ag>(W+)OnQA1h;}FsCPuhI(ggmuML}UsNfK%uYu_hT%lk?8 z>CPfM&jz7nbFL8Vs#=oRybt>aey$?yqk8JR?Y4I91$~DlXrsyg@a3||%J13S4b%QO zX_)Z7%Af^04{H!3s%0R-AMolGP3SyJh2Zgf?JOZlbI#v+dO8&I3Xs*O59&z#S*&d# z&wHurYS^TJe%)2ZnGx8FdROZ!*S5~cxh5X*OdFYVol8nMtO19?C)MO!0Kr?N5=XH%d?A$g^M4DmN zea_Wn(_C{(brI zN>wZr$cHJw4#70aOsuoJ%%*;1DoA>oj#$APQK*mvQ#4>LOxR#)+S7c9Plhafy~Kjmyo2xlXPyo|1A-aZTi4$KW^abANfP@I6# z$>UV|KB);!GZTuN_5Hj>)uN8_=ozj z`?CMqLYHsKsVC)YV7tU*WCTv79fPpvvpDFg?920AxMt`{j_#drp$ddxW#mdov8s5>&KvKQN4Jd$CNky(Cq&6> z9g1ma=%|zlW9hx^%Qot9o^z2|-y%lq>Mz9E9`eV9tX=2Pmn}?6)@V2nNc87({YxlN z_{mKRHNzz`<>W(7updV4{SZ3WA;{t113|gr>wzCk6%|Mv=T59OX6h#X+3>wrp}bvs zz#$v=o~#PhexD8+tT)hn7Z2;F9kWBg)Jy?B9?o>v!ae<>36@i@u5bZxa7o(ETm6|Bf(V{qN}Y|8;o$AGhZJ?7#S*75?uN3)~DW zoUOkH|G%o3nT?t5Tgc7)Ee&V>Hk`Aw(=l^$e0%=CW$gbA3iV${^8cv#|1S#lUw;<= zW1atd3YC%Zd#CwdFjOC%YMgKLb(`OS51#&fJcS}sje5>^(C6Jb3Io5stLd+SN8q)$ zFMm?zIoHHYY209<-NTLpsvJJ1Oho8lVchu8&=b*TJPF~5&4_(vb9+jyd}G5*iJK0n{*jM88X11&adPBF&lq2 zS*0);p4H7l<#o)?HPKI&vmcAn#P{XGuk*br#q;HgzU!kJKHJaBo6?6rUur;`KKWFT ziF`7ztKGNf;#TDQR$1}IP4D_3GLO14?*8#1^7iCb1WrfsoYCh^#F0+L*FTF`Va}>9 z+U1?c+XoMt^>EYj!?ikQlK_hiQi9Osvb8NFkf24oE_l(?WU{+pa134I3ehQ7x|`kP zIz&`10XcMh7K@>L2_l|AF|P_m9|k+*Vx!-$I1sb>9pL%VD7sg@Jg*Fu7&PZ@DS5NF zP(A5Nv5nCR*Oe4R^Lmo%glN#4ywk0*ov=Rh0LdlVtCwONFx`iS)8gne z%M`w1_gbPY2m_4M^1X02SIZ$H_h8mvXxnvw+jKcI_w#uf15WnFI%zNr>^j=bE#MF+ z+RAipiPixECdriwL)roe7KyWafSu=3aM$)PP!a~8I29v`>FC~whrZW_3F8m!y`2S& zyiX*|4IXtDvxb0t<~e}I58|{p8%7ddhUO&H9Da_FtM^_V(#;7m0c#G{)Q5^{Fb&lf z_qTpr+-F}Hk3l5Fxh@069zl8O+@>(~->`4y+hMRDn10IzPUJ1XC7Bld(vM?*^Upgu z@D(6Az#2PR8Uh(+$*oaHlc%MG83x*OK^TMiIjW$EIiFCwMz#1p9XRZ!igr|i(4oZO zW{E+|*D>wUpW4k%@W^vo6hlQPR8G3FH}J`##nhY#awDE^=KhRcvN`Ala>m8k`cp<)XYZs zZ`7ck1L9lSN>M55jxe_;c2c?1Ct10>e!+jsdgu@i9rW1zpW?CZixp$@@3=nk@1TjT zu7E|m8z=>1TmWpZzT3{mazkNyJ&L=!Zjg`b9$A$HhTNT_>q0V>gxuD6NaKCcFBJi8 z8iLPKA=QvQ+jnH(kHO9=4U^&sy>49Kf$q*+Frq_AGsOM-c93k=ne*JTTj2O3I;xj} z&3%%~)=Ac80z$L-#CAsB)mCv!d#jA@R7XYL4wWc5hf-OpKRUaEnV#D311`uN@t z3-xp|wu*>LLq2ruXiU6rm(*M1u+KMRzA1d{p;PPx867tWz>qK1_r{mCkPRHg!Z&Skr(|>Z zjr_V^FLXBcnH)s8un@B|3anjYY=6`_9Lh|mgRa2BH(D$PdTYmi)}M@KIulXMiHA1i z_?{ChOxKZsl_2K>^0Nrh`&DU9_nOh6N*x!VC4$6x>>dlo zOXLA#SJ>EW(vJiW*YQ#6sOUMp0YaN`L$mIn@(L`0Bgyd2GRx>X0QrmvbO*%mO!p2m*1@ zGz1S!n4`fd>ko1#C?^!o)~;?2W3F?K&M$e!g9bB2B*{9n^=5BilDQW1fuI!hDSxI? zb%ifDz-F-4DThZWKxP5b$6F&`dg`W3Ohn!7^Bgxsq2uz_lmf?hu}w@u)n_SjHGXok z3g`zG4dpD=(=`GbUtm^f-WZBAmjaUXXlrzSy{M?7v}N5-+KYP+sI@c2<|j5L+qFnO z;mrT5=Q|S~KiuTyov>D7smd@T*hH;k6(!W3QJoA0ccG~9F(l`D-_OQTjmK#%r~K+N z@NpanHyR;yrcCVkTycx-ojnPh7?-=;6YWx%g&mjIRI$N+VnFbu_{Kl9+@m1MoN%^8&&8nANHz8mqo*cApF>`@;|gQGY`5B-QUZ8QOmB zIO}7F!j{YJlyiT=;^#1$0bV^y5HMV+tQjS|_Ni_XEN%hOrB;$@G{CP*m~o?ck4e0= zgIZ_7KcEWH#UN4J9@hiN07aR(0o70cW_<0NxR{?GMSJ@cOENTjE3!H0#=J|-?Ba}v z&H+FoA|Xg|?N_HfDby%ZL9<|?9=_JxVF;Ehbw}i$vKfE-J-Ni1!jgGfD`Y1)EUlI|hWJR7c8&>zGOC4jc7ILKy>o zh82b-pBnec4MM8+Q%p@C&O%3ps0u7YE20Vnlb6nfcT^1GDqGqo2m-(&pm@ESzj3(b zTvPcV4yA72kMK#_LWgfgKZAy0=i&ljRgms38PJZ$LPR}-S*m%`oBR!!I!wt(gz8%@ zqy}j360y9{Qlo5{lAf(|B?Xlc){jq+E%=iSgCGQrh2e>HP|8!NRAR4>qZubugjY%L zapJ-T+ON)hZ!od2|4dRW6jqQ^*=v&2)KaP`2OU`r9PKg85oTUpTRTw-i3TH+OxCRQ zf0ZD5FyGu2)a~ps1ZRMa7;aS^<3+oPW_Hl0-3{1Stgl?7dS+l5O^bj9JFH;$5z7?y z3uK0~b5Vrobujm&A6$)BakEm2n+1{iGJ{>#?uR^c7LYAa#qOF6EKtB}}}L zo{Jm>>%CMQI$YJHi7kk(=+jakjnZpwGvf%;GWg+W`U3xb4rF$E!o+fI6re*FkLu4P zoQkgMT(*9Q34p+U@+;SvPYgJ3_&NojJUU#-757IqB)Z$v_^nVjyCCOkv0HVMI%ArF zPiMM)Y?*{;*kP9VfjY2^Kx0XmV(Q~xrEUn-B2u!y;3GD-Z19QTsE3EOwvT6s4mgEO z3j~v!*+{$8suT3|<_h3c%-SYsNKoy3IoB6WpucFuppw^7{$fx>G_wukbnOG7C@)dJ zLJ@y7VNgEc;SV$*~>*Ck?96fF!6#^I*7gu*S3%Ls$Iq9>R z<%gJvKi~QsRQtYzNp{W_Dz$z34Clh2foUtDh+iyHffLpf;g;R$iKrUi`UcG?O(vr> zGqfYx-Z(t$#s!wvRFI^zmteJ%34z;4>`O(41Cs+tKK({XVw_}8q4y*14>V?||}7tKj3TCAkw;_;EecRWZ~acDG>eJCBeW@*{aa zttoWi+ch6vrShsmYsXPAABwU-fwR;sOp^j*BDj({zOFz^_=_eU-(59_yewd1Q{(0p zq-$L`^OJvVY4JhK27-+)@tHKNTBbIye#l1<=pS%!#%#(+K`W+pquF<|d2)%5Jl~tE zo1WS9gGsb?0IBL-TC3b}v>E#;;un^gDF$lq9uYn$j0kG35@*%&m&cTS{$&q?bnx_W z315ui6WR$i`@SesY9E0VZx{O6t20?YFbG+Aws#Ml2z$ANv(ItBt;ns*4BQ%HrE@ui zBsm-b^h67`EIg`KCcmXndov4l!o{4ugjP#|5hp&) zrJ+plN0Jbc1QiB+R$JFW$uEV_g{G_b`V6>jZ#C6^-;{`MpYv+S5|8oEpl;%^eef(} z@w9K870WLLtzk}p=^Mj{B?to)7Z)6}6m+)p5xP0dTb9;^p|p~_gx21?SP`Oe-GySKN||KR~QKpldy z)nO$E7mKS3b;)EXC2DLJ1jya82k;C@qEop->?4DVq{Y?MoiqSo@XS@~2PPBQv<$&W ze6#otrcka+u{I5xtU>J=_pTkKZA_`qBp@Ms!_hy^Qj14hl^2`~@0NW8-bL^C4C{WgTbL|yo*_Y;g@r=ad z`^8oNl+BK|(L8XwI}KTKqcOx17itR%PW6IOjLk0gl1=E%Wd#JCz)2~h@5Gi659HYi zQinzL34Wx9H{L0|!OA|OMRRhJ8b zJ@vlZ$3cf|IdrSltv2Q*L!KYLrRAs-slbC*m|d%>)k)j5Ov-JNCt@X8ZPlFoBfUW* z#2E-?x?hJp*`Lc`qOb9JF2uQy9k)Vr{MSn_lO$Ma8YQQE3=Pr938P+bf!a zUfG$TbK6^EDHpdAfb1lN{5G z9ALBAqX|q)*rUx+8(r>>W6@zJ?e_uyI_WTQo5qZR(dj)wxSF=JB^3)42fv_?p>`F79bZ0!Su9Cy?xgjW5x>(ocle4^Hd9;6NQl?{4 z80F`jgC=Zn=+4fNq_Tc@krw5sw>=uYgR!g_c$&fHxo1S5)}_Jbg1&%F8L`)`M$P9E zj2IAB(L{u5cpQoNdFuDD`Lq&P#4uBfI^T3_Jj*7XJ zD=$G$PnDdENNhU93n@!MZ5^exoD%?&h7Kl>hs{TGEOY`Y;4%POGZK!2zQ7OQTKE=R z6m-b~Uq|lmB`aWUCqK=_GE{5u#EI{A=p@^lR9uPr6w1d7Hb`|$JKjfJ@bB2bBPQh> z4CEKyCf;N5iit*Z5UgL)A1CAlKSDGc%i)

G#MgSGk^9 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

Ve#Na#8lXyl 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 >mKWtGu2udb}for8prwrxI9%{BB#D9SbC$VM0O zg9`T1j`#Cv-!IsRp!qxk6U-%nE0WfIYk zN?N`2V)c0_e#KKd-V4|9@^lpw{Vc6mM>FJLnuVt(PzhL2^tr3`isjL(9~Ii?75bcI zozcRxDL#kl7F!QdA=vua4$PID>S$H<0%1wjGT=K3p}>m;ZSF&7-xG|@f}J$~!bX)v zkgFONTd<_BkZ8gKP71xuN!?6-BG4OntKKoH+J19NAFHGBVDM((M?vz2{UayvDkQh+ ztHsboz-~;7J+7zT!q+K^0Zf^$ln!|EmTFLr`G!j$xm@S{ghhfB&+ui5l6%W*V&Om@)qqPoR)vV9V=@YZ0?(VQ=+^&V@4lvc->t5_N=Bk?OEa@;wA z=@#N&y6Ri_)=>Y~~_((5W@3@o9eS%rXzl(@hgCwx;f$SH=3tvMJvARe*gCh+d0Y-CFUVMlc-hg&>_G@hOLE+xP-5d&>9sP1Vwyfak!5Xvs zM!oPu^Bt)YD>J9}vtOLXA;yWL-2wx>KE{&Y(3nVycH3LQIYxkMPiJibu4f~ewF`Y> z^o`cNhkL~+j)C;Y=>RXWFMu9wx_TZQ{p{p?{g?tiu4N$-NK=ibZ=Q){VWym?o>bVff3$w>wYBbpmg_%&m`FG}J^cSZw1w+*TuAPGaSsS8}L zqg>5>VQ$4Yl<2Ee4QRPNdz=m0r5wXKaDK8+z@!Zk+z>2j3!FW+}2ckjgQtZQoXqR>b~Q7+d~XDHh@oGLNX*wixU{ zQQR=njjPNJoFjUS3?;w1L=b*TTfK!6+ji83=yj#KQS0|^HG{q@^rhw?PNH|4#}H_m6#L-jFzK& zjh&pdtO^l|@FQNjZ-c%ZEF@Suozn)nhGiXIrJ-Nzs3|v+qy*JU3h`S7^jNqovSp#u8NmbqKlq{Io}+d<9NY zWOY)Qi9|wx4$5kzJ~Evh!%@t{Z=IJA8~^ZC{y=P&iWLRfg+n~1cuqjlS)E(`zB|8aqlT@z%7bPoW)aDH$zH`xh*es2UPRS?{jo_P?qgEO_)7 z_mJA(h#(^*F#Bz>8n5T%a_ke>YnGX@Ca*l|`&)hn9L_GHhD&Qh5T!gse5zfD(Gao= zq2TfXDB=?uKTuk*aZMb@gF5cK)B6#l087d&=%$B<+H_kRo%95j`_1sH9511xp9i?a zE%#OSSgtTkq0xXAtBmD2y*ZTtfJWG;-~PToD8Emq;pY|PU~$BFuFc`4Bsc9vnfiT@ zAA?w=Wa8!WJ-Es2Lc+Hy{GqQG^Ee9E?kET)o)|t%mBpd;jG0=AqlwJ?Yz=zwPn1=u zl)4<;g@lJbXwLl&2w9|$W7w?xlc~%xeeckWEeR8cLJV6<*hOGNsg#TL&ax@tYCt6m zIz!X&e%z?S??t-Nj*yF9Du9V}l(dUhU;4b`f7LJ&*EN4SNd%R;E>XwdeoTAln9VH- znvkvX^mlKg$PwZQe>4Gya!bcrJSR^Hb0j*$vCYNE9RH0c0CzzY;E8BO^h?@@d57kK-99Kl*+V&w+`+DlrL07JmTNjycXGsI$ zgN!PtIy5Am-1ji)C16NkXp9EYal(On9m3<(85L~T6Vjn=j^7@3XM~<3P*Ff; zFIL+|=XpXCGYtY|ZCZ+`F{D}q0*US<(L8rt(q0!vQ`)nl={~g*ZwQGMa5gfJFo{3` zqTahchga~dL>k!qfK)2(Xvn4^H1eZbFGzmv%~Q!4;A}vJipXEaQ9w-~{@FttWJYc2%!V1cKax_TZ^4zAnK$UmfLk@=c+u$0D*(HQtL38LWB~_j$)>4>iW?nJ z^9k3ed4DK(|9vjs8mTEZxBMOJI*y*5Y=Dmxk{xdDHRQB{^}Ba%-^fS!kc9l^&)!+C zt8&KNg_kv(fnO>`mwlif$*a;-q^?SPg6w(j7RVq??Y~H@5z?3|s1q#eJbp5vj#tcC z`lh86varTluZHOSmPPC>4X+c&7(E_vI^^0x?7p&)7C{+xOL`ajID`oD`krbm;n>&A z--gEs71r==G&c&wQ57KmEyl@298F*EXE;Pxs6kn6s2JmoCmr}J(vh8$$~Kp&ueZ5q z&YLCry^iRUcyRkIv)u=;$zJ>bwLL-ES=OS?nHDHiy;QMLNF;)uGK8$g(v)UzQJdG# z%h)RMB8)*R(2B1OqBE+Z=`At&w(z}pC8jPoeNHAcj{CTe?@412h-bNkr_Zc{Cxgkajf}JHv<(u=tGBij_1#2=~!7 zkY+???t>fJaY{6-W6NEW)6b22DJT?6udlM?Fmj-3MFUxLyvprpfuU;t;arPckwMK- zI(_{e{aK^VAMGnVoK5&_f0d5L z8atb&rN+#KbnL*><)qXQQP#)J(llvtKZcr5ff$h_Y*p8Rnd_Rv7TV}grfXD*Sc%&x z#MHU9kzwV7iROdR;ex1Ch+`MwaTp3q2DVjH2|a}N2jyrYL3OH2Pjr+Ey+cDjq39;R zdmb=#sJ;o`8!RpG=fhZ^IxC*~)T%|(C2>mcpCQ!Ab|*x>FWdIq*hlC!HUxiz-hg!& zX){V5mAe;ma_~VgPAs}3`%C@W*IG(8ki2;JbX#=zk72&DuE>?%hM_JK^fgpMy?f~^b=q41moF?PBN7Phz$K~p|r2N z?bLb)qf~0ci|wrLh@S^TEh`G-IL`Sr|0y@(O=HNt6m%{ze+aYA`+P(R0{sI2WhP-? zVN6&s z$!pnNtzg0(#*yBiWzOQ+-nr!L*ySX(LBF6Psi&zmyGh?A@ZkY`NA2~nZ{g?B?XD`?YK>t?sh2#Dm5VYl zt~U4!*(@^AGXDu0XFUQhzT45LlF$J0`=E7V8ha~>B;$oT{mncU#g6bF>9L+#6Nmli zySB2ILlN$+q|vz3OIj!6nN&!hV`EFcQw2-N@3a%I7v8ZzBINtZ?@z9+`cD;Gz)#vt zXOJr!89g$4DJ-wyUSW`Vxlb35Vd$rVsTp%ULK9e8E%5ItCu7OeFFfj$xMRwun_D0He$mziGq!+nakLufxu{#@B8g0scouKz>-Q*l7|1>4k~<>A?O6=611 z%&22ER*AD4dOxkAG~8B2Ykn1WfdQs|1sy=J+`f5gM-bAtZi${@c#zVmAmx>D75w!c zCZ1K#zwJaHtdFBvNfEv3(QN|p*nJPGQ(;yrQ7(Gv`5?&=7HtO2Y{ z@n3BDx@xnc3v3WRV&v6)?l>a0h0Eionz`6#&=M1JPr3v7X7F8mV-PBUJP2C7K0HL$ z@NioiQSwZREQiHDnR=n*qNL2Qh-^}`p9)VUJl7?|&Piih$lQ+=S7#QPxI2h@Eh=-9 zcU8-sv_FbruX5k3ZlBFPsJr64@{)|K)g)3Bt?c}w@3;qGQYm~Qdk5y7W85W5qspwU zK06=+ZaQGEJ$^rTxcHSyQJeWr!Bvw%M*?f=eD4WuS<`F%(o)eAH)8CZogEE0U} z-SN$V%vp|O&szSJqNI#$xF2A|JdTI*a`po$s&YpolE8MD?jjq>xk{T(aY3#?i1)Y8 z#ZO3!4-%j6#wzZw61k9}&RW_ld}TjtvA%~K0pOS%Z?L!NqS9Esg+5DEL392@>x~}`#Foal^v)|Go*_F2ei&qQ8wFAxK(hjNFB$rK?iwUf2 zSgC!FfBs(lC|7Cmt0}e5h%8LLP>38pVRS}}GSK6QG0iwp--IYC$BF73Goyo%BQzld zz_)lx0UPx-3LBKNpQFZJvlY<~WWQfa&xQkdPo+Rg*O|gymAsdoRPJ?zAo7gMN&tQu zX2p!?9hN+{gkoZKD->!+w42G-(u%bocFxfkE?&e~#?rMk$caS#_AluOK9+Z4@=)8^ z{0S(pt#UkDCsZjiYuM9%P=q@d#xi6kb%6IO2m%wMJx(LEGG!O#wiFw3+0KP3p^m(n z5znp$_ICRt_x{>NYyehVbp3gg4MR_X#hvRD6o3l-lZE;O46DS?FNrTKSMhFgu3Pxk z;{{CIp-dr=Z4@Sj+AyIXkS!1BX>YRHpq)vI=-WqG1w8tmVt449*5s^wlahAXN8&sp zOYxz-(kBQhr;!K+MUKod*a27_9#;`#Y4QX7ed>JD9sHJUYiP)9DI*D-x}I-CxuN0B zy=)kjR!#<5;&ln2Lx?vCM(*?aRO1QPACLkq2ujsyl~pW^OJ(zOH`+z~nw?$y6Gv1X z3W`z&qY?%!hpPR>n5Ar4{qDUnltdDv2SY+iZ9b#ODiI9uns6Y*Gd70VCUMb&SCFf5 zOwxZX9B^}gI$PV%=$HK-B0*&C1^#@tCKu{>D#zK3F3dl@Xm9jYo{79xM0NVvulmc7 zMQR(jMXCM<2-~~&Z`c@Q3Ryas^}ejS(No5wG<~f!0t?d{aQZGxPi$?I%k?hl%U9YoIV;qJ^D#1hs}+aoQHg1g0pD?5h(v}rW(`wX?e)C0_*(O2_|Njjlfg->Yg`*=D$$cyY{iPZ=Ao=NTRDx{d)zvkPb z+Ak1~=(--MPbi-a>@tK7gz{s7)pAO23a}@kt|~8tHK`KnNAR?tG^gH_7M-?c>UMkJ zo`%K}5$8>F7v`YPH>*`3PCb3Dp*;X?fs zQe2ZGe+0TZy)5cWCgK<25W?B~FjQk)(U9C`h7jmOLP*9|$Sk=SJ3579?gpxIO+7gv zIVAkiER2^G3C7dc>H#hFEb?|6Nfncl>JAHKPQ)&8#aDbttl&Gc>%CkM{2oqSG)1iAde?7oThBa%~*R%BnTR?y5E z&7cu$wIZl&CV{Iy^{B$IgE`3{4v-TQ=o?db`F*e^9`fP~D0cb^5#f`{>#Hh&1PDHq zKqTT16CpVcC;`9fSUb{wlIzl)U5MJM)o)>H^C&#O2x0QC0<}%z4&z6PXj4%gf{LnX>}5L*C6d9hRELMC5dv6^R4ltDD2{d zbDG+oP;4RivmGcG$iqi^jm}jJND+=Ddj>g0GM4ekHa{d-Km`0n_Xex_SUM8M&X2(9 zcY|7!pmM}RT!gm^KiHa=($dp{JUAdKF9)#Y+;~wIpi)dX#t)dahVf0ojcirIBK0+wLGU$`A?((E;zRk?)u31Ji5#uWTS>qNwqo zwBj!S0-1&{bUjg#+3^0vHnGM`0*u*LT5K2oUkodr9^C6*ZcO*-0?lyq;#?Os6bNeI z7d|3gBTR|<(cAPuYZPm-fBK!e!mYzeK$nyE&W~`iDj!Mnx_L5NJghM0o_q}-30_Q zu#iaAbHP>=05uXQ;%{`qS_>+uUoa>}d?asf;Qhnq6R_Q*L*ZzLNNVeJ;>&0Zkx$_b zz3>R@V_6v026k>;`EeVHy&Q+oTJawl7gC^uE&vg>U)e7lu=ss$Lo2mDZGel@_#+Vw zJo{|RP}sBv(@;0Xfv)p{cCtKzP=Wjp#OXyOK!C=XhB$;uac42M zHqW}vuy)~)D5h>bD2MZb{7|8QC4o`p#{;NZbW|!|T}&N9Ep{`^+RxlYrf1bhbPZ^f zwjy$YKK+E&z8R_j*&emMloFs>wH+{hxwmW64UxHl{d)3N=JP#$PB# znfWBi%QbySBMGALcOOodxUmh8kiT%<#3HHsd?aRs8x_(J1^9-k@{2kgQ6$%dZO|FR zQlVsk?Gb@kN$p+O>8~=>-{M6B;DP&6oKXHwVj&FuzLJ|S- zk|ltkFiAuyTW{_h?0)SYraHBTO>+Bv=K}=R$H}}QL3+bAK{sNf1>768hK=InsZv4* z`1G5zhQ4|Lmoi>mSYqJgDJ4VYmr3c#-XV!I;QOrWjTa}Q*h#7U=7_EnM$meb7&#qg zT{7`M2uFhhka+#)@yrcu>6t&Z_AoR`j-yei3AVVnP?O?gUuKmbc|3Wx-a8ZdD3|5j z!NU5830--b9rG2z3bn4uJNLb&d{1)a;AK?aTS=CbJ+{kYYu;NL!jfLc(vZjDpEe5~ zyoLGkIBKHP!_xRE6B%_GhSj>hmCoOm&QKSPPc-Tk%U-4AFdZXA+FYihQ>XK6FfJHf zL~daLLRQC?2mX?wct>bpo*y#Ik#)i;cfjOJr2QQO(3GH41qU+CvPG*sh)@1UNV+qB zAKH@~1uA1;7IU1ex|kVl@=m?WVl5hkW%i)S=S&U?d)QLAeh8Q9J-1RWpLi!;X4T65 z26-$d1>;#TICj_E2u1pi<3#sfbRsa5bG}q9wFPScGEp)8M`QyH@BCBzGmY!1#L`46 z-HO~O=*20aP=b@{qWrq|eOtl4sYLdJ?yRA19J_sX!2l{gn!Ss(1nD&GP-0?xj*4N8 zGS&j^+zF1?sz57e6fpV%!Zs1nY{x0WgC+i5FupUqZl}FC{%z=+sk$lpCk59N{?1m_ zz#I>^Mgi8XU^FJ9q}g<0#Uod@q|b}U;=~~wKh_JlD{W_?x{rPjVk{AXkY@+&ksby`qh%#ErV&zRkL*5n6ECgkyCiU6}&nIZF-l3KF_v!_Z zeG1mDO`8G#a+;*Gd`yjITA4-&zqbAmI8vZF-Xd@#dMFfn}?`-2CIg%SKK3W8>F%xgl%rhp}Ax zZ5@@e{Sv-Mo=iMoj_KF_Hf+sP`}v(&$ktdk2{G=}J|cJez)y^xiyL$jQ0B{UuFqLQ zmy>O~Zo@5ZyX>1FH7(=kH8ArH3l6G2wLn3QDnh5yg2zwrc_5K=YqU$SGnW_FQ!Ckj z#x-NuvSu{8{UV4VQ%!Vsm-ZpDcsSJ+Q>vBdZqo?ivwJI&dbQ#W6+zt>fnXVLf5CDj zl96-WuMe{prnry=D^_)u6IftUsqxe+Jm^e$XF0|jifH}l@?-&%qngvprJbbsYjIOu zAd_nb_TcKU{QgmA46B8y+ko_@>K%~7Wzi3!frHO41kGZWaJywR2GtZwLIX&ggOQMzDYBOq`^PQ!&TGwZ^Ho(dR zV#kH1am27YEvK!=OI+;S4o(i_Pu)$|$yC`!ZBQ-rL# zo=SCcBpJVym_!_P9fpy|EjNnZBd22k;fFD3t_oZOW(?gK>wOWq3%iu;o!YYz_WH7h zY56Dk%ySjP6p#53H*;d5KyR6P6wm@Tz?Ny}#8)T~w-1+$iJb7rZ{hm{dzj+WPaSwa zvxCn?4h5%#m#0Cm@}4a!15EAjrM`)s><==^yB#qZeNLmcYO(BrM1ArxXy!3I5!saH zOpsx%S$`I5qbO`ATUT*CY7Wb#5U6(4PuI*GM+7%paShF(8kr}P=`jBSA3U~(uNx;Q zQGgXom&LXd+0{9wMY4;(R)wCPGrK)sj#VEMm+DiHd3wK8-#Z~@%t01h zW9K8KTL)n`oi)&d7o3{`y8$B9_l&;z*og5cele#)JloUPy+aRKjELjm*{BRD1a!*m z7WaimCRT7EZPNpjhew%>hraWXWupO?7@p!wLZy|@3S8d#m&;az1 z5m!*mMVW0!KjrmohNr@YRazbay6IZ&fd$yfsCTPyAG2_M>+EMgQ_>MnLwDZQ)bZ}A zSA9R!f5Bj7^uuRk?jp0R@AH3ymc_|2m+ zewdKO2#5QAF==HzEW_kVw=vppqB0W#MyR&F=U(6KGdi|WeX^z#)|xx}!70fe3BaNL ze(sFCX4LdF7qQEXfi%4BI}?H~yvHXfcKvG$Jn(vVxw0TS!x~qaq-YdA*hQ=1?E}$_ z#Of!{C)anXAN(%^54ccRBV)w<$CAGJ7>uiBsS+mj2~@;u7lQ;auu{x3FVTofJK|-=B&@aV1Wu8Rk_!I(i46Q&-+BYvE z=wf2LXHQ1sVSleskvOHUZ?GXbZS`SE@_Qjf4ML-{v2{l!B7b+*yFk<*<+mFPO*9-MD!8 zvnUnmAm!}^29dkO9Q}~KuHiG)nURSOS3ka=>!kpV>-3TsJ?DEwDm}{p6`fM}mLXey z6T{XN>>%B_Cm%Zfa_jDl7pQ~9Dtif1tn$j@< z14S1~bAMZ`16FyepQ%(I@l=9g;1t!H|~O$=A4-$ zxH)4le-Hy#bo$n)u$&6?r$n@GTE!6odTh<*M%U}lAmIv1LUYE)me4fIc^N{R_3n$PpPiXYLvC-G$Z6qLWs`aPkyfdZ{+-_Ll zoMbV1UP4d6ZV4Y|=A3KAu9#|UiKVnLm!(Ey?mkC|&{G0ETJb~Bm)Fn=rpf#2K;q!0 z$wM$73=Xr=I?IebljFq>GInj^J+WdEnD(8`dx99H^MV2;`MhaCdDb*PNbof0XV_`w z*#~Mqh55^v-FbN+SC55)r+twO=|3^> zIGW?XKSbt^HZ!>q6x*01ue5X7PYOgl$z3rD9*&;s=6T={Rz(Y8Xg4H$M)E7l)?Sxw zjH@6I@Nonmu;~Le7le4y3C|5Iqw#<{X0u8M?BkH}gE_3_M0A@a37L1;|A=XF^n&%R zJ5i8^eW-EXjH7Q>lj}h+28(Q{H%$`qjFJCwDxofMSjxLAUtC^NKoe)k`#dXRSee@2 zEef6|=+Ku7uV6MtJ69xt3op8#mk#E5d3D#>_(kREec}r|RayxlT*f>pKXLPpG=gP9 zogxqPqo!*>FB+B7jXQkG z89D3znAsU+#G@c29;r-gdh>19hLHMBd)e4;HVe$*tm;( zMcSN#a0vukbJ7`SNvd>qr%YsC?m!k^%qLW(3u{8UuwrDnZ!%3dSI(scecJ=K4MKUN zD|CFr*?h()wPlyY2BHNT+j=rCuSnkVqbg0*J&U(Tb$M>$-5|WZ zY;9P5N-1&8mSok=&d_hMnt_>AkssN{=M$>+NZ%b!<{5sI81UXmZ& z`|=np$68zLjdvxtXVBVIs1wD-3wCQ?bu~{_VzQ(&b$g+&DYst zzN<>cn#kz{#`;nbe&5yZc+vmTVGa%F^@gW9|Cy%}M?(BRktZc|hQ_A$4t9EWf8*-uzvx*QS{dls{S&|*$QjcCF?1$& z7NA2n5RnGf6Ofr^V*>hcvoSON88ZF5V*fbOFM1Ao7S_gpk5li9o`Ip|FIVP&qo?UD z_3Ryh&d0R>Pz?M7TmNUnU}2_XV`F0hnvAnD0>cJ+bOQl!RshRil7T-;_#gQ-|0@_Z zBL^_qEbOf81S|j!poW2+j-81GxGq^4|EwbZw`lr5%d?HOh3OYlLwj01D+5|!5jk4u zIha~o+0*}%WV0~+(zgHrzf}wb!0G|&8i4W)pr`jA337fnvj4VR{*^of1pv$d1|Uq& zOvl8|24DutTY$#%3Xb{?t~Q4BlBQPX|7Zz(zgqC;&%YY=uXuoS0c?c-ZDjwpu0+t1^PT7Fs3KkX)phNmEsmmY5`!}%u zzt$@JE1CSIvtecdZZ%9mAr31L{RgfpHU?H;n_vgJjsH=MzqY48&gp;9t$eYkWn*Aw z1vUT&J8J`=2|utnX&tP8Hv~J&-?d8n2ma_lr2??~0$ADE{vpQ#HV76rpt6O5<(D>u zfsyXdq*=fB*ne#>jI0d6;;^)Fboix#Gq$!i_$Mpv?_vML-u-_?{m1t1zYhfeTF^`k z4F7%xtZfYKfXN4rz}^+us4f3lp#$Y_%*=paDl=cLetCFBaC02LG$7{z*Xr=K?4#;`pVW{522kbO1IM08nYf!Tu*}`S%g> zUm5`$6Env@)~n%P@fzCw+i3nt*ngV<;Ia5`*=J?>qqzUJasH19kba-4|4P<>EkFY1 zpW*+hKOzR$c~)1K7=w-)#`Iw8VjiAlE*~^P00l@tz+t1`SHI!g1QbvyB{KE*85D_| zEsmXyHOPy9_p^;gxjxxD=ZSgFZ}|Ca-No}V8Bcxm^JuhdPrz-V>+NB3a`5f`X(Q|P z{^0((>CJQIAn}sM#i z-aM$HC~d@AL5m@V-FSl`x}KdpZPb*Vf8L+|q3AdJ^FhnTU2h|5otfV<&tfgbm5M>NcneY6*SZAKztIi@b=Xw`;ZhT1Cvq2Y*a zZ0d2-eesLBG8&Zo+LqZwvD@drZzr12>#FeOb4S^NvOH%t2QEZ()%}ziB}z5)(gT=| zVNHV1)t1F{NQ>dTo35Nv-2g}IYVYPp4P$gp*up|B(R^L|l5dTu9$>ee9|cmMx_Mw{ z7?b-pa?}Q8Gipx3PBO-Y@*3?IKwsxoqgtfhjcaB@3n7c4hd5;pJY9EWP-k$o=j_W&WEibL zK;NV;>F7;XW^xuI6^uJ_D&6)$MZhAYyAHEucvBvGFOkf-aT1Oz3pH)0=xpTksYm^s z{MD_hvoB+>v{-XMG?HFhQ7>!7p;t}*_;4vzlHEIse)P2W*k!CLFvfy;=_=nA*efdQ zT{FZkGC_3+PVlGT4UoDc>k!u)?2R^it}8TbG)pHKke(d04{CIg47;j@3?@f*MHcAs zdMhok+2)6vV~bH!Wmqj}s=mk5z^KpB=XesWMVPn0-+?75lAQq8#co=R0I7$mMC9fC z6mQc#S+lLm=!z+bmn2WT&2!!?)ha*ocYL}`4#wR^z;hDBS) z_lmuqwt)g59KM#3z?*V&2FYp>O(jB1=R-YU@3-6rRGnv9LOZl`)zX;;+U;=D&HG6| zwKEea9pvDX2b?dTjL+>$jp7rRX2khhIK~IUaXDGiF}{X3vY)2KcIv())YRWFmnQ9R z_EQ;z^ba(~+B(nGWLo2Q+)zy=it&9Fw)(Jp`SG?Py8LqgHhbW(iW~#O(=sHhZsFb0 zszwj#c`V=rJsvs%=fE$8vnbhiX{WRILtTflNlcLDa9uQejitF$sbW8*dM(n9TkxJ82BR%_JoC-YxE>-Tqx`SsF}oRkkFzy2~7D*rslE9{iS$t zlY2lS(?IOF)_bz5NDohs;IRpe3EfL&oVEpa^KT=wVP%&}`Cuz9QHt=w50|xaSWo%cD!A(G7zN64;i!Uos_~y^ z*$LDM8Z}ZPVW*XiiOxKRVU`~i2-&yl+mpbo4$|?H$FgpXB*U6C?Qpw;k1`n|lvJ2Y zg=k)U{A9wNTvx1p-6uRw`T%3wHc`}J=u}%HqIhm=EIYZNekvGK+L~mRF5cUp5qLoX zAIsvoTFY~W_7o%)l^?%)P&|Xs?TNV19bkLh@r;v~*enU=Iv>=>MD6FjV+4k|6`H5# zL#n-V6y8_V<1*81`K+4s6WY>}DI%%eW?7!9SAfldIkK3j(&liItTQx7BjCt0k1S5z zmQ#lW_k^zA>iKS3@DFw%S8eLN|R|Ns%oXdz!W`t_JTedk>2nW`L z|B95fZCTys2R>^_vMsZ`Tv45pvAJu|bO&pJ)dwBFX8kR8GQ#m+NeNd`j=xF~C~Fkf;Kh zCU>jU(srE(5}NbqqKe-|JT1A;4|&cq3`?U4AMT?AB1*LS^r!6tsr-y)cPI_X&x0d^ z(cn=P9He(=oO%tJejF3}R75?vl5&k~j&K!_P*ElfmvdSzSB{?_L3A`s;JwFN9;c@M z!a;{5mwMiVb4vcgN}k3-ShQI{hb!Sw$%_|R?f2Cj+)^TrJ8M(Fdi2uMMv0cAeDa&p z=}}>aDP`vu%JCiLL6DMQI2#jwqF3ngsNFBI9hSW2ngqQQ-yO-3gzm|uu03J9r_bD| z+G0TCBy3Gn)&EAA03nW7Z~McrG7i@5o_!e?72lL7r3pZM_xxKvdId zz#gYs1tPx%ntj^fdN2gffmXGQ4t?v9xm1{1@ugAhF}+~iXTUQN&Lo0ETP6Lgr@y8g zDp`Y=@Z5at%yQvx2gDy-?n>nz^ zD<@R^#xgtRl5oP@pmOU1(#vVpGCOgKpzl@6X{QaH0Eo)Kf*A9JD_D!`f- z&^dwQvy@+vGlEkH#ui*oV85G?MHQ$*9!!PhwV`s!{ z-~B2T)Y^7vmJR~1{7N2h9a-ZI}c{d z{Z#pm6BySz_i+pMJ<4MoynN{F`AwxmAgBmZPrT9R^sWL%+<0C0 z$purx1PNPZjv6PTjYC|q0fxQo0ItSN)>QP;HYy-MV4Q1X^y$ZhZ=)nBzv@NKYwtL# z8DejIY7tY$a=qTqb>Yrc2Bgy2y85PJ0M#uD*w63zG4r0^gjz7bLHM|s?hZhwq5$$Y z`X5>OxmA5unsnVw_7}`XLH*#`{7Jsf12iG7s}Z+-=&eXXN6|m+oF4KC5V>Mdpi&%} zt;A4F%K<&P-P=>CO4a`_?!GcC>+M;akPfA!QyL!Xfrkbu5hbO&ySux)q!9!urAxZI zyGtZRz@QXF-yg`{y8maNeb|TVIv?II;)Af9S!>p;wPx;nMqLG=)LnKHp|YUrWN5h! z`n>^3Jv5Z76gm?AtB>yNyO~Y>G7oVkQ59K|P0<xQ#ma!x z>!R9s2J)iwoV*RUVvXa;7O0i(e2t}<%^}}Cul0@M!=P+oV$-Pki)ght1fl$5lN_!n z*wIKt3r}R$P*F2IyyffyI_Vqccp-3)hI%D0>(TqFnsunooI zS%uJXMFNqJ?^GEI38xknpYTSlhojNF_jQxLn>7UY$X@U(@sY+o6mpn;2|;D^z7nL9 z;K5OItg6(}s+|(nr*FB@zCzx>*70u=(&a@-qJOHFHhxSuONxNHYt1DFrCH{L8Am7S zcspWNHZ>)^1KSBIEPpFr@8SJOhwdZnQ36yp1bk2Ax0Za-HX8o0y4>gm-{8h6YRn_1 z3%TEK$t$`7oO*~5wmW#=t!gUv9RFm_kqucKhL8A}fzR|V)QHQga8;XmTW$vq*V5Sp zlFxmMLNC|b3$2#9o;}8Tr5D?Q=qLDmJHmMkmCrc24C_;LL1nsUfuB?T%*XY6gML1$S0Ln5OM#}AVC zI|&cxAE>jNQ;D{!5&U?H_VzYfEiL(8?(`dL>DL2OeCn9G^)l*j+)Xqlf^Dozrt6T0 z=gQ=#eZV<&Rw^zWT1MYuhBnUdw%c;=kXe34ucFH7ZwaUiDkR38FzaFuTz_cflkav? zK2eE+Dl{J4WvM|x&xaY;+VaNA`#O4p#>~e+GJCJ-^)al2`MPix7woAXIL!8zc-d{MNmUWIljCG;&snw)1mr>=R6Y3; z)*ms-?#*YM`xu(!z`O%6Vg~K&Z|wSH^J{r!=_Cn<%QEfGg&z=#JODS{Su5Y}i=ZC! z6#YRS0&xyK80<(kwIM^ENX z9X0#GSx(h!A&HfBUgZ_x%^o}O<<@FQL8Bca#%5)Ce3os@LfA>}^Z9ZIu&ll6cYEk3R?ug)h^P=u_g;5jtHR z)3U>uQn_QgQpu#aBXUW4aieUs=)t$#6Z<{~Q`3`zndpfKd+DP{$Fj^l3Q00}f>x_D zq9x1bTDq*G(KT+lN${CAdZzGSodxmYx=YH%?-Xxkv88If52D;G z>a`%^6f$}r_cVZF%(xp$c+4R*WKfqgQrMT-F3R*(yY8$h-*U3?>ndz{119x;jh23pfFx7w%5*i`J+x>3Qw?X@g8!irHM88 zL|eT+Ox}B(GpqBI{#G^^y~i3RKdqOugFm2^1oU(gjfj6dccxqFL!bV{TYPJtO7ZY} zLq>0cXyBJ!!|%mK2l`qDBb%ZtRuooKbcIJRMN&Wbpw|CT`0RMeq&|LN_Ys}!FhK3@ zUwl%DqO|2uUwOB>ENre)2sW%F`JSpWBKs799#OG{hs<6g1$9trs5Jz=Wcr=+YnCsZ zCTANJ;h?>&=-w&j#l?-zs!jC&4t?2HjkkuRjJQo#X2y zVc_MIpd3i=(9D>9ScmZ@mIg@d^zG5Yp@&f5%0`{>U<35)DPw_Dr)+?0akU9GT zfLpGLO$u7*$0n0CuRL{Bkx`5F=JrBdOF&i)2 zcog2`VUGA^4L31Ccl2qabB=M~8~oDUecJo?iVEfTmTyBVqPZF0`tTO(RMgahwi+r+ zHzhC8bU*T}S<G4;?Ba z*%6aVu}*s{3Xj_PmPjI9-5c=ayOUVCUc0+=b9`@oV1*SQD=8kB$&)un4;2+LdjL0B zuhn=@dI43$xdasqOAkTHfE;34wN8{Q60FQ!pD*`SMCKRnk%v&=b(%c$d%uE`$!Obf)%-t%(x|gMhV`WxRGI_59O~fAheQ4^4cVzV4 zt`%LsV};I@NI!s{OShOS4n;IDW^RFEhq**#BU!nr7C2r_jU|1%*n^HNbgU+rkYRa% z*OlJEV@gtw^aNdiABJlV8Y>N%qTl%-8p~BxS@ad}vAHu*WiM$~t>--P%55HeVxI9k zle)W`JYS)G5ky`#j9`Ch5TntLb2ojD zdy462Ba3-4mX<68h3hHpj{LeDez6wmYu&QZpAmc-QRXM5L|5V8eksBD;76iP)f;Y$ zV0h?hQn5|{G3%Toq>mbH|s(-w2#F@0xVY}A}SPKoaud@_DSbD$r@uv57CSQ zuI_XHXImT0dH2{Oh_WyG_MMMXKW)mQ|LQTC9N z4K-NN12vChnjq_;w#dbIi3&}6bVz8~wIjJ6Ny#OE6_PFNwc^)vI( z=0ZF&k;;Wdtss(S!ei#{N`#)ZJkN&_()>WRkoe7SavcpTD2qiSdrt`;KaJ67$^6W< zL2I}i!L=fVrT_S-tGV2qH5e_N%$p?j6xoY^xQE(2A+6p|T@)tOXtvQfUTZ%BAz^=8 z42DI|K!#Iyb3JS}F9g$Fy!Fjaf9Yb(Dz#r2Q>EnV}D>kLhEyA1GJU90nBhC zymN2)IBz+SI13Izt%2|b6Pyt6h^%s|+69}Ejy>4DjA9{w;K z#7TPmSsn^0Pt2;@h?LAKwXXgNlHW_BjOw9pGq1^6&AWs&rVW`c^ z%Hlb7lVw_?SKNO|G%gC=?4?}sV{{jCCt%STq1gPC%%{)x;X?`o=9b*d+5`<#Xc(at z**N`O9(E_5Tury4L4wwKa)GBoWN}5ked+8R`et^0dKsq2HsTrwKE0Fc9PR<#`?N+w zbX-x)vHU}=eKBjt zSUhR5G`M2CVsWpU)zXR+X>zF0xfNScQ7rnfK7Ggrfnd6iiT(Chx*(KQi&H$N0QD>`KWYVPG~c8Vi_AQeo!A00 z-OSa)+zhkvVAbdXUQal!1I9c2;nMp^{%DyNSR<;u;T)9M&FZgj%~0@=!7QCl^r+Po zfuLZSkduhnFwraRg-M>ftLM?jVSJJ zNIH*pepIGdqnorwr@!-Az_&lcE!qAkz-3Xg;dT7$83gW;60^s+o!hXA(pZjSigyvtIE(^NHXA`I@N3Hn?k0?125h!? zho^9u9tNXS9p@W}BbnuZ(<1V|vVh9gTiNGeJ#Q<_UC8X znct5{Gk%22`iVq^;^s}zHIOk5DJ{`?Jzw8}`bnTLIE zn7hM9fW)?=|Gmvk(OSbCkFVvipQ_`+*K=Eit)nAKZ6-j}!f$8_ZOt*GpA?}rnjaPJ zaK9G+tVvyN{sPyFcX^t~ag%wHB_*arRY2q^kqpKGO>#G&B!>umr*l)fovbk$!K_cNtB_CRYy}gXC zE%4F1LSZbac&d@t!n`S2T@~pYzfZ(~0yZZ7lu9j9B{!3@6U#;=oOe3H0M2lG?66Mk zYSD|YMPg8;oJSPs^<2$bEE~Vj{LR`gGT0XbjzAHGHbUt z==VMqBao(^sA3fkDayG{6}mYZtp?`UJyum{XEUkZj*gH04G;L0&qZ` zAlRx=>MG{D&!nr+S92Sj-lm4)E*fOJ+t%&U7&pJ--BQprv$NrokX!N<1sM+~@T_&> zp2qkOvuaMRTUMAFjGc0tfZD>tq_rMHO5&eOm`McUPSy@c zaTA^lt{Xm!S9Q^`6a2`SwwV~nG{E&v>fS4O>eSi%q|-A;&WQ{kG4CV^-vKbnd}r3w z{$P>(zRd(iJ$n$#yRK8;CH}LVT4M}1EI0SN)!MbB)frw~FEerH?imVcqPfyY%ydqo zZa^Wr7!#b5!_pu+@01Uj;%FYenS2Yaxe>46Kw)k*|5D;%U17tV-R!zEweq{goqeyc zotR`#nF79m9Z9JybhBu*#rU1U9mI%tm0XW{+r7<^`NPg{E!7#Z((An+9;8Uk2-x4D z6);<8IZQ{d?03)EvD@uuN;6JgOQV63j_6C6eKJ#$1~hgHn;K6rgA{@#S|=?eZ8;^X z%Y%}pEoWxNSA9L_&UQR2NsZk2P>EkhJDYf)6Vh3<{ z*VtD;XjPg?D05V$q2tzZ7Fw8dfay7Vz)#-=pC=ka8mV$`7g$h3tkMq{00H8{h$?HFme!#chEUa5!%zsKTbsyHO{ zU8-2^+&#Kfsvu6b=Y^(sxtEza?8(p$&L||FIT25QW!%3*QEp^9?xpx8a)3%DNU$S6 zLc4)uRX=r>^mS#vBrUgP?1o-n5qBOkWk7^i7QP>)EYje_dbB%dYs=xjTvijzuY{h> zFcs9AAHj(ZHs)OB_b)p#kclFA`!#L3o>8q*1s;)U@uehn!-GKn7P|O3*rQzVo~ZP3 zB4=k?MGvMq6U~DteKDFnTZe$X`NMScnjaMk59yB?7}NR~GI1U_O*UnOW_o)+N!hC85$`JaA;+%I$t$4f9aoAbvFTM2lx5Nxtbyu;P9pJ@^!9f{boor=otwdZ#U$FL zQ=C1T<=Q{ywG9k>z8NiVtY+HO5mzHc^*C}P3ZL|wp8Bi z(-3L2eVroe7d}!iK~l(8rS->;4)zlRAK7B#8NZ&>C4seFzaHwjHMniBSk1hzidrxn zGL|u3Hm&UcblSX>5$?KcD%(7lkhJFl{@zoVUcyf6wkqBeIJqTA^h3n8^MkbjdKW4D z^F$fc_e;1Vq%9uhvRvh<&f0w5K-FUdw*QK?C{QT0X)BU<{pALNr znu$ghm>a)-*$DsI8Q5{goFVA-RZrh}Gq-fb{rvE-`p*0Inc>W4kG%xu=Ck?t`8}}b zf~9oF}iU#D0q5(7w`1$Ww zln=-izab%kwhh;ULf#yX%?1Hrv^F*trT~go-_F&>!5Uy~*qFFp55LLD$_{|7 z{~|dXzCy>H#(b%)7lQ!1K8Vi1rr_8v;-b{))qfa9tP0eCe}pu8cJ+>)&Gd zK^D4tSGrtMQm*y{zymTew6g!lE(*Wt2j=)s{n$CLiPFCG#W&Iqu(1oi!bSgwzw#3< zbi3Xrfv~XrzC$3a*P^dn9v?Rpotp(@Vrpyx0`UEp3IJI7UqEeLJAD&V2Sa@apr6I{ z6afeq|FPRSxB!~VwYJUWDR@(LSV4xCdWHrDfUmk@DgelT2UAN^x68Hp2Q7Y?69)&d z(SK(xa6mY&xAP$v$KuUY00Yzudut;HXI(o(U>7(UT3FjyUNDR9P{BA>lKK7=@R{yXFznynL&!@{x{mTJ!uy9{@Q(ucH z^#`%*Z%If1oAWm%taL2^zkAKeX9wG@RRZPuNHs<;Isb4h%UM_U2`wr{N!c_7T}Tv1~M_!wQw-`snsyO#?UpOsuQ{3hy;hcY9L%}&YuFkGMM7J@q{&%-kFbBZV z{fo_jAwV~`YkAJg*Vj!ofc!drolNb41-PEG1Ow#KzlsgG&Fe}18&~ST=al}VtK?w4 z;%kEbpmT$CEsU-0OdU+FNfcz`{Lc$28~1fDsF#o2n@u}}g%zZ0=U{3CP@@5Z2fU7< zg@viHA>cT#H~j#U_&;_m8(>J+qX`1$cGEipz?cQ;nt}`+OfDV@7tC&ZYk=hK@J}1| z*L8=D4WQWlqG+;#uf?&uj3wM~+JXK0CqMII((QoT|DWg9g&LR7&YzCxnm!+BzWBTI z0jR#$x%6<}{Osjq=lrFNrLM*0{Z02@-5XeeYvx~_&qY;(YdW8sAGkn70c7H6scZGi z1zj$R?j;HPdK-b2{em|BoA+nEpfO)-32yvoh5$`Bf8H4W;En5B8(Wz=m^uNMAz(XP zdpENJg)#nv^m|EUzK$A~A+#H93r;rR`fPAf+{0AQ(cvQI@&|kTdP{J@yZ&`&1}@as z68j?JcSEtcSbjxX{>^j)g;M@%^;{Pbqiach5ud!7)a;xrAWLgKQwu|oqn;^H&%wdk z5s0NXh$zqd<#Tq?mIQbeE`x!QFQ9=&#gz1O&qp?ya=cERkh9+M9mF3|gXpy515k+V? zH1PrN?}*>-899GDtLgB*O&vsC{bMN9hSB@`=Y#U|o)0a=UZ-=U-e)UW>om{r&ED@> z`QiHI=;J^Ryv&AoNk|z?b5ri%50e(i($^-Z#yHQuFy ztRrHgANqF8<$JX2^v8WZ!}X>2XRG<8f$UNwTg^Y*e7pk4o__E(eElGaPOSUO`9jt@ zxBiQxR;lJ6YhP&0iO;`&`3@iu)?sdmYY3&SE<`YYNJ^uy*7(fbbCd_r^dI=YVF@ay zLwxcej?II4kr{10=37YJmQ_6zR}MRcRhj{O{dv!=6-GYx!aK0Bn2UFG%0al1BY4H| zt1i3&ax}!MSYN~GN*^0*r_qm*ndA4HnxL$tq8hW=L)7uW71AMil8DQ1>ru1BLgw@| zrCFn-vY>8xnX>iX$=VPg0#k0o6y!KTQOBYoBUiIf!XgTYDj=RK3Lh3qLr5bHr|H}j z^AcMmivuH+pV^Fk4zWpHc6x#fr}>yJIb!{rn>^dw@rix~>`T$4R836i&J=Q?8T-u5alY&x;R-8O+XY z@q3CEx5F*0f>g2tcJt1GzO$uaK1=)Me5KlB&*ms$$FwrJHBOu@y*+B;e^J5 z&fpqX?cHAF+;>YOt{clIAR@o-2bRErFX2}`0$Y)?BrAGdgI9)LC>v(st9Cm(OFR*a?9(Bi@~p5_K^ghSJVEMQm~ zlhE(;W(>0*k1$9+MZhS8JL8bWId4n2bPqSVg73pt%LeB#b)J0|Uc%cUcMaVBiP;As z&vagUXqoy?m8_=fO;*e8fIbIrwk>SY?FH6|5pEuYqIKZZAl}KOE}9PL%13I5L_(>W z3NTb66DWG)3X9dP5oVQ}LOSWEtBezkP4d(>Bdb~`QqPo8MeX2Q*8Sr)j~^i%ymT?U z_B^UD*eBRts!ci`^r0U_i@Z#q^st*2oLNf*FYipRA@A@AL?&z32?iTRE`BXgsa>&@ zD49#3-#an+m$+Nyt3~v}G+?Q*KQld)@ zp>q>!9NbjlNK+-n!Ds)g@j%3LAfd+4iYc@(q}-iXRCo z>F0@v1~ai@^$p(FACQVOH95Q zj#*T4mz2%-Ex9nfn@HYE5c5l!v$9cE+k-y3y@uvyZmu-nluPr{Y!Q2PR5-joN|AVz zH24YMfx^K{v{o0LN5w4SGIS3#`|_a=80a?qkVKui5ISyK={=FuEAdfwA1qj7?@pDd zyuDveGsG|f;V)EQOz1=>wFGsGtFKOe#UojKSx7p>JWyq3qg-Kj|NNj};B=J^CjGAK zGtUI&l!N%Gh1)F-1q`N3dR`kw?!xg3sdnIeOZI8Y18C7w&BZTna#5TRJS298%!XnR z55*dB!Sv*7Coyi}x0Mg#HHAz;GwN{ucNm7}8n%emFh{1K_23-$B-~HlZQ>n0kVmoZ zF|FdTNA3KWu0Pq9k)*oxwuI6t`jmz(os;tQ{^y|l)kaRPLriTuie*?I^b>^hd9Pp#)mG3uAZ>(aaYXQ7ki3z8{fP0JQExx7(h9;5D+6HW!jWL&ldob=n?<4fZ^N#Qt%J4<+*-uB+FkSq zbR&XaE9f#!Cc++iV(%%fQ@A4(3E`YKt$oe!b{=*PaXgO7hyAp_{PwM=K&?i(Bhk0w z(!?(&g@FubC`rR`B-u&znY7P{@= z;gVDdgB&N*mxgCbay*Rzgwg^jq9h;6HCE@Ks6Wz2OC7enCaI=7Q3Wjw+F?S^y-Zxqn-w!bs1B?qJGovSY#|ut5In_9qRIo_ zj{yT-+^QW4U)R$ezW;FNlQLrP8Kyh6Y>Ay2+{7d-13eE@Zhfr2ZhkT`lTL=k@!UYk zj|Rkwl*9}+aXGTUfrV0^Sr67Sp5K@{U6ZLuzO@Fx!lD`v_T zSpUF{SAvSOk09dTV8=N6`f=U>u|%DUDO@*$d}3mt$IfM_uApU*#BPggKBA~! z`>GtJ|M~3-9WwKF2&ahn{h;77>ahNvs4{#CHNNt|aSJij-Wc)lI8E%?0Qd3qFDebv zE={293Z&w9=yLqM%@GFQHb#TZ1cj;l-lEs$r{eP++}{)N0rlghaVmK68fbg{IQuxm z+a&L0v2@~FRD7qS=Ov?i^TFAzaC=kPIHRo@u^Jem?KESd`nHdI_sgZa;wMvF8k&(D zDjj&6tz|^s^J@<)$?QJU233u!`fC_JqYABgkHWVjzTC_ipV<$#sZS6mJIGL0Gw*HO zI`26$SU%aDcYD3-zVQynV(!zcM`-HDjeR8QVJI|Sy?`5$^s3a$|%+D##VKHZauMqg{66KjP!;0tIT{UtJ z33;!>D#{M_*5$hwd!eMJV*0Ak5}vH(A3VX(h|fs7{9AIA;uis;%(N^%}=Ct{{ND8zDphaf!ir6+67 z0nE3$k^W=8aKV%0+Wqw%ZfX%TZN}PMy^Al^s#pQRlO=fVuFwIjD7INytkukSO<&H& z%;PZB9S#=m}7O@Cxt)6ivMR43u{K`Sl9$1C&tw`S}V! z#C-)I0%8k4zkf9zPz3Vl=bz&Nxy#GXV3wcbfmwcz2WI&>9+>6lcwm;F zIUX3On|d)G7^p^i`IYr*Jl4zceghzZfx@4_PyGK{!d1{loMobW$kQXXkcszx=3jP@!-D?(gX3DKLdULV|l{gQp`8OCUISu z>Pim_*YP+Uore^LzONa!A-T`{!eVu&t&IiBH|hm@Za>{ z01Bc0o{NBR0x*W_L;^1z*$wqzX9Zd60)Q7QLy(1`uALQ7?eZUH|2H#&0QGVI8vg?W ziRWvHee^}?K0N=%XT0DVDEaFEAE?zUm@&ZAT@4i z^Dk$d14zpLHA2t9bx~^cT62EmgeND29r9mH1q2l1Hn_IQZ~!HCe+w9Ma9k@&&wXQf z5hnyl@>uBtfG!}@TkpH`=K`tD>@ST}J7F zz&%hk+`+`q+RpXT;n>(+)rU-$VxrxnHDBe#y>$QBeANTj0j&&MV>nOTO)*&M|;ewa|6` z2iN(V5^UiAR04ox1AHY{iK!9wUu_;ib{tuwhMOp8E%$@&I;1cWdYYDE2b>Y5o zuJcNCPLQ#MwH_cj01&h@w6Qa^GIX@FH!-!j*6f3U^47oE4;XSCMETD<{!KQpA%Mze z`xDz`qyG=GvI0mbPF4Eq3>(4jT&4jzNw=)CYk5{$cok zf|&pL-U(r1VS#{wI_i)MRN7^gZw{c6J@9D!iQ~D3|NQwPyqQ)IPGCtatqlwe4V(!8`tE-^*Z#CIHtVes4qDH*D8PiODEtB{hQeVV4rJg^LsGi-!m@&+=wm+ z!VcUuF1O5|d*yOzt|dQkF0gtKO@#zSr_IN)UU zbX@`9DFErQcK|Sv_Wz^5`Xx62Aium`{1P2NkYDR${u#x&sq`EGCJ!(pJL_Mb_Rr1! zk0-{TDggNLi@p3y0RTRJJ&${{nSeO~{S+?Ide?x< z{HYeuh~v^n{izqwP2^fHAE39#jY1YzdO^5>7aMTN1KjGRL0y+$!3xl)t~LeGqUyJG zfm{b4489BjUK!Q@6;|eFl=136{RgZJCnwimurkC8Q4BSEOWLbjFp8p~_0VFzOJdR) z6HKGGP2!=%WPI~}+N}!*s#UxA@Ns*7E zj)en`)0X_|UW~%ws{G=8|S7VV!HdmOMN- z_4=|(nAMkYT5xhc1B?1JDy9V?wSXykUH{{|FW=8&&LYNz)SuI>{ILBNKi&NUfXR%A zJXz+l>7IbCM_+LK_QlJS-Z~)^k}I2utR*djirl7SGocVui$3C53tgKjLmO;Dldhh< z%77S*M-%a09!y?;rXRG@$w+VqM{Ub-5xs3!W0~PY(S(xEYU^sa7=O5~0nZ^P#_WTM zsBHr(ywh&UuI%AnS!2d=g~O?lz&a>o#ybp!!jX##=*j4)Y|R!v0G@8#>9cQeqn zRC4HV%r*{WYN3*9TV!}*V61V-Oy}nh-(bS0lj=?_-BRL?AQ_cn6ksJDPUmT~s%t*nZ-e9{b)NPT5>0x~kVj|V>yC%*rv5o|=; z>V$n?65M@fI0{n`fsOdIxVMtG*-mevy!$oQBS_*_uG*aF1J`pEbsa9mWD+?c!t7}l zQ(7@9s1VC)8!48L25FHN2YY>x8r`&Mfw|4K*-drAgS!ep)p@ZO();V zXgtyqk+Sy*hxxIPNUQel%uf{F4w06Np9574M<01OC6rSP1GRg-l!paoupCh@`dF*e zkPnFvGnddM$GS)3m>_QVDbc`?>&j4aW#S}Lq;%Oz!&h|>v9g;RW~ zaUv=Q3jt-3!2vAm45e_Qz8y-$cO)6CBD7CyOY;-A)Q$bRCb3o~;N1hzx`*24bZDk2 z*xTw$J*Wu>P4d^Nle26W*oI53{l8MEI=UpK=wMA--(#@G4lr0GMvVv&Z6yzGUYu%v z!;^CyNIo#8s&-B+$x_vifT>crU#hLX2Ui<_?gJZ*UJuFs646SQosl}xw_UbXKwh%YqYv07Ufgf;CUk@ymGFN<$V~B;JT`Y!oq0ARs4Q+f9#{5z zi7pjJRkMF|FF{3tWXx>GH~fXYkE-HBa^gsY^*`QKQbuB)Dvk+~o*!x!JjnUT(P>5y zF4I*YW|Ci_H>s;xfbYoFA_aPsfl34wTcpl#NKSuSV!_kTV~4gG{TZy-BXzdu2+&}d zILy7a(H$3tVw{-QHS`Wnoa8!1ig?AHV}m_UDi#8oPf}c>c?du0Bh)-6oHfNRVTa#% znD({(a}I?ZYeOfc+sHO-n)*@G?Fda{V)zR5J_8gOZvEhn`>6NU9YX1)UD?)$r;OSc z@axu{R`Ju+_uoX#ETRb_TDRBB+C_7qSiYc=j1n8; zt~7N{?S80a6+u?FI=lFY!NDY`>1f$_{`PzSVO+u^39bBRAS-n?bC@bw?zr1;%%t6q zD*~H1-Y~1z@+K^oXn3tf^k{26D|4pbn*m$d)`oxitO`YwWcI}^kb5=pLwyKeDE6ol z$;{(%7&EOp^t-ToNjlcq)drBYZ2&o^ifY%^+SJR$NUb4wD<>^H0M;FOyMUTl!w~>x zA@jJr*C2M@Rf}yV z6Pmlqgw9f6aLd2>=2ui}t(4f)^_f*F4k;id8I)aeSTo$o5!_xRZ9l##rZj(@;)0 zO8Zo8FHljgm#t|K?gCgpyx0A_!d!|OxMGYa2Ir8KO@$6P5rmJ)`fw!&ZOT@$L}w*J z(-pnSV`>z{5YZRrpQll4uuwkWLCgt<2sa7j4c+0LD%OQ_JCp8i+&>tD4WJfv4lcvc zuk13RbhW-+zMjtZM)c%Fqe{(N3z@jk_lU=Nw z3E7dN{G5;Jq(K{VtmaSal%A>3M#QMG3QuMAfj{m^K3QhemC8I8FK-q&CMnEpvnar?&FUthk^-{$$smmo%SXdaUXH{-Ru+J z*0vbBMpZZ%SpoMqg`Yqq+d4_h2NJ=K-AkW_wnl>H$4TVgllH? zE(y%~8hKx|M}S+hOW09SHN&kwyb~QyTlXY*YuE8bkDopK8hDLEQJ~KJ|y8 zkXYPJd-Aaey&ndVGD5nY2J=9gfGWB%4sEy?FZX@Fvh-cb?D&(U0|H~-H|8ksV%{iH zQ}y}f90_A#!t!>_2}&M4h_{As%5i8tPhpC)B_Rvqok0P)zvs*7!cfp_*Bp(05;#Xl zeT-wWP}shA9Gio!g)t`g@iYJQiRcJ-;N!*QwGP*eFWc;p;CTDlauV`s(r#^m8X7zf z?d$_9QB~+MmsgT+oQ6n?4ZOJFSn<{Ubvhh01n8e*=1C#1(65+F+utjWEvR{|(sPH9 zwD*a`K*=7gEnj==0Y|S{pVm|@Ud5VZ3Auy4k07o?Z}8{E)a2!urGb1icJaDh(%`wr zN~$d3A*%Zi&!q*I{O4%s4?4tbUG$@~TH{D{Sy+DjNDKpAu3rSgzj zua(IRzEf;PC$)Wc5@RhMbboj1VRpWgJE#qZjdE}P%(FMkEny&SbA-CiC(sBJNE={MpHVO+(r&Ydz1J~Zf7P+Xtx`PPJdx@a581e90#ALn4V}oQW8DW!LBPR#P4zud?f1at&$x;NwG04y z2)Mz=F`dK(8?Vf`-5s5(jKi-#o#u8qYv%nxq ze-pb~O3+1U>^U5b^kqp-U^@k*$s!-8I`Gux3a@QAsu^Cd1L^x3Jw$Pny!`cJ+~X5^;CmmuWvX zba%5=FR<9GSt~7YhXbMCo;n*zt?*{k)I_vsyhsNH!0{zaBAOmcjY{1 z!e{t2xN_PnIZ((f<93?bnJy*M$k{vn73g{G!}Sr7q=_WWL)YyvH8fEdh>pcxFus4F zuKatJLB}t30S0EoL0!)iA3swQkLbi_dXTO*o`BLzpnj%{_>#o}_{TuZS$T88LHy!G zLhfqx4v*~yrl82;jxvY3`fsj_Ybwbmzz@O66F^=ccldR;m%Vhv+k9M@rWUOGlKtJ} z{O$1WyD==lFD`CO1F|SH`tnyFcVK?G{K24HsT4I{_|Jm3BN3_oE4T;@q{e=s9e#p~ zz^qqb9@Z-`59<|}hxH1~!+Hhg0fP6JU>>$BFb~@mI0&E}{`~$WIOun95749Y|7UOy z+uwnEeop5Nqh^`BhrpK>@xNEa z(%1n6G^1wyGcRYUYiDkF(S7tEg=S}B1%hrDjjg#Z@fbj^g$vBV!3H6NT!aFz6ZXC| z;s3qhHja8WAfN;IMOyT4%EA26d-)%=U}a)ufv^M2FbGg=;WE$%X5!)oa{zk+NO)W~ z(s!){?@by7vjXv9ZWdO6Oa}BgzlapGaj-G5a&iH*V0NH<%Jl-pmmcEU)BQIMuI(Hx z4DFe@|EYO3D^LlD1^5Gi6asC|FJ_bt$QyF80L{b6z}KJ9e-#q`ZzYBNqoe?g2n+^u z0-#A&pghyXoN`|*IOKxS$$j16`=yt?_MHB08~F?4W&Wc_`$gu!>VE*XfPwN9>|EUJ zKz`$=;2c0xd3H7y4j}(=eZl_~7V2*W*LSo7Qs4lE+`-WR`1-TG{6E%^V!zBK0iD?a z)Y&DTf`b*z1ORh@-Np*OCY%C%d5~Ru%KuyA;P@xw0E$ce!msA!zmJ@A0V%z|M9wuAqKJTQxF1Tlx8Md1V^FoAI$9rA&Kobl9K$x^ zwti%M^XUg{RKY7HM`uOs+wm!LigD~H#q|{o@qLdqWYV7-Gygb8>C?^)-1>34_s%<0 zW3?ln`3E!Uc;)vKQg1JT?`tRCeCMA=K7A$qagsB`uwnc;J=6Qg!o*7E_wyxUz3Cr) z{2GRC0zarY-B0?ymb~mwlK9T_-DP4;@F@P_iU7HcwZJ${l8r~+cd2#FH^$WGLSAdk z-Y(y_8rl-FTVm0f_dSL;=ET0(?Lc+>-sgJ~rEpu}(Uj5OPG`2fj|4ov*KC#kILFrflr{Ba9li&Jm6Sf; z)nm2NmVB}!P|&l9zjjgMd5q!1rM9vB4&v~~*iT|Nj+Riy>SMIwPrRIoaDC#Ld;~q{ z54^thY&f_l9m%*JJm_n9N_R_@wuJ42RNkjA4~7hfSG0P(d4@RhQ|UgrJ{nksX%G%f zi(X-};nL`h@pTgf}1y7_eUY`e$-^hZahu^jjJywy~4t26k95Zh+s#= zeLC%)WzabKwywD%BQto*=p|QO;~T-ud{vrMGd_lXl>vLn;U{ql4D>l^Sx$Zr-_3SD z+%A0fFds})C_Bh2U8MEzGjAUpu76V^xV0>7!PM1EckY)*vK3 zy#>2N6*}<6ZoG0xT?mVtAw0Iig1mVy`F!)z^pY}D&cs+Rm2$btvbIahOcYAC`(C$M z`tkgL9p9i8*4`VS6`X?fj#KsdgOXEvVHlSUlexsHkF1=+lictpq>mf3}m zxbI=qad)OHT{P${2s36(=N>RhD9IODwqo^8W4CbJDW<936+RkleNj-v-<5>>4cBB6 z`)Dn_9UUw>7^S-YK6tl%Lw?e4AREtV>|Wk|G&4EMOcFEa(56j=ubv+l-;G(6cLvWp z$;lX*;d3$4;Yah#4JYAZLhNI^^h`+R9K#*w6RbroY^30oAH!Hg97T6>K09U_eeh04 zpL{<~mkZijA5?P=IW&4u985!|b5|x`j@{Xm>ghqnvv%kyx$NGJcB-ZdepbSIYTQm+ zN*#wjocrHVn31wVT`h(-IoxWVGY;=C8Ot^>J@w8RMfm-2KOJ$RzS&n(^&MwODH<~TP0X(9FhBkrApEa}#L z-R@GCZPzT@wr$(CZQHhOyQ<5!y3}Q>%RcpeYn{0J-n-6Z!Ed>`uT4(~i$7lxx19b;)SIJ0Jf z7nG3=o*i)xtVon*FtWjZs1<0j4NVT_fDlfQb{lS8iJn=OHtd(Xp;*lu;U&w{A(eiE z|2z4S=v=;t3^~5u@1faXb&tTEQ)L?=G}JIolO0b7XuB~k(Vv8`LwJFSwHWJ|O+C<% z)}kgU;wj7IbW{h_4t`eyOl4HT7yhs#!vc2wY4Tj*7Bu_`#+E>l{So;HCEsexLhD)W z$0{=CZ;$ahttlP?mV)GOK+J|R4ZfDqqaVymYi(hz419;|+*dy>VWq4UkD&(r>9@DI z*d8QZ08fO&>Y~RkFh*C}57qE>AEa7$e(ILBz3$+=`U5d*%O3eO;YrfVh5GJm# zH>{>f&Xw2`u)nL))Go!uIL1U2)6k^UV8HLmmWt!xtu{^6(u%;$Wxx|$U8oh{YdgS* z4jRAJ8Ig=tEqDmj=w7~l=PgvaGBugz@jRr*Wl{1}|JezvU6-|uxdiprBMhKSi}m9F zL#!#>&A=>L>?VZG{YUF)qX{q!Y%=h%GqW*BTeHXl8>o8|5fGbM>U=p!+VzavJRY=| z;a~Wa&EXzCNK_WJYMQx5oD><^18^C0ImtWJCW{&kziCTouN?_oNZcue7vA5GN&?GQ*Ks4OdTkWGLBp(_P3WUnR^d0?BEj zO6%?-MF0J#@z&LRYryX)C@t+@KPT1uI$C z69p;<|5}WQIbS{curY)N9r{snGK-G0NP4pa%Ds0?QM?8HJIWV|00@J2T1l~4c~ z<{(`xeS$a9;a){TRU`N|SB?fz63Y}I=6GGuaQA4!aqH`Swg4CO8}J$#vZ-f{Jt>so z07e5HI##BZ9D1Wv3E`?Glo=&c`{hdb6aTbY=zg%5*uB+$3XtbE5}eH(iGDC5MwU~e zNceIBC3F*#DI-F`3o6YC)l@}30k6HE2gm~$a;SUGj;!BT8NxI7&{(vX5-omOf^QI> zY}^P1T`+2>+(XL!0wDAz#c50WpSk;p20U^Rz5A=fuG2HSO z39FhjZ{smY3ZdXTu|LYP=Fh{YK3UhUhw z*$@4pdj~E{0WKZmynFsgpQvK;QmXi=hk3e*#{Ih#2_eBU3#I-6AGv%PQbECbx+VLQ zF8}BZqn)xKWcuL`^HnGmvQG=>F{J%u&9e!Qwqc)m{V1bwT{aG{L2wkBDwXgb{37r1 z1SqwZJJQ*F1tP&~`1BNFJ^q1UHTo4TgtA{IDUtJ%FW*38(bQ;6d?1>%e&)l{6PBEJ zYtUq#VtYs;|9Br{VnLrFVLiH)t+g%s)b zmzxhAL>wb?*0chErdnR85dO#ruXbbx8sZUfU7JvFmFs6A{@ie_pi^Fw6FLJ9xdDpA z7{X;z4TtX_lIZ8*M7+AhWeNtHwKn<5iXr@3e#~`Z*vNZ2%YDTy@IdCkgbm@W0o9zjMS)B z7`$bnF(M5c9KjcQ&eze585^q}Z7i%OgnQTCevjB7*H5 z#pr_h$(lLmz6q z2Cc6oWaiq+fgG{Z?%c1XOT#9u@2r8hM1T4ON)<%K_8~cPq`R>zS8frtCyPNx&mPW< zwz_Z+d)aSbGdQ>`+NHrJ|Klv}IkdVcY`EJp5KssOO{(ab$sV|aczRzAAJiM9$p?Vl zBRR+rUfF}wjT6&=%<4%%?=)tzG`>3&aV$lW&%G8ttY#V1(eRq>ltLR5zQQ898F`kG z!bUUePH=dz4^X2XxsNyZi^}9JF*dMqoh_jmCt_Ox81ws8Ax)fQWB?Eb%`+koFQ?rR zlT0C_02_>ta|f)mIVsg+_P1iW-#d2=&?9~s%BxXv8$i~iKvo|S5!+1e8%2RH4Y3st zSux96jSs}fLw?>v7RrUNXYJ%&hlj-qa zB$ThvD9^NZv6CH`mCj&Mn*CfQ79a z%L0RVM1u^f?-tPueLh8e+6d67F(&0wwH8MS6N5C|!DuyVC?@_xZj(9bq^&q%6b@o7r~;QkL(_}I;pO-Ss~{np$&!fLD1s37;={7R>}-rf?Md+Yv1?{E zL;|aVynQ?*Yl_6PN#9#g%nc;A5cDtDN07|A-K=?Ebg}6LUtK9Hcpl{Yjd16(JFlvN zMYN|`8Q2_gmn#<;$(=zJ-yiC5tMUUL`01HK(3~K9Q)<494tGQ@XV@sTP)LT{m8h(o0(gS z1cafF%lrxtI)Pa~kW9PVX?`$VY1<{tt>LIFj_t4=hni_}APncp!1ualn1!7u&4neK z>@6K-C~FfRqqA0%v5>J=@jY?^`p83iP%Qm;Cg_eMfFU;Z>$#gvadAb zp*e`e{9nl7&Nh$6Vmh(T8;0QfdD@ccKOw1or9Lh%(JQzpn8|z$7MN^>y>ZDc8|S(N z1Pg|w-so9`$q9B6hLq;KAFQS8F0wpFY60U=YvB}j^k`sunb|D7Lqf^C5}rn%ID{5gEDX#Apc~J>_rr_%ri2=*acOe z-Sos}F(Xmn?8ZeanrAl31p?X?oa@%GiK9>mF$f8>0{Dv_Zp8kYD`6IUiW2OQ%K&yB zpb+Bg#5nMwB0?m^2Qr-!8muBUBYjE!Iv0avZ*soBZ$2*0O8N6KG&WnEfa?gWHEp@C zu($>alyf8IYwsW$0s$XEg!rsT~!A3ed)O!RCugh@91{QG0_3<$9F{vPFTH{hL z&D@HjK`NPF5jx};^(9eCd=@1HX!n(i(xulJMxwib!q4)NIA2guxo>N?LkY#PSHT15z6Fq-blj@-Hyd-*mE<8 zWEcY}^?flR(m`73@{Z-?q=dwTZENc(R4_e|T)-zSXd2n0(0pbu(vA&?l}o=U!X$an z821a^dJ$09HzMb=f^+??Wjos(BgC2#W(U4i${7RptAT+l;+bhr(rEVcqYIO8uz1g3tj;j!7z`kyX25zoUGS%~C<>i)08GL57M2PYb2bu?B$-Kx zvdaCGkVMt#W`w|Uwv}dKPmet6k5l^0DqQ7GdF$NLfRhwd$uOwNV##6mP;iv@K(yyz z+r>E$A-^y+-^;FaqqguZ-{mo;zI_-sBK-5Z$TH+Lnf~_~iLziz1$wK~h;#r7C-oc0 zInRZRoY*g&w06Ff=lOhnu zQF?Cj)>-i@^jr}7mtle_IL^rCr+o?#R@~eghc`t3%^c&24-PKab91ndRS%_&+Mj`ch-0gY)B@H#%&>#SP8ogkHP zCaaa+D~~U!A<-Y!krKFp@X8cW=tRjv*mRPXAvzzRh`T3x1eRRS@ZiAnhCr4Ysb|L% zi$#lwmy!t>JQd>t#F{gf^!W`4GS?nQd}!B$42LV3KABv}fG5hWa4XEddCKCB?dJ<@ zy-p_kVSJx|;SWKyO{~h7SAVt;`bB1o`Vu={uZmuwon}Kf5Ci}60%~?C?kHsawwu3y z&I!Yf~8hHFRNK)o^0qW||kN9~B%}{FK;HzvIi2}0Tf3i4yinGb zDgSWf)wACSd;7O3yM#J7W_$?A-L)VI9~Wl8F>yIlAk^nAI#l}XX)UQ$$c5=Eq~MCJ z2!vq%xY+*AVRn|L^)1t0c%N*wlIdu7u!&FVMIDX=ugvwy7b%lUHEQhw_^tC;qc0)lap2LdPu(p@(}uH5bW&!J5a92N z+|lThU$$EYP?&D%l_%llWG|F!9uOSPuW_PnijrJ}n!7LJ0(DCZ4lIS&k_PR6qls;B z`jHO<=@p{J>5_UaZkgxspqU{Sd7-w9SO#XD&v{Bd{>zAAg$0F6Gd|vPgFkSS+JRor zX-%`4eWpQJfaFEa#x(kXWi&`r3U3)Fa99&jkeZJtLsujInb(E>p&kVFDRMSWayu zEfewpo5T$f3AnUD48|OSt%e7>4xLKe2+>)@!9>w)FdGsXYSC>_HB~?0{&E>lGq$ZxdQZbMkaZyPBf=E~ zi+=5q!=qZ$pCU{pTk#g&FB^RFQ6B>@jrVw;T$#8hS? zA`A&xbz9<^qA9-wtllw=`f4g=$HZ~#-l(m6&-P({$;t6a9fC&zqUQ(MxfSbFYd!Z* z9tMSOGbCf!P#EdG44>vG%ZZY@aEmEq!J`22RJ$SL-lLwD5`z_?Ba z3h}BPg-_O;RaT5SKlaEj!v}e+oqLnts7o5prq7e1OI@!6N3~DiD!W{4X)nr1`yr`@ zD|E!GRs$5f07g25z3))^=pR2$5K`Fnvqts>!w@1t(3m}p&as+lA#szRKZqK;Lxmcu z=`_hU_CXqZW2-XGX0&_5YX$7Kj%_0)YcVXs+G zWy&J)zlxxgYN+tL&K)Dyy;Ts{;ySnixBeBw#QbN;lS?7AN>~gdJ`5^v0w=dnSBuzD z)v$X;K&)aYoKC<(LV%O|6!4wBy}e0^BK+PD{kg<162Dx?2%}eYRuIY{f55*NrQBz7 zr@#pR7dXIxu~Gd9Bw-2Rz&|YAUekp?w$|PoQX*Jw-&`pkm2`oQypv5rrA|q#Ot!H< z!hOSGy=3Uh?Ygv8wBstV@b;`J>kLg4#abHfzKkW3LJGo~B$~fc$HjP@nQ;01@#NWo z01X^){YrzQ>yCiNoy3=R=jm8QGZF+Je3v()+E9ZN7qo*b6s7NP79wy}rd0b)2{)gx z`uWs}EF;k{1RZ`*%e7L1t01g?A+H zuE^Mp>1}KBlwvu0!uXUHZrcUNF$}$&OhyWFXu)Ad?kp2M4sx~J1WFb+Z2rIqhn+RT z5;a3&?76u&c5Vl9U z6`^mDX__&1>H{^i6_}oZc&j)eULA5x0fHJf9Am7XNhj| z`kgqto!z>SbFX9_LvFzrkH+c8Iv&W-{$kWVs&%YUL$_Pl*a6sg2-G0RkcrG;!>dMa zG6CaK!^{Fb43a5rK5_0S3}F6ZjWdj)JHh>nd3+yN=pS`3$iALU$av`Wg(csd%hpC+ z70A9H4l5A5qX($E1tmDao)2n}3`(sgPhLhyt0{5gSP2k4v}ky5x&FkvPt3mTG!E=g zbm^G(j2ej^T6Cfii*LxRrV5lB9mC?=#P?p}`W!L9ArJUc6PCP!BCCksAaNx7p zx`04;#Sd+CVi_8AQ;fe6 zY~?<4_WV}bQvQuh1+^AYX`mGubR#-qtFH&OUiLjhxPrB=mfuA|SWH;;+_N)pn-bi0 z8j`|Hk(l>*(RjQ71q$dn;-E=C^XJ0?W$kDag*3)Oy}`=>YM{U&D#V2h8pS@9X%bQc zc8S~Z$vU&u_7Ltp|F4QJ>K!tLd)orRh!4FsjD}Y1E{-+uIzv&NVteHFTHjN~;-l>x zrr*`R4IfXuvY*c;boYGPzL-+rmk(+h4!|~t2WBy!6jxyPe@@sGMTrnr1j9cFjsds?rvAeMrH>h5{GwLYOs&uwmC?Qx?Ub$lS6_ARf0SpH}!W8 z`wh4~wvBie-uI0+gH2`v+ymx!*dYGibcWH#iEZ&J>$TG&^0+@aS&8s<)b`=h z#=p{a={wVPyT6&B9o}0o9@~D~ecsz6dgmoR&Gq>geB&1u^#9@;zreA7@QMHA85#cO z8UJsb;@@QB|KAd_FYJctZ!?Sntq2?bSK83u@T3SkKGQ$)9eH?YyUxDQQf_DB24a8^ol2?2+_cMQ0NB^IT5@Y;( zw*7Nx|NE$&|A4vu8*1l^Qu}{WJA{8zJ7uQ8l8I4zaUjsZ+862GI-cKr{kl8-c9?(P ze_=av<((Ck$h-O_3d!?kCiI+y%?$1kV0#X`LLLz>k9Y|mg%59cUlRB~y}AO_p|ZW7 zy*_C<=U2Y(dkYi2Z|}9bA2+dgcPpQ-2HUMfvgD}lFR!`1ZwC{(TipJGAEh&4p|N)u zw4Z-oqK>wE-u7xQ$mR0}bY*+r4`UP{pw z-;YYSKh7j!vKUlx#NIxHIlOKrY>&44t>0qayxf%F5+o^}?{SFnddvvy3lyI3BWq_T zEa9Sy@C|>Tc2fw}p1xFM-P;ea&P@O-LK88kr1^G5>`t(f7p0{$bo&sF%r!4tlGpN% z?NV*tpcU$$*#h0mz`zFsV#tzGoA>&PCN|g4(5BRtT$|h7uf(=K+Gs~q@Xs8eM8*B0 z>R8$SfE{`F_u}^C$r)Z&FR$o&4TxwPhy^3K?_E;Id3Hdugj7(bmIDm+&cmrgB`PRK z;NCoZ&WVdinh#diIx>%Py;ME4*{_Xm$d(JAksIdyjb>gZVVifx4iA`vfE!c!WnzrJffsBv@6`4kIl{O?sj)Mz@NOhsEx{= z+utnv;_pX_W;@wYy%^}Niq0Wtm+DZpccqph1(IzEZHg+3&c-0738o@@O6}>k6>40^ zczwL!);JW(X^8t#uRG4ca-=7G8$M_=9)oG0r};N>;iim8MF_HJ&^oUj6O7p4EQk2S3!kBavVF1oxn%fUhDfxiObTN zm>22dTvy4*O{7eckk0lE)rkBOw&E3D(!L$FC*FJ1cAwybN`)D;{~Ioi1xW3VvcphrS*e$&EX1R^ROIoT}L2xjqVud^#jLM_soC z_g6!rLgEu~^Du9f4LyI~TsWC4J3B4qG>!(InwOD9op?lv+JM!t%Ob7&t6FU8u4WS} z(nl-3OnhX)i=Z^H9?;(vM8m^!3S_5MKq+!HF)?NhAD*;}aJ?;~{ao9>?D4lm6l2B2Mw~tF>pLQ7KVF$| zwM+9v<}=R2@bs>Z-e-`uiYQ|PwL~E170PY3N(yQ3=i)t&q&p}FglpHUOlBkY3wY=H z=^ds>RuFM!O4q#{grQL$4?pxZDg(^5bfnMZXHS9UJAm)cgYP`mR<&E>?)kTj+Nsr2jy@v50I4eF*qL{!}aDf@$? z$MV|g?!I$ZC9?I5JtB*Oqm)D}Yo|eS@hrRu+{=KW8JL?{N zWB+P7K~GaE)jgx0TA1-5;s`!HB%-QroYu<_298Bt+dvJX!rV>`Zvi7;azBE0 z6xJxmX_kjJXm-{X4&EgzoTbwYmP?gGeVw{)XnFdNpInB4itF5n3#KN~JJgHn0 zJp}T)demU@bQoJ1*-mRpd--Qqs$nZmiIfkB`n)~d+jGMDb^jc!W@~G}DzpK%sx9T( zO0CV+2Ns{P)$|3Q5E7RV0TNz51yEItGr#UG6yZ=@c+AQ)jMn4wQ*kX;#fm5~V5f;*w>)Whn9#;r*y{b1KwXoe%6%woaUe}ZT3Otc+?I+G%_ ztS$x>2eDD#iov+@Zh9qlG6YtB0CtZGesn?P#O5V;xLcQp65H1vJ~5(?M&}>&osJ32 z4p&RGeVLfWd3GPR$SwA+b}jQog~C&pUlrq^qi;W@uuqbl5a6F28iLtp>zYdBRL05#|k*+t(bDyjlaU1{*LC6BwL=eI>l4#m^Fy>In2FIhB+zR^^JMV> zgIhNY@!V?FhlKY^`7gAp5=YSs$zX-JOL6NIS~l#NLkfmIXH?75YKCAZF%(N;ewP$+ z)sAYIgnL^Z-)y1(v=cK;c?G!B$LwWs4J0>4Rr7Jc=RKgSCIiW?EI$pk-9qE)X4cIypPW93suQbB+VTAIKly4fMMOQt`IA zblf*xH)|DML9Pu)bB-~~!mI5Sf`1CAed0~1ofIJ@_;=RZDDfVHIa-yU1+%&%Dq6lQ z0L}5}#&OzZxQ}R0G^XuIS>KvXxn4@e&u=xTOPiX=Q8_Fzn+0hl;OF%T@qtTJQJXE& z&2rtocmho|wKNA3ggSrcFqqsjzt5%!omKFssH0Ic;?)J|G>-Qc<$`D(^x+ZRDZS-0 z0qL$yhXg5h79O9XYuBXHHG(j)RaXT#2o<~p9&#~`AW2iF>dDtBrxi7yT_qt<_~gQWET1U)`5SJ0v=B7fWKvk#B#i{Em+$8`-I(vRt6} zIe34{ljTq?v4!6E%IU}q2t_@sKu!LjW{7s@uf%M`9BG~qYCH^Q*7j4*;$1wJsyyYE zh}-Yb($rhM%c4~gi#xs3{FZQS1JtYx;0G+R>ZXBpZk7cGOyKYUL z4?m>^{M!U`Q&L{R`uiY)1SP*g2%A|;M}{!(a9hZO9A5jXJOXzsj?lYpamihENTuk@ z2@MODN#e+|>OyYTkvMV}GPGV`i zF)~LfSSseLAa2xy&K+C{5s!UqhiI4t4Q?X;YX;3tNo?iNhls`NP4m-i;&qG+GffxM z^2Y=r>qH=w&rS_@W19jwh>d(h53KJ6^GX-UFWAQH(<166y4mHK0h(#5gKDpWewC+5 zzVffbTSKsN_>tCATla%QA%oK~Fjl4;G42N~%YpO`07MPtfbI-#A>oY0q5wYsg&nd_ zle+>5s1|)a>zG7pY9SezRoKK~e zA4jVTs$|VD4V$(zTt<;fq2^)d<_sE%Bxx4oJq%j~o>k4%l&M?B#bjTn*oYQ!PYSMj zs3C)eSk5gjD)6u&*PXj1I>y-v-+Bl?0(L5$1efgjzAf{>P5H4}?V^1+Z6Lu-H=c|z z3-q5RcZ$y0#fa6)$LabdjOz>?gO-#>ABqpXX*}nR#vI6~#dvV~eSs+L)tb$4W zzGf%M#P7vp0y!(F#bLYf=db`jt6!NV%Um{pxryQeRs{%)nePN4oZ(6Py64ph4_~%5 z3qU zVi-FK6H|pzHi|*OG-K{7R}a*2=O(=7V2K8KQ3e7_KhBU;V?Fsw7`zM({K9uJLpC-_ z;s}uXBfURqlFR*0W$Dj3V{{|>Jg_f=Kb;TUD_ zD%GVPB&xyg4f52^$N4xa-IFwql%Erh>m!xJ8gpMuRkp1WCj;Iy5+T0iucpSmmUuFhyBCa&nPPR@FyRDR+1-~5`xi(#u#Z!L{dOm z7bpnqWqjJmb~Vv8A@IN{vq!t&;PQn6p0lCW;He4YBHb|p=MXhqTwqHPu7`gc3hQ1T zbEK9UK27v1QGT+S@+7@BjWwx?_)zhNhap7KtU&3H`=u`IU_`$twgb@S4*QFNB^Z87 z5@k(mHuAMPvx3aEOoUwsUgnnuD7@QC8vzKeQu5?JdQxzW7GMW*kjSMDctntmnypQ6 zTZiCz9@f49m+NToiuLu1U3y2TC9f#%iYTjfZLC>8CEw_B zjXgqzoI^+6uN8&h-v^VS>e9D=u+F)qYL`{_1EWDpGIysyrF_{qouinB$ zzJ-hdcI7x0xn@dDZdA>B5-VG6eWnQ1f>$!+VSzi+dawZHMH-xR(yb1#NQ;^WY|Y;~Z);KxA$3feOmw`wZ1wxN zwP#~a6Jn&z^UA#{qn*0`P8`NGM;#$I`T-TU`lVXaGVH&(7p3@{Zhh#C%Gb&WlVE)H zMt?8t%Fr1s61PWm2*H#0ULj2BI`e!2fs4sVTdP%dJO(slt~y&PJuiZs+IAt5RH=B? zb=VCSKi2$o@9rqN9N^{#wr<1blQODf8_d>>gfd;XE6QI0g-L5>A<)zXl*|1zr1WwQ z@2~*@T{~hXjIbtwNFMJ{aY++ONf5N*-bo*rxD`s)5U_>5so5;PCn|#aCeI2-7I4VD z4l!~`#gw%a<}o|t1$du~X^;x9PzFXN(t8kNj5a_%TD^B1!7P%#-J`+xaZ<%Q9~`o{ zQw5j(ZSskx=X|)H4I{zN!*hxe%xic2QlU(O1x_S~RVtBACcELs9I9}vjW4i3S;nHf zNo76Epyjs=L_E5jJzNnV>go9yUNmfu>+?);A@RpRbS!s zp|!k>T&c0A4IbLEkQnmYJr8rjng5k&g?umutdI}Ef<@Nt)r!tR-?wPPQ&uxBGybi5q&@F9wySfTmIL!5% zJ_UcpI7lz%AsHvuNr8m$IB+XH?@VkBCP>@mLJ^Zh^J1O`P_C?#Ml<#C2y-on*7Jr0 zl4LZ2MBr@E0&N?p1pqu$ z|2?xlgJcGx(U8ujrT7mdPTlow;Q0CS%1Bz*Jp~lXfZsFD<%_+x-S|JHRa2cv?r9pDqdkSBntyDhXB4x>wX~Ta`uT+907%d`dSjBZ7TEw~+Fg_}^kK26{ zeR%>M^;HbJ*bDG{DW#!rg|_NQ16h1IsI!F-ue>a?l2CwXeheb@(0aUe)n;)XSN+{X zAHNQhq^7P%70#E$%L!G8sU-;v;&(PirKC`M;q04LkW`&mCYJ?I&x5Q(weH8+LDZ}5i7I`Yfyg~N#ol6ix24aTj5cE#f@ zJ>_{<(F z1#cpU7=W2i2BQg~=L{ zh8X%`aq6GZ!K(XPL{5>cFq!Vg8e~Tv23}tj4+2~!?gB(b#AVGPWrP}|rx8a!@gD4t zA$mKZRi!sgv_R}6g-OyNNIw_5RhnFN#!;2a=IT?+F22S>JsM{a3){+H20D9N>fJEQ zcUixdHx*>uouo2vH>Ho7P@fcU*RN<+-qeBF*Qw;I3cxNJIIWVRwFL6j^3u*#ObmBX zD~cR8r?=l|bI71iX|!EkCtXMQIRvL#RS^wMmR5xET44b8A20TsJCU3>NJlqbCRM{T z6H)G`X9?-`smkpB^xrd=+S2JEs*7WoCfDk4>TPtYAuJ3XQ`=LCI)DJ^@6#~}v@P~O zM^D^|bWF)E}tPj~f~PaK5B#J$EVGke@3IL3t;b|X8R(g};kwvd_I7!(B0<1~*j zO`+08we&MqMi#pGKkNvbj0#>_nq!izUL_Atxq5$ezfJ+!XOvK=r#aZZiM4N&sIbdJ zcQc<|v__)vg;G;5{)#U;0(PuJc8n_z#ZA8ib(FJ=O96$rr#71kgb64}OAM#`rRZRT zGM;lUqDB{21{woF!Kb^nkQxE9REt0=nicM%d%3Djci76(?|Zy2LR?c$1T5GrrBW#* zhv`_UK}@4kIVgr#oWJgn>1rol6`~{vBum(OU~)-iXFRB($VYY=zs``j`!Q)^K^Ql{ zhG$)z6Yz~%#AX6|cDEq?)crU~lf#>4NE%T?aTX;=Z{KIU_E{};;2*Amrc zQ_w-?QXT=<3MayOdoT@LIf|v@_xpHU@Ud|DMpg?~PuNP(ovBb(r(dCXI3I@({=n+mZJ-JE^O{;c;35yoA)QN`2j_A^xyhh5ZGm9 zBN;@10+Zc)E>xff0dH>1FfDKHOZZ-~EB%$Hr;2{dG-5j%=YGqOSQ|uz>H2`984+!r znO*(&*v99Z?Pn#6@NMBc12Yd2c=^&)(Lc4cv8L?F#?Q|;2IxHACjCUmh7i-8BjvF_ zX|wJ1`@e&Yi93HvwvNr=f4^B4RSV6FINz7Qik;49>P{>|a%k$sW!2ry?6EApWVd** zUFklCzt?l3R)~`paS_zMOrxZ4aQf4LWo~DZu*J5)V7fn^-W@We!GA|HT3ok_+Y)e< zkZshQ8eryup^KHoWU0z{v6EAt8P6A}9Q~Znu-jB)VcS zoy0v^9k()b(zesBGcY|(o*ADBH?E8LsRsDZJ-_As*DFNs!r=G|wK(Hkli2N`un*bN zD!0q+KxKeO6dV*%4A`4&E;h1tM2Y$R;li1KbH-}!(>j{X!S%?~RO#pY!M04IyF16* z!CY~#RV>P%)5IaO;GWOY+ffQAlUbh(zU7fFyq8blpIm(F{{rn{{7XCbKN*#Os>>Mv zsUTzgr-F>}Zv`1X<5#G~-^dT+Kb2;Tf3r0I5&2>K8wUD6L4N*`Wk{=F>}c!kU})_4 zMVtt`If*L%#oK&si+=6@veEp_?uh;sMD#ap^hM-|*xERK?HBnHpfj=kT{o@Be+%-% z^e>U0zlZLB4(I=pnlW>7vUB91rTrJOn|}lKFw?Qpe5FP(F@HIv*#8nBF@LF~80Z+k zkR~S9zbsS#8Hd;3$MpZB0>6MBCZ>Oco_r-NFGb;0Lr zDsOMr=k;T+_sc-;-o*CDRiclspbrGkL2B>kNa^R>UFua0eB+01&5l>a{lU8Kfrl-x zSNB7zF30N7pl}ZaUa@0uV~NN`?}r2?w?<4MkCa(!+qR$88;4a z-KufhyskC6qhmAh*WkU{3beUpj%zB~mdKcNrxQ_j-k%9V`v6gO)c5#tqf(;Y#y8Dr zq-tND%?j5{Oszlp)@{;P^YH)7{jzVG)bh?}1yz~3RYFIHPU$GBT+JHeE1q_Nm+={u zlkrGim0Ku|_DNnvAE2}ocNcGU%!TCHJz_MAT1MSnKK@f?mNZY$T?-T79xG7&oB#}| zbKO6ZT-pqsS!<>ex+5~C6YE)C=!o4s7if0y^qm?O_?dMBX$0PbvYnC?ny~A=6!vJv2ws+Y!cNu5@zb_{_oj&Q)SDp0D%*q@q<7UpRi=L2GdG8 z0*OgTNh-up{sJ$4t6ozcExLw^+P05$y;ei>QE1HA6%TMUgu#xqwJEmcFZV=2*c5wm z)J|*v&N?hG6sV6t5##Lm3OzPZ67?KCGg(!XG7NrsyZobevnmcS^s_2 z$657$0nRLj>sIj>g#GoxU|8Z}OSw`~*@W}?cQK=L+fNKUj}#elqrJ+&VdFyT8BS_Q z2wXD1ngto9aZpZ`Sr57MN-Sh{**2~~N`FR@sfd-GE59+5LG5muc0D3JM|yV*v}UQm z_2~nJje|CD6djR7Bv%-FP9#p7Z*mtCbL7~VB9;}s$D^Zc`QmI>#@rH@ALNzwZO@Yk zn^t>ZLa2-x$b!U7Rm~S*60Z=oJs-11@hhQTW{eTm>G!_ zJr$`ed^NluXEk23Rvv=aI@Rb?NYSCznK-`jygRzhdiACdkOC1X8aGAzM5Blzw!B>S z0C}RSBR?Kj8F4>&9_F2)4qj72?id;@kzm%E+c;{F4?V>86b-E)f8bd6d6Cu=Erb4p z!%e*kq*7b^1Xku}O;~5(2GyyO$}|9M#Km$o`U-mAp zDZXoDyG950Z4ISwWrBB5VXl-Bs2n_T*F)aGY*xS%u@@Pv4Zr-L9l1oPtN_?<4sVLl zechj^_RGCOG#S_B3}nXSSb`hD775vM&nI~M$0zJ8;JC&S6prpJXL3`MI(uhZPa6kv zD-ZEQ2l`ESBg`y@h>0F^&;%o=1rhV=o}l09DM?p_TR2JWWB-n9UCfd?td2dwGAC}u zBs$lxf-m%_)yNaT48YoETw2JT{}GjVais3pTAO={2lBgaiAeIST0w@sup1z8_5MUN z+TGBNM#UN#*Vp!?YKkep{*6wfS|c5xaouZ)?zrO)CTV}od?7NGG)&UL%8S*J z#073>%)J*J`znxy9; zN#UU=+FejVE7HB^^!;J_tsOK7Wmg61cCiyxRh@@K=nhKlf4O-HIyJt6gWK47yH}&Y z-{rF3q!s#G(<((!fV5I50mv8n%4di==W0Nnjx&;K5C;^p4AJIF+pV@y0^+3*vNf{$ zc6si@R}#fsiM0Em5%z{aSr?GkZAYsGhaK?-DY*S|adAN*_me_pIVoEW$|-dRVoU zQU#=!*{W8&H|&3+Kvr_dybu2|Q;roEV^f_umgc-LKjuEjvv?RsON30sJM7D#zjV4+ zmBq+TJ@-fo00vd`y*0nR#$vnOE-Wjo`f!f!`8kvuR0Bo?AQD^1tXgcjt1LTaYx5qL zWs4;7wS$5()WYEcyVn`<472#%!vV&aW&D9Z(>;Bsi@1>mFLYI{g?2ocBEXg^*eEv;YXgbcptRKTwHAHlT&^ zSd@=T9+h|p1#Qx*rpMMNKb*8pJ5uj|*EPt{kp>FYD=)cj^xy?^k&umZs6Njr=?I`G z?30^~CA2J&r({=;=))!)jqCl=?*!LrHV$xEE&V_h{fz-dVquT8bdw3W#W|7V30OkD z`R(=85R4+@K}+faSpgBHT_v0}IhOuFrS_#1BKOH81h14RTuG9Ud?*BeVAz4dq8hJ> zFh94)D`b$=JCnOq(6iZzGy2*KFA(I_=7voyD9O{@pY20pk*R~@RDs?!o>!``K9 zRu_{0TWCBkojfpt^J!T|+$#A5v*~GFZ@u3V@%w{cR8f8j?k{i5B`BQp!wgF5$?)We z?DzubISF9IGZr0%?aj+Y54s2qy}5hR#H_h<7S{Zsc7BsV{IQR8BupwXr>wWd94x^B zalf>2Qq=v0k46gi-fFU+x}7@v6PaD?ab#DbxonmTdO z#aFk2Fq?ibs5#ko{CoC-F5zTl5NKllyBt7+K#P2|uq{Yj@xiG^KuM}q1~p7;Ogs(^8^etab;9%iN=hyfgun8tET4{7V!|xL89iPkFIVlfya7fNgnC zdA8-?R|Lp*MJ8%WtsoEk+X8;fRMI|^5Cp4MeoVHO%z`*Yw2dO+!VZ$R4Z@neQQ8F= zTS>NKg2i#&Xc{_VxcMdGB(PqtaZp~54!T?oDA8mW4<|Ns&$@Xefe(Ui;aD4h2#JCF zIVz5l`t0Qj$Sn<2Um$ahS&V>e`s4#v{Cw#UUFo0NaMJ<_^@Cdsp zv@+|}n;_B3SCP0VqemtN`UIa|v?O&a3v}>^uUCJjgT1TMoUO}b2agT0C3`3E0(NyT z%gon}$3Sbx9SXT>Yd3&uYLj6HeQZ9gVg)?Sq6&^+r%bm=hRp6(wE-)IK;U??K|DkX zQY0s$eLIfEFt-vS$R(rPO`^Cqz5S2N^!bQ zJ*?S`LsfO!7A#FWO7k6L!N+EN+D4M9fUow!hzUW8RflldO~|D2P`AkKxvUtx&;RC2 zRe1tgc}-J&FPhGJ6YA)OaF%GCQk4_zPIFX$Y@$n@PgxnuoJ})qZSUe2f?|dPRCQoW zhfO>T+=0z(!Bv*>;Ix5ySar=VxFdVgZS!Mc*=p_OyYxdd>aeYzjaEDmSY{J3GXD+6 zEVVtEe~~Bw;{KK2QUNr|_;tI+%d57H#CJH6;k7zo2YNxcAj$!Vm!dYawPqB>SU5=4 z88ilyR}Pjbl0RX7X9SHXsWi@<^&m`~@ikGCfm}4hH7i&$`(KpPGLEj{xAT<r#>uVRWOzv3 zEbBz%xHGMfk=R^)F=+nGRk_LcBrKy&)?j*6GVYp(MuTt{bHQtOTO^g~suICJv#1?h zdJQ`+5uEvKux_0_)fYnkFOltwxA7`}g;2PO;#%e#jh!lXAaqIK)XUSDS)bZPuHLf+q?CXw-~TegZj&^;@}R! zf*za^yS4oHl;`w>OEXSi%gjZ{C+SmT&<_4Iu#Fe$@C}ObX%cNQ`#Y^l&pUMyOre((*Q){RcE;OHv)P% z9A5)gf!(E<*tZKOga0rV)R^N`A*am!o4e9eGc98%lijRFdlaJTI+mSqMG(4wY%<5J z>BZzN@8bf12%%rrvxVQE1i3O0hzTNpzsPE6pCa~q- zuqmVSiJO33r-!uoI3?)>F5;Lymb|qaFeK$n?2Lth`R9(iln9OEv}}KUusm^UzuLq? z-qD;W&G)3zqfu1I2f8|vV<@N=??sBZOs(%q8QwUCWzg(@jWUp1y-}sPH_yj3bTU~_h(^mtjA2TYb)M{Rae55$C2~tj!e9~Ip zDulkCV4&QRcc_Jq-X-*)Dmm7W4`*NHMliLb@S()XRU=!0v@kE%Z4PMvwGNtC5k$(? zEdS;HNFOhaGmE^R-U~S@OyQ=aN6;8$4jkOTO(9T5^@l-uG=?$IX5M&r3y$0AtnLCw zlG%<>`D47SU&UQ3=*d5=lEW+stD0odsA=>(q@5OrT*BeCgE{lnVMlIZBf9^Pc`QvZR~bd=icz_M##_?#)4}vC zS={G%^Jr5o)&mAk>k3k=p8fA9(csmXtg0i-zk*dF8etxu;y2qmw>5X0VBcpAP+Ys= z(Af!m&*q_IffNH(DTx9>`FOt_kJGi+fl!QztfIixwTCt-$kpLC;YnD&P5F3MQxzB! zREA0?;r&3@88gDCq)E62eT&+sD>=IC$mVOVG$i5_7wQf(U#aX~fPyb2ay>lU! z^v2@+SFDcjs6eY1Y7zEv;$gqe+=$?5{dW%Hy0IoUrr-D)(>5=A>I`@eJ0Z%%D-QGT z0-R(ZHy1l2z1v`*-?2osLd^6Q9h#JcMT6oyd@YaAjB0lJZ7MV)9qtB9xe)eIA%5Qd zRF3X(%y=-~97l4rMv$L?n4X8O{8~hJMV&@QXRhM6C`&%e;JLR*p%3Q*{}dugn(2#X zFQI-Vl2zn6kmW#v*0XMv09mDmNdAI9TSc;`^aL)*X)6aaocH7GtF znvd#=#iYd9I`95s$(-w|u>#+4N{~jx#&%}1!tV^rwi=>29Hd``AELP3Uk6_(+R{^? z9p!p!M-xy&$P3Dk4q%4%uZFRahG>anKSCQ+76 z^hc_%;^h0Dw1wi!0&Ubh&7Af<68Q}?8gb+s!;HfHwp=jy+z#XDyiYn99O+Ol-JnIU zvKcDZJRxeFLTXAj3R4$H$b8fT(;G(FFxJg`kJzzfc|V8nP@|SwwSF?Sv;_>?XDlja zwzaX(f(!3upr!-p!$^%@aN@6}>tU!E%iyw#j$Aj@+AXAF1p@r@5*^s{g1{OIDbHDH zaYoj*$}5;)cm-PZgmdoRsIw1Yy0Qqj;su(A|l!sGO4 z@%P?zL%o3fCYu1OY^zSXFP1l&X?ECJpTDnQn)XtuPV5bhG(+`kO zB=1}dJa-EXX87^d43o3{kAAJCSt*BxG|B#Y4&flks&ju)r_SvMTR`V6Gm|vB9X<_6 z2oJXoD?u3n#Dn5=Zqul{(HUhul(_`Gsk*LBBUlT9HDYWc5>pmB6-^zJnN|N>jGn@b zY=pm9{p;3O-3O@CnVwi852@8vJCB_N*`SRpe7(qIeVyJ zOklN-z&r7{1yOZg(G-~o=-p<|>XADEJSxhKQRL;xISFaVSbTZYE22ndACkq z5=~YYulH3i~cqslvdN) zrjUq&v2S8XO}wFz28DI&PfLf#QFf4Y`9$sfMbP8}P=A9KA!eHXO<7;?7Ods}_j_9; zzC$j|Djh#^u^x)lJ!c2Xggr+AXI#xZ3D@$QK(L2H2G0{?f=2P{ggzCyZmT$0Tb>^C zWOB$RZKBByAguRV(}$W=j6`ggYpU&jgh-Z&-$iFS2w95#|8X? zXJc-*a?~qjsJ%WJ$5M9B53JjR!S1M|_w~L|WW0`hfYTCVBAz}G15t`b79UuczA`!M z1ws(CSx3SSH_3essyd;mCcb|8mbwyET$Y^te91&G( zOFl-J5Wv%?mcHut;2$6GUmY1%&!O+fF5P!EIwqSNK?k1k2WqjLjFXnL){e3#tLeoE z2b>*C*>(~ivk2RIiHyk`+^T9}?>Qco9^mF0LsP__^dQmMMw$b#({ zA_riV-JnZ=5e*Az7b*bJk65t0NlkDG1C(0cL`bc77u@b>i2gEHXJ@F0(tcDlj|1p( z)G?V^DQ6vo!Z-Dmbwo^z3`&}_!pJb$mmYyI5glhREc_lUE4s&&#fy*PwUbA>JTbR+ zM}S3-v##o`MoOot*NC7|A2sLoV=o_pV@dnFSt*|!kHl!TwZ0p_V+d+=K>AyCa#jUJ zSq~p_C1acLP%Uxjkc*owWX|#~Xql3h(gIAxNNRDwv}{TO1}W3tRe)hBj>VE_r3?t%W}AFi05LsfDvkeQQivahLqXjr2mYk zE^Lu@&(Zp@r_$esB_!Pyi;FIW=PTcdbjdsKkWD(xa(Z=Gj6Y>IIY?9k5k7cU#-f$v z;>Oa~EnGgbg(2)UXLSJ~>HC)hFYIBr0c~rhNOr-qZt8sOlj9)lDr5E8@aqcrUYUEt zhQ6;~qRYe8h9%gM9*0iY1r$M!>dQ?GGxQOyStM729~tQd|=h*p1B zT5z@2h(B6YpDZ7haHKlcQ8N^uIZ(tr5)0bq|=6C+5(H$fhN z!X%ke^w|Cdta@wHtNUZBE~>D=BGsR)&|im9R9U`)NsD;w6KB%H5zzzfyS){@l-_iHnqY~!XLEb}ES^bl9>E2`~s*fC}_X=y#k;C*RRCFQA zN55QITw+fGB+$#@>k0I#KpC+Tr1)0F=ScP>xW!`;$mG6QV~Yi9KMT} z0&~X(;44vr7howp0TsB#DZ|fwnUZ49B@(r_6j<@9#zaxVV7FgW?It!WnPuAzn7G-( zsuyxsPAk)RVMqI<=RJHt$e?14SaQcA$(w#QV0EKz^e};+MWWq;bnE9YE%vtM9;r@-4D16|O?gZThLTA;b|Vr>!q%3&DjZ z_xI$;s^VfGCxINSIr5=VVQkgmR0*JpPSHd!av^xB6JnvV-?aSfPC}>>fN~_o84EdD zkUqeEoE4~WUT-8if{{zHCx-2N;oA=l9N@(HMBL+vh9Nf&YB zM?2#E(nhr}{C#Q9?^5U;kL&f7)C`%>S-jtSp@WFdZA~|GQS#e?7eauPN1ky&wNaO2x#;#>x4A z&0(#_nRGb*XNa9SXi>YU127z@N-Y836hS|sfeZ-TRKW2MBwnH#AKy}HBCpU+cIpc0 z)CP5`r)LM4G1sZ+JJvB_pUeY;?NR*CeH-G>2Qh2!=ijNmDZ(X*ud%-G`@={7*AIPx z&+qu-L;auIV80!euMCpac>kZr@IIf{C5}GDs_(u}@$P@_>F`a!=PR~6pa1iFjI2*b zxZ`toEdTp~*cThi^(~Xv%HGxIQ_BCu9T2`|B$X-f{ghAm!zF(4^Kf7O^F9w!Dk~?B zqR+o);@h8&NTqmQ8u$G-*v2Q=uiGbKr~(j|5r9~uq{PA>F(>f%t$ZSJFc; zNypQF~|N@Wn@gS18sJ8)G0_VGW^Q92A|QmCcG07k}yC@$aEX zPa$-jV7n}gFi(mvNgZm>e8r+EdbiD0PdFw%UOV*4|6sCI$>djvJ01vxL=3=#HPt#Zo&^6CYw)^tU zeLbU@zDa{3Y)0-Y1BBdMP5WUGSVCO8$vL1 zb6S<#Vqy05v$oLNKgr6*Mc9HPUlHUZ9e8X7rXq(hqe9`oe#M+UAe9*2Zt5X&Hq>|| ze>6nQ?98*Ej1D+yp>m=!cIiLnzBMaa7LjtQ;6SNpE#101FjJzgWFk3oW7>9dj?b?9 zFLpwR5CV+m;1h6t>pWzo78mHUupu-2yEl=t;tOc6Dd53 zNG><_3m(YRWldpvlpX;x&T@=U2U8RK>{TRgWU_seIK=}Gwiq1&`j(Y`yu_Lc0qDO? zn=a(tOQ(78{9p2kumC5E9!0U%lyi&so@7OE>Vli_Z>42yeGn5!j6ZF+9= zb;4j4<&Aqn~e~G3y)oLsbVUp#+KilSc z1dsntKLvb2Mg8iUBM;SG@=$4~cZOyqTKgc?W($`?vP7YvsJ|*wggh4((i@$0Sm9*M z0`@At8rcL%keWYiicBlMrHfO^FXyK_=$2$wfsVm*EJn6zzp56RuK&0=bxCCQ_qsWTln0wyT3 z`J=roq~sAD{Q1$Rw3sMYaJFM2$B6%Ku#(GnF+!BXWHbCEhch)i%)}fi&K0((!qDmv5O7N5krSPaN=hqAxpF|0oV_i zfkb%m_TGenC106ei79qtsUHIGJJkHWln)l#xD9ghXt2mNC-r=}O<-e_sv zS{6d-fjnumb}*_x8*76nRGishQ#Ll;R;U)tHGxJRY;lg@kLq$b^}DUgbO#+$flyTP9xKE?8n_r_BhwaOT%Aa>HJ8nLw35_CYf2$Pj5UA2BfE$WSO&6UGOK2uPzaWk}(D zrhF}t(lwlt4!6%=9yI=LGvH}5_pv|->cEEtK;icEwwKtv!jwTq%Q30o)gcRbu=0C< zf#Ug%*%xrK2Tva*k#r|{NhwUXX=UUthMWzCo3IEEI8)4ra*U{2CbZr!M$jL1Q%`+2 zL~e_j{J*5@#CyvPj)g|3TGAX)QZgrA(ClZl^SjRM{0_5U7h4I?9@er0GOKy449LwBs4>x>| zG)(PbSs|u$iNMYTKe8~OEsf8KG+8srQ-UQlqgv2*PnMl7lCc6(3kR+VMr0&PGI)Zx z8*1wbT^5J^q-=sz}AFV_y)nH6?EbanGA?KzfQF<*bi zp+0})jCi|b$?y5qYI;_^XIaYVcZ@F++-@v=1iQYAOQ&PnQObc|oD4&Gh^QvPwGb2P z%`wBgA}U3W+-P01Q=9Z*$ncL=(>M_j8@JWQ#k&)IQjv~^qdzVx_U5)$N#}#lys4X& zMoJXAPxLmADSrnf3_GEU097_c)rrzNvYk}CU4}qL;THn+?F4;#iS3MS(-^KUI$tz~ z6CG@P4X8Fkf}ob6y-gJ~79R#e2I+KmOHTvB5ry05pD-S2u-8L73?-82*>86hFwTIVTWtp~??JGwh4WVzQk!9*WfWGs4$DDj+8*V{z6j*d$N zMRojiQ`k7KPx{=PHM`S)8e@7u1VqL}krlf^$2BgaG$9ku9&S53ZTxPnq8|lJMnjg} z&qElL%~kUeN~~K=e-Ip<%)DqExmJHBux>IBpT?piGp&ccXJ8uJ6{~xh<@!`1H1e4wB1h!Cqm&ba%ai%AkXrl{?*m zkE3pxKh|(V`1XW{z8)M4wS`cFJ=wrqEs9y3qc`5#m93!APXq$eytL%xK;%%S%EX?K z$WiX@YOS!+_)}PboWbrs1cK`1Q}VnUxTo8fR1#XGu;4K|NJbC=1%6#ACs~XHaEEHQ zl`oT;!){YSBA||}_3`ZcWtg+X?=}k%m2KI%7yP#LWU|)E$y{&}@sK5g-NaF+gm$(N ztm%|{yJZr_Ds|@Ec!)N~h?Sp$DqwQecf(EzYHb)sB7btWp z1DNw$>bZ{aue*?Q1Vfm*N110YjYF}#MngQd-3$*3ZR_TJcJm^gKp&OFVR#5)&0xbl zO!6AIRhqyU6TRL+YQxCk0Qj)cPMos58@#6lZu2ORZrRlzNH6aQ2->hP+Qd;hlB(mL7>Q9#nPJSiN5yn z8zI84OeilF%S@K(p2yg0k*mTQr*Th8J7UjG!V@~7F6S6o<@VI$R^H1CB&xP7*R4O} z3iR}I`vad<8_E%>MC*?;;H&f%J*SRkvt_3hTZ?B@4>0B$o71+3y9#!YeuW5~9Scc0 zI}{C^N!=cZ{0HP@sGxy1r;tu4ErxRyF-U1nBs zKK4`e{eBNdbmG|HKYP@}E~(;qm&LPebwg_@_QvLjZ!sss$Jl3~E?{eY9tVyQG`Q05 zOn~NQJGq72wYQt`4c=sSLXqFD8X@E$4>|+-VWNF4YNndJK16;;_|H72p$*9BOij;o zF^m>p$+J=j&61II0XV+hB&k%iZp{Arw5pH!;Aj8hXh}qpOz2-+q!a-`9sh~xp#x+)qw#Tn}<~C^9WRz1hOho%Lmhh01q!@-*8|rAf2r| z3bP{a-sP{95>SqQ)G}Rc)LY-zM6=Y~_b5>wJ8h*Qh1ukbE{>jbphUp*s{$QuO>ZF9|EbV3pY&!rQzY4=v& zFoWPx)9n04ZNy2Taek$w_Dy>jTA^81Z=D6)*E(HdUsJs3o87-9FENuHV2}|)WX7ou z=KUG+b>O`D6y{M2tA$$Q^Sy=aj0OhWlx-(39XE~Qo10^wH~x%p3}BNecX?zaOhSAv zZr>Jl#o8wnp+_Ht{?I?|KYFK)dhi(j?ymMc_%z-8b$wVzyBXCllZO6&5_4Ljy%php zK|kJ)57Sa9u_dx@^M@x@cpI`r^k`RL3_a7}qS>egcJMUg`W-NQfZg^~CI?zkg5)f0 z!1pG@et=#x7Q4g6jEOkgf?|%XY|cN>Keqr73FRi*K9Qn5A1jk@T4d)I6PE)`q#XBH^Lh@B-F?MuQ-C#TL9H)tAj@Ag*@Q&H5%tu&nlep55 z%W}!Qcli6Ielgzp#D3xjc9C$9BlJ`nTUP zB>}cXqM_(;Z>%kI%(ZBP8J>*Qnw$HG-^MI5lkG)u_pGzSXkpu;75pty&E>iQ|Ehij z0+T6bK5Oo%e5t3eEI&YX112?a=O+Vm@hgw5Qz)XB(~il~fg}8?yvA!ZvkT$cvBT z`{#?=!W5^FxxJqv=3PuFx8W^eeV@f2R|DXO;qd59kJiFr%eQa!106#}MGjU)-fefK zjiCgX1=>l&yupQbZe_79Q}=6W z^SUd$82LIrvy3D`ldrLvXatihxJZ9i83>Q_8h>duYkMW62ME?>yADon^d%!l27pU# z{;Dj~6QP8|VP%-ngN=ST--echGzKoe!_I19H(8Y4!r8LyOa@H)75^cU-rY7-tQ-%s z<|BUJ@}qG#c)DN!&=n92aG`GMh>IprPQkC#E%(mQXLTj9b%Gb<#T-wqp_Km_)#(3% z{kmsE5#aaSPJNwt9hI9vBY|@3BF{9sko+ue`FL61_<|tb&2eD~cxn2!ZHSHNvAUJU z3(6A6UOt$>s+)=J>*5i)O$LPWl92TpP>UF#fN1%M+JQ5{mi-Bt8RR%!UKD$Xjt-zy z-Vw25t{Za=T_sCk58cS*QuW)!16`3(VHn=`8m~L;qAaZ_t%cY6lMd>59K_znzz#8~ zL?fQC5hoy=U!g4rIfiEC6!G-7dNv7QmphT;f;d=G@}K(sY-vETq#MqQk2Um&SAr#N z%dDaQE8j>ROPXzKRyUTaK7gpbhDnDUYTfubjZFl*X~QHH60`9W*?WP&urhrnk0w1Y zv_V)L8Z^~}obCj!rGw4cpn7pZIN|EFErQ1Kc^`>mi9jxIZ&gy{feWL-Fi9_v9%qx(F&6>GU=xEecyuNmLpK)4ttZcYKea; zV0*de2;JzWh&&YQ1KPg3)E;XBHoiwNR)0Jkh(iowjCimrAA(%fdS6n@evq9+*q}{;+|1>-cJzGmzKsOS+?3lHanJCGrwrZ|HM6;`%5-cZX-U*~aKxe8 zk=IAT0<5oCi<)RqWMZU#de$+5kf_(vu-6!lq6{_53(sLuqB^uMZ{ zVuDkk-yT5&PiXKvxzn%XgPoR)Pq0RJ5hBlNZ#O|h8BKZ-djkrqp+pe|ZKP$RvH&lx z^Wn%^uyT-|!%A8aGj~b5{{o>1PHBwLpbptoC=$BRXoX@d%_?2rM)AU?g)fnGDOOq$ z0elIaY@6*8L?E14uNC89gubNibIoBor=j?+30mNUI^Bb3Ohbq2S6$F!ndT6cS)D3W zT+}Zlwpd22#_aE%O9S=EKdQG?)Z-o*?QpquYQ0&7HME@dvBI?Y6D+TxTGuQ$`o;O_ z2ih)D<<<23gL3Uxt`-{QoZOTtt*CMnpuCA|Eu>+z4y4NJy+}8q zFT$z3h+aT4rfe{X6>Cv!|Kbuq{H%KET(L@jj;Ly$S$fA!Yke)O#Xl=(S@-;QnpgwF zKKiYO?QTjHX=iwEe?_3`V*IbTU1E_Sv;x1viW?$1K5GS9zxp?11E{E0DB+^p7X3=e z{gTGUch67Z&Zhc;82g8*v2}}6amGQ|mo}|yRyXs;a)~dU>XbbLX+`LYRS4ZxsNDC|nsROm*^8qVH z)vtxbSV8!O11~E4H5oo~5nj@4A}c-TvIS=m%vM)~8r)>(v~{zHoKEUf-(w2C%bR0v z5P0$DePdyzRyK_0dkXRr^z9cwma0w?$E`Q|A{Y0*_L*WK26_21(9J^T?5%sj2=MjI zva{H8&Cdq7&UXa41%#?d{6+iNs)OEQv#hdOw2OsWa*8ar~BTtmq?58hFXaH-ZY^ z>V>=DJ!{GpNrVQ$5DDk0k7F1i9~{6StMGYtlVV**m4m;XJpiY^Di+?lea~EzzGT*x z@wSBZWTndls{?G>U-IIx`SrY(H684B16SOCsJCj2y1x3p_r4#^amYhuk1EA0NyD=Y z{W~O$L11k7Xx2pBlH_)KD#K30a!OZKmT@{^>7^$G4IQ{1L&5a6YN3LUuH2H}Ta9tL z^kl`uiW*@9SWV|-S~XD^V}MCN?RVBhSOH<@Ej5VEec1qdpV2X&0M!gP63oQSO{f45 z0diaP%O4!th}Zc)aQaiNAIgN@i5nGW&Mm^~wiqjRC4M=lF2~UKrK+}qj%_!|j6>U0 z;3Yz}cM<#_$Sl7)Cgcefd4 zOhE>V;P?}d(h^}b|4Z|oTa?)q%hmSE3griv21>Z&g=z2GrYw%`2P{}%Gtm3aSzest z@e0~c{x4|gE_$NH$a}x${*;vhMQ4{iP%712u-WN~%3NYn4RfO~xs{e4>F)NSvg@Me z71{VV8#)3&y<%9&5VT8qdf&uH?rXDG4^-16+04mI123GKENPmNNat_5@nD0O9Vnda z4fNYHM6(k-MpVjWLEiY-hOT6iRq_JS4hw|_^DGP&Ds4t`$egCPa(s|u$On92kLIJI zVaOUGxgv_R#T2Zk?Xe>TL$8z}a|^5t4*Dx66K$_3Xd@oAJM@+9Ew{D`pa*BE%?f)T zNfTJ%7p{}v0Y+7NXKm~@mPTa=Gk-JpFQ`tei8$X(c#z49HkE!m0_+WtPQ8!IZ(xs?a*Xwd59%y9`82g^ECCA57FPR~gClFr=oWsxV7 zh;DRwaYY%!_b5qp2Xz^w>T)XLK=RsmsX#}C5Woe%O-O%-ulphJv8XDuJOy=J3vB1! zns(}-2`J-Yl#h%BxIu>xBGwg#`*qJVUiZCuXk{-rv2C>I?6$<$y^e z4j5`2$*>gXAbLE4d506knSP?Ksf!V7;6qNn`Op}&;g3mDY_4XZ-c`G~cKj$`YIr=t z{M_jg6g<+Pr&iZOsu@n%>ZCN(ZV-clK9Eg%KZuFJ;2d4|hr0AjMhP}r*@zW$S+Nup zeeQZ|!$>i2fRkjlXfl*bfN@YQFM9-WAt4P3irnsM^2|>Y*9x$U7YD$31Mrx!#;4Q6 z0_Bhf4(Uuyn)R8Df__9p$XDo?uQGhtUr#H{Oz0Z*EyYo4)7@3JFUG650VX{fb9_J3 z^ZZ%HsiuuPs14|JJ}@ST(z9$i^5eq`O=KIV?j4z^sG)R(iADKcMuK%=o?lNBml5z- zbXU)Rn(^?BV~PQcw`-nEYn~j$2qEniKj&Pz_{fE0pGvzN0vh1T7n%_(ZA&kbN-tPQ z2uC+zMVIJ-bP*d0NEjgfsobDLre!o{?ERA-)*ua-2|`jgPL4{IK>JRAWvXRoKuc zFZ%5e-*&90rh_=lssQ4|tgxOLELMUkuIwiLd;Gs}l{WEX9?GSD59bjz-VWTPC`Uiw zP9yz20*EnXT~mg6u^)|#-=j3UJvyh(&B0QyFR{W5(6QFtlK9BQ06MD^m)76jh;fx~ z)0G?c)rjX%;x9W*z|SND$x|7~G{n#WijvO*W3nUHtGgLqE;Cf^$Yf z=-#aNk~*iRQJtq6y?WK4eIWQ#G=4I=V2@E^5^`zx6G~(*(8m@`<0Q!H7v8B+_YA9Z zV64DX?J6w5^c?1aU9m6~vyZV8OeTKz$l zrv^PpRQq|**C(Y5^{Q<6`S&@T=O{K zNBoED^HruFn@YSralseApDbAtcd)E$7XnNwaCW{p5ems4wa-PKc0<|mG8k`MhEJX( zxW6koUB;71jlqueiev6XWIr2!zNhqSiP_+10)$RFglM}!ct~w>w^=*K{z&NZUB=t& z)SlF4A0#3JL-8O^S?l2WQQubA#%i_b842f~ucuGR5P1r^v$AA8kS&U{joirak)qrl zE=xap?PY-l{ZT3{7VcXE!J){+S=&%CzZ3>Tcby8yI4R?#2chL7h3mENTyJd@vyJd~ z%Mjq_lY?fIi$+u-==|LUYN_JKN_iGW$LI$g=Nute0C*jtnQ2097* zb??*6p@^+G@tenmO|5~+=wt`hcQF}U>@~#xmo|1EK0C#b<6J-sg zV0^T}fL~GCa$fDwaY-|SoL6PyAp;A_tJ6rX!N;MIrHZNwjl=SYsL?{@C&T9>k<5?B zhu*KJFu$%x(j%NsCWc;}TnvgQgAeb$<1gacv%0)LTn3-#&x>E#GzPw8J=pVKAg)%S zb^k%fFY7-Hp8r$FFYCW-o~-|}d4BsO|L4x%e|kOtx3GA!|A(Ew|GY&1*JbS?o0_;V z{G%F2Tf=`w5C3DMoxP2{xd+4lYALMjob-%r?Cc!>EQO7ogZ{f${M#Yy*{ zP|PPmyq1Z&S`{^|`^4#eboEt6|AaF*@kWmP+QSOhJ=a+8SL{LWnq=PBNUz_kK%Vga zxIVmAtC<@2+2I{3NIb(OJko z-`~F8-}8)%4L*18uD{MzU_z8F9Z7D+A)McK+O`P{itb<7lzToFAlaB4UR`69qoY_{ zZ`4JuS+#SwMdaHIiZLB+6O3OyYj6z&3Iv%_vTxfI^sl?d#l($2AJOgtwth2p*-Mk4 z;-k{kyANr1Kf1c9QaaIWquXOvY5Vs0#EV2(es@Is6m|9r4G)botUxQ(BveZ&px_4+V&b&x(O8btyoeKvV>j2W_fd%I3sn8#z2AwX&$qFO@6 zqaN6+pEM>oJ_9#f@q2W!I6sa`IJI!vbqM}mg1|3WpI3n3tgMkl=PYDX0aRkadCM#( zs=L73B+XWd?9g3m08z+&Ju^DS=Ur}Yok|k6Vhr-9d=-k# zcHtg>&~HQ(6mzES?^r@fx0r?-I!-s&RRO8^RKdreNiW72P59LqX%Jr;}zx4~(`vMD@{3Fc&;tg-H4m`BbYhz=!E zyUdH~)f6jPp}F`5b!bNn@2yG}0bi1)8#v&+vSCFh`#y1i!EFL{#u-8GF#ogWgi6=Z zvlPCS^@$IKMx}#&?frt8+oN`9_enBq2;aD>@b--0kZ$KryH#frG*J%II%LMWmkzq(LHXV7jk`r&A{4acHs2=*5DGP1&#H zlRDU95K|r#788%@&bkh_R?|;i7ZtVQ_?yIfg9}>rCbB--?>7r<6-Lgqbh;(^a7$K^ z1u2k4S_XN0`qMm%UC+N9Q}% zNn7EVWb#U@qSEDx>8A%^*_hp2M3ij|qt664vwIa(QjIh6g}X0--yd)o$7{HL#od^@ z>1s83kW>Ed=0B$~8a*(8EC#&;%^;h#bD(_yCV$&f!LNrFb3Gp2P|?KGXBJ{=N{AmE z^ZQF7_vEpZCQ^dz06F`D7CAdvwC#Umd$?P;GV5m;V;PwSB1 zi2n8Vts)~^MHXQP3w#BGYjpWeA8uyG&Dej**O*gmiOY0&AI(9rszr21v0sIP=Vt|4 z%xyC%|l@Hj5h9;?{_;JeXZg^KqQ3P!Eo#8DhS}B&uVnJ%; ziZCzpfXNv}pG*4-zSUgSjd>;!#;@SP}q^I7A| z9%YT-3g-;VAahtVGJeY2sa^_1Nz}ykFME!A_h^x;cPdkYcnZ#Jk2}^}xY{e%EMYK!C=@%245+p>RdeeT8Vb zNMk(Bm*b%>u|$Lk=v2tw(T2UWN)u>HP0b%QU~plumB}*qgdZH02=bpqNs78uE5vtH zfGaqtCo%LZv}EXy$lV5YHiXaBR)*yW?lZ^+E=3Y4gdRd(uUD5gQN>>P{Dg#;M~=#m zn2=V7 zR_1FHFu?1kM-`!gg0jtH>G{zVuAJf#ldvV>+p`e&%W)kgk8|D2DCdN7BnE=u!wQ6R zL0y_*Tb2jX)eI`ILy(N(4N?;*$9C@Bh43p1bpI4Hh?fo30(XejlRq7?VInCLSyLU2 zis)5D+V6DTS?SIp*sDWoi+9gxyUx^*QtR=L36 zFTy_GSu8`Gz>qSRyr4r4MlBacYhj$}Lu%C>8m*YxC~oJOsB>qN>KtAyob1BGioJsB zZNOjrX;Xg5Kwc7Ty7kby`V0Na8$3*G72M&UPj09BVWV+aJ2i2pFb_8Kw*!7K zO+e&h-}|qEI*KxNplZV^s0LJz<7L4jwA|M-PiEEq`WT!hlr$=Rd48QT9(s-x=Aevh zAK^TQOuIz5(Rd|@;+#LFnGKBFWW<8i=N5l-p30o5@YoNDN>2*nl8=-DJ=`!3>5I&K zMn@cvY;|J^d@uH^yP1s*$!2RT$WK#@ek-*`!CGq(l)Kl*9^N>h*C0CE8Wa{SzvaK8 zGXl}=QQSXg3siqHxh{z^prC~djMp_9GNW8FhZRTb*usu9|G{bz>+0=XacaN8X}+!9 z$fs(FH&y!UaS5XXAw}h}=il5cZ;zKglsAwet9%v>KIzfB3;Lkk5zX$;ckIjK+enNW zMTvzo1lw}ydU>up^mrH;Px(wk&lu*`ov=?RnZAfb#70J9ZX$dX)xD2k3+-3t$2LDN zZxO~gGK%fYA@Dt&i(X1N9U67La?)ItQtpp{2z5w?c zQjp%~Tvf|ALvJcK8v8igYE-1Gtv|!GQ?UV=hgv^Qb~fLqZr0k$LS6?EiAwVPoHWNT zeRJ)FRF79$keLvqW$}6MgeKO34Ib$fq|pj$a(cMtRotI#Cau%E@vCsFj^@f`ZEzNa zYA%TwK_lKSy2hDiC?yT9fM!caZ#Z{5bGGrDID28`((7Bq5qQ+`2qWraAn`G?jbPs2 z1`gs`8SK`xiX;w35c;G!4zUl=F#~Mz{N?f_haL6~E|i#sAo%TFme>>6({Yr^x75QV z#fYbw^SxHsf25s3lAwqlA239{5UG66ndc~V=y6rTIfAcq(|3TDaIXC6H4eJ`hyZ!! zv<1D&I)Pf<_1gnNwx{x!k_{3G4>ZPZaL<2#_r^SS$l6o`Pgj;lU>9K z@_K(UHg%Dpy0;Phl}VMIC9a|mG1+1c8DM^G^`iLf;<;~FHa&z!){R(7GU4Eb9x+O4 zO)b#kO0gk5i}SB$Qn2R6*0-W%I6lF9*q*80EnN$p-4ONj^LDE6Li@LEeX>KYYj1mG z88^&WLoseT4Y2qsIl4wfK$XxM;Tu^+%ACiC+Z_V zn`wBB$i-Zgvc>zFM_|2b7ivsiOi9;eRr%C@&|Oqvuk(dsxP>$HAWu%66Ij!`X|!!ZRrH-lmZ zi~Umpd#aIftI@6OPj*@yLIzniJ&vVjgqZ0`Ohh(UapL6^q~D{_8MjJp?Zq^%d=fc> zCIw0{Gv%jwQ3KpV_=N|=?(t69zeJ9khh%mb4CQwdL=q_kfAA=1U5I8?MM6y>Wy-UH zfsg~E&ex`(zf;??WjZa1=ZHy5PTpW`afp5}fr~=9ItNjT05_wjOUCPu--)j9)BCNbD;C{-5I%CZFh1iJ>jJ$O|BIV`{j79SmB`suVr~i_Bz=4XkhRS?iY52gF&I zF0qkLVFp*`>d>E&25Ll8ChO9lp{5zkv^Izw((pjw3SmZHEY6j^2J) zC>kDMlTl`#mJUHx;bduBWAH%~^&sH8@32`0!uYpD%k~^oM1V3`B!jn@2;2wi)97Bh9O3yFwdxE`*&pH9a+gttga}^V$e@i371@j*WQA0WuZW8cI$Zbkv|c$QoZ%q#_j@QwN@9 zBfh`*wBpMhdC`TfLx~In`h_`rPADGyQs{moj0iDkL~`m{D$K7h5A%8x3p`)x4I$s0 zY285ROYE3Vwohqc&u9Wq)=JcrqzL%PW)F~SHTa)WC)VqPMbMnb;WMmy2xvR&iXMTT zQ523=x%gu4eL}tp$LhEc4nM0A(*grX(fJ4w#O_s#z0C-a>Q}|NMP`^Csd|~`Jt%*( zJQTiXT~c0mC7jNhog7L0*tH}`seeIClHL$-Fzz(^`t!^Iv$AFkA5t+Fd9l*kfIsK) zFlEi$reFu6nOO@OQAIOQA0^csFQUe(?R8(24DAwKJ7y3DB(tKXM91U70=sivf9o zyApC_woW!hDuB^xvzk)j@W!P<)7sLE2q7XlRMree$?Xczus)mwjeWXpZ^kn4FtY2i zP1U_?R~<*jC%CLT#Z{ofv>4v7^OY|cLMtSuQjtSK7If(qcnhaj_dS(^!|FXhWuSI+ z736#b5ma$IJP}L;IBExcX|$>*(T%z5eNf9Q-Y3c-C;-)^YF8GPvOtyM>ba4 z=6qKGQ21A&$X;zX6P%%)FLC5{X7iioTjY=9=*A(#*hzcdDe5t^!^Yln=xt&H1hoP! zRrg%k=yvc*Osc_PV4qx83!jvP2v(l_Z8rKe)S#U?CO&>7k;w1WJ5P_k@HZHzq+>4K zS1D<$Rfsuue%eo`_aoFF@*tUTk52k{r6L(^>dKUKLMPk;LlY57hkL3&uc*FTGJ)X* z8x-yZ?KZf7SmZfNR-X0UAzywGXPH(=x$KM}H*^y09iUHfHmr5Q?G09pCbF3b-U=>V zOW5S34KTQQd#VFtkTUmv!~8E!vPe=(3MLRBN+2!K@s@E{0k$jeCCoCzkYW(79uunh z3%2l_9ck)|n}2@#Znt3mrIEo{h77QEqheM*Abg5yK=wVD-D0?%1XvY8GN9c71`#9r z4+jW}#ol!bpr*#d1d@~aOZ4MwzLtM6;4<^k%ewsN^8!vQtd^?cI}+GPm1=Y+PBVJI zXB?*AvO38DC*A~g%zi*trNx``Z<2(uH4=^Xi&jMoB=dTJsmKzjn0!seW@R;HcFkZ_ zF+h2rYQXpuQkn06wrDa4NGR_BR)ey|)9J#nc5&?D zXX{rcGLs8?#~x)cx@C0;lEY=btT9%0;66As1_d4C%jAiD3*P>wyQQU!HS@5d%V{0) zyge6>IuA{%meV0R~ar@OMoVH<@E`+qd2EWPl{hP(ehq$#nc49?$2m`|3! zE}(L=5N~&de2}qh8zskr8b#2EGo1d6Sx)7P<8w(peme zrE)E=Z3WZ`Mk>+xBskim)o6NIz!k~>Y{2eOcuqYUeAAoqR1U{E#HUox+pN16+PbW$ z<}jb?dG?eSGB;D1ocT7kKg8r;oH?tCfl|aNHl*R-3-mCZIQV-ns|YUF_bIMP6`1{O z>VIc+ii$@d1s}_>w@TKg;`x{~ zp@hK_9i~PIM1pFyM3ZUJq5R$>Xa3HQ(Q_a z$BSdSdG#I z%97)2&mwRwTX_Qnbb&0NR83=G4z$$E4m=Y%wg|BizIIZ-?qw_8=NWYu!976P-cS^!bb?} z+u0dyJle;SCj-^s2AcNVFd%jLqXaqOw9!;B6Vqw+z^gbyK=4Q_T_h50j&>`>Bb7Yr zOz}PaDMfRxwv)ZpK3DC|@MHe$=Y6jBNy9Lj?VU{c4aRyvB2`!_5AvT?u;Bo`%BMb9 zwu3&t5fR|@)O@{n(BwR)t%T}8_UQIZu|eyaJwbOuY!V1}Zj6_NN|PyB*7z(QQCa1& z?>KKYJcOFOGIm7v<2XELL@I1UR*QOHwH%rlMRAJacKqJ#8*;yi`!F_Ugj`Fs*w&2r z{%YA^%_tNs!Obc9z?f{!p=Tk~#ATVXF?7i4@(efHBeK-(WCPt@11`oYDDqUk5N_r_ z?GFB1FO+!2=JC!LOkcMA0!w6n$0MLvHDwZ$Fdc2eGt;2Z#oyvdWCHbA_AcdSVRV5y zkkvoa2czyzYmt~)Ct1d2j%(QPB!);+`c>s=<)-5cxD?o*1TpS_UCB|UC72XPt;L8D zttlf;5&b}M(=b|77Y?QzleS)EQd$}GOMua`z@R1a%7QM_#zj`Kj1d+r=)g4P1|6Y9 z7g{Nme1nBf*AB@57#uKYn=(osEFu6jYCniG-73NX05a(^u!92KaZ)4!H3$@i*~OO| zf4eTe*qzji3nik?p+(^ppN~8gh}XF!k!e=1 zq#BtG_pSEyU|VO1CBn}36bzMyK{Gq4)AF;$cyhq0^amRlDsYC#8N6!`jCrO^BAgz! zXy!97%Vf#eX+g9RK5CU8S-bGcsOEXp3Y5Bhr)~ub%!&0 zU088!6k!Bue~d{5Ahk)RrdNxhzb;`%-6;nw(Q76#BVOnkL~aA6s@2Y;A!ZP#4&|pL zXb(~a%=%Y9&>7m(b9qm=FLJxy9#6Iu(xI{u6;^S`Chf5P6wy8XI>3;rgIvz*5t(2y^4$TK zz~33>Q?kdFwQ7DyWvZ=ITPThcWhvHpU^@2pP2LjSb*Z$`Y03ZI6f?n6`STpkhJhzo?sn8H|Zi7z*V@UINr=6)&gQ3*^!4$nUeG>; zd(J%@k*CS+kfo-ncJ9IsLmaL>bh&A@&?4N-`KH>EtR(dtGCOaf8sj7nMo7pBnNyLR zR7%sPmF$pmY_RXNvw()u>S>xWcqf8!MIKyrD5(isnEf5^QW0MS(5?&fmLhM@N){1cgayB^`T+sfomnTh9gknL0Q0AGd|Fv(_qf%L~7Asw-CY7(W(rqKqY&$>8Zmf+tpA&?-L?_dlP< zdjU~_Yudpvj;#qV5KnyBl-jlgmWm}k3yPJ4O1}V}=28%@6_s--a1pUlPzyPNSNtpV z?>9kVuglr&1LE@-r`H6iZyN<@D+bq&Fge)4`!_*H7u?;wWPbW>Ah@O_g>%1D34KB$ zif?%9QV;k`!++XM+hpZY_U#}XQY6CNp?1pzv!!ynr>@FH{_!F)`i+2E@D2@mq!17{ z&vmbv?*a8Bx?>|d9YoFC>)>(2U&Sv;)4XsXu`1WRkw9o?=XT@lT8|`n65c{G8`68R zYu^w+OA5_U6`!8mgVhjeII7JQJtNMAgbpe#r9oEkQ&NADPpN~Ji(W@YSw}Je!sKW2 z0WVxNjEP;(ojaJB&iJk>40rSLqKBYQl$+iU0n{x5J6;6xVstTn)o|;362>4aPNjs5 zv}dEuK)xV92#1!uan!SNU8FYGT=YyiaX0SGk8ZuHGwJBRtaQ_ZmSC=opsnj^G-LavkmBupft6V5!JeKSBDHtqIonBIs(YTBKV=%7n{E>!d?NqYMAc?*t;36hebrZ6V#*&J zv%ztwS0$CD(ee_XS+*k1&h}Z#yJU#O1RpRgA77S?Vnx7Cie%@uO|$ft8?7KhFAE^- zLOANyIpseLAtSj0P*4KZdhi`iiNtKuC+P&7^M6|e?)I~ikG@Ps-+v;AYLo;1KyEw( zr({*ugaeHR2uMl2>F17gF}3)m^ltkzu_?~e*kc*r%%AYi2A30)n)xOuu~)lg zh!C2LK$P9(DAu0psp75WIj<~WqdmW+*^-mazr&>hmj+3+zNL^tF=mt#F@kG2dY&CZ zM&Jl@OlccH()Pz|B961K9ZyhH^GA!7=#}BF3%w}o)uQu7l}E;JmRlRX!iAKx9TJC? zx_2lD9+>Km#YZzuvMPu>P{WSGjEyMj3P-1xD> z?|rz98^D*g7(f;H9bUflW5}Q=#BXi(50AvzJ&=&X5C$&QLI;`|q^-?XHrL{E4MMdR zxfgSVNL*5~M4_;p=9}`-4RhZ7mfZUAt0&BubCc+0aL#TuXiN#A9DrkH3(ppIJjpMt zndO>D#&w%#PMXKTcWN-WT@I*op#}_pGoX;eZRuWFgjh#v2+2mav9)a!kWi^)B|Y@q zchKg?DXF<{hFSR%3;{egwAQC{tM!*e;7u%oLQ3{)PIF6%a}ux4y`OcQSpms9b`vr& z>Fr0KBR1cGe*W5MvEccsgZ~7l(Y?g=jN~P7=f@3S{bO#y=?jX%6ETM283}+$Ec}NC z51!U3o^gl?#7EruGVnbN53P2vH_i{?#!(Qxo4X636_W8f6eGy~VV*t#wHOB1V$7$s z-dE&3z>TaeRQQAFm9!X@(Xb?ct-Why73GGy_h~@Q{;?>F96#WMXJJpxj>j0}Kydgm=C<|KwxlX_GLd&}ls{#dTjd zFaP6(N$W8VgYWWG6wR!9LNeo5rJ<@-?$V)5}j=x8J zfRGMjCj7GGhez(cA%ym=B2~SS4xdc#77-g_h}R|vi;9anSwIUy8C(Zo2)PCbw$(7m zdj1n8S)dccBClR_Vhl6H=`y2#i1)Z?MveHPxv*?dlt@{44eOdwRI}*a%nRd+08~I{ zPf)z9whoQ?REKWH;-pra$XuQLI-r{mC2#i$(N1(EpxxKuL|$chmO41AYXfvy^-n&e z1EwuViKA*5Bv^482D_CEk&1X|7*I&G*Qmx?G~WXYEndRl?eXpUnrcIcD#@^Tr*v=O zOdmTktM&&doxewvf{qcA)1N4Jqr@b&cH*?oE&46bAQItbZi0N*>_}nFg3)UqZX9a; zX|g)panna!)0(sH=0o}BO#5JEx3ku`{JfTKocnobTZLfX%*;4KA+ER?nNi4A3d0rY zQDqbf&`-WBgG^%aeYoW#MW=hhPTJO68pMn+APW`PGSBKY$eTxd9>9GWxw?}lN?rM0 zB#QNh7B`GXM4>=YdMj*zlTC9&PXGlt zFgd)U2=N6%=HuA;3Oo&afZpLYB82-7C~wpoUWw3HoL7X^wbc8lZDzg|C|}46CCIlp zgxl}MSm%}!FsS{4h-ImogDE4U){bW6cCz5tAI?K1Dws7Qz+1j?EdASF(c67{sx0B7 z+&sBRnb&~PhYfLV1V)GjC*)O!%+qaE}ZmsC`}XoV78hNUU@XygaFr zB^L?e$JN!pDA-+OjtaQQWuQ}Z#9FTlV2k21RJOp7`L^%2i5EV~#SNxSN7b_JCRiL-yJ8l(V(Y zSknRc(zC9XN8m4#vANapYc>K0IT4MkJ9_<`vhZj{Q`Vt+Bq*aB&+QRzP~m=p6!HES%X&J&IfY?qb3?rRH>H=bk>{R#uKE4`B- zTi`|}r8D{yEUSAMF)vEEZx9*aHKu6&;7D1TNYV)MjedAJl9Tha{y2agB4HmMj#BU!$Dg;*ALM^c=b>#0 zBmeXn-R7NTB&;&6MJ)GFYfEV2EM!N7T7aoAEOpaM;R(;j_)L;hlV$2*7Ypt_oq{{z zI${uOq+Z%b;F@{;p@h%^M~T(#>tAjSLr-k@C%`f^BD5jFUg~$F+kr*eHIhP>Bd(<1 z4xT7Er8*Nqw4~8GqSyGdins1C=dABkS+G_98Z>HXJ3_XB0>D=>ewa6vP>Hs=O5JjT zOtUmP1@N8>YL{CKLQGIDdM}5Fo=KypryLRCH6}xPKaM?1Ej$H@wDVy6z~w~AONbRV zetgDqK8Y0UBcMHZ6F-|RX|Rt0yi)R|qdW(@DU|E=TZpnGOn!AJ1c4&Pl@CtVawu5w z0#arS$OtH2OFjz(37e&9d&mR1{IUPh-ks$JNTW1m26_(N2ORH&Ds-~cC>})_64k1EIS%elzt*;@+Xz!P(`|u_>@FxF-gx~*!sf_iBP*REcQ4WlXbv!JD8R41 zzR4+`u)Kto(Y@kYH~pM5{>9(=XjCP}Ci&rWS<#e)4if&xl26GBryf{Q!6 zKr2|bTo9wIG7Nr%s2~Z+T6-H?Ocb3oo5WB-;4$)EgC`34-f@mPG>e>GA+1o%Drynz z#ez+6iIiH-bpXkMfF&qRSw;ODX#kz9_L$^#!kZxXXH&ILu9X`XeR^hs&J?y7cPX)h zR}lQrsf)2+=QUM$fR@*Oyt0IJ1bgJPHxEiXC-6jaHZ-=lX0;PF%ZK7r+fa`W3i+pC{bdt(aoH~AZnZ8liPHBpn zDAsfxXun|L7^-5Fz@L`kYOj(N7dd|yb5OlHUj(Y zDv}vl6tq6b)A3E4O=@hWpu9g$^8R?ytX^W}Zb33&Sa~ayK8KoB+)8ru%@(+2OZZtc zUb@**SqR|ovo1TPuKSni@)R@Nr-s@*8RnK-_HIYv69E>`>362H_Bj1?X8M9=%-~TD zKfkp^=FC>N{c&h!PE}bTcgrTF{q>=8=KR)uBJg>w@O6pO)~2A1+oo_bPT^KNF)BLO ztuKLPc+dmLYX2~s^m`sz-hTH32T}t5kAN7C{{V>jhZbM?TY>*C6+YYlLxs=wzmE!^ z<39#s{yjP1{}YIDb919NHvV^h#KhFx(e#^jakMvgG_-YMur+l02NvUGY-ws|Y)bck zb29(h@So5yEbMIb|9~wx2-(=a4f)LM^cHptT2n#dozZJs5 z@?Qdb{`n*Q7ufUP#=`vbfAFs_{ZCjJMo#AcQTgwq7iYrdxasv3>B~+Si9{Mi`V({I zYIU}$80a3P8lkTq*8SrPNWx^%Ij)j9F)S@jD}#@(t4dFm`Yy5Cgpq%WODM1C^ZZ)! zOX2eU#qaaD?CXtc!SUt%`m4sTc>1x*n@8Na0NHr5u+V`&W<1c*UsjvMz`)?EmE`w78PtyA%KmG~Gi(p|Kf@%TKv-o-$ z^gi?=Znve7G7jPQarp?^6^viv2z*49W{^ynSo901lm$~4o~wnl$LFihE0jlp*djMs zCwzenn1QvYI|Q9lg_>=^-jFjqGpKnffT)|6YAC*V82M$rNZI=(7+7pd%3z~S;lO3( zHCTJ>sqXJM1m8)ZvZ2RY%xryz_0NR#k$rm0*BGxXiZ9d0viBg&29H)uX?p-V)s@cQ zr*1EAYSzwTztYtBwjFv=`Yi|p27+HF!VMCypF(=;w^UE@UW*2}acelbFOhuG&RObI zVD3H=mlwZaYr>Fe9Buz_>I;cQ-Gry2CXUFU*6SvmGHF@g<%oxG}%58_Y05n?rQhdfLRV{xfctbJN?^tGtm zeZTOw^bn}Mqv^xq+DgK_sKkPp&e`ef z!i5N8l01OC*Z{d34D^^HTgWY7YDYpinrS+S*WA?j*(Aq9_u17K3;cwdKH;YIi?Z*8 zr4>HBwizPgS;rW1(JtWTPzKuVeb`$uJnHPd34a}?R>l$09cvK=>;s~IOp zdwU)4dzPCE*>hq$*K?+y0Z0`j3H3K=)1lS?>oLy}sg~-;5i}gmhZ!p3 zhrzr6#^0-bk&cDcZfZ1r1#9Yx@)^RhEkr4+U1bT0%`=b@v{!ke(sCoEW{0!m*q^-p z$jZ!hy{bE@T5?;*e+oqT5OHc|f59$Jksi3>3N}sf_}uXf@AwpzS z4tsnYw#kNFTpT)(R46Z<5WTSLO14>{^Hs>H2|YDiwP(~S*n969J9 zdNB60`nS6^-?eck{MEiH9!eXc7_`yB_fz0AH?wWkj{4?gGg_3nfr-T9qYK3I{z-Uu zF20}7G5z5)=vpd}=C>#WCd6cm2o2SI>>+D+n8J>_gn*hf;A}$}>2Vx~J|OcoF*;i_ zqX(=ps`Vii7OuJ*jPQe{s*3RWlJ8wg-7U*XL9qUjjEiSECRF^d2Mun@isK8&3LjTQ zjfTSA7)0P?GuB}~k-h|V+osP`a~H-In#%r_qPF1=nBIYNs z0l7)V_(o@lO?`YuwWhyv@Z3P;-s(8^;ff&f;5p+-67>=4#hqF-Y5_pt1%g}kHUrDi zJxump9rmzt=r6x}?8?-~KqJq_V$SGuti}Eh;@&ApldoI%E!%dzWxJ}&wrzFUw!3WG zwr$&8uI{pJd)N10--)v#&R*-RtGy#KGT+SkUW_?1FLLB~=JV^DGl6a|hT(L*bNfwc z@#HHs)%t_MPK>`@WKz9vAgu)*&KP(HyVuhr2)NHYtaQGQVFZC}_~=gm&YGK@p(zZv z(0C~-MAjLzCPYflQ$B zyhmWb)k$@Pu zz(b};7zSECBAiUx?7^iQ1G$MXZ|5_vQsH8t6xQ)JKCX3{wB$3>OBinvj&XJ@P*djP-?U>r_l}WRt z(+G~yY*nu}GtwMQ8!UVK9Qt~U8YmQT1L^@Q%N2g2_1MH@Fm)xqpKEM}KlzgH1^)8> zk}&N^IzfdF_=L^E)CUgClx|KyO7%=uGLQONT_ngoEWaje7#XVBxDRb@xa`b3=Hy)n z0^#538apy&^7;b^iNcj6xZWvAY%zBUj~G8|;SJEG=RX>Hz2c!t^X*R=$ttBqdjH#; zx(~lr%{9u8mU!oR^~Qe&*GgKy{;?cFDC zZHMO7>{4bLhq}7ulwoO@LgT`fPO#hJxqkP{6iFULThEQRj7S_9@tvnR4Pogq@!apZ zZeu!%K2DZ0cE;k<7`at%U=O{hqs*|`T=V7g2JgD1{7&(TVUOBkqc#hLtHd2B8hr86mvk2!&9$(xP3nBrs%~j z)8SJ^??r#HWJq~YN}SLz&)j5Zu=mJto-N-FSs#spQQmw$AJ4*i{TxAC688PCP7C)h zga|GZix05iGoqVeLXm>JM`&OXo@Us@%+362;ipdwOj9(qMWm(GD+gyqJ8p5*K~d6` z*k>|ZpMy$NihN(mdN*z2qJfu1+wgL9@c^!uNAvc}kQ~=eNgif_31rBD(t{~TM&#I}G@WrSo8g1jr zxVW$`b4G~i@fGovG2iRwt}Qz5$UWmA2$p?5ipx8sBLvWe6iWL1)K(~2*hFlf`#jRs zAa5d}em-l;D2jb>;31z^$N|O8 zoJLWhYGuZu10K45Hbl-kj(gtWb6|9WD;&f*C7{!TLG>{C_ac-F+pfb{qwmclU%V+I zY)43PMQC$@@|<4OCq?2%Za7A zW`p&t**u`LG5}m$pKm#st?71TO;CQ_tTA8*-K96ZWjq7m#6l9RHyTy&%e+dsq*xzG z@IbZq-@^oYXbwaz1H`{u)1qXkCCKhUDanjA7c%17zCM!@3J_F?iU=`r@FZbG^Kv+6 zvG5)?V8EYXV;-5Lw4hbpFbclg&?r($3(Z#8;dtuUWX8_dIz-@HDw_SyEo9SUt)CVg zWaN|!(}B-S9AvbId&DYwxk?RKp!O6SJm>*&gbE`WuHJGgtlG^a<2-jl*zGcwPLM?sS>o2nCP428(?P62Xl%9PolYr3i#l!w!W*tqQ zVE*IM?WkEOPmKe2OoCK)5{}JeZ(kicfDSBrfok1IK74Az5MEpj(?ZtVQ7z!U{eoob zyOxV}Py2X@vZw44hSQq|=}dOH+osvDEimA!C3Js{OCW_|j#RsXT(tVO&BTtTMiih@ zSaUUKc7S0?tpU2CyBt?B9clvPLE;g_bs+Iue49=OB1h(nF1YVkp z?B*k{-@|^{N}-e%@S2W&67@DMq2H;^3^eQ{PBgceolh$J?!#I6$u#!_KZEV%(u{*Z zBNP<);)~z&BmNBk<*x`R3vX5hI1z6NoMd3Y63>@`Xfy(<$n67zoLh3wufpGqMM~sg z4kwyJcf4)&M#74S2?7|OeI@TOF~k-!DF95oY5Gm)0|_vyqc^tVen4l(;9mO~ao50mmRj1^0-BJ20D@APdb4M=4=CFZ3r+ZwARcxJl3L4z677!ippP zW60g8;9{&$0{6m64Dz)dPlpo73QVwGAUVuk$j!4w{k#fwoVbrE5A3Es#Er5(cD_b| zyYiRjGH=9Q1Q%1svC{q6aunX5xuzN*yUaWP%5JEDS&_oAp*X{RDY*-+HgbXZi8KGm zqDmcnrQ3i9cBC-Ew&Ghu*j?LbTxB6@xJeK$TU_IAPD?9rNys;yH(=e{iMkEM63wl< zA(PbMZ`7nM&@Eijrm{lQz|1 zCO0@wC95;2>OOr)`Q2GvKgwUK0S(hU{pQ-7q1kA^6jb} z%ODfE8UMo}7CJ^i@Y5J?A?%tom53n~LK%G=-I`JCs&@y61j%}u!3@iA@nYb*C{<1r zb@S-0dw5t|$?c#IcjKzROk5{$o9R_x)LPcws0>pz{3^q)0Gj-*tQc1|nw^!C^@xdPY3TRO&}^J{LBHyc~ysz77!qAhSCIzunmZC@#oF6|Q6HOl0ON()mr z0dr}Q<%-a1;U|IG^ih{qVNe1;kl8laLuLSjGW8^QF%hCb@`*H=uUqHIt z9s2bUH)nwE7ny>c!u3#J+s%7c(}jcKZ==<=h}Gq_V3t+i&?_fQFTx6=pTG5kBdioU z(dSG0qe)`e1<+asaf{S$Kt9&x3}nS`BJ+QE0cy)zfroC~O~3RC^fa22i%lur9lCcvkzS5?~d$kPYW)`w-QbJ zA*NQ(0-X)a2(hO#h1oaBTQ4v$V1Nc!HA`%eKkptfy2#Q9C;UWIkk7dmP@GQ{W2KYU z0$G)@!poo7>Rwe#gKCXALVTFjlpRh9dhK~P=m|p;Sa}v8Rw`xi#Q7XUe+2S3d&~fS zLw&%rq?Z^!=vzx)u6kg9-=@Z;V4&;mlQ1=0Mp-N|*M~e^_d0F|+`Q*jVR}%Z zct%>W1qvRTa)gxJ843Zqai7BCszsz|It=(bleUhPeCa~UJ8={F8k(NjCQb@K#f)_- z<$@NsE@uRZ_YjA`OtxA!B#iBsl3?fm44NUiw+2bm2{fnKK2$T6JCe4zA3CCF+Z{6J6qk{Bx!-%i~QuFAJFG(og*Z(TKBE9Sg>I-6Hw>?6~;En7ra@`6p zk7>iqt0qmpBD?#XVMzc0i^?f`h$|Kh3pBfAn=B8)BLTDf0}k91H&i5K>Ydu^BbdfW zTGY%`oJNbgU@iVG!`+*F_d7GkBK+WbQN}wF)4HB10XnnP1m0BuTJ6d1mgJVL52YK#*IvD-Y-MA~nf4&swVk+lF|LjvdW|RE@az1Hr``Po*utg+Ez`zkbzeol?5hZ%#Zm3RV!>g_2qYs}n3p}^!nAwXa1g`=F zK22q5Mhe`JGPhV21oO#^E-(?kYg9S!8)I>D;7^orV37G zt2x;pt-}4clf90PRDLN4a##Phf=pv7lJUH7@A8?VVoc`JhIrn+gEavTn?!)AD)XFe z2pqJ59o&O+A-E4!zm#i@J{DM?1ILw?@zq5F&Pw5wGaZs ze~(N=yzF!Jx@^ICE77qAg-tZ7fRd~NcTY>F>hMBTQcXeN;pZ>)lAh>FFcJWZr+k9w zxpj-eljxG@Te+u15PJ-#vbk7zx{Ee>AqnzWcsHhOq1+JSkf+r@ADWUCT+E0VYhGXv z1Zc)RB(sNclM@UowZw?US84^V6h(E*bhwMw;RdehqXU&g?A1Inwp|M9}82AhABdAu5`E;^};x_YJ~MsrM+CKThCn{t00qh-*`9RJ zYW$X9g1mf%BlT~X#7Z!k=Yn?DoiZxNEPpgc8&+c3e`Y8U8O!Kb32S%*10a`_u}2Af z05AlJ-~Y-yk;u0AQq_rlN_1QSM~Jj`y<3rY(h8KY6~RB!{xllZrw^n&<*&G!_RE__ z;CudfK-$RbZq`8lS~<$v+RAo2N;GWHfnNkYpzr8-bHw_@33E{?S9puH!72Ydz9&x= zK_Yslym#aXlR=THRq(3^U%)EB`h9x){Ci5M>m@QHqF*2}hut>ragn4lBzjBYNC1Vq zfo}aJ3)91AcDMVVk|ByFnFyWu)wHN~gAN2}c3n{dP6X=@-Dgjh>Q~w^A{XI51;Z(n zFdX6W?78c2rwtPQGTWaep~}rtVzE@heCQgTw}fg5bJ4geW7#WEZy+%Rr<9b!MQt88 zTZIJctM!Wf+I~n4*ORh?ABv>#6DVp5Kns!Vx|}GqKY6;_Zy0Ny{#7TaOZa&Ic?i=5 z^%7HHn*@&M4-?5}Tx5#w8kqIxi@AifO?LR4$)eBi3QxCtjw*;G3tPSn=klom!ic!+ zI9Xy6774Rq_3*P-I=67p`#teBPEBs2(UQdHJ@_)|tivU@9+Sn7P~eLeaGN3L7IoUU zH~zt zRenyiO5o3W;gQr8b?8XJp8Dd=IxRKrWNxCe_7^77qwlvS68@(Nd1zMo2|UY4^a{&> zef}p+GJOOp(#RL|H_15$@(7!9Yr=Z7lbqvjVn(5_>bfW37P@L}CDVy9czyv2-9N^? zo>!QA%i3+4UKwNW9g_V!h4;R{Wx40V9=Zh|KI(eiVfXQWtqdM&Wv0{m`C|ZvAv!%j z9<}uUL~Ua!E!HvzxP0X7o0GNZe8!;-B6w0$9W#leH2v|xzVu$Z2zKvvTgOBoK(~6) zgBq-F4|Ix->O9c_jcG2Nmi)+E=emT^#}4$;4xllk;6HQ2{L$kVQ@X`&-rBfffKQ+|TAzs?*W1UsgU!Hu+2es=#*H`cUBc#W*^on=eS^fmbI$-9GExqF9InP(sA#vFiN%uZ>-AI z4%wfWgD-g6VeW_Z_Uc#ZW~rfs5QvMQ3%h@`WO~wn zHQQH(t+CAZ=A?F}$D+jGqz+=%iSQC<13YeYG3(M~L_#+I@*x8;6K-2{dTx>?Wdyw+ zQltAh#N3B>{JfK}&tp0VL^aHdOhHwBVmn)u4fT}^R%}i(#h%bXt6;Tt(!*=IY2z>A zJ43Lx%vse77#wz)I0*B%&U24lbzF#!;FvK%F%_-w+YMo&X0Fo$F(??GUE+g1>=0GP z3#wg~(U0v^a+=@^huWu^F$WW(lp*y_>8&6ur?PIkpJl22&LtEOxs5co)WuCWm+Fm; zhEYw7eEyL1jSLp;-(S}n^I=+PTy1IoZ36oN&~jS_Qf0r+`1R&(m*r7IH8yYyT3nS9 z2cYXj{Uft_K_l5aF^1m25JuC{6g`jegN$;aauyN(9LqzU`fqa{t(|Su>6Z5b83du< z4V;Dv;=vGs~l~Omk8@f(p~aDXFLxd;dE^$L7++4SV<#& z+=|Meos%JoCFNxlXQVSX@qK<0YZtF!dr9 z2*LSaIQjLiDb?AEBdh21)AE(l_E!BWFn4|bKQ_cYa()U5H`BK5gry48K&0pF$-fZL zO=5kFRHKMRw&YeT1JEG2a>^P$AxvByLS@WlwW8d1wwU2V<&_%|NR~sxsezBQqbSr& zLY#h6cNeji_C&MR!Yg3~^r4#`;oLQD9KC-+@N`-B&ji2PnyFe>B*}i=D$&oQ|_@u4U&~8Wu_hN(}wBegm z$d2dygI?)%cqw4oF~>Odg3|26i5!J0UJ*rz_6gWtPn;poCFe7B4e8vO&7xEp$EUz{ z0to?Y51*wiOV`SD`72O@GKV`nl^*TB#po$T7wR3Tz;Y^6LMe@4u~p-n5|x%Uvjl=(?w=*s<3%7k8p$6bEME;pOS z^qnlm(v;v^qto+}QiXw?SWYsOZv^n|OKFsi>Om)vUS8($BFccEJ9H~*>QXC(yD8`$ zqtUvB+P|eL&ZAXpqmp(%LivoD0+|62)$KM_P>G$ps98l$3(DpFlPs^~W%tX@e%IM< z^OM$vMpusFL#xRZ$-g|PUUTi3mVpU z(gaJu7u-~htdn;X&3Ykt@kK?Zffhs5gJM=Y$)QwDgbA~aoNrb5#UPJYwLd*~spYOL zjL6%OT66K9k&~C1%!BUhjm-U2Wrr=um}QYh7^=(bNp3<~TE1i_Ew1n9jJKTTQ?sV^ zd`AtE;KZSe&A%9#k`1dP|BE~Aqe4G281B_X(?_-fFE*uMS6iqOnw~X_b>T_(x!7() zKmQ>!h#y@PzNjpXd1M!gGv`5$9SzVwF%1hicSLnFVmq4-u0y<>S?a3Gz+G0p5%Img zC%VZTgnu2CSD_J~J9c>PNwdWg zI!Z1?ggSxu?3x1e3`G-mwj2ZR3A%hN*=0}WLEN}lhMjYT0-hbXNjRO}qR> zbvfsp5#%s5jSa-r+YY*17!*aK?`4{`=7CiuE}2UfoM(JauR<42AQ-N2?NZn})<+4i z8ose}@`Kpr2U1w$+i9$!Kxm%%2aBw;Yt~6VYwsc-A9_~w1(?g~O~>#{XMA+lfQIZj zrK@vTI62G!`l)cs>I}I9d^Yir$0|f6`*sIG@DXTDsupsk3xvIH#yeQe7Tywe-vcF- z{RdFulbWP`~xIUeJIQBJ&-Ps5n5b>-crHg*RQsUKSr2_dj+qlt1_-mX|UoX3BeF2kl=a)WA}? z$)va-y9uP`#It>OTkjm6ITzu-zik}Ni25Sn4$Tex&h7ifl6>$pibgx}5nW`07$M$^ z{SUvyU)vi-@((A>vWT8(uF@ii{M6=|?1ck~rV#27_e-R8!=Aat_i>QQS+z%MaK%(^ zKuYK%4_h^d7_}Xr%#O&xRw1t_0&W7WCWC6g@43#!)JB`2$NLL+1j3+%2YiWAvh2;_ zK!u^WKj8B;eE2X-csi+lTr@nb4p@6MIQ?gaLc8(ueHcif>t|%$VB{c1ltkH>BwUTS zOC{B7Dj`j+IxFYqo#GVlHcjl$J`ggQ!!0<}fTH8OPM@it%j?O&d&Y%2#d^#_$Q;>D zY^vi{YjyEgD9N$b zS0lQ-cHDc2*a{9R%Ie6e_wTZ-PSr7Qz!*qL z6}4<;V>iyRH*@5vM)al8MDhYSm;-;M`5TL&Jk!Nr8Uo4tfLR{jC$E*dF|x2(Zv#C) zffPWx`ujp!MtI3kUOts;6+o7;#ZNyr2IFxIPm}Vt-_3@PDU+Kd!*ud0cY)K25=ki^ z#`wQmV2?fSQYecCNULx|V1d!H0xJlNT;zFHWav;Ge9;J*khuBL+*0rfEJJ-*Hxv{h zK0vCxlsGznY%k^g-?2!RV8yVof!b=|Y~vIAML*`H!uGF0nIzjVA4;&xUuu~pm68-- zL{2}Ud3fM>Sc{t`Bp5Pn=#Xwj?c%`{hd#$Jpa2$Rn6OP?88bZF1P`qD%`jk90v@^> zf7wxz0^Ke+O^qfZ-}|vqZYeH9nQ$pj1bbnB_hM{gqm~fwasNZ2$HIM*7@oIIfdi#cFhyG&=u` zW-){hU&2|>hp{f!gtu|1+rGxEmbLb8lZpkZZ&RZEyTlR59U8z!)$X?kw_zu^M_$x* zFVOd11gUc$>1Li4Us3Lk0VVgsGVRGY?TOqlo%TFZGlJcI$~3J)(Cq-Bu}H5X9EESe zeJF3%qXPLuYMd9!U}d%-&wz^eUJR9Uoh74&VJ}n`MiT%&X@g~2k3WQeLc;8~HiJue zjU_#2w2tE(^`!&je$(hfK7^6{ak0hsG3odA?pG6JC3HF(P4a`7-FPxzyo?I2w`-o} zcdP~Jq(t@mlg%E&+PR4>82HZGls`XL_qWKK1-Rg|F(_~`#GdVlHwScsUl%jC?nRFA!>9NwpVy%Qp9~k! zx`xF0`(85-mJ>^5#Y%@sBf}X=M*0f7U;CKB7_iTCGL z?&r&2<%G}C`VEF&NhNyzg2MK9%7>K|=RI+!cy724h~~Wmc7`_IkJ8>x(}b(u$1h-= zAwsMFjiUQo1^oX(9I*WxalrO(!~xqshywr%+dp6fT?S!0TW1qnXQ%Hg|I&ji{oh6% zZ~$02{t1mij1$1h{*NA=kB>pY(auQO#95m`K}3u}#l+p2LDI&+%tYuv4#NL&kktMD zr;?rXw^=`ckwMwn(Z$GF!NBpK=`nNsZ`IuYr03ro-t>jg5t#4ZzI)gZ{@ix`6dtoy|ti_CL{Q|8vLwe?v2OcD8ro zVqkDIF|%-T{)QF&XRWz`wTq3d#rK$jv5ke3lZBn_e-|+)8$CNSBL@?J`QIV4({r-2 z{`fxsABX&(s09CYHvij@|DSpMi?6`oX5nmZ>}cR-VEqp^!r0Ny-rmC2>{}%7;^<`J z^xsW}jh&vIm4%Us3Bbh224Lc3`cD6kfBj-&{~sm)U(evblmCBCQ~sY;Wc=5fa?T$d zjC_3G_u9n31|G&e>q1wzmbBf*Cs&_o7MNC=xEv7xwf$$+*R?^wSHKV#Y8S}ilOL(! zDm#5zrqM-(`r)F7yL0own!Q7+IDwMj_L|Wr>h;Mk;j{Ab{buXyamSA@h&olC|Et$G zjqmT)*X?L5gWvO;KL7h;?EOvc*IR#&UAec6;>2k0*UO+j-}^}>jY9p`3ES=gN%zPk zVUOP4!YrZhTj(Q`V&0@aq2K3Z=)H$d`UCa1f0gvtbEED7J5{I#NipsBP;BfMmQlht zk><|Nx6EJpumUuEkYWBHa_h_c?QngBeU@J^6$Kiv_$&ynmU0-oxoHxUj#Q2`x!1dY zli{5q!wvE2@Ur;z02V%O)Kq$JsRcllq>c@Dvr$o90Gvg$Km9UUyam)IM z@?h^>&Jl&(>ZP%o+06SBGygiwv}O$3z7)L1>1XE5%v4v5Cr8M-kO{FdT$HY&x=`XW z(Amx<@>h9R@I?=)-<`W1Vv|C<6J;{Zb=G}@_k&Y;_hCja!fs+~-OJ-Eesm0F$V_(? z7O$KAUF~Qq_x9eRDIsjOE44zRLOJN&9hZn3PKdbXBDcwSn2F5hd;7@ALRI#pzL?Lj z{x*T}In#ZxaHgJZu3?^1;ZUvD&cn_|VN;M2M+)uM%)}AqHhiTb(g`wGhOeXT!)uN1 z>`&GZw56GdSIa&a)2r-PvHaTUIQmur;<4=^FYMi%kjpdNF7*}E4o9aar41*f^_`xy z3OrBA`cc-;U0lrZ%>68>->PHyk8$K#N$Q9v6PWxSg|0^po-Ll+MALAshRSM7sbxy> zvU@$|ZbvXbLTYm8Ov)Ds65K?U_EOtL`v}^#jg4c;^%8pBx}=Bsf6h{|p*^^7{ytZl z%y+o5=&x%(bpOPEZUJ9I%pzmmKnt_G(4w(htR*+*fT;0TI_a}|u!(hB>})y0)t|)I zQ6=OC5uRkQ>xA@KkYsio=`eCd)PGU}_rw~fvY$fN?25c2R}q?_s^$RdsULl;K=WA_ zfp!@04u0^2fwNOpF0=dN7oHq!P5m)7Om=j~(7&sHI?_%)Je;=(^y9koU$W6*#b@UW6NL(_Smun|4Ennlofj zqULb0YTJ)kZRK;)Al5eg_sn73?Z*yL=Ww{kTfZuo`C|pQ)Dvq3>!)T6Ns&T_F$`yr zIsGAX&ac%pYggm%M)~pFE-+DGbg{H5*X%PuK8A_`fX>Yjqe1NlONY0BP$RQA!mvH1 zRs|%q_;r(lG|^P!U_)PV{kNSw*v!Ea0ZfjBoPN6a#ruqPq^_Hp^#mp~<$Y{;|Jc$I zpZrc{NEmFPNGzA1sTQ}GOpBArrk z8eY{EWQAnj8z++@gU8z__Ki{O2q1{4pL}8=)F~mCk#}zz)0uvvs#MhgFiAbnGxY~-RUg!# zZ@F8LhoxI-6@})P#x&jG35q@O@MK9Da}#ZCpNq&W;QK~A6wsNv)aSe9HB^83p>-}h zxHx09k@E^7Z5eLzblACW$~y1{XX2fUIJhB=PiOUeM@Uyu))Z-c0Oma$Y~$2YtB^_; z;fkd!enjjOveHYA!h6q*wyYy9|C**vA>A9%PvsnYl{xK7Qez%K^!|mlnbxd}4vMmC z@jk)KuGyWSQU=gFz2X_&!hiS`%x`LQW>u-dIvbf@@N!3*FRnG{w177c%5tPPk^Kv} z+$?KpmWU#V^C}mmhV0sHt*^efVNJ)2yJMU&R@M~GOK3S{(u!ji<2hU@?oIc>G%N0X zss#_325GJ_Bkpc^GWi9S)hFs#6ylyEJFh%)>^NJ>f_;WxEWF%#JM;cb`w}R}U52*K z#Pzgx8>oxX0s{J23vD~Kr+*y}n;Fsb+OxUi^F)A~$M3+^X&DLI&3yf9ty)34na=!W zbN1Mm{rpoQ;l4|1mKtmrOX4u>)#0dxR-87sFzN>kmj+E<;8Q3C9w6Jp%7XQcvkVKQ zAvS0_QIU)RzpQ>^LemPJ`8sP7ja45|24k!YS4g+<%cMur;cO$k;e7G{Ec;&Ocj<(s zGAv#FXt#IUo~Uw6Zh?p)K{EjBViXyn~rez2%Aj5|xn zo6ITCmUygSRaAIg<#1uukSPyEf;}hBD&W{DR7ep9n13FnBlbj@qW^PBk@8Gn+X{c;0u)$Bqow5-6sMoA?j+CSB1TgMr zETJVSzXhPPy$ywO4_F@Qg{3`{_(ifxr}^mG6Lu0X^+Q<*JtQW$M|U(mTUwOr4Z{jb zLJ_oL6#Lg|8{XMR*L`a=q`4$Mswa{v@t6|c@PsX7nF0B$r2=` zX0Z$%UW*TaouTpUwBT}UmYsaCIb%@3DVLsiLH%fTL)mfy=L6xa^o}cq!!fV#SN5 zU9-}B{Y0n~MpGnOyes<8+}QhsV@xn-o=98FPKvur`ThHE|D zLu&T+P)C*>UvC*Gd$1tc{%}ib( zc4eff3VBUVx`eapPH@3c;b6RB?9T9V2On^oZdcs-aPkX{>|M-3LK*XHCVY18m_&pX+Ig4kCywE#A)tftx;5#Dv0+k=`#+UrmQsXTt?8U#42y zxDOGgS_|J9nxE-r=IgiiJ*@$ttV4ntIP@dFz71LzlIBb#31G9ok2l9ki!n*fo}dV( z=m0(!ZRirSUh-=Ub}w7S7noRwceZ*A_>g%S2z47udvV$q3fGRm7Y&^&r5o7~VU~?8c8R7+1WMTcv`dMZb+T*>W&Uj_eWa)XPOc47$qO5wIV5)C4h*s$Iu7uV3k4o2vJU- zw6x(cQXOhLw{31Ef1Jfw_Oz#RSM<+gl}vPzPv>9&UsAv;QhWl^@Z_N6HrC# z)Y5RMBw7jzId@B?rE+Bz&HmcIwrhb z6wj_V06$Yk+t`^6=;BGz@TI|=xjFq&P6k)cyNnbc?84$F~i2X(d!mxZlw06 z7O|a8SKHNX0nfdqA{T1@?M_WfuG<60wyw1Z##rI7?gW3#Fnf*5z4H4;)E_vV^|N}y#)Com8JS*;|UoYEBJQ(LK*g{f#l zB6~zNP8+FcRl5WW&v||J`2;xFY*GJF$yS_aB6%y)YKizSL$B4bDfg8|&$uR9}ky6mB%~^zi))Dx(O$}%~PHow9FaoWOH0Xze>3RRg z2z{v)0qjpDo#2XQp`EE?yIPg6K0t?4dWN9KUDP-M~%Hj`ro#l_j0C{ z+92DhB{u@R=_!AuAQAejniGRRjnrVGW%B2coizNmIdM2fBK#(qB}t#H9fe&*G`oXW zq84uRiE7`$qWo^kPXqeMrJ5;E6Va`e4!0u38RX0tnI^B!+!x>e<0mkvP?k}<^hi(mvZ2Ld53fd+g+XOk z=41(ejcy@a5SiR&RX=uZQo(qYXnLl-n9(crxRr?S7sp6Vq?-h?M~=#aAooT4mZQjP zYsH`)TnSiUJT)}->#PzkWKo526gpL;7~pCNS}mKS6m1X_ly&Dk{b1lSq>f)}>B@^h zS@vqIRt_(u8sb%*OhS|>E6Kt)<`dDL?rYW#ikxQhRViie1|~Iazx3)ck2t(`TJB|8{?@K7b%RL&2(-THVPe5l$de&LIcSSpAE?Q-%6h?vVXD9n?Y-r>$*`iB?e2tCN29E`L-@q^jLawxE|%X_feu++O4Gf7`cYzRO00uCWOjp@POK^ zWz4orgxR&r2F;T;8B)dle)tffL>Al@^C&kuH(xZ;SDUTQn5DGHUEsI(yc`oyr zRo*|)Tt<1Z#-C+1M|=exVK`A2aqRwv-cMh6Talc1l_~`mMXX~FMSO6iR zo+{I%`XRV_efLBaheYgFN6`FF(;_f(6p#5b2?;z zUO#3V!*(xbQT}esi+9 z9JF~xeS6>?-{>_NaWFvM5*=pp>DjHpXgs8bTXtxKxMap;YCKSwjhg_+eK(aBVsgCa zJW26XoJ0qAuSAJtfz0Y;sPZ+W0Q3fJ9%o1nW<*X8>ww+OUJre;8>Ie) zcjBr>&tH%JbHsxpb2R|#+2)ym5zOq2NR?%DL`_H3T;&Ek0<~SIkvSVFY+9Bpmco(3 zJ)?j*OdtW55gj8;wMf}lzjIwC5&RSNeK*31)#@s?gx8;T zf99pmeU2iAjtO=aUp^xmAVSHC685 zHt*ca?mV>oRPOLDJ=A{7*V4489FFMEaxfO8NBCs1hzNS@uRrc^7|FR#_as?zBSEgCHncjsj+y4*7Z9y!b~@tztjZTD~@4l z3t8TzzQt)+3*saZ-J=@cH50L;3b2uk`;&cc8t%4Blr$!am%6a(NB3f-Ti6qtfU~9u43cAW*3vB42!3&J?}Ug?BO{M&Lp+A zot6~GrIOcU6=+tt$zIj^rwjJrvRWPsX3i;3N=QqIUbrl>&P!a$X!b-Z=B&Aa^Yw!$ z{3JCc5!=$JxfU&gv&d za!0cq`QnW~Z|m`de%2}}*WHUhKEBZRBIx*faQXbb7j*Pob8g(ybADA~cV`LoB*rA0 zrX=^~%qJ!D8P$)b7-<@p6{1Us%S-L7Wy}E+?M{}P^9UJby-$z)bN28FDnCXR9}`B%EgeRd|~<&R2ZXc%ivsC z*KZp^ai*;(8-#x_(J2)^S&PI^7~B#MogZB)jGTqS5=SCz5Q9w*UXzuM|*S^=4L7pf?q55bPZH+>*tt&*uq z$j1Xop~jD=?@|#NlCwYck5JyQcl*6F);p0GNaU3MoFizDuZg>lvcPX@J z9I};F$WfgvTeekMG?Cs%fhh=XqPhd$u5Rbi9c%NbI@o>M8l>KUgp5Je`JB)hvgPa< z{_!0r%a?JwnLL7&=!mg`s9wFW#X~9WRa*fg#37;NiuRSl&91ixq*yn70ahag7zWS% znu9&|mD+Y1`GCKDbxK?iv2oXyBp2b*A;rQGu$6D=^fqvLt?Fj+&T&F~gBDt^E>ttp z$EP=NG7-m^B>%{5$C@#EHKwv?*TvmQ7|RbtTEeDJYEI(#za}6?w1Q=V(-KF?r$=Xc z8_i*sBoP)Qm$nDYeF~U=*#_1!C|dB55S;`^zdr%7My1+52-y{avZZhp#i5G)c0dm5 zt%1y0wznS(PXSj<(rL5!Xv2yl;A@qkS;Y?_Wd z_jOXM8b6c$;;*E!q!8nq@tOkRz|f&SW7#dbb8-+l<3qY@03VZ%*k2}$?EnJG8f}yY!Zt}z3YEBx)Ohv~6v1B!l>$$$?lkp@$aiQ(D*Ukl zlMAdg_Y$njz%))Od@XA7yy#Nn-ngW$NlKz(Bqc8%P>GoF5}?nSVbR%y0uSNYl@4$Ha6PblpXW%ZrbSGVZ zvuZ{ebIaU9$dJ%YA53|nLdG9DmA-1Aya4j#>VoL@<`m&cPK<4jw$MYkX-tc08Y`Ck z0abGYfgxt~#_(_)5Q+eyfQPt1$}YvNH_`e9OCK9&jxGHsImFBkU71kqYDJr$R^l1Y zL>au*v^>$`zLXu0+=Vi#7gK?!r>_nD#-M|?(xu&@F9}BZZ7^kA7BWl5D1NIylSIXe zvMOGS#S@PY^8o&ncMd%EbrKWAvWiSwTz-`IqwoHuY*4O!$~$2eY(T9@V-)7fyl zcet*XPq>Ix)7KOy>uWVU$@@I_t=N-2W2>Qb!YKk*vGS`#1*s?t3< z4*|-U{pZ>!^azVeO;Hztwtt$puF$ccF-}#ZiNUz4!01qYXz^}d*$Sr_5~j5znxcm_xdwStrXo}WMkd_B zr*&K7k!UUfb)#B#0GK?3Cmy2|VQF_+#-A2@zveM43|A{NE@AAkQduykAF*4Eu5oj&KU{pa#6Pt8~o#@+JZFW*5 z`98ab{o@)PZ>F;nK%dZ%B;Y@H>Tn>L!$QE^m{Q!@!)*IHVMenC(rWZN4q9&>B0$R~Kds__dA7L;%6Rh22_ zdiBhHta+;o$U}dRu_U4KFv^eW-j1?L@zRDxRW-kobEQZEVU}qs&^|M>VvqrwI8$*= z+NW+YZSyqBk8E~xR>huLA}0EAe@?#GOfoImbgjffYGpf30SRf({Zq%d!Y+VJMS|L_ z75c3Zm;yEX)QPSfI@8W4xS?;oIhD^Z!v3u{kf^H*(v8abssv@@2$gB{$@s~Lw;hCS zQ*80)>p(1_FhTQ7sN-vMBx}Sq3Zw-TFI*(cc&jO`?H0B_Zy?u8jy;^-XI;gE4TWa! zfS%M4#2dW(4WSEM1pRkHz*>U?HjC0zYtBio6OWD(>MV$|5J+JCAe8CitE}94yg6pf70ce&i*R?Z8~8D)Rm8xpm5r36K~YJ5!aw5TUN- zH$V>ud$9HlLUE;K5+hEzpkymPy7OzYM7E*})S9J|g?%H$C9BJpPs~TTt|WqXB|6dX zxx`}m+m#Ok+~&TCkNVBN!gzoY;f4vV3cq`eKO6C)i~jo_3Yrc4P`GS06XKer4Z#6; zzp1Q}_wt@M`n0@b0mKH-1s-*FdlIgJ0OrQZDyXDzQU-x|EzYMWY)gqcZcf%}z52u2 zbaShNXv6>&plTL4sX!&o^BI)s7)~bsMwXZiqpoRS5GlN5baN77>DH0=wgxO^@`q$# zg=DLllsDWoxD9WabN&*196*YC1ZlfA=JfY(sxLfgKA6$1_ft%LRRDQ7$FFVIQb+vv zYG3f12~Zhxw^efTA4_(hF{29+zu_-EYDJAzN-!kwL8P@I?kihrMX+}vMkBAr2=*)k zF964tZ%_~yRFRVs^u3S;*pV;PX*k#Mt1n+;YZSK+|Deaja0pnwk|~di7Gv%Gp)Qc& zu5RYtAmbp_x@W+@-2sAs&|SC6CRv>|=*Ka2;{J2{4!IQ#s)~IJzf*GflQxwY+6=nL ziErIUWC3(zivpAtWc`$TwC>0Jow83CO7MX`bYKaEtYUV? zxGCc^L2FUKF4Sy55P|NF0=-wr`ei6lX}9EJNkl|@`{kQI@tO*99ALyXeH&ojwT16X z_@w9;xW4!vUn^|FWct55j+2eFv?nD2xXycV)1+H4q-?I*FTd*0l#cqj zXa2fp&N85(YLO42BIu)@-0!AauKL=)Svs9E-04Zj-Q}rh-{qNL4J#Vme*5Bf;(0xP zoni;K-U|6>7MJ3oMzlDY@N|nSVvVi+s{BLW94BQ#+&hzl>eBl2ATK@l*e**q({`p_Z!2K7S_^*tm!3Ut#GjRM*EFwK4Jqs%UpY>y07@3%8S=m|W z8Sq)z{s@Bp9^*fTpf(O>|0JOQL0yb&jI=BOdN$VIWifq#RYrOy`j4|eEbFf+_s3-! zn_26b8UA5qOw9DO^z`)XA9|LV6`zTXiIyF}1YrEIwCsO^H-Fy*e_YvL$;SF0p7dYS z+5ez#3;? z(0_As8!Lyu=bfH|#UHA2dH^jOEBjwAo{{mRe@x7@Ozezo%zqvI(dhm|82`7i=HDyJ z-&5+}XU*&Y7Pf!QnpdK~4BL4fsE*YG6*4kjL1ThDmuPX1YIo!5N&>@<`tH3$e354& zR?Uc>KuJ>O=I&iWBhT|_W2B<9?gHxkwh(P;2?AzD|(Ak^r3%KaC^Ar#d`w`B);!$ExbR? z3SQ(V#qXxb>g+ao{S+ulOdqp->pwV)Kou!uC-i#F<9hWMj4->I_thabh!mLLTzcBZ zFo3;|xMD8HHXpAoy1IpV>b>iq?9$e8mY^v}max3u^VvO%0~nrbioSEGJXuyQb(6*^ z9x`*pJQAP2x;3CT8YGmE2&spB^%GYzm>XY8I_JrqryDc4<$5?3PH300uJgOTZNfDp0C5|qbRPA=NOa)qv)1nZL%tn2I zoW1}03|DX3#gVkDAx-;}hzFP(jwA{4T2@^@OBN=E zer<35BjWO^WF&<$v|qF%vMVT}v8uW8h74#Ge`eWIn1I3UONA-%!T-2-9PbfZ{T$Hr%?GI}y{ph0^f(yr4Qk}UKUsMxb zi&w!XoAOe2`5sk-&1~hZsP-QCh$A1Z91(ihXl2wK^GRt?r^TR2K~JP=RC0 z#e<;~rr5^`-2;yBED_xEg!T>RWc6}+YH=(C;HRScdg#tO_|IXQO*2Y5Na@T@S|JOP z)JpN$P4L3p>z0Wx{-0U4hxI7mJ)@3>ca(@eY!YWP;7cOw2lD;Qv{KY^k>U{qg9tAP?ZUlHZ-AH@7H1W&zZ*PnI0KIQnsM zni{i8eIHo?5$bWR%E@ONUfg_i{XdCOidi8Azo9fIi|VBX2uft6G`zr7%^OoC zjdgQf>@iDiCDO1Ek2aVe+n?oz=6$L#uL_>`KtWPI_6vT2B6gvvc!jS#KwoHzye+2S zxj^M^iSDi=rBY#ZeX;+XR!IulU@@mR_VVgB#2%teMZf^zvuRKf=HG+u85#Q1HmzRO zJpM>9x)}g=P596Y#zu|@Tp61tq!9`fkeYRm)qmNmTyrRVR>!FM1V|28Dd;$--RE+_ zX#19)-9?~|h5f|kWK#_f|5zsbxd=_Xj*v@xH3bIdee{;jc*dNhAUV!f=n0m)CgSBt zUzq^;(5zB2M_WTy%s1by1KVK>y2&bW*X!$N$)?x(sG~=HLi1w%DbH+lK{_y~l(dLf zoWQv+WzBr6NbSANd5;i ziRjQqki|B%Yt&5#P}FH`bBU5DCA&c|VK}-)NMCWm80ye3c2)Nd9bPe_kMYtO%>$M@cagey{HXP_qM`MClz2!xpS=s&QZTIQz1t<%;`ax3L z+K*ri46-sz{X`{0@wO1$9}%jc(3e1n)TL65iegVN4@~2Qxl@dG?02Jus4lR$c%81t z*qgotarKevY$4fVtgpm8VWm5Tr5%f$-(3o~L9z%I`6rrX7h#OXVoWp=hVR1PY>$do z`V*MPW!qa6E1jMDHaxGzxHWCXN6Z}>`aao3fF=97Ec4Jn&V+p~>LhAxPX(Lib2%-n zoJ**7R{=nP;Sn4nzOSvtDBl{g{%~Dzx+o+X11`S>3p2;8%U10d@u?LWEQOw$2Sio^o+ksVqXkCA zV4v=)dcd_W0ug&No$>0(W7aV#l&(}4{HCc7aP?`XI8xc&c&{)L|EGAX@&$2-M9z}Y)b(7xsg(r3?*rv2?^+kMW-&gQGYHO^NB(Mu8Rb5*T>jk z8zDy6+`TO5TZK~j>{!e8jayiN+{I*+8`syg;}?&y%>3B*Z()r@KS1{*QfFG7#}y^W zh`K7+xDYp!aN(GiwNa>d%J0Y{t^~{CE0u^LPd+p#l^6>_C}#emfW*}piN*5B!ZXSv z{%)u}Qo5WC;#kXOSKf@c=^hjk5q}4s)FI_(r87DCa|bdoCUg%y`+1U9Xl60k997%-?%tsldu4INM1k zPa{vG*Bpm3GSC!0DVUAU6#>v6*-eOJ&Wod*Q9hqrf3D4^uh|_h)6SFCHUu4&b`%f6 zG^*wkeBq~VNUi~65XwmddT-olE5aSw!#Tw<*?LCR%+XYKB@5dD^NjjJ?lc7DJ<5#D z5&=^ckZEe?ZV4iVIm^0hDhTlZChkH6a~ltlB5Qr@;-Mx-MKEfP&;EU;ESX|Jj+yr( zMsHnpt*-tPD~s<@++k)P;uyvyDAL_kr4G|T)ueUr^blQK&9xhpfron<#hy~!I^o4E z3gZH)nV0iH8UQb5tEzLs8_LZi3e^{G);t&f~AT0=XPuf5Ad#!foX#_ z3lpk24RV8o9@SmOhBgq#kI%4Zs%rPxya=adN|Y23RdN-2qSL)LNV1-Q$xR5A^RaM| zBC9Xsx7F?&F#IF1ebCDWg`{`}Uas8}9(QUjf!g5H;3FH~!Qg6^>J>K>qVmC*9?X3P zW`X2};@Ng%c5pU^ZCfWg0_WWYB#=(Wji=l~35WGb$e$d)()VWJDw?8l#*exNZKiVD z7-b|Cvl^-wZ`ESZIl8)@?rmQFWK5IZg8LdT4pqy@U*O~YyxrZZdd($`SnW$U&&H!~ z2&R$%xFb$ei=0J_xa_lxKC>AzZCr3LpWU$F7}S=gv5~ZI_fcyVTCp7Z`Up{bvTBkp z>;rPq;n^fZ-nEEU-GBbzciHhdvN~!JOi*E;I5ohXNG>~Q2C=QsvYRslYXB85I`KM^ zbvm2b<59S0LPbHKnZO4)h%8xrc(>C4#k&6nt6x85D^H)O)+?qatHBm_T~BdR zD##EspLz0ynXs-p2 zg^p^y0c%yGfH1c&SIKQ3dJ54{4gcIPsee=X$iy60c^#XeTDG6vS+q_r^JlpQmSXnq zP6h<3o{vuIlTre<4ZQx|4*x{BjW`aaYMsHu+pify2HXS=I!M7^l!%!v!5QERd)GtB z9*@awCYPc5tx6&iK=%q7?OYHsSZSIv#C5&|&Qva~ju4Gw>$Jr)_Z4{)LQF)o^OVY_ z3uO?&5*af2PP2^V@hMO4%NW_UfCBVzwb9U)Q{#pD-V4%X$dwL-2H!4xm}a$uuW4Ly zxmE6D(>@>n3F7DT6HS9Bm75fTNnf#ogOBG`y`*yJ4Ucm9RKEIbj7OPJcU4Z{HoRnz z!=YEoWqgSo3bY{JzKrHrqXWqDjZ1H3ET9=T2+?mFWQcy$NXRbo7yn@bd)q}12BFqb zQ0Y?Y%q8a_&pO=#eA&f1Sk1V1=jjFjkujyDj zMMW}XDk15ccW@IwYL4FsN?m)7MUF0?~?5Y6GrQ8Z;2&hdft=6^W|YcFe8*J3Qh zA%{9?cg5}xz;<%t%WOW+H$RF`N%SiVLZdSaVRV-KIz@f5{VOH|i=CO(ceT3xMQk7p zH{)QWp-cTl&R}h4eb5n*?NCRDfdZ=(%84>-Avku#7VEnv0ckG8$ToNlrWuO<3Y6X` zp&9@FQq)LYJ}-9sWrS}#vOJ1x?@|vjF>FlD+dp4{2%pk=(EoXySMoujL8y?|)aa`k zisgNVQnY{pq~$>j>9>TtYad#PSc5(j95)@z@@5r)>)rGd3d2{Eo&j0&tQpN12a$)i&5ybjW0fs=Q9 zMacFQ&PEO@L@V&U2jEQ>aj4p~1((p53HVtO(J|kTvbozVt&Y-Fu_|oYF-{!P^fB{> zOYnqCoP(uZ%PU>wqb99(_981Hupkr|J~c>=0Y)+-#hh(KEr5J(z(!+isdC{37J*a^ zlDKx?SVQsjTuvMlB+ay)di1IJ_e9H2a(4MxMlg#Jy>Pwnx$q0;y4?z-5wa3AK>QTk z5g7$DNqO0Oiu%8}?|sf=TK)L;?58dY-%yHzds=oYKo*<_$0(P1h15RQPdw+Yz@63v-^OGiiJ&w{|4m#h<;(>!Ee@O`%X2n* zqz9yCPc}Qri24z{@>)EjEBwcF$^fb}UiH z9&N9Y0H5eo42F4^fMa@{h6ua-RBqkc^ygM-*kKQH^T zZGqwO5O=1IBW+#Q3ALNA1HO47gXeUbZZ$%s%p|RZfdj1HGAi(0qA5dAW8cq_ zIhSsJ5hrWMP~_A(yAQfX-p#9y_m&CoXvKoxGXeW?bB_;~#^y#Qntq}vk$lqyq`Mzb zKdzvPU_|Dj2H2Ua)k11yj?h^;#`dn9*Bt1n-x_ z65B%IXiz9}I5aT!h7Ix_zQ#2(90uGB&0t5zHp@aLFC>%PIS{{3dXpxs<&08htI8Vo zy-&6&ZDCX*El4>i;I>yiLjG$|89xHoLr%UTc|-UdN|s7lS<5WLwgO7aT)C1y@|m>c z0A?h6ZY+@!_je6pSLosx4^%ldw_zzOKBsksGz`PT7qRQk6z1x0?#vnqsdE(0ZJ%AP z;599m)67K*=%(FSRadh4#Zxusn`EWUD3R)vUtSGXzun@z8jvo`>B#bG)zMUDQ?7S9 zVvpCYco%l(3p5IrQ#hSH_b0_|YqlXIJ_fb5MXe2tl}XkE;Vvp8cIgFVWYIOd#hTjq zr&5feWu`8RhDvz|lSy_wTkk1=$eRt3s>LI4T`+Rnq0N*^rx!WM!D)ZKYMorVgNZ^N z=a5z`eVUw25mk=*@=jX%mSJ@e^=jC+)d6K>F&}#4m97A!vxsvIqev}VHFV=7f(r95rH}yKQzU1T5&1*#ssa7#BJ&b-^R+ua#11I|9n^=s1 zL>=1&-Ezm`8DASE3R}tA4>Lr{e(dPT(}`%}n#YK?^BKEb4N^?J1vnbGt@RC>+kNHg z|et2065;{<4@=1hx_ zyYZQ#Un@K@LA)72=Oykc3xrh?1S@#6o@(=DkM9G#7r(W9BJF2}Bve!G;b0)JOY7@LGV zz=>0B7bz8E7R81JHvY3Kri4_j4TEy1^-0G@tZFwO6*x`vdK`)uHoP^e+diMY<7iZN zBM&iw&1Y$`6eFhCJ>O-W*xI~$(ecbKR7Ry<$7?y|pW890OzXu1TgNL5zTz|FwWwbw zpmAKF`_dE+4GjC{cq@@K(Fc8Xnr&-Xr*rWYx_7=(Ux*ov@9mM0F=a|G7zXREGL-E& zaLo7)ht$EZA~oAefd-e&$d)``0A{!8biB&O zhGxO5ZG_gu$zNZrfOdEK*l#XL8WGkq$?{_HIi`+X8 zcvFg81DG1h*cS6Go$-Uv%oxlKRFOPR?wnQ>raJw7l-Jw2K{P{uery_G%rP;qMqYnM zkD|eNBXpr5@AJ@%?+#>duJFsm%A?yJ{CSNB{f($mGHCoB9ZSTopepf=#Y_U=Oyzib zwKdb|2R@fUDFY|VYc0E@i3xVEoUkfgdDrEY{fL9QRuno&*1iu9dtsxo2ykTPGywkx z`odJ4B1VMRFtC=jTd!e!{i0B3)0FHey6J?8gf(&wk=Jp2@01C=5C>JyMT@#-R6_)5 z3-}UN@Yr9FUhmU+Zv{FYehnp0+zUBdb%utVJ@H|-Vnx4zuv$r^ z;SWLPRwze3Z9z)o5VX0~qQ~#T+Nq`y_By)qolAH)kBBF71_r2+L^qJ-76@7KEip=R zF8);XA)dl%+{pFg`_{WEKm<8+=pxD|^ToqHNpKu&8scjTta@^K@&(XSTd4Os|ywJ&n@6or<{hMl9)()~>d!36Rz^D}1yJ2~5s^*-p zQE=J!W;|^)s|$#W16gS$>2;gZ>yC#whJ9SDFsO1~OL@3gpj(Isg- zzX8P`Llcb`z{AqF^0*jwzfs#u1Std($DASKreThigv!V0t7wH{^??Xn?2Ifj`jyr# zfm&nR50(JZpHGyjMK()*UHcWDB>c=P4~Dg}y4K4-^(NN^`@B@V{2QhoGrt8))q|e| zu@vNROg4;>s72Yzw58^+ng+>*lLu9AbAX0&R?$#WbhR$V0kcb7-#T`tqJ}xi5uJ$N z!64DiSA6m$akPU;t%^yF(rK)+%2b@1N44-ol3-YYF1sCwCocUN8M8nxNTl(D%y*i? zly%Pr!?!F!lyb0b5|+s!Q0hS2Kv^T?+~#R(qEv)AM3r6F0VJ>(n|zf zx32eLf9D&R(s$t5n=Q-0A6bYIVNF>p(nM-L%1;_kT6`3xN{>-tZH6xLYN%uQ)MrB) ze*1F-yp2c^58TG6*HCJL^$4?oc7+`7bB}*LNRxrH&Zi^$M)!~1X8R0f5aWU61?|yA zlPjN*uJJd-Rks1PZ4(D56ZUe9%6+t5qlS}IH9yH4!W=~H^NLFw2+0aYM!P5ts^)76 zG<7)D)?H4^@QeWrwbHa8y#^GomN7vz3yU_f7l;8KlXV8LQ{V)TsZT>Xjl%xB+c2m6c>i4~<=~@K2E58fM3Fq=I z7@wDjs~nlosZC^!lwzszdC3!7{325DlPhDA;T%F5j_l^JV$fd$ZwRX_!Nr;}{MaKxf(KvTcs3QPmCn7(F#)hLifl?jCcec*aZ8NXsUvK( z!^jMo^%py5t8wGwm_el0IZ19rC|`#f>p5Uj2tac3I_^22h3(4-tzyUE%MZ>uSIdV% zu8##}9W7 zq2{F}X$dI0LjB<|9EK$awiS+YoqsFgVGqbDA|H&HOCda?tjg&pA-)lnxDXXPs;mP_ zO(?0u5km9-y3SM0-arlwMYSfY!axGO{USI!e8F74XfRYts8yR>AMPr0A#|VtPhmp5 zXRD*$&jE}wTmRT$jHZZo(%DHm?KQe$7ZR)2EKAASLgU6aRFh7IHfk(ZKypV+-=nHj zK;}=`H)+tzW}@mYrZmw&=xhKZX|ueD!f1z1L?O|urV(&cl?^(k6z0)5@@C5y_apcr z^4^qpfz*USFtVo^!-OVW%Rh;H@*6!Jz`g+#G34c8C4I9ra3s#=OoC2jQI3LOZV|E8 z)evSGq<7sr&VY8mAZs*En-w8P`fl(1&a^AUEVy;a@aOS-6saj+cSiHkm==|P%Q+9K zT}NsT=(7G;X!#Jn+XmB?{I&lmW+LewE}BMiOn;}4z^~?Nu(=n$b42s$N*?FH#vkg< z1Uz1W;W-#HoNl2-$KMcn_wSA}^Kw)lK>!+f<~I;3`6;J*+GWcAr(4aXjyNk3DpD#z zY6#ZVr9|S6hL)hpR_mJLqzcC^pfpqC0qWw7#3}9py2-A>+h8Uo;uSiu={hfw(lVFm zs02ob3$GWjnLKRi8i$QldyGGFIf4ja0{gt~;?2L{NsN9bu?gIrGuH|yP1X>_c3lTS z7`$=1F>UmNoSDl{x;0G-FL;n+{Pv@)Xg+*=&3G?*fGQ`fs*$u%0Lr)7jP@*AK2ct9 z*RLd@`BQ(2P7oKP5`;Ui+{-d*S8A*^Ou0hS9kzYAoQMk$yzTJ9a4`nqx1m>)c}#AV z3}wQEHfnRSG~h2(Uk8cyMXT|}#1(;WAH!Ydf{{Ub)ah6@*r5otn^b|j%oH(uN4jiPbnHYJ9? zs8?V2dC($vAMgB@zOYF_CvLoSugUhlLO;_WP8|&jOs9<7kd!p8kNe$R@@K11l!D#e z^ZGp9`?x=3!xViBeF9xHR(-PCrx&^)I&_6eXvtUeME><&=it1c8IN{>d3&&R@o zLQ`^Rqc&EMLF4Se3{%&{x9i3wMyCtQnUwmwcA3IS6V7co5qX*UYf*|_Z;a_I>Zi$T zaK*C)aPsp7%vZdu_w@V|E1N4%S0!t%>fRZhw5)5^wi+v$H<=6$<)BXp4Py|itax!jm#_`siZ6n zA1wH<`dI!-&tzl!7>GZu@1M!D|89)xzts0XThPA|?O)lRAJLvPHpa$g21fruxeOl# z{@{0N6ihEj>OnGk}(rg@yUU z|Ndcle}pjq*US57`xrm)AmaxFW@DxQXde^npD;qUKVq2wTk2zB|4kkLr9OK4KdSGK z80NoB$A6P`|Cge389$~YJ3Z@1{xb7Nt}+ud%g5woXZko}{Ufi;_79c$@2k=OedRI% z7-$*jnHc~d$-W;W|B<--k&esyJL#8=`Om_Mf3F>X-$4Iuko5QR^!JDU`;e63Lyoil zza=Sgi=9_?^`Qw!o*Rtzr{3-fSCz>+j9(Co@t=Abbsyh>M3v^GCY?=CWr-8!=D1m? zDxAxk;-wgezGt!{WpTaVhIIRsbMw3oe&mc_kf|Qs95ufmAoM1@+*bQ|a=iC$ygwb` zy{BfqJ^5tsKBJE){!+?%dpr0*rZ>eHvSPw-gOk6CV;-;$d|bT;4nE#wr}~V7I7P-M z%lmn>_?MM7!?mJ5U1jpyO*+>e0s)7P7j)dmrO9HSE1s9DN!hN~h2mrT(3UHqmu9-2 zqloG*Ej*&;OUxrKa37h*1+|@f{;Pu-w(+1Z$a62RFi*fy+HDr4h>TFJQax=-Wn}NY z#C3I`N;%@78=BI73OJL5`WI*db_B}Mb}vJkiAUuTn}mQ$Za}xnmRx($D8+voIR0R4kc0sEpN6KSd`=KG?T1+|N1zOsa@%{ zy&SQ8tWEs5B4TbJ=i=FT6Yo2E#-(IeXsAQj!S(srJ8FNbPICPo*fd^hey!z;-=RBH z=ku?ZevC7iGx^yhu%Shd;9ae;m!fW*PRm*lB)q3XPHz+}+KeL-^KmzorlH-_yc}yw zUs4PM+tOQD%WNK0GiZ@lfwf<{-jjZ(CG*1r-sXeHLGp!FMw6D4#A0}54mApZSP#;rxW}SKq^Fur#{c8ABlw#@uJAv7QS3DWIU2E`3%$r3-7xKUbDT zRJsGt{^;7k`HXG=0NhNZ^tcQht!bgmT=tVeEXN-2nP8laR+hLw1<%bC?v`H(bB)r{ zfevHth48Q6z$vfgb+%HPAFDH+hF&iFM zb(*c<{n52W#YE&%L^*(3o7?KLJA+LnnUn(pH?>3+VDC_y6nk%>Zw$8$-1yKg3Fd8*h2jwJh(^J zW4tixSHgzbYLX0>XSi?ro28EBgCI4)A|U|;=CLw90SUX~5=V=iXv@O^T6WUS%ng%e zBhdI*-^ik!tQ(v^AtOwaaNEL@aJZB%Fs(=7+9E*r$5fz_PD3p~umYTv(Vos;#GN+b zR{x?~Y?D-&P8E!wEuDK~m4Q=U*2!5_L-?HGBb<{7vb}t}hCtmsYmT-9la&9ZBg0-q zMMQe4?5-vpyaoiO?2g>Q{E4xAYXow;+hi!}Cn5wVsf%u%Mh7AI)?02<OvJ{e=toTcp7v}~<8;q}; zJo?xnp~XuCQVX)qe3JMWFt=C{_Jdn;)rb5O+AJMSnPEJBj)8&wmg{Hq9LlJPOW0tt z#=63?T-G9aGWC2dsb4OMsgU302C=(WsO`aJ+Cqu;6GVHA@J>YBUL!UeuWi^slw<4> zlWR?x$9ltq#@D_gk`F>SfI64oB!*km_E8w+(JtZV0AU@q+h1S4Z;7q7$uXh^&{GMt zffZ*7yt-D|Co&G>2D-zf)2TMmc`)VZQuFNqnapSg*L0tI- zfFGKFqV#e*JV7e*P)O?Jfb+o!g$qxBJ#wdUaFl^?S` zz> z^3}a>P!7e-Ff7b{xx1mUl`+X@#F|}~t-k^X$jN@gWiZrluVeewT(5A7_1GTm%3Kd0R)BLo8l)`+%tPG2hX424%Rs_Vw%7wcnYK?z1S&B~R^Zxjp62>$`qU z<71c`xwCb3n}W$3$Tl1X=D6c8h9qi7qCy_8mfdbw6D|VODIb4lDhoRs!St>5Z*t^! zpmZ9~Pfj<>X(>4Cxh2N~l3Nf>yg=IXFr!+PPP{O9GDa?kX;<_W>r~vJM$T@1YDzSz z1;=f_qhN&bsAV1zCcKUAz;_bi%ySA^@J@H-vDQY-E<^mPUyv5yr5HsKF`_Uy)#Jq3 z^nhV%#P}=&a*f3@b$$#O<6|O%$7fosWi;QN)Z8oEabbWOisPOku#^*!vU91i5|ktK(WD}KpGp!zI;cM4rr%<+){MFb$bb<>92C*iA6v?GAm~|v2qbE z)C;VkAs4y^BsYG)j4FJGmK+s(8#c}*(MIB+R<@RnXS9A7SX>)N7;*wt7+2m;C2+Gj zNIB^{ogYg^NPEC`;!D-oOni21M0XFuONBYU?ZwM*1X>O&c@R?xPhKI4WbH@Fyqf#- zTIT?POBLl3PS)hvr<7R4p{drLaRYXhFJ@I`pBf}@)prM;>I7G1@|T?>GR^2X>IO0S zh7+KxW5cX}c8O#P!AdWK@fGl#tYUb%n;;+@Q~`uE0+MAce+GRDdbwxS`!Ye`#v_`D z)TXFvedpiCzxKm*`CCeKAv}YaN%_`|II1?MH&EX)<7W=eU3n*&QyO5OA1ZwI=wZ^^ zrBp-fZnFXP`KRXOa+4&_Kp>p4+O@uf7S}Rj%(_dLWIS(h!)A*H6A-~XKL&K4G!*RO z=18WoPDlG&;1j(hL!$*!((cpuK=X)NJDAZ`M)M$w4#`a#8>iGgCtC$}3>tIqi5Ia9f}`kj)joiR2~8Zw8-n%9mOe%=NlRTMqYAtMdCxJv z4nvD=^{aSIHgayidiihoRAC1>*XM&qzc z*o|BWv^cJ;PbW!SNX}i&R+FfLj%Fy|kpwDLtF(oHcB?Ktj7pr(`R?(NU2rF}CBoEJ zJe5U)2I(>)MSW{F0pA^wXACQ2c8H3aHgUGNX|=Q7*ue$V_H);vxG0~LxO0RVgn7S@ zytjShFS7lxo{w#QMLW$(_;TmpK(6?lf;+Wcs#F^sb)gC(zpP(W&j@=;LXfg;%YsWp z>gW09C%y&|@_dV- z`s22?YX4)|EiEu-O9E5kUWW>xhPc3)!$z!aLP;)7j)YHLwWzU#g|GTF{3E$oX6s;f z}tbk4(x^YXiYo{c#z>d9*R$sjc zG0dIVq}me!N>e?ME8CYv&fdv>F&L)TN)`&r=n1qd`1GbZQ7jM>~wA0{Vh-|_!Z!))?pp- z^mo>a3q`;z81hlLbEr&$5d0zXW!{RBu?U^vlKEl<1x=krO-jngl-3raUQd2->SN*C zluh`LqAMaWk_lDOb6!~F;kns_x;$?LiBIYS(m4|{(9Vj~lD%5J;$r@J#3lP9)*we^ z`XKVZn3?Wb6REs-z*jbu*OsLQX zZhFR0VZK5tPZ~IVk>-%hG1YeM+D9ypOl?i6LIRc55Kt&Io*Ym6W14WUIe^l<9VVl3 zHAy8qqaMTBDf~lg>yYy@d7BQ*^2K^vPj#5w+$8C}0HPulD(ILa!Y+@2T$Zh;h!8>E zjhlO&1SF>iUp&jnD)o;aqzFj)?Feiqn%1x+{5JBqz{a!&l~u&JpF%q`Oq%0b+QB@^ z)xVvaqWie!GKp7eqn8hvo)q@rh46sQtpdG#lh$_fE<%t~Ud3+*IO6-KFyKf3^0T8K zxOBoOCG4NzApLC7s zt=haw6hV1+!%SPSW9vR|p{kIsiW4`ic!6_zm?%p*V|m=dColY=g3svQLJnHPS{`%+ z#AG!Og7@WwjxWG3iPlFG1r?De`m?b*c2oxn|162XsaYFaW$+Ir=^P&D{OXuacKrxz zJJ|$&(vp_1`XG)%gwo2(MAmmgO*mRsO?fYLDeCeQvl5sDhJ{j1EZ7#c!7>6~i7$~)`pr|_e8Fiig! zaqk!;N|Y^XmTlX%ZQHhO+qP}n_Ni00U3Kb|ZFB1O^o!}4xN~pEym)W^WkyCutX#Ph zd&jrF<$YO8h__O3_6O-k<(jc!Nt0+Faa{ev0Xn{VSOmJAyWa9d!9H|+Qhj4FO^<*` z{Nl%X*^gG>a(!HKA=-r_C20DLS1Sk|R!pfvHA)+lg6%FM5P-j`z>@l!8h?CE~;V=|cZh7#CQwesQ$S#QRFCcqdhX~}xvl$_anVq6Zet3PuWv1)CsvGSK6LQ4O)R>KHy(3Z!%&$?< z#?p9JGDq3)#ddk;Y*BJ*B&$Hb1lab6p0s-5N_~W1x!U(Qw1B*k?~0~jse2C+nJCA! zXhxwl4GFl)v*@x)Y_bj^a2!eBc1qjW0}A%0_3eb0st>d#_N6ik(_*lE!AEJ!IE=iQ z+gq=3^lj}3|0s#y%dE8Rn1LibxXCJ1wGtc>B^BcG+}Hc z4mkz94yBO@#vvqXbPr$|i`CiRybs`G-*-WxPK#ko`S>~Zi87j`e}w8Y334B~PqoCd z++d!1Mv+(=dx>G<^o(pkH}uRoi@Ltz`0G0@dX2P*r6q8Kz?pHVZkowEw6VLqLT42cRv_xO9a?X z9w%V^L}A^i+7fY-JqyVkyp^p)=V7pPQ1~{B#Vd|zsK&+vD43s|MPF+XLS!`~yg4{V znll=@l>lu!kgQ(!{(_^NqKUmr43#k9`{Vto$BLs?g*;|wthFVb*%-LH7)>DyJMFq6 zStXifS+mmdSAh>=57S7T=!a@D(>rv~UOA-n6Viwc$Xbk5gpMv#YiD=gn-$J;x9a>@ zy9~$je4r2`jIByrl(J<&BSae15n8A>(CI=uT*+zZF)=ZZfCXw9z@M=n6uR5r^jhEi zcpza2ZE(X#(sB_xTwEL=e5ZBE*A(NNE?=1$`w)en>`L;NZ(IJj> zN&+@OWB&bV8cS*qU;RjO0@Nq4R{=ImnEM8$)5V&ExMzM3p|qW2p82`+gJ=7Q(oVsh zQL2_yE-pqI8i_AFBG<;`9m&OcGgblsrI81RFzRUw3fKB(-1UI@g}8xTljG27C- zw@skS?MBNQR21uTfO`V=Q|DaR+4k#9IJi8zmRBsR1stK6x;C*8Ss~JX2B+H{z?aF* z-+^H>>-BNiAa2w!sDk-(80cmXI8LD<^rx)KGFdHBZ9EHQU_F?v91UQ7Zw%cUO{WL? zKA~i3q*W*oQmAE&DLtvSXEY4YPtgxMG+WC`1zcLX2D&I?A9#%NPu?UDUv#5DAoQ+x z?(C-p=u*-UW$3|)9^l}b{sdeNlX^7Zb5RnG4WI>4L(Sed_F4Nf2Y+xD;Y|?Ss7fzd zGnM1pYeuu$xHmd~nX~fNM`*jRuCCgY+ zC_`q~9RNL{zYM?QnpAd%rv`k)~{#3alGBmu7`1J&Q1 zNma=gOA}YDRkaK`I+Q%%BxrWm5*%0Z4Tr#`4H*<$c%p32@7stgD)^-n)w!n*NxXa_ zhQ=qkWmcAU7}fd;<}S7LH7wy;lAZ>QiUVq;LDI&X0E{H~S$-$45~jvMJo(ryA#;H@ zXA@iSnvz9lP@p1<@3Y+779qd7Q}YlC+A#wg_LJ~P`s~LD5<;cONI`)5XDCr1DKYmv z{6U=Ez?>;e{mjIAzQq~9{RO{8J>e6KdUB{htaKN;VQs;w8Nyc*c;TQdJ$OIPo|2XqbMWs@Mo6Y@c_y9gZF6Ksg-Y3(gfbqv1S; zv@FV*LqhJ94wf(3gCsfVv3HBck+lse(I)V^5o9?uQ5%vJ#y^D=2wq|h;T@~Ei$5CA z^U0Ar6@^(?FMl?(D|U+7SYe84Mi$i}{>(s#tEu{6f~5WPBRz#*Kw}1vw?f3B=DNk% z8b*Ddwn|_*#D2RN)Zog1f)b9N9`=UFhhGzia+TJW#H{7I6e{m@2^OA-n;@V1ihwKw zSFmSynVp^cuv#gWa!t#^N6eG-6) zF)|n(;rGIhxR81b`z`I%JV?i6=YeA)&~Hs-iqNB`aIPa-Vsw?`v|egLK?dt)SF>3& zdFT78>quq>TITN1Om>%w)SW<0S{J9z&LcvrJJTq&n?JpysUFLJQAz?`Wgx7yrghhm z<-A@-miJx51R*XIj*SZJ1htTnF@4%`#|*mR{L%6xXT_%c|hH zBblL4(Y5P|P-wXAh?luQbTR(wRUq{5UuFyEY9tp-?FT}VFU3~|nybF6Ai#=Twx1b6 zLp=Vipe8)XHLdvR{A0}`y7O>x{B~`~QJ+HUy>$jN%)P-O63!>Fha`>kC#Yb2s|=9t z%oKOyQ})Ht7026w4{YevZ*7e@d>CCEb&$j#1si(_M&(8A6mpz>YNK?i2%1v3?tR)= zM^r-VuA34Mr%w*e&UT36Gx9D5`$`8gTAOLMsGFAdr~emGCEhfz>aN3(J&ajBMox>^ zF}FqCrNwVkIt#Pjqzb}MZP$_4UbQJiE2EVycwH)7qy>M^jb?;vdUX(qFUD1_2~z-8 zHsQ_{SN}xb>I_6CD&D&^mCLfbp5dYkZJ^tQ@$M600XwSHU}4t4<;g)C!1~{1(BxLo z&WK5pjMI6!B6(v;U(`>s7_4=?k^*)+aIEBpK*Jlvf8hU0_ca{V(adh)?h=1-q`;XP z*vAzW(o8QCAWX+~%^>1{-qvYVAkeRTI{2hS%jqK@ax_txiG#~B!(6wC_G@1$lq|2; zD*mZw+{%YHET`lI_pLv|ecV9oKOUPH2DaCo3*%>B3B>8K^e0qT<0tGhMagE3F&1Ve zFsRO61q`W9~i zo;-k{T2o}tKkwuB0CJU0$gnoUNXk%mGLVveV_acmQ#C1(+iozU*`~U*uOoZh^8no< zR5x-X(a~K~fceb@>nL1n?l`8m$u8>nK_VBxd(pZ3GD)_~m`{~Av_fHKZ*}jse@Evi zBG>m)ILqRPQ=1I2*cS(Q#PVlebtU{%cFz|O%-wyYQ!YB*c!+N&%&@!nJ7OSTEF+41 z>9pYJ>T($5TnRD3lqS2>TU1NPqyG*zSCa)@cU|_7+5PNVl^uloDow9Lnut|+R?oIP z6QQy@Z(Ak95pE`1XL9sK++Bp`#c1CJMlg=8HmQ|b9h4a3TaI56svo)vC@x~ zv?o-!K^a;Or0l=bWqlIybjYM41#vCR1M8CL25s$BBB%zd(+1LJKdb9sqBWnJe=}zc ze}(he1D1ow5Spg>3)r*MUs}I5Wh{`pd8>XJU0ZEhlZ;3U4?n`Rj&2oNU82`;4x87n z`4oOHl}aLUK7lq0#f4CUIJl*d{Dn`AnO6HT=Nho)K&u=!UAdU!>%{dEvlsVHXnhKi zR^?2aoX|@J{vr1wF}Mw2h*3+9r^H_cV@wP#YvDuNT*zca@RJ*fCxMJ37rN1UB8lN- z?3EKnoz2dN9=x>Z57Re!dXSWuw=l=-2^21q4{~)iNw*=BW8F`*?PO~u9vGoKKKdog zeo)rEw+vw^8I>^Q!{F9+yC)Hi{yH0&eJC&&()$J1gKsoZryzV%tU!xQzxILYu+cro zv`|m{kcHsdB{Nxqp+nRsu%k3dQrSC&NX4uK40|SPUhXdbNm#i!hFfIBI4bUzu~>0W zgwg~_StC4;@}@x9wH1-jT(fGO;obO)T2bRlt}XBMybyKq0{@kQgYJjQOBoe>G+h6%Um$b62I7*9TQ0Mg1L6Lt!jnDd9|(;=*a` z>WgvOvrn@f3n&oq{zeO(YC6J}PO-2*A;*S7Z!>g;#(@EBvm<8J`CI{~L|PGB-;kqG zO>84r&kgpXT0cgPl2c*o1`*!GPDUMB=Si09Y+0^2Q7L-6<~E+H47*+Nq~@A{=M0(X zqjfeWo5~pq1;>h*cH1ly3@^T)#l{xYhJ+Zx8~TUP~)) z?UUE5WU{N(29*l{W_2a_yicK?aBsvdc^2Y=el_?eNsS9@QxCt)XfN3(Nx<% zAqFmKm1w6$=$d;*UHd=S(IZDSi@5-b{Mu>}tjOI^_oS z@UI1&B&aENk#%xyG_aa^7)UD4-8DqQ8nDLE5+Nhl%2T(nb41aiB0pC0q?UryVmi1cE%FM=yzfQ87kMEHVIiK3;`9>zCRJ z($@J(1$qx|aiXdSKmW|g9^%P%B+S(1dDn_1UOEf7Lxb8{Z%lNjPjY7P70BP~Rur)q zka4Bb8&1Y+zS`R_qLXDO+GTrmam*HO07TQnVFs#N5I`XXK)U+PbRsozwM#ILBl2kt zAuKW+2~6jvvhvQ; zOui+N8?w7JXQT#y*tjvET#J&Z@fcyuww;Sc$V)s**bgpW6TA(oL-h|4`Lr$L} zz|T>dW|7}^MKagvaRyzmFgIxuHsPfzl7_516=K0hMg z^{woN@JC$2XcTcoD8H`zg-kD8t|$MU*AJU4&F4>?H<(&jIR%G%AKku#RW_;(^V_b{ zHN#^kv)|X~w)4qk$5?bZFF%>C{G{nj$yWDZw$;4N=QDF&f9Qu*e|MKx@#o)oc9i-c zb8@k@nJ+R)yMOzLJ8rKgGWh(U|NQZZ7k}}`Gi$Z{Cx|)6f8gZ*gNgkoV$ShTw4CFg zXgS9}(Q=M|;MxC*j{mq?f8g@}ztQpkWw3NaI(AlO)*p*11ItffjC8C& zxcQF=nepF(jsG#`{_PO|bC}o2-u1sSH2+}vj6V=ABMZlWaIh>ta&1Nq&VMU?{{m|N zZ^K~!@u>YXA^-0fEGGvm)Bl5lt<(9TU{}?1jseQXiK5X7AQ-Zu^K)Sm;3aH;1#t+H zzrmH3k0r3Ab;GOK*xy~G7ch)FH+z2y0W@nSt6CS7Q~bXY4)ks37X3dyx4-+KW9jq# zUhH2Pcu)Di-^$C6`#+xA-Tgn5{oXdedl#?0tK=!2eBUnVufN`|e%{T5>YwpC#Cm*5 z);!;bi>y1}Z&&gCG36=3eIK50kM-9J;f|?v>V=Bl)%&OFy%YFIp=(BRL-PG!$BX=< zV;}TCTdUnjQdgaEbp1YGMGuqcv?(H`;}HCQx51CY@#*vwFUf3f zWCx9YjChlI+RhHi?0mSc(o9<<`7`JYn#K|y9?M-FHb-X1ikPW{+c+Lpl!;z8wBxFY!I2gv?xoy*(Qx0>i#kQF5D`oJ9 z`h#lH5B&dpr7JK<56beTMP|-w_}Ig|`Lgwm%?7I(?}!zP<@+hc}E|4yKQ5*^td8an(PKNZkyf@ zH?nrU^kgVYAWcQ^HySY7C^wx?E0)Yv3YVjpS(8RU6p!KWM*YqLzo*SWL^fNdNLSz% zAK1RUtoDo=D5(^ugl2o$4;vHoW6Ot3${G!7fra6z3A~(=}BhK8!>4?sR zN)yn*Yax=}$*pOP7kAhD#dCO(Z9Lg9k%ull9Kmch!jRSpBI`zLMQ1GPmdojUbQ|&0 z_!rO>8(7k6<9cu_4u8~v^u?0(=13{57kQg5$TnsBYaH-;{(3%u@>1oH$=O%NU&dl=XuU6DJ{vSD`us!&H2%KZ}Ay zEuW4k6?9YhcT?w56pzC(D!KoWr*~9!27HQfV*LA>rsDfuGzu;Ix(pOvS9Wj3I*Mx@-P$?*6ox1X3nZC0W z@w7hLK8}4EqZ20kno%kGtu_+~{A=D?o~Z4fNWzOL2hwVCJjdCBocOluu`uYvW_L1@ zNhlkU5+nCwc8ijIJEK=lTBTw z_xow9d*;4WAp!*P!a#vB@C~^v%|sv=e7iMQb=s`7qv!=BG7{qsY7luW6>wU%Z?yv$ zY@OH7a?GszFU%o!bZvo{oK7}d6F|Jde@6GOsL26A((3P=WpyrMQ z@DbClwUR4=B9`Z*U8l8Lu)Kn`+w~z3UtE7jBRh_I)19{5#c{5HYgfvUkJ#(K)~57V zw6`uQhY`3}Q`?G(@d96yu@m?U^qkGsvt7U>Xuvt`_Fi=B38L`!aXJu8mM>(zU7E^^ z&sj+psO>a(p3wP&`Fx>;^>~7G`#^#2$?|sQ&-&SeM=lea=!PX|c-+#%at;GWDj*il zsi&=nu$<~q8~HcyusT6zn(D6RQ`NyxZyOWT%2K~##|asQ>|#Jx{4(e{!g5GT{(@bm z*!Ow4tq~m3RmV~<`)%&SKKHPm6AsdO|VQT*(4O>Vx zxyI|YC1s7I6{g4*AEA{jA+a|kP#mTjEH&drKl>^9^tA}QA0R&I>=b!#Uwc*K4oxc{ zLvZG#Y53BG=GEHBX4)|OOf?U4!a=ZksJ5w+lJz}AOGN!tWm82o?L5kYcj_p&%Ckm- zr$kgq=`dtoaaj{)&Okt{_Fj5o8^VdI5!W2IEnmM)A^f!?o`z`)>J;2J(N|a#khqZ8 zGx*$BNGaA9vUG;j@a@1nhgyB-rKe2C=t|cmnF(!xe;hEZehuiF_GKZvA8=LJdu!B! z5G}UG(viENeB}&v7 zHr+}JZUe;%9IpW$)l<%dLIR<-4IS(z(&fh4-gXERQ&K?7pE!Sejp*qdfVYh3zCE3U zAQ^UcJfF4fR;TY?*t`Rha@j?swy1Ry1BmNJm!7q&1**YjFYlcY5=HH(R^m)GZ|nD7 zPj>(l<3x8w>k=-Z6ik6A&nu|`KsA5=rM;P%_sptUehB*tr9zI+35AJOIyJo1?OTxV z=(Ru@$#;uFiC^0qT^q9L(r~#*LQW248B<2V3Rgz#mL;hVWxQ7X2Emq)U7>y@T<70RyE5}OILh4QfCjFt^W@uZ75$Io@CS5}7%4f{;$8MP+rBVcVo>TXa z0bZW=ufFbDa^|=z*Q~{vYy+y+NctiJ!HIXas0t+&U8xyMsiWTk=GNl{8F0&v^&Ki| zQ}q1E3xS#_+Y6mxO;N}(<2g0lDdvF|`nshYDph{7812x&-@ai;Jfb0&yjtYJA7RYg zf507E9XIUa9VAI~`YjXg5f;-Rlon9tdldXy%*O#GrnC}NKSCPs)puCIdi1W@m(?CI zp7fP02DHaamlVnho__Wf$livQ{a_&U6qP5 z%}!P`g5+%@W#F1}_t9iPxIDUq_A>=(WRuwVuFL)`pXD^!YC>}asV~>roz0Pr8mlMl ztbff(Ma*}GG=j6js1=yHhu%mBYM(!O?qQn^&kXi_X?8V)txgxH71#yB4vPTXH3cnW zAy~jg0LWKKj?5_7tHs~zitz2Vm^HrwzMf}LK3(*7gk*J%AQ>1Tt9Js+EIy}=0aH}n zvV0DR^kY3NdlHJP!q44%87hyqjSX&@XMJR3d@-cMCKms>fX{*qT5Q1fv{b(|I6di zy`9Ry`5Tws#Z32O0d%pA?GRwX(}wX%r>EI|Hs<^2iIeem0e%w}PbxzfVOyAG*oX~& z!aF(`2XHrad<3UoN_8?tfxyO9aC%~Yr!0|;tv$xa<hNw_>qePZ9>i1nGM z4-@QeQ)~uZI|4P3!Z)09mQjMFoF`21O|F2+nlaIKjM3h*vxU7b|6;rMW5CKTRYKT7~h9G%-_mATmWd!54$jWS1?`@z4;9%CECwz3tSMJhFC}tiFdY z#XvVrss>UipQ)GfMolF+?bp*%o~&1RG3?Ya)(~Wh1X_p3y*JLou(IUxyU7kFW{x(P zfo^ZT)ux@6)h?IT^+U%;G_?pPawIhg>&^72yxfw6oH4i65S7_ZPzFLRh{8!F`bh6R zwe%FtyOa!dk}Q^`~day^Q54bf2GDEpsS&G>gfua6;JWt~)nLOcZ7;+~Kk z>LFJ`O5sRa?Sfg8YYdzy*>*5I#5tinfI}DsmAZ;L|oU+JFh%P;G;EAPa+CoUW_<-56)oEmF*+ORA zji=*Owm)N{3~r~z8pk$>Wadqjc>0+*&ZE_-H@JpsInh$S*RGsU@*9n%n!1C&^@QRa z1@=O(nz}A$`@+G}^D3dRR4}y;cL_8Ha*;&>9J{b?dBlllWaG!@twI=R&}yi^1wl2B zH8bjPk|WfeHQXO36^m<4O+y&dhAz}>fmvfk3%nBe9e5KdKvFm-_J-6T-Z`4J^R$BV z=YeUmnz8l(Dg7>rM8-Cr)rm>;|BfoWNJmCf)Flm(S60$Fng_U^%LJOd-B|eUw2|U7 zmk9ZgB_E5tz1;+sO9eDeJU%DQ%2JXv<8*pE%}19Kub>V={=M#O+!_xNIS6_*G{~gu zUNy=+u!3+tZ6j{sqc0>4S+$zi!_hv&SlS)ZTJ*I24F3xgZXM@(vO|UF*yfIzUq39TKj&$HC zLhw<&1S)CcKhk0SNm5#EeJj+u&Wxf_YlIac9Irs%+&w+e=75Qftqw^~+(c@>BQ0P= z-({1*OOjdcy{NA@F*}a^i=xXRfxJSx#()gOV1CHNw6y9~wwa7HD$`hu=`VOtFeLOA z&((nfh7{*))zG50BO3K;0mRSUa0T${;Bt;yk3kUK#+Eo^8uwfUZ=v2UZgxK;srKdR zNG%R566d*KK++z*6313}f4mI-U>ualsJU)KP}7MZ0TzoJv}Lq8b)t^gGt_QsZo_aI zIzZTZ-3Mki7u&hteb&m**f$H4;wN3w-kU-0&GWgt5$K@SGoZUHnpXfPZW&86_`~GU z6EkN;MllRpRA$Se2G4>t2-+}Ze1~;tDh)%}ZXcJbuF*LGnO6|aN-sY$=N;MrP0n_L zbEur3&Q%R1ztUZ@F->KHA8sGbWUr~8A2aNGPfc;n@m z%hx@{;3!X63YF-&SZ;mz$Dj-yj5zn}rzqsN)PH)v+Ie`r-g!OQ$=+V2N-MTs8zyC6gBat!{)_k>s6>ZUDOIP!bgz1SHUQ@; zRkeDE#=BdQpCR}+CYL`EK8)XTVmf~U`8ULXDivY5Nf>1U`wH8{1XynM` z#N&i2jyje~SArseoqsde!Jqr;*kH|HkGOyL$Q#bep-oXBuy1_X@wQ@X4x*O`v*b3f zr?@=oMnv1fu9G0xD6dp@CSEpORx5MRpr?3@-~6 zMARDd5q(fe^t2T(HjuI>93kGV=Z9K7A~&9-s`VFt!!K&4=wLD;7@`Q04_>HodP`CR z#iX{#nVdeAAIX)lFd3>7WVkoL)Q@1Zj40OxA_AWJPBC$Yru}Iu4$!bEe5sX?@ZYht zx>j7=vnifO4X>UAsmVz*Sk{CCUN?XY0^920Nau{)hYTEP^Ms9}BC_)ww(Y0}5hGNi z?5*dZW@46vkF6PdG+I5ET5RWzC8 zoS$=ENj>dVBjanoZFO&aY_J+0cjos_IQtpW9EY(Qi9XM<&L z8(1ffaFu5?-vUB7M{Jf)?th|xG`Y;{ZW)GhR2ORX!31TS$^Jeq+@MigpHqy|c4&4bHOD*4(n z6Bgn|)|i%+YY|1NW8`UAT==-KpsB1vv1u)LO{6tR;lz zhs9mg@QTRGQTU9+g^{P&`5qe?zwV9dQ?|$z;uZ3Yv?0odG+>KdJ3OmO&M23lmD)E4 zDcoq+_V3J~%GeQobX`!w#o}5CiCoQ-Kri=}rA4&~Hn33HsD^&=ju9w}cg*7xux5m* zWnm3UzCbVn^D;vK$vca~B`kEq%-E8e0Pqr@RS`);XiXiRJh=Z%+u(QMrsi#Va!tZ@XcRN@Wh(zwzw$SX1~*8;)LnoK`p|_t_wTi}S3U z9vnnsdjR`E`3@$ES7D}CTGj|A-%rc^H3tpArxhBdKtI98thF0d?%Rn4k+fX!;o9yWFWUeg@+*Pra+PwC3Y(XulPK=(Ucx&Vz)x9}J<@xv zNZ8BuXYp6ih<~VM+TeLnI~A)!z)7citK|qmOQlmKBF`a-!|}pjd*&H^GL@kp!0`t* zkhz0Xs)`uS(5OAFjq+ICA`C>B;y}Gs_NI;t*pLCvFN&LDbE|E`tKo$og32lT- z(hq?`9a8YYrKoxK+_HrD6|Ty*K=aE98)o^}R7sZR*A4WILFbzg$*7{(M-j7hsew|4 zGDT~>q!O*!U#Z1>GzyxHQu^WqEYxF@~d+XzKN@dl@23 z^$fjTh{Gi+^Mq-9NGp^V;0S7%!8=CH1wA9C4SB_3_mpe_+5L<~hW4H&i?9$z5jUvn zg$65`kydL5o02Dhm4aC^?60^ig~iH6<6f7=yp&8Y;l_dKxc)qB5w(oy@A;uWRm|rh zmd+cM7`PiOCI8a(tR*PlnNy>nNPeqz#(USDpbp}l|50|3i*zuN+TCz;L`cm9BBd;R zNhu?XzH?Oyokes@fN@$PD+dqJ?*KrQY`q}hzf6a6s$gX}1#J|f3C`A3%rlLotxTvI z#$|;Stv}EG@w5JNP|YicdbI%$W-6MF#dJ^b&6;+iCmiKSK(Ny+kg_zvCO$%)I+(Eo5x4Aw9_MNvPR)> zi)gVzY|SHei0D+~amWZGN(_2=fLQ%qV)9L@ccd!PUiS60*GY@*Oq9pnPmtf5z=hRH z-?csyE=)z&EeQ}Q-67kYvr^lV%?~SN)j)8^RB3_6D46PmOwoh2zAj+zxWVKOLS?&W zz|V|z)QbX{>gC!1#i;?QC)81y%P3A>Z38m~sClVVKmnZvZ4_v8JYW;>KwLJhYHql% zu8#Xt^#4a7!WsbSW>)bCydj@#1%24s-SHP!h$oxiU`F6XC&(3I5;%i;5aeqv;d6O$ zHICIaYUC+7vZLwRE{vgm9>UXRc83pMamyMn>6h3E zQWnwEz?Rn0?vxorGxIN=kPG1HKe()#{_14T3x@_GEU9WgZ>F5&_7l)5 zBm#Ot=0LC+h{MTN!!sPFSuL)P_jYE#U>mS9DcVHo;4MQo{Gu`8vuf3klHb^~Pelz1 ziN{Bg9?^Qxj>hS-g0c08Iht{md#Z8CE&6(dbOxS~Ztz9FIGLxbyjgo|VyQWCn&?t% zv-uB_7020K|YtP%D{rAsZGtF@J%lBmD#e6v`{>YuusK=!=fb!AC6!|kwR zsUoCMEz8!*fis=pEK{Iv18C5^=w2*}N|(Rp9=l6)GA#uznY$ytB}<93%QxB-RMfd7 zBqTTcQnANR#dmQ8dW*)4O24QijDq}bvC2@hHX*kSA)O=y+{Qsz17&VXt&hMcEwVv1 zwUsB}8#tw?xNAqVM)R3g38%2wepmF1J7Pa~c`$2%Zx5!})mtsbWTy|ltxle7)J6lS z%EBK4WPLwvor{VI!b&zEA8jziGhkTb>bDTo2=&tnSDb;Ch9Fcwq3PM-cX@T@`x0GU zo$uq&o^&=Y^dFGJbM9WfA&!D-qexxuOav5p@k>YP7jN0!!;`qt z(M1je+Wl#rtBJpySZF6lx?}>wL`G?P8JCUg3#5iS4y?FzIrm>Ae#P$CB2lM5$`H0Sx{215ZxHSzGj|K;y81wBW|ybXp$Ono!PT3VU0pK` zMUhCJ`xDWBaxZ^+OwyU?r*q$Oipqd1E0@rUtdg>qKt7zZ%4||K^oyG2ty{>`_<@N zqe@hIqaF;8P_VSJ3lfv@pAy(J_` zTrE$_BBKjb<r2VE<##DjMz(?$8}%q>p* zGdX~B5*V2kqeIvW_1tgB80V-`@>h?C5C@T-3s-oP2MRN{9Uz5+j{+c8ciJb_vOFQH z90bE9Bis_3n7;sA{)O`9Lc|D%AHf3ZN4ZD15 zrMjM4_t5_MRoLZlMUC_uK(NNw59}nFynud?y7$36AAe7 za_~9UZGG=S-XTon(lmAUJib3}BhE}9*9z3VI3HIjoTeUM5*~e*70S^B3Znb_vA(XF zKm~E3-F0x6oR12xgv{uuJ$8hHVUHPRQpwUh&4tTg;lOer&B*8R} zK?24ay9qk&Sp~@fhBMIQ#osod%(?LX_ZS+3^-`*<2$c1|Wn%CKFe6^~JPcojRb=~S z%4lrIj6HKuFF>KX(~$Yclk}0i!R%R`DmV!z;PlJgRW)UFr6ABw<9e#OOqP%Uh&c~B z-Cb$NcHMY}G@_vKexWY9iP|A1zIPC-(@>h3u|y~tp(|34*D^iE?7G>-m(xb!6IArt zBFYqt7K}jNsm?ZcS4?DYw^9h|2E8SLnqo=?cmSgvEI3KL4N$`xbz`k^PGD5zk<>rG)tVGO3`!Io3m{kGn|EMP zGMhX4VUe_Z@eAo~IqxnpBQfBdkhsXRQG^zr(K2y`oV^Gnm*QV}-QTpbnYLdkK%MZR z4AqO0($=N$C4~P8M^(<-rJ=sbhHX{0HsV6)mHK9Uf{1~u+QLv4iIYOc^D-!}Z5kZQ zJC9j=Kg^JT#(}kd;<@&D#%A?C#A$WY_XBi$JSfW9r0lmO*R?ey2@2r)k_*^04Lf#> z0_n$Gfa|R05bc@DdebG-iCSn~jRLSv3l7f!dIWNP%z-e=m)OqENI2a$i4A2U`RQe~ zPn|Ap13Dh$XV09~d90EOiE?Vzkxo~^t4dxv85R-rsclH7??Nkg zdMH<%a*qteRH5KJ9@f1e=g<+ubA~(0r?OOmm~eC{(0MDD zBsA6$+SlNxXCW!Fn_5<4BB5Baw;VZc-4co>V5M--;-*dz(O-*kSVaOMP`znw)LSx4 zB(Ppkb|5aR+HrCrtGh3a%YfAwv~yF-*q8v1_Fudjrl3xNN-N1CTReiKU|Xl8wg$gL;*)9v%Q4yrunAsbvDG>&bqTn!YpsU}t*1&_81Pj?Y46}3%3 z%5s7C*v=IZ#T!~8AvN|EM7*8V&vVW{Ee7_QPC2iCRm@OtWkFU-G}@}=W-0GGVL)8U z{9=;mv}VJWQe3+~8$q*WZVr8Lgc2I{O+Mm8C{wiRqM)W#jNo&UncS088Wwop1exxL zAf%2_;MulKS1DP zX&3^z$l7iH>e+gd{dtrU*e_M~ITBJ`NcSRCxiqtm&BTAz_e{(2x`*iXajq6X#jB!} zxc)ItYI4bRDYdZeS`}y^L-;hb&kIOtIKc^1n(}RVKp^;lkQ?YW#hrB|9YwgxwwA?M zOZ!`~Yh!7W5vD4kqLBOAyPyg@O|QF14HKzZ>tP{9UVMdjDB4v|crUO73u70Z)=V&k z6!GCnI|Jnan)|B%fROA_|>iolO zih8(+E4%!Vmp|L$j6bs0e@c+WnF&}K{}BowAHA5poy*U0F-FG!kY)aZbp2naCT9B2 zS=0Y{NvN5vFI#v;OQc{d<_^zuL3^TTb^sMM(dv zusB)hen!pDcx7Q=`_ZW~F>%l_|3t<@z{1G!@99+kF~z*=|3K$|DGfLam4=L zI8tBTcv8-|ZST)0FSZ7)$Px-j1{jw|nd|!v*cb4%ZfFcVV7zbtfu-7us;rsGB}EDp zPy3%qm6YwLx0O0&6h9&G-wf{O`$CYoE8z z-~8Vzd}MGw@2jJKzCVTE_B)~0RVyrMH~7AG>hI(ug=i9y599m4XXC#)%gDYD_piUt zf9w1Ezbnaxr$_17rB@M3?&%DD-QCk4EMB6MN)S;#HR<~)7G{$d6>LCwLRhv-J5eNR z(H>6rGI7Eu-e004g-}~p>-!@%mQUgkEz{V3xODb>y8QOGgj9ucAigfuOZ%8%ig<>; zrvH#Wy+pUdmn~BIdW#0?B_)M@`ksP(*}76DzfhwgWZry4vm0LQcWBS)mdtK0xe`Zk zsKpMq8dV*E7U-Y01MwdRt7rDIdjC`C6e1VYUP7N{&T zE+6IJmh{XOEFHU}Tm&KotD*S%=q3myt8Byg`Dz>HE=6iWiOS*pFaLI@5=wJt zQ9tv`f|B`gu8C~d`R+J3*~ozQXriAp#$N=Y2t~W|K3bi7KznLF)4P{t04k)yw|PsC zZwc?=^OPLzv$t0&G?=W+@d5pwev#X5C#6$+p4U+yZsok=d78aF7tzXuL{3H@W-PZr zTWf6e_mzkvj(fWPx8bPzwH6SEnc3|1$I}zktcT5TO~E@+Ybco}Ap2X>@YOEFg_>Ix za3-_ZNA$BAz2Nn^xksZdXGvA*LiK>xi$hY7E-&!;jT7G%g`-Ec4v@5vk@mMMIzP86 z@~uW}8TU_-_YT=(MkZ+)Z3Vi_`&+woIruR|$+T(3j@c8blfki0IjcQ9S1 zunNt9#OZP9fOn{b-ir>N`XCR^C_Dhs)uy`P_}ANG|90cm4`~PXjotx}SHJkK%a5o# z*jGH-brQ{I*(_brJJjP7^6)OFzV6Pqo8*&=lbC&2eIFmEF9%3Tvek!I;*N6-&X5HZ zP)V&+EC6d7Bkuvpzp`a5HX*Mb#vF9`_JE*QkD1`jK9}kz%;asj_a3@+{*(bl{mtJAt)C5Dq)c|0&zW(Vo|o6(c%#F zeR)(!dpvc{Snm4nmAHK)W3QlmH50g{`lXL=wU68PaW>ZY%D<9q>JAzzL1@H%=sldP z*o9{V`mNl5xWgETUJ=&JZ#b9y6%OdX3o{==wV~ycrtGmG3>M(pr(Mu?rqwhM%MX#- zDT-v+zLpl1n=qxF!r*^@?1$@MRoyb4rkKag191LQlJj(_%;YbD3~?Qn5^lSs#X*%& z2?iD;a$1_#6NxsZ(hBkC(N;Izc)cRmnyKwfwUb4;vBaSt0Fzo(GEd{nx)_gXsoCN>JosBMO;B|H*Q+AIS zDt)t^xd~ZFk0Mk@7^32O)(`BWM8v}Ba^46pnB&%(%%}A0m^A(-(BPl(WZt-Jj_(mT zxzKE{AxS#b<>S^VbR0_~dj$S3PzLt8qXLVcO|AsbLeLrYS`V?E#;MxZ+d9-&iPaa1 zLBHoko^Iln9P=RJyH7ITN^T~~3|X$`mK9)#-}d?j;TuAbeinC#REe+VTLRRX9q*5W z+DEOwvSQIwHoY6M@g*gOc%>+31RywEfFA{0(O5Awq$C5{=rDrNpkbP8k?8D$Mm**? z=@SuJzUw*8zf!sm&-bLl0Is?va>?=$S z)rm6>nj*OVF1Z_LkrG2!t6UNo3bUgTGauYjJ#DtgiP#5qsUm2KRCsTnLDRBfmn~R- zb&>LCU*<6%MWVs&*K=f&s8mAkpGY^9QizefsCf1$Ado(u3mDxk zwSYx4>=toIBVnl6nhkN4Rp53FgXkqAei{bWOv)3YH);W z3U&j8JHu2ftmT>8e57mAvHE_7f2Ai7IqZ@T8?LI-Nnwy3?dat`7U>$DkR&VcBIBN` z$9ZhY$QQaGJw1;Ln5uU2C2tQG5*}n?vl3iG+=P(5*ILg;e!qgg#)oq2W7L(Jn`%mE z7l&<@5|k2J`TZt?Vj6`kg)Ww+(CICEtxEHlN+VpaiYTHAKV5}=3&)>Q6rP}?R8BYE z^HM$Lmp)Rf55M|Xiix+CZ0+kbd-(|vEz0Tz9lv<}lTeUwZ1<>kQ%~y!XE~s}kZjsl z8{0zY??L)`IZV0b9*M-;yBkJnoG2ApQ<*d>&rWJF$DCazC%b;s&&`x8RdcGro@!+A z4mcWCc(e8efEJ}T>HclY?@G(s%4T8|sagNpU_&BFi3eA%GP58@9OMrSoYRF_<7Vvi(GpxedgqI0h+nA;oz`7k*dnh&Xs8CKq;PiM@uKeNt1dmQ1CD?dg zJ*qw4C<V#DxWJg?+Z7;NU;#m2%Mz%zO`@1mjpqp%+O{&`H!(L|?NEY{tx!=GXDupi&e> z4l?4>Igs?vv-*jS1C7Za1*P)=bQS8<0`0J@hB>6sLgUEw(vWBy2;MiMETl|fc3@lS3Me0Bk>LL z;fd#ZLfu?oYeqnoI;M|`9}`#!CjddFF`t;cZ2P>qYEQd>r|A-Cys;YBjf&HqvgpO0 zrUuBYDU;a~ORzfn24xXCOs_8KVnX-J$PkKuOPAK}mQ+8yPXmT|<92%KeRhN@VvvG( z-LoC$Y=G^kGdG-S5Bdqj@%dh4kS)D42x{xN`SwaCe?0-P5vwTGXZ~c7(>;I)vJW<3 zw3A7Q?7uoVEKKRJ!qw>HCo}4h;=nUx_4h|>#~o6k4S+f6LTvA;n{zCSUS3vBm*R-02{2`zWf7c{17I{5tkQJ+ zaT+aw3lZ9EI2mTw3(m0fh2RxtGHq<26S8dCT@PO$B%9t!eBVeZifDo7W*5$hETYTC zgOsYMIpz}Mnx0OPfTCXEQ&WP%S>JqV;s~2)S#&a-1L{eQT^-~0k3Q(GQ@vB9$A-4< zopo0Fb3!2mb6Y7iZn_5J^aO_BHAS+FP@d?DP~K#HSS^Icgg>R^M(BrPkkhB8v}VRg*-k#v}WY z0zFDJ!Ku7-88FvFK`;>|Iy;|&QpD1Mp~_YC9#jD=MF*{G9}d#tt02g+CyUQS;3Ufc zMU$eDI_Va`x@wnk5z|9J8A2}fy26NqM}Q?X^5*+>pL3ou;(Q*&eQv}TvK3jFG4QFP zyTi}L-|mV%pkFCSfy+O!$z}5$182_IM?7awDT&iA-oT1EIwFWF;P3j6%V2HbI4$e6 zh(XKMj9@RVy>^OuJ-H{hfbn7;F@aRI+?^2TD~WvI?>$Dh7oi<6ZFkb;X0gS@5r!~u zFoS6xm|toM(Naw79EkP&@#zwBWX;SAj^5jQ^ORx4=39@YCg39qPS%|}J=@bfv-64N zKgzm%R%P%mQ$0UmmB}jB_sM+ZVPdy`mZ6b7_zaV!g{{00)|kYtNr?@qK8?SOei~&w z=NKhK+bDV^oh01NuIFf)SWNJY6|wLVmMysP=ZbZ%Nt>F(oT7&FmZikr=z0kaeUVHP z?#K|mlYBVmQ*}wQBVDu<3svR~&O10S_GrAz;Guhn;I3_z4IAYVe`naMXl~ct?OxIo zw5KcEKLgh0@SDRlQ{HxWmdqC#IQpnjUWWr7(%4!ZniI9S_&J+Xiq8?fcDxUVoW_u= zFuVK{BrRo)Enl}F8x2m9AK0(O&15uzNNSCqk!B;rv|_)2Z;&Ph!Ib=x3G42{z77xl ztrbba@58L!nT){NA#x;)DmC!lK$eSjLgJ^97H5ghMGZ7b)U!Z3Q8gMXIn;X$i{R6M zOXqLhq4y;VQc!o|)bMCFSI{vx0MHQ*96HIJUF{Flgx>`yshXg_47K7aDTP?7F%pfp zvajk%!f%1!su48Ws+#l^C_0N zw4via#g)m&TAgHF0}kfiAxNTj$R7G_9jWb1E{af=Qxs}~257i`qI$JMel?r_BDXsC ziW@E~o6T=M5~IvG!PFTQ1!>IICa!=QJCpV?W-mHn(bL-!Ld8#do;tMBe)WWefC?nh zI*zlnlwer}B^OG&EXP(F(?U;eXcJ{w*tuCMhmW8FTrOpE-46avx6egwqR0apF*Dpz zCn4j0fO&Rw z&3qGxl;q8!Qlj4WC(OOg+=J-*A=>&Jb0lyu1T<-M-f~e3#=#0tH#uDr6!VsctH%y_Kle29kCxR}S z!Ykyu%OS>i>fKYWAZ%RW%nhTdr>QlluoRdCaIZW^qwDEEoIaxG2vsR-j$t*O{4yehI}Y zT--}s8VCg-O&*}2Dlpwy^XvWr-!1;CCJ);}*#~WH2C4-9BNc3K3uNR8nJO9GnHVs8 z)=aFROe$CnTq%?gdSCcKtk|aRTt2Q{kwAT`<42q8nHbNi)uEgR++NYrY8id4wagF- z#JOCIt=!2i%IP`<$Qy^Nto9LUiGwYIVrEcd&W#-ft7t2Y8}3^5qA;X+h&V%kk>F1z z5)WQOr~u2L?NGWiL&{GJ!WHUA%u^h`#f-e>guI`PlX_Ma#?HCbf zI>j0zZ!AwwJ)GZ04Vn+=ND1ZYX&!1ncb01+UvvUlX+D1=x(1Paqrc5xDnN9qo)bxX zDf;xV;>&%1?^t;PC?q@$2ws%{vptk4RZ@~*Cn6K^nJ8k7p(4NZg`ZgI+vTh$$S5u{3%~W@>c9HREOf^tiBJg%J0$ zq#$Fd%LuOfOW%~0ce@F0g!Z1CY331-2xB>_95@x+)f1$Av1esWHqFam^QU&p0|bMT zdmO_{IwTZJrydsbz{>)M8NDnRTveVM0VTZB!QaWFiNR94j(HB7rU79U?gTcWRDY*P`k7-u8Ep2*4>oz5JeNho z=8kNIIP)#9PIcmpf*0y&D3=*5W9-ylR9T7*2{XLkM|b(!-cp|=LGZ=5IBJ7zJ%LD| z`A4Qta8?RR3S}nEN}g-!owNDt-@pNo@r<7c8u5*ME+b>0l^c|zLM=u&7skU(`1G1U zNW>-cmhd8;Hys#c;GTla`pK0f3 zV-|QJAVvk+m&%SqRs2Z&%5MmgfSidxNwgFBP{*ErwDeJr+_)TN>+Wis-Pt2ZnL@0y z4DkbeoJK9CcH76$5+xCrrYb2-O7hdW-nXAa@TL8lYD~DQ;Ka#O(%4lM8VVPvK(GTH z*u~1DCh67=>=Zw~lHMm5UuoG~Vm zEDznOFYDSsylwe9x!HL+!|ZOCSsy3x2uC#v=N)-ZAyS_T7MK{euGZ7V%R}>F=EWO+XU>>EI~)FPi4AZ>N8Y3ySo?^ z+v5tx89~{Mz4q$q(dWW-w&pqaI3}*;)#ml;F#1ByxwluHBRGXp_w_Gt5RfMk3jE{Y z*nKOnqcnlWNNJhajNR+Cfwgr3zld;Rl0n1mO-d7mnU!o2X>dzuVJnRsurZF+P`|4OD>5S0Mu{)FQySjol9!r3Wztx=H${dIcUZS??L@ms+}{F%&J&?ztp>T6=2G zQP;`242wgUx92)Q2)TjwrxHpX@bEg4G*lXx{ zTx$qnr$MWomrEV`juF@UEphV1L{}*6!A+XaN+|0-Fm7h?-1ERe+ZrF?4ndq-w!MK? zlE){8(@(Mt8CV!FY;0h9dWfIxgesv>xMq)`{sL9#QJ=&wHJ~m5g@YcW8*q4v)c|=e zZW<%gjI)S4`P@9JD~b*Uu=qiKy;LYFAd7M+gQuxKN#~M|aBYlRw!xf8iOdGA&xl#gHmb@rBCc*o^+T3-nDJWxyymiM8s!j_P4?X|Xmk zuXqeFz>mU7jhJpc!C*+oN_xA17xs`4eR4>kYR!me1W|f)nCW1#f!`S8mta4t{_}#* zQewfM{e&p=LbJrGqw*7AJ?w~QIz?_KR&tSpjT!`vRWM6B{0Ml0@N#-~UI>$q7aHie z6VC0AmW#-5hFK0jvHGfk&b~T-@)=H7+AR&ynwRo^QifOR%UK=GBot<)D`hsUi9=_Z z*4zNmX51*3wqVz?AL^dTlwLiVrdg^|G;FR!gA&r=Uu+4eI>P`Rg+X?0omceYAyq45 zGV;8gh&aVuZk@uRR3kIKGxN(1^F2|bx|4D=pKnLy(Rdnj_!;CfZ3+`f*XIQzc4TPU z%4F!8n;7@}>cF3`G#&Z78%)vy-rSvKJve{uh zFh~pjWDf$hTs2YL^)Lgwj@((PN2AEGCH^nb{^k5!=a4o4NjZk)5F%~Lqj!~y_EctgOiLifH}qyfqidO#qL&&kYqT-CL)Hc zeT{1)gsl0OAakoxjYIB()L7j~E=xz45(b>IbTGm(ukeA0W=ikGVv=i89>8c1Or_`e z;C-;|k~6u}&2+OgUSqL}| zr|dH$_7x*~VO-a76*>saW^kWPuDPM8bL10Kd9o1tcsSfsgwZ*oyQN$1cX^>Jc|wFz zIP@R9Pi(;+S`8Xk774J=0EpHGA9F8dzI-L?XsHe%S&>^?$O7%By(_7C`&CS4xDG{O zUInZ5<>VjRp{reF4fQb)#FjMiIEr2Fa%KE*O;j7X6-0U`x9owmI=m&yhv!o)Oz*=G zxEx-oE^Ozhvc>k^cw5|4WeU6}(R;hsCv((lVEdne{DF>GvNU29* zc$WeN%aD8J;~!#ehKrD<6>TVwdFtL&`8>j8hnXp31l=?0ec6EuLKIZ_2XUHZ%6Ym= z;t9dE0pKv+98v?D69Esgxe0&WeB`%huy1*;w}Wr!`5Gj=T%5ZNg1prF zU>ju&n@)sxU&QQM z1VzcOFd4lMp5Ia9JI) zgvJC#54l+7<{-Ok{Pye(qM5^t&CG^B3V=$iNXTx-RTTOp#fi3y%Of)Wt`$$|rN zsfLFTD#@6*L7Z+Og$qdN4Q6`~qA*lUO~|e$N5NA1oiGDV*=nXhxx}MCC1A@zX`d9# z;lUH(`Qp^BN`pTm10rl0X}ff=Swk(0wBQ8esZqxGum#bryD8C_k&BR8BzDF)@?*is zkDgpSobwR^pA|aWa3?~!-?pCy9WP1WG=%{BJ>=J+yJGR{w{p9L|SUqV$xo^Absb2BJj3({wsX^Bkic@n1q!7`#Ew%Lj;} zIA0$O^$Rr8A)wcU+&klGQ4{%2UHw2YpSB73_SgS@b zF8f^IUn#`!otg$z@=YbtGVV6bj|D8|1)j4))+ZAkVP<|QTNSmu;W-l4nI}&&bN2b4 zf?^$01g(O-e;535pe*05=SCm+zUpDQd@t0_sSMwg{l31*mJfcPcYe2?{1SmaahY+p z3&YXqc*aS5NH5d3aehbmt< zLYysq3WMuHCYR6ci8&PKv)AC7w7i*}RN6S#a@>ep*^O=4&32faAbp?rH7;;1Ey0A} z`Vd3CYOA^vAk%0!Q-cALNq6Oa;Mqxj-6wdLyQa#*%FV*wS}6*hE+32Xwx;aEwq{N* zU4eY!4>xv%o~eP=In}8jvtJ*-d$&6ySa*SYwU>mV$y#C8ZN46fqrC5WvnQ!%e|mN3 ztklfP*zq!K(j2c_xsfN##=TueDXge5+9sPO-x#QsVCasAUO`Atmy zgZ$(AhfDIC{QECTQ1ScopJd>7o%;W}{|6cPFGL_K<3AX||6_?jmj9Lr{Kwe-N8s+? z)`tJXF8NQ>q>+KGv4!zB2uWvZ;P7v7x9?_idKM;D=5G}8o5y2e;`n9;Ilf!uS^qOk z@E?o(AE!35v#~L;H8T0WIR6VI`0sR+%*>4RTue;t-!9Pa3U+3;Z&r|z_1p0Ho%TOb zI{xF~`~RKK=o=U{Fmk5**Zg#LrluA~CjVx%tQ;Klj4b~(S!Tv>0P|a$$;8C;-OtX# z{2wL%SE%-Xq#XY>*?%}$rf=?&gM)>Y>Dx2P{;lu)FI(ofF7vza{y(a@|Hn4|A1C`y zK-Ad6-rDZlg(~ph(U|{cge?D+ij)0YG|J5S4fC>b&@*u{eJ5sS`_E?hA3?1D^PX}w zakTheYy)QtJ6k$?lkc5nYxYm2>%R%l#KA<*$icz>ts?!l@qXJ<>A5%`sy|64}N#K_Lh@&BesH)F{-5{|rlM1L|c;w?xVfUDEyRmC5Bn1WwG zUTFId&j2mHef4FCmLzSf81x&-nHh_zNC`=!&;OPyO%&_Qa-!uEeR;c1c$de$zwiAz znDq03{uYvc-uy#Iy8HDWC(rP8lj`?%`}CET`}y(ZGyi`ZNhf=KUs@Ty?x)cmm;DZL zZf@hX503bEYHr@&QhUE_c#H9Fk7`SIzb>U;jkIG9saY-UTzEff)LuG8h+EQ7Zx*k= zZtr)EaE|-e2D?rDM3em8UKp%Lx=E)3xIDdc1$-Fz7WYpd?cuzMWv=cX*J% zG$RN>^glR`Q}a{SqxgB%(gfA{_8Y$kCc2b|^2y^9H%5DYau%x_F%p()=y`X03mPn; ziOblf4v5Jzh4dGL2C-i&*Yl7gELouKseYznGUyedDHbJA_4*`Mr@u|R6FA9s%US$G zcM4pIYNs zKp%ZU&1he@H*KftX-d|F4#`XTc#>%~gR3HfD@WFG zoNH)@rokn)ruhu3Ey^US?`K`>*5O|!`Sn5e(rDzNIWc3G4A|g2t$Ob*E8wfcTtY7u z`KrwJ)e?D9JD$?{6Wg_z%RRlwHLW9E5C;hFp)tMfFj{s&wpfM8j!4{#9G|((AB7fP zQ?eYpT54II4h0B24*=A6V#J7a%-`7br{spIAfPsP6_g-jBM}zHGknpIg9c z)*3On&@gI&1HEsulg74~OT3DC#DhA_SZ?wnWH;Jkv=XfC84*Y)bbvMl|HS)66B1U_ zV!5&TR|jTfROG~eoK$fktMt3Bk5 z#-lg!9|^eE{fStjI1&tmR-POVoAnmZ2qdSrk z*1j0L1YUlCiJqL60vyw0_|yaGAzj6L({c0=bEhKcmWeo{Vd;l2g!_OBTR}0JF>pG= zY!-w)oW@VvEMUD8rpp~?5NG_QnQ%x`Pt;E+ww-WyoXhDQG}?X1`j8}b_CNBN1v9W! zY=;@BN$OiB{R8OUHA7{fV*V(M0fz-&AVWdaIPi1omEe!zQJ3}q%R`~KJ+&w=x{OQ7jrM5JSIg1^Xej~Vk$BP8-oc9eab?G^{~ zat|n>Yz0A#iqh=tlop!|I_sOLPvYELuhY7_@&wbc9IOagytu+#v{gYsDjO~!6lrz|k^ywB-(oeJde7Bm9#nULyWHCqOt=y+)<2Zc zo{NwOSgeHw#B?r0yfOm{PN8|qQ9U^NBvr{DueznJ`zY$Pw=-~?H)X}CfC(b9mD|;x zcZZoFs$2+&BJcQUV|;`@vJVd!eu5(zzggPmG!LoC;BA>jau9#nZB75a7Kvqdz%%M55kGh4+jNtL5%IRZY=jpTInhs+~a-J5kf~q~|=djZLw}5E|Fsy=i1XSr@z*eLT51n1>x6y0;XT84k~8bsijdaz?WZb!evAs2l}$ln5+`tf z;T{H9C60>8pkwuA6i%Y(tmYtb^z(;W+wh!6r5|-WmPhiH2JUD^Nc@@D;M;8rInGDp z`u0bhLK(0N5^#-q8+Y0JR%ZFVsiwx@oo`rX1Ei-8Kay=;HZRxw&MnmH_=bMPQW|P9 ztylg?+R}-Q0YPtraUG_Oq8EiSw3cgsQT}*5@V(Z5j*G!=+Mi&kyBtHYdg9C*oY8jb zg!5EU7A6jE0@lpUNCw>^hRHqCs|w_t>R-k{K_o+B+#S{;dDVnV0xnyW@-}?EYpLZc z$L4O?v~K2#CO<`pKt%tO2XmRD(wg0|ManU9*OrsLQ7_0iuKf^z^p_p4T*17M3_`y+ z#}{KZh#0}Jlv>xG_sf{PBA->t{p0MNP2}4i1FtCk(mu2AZ7``8ECE8`mflnpW?Xya zw_$>D-DL)8e6wQV_NFQ;_c3u9#@Bxw50C+30rAOQ@BLPQa5B-k4S8@(XK@LZEVuOJ zWqvAX^x2YpA|`TTR1L-;cH7^4DAr0BsU7z0c;|`^%-19IUrp6Q^bj~*eJdQ7qP=AjtU85uB@R=Rq+#Cm z11>DHhKkXO1Uov%K-hv>hmHf%q%;)Ptdw~D&1ifLhY<43t3M0u{VMh}C{%{fHsE)e z2^D{Sp)56GIabzgHf2AQ0+@8+KikIolSq{hJtdk;EaE3k(?!w!HR`D=JrbofT7ZPf za^#P;Q>o6Gd6}9s*Be$13p$8uF8mj=>@2=zQ-bEn?O-xNe}2T{%Q|~hjqtaz@Vi~( z+Lx~+#RmNKqt7N+w5|bzr$O=BM46BZl}7oswHgJ%$FtCYCn(b0X(g;9@K!BIp1v&b zLq$g*_;AUW)22+4m2Cj27I#dfIuN2kY`dD&?7_0RmdvAK3EB3A-L59Ql8#hjEQ6<; zEzNBDWt+FxDV7{mBk)JMTNy!D)Z%1&_^=F8#k0tC@VInZs(Vs9Jy4{i!ln4cDo@ylN z610-z^S2uG3U(N{E@$zxQXzz`jAgg-M4&ocGr_Wi?u?J_(bLd0=OU^sOQEVAGe12j zA`<(9Rua-RR367oPBn4?clS=EU4bw6%}hg_yA&xBbcacJ(=mCDc!DxTPqK3aqTftI zo>~ZH4QtJdj6!Zso+%yPeLY$1v(a&Br4akj>RZ}v`c$Na$aD77to*93Pz}1G2OpoH z4~>N<9U2}iJeRMbYKn%t?tQ8vikAqV@UIpNS{Yf1Ma7qOo;1?<$Uq?{J2%SkBI-AK z#n6PCO{6lDb zCKMFnlPHhw2-9d~5BD%wI;UUud!};$S7Z`r5>!Zb;)>{<78Mo$q_n_*blpjq4+}b@ z(xr8gvRTi8**VrzSXGJGDErq|7OtqDqG4Fy*1di6b#XsFnc;rxz5XnZmvx7jrf|c) zZ3y~XG;jCt=slNHQepRf^*6jmq&!0|G@%@)6I5>|u=oL2j^;Pz%wHjAL^xk`KL&yx zB5z%B2NxSl4!EqRdw>F86>1l`M@BBow`|MB?#3j@D>dL%WBxV2B9qoDfEgvlr9_W( zvYD%9zDLxwq6AwM)C-f>3^~s#B#UsP!NSV&@LT@Z8Zdr8HDMgE%kX;2bOU6n6;dl6 zHQy^8C1sUafITLw}uZ5ybMgA_L@cSy< zJ)V=%oifm1tx|+5XPo{X_+)XR|76#<(Qm(W>n&`r8aA7DhSiiY0G$uuGqaLS$6ejs zTYTNew%%G+7ZU`uGmY*&3BB8_e!q(p&%9UuZD~~V3sr^ib)05lZTn@6TEzS})+xsy z`@)m{#?j39z_%e`$NO~)iW<*vYyz5kR~}D!7WBq#CXr$r@}iorDbnH~U=O6zp-Vk` zXO*n2W&EkMVxP*T7$)}5Z5f1vZTQLqym_%6*>Ejb_k@Fup$Ly)9bc4QhwN=pnO_=| zAjVqC)|U4V%{FLnr`N31=PDs|rQYZOeiiFLObUX+LSNvVn<^ySz>PRtrQfFHJWBy0 zRF6|HJWwyo_HxQjI^H&HB?^XuuWPlMf1+e!@t((aJp3`(REVdl1#cmq%&aTQsMe(Z zoEjL2SlKughH0QSy?8CkjQG#Y>u4hDY>8aq2ZH09ivbUutPHX##1I`(1|>N;Ma(q9 zdgZ7a(b*Kd5bQZoqEtn*?(rz~o;%m=b^bxYi<3`Q;5mFfNe-FTDz_R(Vt4B|lsA;R zEMf-K$U%CmxFPiWZb$KP+)3}^oN~pvu5=|IcJXoAm?_=$X_03lwR%XDb4ucbYwR>1 zM@l`fG(d!^FKehI)oel8QTX&oD?~n%Cof33_fm%`DF4Bx0jpIk`I*e>+vB+VqQX391B@o=dr0kZYsbfSScz z%Kc`q$uNP&Py<1VaZG;>Izzwc04(X z1vQt>Bg1^SXzvTV25%CkGXzTCxiHEgkWvtEp3TTG$$jXNvX1L?bJ6p9Z6O)#a^+n@ z`aZre%@j{2UZJn$3?qP9Ko_$gSc`d_RdTun`h@R=)aUZf@VjepL}S8xC(7bcTRYWg zMc6)-(v@Q)pUK2q>SYtL)^v26;I%@_B9VW)pe1iqa$!-qQ2_!p&E>{KDiCXOPlE97 z$`3%niZYHf7JcYw(eRyayeau4k^(txaiIH>FIO&Tv+7szdx&l#ZBvI(D99U(P?shG zRPyKM?M6OiXgk9KLbUZnd8}ADnt0)LFDEdJeG~rx?`cvlMs(W)kWLd!{PT3Q^0eBliv?@nD zrm4J2Uv<=Y-3i7;qAeH`uNH2=)9w?yuH0`eQ_gX3m>^#2l0)(CxFv!uNf(*n9!PS< zI5{KLaTc!vr;jd=J2S6Re@6Ts|0s<~whzq<&mBgtUCbzEbq1 z3og$jE-_0W@D*uwLCBE#V^X7UA;)VkPj=En;6zK2pQO7(4{lma=^&vEv)7F`BQ>3@ zrg)l!T(V*I+=2pz_QDxC4Zia*>8yJmXpb13r=h7)HFAVJs9%-cxx4?G?al#==sK=d zh8-!&k6+X7DgmoZqa4W{Ih5r!7io4XA!VmwEnILvPg5Y|s!vYK8mA>E>!3D`8^}HX z#`5^1WInDWkGdJ4bnZq}pxn&Z-Bp>Bw6JkFqM&{zUquHKry>hEA?XBi|D`%`smVwZ zcB|X78A07fm-`I2ti7(6_FiPl7CXF^dJh=t~~jRr`xnv}@>^kU{2K(?sjontH=g z%+0uUbmc0_E^X!Bsp8}#XP4aUK8uiVD}T<~6s42Wh#o*k0QCHI_TU!V{kIwLzG-JF zc#{nIuqZ6o#UsHuM`7={8;KV8K6_Alxn?&qyYg(gbx7gfJv6P4#M2l*t$*K){qbEM z-sIB_zYI{SZBB|e?jeM@tOd$mtp-9TGPBVvR`U_}*Raf>k1&z$I0Wj}SF0?CHRv7* ze}1mqayL0|LI6hCdR2D)IbPd+ARhZ1#xt5R1$~~eqozeo)mIFq!KoE4jP)_K(udc(9O9GbGbDY+%l z^<{aV$$cOC+enF*+q-;5zpR=NCu!>Y%5t12*$oWdkO#8rQFe~o;yZsZ#b>zyLiJenh=8-Fyj$j77fYKAiUaN&pzpVL zxbte>nFXs(OhQ>;lX(i_Umnc5$2_j#YaVCQ)*l{exfhEjqn0nq9Olo@`a>lZJ!m1G zm5IM6B-a+H3LelB9XEHB>YOlbsdK2}cnE0`-I|pjmZk+NY|O)aynIt>U}#_p$3Uu>(R|n+jQilp_fUN2L_jJ51D41;ZPRT zIvBeKV&z*W2Hb(btK9KW_nz+W*8BHf0S-ITF|IKMvB4y2H&Q!T_BOK4`jrW!xd|Cy zxJi6BRLUOc6l+!CU+DQzY&!2lC4{3TRsqVo1p8ZEuC;9g7#z~_rt(3%b^T|*asapd z8w+`ph*YHB-JmE>S5G!h5;D}N)P=eF`Ze8{bzIXhSM&;njJ-2GvcR`mie63{uGj1l z`F3Jd>ydlDOAQf2Tyt`6^*XAGC488HuaVZIpyoA6hs+WHd&u|E7HS1W)D5fx`OF$x zs8vsk(YhsYj1UYRY631&`fj~q{Q=jTCZ0@t`;yslSv!d49DWwPW3%s{0iN`4$-mpO zR0!|zk>&TJOVR*1yOvi%h)NMH8<8F9F|>?&mARZwO`7glaGE5Lwt()R_%NQ&RWzdP zYV^?KgK}9zG%S{?AXSIx6WA8aZXVSoF_u1$1ZkTST6};;rqulcJg6u&P8$rr~OiT zWrR7bEt2?xzBX2siRQrzo*{~KoBqGD4l_XiVB6)|#E_AkD1R*>v{TS|iNVmZ{M3ty^B+CkJQbE~7 zz6!Cy8H3KO9M3X9A}jA~Njs01a;bhtnKWzcnt?_oP#)H6KtxlFIr{^Mxz+tZoGUq1B%Om6Iuhz3DmYNNom=#hz8t0#yVZkQ< zo1g|8!dG?YK>jvs2tVFH-zDj8{zaI2A6zD-D>}$kbI>Q_M9K!Fw|0EbPyiJ)JB#uiZH7L@az-p<_DXgq2}3hM5yC#6-5uUGB62>Jm#SFev0#7 zDV+P6_+`g%VaJ(igjMF7pWFV8mf~L;F@%C8n7>) z#fy`52~vlXU8;TD_(ZxL*m95Ou9XE{pZkvG+#8z=x{Z@+LX!LeOL{wut)(jSjbZ0< zPrYYFoM+6m^DOX`gYDlnNJFwI2S$>Vo7du5t$~P1`54`E6OxnL(QTjtkJC*y3>J%W$1?Sd!%CxSlyM|(Z$5K$7Ot#g0MWlkfAW_iZalET6$NGJRZX^R z{Agi?%tzMHe&9wz-c@Pzjn6N_Q|kx~;`SY?&49jgaf@djw;1aYxr93CAIJKaX4Hv!%ybCo2l^l>0OeWDusHFp~g% zzWTv!^&8fswFU}Zg-4M#dM8aNEd0_F_py3y09{DcskGUU+AFp+)n zud!@okrJE7X&+m9Ra6HLKNYML(9Y#hX>r1zH5##29ztMvW?tN;iH4{M4KTd8%zqZ} z4u#{;*>4zE7J#?^WE9d83%!1>R}cPZt31O(3*3UZ?~xZj#wUCjV{Ypjt=bJWd3Xvm z@v(+=9p2N&8Who(bI5$@XFTK7&M@^I z6y|A24POgA?kwL=L-qtjCZu=r>HVN@*_{X!mL;Up!8eWSu42|O{$TC$Y6-P-TwGdr z0~7&~M*94I2+H@oY!5qYZl2O>5OW~(EN0?1rx9OXu1ck9PU|%W3Y()ms@q6*=E7&I z@Eo*R(j5naEKE%nqm}ZqTiB8vEpz@4M`fjYANZyPRv00f5-S6xKW{3v$wD#G15UJ)Re{WI~*2QH%-Sik#dG;6C$?qTbg-h{k@r~bB zEn!O5I|IHcqkM7WQ?xf3+&os;8N{`@Jv6|kz5o{5(=ls}z=sx(I9gcF8f^fc4ypx9N7o$~S%X&;jnp>%7bD%i4iQJ~tT z8u^R8e-v7O@IfxB7FGn3N+FWe;%TzbF^NXpEf24AJQP1SYgGj}SO7>i#WDw1EKo6q zA`(eGqM>k*WPdIQ>mrLfB~v`PAdut7x5OXMUXjIM?w#1^S@KJ{AerbWSO%WM8NPmd zY}Sxiw)QPu;Y_{<)9a;|1J4iZm;}Y{hPbObH-<9RKup6R@5CrB?V@mWHq4YRiLkC@ z#=TT8;y^1B$ms0GJb8v=ulWM3BG)Q4Lm0MRHXuhan{0=meo{dTOCJcgG zl79~FymI+n+JYiGk#>&I^p9A|r_EF&VvI8T6_EoVT1~R#K}hP>%@|RrS%HfwoJKuE zfPxhg8#nCa`nUmzi8Xh`+LdHu3m+IPvlMOm{^8z-&MbEyS>JeU=e^7>%mst*LY#Si z&@2XdPy9$}O|vbvNk<7{1*aZ3{-$@_IqHANk7bWpteo>8i}aSi*A6oXM~`vvccqt= z8oIcZ{0NCGxwC@Vo>eSvt2=lpLi6B8d>c->s^~Em?_ODRO6G9_MRf;T?2MBOo+z@_ z<2=L1B^!c|;C-5POV4j5Gf!olAs2W3KxUJGQCAwXO{Egt#*Qch=uuEDq%{$%*vNre zNTqxq$F#rem7+e(790m@059O}f@!d%8X(u+KFe< zOsBbms!ecuH$-)9h~=7tgX(B+`WG9vu#rL~t5OHll84o&$EoX{9vBcBb>sPbNC+sN zLi6m#!y_nIO5Hozvd!;X0`@CQ%aTb)c`0Ov`r7)?AK!TfF`hOc-XF`HiP>EHZGB;$ zi4%c0=x?o8e1ep6iigiVZSt2w_e~OH*AAixm~IjE-i=}?G~S#5WkZBWE7o4`KjAh! zz2yo_B%Nq{t4q|$cpdhztMOXvNt!;IGn+oRldph;&{3Dt`hZvPr8%pzmlj69-K$~l zRhv|2m7s9M7y}(eemuQW>x!ftJ>8ZFQvJ>Sx=P9tYN^;4ZS?8D_L?Vsrm`Q8piZrW z9MuDv$!|MLY!R21O+|M<12s-{fUXDpJ=%vDgYMkH-?mlR3_%7H{72^J@46Cd1zX;oYoONtu*#bJ#NEEwL+1R|7_SdOvs&E_D=! z=kjuqzK1?~i6Q5F^pLhZOHX(jQ1CXIT8~lEQod6JPwgwJ@=ri)y0K(Y0tZ1(cqW?X zuD~KbLuM@&twv4QNBe;gqMI#FReRckX1Q^)YqVyb$VPjfY?{ex@Yo@a%5QiN7AZ`#T})(8 zc_?qkLL6?PoFJ8MA?#Ty zAHIkcH}_Tg%PQJvhe>U3zGCRsRwSi#m=-eO6dUqPTXl-1DCrAijK7f;|88bg$pl3# zya6Bb#*MsqWpYK_wSGY%3|W)x`5IyuxL$UyPCp`t0Ru4xw2I?tSDiA#GiX znA@inLbdTXYC)TtxSLH;jy-t37xgZH*|mN8#z>#OQN!Hi}m#V z4aq8HZ+(ph%!Bv+PuGxX%s9_7J6R==6bX!yPAct};WJeNPSrpM(hkkD!Jde$L!ry@ z9x-7#-UgpGN*7ypj2kb0ZBb0bzOy0=Rllobu|UE`Ab>L{B?!B!4MoKfR1&tFzcb;jn&^J{qFSIt zcsz(pQ@p0Z@yeklYrV>?pNVXAKvc$7)!KsL`FODMS<6%7^CZorX$c0_)3#pcW7W&` zWtMtwL8`B|D*XQ)$m5l5;X~jTQ)P7B;Hqk52&<^dx^XK9 zDSX)}EdV8uZhAJRgAeu`dUxBg6G%L=8xzMCTmUqqkh4j!3@%~I|gkE*w1q zP2sxFCl&f*W2nK_S01~oF63!P&)Ib;|C}#f)Z3;@D0;b# zz1OtiJ?s|AWW-CxxGr^%t#Q2`qs6CzYQQ%)bS{{!bMBKS=%m*HZL3|0|0A zpJw?FQ~i%A+5bZ_IR}uLlM~1Wmh%O($$x44va$29bC3dli%tILPX0FZ|B9u}^51qB zP#756Iyx|!+uGQI{z;G+%-a9OH0J=*qPf_)xp;n)Y5u48{e}Ji925GNga7qM|A`3= z;NsH9QuyeB7g&*5ppE;{=EUZ# zS_ZwdBdXgG{q*YMB1W$`Gjm~-;`37)<%@-%!1K$?U??# z!U5$j8c*Ao>6)_9zmF1;LDS51xp%m1ou|?^k zgj8z!^$GO}atR_-1W-*0FLr`jdXI)WgO34s={qCU@ayv;MN$kq+l~RUw&Lt_%S%S{ z+a#T@kRj)&P2WY;|Bxv~YDAZtU;iFW=Ubl8jsxpZ#uy~=5zEKkCCy-18*(OHEpd6v zAr&R(Qiw2yZQd*%h@31u!XKy|_u1|7Gi$}u0W`J_4F#96uTw=_?xC0@YWPO46Dp8f zn%;ljW=hQHbpe)Zr6LBXMe9O8lcZszj@$n(JsX}r55^U*pZN%6ZiT^-Y@!Ys*v(sZ z>}Wfh?pTwo#_!2~Vqi0Mi=XEG{XCrtGU#luu+?`TI?1}%;kw!8-gXCf_Cb1H+F1y& zGlcEF2U#mkHs9IGZh1kOMp{cZX@C+BI)JMo*7f?hqbn~-vs*5JQ&&_mahF5O>)gKQ z+3J&&(ev%l5B3uSW+{o##IsRP8xR4*iniXY$M=|5qIeL6#Lov=c;?faqvi%b!W{tY zc%-1V{pL!y^9a*xOOPo<;H3#~ZxI%u69n(sgIrdxRJhZ27)fH#{sfceB%wPk{$g(7 zkiMINCnonoh&uIm-gtx^k1g_VWfbI!Nvc?y_R+3V!P_f=B0;2t2k^iY*)ZeGgE)om zX`)UslVV8sLvN!)y^ft!4zCS?@}u2X5E@BQu*Q+0cZZ^bQiS z72#i`^y-jG6Qy2Y)~doLrt$gzO(KcF#0FvexNpXC zyTHi<9?Uo8ce@}cuvc{NRwAJo{pI1+55nF^E=uQ%{`C}h#LZhK;QF-^Adg{Z_yhM< z1poSbbmHs49rMDFDP{DkKHc%1AKpfLSUfl3LW8~Wt|2wznkJM{hkEdcoT+G53Bo$B z30ruz*F4BG=O_`Uzv}yfHay2SOyP&g7tZ?yTM}&r^?xWBN}PM^t#mMWRy64$EI+Zego@=DJ>6<%i0akrJL*#Cmgi@B5l4#K| z@6u+7^Rwb@(&b9hgSZImKsvj3vzAIdxO!yAM^G<(yuoZsqTQVWta52_7+0#>r={2$ z#4e`EAjw zlGsMXF>g0~+8dASyN_Hew0u0mx_hR)yKsq)`_$C+m*;A|OHd22jFX|(w z^e-j59|L3QhD!W^FkxqaK`h>=$4q>L(rpk!m+LMIb`Fi+xyFmD`*a}2f>TXEn3&8o5%R8o(!1`s|!aeD6o&|)u)0ipVV9Y5hp z;_J6o%MpxugTpe)W%|Anq2F1?(-Gj)k8*j?zkpiBeUVKbu~OPH_xLTEAOT;c#Dc9I zSz@qp7O;QDZtmQ}3U2Z!Y}E7zk`PKgl1h+|dP1%!j&4jB6=Ap?iP7BFJx^hmdPRG< z+;GWd8|2XHdK{xKOao{}Fc2SYq;g#nt#4!r;esqtec#69LSM+%Bvobkx4=x6Q8vN>&=;JDA{|Pj%v=7&PP8{j|?LpUyBDTw73)om~@j>8yJ1Njl zoLi2W&Y|DuZOo^gs?k~^sTauZS@&lD07Om>Q#%fvXFt$gRSb6 zCoU@O$EvHHn1WI~u~BA9OitmzDXkC+z?M|^9TA}JLKRo!jX%<;?TaY{K2+WKiO6eZ zm2N%e$1*lL{bXZvI&UQFA&IwabqqgLj3e7QL zEM7-l$ik!JtnGhRylZ|qQK3y8BcO|i+s_`B-rebvV2DYHW}FUbT3+S@B&AOAh76;1 zp6%6Sm<1V=zgCgjiE{;t**80wZ67H zN2qaVpyE{lM72;UQYsY4M0)+i5Y~s*(TLh8{2N zjtYTgV2@ElNE*lz@}h|}o>Ne8(qA-t)#jwem$bGn#tlbxIX*h~I!oz@9Wy8uLD%Th zH=T6EfLQW6A)D-v&FS?aY||+3beMjGQQndphKOLw-_y-{MlO^-RuPJ{qsNb}C1#ZB z5K2oNke-s=y&dBk=wturU$^7j{S;nsQTNE5O~o<$Q!R9xpkvV6vJ0W(UbAUz*`&ks z(^L_G8lACh+tCiey6F2anxqkzd7g=V`6<^}{^6W;r zUe-j?zr`t0Cn5mmUc3`G7l4xfCQ#?j4ro4Ot6c|6mCn^6+-X&;6WeGchWF6JMj}s;;uSCAHpys`C%uTW`Nrfcg!n&j8;Bk= zJ7Da^lO9E`dfl;!kLFaSBAQeXp0xF7yvQ+a45=jQ#%~=*V+b^oQs9NGA5QtU3W!^# z|L%hoecOB3)iiE#tA|H(O!*I@gwqhA0Zi^0RnjZrD6ek zGHH*id-Ygp{DAKORTCGh^>LL^i*|`^B?j3zYy+SC>oYaj9<})yM5!;xWkFvs)<2k7 z=YN294rg19YltZhl0sL+;EkRZdBRFdPJj%XksP$Xsc%O!dsoh;67chthI%Yu)h&qe znB&lmvo`;V5)z1hb}-YTG0UWl2d{TT0l=mLnB>>)a9i>q4pI&N@Ta9#s>0wP=V-M4 z-rG9?^BSI=aC;CPZ= z<2gpl$7p(6-TXCNsrR1vUojtgQ)dKeCN&w|ArG9seB7s14q;$D{PBqx@+`xQ-X4P# zu^ZF~>V^cB0IWCf@?dou_-aONZG39(Tn*7_@s*alIOovE za{X8hmJMy2_tk?bQfiSCsS7%2>VV> zW;7civo|`5o`$9rJ|wq-{0)pEOo)Sk&q!3)j=XJ3cis3l!a8?hOb#IY)57h=A?B>+ zed7o@&bRImV=`2m@%zO@#<_5jzLs+9p@caMiC78}+roW2awe~DEQ~dBv;kNvNdk$X z?YI}b4vGQHQhL=9Fve8z+DZ3Igx7Zb?A>7n+=Pz3fZ+UghBpNU#2Pm;;*HLfBVE?e z2Ud`#=H4HTQ<_6Lm)*=Q0%bMIFk;$XMj(m;U1MK?(yu+|wsPJE-j11kgwK0BAlhjb zW@Jtwd__=}`;Zqj`Q>?i=@JX3<1!gxQ}2Wvbw=CIr3sC}M)jtnFq^E{Ipch^8ULi{liFwI^`_w z`lnEW`|42R;Fv>)rCwT1WWNG0W23uH1Z0&`nZKMdVSahq!WpM@vIBak5`Y7zUx(*kX@cOztez+g#xd$w ztH>T6s)c1#6h-pGFZhMRT127fRK4J)$%6uU2&K$cXe@y;PpN|<7IRb9?k(2xjU!<~ zs5gw~JZ@pT#4}i+Q>ibbC=CxI8xTqBVxH$)?W8rB9-RKtS*2_T>RL}fiZP9hXcsHm z$P5tOuoWVFtm2%{XEM)mb?>4dJUL!}l?C2l86PRkZ@Nal+!n6Atz3e9!ik-svQi~H z$>2%I+*BA0mclDH34kM>PKF*Ag+#M+SpBmYcL7TyBX*C(^7FxBX>)DN_@L zNqDki3=~R2VXmJqykv1UuSvyIv`MWx8knlPD({nkqmVR7b}&0~SO!Ymm4>H()(ju8 zAh{Ugce>S~bBp?d$;6XNJrgj_L21=dhL=YR*YB2B)atF48-;-oMx|wko5(S=*heF} zg#}oxpL*fWOh&`pjn~xShko~xLR`}LJN} z+H{$Wy-rm(FPcFV#21F*Lcpd#UEDHy>`h{BZ2lTFLgk@rKuw>g8as;ZFO0jOq0)OC zOl0AxFR4Di%>M}P8dJNpLqELdCsaqqP4Cu}h~2pIg+o^2{;sbDzyvjiIiu=JhYMBR zH`K6czj7EX9h8trX~zZ(|Ij2Hg7UgHxcs!Zr^@MqwY5symHhX5lNR z6wMVyIiH0xei(m6Y)Ir0UjX!GJqeSeepX^t1%BKYFW zE$gIy9V5|m(M_V+-xdX~7Yw*dxUIo0p2gdegLfgpueuDbe?)b<)Sl(JFsHo{^jz>= z3lc|F_+0HGHWzJeDFt&R>*Y1rUliS2Dm>!tgs!AyDa^b;cD<5PbLbhHa%V_mkmCww zO7!5PXLfpcC+EHn=D^BmmyyGXhfp6B|4O70*h-7AIcC|%SnSi1X6Z;;;}+&{N>347 zJBm-4{&U_WRIWDTrsM{%-pJaFaB?jrBw6^L;TxAcs#n5JKQT$ISY){X%)zuUgX zoBN%2HKpdt^^#SA{B03d`qZa8Z7aedw+7db#gIo< zqMyDBe98Sxpb;cReI>LX(!B4i26Z#-CEfAr!*N-_#`1maU@v#T2>B}y&V1YD4v={T zQf{PvEMH!S#atRBd})da(#fxzHi$X68$5a=91AvWhy7P1r>ZN8MP#BAOJ-aTxJfx> zUs1_zn<`?pxr-lT;j23_HTN&o79rv=b6>R_cc}^wXj@ppc`$R)F_^L%vL(tC1j@SF zDAcUIEs`xW;YK|NxG?Dz)kV&BW*s)i=cg-UlZUoBz3PY^2l84*p?YFX0#D9nGCE(| z9r*fFQXFuG5u!@xowDYNHnWZ>+I9W0vQedd$E6WI-0`># zo##Dsh7n^$M-V$htw@_IhGbhN+>9~tC*aD46;`1+9lvVNZDrVQc*2|gTdPUZUv*0pf zDhofhINa5>nZ*TRX)JFXm7{*W5*bc9rnw##$-eN99R?JVZN7?`F{gT;J zJWwb5eFtnm-0pr_xy-1dl<%jQ-W}AayKW!7Lo?NzD)4u)qSCTU4lizqob2RHJ7xq+ zcrV53EfQlg{7eI6twc3Yq4tt9rR~5nl=wQPiF0bUnV=jJ7Mt_@Wt9V@kp=Q3D#d9~ zXL$L!hl2=EOUo9>6hg>&FS`jC6fx_O7o3VYtLn>}5Dbc42hW1t#-kVSf4PKGcqtT& zv8va#_-r&}{S~;Z%NNJAE;eJ~-QXdq03z4{s`KDG#FP^0%s@3y; zMX>4h>~~Y);O$L-bpT~lX!aprcF(B27VuL!yy0cC-v{imLiF>!5{d;xK!v&LxM)3M zYbhCd-UUf!Tw+)zEKIFZbs0Hye*1Q1c{R-vNyJsw)y@EC$j5jEtCB zeF&l^WgEaTmK7gSiK95uZMKT4_Hlu!f=vNz|SaEK7H`N=%T5;F$orvNmH&@GXEn5m@C&rOeA zbqLqTc}(7y5kF3x_JV@LN+m8FM0m78?+FGI0KV&CIvTGg>Aiq`G5IYP0?R9osC(-v zN$eEdn2=A%o?JDBA%g$p0%1Z97L$UY!)x;Zj{ce`%$+Zh*n0Aq(e;Q0E4#X0itFYcPNle z^t%hd4{S80dm3np-@jWRDD`x!c3;YxUw23}XX7%gB$U~)Pp8fLJUxHwj>;SP=?%%P zU1ZuQKO&SHyCERDQ+A?d+7*jJ&|l}{t4b=K4jPtbZTDTqpvzY_HXi6B+F@^O2>WTc ze*lkYI=MWbuXpr>kE712Lm)+CzcJJo3%ieb(ck zDxQ|*Mj!Ekd=yBgQyf7eDnxEVnNovQwj`UG(-iY(C3DeQ5|-Mh^sQI11Mj2zpLDL1 z#oY5tRiuU#RP&olhue<*k68IjM%tJLN=sp44q%X@9(8ue$S^(#(p399l1=;5-mMDA zXO#?ap%(Zzrt85H%j2*y>_tHE2uLPlohs_{-&=I5fDY?4s>^bq%CGa+9A+>t0C%UvO8rs;WZ%uGr z3yQ_@@GVz28l_?LpB^t;RW&k`&UXWwkXxZ;N)NR9m6^B(GJ+0FuKAhIBB}wO@ z=#tmpUmU^;j;KaE+K)7oLHvOrjPXv>YF#t?dV9%xUMeR( z@KzAkX-PYKA3=n{u2%NIl65(cVFNeh>_M+uv}GuyY7s$Mk(?i)T| zSeE--?=G)Jgi_ztEyskmsejtt>qUWLAQJUGI8>VxJq1B?6`MiR`j*wSFlJ8T$hqCv z2#hn~4eOTJ(I=>bcFc0ASl`8|>cwGff^H9yqL7w&vsZ6e8`X9!!^>6pCo!gRc2UP# zvJlm&&n_9rDmOx?yq-B@^(u|n;`8*&>!Aa7a3b%lk{PVk_^z@Zmk7`uvELJ+OAFos z`g}(Hi-Ked_rihsmF;BelT~3%QE}|tCAgHRPsxf5!77pp9EB#$I#OS*#D<4Og z9o~-nVf5%S!Emjd!Uxxx`{I4|LY>XQu-2?3T5%yg8@liy%!d^x@F>5`ZpwS~d~e9K zjgR)ZVLtgR*9J3ZvsEy0Sebb7bsj%nN}U4AvI)(y5kfu|Q-f(S+p#DmizHGtw;1xz zl(x?>`~`vEfzLj%Nw#V^No~!OgGgvO`&Hzm^{D+wnd*p}QOAVy&#ZpcfvdbK(6_QS zPuc@aKBE+<#VC6??_XT&Kq?`1&Jl{+H%FW$L=Oaw&Z?p&I&k$Aba-AD7_AnQ6C!l- z{QLBb(}6o&q9gF5WhvM`$BK+cSWt~S$&x7W-GiyPh9 z)A|8vz6kxBIeaXf9Ury%7@toh1$xhx=27~)R5LHVQM`SGGK-4!o1UM-F$l4(m9O}g`+rQ1XV3b#* zj=V1#rAkLE+1y05XJ^uzu0_p_NQ>5VfT^aj;FHFNuPB$W3k`)smI_(k@n{N( zypFZ!h<%0LZN=;eOJK^lO-Y>nklrFwz)I%nUvhDPiom)vtaI>FQuN@bdXA1#_*eqj zyLzYuh_WkcrhzY-UTa9ui1)p`MJ?4E!@}n(=XcE|VFkAFlC(VvK7%A>w9yGqT~fss zc}w(KMJUisf_IUExNB$R#lu$Y%&2Hc{i5C)RK)>DL_I|#0%dbgbp*Jy+pj2?ks0g! z`|W@3&Pi6)U)s804*6E4UJ)#3Pp3WHY9YTj=LjQ2r2P5Qp8LbNDUPdy6w=6B>EQ^| zfg;W`pTm_FBc)3)s@%6DEuCL1l3oWq^1~VX`DV5vtT!WF4p-+D?3%=_ ziQRKCeL>Bl>2J><1r)t2niUEE;LOY_H}eqC>wBc{Wo(VBm!%X(qchw@gf) zc*KpVmPPZs(C2v+G)+D2E@sWCLbdoCpdn9kO0wt9@?d7CD~LL;Lqk2yvswrmaL1}< zh5Jd5>IF~x-Bdc89Ts51IhAYdOFdu1@-$_d@DhL99Pu zT2oenm7SEStzyuHVw9+(RwZ%tqZ!QfHsG?#4b`g`{Zs#ho|Xc%sZiAsU3A93QDJ zVf$-5XR7iR@Mz4muWGU&dO09N$Hsd_1DWeizMRcZ5g%U{{G67E20(JLH38{-^9ZTm zJ+}r>eo20r3bb5&!nA`qk)(-13?hbAIj=9XpzACL7Tfnfxo`uw6)gSOp_ksiNoF^wQepE&%x?CAH#UzdQrqu{kv7`JSIG-E36G~?&xE)#WG&@% zhRJ1vhR>&`hG5&3JihC^aq*(8yX{zZ4wn3y#If+HW1&q+k+IraR_eh3vU;a&7^h{P zqPWi3P;-|&jO$aGn3U=KvYlrDcB8A-)gf(Uwy&eq_0Zawf!-YbtQsz7w2?&ul!kOR z0pI4w+g3s!F0_p8q7QxRP!S9xBap9CW7k>j(A7BG9zC*6l>$6XZklTex9whoKAqan zODaw>OzW?XWkG7~DIqnpvruu%`f+c}jSeyPW+#lwRBNip=a(R;_w~x{Li-RGvr>jW zA(=j@beEIA(JJSfKHR8w;jw*KIo3dNlm<>8zo9EE<${QbIgf@iWZyYMu`CY9+Qf^- zsBX@RyneVGM^bBrtDa5arVMQwO~mdW!0$$Qa2QYfE`re0aQ@&U=_(U^9?T<)R`s~^ z)@UbpLZvwOQ;b=8$Yu9khUh9}M6t*d=6l@Z>uI9AdU>YHc{H1^HN$|oVKF%dCM^`` zPfux+IzNzMzbVs(pl7?A<`ZM@59J_IHg}6C%vRhA^^3UdZ3TtKCA}UXzE>4^#JA`~ zv?G_CjrcAEsXc;KEJ{?=Km@Pq{n-ZFGTmMGmDP@yI|rUeP6wKg;N<`^|M10ynBw`l zBi-D@GW75z#_EU_lcmCj7&55{RdrOx9R&u7m4m;VOV}{UU~fBXgR?4B?yUs;5;Fb0 zyYc*Bjfg}gTGWH52(fk^A(m9wpvMX*AsU@br-UPpsjSr70vgzny_5NX$EU-{-y<%N zPJhv4Us%AS8MEn#_g#c)JVLapkYI^o3puVZKbgEo{w=?O6VFIeiyA+Yn7#n73_n@{9Ee%wfMQH`k-~IR#Yltjz5#>0BS>~JY4^z1&bb5#nKC!tV>Yzol;HIiEqp+Mr|MAg=_7eiG)r{!P=@ibuK4wD!(QQJd(#uRk z0?oTI{4xoFYDkO8mQTEvc1IF2QcV}1Z4Mn7CpSfyC{!MHPrtD(EZD0B&0Dcq!dYOd zT6&mhB_(j#c9JU0Wh)g&z$@xrA@UFwqeBVL7w2q?Q$fF|WzcG^!9B@;&E!{je}|d| zxjrotVnMoRul`B;0l$H~(Ni+XPxa}G5lo0_MUvo=q3$3PZtH;(ZBnj+FG8qX<7=a@ zv`LT~w4Jb{Qkz6#!CULLu&%lN;jWmUmT>QyL{S>7dm=$KZ^s?Gr&39gBH|QUWa`Ss z{a9&?NFHPO31C%zxO>yR&P`_*!7=lol6UeZxlmipo)9Ua+$vl9Tu+6KwhkxmNlXS^ zD&{wezqr_{R@p#CeqtS>zCn`Sxw1|U5r+`;A?LMtW72VU;kF?KIg0_tm$a~el5}xV zED@W|ZjEjpK)$i{B7^07&}h|v8;-eI4os%@d0D%Ekyfk&ZRR*CM=&$r6$V=AW) zMQ&^H7N7z*+dZQ#M3pzewXTJM(-WazT_IeNftdOIEwoHARqDMRQVhI^M`8`&Bdxk8-xrMo(B$E?&3-*pxn-*gw^<5Pb)-J?wEOFdt zsufy01y3w(8bXKk?v-qCkc8DuFd9>xag5xix?Js%heX{W=)w+VIiuS@b#0%Y9=|I$ ziR7(&P?C6$S6kARa%qXy)!$d4p1<_%yrOu(H5NT%$Qlb*Nh}R9H&1`f5>#nZA$s|Z zS$XQE%82nSPgf4t_d{jp<51AcjhDdl9Cn=Ab{+W3(ZpB{hw@hc7;*i;_b8lpX_tae zH6Mo!k|;S=G4o}rC`Gc4ihL2s)*EOyKVuukRt7|2q%ntS&BO22bqZpj=`twa^{ zUPq3rXBq*c;Ymr7M`?)7>)R)8a0BVHZv?@yK@yg+O^#YeHm2EH*&s0!zAF(ddD-rO zM){@fLtojpOcJAUuqp>jk_Eg@#i4VS_VCA0OEbjAp}vE69*<+F1!r@e&wW8J?#I-3 zy<}I*R5wXOyGeo{aEVRDp10XQhfs3tCY4opVLw<>rO_?S3CC!H?sgqN26XB!H-U?t zK^4Wvr>aW)A9H0-ELcx;g#Q(_`tK6X|3R((Q~jKi^-uM4PS!uv&q+Di{?I%JKmVd* zgQ?eSe^Id6{-R*B{i&wT2^Nt4^YcH|)H&JyT956o^}qz-KRySOg#Ud0Yd!YA)&o<9 z|9t#*UsJt*nc=tj(q>?tbt7|TdlQfoSQ4Dc z#@3k`EXd7bZfk8KXkpB6WvFKWa{{GWLBU_o(a0Ozmn1TL^hIy*ZzGdI{z0Hj>MC6fMU#`$g3 z&d$!vhK?Y61JG~E%yY6agT0iKiRATmu()!Uwp)1N;a! zD-XC)6?63LnjQG1K0YETHc1{jv9v&dL%Km}+xBT(%RsCP0Gy)m@ zeTV;50{SCZI5;_f#S9xaCpgD*froK$aB+j*_$_e%R^9slfcwjG{}d}=SRCMq9KW8p zz^(}30Z(z^;9&nAJ+5g>m;BYZ90sRBKKXVQHFWZ5~nsD;`N;K>ofZsCQ z-^MNcYv21Tu~^z#*qDO{t=O9zSeg7$@;};|S=jso!e7|Hi2jHUR!$D^>5rWg_&fOi zIM4ld1pn{h`vW65J@c@FPnExEKk%57eE55|@JxwmZGTz}LNAb=U1ra9UFs3^Zz zNB%eg|4R%0RYy#mz$0qx|J?%e7dj43ATu``kb~#nLHBPJ5PJtlV=%yv7N#bD50HOw zyuZxH0Zz(bRBX&VoE+fP3?BURd#M?mgnnat|1#d+&+=IKu$I zkL*BJFyLRXe=AD`OO{-;(;orOq>cc9OwRmElym~U<%;2>Le=XVockHbo} zBEk_sXg&#&Mp0^%8&0qfU+Akk?hfY`4QQK6NVvG%8rYmq^^lVPh&f}`; z*LtS6GAq6MS8O_5J+w%+`%WCDo}KTgwL3$uE?=t0)|TBrMNavpUCGZ0-uvl!UEFt* z!D6=AZx3uZ$G!|?9A73Z|GZ2(^yqkc-j?s2p`me3eRjQnvejEQsq~0%y-lyhOQa%mcgeQA05cVO`jC4fs@OXM}jmC33P^X;^=xR6~(`tZ7 zuEo83MkEUCtdOa6sCUM1-6h`E;UpUxobc=9s797T!(pnEptH-1T&UY(%K6;iz8g0z zTAHZQQzi8%?t0M$l<<1#}K~5iOCa^eB3}k#mp~+_R9e4dOeQc7? z{^`vj>czie-b=oQe@<<{%IceXdx59|JX(?8Fc-%4KVK z854b4_WqM03p5E_iOe#ap9IZp2IFUEsSj^%!2M0#8#lsBh%!9OjGx?*BX=4DX}DE^ zB?xLL1?&7?tgHA?)3y0t(6G4W7Uz6l6Z`!90;j4piJXbAGPFFlb&G=8lRWCfmQjW` z_!4ojL|ho&yNlV%opkiLd96q06|BMmo?j6WO0_7_)8TP)BQJQ_Wh(P;#iS6%vnTAXPlg|CVKINnib9NQ7U}*>N zX#Qy-Om#ioq!4Ss@O(K>gl)C42iERn80t=qE+k8d{DQV!kd4(5hh#|ux;GT+YdFCm z)c(NMyeCKJC!`xh5qTY>9~mH zHwm+4V>K0;gZ`v#L8nWl@EV?Nrtfjf@_VaO2V%mQSe-_?%(PGT3yJHk0z&ei+Qy#< zB69}wO7kFtP#aHk!>H$mdunDEohJZsVlStdUlp?~KA3fB*|Fn>&0o~BpEkQmYk>uk zcV4x=BLlPasFmBzE&<$MbDjgOAh25(4|UNPHA;+>q9zi*7n{9>fMPHVYo@FqzY8IR zp~JxVGEY016_aW{F=_8|_Abf&t3)KPL`Wr%$;qvH@9B|V3C#7`S={W8-Wm3guzEWv z{47F)64mdTL7Heg1=B^u=`D((GI7e@W49@3wHVv|v*s>(zNSAE^U@u4>;V7;e*!vigSl>=A3szEl#=VB&;4RG-K z#^(RAts;Ec)*{R{siLb0em{Po1if5l7#ax$S?;Z=i38RBa_z_P+t_PQq~3Ua{I@WO z_&o#MuBWk^1bg41D!QvrRZTqT-j3TW0`JVVon&30teApHm5fM6Pg7)>*=AjksdRLr z__#k(=xxNN0n(TJpE9Tb7lbg}$Z@zyEL#*+}5Mw&AryoR^R=@H*pc4K*>kGk_ zE0+QK6+#?-)Vfb}r#~#4cQv}ETzJYNRG;qEHY@FXq zmA|3b`RW5GWb1bY=xrShmbH z4VF?%+MO0^#=52kt8`FFE;Bt8q9)(&s=IRUfYDbbD8h*E7v4DV;fk>XVJZ)_$tF64 zcK)Zp(eg_ZQ`RVC-pka-pv3GaBEpcq_vttmP5fhmh@BBkx!s1kf^eaL9KTxs*MpE5OO z#wMPMI^NO456p~`Fg1tp7XhQ_u8}_KS79*^6}5S@rpF-6Mk=NM#ob#*)wwkLzQGBu z!3pl}?(P~0?(S~ECAbE6cL@a7;10n(xV!tEWaZs^?Q`F~7HjNt&l%%>$$X~J`Om7Z z?x$z}sv1L^8v8nG|D;@lWHGVvqCgTAl(_C_ML0MTEV@r!-(ennn)kxj|^|1hrLPZchU59ErHgf#|S0xA)SkH`%os zOW(ls#kJTHY6rFm#mR-fr#?7=*f6gXzk5%fThmGvGL+Fkel(QHZ<|_W8wvH5tcvcT z_>N;np1nlGuY3zP&Jaq9_MkMM| z-;@$fIpwjEaM$B978&Jm57$5C9rd}+y)PL%T@;Tsqh|?)Z^a20LpIbx0#P2vLOmHP21BRvVJ7NCXUT*Ff%Y1hLe=(kSL_HS+!rTCmQ z=Oo@~aj$a+09nC5?}rAs>CzBadcsL_w0d79`AO?!&Ih2ShacCmEWUA}&F6Pi3b7Q% z@8M3VmN~KQsh=Bw;cy>2adufQ<`;c& zhc2oKKWkVk`Y^tmD;`}NaEO(ADv6T}WVJvWzK^xEs%}t$pU| z1=kD%I!O!?pV)`{W(?;+h!BgJ8$BJr=%5g4)xL|>zmgjin1G*tdj~@mz^8{Nn`erG zip|wM1>LlIl=QYSia5@Wud%&GJJ9it=!xgjZ3jJR3+sM-u|_L2l^py_??e+Q>6YIT zDX7e}zQbq_ge97SVYLbD-s`d*lrR4UTim$F+`c|roZbyYVGg~7xWAae+L-(fQs)Nazv`#^; zC~ca%rYU!+pMXtrJ6vuAt02w*CwegJ%`mJnst@dN1Np2J0BZP4)KMBc4k%x*h7rY%O9TgIdnU4viH@LLWAM)l& za=aCW?%4GB)Klkyt9&~B&572jZQgztCq!-iC(ug5_L?FhaZI7-ntKQGC-UrQ?sdfX z>orI|@00=6gcZN**$KnzmC_|RFz>LEj{}v2&4wH1rOV=oP%*-A z9`XmRDvP(|UwvUj&|gc4y&9j0`g*K#P2MCz&XZ zV5l?>2FWXM3Ysd_RY^8te<+=+hqC|qWXKaFhY;k`H^n#+3fmz1Z#D|XM!<6ojI#Xa zhyCaZ5VgW8i9M<=<5Oq$aItWrGyS*R!teH>-B9Ah*cK$~1nJ8t(-)b{4}BlFH63;E z#LGBx+j^9JLe58;7(rl5FM#K|3wwIhEdRc>e00M}`6dB;_#$xfw^opq!26ljR$g2aIP4Y4_Kwx+KWv5Pb%j*voMlri%ptdH5bjWY-y2HnPMV4GS%!=asjM&I> zqN;FP;ntGBx1o>aE;gJTQcOAfU)^5Jj(YML9Wj@v#Fo(`e&ptEyH_?-*)Glr>$PKs zgifrfw0bt!4#J)GHEDh@ts6AUeF}S6$5E(jJ=~>Bu02RK*HLcmfa0VRGQjkjx0~dz zsw5w2>We!mQdguVYsJe_UL#4M3R*}$lWop)8yX5Mk`%Lpw69)xyY(&XGThwA+M{~O z=_hbLm+Dr9v8%?AX>~mb+jXHpXgW~Xt}Z0P*P5CK(`Y7Go0#rC1$slRSrUIECMMn0 zq#!BP_?9B$u@a9aQt1qE`C6w>&4=seN-KvxS}G@ zsp!vWSg!Oh*C_5(PCQrjO=mm;k-QQ+h;|(N@1M?<%a8jGHrsEH2qV>nQF(<=KW0p* zp~vmT55uwKdJ#x`0%ta`TNFJm{4hfaHFtDW6qCgLjbyn}6LtFPXz|2*XM@8att#Ex zCX<8dVGiEf{P->%smU)ZSA&lLMzo-Uf^da&PKJISqD8L=|NVWuq_ot5(qb;P&MyjF2-p&4o_3U|c&fkSNRu{IhQ#@tX+ zSw-)v$}J0z;UrW3YVS5s2C&_^Iv%*&xN}DWD*Zc&Pf;)<-rm&7KaeKuVMO?C8-S^d z_}eP!AYGOl@Y9@+Rz-K!I|S@O%;x#QZ*3USS@rMXidp+J&c|6dJr&Z1AGv<+aK`Yy z$G`QH(N0a2zh=`Kt3%EYHHzg`Df2S$iZ~dJew-t^M;1;_ly=PZinth!e)^d76kLSk zIk;NqLDRPBSJxv?Lg<#;8H~r+bN*=1)jgbShp0&Cb87&)Z(cULHabaeJ;dc0xd!$T zipCG&o)$+~sUiNJkrP?cT!}QWMK#M@Ht};oWr(2x0vlGw828r&Ems6*%le)0 z>oPhIO4U4z8TBCP)Hn-Ydrsy+C3RbKOcFl<#_2RI{oDN{N7jS1au#TjoaCfI<4&u( z27e&3dk(Xo*k{!lQ+-fZ$vB+6oj%6$c+>X-WC+~XE%W~Kt(CTHAZWr`H{k4aBV3-U z2njQ&qeOlul<-WqE+|EbBOh>+68nC*O`nn#_i5$USE{HZ*&r+rJe2iG*f-2y9h<$ggW-6gZ+ zVkAfl(W%fzi)F0Z$(55IV@fb+E@L`du$vu5u`O94FXBe@!}p0DWGu;ukvGamw-j9n zR6xc@9tQfZy0YNvmMv2?0bE{x7;L&Gc&dI)z%a1x&LFiONevdu2|1lUA$9j4KMZb+ z_PLKBLmn&K-qE>A*X99d5BZYad#Z=kYEy_PWjG*PY;JfARdOOA=Gv#&YQ(y>@ODn; z`9^2sQ`gTGZ`}`_)-{vf*^{!RUqbxKXB_hqbui)|qVp#V2&Oygj`m6n8gd^f7)9Tw z`YU7~$=9=y!^Y~b^L*_2_I<-i+gG-t{%m6+Z$czh{5Cb7w*H#`iy$bDKlUoLUyhNj zx|*%4drJDig|}Zt=jCwUndEzY^;ka)N8n}f!U~8=K{28k{}y9I4WvV<*-Z5_!rjmu za1xc%_Oq8aF>tJBJ#%+v3AcuHw=D;QSt59N@L7N;5KlI5j&ro>N64nG zpE-avfzg-wdGEkMxb3mD0YB~X`}K%}3@X2Mmmh@GymRa)&?gwH^i6LBVf57{Z55Mi zQtwuyaJ@D}tbL#TMPTCDHm=r*J+ADJjvjjfC2^x0g`;^g){w&-0*gZ=WF32Vk;k8>ElgT>dj)?Z7@2i5$D1lJfd=QST z^E1Zi&BARYkXG8e^<#59zp*tBG11GfhbnNK+%&wS!dUX*YrQIG1Mgttk$`|IO&p^@ zp4W&npWa^|hHs&FYGEzTjbfvuq}DhmQKu-&4l2^kp$kJXbgKyY(1PHRL!u_c5wdJ1 z6$IJB*;SOQDsAc030b&m46RhLtf^+k(9*(J(qdv^$<7Gw=jPy6;Vx-G>=Ec`Uz+Hd z3)D5ZpbS!|tFJmGaHrrX&FOUip60eYDVY^bFZzBH~ohf2x4N~y+3^7IY{XM zqG~4tvv&|V*D`eqEp3!<3lgoc)O8HE{=u_Jrterks-|IKVQns3%K_XO(Z^~|aH}(T z%Qg7!PN#udB=p(@FxuP#lXl6R$edk9GTNQ|a{4T6uBAlops&suN{*UCYNa(pzSi^# zxrCI^y(Fwz^+R#11fX1jB7(CVz>U_BNhIpuFC2obxr49faz0eyz@lk`BQPmTWQ0mt z@-Kbmz_$m@?`xmjtkesMyW%a47@HJ@l;+MxY~cY0^P*SRIq@j>xQ;Grvd&mqS5L() z7(eW^?K?;;UEgWdoL@LuJ4fUeM&A~bF6}AMQ1oLu$>T|!{H_Rj%yVO7vfT-N2T6ez zVmg((G7oM- z8nhL7oFDOpm3@F*f&RNXir6#{wHa7*gm4@|+m`uL;99Y3%<7DbzdahA{r&F*cTI~k`Ug(n6^byALTBt81iG*ben}xYAKxE zk5;0o(|wNhEXaPk-@hh2c+T;ETqS5%?|{x7Up|eOi4PYg?6H{C~_ zlG1SVVtlesmlx`df9GL@uEHZAj1}*_b~ui$w!e=voE5n>CThRKUWW9*Su5}e0|9O2 zRLJ%*o@KHXISB85M`p;By;~U%*^bkhOY{J+JpRcZQCmNnoJ}fJY^;i>@~xZuw(6=# zdw7I50LDY5LGEjggr2clpvXiQrs{;ICD4g80ttay`5?@P1Pp`>Tu~9dl#?C3-R9uQ zE$syw#^A#^NyGVd>cULr1trx;wxds9vBS#Cis_6CXhMe#4ONg=pN+Mv8;~qLRuwzZ zkAG|>uIoA%e(Y14@B<26z4`d@$|OW-kzbpm4WIakBItOU4Y_;IZc`q2#7THx1N9Th za~Ek9383Qiz2(}3m)C7w6MW%^dv8@)R+$1)Z>;Oq&H=0fH;k_p_RbM|`0fibdX9~4 zvbM?DXJ_Q3a!F!H5aiIUMPvsuAh)|zOZZOWqXqmAr+Mnn+o#-K?wB*EaP;9}S=(wX zUsbik`?OismJrjnB}UNVh4@ec@(1=0ExOUFr{>SkI_5YcEt4yg+V7ckzwPxJX~Xur zUsLH+1YKO&j?Yg;N^T7|FP6(VdSh{Kwf~`HAo&4(ixcwcL+WW#w8+vvZ-?t!}K; zAZ0OV4j+o#)M?D&zfg?2)|(ixN=!L2=07iunkb_(hekx}X_dr7D$RbE@X*ve)?_xG z7>c?evmrKf(i#rFb^jA!)>8U73^{f5dJf5YB@o&H~NH{);EoAEd7&G;MkX8a9% z1FA6p@wu1XegJF^AXWZ&{0)x-Fw$SonSQqi;B5YQ{<}S<-|aE|Zjb4AdjQ<(kI(&X zkLh=N%)i?MP`ZM@cdta&c8(im?eN{26})}MnDf_0jPhaBYUjj%5z(Oo+EUW-*h~?LJ zcny&AD}?`6^KbC#4^!#`$S^~@f6A`??hA~p0MwKXfL{HRuJ9^2>|g!Vz|>w>&(y-y z!S!D*|3`h6`K5e39s?bKaAKunVFs}IucV8A4Suh+q=EfQx%+==!#}h!GO+;gItF?` z2EnVf{UfIMC3OCo%^3awiUGo24h;ZMoy?4{C5i#C>MMfgcL)5X>=$|eUnTw(v<3jx zUb0zUcr_*f+zH^u0jUeW1ivai{t;6A!i@hfDItF$?T_(>2{23119Ajd>6zGHXm*y@ z4Ud1GrvH`_|2Mk+bxefgUyX<_up|>;mi`6Xv$C@S@+z1aUt_jkGyLBM!@olI4|)F# zHDzRHd>QlTSpXn5J1ZUAOCG=ryZb72uY!qx_qktzYHj*wb${X0|70Y83uI(wpaC3$ z0=Oml2m1ceL}FxWrEB`n0`_GHd6}2#Xy{oPn0{pd09e>pneOG5>eY_@e@pw_?M$tV zsjVIDsI85R02yt6WzUzmWd!iB0NRv|1~6~DobvIa{#9cC(Zun;Nh|{ZdB%I`2JC=& z4iGvo;$J29AF;*O_NM=6h-Lt=x&Tws1CDv20}RgWEO-p;fXukpDSOrI@jF}q!uVb; z|D^7(-1{HNQNIN;{<>GB2c(Jq1AVWWLjE<_*!($?Y5z40{z?Y}6F|YtqWdO-r z%xv`R^mq)cEU$9wKbk=PZPMOf$ogXn`IVvfG8QrbvKD^b88Fbj_NMjM8tQKY`d`kq zwCDSG68}Qse-4PhRWkm{(PLu(++)2~dOCJyK;i-mAbaaI?)|moe6=)tM;jY!I|my5|B|%z7uNgjU%*=AC3sl@{$-~F ztkCHJgUst<_t#SRZ}t6luZf|Bje#K`vGKp?`wMx0a_%1z837X6nVA8(qW?hRKblhh zUH7APG6bwhbgk_FW0m*!E`M3#(Y*|Ybbynh*j|;x_3LMZzqRGRy5avWp)7zyxLy`^ z>@0w@xn9>NUp15b_W8d|_mATm&>>mq@EBQMa((F7SpnyUy((V*G?)AzO91)x>&|b- z{r3qVER5_d|7!vWRj=)*jEWs&5UI`9H@-m2k_w}>G@0;~@A&9oRiC`tla!|hFD8pV z7g{#Dhk$nN$~Y?1L|3KG4vEirc`;miDO43a-#s3Bttde))onjd(+(Fs-e-7mTzWn1 zzqj_fiRFA;e_ozhxIV8Q2vDE}zvN0bX}X=7X)LrS$`Fk;;cd(PYU{Jin~Zn=SY5nffPCBB#|59` zF`lkvt(O+WT$K(W;kVrdv$!d-K2OFn?Q!B3H&yII-}9E!K3uII!nY;eQLrw?O+>b} zB~ikE=#NiSq$+rSNY0B<;_#z9=KF51wyf7AN1_++B<#bT zU*eaN74Q^jeY;2GG>Q3XLfHfrutE1PqXR_i%~>m(ofmHX&fSH2spW!LrefGr%g`F!;EJa0auX;M9V+M$Vyw1Dhbu`!`;7*(+T7YQqIgccyc98B*jP)dPUpKH1ELluDPN_ zvzO=+P&+AQ!AhKALwbH#xgN#Tpu-ZK_L%K=pW{vnNv1{(Hs@~#g%+#lqt;NKn{*wkV^kQ$Tk?W%85j;VDjMlRg8n!i>UBdIH>D`^)h6%;Is@a2Z(tgfJ>jU- zWM&&wpYe*LEq&sAmUV|XW5_?BD=o3#8lbBMJb7{hHAs6^P36myjq>8%Gon!1s2}1r zgjayeoL%SQ#`V)1x(n{{`f0-`(Fx!_E%9f91rB`D=YBgHm0_&;RqJ|^4^yo=k}C~H znnnehZoBw!@XMK&~j*-UN_#-?ZCv!oI-i97z?=AAsb_)TSs~i1gqr z;3m;9mHc$bYA2ZW=Zje1MZ)vrJEV)R2SZb}P^+QJbfr?Gll~n2rj%fmTUX*Hh$1#t zvY*~SMu>%`c~K84QWGkD&)4%5+*d@?3sL0dIeX zw6G!pXKEFI5a1#s~GL=zYOQcajarT(98p2}E3%p733Cs>| zkM&7>`$<|~#c%}R*nqjl0v`219bfl5NFB-x{#Y!z;SbxYRc|HxXHd$dOnx5b$0UW_ zFOA^)gkgBN=_SYbO|sbuML3^+M@ydJQZbKOO-j!S`M&94EKO6V-8eM7)Z(279);m;^MZc(HTqE0LagumMTuGpjyjb-)T_tar3G@A+iTyKr=iHKDI9x%ER| z6ot(RjX@G^{Zx6)FfceUBF14@*RVLi{4+)}alXqDqG8t95r3QF3cw&g(KShbHy>kN z3U8IR0n1Qj!U+xE7|)^x5sg2X zjS|W+A9b;axoFukP|0hDua(>|NeXHC`KzKuj8cy;L-(}4k%ka^4e+6nEt1lWVe+K7 zW)9C+uqsP^Il(jk!Btc6JPL3%(a~t-GY_^ZE$^y#=oW9aX(EaYO3*KVhJ8D7U34%g z^FEw~5<2;e@J?)eKP7aeIO@~t;^MGFPn2?H2XVx=4cCXlIc*O6u%E*R5gk{-FmaBY zmW#Pp6ocaa-)rgwQzI8k=m}f9POqqx?ZP4g@H(2`h;iCYL#%@gf9ce$W|rPO&n#^$T*>zFIF0#;n^e#?zs1pY>5ckQUh)pbwehAtV zJJnf2z?Jp8RROljm==_$@IC@kZbB=$b?Zc1H zPvA#AA#+5@IF@U61Ibx~$1#Dxu@XOb@si9k@oMVyPWl8sGD3sdy?2#itWoH09VT2^ z=UG|*zLc~{mW1soZbG1&)Er_aED@bcu?<rZ3Fibb>SbIB&=8g#arkf)-$C?L#@D6NY&AEF|&*5h{kmR%|4C->vt6E ztJyf^cQ(Xx!&|96tKq_KD{uY8=KatMdRFv9k1zl+7>b!tPF!RkpDYE&HlV(lyqGA3 zz)xP_-mS;2O9rl4Zs#lB8*-T0AUcgMkg5d2D^3(U4mv}Ud@ivJIED0f>;st}+dg!L zWQbjf3=rBT#oeuW;pr%0A~PuZBPVFF%+cjkPn+XAu`fvnzt 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

(k-7*6%Yz?c|o$=wbmKS){N7#f-v-~}^N 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 literal 0 HcmV?d00001 diff --git a/test/integration_tests/short/test_select_executor.py b/test/integration_tests/short/test_select_executor.py index c2ac348c78..6baafc00dc 100644 --- a/test/integration_tests/short/test_select_executor.py +++ b/test/integration_tests/short/test_select_executor.py @@ -293,6 +293,38 @@ def test_select_and_groupby_with_sample(self): expected_batch.project(["FIRST.id", "SEGMENT.data"]), ) + def test_select_and_groupby_and_aggregate_with_pdf(self): + GROUPBY_SIZE = 8 + execute_query_fetch_all(self.evadb, "DROP TABLE IF EXISTS MyPDFs;") + # load from directory + pdf_path = ( + "test/data/uadetrac/small-data/pdf_data/fall_2023_orientation_document.pdf" + ) + load_query = f"LOAD PDF '{pdf_path}' INTO MyPDFs;" + execute_query_fetch_all(self.evadb, load_query) + select_all_query = "SELECT * FROM MyPDFs;" + all_pdf_batch = execute_query_fetch_all(self.evadb, select_all_query) + + select_query = ( + f"SELECT COUNT(*) FROM MyPDFs GROUP BY '{GROUPBY_SIZE} paragraphs';" + ) + actual_batch = execute_query_fetch_all(self.evadb, select_query) + + self.assertAlmostEqual( + len(all_pdf_batch), + len(actual_batch) * actual_batch.frames.iloc[0, 0], + None, + None, + GROUPBY_SIZE, + ) + self.assertEqual(len(actual_batch), 99) + n = len(actual_batch) + for i in range(n): + self.assertEqual(actual_batch.frames.iloc[i, 0], GROUPBY_SIZE) + + # tear down + execute_query_fetch_all(self.evadb, "DROP TABLE IF EXISTS MyPDFs;") + def test_lateral_join_with_unnest_and_sample(self): query = """SELECT id, label FROM MyVideo SAMPLE 2 JOIN LATERAL From 334c8b157259a7eeb8d30ea9e2499f8cca3f63d2 Mon Sep 17 00:00:00 2001 From: Hersh Dhillon Date: Wed, 22 Nov 2023 02:47:22 -0500 Subject: [PATCH 25/25] `SHOW CONFIGS` now gets all configs (#1345) Added method to get all configs modified: evadb/catalog/catalog_manager.py Added case to get all configs modified: evadb/executor/show_info_executor.py Test for get all configs modified: test/integration_tests/short/test_show_info_executor.py --- .gitignore | 2 ++ docs/source/reference/evaql/set_config.rst | 8 ++++-- docs/source/reference/evaql/show_config.rst | 10 +++++++- evadb/catalog/catalog_manager.py | 3 +++ evadb/evadb_config.py | 6 +++++ evadb/executor/set_executor.py | 9 +++++++ evadb/executor/show_info_executor.py | 25 ++++++++++++------- evadb/parser/lark_visitor/_show_statements.py | 2 +- evadb/parser/show_statement.py | 2 +- evadb/parser/types.py | 2 +- evadb/plan_nodes/show_info_plan.py | 2 +- .../short/test_show_info_executor.py | 10 +++++++- test/unit_tests/parser/test_parser.py | 2 +- 13 files changed, 65 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 697a42a819..dc7ddbf5ed 100644 --- a/.gitignore +++ b/.gitignore @@ -226,3 +226,5 @@ eva_db/* eva/* blog.md + +tests/integration_tests/short/*.db diff --git a/docs/source/reference/evaql/set_config.rst b/docs/source/reference/evaql/set_config.rst index 599fe0fc04..c45041b5a0 100644 --- a/docs/source/reference/evaql/set_config.rst +++ b/docs/source/reference/evaql/set_config.rst @@ -1,4 +1,4 @@ -SET CONFIG +SET CONFIGS ============== .. _set_config: @@ -8,4 +8,8 @@ Sets the value of a configuration parameter to the passed value. Both `TO` and ` .. code:: sql SET OPENAI_KEY TO "abc"; - SET OPENAI_KEY = "abc"; \ No newline at end of file + SET OPENAI_KEY = "abc"; + +.. note:: + + The `SET` command does not support `CONFIG` or `CONFIGS` as keys names. This is because `CONFIG` and `CONFIGS` are reserved keywords. diff --git a/docs/source/reference/evaql/show_config.rst b/docs/source/reference/evaql/show_config.rst index 2991f4c28e..0e7dba9960 100644 --- a/docs/source/reference/evaql/show_config.rst +++ b/docs/source/reference/evaql/show_config.rst @@ -1,4 +1,4 @@ -SHOW CONFIG +SHOW CONFIGS ============== .. _show_config: @@ -9,3 +9,11 @@ Returns the value of a specified configuration parameter. SHOW ; SHOW OPENAI_KEY; + +.. _show_configs: + +In order to see all the configuration parameters, use the following command: + +.. code:: sql + + SHOW CONFIGS; diff --git a/evadb/catalog/catalog_manager.py b/evadb/catalog/catalog_manager.py index 8482bf1bd6..70d3e0acff 100644 --- a/evadb/catalog/catalog_manager.py +++ b/evadb/catalog/catalog_manager.py @@ -786,3 +786,6 @@ def get_configuration_catalog_value(self, key: str, default: Any = None) -> Any: if table_entry: return table_entry.value return default + + def get_all_configuration_catalog_entries(self) -> List: + return self._config_catalog_service.get_all_entries() diff --git a/evadb/evadb_config.py b/evadb/evadb_config.py index 6117514b25..ec357fbd91 100644 --- a/evadb/evadb_config.py +++ b/evadb/evadb_config.py @@ -24,6 +24,12 @@ "evadb_installation_dir": "", "datasets_dir": "", "catalog_database_uri": "", + "index_dir": "", + "cache_dir": "", + "s3_download_dir": "", + "tmp_dir": "", + "function_dir": "", + "model_dir": "", "application": "evadb", "mode": "release", "batch_mem_size": 30000000, diff --git a/evadb/executor/set_executor.py b/evadb/executor/set_executor.py index 309fe2747c..1acb9b3098 100644 --- a/evadb/executor/set_executor.py +++ b/evadb/executor/set_executor.py @@ -16,6 +16,8 @@ from evadb.executor.abstract_executor import AbstractExecutor from evadb.parser.set_statement import SetStatement +RESERVED_CONFIG_KEYWORDS = ["CONFIG", "CONFIGS"] + class SetExecutor(AbstractExecutor): def __init__(self, db: EvaDBDatabase, node: SetStatement): @@ -37,6 +39,13 @@ def exec(self, *args, **kwargs): will be replaced """ + if self.node.config_name in RESERVED_CONFIG_KEYWORDS: + raise Exception( + "{} is a reserved keyword for configurations. Please use a word other than the following list: {}".format( + self.node.config_name, RESERVED_CONFIG_KEYWORDS + ) + ) + self.catalog().upsert_configuration_catalog_entry( key=self.node.config_name, value=self.node.config_value.value, diff --git a/evadb/executor/show_info_executor.py b/evadb/executor/show_info_executor.py index 16871b8435..87c4ef7063 100644 --- a/evadb/executor/show_info_executor.py +++ b/evadb/executor/show_info_executor.py @@ -33,7 +33,7 @@ def exec(self, *args, **kwargs): self.node.show_type is ShowType.FUNCTIONS or ShowType.TABLES or ShowType.DATABASES - or ShowType.CONFIG + or ShowType.CONFIGS ), f"Show command does not support type {self.node.show_type}" if self.node.show_type is ShowType.FUNCTIONS: @@ -50,16 +50,23 @@ def exec(self, *args, **kwargs): databases = self.catalog().get_all_database_catalog_entries() for db in databases: show_entries.append(db.display_format()) - elif self.node.show_type is ShowType.CONFIG: - value = self.catalog().get_configuration_catalog_value( - key=self.node.show_val.upper(), - ) + elif self.node.show_type is ShowType.CONFIGS: show_entries = {} - if value is not None: - show_entries = {self.node.show_val: [value]} + # CONFIGS is a special word, which is used to display all the configurations + if self.node.show_val.upper() == ShowType.CONFIGS.name: + configs = self.catalog().get_all_configuration_catalog_entries() + for config in configs: + show_entries[config.key] = config.value else: - raise Exception( - "No configuration found with key {}".format(self.node.show_val) + value = self.catalog().get_configuration_catalog_value( + key=self.node.show_val.upper(), ) + show_entries = {} + if value is not None: + show_entries = {self.node.show_val: [value]} + else: + raise Exception( + "No configuration found with key {}".format(self.node.show_val) + ) yield Batch(pd.DataFrame(show_entries)) diff --git a/evadb/parser/lark_visitor/_show_statements.py b/evadb/parser/lark_visitor/_show_statements.py index ca9581aca7..9340b1d9b8 100644 --- a/evadb/parser/lark_visitor/_show_statements.py +++ b/evadb/parser/lark_visitor/_show_statements.py @@ -30,4 +30,4 @@ def show_statement(self, tree): elif isinstance(token, str) and str.upper(token) == "DATABASES": return ShowStatement(show_type=ShowType.DATABASES) elif token is not None: - return ShowStatement(show_type=ShowType.CONFIG, show_val=self.visit(token)) + return ShowStatement(show_type=ShowType.CONFIGS, show_val=self.visit(token)) diff --git a/evadb/parser/show_statement.py b/evadb/parser/show_statement.py index d7eca052f2..857a35d1b1 100644 --- a/evadb/parser/show_statement.py +++ b/evadb/parser/show_statement.py @@ -40,7 +40,7 @@ def __str__(self): show_str = "FUNCTIONS" elif self.show_type == ShowType.TABLES: show_str = "TABLES" - elif self.show_type == ShowType.CONFIG: + elif self.show_type == ShowType.CONFIGS: show_str = self.show_val elif self.show_type == ShowType.DATABASES: show_str = "DATABASES" diff --git a/evadb/parser/types.py b/evadb/parser/types.py index 227a768c7b..0ea68a5f56 100644 --- a/evadb/parser/types.py +++ b/evadb/parser/types.py @@ -71,7 +71,7 @@ class FileFormatType(EvaDBEnum): class ShowType(EvaDBEnum): FUNCTIONS # noqa: F821 TABLES # noqa: F821 - CONFIG # noqa: F821 + CONFIGS # noqa: F821 DATABASES # noqa: F821 diff --git a/evadb/plan_nodes/show_info_plan.py b/evadb/plan_nodes/show_info_plan.py index 733cc0401d..b47afd56e5 100644 --- a/evadb/plan_nodes/show_info_plan.py +++ b/evadb/plan_nodes/show_info_plan.py @@ -40,7 +40,7 @@ def __str__(self): return "ShowDatabasePlan" elif self._show_type == ShowType.TABLES: return "ShowTablePlan" - elif self._show_type == ShowType.CONFIG: + elif self._show_type == ShowType.CONFIGS: return "ShowConfigPlan" def __hash__(self) -> int: diff --git a/test/integration_tests/short/test_show_info_executor.py b/test/integration_tests/short/test_show_info_executor.py index f875d266e0..cba59227e6 100644 --- a/test/integration_tests/short/test_show_info_executor.py +++ b/test/integration_tests/short/test_show_info_executor.py @@ -21,6 +21,7 @@ import pytest from evadb.configuration.constants import EvaDB_ROOT_DIR +from evadb.evadb_config import BASE_EVADB_CONFIG from evadb.functions.function_bootstrap_queries import ( ArrayCount_function_query, Fastrcnn_function_query, @@ -118,7 +119,6 @@ def test_show_tables(self): def test_show_config_execution(self): execute_query_fetch_all(self.evadb, "SET OPENAIKEY = 'ABCD';") - # expected_output = Batch(pd.DataFrame({"OPENAIKEY": ["ABCD"]})) show_config_value = execute_query_fetch_all(self.evadb, "SHOW OPENAIKEY") @@ -128,6 +128,14 @@ def test_show_config_execution(self): with self.assertRaises(Exception): execute_query_fetch_all(self.evadb, "SHOW BADCONFIG") + def test_show_all_configs(self): + show_all_config_value = execute_query_fetch_all(self.evadb, "SHOW CONFIGS") + + # NOTE :- Since the values of configs like the paths are not user/machine/installation agnostic, + # It doesn't make sense to test for the values. Hence, we are only testing for the keys + columns = show_all_config_value.columns + self.assertEqual(columns == list(BASE_EVADB_CONFIG.keys()), True) + # integration test def test_show_databases(self): result = execute_query_fetch_all(self.evadb, "SHOW DATABASES;") diff --git a/test/unit_tests/parser/test_parser.py b/test/unit_tests/parser/test_parser.py index 6086db088e..3091e8f3d0 100644 --- a/test/unit_tests/parser/test_parser.py +++ b/test/unit_tests/parser/test_parser.py @@ -905,7 +905,7 @@ def test_show_config_statement(self): show_config_stmt = evadb_statement_list[0] - expected_stmt = ShowStatement(show_type=ShowType.CONFIG, show_val="OPENAIKEY") + expected_stmt = ShowStatement(show_type=ShowType.CONFIGS, show_val="OPENAIKEY") self.assertEqual(show_config_stmt, expected_stmt)