From 1a492365149cc498a56322deaee1498d749bc9b0 Mon Sep 17 00:00:00 2001 From: "Bwook (Byoungwook) Kim" Date: Fri, 29 Nov 2024 21:20:09 +0900 Subject: [PATCH] support parsing multiple types of documents at once (#1015) * just commit * support parsing multiple types of documents at once * Add docs * Change to a compatible split code in the window --- autorag/data/parse/base.py | 33 +++- autorag/data/parse/run.py | 88 ++++++++++- autorag/parser.py | 3 +- docs/source/data_creation/legacy/parse.md | 104 +++++++++++++ docs/source/data_creation/parse/parse.md | 89 ++++++++++- sample_config/parse/all_files_full.yaml | 13 ++ sample_config/parse/file_types_full.yaml | 26 ++++ sample_config/parse/parse_full.yaml | 22 --- sample_config/parse/parse_hybird.yaml | 8 +- sample_config/parse/parse_ko.yaml | 5 + sample_config/parse/parse_multimodal.yaml | 1 + sample_config/parse/parse_ocr.yaml | 3 + sample_config/parse/simple_parse.yaml | 1 + tests/autorag/data/parse/test_clova.py | 8 +- .../data/parse/test_langchain_parse.py | 36 +++-- tests/autorag/data/parse/test_llamaparse.py | 11 +- tests/autorag/data/parse/test_parse_run.py | 17 +- .../data/parse/test_table_hybrid_parse.py | 10 +- tests/autorag/test_parser.py | 146 ++++++++++++++++-- .../parse_data/all_files_full/baseball_1.pdf | Bin 0 -> 107748 bytes .../parse_data/all_files_full/csv_sample.csv | 6 + .../all_files_full/html_sample.html | 38 +++++ .../all_files_full/json_sample.json | 7 + .../all_files_full/markdown_sample.md | 49 ++++++ .../parse_data/all_files_full/xml_sample.xml | 132 ++++++++++++++++ .../parse_data/config/all_files.yaml | 4 + .../parse_data/config/lack_full_parse.yaml | 14 ++ .../parse_data/config/lack_simple_parse.yaml | 5 + .../parse_data/config/perfect_full_parse.yaml | 26 ++++ .../config/perfect_simple_parse.yaml | 9 ++ tests/resources/simple_parse.yaml | 3 +- 31 files changed, 844 insertions(+), 73 deletions(-) create mode 100644 docs/source/data_creation/legacy/parse.md create mode 100644 sample_config/parse/all_files_full.yaml create mode 100644 sample_config/parse/file_types_full.yaml delete mode 100644 sample_config/parse/parse_full.yaml create mode 100644 tests/resources/parse_data/all_files_full/baseball_1.pdf create mode 100644 tests/resources/parse_data/all_files_full/csv_sample.csv create mode 100644 tests/resources/parse_data/all_files_full/html_sample.html create mode 100644 tests/resources/parse_data/all_files_full/json_sample.json create mode 100644 tests/resources/parse_data/all_files_full/markdown_sample.md create mode 100644 tests/resources/parse_data/all_files_full/xml_sample.xml create mode 100644 tests/resources/parse_data/config/all_files.yaml create mode 100644 tests/resources/parse_data/config/lack_full_parse.yaml create mode 100644 tests/resources/parse_data/config/lack_simple_parse.yaml create mode 100644 tests/resources/parse_data/config/perfect_full_parse.yaml create mode 100644 tests/resources/parse_data/config/perfect_simple_parse.yaml diff --git a/autorag/data/parse/base.py b/autorag/data/parse/base.py index 3f755be88..92f3f276b 100644 --- a/autorag/data/parse/base.py +++ b/autorag/data/parse/base.py @@ -3,6 +3,7 @@ from datetime import datetime from glob import glob from typing import Tuple, List, Optional +import os from autorag.utils import result_to_dataframe from autorag.data.utils.util import get_file_metadata @@ -14,7 +15,10 @@ def parser_node(func): @functools.wraps(func) @result_to_dataframe(["texts", "path", "page", "last_modified_datetime"]) def wrapper( - data_path_glob: str, parse_method: Optional[str] = None, **kwargs + data_path_glob: str, + file_type: str, + parse_method: Optional[str] = None, + **kwargs, ) -> Tuple[List[str], List[str], List[int], List[datetime]]: logger.info(f"Running parser - {func.__name__} module...") @@ -22,6 +26,27 @@ def wrapper( if not data_path_list: raise FileNotFoundError(f"data does not exits in {data_path_glob}") + assert file_type in [ + "pdf", + "csv", + "json", + "md", + "html", + "xml", + "all_files", + ], f"search type {file_type} is not supported" + + # extract only files from data_path_list based on the file_type set in the YAML file + data_paths = ( + [ + data_path + for data_path in data_path_list + if os.path.basename(data_path).split(".")[-1] == file_type + ] + if file_type != "all_files" + else data_path_list + ) + if func.__name__ == "langchain_parse": parse_method = parse_method.lower() if parse_method == "directory": @@ -30,14 +55,14 @@ def wrapper( folder_path = "/".join(path_split_list) kwargs.update({"glob": glob_path, "path": folder_path}) result = func( - data_path_list=data_path_list, parse_method=parse_method, **kwargs + data_path_list=data_paths, parse_method=parse_method, **kwargs ) else: result = func( - data_path_list=data_path_list, parse_method=parse_method, **kwargs + data_path_list=data_paths, parse_method=parse_method, **kwargs ) elif func.__name__ in ["clova_ocr", "llama_parse", "table_hybrid_parse"]: - result = func(data_path_list=data_path_list, **kwargs) + result = func(data_path_list=data_paths, **kwargs) else: raise ValueError(f"Unsupported module_type: {func.__name__}") result = _add_last_modified_datetime(result) diff --git a/autorag/data/parse/run.py b/autorag/data/parse/run.py index ebe8f6c0c..849b2cbc3 100644 --- a/autorag/data/parse/run.py +++ b/autorag/data/parse/run.py @@ -1,8 +1,38 @@ import os from typing import List, Callable, Dict import pandas as pd +from glob import glob from autorag.strategy import measure_speed +from autorag.data.utils.util import get_param_combinations + +default_map = { + "pdf": { + "file_type": "pdf", + "module_type": "langchain_parse", + "parse_method": "pdfminer", + }, + "csv": { + "file_type": "csv", + "module_type": "langchain_parse", + "parse_method": "csv", + }, + "md": { + "file_type": "md", + "module_type": "langchain_parse", + "parse_method": "unstructuredmarkdown", + }, + "html": { + "file_type": "html", + "module_type": "langchain_parse", + "parse_method": "bshtml", + }, + "xml": { + "file_type": "xml", + "module_type": "langchain_parse", + "parse_method": "unstructuredxml", + }, +} def run_parser( @@ -10,7 +40,40 @@ def run_parser( module_params: List[Dict], data_path_glob: str, project_dir: str, + all_files: bool, ): + if not all_files: + # Set the parsing module to default if it is a file type in paths but not set in YAML. + data_path_list = glob(data_path_glob) + if not data_path_list: + raise FileNotFoundError(f"data does not exits in {data_path_glob}") + + file_types = set( + [os.path.basename(data_path).split(".")[-1] for data_path in data_path_list] + ) + set_file_types = set([module["file_type"] for module in module_params]) + + # create a list of only those file_types that are in file_types but not in set_file_types + missing_file_types = list(file_types - set_file_types) + if list(set_file_types - file_types): + raise ValueError( + f"File types {list(set_file_types - file_types)} are not in the data path." + ) + + if missing_file_types: + add_modules_list = [] + for missing_file_type in missing_file_types: + if missing_file_type == "json": + raise ValueError( + "JSON file type must have a jq_schema so you must set it in the YAML file." + ) + + add_modules_list.append(default_map[missing_file_type]) + + add_modules, add_params = get_param_combinations(add_modules_list) + modules.extend(add_modules) + module_params.extend(add_params) + results, execution_times = zip( *map( lambda x: measure_speed(x[0], data_path_glob=data_path_glob, **x[1]), @@ -20,9 +83,19 @@ def run_parser( average_times = list(map(lambda x: x / len(results[0]), execution_times)) # save results to parquet files - filepaths = list( - map(lambda x: os.path.join(project_dir, f"{x}.parquet"), range(len(modules))) - ) + if all_files: + filepaths = list( + map( + lambda x: os.path.join(project_dir, f"{x}.parquet"), range(len(modules)) + ) + ) + else: + filepaths = list( + map( + lambda x: os.path.join(project_dir, f"{x['file_type']}.parquet"), + module_params, + ) + ) list(map(lambda x: x[0].to_parquet(x[1], index=False), zip(results, filepaths))) filenames = list(map(lambda x: os.path.basename(x), filepaths)) @@ -35,4 +108,13 @@ def run_parser( } ) summary_df.to_csv(os.path.join(project_dir, "summary.csv"), index=False) + + # concat all parquet files here if not all_files. + if not all_files: + dataframes = [pd.read_parquet(file) for file in filepaths] + combined_df = pd.concat(dataframes, ignore_index=True) + combined_df.to_parquet( + os.path.join(project_dir, "parsed_result.parquet"), index=False + ) + return summary_df diff --git a/autorag/parser.py b/autorag/parser.py index b24fe5ba6..b67e5c594 100644 --- a/autorag/parser.py +++ b/autorag/parser.py @@ -14,7 +14,7 @@ def __init__(self, data_path_glob: str, project_dir: Optional[str] = None): self.data_path_glob = data_path_glob self.project_dir = project_dir if project_dir is not None else os.getcwd() - def start_parsing(self, yaml_path: str): + def start_parsing(self, yaml_path: str, all_files: bool = False): if not os.path.exists(self.project_dir): os.makedirs(self.project_dir) @@ -32,5 +32,6 @@ def start_parsing(self, yaml_path: str): module_params=input_params, data_path_glob=self.data_path_glob, project_dir=self.project_dir, + all_files=all_files, ) logger.info("Parsing Done!") diff --git a/docs/source/data_creation/legacy/parse.md b/docs/source/data_creation/legacy/parse.md new file mode 100644 index 000000000..de462fbd3 --- /dev/null +++ b/docs/source/data_creation/legacy/parse.md @@ -0,0 +1,104 @@ +# Parse + +In this section, we will cover how to parse raw documents. + +It is a crucial step to parse the raw documents. +Because if the raw documents are not parsed well, the RAG will not be optimized well. + +Using only YAML files, you can easily use the various document loaders. +The parsed result is saved according to the data format used by AutoRAG. + +## Overview + +The sample parse pipeline looks like this. + +```python +from autorag.parser import Parser + +parser = Parser(data_path_glob="your/data/path/*") +parser.start_parsing("your/path/to/parse_config.yaml") +``` + +## Run Parse Pipeline + +### 1. Set parser instance + +```python +from autorag.parser import Parser + +parser = Parser(data_path_glob="your/data/path/*") +``` + +#### 📌 Parameter: `data_path_glob` + +Parser instance requires `data_path_glob` parameter. +This parameter is used to specify the path of the documents to be parsed. + +Only glob patterns are supported. + +You can use the wildcard character `*` to specify multiple files. + +you can specify the file extension like `*.pdf` to specific file types. + +```{admonition} Want to specify project folder? +You can specify project directory with `--project_dir` option or project_dir parameter. +``` + +### 2. Set YAML file + +Here is an example of how to use the `langchain_parse` module. + +```yaml +modules: + - module_type: langchain_parse + parse_method: [ pdfminer, pdfplumber ] +``` + +### 3. Start parsing + +Use `start_parsing` function to start parsing. + +```python +parser.start_parsing("your/path/to/parse_config.yaml") +``` + +### 4. Check the result + +If you set `project_dir` parameter, you can check the result in the project directory. +If not, you can check the result in the current directory. + +If the parsing is completed successfully, the following three types of files are created in the `project_dir`. + +1. Parsed Result +2. Used YAML file +3. Summary file + +For example, if parsing is performed using three parse methods, the following files are created. +`0.parquet`, `1.parquet`, `2.parquet`, `parse_config.yaml`, `summary.csv` + +Finally, in the summary.csv file, you can see information about the parsed result, such as what parse method was used to parse it. + +## Output Columns + +- `texts`: Parsed text from the document. +- `path`: Path of the document. +- `pages`: Number of pages in the document. Contains page if parsing on a per-page basis, otherwise -1. + - Modules that parse per page: [ `clova`, `table_hybrid_parse` ] + - Modules that don't parse on a per-page basis: [ `langchain_parse`, `llama_parse` ] +- `last_modified_datetime`: Last modified datetime of the document. + +#### Supported Parse Modules + +📌 You can check our all Parse modules +at [here](https://edai.notion.site/Supporting-Parse-Modules-e0b7579c7c0e4fb2963e408eeccddd75?pvs=4) + + +```{toctree} +--- +maxdepth: 1 +--- +langchain_parse.md +llama_parse.md +clova.md +table_hybrid_parse.md +``` diff --git a/docs/source/data_creation/parse/parse.md b/docs/source/data_creation/parse/parse.md index de462fbd3..2de27dad5 100644 --- a/docs/source/data_creation/parse/parse.md +++ b/docs/source/data_creation/parse/parse.md @@ -19,6 +19,84 @@ parser = Parser(data_path_glob="your/data/path/*") parser.start_parsing("your/path/to/parse_config.yaml") ``` +## YAML File Setting Guide + +### 1. Use All Files + +Available parse modules are listed below. + +- Langchain_parse (parse_method: directory) +- Langchain_parse (parse_method: unstructured) +- Langchain_parse (parse_method: upstagedocumentparse) +- Llama_parse +- Clova + +Here is an example YAML file about full modules about `file_type: all_files`. + +```yaml +modules: + - module_type: langchain_parse + file_type: all_files + parse_method: [ directory, unstructured, upstagedocumentparse ] + - module_type: clova + file_type: all_files + table_detection: true + - module_type: llamaparse + file_type: all_files + result_type: markdown + language: ko + use_vendor_multimodal_model: true + vendor_multimodal_model_name: openai-gpt-4o-mini +``` + +### 2. Use Specific Files + +Six file types can have a direct parse method specified. +Only one parse_method can be specified for each file type. + +If you are in the source document folder and do not specify a parse method, the Default Method is used for each file extension. +For example, if you have a csv file in a folder and you don't specify a parse_method, the csv file will be parsed as csv, which is the default method. + +#### Default Parse Method +- PDF: pdfminer +- CSV: csv +- Markdown: unstructuredmarkdown +- HTML: bshtml +- XML: unstructuredxml + +📌`JSON` does not default because you must specify `jq_schema` as the key value of the content. + +Here is an example YAML file about full modules about specific file types. + +```yaml +modules: + # PDF + - module_type: langchain_parse + file_type: pdf + parse_method: pdfminer + # CSV + - module_type: langchain_parse + file_type: csv + parse_method: csv + # JSON + - module_type: langchain_parse + file_type: json + parse_method: json + jq_schema: .content + # Markdown + - module_type: langchain_parse + file_type: md + parse_method: unstructuredmarkdown + # HTML + - module_type: langchain_parse + file_type: html + parse_method: bshtml + # XML + - module_type: langchain_parse + file_type: xml + parse_method: unstructuredxml +``` + ## Run Parse Pipeline ### 1. Set parser instance @@ -51,7 +129,8 @@ Here is an example of how to use the `langchain_parse` module. ```yaml modules: - module_type: langchain_parse - parse_method: [ pdfminer, pdfplumber ] + file_type: pdf + parse_method: pdfminer ``` ### 3. Start parsing @@ -73,11 +152,19 @@ If the parsing is completed successfully, the following three types of files are 2. Used YAML file 3. Summary file +#### Use all files + For example, if parsing is performed using three parse methods, the following files are created. `0.parquet`, `1.parquet`, `2.parquet`, `parse_config.yaml`, `summary.csv` Finally, in the summary.csv file, you can see information about the parsed result, such as what parse method was used to parse it. +#### Use specific file types + +For example, if the file types you want to parse are PDF, XML, and JSON, +you'll have `pdf.parquet`, `xml.parquet`, and `json.parquet` in your project dir. +And the result of concatenating all of them is `parsed_result.parquet`. + ## Output Columns - `texts`: Parsed text from the document. diff --git a/sample_config/parse/all_files_full.yaml b/sample_config/parse/all_files_full.yaml new file mode 100644 index 000000000..441a4ce44 --- /dev/null +++ b/sample_config/parse/all_files_full.yaml @@ -0,0 +1,13 @@ +modules: + - module_type: langchain_parse + file_type: all_files + parse_method: [ directory, unstructured, upstagedocumentparse ] + - module_type: clova + file_type: all_files + table_detection: true + - module_type: llamaparse + file_type: all_files + result_type: markdown + language: ko + use_vendor_multimodal_model: true + vendor_multimodal_model_name: openai-gpt-4o-mini diff --git a/sample_config/parse/file_types_full.yaml b/sample_config/parse/file_types_full.yaml new file mode 100644 index 000000000..180842bc6 --- /dev/null +++ b/sample_config/parse/file_types_full.yaml @@ -0,0 +1,26 @@ +modules: + # PDF + - module_type: langchain_parse + file_type: pdf + parse_method: pdfminer + # CSV + - module_type: langchain_parse + file_type: csv + parse_method: csv + # JSON + - module_type: langchain_parse + file_type: json + parse_method: json + jq_schema: .content + # Markdown + - module_type: langchain_parse + file_type: md + parse_method: unstructuredmarkdown + # HTML + - module_type: langchain_parse + file_type: html + parse_method: bshtml + # XML + - module_type: langchain_parse + file_type: xml + parse_method: unstructuredxml diff --git a/sample_config/parse/parse_full.yaml b/sample_config/parse/parse_full.yaml deleted file mode 100644 index dda1b475b..000000000 --- a/sample_config/parse/parse_full.yaml +++ /dev/null @@ -1,22 +0,0 @@ -modules: - - module_type: langchain_parse - parse_method: [ pdfminer, pdfplumber, pypdfium2, pypdf, pymupdf, unstructuredpdf ] - - module_type: langchain_parse - parse_method: upstagedocumentparse - - module_type: langchain_parse - parse_method: json - jq_schema: .messages[].content - - module_type: clova - table_detection: true - - module_type: llamaparse - result_type: markdown - language: ko - use_vendor_multimodal_model: true - vendor_multimodal_model_name: openai-gpt-4o-mini - - module_type: table_hybrid_parse - text_parse_module: langchain_parse - text_params: - parse_method: pdfplumber - table_parse_module: clova - table_params: - table_detection: true diff --git a/sample_config/parse/parse_hybird.yaml b/sample_config/parse/parse_hybird.yaml index 3d02215ac..1ea4c7fdc 100644 --- a/sample_config/parse/parse_hybird.yaml +++ b/sample_config/parse/parse_hybird.yaml @@ -1,8 +1,12 @@ modules: - module_type: table_hybrid_parse + file_type: pdf text_parse_module: langchain_parse text_params: parse_method: pdfplumber - table_parse_module: clova + table_parse_module: llamaparse table_params: - table_detection: true + result_type: markdown + language: ko + use_vendor_multimodal_model: true + vendor_multimodal_model_name: openai-gpt-4o-mini diff --git a/sample_config/parse/parse_ko.yaml b/sample_config/parse/parse_ko.yaml index 918b65f53..b2160464c 100644 --- a/sample_config/parse/parse_ko.yaml +++ b/sample_config/parse/parse_ko.yaml @@ -1,6 +1,11 @@ modules: - module_type: llama_parse + file_type: all_files result_type: markdown language: ko - module_type: clova + file_type: all_files table_detection: true + - module_type: langchain_parse + file_type: all_files + parse_method: upstagedocumentparse diff --git a/sample_config/parse/parse_multimodal.yaml b/sample_config/parse/parse_multimodal.yaml index 268b1e8ac..9ced86e8e 100644 --- a/sample_config/parse/parse_multimodal.yaml +++ b/sample_config/parse/parse_multimodal.yaml @@ -1,5 +1,6 @@ modules: - module_type: llamaparse + file_type: all_files result_type: markdown language: ko use_vendor_multimodal_model: true diff --git a/sample_config/parse/parse_ocr.yaml b/sample_config/parse/parse_ocr.yaml index 21562c47d..4c0b757ed 100644 --- a/sample_config/parse/parse_ocr.yaml +++ b/sample_config/parse/parse_ocr.yaml @@ -1,7 +1,10 @@ modules: - module_type: langchain_parse + file_type: all_files parse_method: upstagedocumentparse - module_type: llama_parse + file_type: all_files result_type: markdown - module_type: clova + file_type: all_files table_detection: true diff --git a/sample_config/parse/simple_parse.yaml b/sample_config/parse/simple_parse.yaml index 960ef1cf6..73ae58aad 100644 --- a/sample_config/parse/simple_parse.yaml +++ b/sample_config/parse/simple_parse.yaml @@ -1,3 +1,4 @@ modules: - module_type: langchain_parse + file_type: pdf parse_method: pdfminer diff --git a/tests/autorag/data/parse/test_clova.py b/tests/autorag/data/parse/test_clova.py index 9154989dd..1f7d41e97 100644 --- a/tests/autorag/data/parse/test_clova.py +++ b/tests/autorag/data/parse/test_clova.py @@ -81,7 +81,9 @@ def test_clova_ocr_single_pdf(): @patch.object(autorag.data.parse.clova, "clova_ocr_pure", mock_clova_ocr_pure) def test_clova_ocr_single_pdf_node(): - result_df = clova_ocr(korean_text_glob, url="mock_url", api_key="mock_api_key") + result_df = clova_ocr( + korean_text_glob, file_type="all_files", url="mock_url", api_key="mock_api_key" + ) check_clova_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -100,7 +102,9 @@ def test_clova_ocr_multiple_pdf(): @patch.object(autorag.data.parse.clova, "clova_ocr_pure", mock_clova_ocr_pure) def test_clova_ocr_multiple_pdf_node(): - result_df = clova_ocr(eng_text_glob, url="mock_url", api_key="mock_api_key") + result_df = clova_ocr( + eng_text_glob, file_type="all_files", url="mock_url", api_key="mock_api_key" + ) check_clova_result( result_df["texts"].tolist(), result_df["path"].tolist(), diff --git a/tests/autorag/data/parse/test_langchain_parse.py b/tests/autorag/data/parse/test_langchain_parse.py index 54a6eea1d..2e1c27d65 100644 --- a/tests/autorag/data/parse/test_langchain_parse.py +++ b/tests/autorag/data/parse/test_langchain_parse.py @@ -31,7 +31,9 @@ def test_langchain_parse_single_pdf(): def test_langchain_parse_single_pdf_node(): - result_df = langchain_parse(korean_text_glob, parse_method="pdfminer") + result_df = langchain_parse( + korean_text_glob, file_type="pdf", parse_method="pdfminer" + ) check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -50,7 +52,9 @@ def test_langchain_parse_single_pdf_pages(): def test_langchain_parse_single_pdf_pages_node(): - result_df = langchain_parse(korean_text_glob, parse_method="pymupdf") + result_df = langchain_parse( + korean_text_glob, file_type="pdf", parse_method="pymupdf" + ) check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -69,7 +73,7 @@ def test_langchain_parse_multiple_pdf(): def test_langchain_parse_multiple_pdf_node(): - result_df = langchain_parse(eng_text_glob, parse_method="pdfminer") + result_df = langchain_parse(eng_text_glob, file_type="pdf", parse_method="pdfminer") check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -88,7 +92,7 @@ def test_langchain_parse_multiple_pdf_pages(): def test_langchain_parse_multiple_pdf_pages_node(): - result_df = langchain_parse(eng_text_glob, parse_method="pymupdf") + result_df = langchain_parse(eng_text_glob, file_type="pdf", parse_method="pymupdf") check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -104,7 +108,7 @@ def test_langchain_csv(): def test_langchain_csv_node(): - result_df = langchain_parse(csv_glob, parse_method="csv") + result_df = langchain_parse(csv_glob, file_type="csv", parse_method="csv") check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -122,7 +126,9 @@ def test_langchain_json(): def test_langchain_json_node(): - result_df = langchain_parse(json_glob, parse_method="json", jq_schema=".content") + result_df = langchain_parse( + json_glob, file_type="json", parse_method="json", jq_schema=".content" + ) check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -139,7 +145,9 @@ def test_langchain_markdown(): def test_langchain_markdown_node(): - result_df = langchain_parse(markdown_glob, parse_method="unstructuredmarkdown") + result_df = langchain_parse( + markdown_glob, file_type="md", parse_method="unstructuredmarkdown" + ) check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -154,7 +162,7 @@ def test_langchain_html(): def test_langchain_html_node(): - result_df = langchain_parse(html_glob, parse_method="bshtml") + result_df = langchain_parse(html_glob, file_type="html", parse_method="bshtml") check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -171,7 +179,9 @@ def test_langchain_xml(): def test_langchain_xml_node(): - result_df = langchain_parse(xml_glob, parse_method="unstructuredxml") + result_df = langchain_parse( + xml_glob, file_type="xml", parse_method="unstructuredxml" + ) check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -188,7 +198,9 @@ def test_langchain_all_files_unstructured(): def test_langchain_all_files_unstructured_node(): - result_df = langchain_parse(all_files_glob, parse_method="unstructured") + result_df = langchain_parse( + all_files_glob, file_type="all_files", parse_method="unstructured" + ) check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -208,7 +220,9 @@ def test_langchain_all_files_directory(): def test_langchain_all_files_directory_node(): - result_df = langchain_parse(all_files_glob, parse_method="directory") + result_df = langchain_parse( + all_files_glob, file_type="all_files", parse_method="directory" + ) check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), "all_files_directory" ) diff --git a/tests/autorag/data/parse/test_llamaparse.py b/tests/autorag/data/parse/test_llamaparse.py index 2ccd3ecc8..2f5f8eb6c 100644 --- a/tests/autorag/data/parse/test_llamaparse.py +++ b/tests/autorag/data/parse/test_llamaparse.py @@ -33,7 +33,9 @@ def test_llama_parse_single_pdf(): @patch.object(llama_parse.base.LlamaParse, "aload_data", mock_llama_parse_aload_data) def test_llama_parse_single_pdf_node(): - result_df = llamaparse(korean_text_glob, url="mock_url", api_key="mock_api_key") + result_df = llamaparse( + korean_text_glob, file_type="all_files", url="mock_url", api_key="mock_api_key" + ) check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -56,7 +58,9 @@ def test_llama_parse_multiple_pdf(): @patch.object(llama_parse.base.LlamaParse, "aload_data", mock_llama_parse_aload_data) def test_llama_parse_multiple_pdf_node(): - result_df = llamaparse(eng_text_glob, url="mock_url", api_key="mock_api_key") + result_df = llamaparse( + eng_text_glob, file_type="all_files", url="mock_url", api_key="mock_api_key" + ) check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -85,6 +89,7 @@ def test_llama_parse_multimodal(): def test_llama_parse_multimodal_node(): result_df = llamaparse( eng_text_glob, + file_type="all_files", url="mock_url", api_key="mock_api_key", use_vendor_multimodal_model=True, @@ -129,6 +134,7 @@ def test_llama_parse_multimodal_use_env_key_node(): with patch.dict(os.environ, temp_env_vars): result_df = llamaparse( eng_text_glob, + file_type="all_files", url="mock_url", api_key="mock_api_key", use_vendor_multimodal_model=True, @@ -164,6 +170,7 @@ def test_llama_parse_multimodal_use_own_key(): def test_llama_parse_multimodal_use_own_key_node(): result_df = llamaparse( eng_text_glob, + file_type="all_files", url="mock_url", api_key="mock_api_key", use_vendor_multimodal_model=True, diff --git a/tests/autorag/data/parse/test_parse_run.py b/tests/autorag/data/parse/test_parse_run.py index 003882f6a..9c97a6d03 100644 --- a/tests/autorag/data/parse/test_parse_run.py +++ b/tests/autorag/data/parse/test_parse_run.py @@ -9,13 +9,18 @@ def test_run_parser(): with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as temp_dir: - modules = [langchain_parse, langchain_parse] - module_params = [{"parse_method": "pdfminer"}, {"parse_method": "pdfplumber"}] + modules = [langchain_parse] + module_params = [{"parse_method": "pdfminer", "file_type": "pdf"}] data_path_glob = eng_text_glob - summary_df = run_parser(modules, module_params, data_path_glob, temp_dir) + summary_df = run_parser( + modules, module_params, data_path_glob, temp_dir, all_files=False + ) assert os.path.exists(os.path.join(temp_dir, "summary.csv")) expect_columns = {"filename", "module_name", "module_params", "execution_time"} assert set(summary_df.columns) == expect_columns - assert len(summary_df) == 2 - assert summary_df["module_params"][0] == {"parse_method": "pdfminer"} - assert os.path.exists(os.path.join(temp_dir, "0.parquet")) + assert len(summary_df) == 1 + assert summary_df["module_params"][0] == { + "parse_method": "pdfminer", + "file_type": "pdf", + } + assert os.path.exists(os.path.join(temp_dir, "pdf.parquet")) diff --git a/tests/autorag/data/parse/test_table_hybrid_parse.py b/tests/autorag/data/parse/test_table_hybrid_parse.py index 2c4f12738..035fe7519 100644 --- a/tests/autorag/data/parse/test_table_hybrid_parse.py +++ b/tests/autorag/data/parse/test_table_hybrid_parse.py @@ -31,7 +31,7 @@ def test_table_hybrid_parse(): def test_table_hybrid_parse_node(): - result_df = table_hybrid_parse(hybrid_glob, **table_hybrid_params) + result_df = table_hybrid_parse(hybrid_glob, file_type="pdf", **table_hybrid_params) check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -48,7 +48,9 @@ def test_table_hybrid_parse_only_text(): def test_table_hybrid_parse_only_text_node(): - result_df = table_hybrid_parse(eng_text_glob, **table_hybrid_params) + result_df = table_hybrid_parse( + eng_text_glob, file_type="pdf", **table_hybrid_params + ) check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), @@ -65,7 +67,9 @@ def test_table_hybrid_parse_only_table(): def test_table_hybrid_parse_only_table_node(): - result_df = table_hybrid_parse(korean_table_glob, **table_hybrid_params) + result_df = table_hybrid_parse( + korean_table_glob, file_type="pdf", **table_hybrid_params + ) check_parse_result( result_df["texts"].tolist(), result_df["path"].tolist(), diff --git a/tests/autorag/test_parser.py b/tests/autorag/test_parser.py index 00b5d60b6..5c2edf82b 100644 --- a/tests/autorag/test_parser.py +++ b/tests/autorag/test_parser.py @@ -11,43 +11,159 @@ root_dir = pathlib.PurePath(os.path.dirname(os.path.realpath(__file__))).parent resource_dir = os.path.join(root_dir, "resources") result_dir = os.path.join(resource_dir, "test_results") -data_glob = os.path.join(resource_dir, "parse_data", "eng_text", "*") +simple_data_glob = os.path.join(resource_dir, "parse_data", "all_files", "*") +full_data_glob = os.path.join(resource_dir, "parse_data", "all_files_full", "*") @pytest.fixture -def parser(): +def simple_parser(): with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as project_dir: - parser = Parser(data_path_glob=data_glob, project_dir=project_dir) - yield parser + simple_parser = Parser(data_path_glob=simple_data_glob, project_dir=project_dir) + yield simple_parser @pytest.fixture -def test_parser(): +def test_simple_parser(): with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as project_dir: - parser = Parser(data_path_glob=data_glob, project_dir=project_dir) - yield parser + simple_parser = Parser(data_path_glob=simple_data_glob, project_dir=project_dir) + yield simple_parser -def test_start_parsing(parser): - parser.start_parsing(os.path.join(resource_dir, "simple_parse.yaml")) +@pytest.fixture +def full_parser(): + with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as project_dir: + full_parser = Parser(data_path_glob=full_data_glob, project_dir=project_dir) + yield full_parser + + +@pytest.fixture +def test_full_parser(): + with tempfile.TemporaryDirectory(ignore_cleanup_errors=True) as project_dir: + full_parser = Parser(data_path_glob=full_data_glob, project_dir=project_dir) + yield full_parser + + +def base_simple_yaml(parser, yaml_path): + parser.start_parsing(yaml_path, all_files=False) project_dir = parser.project_dir assert os.path.exists(project_dir) assert os.path.exists(os.path.join(project_dir, "parse_config.yaml")) - assert os.path.exists(os.path.join(project_dir, "0.parquet")) - pdfminer_result = pd.read_parquet(os.path.join(project_dir, "0.parquet")) - assert os.path.exists(os.path.join(project_dir, "1.parquet")) - pdfplumber_result = pd.read_parquet(os.path.join(project_dir, "1.parquet")) + assert os.path.exists(os.path.join(project_dir, "pdf.parquet")) + pdf_result = pd.read_parquet(os.path.join(project_dir, "pdf.parquet")) + assert os.path.exists(os.path.join(project_dir, "csv.parquet")) + assert os.path.exists(os.path.join(project_dir, "parsed_result.parquet")) + parsed_result = pd.read_parquet(os.path.join(project_dir, "parsed_result.parquet")) + expect_result_columns = ["texts", "path", "page", "last_modified_datetime"] + assert all( + [expect_column in pdf_result.columns for expect_column in expect_result_columns] + ) expect_result_columns = ["texts", "path", "page", "last_modified_datetime"] assert all( [ - expect_column in pdfminer_result.columns + expect_column in parsed_result.columns for expect_column in expect_result_columns ] ) + summary_df = load_summary_file(os.path.join(project_dir, "summary.csv")) + expect_summary_columns = [ + "filename", + "module_name", + "module_params", + "execution_time", + ] + assert all( + [ + expect_column in summary_df.columns + for expect_column in expect_summary_columns + ] + ) + + +def test_start_parsing_specific_type_with_perfect_simple_yaml(simple_parser): + base_simple_yaml( + simple_parser, + os.path.join(resource_dir, "parse_data", "config", "perfect_simple_parse.yaml"), + ) + + +def test_start_parser_specific_type_with_lack_simple_yaml(simple_parser): + base_simple_yaml( + simple_parser, + os.path.join(resource_dir, "parse_data", "config", "lack_simple_parse.yaml"), + ) + + +def base_full_yaml(parser, yaml_path): + parser.start_parsing(yaml_path, all_files=False) + project_dir = parser.project_dir + assert os.path.exists(project_dir) + assert os.path.exists(os.path.join(project_dir, "parse_config.yaml")) + assert os.path.exists(os.path.join(project_dir, "pdf.parquet")) + pdf_result = pd.read_parquet(os.path.join(project_dir, "pdf.parquet")) + assert os.path.exists(os.path.join(project_dir, "csv.parquet")) + assert os.path.exists(os.path.join(project_dir, "json.parquet")) + assert os.path.exists(os.path.join(project_dir, "md.parquet")) + assert os.path.exists(os.path.join(project_dir, "html.parquet")) + assert os.path.exists(os.path.join(project_dir, "xml.parquet")) + assert os.path.exists(os.path.join(project_dir, "parsed_result.parquet")) + parsed_result = pd.read_parquet(os.path.join(project_dir, "parsed_result.parquet")) + + expect_result_columns = ["texts", "path", "page", "last_modified_datetime"] + assert all( + [expect_column in pdf_result.columns for expect_column in expect_result_columns] + ) + expect_result_columns = ["texts", "path", "page", "last_modified_datetime"] + assert all( + [ + expect_column in parsed_result.columns + for expect_column in expect_result_columns + ] + ) + summary_df = load_summary_file(os.path.join(project_dir, "summary.csv")) + expect_summary_columns = [ + "filename", + "module_name", + "module_params", + "execution_time", + ] + assert all( + [ + expect_column in summary_df.columns + for expect_column in expect_summary_columns + ] + ) + + +def test_start_parsing_specific_type_with_perfect_full_yaml(full_parser): + base_full_yaml( + full_parser, + os.path.join(resource_dir, "parse_data", "config", "perfect_full_parse.yaml"), + ) + + +def test_start_parsing_specific_type_with_lack_full_yaml(full_parser): + base_full_yaml( + full_parser, + os.path.join(resource_dir, "parse_data", "config", "lack_full_parse.yaml"), + ) + + +def test_start_parsing_all_files(simple_parser): + simple_parser.start_parsing( + os.path.join(resource_dir, "parse_data", "config", "all_files.yaml"), + all_files=True, + ) + project_dir = simple_parser.project_dir + assert os.path.exists(project_dir) + assert os.path.exists(os.path.join(project_dir, "parse_config.yaml")) + assert os.path.exists(os.path.join(project_dir, "0.parquet")) + all_files_result = pd.read_parquet(os.path.join(project_dir, "0.parquet")) + + expect_result_columns = ["texts", "path", "page", "last_modified_datetime"] assert all( [ - expect_column in pdfplumber_result.columns + expect_column in all_files_result.columns for expect_column in expect_result_columns ] ) diff --git a/tests/resources/parse_data/all_files_full/baseball_1.pdf b/tests/resources/parse_data/all_files_full/baseball_1.pdf new file mode 100644 index 0000000000000000000000000000000000000000..49df870c468c3cea1186db7aa9c1be320c07e23d GIT binary patch literal 107748 zcmc$^WmqLklQoK4H}1Z1Xx!c1-QC^Y-QC^Yq4CDuy>WMUhlc*>bKZC6%$;xU+<$ko zcV$*(Mnz`Cih3T_DiS#%5o&rGMi`QTgWH3%(!0Ewfgu=103E>AzygMg3qUJkZsla` z@Y!1FI~fZZ8`>Hf18Aj;ZA_ia08DhOYych}7)K`uV|{BFH{fc`@tFM~#EvJ`nS{lh zrVTALd})Q|BfTDk?My#luQ;b`8e&iuBfiDopfO<+RA~4cjGc^e9;KmGW1>bzDk|}J zk`LAolFUV~2}9#@59OyvO0lUvRYQ`B?^na8_zS+3BEO4Ic^5)$eWVwPZ+%?8g zL0*SW{*|Dh8rxHg6;fiOh$VZNSoy2QBd#lS>-SFVk?U2Z<7q|ctKeN%#@Z=ClQuqj z=;N=Q+pgDqkJom=Yk~GTm;ktxMs04b5_9_xAtzTKUUZ%(Pio)eGaIm;8pDeV&@6X* zu-L)rhvLp}AN_2Tx?b-#AM@?Czke;X@6hUczqp0=en2lV`X+-dfKJ$yg?|D z5Or66tTSyaGrfy?k;+wiR!xQ7LND=t7%h2x45YQHwq!ADd8x$a;`qzr&Dsm`ZW}Vl zCaIHYAE-^e1Wgk*m6M5E6JR=q9LP-U;hYYbZj(!t9>g&c|N2#Wuc)Y~OZ>%^ok5f2 zJ*neC#ib4Bb&x(uRz z4!QA6jx~Tlir}j*1%C|d!-6AtwN2k$i&#$|0f!ihFMzd0G0ipXEE;*Ixmk!a=Io7# zDIB#Fq&80+#jJIm4HAraC=XG1{74cddvbGsYJ~jsR$o1zL`rhUxGt(qePWjdhB5Fp zUv(F$O83Zb)GsgxNbFm?(C=hJLvBS`kT~d`-lvjWf&`R3QNB2X6!aM;1frohUTvpc zuF?5A?{Do`;YK)s#~zY0`|jFyl%Df!4dgJE;pILB4Qa`%5eSqSLd|w10g97*4Aw}`hdlp{#MhQ{;OVZd+m-Asd!Qo5TakY zMmR-B8D{RP$A#8q-2t-~QNJiCvCmVYEL|v_@)8dfVpc@DtMK|{6{Ij)Yv*K|0Yp4qP`@iSM?q`F82G(K;sd?g|T{$akq!AD_G+<&Tq$n@H|g zuMVbFDV4j47h(UTv#9deW}!5ealt4Z3}HkPh=<~2JS|z5cy0CJe1k)owCR7Xu zN9v}v=wrT($uivWBfaAUDv0+XGU-xBa@m&O5(bJa5fB&4{Ng!_Txr2T%Y9@Q9=|b1 zM>DVALw2--(H)r?$A>R^1irphjf5|&g^$$05Jj4g)ro?DPbiwt5QYxbeiX7b;3mnx zzKC=>i}=jMR3KauKD&TqDyKuH-z;xz@TG|x z=vVC~W(0vg*Qq-rhVqPIt0^=ycW-&DS)DUjOqG(;F_j0x`+*MfU+t&C@flz}9ZgI+ zy4fBX`_~qUKWXD zdEz>9D)%F5k)xzW^eDE&NEWM$efm%dHS@3&xU0X!$QgVeqM(~-hUum}{(*WQf5$~= z!=I$IN`^8b9*J$3ZFRtVoZ*Jfpf(=_#LfEA4tW|u5RM0?nlu{4P>b9iJh}j1+QI5$ zQ)(-gKB|Ui`5RzIrl!;p_a!$!_sIGQSSiosd3MkO`w`dfG9AUXLF$V-P zc+!zw-4uvuDhaO6f)Hz)%pzK%a(aB@U5qNuX1UX2Pu9|8U51rw)*L@hKo*YnQ6By& zO|IO(5Hs3FiUxOFy&sln73S1;)dt@SaBn&j+zna9E@916EkOCQD_Y~i?;%wehC^h> zVd$q(QyD2E z5(oMoEnrRWPPg{;&M4-H9sbKX5q4k+@Y)}}%N2CiZs`0&7#Aw6^fh)Hi#Q=@Hiw-& z-JBm;l11gLDnn_dd;+Cb20v5T7i%0hfQb4{1VY;kpzlDtbFbS8!e8cg5Tm7ry$_PH z%rb3RbYr=UH6Y$FmfBlJ&%E8cuN9whZVE>ZmXuHOD@(`qyM>v|-x%%wj*bz8)jdRTJGWwfNbLr;Cs4eM`7whvuBh_w0SqH}@+H}f;wA$e+Wf`jN?ZGofHMoU(HuhHKpwKqWfq!QD~@8)_4~Pl<7Qv)-EJon?F6fw4`0^FPg-q8$0tk&Fo7Xpg(BFUGWV2k?P+1u zV(1S?4tvpUPsu@qa4m`{a#?8NFkQJ=`+S#vyPRZP`xQ-ACubYiHPO~>yW-}~`|b|) zVRMCCnJ`{<0!6lPZrU6HUwo`zti7kW^r7wg$hd(OMyVPZb?Rz20ZVwt)*4KzG2mUt z-h^ZgoiTS3V~5Wa7<(=qru(eP*m%-ziw;S|VK65?F=iT#{_@-FIx=)Rudw^=HI3}Rj zoyt=D8reW=s%gl4wm$M`kK$LU%wCYycbAWhY8uhz_b~T?;iJU2+0^ykt4v5#H`Rii z!*PD%LAqEl`83*?Ltuec*Zl?a$N3HJwJ+|O8b->vPkTmg{8uO}FSu}vHH^9Wz47!{u}h+26WDAMP@V$}t5_Z*a-kB_kFpK5 z&#Cf+4O!ATvwn4>9oeZXUfucvf|HFN=;P7x1de=p8=)Gs>QiCr1g5@l8Vp~i0BZ^> zz+=h%h4edV9JmJj4*O7ter&?f>l`yAx5Sa9oe|hdDA~xzb_ONlUVg;BvZ_i%rB#Zs zPcD=DtsMwRXV+M;PW~Y5w>5HuJ_UbK5Z4!g=Pl#40phGOr!S#V5UmeGFL`!hAx4~0 z&bq_+T&9d8iYbg8JMOBU=yJ_|G;uJ^X#>mr`MkG8{)N?-^#)F)=R?QGlq*zloIEVMIut{X6rMf@?DTmnyR z>T9bnv=7>|c`f}>pXem1tc|av7f<@~O8a5oRCicN z52U^Jk?f<3k8nU&12>PNmZ*C7`d35THQrp`Ws?dKeo2w4HuCMnwj_fw)=g_RE5kK7 z3`Idr%!cc^M3s_Qh;>W_yE#S^Un3Ez&7>OiRN{Lc<>e2x^w+^>tRj)eG6$;U>o!FL ztq5Mu?Mm~}o6PVJ4PBR6x7t!;{)&s*dllE-6$X9{|Bia4jZL)1^ntdYM*9YjP|rkLNJf`JYPHFLYZ;h}DEzV`RS>cHuQ zqC?HO&EVk)`reZHXeuQnKfs8lw-rA?1VW=UbTqV<4ypChociJONs7$&)9Feot6K1> zIhcZnK{mM-1b`T^gxh9{5k5$*~Wt7E9+V7XbKG!oT} z!eG>g-(kDXT%UliYAY6TlK47sEzjmsP$yW{8$QA;k-jkOBO`0+s@_S*JVh!GS~Mpd z=d>}Yw`^1frD#*%lEQ3KGOdfR$1Ca}6wce;gbLby^;MdmdVWikhJPW&PIeKv())&R z?q0jg%$bb#1)3!n`J5N+Lp6Lmn+KFUT25_0TzI0BNSC&4IY5Vc z%{r~#jB~)roq_Bx5mBeSZ#vZd^=rmkg0`yJEE+Ny0;*8(W4XUKlEuKLmzhy(!?Nk9 zRgL69)G?#UFV!t-;)VjRF3`}Pil+{cVNU_#s~y^3PcS7b7m`T7EZ!ucRTI}|7Ai_^ z&`mU?*yYsgjjK8#&|aG~86Xm@j>uYU)*Nr6GGv|L2q|c4U`@j3DY5KL>-XMpm&)6C z_-=X2YW#%Fbe+(iR938$i1czt28N0>Ws@R+K(Di*nh>#Kle7DZwl_e}-0DVcG046>k;(vlnS0w@)=jR7V7zFj_-7jDlKs535b4Oua;g_U&$~A67Amg3BSR zR3BGYcgf*FwAhHLe|4(+0g_PylW_a)oS7_D zHA&=Mo$rR}dF?kS=dOV&jIoW;zy9(6?ERq&=>I_*D7o8x@&t1FrhgqBjBT6%44=aa z09plOM_XqHLt{q()87{aZEc)B#~lHGXot@U(#A&S`U19Y08P5j3(V}y05&EDZJ1A< z;a`6K*!`QHkaMs#R5W%1Xnr~q5&_UE8M`?Fv;nljZcd_#PM?$o;17u*>PQcu|FgW$ z+lx9f0OqFQP+9i2=a!_Y@^1CIH*NX43=M|JD06`?Da0PsZa9>GAJP z|My-0r*B$YJAjjev++OY|8f2A)&Cu(f6SMalLpZLWA=Za{3oQ2|5K0vw1T$IpP{A) z&`O#cIetdv?@ep}UswDmXaHJ8X9K6d z(ya8k#lP<)pzmn>_aOhDk07OzxwWyQjIpbNt+l?5oT9YS-w_uwb~JP_w{x;}fT8~v z43un@ZOs3om*|=Qj<|@qgQJt6nZ5&nk@1sr(*MVas=1Mq*`NI})6spV`#;zEm+ik7 z`!AY`f#K8q|Hfl|n*9fLr5)F6(+@xpy7C&tn->Igsf8++KphP&Qr_?Z3TX;P0oB+G z{N2U3AvC5BKQR%g|5EOG)gjr#OOb|$95tocM^a^k0FjktD*a_Ky)n1K!~_>}+OC@# z`e-T^xX1|T7bTHo0W6#?%hzXxM)>byQ?ho?><`K(OBl9ng|dJ&1wH$TC2gmUQ%rx= z`{kAM_C{RB2Qe>OL;}_^p*z)4ut>?D5aMsp=_mrDck1-_kE5&p`s<0-g+`bJI%^rf zU12o3+-i+f3f4<5^UHh5T0;349hUj3zZR3mbr%k&YF>K=+v(dOA9m&w3R9M3}iDzm2Jt@n>>r z`5g`aJQCR0Kau*!=bsa526~oH0PEX{8JnA$Il-{9Gkjvq$=F)ukA;-6zLB|&DS+wo zqT1gxKA#Pro~8BO{zAjw?*3ZHXReJutM%_{{s%Vx3FN=AK@VVKW?=gdLX(+|?epY+ zgG#YFw40J}Gmo;ft*hxt5ps%ETvv8x2p36%hA#0f%Q3^eifZO?$c z+*bn(Vue-^&%_o}& z_R=W@#M^B*+2Y2s_1Ps|D{$Z+6z)*vHUfcK*lP>;V1FYQIX~+*A??>!yYDw?>J9^zirFh5RT2)ocV4_tu$J~+kY-HZ??AHZkcjM0{ z?q08=?XHTFOWh>cGa#Kbff3N4*&z$zmnhq@mdshyx>xp0eNP){*f?P2LS-dOArjh+ zCad_3eNb^%F85GQRY8J2nI+shOdS3ix`(1i-A@2^SKb1+5flyxMFPSF1O~XFNa!5- zZTkqXQ5J#*j0tEJ7)Ib3Y`>BiEjBzkDX`f!43`PWsj_vgs2gY!>^I&1N*=s_YGYw+ zH@?!T?zeU!KD3==Z7X!a6@*?oYgTiA0l5~GiVbo z)CQa#*u(&}LDLC8nHjx@7IL9lleB)SP0egcO=HyV2Gj{@kPk9p3v~RN5R4UzPU8wj z0|f%Megh)QpMyLFk~BuGxCwI|XdW=w?q*P{WE=20C>t=sJ@WR2-$nxR5(=vrmB{M5S4J5w}H9p(Dv@*Ra>iDdYEMUZo;eC_r_{g>$CP zJ_}{@gtEflKz66_Szj=~%YeuWXtFeqxu{I$u&`eevZyf$u4u~6NlM; zH|`s`fNn>Q3d#vWhOW>*sn4p*`kvKPmQg&i+n}T=kRl>kY20qyLSoZy+@2hYgoUhu z97Mz~NiK0sqC{3EL%F8?L!D}f33?gW49p6WJj@<;Kcf{wE^wiYf4Rm#%MUsW)DGl9 zG4ETe(K1Ot4d$GYSRw(5UU@l05KuHwd6U+hmKD*(v;?dkd87C-ML655cmNJ_50jnC zpFg$i?W3K1P&H5`&>#xVV65*D&jmGQviKlPaX)jx?HaOwz5oT}J}tmqU=Bs;TRqV= zdt=)KfelZU(#mn*j>{M*x(SM(EVnCHrLz$(kWHpD=QWV;UnLcQkC`on; znkEBl2f0nm7l+)6AO~UwME(n?E|C}dBr%Rhya9+A2$ecV=*>v4Je7mu3aHHFg4p60 zLub#xQz%(fmNEydrVVT!C}8Hvr*X?xW7q;xstwp{ENL1f<*^-jZu~uU70Sx)OEG?r z3?FnJ#0-?&NvoP)Xg|mbV;%Ag6dRD-fIt$s0kAKUG4B>F7tdQ5unZO(0(|CAl+41P zy~y#PE{|#9SBy6oq%`#QHMHg#@9Ru&4fE$MG7a#;!AJ5GSm$*0?c`+H#Qh`a0J%#=cQv zDy+v84x%d7^X#t<1m_#zx3P6kHb;!-nkGDR%WZa-=B6h=kIb1B+la$mr-ifJkbn)zV+u|)16L_ z_7^>L>Q9@CUBP+UK(R2~5)tm3MQ1;YH+=@oLKWDR%p_3V%sGSP;EHOy)Lgvue4DV!v8YK>yJsJYIE z(W4&6Dc9wr^MYl zv(la{6f?osScnFzIO~`h*8L96V;HfAI}PuVl{+kKFc}pp%Pe%#=~=qJ z8AMOf4;`ptHlJ34WJhgaf|*`ZBZ}OCAfhD~Osb1mxaVbJP_B1SOU^}Swtxp#jUAU4 zRt#p?+t3^$@_OdypBkSq*$Ik!h@TcE-6W&_1__qZFC+Z@M*05s&Eh05+Oy&iB8m(G zGTJ~r91czeGx5km74pZ6#^!eI@nLiV80f~iNY^5-=-5g$YOkb8Qa`r7h>m!XI{JYa ztN_e^p12rt!OPLjurI;}$~>tlc3ycl*;KTv#})CjwyDqHgr@He z{1}N`0epG2YK3J<4Zit3{xkI*-$PHk>597iZt3hJ?y?p#D5@Ger4+k5lDXP()KeiJ z(?HD3e#1fB@+|u4{uRbBTqoaoG2`MxT$^m6$wQcI;pGUN}2rq zdcOphn;^G!_9+lV#xBE(&sL^5k#p*$T;E z_71t<-b=!3s`}6Cd6GeQQ97e;DK@$bcIRq8pR4M9uMaOhlV`<9sOyb2ZOS4C=fS}J zmTvDMv`UCZ4hxG<+6Tb7du30psjP0A9T%H$SHQJDe7q5Me-^S2JGx2B2+Byxc*=-Q z`Qt7~uoO2K(ITs&U`(BjSEDc~-FiKPvYel#q2p5I0HEbOp*I$D=Os zYEZs3!)3;ZLk5yO+(xe!kij8?5v$)Fw*~c$BD%aWaWlWt9M@Z_^m!d zgE=PF2SQ6&vtXkxqSWD)1lOc;MaxT-yp&=+P^`6_dsWap3Ei9dm8BK(#4rW>qKKmG zJzT+#!!|#6m)V1)6DL_$+`*ildyM7#v|TgItcr2c9GbQ;@(DucXoXxRKWmxoFmB(; zcIiEoq#^fg;;ihkI+x_x?0l^G7cMwO_-=uu%69QWf_tJ2@ury%$j<)Pdc;0-TrBFy z%bHA6UfwJ?Kwud3Z-dOKlS#S;neUNR#X~KBW-Z8qC?OZTK z8_WrqXCQvW;0;yq$kNViExU5Tr3@#dFJLb;%(f$}5hy`ynf7|nylzG)!zh9sP){%f zo2L!3u_R9FkE?OEhYBxqp5xl=&~Sa@MGtWk?kJ6tUpNN4XOin0C6Yv&aj5E%4tvy2 zyE42d#5Dw6Mo{s?>Yr1&XTh{rla&R) z=+^mP>tkq+W-Na4wK zG=6(U9thacrp8X+&zEOHduc#fX@vP;E~qMuc4BOr%^pc@H)EY@N92$gK9=^#{Rlt> z90p8N(!F9CZJ4-_jmb3Uau4em4KIhDXHjuMlElXDkaT3J-Wq!`j=}i^bPw{P1`6SB zc5BMJ>?qD~E*GPcRG<|~$+uL*YUtD-s+X#vulaa>Oa$+s2cYvD7jI5%R(f2Wc-K57 z9{)Oqz21@rcLL|?gw?qeg1h8*2T6ZM=@jZN=1uGJ8D&$9zd4Z-WpS&sAhBYI!BSlL z%7T3$kpyl6_ zKnsw$;YCinzehjsz>_|`>nN9U1Cb=s6=T~2!#&pS#_B71k8E?^++DXT@JYJsiB zrm;&udUbud-Y41}zc0hb7gZysfwZaHftxq{jZmAZqNSb^k^W0AnMx$*;MGF$dDYBv zdzEw*LS;d0n8b(cY|r6cA(bfG0`zl|Bc$*O&j-Qp4BvvUdUwyJRI)D=o*ArR4l%Z0 zmlbtYA;??Ga(69z@XbKB20Wf4pBn;4E>Q>+~WG4{W zYdQjZ&#^HIKqYXc(dl%ezVyTOB7bD!bxB-Or!SuGT)yhQ^cJ~XK3zLi*wQ5pw-pyCm1zY3O1w!>4aQlfX%N%jMY zQOn=-rxO=)>}t1meQH_<=AzqY#z}Ul3%$+c=;>`@XMT%1+GF{1FDN$UhW&=-X>TswaoXb z1J)78`SG2M?xu|jOuNv|2_~ZW(H!br)Uh=~Q*U1{>MNE#H7GPU0@pVxs1Ag$T`^#d zg5z|mT@YTzYO;&b9L8fT;lKZ&0cGI}fWpKQN={wF z$gooVvS6ITqek;iCaF6y=Q^6e&P40}g)2jMDN2>niMkJM3NEj!S^(Z+2(y8wzsi>N z%;l#x4b#l8lW|I>z+k3s`8Iv`OkO4VZT)QMn*$GbZ!iB)jy+^KX}(FZd2CMgRbmqr zw+vqaGO|ouMJ9#^nC|%eLW&=VHog}~g&r$~!`RI1$$9O=yNVu9{Rk{(L$}06hg(raR-;SjyG>`=r;b|Q zgtwD(Bw>aaG3`jWU}GLwa^wKE~5>w1r3{Myv)4!mKUWOUNI8o{6a zUT!@FtBuJ+z2_k9UpgO;^u^Lt!9kZ~_M=~dTL5o9oq1ksvEooGf-;fkRPkm`&&(N% z3;H;1o-O=zSYC63EeKyVE*?5w^oj1sM_B#$2S(pEErm6* z`c~YnIHfVFwj?tMJO^)a)BPjt{?Ku-`V>Rqoju}2eC_QOgq@Jh;~Bo|N3n%4Yim0J zf`BWB(Sr@Fn^^-ok+XBYs3kLdl{BwlxA9$q@{_hQOuOQrjXFQIEb!*yhaqpil40pB zhiJW$a6&xZ(dO#a`TrKt#-CT6T&TQ;D|uNH@MhO!zG9#$Nd*>O&pWHER}%zVms<}R z{*h5SC$5VV4N`*a$N{+1{Okbf+0r8fDX z4Og=k(^Kqgl;}syKIlv;% z4Bw7io6%BNP5r^3P4d{;+$^D8Y4xRPL8PEM(s?q!#W~Uss*(A%-f%F57m2%rdAzKH zD6E{y6gh4`YmCFW+1RBt);hhNZYDZbcQwV`pU$*{O9}0KBA8~TTHlwYSWBW>947H^n_f&W5i(QJ z=Z3oG+d_SXWGLUqygawcDjb6({f08p{3GIJx(LI{W#*)uE4HJ~?d+51RnEPDR0%oP zEJ!T*eF^*GR{tW-Bj#Dh&C)qnHu{I2FK%Ry<>M5Y)KBlr898)3)ZR0(BE@fh48#&s zcx-lQ3zpdy-s=`O=BgB5tW`hX-_SL-lrfj_2JG|}WmCK%Ka$}p#umSmzGpYO&dHi@ zecLL5#pr>c#I#uSi}J@b51g;IH-|of4iq((nrh{))@~>=-I0wyI6f`@0e(x^ z?~YN6`gKQeA8nHDf}3%^-t3}Hn6XR8X~-TzpUY8yR>O8QxG5X0?Wb(ZaDAcu@E#kr z2KEGRc0vXV4~a7uXw*?m+Gwvd<{CpDJgK{_V_Bw-n1{X)qGr1dB6Y$RI(aVil3BrQ zVaPE%S|yLk#E1dAdt|bv_MqWV6zZGBRBj(y#l;U7@nHnlp_{j-4qYbetCqy&-GwjT z7}HnZvNMzG-|)KKuU?xrXglk@SH6eBKjh#ZVGtzB9BO>y(?QFkE?3eyc)3%lD!0v0 z_ua?}VQyMdna-w5wC^>0b&A0pAe1iJr0Bx3oL3H}y|U^D@&3=9BfW)=X$=j+N$OiTa<=1*PmQ=9mA z`=|fs$HKx2VEvr)r)Bxn3;#O*wEbhx$i@!yr~PaEbL_8s{>$!6*KY!Z) zB24`=O8@cx^rx`#zo`w{39^=fdOfR3*Y`m zn6=;+tTjiN1$8Nbup`u?@Oj{CD-vcy>bXkdieyP#v#l+p5Y zbi{&LkHVe0FPsi@@Hw)(ThgbDYSUYOon7QS%%-#^wn`ZPxvOW7ZVYGvzEW#A^1q}1 zFKGUE`2PdEe}VZQO4|Q~`cEwUEvNkr|37jX;8RXx{;zTx!~b7$+TS|(KjgGO7yiBR zf6HkMbgb;3D&D^UPR~rw%>2JYytBjIOLMRZl7~_C$7*q1^_FW*7LfPVoloxcRc!8lI^%eoqv=#S`_V*te2di&D-!y6V8XbHgH);uvQyC- zV6|4SvlKa=D~~t?Z!hKFgQ@#>!nKG6?{9-=E!AU32TRc9W}2N2ClOvbSs+Rd}z!> zFm>#@{2fMd8c-BXhZ>3)UNrK8F-jHkvDbgrWObAUACseIVEL@2o2MFy|6bP|NCtPg z@%uToC1#5T(VN;1_8U)akK>PPA4Q8Pfl@yuLS!DOcpVF)}qVdbzgR%0!G^77F5?V-m##W z6F6ML!Qv$dpo(Ps%QNK-GezJljz_(MLYX-VW-%I!yzO|g5JT41++~AzjEZ3zijB>i z2sPD`e8h?B-o&7xK@v^4eVRgyG&M+(6-$qh`@0uEJDd zbg*DvU^LK=uXI4qiaX8*@^3HCb+upIj@AUfE6oL=PeaXb1G@BjuO{H1)w8q`l zi+3|qybTMCEVODRd1i2Q5k%Qpu=9!&ofDrM4!3fUY$z=0X18oZ0_S_ewW>a@J@6TM zT?hY~WM46HaE~YhgH>HoXvSn8R0uoBcd%Je2|N`;;b&Eq6W{<^l~2;)w5q$!(av^eQ*Nw$0kQQEcgvg*)dMVYdI{UG0lXw}$7brL zr}3Yst9rlAX(u0nYy3#K+a}THYn3S;fJ+8RPmM1gAl0hn$--t?n_ugF4<51M>pbT#anu z8{=Gm0%(J8aGZ*05~;V?g}?~FtY?pDW`5f~14mxcs!!>w>$gz?sO<|S2OMAnl{A42 z1Q)`N06Q@L%9KZfK{=gZ)_Vdx0X;MN;Eo_Q{$oK5zU5%L2s<2pQ8*Y>H(BtyN(6X- z5ds{MSx=?IeIbrB9D&eKzEXe@XS-~9>Ds8vk8Er7X3J*F7Rj{>k75>;9F@h}vINoM zu#yMNS6EPp{INWYA72BEpfH!kY?vx5Ya!%t47?xOvvZw%W+~W8V8aDDTFsEqSPR?46s6Xfyu~=L&~5-XYwxbnfDVfW1uLZNd%+|kg^!98jq!kNQX+T zMzMXvLy8R>7Pd}ZCVPwo-HmINL<#(nR3ly*ma#Wkea?;GjK2F7ga|Y&^k-5~T7vvQ z=ua+Ma887$N_TMk)Qki~)f<$6sOC-ZO`u%@Fe)BqTB4d=cQDMk_oto{QLdn#<*VcZ zF=eH21`4bQ2BhNQ!h5-Uu_WVyLV1=|t?5nR51Ii?u+4GTYhu~auu3-=ei7R(m77fn zJl*F%PJhx2{MK0v{qEDG!oOZzVl<%4HMlu7Hg7el^9ZD&74WPd)DHzBPGBRjoOc)y zM&Sum-*<^mLlN3%`eeEn7Y`KAMLrcsi24;Br6iSUZTa2o)`!WRH)FpIAb>o5AhP1U z!V=@D>tcfUQx)GP2ZDO6-2s0kx@W{|0KT#uWtWtB&=OEFwa+MqD{uLVc%`8Di+vO3 z9%y%d8s^-`>q;;@T04A>5*3*U51xuFRQn1;pVnxJEr7_%wpj@TV=9mea#DuW?-A`a z9qYGTG``AS`_E?(=4J}gm0Q}CTjZ77Br9{4?<>R+p)r*=x(jaA2GJTkF&aKtOVMVL9+5{E^=SK9OZ+4}f`C0RFwR94^714us(R>!8t z(Tma%qY9wUH2WF@1%X;;*USh3gJR5?3H)ni$`J^rAv+T&Yh{Wva1z3#&{MApEIs*h z*3oQ=)Fp2<3G&rymvFyvMM&E&NX7`6p(k}k8Q72Zdu0T$jEU+3kk?diOJvRrpR@<)7{yZB+*PEyHr(zF^_>(AlZeorpU!Wvc|~r zeq?vs^;U#o>qINc$v|7}=*yKgc_`OL z#piml&6{T)NBtXTRc!8N(SC?p3y+dk_${VM4*;7SQY^)3CkxqlG@}%i%zrQ50zD{^ z>B@_`I}*kcW_1&EV7Z}+3s_M$1{z#Zz5w$1Abvg1@~RAEs>uFsii{&UMk>&oS{`1d z&~8O+@A129n{D;|yM0hjF04;})Ui3s^R$AWcdsmGD){e3c92NcXK0n%hPQxF|5tvZ zgb0dfpIx)-PUZM*TBIJiU%k0x-vVogTEImm;K4#UBLh8W>L)6Udp9b7qWNG98?J26 z7ZXM8o@iGdLR?7`2R;q-7J2tx0lk=fz%e-)8faesc#hdNP7BlIu!Xge0SkC9Mh9O? zxkYymv_v`rQ#Ayj@1-YK(!kM3uVbE9Dtmg#?@n&FaizmfsTao_pNljZELJ!M;2r~i z%WwntpaZ>Qh!&-^gtx=$RWQf(VRYMUM8|BT!{u8pQaaU{)2`Gk(JZs{@1mF;bkf(Z zpDK1eCh1hRUBrIy=qy`0PR}`pc8uPSAs6p5b__qAk{%%SL$VS?kX-(z07Zp|Eb{Ob zyE;lSt^Y7cD{Ii3}7Tu>f7^0axA21H_p(tcPz{l3=Da(n9jOB?&;v*S9ccvyaw;VAPZdw!u)R93@7qt_8GG<`H|VeSb2 zsnM1#{2@8z!! zMGR%?UxIa)v1Mo<L$P9+U<$KCIbwmH0tNALUidJo*_7;y1kzYm zKtC$*B5HgdI;q-T7<96VPR$nVi9!>oM<)TmyW$Lh&=BkoOHEH#n9y zo`rGMv$zV`322Gl>CXY96S4Npyrr#6>kxGAr`BPwnUkD^ln#r+0G7{2aN?#V8-GGA z#Y!E<(X;aLrGqae!-M zdg4--@{vZL{o*LRZ{TGeU+#Sa1YcCYBk4LL#Fu=hwr$Gr!X92eXFjG!;Y#*kVC40IdBQXqp>5E`?hA) zfix&I>1JcS@Ic-f#20S!u=}L9f^wI`&s`$cOj6S#2;c(o;I47a7aU1CnS_N`x*}1ZSh>Pa0$He-SPAqVPuMK-@{#I zIqQUdqH$4Z5YWE3TB1yDWSBDZE@sWGHu2^>KMWwsWw$5_bKG2zRE{L)JwSEUCb*XK zy*FY|PZl-I&LRDX(2)*3c0Dn?7yl9a5rtRaTReQ+off+>b!h;(EW6C_A_fHooiFXC z<|c@|*ireS(Bi~JcQZCnpGA>6p?nnL0DrhS9$l_QPDno|q(R@l7!Mrf6Xuo51(tC| zVwV1cqV+pxm{1aIl#FB7vOQYC%@BFuTGC**N zg{M!o+XK)HGNk07yiH26wp~}s+ftM!lK9%tn}^-1vuDTE_c~tqd0U0CeqG%q-TAh& z{r7^e>_b9o;Fcz)`a;_00*jGXNX=OndM)*x&mR%*F`dI716>Hjy)C_kHf3FX0aBIyV<*iyJ64u zQ)QVIX94OSm6vZnKz}?rvwK4yDw28VvQU(=wI=G6iPsZk7!qMTjax-tOS+(YKU!i4 zafabl^_X}FxrK8(Js@QD@aiog7MLs6n+Qa7^6L=Wnr+RsHsL4c)(hNX?(b;#DLgVX zukvsxr{%ZF-$4{jvE1L$yQG~g+vxp*T~`yBDg@uZ%D5Y)pZT5Vg1~g4hd*PwB3ti# zNpcl8yaF5`&8;q8n(s)I&6Ed~3nvM+P_4ca2{>#|Bc9?q&P z`o7Q5n1gSB#c!g{_zp5J|2AKqY*EF1@mqq{4^0ihzzpc<++SD;wP{>_>Tl=_QOwU@ zq){l39lz_A5kxYH(&;Mh@#dP%+aT7IlBqK;pD2?&dC^1@1YQMK?K=FFa51bFj3}dg zwcVG-^5=1v^h#ZqbxA-6V-1IvtpiR$)>#S~aotABifqvVeNhT(s3;vJF@i0_9`k0p zVbf5PEJ-|Z!qgU8m1B%VIilg8&JChcaENq#GWTp0zoq0z{V_@zr^6$6V^ghf@HNe| z9&U@M;n>>9%>W!TSm$OIL)wrf+PuXgv~k+($wGIri$aD#Rd0a@h~^_a%Wn~C_8@PN zY(F>cj9QKRK#h0uc#!J2?x9N5Exd6~U=AKr4W?}a1d9rUjI}WNY~KN$JL&WCIlPJCG8t!HL%cBJSR$GGd%5FGKj_=2 z*(=GHzQ-{r@X*t;W>+KX6yTW&QkpCXm_4RD5qaqMvkir3PLVYso8~u}5{&<7l;wLP z&Bt7ysBYu)#Cv_GVOpsjDbZr>)D1<=Ys_kqGq=cEp)2gNd2L+HIK5A*P%;*FXOLI< zKdjwzlq6l7DEjWQZFku=yKLLGZQHhO+g-M8+jiBhe!uzd%sDgnoPX|GJ2FE%Lr=!a zj2+J})DWTt4@6jzC}EIZAR#@pqSp=_mWk3A^qA41-7-rCO5uqPF6@N0NfEEcOm=T8 zRFOGpXasv^tC8;w`AAQniKU49v(>}OtaZr$XgpY_h~dby`HL3H0GgJN!ZwcOj;CAN znFLU)O-J5iTiQvJG87eYEZoPWHQ`~y?D@*HTRWI?#MdfX zX_{7$lDJ0@6H1C0cG!L4oLUx``MIv0J<;Yh>x888wN`S;`=ye@Jtlkqg}H8bgR@x3vk8S9rpKU38rsHaqzxS^-gJ?p7UqE zrVMwyhj!XtX!e)4e@3C{vpPSSoW{HnvtZLZExFwry9(CxH0MY6U&pV;(O3grM1nCI zW?SoB>E$!@z62w)fQ6<$PwGo0?q08Ns5FTVhsvtAZ21k2>``Bo=Mil%h3FK$z?@2} z-j$^So_BOMpAa@FZ$HV#uR8ihnw=?2o1YXs9dCuMpEjAFI5)C=d!qA$n+r+WP|1hD zoIYr=i?=i@SwDm^KT_1r0TY6HW5lYjIJyVpJArvSZ zzfI{H$o~f{S_og#uXuEo>CCC%VR{}c zUowk!72IlcF3mme=q0F(Dz-b9?1|C+s_1uE;kE1wA9yq1L3=k$?<2QPs|Ml zSO|L*zWo|DNK|MTjBeSbpSsMf%fEuzLEb=;qxM0PMt+Inti!q&8Ps%R>yb{)#I8d& zzc64oKk1N`n{pje5m31sxQ+R7L3AFh3vRsaAVY4{)o_fFnqQcotRM<%K7GOkRH=G%vHVTCf02kX=^Y^etKsx;FYBoH0Pc>I|f+;s)q8>II>Mt@N5%kgB63Cnm z5Zb7Bi{GGG>J=*y1nV3&^EXhYylwsqJ^tZGE^DOW`4!-%?LqrdJB=-PJ}GeD_hWl0 z6GDBE#p0Wov6wX+C;et5t>3eX#BrMd-~_Fy><@7#WLN3`DF@bh}j`1&fI+pMD~F7hM_I@*7_imkk1Iip^ZZYRU4FcWNR_ zxVD(eFHpWbjT}*{V50vA|GvkrxEKlM zAm*Vc2?qNRrU>HfESZ3OS?^;FS5OFw>2PTbt((|P9E~lqK|-{b>?O@TnTi-O!ixAL ziexXCBY9Cw?&u#V;6v!<*SNa^`OZxJ0#geyWJ&&$Fgrpmb%w;asKT+;wPfl-CUO&N z?ZH%54rc`ysrEE;H+FS0+UJ2BG=>CM$8S4hKk8)^ik+)d1J}o&>1;ab2UIvpu(JRy zIbEK>9+QBm5`I}$n91Nc25?e8wM<@3uWmR{ZTL>gVkU~2Y{n&qIPc5R*Fd`qeQT+G zMRTM2jZlJ#sAK>O!cL@s3jrp+1A(*j{SR45hbY^jO4LtGJoi>y&}Z^~0xa&};@6IN zY29;=`^vQhLq>QA&_0OZoN8f;n+~j*&^*msH_n9sRco1@1u9at#nl!DP|?y)w+j?vc*sq z#zB{!djsBzX~T4_RBDls^AT;MMObQ;nYE^yuA$GGudX4S)`LH94g(QuMFAeSSvUHK z!bzEm$Z1~a*+eY*^wglro%^q-p^2ZMl|*i@{awQd8z9*Etj;?`?5{MeI-K|5dih@g zH_GCi5oAi~Stbwc3=sY`TDGJ`B1-1Tmj0H_k}($ZO562a5d+o6JVe}wg~1D{9!PgB z&CR*;7*_}Ots}BeFUw@Fu5pjVbkG;n5sjmP; zX!A!*dV8NZoLnE>Qi?-zrG?_VOadM+>3Y3`z?MUvR>JyugFnO@<4wJntuwovj* zlX~SPHb}g6?NO=2dlrVEAfxO(&QK)G`u%}iPKVWXxhu%;#4L>O#N?2Uc)}r)l+<6> zEn$5K8=5Up?obi{W)?_d=Z1It4K#mrL_s_63PFhcN`!0_elAIVDeJD8xgjeI?{?uB z#coiT?QhUoz=Bmp6t#+xsB{X{tG5`+2!$b4j?yOe5o+af+!lVxL&N;=ksF?UlHO^z z3(DBk#Rebhc5L5ZXEI^=q%I`rey6=9;Wxr-)lyRP74Sz=NI&n5X z4u1uR5`=&mm>Kq=<99UyeWk*FOl=PNCN6HsRTyp`mUYc{3`wb4YtodcJJ&bTmv#%eK~E1Mc2*Oy-JG3z z2w>#Tns8r!xCxOkF&<;!#f#Eh47kCb2{ezL-RP0~gWFi@%HBa~4>vNYtP}a+QD%TG zAuGNvNsV*9i7$YGdUsZA`~i+=;)cj5oahl>A7R_O7NZ zi5%dRtL-y2c>(n__tUoV-BN6a_fp|8s25e$VAY{r9OjI3N!Xtmm|W-z*MCZmOfaKq zs^&e!dF#v?%G|Xpr$)ky4dF(r5!%laOHULu`|!$hRzO+-==lN3cv|kzATI2k??PfLT1B3`o#s~8d{^E1>3K6rj;d&{&!uuSt0Ld0f*|fO z*}C?qQ4rjpNkvk~7d&@qpl2$oDw-z%*F8!%v-jBc?PN3yMGVHtaS9=F#zDd-vWB}P z2&mE@M)ixxnLW3eY}EQQ_|l}AQ49aJQH&XG+-X?avuUr8AQ=S^h*VB2cT!w@r7&V# zfy!EJgJ{~vb>?!`xpCG)&v5;~A33S^DtimFPg9-<8{oTS>Rl)|7t^DHBo>0Xe6J2p zLP}$5rQuOQV_9Y1h~{d3?4cO*kKw(>HtqVsQ#9>5nj$Q(qmz4DcKUgmds^IS-M;zg zwf|APR5Q^s;OTf!+3T#asvh|S@q}^Zz(d7piNs&!)GW85*eN-U0h}MJNI`8sriMD8+ zLLC_!Pb*>TuU4*Bh8G*T><+Eld-ottzharvqJ@4VaJ7^|IxKP#X(?DoyYYB8Iz&8} z){fN{GGJX;)ohITYi#or4eJ;KID@D*!o)#tqSqm)^fMqwoeDrdS^Y}am&bOC2(aLr?C_VM9fPpQYW8o zR{m*D@Xw^Vn%UAhw1@+~e#W%|D@pKG8YCtNCXPTVD-k3^5JnT4WeV>SL~C=I6J7T z`)Ne_99H-hdmkIdI8r|4e%HYP_@Y+aX+uy>Denqm$UV{^%KO}y=$fXvKorhA!7^5N z_jV@Mp%Ssja9gnpDQ_>B>Uc*49qlJ;Es5P?@a~7J$yA#_Gc>2MdlFi1)!AbW7(F?G z4WGaI@Qnc~a|(%KBI_;IQTR0jS%+-GwdbEF1;`FonWN>+aDoqrruf-GYv{7l%qO6*X{2M+OYDZfF&Q3>~b6$O;d-eoe0MpdL1rGlaTEzDL2#Cs9 znd%tZaY=bTn852j(EZ|aD4mtjfh1Kguq_8_|A`D=Lu!qh9+51VuI4x;rd~frk{an{ zuecrnn|>&fki{=?$eCnQ{q?XyxHgS*Vnk8JO)CXpYU5_CU=C>mt7O1k$J2(nx+SWx z=};$GKz&q-dL?`fta8#-O#Mnk5}d9lR7lir*P(>)Vz<@e;qys02Esl^MDNxk;a25h z$7$Tzs6@z7?_JU|JJTge0WJ5vl~8T2+tdDbe=Ag~bFl$^I!oHq46Ym5j|irzDol^0 zqLcVIFDX^*W^mhN0SDdArdi^F84O=+ggCyRo`k#dSVhFR#r2MAvWPdLU7Fm!;tTMP zZ$|_tGI;Qz^LJ(>*Qdza%cuSi?Pq~WGC4S`Z}{w+ewPxE?4r%$B-1j#hty*(eoa2s z%~2(kQY8S7IVFSB7ckl+gzulq=7=(?wnQrx|CRCHBIRWF?wez!i< zBn>uHrtMmT?_V+%bXI4QU1(mkuQFVuJ<4oCST`VoI~$lJ3ly5K8d+t|FQpSBJ6#E( z6~90!kCwsr>kDHO-m@;{kz+1An~N&K_4U3K1x8VgD3>ivuux?5>@Yy_Xx=7DW_$Z7 ze!Ptu@$8hZ8|4LaSvnq^H{ODvvt{8}4;QaoAclW=mL4U4^#8zqE<2ou)-K#xojlWf zM0dd@^cNFMVfcdvQ6o}7i)15!|0&}mWFSwf6Fm&WLH%+9Y5AFx{emeeG|8kLyzbC1 zQXUajyTxiYPs!UK0h~))eg6i?B;4D;!--*}s7usA$O$)zM^NSfnj62aw3?t0I>o}_ z(P`5PR)1hl9zHg(dW{ZXXIDGbMg1%l4{8wZ$-jI+mJ@|e5ZMROpi@9sC!g8|6&$EM z@KBJ5!ZM6X?Mbs21> zMc1R9Mbf;D0KNE?&HOG4IHJ6F(^;6*fEYHjCzFlca71|zm3m5{(&U=0n z5F)_#*UZk3=uZyw(!JlU>l!4;$SVbTzyBDO9*N^-JPF}faOZ?y8=j_ev~u`T!-xxN znLz?!fCp{`gS^A*HLH?AyY#6J4Z# z%@jLw&|I5b&3Y_hBE>X-Z0Yr2`xBa}41?EW$+rG5Z3zs*^OT!kGn_>nda1*y{vIQM zniF}MGEPHCl-)d3vQCm9o$q7Ecl!79n!zwL5(dN-k$WGCqzIyviI@bu@pm@5kR7T~ zX5$ZOzObA2#JF&=S-1_wgjjk(w_YZI0+#OSyNm+omvkRD0XkL>Ndap|X831b5_@Ll zcuT^kWZmr_UFnT(=?cLh-7&NLrPyy6*u-^-trzrLqvaf~UC}hY{ndqt=f7Ib2(Y=l zg;?#(HrgJi1!}rEVk}JOC%GOtInG86xcZodv$mcNxYC%4aXQa4R3fO=XgZKGF?8uv z7@q^v4#91j;f$X_pW@+K%&Q=6FR7UqCZgxuJxDr9_`kwT5MJ^5CSrPG!3b;7VyQg7 z)1<{fODV|_GGQ!!+{>i|@f_blx!?qmaioOJweZmJQBd|%rm7~lPK}Q*_3v)g#2#kK zs18%%S#8;ALMk0Xt4lnIh9j#rvXZt#cy0pFAQ~#O3i=0z;9r`A1$7LN0fhNFguW{U z8Y`Hi$n8XIiNEe(I~r_qJ}PRdNC6mA-8)-9Jt5Y+wpy>GHFAP|GE8Osm9 zBNHIh5toU)n!6Ry7YjBH!qrc;(2Il*PS%5f`=@jmDVhx< z9G-rJp}sY|x^Fb~%~ocTtEe+Z0PH=Sil<<+R=djE#FmBqo;kvjHfF+Jxh+C=ON^X3u3zifGSuCaH=ek6uZ9AOEcWWzZ~!b00Yn<{!AHLD{UA(xb6G~V z>iyhqxos$N*zTjDHoMmrCbh;I_<-aM{5;h%I%cN_?n7D&l_39Eq$K($r57KU%>Xg(e(e!Jj!9>y1pw^(P(HMXI z5Q0KbdIRIi5fR(_O(2i)hM~GQXLWk$Y?3%zHCvRC{TgqO#uzCnZjQ{RRL|?KF;>

z*L-V70$CiMUQj z=e1kH2tt4e(sZip=bn@^Dx6CJyWqnJ}%yo5R;Bs#sU z=j+016t*-_Iq;~b2ZJ6~i&}zOw3AaaEGH2OFEGc%5Z2nH#M1HOy&e#^%~YR;_m3#T z4vBQ_$Xq=dQlpzq-$u9bjvBPw?2E$aT~t4U``)965zKL;PH-MC)jTAZ z=DRXVp)SP1gstCaO#J-z$hmj>{LL7b!`yuy|)A9X-- zPYJoHShsjTWXy#ikkxYfcE-3G)_l6}7GdFxx71XVK!uRxm;hkeaUAMgq9%ip0$vbn z5DWU2M){8)r`GQCvas|Hf8-~%%NtIa&w`_sTh!4?z$W#J z2p!^kJ481g)UrO{9b(7+t{8|L3X27~OW8)A4jirKrX*(?ZT=WPP_tWXZnyZYb9f%o?DaFvQ}fEfsi+<};ZJk4KeA8IZ`w^47nz252(Ya5Kc-;GMBO5m9I$&hOVOOPz8JhdL@ z%!K!BunU+_qTJAYZoFIN(5_$?*AdgRou4i8#RD{DK@-IO!S+i)mu?AuB9X?>%*gp~ zto6BWu~^Ki=Bx@Hk7{x$VT^)F0#SmDu`;Tg9pZN@bWk41C>*!6T8jCT7z{;ozn(cD zdgr2{D?MkU0Or?oI884N_c`n5fp9{0)lITor^#Y~$Oq!FS~{SySR^+E;fH z+e)woQ_11|o@)K^%D{G*WZuhgd_+^h)BFH11<2ua;c|d@`gxWgtpV?#@WhGdk3_}V zZqbwZ0+FVGLP18(?k{VE7)nhl#x98;s$WCjZa|lg-LEGp#%#}6@+KM}~ zrOVQ9$?lbzuB1{;0}5dfK{p_cV_B+mY9l7%+8L2rm7Q{LaU9xMM5=5fr?g zIE&MO+iEctlCQK3sa)a%{~bWn7Z5xJ6|>ggPn>YYwSkwt?dDi0#F^;DtnMZW%4fUCvMB$k+l)YS1H8pV!uZ^(-~0Q=Xu_ajbEnk%&oSGYh55 zMo!n#cCGiU%4x2zYWiib+q%qg!w%BZ{7Nx-Dod3?em;fBIwt@c;$kmZdp{g}hV(&s z!mydzTpBu(I!kMYp2>o=Zf#viUGd^_EZH`^7O;KhB&PV_{@UyPEn-hqUb9dvm93F! z6=txF99EG&Q;EW@zon#BRU{w*luAy392L90vRVcG9ca>In!R^Z{ya9$1djSQKch+P zL7oXMXYZzB(pce)PAjGSGwx`pb)pa|cyOgsxGZk}PxIabh29BCslty6jAHuw#nJ}+ z`2_-bCSX}nvOELeJP{;WTew(*YPRD7W)f&NSoYNY0;#Gt?EFMVmDEy$($P;brBcSl zTVJSrGUPlaB4FgZTfHnA4I6dG6j4rp*dj=%pWMci9?w>~c09p?k$373tk~_= z5-@37-hnq#E=D`=zOdM!CQ4pmMTZ%zrp>p=x(CKLN|$xb02G)`rJxt@L|h(bGnW7RLyM068*+V z%i`OoXkRwGXJP5ilIyKiN~n>iy@3=b1nNcs#f{P_N=O3tGbL!Z6^M_Ol{5C)!T@FJ zgJePAPw1QSoCAPP*6|Zj7hVpghJubNa4P&`ODkBwj@1ViH;eTw421r z&WH%lB?VGm9{_Q8=?);0dlTW*3JHSYn++X`p)+o;*|AX^}@e%DqaaVCD-3Z|go5R$;Fyg6bbq&Vo( zVQPB??!R=IZAVjX6Lxf3@`{84bKru*pb!it97w8CQV0Dr(Dtb`jq(k>muoOnZIoJlgLk$e7=e(GR^^AI7%>my&OK^cSz& z)u#Bz)VIMkOP;-yM8wDEZGAT}nzyf)F_+Nqi+u8SJ`NYtghKWCb8^%8EL>X~i~Q{P1}jRI!NA40BT4prZ74=YYjZHY})e2mBgS*dsUfSR;2w0FW6Oln=ZOC+kTGuSQbl9(X3gV z`_cf+DLO6>!-ITW1;&SA-q!5Dc%gve5!tfa9#~VWx*n`qV}G3WoYr?L%~gzs?IMIz z;7}lGbw2L(WN+M)Qh7ccF}f-p1$V0~xi6mk4UZEszK=ipq?;$ZT;iTvO|V)~Y=(>5 z7G)Y02@x}pq2<0M0F>Fb0zExMg#AMNipKRbjn^$)=(kZEDFbRK@;v0@S=iQ|Ht}z1 zNU(8RU(=v2)^lQFV?!iJpgs8z@9Di>ASO{j5F zbax#dvdSg8CO3l}%SZD1-6}KpBJsII5twu=*ays0X9T(QWa&j1P8hxainUbA6tns1 z_!FvUw@HDBy~I;$mLQVGB*Yz9`ATTx`8?L*Oh(kLA>~+;$u!y6fJW{pYb*;&1>^Q1 zYE_HR4}5q;*LZqaO1lX%KKrog4E&{k7v(g35{0D8upW_YE}%$_|qi6x<(QlHq(9(U~)O z9-XB_t(};60IEz*wQKBDp7T`Z8CwOu#YT3x!LEMDwrbT@uV&&D$om+&1zZ7?w=;IF#m5IUtYb5X*w{`?+U+MfkpvwY{?`!uE7= z=DovF%R_r1v!;(Xjgy~~Y3yHBX{fg>cDLOseT95Eb~nzep7u(6L2!r!AL!laZ44Z` z%S*=>LvB&m=t!x`q1ca-r|Gh`Lvr#q_j@N6ftzV68BZtLBqs>PFDjJf*ZfgbQSm8< z=MFC(v4iKitX0u92$l~7etrO-X%&|v9F12fr;6~3!y<1IN+6Jr zl7=s`@lw(FZkp23Tw5p8XhqNU+g(UX3=}gHTh#&l;LIRg4=dt(!F7Sp8SWv&G_YM*B#8+{A6~n|dzWM0dn!VOP0FEx;VEJ& zm35)UM%4V{dyA~-ff1bjg4zNn>r}GhA=wbmXGYL z)(E}c)(}hJ`nC9UY_r%r3-?1?&W`h3j0BoftG2psj*d;O*o@4Iw@+4@tkif39`W6N z{lF~(5B=|1$p1AL_kYg8|CXA+v&{vqzKP|(jxLR;!8f{V>flNx@^6CIK-bFQF9Q7S zD%1ZXU28(n{BNMM(EpyW{}*)r&!l|%e{s|QnIrtqi2pT57>|LG?f;$PoOEQz#w$^{}@dqItlxYCzG~}jN)JEfM%rg=9TeD=w^ExM!lZN2? zrSV2D`Rfb@?3l+5Mu4AgL##v~`h(jCeo^tHAYIy;rK+x(1y6WcSU?ERbX|oPV!JQ{ zg$vmE1m<-B*5)fq~=vHl0ceLqho_-`W*rjTneV`^`niH zpqj%(!1Tn$qOj#h!I|3PCD_xHDcT9&=hy1=+n3Vk0+3 z;UDMWn{4=2-~S2?-$c0jKcoH*{3ReX@#xs_z7^94k;TwkdMj#lN|CYbZ10yY- zI>cWO;$No2Hz4s{{#O1D-9PL8|L&i^JM6z7@c)BZ@IQX>|AQ;|*YWuOS^sAKD|q}L^>0Q- zmTySh$@pLTHzVygCI0_qfkV*$3z`2fC#L`EpZ^;#V5O&{{ZG7rk@@fb{J;7f0UnS# zNDG}$Y{oboZ&@1?UD^z9Qp_uv1}wk8V>FSH8zU*yP za5%&b&OgC)u3oX^`H9hj9i>8x2-(^8$FB|daE@dR#dXxK-yzi+b$S=O>O877*uTsX zay_xdQ76=&b@|VSz__*`j}|Bcqjq1Wz7U#f3zaL?7&^Xw^1bX)C{d>rqk6Fc=XziG zez1I7Mn&=*QDfGDl@1Rbwp?C zzp!YmQZG#CYW1VwvUXIWXwShF9-H+|BoQ?frM-0r=jjmSVi_H>+B<1sjvVN@%kViF z83W+#Q9+#p2>b1L1i)5xpMg@^V{mhSwOr-KU$ZHu0BvbT&jwh7IOrl1BA~*91DLoy`%G>}d>9Z(29292)_zGW_PcdU1G}-qtIPG!I+V#`h&tTq{x!$$O z+Jp@w6eg$n+Q39o(7e_89&{Swc`<)EG8(#*=bp|jXut$s3_~BUd{7+&8djb{)mjll|cho2E>^_kY=u@l^;*5p^s2h;bo}~kVXH;Yh z#upF|_!#DM_4ggJ*6}lqCfL^p(mMAz!tFD<8le=S=`Feq>m^7N0s89GFwY;J$E;Zq zYu9w|SoQw$5Rv>u{FAxSzDb59$d}i;_gL?Psuh3Ot|27?R0o2V6*U&NBd-G>XZVj< z-2gB5q-ig+^J#3+DRE{Z!cuDsIpP&&os5j-VM3zee$Z#rbo! z>kKY!Fe~`kd(Ti!>#bwXYE^<$wa@qKd4n`9G6?|K>qovP3Fnp6J-!<{hb@5eAH+`R ztuMa_LVaD=gbu0C{`FA{-6{KKWGN(Wstn9ie)jFU8(Ns9JQ5wG&mc`3*urNq59m+p zmb*#=9(`Q_;!y<#$#JNn$d%#sf%mi*>85ngIM3+x;fcMh`3VXQO&5KW+i5CV6to)~ zZBd1&TN9w`DZTBY0~_zm8i#z$>Bth;54h(8sRnE=@Tm_>78HYa;W{r{#o#y{_}@7FDimBk)W9f0XqL+EYZG_$|e5L$l5*etxMR+g=>S(c!ifv~-HV7R^qRPWrMU|+yr{yz{A zL0Z_P;t0i0w?&6yZVWJ5k&=iEh$u4)(knn9xTGFq`}Qpdd-_u$jBw@#)~DY6T(ex` zU&4qi*wPI#msQUZ9*rIyAE6(yAF)sm(^?DHnJ-;8r;c7y-xJ?G-{s%QK0Bh88jlap ztfo6lF%foiYQ2D`Jb#$HUT7zIV{7*%)|d~!;i2Lb#h(o@==QtN`>Xc6$Gp&3(Q)^Q zJaerNQR*kba*ak1Xwy^NP~K8T(dt%ZsYX}{^FNE;{$vy9Hp+AXc>yY3#@*pJAYur* zzAtXss*`#&xdjw4evr{+&PimcSGA4C=?%lSA z0j;6mJJ&I#2jY4%up6KagK(QV4k&XGYIVQ41;TZ@Gv{gwC94P{-92~>%Ht7CK8jip z!i=Ok$1NrjR@YRpIhWi4$i;?0ZrJlUC>N&#?*3C@IvWUjn?e=^lUKcMXOr2d($qr>EBnr++q5#uaK18K5w`K*n*ztSHGQ^VK%t$QS5qM1atxp z{gJsstN6SFZPWi?@wfI47)(vG79mp3za7Wr4h8ov`y|0s{+M`UT+QA4{dAuL*9_?5 z%+Q`fYSUdf99Tc?&h}Kp?sf>(XgelN*COofjWUrVg#w;(JMNJ_|gm|OEh%de) zL%aRt%4MY-+GmAWiBdmeG7ZU|rH}3>`~6E-BX~ah_}Cb61{{(6*vkROVf;->ShyQV zbFa%=s#~C&1s2BhN&2wHN&i<=qLHsR^V^Aq!k4va8@&GWP$)_DMRGH~FXu>l$6@9W~%0obP7F^7mUdVMY^lF6*H}f9VV5;k|(=n$0mg;H~ zdFZ8%;pJ@6?Y<#8)!c4l`fvR+kDnx_TJ6JaueRS66`5V_=ko$AXGg}@gS+Yl;$%oEvP-+!V z<|Pe9K2#niAX1<^R^f%RazZr@-p7oTtRFNKu9+Qr6N8X>Iw;n%&{c}`=t#@_78@u}@lX>GQ}%$cD$a32 zhOqH798|708Ep0CvyYsQYgJb1Z2A!uN~hofS=x^~0tG5YFWY5@6Ts7=R(j!ebvxQD zjE+Gqct|{-GXm`ZNWcVa9GEo(wx=+wEqFVBAKfOuvL%{rVj=#TfjX8F>z}+k1pD)j(OmoO zAK3m^*;wqM+J3+1fUE{)^Y_8`1z&UZ%esn~qZJy-XrTURiHb~OdT6U9&Eqvzuz#_# z13hv4k>E5~q%&I34RC5S6B_;#Rz_hhvqICki&{LD)wFU}S1h}CB6O242JBq816z30 zQp-9@Sa!$MN}gOVFf`4C8##^B!8kJ-Jz|u;T+SdViT=DzB%#_^Z9AGUl6CJ|SnB7b z%-AE73(ntti25g!VY^pAhRCdU!VIZuDn|2Nzesbp>RJDwJ)!TNcTV@l=3VDScfg_e z4;=j;!Uco~u|Ipggy#a|B^Y0<{+=1SKbo-(&`}g4!};VN7NRLA2y{ZwEhHABUfYVA zi2Mg4(tf4>yd_!SR8z+MTvau{iOQlIiVxDwW`7|z|ccHneSRzedmu}!{2I}sFp)__Qj zb;v$7w3@<`k-g&nG`TQmmAY8xs$rEjhGHL-D56-{e~#fjG*6-=xz1?0T681UfR89k zPbV1LdZ68GAD#6)Lz9)->Aq6ORd2q8wZ>^HFr1a$_LW-N+EadXu2pw*oH3M4^EOa% znr8b|Ywcmx-`^=MJ?Z;CK`MdI@*`vS_k-Cz&e|TcUAk#}B--WN+O+2nq#x#|&T9Bn zoQLjWMjE_=g&+5LG9df=4tpnJHW@oTnV|-L3gIRJ@kijCwjnW?mzoU^zcd~O9@eOn zJmVKpl?IC`KjAOk5tp`e%f|-2lv<7knzK*c-+#6QL#_8wUf`V0tB|P^OKhV(+hVQ< z0Pg4&z&_YIK+6CZxzGwmE5 zL!A*g1lVJ0z#Qx*%927&o2O75?imsGKaxuaYaFW*RXVeRw~KsY*NS19{;K>@O`y>&{1gA2tUkNi6Ak zK!<}!;gPZ8q_P0JPCiSjrN_P>Iu=ui2LQVX0RWyrto&!et&q?{`NM)+W35{i4o`)* znDl*fT9t-y^}<4?)SPj-!Y-;y#wm7!B9r4?N7JMM?~VU9Y$jp8Paag8!UDl%BJD8` zR2y|^8n`?k*gEquFF}BuZli!6Qj!0OK@$TBS{7TFx0IGH==CVq)tok$XA+DFzdk<= z3+0C?xsicF&x#+7+XJ;ApUP-;m1kDKW~Rmc33i@TjtDfAT^4O zXP%_F#35G%pp^Nj=|q0vf)`3z<+$`2hl z9s2w+y*a*KFst2iTdT^A6iM^@PsPrLl%$8_EsL)k#M5!SYOm*w1O1)7pVzw~iXYdx zs@++tI3Bi{!aQc~d-;FoGw9H|qS2wYDO1UEVP{=rA>yF8D!{5j&k)rzvi*QF1Hf#> zt^mq!1U3=&{iBUfp#{Q=nS%HZyWm%;^m~oA7*!(R=lPws&8xtIRjrDmdZXTk&W72B zm0_jU6Ffp6NiZnO2CX8eXWS`#4t0sMMLBcxwBp8%k8A6{Qti`p4MltG2C&jF>LHZaa=l)?qic?zywuHh-MVP0M>Uf7dIQE8-^<(W4uL-A7kR zt<7;4@FD&Th{e^OG|+A4d$-2^`Q`kf*Pq12X#$hY1L3%j+y_LP1QIYHmr zFxQaJJks{#juj3THZ@T{E99}sITK(-%jOB_uxFh@MK<%FDPkBHlosMzeWWb$)Q9VR zSh}P?K_*jJJb+?4te;;D_+#_eiv3hV6>6klo1B>#VVo{@O1<!f|-Yy)~s}+?CZ| z2^DoQ4F5bM)Vhp*K5TMy*mO+HPE**OY1jDh4r*>(=z#i!_K524n+25J{U+B!tweWH zbitk(QDkBwNFh1O;`wPC-f;2#TxpWs%_ZFR8)3s)eeKBJJLPelqdtut4Xo(Fr;E0m zTJv_8?)$?kbODD07r3|F34ulJ|aZUOGlbYh4?z~@KL z(u5F@;StXv+6>2f3U@4?^SDzsSYfChX7~EA zq?gT+cPFFZwdlja9d)|6^Ni4?AjfUCxE)ivIlG8Dx5(d&enqBN$M7WtD^cH0!^oA| zN|X>PN2AVSzyqs}Pn?nsJk=g96 zw0_jDSu9&g4Y zek|`FD7rM*_b!w;4SJYTeXl`1cXbn06ToKQEx3-%PJ)th;)PoYqasFiEgY4JO6dDI zZf)&tS)*bv_j`f)u)JmR)pMBQF{%WggTP{_5@u15_%X4%DO?=~oFxCv;3v_zb5?+~ z{ytU(H2HU9fltcsdk%1V@?&tLd8YH%q+ZaxVLY$~%o+&9^6>Dqv5`ic(8uoa%e3SM zF7V+yV+nlfz4PcEMx12s@SlIx$+0cT`^g2k(`u$MS=B%ThPX>DT?(9K1;Q-L*chEn+ z8V)JGR`c1TZoFkT!eqWwIsX3uML@d0M19HZO&9NyAzU6k|SaGo6YQ8ZNn3LVr$`{`~NM$H2q zR@z3$I8ddn>5uY2TyGBsLIJ|t;^stL9|a8|`sX9r0ddCN&vp>7<$*(1l zf+<5MA$>Rnywv9oBX;P-K8Jr4H!yTUO+&*gV2&x%k4CDw!@S-68~ieP2fss3m|;jE zd5O%bnIRkt9_5c!A45tQhOms8Q^!|xf5tp)_&;M{^8tMS!R7a$Epdj zBCE13>~@x8pC%t6)39quLm(J+@b=GA3z`;Br;Gk+uVwuU!_2E+#jWCR;cnsCVa5du z*$v|e9yqwKGDHHpvZALgF%q z*QrO^AQZ}lb7jeuxpk2qV~?rF*WAi(<&)$m zRi!$!K3R|IaBUSgRzN0SlGRqCTl2+vu7djF4s)oKHUrv_;UxBC1xaiCW!J zy}kNGHCr8h8V)d^d&)pO42oNIZ*?#$;h;Rm3EDwWeG&lWv&syr}_y1-Gd zN@qh6n~N2kahZ#PJFW}P$K@qu^HIhQ7BRwti40M9JngEOkFqvced~{>sePo%2L8K2 zav{(uhHN_Ea1C=w(!My2>nN{N&Uf&11HQTz=WlwX{ncGR`}K+^`|GB>x97PPv)1Cu zHR|fci+idoYo@o{an*{O6648}w``wv%d>mCr)*ok@#4i@TV7c^@0vM#-d?eO+Oq3b zPs=aO7Cs)gqvOU0*Ug?#cO~ecOF$BK0#CS65}VZA^~ra+-$mX{vP;>u+i%R4ST@j1sy-WE83)f9fy>G7 zwQ!)LZr|^ABeREUARo3KLUz$E*%|u)UIf~xR4wf(Wz^D+((R=uO4(9Ko~mGfG)m z&Zlu4?8bj#1SS!*2e9phkP?D&z=Xbm@f_c2V|f_KE6+BKridQXUyQLcO@j`tBa<0T zEz=JHy%=Ej!2Lwg0@W|apR+BgdCB@hgqX~Jhf~y>4th-VzDfp|i`8&Q^+23&)rTRt zuknlZRyi#9$c+4Jzc)rheGQO<@IZ^a2f7KrdJoKpsKa*DBTdtkS4VQ|2l+=r`+k zn0ELc_3IOY$qaQ8E{2oCEVf!42ATyFb%c?bMEM2>hQR6I0mC>igJ6&@RsB)5)CgWY zN|fvNydT8YAP)8>#H(B%l`8}IszV7?Dp$%$`B7p7W3F``6EKw)iKm?|tC~5k8fQU-b(XtJN$TLi%uv%sZ_P(P#7d{Q*yq zmm#Rz8?UCDeM)Oy+om(xc5i91TS^qWeW7BvTkGEI)Hdq9q9bp%8sXw~)=AcJ;>6H2 zxy?FToLSNuy3)EtTpC&}_OQK{K5MVoYu^;w7=F$NFcAzA3Wh=fy~W_yy8>>%OCUPG;Ix(a zoohl?Q4&LeK*T1N*g9>P=BX_M;4d4T+Nf51!)8!Hby$~3{ zU#og6e246?sI~#3?3)(Cp#k!lYLQe+i{*@ku{qjGSMXIn$dPh5s1E@6@$VAN=H!y42MleTH9pds;G_)y3mh zkMd*o@^klXyo8I#*^FF17n@0J@DJ4Ai9iX&N8sg!P#V>e^{O%l%?WKn8$+9N_xpa5 z-0j<){KWT{rhtn*Z8jScZOEQu1T&--NN7Izb&*S*HizS?0eZyV_(O- zZGtuI*UJ$x?03o0TnsT#`B9w?$CyZIZF!E#L{in&dRJ-6?RJq&igLk`9m9Ty0muzaow_O3ClhfyU{@rhsCoNfak0x}3^+q>y0>2$Xi64I~`6lnG|C=IGOv@qIT zN6|oV=bEzlXv!19I-lR`Cp@2sfzy&pq&$fn&gv?2I2uaim^`k`F-d=E4l7(HhvLCV z4uz_i>Ks5|0Dd&Uj}>DXXlNJ+gygupyBl?PedGK=WllRTx_Nw5uGUgB6ng~pL#Bub zsOGqf`guj)PiHIoe43Y`WA@%LZeGv(9}f29X2#vY<-n_2M#xjgQP9lCDuBUYWR@usQQ?R1@6 z>3?+1v^!_8kl)0Ba(}>CL088xQAg`TS)3(VCL6xTdVlCq>!bFA)gJ-*${QATfKEG!95fJ#CxD~Pt3AA%n40P$md1Pw5g4@wVksQ`lq$omJN z&O^lF0Mm3}i}_(QF%K|VHCv)5y8*?=RpRcaY&dLdv=N(61qReNNFHqUggwNgv4>}3 zeBlDkk4U$7Po;?C7u{XptapKW8U$qP>_?5KKRXLbi2Cm@Yvh%je%=INZo-&w#d*KJ z0-2n!61-dmHn`0d)HffdT+!p}?rO)5s5a=3aI#YxjBxX8RHBZ#Jx0wYrQ8Vijc|C> zN00Qrw|@2M`)>Ko+VJASnWKfL4)-0zjlcZymNL7)#AoD|7jmy3+*Ek;{ei+iws!3- zIk5BVBj;biGmcJhIs6K>l2Ndd6p3+xugj=yM!zw5n|QbQmdLFZSC{mP_c`u&zU+TF z_@*d$Z1$31h|xK5uWw_Bqy#?fM-cIa{bo7pmc8MW#bPGjl*@&LK*KaUE;`tXUA1%e zfuTPgq%vin7^Si}s<9f-7AcB5qZH9$qOx0)Mz+LhcQK!z7G40$m9ZVKg@@<_b^=NI_}oMbGViu5j(|H_SSPs|x>lX3jP7 z5%M+6iVaeEysz-gZwntj^XB{j9tVY;UOX1Etr$ww5W62nJcn!4MzwlL;JUzr$}Z1t z<*0I^TA1bSjXh%AODnts`lHY=Ypu@gE>DLmvhdXvzTFadH1GQv|MZsXP6%R|Y9wl;5;dxb8mYucJf@K@^i(`*w5$r%Y*dy&$3e+&*{WookH;+* z`=v7rZ;PqgkFHs&jA}|?ekE>^XxT&^>+w(71=|;kN*d1)V`(26+S%0PP9YEckW7u-`35cpxh6 zDdqgUMYEluusHfBp%QX{wWDTyJ^%Lys!np7&IJMPi&(k10rTfG-@l+iV1R%5&On26)ls4 z9>o*5(PYHhJ8x&M>g!GQ^worHJSey+o=}YdUJy2%Vlz z@0zl$o~_<~Pruh#kzH-jIX7pv*vd8=j@3Z*2LUqJXXU@5P&Y8e@5(-YSFxA zfA(qi2k!$9aI!k4@_}-<#}naG<%}g2(c^SDWTMVTNE_r3Pc<8$I<^-3Ry(oUr`ZYB zog3^!cGk{PnY4ofJ-J^~pabMf)o5sFNnmRtoFL#3ol!;V!z4s{JTb9)A^6V_?53$g z1UbusrvjwX#1Ci%fiIt4No*5bW) zzcOj<%36oR&wz=WvHg;3U;Fvro-Z7`I}yhl7dOg@L_U61Vcw|v^S}JpzMuWave}+e zXOvcjP;2)Skkn>;T`?j&G+w2HhT;Q5UmTzmiRTA~&Z~CX%xk=#*GQCizzM2@b~|uH zqg_Okm&m}-DadvLi6YvG5nq!Ckz^1)GU7d$10VyU+wA~zkU4i@h8T!j`7<9YE26?32>ZI zjzq%#fE>w({TVsZ9QKcrBP8rM$Wcew@0X)sI4b05b=ZHA9EA~x#$x_a7hPmD8c3$1 zA`tKkc1MJ$5&V7xOA#f~8QC5=9yt-=BLhTIed73z@yEt9(s(?+IUcEQf$Ss6ZyPu7 z51#Z?@oYCOEEBuBHD#ccm<>m1z!61NK%a#ELFff|01dc?6aE+20QlhFg&#Ef|E3N! z&f%SS2U!hzAgw55tfss{5tJ*+;M25 zEj)ksw^{=Kq_E)IJ!biLPNO;lCVP=Jz&T;`oVrrhtgx)Hj;yAtz4AQU!Wtp$CvwCS z_S@x%H|)o9R3G-+Sidul=IprR&KtIu(5o{w|RE zqJyL<=pq&9I{rV^?65=@$DOSCx1obU)rK_wJ$*`b>-oF1G1L5-p$`}vj8GJPqK<5~ z!jTs3oMO1Ot|5IN(j0 z^})cv(AU~?L*wjzIv%v4%5>-g5xrg!RAGzou<(??JuAE~48f>rLkz?87qvtiCKo+d z@WtN;um40WK0qq>$tQkFBe|39;uqQ=f%m9sMo^59nTCoD&2C-r9YvqtVDgy)BeBuo zH+n}x9RTP$>Z;Sq0H}bvpvxdZ_YFu})MT0q0_yKo;JxVy&zPUBx?+V_E|+picg&yF z#*<5G13I|u{%7uJZ>aQ!%Py-KJ%icy&6omq0Mj|9pfRLh9k|}|jD@T~cmukYTyI&e ztgT*G^Q_^BS-1*eJKLNA7OWvN$s*E2HmO_5{pvpRe#?>Ekuh(Xe^+I;8!=;n@*b{g zGwQ9{hIZramN%*dBSb!kaHg<6WG;iLfmwZ{ewzMv^iuv^^pCt%Z}b`!TupN7XtkyJ zG5jdmp&ld$4gI5EgBcyi@tZJD=u`A5%!2vcaK`ixv&WTlh8RL zICCUtt&vbesCldtITd125R-(eM!$#m2&D;sa%2)zAy}ywwG|DNyEJe%JJ{e?>v*%y z&r>TaN3vmmN{%!%UF2_o^p~FlYyqrpIP6c#(UJLj|42ZiBNlTB1S5b0QebL^k}pw| zJi_LD6W6SuraW73hGG<$TcOigIxWvyh$W$8bvl>JyW7(+a%3u%yr{muv^23h>2bSx zo=Xx=X!tQ}QIss(!{JU2a|5JSHL2znGwCtoe#pxYkgwG8tX1=546@Cz@zCusBnB4xTV!l_hbEmN+(BL4V_G3slB;OSj;s765{YCXK70KyW)EIppL0|f$~BS63_kN6tv))FEf0H2uEnLJ{AE>P z{EzYpOQ*OFkTV7A^=;tnCq14-9=~3g{2k4{VoAh9Jwx#17Z&C@R$%e6RLC6#@6y#c zuH-Q2`cm-c4}sK4s9*I1K87VEVKp)v=E+@0`lS1%UD9F6gd+p^hicBUux2K?JVZd( zGjhZ=!f(4MVhH<1IVy!En17`L1o&~lCXzsuFan6(3Nk=mP_wT8TfnQ=8#GoiX#8W) zSjDhSp4UF?(9u{|(^h9`X0YKj$jZrf8t78{+70#v#cGFH*qFTxjP+dM1rQqNV{wVr$N1KC$R?|Dw)Pd#R{ z2fz+q8K*Eco*HGmhjA%MPeNgM52v`@Od6HK9%OFab)IT(wbEEMt!gPus$1<@>s_Vv zp-rA!mHW}X$}aSnvc0Om>Q(p4o?}&ifU>pYRj1v5@%+VmqUsCuwfkR6d;*^69+#bi z+uXCVSGw1DU-G=DyzO~g`Ox#BVkx4KQrPd4BNYZ`>Q=?Iq~j~8LD z$3xY}C?#8>c-%_X1Gp62JCwkA-9#@42q{W3B`BAHZ{W>lB9bI;m-}UEi%-bByiKjb zRT!xKvT7EslGR2L#Y)XcgN3G^695-qw9^JyoooRJIxOHoR#<4l<(mQ$C?xS{l_X%i z=pXf`z`}Qd1Z#yO{;UY)ceuC`>pUJ?okz6SA;DAU9vC`)z+LB7O6n-oL?snIP+WrA zWlb(~-;2AbgO2exb`8ApZx3T;+~8S%yhSOb6hJ{rER&&z7k`FN;-2hmKtng@=C7KVW< zM&*{0Tf?cqH-q*^T8R~noB;(n4P{kYoe+f0bsC9vw6qzuQ}vwE+r9QuDB`NKPeYUJ zbI~08N_3@to&7w6R*u)l)8#`eDvOe3#0D15_Rpu-O%GPHAF$leH9#$)?Hn?neB z>L4(c8mObqy~7*7ws+852RDkGin@zz1;^Uhvl9bD#kar5PYk~*S7 zSu15k_`3i-Q?5eo3^3I&tUT;hM*p45G)TseJDH0p$KZD;FU8K^vH=RnBc<$DaS?g+1n}=5mJ~@JkxYuYp+Jg#2iaT6wR1r*4;Fm&jg+*Xnxl zMjbmwFsBgXO!0b8Lzu}j1X3FeEzMRLj+q#w^z}7XOF=bAg0==xFX>4!g*-7Z4E9p2 zcdFP0nNnzcTQOaQ{j@ULmvAI3CR+s*lX)s|i4IyW4qBqYT!Fm=R(8Qzf!r*tzB^cH zNRYOJWdTr8rt1+fsY1uww6bWJ`w1A%X)NHI3+rH3{i(vue|Yv^2e01r!>jf^`_-na zA?RIMc(d?IVJQ^BHsCR@?wQ!Tv+#6b|2~+TjGOS~Pi~~xE@*5v4N?_G<#^3ulz~V6 zaeZ|*bFF8Ue^uayRA=VyfNrhlQ0z$R_x|4p-iz_xq?k!1>f&|DktroJC%G)ynd!+G zUqaXyC=E;w{LcG(Kesc5e-nGx{a)-{$WMJ5;{$3mm=XY>666RD`*m^@6s=Q^qM%e> z7ECopr$I?wROc)MWY|dr9ZWg!iI8PdeVsneH!(v=0C+IUU^Ua9ArEJcWsYZt-8f{HNFjRMfV85vVMs4tW`y$F*8eG z?uEHz$JMOhN{I{#0YXgumrm3JWn`BMf|*H28p4jOgM3@L$2lgZE=W*H1pw05AetpJ zv6{n>U748tzey0xA<3R@2RVWw11LPuhF#SsBq)$EnhYkwdtfqjJWBYmGg5(rdLIan z6;=rw?8+sf3V15N2{wAcYjIWJs2x^X4KR$prix(30Tdt<-B6C^a}%)`on$~~@=#eT zLHHX{D^5U2Ft;r}eQ#gkrNYOHx6WACi~BIREcjNCy>$my-u}a@4?KNM@1(k4TKgX} zN!+4+i|U)^VgGZ0|KC}-s_@!Zg^lcAZhExPUpTaP)25%|hJQZRvzAIA#haFb1g21) z5Or_NL!;QZ#?ieIY`-<}V)VrdW@7B|3gQX7GmB#|Ek_?u#NqWB7+%Q`yB=Rpt_fcw zt&XgT_u*dYz6yAqNc>RZ>58G4lb3G6x5sWtJ`mf1e?}gQJyr2+#XHL1Duyb|@G1}N zBlZ+XS!I2uURfMlmNk??WkUcv!+xtALGhFyK^$&@2%MrvQI(X(W3dRqB>+~$cEjXH zU0LZ4Ey3WXHw{UG7F~yq*{Y-EvdF(XkRQN5Qms{~U@$oAeM6)?u8G=prmD(vmow={2U;g)a5#i;##3T#6f5Fmehe9 zoHz(}5ez0Y&m0iz6wwMMQsYQO-K}(5mN7*MlK(H2prdgUR3ZU7PJ^L{j#~=v5~)5tp2`=Xxw$}`hi5@ z`rBGfM;6CqeiKIWT{f$ZSQt$ ziruHXFMGeTGkYxcT-i(MWA$h1OD+~_{b(ieKZRe1s+0|QI5Vu8s~@O@c}^?C{!r*h z5OT$8-uplaD31n{rNm^iq)lZOHlf!xP;)m35m2g0NA~~J>3QFM)z4dk)?aEyDqCuQUk3??bdKD77h0;#W?>0nvW>1-;TvD z$U$qWwI-(M9I1q{T%SXwR%+B7u+k~8Yp5{gkkM40PKsdStd`QUxE;)#kmV`Q7h!$P zrWGAL;C|r!c8V7)FfKMP5f`K>UI0*78s6ZcMIk1m$6CiK*18;gsJqjKwFD2XBn3z} z1Q|#W0GhRXU_^{dmfWpRZV3>-Nb8@QBjA+ppMg$*A1q^^32%>yiiF*K>_fNbts; zKkB$;PSxV_(0{DDea4-?t@ehql=DY{Z`7~(Mt@i9;jKDkPH;|WIbKed2bYJ0tlTJ1 zlkem1_3z{!^Xmu>hCoeT&q1o&(rCAWtJMPU^?|Z$ zl2UzwUej}WO{M8IJ*SVjUEy?y+Dr@m1`3IxxuNYLHgtrfkZb5O)kvcWm!|(*aP@uC zLJ0mTR(Tdi{xAxGf;Cpt3+y#o^Dw|^m}*vp1T@MZ)mROm3x__^T%AEk&tUOoT9ZJd zzG7YmfR=yLLo_P`WO1;MSQAD^c*%@s!6VNOK1bd2N9U&UlXMA@n^JgwMy!6sxw98s zan@vUthgL%YGG83LnpXBFsd1R^I@bw*in|vD{!y-q?oo1@ zidH3?qs_@3NnL5OE=gLHRmSVB45M2^7IFVo(G zMbMqzu{yS~T2yeSvR&y{PAIGrmNa5Y8Zjk}m{P=UheFJiP>ZSAE(he@AwLwNzwGd4 z&wd;K(RfcI5}nfkl?w0&=HNmnjVWjpNRw#bhEBd@?Vb?=)CMKwl)*;lLJ{5?PsU>w z2@-I&gsBv=Zw6V6SD=&;R+P34)I@2uKag96N}nz&viRT7X(%Cq1RTwZUx52H`5R7_ zGjHG%xt6r^lGCsL=_5sIrX@c488L5g%9f?K{?}B1izr+@Cfqgn-m4!x^1w}PpA-A~ zi{tU?Soh$bX|HxqT6N$Z5(nf6_`nWP*)OPc5&M3Fl@F6*wr#%)heRm4`ST%5n7DKR z@@Z9-jpE?(XSJ<*vlPw$(|#^|MrMw< z4||UK`sJ^5+%E5K-_zVd{;&?3B)d>A)L;q6R0&^OS*M3OJoE8n%L)g#Z}UpL1jP$BIjJ zZFQY-v942!Q+2jD`<-W;oaF3qcEUVv);T~vJt)cd$h4Xglt;T4sxI1*N6Xa%uhDtO z)ONtuqc#5b0!oS%ceQ`}N7)oXWYbNNV!gowGr?4Q9n{#J0-#tB9ChF}zH`t~XGl3{ z?>l>}8t_EF)<)+vIe7qgaTJ3~o=5^S(g_A`td+Ebn_kWRVnV#Sw2+J!*re#4IEs{A zQJaA`>8aWJX3oS-iJRrhMdyCN{%B4~I12Ta`b@0q%JUyGwpA6uY9lBGs)_tVAL!Nt z2i7s6BJUm4wI}-JU>=9**L*JgKyQf3T=i~Q>(94nNhinU#MGQTI!y|ZjrE5 z&rH@&2~S8(&a!R(+1X1JrbX8x%rU~WLnw+i8UwCuS)eprsjD+yNaqBRePq2~(Fa(g ztvIrNyPz{-qfnQG@&&*$8{26*hyD#aEOm8$wOk(v2mo_K;u$K81;m3OID933M=D$D zPuWd2zdad(bWmMot-o$ysB@p+XpjbmR;ne6pp#5SV+1N${eE8{5YihA8W86XKt~`O z6od#xYL#pyuY-xHFRKBi5_T&c_GBsrK|Ufzg8_Shr?zvV@=T>rc}nY)s|6|PL281Faf!AmN*nJ5+ ztTtbPSxm}PT<*WmO4>*)BlxMk&p0 z7z~q7Z&2I-FKJQ@2(zkMDCA1h947m$-5%EqK{SV${vj#jUP=MsXf^EYw<<@i_)*_jy1hy ze@ptxc%~^}&x(>gBE{0FOg4LwsMr;0q+F9!(&G_?=}l6T(saCueW?Pks<W#WaH8xH5jY;zMk_?Vz7Rfv09T|4m?nGE$lUiy^WQYyP8P*@CL*e)F zK7kH}AKo7`oKbzTm{Tpv;RPEsIU{9pg)C)7DCCdWVTN#py^$9o&FYijD#?lz2w`Kr zzmCI@WQAHPzc&$~SIv&_*H%PCF@h`LjX4#dIqg)~MoHNcNy=tq8-fCOSm8)rZ7r=u zgLDa`P=%$9xG@dcW-FEeH@O^M?a_(*;bn^_AbD(n>fEnY>sV>Jv`}KCDg;F+1PW08 z3WC*o`7rhro zhEBePKS0u34`y*`Bs+?MSck?w%jAXWmD!FaEmsOjH>63Kb#Zc8Eh(c})2L{sVEHN4 zVXBM5yBRX@iB53UB@`F!KX%Yn7fHFOWjwLhRaZiB1EZF#frDpMqrI*|u-8Q-dtEI> z>8*9i;)X)=um{SJZqmigsPCIsYGSoN8he2bpicqwG%w_0q0S0G1(0Y4Ym@ru8z^Ys z2n=%pzp=y)NAav;4-E+zct6wHYv&9esSh~)dY$r7;beuqW=bKPi;wD@fYrk1SKYUO zT+=dAIsW%Dhsm0mfIp~<)y%n+{H<{D{<&bIu~8p)xZSq#`0~PC^+~5x#>C^C=xe<++OuhD$jKD?=VPrb{Jbsdz?F#$i>t z1n|%~q1IH3at(it?wZs!Wt~b7?%{9I-ID4l>royqdlYIOwkt0L-wK{kq+9u3U2lrP zI;id|287{+cCl3SCy$?Qpx&rvg}$-K;FZ?(vcs+*JM0PqN_L@i z;JcLrTDz!x_SYxsp9OGqOUV6=Y+%PCt97Yu&uBPOEEar~~&xA4-2!r?&T(sD>SLWEkleROtGNrH?G zWv5+){n*eDtf>K8lbJPdaImoZLb!^XNbSO^s39INFOOYOn2djVMJ7=0rCjC%On_z~ zA%nQzuF@HHFuwC0zI?5=j%EgtJrQ`r{gyE zW?heC7usdmVSW}SAv|jsFqc?G;69FFcpJylVw;HGPy+ssUK9-QJ|W(wy)Z>pbArJb zwb>9vwNYRhy-<8H)WbZ>`?8Kk$214yuvJM=$Mi$NYj>=bmjf&S*$#ML1Dz=UQM>lS z8Av4qeF60RX!u1cH&u3_1heYchhC z6JV%B)?k4L&fiMPdp1?e>bZVqapB?>^K#BafSYoT?|hOk+#hG(&bIv@?%q4RuIfr3 zKKq>8dvChsT-~PI)vlx~$=0zgH`&GlTdoKzU^*Gg2Gatu2pDh(Sb-E;u#-swfnS1g z!$1fkaR@06o(zyOA$Vq-1Og@=#$gCp()X@??lp#oWb%8S@B8PIz3<+qx3$+=dzE)z z3wUrQJT!HQI0Cz(UbsOCCAx##zjuEpPh8bDqp zr3ev+K!!UADem(oC8-#98pRPK!=38%X(ZNY zfkr5~`tXHtyKqSF(jhya)J3Y4C~j6OYe%(XTEqm6YsH<23c95k<{uGge8%sx7DV?f zM+fJ(O2{;Hn;egi?v&(M{Z{d9_z=sD+pM50!hJ5lef~~+>AO=)b?f0F|MS#5jce*& z1e3^c>=NLVV3&jrt;jCa%wGTt(O-~wM4&1-5ze7;z5j|PF*R>Fc_9`~ACtC8j{6Vb67%;C?r ziLPZG%q7RFV|@=9_nRbF-gUijecR2#ZRXo5x`@ly?dTip(-^~xwTpFg<++WEyOq9e z5rfI5mxacKY>{c9d0}Ny=bY|^Ggg`}G;cNDWV*?0U+%lnC&v2L^@$^fHle+@lr6SD zg<*?Dut1m_tCl8n6^{i!a(BgnF@Z<}gAt1)^Xf{A#?lM^_ba65R+k3W1vUhva$pN` ziarhYPfy(3tMrO^>`?;PDOT{_4oLG9r^Z~GD6-;6N@%lMEbZ-h@h9;GbVF@Vu?vMH zybrh{qOnr3)L3dfrBPDHQ{q^Pr5vM3y!$l42fja7jbcA*k&C|6tbimfWclQX7A zf*(7sXOu2KXXc!L;-Lzl&`o(lAIQU6MdS+0Vr|fZNPke*iAlsw9^2S=jN;Ss&Z^q; z%BoD*Em;tOu$q$H=yP%F^ZZIrIH7fSc6D@#z^XAB03y~XH;TH7xe8BQ#2pq~ZhOoc zW{rs+Z8a=(8QNu5X*avVjxe(|;-_2J8zyxIH-aHe&C-J*fUTF7Tdr|PQFdHr?VN=noMqyo=Pp==c|?VEAp7zi>rcf|R( zCp%`W`&2ah(>GTx>r17@aynJswd2||dcrP~-|nz@dq*#5>1JOpEbU*>wfLq_I)k6N zWKK)})hm+QE@*5lbeCG&iz~*nvDx{pQ$N13$D_CQc73V;E;ig7ER0ka0B1*>ejm6B zPiXHzc2|=9LhbpFMZvvJAb=S*PptD zQ+Lu5BTha7p8lv-(!OEwfqf?}76;-yN3G*l%@}@mSpiE%Zti9@C#;99dMkSW$n;>8-PFoxhLZ1P+oU(D_n!qkbel3WqOV2~VhqBgE## zy>3|B(fG-J7dU^UMFNWl`_2#d9X!Uf9S%|E{9`Vj8+duH*e)dK>-nuKwPM)4T(b=J z*yZ|F4XeWX3$<5j$Aq!?UJSGk%SVLYYmJ?lC}BllD7-E)5*P_z8Q2v5tm_W+hVuLV~OJly;El21;VzB5(C2!B1jvZ zr!<2uM&e^}QHVQW^QAER(fBx=+4Ts&<8f>Jg2=0Inf}O^GV1Yozk(l_Dy7R+#Y39o zKZ{w|QpO;C|y zxcd%DIVg)WGVnHOAoZ&o?|+T4y|;X)rO*>~niGkc>t~$#)otgV(b>+<-uDBhd-Ye$ zwtY#uoc3NBiw>Oo)vv!lr*sXTzJK~CJkWQ*aaI%;)o3eS=J^#_9U@1O@yRnLYQ!eU z5g%t*J~QqVZXBW~nY(dhzBksstEfJj0I@7N{3McYA|$A>6p6XGiO8)OZSc`}1Xz#t zg#wYI%DKwmUTXSH9ty@m#{_XP(lP4n>nstm>H)r`#2Bt zA!SQ9ggZnMf^JAgDhGZ=;$~zZ$?|>p!(plnUAe@$+M&G4+$ilQPwe8A;o(Dllr!G< z3UN<_I>6{We|~$JG>zE+jTk9kr@2o1S2A$~xt(SGMEQ7Llx0DVKM87wyH1(gD=(GLkuNY^CSNP>5O&B9>z~j+ zmoujg?u=!YE9&m|Ml!xx;b^2khQrL7f|tLwSb-G^G07Yg%yA2lkSMNmD;I(9EenNN^`czLDOP3gMf&=g1=I(A8O><5?MnWmk%MItWM1l@0hR?>`0

pJuyx6?eWB-cus2K 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 + + + + Test sample + + + + + + + + + +

+ You see a preview of the default HTML sample. +
+ Click me to test the JavaScript functionality. +
+ + + diff --git a/tests/resources/parse_data/all_files_full/json_sample.json b/tests/resources/parse_data/all_files_full/json_sample.json new file mode 100644 index 000000000..c67d526a7 --- /dev/null +++ b/tests/resources/parse_data/all_files_full/json_sample.json @@ -0,0 +1,7 @@ +{ + "content": "This is a sample JSON file", + "metadata": { + "author": "bwook kim", + "date": "2024-08-21" + } +} diff --git a/tests/resources/parse_data/all_files_full/markdown_sample.md b/tests/resources/parse_data/all_files_full/markdown_sample.md new file mode 100644 index 000000000..ce675e282 --- /dev/null +++ b/tests/resources/parse_data/all_files_full/markdown_sample.md @@ -0,0 +1,49 @@ +# Code of Conduct + +## Request from out side + +We, the contributors and maintainers, commit to ensuring that everyone's participation in our project and community is +free from harassment, regardless of age, body size, disability, ethnicity, gender identity and expression, experience +level, education, socioeconomic status, nationality, personal appearance, race, religion, or sexual orientation. This is +done in the spirit of creating a friendly and open environment. + +## Our Standards + +The following are some instances of actions that support the development of a pleasant environment: + +* Speaking in an open and accepting manner* Respecting the opinions and experiences of others* Taking constructive + criticism in stride +* Putting the good of the community first* Demonstrating empathy for other community members + +Example of participant behavior that is undesirable include: + +* Public or private harassment + *The publication of another person's private information, such as a physical or electronic address, without that + person's express consent* The use of sexualized language or imagery and unwanted sexual attention or advances* +Trolling, offensive or derogatory remarks, and personal or political attacks + +## Our Responsibilities + +Project maintainers are expected to take appropriate and equitable remedial action in response to any instances of +undesirable behavior, as well as to clarify the standards of acceptable behavior. + +The right and obligation of project maintainers is to delete, modify, or reject comments, commits, code, wiki edits, +issues, and other contributions that do not follow this code of conduct. They also have the authority to temporarily or +permanently ban any contributor for any other actions they believe to be improper, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the +project or its community. Examples of representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed representative at an online or offline +event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Reports of abusive, harassing, or otherwise inappropriate behavior can be sent to jeffrey@markr.ai' or ' +vkehfdl1@gmail.com, the project team's email address. After each complaint is examined and looked into, a response that +is judged essential and fitting for the situation will be given. The project team has a duty to keep the identity of the +incident reported discreet. Specific enforcement policies may have additional information posted separately. + +Project maintainers may be subject to temporary or permanent consequences, as decided by other project leadership +members, for failing to abide by and enforce the Code of Conduct in good faith. diff --git a/tests/resources/parse_data/all_files_full/xml_sample.xml b/tests/resources/parse_data/all_files_full/xml_sample.xml new file mode 100644 index 000000000..f93831fc4 --- /dev/null +++ b/tests/resources/parse_data/all_files_full/xml_sample.xml @@ -0,0 +1,132 @@ + + + + Gambardella, Matthew + XML Developer's Guide + Computer + 44.95 + 2000-10-01 + An in-depth look at creating applications + with XML. + + + + Ralls, Kim + Midnight Rain + Fantasy + 5.95 + 2000-12-16 + A former architect battles corporate zombies, + an evil sorceress, and her own childhood to become queen + of the world. + + + + Corets, Eva + Maeve Ascendant + Fantasy + 5.95 + 2000-11-17 + After the collapse of a nanotechnology + society in England, the young survivors lay the + foundation for a new society. + + + + Corets, Eva + Oberon's Legacy + Fantasy + 5.95 + 2001-03-10 + In post-apocalypse England, the mysterious + agent known only as Oberon helps to create a new life + for the inhabitants of London. Sequel to Maeve + Ascendant. + + + + Corets, Eva + The Sundered Grail + Fantasy + 5.95 + 2001-09-10 + The two daughters of Maeve, half-sisters, + battle one another for control of England. Sequel to + Oberon's Legacy. + + + + Randall, Cynthia + Lover Birds + Romance + 4.95 + 2000-09-02 + When Carla meets Paul at an ornithology + conference, tempers fly as feathers get ruffled. + + + + Thurman, Paula + Splish Splash + Romance + 4.95 + 2000-11-02 + A deep sea diver finds true love twenty + thousand leagues beneath the sea. + + + + Knorr, Stefan + Creepy Crawlies + Horror + 4.95 + 2000-12-06 + An anthology of horror stories about roaches, + centipedes, scorpions and other insects. + + + + Kress, Peter + Paradox Lost + Science Fiction + 6.95 + 2000-11-02 + After an inadvertant trip through a Heisenberg + Uncertainty Device, James Salway discovers the problems + of being quantum. + + + + O'Brien, Tim + Microsoft .NET: The Programming Bible + Computer + 36.95 + 2000-12-09 + Microsoft's .NET initiative is explored in + detail in this deep programmer's reference. + + + + O'Brien, Tim + MSXML3: A Comprehensive Guide + Computer + 36.95 + 2000-12-01 + The Microsoft MSXML3 parser is covered in + detail, with attention to XML DOM interfaces, XSLT processing, + SAX and more. + + + + Galos, Mike + Visual Studio 7: A Comprehensive Guide + Computer + 49.95 + 2001-04-16 + Microsoft Visual Studio 7 is explored in depth, + looking at how Visual Basic, Visual C++, C#, and ASP+ are + integrated into a comprehensive development + environment. + + + diff --git a/tests/resources/parse_data/config/all_files.yaml b/tests/resources/parse_data/config/all_files.yaml new file mode 100644 index 000000000..f464e3447 --- /dev/null +++ b/tests/resources/parse_data/config/all_files.yaml @@ -0,0 +1,4 @@ +modules: + - module_type: langchain_parse + file_type: all_files + parse_method: directory diff --git a/tests/resources/parse_data/config/lack_full_parse.yaml b/tests/resources/parse_data/config/lack_full_parse.yaml new file mode 100644 index 000000000..7c8930cf6 --- /dev/null +++ b/tests/resources/parse_data/config/lack_full_parse.yaml @@ -0,0 +1,14 @@ +modules: + # PDF + - module_type: langchain_parse + file_type: pdf + parse_method: pdfminer + # CSV + - module_type: langchain_parse + file_type: csv + parse_method: csv + # JSON + - module_type: langchain_parse + file_type: json + parse_method: json + jq_schema: .content diff --git a/tests/resources/parse_data/config/lack_simple_parse.yaml b/tests/resources/parse_data/config/lack_simple_parse.yaml new file mode 100644 index 000000000..2e097e270 --- /dev/null +++ b/tests/resources/parse_data/config/lack_simple_parse.yaml @@ -0,0 +1,5 @@ +modules: + # PDF + - module_type: langchain_parse + file_type: pdf + parse_method: pdfminer diff --git a/tests/resources/parse_data/config/perfect_full_parse.yaml b/tests/resources/parse_data/config/perfect_full_parse.yaml new file mode 100644 index 000000000..180842bc6 --- /dev/null +++ b/tests/resources/parse_data/config/perfect_full_parse.yaml @@ -0,0 +1,26 @@ +modules: + # PDF + - module_type: langchain_parse + file_type: pdf + parse_method: pdfminer + # CSV + - module_type: langchain_parse + file_type: csv + parse_method: csv + # JSON + - module_type: langchain_parse + file_type: json + parse_method: json + jq_schema: .content + # Markdown + - module_type: langchain_parse + file_type: md + parse_method: unstructuredmarkdown + # HTML + - module_type: langchain_parse + file_type: html + parse_method: bshtml + # XML + - module_type: langchain_parse + file_type: xml + parse_method: unstructuredxml diff --git a/tests/resources/parse_data/config/perfect_simple_parse.yaml b/tests/resources/parse_data/config/perfect_simple_parse.yaml new file mode 100644 index 000000000..b6521c2b1 --- /dev/null +++ b/tests/resources/parse_data/config/perfect_simple_parse.yaml @@ -0,0 +1,9 @@ +modules: + # PDF + - module_type: langchain_parse + file_type: pdf + parse_method: pdfminer + # CSV + - module_type: langchain_parse + file_type: csv + parse_method: csv diff --git a/tests/resources/simple_parse.yaml b/tests/resources/simple_parse.yaml index 1d93eb4bc..73ae58aad 100644 --- a/tests/resources/simple_parse.yaml +++ b/tests/resources/simple_parse.yaml @@ -1,3 +1,4 @@ modules: - module_type: langchain_parse - parse_method: [pdfminer, pdfplumber] + file_type: pdf + parse_method: pdfminer