From ceaf20a21f6870dfc57a4b49b13b2212f4cc9329 Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 17 Sep 2024 15:57:39 +0200 Subject: [PATCH 01/83] deleted deprecated auto-release --- .github/workflows/pypi_publish.yml | 39 ------------------------------ 1 file changed, 39 deletions(-) diff --git a/.github/workflows/pypi_publish.yml b/.github/workflows/pypi_publish.yml index 871b7235..68880657 100644 --- a/.github/workflows/pypi_publish.yml +++ b/.github/workflows/pypi_publish.yml @@ -47,42 +47,3 @@ jobs: path: dist/ - name: Publish to PyPI uses: pypa/gh-action-pypi-publish@release/v1 - - github-release: - name: Sign dist with Sigstore and upload to GitHub Release - needs: - - publish-to-pypi - runs-on: ubuntu-latest - permissions: - contents: write - id-token: write - steps: - - name: Download all the dists - uses: actions/download-artifact@v4 - with: - name: python-package-distributions - path: dist/ - - name: Sign the dists with Sigstore - uses: sigstore/gh-action-sigstore-python@v2.1.1 - with: - inputs: >- - ./dist/*.tar.gz - ./dist/*.whl - - name: Create GitHub Release - env: - GITHUB_TOKEN: ${{ github.token }} - run: >- - gh release create - '${{ github.ref_name }}' - --repo '${{ github.repository }}' - --notes "" - - name: Upload artifact signatures to GitHub Release - env: - GITHUB_TOKEN: ${{ github.token }} - # Upload to GitHub Release using the `gh` CLI. - # `dist/` contains the built packages, and the - # sigstore-produced signatures and certificates. - run: >- - gh release upload - '${{ github.ref_name }}' dist/** - --repo '${{ github.repository }}' \ No newline at end of file From e3dac35d06c1408fdf51caadede4f86c1177de6d Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 17 Sep 2024 15:58:02 +0200 Subject: [PATCH 02/83] Removed duplicated tests with pushes after PR --- .github/workflows/test_sftp_handle.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/test_sftp_handle.yml b/.github/workflows/test_sftp_handle.yml index a43a670f..4dd0364d 100644 --- a/.github/workflows/test_sftp_handle.yml +++ b/.github/workflows/test_sftp_handle.yml @@ -1,8 +1,6 @@ name: test_sftp_handle on: - push: - branches: "**" pull_request_target: types: [opened, reopened, synchronize, closed] branches: "**" From 15857e6ede32364d18d17455c87aff17179f8c0e Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 17 Sep 2024 16:02:24 +0200 Subject: [PATCH 03/83] Updated CHANGELOG with actions fixes --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3c719d95..e6d70f45 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.X.Xdev] - 2024-XX-XX : https://github.com/BU-ISCIII/relecov-tools/releases/tag/1.X.X +## [1.2.0dev] - 2024-XX-XX : https://github.com/BU-ISCIII/relecov-tools/releases/tag/1.2.0 ### Credits @@ -20,6 +20,9 @@ Code contributions to the hotfix: #### Removed +- Removed duplicated tests with pushes after PR was merged in test_sftp-handle [#312](https://github.com/BU-ISCIII/relecov-tools/pull/312) +- Deleted deprecated auto-release in pypi_publish as it does not work with tag pushes anymore [#312](https://github.com/BU-ISCIII/relecov-tools/pull/312) + ### Requirements ## [1.1.0] - 2024-09-13 : https://github.com/BU-ISCIII/relecov-tools/releases/tag/1.1.0 From 479a5c2d9f94b5c40bb20b0619c21c8d51c922d8 Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 18 Sep 2024 17:38:57 +0200 Subject: [PATCH 04/83] Introduced a decorator to reconnect when conection is lost --- relecov_tools/sftp_client.py | 41 ++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/relecov_tools/sftp_client.py b/relecov_tools/sftp_client.py index d9de82ca..b44f3c27 100644 --- a/relecov_tools/sftp_client.py +++ b/relecov_tools/sftp_client.py @@ -4,6 +4,7 @@ import rich.console import stat import sys +import time from relecov_tools.config_json import ConfigJson import relecov_tools.utils @@ -58,6 +59,28 @@ def __init__(self, conf_file=None, username=None, password=None): self.client = paramiko.SSHClient() self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) + def reconnect_if_fail(n_times, sleep_time): + def decorator(func): + def retrier(self, *args, **kwargs): + more_sleep_time = sleep_time + retries = 0 + while retries < n_times: + try: + return func(self, *args, **kwargs) + except Exception: + retries += 1 + log.info("Connection lost. Trying to reconnect...") + time.sleep(more_sleep_time) + # Try extending sleep time before reconnecting in each step + more_sleep_time = more_sleep_time + sleep_time + self.open_connection() + else: + log.error("Could not reconnect to remote client") + return func(self, *args, **kwargs) + return retrier + return decorator + + def open_connection(self): """Establishing sftp connection""" log.info("Setting credentials for SFTP connection with remote server") @@ -78,6 +101,7 @@ def open_connection(self): return False return True + @reconnect_if_fail(n_times=3, sleep_time=30) def list_remote_folders(self, folder_name, recursive=False): """Creates a directories list from the given client remote path @@ -90,7 +114,6 @@ def list_remote_folders(self, folder_name, recursive=False): """ log.info("Listing directories in %s", folder_name) directory_list = [] - self.open_connection() try: content_list = self.sftp.listdir_attr(folder_name) subfolders = any(stat.S_ISDIR(item.st_mode) for item in content_list) @@ -129,6 +152,7 @@ def recursive_list(folder_name): self.close_connection() return directory_list + @reconnect_if_fail(n_times=3, sleep_time=30) def get_file_list(self, folder_name): """Return a tuple with file name and directory path from remote @@ -148,6 +172,7 @@ def get_file_list(self, folder_name): ] return file_list + @reconnect_if_fail(n_times=3, sleep_time=30) def get_from_sftp(self, file, destination, exist_ok=False): """Download a file from remote sftp @@ -169,6 +194,7 @@ def get_from_sftp(self, file, destination, exist_ok=False): log.error("Unable to fetch file %s ", e) return False + @reconnect_if_fail(n_times=3, sleep_time=30) def make_dir(self, folder_name): """Create a new directory in remote sftp @@ -186,6 +212,7 @@ def make_dir(self, folder_name): stderr.print("[red]Directory already exists") return False + @reconnect_if_fail(n_times=3, sleep_time=30) def rename_file(self, old_name, new_name): """Rename a file in remote sftp @@ -199,11 +226,13 @@ def rename_file(self, old_name, new_name): try: self.sftp.rename(old_name, new_name) return True - except FileNotFoundError: - log.error("File %s not found", old_name) - stderr.print("[red]File not found") + except FileNotFoundError as e: + error_txt = f"Could not rename {old_name} to {new_name}: {e}" + log.error(error_txt) + stderr.print(f"[red]{error_txt}") return False + @reconnect_if_fail(n_times=3, sleep_time=30) def remove_file(self, file_name): """Remove a file from remote sftp @@ -221,6 +250,7 @@ def remove_file(self, file_name): stderr.print("[red]File not found") return False + @reconnect_if_fail(n_times=3, sleep_time=30) def remove_dir(self, folder_name): """Remove a directory from remote sftp @@ -238,6 +268,7 @@ def remove_dir(self, folder_name): stderr.print("[red]Directory not found") return False + @reconnect_if_fail(n_times=3, sleep_time=30) def upload_file(self, local_path, remote_file): """Upload a file to remote sftp @@ -256,11 +287,13 @@ def upload_file(self, local_path, remote_file): stderr.print("[red]File not found") return False + @reconnect_if_fail(n_times=3, sleep_time=30) def close_connection(self): log.info("Closing SFTP connection") try: self.sftp.close() except NameError: + log.warning("Could not close sftp connection") return False log.info("SFTP connection closed") return True From ea02b5e98800816ade9f9e043212f0224cad9044 Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 18 Sep 2024 17:42:17 +0200 Subject: [PATCH 05/83] Moved cleaning process to end of workflow --- relecov_tools/download_manager.py | 62 +++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 20 deletions(-) diff --git a/relecov_tools/download_manager.py b/relecov_tools/download_manager.py index df770f3a..252bdb72 100755 --- a/relecov_tools/download_manager.py +++ b/relecov_tools/download_manager.py @@ -131,6 +131,7 @@ def __init__( self.relecov_sftp = relecov_tools.sftp_client.SftpRelecov( conf_file, sftp_user, sftp_passwd ) + self.finished_folders = {} def create_local_folder(self, folder): """Create folder to download files in local path using date @@ -267,7 +268,8 @@ def create_files_with_metadata_info( data = {k: v for k, v in data.items() if k not in samples_to_delete} with open(sample_data_path, "w", encoding="utf-8") as fh: fh.write(json.dumps(data, indent=4, sort_keys=True, ensure_ascii=False)) - log.info("Successfully created json file with samples %s", sample_data_path) + # Feed accessible dict with necessary information for wrapper to work + log.info("Successfully created samples json file %s", sample_data_path) return def remove_duplicated_values(self, sample_file_dict): @@ -574,7 +576,7 @@ def delete_remote_files(self, remote_folder, files=None, skip_seqs=False): if any(file.endswith(tuple(self.allowed_file_ext)) for file in files_to_remove): if skip_seqs is True: log_text = f"Folder {remote_folder} has sequencing files. Not removed." - self.include_warning(log_text) + log.warning(log_text) return for file in files_to_remove: try: @@ -583,11 +585,30 @@ def delete_remote_files(self, remote_folder, files=None, skip_seqs=False): ) log.info("%s Deleted from remote server", file) except (IOError, PermissionError) as e: - self.include_warning(f"Could not delete remote file {file}: {e}") + log.error(f"Could not delete remote file {file}: {e}") stderr.print(f"Could not delete remote file {file}. Error: {e}") return - def delete_remote_folder(self, remote_folder): + def rename_remote_folder(self, remote_folder): + if "tmp_processing" in remote_folder: + new_name = remote_folder.replace("tmp_processing", "invalid_samples") + try: + self.relecov_sftp.rename_file(remote_folder, new_name) + if self.finished_folders.get(remote_folder): + self.finished_folders[new_name] = self.finished_folders.pop( + remote_folder + ) + log.info("Successfully renamed %s to %s" % (remote_folder, new_name)) + except (OSError, PermissionError) as e: + log_text = f"Could not rename remote {remote_folder}. Error: {e}" + log.error(log_text) + else: + log.warning( + "No `tmp_processing` pattern in %s, not renamed" % remote_folder + ) + return + + def clean_remote_folder(self, remote_folder): """Delete a folder from remote sftp, check if it is empty or not first. Args: @@ -603,15 +624,16 @@ def remove_client_dir(remote_folder): log.info("Successfully removed %s", remote_folder) except (OSError, PermissionError) as e: log_text = f"Could not delete remote {remote_folder}. Error: {e}" - self.include_warning(log_text) + log.error(log_text) stderr.print(log_text) else: log.info("%s is a top-level folder. Not removed", remote_folder) remote_folder_files = self.relecov_sftp.get_file_list(remote_folder) if remote_folder_files: + self.rename_remote_folder(remote_folder) log_text = f"Remote folder {remote_folder} not empty. Not removed" - self.include_warning(log_text) + log.warning(log_text) else: remove_client_dir(remote_folder) return @@ -715,7 +737,7 @@ def md5_handler(md5sumlist, output_location): if not md5sumlist: error_text = "No md5sum could be found in remote folder %s" stderr.print(f"[yellow]{error_text % folder}") - self.include_warning(error_text) + self.include_warning(error_text % folder) continue folders_with_metadata[folder] = [fi for fi in files if fi not in md5sumlist] try: @@ -1006,7 +1028,7 @@ def process_filedict( processed(dict{str:str}): Updated valid_filedict """ processed_dict = {} - error_text = "md5 mismatch for %s" + error_text = "corrupted or md5 mismatch for %s" warning_text = "File %s not found in md5sum. Creating hash" for sample, vals in valid_filedict.items(): processed_dict[sample] = {} @@ -1028,13 +1050,12 @@ def process_filedict( del processed_dict[sample] return processed_dict - def download(self, target_folders, option="download"): + def download(self, target_folders): """Manages all the different functions to download files, verify their integrity and create initial json with filepaths and md5 hashes Args: target_folders (dict): dictionary - option (str, optional): Download option. Defaults to "download". """ log.info("Initiating download process") main_folder = self.platform_storage_folder @@ -1217,19 +1238,11 @@ def execute_process(self): for folder in processed_folders: self.current_folder = folder self.delete_remote_files(folder) - self.delete_remote_folder(folder) + self.clean_remote_folder(folder) stderr.print(f"Delete process finished in {folder}") else: target_folders, processed_folders = self.merge_subfolders(target_folders) - if self.download_option == "download_only": - self.download(target_folders, option="download") - if self.download_option == "download_clean": - self.download(target_folders, option="clean") - for folder in processed_folders: - self.current_folder = folder - self.delete_remote_files(folder, skip_seqs=True) - self.delete_remote_folder(folder) - stderr.print(f"Delete process finished in {folder}") + self.download(target_folders) self.relecov_sftp.close_connection() stderr.print(f"Processed {len(processed_folders)} folders: {processed_folders}") @@ -1238,5 +1251,14 @@ def execute_process(self): self.logsum.create_error_summary(called_module="download") else: log.info("Process log summary was empty. Not generated.") + # If download_option is "download_clean", remove + # sftp folder content after download is finished + if self.download_option == "download_clean": + folders_to_clean = copy.deepcopy(self.finished_folders) + for folder, downloaded_files in folders_to_clean.items(): + self.delete_remote_files(folder, files=downloaded_files) + self.delete_remote_files(folder, skip_seqs=True) + self.clean_remote_folder(folder) + stderr.print(f"Delete process finished in remote {folder}") stderr.print("Finished execution") return From 5133db8b17e0dd71d230c0f8f72f3efa8ec52553 Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 18 Sep 2024 17:42:32 +0200 Subject: [PATCH 06/83] Now also check for gzip file integrity after download --- relecov_tools/download_manager.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/relecov_tools/download_manager.py b/relecov_tools/download_manager.py index 252bdb72..3c0e00bb 100755 --- a/relecov_tools/download_manager.py +++ b/relecov_tools/download_manager.py @@ -5,6 +5,7 @@ import sys import os import yaml +import time import warnings import rich.console import paramiko @@ -1070,7 +1071,7 @@ def download(self, target_folders): # Close previously open connection to avoid timeouts try: self.relecov_sftp.close_connection() - except paramiko.ssh_exception.NoValidConnectionsError: + except paramiko.SSHException: pass # Check if the connection has been closed due to time limit self.relecov_sftp.open_connection() @@ -1161,10 +1162,13 @@ def download(self, target_folders): clean_fetchlist = [ fi for fi in fetched_files if fi.endswith(tuple(self.allowed_file_ext)) ] - clean_fetchlist = [fi for fi in clean_fetchlist if fi not in corrupted] # Checking for uncompressed files - files_to_compress = [fi for fi in clean_fetchlist if not fi.endswith(".gz")] + files_to_compress = [ + fi + for fi in clean_fetchlist + if not fi.endswith(".gz") and not fi.endswith(".bam") + ] if files_to_compress: comp_files = str(len(files_to_compress)) log.info("Found %s uncompressed files, compressing...", comp_files) @@ -1196,21 +1200,21 @@ def download(self, target_folders): relecov_tools.utils.calculate_md5(path) for path in clean_pathlist ] files_md5_dict = dict(zip(clean_fetchlist, md5_hashes)) - + for file in files_md5_dict.keys(): + full_f_path = os.path.join(local_folder, file) + if not relecov_tools.utils.check_gzip_integrity(full_f_path): + corrupted.append(file) + files_md5_dict.pop(file, None) processed_filedict = self.process_filedict( valid_filedict, clean_fetchlist, corrupted=corrupted, md5miss=not_md5sum ) self.create_files_with_metadata_info( local_folder, processed_filedict, files_md5_dict, meta_file ) - # If download_option is "download_clean", remove - # sftp folder content after download is finished - if option == "clean": - self.delete_remote_files(folder, files=files_to_download) - self.delete_remote_files(folder, skip_seqs=True) - self.delete_remote_folder(folder) - stderr.print(f"Delete process finished in remote {folder}") + if self.logsum.logs.get(self.current_folder): + self.logsum.logs[self.current_folder].update({"path": local_folder}) stderr.print(f"[green]Finished processing {folder}") + self.finished_folders[folder] = clean_fetchlist return def include_new_key(self, sample=None): From f818ae6089b388fd219e11da4bfab7cfdbff2821 Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 18 Sep 2024 17:43:57 +0200 Subject: [PATCH 07/83] black linting --- relecov_tools/download_manager.py | 1 - relecov_tools/sftp_client.py | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/relecov_tools/download_manager.py b/relecov_tools/download_manager.py index 3c0e00bb..89f4c8a5 100755 --- a/relecov_tools/download_manager.py +++ b/relecov_tools/download_manager.py @@ -5,7 +5,6 @@ import sys import os import yaml -import time import warnings import rich.console import paramiko diff --git a/relecov_tools/sftp_client.py b/relecov_tools/sftp_client.py index b44f3c27..0effba50 100644 --- a/relecov_tools/sftp_client.py +++ b/relecov_tools/sftp_client.py @@ -77,9 +77,10 @@ def retrier(self, *args, **kwargs): else: log.error("Could not reconnect to remote client") return func(self, *args, **kwargs) + return retrier - return decorator + return decorator def open_connection(self): """Establishing sftp connection""" From 8c7dfded0c57238f68a968d4f7705f312ff4a1a1 Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 18 Sep 2024 17:47:30 +0200 Subject: [PATCH 08/83] Included changes in CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6d70f45..4126fc4a 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,9 @@ Code contributions to the hotfix: #### Added enhancements +- Now also check for gzip file integrity after download. Moved cleaning process to end of workflow [#313](https://github.com/BU-ISCIII/relecov-tools/pull/313) +- Introduced a decorator in sftp_client.py to reconnect when conection is lost [#313](https://github.com/BU-ISCIII/relecov-tools/pull/313) + #### Fixes #### Changed From 871fa4d6d56cae2c7a7aa74bcc408d3203d67c31 Mon Sep 17 00:00:00 2001 From: "juan.ledesma" Date: Thu, 19 Sep 2024 14:04:15 +0200 Subject: [PATCH 09/83] Included Hospital Universitario Araba among the hospitals in laboratory_address.json --- relecov_tools/conf/laboratory_address.json | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/relecov_tools/conf/laboratory_address.json b/relecov_tools/conf/laboratory_address.json index 4acbf284..5b249689 100755 --- a/relecov_tools/conf/laboratory_address.json +++ b/relecov_tools/conf/laboratory_address.json @@ -972,13 +972,24 @@ "collecting_institution_address": " Jose Atxotegi Kalea, s/n", "collecting_institution_email": "", "geo_loc_state": "Pais Vasco", - "geo_loc_region": "Alava", - "geo_loc_city": "Gasteiz", + "geo_loc_region": "Gasteiz", + "geo_loc_city": "Alava", "geo_loc_country": "Spain", "submitting_institution": "Hospital Universitario Txagorritxu", "submitting_institution_address": " Jose Atxotegi Kalea, s/n", "submitting_institution_email": "" }, + "Hospital Universitario Araba": { + "collecting_institution_address": "Calle Jose Atxotegi, 01009", + "collecting_institution_email": "", + "geo_loc_state": "Pais Vasco", + "geo_loc_region": "Gasteiz", + "geo_loc_city": "Alava", + "geo_loc_country": "Spain", + "submitting_institution": "Hospital Universitario Donostia", + "submitting_institution_address": "Begiristain Doktorea Pasealekua, s/n", + "submitting_institution_email": "" + }, "Hospital Universitari Arnau de Vilanova": { "collecting_institution_address": "Av. Alcalde Rovira Roure, 80", "collecting_institution_email": "", From 3f530d6112bacba36ea05334c0ca8f4529a0606e Mon Sep 17 00:00:00 2001 From: "juan.ledesma" Date: Thu, 19 Sep 2024 15:29:07 +0200 Subject: [PATCH 10/83] Corrected geographical details on Hospital Universitario Araba --- relecov_tools/conf/laboratory_address.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/relecov_tools/conf/laboratory_address.json b/relecov_tools/conf/laboratory_address.json index 5b249689..581c75d5 100755 --- a/relecov_tools/conf/laboratory_address.json +++ b/relecov_tools/conf/laboratory_address.json @@ -972,8 +972,8 @@ "collecting_institution_address": " Jose Atxotegi Kalea, s/n", "collecting_institution_email": "", "geo_loc_state": "Pais Vasco", - "geo_loc_region": "Gasteiz", - "geo_loc_city": "Alava", + "geo_loc_region": "Alava", + "geo_loc_city": "Gasteiz", "geo_loc_country": "Spain", "submitting_institution": "Hospital Universitario Txagorritxu", "submitting_institution_address": " Jose Atxotegi Kalea, s/n", @@ -983,8 +983,8 @@ "collecting_institution_address": "Calle Jose Atxotegi, 01009", "collecting_institution_email": "", "geo_loc_state": "Pais Vasco", - "geo_loc_region": "Gasteiz", - "geo_loc_city": "Alava", + "geo_loc_region": "Alava", + "geo_loc_city": "Gasteiz", "geo_loc_country": "Spain", "submitting_institution": "Hospital Universitario Donostia", "submitting_institution_address": "Begiristain Doktorea Pasealekua, s/n", From e4be6bdbe86acc695ee76dc446d7fc74bb422a1c Mon Sep 17 00:00:00 2001 From: "juan.ledesma" Date: Thu, 19 Sep 2024 15:41:25 +0200 Subject: [PATCH 11/83] Corrected geographical details on Hospital Universitario Araba --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4126fc4a..9bed050c 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,7 @@ Code contributions to the hotfix: #### Changed - Changed pypi_publish action to publish on every release, no need to push tags [#308](https://github.com/BU-ISCIII/relecov-tools/pull/308) +- Included a new hospital (Hospital Universitario Araba) to laboratory_address.json [#315](https://github.com/BU-ISCIII/relecov-tools/pull/315) #### Removed @@ -77,3 +78,4 @@ Code contributions to the inital release: - [Erika Kvalem](https://github.com/ErikaKvalem) - [Alberto Lema](https://github.com/Alema91) - [Daniel Valle](https://github.com/Daniel-VM) +- [Juan Ledesma](https://github.com/juanledesma78) From b8bd9f1dd2606821bc7627a2123c80758de2e071 Mon Sep 17 00:00:00 2001 From: "juan.ledesma" Date: Thu, 19 Sep 2024 15:52:41 +0200 Subject: [PATCH 12/83] Updated CHANGELOG with changes in laboratory_address.json --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bed050c..ba2a5b65 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ### Credits Code contributions to the hotfix: +- [Juan Ledesma](https://github.com/juanledesma78) ### Modules @@ -78,4 +79,3 @@ Code contributions to the inital release: - [Erika Kvalem](https://github.com/ErikaKvalem) - [Alberto Lema](https://github.com/Alema91) - [Daniel Valle](https://github.com/Daniel-VM) -- [Juan Ledesma](https://github.com/juanledesma78) From a41d65a1f626d533c5cf33e71ada70905522a692 Mon Sep 17 00:00:00 2001 From: OPSergio Date: Wed, 25 Sep 2024 12:21:40 +0200 Subject: [PATCH 13/83] =?UTF-8?q?A=C3=B1adido=20Hospital=20Universitari=20?= =?UTF-8?q?Doctor=20Josep=20Trueta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- relecov_tools/conf/laboratory_address.json | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/relecov_tools/conf/laboratory_address.json b/relecov_tools/conf/laboratory_address.json index 581c75d5..45afe509 100755 --- a/relecov_tools/conf/laboratory_address.json +++ b/relecov_tools/conf/laboratory_address.json @@ -561,6 +561,17 @@ "submitting_institution_address": " Passeig de la Vall d'Hebron, 119-129", "submitting_institution_email": "" }, + "Hospital Universitari Doctor Josep Trueta": { + "collecting_institution_address": "Avinguda de França, S/N,", + "collecting_institution_email": "", + "geo_loc_state": "Cataluña", + "geo_loc_region": "Girona", + "geo_loc_city": "Girona", + "geo_loc_country": "Spain", + "submitting_institution": "Hospital Universitari Vall d'Hebron", + "submitting_institution_address": " Passeig de la Vall d'Hebron, 119-129", + "submitting_institution_email": "" + }, "Hospital Universitari Germans Trias i Pujol (HUGTiP)": { "collecting_institution_address": " Crta del Canyet s/n", "collecting_institution_email": "", From 8eab79a652057850522a1182e20452bd36b9a3a2 Mon Sep 17 00:00:00 2001 From: OPSergio Date: Wed, 25 Sep 2024 12:51:52 +0200 Subject: [PATCH 14/83] Add changes in CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index ba2a5b65..c843aa1b 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ Code contributions to the hotfix: - Now also check for gzip file integrity after download. Moved cleaning process to end of workflow [#313](https://github.com/BU-ISCIII/relecov-tools/pull/313) - Introduced a decorator in sftp_client.py to reconnect when conection is lost [#313](https://github.com/BU-ISCIII/relecov-tools/pull/313) +- Add Hospital Universitari Doctor Josep Trueta to laboratory_address.json [#316] (https://github.com/BU-ISCIII/relecov-tools/pull/316) #### Fixes From 3a97cf274eb8c751c06ae6a80397323291c05ca8 Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 19 Sep 2024 11:25:49 +0200 Subject: [PATCH 15/83] Included new fields for bioinformatics results --- relecov_tools/schema/relecov_schema.json | 51 +++++++++++++++++++----- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/relecov_tools/schema/relecov_schema.json b/relecov_tools/schema/relecov_schema.json index 27b9bbe8..bc5b219c 100755 --- a/relecov_tools/schema/relecov_schema.json +++ b/relecov_tools/schema/relecov_schema.json @@ -1794,7 +1794,18 @@ "type": "string", "description": "number of base pairs per read", "classification": "Sequencing", - "label": "Read Length", + "label": "Read length", + "fill_mode": "batch" + }, + "number_of_reads" : { + "examples": [ + "75" + ], + "ontology": "GENEPIO:0000087", + "type": "string", + "description": "number of reads passing base call filters", + "classification": "Sequencing", + "label": "Read count", "fill_mode": "batch" }, "sequence_file_R1_fastq": { @@ -2346,7 +2357,7 @@ "type": "string", "description": "Percentage of read that pass quality control threshold ", "classification": "Bioinformatics and QC metrics fields", - "label": "%qc filtered", + "label": "%QC filtered", "fill_mode": "batch" }, "per_reads_host": { @@ -2357,7 +2368,7 @@ "type": "string", "description": "Percentage of reads mapped to host", "classification": "Bioinformatics and QC metrics fields", - "label": "%reads host", + "label": "%Reads host", "fill_mode": "batch" }, "per_reads_virus": { @@ -2368,7 +2379,7 @@ "type": "string", "description": "Percentage of reads mapped to virus", "classification": "Bioinformatics and QC metrics fields", - "label": "%reads virus", + "label": "%Reads virus", "fill_mode": "batch" }, "per_unmapped": { @@ -2379,7 +2390,7 @@ "type": "string", "description": "Percentage of reads unmapped to virus or to host", "classification": "Bioinformatics and QC metrics fields", - "label": "%unmapped", + "label": "%Unmapped", "fill_mode": "batch" }, "depth_of_coverage_value": { @@ -2390,7 +2401,7 @@ "type": "string", "description": "The average number of reads representing a given nucleotide in the reconstructed sequence.", "classification": "Bioinformatics and QC metrics fields", - "label": "Depth of coverage value ", + "label": "Depth of coverage Mean value", "fill_mode": "batch" }, "per_genome_greater_10x": { @@ -2401,7 +2412,7 @@ "type": "string", "description": "Percentage of genome with coverage greater than 10x", "classification": "Bioinformatics and QC metrics fields", - "label": "% genome greater 10x", + "label": "% Genome > 10x", "fill_mode": "batch" }, "per_Ns": { @@ -2434,7 +2445,7 @@ "type": "string", "description": "The number of variants found in consensus sequence", "classification": "Bioinformatic Variants", - "label": "Number of variants (AF greater 75%)", + "label": "Number of variants (AF > 75%)", "fill_mode": "batch" }, "number_of_variants_with_effect": { @@ -2467,7 +2478,7 @@ "type": "string", "description": "The name of the clade.", "classification": "Lineage fields", - "label": "Clade designation", + "label": "Variant Clade Genotype", "fill_mode": "batch" }, "clade_type_software_name": { @@ -2492,6 +2503,16 @@ "label": "If Clade/Type Is Other, Specify", "fill_mode": "batch" }, + "clade_type_software_version": { + "examples": [ + "Pangolin" + ], + "ontology": "GENEPIO:0001502", + "type": "string", + "description": "The version of the software used to determine the clade/type.", + "classification": "Lineage fields", + "label": "Clade/Type software version" + }, "lineage_analysis_software_name": { "examples": [ "Pangolin" @@ -2544,7 +2565,7 @@ "type": "string", "description": "The version of the scorpio data used to determine the lineage/clade.", "classification": "Lineage fields", - "label": "Lineage/clade analysis software version", + "label": "Scorpio version", "fill_mode": "batch" }, "lineage_analysis_constellation_version": { @@ -2555,7 +2576,7 @@ "type": "string", "description": "The version of the constellations databases used to determine the lineage/clade.", "classification": "Lineage fields", - "label": "Lineage/clade analysis software version", + "label": "Constellations version", "fill_mode": "batch" }, "lineage_analysis_date": { @@ -2570,6 +2591,14 @@ "label": "lineage/clade analysis date", "fill_mode": "batch" }, + "lineage_analysis_file": { + "ontology": "0", + "type": "string", + "description": "File containing results from lineage/clade analysis", + "classification": "Lineage fields", + "label": "Lineage analysis file", + "fill_mode": "batch" + }, "variant_name": { "ontology": "", "type": "string", From 473ef013029b550d054e43b1257b023347610f05 Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 19 Sep 2024 12:12:41 +0200 Subject: [PATCH 16/83] Renamed bioinfo_heading field for alt_heading_equivalences --- relecov_tools/conf/configuration.json | 58 ++++++++++----------------- 1 file changed, 22 insertions(+), 36 deletions(-) diff --git a/relecov_tools/conf/configuration.json b/relecov_tools/conf/configuration.json index 724811e1..46b2efb9 100755 --- a/relecov_tools/conf/configuration.json +++ b/relecov_tools/conf/configuration.json @@ -56,42 +56,28 @@ "Sequence file R1 fastq", "Sequence file R2 fastq" ], - "bioinfo_heading": [ - "Consensus sequence filename", - "VCF filename", - "Variant designation table filename", - "Bioinformatics protocol", - "If bioinformatics protocol Is Other, Specify", - "Bioinformatics protocol version", - "Commercial/Open-source/both", - "Preprocessing software", - "Preprocessing software version", - "If preprocessing Is Other, Specify", - "Preprocessing params", - "Mapping software", - "Mapping software version", - "If mapping Is Other, Specify", - "Mapping params", - "Assembly software", - "Assembly software version", - "If assembly Is Other, Specify", - "Assembly params", - "Variant calling software", - "Variant calling software version", - "If variant calling Is Other, Specify", - "Variant calling params", - "Consensus software", - "Consensus software version", - "If consensus Is Other, Specify", - "Consensus params", - "Clade/Type identification software", - "Clade/Type software version", - "If Clade/Type Is Other, Specify", - "Lineage identification software", - "Lineage software version", - "If lineage identification Is Other, Specify", - "Quality control metrics (sample discard criteria)" - ], + "alt_heading_equivalences": { + "Sample ID": "Sample ID given for sequencing", + "LAB ID" : "Originating Laboratory", + "Sequencing date\n Formato: YYYY-MM-DD" : "Sequencing Date", + "Commercial All-in-one library kit" : "Commercial All-in-one library kit", + "Library preparation kit " : "Library Preparation Kit", + "Enrichment protocol" : "Enrichment Protocol", + "if enrichment protocol is Other, specify" : "If Enrichment Protocol Is Other, Specify", + "Amplicon protocol" : "Enrichment panel/assay", + "if enrichment panel/assay is Other, specify" : "If Enrichment panel/assay Is Other, Specify", + "Amplicon version" : "Enrichment panel/assay version", + "Number Of Samples In Run" : "Number Of Samples In Run", + "Number of variants with effect (missense, frameshit, stop codon)" : "Number of variants with effect", + "Sequencing platforms (Illumina, Nanopore, IonTorrent, PacBio, other)" : "Sequencing Instrument Model", + "Variant designation table filename" : "Lineage analysis file", + "Library preparation kit" : "Library Preparation Kit", + "Library layout" : "Library Layout", + "Variant Clade Genotype" : "clade_name", + "SARS-CoV-2 Lineage designation" : "Lineage designation", + "fastq filename R1" : "Sequence file R1 fastq", + "fastq filename R2" : "Sequence file R2 fastq" + }, "lab_metadata_req_json": { "laboratory_data": { "file": "laboratory_address.json", From bdf693142ff959e5d1d0cd077b3e8121b4430d6f Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 19 Sep 2024 12:13:09 +0200 Subject: [PATCH 17/83] Included fields to support alternative header in metadata --- relecov_tools/conf/configuration.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/relecov_tools/conf/configuration.json b/relecov_tools/conf/configuration.json index 46b2efb9..97e257a4 100755 --- a/relecov_tools/conf/configuration.json +++ b/relecov_tools/conf/configuration.json @@ -226,8 +226,12 @@ "sftp_port": "22" }, "metadata_processing": { + "sample_id_col": "Sample ID given for sequencing", "header_flag": "CAMPO", - "excel_sheet": "METADATA_LAB" + "excel_sheet": "METADATA_LAB", + "alternative_sheet": "5.Viral Characterisation and Se", + "alternative_flag": "LAB ID", + "alternative_sample_id_col": "Sample ID" }, "abort_if_md5_mismatch": "False", "platform_storage_folder": "/tmp/relecov", From 2d4935d16ff35df81e3b9369e7be465bbb634946 Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 19 Sep 2024 13:37:33 +0200 Subject: [PATCH 18/83] Updated alt_heading_equivalences new field --- relecov_tools/conf/configuration.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relecov_tools/conf/configuration.json b/relecov_tools/conf/configuration.json index 97e257a4..af2081e4 100755 --- a/relecov_tools/conf/configuration.json +++ b/relecov_tools/conf/configuration.json @@ -73,7 +73,7 @@ "Variant designation table filename" : "Lineage analysis file", "Library preparation kit" : "Library Preparation Kit", "Library layout" : "Library Layout", - "Variant Clade Genotype" : "clade_name", + "Read lenght" : "Read length", "SARS-CoV-2 Lineage designation" : "Lineage designation", "fastq filename R1" : "Sequence file R1 fastq", "fastq filename R2" : "Sequence file R2 fastq" From db7765fb796a78491928d4133939f8c3c5586445 Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 19 Sep 2024 13:38:36 +0200 Subject: [PATCH 19/83] Introduced a function to parse excel date back to numeric --- relecov_tools/utils.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/relecov_tools/utils.py b/relecov_tools/utils.py index 0636e4fb..c3ef2c8e 100755 --- a/relecov_tools/utils.py +++ b/relecov_tools/utils.py @@ -91,6 +91,12 @@ def read_excel_file(f_name, sheet_name, header_flag, leave_empty=True): return ws_data, heading_row +def excel_date_to_num(date): + """Transform a date object formatted by excel to a numeric value""" + try: + return date.toordinal() - datetime(1899,12,30).toordinal() + except AttributeError: + return None def read_csv_file_return_dict(file_name, sep=None, key_position=None): """Read csv or tsv file, according to separator, and return a dictionary From e52964942ebc9f18530ac9cdb743aadb2167e954 Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 19 Sep 2024 13:50:08 +0200 Subject: [PATCH 20/83] samples_data file is no longer a mandatory input --- relecov_tools/read_lab_metadata.py | 87 +++++++++++++++++++++++++----- 1 file changed, 75 insertions(+), 12 deletions(-) diff --git a/relecov_tools/read_lab_metadata.py b/relecov_tools/read_lab_metadata.py index 2d4efbda..12e4d6a2 100755 --- a/relecov_tools/read_lab_metadata.py +++ b/relecov_tools/read_lab_metadata.py @@ -37,18 +37,15 @@ def __init__(self, metadata_file=None, sample_list_file=None, output_folder=None sys.exit(1) if sample_list_file is None: - self.sample_list_file = relecov_tools.utils.prompt_path( - msg="Select the file which contains the sample information" - ) - else: + stderr.print("[Yellow]No samples_data.json file provided") self.sample_list_file = sample_list_file - if not os.path.exists(self.sample_list_file): + if sample_list_file is not None and not os.path.exists(sample_list_file): log.error( - "Sample information file %s does not exist ", self.sample_list_file + "Sample information file %s does not exist ", sample_list_file ) stderr.print( - "[red] Sample information " + self.sample_list_file + " does not exist" + "[red] Samples file " + sample_list_file + " does not exist" ) sys.exit(1) @@ -97,6 +94,64 @@ def __init__(self, metadata_file=None, sample_list_file=None, output_folder=None "lab_metadata", "samples_json_fields" ) + def get_samples_files_data(self, clean_metadata_rows): + """Include the fields that would be included in samples_data.json + + Args: + clean_metadata_rows (list(dict)): Cleaned list of rows from metadata_lab.xlsx file + + Returns: + j_data (dict(dict)): Dictionary where each key is the sample ID and the values are + its file names, locations and md5 + """ + def safely_calculate_md5(file): + """Check file md5, but return Not Provided if file does not exist""" + try: + return relecov_tools.utils.calculate_md5(file) + except IOError: + return "Not Provided [GENEPIO:0001668]" + dir_path = os.path.dirname(os.path.realpath(self.metadata_file)) + md5_checksum_files = [f for f in os.listdir(dir_path) if "md5" in f] + if md5_checksum_files: + skip_list = self.configuration.get_topic_data("sftp_handle", "skip_when_found") + md5_dict = relecov_tools.utils.read_md5_checksum( + file_name=md5_checksum_files[0], avoid_chars=skip_list + ) + else: + md5_dict = {} + j_data = {} + no_fastq_error = "No R1 fastq was given for sample %s" + for sample in clean_metadata_rows: + files_dict = {} + r1_file = sample.get("sequence_file_R1_fastq") + r2_file = sample.get("sequence_file_R2_fastq") + if not r1_file: + self.logsum.add_error( + sample=sample.get("sequencing_sample_id"), + entry=no_fastq_error % sample.get("sequencing_sample_id") + ) + j_data[str(sample.get("sequencing_sample_id"))] = files_dict + continue + r1_md5 = md5_dict.get(r1_file) + r2_md5 = md5_dict.get(r2_file) + files_dict["r1_fastq_filepath"] = dir_path + if r1_md5: + files_dict["fastq_r1_md5"] = r1_md5 + else: + files_dict["fastq_r1_md5"] = safely_calculate_md5( + os.path.join(dir_path, r1_file) + ) + if r2_file: + files_dict["r2_fastq_filepath"] = dir_path + if r2_md5: + files_dict["fastq_r2_md5"] = r2_md5 + else: + files_dict["fastq_r2_md5"] = safely_calculate_md5( + os.path.join(dir_path, r2_file) + ) + j_data[str(sample.get("sequencing_sample_id"))] = files_dict + return j_data + def match_to_json(self, valid_metadata_rows): """Keep only the rows from samples present in the input file samples.json @@ -104,12 +159,17 @@ def match_to_json(self, valid_metadata_rows): valid_metadata_rows (list(dict)): List of rows from metadata_lab.xlsx file Returns: - clean_metadata_rows(list(dict)): _description_ - missing_samples(list(str)): + clean_metadata_rows(list(dict)): List of rows matching the samples in samples_data.json + missing_samples(list(str)): List of samples not found in samples_data.json """ - samples_json = relecov_tools.utils.read_json_file(self.sample_list_file) - clean_metadata_rows = [] missing_samples = [] + if not self.sample_list_file: + logtxt = "samples_data.json not provided, all samples will be included" + self.logsum.add_warning(entry=logtxt) + return valid_metadata_rows, missing_samples + else: + samples_json = relecov_tools.utils.read_json_file(self.sample_list_file) + clean_metadata_rows = [] for row in valid_metadata_rows: sample_id = str(row["sequencing_sample_id"]).strip() self.logsum.feed_key(sample=sample_id) @@ -251,7 +311,10 @@ def adding_fields(self, metadata): # TODO: Change sequencing_sample_id for some unique ID used in RELECOV database s_json["map_field"] = "sequencing_sample_id" s_json["adding_fields"] = self.samples_json_fields - s_json["j_data"] = relecov_tools.utils.read_json_file(self.sample_list_file) + if self.sample_list_file: + s_json["j_data"] = relecov_tools.utils.read_json_file(self.sample_list_file) + else: + s_json["j_data"] = self.get_samples_files_data(metadata) metadata = self.process_from_json(metadata, s_json) stderr.print("[green]Processed sample data file.") return metadata From e41be35628d552f3077adbd68185ab5d713c44f9 Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 19 Sep 2024 13:52:15 +0200 Subject: [PATCH 21/83] Included a handling of alternative column names, also handled unexpected date cells --- relecov_tools/read_lab_metadata.py | 36 ++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/relecov_tools/read_lab_metadata.py b/relecov_tools/read_lab_metadata.py index 12e4d6a2..d5980bf6 100755 --- a/relecov_tools/read_lab_metadata.py +++ b/relecov_tools/read_lab_metadata.py @@ -338,8 +338,24 @@ def read_metadata_file(self): """ meta_sheet = self.metadata_processing.get("excel_sheet") header_flag = self.metadata_processing.get("header_flag") - ws_metadata_lab, heading_row_number = relecov_tools.utils.read_excel_file( - self.metadata_file, meta_sheet, header_flag, leave_empty=False + sample_id_col = self.metadata_processing.get("sample_id_col") + self.alternative_heading = False + try: + ws_metadata_lab, heading_row_number = relecov_tools.utils.read_excel_file( + self.metadata_file, meta_sheet, header_flag, leave_empty=False + ) + except KeyError: + self.alternative_heading = True + alt_sheet = self.metadata_processing.get("alternative_sheet") + header_flag = self.metadata_processing.get("alternative_flag") + sample_id_col = self.metadata_processing.get("alternative_sample_id_col") + logtxt = f"No excel sheet named {meta_sheet}. Using {alt_sheet}" + stderr.print(f"[yellow]{logtxt}") + ws_metadata_lab, heading_row_number = relecov_tools.utils.read_excel_file( + self.metadata_file, alt_sheet, header_flag, leave_empty=False + ) + alt_header_dict = self.configuration.get_topic_data( + "lab_metadata", "alt_heading_equivalences" ) valid_metadata_rows = [] row_number = heading_row_number @@ -347,7 +363,7 @@ def read_metadata_file(self): row_number += 1 property_row = {} try: - sample_id = str(row["Sample ID given for sequencing"]).strip() + sample_id = str(row[sample_id_col]).strip() except KeyError: log_text = f"Sample ID given for sequencing empty in row {row_number}" log.error(log_text) @@ -384,16 +400,28 @@ def read_metadata_file(self): else: if isinstance(row[key], float) or isinstance(row[key], int): row[key] = str(row[key]) + if not "date" in key.lower() and isinstance(row[key], dtime): + logtxt = f"Non-date field {key} provided as date. Parsed as int" + self.logsum.add_warning(sample=sample_id, entry=logtxt) + row[key] = str(relecov_tools.utils.excel_date_to_num(row[key])) + if self.alternative_heading: + alt_key = alt_header_dict.get(key) if row[key] is not None or "not provided" not in str(row[key]).lower(): try: property_row[self.label_prop_dict[key]] = row[key] except KeyError as e: + if self.alternative_heading: + try: + property_row[self.label_prop_dict[alt_key]] = row[key] + continue + except KeyError: + pass log_text = f"Error when mapping the label {str(e)}" self.logsum.add_error(sample=sample_id, entry=log_text) stderr.print(f"[red]{log_text}") continue - valid_metadata_rows.append(property_row) + return valid_metadata_rows def create_metadata_json(self): From 339cc6711f9939b42992f9f68720424f25e02019 Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 19 Sep 2024 13:53:05 +0200 Subject: [PATCH 22/83] samples_data file no longer mandatory, handling alternative column names --- relecov_tools/read_lab_metadata.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/relecov_tools/read_lab_metadata.py b/relecov_tools/read_lab_metadata.py index d5980bf6..27924201 100755 --- a/relecov_tools/read_lab_metadata.py +++ b/relecov_tools/read_lab_metadata.py @@ -41,12 +41,8 @@ def __init__(self, metadata_file=None, sample_list_file=None, output_folder=None self.sample_list_file = sample_list_file if sample_list_file is not None and not os.path.exists(sample_list_file): - log.error( - "Sample information file %s does not exist ", sample_list_file - ) - stderr.print( - "[red] Samples file " + sample_list_file + " does not exist" - ) + log.error("Sample information file %s does not exist ", sample_list_file) + stderr.print("[red] Samples file " + sample_list_file + " does not exist") sys.exit(1) if output_folder is None: @@ -104,16 +100,20 @@ def get_samples_files_data(self, clean_metadata_rows): j_data (dict(dict)): Dictionary where each key is the sample ID and the values are its file names, locations and md5 """ + def safely_calculate_md5(file): """Check file md5, but return Not Provided if file does not exist""" try: return relecov_tools.utils.calculate_md5(file) except IOError: return "Not Provided [GENEPIO:0001668]" + dir_path = os.path.dirname(os.path.realpath(self.metadata_file)) md5_checksum_files = [f for f in os.listdir(dir_path) if "md5" in f] if md5_checksum_files: - skip_list = self.configuration.get_topic_data("sftp_handle", "skip_when_found") + skip_list = self.configuration.get_topic_data( + "sftp_handle", "skip_when_found" + ) md5_dict = relecov_tools.utils.read_md5_checksum( file_name=md5_checksum_files[0], avoid_chars=skip_list ) @@ -128,7 +128,7 @@ def safely_calculate_md5(file): if not r1_file: self.logsum.add_error( sample=sample.get("sequencing_sample_id"), - entry=no_fastq_error % sample.get("sequencing_sample_id") + entry=no_fastq_error % sample.get("sequencing_sample_id"), ) j_data[str(sample.get("sequencing_sample_id"))] = files_dict continue @@ -147,8 +147,8 @@ def safely_calculate_md5(file): files_dict["fastq_r2_md5"] = r2_md5 else: files_dict["fastq_r2_md5"] = safely_calculate_md5( - os.path.join(dir_path, r2_file) - ) + os.path.join(dir_path, r2_file) + ) j_data[str(sample.get("sequencing_sample_id"))] = files_dict return j_data @@ -404,7 +404,7 @@ def read_metadata_file(self): logtxt = f"Non-date field {key} provided as date. Parsed as int" self.logsum.add_warning(sample=sample_id, entry=logtxt) row[key] = str(relecov_tools.utils.excel_date_to_num(row[key])) - if self.alternative_heading: + if self.alternative_heading: alt_key = alt_header_dict.get(key) if row[key] is not None or "not provided" not in str(row[key]).lower(): try: From 4b093d36ab041ae46d9d7a462464854273e199f5 Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 19 Sep 2024 14:05:44 +0200 Subject: [PATCH 23/83] Updated CHANGELOG --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c843aa1b..3e8717fe 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,11 +18,16 @@ Code contributions to the hotfix: - Now also check for gzip file integrity after download. Moved cleaning process to end of workflow [#313](https://github.com/BU-ISCIII/relecov-tools/pull/313) - Introduced a decorator in sftp_client.py to reconnect when conection is lost [#313](https://github.com/BU-ISCIII/relecov-tools/pull/313) - Add Hospital Universitari Doctor Josep Trueta to laboratory_address.json [#316] (https://github.com/BU-ISCIII/relecov-tools/pull/316) +- samples_data json file is no longer mandatory as input in read-lab-metadata [#314](https://github.com/BU-ISCIII/relecov-tools/pull/314) +- Included handling of alternative column names to support two distinct headers using the same schema in read-lab-metadata [#314](https://github.com/BU-ISCIII/relecov-tools/pull/314) #### Fixes #### Changed +- Renamed and refactored "bioinfo_lab_heading" for "alt_header_equivalences" in configuration.json [#314](https://github.com/BU-ISCIII/relecov-tools/pull/314) +- Included a few schema fields that were missing or outdated, related to bioinformatics results [#314](https://github.com/BU-ISCIII/relecov-tools/pull/314) + #### Removed - Removed duplicated tests with pushes after PR was merged in test_sftp-handle [#312](https://github.com/BU-ISCIII/relecov-tools/pull/312) From 56bb2f155492aa3751feabd486d0ec35234ea01b Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 19 Sep 2024 14:07:32 +0200 Subject: [PATCH 24/83] Updated read-lab-metadata. Linting --- relecov_tools/read_lab_metadata.py | 2 +- relecov_tools/utils.py | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/relecov_tools/read_lab_metadata.py b/relecov_tools/read_lab_metadata.py index 27924201..810ac3d0 100755 --- a/relecov_tools/read_lab_metadata.py +++ b/relecov_tools/read_lab_metadata.py @@ -400,7 +400,7 @@ def read_metadata_file(self): else: if isinstance(row[key], float) or isinstance(row[key], int): row[key] = str(row[key]) - if not "date" in key.lower() and isinstance(row[key], dtime): + if "date" not in key.lower() and isinstance(row[key], dtime): logtxt = f"Non-date field {key} provided as date. Parsed as int" self.logsum.add_warning(sample=sample_id, entry=logtxt) row[key] = str(relecov_tools.utils.excel_date_to_num(row[key])) diff --git a/relecov_tools/utils.py b/relecov_tools/utils.py index c3ef2c8e..90af3d5f 100755 --- a/relecov_tools/utils.py +++ b/relecov_tools/utils.py @@ -91,13 +91,15 @@ def read_excel_file(f_name, sheet_name, header_flag, leave_empty=True): return ws_data, heading_row + def excel_date_to_num(date): """Transform a date object formatted by excel to a numeric value""" try: - return date.toordinal() - datetime(1899,12,30).toordinal() + return date.toordinal() - datetime(1899, 12, 30).toordinal() except AttributeError: return None + def read_csv_file_return_dict(file_name, sep=None, key_position=None): """Read csv or tsv file, according to separator, and return a dictionary where the main key is the first column, if key position is None otherwise From e42a7927bb8f9a47fab860166df488cfe6d6030c Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 19 Sep 2024 14:11:50 +0200 Subject: [PATCH 25/83] Updated read-lab-metadata. Linting2 --- relecov_tools/read_lab_metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relecov_tools/read_lab_metadata.py b/relecov_tools/read_lab_metadata.py index 810ac3d0..3431c189 100755 --- a/relecov_tools/read_lab_metadata.py +++ b/relecov_tools/read_lab_metadata.py @@ -38,7 +38,7 @@ def __init__(self, metadata_file=None, sample_list_file=None, output_folder=None if sample_list_file is None: stderr.print("[Yellow]No samples_data.json file provided") - self.sample_list_file = sample_list_file + self.sample_list_file = sample_list_file if sample_list_file is not None and not os.path.exists(sample_list_file): log.error("Sample information file %s does not exist ", sample_list_file) From b14910df8a397bcba04a19232d3cdc54b48bf105 Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 19 Sep 2024 15:38:18 +0200 Subject: [PATCH 26/83] Updated relecov_schema version --- relecov_tools/schema/relecov_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relecov_tools/schema/relecov_schema.json b/relecov_tools/schema/relecov_schema.json index bc5b219c..bc605d45 100755 --- a/relecov_tools/schema/relecov_schema.json +++ b/relecov_tools/schema/relecov_schema.json @@ -3,7 +3,7 @@ "id": "https://github.com/BU-ISCIII/relecov-tools/blob/develop/relecov_tools/schema/relecov_schema.json", "title": "RELECOV schema", "description":"Json schema that specifies the structure, content, and validation rules for RELECOV metadata", - "version": "2.0.0", + "version": "2.1.0", "required": [ "collecting_lab_sample_id", "sequencing_sample_id", From 6fed93414d6396dac88c52e5ba9d5e56efd67d78 Mon Sep 17 00:00:00 2001 From: Shettland Date: Fri, 20 Sep 2024 12:54:53 +0200 Subject: [PATCH 27/83] merged changes --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3e8717fe..ce3a4816 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.2.0dev] - 2024-XX-XX : https://github.com/BU-ISCIII/relecov-tools/releases/tag/1.2.0 +## [1.2.0] - 2024-09-19 : https://github.com/BU-ISCIII/relecov-tools/releases/tag/1.2.0 ### Credits @@ -39,7 +39,7 @@ Code contributions to the hotfix: ### Credits -Code contributions to the hotfix: +Code contributions to the release: - [Pablo Mata](https://github.com/Shettland) - [Sara Monzón](https://github.com/saramonzon) From bfdc63c4a6d34932b5ff75916e818cc27caac314 Mon Sep 17 00:00:00 2001 From: Shettland Date: Fri, 20 Sep 2024 12:56:14 +0200 Subject: [PATCH 28/83] changelog hotfix --- CHANGELOG.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ce3a4816..12cfec88 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,14 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.2.0] - 2024-09-19 : https://github.com/BU-ISCIII/relecov-tools/releases/tag/1.2.0 +## [1.2.0] - 2024-09-XX : https://github.com/BU-ISCIII/relecov-tools/releases/tag/1.2.0 ### Credits -Code contributions to the hotfix: +Code contributions to the release: + - [Juan Ledesma](https://github.com/juanledesma78) +- [Pablo Mata](https://github.com/Shettland) ### Modules @@ -20,6 +22,7 @@ Code contributions to the hotfix: - Add Hospital Universitari Doctor Josep Trueta to laboratory_address.json [#316] (https://github.com/BU-ISCIII/relecov-tools/pull/316) - samples_data json file is no longer mandatory as input in read-lab-metadata [#314](https://github.com/BU-ISCIII/relecov-tools/pull/314) - Included handling of alternative column names to support two distinct headers using the same schema in read-lab-metadata [#314](https://github.com/BU-ISCIII/relecov-tools/pull/314) +- Included a new hospital (Hospital Universitario Araba) to laboratory_address.json [#315](https://github.com/BU-ISCIII/relecov-tools/pull/315) #### Fixes @@ -63,7 +66,6 @@ Code contributions to the release: #### Changed - Changed pypi_publish action to publish on every release, no need to push tags [#308](https://github.com/BU-ISCIII/relecov-tools/pull/308) -- Included a new hospital (Hospital Universitario Araba) to laboratory_address.json [#315](https://github.com/BU-ISCIII/relecov-tools/pull/315) #### Removed From 581b331b552159878a4517c869cb071385bf48f2 Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 25 Sep 2024 15:26:38 +0200 Subject: [PATCH 29/83] Updated2 CHANGELOG --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 12cfec88..31e52f8f 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ Code contributions to the release: - [Juan Ledesma](https://github.com/juanledesma78) - [Pablo Mata](https://github.com/Shettland) +- [Sergio Olmos](https://github.com/OPSergio) ### Modules From def1ab34eb8acff38dd0ab82a452f77f76f5001f Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 12:32:43 +0200 Subject: [PATCH 30/83] Updated metadata excel template, moved to assets --- .../Relecov_metadata_template_v2.0.11.xlsx | Bin 0 -> 241013 bytes .../Relecov_metadata_template_v2.0.9.xlsx | Bin 241287 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 relecov_tools/assets/Relecov_metadata_template_v2.0.11.xlsx delete mode 100644 relecov_tools/templates/Relecov_metadata_template_v2.0.9.xlsx diff --git a/relecov_tools/assets/Relecov_metadata_template_v2.0.11.xlsx b/relecov_tools/assets/Relecov_metadata_template_v2.0.11.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0ebdda52556492cc71247bd20c695a8d65452287 GIT binary patch literal 241013 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 z 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
M7Tp(N~hz zoaw&)vXH(B?vUg*LT{4e`tb~aZ$YInMlA~S?4n>4Sfu`&hf)Dd5hqXh0ASv!Jk8#3 zfO*S&(GsKrlty)clN>U>ozuPp5k8@A)A>jrc=XT(*_2p0Hv&*mYJK3xfz*18U-!oO z3YR-|DimCq#C~iyeJ!J6sIvYTO2eg^KQ&G|9B=qDO#);dNHY?n0JiawGWJ~nY;E=* zXm204Ke(Nn7<^E)ITEa78>&YwN;0OSWLxP55T62q;#W#^M|7AZbjRP$emRi7kbDGqDo9Kc_O_G-23yg!*IVnbB48RY}DPxC%+Uw%aFSh31 z24#mDm;)sgc3p9hHTRFym`fINo<3KoQ(rb$2>a{uG3flFe?Fi*x4m=!$Fq!1?tw{? zDr$z^(~IH|cO~I}JLuOkon6iE0;ohMDN(bVfsdOi;M#*4;Gn%b#$mB!!jg8vrX6+c zyC97z&gDnVp`HO26Xf=Q5Gw2dAynA?RtOz_W;4`t5r2kAB-@FJErJzh_FB+?%pXj@ zz4Z|7O^GAssjVk`$&`=A*eE>3i4K?^VXg4eNzbTbkTgisM}M~k3JBFcQ~~vrr?!Ck zo!b6}wt9W1^c(4P1ztY&tnbgD0Q-~9>O`OLmG}+yz>Oc&+id{q%Jo6ZoXy^vK)AwR zv%5(zr(4ayCTIxI%<_aEo;pnu1OIS8fPT9TK)>DQH}qZWSB4WVET`@I5dM7L0R^m4 zs0j}%(xBgR5IK2W{`X?=6JT-iXm4M)J?qdsTk9!}NEzJb0+2D1{2McGn7jBwf|2g}wpm(g3I^%f1 zmIQo-I-K?8##$!N40JjOHeioF4&-w3((ewXECurN{VVQ)>Hml56~O9|+_odZ+_v8- z`*$oSnGpgtVdYz8)PqUP=Y#mO>FqYZ$w`i3+_p2+`$NOuAKPFal&h|GX-ut5;Hl;R zJLdd|d#K&sqD;gQZ?nnJn7X~Cn2103y=WhN(6iLrYN-!)*_#%|+mmNZiQc8f1hG=i z5Wu2UEu+=33^8QK*XjRm^6t6Il=SHe%;x<+I3NTx)LYOaVA0OY`J1r+Kjf}3u8z2N zIP=8CI(0HfOOOs@lPB=cf(Y&kR>5X6Kc4iLoYU2*Fc&$hNR0pX$Br1Y5}H(#UQ1&iHn{$Crr5?W|-KsXTV-Q?ApZOG)B zy;W(4rq5m#`)KugXMA*jH9p6hx9V_RZxD+rL2PXdjU&5hWx#X8}qy`W*v>Z{F`caP1L(373 z;Wh7-oLaV(ktEW%z)z1WrqF*HJkBQO=U$C6_0V4*Q4uPEbDaNL0s($zT{D;a#P(+S z;cqgmo%N3l%LTYLG{YtVd;l3X_uf9mZvPZ-ElaDM-EiLbnJ)t~r{Vgu_y-)F(xIP= z^Vj8vt9pCZ_Rre?5!cSDZ5TL*>o?}M2GE9@n>9ciYHm;&K+WyhKAiM;1@@O*XmtP4 z4=ugbC}=~@5qs7ORp`ZjO>SWhJPJzVa_o*%9oC#@91P)M4$-|^R!d7J8%eNRvlL{*G<$pdGCOr7=-ab6;{GPw2)$j8a24oGLFZmCh6F*0^;cS7rqkNG_IIz$bz0KhPzU{ckNd@Ke9rvTK~D=L9|t+vj*OlFz+vE z|JS5dD5e^;1d-y9g(;qYf*02lM2kZfp^*Q?sd6C~>c&C$V7E0O4ZWw!o29gj?Pg8w zf;*RVq60|g@}PIP4y`jBziJw&=G>}(?h2*FS6BhLWc=dx(UlvS>OVH7QdOU~0Et^m zh7MurAzDOnHinO-C%l5Pe4Zf3U8xsaYi7cx0#$2jJSm?EX@K#czLnkh6?xy+$MQGf zoG38C{HKM9u_7*6(_oHURfV_{{gY3^OIr*|V$#X14 zAE12r$9zdt#>(I+ShPOTZcjf%V=8`)acb%bPp(W>w#Q!n2YDrxCfa`6+$^fv^CCdM zv`M=xrVLb?b=qK@-w-q{X;Tz=;{a}u{qcrGYjnFw&G@B`E1E~Qu6WbGR#btdEX{4J zYW3gSn;)(BLt4#g#lUYAcVuF0D3V#80peAT@2kGAWhuEsCSxYQh8%+wof@~!9w0g( z0Q=|1ExBVyg6zRAL1~dHJExawN9}*OzMSk=s6miKx>;l8T)~xzv9$5wEu{uvWB4tn z8TsJwlT;}l-OVxa9v&ei5nS||Jnvv%=G^aBsK%3|R_RBi@%XmBkdb>)Z)j^Afd@YJ zk07;Q{6jkIVolnplYJRwT=M4VHa%jzzW7LtcD^%VZ#d_@^|wK~Q5Xg# zwh=@A9LkQb)eCm6xJwv*QvO0Fju99KwS)>nTnv1VJ7(n-wGw7qw5A8Vz?%{b`8S`g zB^z;FCmo@D9v%Cm+SM`OXZh`(x#bd;R+}|8KXSInn^PYIX4Ey}=K775tKx0wP0f4f z)wK+AUTX&n_1mrjnK-?jrBbFQ-uY)2UMLJRb8SV~`e|~#t6E>wG9Ssk;p4?}=zMpp z)nBj zLNtq_TZYF)9M@gf%ywr&bUaM3Ky#V0bX{yR+Vr;hB7QF6LY#Y4sigV^rnAB7^ZAPo z=Z%R12LMqiiIKM{FaOmOu}_tM;H;04#i5q?S}|m2v{;+OZi}TTVuMK)k7pyJl2L`; z7aHnlSOYQ$R*qq5Dxt5j+lknIl!igkAFjF~HmR+z*IEtB1)aQjK2Q9jveR5ml-Qas z7h9l2*o90Wpdkt>F>}x2cn((ZBOB4iC3ZzLhnRed(2(WkHtEbhKz@wfTq)?i&0@fW zn*HrOuUkY>xd0Hf&=5;T;^6@(gfZ+;3&OWCCQgcy2bKpfAszz*Rh;It{;eR9w5m9Y zPVNWFdZ~TYQnF#AQyWAO;x z8;c^IW}-eO%aXT&p@V2REuO3C zvgUE*+8>L2VAozG#^~nQGO8$lqtI?{e8U#|M){k5%Y!B|S}f|QXsh?ijL~l%$sr;xK7OwWj@;1AaD5$xOx%q&kSSB8ib~2e5&tCT393$s>FWx{ zR}|VU%It(Hdn0}4@?Oi}L*#j5@rPh#6Q*<~@9!91 z3D=n9BQ0Ptr6Vn{1c&QkRy!U>x1r4EqP~7zvxA+_0{f)3VlzXJ6`s7~O-)oLkP!&0 z8GOsh;x`qevb7=<(S6GqqE&Ka6(aUJk0a~K60Er|`wS3{Pq-}P1H z#KtZpSBxEqa?9vL0ISYS*3^v9`J)ShXkLBL406+;1W!1E&ZCYRrM&KmpV0+f*AhK` z>^ARmbRsik((RTce5;#LUnEyWZ=)8k5mRjkbM7Jt$_n?Ww%;_VX~+ID=>{DZqwB`Z z3A&Ew*e1Q=@;TQ~YQAH-Y_r?6Zb#`f33wmj)}PuNK+2ceD<`{XhrU5O>NZ%S?jDmB zS_$eGS<_fH38hg7{0QjD(Wa4@RSut|)s$T0H6?&^!VxNqKA+nKroOj_Rb#N$2X1Jb zNSt1+i(Zn!!dJSYdYcqSc74#kr?J{Mfo{O2+55%+2+i#3MA22XJ{rrAnR^N2vfQpc zYpbFa?d4^#7BKm&b`zuV>A1?StO6Q7$s%B~edShX97{bww_^eH$m?3&2Eg42hb(kQyNlw4zm( z7Q&rI`nYQH+ULSEioxFiNJ6S2RVu~uuwb0HH>flK9%UUtTowPh!CUuDOjMz=e`BfnJ)bUbqeuG%ChsvVAC@SaWav?$Y~dEN3%1E zWNWIK*ZK!2W_o1~^pqLQ-MeecLIvFq6B61e;@ZT@Kh=CA`$*ozO%c~1=0B-^s9q>x z5Fzd=j2nk2HKHDPpA3pK9#INaH;@fOQYTWx%ch%o{xD~6cF&H8bRGq!OWz`bUGBtn zcy~PP0pUa?S$ifjh{eTZQ8=o`G|~J*Zwc&>RXG{4y0W^0)fjDWi>pdgBW_dXa3MGf zUY_1fk~rA%9c;#9&`f9$_msAB!06Y!b#GtVC#w;F$|3KdPr7Zx_295$Z{Etq*4LjZOczNyTmi_lk}p>m3&Mjx^H zPIBS%hVGtfGbN0$)N8Cef_bO=pL|MZL5ERZ4LE&@?ML~d+l{&n5H{~@vj1R8!P09m z!1%i7dvkiEPNy&nQk!P+J9&UT0Kza~E~!R5KT8fG-A7nGIp3dLd%n13C8f;tmP%0; z3BDy_$;gMimHCl`@1w`jPo!aJu}u*q;9!~~rbL~~VU2Zgw}ufjbHwnq#7#*hd;Q|4 zMC0E*V=W0`LB|0Gjn3#t)J?w7(~6swPvpyHLmNDy?+pvr_a>boJHRYGPVB9m%||GX zey@*E9QY3a95_$5zlBZ2tKC!UWE**Emzgs=T})Q_X@5sh(v)<*&l>=&ReJ;g+6Dz0 zZNs6^0+&@0SwQI?LYX|B5)E`x z*$H&i2IyxLLht`XG1kT=JM|dA{TYWzGQ$x{SC$icOBW(=%L^Y*0B2w%l!_ouW=kF1ku!!~oUNkLEvXaivCO6?EL3CZY%`nS?@}CwF@pl6Z4|~* ztUtl+!)9|Pdt4c6mM*3WW$nufbn4K%9^N;>xAA=n!1OEn73czrVT0nY*Mm+epdMi8 zv5jxYdgQZ$1Zh@VE{G+>@_2uG|464gdqexog({&7dxl&Lw?ZP6%{T_nY>b|BCR@Y0 zT&8Z-FwMSuShOEF;<{V{Q20J!nf~gNy@`?#5(7gM9bA!tp@}xOz{HdsY)+v%K#J== zFQJ|0__I{jzLgY}GOJI_Bu&%0u;b%@p!j}=i3YU0e&WAh#)1=5G*AZt@R@i=g72fp z-|>7A`^3z`N@`#j({}tCRMk6C3xEI<{SE@9Ul3sSoKr}S+1l4$97+zjzaR+OJqd;U z^NaXoEuXb-v_2t}*Ca7FC=*;^S5N?3f>VG$)-4_c3&Rh2k^n^6DbP<|5~9N=q=q(2 zwGNE_{9^5!2^B+xZNUz}lgUU$VHiN`2l`41jhz-3w#{At%P0L4-&tmBNlckcOQ)*c z)a4VZOP&&anf#sMczL0=kd0)MAdgk^xT-NGih`mnDE1_4`h1}55P*zjMl)A?!Zu|tFJy31@L$E3df!w%FQvWU5UHSfEJ?xW9;8xKS%={{vW#&2mdwxgUrBp zMF00gHgNwW#*qw_izOd)=0C~*K=#iefZ>-0#j(uFzz}c&3;{h>d|vH|&C9NEL7dQw z{{zhb%}^gU?fMf8oBtyF|4g?Zr&nuYv-ZF@Mgz-OW{y5=y!9u~Y~cR??jJHi?!$g) z1J|7RiqYWz)l1*QB_~H5!S7UBVy29M$nkjni6^I*)&S9eFPHMB$AA#@Kga)Z*OJX2 zCpoSEoBPL$rWq4$|9kxZJm+TJfp0Gj4r7@e`>=V|pAguiayCjS53P?=n?8C>k% z^_!m`j-P2?uVJ==nwsjIrjq#87u1tYi|Ebw=?NF=T}s@lxVdk)rX!np8`&*gAnO}@ z<9?QVm*XI%gSE35i@_$hv+nl(TFB(NQgVZfTjTY`S%Z_sg8N~zx_iAdID}Q&-KDI? z!{&PB)Z@$T4DYElCQipiM zcGKCJaLBI&n%Df2^lb6Pt**nlrPCMn;glOEoAbpb0=G;4-yW$lU3eQiqV?cjawhWs zI#Pw{$B`;3k@DgZ8H-|icQ7q3CxI*>#RlPT@k=n=Ooiirvno9 z{>m%^|WdpS<;%cD_&o_I$Bv=gq&@IA#U-I4Tdw5tjn-052qQUyVl!5h|A5f zbW;PnPl5*TmG$*?UT4m+?u^|RO$}c6qho0Y1H<#Xvt-cx0im1A_0H8<>t3Bj6`S-1 zI1O@jbGdRgKZ{g#ypHV7cs3U5U}NcVdvnR3aP|qEucGG8@p|iQxM{*8_NItnRtJ*g z;c|L0Ts7$N*1`i~Z*$!Yr_Aqivk4$PfLPTPhbn~uckj(^gyo%k+|E{UC%7`7UB?VU z?5?-Wqa1>a?1zFO+a*teP?PruCgFy$n_D)`9XdC#nI+u70AMZ&ts|y0;n}!=@gu{Xzt;0eU7w< zSAVf|b+x^9>eHZe*`)4vw{ckMl#{=9ZwvxMvOfHkg!yY*yCF9;6`$w^?{`0}V%*nEbY18tZQ? zfR4wDH|uxfIaxQ{Jr02<{T6RbHvIDPr0l!SorA7IMh`$={7$1`hO8*R9ceR|aU$S5 zVC+^csu^*@Bw0QtI2_UZOgeP4zR-o_WW>;eV(2cX%0OtZ&(M<~aGWr5eWIOJ=@iM) zaQaZ3@Z_1b44Ij`-2Blkdu{5fkK9qaQ0SfrO6jF!-0sz@B#}YHEQ1Z=q!^LGb@sKS z&a8B*O{Z+FcRX4iQ#);4MDZTA+>2|BgdW)FVKqb+NN zXYY;^Tvqs3B~Nql((?|#fE&C{R!^uL&TppNuKyqQz62iX?fw5&TBgNTp;Rh~5|X46 z%2sJXWyzXRh%&MbCX|E>$<0zxqJ`{2gE3^8lx!6m%M7x{82eCT`JXddrEa%-zu$Ym zzrWYZ%d7bq&GDS)c|Y&-KF@hhXJ@IL^Sj~F-E{x^j%ld{hKzHhcS%d)9fy;5$1$Ei zl3iGBGlaj-FDarq`i7>Suqt7f<)$Ql(?;jiO4s39$20Ftv={7m{B}NBd39kDHh#X$%1A2d%?NFU zo(^Fug_mx|(6I)YJe2KWsfPW?r`i=R0s+F(r*-dR47Z30Zi(FRF4OroO=ev|8V;N) zQ6W0h>z!Od-ydqQ_ZYHbB!)vYxds1%egPow>gIlgkJiyw$Fz<*q@2R^*@^a+#)%YL zD(-DP(ILodaU z1}T-9S3^(_vV)c47B5$P@m#Z5owa;>N_N!wYShTy%kCWqG*jjL_te-|ckO(MyGhrs zPVXFS#B^2ScAcoeM#d?G1!zfgcg85Br@ne*d&q_0P`zT`Hu{^Bx~wOvum>4V0k;U| zUFz5A)2%brU%t7nSoP=?{q&(Hoq9O7s}DsB4z+-P8H#}muns<-vvtd-0qlrbMOI79V4qUt$Tl(VcYdQH`Y6S{x(V^oCl6E{mW+Fi6Ehdp z=~9}Z@#=)41K zIj|3VFDl)#IQ5WZTwgMDE7VI~jaN=sO7xA&8|a7@rG2jm(I-zju}gODt}%{JV%t?= z*y*<^+v^7S+k7Q1MVGvy3wpe^-f*_*uyMlz!cYYT+Z9IcnWeF;18wHl7*~3bm>k|7 z;XIG~^^<5iuW8TeSo2ctP~PZj`avQ-DSBkBUM+7-bwYG6D)Myi-DS1u=5h)`Z0Krb z)k5M;)6NQEKJ=|rvA8$KrI!wxx}YB z<12`#i;mCQRN8ccOys>XGb2d5Z?5D4lNiUNU4~%`o^lSIu?mm35rz6_?k!9@ac!eWU>J&xig)FVLY~XZF`82)%v-ZF>43&P$BDx!Us>OBhO_HwJi!@ z9Zl^rFYQGgW*d8SYq?>Vccv?7=?~2GW_aGF-L905}5b&BT? ztCJYPd50Sn{TFH+R5Ix@r1{H7-nQ*V_3c(INp}r-FFh6%Gca(;A=%_j(cG8M^RF)k z9bWRc@?Q~uI^G@36g+>p^EIc1LAc3+hvTq+t>fH{M({fk!U8GxBBG^)V=|V-%;_jD zj9wiFUU;WbV)a;>50p!(*B@C#H)-zvG$A2@n7d``gq9bX%b9L}9(%y~DoZBYyPIB8 z7HdmlR}%Jz9^Ex-rGk&dr)ENq@cBGjk))Qz=9MdXuZTQlJ?@vz8nx|~my~eEA$eV= z1GWm~&Du)ZC{4}9CkaQ7YUB@?G_MvyMPyx?9vP7+CF~jbN^C7Z^oC=V zEv2=g&6Ri$v)4YEhV!gF1lkujZP*76{9DIzytrm2zggf0Xry6H5zt9I^Q>DEn2l&6621mzOy5CcoH}##6_MJ1*sBM|9AzMwzH|8~by{qU;A2+{ffirWl^J+M+pWI(+Tm>(l_x^gtp*_zs#qj$Ty&`o3IRt9Up9bbMLaMawM5q#SGfJ;pG}{No|I(4NQ9 z#>zQlht6U$`^(w`_War!wKq%FJ6cJ##zo9VC&w4As4X5qG!&C#7rqR^kB=xl#DeQR zc%h}b(@N?!XX#E`^g>&i=j6!av99Hoql-@UNpK8`*zOvom1t1NOB~TN78Gg^YACSE ztzNqDfY*IR&}?8Ah3xo%LMFlSoEiFfI$+#HGtrHyQfTAdEtU^?b29Yyv|q}|ii!cl zv2oU**IUM`&Oy;kZeF3(7H3F-(zJ!WHDR|J90qh{Esn@nEwvc!6D zT`pIxvwRM76azQp7S?5oIDqkJOKxa$8Tw+*fYJ61(4MRa)*JE8OZa#WKw^cqU6D{4 zZvr8mS9%lrDtS(2vwRU5TxpuI-ULt171n(iOg1i})AIJT7>}8bXyYOAn9nn{;|^Mi zE2*hnYnjVrGez=G51}e2igF`qCMd&ljTaa2=~@15i!%gQWrDfk7@sImqABlUBUKPH zdu3V(WAX0CwVef6nx&hJX}Wa5#oFNd;yU(ME}M26MCnEkU)|=WJaVX64t>Y`X_B&{ zaRlN;fEnmv@Dwkd@Ep%uV_>Zy%$ohNJi5f;ScUkVdP{!>GBQ2HD3LcO`b~q46y{>f z$(2uHqVb@)Yr_xha(~5}IoI$b4ll?DmNsudw{G-DqYtJG;dz(bppom|a&ck_ZeT<& z#b;GbqtU{<2rbI5whWn`M=Wx)VkcA}e|24-+sk8(M5n-KiA-7>%BkXNr;>(sc! zi)Q(7J+RGg-%Pv>g^1@xgjn|N_A*|Pu5|@1^-$tFgYlbmFvYcpplNy@K-1&^hq1{4 z?x9fuX38WSpB~bPXa*q_Qw>7Qa+TA?;TB7JI9NXfrMJ0PxFc zOS&u-tuu-ZgGu&Mze|E?3M*2VY|`eB5P#urrm`6{MrtD8eBDg;l@U!3U+np*8qRb_ zV*539E2#?yFWqdhY>BgEiSY&>sAXnJGtt+ONdsY=0c>zf4MtM5vz1f_SA^D65L+l{ zmD-T4(_1X%3~bR?J+?h3Zz}>HvQUyje%fstl3kV3X{mVT{k=jwuZF^9$*<#DpBdM@ zI^V{%#F9YLNt(&d4&}sX2P^0>KW!Bny>TX5%2lxYC@ssv>u9RauxkEX>$>X;2j*I< zw!jWCU%_3gWyDNg7|a?Ui}YH3W@|2&=%tw$t58$2uk1fw!P4Q~6Wvs@&Kcrw-E|Pt zc$Q)cPaKpTioo&c-?+)fG=G^hBmf?=|@vr#Acm7 zQL$+*%|tWqNP1V%Jn-LZ`hH`PqUfYA(gEmD^(lZfj3d)^;Yh4k(b0&9II;Fw5%JNq zF3T6fwo+&tgK!Ygb{dR&%SsW&ge!80k;8Cm$`zJPv%wke15;zOt@T;vJM6ITi_?2TjkqWQHV z56vUuy;s~SQqnxoKlgiMA?=o#24W1PMGE;qNpmcovB(Dj?cs{%zx;~u8%WY*-?Js> zzL}RFWFQG%rl(f615ZsG(>zcZ7RElmNV=N-H2PA;`KXxa*>JYn7U$NWTlBD3WHmZ3 z;H&WLjfi(lk21L6G(Gp~HVhMAtwl}Az)SY0;cYaZ)RDa!Z9`m7KXgX(`@9m<7?cLB zvnIlQ1q08E(X$?yB>9-!;RH@wq(h#gxtI+NvBVzmmFRJ=1+8Em2FLM{7LD^ke58xLk5ar{mu1cR9@6Mi)q znn^-gEre7^5jMa$-tl!D1A;(t`ppfWE_H^bi0qQtMqArz9fViSxmHgL4eX&QFN>@h zelB-<+%Ob!)Wk?G>F9-ArMB!_t`brem4DDiDp^y?O@j!gLU^;(XR{QO|HxC)@b3ms z1Ky;sP!xTl>D7jr>0w?R0Aj=Nu*Kb1NMAx$oHtnzH<7`O9A-o1OmqUjVeGF#r6A^1oU#CPS4da{TUkz-HKd_{Cvhz9<+ zrU)PzCKW0bBNpYtPx0g4`ZXc=DQ~^YB(%%DdZOD$X3@hPy@s zo&=ycf7#a`pMNF;!q~1mE)QUy`Pu{&@*hKcj5kBjMqO~T>I`))jSm3gj>CsA*uUgy zxTn$TDMwV#)g)}4ZjT;2soB|E8(Xcf(D7_Xt7&a3O|RK?wK6b59sI&sfU`oEZt$|ulv?5LGJV2XKD6_2?j6_^k;4c*s^;sotfvl!T0eL1Mv%> z+h;!XEFJKn!yDJ8Nt>P+9!FE0lrBWmF3TpHS>GhPl6`h{*OMntyI)1CYRjKuXMl$& zLGMiF&A6%YT&R}pRc^a4FdNUYxjlHj>$j*eJ~!b%%5;#g`fD`0K}Pr)PFtB!YtF|^ zf{>PdoE(@9MSQ>lr%A6Q1A@lokt=bd5-#+fjFI37t|r$t9$p6%j=X!$JMHE-xtGv) zXrvhu#rNM3#YCw*^-DKRP#%CNLOx=`B9HG+K_7fRWNO1=ok36Ftgl*jCe-CYFHS1jW0}R5WPs3@ zkx57@5RgiF)BQD7n@cy@zCP&{wK%217jSwj3}mi2=r;{?=)Wc?!0Dwh$?@iV)Z&bb zZHs$D2vxdlI}@b_*IqtXRpZCqNnWF0@^En7(uJKj8#hrXdzx&;&O6O~SHsJ}w9JHo z93sGhXk||_kR8l{q%j9_3Ih7acEu3qN*=$5Lhdyqo}`_EEfv7tLs+oj)l2`;b%EtMn)5GxN8bgVeZ3w z+rrwXb3S6fMxVDEIcH0W$!6mf}OlCu8vKy`atUnP6}M&G$GN@O^$(x zo`f=Du#W*{q^wSalyR>{?=cjI_QFPuijhu{7IwG}tzzOELFw25<~lT)xeg`ivQ#Rf zcFcG|X`NL`Z8a(uY%}W$z1BlFL5iSfVI-0?qiao36PP>-wYHL!1{TAypN=(+FKiNV zdt!lmh;UlC*`>1slQSYLSGI!{A7ypYTBnQMCMbXHg|X&*mMFR?AkTI1oo^(g1Rr-o zibfdQoMdljiR_FIKaEnZw7%YF9Sn$bHetz8}!iaS*K&Me)8Geh&CPav& zt5``oN$2vH1gpH!WL#8-P0q;=LwGno1e(Gg6b|PV3(gt=fQ4^m0xVTzwFLlJjMNzb zusZnd&Bkv!Z%Rmv(v>$vhDhgi`l z=A=*;-v}Wb1u2IaEOe_9h_Y31H31@tx#%=O!A0ka5=cX+bbxCZDaYVss`K2ZikQ|i zADoo+HnQ+-gI!=$YNiwQBve=C5fq9F0e0)~1gc0_^1BLkGe*MJ4(LfcNFfAgQ4$Ez zXs1LbAHqOB#2m>n6mwluM`iLM0+SC>Tr$nNY!ocCBFiC$ymY`wqy_<#6qoBj{5Wj! zRj_0duIm^#{?4oOji^Ogo%-ZpGHy>C0%$f=_z%cedA&iTBwvI<>v-{F&?=dO)x|sD z&Z%qZnyNb;wsJp6-3Xz~VOs}XR^WI9!N&Ya4R1~;ZLwOyN>>d31Bqi3eFSX~o&8<- zP+`JH`9~bXmCmf`g!V`yKslg_DF;xX9Pri5SfU_*#}j~3LOD?1ya5x&x#NLQeA>t9KiIE2OoU|=n@dPDlYtRAXKIDwvr9A;lB22+(CzwbVT5{Ma?O)MIko@N&9|w?K8Ub<794gOwqZI8feJfTr5mgC znWIvWtl=);A}mM|AJ^zowU(VFU&=qlv&L?-kywoZCw`G5==qPuU+g z>Eizw%3sGgvP$=EB}}#t1l!+_qt_^%iy%L^#$5`7Ex&P0g8{P52lP5*f#e%tNgDwQ z1am6FLUb@|4_REF2?9hj8U})}#-Q#uizx8Z$rp44C39ae2mU&6L3a(jIsl|Z5N87# zRp9$JcL<>1XCS+Z9I}AI5S{D62lOhYILwM5lpctak-le=YuZ)hM&O8l8?+vUQoIbP z;Uu`lw8Db84~qCF3FHea0G?b*i8yF>3o0NhEa7JpWe z``{m3Pq1{$>0+&CQ|Z)zDle zjw$itq*~c?fqM$x#g$TGG5jR?jjOWZ%;j6CsRFtI7q@UArd5m&!$6@}Y%)sEIn8wZ z9#$|~LMKnG5&}SYpqsQq;lUw|P*v0F)=7tQT`iMq$TGpxIrRw;?9#qu8&;SY!Ic1N z!RiI`(K9Z3+T5>H33T0RY94pw9elC%tJTxEYe=Phv)2F0HAtOs{y}Q>hydFGmZ*|d z?zox|J9#HO0qh5ir+0|1go=gi&{d28ey{DeuIvObkzXSnX)?^jt0n&l=p<9%f)yji0TwoU>It>SS57sfJZ8XG2UF*bP z7=gGFc0^+neVDC!%QFHqFiAlFeMwAyY>4qZupPSb1QmJDX>qYEkZIc5|=YW#2?G8-=?6T?!lrDe$4s6d1^*R3?Py zZ3C!P17p_>E=<1QI8c*w0}sF=5-bPIJ9X|>Zkk6|PP?xQvIvI)SjVDJMf#TFTZ##K6f84Fp+mL$_t_xPCX}iD5b$CIHv(m9kdU{*GRnKQ^P4Rp<2$NZH zM;y5&EeDw)GSEMSny!O6KtW7x)&vWtyO%g!Gm^05C$!`cBck8_jKF!Is4y1Aj zkV%O?DomMFwH#_4bVVlj#6s>Vqs|m3ufa_QDS=i91)W7Pjds8NqR+4ixLI9P~38; znFWQdZ=@;j5jG~HHF0hk?RRk^DC=$d}jf!`dsv4H+vd9%bz)Ur7*8mly) z>UcRk4WG6W%!{ED5Gt>UZ=9&;b4$#coB)Df_qo}E%n_k zAXu-{krh|+{JvO2qs3ntObViD+II=0lcHQF#UO~LgI9{=o#mfq1H5Kg__9X7=z~xj zf>o;CmpN;Ig@qfNqQwK8B9I;}$`u~py3OoO7t$j`C6KZA@Gc5*4(*!-iGGn9_hfs5 z05ZZwA!J1DgOCAVLGq_szPelh0C@`%0y!Rrh!rJd;1#Hi-Fzq0rVR&?|#wbI6)T(}|aT2{n_ET0B`7c!I)2c}oaD9}ap# zmB_d!9LGUVSfHdICm9#_mS#fF7F#4kY>wZ4q5jKWyGXrfyzmd5IbX_qz0p zoIwt`bi)n>I-sqEfk6#|TcUHopyDZqu zSB3_+AL5%lHm)5F2b($K$-9|M4+|Fq5SpUFd;q4$u*U+d>STiE4)u?T1b|gNR57f? z;krcBvUg=6F*0C{#cb%RTwT(uRm($8ofwvDT(q zdkg8`sqck-M}O0$+H34RSMyl3XBlN3MXYo|9{qyRW6QDZ-DdjMN|*OOroImMD$+A8 zS<B!&(of@+(;G;SF!m-pY)|j&AAIb>M%@vL+vigIevTc!t-y8n@^bqy?4}ceCytZ;P8}=q;^Y2mh)*sw`jP3l)cYDu} z$aCwGr0a)x?bJNJR%n70lra!tYySdhp%NB4oxcoc2yo$AwP6SMukwnngQ zM`2ra+mp7+wvsj%g@Q#G^mAXo(c6MrGQ0#H!cxK#0^t zgtj;#LZpzZqc5+c(<(LX_9sP)I#&k1NPXe^BJRb_7b70<2SL1iBfC`NowhiMJ4rf8 zI1T#p#lP26hkuW?ApG;r-(;*}enJLT4HrW>M3tIN-ka35ps;Tc`MR?jm(7i*t?HjO zJ|V8N@H2G0^JtpV36Vosa-3lvt+G%DI76z&^21beTwMD#WS8Z;Sm8SscX;pU-jTk; zSO9+@A|?C&!mV$76k5IcAe@Hj(t`?n;FQ~OhtoEdcRu6`U11BXA|(V|0%uVN-y@H@ z5(cf-efqyO2ps%4D+9G#%*h&^^VuhA>}RLIhxP`lJ=}QRY!7l=U@Dk$3+M}2DLEW) z4Gp`={gTbex+3`n_C?H#kQaE=uvJB?H?(Px^tj*EvaKT07TjQ(KN?pT1+3k+Ah!>N z%cW@^!_zxWlQ4XrOktWTeH;2yYM+z0#qKqyoQE^0ms8^W{?5UGs4Zv4>gOOqAzp$3 z>3tciU%Eybeb*uHU>W~gZ|u-biTHt-%EKkTE~m_P^hJIPVdBINsTKA=6R<8;4Wf=U z@4E^3w$mMXc6e&1lzFz;9N;0`AY9@ZpTp&7$}8HrAmpGuTgsv_ItZ7rvrIHK?eXxK z)B4xI^pw`{H2`1|wRo({{xeZEC*ti+o7t?o>;0?vkshh`FQJqbf*3$o)Zor> zSGoAvRfd%be+5cyEcuX0V3$%;a^8e=aYxP7=@o>7aVRG48R=C z0+L#XTmM~>ohu8SU3+r$s>}UPK`3q!+JQf08`NX9M{rBlyKVWa(#~seL52{O6C>z zbwLWSCIT}`WB4Nr>;(XZbi{J_WC@T#h#a>e{4`%+I@SXXBmSht8rbq%xpR*$>JF5 zJi!wqCr@sDa`_!AA@Z=9?1)TG-NI!CTd&z(Yq)Z)$>UXGUbyv815bbdP?Oi;hxzLq z-vsPGvowC|6B%brFLB+H#(>Z>ODngYZRvg@-v5^V4A6*d5`8;EAQp2vv4Aqq5JPSd z94gVF68aXmUpb0q$A~L(DHw~d;ZiUXXE8X6CGhk{bK4D^_KMk_vRFY!94Y3Jh|D(_ z`yp4Hg! zBpyy|cp}gAgjk}%e8&oG#(RT&jpfzetKxW)xD~X;kqMYfgm$lyTqkOUZjzP_k#dE^ z%ZUlwOVuC$+BRHf+(mEl@+Oq-zZFHoTc<@7Py(NEFUDj`Y`cT(Ds1pwfvJ;CH})Rk zW*j%ocE9*=0iA@ocPhamY4A`L98~H;i3Bx85>RFf(Oq$F-tbfivz)IWZgAb%1zvK<3Y2A8y{2ICkw2z$ZMEmes0Q&@{ zLi?ON4ee814edirwOX;h!vMI)-(w#|KSIq_0WgsL_rZkyPU2l_c!WAK)Z_yO=qcqy zb!IdHVs03lc5{T&zIF@AxJv{_h$m7omKc33L5iH~7!?b=f@djqRT9r!?5gfU9V+pP z79lF8Yo}gCcpT45Zw`#O`(l1NFk#GPl2~kk0bwylQj5Ca67c51>-m(xPhWZLGIUGT zATW?k*TEF2AW_%OswWLLUX=g?Tt;b28tl9(eV^o-v=B|-r|n&H%#ZN;4LySkBle`z zPK0jYJFhkTA@B;M*#?h%q|gSB$HErCa}5R}; zS6~J-sTF!KtUU55rkoh9PhYGG{Ukha9pJaey@5F{5sZ43h!j8766o3vcM2#tRi@)` zl7Zu3EurJwVLHxU9CVyu(SO8obkV?ZQt{AndMu&iw3DIZG~@sKj3w2HSQS!8p6Ipv*cocq_wS-A zH1i?W8nQFGhnnUi`PO?%=}_~ou0`)pN*K7+UAJ3CT9@up?YhzqOqve6yt#NlWg!P} z6;l9meQHO2el^-z#g?7gUIb9E#&fyThiDfR*awj2`hI}V0!dQ)v!Y0ho@YxIW3*UN z{Uio6S6C1PpSV;pt|PNWXDlDhdunR>_YMj;@}~6jH;1iSy7L-}jJ#H03_-?2_%L}qj1yg^-Xj_F%aI8)SKZ~} zr|WE!HxswzQZTu>8^rd}`M$&}+Vd|G*&R-Z(2-AL49Y9eE92YCH0PfLIfEw`;1PKr zRbw}myV5v;;!U_A3?tvl0c6s^XA9u8$bo6;`KhF;({(AyknVDyl<<6~$hadR69W0& zxqu@buXF@?%AZ)KJ^vC>O?&=%txAB}ne9sY&a>Y{vz{hi0WgGJ70UzCUA}=`zKf9z zy*-W;lMb`k0#9z>KG$p2;GeJHN8k%v27vJTvxRVcTF`hfhoRSg%3(EvKL2<;#X%-vOc8 zN(t*6b#_nZGoE2wzdR%HNrMCgYy~FwNTpnLsUCavaPXCDbwXl+!94jrA|5Y42R(W* z&*~V~Uk&<^6gFnmhcUTpf#B{VRA-Z3MM#|&%K%oCRUb*18BM}FYlD0rcD?A#jaqSH zRwV{W4JL%Gqjzj7>j@rqed)%22+M(qTed2NXFGOPatS{j`2z|IIEb3&_bBYvOprbb zn>-)^<8y*sY;rz*!LU~WK;ziSuBq6cg2t)L@&8R?-R(Cb=bCzNuvP9Fu3wW>X}9GY zUJX#WD~;7o>O6UtJvV8jBT@4gJwZZfxE{ugD zb>vLG?BlwHJJ`C6_KBqkN&zMfKoQBeB5c_%Y98Po`Lah?wE)X5^en&Slaq1KjE|{! zC}W+?!XPTzyS!9oxEchVH-9r+FxDG3Ho!MJm_5voOyHF-2%`i3{5I=um=_x>nu!v}grg@w;Hrh@1l!Y<6NvTFa9RwfzWA z!gTX^s5vMgyCgi9us+*s3D|TIGhw>BtH~Gem0YQrOY_T4d#=?Fmi{fuTR|O!idaSl?oVYA%{FRJeg-x#}2?@ zpZ?4HbOeT=Fnmpitb z$k8)CXd+8!X>+OD6GI+b&cM&3x|kM_P;~&_`vzq_x*X=BcT7~Qb*Q+mt=jF2Zd@W{ z4+X?pZU0I14lOR$t3IL-<7O` z!|0arq>g-VLPNJa4Nck3iBn`aSg#3<`?n0IuVgxd3gk@hU$+ZV5*y_%(R1z-Te0(2}P4 zF3-T4g?A*9fMTY(FUY?dmcZqHMaPF^(fl!~tpFc+T>O`kT3*9N_^DD*mxfCEB&!jS zPj3D|J4z*4?3(ic$Q+uNe|_3M?KCViXaf?FwE|oWvB}U~&RTsjt-2ChPg5f$NGA+M?w2o!Qp~|F?&CbpqsZ(u8GCU zpI&3;IEU9uoHOOJJ0idP91mBSqYsPt{FNS~$fsf+?~z{F54UjUUojvEC3Nj{s0hdN zJj9A~=CkYj_}|7XK|~v`*%0f;GElik&Bm8SLD>!XJs$$*VgGudzR7Y9gB9jd1ay35 zH^5Wg@3A`3tK`c9w`|}8srP%jq3rIj79&@;0`WYnY%^!2K*Sc#6m9nf`8)_6ja(L_ z!_N8h+IA?r@yudZa20RjR&W;2H$2LVK<-H}2zZTNnb}^ZKfj8|gFt$TKG{=7@L{PC z=j5u~?dD{$CMsRoZ54kGP~iMnfcKa0u>z789|F3YFALn);?Dt#apyH@K=V>|gPI_G z!0Wtb2xzCT_C%%LM)|p)2sT@a=x|f#Md)nLorUyai4!-PF1}->$4uK5{JZAQ@Cwi7 z>BWX;@w`ch^<@#it0h+0A z$9-G?_l$d7cB}UBo;e^qPp@$YaIujy7w~i+cQp{7%JSoqO6=^5bR*w9Q&v=pKYKNh z3HihAeX4{*&|hWDmQ7-QO{v z^mBCui|L5|t;{l$*c8?aqD3Ch6;Lw>R3C zMdYB-3~^;Q&7_Uzc~-FJP2cY4ztUq`ewpF?cSJSA`8`^d0MlN^a5oPupOdiNmRrFd zyqhNi;H#|||1LWp_lpDmw<${z=JEc=p6=NQGA6*LXA2}b^*{#S?FMCg{v41pA*fj? zLDiixW=`|ew>A7mRh~DLb2HXdD7$e*CZ6Zv-xZ^MZRdP8FQaKU z3-++*{f2B4^B6`(iFphOTL4UZTY>F;&+4wVJOjH558gfh1;E#gVE^0Om2-37?@>ef zvPiz(v+?*E9#*k_09H*NOA(Oi@aMplmw&y)RY3@9X%TRO4a@g*gOw?K;Bd!}1#Z%V zV60{aqXG=Z-_7}VVGombf~2CcVgE{x+4+g*N{rWd8T}^S&#mAhUe2vB9GD8M*Wa$> z=sY_&hLudb0#eXQk2Zj>NPv4_W55Mo9D7rV*|2A>msg)q9tmj(G zo;L%jy|Wc$zm4a3-eXr~^R#1EjTTk|NN^g6$jqA2py5eFJ_RX=UBMR2B<;kSsLTF| ziL#vKy8OF}B{}CWL3rfNgSjR>940?Lko*8Igh1AG37RjSIl#oQ{@3<&^YX$~El}yAvrsNU$!f7_fr`KrnE4#^E_Gho}LfrBkOeFABU*+XNfJ&5b zUw5#vIY(K3tAwMQKl^%5;cAct*dE9%xu9{cOg8omz+K-hobn(O0iVx$g?8OH)bVgl zh3h_TBR)hm9>ikWPF<~!-UTG|S!&CF-CmtIcQvqA1w8$`^Ef1uGreMu6=3&#h|!|s ztdF>Bu7liNaUY@tpE*E@-^+W%SY0dLEZV|uyvFS0yoFv3)5JI2?gN~GXXpG8;uXXB z14MS$6Q|dBts*$78`Pcej#fa!aE!*T$^ia9xQX*f!5(dGK16$*|LvBg2oE0?K&fGd zhGPRs5>N)P?I6i{7AXAC>9m+(fnACK)iSeO&wxD2JA#|?{Xgsb*OcYswm4(fY+$Ip z+M^wOw|Y<6hgn?wv$J>{&@ZpQVHTC)w4%VYj;CzR5SX%^qd>~ucL=2HGjo|K+xs6* z*)a!T%9bsMMEU_p*;~g`Ht`=$*3(W=cTvG~Ne z^{1(61T%W$DdWb&F0<@8NX;deYp_|3+si-K9bR?^yQTDq@9vgPB=?=fpCR|_zajVZ zn~>bs1qnR(K<+7vndCm>qjzP-Jl=S&{nsguS+;;XlT1LBd-4TQ4hq2)rR-MYDGBnY z=~|ma0;wc)0!mzVJu?*Yf#~eh{g{gWfarkCuBQLTL}#oZJ-x}?TA=uhu-lf~G;_N< zyjNJtO9vMo?~$owO&L31blp)nYirBZrgC;c)wSf4L!ul$oIAETlT^B&Ueb0T< zI|XTqcTV)7ZL$>(?~2|&IV8W$B?bI8{pPJvm7&4ZHL0!wwN}ErFk0n1eYngzyg9vI zOcP&!yVY5PXJ*;5UxlOhfof|Z9?99fPYkRNM)`Vi4i{Bk63PLiiepiIWY8^~GffF0 zD_a2o)bx>cA|dUTqtL3D1Ac*4oeIlU(t__Aj9CrgxFVy@^Qe@)3GXt!!?OG` z=X`ay23sTHoU3sQ)ZGLl*>n*u?<&27a!OC#^a3~@2ZnLHLn)ws@KkXYJvdXml@R%D=Xe&E^{Kh>%w*?x6@SCc?<}61 zU3JKf=S9bcXC2aW3~ZW2m8nRfT|Q+*H8+|P;)Vi(yGEs~N@$no9TtUvV_Ws%$66?W z#PK#y)6FnTa}svYJ9H90#w>0LnSJVr#KnA}4E&~-g_*BSQ{QS%t_iCuCJwFENBj0{2> z`d!l50#EA#)r%u~B(aMlIwVvxrS5qxAL`V)oF(BbuFF(}y06ZX6Y0vMBezki&v6zu z^&71V&pc}Z5F238PQ(eo*Z`Wlnic4ZYiq18h+HZbwvDWU6ky)=^86w8ggYME3 z+<7ep%(}dndcBx_T3>y-`1X~`Gy5|W=HB`3#;?MWb~a}r6OT;4!z1Up2yDGAlmkYk z3sf0Rpvt_KU=ui=`ZkF(-Z@GEG5C9V2OsO$i#LlT*%c5v)e$U6+nqjh+Z+K1PWST9 z=IO!uXYn-Dom#icr_C;?X<#`^!ZvG2ZSRUIw*jaej9@7acgLOC0Bjs>s%59 zmdr{E^3{NDD|DV`Is2XIPAgQ{@BD^r5>p;V-W5|GlF|jK!|A2~P$F|IF4q#h^ydqB zab$qpLlD|!Bh-M@MQrC4XtN49=EXTbavuEH(=c)TXaS%Mas7$r)OfzLK$^18l>huq z@s$+NO+&dFVS2XPo)XK-d988Jk9q==lvpbJ@FQ+N@5@?G?a0kqN3F@t5~eczs7i>7 zBWfk1+F6YX*BK8I!{#yWB^u6S#MLq|*BOnzg!SQ}&SP22T*eF+xV)^7?7V*1BiJ=Y zhnJ$d+yKz+1Qj#xROL)mphMmEo~*z(BPnk*5S=x;ViX)Q6IJXWH_o_YIIBB%OS1|b zuY22&;Es012i>hqaF=qlAC`xL zq2%|>tPAy$yJ^ULAW7uU0chD~5O8~2fK^f)%S~TS+pQ`a6%ih z5LlgnB|)+sV7W~xNJz%H)!pinCHcW?TVvrI9AD?wfGZXE3slnR;j99+`wr~`q9SuV zG1^n(nX=E6|NLKzFOtd-!?4O=xUVdo;ET2A{MXmKCF7bF+q@wp>n_ z%g9JX&1F1F?3&9M<;Q4%`)TGg!b3+O-QF~K*hr3>zRxI|i>{kKIJjxBfLB+=N?9n! zD8hZZ+{x}&y|P`A^DQt*wX$~FHP{o@b9;KbR3PIPtJ{7aQ1BGwy72vv3~syk_Qov{ z3g3TFDu}ai9JEv4zD;n?He{$Vv~m~V#%ZM4dCerS>R%2RuG5MIe}zVNXvtqcb-EsW z50#BIM2vP1Lglt@0z!_h!kIt_wFD4Kzq8zv^I>(rHsZBxdAK`fZ~Fk7XST%|unY)i zi9>!|2J8q}sXQ(JsiDshagU)-H|i01-M@Vw*#38Wy(}He!Bk3Yf&Pq9cWY70B|hS` z-J(*~Ae6%{z;lorN)OfSKrH@_c$0}D){mVL;yxg0AZzn)5|sT7zh@@%b)XobeCK=t zv&Gnt5?45j_}rDsqsV+Q<@ZQ;*W`OF;t{Wp{{9-xp4swL--iT58=i1%I13rex!IFb z^ikmLWOX;z-3Sk%9IFf95_#h_?n%)zz>a1WUTRBNucMLSB6{;~@T5&TOVp-r5&g7L z-D3L4ZhEvk4r7Sp9ubub>Kam`4Sh?yMFh6;2h{s1AZ9|+-Rw*<*ifL$s|F!*gFpa~ zl6NAS!RjBvv@n3_Cbmuo;aM0&^U#sTW{F5%Ac7BlkZs=!H;_}=J_y_}`hmdxIr{&* z0(a&&ngr0d9U?!d$$H8^rzQicy+{AAsmXFF*!w`dk);%J2xMlx40n&+BBPm`%4R3j zVDP(+3Mj;2DmTRcs&a#Khl;!F)^F3>6i!azRufQfSU(gMR!lluObZ zBXeCuslmA}B2=7pSJw%epVXs(dLK16IaYy1LwhfT1q~Wul9r)PLqYp}Vt|@KmgIDS z0KkxLgHVqHa`siZl*TxoE?o&V`F9a;Uow5ftRUQ-DlIb-*zISr*L+MRtwGa`9uGDE zMan7{f7}3ML~opXd)u$d5d*@2=mR~%rR6(Pa=n(@3~$b}XQO+1uS1!HkBQs5`@z0s zoGjRv91Ms1lAe{1nER5ShxG^hl1YF@{?&a+ASi+D!XBpR{+#bS^(6O1ezKkfEC|~F zo_Z43NmeEQyqo{q!ft9jQ_G{jvV7D<+#S_JjHC9`x~*f4W5Wq!jJnafvC*!uOw4$B ziF0U(>buNDvAK+gwLKa}hTQZ6Ms-|teWN2I3Xhr_XL4la)P-j zDDj0QNn|+^qcD*mvyuKmd=yrJVgbbDhQ{$PukaNmDKQ45gvd>T3=Mm@V zfYu}Ku^qOSVic>m^@JqAq?1c2gnw08V8*|^Eb!%2Ss*wU^iQ*sd~j>ieru7vzprr& zlsCM+DNoq{`cCu=193kuNA1@O-j8C}vL<)+DqfP}(she^aCD<|gY!=IiPe_yHLorr zi>ccEwLJuWdvTyf{l)6fsqy@{I(EuFKW!h)T)DAtcQ)VdMxByvPR@l@DQvJR9DP=! zB}x;T{fVHkB~|)jvOK- zTpZD)jSz}PdY%MvhH|KMgT2Y=a+cj!du30F1vSPkfb}PQp#B7${swh}MU@D61at8| z#ED*pedc1&RmJ+l9^yTB>*3Ekn+ZSI*?jol+1UgKz)MdxAH$rH=~I*cssMbnpj`i$eQG0ds*Z4~&hr1aI#f`PGWu;jN+cgsTA9lLyP2|y%oCRy*FP13 z%O-w4aT$KLz_0mo*jz?>qTyUdYGPd>Av-u-jzT)*CLxa)-5Q`)U$DUC5XG~TXq}ll zO#t-d$U7wO_^xtJfZDC9&-LFfb(e9-#ONcJRmZEE1Jo`vkE1w8MrL!4I*aV>G(G~y~X1SFCa(}PP4Mm18mWQJ|e1a#XV zuuRn4*P(8GPnO*qXJI1aBoUmh#NiCUffR?j8$B-LReM?jDdQcEvR>sGf+}@;k-c$- z2-IX%HSjwDDRmSC?9kZP=Ufl|6D&vo(<3Kbn(!gw=opnUFLgU`@IGyo|ic14yWa) z7BVu!HpK$Q%_uiIEf(}_UH(SC#~}e!ZwH;1`gbh-D@Pl_(fdtR)sMmVZO)+E$#6p#JX4%)`gQld zvE7!%-`^bv9ZpFNSQenbA+?1qI)+iJ&vpn;GCq|8m2?^n`iiovCOu;5m5$=sV~V z%vXpW*8YRjmbLYQe|*|<5T3Ri>mp86w?PE}IJfiS2gfas{x|yxPI}yOXwRQK0uEY0 z`DgsqBjDYh3Lw2v4W~*azSp>GDy{u=X~NgFuv2ND+4${W>_3{h_&?&>|NNdLP3QOO zY);F`I#OkA@R@FQ`Md2_|DcL_1RV2({Z_-i*CuZ$u>M>G3tyNy=xidPyNzU^SGwct z22csETQgt%A1)gNG8b%;#fO^eCOFk?ajF|7v-9&m-mNn!aA$jIVE6bLonha;u(3hc zu~OIJ?6JOVS(m}_7F8n~rNVlT8ijGwmC_rZ=YG*#knz|cu$z7w5bsgS4~TcBbHP3` zB{)wg$8b1HqhaJ{*>{Y}#9k*=XeZF?Bs*TM#bsVz9r#{bLmtttPR;6KK~4SatjnuJJa zZJ@^FeqG01*8>_?buqUo|MQh4XTD!q@|PsIKU>E=y9UcVAU~nEpzDV^j;TWKsTQ^W zYb|^m$84DRZt+S7y<4+QGQTiz zFM26`)%4n_1GV3~8Rh$1V*mI7XmCLD-6RJzWu1&cH432UMuslO03pw6?ASE;sVB-Y z&=Une2#)e}^%}ps99Fm-w2{sFZWW>60vDY>tRfsO`%x94d?*l`DUH4hVz^zu`6eU)NpOUJQX>rrxwMvhrPEWKuy)%xx zOGliNYLXdZo_V&#wh>%;IesTuSAVxwZo$9%ddr@v!;KTb-`_cGN$-K@c9<76^v(b!C|_Mn%xooCCr^6DkVavNYs?QmjArlW<3deB>fotVEz$KSgUwPjHhaR24O_$GcCh-0pc%A&myLMr7 z6PHef56w+rrS+YeIz)K{xVIhL>Fc<8r_T@WZU2K)PU9sg=fO=4;0_=cfuX#*RAuH4 z$t8GiqBp!7*gz36>REe(16(#a`9+ejxk>zoZAtH+Y;K}V1veP~wQJIJB_dc<4@y1a zJj?iSn_R5B1z)>bE@4e-z{g6)sqswN$1qD0T=glTD+v8X7~Y)f#33*wGvz-Z$$zKG z|G(Zoaqh0eft^G-wwpCrDZLmK6m0iOP4=t%d_@|(H0|pv(nw!jkrruPPJceBKi`qw6_YD;uH{#+{~bRg&n_@@ z{X2Ktx)~x^g}_y051wec$t4Fik|#pszI zdNLYV|FM~Xv49>!&6ATR@ZjF~9Yg`QH8yNo6X1zp$$Og%87wahdp^*bs~6tf99Fd*W-=YnV)0oeRw$>d z>Ia!^YCKc+nev~%=MF++L-NujzeMp1-Hwie1-$ZjT5 zilQvZo;GEP$j(d%g{a8RSh8gq>&!4?=6BvBS+Z64^SOP#zxn5LZ+#wDr}I9`>pWl2 zrAl5&9{#mmGg=-oabG_&N91QSWT9s(h>#7M%CPf@BYpk+$o!Nc*7Y|dh`sNV(yaDS zvIn#vwI!9>twn7{A$z)qole>_t48998{H-%-N5D~0g}<%qBdf?m6IBpGiq4z@;aE6 zc=aR#VGALLO&x?^y7?pnxci7BhNuyqkpfVY=(J;Q31Sc+Vh;cjVeA@!kbs9AWJje6 z0@2=bR&=W_RrSuDSbgLAK=qw7b(8WZs>)wVw)|eW10`Gj9~RADXI>h*tnA98G9p z*Wrgi*mcLA-$RN`&$s;He9L}pK!BVZ*IN(nsE<#V^l@&X%sINPmZSIjJ?Bf+_d79s z^~*%`PKP9XsA4{L^k{Dy*S!s^V4*(1;JLJkn^f z7T|@V2@dvFX9$Qy`SNrc}wMDSt ztAsj?gj2&a2EO$NEjX_+XXJ%~*oLnBVz}2bo|F}P;5t30w+FeThbc+ad`cwccV-{n zErEOq==&W~8o=1<%qF>aT5vW6?sGVr9ifrN6tOnqY=~tWYy!Eb=qKpBcm@mH#NBd% zKYbbZDht-^D5uT76^8+Un8KtCM-CKUS8@#Y-415xOu{LFbkAq3kp1^#7$;8uAh1YL zmL$60ZU8aH`f;r>%q7ww#yE}Z64g1AWv18$T@XyE`eXz$h<`38ddB z=6yf*F^ofq25od^9ChSXW<$V(+NHrC+o-$&0Y~b7`I|r8v)bhuO!0}P7cky=wwhcA zCXcQ6>%kGC>Mtay105V?@=AMVth(NTH8c&_a?DU*m!3R)`$@#+zv0)auR?#U7_?^W z!I}YI4~!tc_=b`rZ^{a2y`_Ogwo_RY8nQ7MGOZ=8?+Q)Qmm)ApOxwKf$8FLF{*f=I z0`0Mepl8r>>F(!#4p@|=DeJ`EM%EK%^LVfOnU7(6ytK?}28-`56pjrw=Bl z@L(Xc>eWR6`cv$xOFhMhPS?Ci)pP=zuOc_okidMQ} zAe@}dP319L3RZKgEhXnxe`xBW_OseiYs%esa z9pr-GApe|Wz5|NexsV!uk>Fc>E5zvnEpDg6G8uTHaDuoU3Zm?Sz%E<0V%eK3&$YQQ zU;i*yMBsjN8sk`ND^x7-mwixr+@sWTS!&Z8jhkgz0FMrF4S`j=GH-QeUg?i`U#{fH z=)=79h@+0B4jHk?^BKcqm`v;xmmHL2d=y~h&%y4O5%s>(k=32Q2Od{pejHBgBWiji zQ#0#0XQC2LJS9O;;+HXy+0UJl#7r=G;!PvD4Uu9Rsu>l|+r6TF9)SZ=0z^Lli^TvV zcd>raS?&n?r+eVGa{7F`W-x8Ul!FiTp>5;aHmOCLW}k&7Hh*0Yakm)q?{b!hgOrWv z6i|}9Exrcb8&h1kj{zk`e;;(P-+J~n*n&PmV=EH+1pTkCpeH~quNTjX;@qCVD$X8` z5Vydjox_ve+1eDX|18UUrMWYP)Ug-a&6A(T(5|74n@{R`)9HO7g@A;l^89u=%@=Zf zUZEG@H$~$dh87VhOU*FGhJ5L(LtrR&#G#r&?%b2wg+BEgxZL4IP-qc+XUze**m)Ks3ZP42v*

Q&pI0d_x1R{*%8Ojd8p#0{U4Q-(H7d@_OBa%=+q&pnxdmF&HC(ft9@({<1Fa4A`HH1Vew7qU}sbQ z>a|OsAo>K2soDPLSI|Lja$BLHFhv@q&>KsrdKj3!1Yni6>wt3u6dQTLfgFF%( zG-A4f`o&hS`YCQ{aP=eDqDf-yfFHugYNbY9?f;yScVBag{w~vdroLJaS;95*9 zY`X>5AB5ij(BGX@TK(+2Qa*KHkw#yR4o2S;&kmnIF7yX9p!g2fO$a`UFjhwb3VN1~BqBo}haO zA|be3lWgBorCD_$LZG?~9LVLpGR6@yjeE6)=iBzb=}cg?&+*?(5R0~SNMmZx+>oM{ z(NP1ca7Sl+ zm3q}Ot|@=-9gDl9J=Wo5VqrT&FQ7qf_dTc?K=hpgCtZT%mbkCv=x(_Uly$z(K)$6L z$hRCrIP{fbUb;6js$&z{+A|5 z#H;JGFzS@;MUL(9tR`JZmDW4eM#2m5PVZ#}(mR|onW!@9;Lw&YY~NBfr0!kO_5M<# zf4g**;CcU{L3bMZ~*;flM{`?fLEs1Lyh3Q-VN zJw9<<+mPHnLiw{iZ#;XX|JNr7044pC041Jd0B&@{C2f;=<8Tr@$2;k3vB4RZc8q3I zl-uk)Bk=YP^VQk-Q;BJ9o8wtC&#=~aV!ewOL3jzsw{!xSB*3{3f_%%mMrDw12~b;5 zZ;yba;Xrbkj1Oswa$*P_ZnvFtP<;XRG{>?%aGSLZzRd>7eO)WU3%Ne4S zU?(7@6z70xAOI4OT!ztm-Q#=R<2g6<@}FM*{{$h4Uj9#4{wu>#q)F%`pGRqc5Z-N> z3O6&EZ_8RndL_Lh#+JLPGYzZRmtqH%+*RG&(NPZeOWJL=m)tHfP!~GV~kM#r??V8bLj*~Ze)5FaFTX1y-iB*BahFM|G5^@@7!oVnt`R} z}9VRKLp}5Jw2zCnkc511^kvZ?~U{-az-a)Ubn+PM% z&};)0whpb^rZ*KU0ZO<;z@=+GfhMKi6VvE4i6HCm&uxvb=k|Hm5q2WLuNSY|M>+Lc zc;DbDr->Xl`nml_-wx0go%{Nm$HBzL?e+ibyDr3uPH&;pTYiP!a&+D^Ewzl{V;iJg zqNrFDg+Lt$rVhG?Dt_gbG@L}`y1vp}fETFh-X1OPFpdyNiU$o!6mH4}rBkJ4)u)d2 z?EB!9dgr58oqv_h?GBJ`6t|&-_x&_M{dN16yu1Vqp(s9{qUCX)CGOS=pP$2jzTDlg zfJ?2T) zq8pk`bA+!BohWn8Knk`KOmUoNI}63*M+7^|iN~)5`w(<&U$C110wHAj=XF>U4G4r@ zdhvijxJ5D&=^V9T9?L+&;f_KAT2JKz=`swAMpKy$z`;h&A(vH2cgy7T{rBvbc_Pi~GPy2^M()i7=EAbjS*pZX_YeW=+Gn84U zJd;X(q5AZahFDJPW*SM@WQ|90p6d&#jmO_(1_t{&cd`|H$D)AJ6oM zH+_ES^E1oKUmZ>zkg9Y=aR8;INusKE4dfeJPExD^PO_|5?T?qKahB7ZWS`{QtCv|` zwbv?R;w&F^lKrpL+|-luN+h)mh6Lu9mO%S`&LRH!h-GU{>D96DI2H)0r}M~gH3C{| z;E{0z(xL5 z8{@ci;YB1YaLnVDZb>-ak?L3Hrwl>FVS!+$4e}(+j0@|_)&woh8dOhqlQI;xlYt(5 z1AfOoNBnGOWd>TX9fa!;-)MSwS>V8Fj%^GDxeY#2NdETH4C&=~bsdb4EtSsT}{FXj|vR4apE{Qyyfz$74Lh|LSxNMz5^vDh~y`N5<_4>5GoNYXC{rOEHr(OQZBd7xy&M4&_+ zcvATWNCWs9^tNQ-jbP{Vg&b56ybDkY_YNyT;BC@KJlfDG8pZ z&as3`zd@QjY9>!A|4rlVASZa6{M6-pMTR{W7;aN(evp&9qE2lk@}u|LtUz~qd?P)+ z5uVJ-eU6cPVtqtkKfo7njC<&>&JT#U9Lm9tjknxDi?@WDB*W*niZwtY?3K$BuG*`W z5v~q(-AUsMiRR2J56-nDpKO|>(pKa4ipAA`o=CpNA^$#xYq9B}-^jllcHSY0XyJoiua~P{+Yz8+dmY8gS}U5s7uG z!;W;2xjs0m=YxpI!iRIm>f?X3j2wnZ$Tak(Uof4M@*Ii+w4J~PpuU*~0)V=b!Ss9* zdfpB_PX_SyTQt4yOM3m(`;ng4H0wMf0B)B~25t}j8{l>=288e^Zqt-DOMc;Xn5NkQ zI5HGUeCfMT;%`z*E!KT=x9%Si$4rEgCt7z;QKlAQ?@7l5E0R1nza1Cv=58{A^E-MJg1yU}_iE-Q!zy>#>t5EpVY- z3M#g7AaG&0*#6GAo0L4x0CpmZJi$nCVioWY@wZL>S1Ewy)aK78O*bWZa3y)~Gr2Fy z;(dnay@u@ax3$5wRMF=g#gv7c5Cm3>j_V2m$_^Ydoktnc?Jqlg3;dxYJ>$I4e)O$J zN5bex*sov(Ke~S6nGXylF;jLxl<(V^ihC zn$OY>a0##4Ym|v!g@}ZlP#QhD1H{&2NqYv|IP*AUR^ZKaFw5}|{h&9p5g+n^4+g zo7!$)LnBB+*qW*8sD*}*7Le5mrLPM@LPMLG8Q>={BiS}nrZ!9j?I*Z@PXz5}6+ual zq=!BdCwNN%H38rhm2dwOXhKf_mDSr4S3Y_KJUs$_OrF(GDJ-D%lnmAr&0lZaL;dlL zX7&>m9}{8-esw&C+~nRUkl0`ioWE1+PN>+N2DP|uuzerET0lmzwT_mZwpotPReP1P z(y#qZfU56B)7Y?P#c;SdIs=AeRWWLKY{_1MAnEWVx7E#8y%4wpEWuks>&86c1 zYRx`nn%qQ4YF5m~nKXrTSqfd2GD}&CGc#R=Hl1cy9nLxA-H{~&1zU=r3`dx>gG#zR z)*X`VkTRr&+g+KU-?6k)X+jIN`)8mxwWlz(tH4bNXb?lMf#kz>pH6BB%|HsZ`(z+D zwI`V3aA!N+$4cept_0tmQ7Vs3m_{n^KDAUHmzTkJx#?$(1xlivwm{AuMBgbi&QL}g zAIP?RmaXb26ANWq_JeH8v9k33LFdf z@yz;rz3}ep)&jbn-f_AeX;KTYI2i^?h_7h69ksKaBdiqCt5MyKGtlkal|l-%H)qf& zg-AgHMYD-wby^-?u!x%oT3imnTZ!kbIpbOLx=R*7kT??{cQ>kUIK10hw+#kSL0ld? zZ5gnas)54fC8a-E4dg?F6v?kF!XUsRBu=B-+4$eo?bL7pi^Pet9lMCHoz0iPTx(cO z1YnRqmVL9frFS;J>QN(49hoPxecitAya?%?R+lx`Ltymz0kUQ+ZR68Bj}4-bqnQNKc|cd$V)?XlIiXaKMjs5}!o}FBv8i zMplt*eMt?FzsZPf=VNW?u)oQ4vK_*7vK_5yWIJbn1KExiz1*gk+yDJ?`yZ5n(An|- zTkLqi{vJ{TzErd(BQL*eHj z*>YTe0wNMd(#vhS4=mjWmhJ=lvvBQ?`YfO3uWP^zUG2zfd;cPhxIjzITRPgOBP&Ci z^lGFj>D3HbQ;nsQxH2y$p#z4XBl~RU_rNx=i8aMnri4#lp z-<}GHgg{#%S!q}`a1r18=A^!cIB58WPT_Vz)lAZRBSUmrZ)-lROo#8A4?UMH9ppS4hI zQX=5#GD2fJQ==4equFFUK**E|BwO-zc`lIIgzGiVjRyF3hq7~A+A*HcWx`a|6A->V zFvf`ykpe+uJ-orMIg_?ctp$TzsYbGP=$5O~_*2ul zBy=tbolD}%yw#ccSGiii0+uKUEMV7;vw+p(!~l&v;i|o687n7b3X3C#<&URtciICr zPYU@kx*^9jNAc>=$ue5@f=OcyHm{1)#E?IIbqEZ_K5}el;!jD|R9vQcWb=ol+8Kau zB*2rPBl-k5qIobTIqD)r6cG1J$X$qoau-l1Nr%6Bz)H|OU`JcrH9r4M57?ZPhaBVS zNniSzoKZj8asza8CDvbjQ!b@k0R7xsLxSlEP?p@dMyWiUuG;@ksP>1bX8Jryce&&| zQV|b@-}}DF?K^NkWlq$+{jYaKv@N(q-OJ)!ZfX7CHJj_EUB$)uzJXoR>pV;6m&ex!Z zSnJ5M~1c8h{!GG9*+5hJ=6ESl?8n~bXC<4=dz4Z4HK0iP0*9cTQ)iYJwzo@n36es>7NMdFAdmr01=P%Nva&(Xc zg#Xa{tUyTo045WA37DIKylu!cj`hg@C()n4BSRSRo}H%IuaQLj^sz+0)~3Jq!Lj`i z6O%@44l%RszGk4(dMnLX*w22j6G-HT;q7h*@H>NUQMpy)EvagNmIsqZV-Z@CkCqi) z9a1Wbx;muVIh2+^)IA*9Fl-}h+~qm5jVx(88`%$28wuJUU-id(_5s&FF{@f#|D^n& zf!Cn-VIIhFO~!06+IzAxsY@_@?q0aG^e5oRtru?^ot7A6J>CUElX`)8fF5m0kG7;o zfBu8fjdbeG^wF`Z8JJ19-@h5P1T(dh;BR3`g^8n6OK|0WV_M&I>I9uS@hj8``udrE z{cPm6>r22yr&)1qk7vc!wuOCMh>uA-Ru;+$tOWIF^zTM%5KOG1GlmfOz$pVQtViod z`jWo4HAxc)39zT4*^yK&24qz&Z-=k)H6N-$P7BB%PJFIo+CW*4A`%D?y}g+uy)i z@qCu5Bd@yf?{2jStON;@;UpiRxSfb$Q!0Nc^v3q^jPVw*Sdn&;DW1jyOq$Bugpq}N zIg!RCv6eY|tkSg+{|rjF^i;m?LluntlMl#uM$H7vZ2-GFFF_ZgdshRx_lOt;3Q0qL z7m~Ice#%@HMCn;?mAyId`W?)wZr3~LRdqiowT{q&pN)xg0RL+`7>(p6W?~ce(N5`c z4HL?K<7v`c+c+6frC$~DS>HTY=nC+isu^)im-y;5J?H|H|8E5*86eK-py?(#4=!u( zeOmWfe7$|w%399V6mh?9eXNw>3&oX(F&5YJ_YLut>W)wSj&ELAXD?d|QVTC61Kg69 zUkEC_NEpV>0351PW0O$ESyzzzCd%pb`FDKpU1?-59b&V~YH6(7TH+s+yyT(o#i240lKXRy|g_k^> z<2R*2>u7yG`S%+M#IzhuX~7u=LJX!zD3-GA4-7N=VXs=C8;yjabOm!r6PFaE(8L%F zcQU`3ewuSmUw@8f>zEyJY&x7VV?3Un-gouGXtqx1EEJm6&djg*F0Y!obHTN+S0qdc_1tMVTj#S$0JS%mO2AM{X`0LK6mcMsKZkF1 zP8uP9=Za1SvOqF=9L`m%2pn+RG1MoWc6Qut`*1vP|=&mTNd2;84x zRHJe9lfMaO^~U@bM=vvU4&+Bih)oM^NP|^0_w_7XE}LiRI1seSUsret_4>OoSA%!pVg4Iio^(y|FyPpzlH(KyP#M(1wChE5e>> zd4z>iYUF1qb8nVq0f1uaGIt0>{Xk~>xBzKzD${to<6d)1klYgY`O=%5K5bmQN3v*ps=&;1;*C`nV+4gWM~;)J4ppGaI}30Z%~ zjwTWpe&-?^G$w0ja-?J=*>Xy?#O)t0U zJzRQ^Qcq43yQ|A@gQdtRR$%7i1bnjo84f@h!iq2pZxfk@@GXQ(I@slSBOR>0b`-+O zwiBQv*hU(S@IQ`{bpGDQw&lcR%bDJ|0BHX5s~<6)lM%|cKyedW_e;%~O!$jv5~TD7 zVA2@NoJpFdf5V3}3Fzaw&X-P~pC4|z|7X?@fw0Ay`FT<#3{W}xZu6xtgA7DRBFTDO zdv4)Cf((;Bu%j8@)OrA;j$scMxm(PrBBz=f5rZ3W}09Q}jNnfvKycb9Fv?tf3z5WjnZPoP@@*e0Cy9MX0N(NYFNoNg0iy@NF@eYmRDw{xEwCtu&s4bPVN+oO>&W1 zaFYvyyKL2pWpA!L*XA-i_Qnj1?yf<>kVElef5WGwl#Ekf1tVWhaLt)qahc4-ef`KB zksj6!NRf}M8_52fxUc`2Hkti$65lQ}zPeND@a=5eEf>7BuQM+VUGlx65Iwcik)lk+ zjEXt>c)}04dtd0-!+}Wjd32Zgt3vi$aua=i=<_p`lh}WKe^F5i1ze?W8{c}U%Y9xT zu;Iaj^|yWJxYpdRNw?+ANxD)+z5n@rJIdas@nDeRA2uC+-R!KXOnj+OYXwBxKuNrU z(6hp3oV>}7^uaCC2}Abn$SNF3#bm`N0tR8DKPw2`p~>ng-tRa#7n7bun=Bzcj|R!~ zb>2G#>Kdi44IL|>97Q)YZz0I*U{>PQbug^>{Yiw=zNEg4yUYQ9A}-wH3wdS9fIL#u z+~K8TBz(6rl+nQU#X*JjYbomIZ^^x4_C ziz(h0G9zJ|6pqXnIdNZQBLFEDf|Q$}{qtuhN-_Utk2dyIGwf$Y1g=)0Ol@k8GGrr2 z4@MX(-`VR`i~9VXygulg3ekp~SttBEq?v_IbC%isnmPLSch4-;$cln>70%neE(ptQ z8VR%brf%xnF)-X~P58G-~^u1($ZvS)-oZwNc5~G zLx^g>X#2s^PPqxasXYbwp|m@z;h#GB*m5SY4hhM4+i5@GC$29!v3}LETkZaZE;L-DDEmyphJ>bP@sR4%r@Ke-JEyM?PopY zNBWt;lJ-DfkVg~OkF!UZ!1=COI~+hcdPJ@TE`;Gfx~LG#HeC8u=l@zJXW&CnhGB;8 zUi!8J5v!w0S#Z@748OBP_>Hz54P-5vhCcXjL=cTG>hIq$^m|{`|986gK?FS|A79_R zrx{<*P#X4eiEWkUR#MNqCBPL0iq)~D=B`a(wa*bh+gX``7HlVFAg#{2Bdn4L;55he zC=a*==W$?`;|+8$EAX~DC@))?yGe?|W5SFzu4v61u_F`T5V6%NWAMeQB)k(Mq5JxS|w&bw#Nd z5%612uW$q{=|@7p>a|I(18)R2lA5E**9(qb-hzhf3g~5!HckVI9(lLX%iEv;RY*6} z58mKoni%x*_Rk}Z!Bg{wD!(=}f1`W046&}i*}H4teNvj$9!mCr40R}&+G|23X;CSi z@4g=5myD$wX>L~bNez3xl2KOR?R8{QWA<~W+Eq3{0hggY95OyqNdETH45VN?A%nt4 zKyEY()+|%X$g|v0++ienlbM`lqQ0UApeD{8S*EFRb0I(^Q)##LK*=Jn!$IZSfu9wy zx91NzNGWqmI29ds)J<{QT4}Rn5L53)^YO3`)kATUu~Uk7e&+G?&jehKJ~4+7@9D?* zB)*NmQ?)|Vq|%RZ`Z3PE>H#dXH3M=U1m^#Wqee&nYsWZ|6kM)Jwri=8h)Rw$|z8*II$Uq=VBcuj&qoHd#!HkH#$~p`$r9%O5gpq8mWO;x&N75V)~;O z*!{Xdk-VCd+W*q8k*Pag;}4*x5WJEH)_PD))D6RmUVb^q}u1k^cwdO2tYJHKx%@X0%;v#JF~S>W_X@BiGR zmzGaXzh~+9?9@(P(>IkPoluk+m?b-*s5Fz@s)VcdYGs70LtVLRy}L|t04l*YP7Ref zitdI}B)ksSrYykl;WF{3Bx@=z15l(-haXsf8^92Jpsgee%(qVfNQ4Jvn4>OoOho{g zi7*AzEWmSU2ot&}7Fd8=Pe}l`=3G2GTi8ik@W(LBxn~Uac-87n@miY1;zX2*`%GNx zXum5*hMn^4tDWD!8%#_uC+X#+8}rg5j&9nuX>`Ng-lt9xQ;j2R@%1o{f zX_j#|*0`VTELx(DxUi2eozt0lv0Z5`>*UTjk;``~1VaM&W?}*BD*k*dNR6KLdOhoQ~z1*%jDX&CQ%V0=g zerdUv;q^I(_~(2Mt2mZDoM%(xoWXawX%_yblQM$;A#_`OqTX^QLKk436lX2c0Et1G zvkN_#B%b_=40|rfZ>J)DAKo0q%5Ef{sf3EGqHOUL%Cot47={(;LA~pG>Tj zp+#wsp}ZcfxBpV6W%t;<5;31sY!w^XwASvu8UwPrmW0n|Vn7zvCNLmNYY7aL&0Xos z7y$Q!T8wUK78{Vif)OLCU%`kI_oob<_9yo(<~;ks4P#$ffEhx0qr>}L2dkX@c97N7 zYw{>m}JN$vcDIpV@IS zJ(FcSrJQ9uwVdTiw^QpL`L(Fy#pM;Ag+X0roPMTO8Cu=cXHqGRV$V-6!Q`^92sbt3 zVL~hdaK6Q+I)pz&jT+$KEIBFDgXGzmczn85F&i;7zRADp~+9S@{eeP`l=o@n5{f z>%Gk$-~wF&R&5V+Nm&}Z!blY{=kJU24r%sqK9HDur1P}G#d!}>o%s}Gy?U2r!LRq& zFEarD-nL3eL3@7>yLUb8Z%M`@0hjqO>s?qRk|i7v7ay?B=iOW->CjyO537fL`it9v zCE}1-eSo&n9j{mL&c9|iFflMNlc!){6%qOh_X!C2Wj=-b!Sa+n%X!!3+UN6wK@gw; znXZM#iDo+W4*WYuW){5tK+r=aFrXYTpk~eLf@%c*flBM%{7v{R08gw zc*J$VG48xV087Ls4`zvUjYr2XDqN`9x(S*dYd9FJ->POK&FnIF)zst!Mb>f-!8hev7&eCL+mQ5}F~}fC^~iBpv9$cyn>fJk%ZRL0Yoj#@{TSTkaf{ZXcV8hp@}>dz;e>W zZ*?=wz_l2raDhQY{0_^P^954o(*PmseFH@Bh00v}D8&ETCoTPOnU=mA3P6oVk`z$E{Eje~*$sxgn zUNFBn&%6F_;ROoXiDvT}0$Gk`!Nc|<=J6i$Z+Z=VGJXe^s=abc2<1~Yo^iF6%0km=At{gL)_uypCg^Tl~Jet85TbFy0 zw&WO&1ibo?1qWLoZIy&WT><>2rNZGAyiZs1)Akw*^vNE9g~NJYHGm~R{E#a&3QcGt zdB6_rf8tA9dxvUarOV7%Bt#ac`IXwMQWg)2ER5@nO=b>99(2jRA=qtG-XycP0k+pH z*lZ0ipC4iQEtci)tX;CB14kSFez1nu!`k&;@z6avqd&cpIYpmsdZ3hQ@G;^#%UheGm)BY3 zjPCgOvB-54nP1zw%UB2DQ?U4r#y}NOSHhGtHAD6N`MC%EjR9vcG3#&*0OKtHS zzwFoW>oMSXb&xzO4K1~jJ>YCTyJK`;`n1x%=|<-n53xt+pac3v0WCIvJ=^4=q@~!! zb+ZU;0&vccJ;*c^xxg-X*mmPl{DH4iC>c@^5x`+ zX2N4aen*HWxB+O}vL5D_{cqm@^p!vR8{kEM4e}r=Yfz+(x=QM>$DKI`^R#6P6NS(hlG`It&2~z8fKsU6exah{V7%w*kI~?Ua@{Hf>NZgFLhll*l8F_q zo+_wl^#n~%wR{E@EnbLL(LNCwU^;@|<26zZ<=Q~C#cEKjt@;P5Ap!?fcVI1{_fjHm ziU+_Xa|Rv&xBl%1z|_R1P_2Q6$Vr`{%a3_z~kTn5ClB{=*Rzz z4}jmY@R87|zKg4K!Z;%H!Qn3w^*XH3Xd zpKE=6%i4eD!C6Xs+G#1$j@Tgj5&I8dEMq<+{fM0jV;Qcnx5YHa;(J9JHgD7aoH@AC zjj*(c5I+!2VXL;gw->)Nlf1&-+JBSje#J{sZeq!1LyCV5F2Qj;*4xqglu}n{>-Ja* zZGIFbNDMlXOp)K;&wB0C(_2~RD}^`@-t~+^cgaWxTIS);NOlzXyS_cuZ6J;sXbkKw z2`PD|R9P4J#I_rw8rvl!tWeSW)~;dzn_nDjK}k--7U;S*JxbY;Fc-h!@5M>J2~mdG znO8D5keG{+%Zw#;tv>YGrzOXFrrAWF-ou11y0efZ)^$OY!!j|+AgcUf;pgklm6iC4 zAZl5OrBvdHFEwv8rMfKl+8LpWN@7eB5lvOt__%i5V}o*RY+QTg@psuA6(<mgC(b&)UjpdEHTB%-Tr#2cQ_jFaPY@Gl#XF5H79;?b$#20?>!ZE3o|q&mNy7K!OG`gx+q$U0v@Nz5M7CM^=DhQ_ zKnDaZcX?M#iMM-sY!LUZu}XkyL8WxpSXo-4hAvQRhWZ0p7dp2!EF|DdIN57ts?aiP zv6aZK91Qk6Qp!J2*bT|nVQ1ZJo|Gz4QFbgKAYRWit2(yzZK}F?)Ll!(~9q+4lx!} zEItm-#n;H#$J*I`sA%;Qx@+n8*05yArcj}}aA;xrc|u!euWMdogT;&JBC^7cpu!Yu ze$D)p*d?(Vs#^?29Pn=cz@X3{ac}#o@+C3rYW*?WutrX@g&wn6e9V z-nlpIXX;>L!k~JbsV7Li6*YH;VyIcy)XGdO99?xvQI%_W%JUHM;e|4YednB73wOT8VW`IZS;yO;4Ij z6k;eT14$gHC{F`SO;b4s%H;2lgdy8tGFdt$0CPT6)K<#Mtz-L_dIC!5N#1j?Ca!&s zuRf$0l~$-Gm4>u1A$*pu-r3`SOVL7K-C@tY&1-@;`m+`p+dQ{?c&GDBk4#b4Tl4K{ zl|p{4;kwopV%S4I@6100SmtFv*L>U;kevO_*Pa}3kT+I$hkvAEVQGrlr#_r(aOky{ z{ui^PSyb~WWwA1vY#mj9oyZ3Lo;7e84Ptdjb5UddxhVfdQUgOdyGcC?qGbg05`~o= zC~@9Ujf8Xla=l%4F9L*wht@WD+b>Uz{UVGhKOabLe1i1pwR=O@@5x$i7xS{P|M@^; zj8Xe(R1G@F?)5?!jjl*t@`eG*xeo2Nl}4zSwx5{-rF{|_y9fMRQ>A2zK9xjR?|9)V zn)Zjx=Q7)C5#oxxy=U8GaL&BTjW_zJ*Y1@=z@p^)*B$r0ZGo>J33f445*n@MBN0^MTyK7Z$|JvW& zL`66_FR$6aIf1y=9&P)%ut=I!5YxJnlhWSj*x%%zho!zqTvla*mrKHgvC8DSa+We0 ze{kirbSGOkHrHO&@DmSZ*;96-)7)IfGBhdKZa}xEwCRl4&hr(z`oY@OdGaamQ+Jru z9Mr9@@;zrNRjOs8Uzi?-Cv({%lRqWoDyHnGG-jY)t*x?pZnew$QeK~V%@>7Y;bZMv zM7V3-)i5~=YDw1g3g*}vs3+VA?cSMUno4MmVmCn=q3ooCg95&+dGLYdOXnk!n%c66 z1lyYM7s%@O6#*7It+wneYE~3KXkv7}>~1(i(~we)cx!53|B_f73CLG!&R!t1WRxdPZnJNjb>&5g|c z6@#@@tu9dbA$`AR69~v8>u0S+>9z~ zco^E;=3H26Nph|xHK00z+^B7#RI)oKwMvG9@4J*>D=l!s%E|^s?jIPaWa8yj6xXsO zlq%xzSPP~sOLRL}*}<+DX^KrxU&lqup@HZRL)CK4eMf_PsPiPV;ZMN;wZ{zF3v4{m4~}QwhaX ztc*+4@qyqXA8Ij{glPyylI_&{E(|Dh?CeCR%24$1nPP(R64C>$IeVP$CZxy&Kak-Z zvc+J6t55o*oh|Op({erw!wDRFg7+DsB$zfRW_<`)DP>bp-C>+dX4hcVqLc-8bh>1ac&l#gLsF&bg_XXkl(w$^!mtkGW(|uk z$&HG(y`-XE3c4l~n_Tg{|IndvKs?8?q|$4MXS7b+CR z$|N?*eG+lr8lWYkMeS>7pcFnlMO?YFudgF{$7)>}bC>y&=1*)0JsX_Y3Z1f4HtsGo z^)$_lNs;dgnYUMK#V#v>Tne$ZFUM2Hv{qoe_dU;fq%w6BU_H%DwlzFPtvx7y{b>&t^Wzbq}%GQ(Gu~x8q}& zAiRXxkgIH8?W0912UPDkm-2*HeIB}aC*%Fj?Hxf(DtrGV9oG4~ILxJfgY47jzw}kE zl1OQG5dyhI+UH*1h#2swcShZKd0^;j)QyGvcuY~pKmBd(S&MKCg4x3tFfZj^CAaym z_Fw5o9erVD@RiIPxsS<3-__obE;diD#w9k-pjXw{BjByTvK&E{(2&?Lt^zflf<4VD za>}pBZVi{u)}QQ;je5(-TfEV1AKRV&C0a^k*Hov&LGQ!-__SyB7h4BEcCq}`WnW8S zAN|y$cm28MhRZT~c4gEk-7+i!8=^A35~sjMqd+pqaoxCfV35A$*Ft&MrOL=i1C4`tZ`@Q27{ zeBKrlc7vHG-5a(OKFGY3YZYR%hxW$wza5{!MBz=$8@Y}lqCK=XrSEezf_XT3&#U)N z@NDFf%MiHDbx?By_^~=YYrv1?&IdnM2hAgQFOjT4^yAX0_p$}w7(UByoPkIpy)ON*;~m&(I1lqd?t5~ZeYDr7D>-_@4B%qSh8u2kMYOyx<%y``I&^HW zhtrKhX+0IWi_3-AFK2x+Jm-an;Jw`7TfqA>O1a=Hdc}ERJcxTRHRe997WvJ$wfWKy zIKF_fz@ISZbKR4VzOBulj&O{FvBBg2Jix5#_gGE6)YO0LX=hy*IY)_I_4VdW1|D7x zwvm29Zg^a3<$mnJhs@yy9`|o7soSfuoOcszbB(;#a`mz=%e3CCDDJ!5=dkqhQiq$D zZ#o>je9$5Pa=ydH%NrdcE=M>RUS7_k=$y(<$@7`pk3vp?Z_GmuvyOv$Hf*2?E=ANc>)~wLXunq}(k3Q{i>DzN}ufP50 zZIRpX+x)jz-GO@+q3jd9(l4{wwZ4o0Vm7*OQ&yd4HhHnWjqIT80@-V_`((3ad1Rl+>dH3B zu9Uqit14R}D<&H+BA2P=Qd@d0$|L6@QNY7V@#N9Mm@poAaH3`q$*-wvAWb}Y(C$cp zH23potVol_SLBrACGuJ<&Wg!>f=^rLw$5KYXZ5_*b63yzo#Q*tcdqaJ<8zMBJ3jaL z{PH>F*<1`-&u(b3p%I&M>cS5&ODA@!Zj&R{CaZti>I|l&JHOe$FSgm$Lo_&`B=?aT z74~`Y0j2|-Z|1yN_GZzWRc~N#mcLp0hW*XFH_UGqzghEU!5cB2^F+iIaz&R)i6o=e zUXQM~<k8my6e!4 zKRXHf*}J!cpIzT|KCzuP-k7iB6|qC}z&TG|vOi+iR8((gZ+&e4AVmV*uIdja`_V%6 z{%Mw@;c1U+QGEqb3|ft04P7c+@Zgh+eN@0~d_EO|`WEbpppyGXp5_$Kh{H@sF@3jH5P z?dmM=p0v0n!KyX*K*CO?vfEeDW3Az*gULyB!`ZsaykH&}oTF}J>NSFYjQNg&CK6vbH!uc!i?gHo7=r`eCpykz zKGJkt9xAUMs$Yw1lv{A|5UJLnUgAVj{;N{1i(YL@!TQ)Qi0}VUx>Ygh(_Xo?ji;_8 z^Sym|(x}$8en-Zmg)FtO(X;+&d!0=iA zT2^aM73(%V_j^50Emb4M7F3@^Nqu6>{Y*<198#H5-rAcJEGiGiOf@g&JF8 zWW92bCt)r6iKGSAxBc?MbhKz`-RCrC?D6fT>v21wMRTwH@~q}2=Am88{vGZuuf2P( zMBRvbrJ#TUmyet2U}ov-i(aI`76T8#&9CqHQl7H86khEahy`bE&Jl&{CwCp1adWa` zHxC_=4hnqkMc@Kk<;umu%yjO=u=9+ZB11 zB0J+L)u5J3QqzCs7A$#PdY&qmo0f%u8hPMdy(jn=AM(J1ra4Hx#jv%0kxW|--M9M^ z@f^Xz$2v3+MuaVjU3a)>{>SN;xZkUftr#%}*Uu7t}|H2wyyFX*W8Wvc?R>X%6RP0?kz_QE<3;@?5c;1-FjJR-r$4m zIVB{M#o8LZTXd|BJp63#^A@~91Q2Yu1=sCdH~kNOblx_Tyq~p6W`~@jrD?T;FrtWu zbuIBh(@T531u(2?w|NiqYKa>4rE=!!)96WdCpZUQia}T?Q z)%8rzttU+P1`8t;jC&rlG^3wN8ex5lUU~XMzr&IAG>UQr`n)O%XYG0__i{E}p1z0x zd!46?!IMqH$^-mlhYQwO`z2!-PilrgXo4{pvGt3n#_B5>X%%A?Jb7`a?N#hLulO>| zyt@z8u<42=cdc^fmFuYuT!rS7B&4g0*c~zJxxP^H%jtuir|Ukgx}?G^YbALNtcFEq zt7l%qYhH=xpEcJJ0^_`Fy2(`-F@F)^#cRWTY1Dn*YOG+{h9CbDw$;H@(lyG3g^yR_ z`TZvgAI(tGIGEfkXvr|Y#(REVqq(0j*i+3#c1L>oyQGR%n{G*v&gQz@W3-wT8tFi` zlf2f7h0AnBXYq3{o7{WXl3{p_S8h%n!x}Und|m49OxA4+Z~MM`3T@y3#qeM|>Wc1=8y>5ltYmPLs~^jOeBI)ldkYRLgnm*v zKc`OY?}DRX0c6c}Dqs3^h8hO0O}SQnGgGXUbO$5qKUer;mp}JhC-L*d;SEM!evFkH z?iKYm@&B>+9$-ynTmP`*C@4g5EI$le4=OkyHy~69X zmxnHIycE?vt^L^j8$JN#M(B*7HesWSOoE3mJ28%Vw;yUC9N)bz7qo7wF5a|e(Q{yQQyjnE zQNn!m;#*8yCeXnpw0IZjusrnV-xb9-Jc|S9rzC`>PaLrlTD%D?3k-#;;;nSz6JrasEt=l zzRSKe)4+H8gn>ax-Oerb53N&7v4@vjKc>CJ#k-S3gz=;PXGIwsA{aXV=zeAQ3*z#z zlNXC)U$cl(m8EC#j%^aERFhJJ*r;6wgs;Gq<{E%+4r6)n2J3HTADb4mV zZ7lb!tj~{s{@FY-#Le@P@a)+~yq#lE;;r&K<4x2TXI^5fq4=BDC1Fl4Hp6rnZj`@P zbiQrV8=LjK<6_D;T_v<@lF~-0yQwPTx``p0ccZQrRgayhJxz7#bS4sNW%H!Q_kgOJ ztJFA|cO#Rknn4&Fdrsr&9Fc_Hm^SlP;{q68KX1f5xOvUT$VDRe6Pu<02I}YaoCl-U zeDqwBx7@mw9~}FIQJW*8-y4%{-U>WtVDIM*nFlwn`53zFv#rfrp#?DdeqO(MaNU}Z zzDsSk$aqi8KKnWP_zT!ib3yZwV|orHas>`KcM4p9Hv)Kj0BY)SbDV(mF`eS|pX*7~zAn-D*r(tqIO8Ow?~*~@?f1qB zFWO|zB}8ABxb?)RfDD{*8q&vRkf-+EIQK=H>A8eKUK_{zGHLz58cMR)!&!V`FZPw! zcQxtY6{oeGO3xzls~cw@%P)fFgY6jeRlCPum*p%ZtTmMQ_pxC_O|#MoUod7w$ztO3 zn@7NXY80eFCR7Dvx+eh-*&R$`qZpwgm!9N?_+&sd)l7I%qUfda$J zu@@k>sjwEw=9ebqVRujz!vH6sUi(ezq( z9@|xIPj3fUw+cKXxy$Z1s8ba9jA)-;2a@EfJq3Y(%`;B1W8fXx?>tBig zzK|#xW-s1P_dD#cd9aV3tGfZ8F4+^@)S})~6N>=`bn^oilSIS?0DHqiZkgnJgXclU0y~#Z(^by-Di}FTk1$tWJ?(*G#=%f-si2kndLw7&Q&8sdywKfOM#f}XE|p6l$jf7SRy5n#yv>nj64Y560OKh(Xi@@J8K z;_J|UBlPcXnzY9K-|O2VaL>5)|6bo30h88y|M&W~2#grF{@?2xBk&@+{Z%}R#kPgj zB?VoF(rFxK8WRf_-m=~*LJSQG4=*tKm1~QMY!@T8wszKIqjRV!hY<*^ykg>Hg?B^> zDmK>Ao)Ya}NI(rgAMV|r-$W0NY%Zbuy;2fN2Scavbt%~Ap%!98I~qGXi-0tKm;!Nm z2(#U|v*Co$CC+0OHgOBtTbfIc-rdh6=H1ycO>QySI5*!|4$Z{E8?m+pE<4-(Z97Z$ z_(fN31|ng+6xg|-Ab=jWufcM1l`mo4mZD2>R)tu9%8D~9z_th6yxfiFA@a`|*9%dU zn;pPbjIZp+Ft`~?yi0N50B`Dn1K{7;kFmcYW6;X#r1T@w5&We=ho@Wc`)K0j8*0rb zGAwlmW**uW68a8(-_2w_K@%3;;fBZ9pM7zNhtm73=fdpl?9N@%X={froY=O#ozt>j zZpGk2W-Ha`!+dD3mhPO6Rn~9}$If&GarusJ)Br;_Itv|IifQg0V~p&tiPhP{R0tD` z`iag2%Ur=I*(+Lr^w1d!f!2`5es71!wAJ~U1tVLL45!?F-3-bOF}zi1p#Y(IbJaQ_ zt|9eS@7-Qu^Jq@pLKNOwftJ70L(iU zm5bv(tJEBgyuzZu zYWPgDT)RmWol|ycRD^(=NO50FXm@8qcf}c9v7xSLl@z@zN|C0;jtG|?ZMUK6lniV^ zqz%+kpbS1_`QE;RRm?IJTj;%-hwr;i^bjd%bxFrZu5poW<)t>3UJ!|C$F1sZk8Qy5 zO9r#e9p{FJ(x!lk_$T)fYCxpJkEg7`Q%xRwCACy&Umgn8kk2T$+I(10(ZAxfosjIm@_NR>uy$oR zX=Yxr1KaR;eS|4blGJghS!uiRJ5l4!Q(F#^qFIQZ6&i-v)l$edM#VRXF@M|SX1vJN za-3DrOqx~fa;leW;UI3a)XcfOXo_NGI>lQ@RQuu1y*7_KSG1jm2Pfa|v~k9AIy)5_ zPmCK16=Jro#gn>3m3(x-L$eThb%6X3$ELGCC7H-v{hbOi9jD2aMmq$t%+wN>l6FPD ztcgrMUZbj&dYf^<`Kq4E_`@ib2eTzA51bMDhe@eqI}l)H{dR+w%z=F2iSwGt3~`fin@ZXoC{w zjw|7r^-W?bx4U;)O&<(AnR$thlBB$R;WHK@-LLCGaz@4w@j!4yQ=93>8=k>NCsk6Ri>Wa0|-=33pzyD8&(4^K8bKFdaLLOHJ9q&1DQ2+Wpxg$+S-9^rEv&b@9 z&XkffKdDSUPILNT+Vy)XN9M@f_0A#LWn;-O;V{i3KIHCp=eW5Jtv#u%Jg!D_@T54+ z)=*@?IV9wek!NKK_n=)O<9asl4SUb`EysJo=Y_-#U{B{j0nz7j{(;$1M$;$uE16A> zBfrQ(hkHC6bQgWUVEwtyuNwLvW8Q~J&4HdppUdWDviE$~@}dWPLP-2CG0S6jl^`an zVx89Ay%^S0NfC2Zu`Y|Gj9c}jh!yvLg^k~Z_`p?afZ?*i-*d(Y_I?f&9(^vC*TCMh zsfGJkm3wTa(JuL-7Yq>+|4sit!Q6oVT1ju6+Tt}T*Pz3UMx&&)>Lcz{u8D^kO{?lO z7OSXw{+_Kps8fW$tAtEQTo1-F2YM16kK{dN?^)e)y9fMlW-e}jY0gzylCit3&Ths1 zjGI9nBTZjGo&8GH8MlX$j6(tcK~y=s%J!ZOEw_8YmxaU)VXx;v!O`*m43j>kKi=gm z+qVohiMjN)F8!O7yNdk`W>fftXu#uErqMgn>slv7!{1RhF;{g+ue+WQjX$(&Hq0oX z1N;1+2L5|~*S37<0n-YJ>%)xaK)%uO*}Q!Ap1;pbPSv#wx%gWN?6(d6b~Aq<3B+m- zYcni!C6&!>K_>QXJ1lEuhRtoKfibM|B@DU3%HI1=xb%gsT;7NFo-HjOdcjwP#9^?H zbD-$x`2Us6X~N%dp{j+u2TUS_x(B0~19?R2A$dXep8wA=kEDrtdQQ%lHcve$7fsg{ zu28QS+#)y=?OohlY>J(1p_=LP(^i~>`Th;{g;E5)J#a@c^DIZT6s6~2w}mMMZkde4 zsKaV6M~T|&%AG8!D~cHAD(ju67}m*u+ds?|i6TS>My@s+5gXU=&As>8VJnYc%yb%{U-#Z31oAzqnL6)tX)+^61k6RKkOGuq9G2l+~ zA8P{;2H}V8fU1Eb*#~~FHb8K%Hek@qwoi(xb_uVUKkPo{26Ef9mv30>G#3u97YTIH zxvW-@dcfwp;wJNXhhZxIa;eOw*hHg8wjV8z#uQYEX|(Tf4NvD*p`D8(_`N;i`{^i2 zSMRseD^RD9q6)1ThB`*?TorPTxzz_$!HV{O-bn5$jS5*h@Q#~@ToK5%S!ehtvP}ZHSn35 zFu0oPA5kCbRHmj2%1MWHmCO-m&7I5p{P<&Ej81he<3e#Rfktp0&vm|NIW)q8wy&>A%bsxNCI)&WrB(H%m^l#}SJv;X4=+u|x=eQGBYd&G z`P-PeO91U5O(1k`r(DQAIF}YJ zV)gLmq}90Sl-P(V+x{)Z-W{W#6s;b6MLKQT2(Bw<%#t?GZLc`GbyM)r)1xnSh4yYr zD6T1yjWaFHwx~82ip|c<^p-qaa%o?fNDL1iWJ6F+b*yQoHNBoCOs)0T^t{aS3U^h{ zh}^JG2p#0Q8giEZOyj(vq?L=MxoBuJF;3U1MPR#O-jWU!3Un0cGtse^=JwtzE}NSk zi@`(IGToBl$h4UpSn;5Vcg}nd+`9J;VkOa!^LlS0LOCN1wQY#AxLv*^b2Sb3W}9bf zp-`ywC}crftVVSvBwWzMWvkDgwOPCOp|soGSzXHLpa9&_AyjPC&U1^{Z@LS6+UyfVx>gaxr3{0K6GgH7M74ix!qo;nWPwQt=f_4 zs(`&Z-^W>I0xRd8=hT$$UFq_9IS_8&A8)Bp+Vb{lAH`iuE7_KocboGID$&^tLxT;L zSTwd@WyhIn?RQKEjdl6$^m4qNrP6UAw<>v3I9Oe3IqFup7_YhRnDD@?Hdxg|8>ZEt zBsBic4)I~ItHBi(AzWmBaWa3>8B)`72-;V0S?sBmY;g-cao6m&v!g>=i^9loVTPq_ zF?>d`Vx>sext&X7J~U?aRx2Tidb_>RyWN)+{rg56g41V$*sLNsbzj_CDRsEaRRbKd zno1o^5p0jJ)R~Nd+p;NZXFe`O+RU4^vRYNJj(aggH+%%zVNRdZUjp6g@5fJ8(7a5{^?)>K30Z=MaU-C8|)rf60 z*-Wg6eHHj<%j?5BMRrj?Onr9=dI5BZg4`W-V+8pF)aMWdn>$K&1bGq)I!tlP9i=>i zJPq|ZOkw7Z(i%ZhLqQ}I-tH)a5hNJuLqd_}jxrxX(m_F_6pikvha<={P#;nXj62G8 z1jz^m9ibq9gnB%JJO}kTLc#V3AnkC`6>iIg$Q; z*}G&_%k2=k(d~D!*7~~=)zoKyk$f+fK3kSe=FTNv*>cwP+`(Pxv;U~=f1K%f%wy!{ z&(3`nj(>F3_$r7&$fK@hWXYKXXzIfjd%(i>Ka&js>5F)WFFVk@j&r~eaY1O9XzZ_K ze;&5=lobB{d$B1!FAs)AManHCDSY62u|;>rjY>+l%9fGreHFV_{~aW1N|y6u2iupR z|Ix9Z!G7I^U9RU((dX{Lj`V;Jej-^e^*pMeBbftzCj`v>aU}1dzeQqxR=jVcvNgL> zA*Zr6r&1voiE^S^d`7h%PPLv&wO&lMUQhLR&3y)(^`%Q+c=ykcPkX@U?LD7HpSutH z50j1};_q6H1KG1V&<{f56EM4p6uXIOyNOHo6EORM(N4eh0l%#YzpXjHtrfrjG|Ch9 zo{yu?>A|FcB-URhn`>4+(7yjRJuIr$kIkCC(bniH=%|o*b;}DRFBAOCQTVx|@QX*` ztViJ-N8vor&SWyXb6u*+x>Uu*0;J0RrW0R*53%?3i9V+fdk>_S{yK@~HJAf|g~V%H zUS$7A$hR?{Fjv@Itax~_!v11~Xe(-02Yip}NUe3+KnzL^`B9(y`@c53`%mtDB7*aq9Azni36#$eOALDja^Q zfwONpNmoLIb}So2auaYfRS#^lTe4PdM4|^?2L(tBM@&vPCkXz|t-9xRkIv(#4jfpi z|J_^lEBm+Vnzpo!r#(jr%9CQZ2du8emTJFLx}jG0(Y5=G#QWp|Cgq>z%K{q^3Y2F} zJ|;oAdV^^QcN8d58fP8DP@BU$j?U&=G(MM5Z8(WL8TpaERknzSVy-(SZExT9>~QeY z1)5+t%JEQV26H|ly=(-ce+#4Ajqt0jP$)k}(jgHu>Xg&A#UEYnYMRfyZRL?NWMHuZ zacmKDqVbJ&?$~NwLU&IX3V$4IrE+#QpRw;RjB!RyPq}(3=tJs0j_UO=K9teP;o){(9XD+-dHt*)f;OnBx zfU_sYn`aHL>qik&aKvVesZp_7M+Z`jK~4hrjU!=OGkEOeREmn}>ZTQM{k&ucOFu0o z9F%sjTp@{AQJOf=ueIq0!6D?QhMChCGM7@YD1z@)MV~hj-dOl%Ghth^Uj@;*LvXOQ z-G+y;X<6LW7k2D1w(m@lmz?Bj?w;CA_saD2hz;x;rX$k(#Z%mG9{LwY<337s zz1EdT7)~2?*`R1*Hhu;!fcZK@EL~^hNHi1bFr(WmnpbY-T8lY;bVEdSUoV>~vv8Ro zf;;kW77Nk9xA~jB!>(u#*6)1e87|v`jhm>66x!Tc-3c4qiE7QT$ZaEvhWo|ns1~T1 zm;abqY3}Y?s#f{W^?}O21NCW@2UQCcN4Eo{PNLj+v`$_NIzkyHh_* zd#ZbgFp{ylj7!$#XiKH)HLm5xyuQ3qDphc!{dE1b(<@oaZpt~W zLal#|@cIolt!w_hv1(KKrI&62^i3!61?Pw?9w-R(vd1_C%IeVpfwFnvAVn-5jgX?t z9vDawt4BYih|Oc`Jd|yI?mLr75+}^dt*hClp~~Loe72HhT`D&#wE8Pr>)vg>b7Jh& zVaUD0INq5q5+qaQg%nOK<-1X6w;Gji@AP4M^4iskYN`tb!xEi+*)+Mhwy>hN$%8d2 zlPRnHD&eov@KgFq@SSdknERz`Vrt>ijch_{vWY`3YD`||1y9sxOUd7`x%`qhAj*5< zI#cNR;uH1xQkFMt*j@?+JiNMUoSK4bY zJSmEsHcT(|1EQWzC^Ny%3sToVk>b2*bMd8Fz`)Z96()!CGY@CmloX~5)zj7<=D)X5 zFuPkW-^g>*#k~H9H;(lfICr92>ole3sVs+n#(}~6H-#8MtSWhIUSVU;a`9C!#zL!h zNX4J0Y*x8Sy~)q{Mtf}2_<^(noBa0@yuEmVa<47V%zHuZS)Y3Te3dGqs@&=UIIFbyqY#hl1U5(br>7?8Uta-D2nZ{eMo$J5yU@w!SaUk(pewMltH z|M2eV*nX4kE`5HvHn#i9csu1XRjP!c1Peh^Nr_TOUtn9g4+WKCnX1eg(Np?4I7S^bO8g;C*+xmRd?uo)5vI4=YtQ+bi+HEl3AT^`plO5 zy}>u!2Nd7PyFfh<+!o`rX7~{KbhZqltG8{JB#6arXRisgT`q<^Z-&^;_XUtIG#D#L5Fl68 zZmjBrXCa5!3~iV~u2R)Mlajw_!~D`VK`_q}KFIyg_zk4^1#N{H^dZ{E*$|zKKj#h~-Ow2#m zeZzy6_BF2bAwPG;P5tk2SQtP+0d{yj$y5%~y;#=#Y=%#Aa9bY4Q>FGp1C2(wY09~k zMH&sTIGet)At=KqKA0yD5~5Pu-k_!dzQv|*V#uE1lN6l&i3tTpP@d=<^;4;BYk+Ei zCE3P}4e2v{5`wMsATcVn9Sx2eU&^ zmZrmGF4sg8y+nnOG%T_tWRdRG#&JkmmL?LiQupcyaY%X=SyHlo_iD#DBm+wmDH*}N z`lmSLSr*wNWOR?JpT;52voswc6M9trA`Z#KB72lf^HFtJ9Fm!(=_r}Yqw2UgBnyiy z8Cm3`>eq3|%PdV~WTlU)k#R`&32}oNEYzHwZ2VDmNgOv9%N+Tet33f_nyBhHZl2eV zfuCM5cu&eU&M~GNxr~)tqE4~cYG$?fbOrGb*!xCb18zON9LDppim2*8f58rcSe>`6SLtM0*oho}4GuX)Q(Jfko* z4aS!0 z_dtAs=dY32*3bU@weh_HFsKR|v%Zu#c~`+ri_5%G)J3co`YFAi0_JX8^Ms3PQ0Mc6ws)xgToz!7xd z2zAiEB}xCU$(nyoWB*H1@ZX>exZ3RlUk_&6NMhT_XWOV@+vsB3m}J{nWm7Hs>0g4p`?`9GCce9A^qP4BY z-v@hQse6cLKc1I5prDzKoy`+^-}ADTmQ77Ir`N1Nw!d2HmE=ppg=;$ms*5s4sh4^E zpBygW(XY>HNj*O-t|aWwft%Qn0&Z$c)gw70b~ zs@W)4oz*Q-S(v)UW?ac-tb=r8O%e^LX)-4&Ym@N9P*y$7DhlPQGT50LYM9@*K&r0l zZ9^A=!0{o5=p{5;-alxx*~T^E9CDpE=z*<2x=n?{_8x04jlG2ay1QkZVjR`Z2o7aI zjGML>@y5C?Lvrs-y=>!#xwh4;*L*4W@+3UGqYEFplM{7DQU=Xw+O1laW8_?>j$|i zWp=9%x`?(*aE-?=b|&j6OXWUdakGudxVL!!5}h4870x#meEkFG&704apv_ZaXE&#r zxA>bX=tdx5y}W*TqS+up+42p>c}WaMn7_k&qryQ~B#6t~Lh=;WNAdd$D@!%8vs_}z zxVjVzsQ~Pa+!wjdKTvUP&2daOXPz#2y^L8{YJ{7!4okC=nhU^rYevTZ8g#4tk0qlj+ z=%wU=5Js_d3|H9$dQe)a6KAAD@R(aJP3g8wg$u`wHH@6}xq9HzH1p&e#sUu{x#gqH z4gJw3uf|qJF|C%qFf5+usxZCBV{iRTULKhm9)aSpKxghG4jv&4VmK%PaOfVbVDehV@MC%FO8QTAmJm z<~hTJ5O+a}sdrE1gmqmKr$;Nzx=S*G9;{n6#@_wQnvhOihZ}$J_h*> z#eivmLpcA1z^j6$+SvAiQrQK*?)%u5kKpHPr*!Nn99>e)w3A`RCriB=^d#sE^Op45 zJpxOS%pFJo$MFI6I&QW3^t=rQL?kUb3?jukA7#^C-gy zOwwz*quZ{Xnm_7>E-C8-EMCidmTec#aQ>u#sB9n5mM~DdB$)xA41B*E#DWDMqgTeQ z^QGPMNq|M8S8_gprjy}C0CJ%1cYe=R3`FiGvjeSJfZdo+!TnI%F8mpcMykGc+Cz(y zdgJ{#q7s4m)GL&(=jRgfXEYiE zBI+7eV5XCt^nP!$-pbwzsE@AIFdqVQJTVsgFcT5_@RY@Eb8Tl@v8H#xLf8+GWWc8Y z0q}OGwuJZU^C^AI0~PxD9BJ`3lA7)$*b+*1fF;3~GSEJwk?&M^XT2guBh-WiQrw~D zogtJEe|(nXFe|CEN#;()ZcCeL`&4!Q^P3?AtyldHZ zGtyh!Ck23|gG$uKKp1a)j%e)Xh{9hLpB?Wkxlv-7a39;AyROG<8PrzmrCvH@Nc((m zw#s%f?atOvbldHxdGS(77?tN`w-m;`!iy9o=ophfI)~1%Kz7&rDrbk{-l}nNkdQpr z?sq;oQQxbfCPr;sFtR+K+ z&Y%5S`Pr{K@AFdj{c7Yp{fk>Bmp{9u{MoHL=Q@%CY3O`aUn~6VR0} zfX=Xe2CDiQsP4Ir^3On3zW|!`8K~}Opl(lO37>)LegU-nGf)82?%Hy&`p8y&X?wnq zt&^_hwUD|MG<43OY?S>?;HoFiOTL?KNDyE;wtfVd#=Z5lKfjiDy9 zIEu*c$w8V2$U!$@?(r?`+(99SJxy~eZ~sU|V_JJqJX{UPKkucOKjokQAnzQJ)fImX z{YxJDbC&rZQ_p)@=Hv|}#=Zw48M5nAC;g;$GtkwlH%B}3AkFyF7b4AIh;L#(D@h)- z<|maDnh(pTzSoGo|0B6F$oR?g?>H3KX~pcyiy5Nt<`%EfN{rEN*A^mmTbaG5E-OKW zG8Juo&(fbnzb-xq@_T01sWptMHRm*P2hzjMNn{UXwGyU0jG@e#inwzZcEvUhJoD{! z)j9}dnrTl_)V;f6%6(~lt$S~0Z8%YB>6$UxQP{F9za(rjvg4P9| zxM|QqThGOmwZ*xWsB8CH&T_+!hw&b10w0VD@Z7yq6yGFy@-f*!yW>$Svj!)}N1K6b%XG5p+O zX#$^`0__Qj7xkZ81=iEA#lH~vl@`K@_6&;8!lRgv$S zzqI>Tbkf?A_zHT|MqLB&^1wcX@ftUQ`KCbsW9%tJ_YeO~kURuEs-mjywcO)|afk8J zG=V`=AQD@W|4#On#EC8W6I&`LwscNx8J(~yiab;veW)V#P(?g&Y5n)WR%-&YPl2dx zNxTI;YND#{x7_1_A;Wn8x3G0vKjDQ>%fK-*aI6d*Cj-aJzzH&NVuQdy<%!{{m&4V- zHR&(=_aKZH+61Pb0s+?zFF_AfRFz)K2siBiFKqPR_KpX(7{=?^1QwnGG1!s-A4GLg zRr)O>|Hs~sNzF*%HPqx(>YD3*lO%hU8M7^J;mY|Dnti{bXQT^#27TrS!5VqI_v#n@p!G1dJrSl z6S1*93@?e^fxp>V^cohiBtq98I62OvCgDB)qtcc~Md3x1-gvwX52e3eft-~}MS6j% z8<_d2u4$+_&#*b6%qIJFg=+gp(0P#y19^WS-sjZ+^Cl zUL}M&sre&FrtOL4lb5UkQXYGnH{R*w-(8*VYVOE7*o3FMl)H8Lu zyK2OXb>M7hd>IN`RhXhfk5kSP=sGvzwBzVl(i;-{Xwt%{xKA_#GrgIu(F`jyU3DtY zRBbfPKX%9K(OryFaS;n68rR!+pO8Z_Tk*{4HO9!g&u7pICs%f)x@I9%ZaXLDF7@PC zHb~3?W51LdH9yA1prhi?73p2$x~81L$peLtIt$8TF z_bQ&k6FKd9h!=xK1$4IC*|%zzCwE@yhp(I#l2h~%X7NWy(N7i(RO`h<+-mA z0}0Q^;g>|q7hvb-beD#f5&8ImRJ?;L*2GU{RQD}jIi6jithsSB-n^hhSEo8g6yp|w zZk#>e$uh^)Z`5HK?5q-;wv8iJ{M1~{{Abpl)NI*;*F25%$w>!vwm-1nIb*+2_W)WZ zR)-6ev%)Q*Y@s9yjjQ9r^dG3Z#Gx^iLr>C-(YU&)DU;Ia{!J&mEZ!w{cD_J|0q*jq zfnYkgMYVI)vgm`^*=o0qcX2ZxP;G4H+{K}sc-x))zH(uFwTrTCr@0FD&2W0Bk&3A5 zC^Plw6GUh8(#n(*!_fT*hYziHZJR!_=p{CCt!_>ax=hy*4}Yz?diF!6mk>~0jn4Z0 zU;5(yTwYBp`Ez-7*TVa{CCOrfNgU|2fq5S`wCvm>;>qBu;~ zQWReh6|fM}yg5i{bjh`JQZI27(rqG$6-4_Lra+@%`zP|WS=LEw-m+@fC8Q%&A z{BTjbfv}+H07bkiZf$(38=oLnYPsRs&E9tj6{Z=~rlsNUX}wv189LU?7`$yI6gDt3 zT4f(4s_j3-AGzjbx#SG*(*mm99h=tVH;=x(GF){)V%x+{h!5ob}p zQFh)oxCV5ajp&wX@DE+CeLC=g)%g@sOH?4Z9@rkeHYA$9G-5>hHK|< zv}Ve&Q=@%vRG8yXnZCAqbk!eL>j&HY9d1!(Uac6KtFRl@({@y*hQA>fLqE}-tsXB~ zOyu0sppNN&GCW(ITeA3;^X+SLE=+Y=$zloTmJapMz-8G6sUijn!;e@YdQZ7GqxZ^b zDN6ZOI4wQJGd)p&LH)&KUu9qU^1j!!YGUw=fHcc?k2DDZkJp^S>E!;i)e3f_(mmmV>+McVyZhz7B#gURj6aoPpIui4YeKbQtP0f3}dPzHJ@;iC^|6=I2=C~=_>g2 zT~{k>DZew}S)J=^iMGtP#Y7u3nvHeCw7{&wH}>n}XpLfa-L=(w=*vT(#F9lMr!e4G z*Aw7}g1PKQt+gGMsNosp3YcmuyHRy*M;&UN&L^REqj$9(wW;A*HM3ggM621MV6*tTtf%NMMPzMj+@iZlWE&DQZ; zQdSI-tUTEaCXnlaKScPX)H{ClARAYIDB`P!#Ci~xukGZIiS;)kWPyg2MUTZN8eqJt zXZrf#Q&qIVZfP`#;t3oEkz?*K*gJe#9lcvH-L%-kV3@I6FuhkD?O_)$^y^w_pnST3 zksVnmbtl3%vi-q8Q1W;(AA>;BMiJ|=_i{@@Ev)cH!5Z)}pjw*t;eNGrTil}uSZKnv zBllvV7g`Qdz#i*W9&M3&An}OzL{yuYtCrm@b#6*%6{ zgqt18PCkjea5V(U0rerLz&t{|9YJzIK_Cip57fI6BoEXFM8W2PY63QP1p%8aC7=FL zS@Vn0_lMWr1$SKOggii!7c0xg{fm~`NcXF$#SVP;tLkboU=xkU;`cx76l6@B3a1>mIva+3GryB6{yPh1mc4 zePVh-2}d`#-v74Z`=2)S>l$fbr&EKg;^LjvzqlLfABL?v{$^vKZ6e{-Rd-KS?sS{#+srnB7SCbJdU( z&AJfV6VN(WRM+X}XekN&h+yl&`xJ-&B&^+d>{cJo{Zfeh*GO};r+D3u%-=RxJ?J=t ze#kePWo-Q!;21_~@d?wq%n4W4qvauobY<`RcQGy6oNyI6S{`?3x4t``U0WvhH1MN? z-v(sA^!krw|LG!P!!qlV24HvFuWPHv$Nx@|^MOIpM9k3~ZBJ z4tCvc5TQc8V^dqc$o@~e_qo*je{os#Z)>_;h5vfF_y6PN(Vt7hEjL>~aQABESs>b1 znwLfmZHGiHyQgtoMtR1qn+Z!RarEfCm{`gb8>of z{PJFvbc&&(L%_^p#7sJ7GfVeM?>x?_zoLTP4&zih8wnrE@T>JUvMUL{5^5oMq+DwW zrkbf9rPbnJ+h224EDr-0ExpSsA}4B(ap-rk-9mhIdn3&2$3_R>pPav4{N3%10-uYd zJEbDLmI%H**pWpy{afLzhV}*60Zw)b12uaM=Vdn6j}>) zMF-%buDumPMD)(g79*C31Ada+$#H9brUOoNRT&s<>?p-4w6^LZ%8MLJ2ziJiH)q@R z5~7l8YaMDFHE+8V>tCTG?B+Hw40kO4IEuUJ>=dpoJTQb16dM|ymbCFl)%oLr|Iv*a z#8MKtTI(W(7sQ4|sjyNlW|#!g@be7f~W4?8;%e)VMuOm`0QhtZdDV zE=&()=~DO?R=9G)2M`z6))wY~|94JoA0svw3gFr&IYb7AMHpfz7-NS|Ig~@oTQ^aZ z)T3i-3xw#EI)BT+9`CwsM*QRf#K2{@!P1~2EM5jN(DZiMs23j@%$Qjhi>M$jE^Hw< z(}>&3u8~2+qOBPS8&Q!kOpK{O5JtsoJJYQ$O@ z78+wUY9t1CR+r~v>s;t?wP7pmOp|U4aD=m{u&Ya2*J>S`xAa>rbyvcC!yW_cc zI;67&1f@pXZYs8pH*iRn0;@jjN!B~8ysWmYY?%*7mPYrMNqzLz=jEC2@Y#8fjYPKYrG8A&}fioP-)22p*6d^Me8!F5gf{gzAQJUo4g{+&9A{G zGM;b&%^~?pckU{O73(vVS;xd3w%~7qYm%F#Xn z6iMzwjz2i*r9;1IP4iBV#!HdD);jE+9<7%;{gk!ZJ3X-1UHWe8o_Bh5UfLXdo@eA4 z?VY6g%;i)gGOyV2+4-mP&p`*?#Z!C1=}D|u)l((+)eAk~2)PlAzA+9jR>;-P&%=ato0tr~=`!N{^K~NgT@zQJ%f@Sdbll^l zJ0iNV|*=P!o3tJ@Qnt`N{|TVB=CtljxA{3=Owqehz6_*R-5%?*7@b zjWD}C)|_hg;85%ot#PSL-WMoJyU=GjMT*~W8J;y{F=R4iH#~26*^t?g)9{=jtKmgM z4#NwEY=){_%~x3NPIq2`%G|a+mZyEOFH=(^CCM&LMc0ES(Q-oe&rclygL5l@f$!Bl zGs|V0$R!1tbXa5)uLlfCNJVA)z@ha)NSR=7i(~W_}-)RB=H2w}kR-HD$+a zy?MUa1!Vw(%yTry^qz)Isw0dI-?B0bM^3wjskDj!j(anx)Xhd(f5Nay^_1aTH8_W< zC{P0$$N>!znsESx>D^GekHkmKNYC5?OMzv;(%@U+QsFY;(&4w%rPO8ArPXisO7+V0 zcHOci*Kzln30R`_C)b!mUhN(@D1tT-L<6S>`8$fqZ&{a`i)2FVVrO2hV>+_Y#f;@3R>f7c{ z&r4z+DbvhhoQ(>x{d5NW6Z6Jr3Rt$h*2qiwS7QF*H85kvhdC64%>~hWm-oUS=Wc)7 z6(9>Ko?x$*G)0vsjQvYf=G&(i9HIGP`R(6v-1|&H6ecgvvTIiJtUU|NS!q*=M9EW0 zLaA1XSt(h`NNGxmN-0E1MX6hfU#URp|7-6`;Gx|9{$vY@LPSL(dzNIBwFs@2Y*~l0 zWZ#9Dxgio6OUQmpp|P)HDZ;hKWM9S-(v-j-*e9Icg}fy=6BBbc+7VU`swvO()^LW_POHMf_|MXe)k}ukP(&_&tLYlU7)Z< z7`yvj?#huKMHLihsx1|&Pa&8%gnEI9d>tSN70oerugM+SNGmg`K=j?OB3$uSpfA66 zsIU4OIq>)XBe1l^BX9pPfS4xgkT6vvJ&VNkogw1+{%*(Fk}j$6MYT7XlL&S;y>&Z& zD(R9MUsPw)1Bf-#F^A3IW^8DB)STP#WVQOvCQoTLb-wWr=CVm!k+;>-mX`hPI9o*P zgIT0rH!-7%{BAypqH#NZTaEX16NPjfZd75#j4##=+;sGin#=k0D5H)!o>(_|;8nxr zJl_MOj=lRJ=s4)x7SXGIF>(S`X_T_TR@zWY+2?%8ngp7X*p*`*E$!P?1Zfc$>q8~JF| zH`1w48O*c`J;#zG>Ldz0Raj7sV{H1e+#y!xbD_e?doBH+ta`tF65jsOTroRUIF0 zs&+1qk7qwKqcANE?;VN+ML$ihYDBoH?zuc6p8YJ0!n^8rWxj^I$UnxjpOrCd7tOmn z6f25;x4Eio!cDK8BU>XTSiqE+0z_j^r&q+?a*4m{^0dTBqG-c`xxYZMy;IYCvK^2ynFGx79} zTi8Cf4jfa`sN7s=v--n;#a|=@73OF+bh=7G@1eeh=Tji&g9Qu_MZcMkPju4`>V7`~ z*@0i*zAv3whGeDw4$rT0pZOU6IDf&9Ga&rU5J(a- z{7H-pzae_~r?_D-eZa%8jT+*gO8ixM**pU2WRwDvxN6(N&8!;pB+LQ+QGi19Zy7zu z8u=!dry6p>58z~gi3c;8TqdhZq=3oMtobqiW%UM_Zu;0en>11PpFx5BJNP$#!~y$fd4qp<9b5?OO0{*J>BKd{ z@&aLjh|Wb;O{*f|Rl_hZ>6Pc}ORLkXxXW|T(;8MFEv#2yghfnkZ!Ap6WPli3i^q?S zqG7%RBhWsDm~|bW7d2zK!=jyI(UBc3IPuPg+R-v%g-DpAYd&m^i0vPpgRV~y76@yz z6GH?HT9h+++M#MXgf&K}a(pCc?3O$P_5yZu4R-hA^xQVmddCH)9Vw&n5JJ-APz4$f9s*#Z-VhOM^ zR*Hc&Y0Mt!TH;+g%1VxU{}jhaQi{S5RDVb`W!Qm3k6{iXZ(p+5V!Vo)!r;>zrfdk#3Ln;{ zjod4ySD|Il_Xl-7kw z#6e0uLA?U$Jb|zEZR3QVWWcnbG10gNc#Oa+g2z0%TyWMxV7|OUyAM;`)pBh)I;0F! zhiEPKU34eTJ;u*C5HS@?`59}I(B5O2RqU{}PQvWkxHQ;E4pBHY*{O_K85??hS4kSf zIXrXoQB|(qNHTj$3emQ(3^FJ(quXhdQW0{?^`NirRC<*ixJtKnC*XM4m1rgOX>sL) z&#i?PoV9yd*-FFm`1Hl%vzU+Llbty1P|jWivMnx0Yk|P&2p-AN!=fM_&iA012pO-6 zvXGmiYrY;;Ih93Y9L1}?>vL!``|J^$?DF!Ao-*Qc5qgl*u{as_kS(DP70L;hs6{_M z;6}jU$5cj85~6tKin`KisO9R_k!$?J-ZRZL>vi_!-j)Q}PG-mZ0+ZSEeDLG)sE>{k z&@9K!zS!1PJ|-nOaj2|AvY%ZtVnB(z+r%Z~tk(&AS<6zBbDEL_+?YkwLa^b2K$x#? zO5(z~aSkWXCrvpZk4Iyre9ZZM%V6VR8-Xzqr_%OVUoQDBjA){QbQssk1k zn$ClV5bBdEAu&IE-~YnJ4fW1hhHeHPt~sA(cZ5Zg2cg4PmU)( z((iC$Y478S?DeHJPq=f!xUV5ak=;{isoo8m&RQo_ihCwGRqm9kf~kt9JK$rxSp;8H zW5+XG*5B&cN8Oecf5H?*_$A_m_>Ba$gH@pj@XZ_cQ^9$~yN1epwdO=7d#)6YXOt>b z+3|G_yu|~-S^yGEQ12Kzo_!h0y}KZLrE<^C7lZToQVE5b_Bq02mt1*#$3UvT!&G~a zI2Y8jKeeTY!*{=yTf&O%josypJBt?{44Z|k8@w->z5+3L_P)enM%7tcvuMHEOWRiA zU}LI5G(AK`M^prn3y(OdS?uvJUlvikdiLN`LxvlIa2vUw_2m%D^eYA2Slt8o+KjjT zSz_5>C;;4C8bQ_HV+^_LZ!+ywfNa1NYAr6Cmtfm$BAU@I^* zprC@wScv_}vr5}mD*kS&8&+IxLNnViu_@I6;)WlOxyyL~wUiwQl@7a?JItPHuzTok zsvUM%^sT1oqCDaFT`AAW*fWw7PH)|PVwSn!BKY@$aBr_Jg|lmfqc!lUH_|C58dJ?U z?&EGGsz%AiziStUzYF5;!&Izk#SEG^J&xn){>3pcU03U}wN8|3te0D~>I>OP&c`Z} z|3EfF|MIVbdawSVpd;ds32L|bjB&Y2KGnI*Vf?OLhhrX>0lUlIUF47T={O7z^g7X; z>dbK&cOzc4P&S_Pv8ANGOVrU2%Sde|xT<<~T6_nB_Zt=6w;8B*m$wdAt(9e;Xg>+( z^*Yg-s?X8Npjj9%T-Fq+EO8$3j6Pp2Ce21IGm$85?IB>Ur`W?(08Nr)Z;rGz8$R6_ zs0d~($Pd39U?*rU!IjXfUzjOd-jup@{T`7@{?a8ZqH#idzih$lH9poA@^wyxQn~J( zSVfPc=5kzEAahRbvFAL!HP3H{@4jQlV}6}0fx2J2(NYndTlgfW*8j#?DME%a<5PDX zOD7v+)g#tD(N?kD>L7!CCN%o$jmz#mS=c;-!W@jOE`Vlu7K|VF z@k(P(Ko*}lQQEdATEJh-@vylP*8!UTtBt&h;C%&g;jLKVXF`jCK3zwGJIWE{!&+Db zLu6~A_o@c*ocIdR2ECfnwlPf+%v9i&bku%= zA_8u}qdB1KPUmA|IPdIQn7#UNwP0D_X+is;m7JMTRa?CMAxkj2xtE>V_O}YmHad#a z4B@$eM$m_-+h@u@a43o9OoQku1fd3+3zNliAXcp<^b!g76SlhpiUYS>vO|}C-=_BM zbySHW*4nVU8vo3`d*@(l3Cc9h_pKdav&p6k^C>i%tgZ`{(RB-&PGtM$3B>2x?@QfNl8RF0UE zqo#pdia-8p&%50LcHf(QqrT{7ac<7y&FY#4BH)ccbz?LcE~1+o<^!C8K35X0A4sCl z!4sbK>pHM)S?op4aYW&#@sJm9bplP<=JSfOeT>xi_vRK_8pc^rtbAM3j$11F}zjt${KsO63 zJ(Sv0u&sYIw07AEAwxIENQsFVn;uNkay4;mUxvP}B^!x(Pr)J0(y+|p zZ7R$82PN~gEw9Tgx-$bM!}I8p3{?(2wWq;YQ2!CN`29P?Xkzxl0*$K*15b@UEEmTHT(79lVhR&yFI4l) zMn80~vCRSAD;K3KlV;^IfOJgF#yjtU!m-LZzL_}O@z?c3w|9r$0v*_Y(Te;!%FZ+^ zW_PH4!R`FhU@?z+s`~i8(*vQYttUy|E}c&hu$DM#pZ28nK~db~vFO)fh8>m{2Dajp z!Q<8v+iu-5t3M~zbXt{9b55a_G#X6Z5)@|pAIn_ z8>qEEozk9ZRGHzM;;X#OU=jt^cC%KVBa(l})~nhZvM~C1+2Ybk#+%wiT6QBQ;PGzv z=A(WG@c6_!Bfo^ZP@d6-vp||8nbE3_g&`!cZ{kZ+Cqs{v@=j++N0H?O%OIeBuX?he z-ZUHODFZJhomHcCYd7v4)f;!U%@~b5$=%b9Z^G!d->3`EXugo+vh5rT6P|AT{zgr% zc$*U7`_M2|;ukx@e04AFD{4xQ05T=T+eaV0e4t@^kzb6L`6?6bD;mm$05X5Y+scn# zKG87M;ujNSzPgY06)mO59kN=*+ZJ4v{$SsQ`VtLOBmO)Q=7+4bA9qnw1(NMj+6yD> zfJ*&RuR$@mS2vJMLJ2rQ$s~tD-s4Wv88fT9vB58qYBE>4Wo%M=!L%~|h+*XZobwO~ z{*QFP8^AS>OYpH*`;IFLQ0718p{02Su z7E^Z$>T^Iw={X(0Z2apju5HvN>9%~z2K)AsPoSrTPPyDS)ZTN1O^$EOCfWBFh`Gq} zqMHEu_tyJXA)hmTDQ%M%{2QDN^JVf4ODCU--945Nv->(EV3uz#-j#`IRaBf6_Dc_i+XNGsn&nu)iXjXXz==QZdg` z9gkXRJVj+9MO89I6|lkLFQDw^&zE@6$9CZ(9YEL2D5Dgd^yrs14d6`B|Bz@O`Oj6x z2?4wH^>DU&IAD`SrXH?E4+nTUoOWFFp}YvCx%dO^d-LDyaQj290@4nIe_t#x&Hu<* zqZB`M%;*0$AIIj&r_4iDfr0pR(ai2?n=(VF=eqbBadBcu8fxUok=*7W1>y8yJ=ATz z-q}A5Z|GLWI1r1liN|K9!6VR8L-|$j_F%m<*m41(2kjt*ZkqgHO*loLSp##>OA(PK z$2(}efD(OIrm@T8%9xQk`ssBa)^*)($k0sr98zu}<Rn)v(mRZFLNe8S8O=S)vXx59{>2SgX$wt~kzYB)csw0KH~b2ud(j$6k*ns2S( zBq(LZ2g3{)vc36{2|-d)EkW>vl|sTqD{#;_zGd=5s~g~w=*w}e8qDSJaAfhXTV3f@ zc+8B1oq&|%{;UZY|}S#e)Daqi!<*B-!q0XnbIio%gln?qOH!D z5~ye`ed&Zkvx)>B)@JMP^e$#R$k>Xc2;E)~iWaVY8;|KZ8hmApsJ`WLF>YGcmE`W>*JZ;qHF-+A7D{BT{S z@K28So#2`wR1JpZZ!XnP>z@_kJ@)!d|C#ic2zpeU82GWw%@XqIA}-z4mmEPHWfm-g z)8vi~p{C8FhY&^Hg-8qQq~NsW1BE<0Yhc6&K0=ba#d5=@TE`==8wO}ryg;4C!s8_S zB(-eqX?pMR8xOKSe_h4d<)cQa0XazX-0r+!BE_xZc!_a#>8|O6$Q$Z;4jQfVHm530 z+Ug-;0vwGdVVx&~J5N^J4Z2UG6D~X+!p2^hiMoHv^W|9fRkZrU>)pE|^}}36bjjws zsXOOb>2@+f)Gr2e|HP!KVM|f`vKrj$MtoKhMy(^X>mvIjCD@J;WQIjzVSNC6EwSvr ziT{x@Q`yiNa0>cvWTs@_6LPKjrEcnJ9c}B?i6tXycPqzc z?dyAGo93QIiGW|74x^QCoPYDPmiFU_eT_H#kN>nPfN}qMSvF?=CVTNMXePP_HrlA_ zkAX`p?^VcM-qblIf{WM(l2E7ErjXs-#DLxpAmFo5H?W1g&efZ#tn+}k5f=gKMnbCrS{XA zBST90dmKAHB=g+G?|$+6%6VNQ$^~k~(kLX$tgcMwBe6A*eqHAENLOv<$8|EfwnNt+ zQkbt$#T~w9eom$jnYro!U5ketF^DP`IBy*J;rWqcgkdlr1M&Dy{EIV6ijMo%Q#_3# zI}4KAm~s#UmgTC0I|?xO;_8kQg=y2CSG912J$v3hn*Q|bIS)I?j)9m#R3K`=Y+NAI zR%OE=plgrOfIv)N4f#1_sO0G2X5rul(e`q(a5diO>KYfn2PoDNzXW{Rc6|r% z5*RHI7YjRAQIU=Nc0no=Q*#-hWF?>??B5AaP=P?6cA{IdHyvGUuQ@u}Zj?3l{2nKWtpt#+zu(#N{i<1Iy`iarvG@w1K69@#9`_1(NPz?a! z>gHu<;Yvz0Ru*9s%nJhDL4W|WetYo)u^XZ{%v>zYwcK2+9jr(q93o$eKcox-8MBaq zfK9RAT;rEW>Og{2J^FKq4?9fBKq+Z^wxNI{NunGlg~9;a<7mJI0-a;qu?0^=zLEa&o!7WX3Cv9! R1C1FZ4@?^p&wx1&^k1bpIyL|R From c8a4e9ce627addeb77889c594231fbaa10c85dc7 Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 12:33:41 +0200 Subject: [PATCH 31/83] Now python lint only triggers when PR includes python files --- .github/workflows/python_lint.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/.github/workflows/python_lint.yml b/.github/workflows/python_lint.yml index 9d043bbd..45dbe4f3 100644 --- a/.github/workflows/python_lint.yml +++ b/.github/workflows/python_lint.yml @@ -21,8 +21,19 @@ jobs: uses: actions/checkout@master - name: Install flake8 run: pip install flake8 + - name: Check for Python file changes + id: file_check + uses: tj-actions/changed-files@v44 + with: + sha: ${{ github.event.pull_request.head.sha }} + files: | + **.py - name: Run flake8 + if: steps.file_check.outputs.any_changed == 'true' run: flake8 --ignore E501,W503,E203,W605 + - name: No Python files changed + if: steps.file_check.outputs.any_changed != 'true' + run: echo "No Python files have been changed." black_lint: runs-on: ubuntu-latest @@ -31,5 +42,15 @@ jobs: uses: actions/checkout@v2 - name: Install black in jupyter run: pip install black[jupyter] + - name: Check for Python file changes + id: file_check + uses: tj-actions/changed-files@v44 + with: + sha: ${{ github.event.pull_request.head.sha }} + files: '**.py' - name: Check code lints with Black + if: steps.file_check.outputs.any_changed == 'true' uses: psf/black@stable + - name: No Python files changed + if: steps.file_check.outputs.any_changed != 'true' + run: echo "No Python files have been changed." From 6c350399082b68896a51eea10f5ca7ee5dcf3e69 Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 12:41:20 +0200 Subject: [PATCH 32/83] Test to solve concurrency issues --- .github/workflows/test_sftp_handle.yml | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/.github/workflows/test_sftp_handle.yml b/.github/workflows/test_sftp_handle.yml index 4dd0364d..086d4d42 100644 --- a/.github/workflows/test_sftp_handle.yml +++ b/.github/workflows/test_sftp_handle.yml @@ -2,9 +2,13 @@ name: test_sftp_handle on: pull_request_target: - types: [opened, reopened, synchronize, closed] + types: [opened, reopened, synchronize] branches: "**" - + +concurrency: + group: ${{ github.repository }}-test_sftp_handle + cancel-in-progress: false + jobs: security_check: runs-on: ubuntu-latest @@ -22,21 +26,10 @@ jobs: echo "Current permission level is ${{ steps.checkAccess.outputs.user-permission }}" echo "Job originally triggered by ${{ github.actor }}" exit 1 - - sleep_to_ensure_concurrency: - needs: security_check - runs-on: ubuntu-latest - steps: - - name: - run: sleep 10s - shell: bash test_sftp_handle: - needs: [security_check, sleep_to_ensure_concurrency] + needs: security_check if: github.repository_owner == 'BU-ISCIII' - concurrency: - group: ${{ github.repository }}-test_sftp_handle - cancel-in-progress: false runs-on: ubuntu-latest strategy: max-parallel: 1 From 6628115b3aa224fca4ddcd55cf3ae26c12dc48f7 Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 12:42:19 +0200 Subject: [PATCH 33/83] Fixed wrong city name --- relecov_tools/conf/laboratory_address.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relecov_tools/conf/laboratory_address.json b/relecov_tools/conf/laboratory_address.json index 45afe509..619352b5 100755 --- a/relecov_tools/conf/laboratory_address.json +++ b/relecov_tools/conf/laboratory_address.json @@ -1424,7 +1424,7 @@ "collecting_institution_email": "", "geo_loc_state": "Pais Vasco", "geo_loc_region": "Vizcaya", - "geo_loc_city": "Baracaldo", + "geo_loc_city": "Barakaldo", "geo_loc_country": "Spain", "submitting_institution": "Hospital Universitario Cruces", "submitting_institution_address": "Plaza Cruces, s/n", From c10a3319b5352047e0c84eda5b7fa101ec93544d Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 12:55:36 +0200 Subject: [PATCH 34/83] Updated md5sum file for test dataset1 --- tests/data/sftp_handle/datatest1/md5sum.txt | 24 ++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) mode change 100755 => 100644 tests/data/sftp_handle/datatest1/md5sum.txt diff --git a/tests/data/sftp_handle/datatest1/md5sum.txt b/tests/data/sftp_handle/datatest1/md5sum.txt old mode 100755 new mode 100644 index af658a0b..53d39c9b --- a/tests/data/sftp_handle/datatest1/md5sum.txt +++ b/tests/data/sftp_handle/datatest1/md5sum.txt @@ -1,12 +1,12 @@ -c1551cdf3d5e9849b80a082051907a72 SAMPLE1_R1.fastq.gz -449407f85d7ed4388b7d8a51e28d97a8 SAMPLE1_R2.fastq.gz -206ccbe05fff0701bdcf9f899ca3175d SAMPLE2_R1.fastq.gz -BADBADe23a1caf88c11678f10666b931 SAMPLE3_R1.fastq.gz -1be991ce0f9ed442d57c5a359d4c5848 SAMPLE3_R2.fastq.gz -5d838ce4a93bcf12d3031a5f9ffd4acf SAMPLE4_R1.fastq.gz -0a9b0a590b4773e5e4c90c391979a685 SAMPLE4_R2.fastq.gz -d04d32f14ca56f968d07f61d68598639 SAMPLE5_R1.fastq.gz -66a057995ac925e3203ff1afdd5770ec SAMPLE5_R2.fastq.gz -0d55b49614d1c38582b69ccded1b22c4 SAMPLE6_R1.fastq.gz -50afab6751cce654b973bb336cf3b3eb SAMPLE6_R2.fastq.gz -112d5d2ff3845236576732f7c7dc8b06 Singlesamp.fastq.gz +bb35d11ae7f99f22eda3db239435d0e3 SAMPLE1_R1.fastq.gz +ad4883129c29a8e55f102da198b1eb42 SAMPLE1_R2.fastq.gz +db70941c0c3e72325128b02c4bbe5f28 SAMPLE2_R1.fastq.gz +BADBAD35deedza0182d5aacae53fe025 SAMPLE3_R1.fastq.gz +4391785d2fd8a0982d5aacaef3cee057 SAMPLE3_R2.fastq.gz +57114529183e41b8e8e61dfc84e77b33 SAMPLE4_R1.fastq.gz +62918f6d284f23e41f19cf740deca660 SAMPLE4_R2.fastq.gz +87608f9851b25b52d49f6906e5fb23a6 SAMPLE5_R1.fastq.gz +2f379a4972671c691cd1160c8e5abe00 SAMPLE5_R2.fastq.gz +bd22843bd5e36a54f9c1ae1f0e7bdbac SAMPLE6_R1.fastq.gz +eebd6cc938d962ca54b2cc4f3650e039 SAMPLE6_R2.fastq.gz +e04c2abf071e931c2d8f2bab52d3f12b Singlesamp.fastq.gz From 0d0c4a2e57131b56b3d2b9b1bf3a4e28c49bbcd6 Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 13:48:19 +0200 Subject: [PATCH 35/83] Updated metadata for download tests --- .../datatest1/metadata_validation_test.xlsx | Bin 94049 -> 92208 bytes .../test2_metadata_template_v2.0.1.xlsx | Bin 94749 -> 92908 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/data/sftp_handle/datatest1/metadata_validation_test.xlsx b/tests/data/sftp_handle/datatest1/metadata_validation_test.xlsx index 468331533ce08a6f079d45d7430ab413677a0ca2..57714e466769e9b2f1e1408afc252bc629e46f4c 100755 GIT binary patch literal 92208 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

A1=L*iyVajYT%?&0{OW0PS7DN@`}1(c$33^FZ%p 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 WJ;ThhVg1G#RFxS7B3c8n5BeXn@2l_t literal 94049 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

yPYk(S6Y0xQm!1<^+fmiH&jbjCP;s*uf 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 JpEohU{{deEsZjs` diff --git a/tests/data/sftp_handle/datatest2/test2_metadata_template_v2.0.1.xlsx b/tests/data/sftp_handle/datatest2/test2_metadata_template_v2.0.1.xlsx index ea564b83aa09a573ebe831425b00308a8cfd4455..9d4fabc751c36bf7e746021405dab18ad97dc6e9 100644 GIT binary patch literal 92908 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 V8#qcIUMs}+_XCS5LbLiV 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 literal 94749 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≈?*OHjb62-4gUu}cQ>y@q!l`Ou+kIfmWZk73FGN!Bss>bVmIW7Qs`g_08 zVQk%?Uc||&(@)-niDwU94o^xz@7`9S*z~3g^k?_ePuCllpc6FO;Jma@k1UCAEVJ|SQ%1+G+t zY~jfZchiSmHJ2W@R_pdGyyR?__c~ZA?mmpkGCkrASl3JDGuim$%SRbJ>0F9UGR&yE zaOkPIi%-b7;YH7=?-V6h%H-&)VzXx^M4*#EVcTaDZ#t-;nielqqL^*kCaSEJux8q6 z6VF$!sG1gat3>f5l%quPD2}p3G5%W3=6gp39Hj9x7VEdu z0hd_58!SHXA9P9ww{Gb>IdUe?ma3JLs6YSCAMrfdhvvJ!U-bf*&jU0~jwDW4qV7I; zZ)Jk(wRexNXlmm@dnQ{INw24-lWt2~JbS$i07<<>7l4b4w9Vd%-a|MpayC$kL48#x zcVeKEIk|vI^-K5|gROBw8m}0+PQq7jL!AWC%~z#NLglZt9x@wm0%MKQwMG~k+v3I; zj57d-TjP0Wov`8jl&@FJmyr*4zA`vA>EIQkmSVJytCawj^@bE1Lm^n@E}U*m(0XXp z$og0~wWrKk;mmnQu;m+b7@oI9e(`~Q?eV*)5-55U#NG%s8)r(WkTCyvDr$`t`hL1d zpiGH+fc=wxs&EH>MiQ(@D0#6|h4LB8P_fG)d$)d)c#T*5Efn#uYWZK!*}Ju2-@Vh8 ziw`_1MJ-|JFCh4teD7x1NA&jvvMKHLSMHx4Q&WU^c*;%7_b-s9W(=0Fc_2g!6xGb% zRo8sP#l@w4reMYw=4+~xfTXUIP{(b~2csVzb9vRmgKqAa-Ti5fbB8Ym`w`Regwk7m zY`*mKVHuwIK>MV;+2cI!i?_HaBV(dIIu*?MRf$;zM@O>kEWLeLMsQ=TPYz2GEWYAS#^fn%co9yDg#T%xo#qW@j$g z84Hpm=;UtMwsMgBm!pdW!{TTS3JehnuVhIQ3Rq`*jWptmU3OeFF?Dz1@sv2xdyQa2 z*BEV=N=+iv5zjq!jeSvZ&U#wCV;eUj7TW4&<_hEu_EQe-cjd*l%OCJGCIuQYoH3Yr z9zHa@(0DE}bKB(Q-obwV#&I6q7{8D3~D#YP|4b+*uI&G!%X`2mHU96O;w{6pS zIVwG{3c(zfcqglkm}|83b=u(Nw^r4JmRAl*d70IRBOFviFV*E1iE-Pbb254!RCHFS zxkSX+t4ajNvcy*t*sRhjQz7he#;-S*co zVu%{)$@f$pG3Xup-N6K4X}E@7&jx{2y@+_Fbbz89w-ZXt2${Oip)^IzrX<0vZmqf3 z^kz0<`&{%UIh?v=lh}+)4+dw+?J3N#%8IOS6`hM_Y-B~Yc~b@781_lFB_B-OHyik7 z(4kTp%I5wyD0^prGk!@Nw`i)-<-#i4GKJ{aJ!1}aMgCm$w%5wyE~`2O@5nu)A6U*g zu$(H$2r>!breB6Tj&||Yy0d^uX22J+f-*+h6}TN*r|r|4%UfkK$ULN5%@cWH6VAlAg{h#V3zsMg9G(xf7tS#l zeo1;9mI$fK_iA}p9rog3$jGKiuh1RwcECd41ux&I;d-H=i|_rI9EAzB6-GPPD_mGT zEK+`*^2z`;U6^wzF0#8&Z9PDha^2$<@@(Op*XzRjDS=iGyWOd3FN@NJ4VieSGOfp! zUvf^5+Ov7sJf!|^|FE3Ogzcm(D81n!MI@}Mn4coyfTTLjEQS)Gr4xY9oBY)ERrg#) z8YjLUJ8KZmOzx4B-*Gz;0`8M(|b z!d%#b8)@B+?ki-G_gvTMwwVOnNX{8^;AMF(nBWh*kZvC}z(~$NjU?2JUy%(M3G&lO z&cY;{>wvqFpLk0^8p_>=QLn)~bs7)SMbyrEJ{P5n81h`8T&R>>two7dhe~{C^d-OZ zd`AuI_!ZZb^V*g3WRt>@(2_RHR-{~Me#Tw@*|I=egTkEtk{ak{_61SqNsuGg zRgonlW_}WJ)UUVhdY__aAssK@QupU~A269>L{!?*-487Ke5vr%b;PHQ3NoIBw4yTk z&@VBrjNA!@I+NP_HjPYRfv7m<7ZDh0HqsN4b+Rq=-T+T&%n^J^Oh7zMJ?H3^!vh!wU!3K$VbLDfG$y>b7MjtMmPiW^CeSXE_ zfh7nVw&gu@W$@GyEx4~lkXQ&B)JV&(k+g<^<&jshzrBx=3h;q~0s}BA-d^=HA9lLXeR7Sa3ZgT`9o=YC; zcD0n~6YEj9F&mk<9~uv(5-4`(e1L6Tdn0wrf%|#?(s0zb%NUc}yTS<~pM6qLs3zu- z=hq`f#Ju`9-?{i+8yF-y9IJl#K?zZO+8{+{Nu#Qfmd7h&9SubSgHzgE8f8Tb_;l=F zlyNADFw4S%oxhrnA+8JOxwQFPCUOe?2!{^h;*8u<{@{{-6y9AkkG<>=L9?ohQtM($Svd=hvfb_KhIKVG9%?r1*3DhK5a031aCj97niZt3N8BXod_q}|x~bb4 z^wO~*r2LC$()P}LeHe7BC77Ua=6}*G2!>`I=xnb!EySWEkg-fva$9f$4@_`dG~cDw zUpLXg=gAufy<#x=2VK!Z@XRc+W`kpCt*Dy7INk`yte(7Gt;@1O)2?GfrGsj;R8y^` zK=k2uH_Y`VprUBcttYT9VPEW^?jOepp02o;2kPJ%z6ErNAj%g*KgQnPoBg335m$~i zKagt^p#3n>0yL;;kW+J@^~Rw#^xiDZUm+GX9|LnNXii-|_M8iqqo@^drcf3Iej8ys z&dv=~4xLjmO_5UisT_40~1bcAxe6SAF~boS1r zac<+@Y}t&6iU6-)40mi7==WxP`T93t9sMC#o6|dv1>o~JA76C6=MU(k4I3QUcfSJ0 zqb)ORfa?U9w2{tMKjAd=IN2cs^2aK{sK~6cm1;NYZjEetc(uF8%3$2~ zN_5EM|LLr zw4u_rx;rj;+wfJeL)V}-ivP)wF zXtvJ630V&?={%BSLwm!?af!stxs5L??WIj%f^_j3*e^Bz_W%`;|AVtkG8Wcn^*(eL zBkTOuU}&%|*7Ky<`K{YKg+S0<3U7N-uZ#VpgZs`}@+!3^?*VW6cszFunlq{pWy)lRzvp5?A-HO30OdpVU@XPv&c$EHbm+ZvT@1FCyEdfNV@zbqPk(o?FF!`CA zTnp=ywSRGOFdD?6bb7(aFwymDDF_zKRtYFL^zs2L2pIx;{9=I!oKAhWkUYKIgJSB_ z(tW^)Y9%zYg7a@i@gSbh8US}8qY!|CpiNIs?FdUHa& zwyCa`H21)!aE|6r2Z(9pmNr4@@2LDAgn1f4P)I)H7^97zu@MTzM9craUdgNv-YsDQscNR>^8T!4o;J)jw7CS_crcD23z};$*(unL?ne6_D05b_ZZFpR+ z^2Wicnsk*WN;55oSJpZhN&!YyQs#OMbKL+;3PoF=&Z}|ON^}t164Rl4QTE${;oj^d z`Pj08vcQpbGhUP+9Gu_SF2g}|JG|6fb&Y-waP*rLtV;qWpHOi?0LbFhkVfs59!Zhs zH)nU&*|Jk6mD-IY%#mC6{P`5WFJS=xe*6#rRttyTDr)}2VDrrPpsLFA5y5>5<;b0|eX+_GX24Xt zcRRe#Z8!DgFLvOG4NeRZJN}^Ab`v3A*4cTqj#+j!EMK}mplwZq+!{ISKqxVoQfUXY zr74`_0`MUeNN7qxfdul-89jdB$v90uEcbvu`M6_0>&+a&gy%C)b+1|pCx8QhKSAlu z6YO|C^HKl06LxuIS?I{Ig7&SK@=Jo@=POYcL6eMaOV6=j38c)6rWr-ehDzN*UDN>z zFs9N!YN7|$uc2h%TS@>ggPQYeu%B)-aI_NX25Gmc=meP;SIPc-nAz@cR8}xqq5&H4RC*~O>KBkY-;ao0~t~G)_+rR z81$ypP6X&h!$aOW28svfcr@gB~YSP?uy+hI-fHBfaE!r z0VGEQ8z4EV2s~1)u=z(V0eY`tkY6KZ9Ra-!ewBCxqSOHDcWD?MpSM$_@{B(>~lBn>WcQFHYn$RMlgQjzjJE%lh7E zHJn%>4ijty_x6#d?c_keC9p&t(0k44oEll{5U7ZfXX0%TP&nke09zd>5tv+w8l>M) zY4SbE>Q~h%zElrRhu?hC0pb9J!p$z?1_v*=9_Jjh1-emIE4M3LmM2fBLPx|7>P3?r zCcJ>n!eJkf`uWo}5utbgT_^nGU`+nsDG=9OS0u6XnkQ5Jw{)05qlB>cZz@pt*nY>O|}A(lyx?;nZee{To4 z6S%>_-+=2eaAOg;9zbE69U2GJFP+DdH(UUZ#dv$Rt7E4oca}|yR%5=>e@JY>r^w^O=`=#!lFw*lr8++HuEa*5o_^ zoQn=tZh!0L_|pAr{YwAMMXl-`8vl#6&xP{SO~0{%haud;@a?l{*e;xR#^D>FH*hj~ z_6Z;(_$KvNG7yAUq)Go=k(!p1>HMS8!Uq#6*(UOXfX#C5K{S*KjI0D~BtV&(4LL4A z#Rx@Lx^cA{fxM_tex~Uls}2`W*BjvHx2Ax*@BdL1U{gs5$??k=1sZ;>J)02+`Hs&{K0DHP_{9}021v~)Yu~(qW0nKx<1YaU-!9R&) z?El0+j=mpreYIcidpWTgbA1u>d`YtP`m+4`5;m`+L6$?pcI(JGDM?DK5-J`Pnsk&$ zr!y@F(wUYeV%wq%Pa1ziqti#FT_vBismbB_sGn-AO8&#Yp7K@6M{R1-dye){0jKR2 z1>pQRF&ncOvZ;Kzqqj+7Hs&z~Q~5godMZ4XuXgk{LF~I(%6R2)QjmWO?`TZHW zcYWOBf8tBo0k;HKdN_QbNx<-0;*B=XtiBV(Z~`ck!zJ|oZGjMkp8FR&ml<`lHqU;Hdw>?FhFXP z$}G)Gfgj0E3xGlc{4hJw?f{+ZebFkVPPUZmVe>(mY5?asG z`&K8XkemMjl|O%dc3JyR4-$_WJa(QIB)nuZh_O7YLQ#>%f5T9{mT!$u!&{Kr^fCx9 z=e>P>d09}ITP7hk5z9#J^87p%4RQAQ3qywtV!WP10YANReE%dMLfq71X;v|#prJbvY5Z6~1o&Tk9z1b$N|N5nL5t6{K2F^- zPEJ%?C1LHy7V#CK) zz4LV-v;LLG3vRps&Ck{f7x&nA>lmJmSU3pXYvI(J?skPRm2=*$Mb zb{!M8bM4^6S$}(RaRx)&&xZ^-egRlG-zHz1n+()X$gm1cztD zInW9HDPu}Y%8kdu`0+L!PEvD)ku;;q{9ttqIuUp49kTJpZJ!UHK~UKhn0>UW>k>Jq zECng>A3vyGEAbrFMpx{(u*4xIrRkf54+nLak+*xjGbehe9O>d=`h0~D{X{X4|eWjo?!T2C00=>z7zHi}@{_=^UfZ{hftL5vsKY1*UuHu@Qr+@wemAdGaYj zd-cO4FBAm4W~h|Enwyjm>#++xc=DN^;8lmTlf?&e34u5cWwZXn@I)*h><1tDLlltD z0(yeFde~{V6n4hL(Iu1?_Uyv zdz{`s+VC}NOPB6Q6!Ii@Ru@yhlSc1LQeP?m#L(cfNk5_QK3P`jd@*+88$rfyf|^a3=R+CNbMov0AA<*t2KO5)g%AD|2ng?%)DhCapZf#{XvtQhKe`Fgpn}Rd(D$INMqiu-=e)V zv#0y?a|}qC)xG=dobGwjW@+T^IqAMFT?hgLPpbmT7kMy2W%svcM))IVo76bzN+IGDbCdqKNJ| ztKeNCr>;0A-F$+1F^@Lz#fjtRuM$#sv_F7&;x@F(E-dv=Cv|n_t3v!CO)xrlFvrPJx(f*YRz{S zIU_Q({SAEgxk>m&O}0i`q-*J3R>H zH%N=5NJ~n0cSv`abSd2}-6 zu)R)IFLSjs)V+-5lfvSoT=_9rkRCidTNo+PSbN#^-a4ahP6<;@CagyiqZ-%DdoT&g zI{!Ew&jkreU|yx`T?Pi0WaILy*=}6#n?Sc?HF4(9P|~f#1jDcPV<}e?c81bj%855p zigl&0oM|I)%sV$1dhB`aBBewIX3o<>2tH5l7{H`7mA#7Dz^z@Fp^BUdY)oNg8hfwX z>#m4(Kf9@C^v_1AMyQ~*F?@r$WQnn z*aKcom$^`2!05kTS$ggLN}r4O=-H{WT6dBdf>QV4H`$A0Os<#mR>~f9xMXaY}l3jD0Q$d%;Y{{45xqSZiww&C)ZFSW8a5^6Mk1U^B(RHk6K;&c`%V-U=~X zZDABtLJ-Zshni+T;!i9tC3Doe?g;2+rd~Zi++}!X7Nn+tl(^NfGY(shvMU9k~PVnZS z!}a=V*Hz;BWOdHvVmbNdtReXtv>DPDl6-yU>UxpP)7)@fcXPRvd2`8dX}D*a-V~DT z0=(LBec9nkdws2Tvwz?9@}y_?v#?zCzJgHg*;bxBE=!@QO@c_ib2}NL)k+EX{J()5lchd%`T>_BozTe zr3bnR3xP5T=D`dS7VV0CIr{jVOeH-z_7z!idI34H*8)5~1ICLip8d8T4u=D1*>fRZ_>Yod>L}v*hskCxP3EK*4`n2?pJ)oR zWGdphwihF^Y>wld;ctG}bo%6r$&#*!XDGePH79~+WG-(aL62^NM-UMUS0ynwcf|Z% z%zx`5ezrZaxcRwM)7XAa&)YL=r$8O!doG_K$gcB(>TGz4U5%|-5xFxy?M`J8n~xiO zLge(=V7=fSbQr$4c6eLud90^3mX66%FxE}JB^58&lWj#U#=f&b*4^H_`F7lD#!RQX z{g_FfxuDRiX#ZS|5~l(GSy@ED#a2{<9J9$+91R9DShHNCcSo4r?a#VcG#IQ-?K6$0 zKb{7Omr}wOhV^jnHfL~{%@D})@6by$uT0F8lx}^+Qt=!Nz&VzksB(0bVdmb{1?=!vwI56I=yUH#gZ2UBrnBHRR{DESJmeF#2VLE-u z1_)j$TY3Bt^V8GPp~In6&C;RMq13e7bg`6SFJ1oeX)j1 zZue0@`8~rFx&!zYxrr+48YyOz0aFX!K0UHP?;VLIgE*tjDSxI^x8?o2C z(nW}}MK(7F;u`BHizBrZ53oGMcryqYLfJYYv|vjhx^TX&G}pf#+Lbs5jf>A;+euVCvH@3#BNE*eeJOfDnSVJs zOF5jE%Bj3cs5B9$jShVoX)$Ur!Fn!kC*-V)W;aSXU9o)1Cwi=M6HY2qy}S6~i){V& z;4bQ<-dRtJB@;h!LyvugoD0EZySVeikLA*uK9lT1Alif@v(kexP@$FIAwlO8EeLw3 zShue)F$iCWqKnKTJHCF0Q1Cg-)zq(|lF-YjlK`T{ICI(wak6EbaON_#kkMjl_kDMj zWXZD|rvPcyPw@fCRMRGeiloX1gNHeJW?!c^hSwG+I-ZormoJtFv*s_aDGMqKC%0rD z1k(2_B~Dd1WyDOLLc_+QHSl=$Gj9}}V|FRxJa#Rw=p?s4uw4{CSxZit8qhDD$Lk=6 z_r^4v>vjM9IsxisJ0WT)MJIw5V#z&4_dMW5yeD;MkQ3JagAa{OU;6u(p^KRoO?35L z79g2GudmoTf9v#Gdu*KiDL!Hu%LH?MMRWhwx_;3PlGo4MbIT4mQsmsW15ZPtvb*!5 zK3gAY2xsf$%jKufkx4gTK_!&KRTzWB3g6DOLZG-{^Vno2Oj5_J#!V|0_rsieohVg9yaBqN?ld%+Y;1W+SunRM#Yo;r z&P1oWqsWyGn%OAjI6|}hyw;l$mE_USc~^$rc_Y?S>4haxUumIt^WV_9+Jujn>#JIUMGO zXOsq77C8Af)xtOQ(ZSH$Ywi~+ibTt}6PFZS`(hpNgHdZjXfA?M{s;W(HvVRanZ0Jn zWW7?B#I3Pd)^Tnr-`E{b-On*R13$Go>M77`|SHYhw1$o#U@#v>5g{=u#kyazC_?ZY0xiO6yo7VS>6;6K5#3U*X z%{SBKuL!R@$0hQ_EQzw%K4V2QK$!3+e&J9ywmUR{i7luRTThd$7AR_*d5s-t5rjo~ zg3Tm6Av*Ip)%BbS#gu?@nd!+Gt8&!m(Yao^4Wn+PE_7f_WV3ANi>>_cB6~@1;!=490)}roDJ~IIt^F5~ z(%)HTXI<+J<7!h)c&Moawu)C&FJbHEmV7#`naH7ptVk}s_b1`p8H#j{Ts3|b@2JY` z;lmCOn^vqRxFNV3ersY@MAaxWzI+uZl~EyWO)1n$lpl#_Y6G}FJQ>fgsJ5?4tH-Np2-E}ed&O5|$@6DVQlFMUy6qX6m*|1Tj zJ~{2!L)%hWS#0A{^nof!Mxr>BUf&e~__Sw({^X`%iD)tCqknlyDY{9Y#OYdiUs5kY zSvvf-?LQz`f?mMk^et1vhR<$KLY^oqG)|9<1pOd%1H(&>Pj>+;MCHlna`{2$MZd_c zD0^S7C&jTBtp+sCDt3b81qSDtp?ktYwN+A(G}@wd#6N`D0Mm=Uujss)_{NmtL|hda&b;{))TRBFb5jjy`D7 zC!Vsr1?Z!8*&(z?R!CfzoE{ZpG4Yj>Xgan zN0_lh+!>Pyf%g$HMkP^9~nCguQ3fT#8P|?f8M?Th5D)%-Qeib>AbIE>;Ip_ohc4 z2MxVaTm;QnxuXn?ArAZ=_^8P5BY!TuBGdhew?x2l->aOWcECeQEP8KXDa<(WFR?zM z%8}u0e}vsvQ|j_e;$zpaQHe&bYX7}m?7YXSbTPEtxCCCwQ^AuwM!#Z){ zIR|0DcD6O`OF!AN2Z$!lUTkB|PLWI95HBIsaPg->)rA7yfj=*sGyfTuhhT5*)j@Y_ zua?Gt*y|H&vV&*B2 zxtk~Vl^F0__ONFK3WcIc6BXvj6RpzOx5|7Hk&>$rY_x@mER=HJ7oni_T` z@_ue?`EQw45HVOPgN2@7%j`QcyAA|jvlv)$qWnF6-x1&0o=sPgdu%TSeCCrRvMpju z%?jnvBV$CjfZq1Zp(m!|khi-^FGR?EnkJu4Jq0NtXobXz{+O#4wgQz}?j0ab^&%in z^&-ut|8E#CU6d3I|2aRcAdaH<;P1D<+zRs6Ggvqcbue~~&+1wAW3TBZr73wXmj*5Z zcpx$q?W$w)y@?%o+lhCCo&)!Ve|Yd@|MXtj@ZN#ma|fnwddlsKEv;dlUMCv^v?tpf zcKIAH!kt?eryt9LNLLW$KsJiYum3Pw>AzY=4zz(kgHob<2+Zo?3y#`M1~;J{zk(ZV zoN-%Uc3_GV;l?Q7lLE{G4>%oQ9s%?uMLk_DZAQ7rdUEGYqF{xpZy-IR%b9HNfeF8FQc=v!g}$lyf|jkX~{Lf zLK&J+<&xW~Ba<<^{+uFhi`0koIwWA=jJ$G@0qbn>iBNt=oP?G3ntsUvjFlGJc~5K; zt>-8ZrKpD>U5LO&x=hNKR*&ScQxWo5sco5T`$C-aL44Y_2%@3~P9Y6;Fj7y5kxU8s zxu2YXeZbbX4VLrYvmsDR?sP3Wlq;S`PdEl)?stiN;S{)BE+a*%;9h!76H%%|p~k`W zQ-g=CpE@nLJfyNwO(aP7bK11*X=CY|YG#W76sT>RMa}p2ZGKO4l*Gl*@|3nq45I$M zbci6ol&t-GYC(m{m9q}H79Ijm%U2;8fFRQUFpacti7c0k)8b38AOb|)a$rIH-0S&d ziKKnc`>s2AFrA2)T=_K0bnvCLkj@GMpO_I>l1uM3+cet}6thZmN*PRQXH)#X8jL45 z3r~eRxm4SnDFQv0mL`rTS1`!w@QOf)jx!KW&?*{^zggBi_BH ze*V}K0!;@}GwC-5bYP4OYdM`fc?O5D*t*jHbMAtZ#?NW*XBSV+EJ{}gW{6Z$4;wz2 zg+U;dT^Qt#j6S)7K5CgWiqUa8QZE!zl>6*-lwwF+sVDrhCb4SVxiw8-&@pB2u!W4~ zlH_+6%53Cu_{)V}p_NUp<6osi;~`BB@;D6qx_YBV-IApvN)pQ=yOcJT(}ug!;^U2# zk|HIE#ClZjjx|q~|3)72(rcvrNpV=%_I>ol=JLVlUbyDItX$`|#}jRe3vS_k2O%ld zJoLPOGKy4Z!BBm)Q%iY{=Kq0YxcL^U8! zPOb$tiS~+K2Lud)?$|#|M{E7%C}pzYG-uE(E>|6$MD&z)e39 zVK6}$&kdC(wL*Jy&w1{_6l_I^LIMOndE!>FRrv37vH1OQD8{if%%7_RnR~Cvj;o5` zKP2(;iB1s zn711U9*6qZ`s5za;YVaZ@gwvDKnxo`ULq)83*n|f?>zM?_)z}^8s10_e^syGW||N6 zKRxn3(lGOh!j#DG;Oir|xt~^HG+_O={)RYz=^yg2_TTy&;QXe)bSL@8!O+JD*AB^} zQ8$Aw6&PGFSY9gkgvVegCZT+D1Q%*-hvPqSxi~|Ipb&ClY0(~ zKW1Z&;I^;Iy<7~o;lF2mG{PK=TM>98$>B(kP=g@_{nFI=_!eIBin`U@({BeDKh**T ze;b=fkb-xZ7;X-Tjc9wkT$&-rzQ4oY2(A$@KQW@iIMlp^(ZqWoOhYJyWOV=vY(D;+ zezViU(P90I6N=nV!6I4s`88vSEE_~t_vBiR2w-IJCh|2QBy z4h0SYwP>Fb2Sd>jxQ|IPQ+rfCkW-=6!QpwK@y@X{*|={LV|@N_4aww5z-|7B==XVw zBmG*r?61Apn|rsX7SEN~@ypV0FrMRu2#}@ym>0U~n^XbYcX>L{6D5nSk)c9#d%DvT zrGC}xgnOta5jxaZde6L^PbhXkdK9LM8^-q}Fmlqpsgp+HJ`x(ji6Y$}5crk+n%n9Z z<=tNb%4aj&Dlen^FXhRf{7{|_tUNFj>QZz>si6?qYE(~dWQ_82@c}r?6Qzejur3OT zNW&qIxZO_DP@GbDiVzY7huN@umeV3z&ZsS zexZCfc$+*u`QVV}jBye6>h$#6OYaQ=!3T(Y=ER@Kp$1IIemMV#o3kAB?_*y=(MSMI z`g0j4em@U!nCpCrm)SKm_vZ(ScOMrtw`fM@{3^mG}u9(W)n=&S5g z^Bxg`p)dRmhC=jy*%a&#=v%8NkGTB~{jI?BhPar&rXHvwcB#{~5XjqOpe5danLZ2g zhv@+!z@|S!hl2y+j}X5c9V=qw5Mdw0xCdBsK)9kGsLT8SodbE1hxmuNR~N0rEoanl z?S>IOehvklsf6Ogh?~PZRzxl96q{Ca!d%FI`8?#E&%cER`#ccYz1)Er;1={DkWreg ziXQ;^z?fg+1*|kKQFQ0?|3UGufr~vp{}^=HkVH&Q7{CBXBR7iB!JEIH-P{c~=a1ob z0na>AQozi^fL-F=q}DbvG%xuG*xnPR7r_H~bFTw-I7Yz2@V~+wE8^R7)$7CPA6s}Z z?2fCKRCmg#;PmV*|uxmDh*@z2U%(eNsNVY2^mvI(bdow74{Q_jTfDiwV8WQOBc z0siCAi`>s)-vcBt_E!0@Cff$%ysq)ft;xDT6(fIk zM}2?LHGqCRT|ljWkkTu4MeBeb2fI(Ras9v%)rf4IThqLjN9vSCeTLxo7>~1CeE*F%MxQlg-X!@K&vm|gxQO(P!s`~0^y;DD>i^9|n}RrooYr+ zT?hJCkOX!GeqB=AVU|0%!+!R>qs2dH9Y6)`_%BIM;UDkU1`|*ChQSPa9w+`>(gGGY zIDVKn@&}7A;jLPy9T=>YHviaX0>2NGgpb*`Id7*P@^9W=_IJF&6wDh;0p2l(eTVG& z?T75a0(zu*yJ>WiKj*ZL3rH_}NQ{-ozb)iT_Ja@ErFEFL7Hbi0HGA*_uqW(vHIlF~ zXY+t3E59QR?g!EUdW$r09zdGK?0x{J{z^k^60niLY4X%-KBvjq1Hw8+E{Xr?0;H@R z5ZKW1e@8j$?)BlOp}yDdap~=81L|(sBr4uNL3X!*!|wEip-*)e>m)>F@AO2bPxbsN z($vQ>o7dxas;1u`$UVu^M7HxGlz()s31bL$E>XQ$bWy}5<)cZbCi|ZP`jv!=@|V@` zKX4Wns9cq~^lyc`(nuxfQr(bmDUrt=P4xs*lkpZGdf<6N4%o9E#fI|xYN@u}?i-_8 z!!CKnr$d>{e_y>Ak<@g2F0VLnG`sUG;#ekgtLcAh4A=A=ZvFvk3Ctbs{y`UEn(`^9 zE|Wz%>!lD72W~CR$7gm(37$X!OC#<;!_9kBfA|Bw;5Cz6Kp?e-tAoQ`Ai0pdxjgPr zQUaOA8QmSOJTk#(95k1-`d3tYP?=?eD%Sb*j*=7KQD1=O*c`gPC3#Ruw|Vqr8rKh5 zMB$5IdHii~36MpBK7|}H;g_rV9dYzc+c$w-e?KNOE1k?Q!M1i8?$>p!u>Orbx$zx) zFa@&*Q!sl<<3raQfIVYNF5O@*vIvZc^d#x6lWRt`HeK=RPlbLq{)7F^mhLM@u^tyc z??@ak=>Q&qRVhvib#M*-d*r9ng2m~G0+4TMYTz9u3Pzr`2nT(A-h1}7H_WJ2#FMYN z;@xoZ?eXv{+-aoY;zx=dLci}=AF?EUk>!$^`?-R7WHMU(M{AQS{ZJR6x9S2EtZsr9 zTE0GmNe>$eQD~7xKpNBSqUmnT{YSm2mHsg1?l`Vqq(2u8MrNgYLBWn`|DG?a1ij+a z`7ns?DAo^(OH?K6HF?if?@c^t?7iWgfrG2UM2=7#zT0p8=bqP{8oG;B7;z;17%F&2rG)M% zvM`K^tYbS5{O8`iZOp$_EwdN`c0%u?1e&-UQckv7$O^drsI2S7v!6y5GaE7xE+b<{ zu0zH9`*C!nwtF2Msa6=QiWc9KSScaWPhqgeT70;%(mrACHy%o{atPNn!%FY+kwr++ z!kJKto1RaiKJB{0F`JT|^5GBxO_f`F*}qRF`?79`?Ecz?&bMDp{t;7IQa?NxpkPda z^I%NnNZ~A+RvR!hII0Dxdhzm^S+)iVq|Ij}BENz$F~kI17~OzaF6(y}E@|3MO8NV= z+9Mv_;Eyqka`-NWfhjnKfhiEf0J_(bP-KzI$9$t(M^7AE5&AArfSe?6I*m`f=r(T8 zyQJ_Lx56>~9=DmRu5ye1@4FD|s=m4K#Q<(^A{>M{aB(zy z2>Q!PR|2;)b*)}8mBb9!YxvTxUzo}thB;6$HQP|O1aWXvf^+e6Hsq<0zx{js&xR#3rRKy9PT}qks}4s8)5&_)yI&UvXqexFGr% z6SJbtQd^t$!!ys^ZtCiL#oi50=;=C-BpW`=Ynjx+_bq-=sw3vIR4MqHHZ#;Cuc14- ze58@{Z0zPm*y5KGf1#ddmGl9^7qUmO&sdzx4496STWOQ1a`npIiBmCfOoo9hv89jd zK8`Tjmk~(N+z+`-?k6{(;+XVTY+}xm9a&os@O8A;O1(5|)^lzhksH+e@<2{!zwYX3 ztt!4E1Wy8;5`lKPETa;QNt7bzByHN(a#-7T3vBu^@JlK~22LU;mL zqvb}j_CjoK0pp!cBJA~*A=H|*i&&P!FC+cR^9}-qdUU^rfp85tCxu5#FpHyu*nR1X zqh*r@^+0E=8&2rjA$i)gn$K~pk+n6S=W?bG9(0*$adTnKO!W;B2TWwf^uwt%d^Y-O zlrl09T&1n^l0og2HNT6N;3lV^?M`|DQbjv8K0RjnBwaV+iifL7X9%@nBH6wk%f`8{ z;nzhXOYPi8OGK{4W!6dfic{Qmga`ySL5iGOG^XVmoZo4m79JjTLY%I95nYVmRu9U3 zlui^cdBvu|S<-Et)Jorx3A*J_JxPaefzxZ!i9~HJxcVwjlPOTfO`*dZbwn-unuZ2%9?rU5j&1URz^eh6sLIMeLst zT0vznp(f>WeNW9Q+9Q`3+*$L8VG94y9E}Ad!nWZBMwBgwQ^<(E0!MVcJ%;)F7xt$( z@1^Z4TRaLRTD~fL-T4;O_I<`QP;hxhBJq8^Qf}=K9Y-|nQs<9CM5Ju?N3Ubk3%Y97 z--GrJ>?_@+3k(&yajnH?ui6#f&R*$lj1lZBe6+n-d0$(sT1~p^@}8P<*M)JpqdA6{ z_%I5GCEDk}M1FY&uKm=@lvn8LB&;K7Ikk357U*jq+=Ic*H)rx)7rU1=Pj}_Kf&Uyf zP0j_ZOulO)JDacWq}J+Ec{6hT`9f;;YOmS(v3(_d;O^^-y_KCFe*4PY0~4sFi{>kn zvC9RSzgfM1d@*w^Z^*lwT6?juyqe`csDQ0=ilDar*#T*J28lLMFv0Duw;b)s3&y1M zS=$2>g%3BNkQ=Io%kgz*GGV2L-R}&Wr-{?=uj(Vn^5$$cC(oUMe|ZKj+Rly}(hWCH z@g6BPKp%f|m7=`@2$BORU=r0)@FkI7^h;FW56UlEV|IudS|bDXdCN4ZlJ|sI8Ny+V z9+nREAiaHXH;-}5xXuA?l&b_;aqo9FN}lWFQ5}%^zCaH+;}~~)lR)dW5d%i9 zzxRNU@zxmpt+#@48r`Yuk#mHew=(DJ~F1l)S#S-&)`eXv89rPV46*0!a2 zWelfq9bhp@s&6~GJodroU6yZ?UXq+7aSC^>BFwlP;2uXTWhHY8Uwvm2<G?~FF0$i*nAiBi`n7?5p^maJZ z!X$1Dx2sGFwhoxVK?Ik69U0J|#}x6$7@gf(@?fmc&lqe4<=!%8aBsJ@R~`K7$bdq_ z@>>lryJR)v0g10`$-&xz1&rp=f3?X4N=Q|{jwHS{m}~PL_mRun4i(#yhIMFx3NcQ7 z15}%NsE(3}>8gqW3FA5&xX0btleZ%#Kbrhg#<~(;`ux-Hmfot0MjvnW@N&58>3j5T z7E1G0=Oe%r4%%#QHFp7tqEViKRn*3kxD_zE=vFyEhq@AE;{4N<1P#K5$N}!C)9&hk z5awOwQA?}2lBD#D=wsZO%DmOJdTlP@)90IP)rJ!Z4AXZdct8mljV2=Ty(a+4YcK)XDY4*maMk!O^Si2SzgAt!$_7`pz-2nVtD2E? zS9O?S+PD9jqO(?ZGLome?k;UAtQePS>Z?!AkujCARSf*d1Ek5)MF9Fz>%pDu!_^_e3H< z>*NA1|2vb6bG0O9|IDcC`pz&UWR^0t-da<7>(+Q}e`NsfFgD&m6KD1x;@%1UQ*?0G zNqv3DTL?{k$QLz!7nT+wC$^|yaPSu~v|gJmUME}@ya#tS&jpk`*agdV zD;$uVf?L=AeG}XUXt(4NYLxZzixtIJVw(aof-T>ZG@CU<;ww z(OXAX&*ncRvkZ(J{D(=Y6IgMl2zL!`TlEdp{uizO)ZJ}QrQq)VcSsO8T8bF{Kbc%! zEqQx4Twk1??(zU92%zKso7-RKyG?+9B9~~PL%2fkA!wX5hVq^iMI}t)jW}~Jv!3F` z5e|k&QIo{Z)};O3wW`Us8mU3@EuiR4ZZw`9YBS4g`2~B|Nn(<^W?Z-UkTqC+#OG|p z(WsLn%VP8c#Nsj^qA@db*ZrYV>zh|E7oK&j&0bAxev5Zg4MG@&`j{1xJJE~hKCUsX zqn$hsk*Xn^#KIW9E+Y5#JIGniXxFY*Wzs!Bd3D-n&%Cc*v(O#)B>2B#hYP%F4^; z=5!dkn+HO)Ls=M%*zWQMzcI-ZWcGOEbQ1{TaveAHs%U1{pG3)oZ4)V*ep{jvb=GmZ z+Vp^URZ;ncwvzOshuN9N{zmi?&Eh7GGjPn( zIe4i*hhHP7KGElPR4i{V`RrbOx*lp?R%xbfwyGO@b}jMhwMh^|x#S12V79p!o@X-6 zXI@rnuC!w8ByvXDtc_HZjw+)1<{H}a3fH3JYY_0sJ$=k2l>2H929Un`Yil1?Qfu^Y z_B2&ru`WoVm!#3`zh`&6JTiCh(!|F*lJQTh!Aj?8Uo%ah*k@CaaEqn*$Tn`J|COEE z^}aov7Fpzc6P@qNaeuN@bx;j%bj_SJb>K_icabI?x+AN4+q4+ZV^JlAuEL{C-KmA5 zvL=K;n?3sBi0kB3G%{+vJ079A?JeHaSeP$^aiEOW!lD;+A0U-D2i6d?$CI{wT+yFr zb%m+NZDHFFIuuG?mi$BvsY498==Vajog#51WgPXsF6LuoNndx;iBBQ{3X%<+-m6M_ zomZ`H%@_ASNJhQtd7-Wdh zWb+owB=05MLp6av9SLNMh=d%mXB&R-AGavo?6-C(d`ATGG&DUzwKX5pe-~#%4G2wa zGcb(}#PzPs?jazy1%9DpW%(t!8vJlACsHRqOlyxvr~qd6QSwt7-hF&bL|QK|UT5<% z$-{awCO$1mMnicIK6_+^tr9o4jJORjEuA!rnRRnYU_AgpQD= zkkV>cX9cBDU9niGW*_jzOyj9`jR3hrBlgQ`)8wwt{aoVGif~FsqZEioSl06tEn$cl zMGi_tNRVG=)f=?f9JajoMqSzpO9S=N;m!a(n9-S{HS;Z3mF?+8>c0oZa5 zVwxJ|cTSX4nK-@dW>lzhXo8114n7$1dR2&FAoM{XB1^3?P6?a-A3 zmp?PKqJq18N?ku!>srZeP+D1zjOfN^2>*^_EFY%07Q=r+#5T=~EQ;Bm?aaWY)kdg@ zKJ+brIIAjhn^u6MS5$0TYObiozVx97O8%x`px#Hwn~LZ}u3QRkL5UZoJXQ<^vd}2X z6C$T50x#Y;9hVuFYfL>n=N^nSx1!$@o#*0-fjupxr05E&sJ3`a9x;1peZkfRyOjRT z`X)k4Pc+aj+T{ag_IKlGJ!XSvn8hHRHjMO-JT#^3oh6N~iwkl0-!!zAvL5&3Zqm-? zy@o|SQ6VDEf#4Y!X@T_O`e-yt#Lx4Yby7Zg&@_L9r4M_5!l%HEwZ-JSNA-xqZY7VK z8zFB28a}^N!;>;?Ij4bMTE*(g*XnQm{qeAEzr+eN24TKp=048}N%ou`L4dm*CGD7Jsw7v1yWE4V|>WOlzN|5a(CjHb#pcBF;wwjcy;mQ6OSMBALx=D>8nbw;+T-Y}LknW{cI^OlN`%cNqYc z`(YJ7f%9ZF<)P9A9f%$T%9KqxLoWfI-a(Sxw>3;jIA_WZ}rp=xPV44<@cDd3q{16zH?kVvC>qiz zY2h8SW5_uhNZt6#1#{)x?({Vnm_8od67hQ5rzSfz^q4)bN_PQ(E(3I`S<=p8m zW!7`9nta$g0?CcJ!NWvo`0@rFmzwmm3O{lC7up)#-y)+Z3}u)zjKn8mOIViGy9Xm9 zD0F3LG7x-bhNp&m`>zMd>P|=pZ!E(%O?c^j=$?_szi3fOG{E4{}SVm=K*6r6Z zeQEIHp1E=urgG;ntaZris$<$H&afSQa175_Qz>+1m$aKN-Eefc88caZ%}vRgtWJ3=-}jFI5Lc4N!i{} z@T@D6OolW=OguLBz^MCDiJey1+HO!IwdIXZ6rv#>GrN)X_1Mh?#*NSz+?AtW8Qv(4QarIGsE_BOXk$x01GCCQY z@$?PReJ%qFf<9h|ukqyA^Q_0$ibgatTU32K5QXt1*b}U)*646;L```*mo8H4Ub*so zq^H+*qDlnBil9K1$;kLBX3wnc@;vb>r6m9n9xs|b&q`slXiy`!MZ%{J5gIR;J;91~ z(`-NFg>(JN_Ad-EGN{EBV@sH|-*=BjCQ>-cAZFl-v&C94FKdbtCnpjJyB3y- zo@WKAX_sGYEr?-HFuI7()LGOlC_9wok}``M$4wj=4P8c8I|{zu4^S-qFVGNI_YGuz zbSi2X6tWW)FKKiA*_<@U2)iL;NA=50QH{J<+>J-~BD0f0$WCSHW13do3fEktaU! zv4lxmw|h3ygF;wFA|pZk%g1k9QGG0Pb5ze4xT@t%w#H_tNP`kyEsX)6;i{CKsnh({ zI%{Sy^ff~_ex(v98-w23`ETnmKM>qu-01(X4xh&X9Tp6XIs!s<#@^Xbc?9TQeCtsr zbFYy@g}%${nYuKJ{kFXS%5{5HL2AJpN>Uz|pkJZDxRj&K*KTY)Nom(=}IP}3* zT8o!o2d+?po*P{|>%hm8=~fhhdbQx=i;KK^KaTUUV@Z-Nt!qIfils!rTG6{nkPdV` zV2|Y`LtVQo^s}N5lOX-pCBPmlLWa7o^)ylJQ^Z~2U>6B{tN>ZWnifi;SXzWWQsB#e z9X|=u+j23oh;=RcM6ryBE-U(23DTi1E%w;kLbyb+)CdYIdM}BLfv&QSu{1R=J~Ej# zt=sa)>{zK0e@gTbzv)cnaUo-FcZib7tZT)!q|NgWb-iVeT_Geo8?d79CHS_7lzbmA z2xnlT>ONjD&cHfALU0B^00I7mwgLDMpk&|uBF`l(~+{~!6I6^wdPDhWH)$xDjbq@p zL-|-YX{efwW8yx1=;PI-p=q}5L$iPrb5_nG_fQ@*m2v4TbJ30q9@{(&Nlaxcy?4c4 z%m5s)-nIwo-(9XkKULS=8^_`V*J^tIf7B(C&JV#ubYafyygwuo0jHniSP(WpE`KYV zU&4x$IcsVthvZHI*Zr-+KidOc-Lyj9bVA;IZGj|kXiRpPCvcokcAO`0noo9`Cva}; zLk5m-w-D}g@c(apSHq3Wk#Q^(8*k4PAb}R7loDOYW9P^j^1f9E;w@JMe$lC7g}7 zdt$1(F8Mgt|3Q~P#JiJrk4paFwfuph{6T>HL9YBkkNm-=Jh$2X*G^EcU0`2tAwY5P zH}y#sF`)fFyL3-{S;PQi^RTIpa2)Fahljc@@)pAXnS})X|L;|JyM=(x!Qa*=Rm|}J zU*6fFs)>NV<)W~`33On537T3Bx%vAelvW`xO`3TT1Pe7m_nxJr=;e~&@aFl4I=B^wmvmB*F2c-NQ z7jB%6`vI&%6>L>smg^>6Dt0P5GYmZycq|(?X2{v2e!uGqmBYMbBe~TMha-&c2a9 z&-N0od-YY-QpqvY2sJ#TRN&2EYLZ53hgnv}yiHDMXuNzy8J)`BLv`= z>_F9*^c1MwePUzBA!$vDX`pnoN3~L6F|V3Iu>tQoGiXWT6T7Bu*4thVqn}41jy-s4 z!_WT8l7+LzC4Hm>V?aY*_LIF#DvRCz{T7tSyy#iJIVheu-NUuaHwWe|TCSW&z_>CPLXgRHEwwx*Mmw<7O6cG)vw!0( zDWG>0;zR42 z<>tY4%IbSRCedrIQ5zC*@dI%i>*pdOZsOL^u)r=>95ZA{#15>kRVbTyC;m+*UOwE= zs=xrwejO;Q1q_ty(ONlQqE*hMrLu%;NCiY*Ur4j)V2W>S*|r}Tv`z0r)P0f0IJ>op$pj@O-N?hkbozV4q_2l%=jX6C@^X@+$C(8SsZnN;*R!Fm1Vz6b0Vd3B z2T!%5`|K;fIDyzmjAbzOdY=*|qEu%0SV*1mY9PaR=IG?L5{a$1t?O;Rg z#WK%a{mn_gB=8m2Q-TF>8)}a03Zq!ey87DqF_-uy9_~02g4vt>{gw;0Q9&La43HFc zNw%t`^l0Y-tGsdV0_)7l2US;2jK}eo&KcKL%@ZyD3&l_Sc}}kRy~fVTlkpAtKps9V zOLY_>EV%f)RhWBMO8NcW1$vvMb7R8fZN!18stm@$NjEh&Pu90P?08t5cWa&N4|}5D zuO6m~0vu(d%Jv8BwS%f0daYGtxIMm`CF~SuI7EZ^g&mB0Q%yW7R`w7;pYmXRI-G_^ zaq$n&6c~5{PIjnj(%7uj6yG0c41U5}+wRD!=4lvCcAlYCj@uznJMDhzm~|qkNbI9~ zA**c3Dv_DD?-P79iLEwfGcby)TACcmw6OQlbTY2xJ$@yVW$uZ5*0Im(r0%lF{vLac zp&{bT$1)~U9>rtNk2fmzC$Pmvib=>Ou9P>^LNUzM71Cou&Nz=k$TP1zlP3i$nX%{6 zDswvQ>t92+xorj-nArzztE zDZj0IjW?IUU5T@6%qS}@+YI7bm_VUXMto+J{u)PRD$6jvKFC}6ZFG@}m0`Mh!1wJ( zX)4yH>Dm4{4sENOR>tWCLFdfa_|l4nHiP*=?awJUMhdDc2j2?H)_prX zR;s|=82MH1tUURewNarZ4D@3I`I#xboU|NO5Xj-VGUBnpKNyeZ-ZA!fD9_!w6|qp; z#=&7j=>(VZWQo<ZXGL#auGw0XYf zj|}C|3!O<=v^T4Cwf86MY_)ga>RRth1d0dbFw#z6HDBi2ZI|Shl*^Q;c6l@9 z`i~_oW*Fg}=25HGoEB^)ZsgI-`aNzTXJ}8_#uUNSo{;SVJ_s3Qq)?h;*ZnE=-!+Sy z^5pmTjk%T6L26@_WJ&ZaTRpR?dx_!4qRd9R&%GJ7C&atjxu^^?5#YOLv->tC6F*{p zbpWaUU+jH#Tvc24xJt_fq)Wh{xikWD2?6O6P`Vpwq*J9^=}rmh?nXhnyFt1oE^vYS zyP&>#Z|2R6(i2i9I^tu6YkTMW6DEd&YK6l!#NPS3}kaQ%$b}M|3Uzr0oyGf?xt&S0^-i`?x zLC<3Q?2>9bs%7L7jghFbNru{h2^xQ5IYl;tL{C{tgu9ELjnCFy zfH8$WJZ~{EqD)>G^=etSqyzDetYkHY^Amt0&uq6QI!~mPM`5D%8}uddzH=V9d0ON7 zMW{wS1HWMWsN=kPJ9h^7C*Bu+=RNQ{@0G^v3YF5aw!3s)G+SheOn_BuWxIFh&qXmXJ(_E1|x6y8+p>QF!F%k$V2>2 z9ssYL1URu;EDWP9=R0kwu%%J@zBJ!yBLJF$luG;cgVra?6!#N~^I`i2Bm`UP-xBq# z>;)BK0Gac8Q)&={$>R3-=pIFTRtsd~>u1_bW*qYAII>c1ckT-8YJsZ+=^_F5LVCx~~+4R|$MwtV@Cv zzYzqR`r9_4Qv)e}BMAT31m%C@JZ$c7J4CV4F8_-2WhRWvAbs^q+43*8gCTOcU9Tp; zlr0l`oqWqJwSM8K2iYc>FhJF?H^3GSY+qD;-xvAc_l4U0MAa3CMlWfwyaQ-N#)ngr=&%B`;e?1bHhN?&$*;nXazv_em` zx+ewr_(;Z@PY4_FdZY|dS9nXjUYLwGSH+pmPdzHP+$L1ztnj0Mm!Qmh=n+g{WO!ps zGC2XIl=YPzWnT~cM9d=)wvpkzEy;HYexCi zu$xL-(%^THgjKvuR~0FlUDuK~UL_XTs7m=dDK^;XM2L->a=ZVFgz(h>e9_J5&H{-! z@u@Vg=6PnT5WHp2whufi$f%ct=TR;P2~m$RBY;IML*W0sKrVT;S1CdY{FDg>TbK4DCZ$^dN_Y>nCauRzN|*oxcn^{$Em0;VEIV+n zrwJCuMF|H$iQpmCr1g|Z2^V01;GwR45g>XnO94bh9DLnWuEoSakc*1A-+V@8Y81i5 zL;wUJVtX{TYB8}86B}F*r5z&dE(00%E5ppu8M_nYYnL3ecILRMHW*+P?3}n}%JWlC zFl-!0bd&A^DLn_q*UGyQcJ*-T{@+I8cd=xGdObRw`0&>d|J`T)KD~eAv3<=k?;R0z zkVi|;Tp=sxCgATkXL~P4y72wx5%ATszq-Zbu6XUd;@7kN>gL?;`40g4N09pWjr|uM z(RiPjpr-u2%3gQ7o>!2?G)a4O@*srAfwXAT9Wp)$iGetF0_Guw=!tQoF`Wg zIq+FTpIdl@hyf&xL*A}eiuDDR?r9B^E)c9blsKqjQ#!mEOePb*yL0P7L(8ldfF{|+WPyg60~_dVlF{*!l!Ne zu2r>_@r(`j20+qIBFX&9S)32a?;jPgAVgx)OukJdZ+cW}naYkte5&{ga?jC6EjDHH z88>GGT}15I8*E7S+roRjZM&vPPX!s7lZl&PaXCi_o-y!rD=|4C1$qyda$9;?NJu6& zP497;u!nFomA&^A7L$@Z=l_W--$tJN&d^xr$b~kx%r-z z{fd(P#fq~NDjEkjt4{8GZsOkaKpLd}=l*LL=!?4L!&-L{8r1b;BTGk%$%##nsS!d9 z&np;T97QFcti|lfSG2H5kcy5$#%Bg?H!%m7>3-K`Vf2s#c#41Rn(W?RH8*g4by-li zn7s2nBcASA4CBZ58B)VetWuC{Co!gA*+!*Du{MJj&KTr&v_k&5D(qv8ka+x_z4h%Z za;N3io70h;ema2;oi-E`W`6F_>ZC5_;^1=Ji0UN@w|TtTJU%xilG5>U?-xEV`zEkB zdTb>GfF_lx>;ohg+8HClvPek=5~hZnd9OvqLRoN zltsn2;ab9~>NUupK7T%Of}j@P2}gUkaURl4{*d`h`50c~$r=Pm@v%{yv2Zh?aP8WD zn|`FTY{apqOFd;DRlOh8-VldHKGdNu8(wd0=O&>>)UkZAi?|jF<;FAW6u#GFn{oCB ziYA9)vh58gv0+cT3yDs+rj6?MJIU_2U3){S|L?I8tDgb0@v8li`7* z(IdOE7+!LrrB->xB6h;_ikPR@ry{J-1@AY?ldE$l$wa-r zqf}qm7HuA)IV;J0SE!Y&5Pu`Th>}Isqpl|Q&=&7xv0~Qk{1EbaWrq)Xus91n;^R9z zXVk1_Zg)fdHpqa@K5^(9>673S@ zl15}fi2A8+O4kPJu%;a2Q@0$vbw_Hxqc0(OtVJqWD>3~8!vPPC<}EaShyYv8ULf`Jm1u z)+qLQERX!@{!R{;%aFE)j}S?utm<9GrsrETT>r=Jot2QGsa(gbUqDzp9{ENnA?(# zzQJX>UYOUCj}GCwy>6M?@*aJKOKsgUuO$y1d@s?^8ex zI+<@(x|q)j~R)b?bzu26CYg?X-L6ac1sm{6qnkDWll>S za+>zasL!;f9GdE2O@?2_`;2i`+?M9WY@9SU8StqO{*Ykj{W%Nw7n$L!d*hL%c(! zL%2hsL%KtwgTF(zL##u&L#X3fhg3%$aPh&a+m)bp|1EPa3Cnq1BaPBHIM49rEIV8^zexAvhbkryzqqZx^R#1wD7R-lJJ1= zobb4CXXRFtzMP&Mlil#-Jt8CLozh>(c;YeS6aNDuU5i);uB}Ftx!u~E(>qzUj))CfW){LDFs7}aEwy22? zY!j~yi7Z}~i)DW0rs@;yksm_?q3%{)HG&K*El(3`P{pIkcY|M9L7!!|A=uNE4txhp z&wZDhZu-tNee>OB`t5hO)8pU8r>nhFOP_i-)yXpRIx$#d`ZX0tQ2AU;t7@{@fbrMm zz#CdUylc2DhbI>)ryw^X$1YbcXD4?ghb|W^CoR__#~_z4XD+v`PiVn!AzonKG?*f+ zx+}Rz-^adIDn)F@UTTf{91Ze@^#u(ojRXxHjR_4gjVcX@#+e3*Mudin#*hY|Mv;bt z23#Ci-sp1UmV3i8qh<#^!GIAek=cOJpl}>o-q;NqGPxf?p$V4d91v29J9{5sT#F#? zAJ$rBoYw8FVE$@1<%gCNA!$yKmHVZFIlmx=kM5FzP~^vCd|u~dse8u)CRmYnP}H+VSA;$bY9x=|$fW3t4n z?QiFBD9(<9xS=$F^B$Wq$QeQN3gLqrBhj%OXLC ztvnjYH2$0T`jT|SRE7V&7lE*<7N53HgC?t+E$6#_Jhq8<{Z~{MA;|H*`=RXvW7#tp z%N$UN?8Z1buHHlRw?N@PBKH+@*mg$4=ss*SuUo@>f?iz7{6Dnd3R{+Rzb2lOA5bWakMvX;9+70KHF1Z1Nz?Zv69zg_>3c>nxbA%I+J5yp4x zO|}tCX!D(#DE)IZjy1|F*S&UJVNHiTHMPTLlbnTY{0jz#e5ZL6d#hno_mO}c(waT@ z+O(M@q;p-8v8Fb}LXVJ?5|5CFuwQ?%M~E@(cOCYNDe?$mF7o(2{|1zAoxkyKSev!P zrZ@lY=P>YFKL;@zmhVmuFz1IqIXQ$>@annaoN~Ykxf`$~bS>UxbP&08c^Itg@3*nA zVV@=@k%o37LELBR`uAWRys(ZZU}37Ex_(Ss3kTtI;>hHnjZ<*xORBxV)1*Kj@CVj) z_eQ)K?A|OWKaYb9ciIJ#+ZYdo?B=V>5k8&sJeSqeuhsP2)s?|jYf9OBlsOL&C!?(Dcw1qHCX23gr)6Pl7GLi_Wn}wtjDNyp_$$nQ)Pnc#GnW0h74biX!*|b}ww}5F zZZokV@BSacYv?aMe}3A^^KUeMHS&qRb`OPzQlnfbW1Y2-YaFwooLOO=?UNrPiT~^E zRWM5aFrGI5km>5!@f+f2VRR=VieGy3Ka**+^VNmAyHG&SI`DZLvD{x%K#^fS3qR@7 z^dEGl`48EvVBSH!|D12oAJ5ZIIh|EtX%@#-Q(tQdhlEyx zsz-BL?S6Qj`OW+_BBo_j@L?Z(!U%h26e^$HoEPFZg@nD^8INmWCA#;%;dku?I|<}W zO)&R_la0S>FW~&@p3rX&3pwJNRO()MCXE$G4iEoyFypyvOh(ycqLfbK^V|0)ajK1> z^(Iu(Tq#Alm}8Xf4_7pjJfb)ZmD8wT?g`yD!>F5lInuKqm#EGcU{r+NxUZ`$U!?ND z#Ve_*iDRR}B9bbdtUK{Vz{?b7y4s4PLSJ3^?J7M=Ii#7!u)Kj#<>UAEMGuX7XfZ-< zCBw)=D6rAY3Gti&J`?6b?R;5Zs2z1xvARtRQrt@Lk+8?~9(qf&oI7w!ic?@bD#9!) z>`lbEugtJ*7c^ihFF0!$T8x$Oz=hf+lfQMg;Yn!fP)Al?(94JBCiSN7q`kTdN0L$J zA*pwbb5Fu75z(I>*iyXBT}g!-KZwwClvys9U<^)GnNJe4m(rp%7o}|PLSxL=bg0XP z=iICoh_z5WCQ+Wkc0g#`NDt}bXp&j}NOb;0d?qS)IZ18#xhQLGkeW1yI8XKH&ZAlE z5BPuz-pr&26HG0$Ij1#Qn=`UnPxt6SBX*S!Lquagvu%*M%4UYBZ64uWV~f?#ZfB|`o4D{~9otI2L zTX*aD6yXy}^6oQ`=TVdrcx~2s3O!m*d($Mr5-qlGmGNdSQ}s+U^UcfhLB7;mEG}jt z0$9idlg7&>vgNmYAJK8?T~{Glq()J;4CpgvVGt(&&_vG#6l?Q}@_yWxGO6?QW2ptZ z6*ES)CC(X7V-epSw<|B2D_M=7-Uyyla`Kv2H9o$vu)w?1sCy?*Fsf&L0G9ww*U60> zJ20VrOT^}Fe%%SZp2l#2InX68w30gFI69Qq6|%oEy0gJJ+u(9>5YhnMVT2xc`pma5 z&R#$|-Cb*-vke%BEsXAN4N%Rqirai=U)rE9kP9%><>IuW;R2Zt_E=lx0$(cyI3*LK zVal*!dePmDRQ&j0FDZ%7^-P!O^w5?%!{Aedo52GMYUr3Svayn>K95Ye0c+V&+<2ED z*coc)ljy=%=9-YbMM9Kl&36!2U8hZO`hLZDy&j2I8pA#lpMi9DhJpK&mw6Fcu!a2M zO#b@@L8_t>q=w2-Lq`eTqqyoW`@M_Vii9=%nlmn$Dmz-B-O0|nxz|SqcUeIzt62-{ z)vbK@TCy&_kX4AQ(}6E(6fk7yRJPtl_`h^3?&f}$A+md4>V!W7nP+?KI+!4z84xFb-HGtf z>Q>)>tZQh0e{8o?L)CoV=y>4A#6XyYe6d3IMboUbxPL;JnAj}S=(y@|R`QE!)Rt*! zMSqj92yud`O?m%E;nC5o$RzN&eOPVu=MhTvhhW3rw531^yrnTC{j{KrS@~eG z#I53lpd)s!u~nnAu%I6H>ao>RqOzsv&mYMv*w;F$_)^H|4b_UN+l1+e^UO+%`tAH< zt^W!<`ZjV#%BnIk#h!E9gMRB)iU4cVUl7frX(R8o8}AWzCMGepDeZ3;HY8RzwQ&ua zfK8_psv2jrG&Q@zr_xiYCmS53z^*cBq?@*d^8kj*IK$+)kwuzEP%t~!_^N4IKu~^x ztZJ~BhNQJgSblsB68BF$wHH3G?LagNTt6vF;8pcAr7sTpRQ_VbMla2<$eOCS?i2bw zkpCumamgo!do|L^laWChrZyX?^@aUfq!G>I@v$6Z9^DG}R0B-!7jMOvd3AFi?sspL zC{`pB@wd28duiCf2*FEOSgF_%hn%|P;D!#IhKVSg2$dFrW)O?;L$yDZ_?Kk zWN4;c(#+;Ht~%zIwTQCM9p<=gM|HEtjxsNgcx;C^E~Ga~vvFDs)Xp?l9|Au}#O0e9wV|9o z((fHm{1d&JgUd6izsu**sEC^&TNs}U_8y<~*Jp%nlruUn)DxNh0yCC<^hn=Ao2vYG zz&d;f3%Uebe+hQ!w_qpgH|aM&j2ztq`EF7dhkfd~SL3_MrLV3z!n!$>7jRnNI=ChR ziIr}etlwNae_nf}yO&}0O*W1mnB{ME&NTlHlMnU%TBN6|vo<>G;2yf=o^<+596S)( zYLL(Sg;}S?{eLbUQAzeYTeE5T`@zpI{5pgg*SHk;+^%(|paDQB>Yi_KE%8 zWRLP>6b1TU%4H8Id#e-6=W>-`&-uch`)sBu0DG>U5mbTs;%bSSe`kptMao>2Vey43 z7}g<9K9-ehfwfx_*V@=d!1^ofI_5Bm)WqZb(2?-z&-k>HRnCZd+irbC$W?Ra8ahWp zT7@ghY;@~s{pOT#7fhD6I#0d-QkGUohL7}JuNbtmK~g`TYauBMb!&-jQ|bCDzKk2h zI!n@e&TmN`+u@9h=^4INe{7dv|8z3y5bdip*dKeB)HB1tHgkNK`X+q!e~q%)@03|^ zZV<~4fhk-B|7d{n8KLO2$3+?7Ae!~lU$){}r*QA@GGZ|5+v}$Q#)yh5MvQQe=$K!< zdt8-gZ_(M`n+({zQ=Ilm`W`4?^Iq{rZQ4YAuEp4URs2KOx)zSwLl`6omZGI^)zym* zwjhGJQ+}queO0|{_gTOc|Sz^EAoEo z{Y~CoT2yDFQ|lS$iGP9-|7JiubHreo9vRJkOj6EHa|IsD{Lx&exxh5#!$!!A!7$uT zee5%gS|lR{p53S{Sm%az$@(ip{gQPz(=$HJ`Y-GRJ3es4wPe>#cQv?(Yr$QJJHy3I z&T+8IJH)m2t%y4hiuflaQ@hE3zsTs;n~?lg1kQGQqEAW2wU@?R6#{WIr7^!(h{wGz zjrmp(Hk70A7`8GZ>w1*NKoHU`14?7&{S;Wa`^~+nRC*j@8%g_iA8%B-dtuB_(yv}@ znLEUlrp}|-v$=)hk%)qKqFTZ#)Aj^Sc1Ns47FTTM*kP3+_GJZKFagZYh+!;7G;WTx znLL>%-!`hAXfhcepp4U~IUovYq#xiM16BJSb2yhUAH{mF~uE#aMl+|v` zX3|n1D5RTeco0|5psh^6L=PClLkvWP8}Yin-~7^5yRnf;OPhd+88AkG7zk)N*G=AK z#5eFx8EE)RXN|;FXGEWbCZ2xqFHRMedm#Tl2nDP+Xtv`*Xg&m!?n&8Y|^50h3 zG7h#VDmXC4y=^1WHnbcgylr<0{U2*qLOrj$*6aT4~tB|X>sE!z*E7W zhj*$^y!3$h&6w{&p#H|KKg6N$?}w}U-#7~Xi%3=f*7NE=&N1+r2`rk??++UK>F*o` zkA4eOwcMcA?p_@VwWEOUiC=6)oUPEE>?rc?!bKkA15ad>bbdA{)c;n@ryq<_RiF4z zMYE!{^M<9+&@s#!BmDo(uYB;%bVoxYYk=ic*Z?0!?P&5s$^I0nIaf}~q8XN2f$nXu zeklT?pcw_C?)r64>WQ8dDdWc~QRF0$z6*$)66PJL*o+gcwqCn<{7H$d44J2vx)1UE zKPcf&AmQKGVR?L@+U{~o&G^n!~YW@D8nOj$5X+sd&t1F45`MYKhDUGaSB3JeqPDwucDKh3v{etM?M<;B2?%To&%OEp1@{J0 z1=Q3jtST!}Ny%%)z9aDSj+0~GxBHSgezVuiBX(Ocp7p1b;xob+%+`>1ou?MfeV9cH%HD9?DaGLQ$NTr`Kuz8| zoz&6pNciLh|YivNnQTJN4a4c!gr(U^PH_!ZflBi9a^s0RCABgxT zfFMB^L}~8U86PT`Ufj$ev`b^kq|;^BhQJ+*T&ub>)%Nh*yx;%f-guUX@+sFHCR(A7 z>h_kc;&~eQsCDz9GpK?c6nJdQ=3<;Q+@KM~)ra<6TIy zm$xqrPE0tvT5^*DgLJwgkOa`B_R=D^s`!CLM^5xzRTo1yN;_Qz&2;6;2sUiXVH zYb8;=iQE?_nNZ&26Gn{579_@t^G!`gY0dM8%PmNJ_1vxxprtaJ7rROLjP9o^&b_c8 zN>F?~6RxL(7 zq@gqM&()_%4iA=}uJ{n)&$>ZuLrNjjFKYK8D-Ph($-UkF9J0AO-L-SwH4ojj7TvWp z-L*yCwJ_baLEW{I4LRu6dp9?rs}<1I5$I|Qbae%~z5u#916}QbuI`x!t3y@|W$IH6 zTRlFvC-NC$=kpZPbf(N}T>I@{(0g|>whYuurw_9R-Mv)19s89m8tjIas%9L|s~9do zwaz@xr)}no4largnu-o!jsBv8y`qEmqJy=fgYkm&+O?+6X8b5GMn+Ukb-em|pvw#8 znhfIR(wgefe1R0408JR@VZHXjOiKKIt>S1dbFa}gj4ZQkl zpo^>W@pAF*mi~NAXEV6sroGDc0nxjiyiEH9MT<|Fig6IK(wWc6@^mxMx6%oYP!DOv zn_#}Ig#6nxb6NY&=o)=fX9JTb&lWF458;cDUJxcyV!f(7nSf%{)%{Af``GAZ#sGa#XLHa_~V+ ze!GoSh6#)M*Dh~LR<@Xwc7T+D5sP3LVQg2Q-c{H8c1bCN=PdGJF|l1kdKr|g4`Qym zj9DbYlw-RF^dc!s*kaP#fl>ySUE{G`BYNeOB@bfq+T#g>X2vSMwoRodAH)pl$%Tpi zSwlRGMk<3XW$XB)jzMWpoz-`~J|+wF`kg16uB_ z>^-Z%n-0=FSysY^^o=4bfocduhBg;~_C%_dN2op2oN04`J!IT-G9L(;F-ln(7t>w{ z1L1@Gl8Z3egkQIc_eG-+f%tW)jerP2?~{vg*;-$>s`N#p5;^nhG8q98gW8je2-$=^ zTA%ktqY>5c>v9?ak%HEei%8g7JzAamqA`dd{JM{ffXG28DMfeLggskf7Ew$hkbthJ z5fCMaCZ&jit<|$Nwl5l+$XP)5i4pK-kXT9)4V$o6Yj$5WE>TUhu^YBKW$UP|Bx;aZ z3Nr)Sh*xWE-xxj-oS?3@kt84}D217YO~JdhtM7YCw?8F!`->Kldwut1#yG1)zn5g2 z`-W3j$>Vsh!yMGVJ-vWoa5xj|H8*%`jIf#N-c>TVKS;3)xJ)v4m1*v86g@qCk+&b!29XFW&_hp+z5 z+&_-Rzh@*Os71>V_UWicf;KF(n4Nc157QXoKi@fb^4l4`3yS6ffXB3`^Tosi&-V@yxV)2#tA7wEqaFk?#}&RgE`F(uFp*? z*jPmcopuC+l_uVf+8ul(akUlEoO$~nM6HMwXy^U02ll@o9;ijfP-znokf8nF>|FT; zp~#*4^TcAu(pdEoo;wutabi=t94Ir=&ET+IG>U&YzTG{A76ZevO+Z|Nb_uJg zo%bKMv-ca8ke-No+w>jvwK&Do?TC8U^c_vd5Hz48lEiFt=+6-WOQ!kHC9(W(PXK#^ z|70@HB32xb;Qz^@=2X|n;b5U{rB{>J_2|oZ*snrg{4ae*sOsrzxr%=6no;4kYlJY3 z`*$)WGBbTwsN;T7sFC1M#$O63Jj;0o&d7Fp%1EO78kg*i8T+_`E12YksDgi~6#lC= zE$D2QgZJTOZ3DW%_{{3m0V9nCk?q~B<*m5Grm;E` zPB1d^#AUWbdSt8IdH?E9rD`qWX1S@P8e74YBi1U1_b9}O+9Xo5`W)`y91(fHhs7O0 zYT^1=Ms_DsV*Re$sPBjr+sFJSn&)73kgjmq%dwj@XSx_4MT-{PGK11pQ5?y_5cF4# z=B4LjWXw-@@DszeMmXgm$e;9lPgu_5KYJEqudzULnA%?}UEC44-kWt`dzWI|FCtNU zU$HroN{N#})h3m8FUg_SKr4(1mbeU~rQ|Yk8QpbUbmhC98(0kz{+cK-b-H9*b=7AM z32YkdMx0j9LVJ?g_X4XLrcU=|s_GtTLwJsNu77@QISO7g3@9Jk0}Ef^L|ELoj5|;o zc5%iW5-LteZEs#6kipy#nw5lDznS z@BRTbfk3>^hga#G4N2Leg{q}m1tY4u9u?EsQlo|bQ7*fikW85*KBq5d?Jza@Vt2N} z?QF2lZYR$W>h`6;Fe>R{Y_zVT-reoQ`1~#dpBp&Iu-E-~Wib9W2Zc*6me5QejBR(Yb)TjNKm{_AoLCSHOCG5?v@mlX6~%LEdvH{c zX0P%1WMAJMmQlrUcbl-*9&snB3CVDGp3ubxku0f+%5Zm$(8UfhDX9tHaCeE&#THRB zsfojIcPnr1LZ9}Go9uLYrR6a61@BNdGnob;yR-Dvao~V+xg~%Za`a){q>gK~-vnt( z5vlGxmOrmG$79Bkd36NH^%L+Sl-ag<1M;KJp5rC-(lR0rZxLcyNvB0MtbHl9Hp$;g zI~OS+vpqwab(_w@+lm%r6rPS1gW2`~Gdv#Pp1E_@<2e8?w?|0N+#>7oX8`UjUx!=E5|+{Xt~20MCw^IHNnm}}xpn_i`uaA$`tsN`V+Ti7 z*39SBjevt`XuX}QRU-#N1Gn4Osh%Y`C;#K@c{WEZOe0c;0?Sp9mUo&K zzKSAz1P4jCA$C|BN7TqJdlkiQHkba0_;_+h%-!)eB%KlxG$A=^P|eO-8k5ouFf%Y> z6^tXC=;|}@{@NvJX7HR?LI}dEKUF1}3bkapMzRBL?N{*b|aQtSQ}|utrxzs!^=h_nvp`VH1+i zS>Jd6rqP9qYZM#7E0;2@b`jqTSFqi!S zXjW;um1a9@A1VTX5AsT8#$;oE-74CrghIs1uS;bFKnO}tX2xYJf8DCor-VxMf?t=> z2!I&$F`1c=joqWws80!vsDxja!w7&Bw3N(D!dC9l>d>czLA1}W%Vz{Y4njy_zRSk$ z+3MS;gh|9IpeteoKnbEqVWv>4#~lVs1fm2zNMWX8JMwHz?o+}c3KP(kHwwHN^bGc~ zHk+MS=e@fLcY&xu#wkVgY^`3c)qTcYej0#WW_a6$y*DgM=Roww3aIs?uPw?O|6`iz z-vadC&iKOHKG9~G(A_lhGaw3|kb{0!yZlL|^k4nh7bkB$Ls7e*D0B>| z?Y#d_7IyoPK1=90SSE?r{owOSm=E+%-a-FM>ajF>-U%4(+O^vEe_cIh{%u&kL%uuP zx~6SbVbs#k^0G(bj8(u^Qde>LUdF-V@D6j&pPPqRcBpPw#vrGV=u$S7u<*T-9E`5Hz2ve?d^cqY(UK%X#_cka0;3~?}(bv=%)(qO}_B>&g5NAru%U6Tf zvpzWCK0{Ex)qyzRc&4Zw8c1+)@9cVT)`2bqMaip(;KDT|?UQT!Yb>48;RqMRNfYp` zAME$Y>%r4;M;HZ)=`XR5Wbd}*+?b{6^noweD%SAAI;A+CsXq~RFIDIb6u%fAjrV-+ zJ^g8PO?V?=_5%J0?qxhCsbGQ|tC1i*Gjc^6)&iz5GS`Sj1c?&!o93D?A_s24e*IT$YO4p?lheSwj3-&dQZ3yq<+q~IJ z?nHz|@jG#6 z3<&GK6_D=p%n&lN?HRsWcgS*767+mMif<+`P7&s~1`UC9%D5|W6!7w>xs7pH%(_(0 z9A|FiMZr~Y6fm^yF#5Q=f}Ynoo^MQY6!5u_9;~$SLtGwEudhYhC+$$5w)5~1+k&@b z&zI^oG%3&Zm-nV)G%Z|t_v>BR_uKgE8WJ6O<4#sUu`(JSF6`^uacS!nZO$zFCs)Im z_g4x|7LzZWe7ol+%tzGh9TfDeKl=@ntU^1 z{4z3&onp}AdK0uFg!a+Ac}g?g{Toa(a30VJnOvL`C*fk zv3C$L106`>a55}_;p$2?`G}sitZRrxzEko~jgr!?0Tzi)ApLI}s-33vC1qVBESHTJ z=c0lQH06=wDh4JoY5KvD4^@_pe%lbE4^yEmlYAaC#4;K}d7vQr{d#~UU0=L2Jd%c9 zUL~Vc(m3X_Bj3HR&v-;7qfF8yW`t$5fo`kaD5g^r#~}pP*Ht;pwx}=}s2cR*JYXR4 zq;i;hQ2`RDipFMM)>k?FcrlV#J;l4HlDV>fPS}GO&D^Gl+EsYU$TF=d2$AEaInI=? zu@*e6VY5eOiZexBDQlTV$2(Eu;in~O{sESm00oh?NsEdAfZ&m?#e@qef8C_Sq=bt2 zqDhO90D$Q6QHzNX!0ypx#H56VSkk1$K>$GVSkhu50hD_*IWQ?|8rOca1}&!%Wt-UGxJ%~~=9fSVpd+DtS6cCV%^SlR=` zl4dQ%$}@-pA3_ljkm1!-&P0HZxY4YoL9mJH@k+ap2|(%H)XEgg=Ul=PxZFE)WhDKf zg85kUt4a0S=y^^4A23<|p@;m74P_acUtp?^`&=qg{dyCl^X>-eSu;|@mnKG-miR9Q z^)I&b{hRD&$B^F|;Ua%!PsPYBX+)(z7DufgdRX~6q$n9dq{e`T?o zRJ1+NCvjC5(H!env^#s1PU2`LqB+&CXn(Lo@*l(w9n_+2$hisdNtiEWy=~{+(qlPB z_}}b=3Db9679pa?!dUfTo)#4I&SJ*~SbT+X@D^0_5V2!#tbaAi{~KD;7ck+KxpKfh z{~(Xfbw_-*cEG;iV2jQb+Cetf7;0a5Ko9&Gb13Y)<1xbj|KT&k|^lbwE zPZo7+?Eb^7yq7D%*|e@KhAd9f8!n zg?O%gu9&GB#9nD4BH=;pJiLYOy9oD(N;T6q>B+Td6_(t1RBi0Tmq1dXy76wMokv>F z4bG9$?rE}147C&QaEptvs(ca%(i<{)8TGzkgqHxXnLhyw1CKkv|31Q?x6AUi>M$zQ zNlwK5$FkMuo%VP7W4(YDikg!*Suv2bsV9?M5^HFP-FZ>|hUyt-lBFY#)| ziP|60=p|y+=MZMC`%+L}ZfoJ#d4K=9i$|e4_Kd7UJ3JT5b#368H!r|pIngPo_sEyT zMp3tqN$<4>_8J#&I>}Hjicbp4&Fcjd%7~7tVz0Sc?<|IFFTmlxjlT0n=JWM!r?+xz z{AIL;Oo2-ziJ|ars+O3#2o*ZY38*e8PPz(ct_{jT%u?Lpa|A=uj}W_2oJy7Y2=}(l zhC&Fs-cr9uGLVcnULud8(Oy}3CH$%EHq$ExrVS^i!FWySPZ3{kwa7JLsP}TXYaGr@ z)AD}uik`Ty8cH13pvHh7o#bO6T@-Ilbts};Luz_Rd`-TlQdSjeaY%SAv3pL8l|es& zKW(j|<+kb#{V4S51cfIhdlctoBt86@;}{!}Zg3q3qxMNwQ-o;5cr!0qTy&9U_gmaD z4d&6PTR7}@4`mB*gMqczg#sy8YE}($rp=dE>Ghh%Q?O@@+0RFqeDJA#z0GXaXz;jY zAv*M}y_E!TkKhOu*!Z6(gd!yJ-v-Nlq#%-uVW~ZO;*ZUsJ%-_NO`u@gXVP8Q%H@%z zn9BYQN^3*WeST|7qwMM#xW4s>JB$q{%OCd(G`XR@0gUwyduN)fz6|#x-WPvHw<-p9 zp6`PBE_MnU1fl2PS-0aaGUm0wMa}bla6$d~cIHrv9G&FemtM`f)6<+N_mdVd^mrhp zj%v3Qkkl6~Y9qkVuS?njMx!4@C4d`jeQ@!glBhgist~znM?_UBJ zZ_H@&lvE}P>7-}rF8j!uUJrR_=*kd}=#aHStL#uL9=YBAF+0#XaL>zR`?@p`DMW$h zo#MLOLtkH^{qXt6^Auvf0;e2q(!PspylF$l8_WqP3?~99z0~Wv>ul|w(s_?)J<*K; zZpt;tuXE@pZ}SPc_NdA5kmIvsMIsoWf5C1Bvd*;8dFe)Vpad(A&xt4rF@zeLFw-px z%e~5s^0Z=$#imhb34!OfXkWu%CTGu_3>oJte=E@cBC6+pmm}fB&nq6tZSTWarBYdr zuP`uEc)G8{8kDEihT@y+QK)FjF2R6!2?=1|BhS<>%4I$)%m-(7NT-a4!_K$TQe z&Y;qvt2u(V6&7(XD;0qF-tuPLi@$a7SsuxQSB5?g{~g)mH_y=h=n6@-KnjPh0_6M| z1>;h0MV_kMbrz0v!AM#>Ec;N>Di-*Wx0`Ctmd+;g2433YL$acAM?wdIlxYXVc)!XYgFfcJoA^WpVsYlVr%nH9yST=b|z(lPqfrSRQGBQK#(sT^JNT% zWZQ~klYl+ihZIkw?XXA9OkPY*I6%R9-SuTIlYLX{Y!zrh8@QVuY-~apa9dJE!@BHl z3w01))Q+(j6;^BV?vW7B(by9L#O}oK@#v{-xC~6S^_5pBz$rPc`yTL$4Jou-0hTu* zg0IH+)H>7-ZOddqXW{5SH~&w3OYW;BJb2&kRODu!oRp&TQrLHk?Oh8@LWT z!n@@&heU^gn46#YLwHBsI@Id+^6h$@4-a^Ci>=`sM;7ukL9rV%ZG$pVUK7L)6Zf>^ zL%kxTnvXl!99Ujg%yV;fLbmyEEjbQtGcDf>$;9cD5ZxroJM!5rlfE}<4JXkN^O|B6 zYs3LLphu83-mVT|lek4cUSL=BeA{arD_GM&T#xR;OiqIK9gz;9J|2fM)xL}*E~amP z<;L2|tT&v5Bv$(;TdlPVxppt7rt^VMuSU%n!#=+5dOE(7j%l{Gi6`e035;(b+N(e^ z5v#vppCq&|!KP2QMpcFF?Qio8|Oa(h{|1 zYe-cavN?1gGK$zL0z%tvNn^>rU^O0%+Z8n6rmWY#Rp551vP8q{*TR2Q`u%we-G9^j}DR>k47=9=ucD)9{jM z5v0lgAr7tp#7e4IbyA)3yw;-rHL}14o$qDpJe3qPLLZY%N!Ut9%#$oU0fV=J?ss4-0GvO%`6N^R8ZOC;n8Nj`l(~dMRAR~a?Y#T8;L3PvS6{JuzeoQRz6mv|P zYP#hdoc7sAPqmmtBzW57Wz6wi|9do{_i)!QqQW*rcNA_-)K|P2X4F+Kt_`x7m@&T# z-K!>=?vNuOOf=@KH>CfJK^N}scnq1{Zdq+9a@(Y*3%%xv&+yq5hh!UvVrr9q6uIFT zsndf>mCrH=nZY9gi}Xe(li<)NTO2d)M7n%!XKTQG&otZh1)`?OJ*J7{?Iz#NvaPXx zByS3d?d9!_o_#pot!vp-w$Dx9g>hl9t>L^&n5#*5Q**{XPH70Lzozza)_g1InXsaw z&Bw7@qSvZO$ZazM%cjO;_$5T;DGF!IKJcE*&w#4wIBuo~xgVr@akra`?S&Ok?mF;B zq({?9%svKsHSme#LsmYq=~EztnlN`(FySil=W$x}?pxIO$JFJK6Yx%1xQ5)xp1zi` z+SB5C9CcvM`Er?nfA%<-Oti_o?u}v&^F>PnQ9f?N5y6G(f!6h0 zC(^OJ`H3D8z_Xg%q$u1|%Rat}qz3?|`_CLDi7slSH6u(hMH{wTZ8EadKjc_z7HOd_ zJeyp*?<5(9>rzcNcpGYacSWC9y@WBPI#qy@GWLkO$*G$zXK3U_g=Ebdf$QT=L00v8 zw%g7mV_7enR3g()7*_LM%Lv#$4%%83CW~@ zKT;c#xm2tAwvPGT&d8oXZB5MQZpzsPE!;cjOtppG2RW9OO7c576%{u?Tt4mHKzBGw zT|-uQG+mJNvU`sF=aJ?FA7`bU#|m?Ka{}V^4Q{s^AxB!uxXwApb+Hxpul7=&mn@?R z%oa&`el!=W8923mU#G>i(d;q2_+^c-CG&}Jj}7(#XPp$)s>e$_r~9;zFh_}t61-+K zB3JJ_n9`lK5fEFy)WH{>8$<3}7%Tqh)i`4V>x`T63J30yrBxV`xWez7T^u`rKIRnN zps;9Ly8P`KdIDGGdJ;i=^{gX|~NQ(>y2E=cKTFPHjRk7aoujgIL_p9vq+-Khv~ z(Wf}~{dRb!KqKroC~(JWcux7gV2J9U$ig$H_&5);+tnL#QkT9dPgWI(2MFk(KAaE~ zr9)FEX#3=&g@{K5&-+RP!q9p>?Foc7IYvhrV$K~s)B69~dj}`Unyt~h+O};?&$MmZ zwrv~Jwr$(CZQItgrZtV}{`x)Vz44qgcm9L#W<}Jlh^qBV#LAtyD;FH#+1Vp=gInDv zMl*#%N0H&!0#}zm#1y@xdq)J4*)Zl6QWn-O;gX}Xk!&IVb2)TCmMd!Nx z1SCvnDHK?e44mrTD+8xvFJ>4_`E{o8(nqOgffg79Z^akAB}uk4EXm;^e=*`r*!vKU z9PDgNmd*7}W;QEG53im$2rK-L9JxknK~joKE@QVv4Ox0a$bp|Q-H zYepnX?171YW57gna1wVMW5dmiL5sw1(;q`a{I12V9}}y^%kenvSk>A$z%7JuAZdOL z@u&-cEGl8S*@Uj$>vu9AcA~?2q7%Igao5l5s-Vq!VFQp2wV%$y7=M%45G-s z2zt{Yun+cxI*}zdc8W}ubEI0g`;JglUX&`n=0o-M>PC}u}>{3=oW>LmiGnqIjl7A^onJ~9$q2Rv_ z^{j#E09|yUp3Orpuj#oNW3?pho=pmbQ1Mnnqb<m`a3TL-wboI`P3Eyz{3 z5VOru7od?!+ZtG~hjhduzYSOWlOIKuqgR(j+CdGq_JVG`3VaL`6$4d}8;*l=_I!L~ znCwZyyMNpI5vXTSzW;^^EJs*tI{cNv3Ntd9_QS&8zlXH2FO>|l58C8*(G;S(*VG|`??9_lG2j0@QG4oPan^)6V3S622bcxp;tLsn5f<(C z<-iVo{tY3CHJ?OGBS`ON-iDH`^v+x3W?tdg%9{v> zlIb!geM7e&p*TGlj~btOW2pBgC-j*#wU>Ks25T9r?21y^iX`UB+i7K-;uG@Bkx(cV zX;|AuwDyK@z8DBgmnm{P4~ilGbg4K#5gx1t*_KFNwdasgy>aNI?%ZQrWY?6t+ieh5 zDJP>zP|_)3e`o!1rzPDVon?Cd?DeP!uMTIGmrlBpqW3O`Eb87&$>}i_RRiZ6GW*)z zAv~R|5su(!T_UgHbAwaw2$_vmi`;grgX0AVjnKDcDrlUbV_j3=y7bWHM!P=CuXwu} zD&}p$d_NW*S2154j@Lg0O>%&j+i#sPgCr~OH$?wJmf7#OU_nLk47a49>{YnTKJj*x zJdM>vx?GwCw8V1P-cZicFz;FT?1dn4AgtxdXne19Jz{9VKh$@E$)wZT!OG*9&?YFJ zZ?D)kARVjg&CsG&4=028s>U}gMwW8`_e%UFUT#C|gE1!X6u3M`nKA8Z)Dy}-`( z_4TZ+_Xw!3dEf=Cb{UrwP_ z-X{sY%3$eV?^{wQ>5=O-*y@t~Rk*i)=Qm_)kW3;FGhZ`XZ_s60Ydx|T+>_sBSJw+Q zj>U)G`EVQo)wjmy5ug@X+MM4xn0ne-)0J!#hAF(EQ`;;+L4~4VFhDODprisP!@C+9 zX^0@{#ZAo7GWY4+TBC=rHOb}#+K^>rw!guNvGoyQ(!4%`p~L;Dq3>`aK<&3o%n@HRB7Wb3PzRk#xFZ?@(`Hj6%nwgnm+=U|bsxFCQ-HAUZU4jl0wswVo{akk|n$0j8k_&nwK78y)jR__tNcpPPE3 zB8Wg-A^^bO8vsE4-%Y)lzJsxmqLYKUjp@Jk_MO_2jwGTE-JAv=f?xfjRu5jedIr!g=5WS5 z8l2V1zhs3un@Cq?WG^9KR%|=_=JKqS=B(9uTZ%@XPUG^rTx-!OcUh)xdR!@KaWrG> zM2NwYZ>Fu{x$d}r`fSKPNs-2J!wfP&4y``Mr-|w6;}Ga4GCyTZxtw@>>>f^aOUO!g z(aDJSw>m!c-40z!faY(Vb8)osL!e4bhcbvn&*A1JfxUJ=^^Vs*8_1?jXx_y#= zlE`!hHDRd>M3EiB5XhQzJr8QKLn3Q|VSRs{#$-U|xNCZ5*xMGWzJMWi-IE#E zU54w_>n5HqkFjonZB&?{b+B$`Wl?YpNxCz@z!3}V)^^0NJ6Bv!k0q*WEEvt^JWpN~ zu_IR1)7;wN8614vlqD5?7K;-LNi)EtAhySW`|1Z5kcCMfX2$XqlM(U|%#m~_?HIrS z0vD^~8}6N}UyIk~m;VBi z@^W9ARC~0g+;FQU;HhaiqYFN9d_ng|*V9!=Sy#Q~D_m*}xuTIaNYz!OwCifuS+pl> zlt{xGmydV;`@2lnY^5n|NH8&)@K0E3;$(d~=X@~|cvZ3}sD%gQDD_R9B8)Wwu(|mt z>loNlrlUH%efO^ei{b{&aXlve@0C~WKByh``3)ss%(eWeu9>Yatw6N71|Ubt(qH#Z$|ZSgg9?Zt2gz|OMj+FjYzVHvge$H;Z2WAsCqX(dVHkx zFid>FWvtAnwZn9BLdVN7GIK`a{qSVtt&O)cDU6<2=4g#d2+1`l;*1Hq_wnL{zN%&a z&2IW5)cngw9~=k))7_Nz|8@Nq4(vlq>>dSFA&P zmNbhtb3BIhwkacnpCnH;)k_)h=P5w_BrCFpgwl2bJr%OrBtjvo~j-)-I6PTY&sNM*E(I^_kGq6JG?z> zNg+2Nokqx9^f99Jq5%^@x|o}L&C5j^T;Josb6E^o-o8C?W)&X(cQ$vj^Cg7ypn;dw z(_QWlg}lPPaSLACSSfCZJ%Y~Ov{Nq6k=agrz_q{i<&XBw`L+z0k2v%x>^eSMrZTt< zsfah~9rTDG6q!7Uz$16&m6|?B^lVR@b;t!m6_V@sOJ<431%CM zxVPx&RLvD`m|PVt$wO(H3WhaLW!9>pmgN}3x0DI?P@vLmY_ARHjp0yuyvXqyWtt!z z5UOwX=WA~nPouwC=|&=($brlH4yh#lm0Rsdzy zumJ@jn>u`jGWu$YbkK(J#^%f=TOfPiFOEQ{GJrzu&xUB&pE3Ep2bO47(OG=?+)?;{Y8FI#<%eXydbOfv%!9`5_JkX}JcM>5cm*d(L zFJZ;OK&Z|O2VE`GpOU6l?bI=+x3IHD`zFNLtQ z!Z-}2SxpOQ0x4Nki=4n+g=t!VdT0<^vB3#* zqF)0Qa7KnIY6a`AXU}@{M(wkzeKqpRR!E?ac-99Ou=pXLg!pcQo{YDGL@<))nL!AQ zx_n!pToA3&=cATQF!*A#OA7HpVoV}q)O=%&Eyns=l`Zq(e55Hzz)%tGdT0 zIbFY-zK@cg7i5JIUg+K|tt7N9?16{D2}FwOu8%bmQa1cyy)C;g3DFqPO&B_YIf$@O z&I;32XyAM!AklUbq6bJ|$`8CS$4HO7dJSGnp?2hO5XA4S{PcaqMK$h0^4%k`oR;>0 zMCu_RNPm~X0B-M>hTqTuNG^P><=Un&o9-)T2%f4|qQ^H6ZedI(I-Uw0oj$B(Q5q0Y z2?>S*wanN7xQh_Sb7(-q`YSP*FV;=#-*0S(qcXPNeGW_(Tl+rF6$&pt4J#Ee>CnYef)Db-tcUSJLYlDv? zFK1S>Fa_K@L!GHT#}Lo&y4@e*BTGS81+aTZfT?_)Kj8tmFcnO9_EEhcMR~Kh`DnMo z(K~!kSim<6-wOEsdp*(1?YO_>iov0FGOB4S79`S}a2}?#%XPHzscs;5;&5LTjZ#9I8(AgG7#;YhQ3Z=)!MRrS(9MNZ<;Y);> z6agV~PxcEocQrCYctQu8QVOpU2TYDmFt&(sfM91LvkhL2^*RVqi-=+WvWqUm0Ce>Z z!IFx$g`<gC%6;jEbB}o}b;0KVD8vHh+J*Q1(((ju zfGP;3LFssYPcCOI4|f{}q)Qj$Z?KE$N}v zTzM_&WO`41{+)3Yu3><@jh{R21zOo@xT-F2&=n{_QZ~I{ub1qtaZrsyB;AWz9ELID zqF(_+?4txtbHx%(a~DWIOKFlGTJAD`e#d=#_eGhvWnc*Ufv)%5`GUtjb_{4ypiTF3 zy~PR~10Fan%we`3SG7S_uCF|Ah(`$+&(TJRKa)~yK!+M{ApO;c(AcHtc$gz>Y%^u&8eGpq+WxaehwuzsBfWH7+g97or zI$8OVh?2VJ$zte2F)1Ky8)|_qsIsZ6g!fgfA;LND0xZYsyW6+i!XIns=P|`kq%_+W zb)68a5RJ=(9;Qo@d0IhG1K7k6 z(&#}uWWL7VzgB!-X_H*@x^u8d zp_Vvd;|b^7f=~!k#tuvpY8=Z-X`8S9;2Z05*BGYR4W`ZZ$xo+Oj|Y34$7IAOfV0KT%XCYBnKOvc#|iI^ZIMX_j zd)}~_tw6O@4=apGW6iefjM<4aAys)`@-n1|Ofcm6H#v0i@pSD%artZZ>!sqt zh;kO4fH8zJMGPOpZ(3tPLUX-G%yjCya;~7~bW3wI-)F-$XR_sA7EuWXpD2G7A96D_ zG^kiueYyYMLhE2lAhMPp|LyiNXp`+)oh#)V%k$?UDGwbjkKz>|W#CrSm1;QD|KR7j zDVqFnP{`cU5VE{QAXtg)S`R6jln%8}asQAeYo~HPN?T5>e>HNZk7YsJ@*+RxeJ>z! zX(-j>R?bRRrWN9pperzCCBQzT2#H~-3IgG{R54ICU2IpM`gRO7-|m9~XsJn%hsRTT zs!p$c0gAwFEM0|72?&k9{Q5k`v+|~t_S+RXYnG^}u;%1o+Kb=Q{avQk16q|51lhFX zcUUAYNnSTX=17ll`>pbbt*b)D7lFmxR0k3~4p(?Bebis&hmXjOcG#V+=fHI6ZbjXT z8k@t*QV(eix|m6BMzSqxL8iE(33nt%W39aBR+~7Jv`jx>?a}}^>!=Q*nL*CX(&SzD571JT>AZJpT*(U-m{X&iz*vxPOVo@?ppW)T$&}ZM?WFH zQKW-EKFAPSZWUm3T`~5{!%;KJ1y0#c{YIjDpek#Fmx$nMvS!# zqsKa90vaekHv^+>I}^{{a1XR8yWzXBw_+z?D^EGssOX$fmfIEM^jeUwV|XheWiYkC zL~N8LvQ29%cz1hs44VrphNm-8^a2xxeS7;`da~QaF6i>db{!n9Wgcc~xD9JPABGRA z1gWuKyJo6eWTrX;7!9j~5e)D8v=cXsH3uXx{=wwoBzFD29|4#dCqH+ebBARf%$SAm zif53F&zr1POSP_cPs<$RU}Ul*MggJaF$pDIDOM_TRBR%gf_i?s^D#dYiVTPu^|oxYn4!XB@CvgOWLDNEV5~$MVf<4V7lH1q;wH7w zw2g6|yQ*nKXOa1Ufqv&nP358&0^=41Y1&i68l3c~ z?(Oj2WoPymA!{br$7!75Zr6ogG{7}AT}YL-CGdpekKV?c3rmU9CaIWOEqdrKOh;+Z z^?k}onf`{1a+uoFVhpX`5y_-D%m$OnJQ)o9{G^HVb8ua~1P zp@@db2qt)0sQY&l1g_58_{=hq2cTKI23~=%gy}-Mz09RwxEGQiCt->S8anlt*9Q2(5n`=2p^`vd<2tZF(6FR73DiqZ{3z|H&Pjs(>PWUlblt&2OfT zW>(n8U-u35$^!RPNdbu|5t>43E@5(X#iTM)mNxnuQytO3_Xb=-|IC0DqOZ)m6kUhL zxUX^T{Vd^8@_N4-zenHH&N^{Gp}id3!>?H;hk#7Z?|((TkttRb#<*3)aTh?&g;E}y zCgN*iTB6a!^4Z`wb)q`?paIO@?14mc%AeRp%^N}Ws|vLI7Lp#sIsTc6p2TnqsXI8z zj4$!=(!pyr(?Xmvy6IZs%v?{dT0oPv%zU2dDv|~C{Ndz+5v_EgjnHjaZgWbcB=Ac= zHle~Un(J;cR5j^mpMhIn0x1IwVOK$ZHivDb(wOaDDvE|s;^SnVHbwO7=`hkV&aCl% zO{%AYc8GBaBD12)H@1rXX%c7s{@vwcp@+LqQ(WF}fWRnkQ~@bohB(16(0GhMU-tKf zkMRa+t+^2@Jhszu^npe=SY`t@=ZRs914z8r%10va#RHh)930%lf7Re>3)pZocVbiXqyh z0UpR}G5g*6xZcUD56*kPdX-=FdTOPFZ%A;4sM+UjT)W*2DUpfIe zsqq|Y_q$&tPTUsymPf+&N+D%8o5G=lWy};8`e5wf1jHpONRmlUl2*n$Q`znBN3=uq z+a4CX;7s}W_!OO~r$4yj&{1fX4a$mLyMtWfl=9SLOe=g5HA9k!Fz`qId~_M7`ZWlr zetx~FZy~tTw=(k05W>%x`RdDOGHr1F%`w*Q3NqEfKFJo4+}Sp<*?D*O6jpS@o46c| zNRr;)Leb$4v*9nPz!6EZNf1{Ij2`B0$h!mLJVrVuAc`m#TkYjA#N*CYNKeDjYQW$Z z{L(rtWUDnv@D+|l<|*ab^yYOiOK2ykFax6o9T0@w(K%U)*Xz&L%ZB|XbaLR!%O*R~ zF$$)^HbEPw)krSRp3+?g;>G8pLd2fg$*|19NA{{9C?H;AxX<9_h2!gn*=ij6r$wY< zlV$GZHLAt}%%p>&yQL&|Awi~7A{#HE41YOjx-RO9_gqlsJIIr;Q|7G(E3P=<8)-C2 zNN=fNw#TsSRA7`!B!yI*okaJsOludklG!DtW9YP7HV1>e`r$rIjcbfB>2;l_nU*wq zMOBeX@`mLn$udScaxOn@Y14Qn4pNfF}T6Ivar6CyN~3K30Ju7KC?zWyo?p%J+} zb1%WFZg#Plz@DNIC3oi?;V=JoI`i1NQO&P9of*Vs9=DG2vbOeBKdJ=2u?cu>BJx`P zNd~FjocZo0Gl(3l!G1evWy0&hAP41!|A;bu6Q>hG&mTKqGFuesJ~khGT5v>q9Uneh z%+AEkqYx~!jy)f&d?HpfwK7jK&@l(r<{62_R6jpM4&i+-;l zf_=@4@o=147;JYI4f3PvQ)get7%7x=5r}S~ac99GLeQ4a*~1d#^wtl@PT68HL`QSE zJfcaQ-QUp-1W`QhS+Fhc5+#VcFBA1%x7WBl)#MakU9#{kv@2BzG8f3)P1t0wd;_BO zcNgY@ahV4C_Ofg((j|1eV{)rae$HN1bNMk;kuLY144L?*02r~?eky@NPvC)PWx{DN zy#?kl#AWq}2ve2O&?1ymBT-KI>}{3`Sbr$Ip+%z4e@ssD1YNC0OC!wm2^>yspp$vYTPx|wPN-d z+LT0u)5?Xwy_QH8RAJtm6(d2B>z|2U0|QP`YV#P{ZgZizU0_B*csmA7C%;hd1M+Q-;Z_W%ii%EP$rB zGOVj}!zqj6s&JoLA$!&}`4(-t9E4%FQKetX|?FJo>;+;qaBPgJ{#&o4Ff_@?Ts;z>p2{ z0GuN1lafw+WH0HKa_+cz8sGJ6N^n-2s`bYu^&@HAk%zjaadACI=!U;!wJnX$rb8gS zg$6LccG{RW8z8bv|JqLE3W|BVt?W|GTrn0zp=sKyDcIj56LFSg_o3zGFm@L!X3G(x zR_~gPO~z6MGo5n}KwiaN%}CmA-%ud~r{wK_!qwfUS4P=v4hBvS|GuZ@bQ3dUKYobF zJ}ye87Tk`9EyZCh%exXibOrXt*mzJM=$lkA7Hn}Y8E8g%KNLp+(ANlE+s0use!IV-vKAZU(R8#VB67wmkT?v!(4_=V7{X zeU`?5vhradcKj>S+nd3`>BM~H7n}GTDzgPsXuYrMWa{*X3^_17&F9--_}%K|R9w_s z*>#OSANRUm{kjo?6DV)GG+ZnY{0Eyj3qK~W#{D23RM3}9LPAI(s}*jlogRgPE1LX8 z?{~))fh+=BydOD(e@ZQDgsjjR!_ixqAM;0zt6QcNGs-T$##mh1U-mN~sx1}}>_)AA zF_~ez-kFA<@(?4S#1>_m1$g>HLoV=3iAz1i6+n+Cy%;mR=vR++@dl4p0ku@f`}*&FnJ z1t&1lRG8bJ0vSkrM%(t)zU47N`(^K&!4nkuegPn-_|RhHv7FdYEvGEKzMJXf*?nDp zD`%eI;RuZ(d6|wmltCll@_9ccdxBz(oL;9sI!!N@JSazOk_s7Xsja{<-dS zYUloKk~NtO*dKP6Vq@SP+|yvt4nnVGkUV5il%$3a*Z`N0#n}ovpK}JH0S-_&Rc(4Qyhf}-X(tK z*uDn_0FVHXKt{HPat^k3j2V zd3!dfh#aUp8XI;50-Phk5wbiGnJ5naI5%1jGxnmX>3&Goltq}7Q~k?ve9*AWOu1bH zYm@`LY6#8tzAS^|@b&UO*8NgAZ5^8m_d`Hk4i*5Kl!>|ePzL{ZSYBCMg8kC6`7Bjn zMCzhkoo8&dFyHFEWAqvVLa!Wre>p_-R@-kEn+zAqc(2W4(K7xhDp&+8ORm>s{X7;| zZ%ma}(te#<4IN`gmtWIl%EcMla!oGMkp8KCfIx9hBr z%39m2Z4f8KbqYyk$HbG6B&N;nU*^wtF0Q%GP^Lr6Av`l-f#U;qH(f2y*+o!$S_EtPL zB#IuC0OiKr@^q3Zzuq%8%jC=HXZ{w82K~>27qrtO1v^ZO?yc_*{M4|VKwNBcV5k&F zK(iG{GcH%Y{4i70J}zJoiv1LdSC z{y5eT^Ko+^5aI!b6hkYMezs9|G2&tY2j8+B$@RYr#giqVo85TvQS_D*&!p0^d>SM* zgIqNdsl4?vjNrE!qknnfwjGJo8{cCruk~nXF*eT+b|UA+v)^>-mn(ZKSdAgZX@I^K|L z%|ymWb;Dj!-{DP-8ooGz+9UzFzAzB2?a|X;AXS-2EgR*kiasUxU4aH*Nx3-Jr!R(n zAD;&SziyagAP!`>a7WzV>UPEt^g9xsMtHG{uh4P=X*U;I~$=3S+P2hhfaOZ-w ztv?+m#La8GH^e+=b8abSFQu8ws(u*lQ#GnNxb=bxYyFRon$g*ddMsP-iI1myahxgM z^Ko|hqO@K58*oUrM3gv2pU^&=4wsVNIq*ANRsRJ{CZz!PpT7{hD2d7#A}vNl?C=8S zG1&v;65^ND5Pq<%@Hqzw;7J| zxEf=TQI706YaD#zyMy;e%a?%GGWY1dboXH7I=wwv-WsbKt<7`&KEmBe)S6%B&F;!a zfzdcv{u{Z6aqnS+Z0B=C|E-5Wz~4SiN&k=67+6-2b^NC$>O%k9PyC;O|DR8qg0?nJ z#x_p6O73>Xj@tjDmvWN-4M5T9HU|C#?0happWbKxQ6@f>Ti3zZ%8{1lf8PHT1Oagr z3<3oJoIY#*%%b%l<^6NT``_T-2DY}Af2$Q-N6(1!vsS@R-#6_45Cs5gKO6BW{O^ig zZ5=HC58|(l=>CPZ3`zt5++hI$F#n4~{TYe;e;eUwW^C-_Nc*qLzdYyv>`EafiTN!( z0MOw7C&ifduM~#A^$8?(dY_8tlk)N>B~t&d6vn?%lC}A@IX;IK4EEny$^PloMb2L- zOn;-aA#Xfpf5r`v8UK@_S@>59^WP|6I-WJzKZiAZ>rV=8>t87>f1|8Cuzr2P0087~ z|D~@|B3lCBH%w5Cc?jC{;IuyhKl$HV?gsS%%6cH{%pseo~Qo+lvw@+_{R_R zPtiZ^+y4=z68N|1pVsbw68`&{?jLyoz|{~4@P9qw{VD$6`{@4^7clt`@&Dab|0(_7 l>-c|411$bS`kz%@P7>_%<^}+ueZG7@x9*` Date: Mon, 7 Oct 2024 13:48:36 +0200 Subject: [PATCH 36/83] Updated dataset1 for download tests --- .../sftp_handle/datatest1/SAMPLE2_R1.fastq.gz | Bin 0 -> 234 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/data/sftp_handle/datatest1/SAMPLE2_R1.fastq.gz diff --git a/tests/data/sftp_handle/datatest1/SAMPLE2_R1.fastq.gz b/tests/data/sftp_handle/datatest1/SAMPLE2_R1.fastq.gz new file mode 100644 index 0000000000000000000000000000000000000000..ce87295c6d164aa20fc01b934ebb37b5de8e0389 GIT binary patch literal 234 zcmVWRVCDkkvwYW&Q9#>eR)goeGIv(U_bIT&lj0bL*%RitmD&f zT^V)|eJb2$?&+2=;hB~J*UTaeM{o(R(8zF@Bx$+D!2$t?lQYFQ(rXe7kd?=j^@Rw= z!a70l6$la-?_z8_w&gF!)b76sJ;uBf+8sSYMrs8K&?7r$-{z~VZiS|mI@BwWgFnNC kOz67GqRWJhT2!~Pv}UadIE?NJ*KfCd041f!sxATm08+_n3jhEB literal 0 HcmV?d00001 From 23f74639317a400e232363a9bc3abe97a29a00cf Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 14:06:25 +0200 Subject: [PATCH 37/83] Updated CHANGELOG.md --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31e52f8f..113748e3 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,10 +27,17 @@ Code contributions to the release: #### Fixes +- Fixed wrong city name in relecov_tools/conf/laboratory_address.json [#320](https://github.com/BU-ISCIII/relecov-tools/pull/320) + #### Changed - Renamed and refactored "bioinfo_lab_heading" for "alt_header_equivalences" in configuration.json [#314](https://github.com/BU-ISCIII/relecov-tools/pull/314) - Included a few schema fields that were missing or outdated, related to bioinformatics results [#314](https://github.com/BU-ISCIII/relecov-tools/pull/314) +- Updated metadata excel template, moved to relecov_tools/assets [#320](https://github.com/BU-ISCIII/relecov-tools/pull/320) +- Now python lint only triggers when PR includes python files [#320](https://github.com/BU-ISCIII/relecov-tools/pull/320) +- Moved concurrency to whole workflow instead of each step in test_sftp-handle.yml [#320](https://github.com/BU-ISCIII/relecov-tools/pull/320) +- Updated test_sftp-handle.yml testing datasets [#320](https://github.com/BU-ISCIII/relecov-tools/pull/320) + #### Removed From 8eb3650226a448e7a4e7f0cbb4d9a0baa9e33bb8 Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 16:36:52 +0200 Subject: [PATCH 38/83] Now single logs summaries are also created for each folder --- relecov_tools/download_manager.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/relecov_tools/download_manager.py b/relecov_tools/download_manager.py index 89f4c8a5..37eac56e 100755 --- a/relecov_tools/download_manager.py +++ b/relecov_tools/download_manager.py @@ -1212,8 +1212,19 @@ def download(self, target_folders): ) if self.logsum.logs.get(self.current_folder): self.logsum.logs[self.current_folder].update({"path": local_folder}) + try: + folder_basename = os.path.basename(local_folder.rstrip("/")) + log_name = folder_basename + "_download_log_summary.json" + self.logsum.create_error_summary( + filepath=os.path.join(local_folder, log_name), + logs={ + self.current_folder: self.logsum.logs[self.current_folder] + }, + ) + except Exception as e: + log.error("Could not create logsum for %s: %s" % (folder, str(e))) stderr.print(f"[green]Finished processing {folder}") - self.finished_folders[folder] = clean_fetchlist + self.finished_folders[folder] = list(files_md5_dict.keys()) return def include_new_key(self, sample=None): From 134e6218fbacb27e1c5f1532b5e26c9d544d35c9 Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 16:38:55 +0200 Subject: [PATCH 39/83] Fixed wrong single-paired layout detection in metadata --- relecov_tools/download_manager.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/relecov_tools/download_manager.py b/relecov_tools/download_manager.py index 37eac56e..3fab55f6 100755 --- a/relecov_tools/download_manager.py +++ b/relecov_tools/download_manager.py @@ -389,23 +389,22 @@ def get_sample_fastq_file_names(self, local_folder, meta_f_path): except ValueError as e: stderr.print("[red]Unable to convert to string. ", e) continue - if s_name not in sample_file_dict: - sample_file_dict[s_name] = {} - else: + if s_name in sample_file_dict: log_text = f"Found duplicated sample name: {s_name}. Skipped." stderr.print(log_text) self.include_warning(log_text, sample=s_name) continue - if row[index_layout] == "paired" and row[index_fastq_r2] is None: + if row[index_layout] == "Paired" and row[index_fastq_r2] is None: error_text = "Sample %s is paired-end, but no R2 given" self.include_error(error_text % str(row[index_sampleID]), s_name) row_complete = False - if row[index_layout] == "single" and row[index_fastq_r2] is not None: + if row[index_layout] == "Single" and row[index_fastq_r2] is not None: error_text = "Sample %s is single-end, but R1&R2 given" self.include_error(error_text % str(row[index_sampleID]), s_name) row_complete = False if row_complete: if row[index_fastq_r1] is not None: + sample_file_dict[s_name] = {} # TODO: move these keys to configuration.json sample_file_dict[s_name]["sequence_file_R1_fastq"] = row[ index_fastq_r1 @@ -418,7 +417,6 @@ def get_sample_fastq_file_names(self, local_folder, meta_f_path): log_text = "Fastq_R1 not defined in Metadata for sample %s" stderr.print(f"[red]{str(log_text % s_name)}") self.include_error(entry=str(log_text % s_name), sample=s_name) - del sample_file_dict[s_name] else: self.include_warning(entry=f"Row {counter} skipped. No sample ID given") # Remove duplicated files From 5f5ef8adec6021cb046bbe447bf2f4301ae821ce Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 16:40:46 +0200 Subject: [PATCH 40/83] More accurate cleaning process --- relecov_tools/download_manager.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/relecov_tools/download_manager.py b/relecov_tools/download_manager.py index 3fab55f6..bf879121 100755 --- a/relecov_tools/download_manager.py +++ b/relecov_tools/download_manager.py @@ -571,12 +571,10 @@ def delete_remote_files(self, remote_folder, files=None, skip_seqs=False): files_to_remove = self.relecov_sftp.get_file_list(remote_folder) else: files_to_remove = files - if any(file.endswith(tuple(self.allowed_file_ext)) for file in files_to_remove): - if skip_seqs is True: - log_text = f"Folder {remote_folder} has sequencing files. Not removed." - log.warning(log_text) - return for file in files_to_remove: + if skip_seqs is True: + if file.endswith(tuple(self.allowed_file_ext)): + continue try: self.relecov_sftp.remove_file( os.path.join(remote_folder, os.path.basename(file)) @@ -590,6 +588,9 @@ def delete_remote_files(self, remote_folder, files=None, skip_seqs=False): def rename_remote_folder(self, remote_folder): if "tmp_processing" in remote_folder: new_name = remote_folder.replace("tmp_processing", "invalid_samples") + if new_name == remote_folder: + log.warning("Remote folder %s was already renamed", remote_folder) + return try: self.relecov_sftp.rename_file(remote_folder, new_name) if self.finished_folders.get(remote_folder): @@ -1266,6 +1267,9 @@ def execute_process(self): # If download_option is "download_clean", remove # sftp folder content after download is finished if self.download_option == "download_clean": + for folder in processed_folders: + self.delete_remote_files(folder, skip_seqs=True) + self.clean_remote_folder(folder) folders_to_clean = copy.deepcopy(self.finished_folders) for folder, downloaded_files in folders_to_clean.items(): self.delete_remote_files(folder, files=downloaded_files) From c0ce8d931d29afca578947b336402dc6677f720c Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 16:41:40 +0200 Subject: [PATCH 41/83] Now skips invalid_samples remote folders --- relecov_tools/download_manager.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/relecov_tools/download_manager.py b/relecov_tools/download_manager.py index bf879121..8f903bdd 100755 --- a/relecov_tools/download_manager.py +++ b/relecov_tools/download_manager.py @@ -863,6 +863,9 @@ def pre_validate_folder(folder, folder_files): log.info("Setting %s remote folders...", str(len(target_folders.keys()))) stderr.print(f"[blue]Setting {len(target_folders.keys())} remote folders...") for folder in sorted(target_folders.keys()): + if "invalid_samples" in folder: + log.warning("Skipped invalid_samples folder %s", folder) + continue self.current_folder = folder # Include the folder in the final process log summary self.include_new_key() From cb4bc9df4674f45aa85fc229d033f6523cbcd5f6 Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 16:42:41 +0200 Subject: [PATCH 42/83] Hotfix for wrong dict processing --- relecov_tools/download_manager.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/relecov_tools/download_manager.py b/relecov_tools/download_manager.py index 8f903bdd..3c612791 100755 --- a/relecov_tools/download_manager.py +++ b/relecov_tools/download_manager.py @@ -1160,14 +1160,14 @@ def download(self, target_folders): stderr.print(f"[red]{error_text}") self.include_warning(error_text) - clean_fetchlist = [ + seqs_fetchlist = [ fi for fi in fetched_files if fi.endswith(tuple(self.allowed_file_ext)) ] - clean_fetchlist = [fi for fi in clean_fetchlist if fi not in corrupted] + seqs_fetchlist = [fi for fi in seqs_fetchlist if fi not in corrupted] # Checking for uncompressed files files_to_compress = [ fi - for fi in clean_fetchlist + for fi in seqs_fetchlist if not fi.endswith(".gz") and not fi.endswith(".bam") ] if files_to_compress: @@ -1175,8 +1175,10 @@ def download(self, target_folders): log.info("Found %s uncompressed files, compressing...", comp_files) stderr.print(f"Found {comp_files} uncompressed files, compressing...") clean_fetchlist = self.compress_and_update( - clean_fetchlist, files_to_compress, local_folder + seqs_fetchlist, files_to_compress, local_folder ) + else: + clean_fetchlist = seqs_fetchlist clean_pathlist = [os.path.join(local_folder, fi) for fi in clean_fetchlist] not_md5sum = [] if remote_md5sum: @@ -1205,7 +1207,9 @@ def download(self, target_folders): full_f_path = os.path.join(local_folder, file) if not relecov_tools.utils.check_gzip_integrity(full_f_path): corrupted.append(file) - files_md5_dict.pop(file, None) + files_md5_dict = { + x: y for x, y in files_md5_dict.items() if x not in corrupted + } processed_filedict = self.process_filedict( valid_filedict, clean_fetchlist, corrupted=corrupted, md5miss=not_md5sum ) From 1b353be1c655758847a1befdca5de454626c0876 Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 16:43:23 +0200 Subject: [PATCH 43/83] Removed first sleep time for reconnection decorator --- relecov_tools/sftp_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/relecov_tools/sftp_client.py b/relecov_tools/sftp_client.py index 0effba50..46a30c30 100644 --- a/relecov_tools/sftp_client.py +++ b/relecov_tools/sftp_client.py @@ -62,7 +62,7 @@ def __init__(self, conf_file=None, username=None, password=None): def reconnect_if_fail(n_times, sleep_time): def decorator(func): def retrier(self, *args, **kwargs): - more_sleep_time = sleep_time + more_sleep_time = 0 retries = 0 while retries < n_times: try: From 4925f3ccbbdab63eaebf77fe8465e540a24b67c8 Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 16:46:05 +0200 Subject: [PATCH 44/83] Introduced handling for missing/dup files --- relecov_tools/pipeline_manager.py | 58 ++++++++++++++++++------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/relecov_tools/pipeline_manager.py b/relecov_tools/pipeline_manager.py index b7653289..ad9b687b 100644 --- a/relecov_tools/pipeline_manager.py +++ b/relecov_tools/pipeline_manager.py @@ -5,11 +5,12 @@ import re import shutil import sys +import copy from collections import Counter import rich.console - import relecov_tools.utils +from relecov_tools.log_summary import LogSum log = logging.getLogger(__name__) stderr = rich.console.Console( @@ -209,18 +210,8 @@ def get_latest_lab_folder(self): item["r2_fastq_filepath"], item["sequence_file_R2_fastq"] ) samples_data.append(sample) - date_and_time = datetime.datetime.today().strftime("%Y%m%d%-H%M%S") - with open( - os.path.join( - self.output_folder, - self.doc_folder, - f"{date_and_time}_validate_batch.json", - ), - "w", - ) as fo: - json.dump(join_validate, fo, indent=4, ensure_ascii=False) - - return samples_data + + return samples_data, join_validate def pipeline_exc(self): """Prepare folder for analysis in HPC @@ -239,7 +230,7 @@ def pipeline_exc(self): # create the 00_reads folder os.makedirs(self.linked_sample_folder, exist_ok=True) # collect json with all validated samples - samples_data = self.join_valid_items() + samples_data, join_validate = self.join_valid_items() # Check for possible duplicates # Extract the sequencing_sample_id from the list of dictionaries @@ -258,13 +249,9 @@ def pipeline_exc(self): ) sys.exit() - # print samples_id file - with open(os.path.join(self.analysis_folder, "samples_id.txt"), "w") as f: - for sample_id in sample_ids: - f.write(f"{sample_id}\n") - # iterate over the sample_data to copy the fastq files in the output folder file_errors = [] + samp_errors = [] copied_samples = 0 if len(samples_data) == 0: stderr.print("[yellow] No samples were found. Deleting analysis folder") @@ -293,6 +280,9 @@ def pipeline_exc(self): except FileNotFoundError as e: log.error("File not found %s", e) file_errors.append(sample["r1_fastq_filepath"]) + if "r2_fastq_filepath" in sample: + file_errors.append(sample["r2_fastq_filepath"]) + samp_errors.append(sample["sequencing_sample_id"]) continue copied_samples += 1 # check if there is a r2 file @@ -316,21 +306,39 @@ def pipeline_exc(self): except FileNotFoundError as e: log.error("File not found %s", e) file_errors.append(sample["r2_fastq_filepath"]) + samp_errors.append(sample["sequencing_sample_id"]) continue - if len(file_errors) > 0: + if len(samp_errors) > 0: stderr.print( - "[red] Files do not found. Unable to copy", - "[red] " + str(len(file_errors)), - "[red]sample files", + "[red]Some files were not found. Unable to copy files from", + "[red]" + str(len(samp_errors)) + " samples", ) msg = "Do you want to delete analysis folder? Y/N" confirmation = relecov_tools.utils.prompt_yn_question(msg) if confirmation: shutil.rmtree(self.output_folder) sys.exit(1) + + final_valid_samples = [ + x for x in join_validate if x.get("sequencing_sample_id") not in samp_errors + ] + sample_ids = [i for i in sample_ids if i not in samp_errors] + # print samples_id file + stderr.print(f"[blue]Generating sample_id.txt file in {self.analysis_folder}") + with open(os.path.join(self.analysis_folder, "samples_id.txt"), "w") as f: + for sample_id in sample_ids: + f.write(f"{sample_id}\n") + + date_and_time = datetime.datetime.today().strftime("%Y%m%d%-H%M%S") + json_filename = os.path.join( + self.output_folder, + self.doc_folder, + f"{date_and_time}_validate_batch.json", + ) + relecov_tools.utils.write_json_fo_file(final_valid_samples, json_filename) stderr.print("[green] Samples copied: ", copied_samples) - log.info("[blue] Pipeline launched successfully") - stderr.print("[blue] Pipeline launched successfully") + log.info("[blue]Successfully created pipeline folder. Ready to launch ") + stderr.print("[blue]Successfully created pipeline folder. Ready to launch") return From ff6017cdc733830d683d291c2fde9cab071fd2d2 Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 16:47:32 +0200 Subject: [PATCH 45/83] Introduced handling for missing/dup files. Linting --- relecov_tools/pipeline_manager.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/relecov_tools/pipeline_manager.py b/relecov_tools/pipeline_manager.py index ad9b687b..318b037d 100644 --- a/relecov_tools/pipeline_manager.py +++ b/relecov_tools/pipeline_manager.py @@ -5,12 +5,10 @@ import re import shutil import sys -import copy from collections import Counter import rich.console import relecov_tools.utils -from relecov_tools.log_summary import LogSum log = logging.getLogger(__name__) stderr = rich.console.Console( From 3dd5fd7d7170cc46d558c87ef3d7bce0eb236be9 Mon Sep 17 00:00:00 2001 From: Shettland Date: Mon, 7 Oct 2024 16:57:13 +0200 Subject: [PATCH 46/83] Updated CHANGELOG.md --- CHANGELOG.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 113748e3..d71fb328 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.2.0] - 2024-09-XX : https://github.com/BU-ISCIII/relecov-tools/releases/tag/1.2.0 +## [1.2.0] - 2024-09-0X : https://github.com/BU-ISCIII/relecov-tools/releases/tag/1.2.0 ### Credits @@ -16,6 +16,8 @@ Code contributions to the release: ### Modules +- Included wrapper module to launch download, read-lab-metadata and validate processes sequentially + #### Added enhancements - Now also check for gzip file integrity after download. Moved cleaning process to end of workflow [#313](https://github.com/BU-ISCIII/relecov-tools/pull/313) @@ -24,10 +26,14 @@ Code contributions to the release: - samples_data json file is no longer mandatory as input in read-lab-metadata [#314](https://github.com/BU-ISCIII/relecov-tools/pull/314) - Included handling of alternative column names to support two distinct headers using the same schema in read-lab-metadata [#314](https://github.com/BU-ISCIII/relecov-tools/pull/314) - Included a new hospital (Hospital Universitario Araba) to laboratory_address.json [#315](https://github.com/BU-ISCIII/relecov-tools/pull/315) +- More accurate cleaning process, skipping only sequencing files instead of whole folder [#321](https://github.com/BU-ISCIII/relecov-tools/pull/321) +- Now single logs summaries are also created for each folder during download [#321](https://github.com/BU-ISCIII/relecov-tools/pull/321) +- Introduced handling for missing/dup files and more accurate information in prompt for pipeline_manager [#321](https://github.com/BU-ISCIII/relecov-tools/pull/321) #### Fixes - Fixed wrong city name in relecov_tools/conf/laboratory_address.json [#320](https://github.com/BU-ISCIII/relecov-tools/pull/320) +- Fixed wrong single-paired layout detection in metadata due to Capital letters [#321](https://github.com/BU-ISCIII/relecov-tools/pull/321) #### Changed @@ -37,12 +43,13 @@ Code contributions to the release: - Now python lint only triggers when PR includes python files [#320](https://github.com/BU-ISCIII/relecov-tools/pull/320) - Moved concurrency to whole workflow instead of each step in test_sftp-handle.yml [#320](https://github.com/BU-ISCIII/relecov-tools/pull/320) - Updated test_sftp-handle.yml testing datasets [#320](https://github.com/BU-ISCIII/relecov-tools/pull/320) - +- Now download skips folders containing "invalid_samples" in its name [#321](https://github.com/BU-ISCIII/relecov-tools/pull/321) #### Removed - Removed duplicated tests with pushes after PR was merged in test_sftp-handle [#312](https://github.com/BU-ISCIII/relecov-tools/pull/312) - Deleted deprecated auto-release in pypi_publish as it does not work with tag pushes anymore [#312](https://github.com/BU-ISCIII/relecov-tools/pull/312) +- Removed first sleep time for reconnection decorator in sftp_client.py, sleep time now increases in the second attempt [#321](https://github.com/BU-ISCIII/relecov-tools/pull/321) ### Requirements From 0b75ff2120c1d9ead3ad8575c7ed17a4332aff23 Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 12:02:25 +0200 Subject: [PATCH 47/83] New method to adjust excel sheet size --- relecov_tools/utils.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/relecov_tools/utils.py b/relecov_tools/utils.py index 90af3d5f..cefd80a4 100755 --- a/relecov_tools/utils.py +++ b/relecov_tools/utils.py @@ -19,6 +19,9 @@ from rich.console import Console from datetime import datetime from tabulate import tabulate +import openpyxl.utils +import openpyxl.styles + log = logging.getLogger(__name__) @@ -488,3 +491,26 @@ def prompt_create_outdir( sys.exit(1) return global_path + +def adjust_sheet_size(sheet, wrap_text=True, col_width=30): + """Adjust column width and row heights depending on the max number of + characters in each one. + + Args: + sheet (openpyxl.worksheet): active openpyxl worksheet object + wrap_text (bool): Wether to use excel wrap_text function for each cell. Defaults to True + col_width (int): Minimum columns width value. Also used to define maximum + number of characters in each cell when wrap_text is True. Defaults to 30. + """ + dims = {} + for _, row in enumerate(sheet.iter_rows(min_row=2, max_row=sheet.max_row), start=2): + for cell in row: + if wrap_text: + cell.alignment = openpyxl.styles.Alignment(wrapText=True) + if cell.value is not None: + max_length = max((dims.get(cell.column, 0), len(str(cell.value)))) + dims[cell.column] = max_length / col_width + for col_num, value in dims.items(): + if value < col_width: + value = col_width + sheet.column_dimensions[openpyxl.utils.get_column_letter(col_num)].width = value From 5bea30b3ad6c840d330e6bd9c6546fea0d2ae135 Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 12:02:51 +0200 Subject: [PATCH 48/83] New method to adjust excel sheet size. Linting --- relecov_tools/utils.py | 1 + 1 file changed, 1 insertion(+) diff --git a/relecov_tools/utils.py b/relecov_tools/utils.py index cefd80a4..c3a1d5ad 100755 --- a/relecov_tools/utils.py +++ b/relecov_tools/utils.py @@ -492,6 +492,7 @@ def prompt_create_outdir( return global_path + def adjust_sheet_size(sheet, wrap_text=True, col_width=30): """Adjust column width and row heights depending on the max number of characters in each one. From 117689b81b065e54dfd4d2d4644b9a3ac7b29e56 Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 12:09:02 +0200 Subject: [PATCH 49/83] Included excel resize and handled exceptions in create_summary --- relecov_tools/log_summary.py | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/relecov_tools/log_summary.py b/relecov_tools/log_summary.py index 926b7900..4ca2001e 100755 --- a/relecov_tools/log_summary.py +++ b/relecov_tools/log_summary.py @@ -10,6 +10,7 @@ from datetime import datetime from collections import OrderedDict from relecov_tools.utils import rich_force_colors +import relecov_tools.utils log = logging.getLogger(__name__) @@ -191,13 +192,14 @@ def translate_fields(samples_logs): main_worksheet.append(error_row) warning_row = [sample, str(logs["valid"]), "; ".join(logs["warnings"])] warnings_sheet.append(warning_row) - excel_outpath = os.path.join(self.output_location, excel_filename) + relecov_tools.utils.adjust_sheet_size(main_worksheet) + relecov_tools.utils.adjust_sheet_size(warnings_sheet) workbook.save(excel_outpath) stderr.print(f"[green]Successfully created logs excel in {excel_outpath}") return def create_error_summary( - self, called_module=None, filename=None, logs=None, to_excel=False + self, called_module=None, filepath=None, logs=None, to_excel=False ): """Dump the log summary dictionary into a file with json format. If any of the 'errors' key is not empty, the parent key value 'valid' is set to false. @@ -223,15 +225,27 @@ def create_error_summary( ][0] except IndexError: called_module = "" - if not filename: + if not filepath: date = datetime.today().strftime("%Y%m%d%-H%M%S") filename = "_".join([date, called_module, "log_summary.json"]) - summary_path = os.path.join(self.output_location, filename) - with open(summary_path, "w", encoding="utf-8") as f: - f.write( - json.dumps(final_logs, indent=4, sort_keys=False, ensure_ascii=False) - ) - stderr.print(f"Process log summary saved in {summary_path}") - if to_excel is True: - self.create_logs_excel(final_logs, called_module) + os.makedirs(self.output_location, exist_ok=True) + filepath = os.path.join(self.output_location, filename) + else: + os.makedirs(os.path.dirname(filepath), exist_ok=True) + with open(filepath, "w", encoding="utf-8") as f: + try: + f.write( + json.dumps( + final_logs, indent=4, sort_keys=False, ensure_ascii=False + ) + ) + stderr.print(f"Process log summary saved in {filepath}") + if to_excel is True: + self.create_logs_excel( + final_logs, filepath.replace("log_summary", "report") + ) + except Exception as e: + stderr.print(f"[red]Error parsing logs to json format: {e}") + log.error("Error parsing logs to json format: %s", str(e)) + f.write(str(final_logs)) return From 1bf4f21d33fa29dd0e1c3893bddafed5ee092d7c Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 12:10:02 +0200 Subject: [PATCH 50/83] Handling non-existing output_location --- relecov_tools/log_summary.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/relecov_tools/log_summary.py b/relecov_tools/log_summary.py index 4ca2001e..dbb7af19 100755 --- a/relecov_tools/log_summary.py +++ b/relecov_tools/log_summary.py @@ -29,10 +29,12 @@ def __init__( unique_key: str = None, path: str = None, ): - if not os.path.exists(str(output_location)): - raise FileNotFoundError(f"Output folder {output_location} does not exist") - else: - self.output_location = output_location + if not os.path.isdir(str(output_location)): + try: + os.makedirs(output_location, exist_ok=True) + except IOError: + raise IOError(f"Logs output folder {output_location} does not exist") + self.output_location = output_location # if unique_key is given, all entries will be saved inside that key by default if unique_key: self.unique_key = unique_key From 8aff8675f1b0bbb0de12e44c784cd25083a194e9 Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 12:12:07 +0200 Subject: [PATCH 51/83] Error handling in merge_logs() and create_logs_excel() methods --- relecov_tools/log_summary.py | 68 +++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 21 deletions(-) diff --git a/relecov_tools/log_summary.py b/relecov_tools/log_summary.py index dbb7af19..2e5c8474 100755 --- a/relecov_tools/log_summary.py +++ b/relecov_tools/log_summary.py @@ -120,7 +120,7 @@ def prepare_final_logs(self, logs): logs: logs with updated valid field values """ for key in logs.keys(): - if logs[key]["errors"]: + if logs[key].get("errors"): logs[key]["valid"] = False if logs[key].get("samples") is not None: for sample in logs[key]["samples"].keys(): @@ -129,16 +129,23 @@ def prepare_final_logs(self, logs): return logs def merge_logs(self, key_name, logs_list): - """Merge a multiple set of logs without losing information""" - if not logs_list: - return - merged_logs = copy.deepcopy(logs_list[0]) - if not merged_logs["samples"]: - merged_logs["samples"] = {} - for logs in logs_list: - merged_logs["errors"].extend(logs["errors"]) - merged_logs["warnings"].extend(logs["warnings"]) - if "samples" in logs.keys(): + """Merge a multiple set of logs without losing information + + Args: + key_name (str): Name of the final key holding the logs + logs_list (list(dict)): List of logs for different processes, + logs should only include the actual records, + + Returns: + final_logs (dict): Merged list of logs into a single record + """ + + def add_new_logs(merged_logs, logs): + if "errors" not in logs.keys(): + logs = logs.get(list(logs.keys())[0]) + merged_logs["errors"].extend(logs.get("errors")) + merged_logs["warnings"].extend(logs.get("warnings")) + if logs.get("samples"): for sample, vals in logs["samples"].items(): if sample not in merged_logs["samples"].keys(): merged_logs["samples"][sample] = vals @@ -149,34 +156,53 @@ def merge_logs(self, key_name, logs_list): merged_logs["samples"][sample]["warnings"].extend( logs["samples"][sample]["warnings"] ) + return merged_logs + + if not logs_list: + return + merged_logs = OrderedDict({"valid": True, "errors": [], "warnings": []}) + merged_logs["samples"] = {} + for idx, logs in enumerate(logs_list): + if not logs: + continue + try: + merged_logs = add_new_logs(merged_logs, logs) + except (TypeError, KeyError) as e: + err = f"Could not add logs {idx} in list: {e}" + merged_logs["errors"].extend(err) + log.error(err) final_logs = {key_name: merged_logs} return final_logs - def create_logs_excel(self, logs, called_module=""): + def create_logs_excel(self, logs, excel_outpath): """Create an excel file with logs information Args: logs (dict, optional): Custom dictionary of logs. Useful to create outputs - called_module (str, optional): Name of the module running this code. + excel_outpath (str): Path to output excel file """ def translate_fields(samples_logs): # TODO Translate logs to spanish using a local translator model like deepl return - date = datetime.today().strftime("%Y%m%d%-H%M%S") + date = datetime.today().strftime("%Y%m%d%H%M%S") lab_code = list(logs.keys())[0] - if self.unique_key: - excel_filename = "_".join( - [self.unique_key, called_module, date, "report.xlsx"] - ).replace("__", "") - else: - excel_filename = "_".join([lab_code, date, "report.xlsx"]) + if not os.path.exists(os.path.dirname(excel_outpath)): + excel_outpath = os.path.join( + self.output_location, lab_code + "_" + date + "_report.xlsx" + ) + log.warning( + "Given report outpath does not exist, changed to %s" % (excel_outpath) + ) + file_ext = os.path.splitext(excel_outpath)[-1] + excel_outpath = excel_outpath.replace(file_ext, ".xlsx") if not logs.get("samples"): try: - samples_logs = logs[lab_code].get("samples") + samples_logs = logs[lab_code]["samples"] except (KeyError, AttributeError) as e: stderr.print(f"[red]Could not convert log summary to excel: {e}") + log.error("Could not convert log summary to excel: %s" % str(e)) return else: samples_logs = logs.get("samples") From df2be34c85e0cf3a12f51fc2505a3ac552be3ef1 Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 12:13:55 +0200 Subject: [PATCH 52/83] Updated logs-to-excel output filename --- relecov_tools/__main__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/relecov_tools/__main__.py b/relecov_tools/__main__.py index 978d17b9..cc1aeeed 100755 --- a/relecov_tools/__main__.py +++ b/relecov_tools/__main__.py @@ -24,6 +24,7 @@ import relecov_tools.upload_ena_protocol import relecov_tools.pipeline_manager import relecov_tools.build_schema +import relecov_tools.dataprocess_wrapper log = logging.getLogger() @@ -565,7 +566,8 @@ def logs_to_excel(lab_code, output_folder, files): logsum = relecov_tools.log_summary.LogSum(output_location=output_folder) merged_logs = logsum.merge_logs(key_name=lab_code, logs_list=all_logs) final_logs = logsum.prepare_final_logs(logs=merged_logs) - logsum.create_logs_excel(logs=final_logs) + excel_outpath = os.path.join(output_folder, lab_code + "_logs_report.xlsx") + logsum.create_logs_excel(logs=final_logs, excel_outpath=excel_outpath) @relecov_tools_cli.command(help_priority=16) From 1639dd2f56567466386f5d8bc1625d13e955d1ee Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 13:53:33 +0200 Subject: [PATCH 53/83] Brackets annotations are removed from logs excel --- relecov_tools/log_summary.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/relecov_tools/log_summary.py b/relecov_tools/log_summary.py index 2e5c8474..bb74995c 100755 --- a/relecov_tools/log_summary.py +++ b/relecov_tools/log_summary.py @@ -4,6 +4,7 @@ import os import inspect import copy +import re import openpyxl from rich.console import Console @@ -181,6 +182,11 @@ def create_logs_excel(self, logs, excel_outpath): logs (dict, optional): Custom dictionary of logs. Useful to create outputs excel_outpath (str): Path to output excel file """ + def reg_remover(string, pattern): + """Remove annotation between brackets in logs message""" + string = string.replace("['", "'").replace("']", "'") + string = re.sub(pattern, '', string) + return string.strip() def translate_fields(samples_logs): # TODO Translate logs to spanish using a local translator model like deepl @@ -215,10 +221,13 @@ def translate_fields(samples_logs): warnings_sheet = workbook.create_sheet("Other warnings") warnings_headers = ["Sample ID given for sequencing", "Valid", "Warnings"] warnings_sheet.append(warnings_headers) + regex = r"\[.*?\]" # Regex to remove annotation between brackets for sample, logs in samples_logs.items(): - error_row = [sample, str(logs["valid"]), "; ".join(logs["errors"])] + clean_errors = [reg_remover(x, regex) for x in logs["errors"]] + error_row = [sample, str(logs["valid"]), "\n ".join(clean_errors)] main_worksheet.append(error_row) - warning_row = [sample, str(logs["valid"]), "; ".join(logs["warnings"])] + clean_warngs = [reg_remover(x, regex) for x in logs["warnings"]] + warning_row = [sample, str(logs["valid"]), "\n ".join(clean_warngs)] warnings_sheet.append(warning_row) relecov_tools.utils.adjust_sheet_size(main_worksheet) relecov_tools.utils.adjust_sheet_size(warnings_sheet) From 4ea982dbf9c0c6870d982691eb5bfc1482756be7 Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 14:00:01 +0200 Subject: [PATCH 54/83] Now error messages are reported based on the label --- relecov_tools/json_validation.py | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/relecov_tools/json_validation.py b/relecov_tools/json_validation.py index cb0cd05a..98364983 100755 --- a/relecov_tools/json_validation.py +++ b/relecov_tools/json_validation.py @@ -94,6 +94,7 @@ def validate_instances(self): # create validator validator = Draft202012Validator(self.json_schema) + schema_props = self.json_schema["properties"] validated_json_data = [] invalid_json = [] @@ -112,18 +113,24 @@ def validate_instances(self): else: # Count error types for error in validator.iter_errors(item_row): + if error.validator == "required": + error_field = [ + f for f in error.validator_value if f in error.message + ][0] + else: + error_field = error.absolute_path[0] try: - error_keys[error.message] = error.absolute_path[0] - except Exception: - error_keys[error.message] = error.message + err_field_label = schema_props[error_field]["label"] + except KeyError: + log.error("Could not extract label for %s" % error_field) + err_field_label = error_field + error.message.replace(error_field, err_field_label) + error_text = f"Error in column {err_field_label}: {error.message}" + error_keys[error.message] = error_field if error.message in errors: errors[error.message] += 1 else: errors[error.message] = 1 - if error_keys[error.message] == error.message: - error_text = error.message - else: - error_text = f"{error_keys[error.message]}:{error.message}" self.logsum.add_error(sample=sample_id_value, entry=error_text) # append row with errors invalid_json.append(item_row) From e830d10f329df1fe4ebcfd78362406d86869f0e2 Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 14:00:49 +0200 Subject: [PATCH 55/83] Check if input json file is a list of dicts first --- relecov_tools/json_validation.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/relecov_tools/json_validation.py b/relecov_tools/json_validation.py index 98364983..6fcd2b13 100755 --- a/relecov_tools/json_validation.py +++ b/relecov_tools/json_validation.py @@ -60,6 +60,10 @@ def __init__( stderr.print("[blue] Reading the json file") self.json_data = relecov_tools.utils.read_json_file(json_data_file) + if isinstance(self.json_data, dict): + stderr.print(f"[red]Invalid json file content in {json_data_file}.") + stderr.print("Should be a list of dicts. Create it with read-lab-metadata") + sys.exit(1) self.metadata = metadata try: self.sample_id_field = self.get_sample_id_field() From f4b32cd32087826fa76cfad2b682fa89a909a11e Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 14:02:07 +0200 Subject: [PATCH 56/83] Included handling of multiple empty rows in metadata xlsx file --- relecov_tools/json_validation.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/relecov_tools/json_validation.py b/relecov_tools/json_validation.py index 6fcd2b13..5b8c553b 100755 --- a/relecov_tools/json_validation.py +++ b/relecov_tools/json_validation.py @@ -186,13 +186,22 @@ def create_invalid_metadata(self, invalid_json, metadata, out_folder): wb = openpyxl.load_workbook(metadata) # TODO: Include this as a key in configuration.json ws_sheet = wb["METADATA_LAB"] + tag = "Sample ID given for sequencing" + seq_id_col = [idx for idx, cell in enumerate(ws_sheet[1]) if tag in cell.value] + if seq_id_col: + id_col = seq_id_col[0] row_to_del = [] - for row in ws_sheet.iter_rows(min_row=5, max_row=ws_sheet.max_row): - # if not data on row 1 and 2 assume that no more data are in file - # then start deleting rows - if not row[2].value and not row[1].value: + row_iterator = ws_sheet.iter_rows(min_row=1, max_row=ws_sheet.max_row) + consec_empty_rows = 0 + for row in row_iterator: + # if no data in 10 consecutive rows, break loop + if not any(row[x].value for x in range(10)): + row_to_del.append(row[0].row) + consec_empty_rows += 1 + if consec_empty_rows > 10: break - if str(row[2].value) not in sample_list: + consec_empty_rows = 0 + if str(row[id_col].value) not in sample_list: row_to_del.append(row[0].row) stderr.print("Collected rows to create the excel file") if len(row_to_del) > 0: From c703299988e3b75f86d5e74998a2240edcee5834 Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 14:03:16 +0200 Subject: [PATCH 57/83] Now validate returns data that will be used by wrapper --- relecov_tools/json_validation.py | 1 + 1 file changed, 1 insertion(+) diff --git a/relecov_tools/json_validation.py b/relecov_tools/json_validation.py index 5b8c553b..d49d5ed7 100755 --- a/relecov_tools/json_validation.py +++ b/relecov_tools/json_validation.py @@ -258,3 +258,4 @@ def validate(self): self.logsum.add_error(entry=log_text) stderr.print(f"[red]{log_text}") self.logsum.create_error_summary(called_module="validate") + return valid_json_data, invalid_json From 9f78410f2ff75f05b1c2f4fce00275354c7b333b Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 14:05:33 +0200 Subject: [PATCH 58/83] Some warnings now include label. Also removed trailing spaces from cell values --- relecov_tools/read_lab_metadata.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/relecov_tools/read_lab_metadata.py b/relecov_tools/read_lab_metadata.py index 3431c189..1aa27352 100755 --- a/relecov_tools/read_lab_metadata.py +++ b/relecov_tools/read_lab_metadata.py @@ -176,8 +176,8 @@ def match_to_json(self, valid_metadata_rows): if sample_id in samples_json.keys(): clean_metadata_rows.append(row) else: - log_text = "Sample missing in samples data Json file" - self.logsum.add_error(sample=sample_id, entry=log_text) + log_text = "Sample in metadata but missing in downloaded samples file" + self.logsum.add_warning(sample=sample_id, entry=log_text) missing_samples.append(sample_id) return clean_metadata_rows, missing_samples @@ -264,6 +264,7 @@ def adding_ontology_to_enum(self, m_data): def process_from_json(self, m_data, json_fields): """Find the labels that are missing in the file to match the given schema.""" map_field = json_fields["map_field"] + col_name = self.relecov_sch_json["properties"].get(map_field).get("label") json_data = json_fields["j_data"] for idx in range(len(m_data)): sample_id = str(m_data[idx].get("sequencing_sample_id")) @@ -274,14 +275,14 @@ def process_from_json(self, m_data, json_fields): clean_error = re.sub("[\[].*?[\]]", "", str(error.args[0])) if str(clean_error).lower().strip() == "not provided": log_text = ( - f"Label {map_field} was not provided in sample " + f"Label {col_name} was not provided in sample " + f"{sample_id}, auto-completing with Not Provided" ) self.logsum.add_warning(sample=sample_id, entry=log_text) else: log_text = ( - f"Unknown map_field value {error} for json data: " - + f"{str(map_field)} in sample {sample_id}. Skipped" + f"Unknown field value {error} for json data: " + + f"{str(col_name)} in sample {sample_id}. Skipped" ) self.logsum.add_warning(sample=sample_id, entry=log_text) continue @@ -383,7 +384,7 @@ def read_metadata_file(self): if isinstance(row[key], dtime): row[key] = str(row[key].date()) elif re.match(pattern, str(row[key])): - row[key] = row[key].replace("/", "-").replace(".", "-") + row[key] = str(row[key]).replace("/", "-").replace(".", "-") row[key] = re.match(pattern, row[key]).group(0) else: try: @@ -408,11 +409,13 @@ def read_metadata_file(self): alt_key = alt_header_dict.get(key) if row[key] is not None or "not provided" not in str(row[key]).lower(): try: - property_row[self.label_prop_dict[key]] = row[key] + property_row[self.label_prop_dict[key]] = str(row[key]).strip() except KeyError as e: if self.alternative_heading: try: - property_row[self.label_prop_dict[alt_key]] = row[key] + property_row[self.label_prop_dict[alt_key]] = str( + row[key] + ).strip() continue except KeyError: pass From 43d3d0fb0b01931f828ba317ec4a60880346c5f0 Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 14:08:32 +0200 Subject: [PATCH 59/83] New wrapper module --- relecov_tools/dataprocess_wrapper.py | 267 +++++++++++++++++++++++++++ 1 file changed, 267 insertions(+) create mode 100644 relecov_tools/dataprocess_wrapper.py diff --git a/relecov_tools/dataprocess_wrapper.py b/relecov_tools/dataprocess_wrapper.py new file mode 100644 index 00000000..13ca6abe --- /dev/null +++ b/relecov_tools/dataprocess_wrapper.py @@ -0,0 +1,267 @@ +#!/usr/bin/env python +import logging +import re +import yaml +import os +import sys +from datetime import datetime +import json +import inspect +import rich.console +from relecov_tools.download_manager import DownloadManager +from relecov_tools.read_lab_metadata import RelecovMetadata +from relecov_tools.json_validation import SchemaValidation +import relecov_tools.log_summary +import relecov_tools.utils + +log = logging.getLogger(__name__) +stderr = rich.console.Console( + stderr=True, + style="dim", + highlight=False, + force_terminal=relecov_tools.utils.rich_force_colors(), +) + + +class ProcessWrapper: + """ + Always fill all the arguments for the class in the config file, leave its value + if you dont want to use that argument e.g.(target_folders: ) -> (target_folders = None) + """ + + def __init__(self, config_file: str = None, output_folder: str = None): + if not os.path.isdir(str(output_folder)): + sys.exit(FileNotFoundError(f"Output folder {output_folder} is not valid")) + else: + self.output_folder = output_folder + if not os.path.isfile(str(config_file)): + sys.exit(FileNotFoundError(f"Config file {config_file} is not a file")) + else: + try: + self.config_data = relecov_tools.utils.read_yml_file(config_file) + # Config file should include a key + except yaml.YAMLError as e: + sys.exit(yaml.YAMLError(f"Invalid config file: {e}")) + output_regex = ("out_folder", "output_folder", "output_location") + for key, val in self.config_data.items(): + for arg in output_regex: + if val == arg: + self.config_data[key] = self.output_folder + self.wrapper_logsum = relecov_tools.log_summary.LogSum( + output_location=os.path.join(self.output_folder, "logs") + ) + self.config_data["download"].update({"output_location": output_folder}) + self.download_params = self.clean_module_params( + "DownloadManager", self.config_data["download"] + ) + self.readmeta_params = self.clean_module_params( + "RelecovMetadata", self.config_data["read-lab-metadata"] + ) + self.validate_params = self.clean_module_params( + "SchemaValidation", self.config_data["validate"] + ) + + def clean_module_params(self, module, params): + active_module = eval(module) + module_args = inspect.getfullargspec(active_module.__init__)[0] + module_args.remove("self") + module_valid_params = {x: y for x, y in params.items() if x in module_args} + if not module_valid_params: + stderr.print(f"[red]Invalid params for {module} in config file") + sys.exit(1) + return module_valid_params + + def exec_download(self, download_params): + download_manager = DownloadManager(**download_params) + download_manager.execute_process() + finished_folders = download_manager.finished_folders + download_logs = self.wrapper_logsum.prepare_final_logs( + logs=download_manager.logsum.logs + ) + self.download_manager = download_manager + return finished_folders, download_logs + + def exec_read_metadata(self, readmeta_params): + read_metadata = RelecovMetadata(**readmeta_params) + read_metadata.create_metadata_json() + read_meta_logs = self.wrapper_logsum.prepare_final_logs( + logs=read_metadata.logsum.logs + ) + return read_meta_logs + + def exec_validation(self, validate_params): + validate_proccess = SchemaValidation(**validate_params) + valid_json_data, invalid_json = validate_proccess.validate() + validate_logs = self.wrapper_logsum.prepare_final_logs( + logs=validate_proccess.logsum.logs + ) + return valid_json_data, invalid_json, validate_logs + + def process_folder(self, finished_folders, key, folder_logs): + """_summary_ + + Args: + finished_folders (_type_): _description_ + key (_type_): _description_ + folder_logs (_type_): _description_ + + Raises: + ValueError: _description_ + KeyError: _description_ + ValueError: _description_ + ValueError: _description_ + + Returns: + _type_: _description_ + """ + + def upload_files_from_json(invalid_json, remote_dir): + """Upload the files in a given json with samples metadata""" + for sample in invalid_json: + local_dir = sample.get("r1_fastq_filepath") + # files_keys = [key for key in sample.keys() if "_file_" in key] + sample_files = ( + sample.get("sequence_file_R1_fastq"), + sample.get("sequence_file_R2_fastq"), + ) + ftp_files = self.download_manager.relecov_sftp.get_file_list(remote_dir) + uploaded_files = [] + for file in sample_files: + if not file or file in ftp_files: + continue + loc_path = os.path.join(local_dir, file) + sftp_path = os.path.join(remote_dir, file) + log.info("Uploading %s to remote %s" % (loc_path, remote_dir)) + uploaded = self.download_manager.relecov_sftp.upload_file( + loc_path, sftp_path + ) + if not uploaded: + err = f"Could not upload {loc_path} to {remote_dir}" + self.wrapper_logsum.add_error(sample=sample, entry=err) + else: + uploaded_files.append(file) + return uploaded_files + + local_folder = folder_logs.get("path") + match_date = re.search(r"\/\d{4}\d{2}\d{2}\d{6}", local_folder) + sftp_dirs = self.download_manager.relecov_sftp.list_remote_folders(key) + sftp_dirs_paths = [os.path.join(key, d) for d in sftp_dirs] + valid_dirs = [d for d in sftp_dirs_paths if d in finished_folders.keys()] + if not valid_dirs or len(valid_dirs) >= 2: + logtxt = f"Could not find {key} folder in remote sftp. Skipped" + raise KeyError(logtxt) + # As all folders are merged into one during download, there should only be 1 folder + remote_dir = valid_dirs[0] + if not local_folder: + raise ValueError() + files = [os.path.join(local_folder, file) for file in os.listdir(local_folder)] + try: + metadata_file = [x for x in files if re.search("lab_metadata.*.xlsx", x)][0] + samples_file = [x for x in files if re.search("samples_data.*.json", x)][0] + except IndexError: + raise ValueError(f"No metadata/samples files found after download") + self.readmeta_params.update( + { + "metadata_file": metadata_file, + "sample_list_file": samples_file, + "output_folder": local_folder, + } + ) + read_meta_logs = self.exec_read_metadata(self.readmeta_params) + metadata_json = [ + x for x in os.listdir(local_folder) if re.search("lab_metadata.*.json", x) + ] + if not metadata_json: + raise ValueError(f"No metadata json found after read-lab-metadata") + self.validate_params.update( + { + "json_data_file": os.path.join(local_folder, metadata_json[0]), + "metadata": metadata_file, + "out_folder": local_folder, + } + ) + valid_json_data, invalid_json, validate_logs = self.exec_validation( + self.validate_params + ) + merged_logs = self.wrapper_logsum.merge_logs( + key_name=key, logs_list=[{key: folder_logs}, read_meta_logs, validate_logs] + ) + stderr.print(f"[green]Merged logs from all processes in {local_folder}") + if invalid_json: + logtxt = f"Found {len(invalid_json)} invalid samples in {key}" + self.wrapper_logsum.add_warning(key=key, entry=logtxt) + assets = os.path.join(os.path.dirname(os.path.realpath(__file__)), "assets") + metadata_template = [ + x for x in os.listdir(assets) if re.search("metadata_templat.*.xlsx", x) + ][0] + sftp_path = os.path.join(remote_dir, os.path.basename(metadata_template)) + stderr.print(f"[blue]Uploading invalid files and template to {remote_dir}") + self.download_manager.relecov_sftp.upload_file( + os.path.join(assets, metadata_template), sftp_path + ) + upload_files_from_json(invalid_json, remote_dir) + stderr.print(f"[blue]Cleaning successfully validated files from {remote_dir}") + log.info("Cleaning successfully validated files from remote dir") + file_fields = ("sequence_file_R1_fastq", "sequence_file_R2_fastq") + valid_sampfiles = [f.get(key) for key in file_fields for f in valid_json_data] + valid_files = [f for f in finished_folders[remote_dir] if f in valid_sampfiles] + self.download_manager.delete_remote_files(key, files=valid_files) + self.download_manager.delete_remote_files(key, skip_seqs=True) + self.download_manager.clean_remote_folder(key) + log_filepath = os.path.join(local_folder, str(key) + "_metadata_report.json") + self.wrapper_logsum.create_error_summary( + called_module="metadata", + filepath=log_filepath, + logs=merged_logs, + to_excel=True, + ) + xlsx_report_files = [ + f for f in os.listdir(local_folder) if re.search("metadata_report.xlsx", f) + ] + if xlsx_report_files: + log.info("Uploading %s xlsx report to remote %s" % (key, remote_dir)) + local_xlsx = os.path.join(local_folder, xlsx_report_files[0]) + remote_xlsx = os.path.join(remote_dir, xlsx_report_files[0]) + up = self.download_manager.relecov_sftp.upload_file(local_xlsx, remote_xlsx) + if not up: + log.error( + "Could not upload %s report to remote %s" % (key, local_folder) + ) + else: + log.error("Could not find xlsx report for %s in %s" % (key, logs_dir)) + return merged_logs, valid_json_data + + def run_wrapper(self): + """Execute each given process in config file sequentially""" + finished_folders, download_logs = self.exec_download(self.download_params) + if not finished_folders: + stderr.print("[red]No valid folders found to process") + sys.exit(1) + date = datetime.today().strftime("%Y%m%d%H%M%S") + for key, folder_logs in download_logs.items(): + folder = folder_logs.get("path") + if not folder: + continue + if not folder_logs.get("valid"): + continue + try: + merged_logs, valid_json_data = self.process_folder( + finished_folders, key, folder_logs + ) + except FileNotFoundError as e: + log.error(f"Could not process folder {key}: {e}") + folder_logs["errors"].append(f"Could not process folder {key}: {e}") + log_filepath = os.path.join(folder, str(key) + "_metadata_summary.json") + self.wrapper_logsum.create_error_summary( + called_module="metadata", + filepath=log_filepath, + logs={key: folder_logs}, + to_excel=False, + ) + continue + self.wrapper_logsum.logs[key] = merged_logs[key] + self.wrapper_logsum.create_error_summary( + called_module="wrapper", + to_excel=True, + ) + return From f96faa4eea64fb97fc397077237abb78d8b33769 Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 14:10:58 +0200 Subject: [PATCH 60/83] Brackets removal. Linting --- relecov_tools/log_summary.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/relecov_tools/log_summary.py b/relecov_tools/log_summary.py index bb74995c..0e92b47f 100755 --- a/relecov_tools/log_summary.py +++ b/relecov_tools/log_summary.py @@ -182,10 +182,11 @@ def create_logs_excel(self, logs, excel_outpath): logs (dict, optional): Custom dictionary of logs. Useful to create outputs excel_outpath (str): Path to output excel file """ + def reg_remover(string, pattern): """Remove annotation between brackets in logs message""" string = string.replace("['", "'").replace("']", "'") - string = re.sub(pattern, '', string) + string = re.sub(pattern, "", string) return string.strip() def translate_fields(samples_logs): @@ -221,7 +222,7 @@ def translate_fields(samples_logs): warnings_sheet = workbook.create_sheet("Other warnings") warnings_headers = ["Sample ID given for sequencing", "Valid", "Warnings"] warnings_sheet.append(warnings_headers) - regex = r"\[.*?\]" # Regex to remove annotation between brackets + regex = r"\[.*?\]" # Regex to remove annotation between brackets for sample, logs in samples_logs.items(): clean_errors = [reg_remover(x, regex) for x in logs["errors"]] error_row = [sample, str(logs["valid"]), "\n ".join(clean_errors)] From c90bb7604db010731df164559a5fc453d84236cd Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 15:24:01 +0200 Subject: [PATCH 61/83] New wrapper module. linting --- relecov_tools/dataprocess_wrapper.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/relecov_tools/dataprocess_wrapper.py b/relecov_tools/dataprocess_wrapper.py index 13ca6abe..21225eb1 100644 --- a/relecov_tools/dataprocess_wrapper.py +++ b/relecov_tools/dataprocess_wrapper.py @@ -5,7 +5,6 @@ import os import sys from datetime import datetime -import json import inspect import rich.console from relecov_tools.download_manager import DownloadManager @@ -143,7 +142,6 @@ def upload_files_from_json(invalid_json, remote_dir): return uploaded_files local_folder = folder_logs.get("path") - match_date = re.search(r"\/\d{4}\d{2}\d{2}\d{6}", local_folder) sftp_dirs = self.download_manager.relecov_sftp.list_remote_folders(key) sftp_dirs_paths = [os.path.join(key, d) for d in sftp_dirs] valid_dirs = [d for d in sftp_dirs_paths if d in finished_folders.keys()] @@ -159,7 +157,7 @@ def upload_files_from_json(invalid_json, remote_dir): metadata_file = [x for x in files if re.search("lab_metadata.*.xlsx", x)][0] samples_file = [x for x in files if re.search("samples_data.*.json", x)][0] except IndexError: - raise ValueError(f"No metadata/samples files found after download") + raise ValueError("No metadata/samples files found after download") self.readmeta_params.update( { "metadata_file": metadata_file, @@ -172,7 +170,7 @@ def upload_files_from_json(invalid_json, remote_dir): x for x in os.listdir(local_folder) if re.search("lab_metadata.*.json", x) ] if not metadata_json: - raise ValueError(f"No metadata json found after read-lab-metadata") + raise ValueError("No metadata json found after read-lab-metadata") self.validate_params.update( { "json_data_file": os.path.join(local_folder, metadata_json[0]), @@ -228,7 +226,7 @@ def upload_files_from_json(invalid_json, remote_dir): "Could not upload %s report to remote %s" % (key, local_folder) ) else: - log.error("Could not find xlsx report for %s in %s" % (key, logs_dir)) + log.error("Could not find xlsx report for %s in %s" % (key, local_folder)) return merged_logs, valid_json_data def run_wrapper(self): @@ -251,7 +249,9 @@ def run_wrapper(self): except FileNotFoundError as e: log.error(f"Could not process folder {key}: {e}") folder_logs["errors"].append(f"Could not process folder {key}: {e}") - log_filepath = os.path.join(folder, str(key) + "_metadata_summary.json") + log_filepath = os.path.join( + folder, date + "_" + str(key) + "_wrapper_summary.json" + ) self.wrapper_logsum.create_error_summary( called_module="metadata", filepath=log_filepath, From 2857fe61aea24292bac999dfb9427aba8c1e245f Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 16:37:57 +0200 Subject: [PATCH 62/83] Included docstring for process_folder() --- relecov_tools/dataprocess_wrapper.py | 42 +++++++++++++++++----------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/relecov_tools/dataprocess_wrapper.py b/relecov_tools/dataprocess_wrapper.py index 21225eb1..b5755168 100644 --- a/relecov_tools/dataprocess_wrapper.py +++ b/relecov_tools/dataprocess_wrapper.py @@ -97,21 +97,27 @@ def exec_validation(self, validate_params): return valid_json_data, invalid_json, validate_logs def process_folder(self, finished_folders, key, folder_logs): - """_summary_ + """Executes read-lab-metadata and validation process for the given downloaded folder. + Merges all the log summaries generated with the ones from download process, creates + an excel file with custom format and uploads it back to its remote sftp folder. + Also uploads the files that failed validation back to the remote sftp folder. + Finally. It cleans all the remote remaining files if the process was successful. Args: - finished_folders (_type_): _description_ - key (_type_): _description_ - folder_logs (_type_): _description_ + finished_folders (dict(str:list)): Dictionary which includes the names + of the remote folders processed during download and the successfull files for each + key (str): Name of the folder to process in remote sftp, same name as the one + included in the log_summary from download process. + folder_logs (dict): Download log_summary corresponding to the processed folder Raises: - ValueError: _description_ - KeyError: _description_ - ValueError: _description_ - ValueError: _description_ + ValueError: If folder_logs dont include a path to the local folder + ValueError: If folder is not found in remote sftp or more than 1 + ValueError: If no samples/files are found for the folder after download + ValueError: If no metadata json file is found after read-lab-metadata Returns: - _type_: _description_ + merged_logs (dict): Dictionary which includes the logs from all processes """ def upload_files_from_json(invalid_json, remote_dir): @@ -147,11 +153,11 @@ def upload_files_from_json(invalid_json, remote_dir): valid_dirs = [d for d in sftp_dirs_paths if d in finished_folders.keys()] if not valid_dirs or len(valid_dirs) >= 2: logtxt = f"Could not find {key} folder in remote sftp. Skipped" - raise KeyError(logtxt) + raise ValueError(logtxt) # As all folders are merged into one during download, there should only be 1 folder remote_dir = valid_dirs[0] if not local_folder: - raise ValueError() + raise ValueError(f"Couldnt find local path for {key} in log after download") files = [os.path.join(local_folder, file) for file in os.listdir(local_folder)] try: metadata_file = [x for x in files if re.search("lab_metadata.*.xlsx", x)][0] @@ -227,10 +233,14 @@ def upload_files_from_json(invalid_json, remote_dir): ) else: log.error("Could not find xlsx report for %s in %s" % (key, local_folder)) - return merged_logs, valid_json_data + return merged_logs def run_wrapper(self): - """Execute each given process in config file sequentially""" + """Execute each given process in config file sequentially, starting with download. + Once the download has finished, each downloaded folder is processed using read-lab-metadata + and validation modules. The logs from each module are merged into a single log-summary. + These merged logs are then used to create an excel report of all the processes + """ finished_folders, download_logs = self.exec_download(self.download_params) if not finished_folders: stderr.print("[red]No valid folders found to process") @@ -243,10 +253,8 @@ def run_wrapper(self): if not folder_logs.get("valid"): continue try: - merged_logs, valid_json_data = self.process_folder( - finished_folders, key, folder_logs - ) - except FileNotFoundError as e: + merged_logs = self.process_folder(finished_folders, key, folder_logs) + except (FileNotFoundError, ValueError) as e: log.error(f"Could not process folder {key}: {e}") folder_logs["errors"].append(f"Could not process folder {key}: {e}") log_filepath = os.path.join( From 02617d9aaa81304306ef66dc911c10eaa361d8a3 Mon Sep 17 00:00:00 2001 From: Shettland Date: Tue, 8 Oct 2024 17:13:14 +0200 Subject: [PATCH 63/83] Handling removed remote folder prior to upload --- relecov_tools/dataprocess_wrapper.py | 31 +++++++++++++++------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/relecov_tools/dataprocess_wrapper.py b/relecov_tools/dataprocess_wrapper.py index b5755168..ff786c9e 100644 --- a/relecov_tools/dataprocess_wrapper.py +++ b/relecov_tools/dataprocess_wrapper.py @@ -59,6 +59,7 @@ def __init__(self, config_file: str = None, output_folder: str = None): self.validate_params = self.clean_module_params( "SchemaValidation", self.config_data["validate"] ) + self.date = datetime.today().strftime("%Y%m%d%H%M%S") def clean_module_params(self, module, params): active_module = eval(module) @@ -148,14 +149,6 @@ def upload_files_from_json(invalid_json, remote_dir): return uploaded_files local_folder = folder_logs.get("path") - sftp_dirs = self.download_manager.relecov_sftp.list_remote_folders(key) - sftp_dirs_paths = [os.path.join(key, d) for d in sftp_dirs] - valid_dirs = [d for d in sftp_dirs_paths if d in finished_folders.keys()] - if not valid_dirs or len(valid_dirs) >= 2: - logtxt = f"Could not find {key} folder in remote sftp. Skipped" - raise ValueError(logtxt) - # As all folders are merged into one during download, there should only be 1 folder - remote_dir = valid_dirs[0] if not local_folder: raise ValueError(f"Couldnt find local path for {key} in log after download") files = [os.path.join(local_folder, file) for file in os.listdir(local_folder)] @@ -190,8 +183,18 @@ def upload_files_from_json(invalid_json, remote_dir): merged_logs = self.wrapper_logsum.merge_logs( key_name=key, logs_list=[{key: folder_logs}, read_meta_logs, validate_logs] ) - stderr.print(f"[green]Merged logs from all processes in {local_folder}") + sftp_dirs = self.download_manager.relecov_sftp.list_remote_folders(key) + sftp_dirs_paths = [os.path.join(key, d) for d in sftp_dirs] + valid_dirs = [d for d in sftp_dirs_paths if d in finished_folders.keys()] + if not valid_dirs or len(valid_dirs) >= 2: + # As all folders are merged into one during download, there should only be 1 folder + log.warning("Couldnt find %s folder in remote sftp. Creating new one", key) + remote_dir = os.path.join(key, self.date + "_invalid_samples") + self.download_manager.relecov_sftp.make_dir(remote_dir) + else: + remote_dir = valid_dirs[0] if invalid_json: + stderr.print(f"[green]Merged logs from all processes in {local_folder}") logtxt = f"Found {len(invalid_json)} invalid samples in {key}" self.wrapper_logsum.add_warning(key=key, entry=logtxt) assets = os.path.join(os.path.dirname(os.path.realpath(__file__)), "assets") @@ -203,15 +206,16 @@ def upload_files_from_json(invalid_json, remote_dir): self.download_manager.relecov_sftp.upload_file( os.path.join(assets, metadata_template), sftp_path ) + # Upload all the files that failed validation process back to sftp upload_files_from_json(invalid_json, remote_dir) stderr.print(f"[blue]Cleaning successfully validated files from {remote_dir}") log.info("Cleaning successfully validated files from remote dir") file_fields = ("sequence_file_R1_fastq", "sequence_file_R2_fastq") valid_sampfiles = [f.get(key) for key in file_fields for f in valid_json_data] valid_files = [f for f in finished_folders[remote_dir] if f in valid_sampfiles] - self.download_manager.delete_remote_files(key, files=valid_files) - self.download_manager.delete_remote_files(key, skip_seqs=True) - self.download_manager.clean_remote_folder(key) + self.download_manager.delete_remote_files(remote_dir, files=valid_files) + self.download_manager.delete_remote_files(remote_dir, skip_seqs=True) + self.download_manager.clean_remote_folder(remote_dir) log_filepath = os.path.join(local_folder, str(key) + "_metadata_report.json") self.wrapper_logsum.create_error_summary( called_module="metadata", @@ -245,7 +249,6 @@ def run_wrapper(self): if not finished_folders: stderr.print("[red]No valid folders found to process") sys.exit(1) - date = datetime.today().strftime("%Y%m%d%H%M%S") for key, folder_logs in download_logs.items(): folder = folder_logs.get("path") if not folder: @@ -258,7 +261,7 @@ def run_wrapper(self): log.error(f"Could not process folder {key}: {e}") folder_logs["errors"].append(f"Could not process folder {key}: {e}") log_filepath = os.path.join( - folder, date + "_" + str(key) + "_wrapper_summary.json" + folder, self.date + "_" + str(key) + "_wrapper_summary.json" ) self.wrapper_logsum.create_error_summary( called_module="metadata", From abea22caf30b160e6ca2d87aebaa91ed10aa276a Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 9 Oct 2024 10:16:26 +0200 Subject: [PATCH 64/83] Moved cleaning in case remote folder was removed by download_clean --- relecov_tools/dataprocess_wrapper.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/relecov_tools/dataprocess_wrapper.py b/relecov_tools/dataprocess_wrapper.py index ff786c9e..e9a2eaf2 100644 --- a/relecov_tools/dataprocess_wrapper.py +++ b/relecov_tools/dataprocess_wrapper.py @@ -183,18 +183,27 @@ def upload_files_from_json(invalid_json, remote_dir): merged_logs = self.wrapper_logsum.merge_logs( key_name=key, logs_list=[{key: folder_logs}, read_meta_logs, validate_logs] ) + stderr.print(f"[green]Merged logs from all processes in {local_folder}") sftp_dirs = self.download_manager.relecov_sftp.list_remote_folders(key) sftp_dirs_paths = [os.path.join(key, d) for d in sftp_dirs] valid_dirs = [d for d in sftp_dirs_paths if d in finished_folders.keys()] + # As all folders are merged into one during download, there should only be 1 folder if not valid_dirs or len(valid_dirs) >= 2: - # As all folders are merged into one during download, there should only be 1 folder + # If all samples were valid during download and download_clean is used, the original folder might have been deleted log.warning("Couldnt find %s folder in remote sftp. Creating new one", key) remote_dir = os.path.join(key, self.date + "_invalid_samples") self.download_manager.relecov_sftp.make_dir(remote_dir) else: remote_dir = valid_dirs[0] + stderr.print(f"[blue]Cleaning successfully validated files from {remote_dir}") + log.info("Cleaning successfully validated files from remote dir") + file_fields = ("sequence_file_R1_fastq", "sequence_file_R2_fastq") + valid_sampfiles = [f.get(key) for key in file_fields for f in valid_json_data] + valid_files = [f for f in finished_folders[remote_dir] if f in valid_sampfiles] + self.download_manager.delete_remote_files(remote_dir, files=valid_files) + self.download_manager.delete_remote_files(remote_dir, skip_seqs=True) + self.download_manager.clean_remote_folder(remote_dir) if invalid_json: - stderr.print(f"[green]Merged logs from all processes in {local_folder}") logtxt = f"Found {len(invalid_json)} invalid samples in {key}" self.wrapper_logsum.add_warning(key=key, entry=logtxt) assets = os.path.join(os.path.dirname(os.path.realpath(__file__)), "assets") @@ -202,20 +211,16 @@ def upload_files_from_json(invalid_json, remote_dir): x for x in os.listdir(assets) if re.search("metadata_templat.*.xlsx", x) ][0] sftp_path = os.path.join(remote_dir, os.path.basename(metadata_template)) + log.info("Uploading invalid files and template to %s", remote_dir) stderr.print(f"[blue]Uploading invalid files and template to {remote_dir}") self.download_manager.relecov_sftp.upload_file( os.path.join(assets, metadata_template), sftp_path ) # Upload all the files that failed validation process back to sftp upload_files_from_json(invalid_json, remote_dir) - stderr.print(f"[blue]Cleaning successfully validated files from {remote_dir}") - log.info("Cleaning successfully validated files from remote dir") - file_fields = ("sequence_file_R1_fastq", "sequence_file_R2_fastq") - valid_sampfiles = [f.get(key) for key in file_fields for f in valid_json_data] - valid_files = [f for f in finished_folders[remote_dir] if f in valid_sampfiles] - self.download_manager.delete_remote_files(remote_dir, files=valid_files) - self.download_manager.delete_remote_files(remote_dir, skip_seqs=True) - self.download_manager.clean_remote_folder(remote_dir) + else: + log.info("No invalid samples in %s", key) + stderr.print(f"[green]No invalid samples were found for {key} !!!") log_filepath = os.path.join(local_folder, str(key) + "_metadata_report.json") self.wrapper_logsum.create_error_summary( called_module="metadata", From a80cfb987f31893bf1804d024571e986c8bc91bb Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 9 Oct 2024 10:27:57 +0200 Subject: [PATCH 65/83] Moved cleaning in case remote folder was removed. Linting --- relecov_tools/dataprocess_wrapper.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/relecov_tools/dataprocess_wrapper.py b/relecov_tools/dataprocess_wrapper.py index e9a2eaf2..42877ccd 100644 --- a/relecov_tools/dataprocess_wrapper.py +++ b/relecov_tools/dataprocess_wrapper.py @@ -195,11 +195,17 @@ def upload_files_from_json(invalid_json, remote_dir): self.download_manager.relecov_sftp.make_dir(remote_dir) else: remote_dir = valid_dirs[0] - stderr.print(f"[blue]Cleaning successfully validated files from {remote_dir}") + stderr.print( + f"[blue]Cleaning successfully validated files from {remote_dir}" + ) log.info("Cleaning successfully validated files from remote dir") file_fields = ("sequence_file_R1_fastq", "sequence_file_R2_fastq") - valid_sampfiles = [f.get(key) for key in file_fields for f in valid_json_data] - valid_files = [f for f in finished_folders[remote_dir] if f in valid_sampfiles] + valid_sampfiles = [ + f.get(key) for key in file_fields for f in valid_json_data + ] + valid_files = [ + f for f in finished_folders[remote_dir] if f in valid_sampfiles + ] self.download_manager.delete_remote_files(remote_dir, files=valid_files) self.download_manager.delete_remote_files(remote_dir, skip_seqs=True) self.download_manager.clean_remote_folder(remote_dir) From 59b36fab3bab1e717352dfbf3a73f578b7d604d8 Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 9 Oct 2024 14:34:54 +0200 Subject: [PATCH 66/83] Included processed batchs and samples in log_summary --- relecov_tools/read_bioinfo_metadata.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/relecov_tools/read_bioinfo_metadata.py b/relecov_tools/read_bioinfo_metadata.py index 27ee09aa..98aa0b9f 100755 --- a/relecov_tools/read_bioinfo_metadata.py +++ b/relecov_tools/read_bioinfo_metadata.py @@ -300,7 +300,6 @@ def handling_tables(self, file_list, conf_tab_name): file_ext = os.path.splitext(conf_tab_name)[1] # Parsing key position sample_idx_colpos = self.get_sample_idx_colpos(self.current_config_key) - # TODO: What if you need to process one table for each sample? extdict = {".csv": ",", ".tsv": "\t", ".tab": "\t"} if file_ext in extdict.keys(): data = relecov_tools.utils.read_csv_file_return_dict( @@ -738,6 +737,7 @@ def split_tables_by_batch(self, files_found_dict, batch_data, output_dir): def extract_batch_rows_to_file(file): """Create a new table file only with rows matching samples in batch_data""" + extdict = {".csv": ",", ".tsv": "\t", ".tab": "\t"} file_extension = os.path.splitext(file)[1] file_df = pd.read_csv( file, sep=extdict.get(file_extension), header=header_pos @@ -754,7 +754,6 @@ def extract_batch_rows_to_file(file): method_name = self.split_tables_by_batch.__name__ namekey = "sequencing_sample_id" batch_samples = [row.get(namekey) for row in batch_data] - extdict = {".csv": ",", ".tsv": "\t", ".tab": "\t"} for key, files in files_found_dict.items(): if not self.software_config[key].get("split_by_batch"): continue @@ -793,6 +792,7 @@ def create_bioinfo_file(self): data_by_batch = self.split_data_by_batch(self.j_data) # Add bioinfo metadata to j_data for batch_dir, batch_dict in data_by_batch.items(): + self.log_report.logsum.feed_key(batch_dir) stderr.print(f"[blue]Processing data from {batch_dir}") batch_data = batch_dict["j_data"] stderr.print("[blue]Adding bioinfo metadata to read lab metadata...") @@ -815,6 +815,10 @@ def create_bioinfo_file(self): batch_filename = tag + lab_code + "_" + batch_date + ".json" batch_filepath = os.path.join(batch_dir, batch_filename) relecov_tools.utils.write_json_fo_file(batch_data, batch_filepath) + for sample in batch_data: + self.log_report.logsum.feed_key( + key=batch_dir, sample=sample.get("sequencing_sample_id") + ) log.info("Created output json file: %s" % batch_filepath) stderr.print(f"[green]Created batch json file: {batch_filepath}") stderr.print("[blue]Writting output json file") From 42f98b246c43d5a1c2aea0880a97509fd43372f5 Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 9 Oct 2024 14:37:01 +0200 Subject: [PATCH 67/83] Better log readability --- relecov_tools/upload_database.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/relecov_tools/upload_database.py b/relecov_tools/upload_database.py index eb5d5c4f..ffcb673f 100644 --- a/relecov_tools/upload_database.py +++ b/relecov_tools/upload_database.py @@ -259,24 +259,24 @@ def update_database(self, field_values, post_url): if "ERROR" not in result: break if i == 9 and "ERROR" in result: - logtxt = f"Unable to sent the request to {self.platform}" + logtxt = f"Unable to sent the request to {post_url}" self.logsum.add_error(entry=logtxt, sample=req_sample) stderr.print(f"[red]{logtxt}") continue elif "is not defined" in result["ERROR_TEST"].lower(): error_txt = result["ERROR_TEST"] - logtxt = f"Sample {req_sample}: {error_txt}" + logtxt = f"Sample {req_sample} failed in {post_url}: {error_txt}" self.logsum.add_error(entry=logtxt, sample=req_sample) stderr.print(f"[yellow]Warning: {logtxt}") continue elif "already defined" in result["ERROR_TEST"].lower(): - logtxt = f"Request to {self.platform} already defined" + logtxt = f"Request to {post_url} already defined" self.logsum.add_warning(entry=logtxt, sample=req_sample) stderr.print(f"[yellow]{logtxt} for sample {req_sample}") continue else: - logtxt = f"Error {result['ERROR']} in request to {self.platform}" + logtxt = f"Error {result['ERROR']} in request to {post_url}" self.logsum.add_error(entry=logtxt, sample=req_sample) stderr.print(f"[red]{logtxt}") continue @@ -298,7 +298,7 @@ def update_database(self, field_values, post_url): sample=req_sample, ) stderr.print( - f"[yellow]logtxt % {suces_count} {request_count} {self.platform})" + f"[yellow]{logtxt % (suces_count, request_count, self.platform)}" ) return @@ -363,7 +363,7 @@ def update_db(self): self.server_name = "relecov" self.start_api(self.server_name) - for datatype in self.types_of_data: + for datatype in ["sample", "bioinfodata", "variantdata"]: log_text = f"Sending {datatype} data to {self.server_name}" log.info(log_text) stderr.print(log_text) From 377b8ea5f63ac6ba0b487a1a0d5e9781dc34ce1f Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 9 Oct 2024 14:38:10 +0200 Subject: [PATCH 68/83] Changed setup and main versions to 1.2.0 --- relecov_tools/__main__.py | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/relecov_tools/__main__.py b/relecov_tools/__main__.py index cc1aeeed..12ea61d0 100755 --- a/relecov_tools/__main__.py +++ b/relecov_tools/__main__.py @@ -62,7 +62,7 @@ def run_relecov_tools(): ) # stderr.print("[green] `._,._,'\n", highlight=False) - __version__ = "1.1.0" + __version__ = "1.2.0" stderr.print( "\n" "[grey39] RELECOV-tools version {}".format(__version__), highlight=False ) diff --git a/setup.py b/setup.py index b721a1c6..596177f2 100644 --- a/setup.py +++ b/setup.py @@ -2,7 +2,7 @@ from setuptools import setup, find_packages -version = "1.1.0" +version = "1.2.0" with open("README.md") as f: readme = f.read() From f9f3d4b52e63fe53f1fb483cf2bb51a88a00f7d9 Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 9 Oct 2024 14:39:06 +0200 Subject: [PATCH 69/83] Fixed wrong parameter description in wrapper --- relecov_tools/__main__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/relecov_tools/__main__.py b/relecov_tools/__main__.py index 12ea61d0..77cf1ef7 100755 --- a/relecov_tools/__main__.py +++ b/relecov_tools/__main__.py @@ -575,14 +575,14 @@ def logs_to_excel(lab_code, output_folder, files): "-c", "--config_file", type=click.Path(), - help="Path to config file in yaml format", + help="Path to config file in yaml format [required]", required=True, ) @click.option( "-o", "--output_folder", type=click.Path(), - help="Path to the base schema file. This file is used as a reference to compare it with the schema generated using this module. (Default: installed schema in 'relecov-tools/relecov_tools/schema/relecov_schema.json')", + help="Path to folder where global results are saved [required]", required=False, ) def wrapper(config_file, output_folder): From f3c564dad89419359ccf0688ab46acb8b7fe0f67 Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 9 Oct 2024 14:44:26 +0200 Subject: [PATCH 70/83] Updated modules and wrapper description --- README.md | 45 +++++++++++++++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 8d9b7453..a24351d9 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,8 @@ relecov-tools is a set of helper tools for the assembly of the different element - [upload-to-ena](#upload-to-ena) - [upload-to-gisaid](#upload-to-gisaid) - [update-db](#update-db) - - [launch-pipeline](#launch-pipeline) + - [pipeline-manager](#pipeline-manager) + - [wrapper](#wrapper) - [logs-to-excel](#logs-to-excel) - [build-schema](#build-schema) - [Mandatory Fields](#mandatory-fields) @@ -63,7 +64,7 @@ $ relecov-tools --help \ \ / |__ / |__ | |___ | | | \ / / / \ | \ | | | | | | \ / / |--| | \ |___ |___ |___ |___ |___| \/ -RELECOV-tools version 1.1.0 +RELECOV-tools version 1.2.0 Usage: relecov-tools [OPTIONS] COMMAND [ARGS]... Options: @@ -73,16 +74,19 @@ Options: --help Show this message and exit. Commands: - download Download files located in sftp server. - read-lab-metadata Create the json compliant to the relecov schema from... - read-bioinfo-metadata Create the json compliant to the relecov schema with Bioinfo Metadata. - validate Validate json file against schema. - map Convert data between phage plus schema to ENA,... - upload-to-ena parsed data to create xml files to upload to ena - upload-to-gisaid parsed data to create files to upload to gisaid - update-db feed database with metadata jsons - build-schema Generates and updates JSON Schema files from... - launch-pipeline Create the symbolic links for the samples which... + download Download files located in sftp server. + read-lab-metadata Create the json compliant to the relecov schema... + validate Validate json file against schema. + map Convert data between phage plus schema to ENA,... + upload-to-ena parse data to create xml files to upload to ena + upload-to-gisaid parsed data to create files to upload to gisaid + update-db upload the information included in json file to... + read-bioinfo-metadata Create the json compliant from the Bioinfo... + metadata-homogeneizer Parse institution metadata lab to the one used... + pipeline-manager Create the symbolic links for the samples which... + wrapper Execute download, read-lab-metadata and validate... + build-schema Generates and updates JSON Schema files from... + logs-to-excel Creates a merged xlsx report from all the log... ``` #### download The command `download` connects to a transfer protocol (currently sftp) and downloads all files in the different available folders in the passed credentials. In addition, it checks if the files in the current folder match the files in the metadata file and also checks if there are md5sum for each file. Else, it creates one before storing in the final repository. @@ -247,10 +251,10 @@ Usage: relecov-tools upload-to-gisaid [OPTIONS] -t, --type Select the type of information to upload to database [sample,bioinfodata,variantdata] -d, --databaseServer Name of the database server receiving the data [iskylims,relecov] -#### launch-pipeline +#### pipeline-manager Create the folder structure to execute the given pipeline for the latest sample batches after executing download, read-lab-metadata and validate modules. This module will create symbolic links for each sample and generate the necessary files for pipeline execution using the information from validated_BATCH-NAME_DATE.json. ``` -Usage: relecov-tools launch-pipeline [OPTIONS] +Usage: relecov-tools pipeline-manager [OPTIONS] Create the symbolic links for the samples which are validated to prepare for bioinformatics pipeline execution. @@ -263,6 +267,19 @@ Options: --help Show this message and exit. ``` +#### wrapper +Execute download, read-lab-metadata and validate sequentially using a config file to fill the arguments for each one. It also creates a global report with all the logs for the three processes in a user-friendly .xlsx format. The config file should include the name of each module that is executed, along with the necessary parameters in YAML format. +``` +Usage: relecov-tools wrapper [OPTIONS] + + Executes the modules in config file sequentially + +Options: + -c, --config_file PATH Path to config file in yaml format [required] + -o, --output_folder PATH Path to folder where global results are saved [required] + --help Show this message and exit. +``` + #### logs-to-excel Creates an xlsx file with all the entries found for a specified laboratory in a given set of log_summary.json files (from log-summary module). The laboratory name must match the name of one of the keys in the provided logs to work. ``` From 190253f8c705905b303baa6603a4a2d085281d46 Mon Sep 17 00:00:00 2001 From: Shettland Date: Wed, 9 Oct 2024 15:09:59 +0200 Subject: [PATCH 71/83] Changed launch-pipeline for pipeline-manager for cli --- relecov_tools/__main__.py | 4 ++-- relecov_tools/pipeline_manager.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/relecov_tools/__main__.py b/relecov_tools/__main__.py index 77cf1ef7..0ef86437 100755 --- a/relecov_tools/__main__.py +++ b/relecov_tools/__main__.py @@ -477,12 +477,12 @@ def metadata_homogeneizer(institution, directory, output): help="select the template config file", ) @click.option("-o", "--output", type=click.Path(), help="select output folder") -def launch_pipeline(input, template, output, config): +def pipeline_manager(input, template, output, config): """ Create the symbolic links for the samples which are validated to prepare for bioinformatics pipeline execution. """ - new_launch = relecov_tools.pipeline_manager.LaunchPipeline( + new_launch = relecov_tools.pipeline_manager.PipelineManager( input, template, output, config ) new_launch.pipeline_exc() diff --git a/relecov_tools/pipeline_manager.py b/relecov_tools/pipeline_manager.py index 318b037d..8c18547e 100644 --- a/relecov_tools/pipeline_manager.py +++ b/relecov_tools/pipeline_manager.py @@ -19,7 +19,7 @@ ) -class LaunchPipeline: +class PipelineManager: def __init__( self, input_folder=None, From c4a87eaeac09046dffc214d633f6c4c7284f28de Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 10 Oct 2024 17:20:12 +0200 Subject: [PATCH 72/83] Now samples_data.json is created if not given as input --- relecov_tools/read_lab_metadata.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/relecov_tools/read_lab_metadata.py b/relecov_tools/read_lab_metadata.py index 1aa27352..8e7701f1 100755 --- a/relecov_tools/read_lab_metadata.py +++ b/relecov_tools/read_lab_metadata.py @@ -77,7 +77,7 @@ def __init__(self, metadata_file=None, sample_list_file=None, output_folder=None "[orange]Property " + prop + " does not have 'label' attribute" ) continue - + self.date = dtime.now().strftime("%Y%m%d%H%M%S") self.json_req_files = config_json.get_topic_data( "lab_metadata", "lab_metadata_req_json" ) @@ -119,6 +119,8 @@ def safely_calculate_md5(file): ) else: md5_dict = {} + log.warning("No md5sum file found.") + log.warning("Generating new md5 hashes. This might take a while...") j_data = {} no_fastq_error = "No R1 fastq was given for sample %s" for sample in clean_metadata_rows: @@ -134,6 +136,7 @@ def safely_calculate_md5(file): continue r1_md5 = md5_dict.get(r1_file) r2_md5 = md5_dict.get(r2_file) + files_dict["sequence_file_R1_fastq"] = r1_file files_dict["r1_fastq_filepath"] = dir_path if r1_md5: files_dict["fastq_r1_md5"] = r1_md5 @@ -142,6 +145,7 @@ def safely_calculate_md5(file): os.path.join(dir_path, r1_file) ) if r2_file: + files_dict["sequence_file_R2_fastq"] = r2_file files_dict["r2_fastq_filepath"] = dir_path if r2_md5: files_dict["fastq_r2_md5"] = r2_md5 @@ -150,6 +154,12 @@ def safely_calculate_md5(file): os.path.join(dir_path, r2_file) ) j_data[str(sample.get("sequencing_sample_id"))] = files_dict + try: + filename = "_".join(["samples_data", self.lab_code, self.date + ".json"]) + file_path = os.path.join(self.output_folder, filename) + relecov_tools.utils.write_json_fo_file(j_data, file_path) + except Exception: + log.error("Could not output samples_data.json file to output folder") return j_data def match_to_json(self, valid_metadata_rows): @@ -450,7 +460,7 @@ def create_metadata_json(self): stderr.print("Metadata was completely empty. No output file generated") sys.exit(1) file_code = "lab_metadata_" + self.lab_code + "_" - file_name = file_code + dtime.now().strftime("%Y%m%d%H%M%S") + ".json" + file_name = file_code + self.date + ".json" stderr.print("[blue]Writting output json file") os.makedirs(self.output_folder, exist_ok=True) self.logsum.create_error_summary(called_module="read-lab-metadata") From c7183fbc96892a2d151e8f7faae916d401de8da5 Mon Sep 17 00:00:00 2001 From: Shettland Date: Thu, 10 Oct 2024 18:10:08 +0200 Subject: [PATCH 73/83] Better logging in wrapper --- relecov_tools/dataprocess_wrapper.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/relecov_tools/dataprocess_wrapper.py b/relecov_tools/dataprocess_wrapper.py index 42877ccd..5d34104c 100644 --- a/relecov_tools/dataprocess_wrapper.py +++ b/relecov_tools/dataprocess_wrapper.py @@ -261,11 +261,15 @@ def run_wrapper(self): stderr.print("[red]No valid folders found to process") sys.exit(1) for key, folder_logs in download_logs.items(): + log.info(f"Processing folder {key}") folder = folder_logs.get("path") if not folder: + log.error(f"Skipped folder {key}. Logs do not include path field") continue if not folder_logs.get("valid"): + log.error(f"Folder {key} is set as invalid in logs. Skipped.") continue + stderr.print(f"Processing folder {key} with local path: {folder}") try: merged_logs = self.process_folder(finished_folders, key, folder_logs) except (FileNotFoundError, ValueError) as e: From e3021f91795faceea9837e3f3f70945949526b58 Mon Sep 17 00:00:00 2001 From: Shettland Date: Fri, 11 Oct 2024 12:53:07 +0200 Subject: [PATCH 74/83] Handling rows without required sample_id --- relecov_tools/read_lab_metadata.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/relecov_tools/read_lab_metadata.py b/relecov_tools/read_lab_metadata.py index 8e7701f1..3285d473 100755 --- a/relecov_tools/read_lab_metadata.py +++ b/relecov_tools/read_lab_metadata.py @@ -37,7 +37,7 @@ def __init__(self, metadata_file=None, sample_list_file=None, output_folder=None sys.exit(1) if sample_list_file is None: - stderr.print("[Yellow]No samples_data.json file provided") + stderr.print("[yellow]No samples_data.json file provided") self.sample_list_file = sample_list_file if sample_list_file is not None and not os.path.exists(sample_list_file): @@ -376,8 +376,11 @@ def read_metadata_file(self): try: sample_id = str(row[sample_id_col]).strip() except KeyError: - log_text = f"Sample ID given for sequencing empty in row {row_number}" - log.error(log_text) + self.logsum.add_error(entry=f"No {sample_id_col} found in excel file") + continue + if not row[sample_id_col] or "Not Provided" in sample_id: + log_text = f"{sample_id_col} not provided in row {row_number}. Skipped" + self.logsum.add_warning(entry=log_text) stderr.print(f"[red]{log_text}") continue for key in row.keys(): @@ -443,9 +446,8 @@ def create_metadata_json(self): clean_metadata_rows, missing_samples = self.match_to_json(valid_metadata_rows) if missing_samples: num_miss = len(missing_samples) - log.warning( - "%s samples from metadata were not found: %s", num_miss, missing_samples - ) + logtxt = "%s samples from metadata were not found: %s" % (num_miss, missing_samples) + self.logsum.add_warning(entry=logtxt) stderr.print(f"[yellow]{num_miss} samples missing:\n{missing_samples}") # Continue by adding extra information stderr.print("[blue]Including additional information") From 539dd2ccb15e90fc7ce3789b8eba7b5e1b30fd8e Mon Sep 17 00:00:00 2001 From: Shettland Date: Fri, 11 Oct 2024 12:54:55 +0200 Subject: [PATCH 75/83] Better logging for missing sample id --- relecov_tools/download_manager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/relecov_tools/download_manager.py b/relecov_tools/download_manager.py index 3c612791..17a13b1e 100755 --- a/relecov_tools/download_manager.py +++ b/relecov_tools/download_manager.py @@ -418,7 +418,8 @@ def get_sample_fastq_file_names(self, local_folder, meta_f_path): stderr.print(f"[red]{str(log_text % s_name)}") self.include_error(entry=str(log_text % s_name), sample=s_name) else: - self.include_warning(entry=f"Row {counter} skipped. No sample ID given") + txt = f"Row {counter} in metadata skipped.No sequencing sample ID given" + self.include_warning(entry=txt) # Remove duplicated files clean_sample_dict = self.remove_duplicated_values(sample_file_dict) return clean_sample_dict From 91846d15d7ad2ad4a3c5865cc7ce27e35c1768d2 Mon Sep 17 00:00:00 2001 From: Shettland Date: Fri, 11 Oct 2024 12:58:34 +0200 Subject: [PATCH 76/83] Better logging for wrapper --- relecov_tools/dataprocess_wrapper.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/relecov_tools/dataprocess_wrapper.py b/relecov_tools/dataprocess_wrapper.py index 5d34104c..4ba3e262 100644 --- a/relecov_tools/dataprocess_wrapper.py +++ b/relecov_tools/dataprocess_wrapper.py @@ -260,8 +260,9 @@ def run_wrapper(self): if not finished_folders: stderr.print("[red]No valid folders found to process") sys.exit(1) + stderr.print(f"[blue]Processing {len(finished_folders)} downloaded folders...") + counter = 0 for key, folder_logs in download_logs.items(): - log.info(f"Processing folder {key}") folder = folder_logs.get("path") if not folder: log.error(f"Skipped folder {key}. Logs do not include path field") @@ -269,7 +270,10 @@ def run_wrapper(self): if not folder_logs.get("valid"): log.error(f"Folder {key} is set as invalid in logs. Skipped.") continue - stderr.print(f"Processing folder {key} with local path: {folder}") + counter += 1 + logtxt = "Processing folder %s/%s: %s with local path %s" + log.info(logtxt % (counter, str(len(finished_folders)), key, folder)) + stderr.print(logtxt % (counter, str(len(finished_folders)), key, folder)) try: merged_logs = self.process_folder(finished_folders, key, folder_logs) except (FileNotFoundError, ValueError) as e: From 646183086e317998ed5c09deaffd2bc69c584063 Mon Sep 17 00:00:00 2001 From: Shettland Date: Fri, 11 Oct 2024 14:04:06 +0200 Subject: [PATCH 77/83] Better logging missing samples. Linting --- relecov_tools/read_lab_metadata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/relecov_tools/read_lab_metadata.py b/relecov_tools/read_lab_metadata.py index 3285d473..13e072c8 100755 --- a/relecov_tools/read_lab_metadata.py +++ b/relecov_tools/read_lab_metadata.py @@ -446,8 +446,8 @@ def create_metadata_json(self): clean_metadata_rows, missing_samples = self.match_to_json(valid_metadata_rows) if missing_samples: num_miss = len(missing_samples) - logtxt = "%s samples from metadata were not found: %s" % (num_miss, missing_samples) - self.logsum.add_warning(entry=logtxt) + logtx = "%s samples not found in metadata: %s" % (num_miss, missing_samples) + self.logsum.add_warning(entry=logtx) stderr.print(f"[yellow]{num_miss} samples missing:\n{missing_samples}") # Continue by adding extra information stderr.print("[blue]Including additional information") From 94e619eee1af9680c0f38a1e3811c6d856af605c Mon Sep 17 00:00:00 2001 From: Shettland Date: Fri, 11 Oct 2024 14:04:50 +0200 Subject: [PATCH 78/83] Updated pipeline manager fields --- relecov_tools/conf/configuration.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/relecov_tools/conf/configuration.json b/relecov_tools/conf/configuration.json index af2081e4..d539d19f 100755 --- a/relecov_tools/conf/configuration.json +++ b/relecov_tools/conf/configuration.json @@ -432,8 +432,9 @@ ] } }, - "launch_pipeline": { - "analysis_name": "RELECOV_icasas_C", + "pipeline_manager": { + "analysis_group": "RLV", + "analysis_user": "icasas_C", "doc_folder": "DOC", "analysis_folder": "ANALYSIS", "sample_stored_folder": "RAW", From a8e107dbed0fc7577216f5bb68dac8d0d9bb8b4f Mon Sep 17 00:00:00 2001 From: Shettland Date: Fri, 11 Oct 2024 14:12:26 +0200 Subject: [PATCH 79/83] Now splits data into N folders based on enrichment_panel found in samples --- relecov_tools/pipeline_manager.py | 331 ++++++++++++++++++------------ 1 file changed, 195 insertions(+), 136 deletions(-) diff --git a/relecov_tools/pipeline_manager.py b/relecov_tools/pipeline_manager.py index 8c18547e..b78b8477 100644 --- a/relecov_tools/pipeline_manager.py +++ b/relecov_tools/pipeline_manager.py @@ -5,6 +5,7 @@ import re import shutil import sys +import re from collections import Counter import rich.console @@ -27,7 +28,7 @@ def __init__( output_folder=None, pipeline_conf_file=None, ): - current_date = datetime.date.today().strftime("%Y%m%d") + self.current_date = datetime.date.today().strftime("%Y%m%d") if input_folder is None: self.input_folder = relecov_tools.utils.prompt_path( msg="Select the folder which contains the fastq file of samples" @@ -62,23 +63,22 @@ def __init__( sys.exit(1) conf_settings = relecov_tools.utils.read_json_file(pipeline_conf_file) try: - data = conf_settings["launch_pipeline"] - # get_topic_data("launch_pipeline", "analysis_name") + config_data = conf_settings["pipeline_manager"] except KeyError: log.error("Invalid pipeline config file %s ", pipeline_conf_file) stderr.print("[red] Invalid pipeline config file " + pipeline_conf_file) if ( - "analysis_name" not in data - or "sample_stored_folder" not in data - or "sample_link_folder" not in data - or "doc_folder" not in data + "analysis_user" not in config_data + or "analysis_group" not in config_data + or "analysis_folder" not in config_data + or "sample_stored_folder" not in config_data + or "sample_link_folder" not in config_data + or "doc_folder" not in config_data ): - log.error("Invalid pipeline config file %s ", self.pipeline_conf_file) - stderr.print( - "[red] Invalid pipeline config file " + self.pipeline_conf_file - ) + log.error("Invalid pipeline config file %s ", pipeline_conf_file) + stderr.print("[red] Invalid pipeline config file " + pipeline_conf_file) sys.exit(1) - + self.config_fata = config_data if output_folder is None: output_folder = relecov_tools.utils.prompt_path( msg="Select the output folder" @@ -92,24 +92,12 @@ def __init__( sys.exit(1) # Update the output folder with the current date and analysis name - self.output_folder = os.path.join( - output_folder, current_date + "_" + data["analysis_name"] - ) - if os.path.exists(self.output_folder): - msg = "Analysis folder already exists and it will be deleted. Do you want to continue? Y/N" - confirmation = relecov_tools.utils.prompt_yn_question(msg) - if confirmation is False: - sys.exit(1) - shutil.rmtree(self.output_folder) - - self.analysis_folder = os.path.join(self.output_folder, data["analysis_folder"]) - self.copied_sample_folder = os.path.join( - self.output_folder, data["sample_stored_folder"] - ) - self.linked_sample_folder = os.path.join( - self.analysis_folder, data["sample_link_folder"] - ) - self.doc_folder = data["doc_folder"] + self.output_folder = output_folder + self.out_folder_namevar = f"{self.current_date}_{config_data['analysis_group']}_%s_{config_data['analysis_user']}" + self.analysis_folder = config_data["analysis_folder"] + self.copied_sample_folder = config_data["sample_stored_folder"] + self.linked_sample_folder = config_data["sample_link_folder"] + self.doc_folder = config_data["doc_folder"] def join_valid_items(self): """Join validated metadata for the latest batches downloaded @@ -175,14 +163,13 @@ def get_latest_lab_folder(self): return lab_latest_folders, latest_date upload_lab_folders, latest_date = get_latest_lab_folder(self) - samples_data = [] join_validate = list() for lab, data_folder in upload_lab_folders.items(): lab_code = lab.split("/")[-1] log.info("Collecting samples for %s", lab_code) stderr.print("[blue] Collecting samples for ", lab_code) # check if laboratory folder is the latest date to process - if data_folder["date"] != latest_date: + if data_folder["date"] != datetime.date(2024, 9, 30): # latest_date: continue # fetch the validate file and get sample id and r1 and r2 file path validate_files = [ @@ -197,146 +184,218 @@ def get_latest_lab_folder(self): with open(validate_file_path) as fh: data = json.load(fh) join_validate.extend(data) - for item in data: - sample = {} - sample["sequencing_sample_id"] = item["sequencing_sample_id"] - sample["r1_fastq_filepath"] = os.path.join( - item["r1_fastq_filepath"], item["sequence_file_R1_fastq"] - ) - if "r2_fastq_filepath" in item: - sample["r2_fastq_filepath"] = os.path.join( - item["r2_fastq_filepath"], item["sequence_file_R2_fastq"] - ) - samples_data.append(sample) - - return samples_data, join_validate - - def pipeline_exc(self): - """Prepare folder for analysis in HPC - Copies template selected as input - Copies RAW data with sequencing id as fastq file names - Creates samples_id.txt - - Args: - - Returns: - - """ - - # copy template folder and subfolders in output folder - shutil.copytree(self.template, self.output_folder) - # create the 00_reads folder - os.makedirs(self.linked_sample_folder, exist_ok=True) - # collect json with all validated samples - samples_data, join_validate = self.join_valid_items() - - # Check for possible duplicates - # Extract the sequencing_sample_id from the list of dictionaries - sample_ids = [item["sequencing_sample_id"] for item in samples_data] - - # Use Counter to count the occurrences of each sequencing_sample_id - id_counts = Counter(sample_ids) - - # Find the sequencing_sample_id values that are duplicated (count > 1) - duplicates = [sample_id for sample_id, count in id_counts.items() if count > 1] - - if duplicates: - log.error(f"There are duplicated samples in your batch: {duplicates}") - stderr.print( - f"[red] There are duplicated samples in your batch: {duplicates}. Please handle manually" - ) - sys.exit() - - # iterate over the sample_data to copy the fastq files in the output folder - file_errors = [] - samp_errors = [] - copied_samples = 0 - if len(samples_data) == 0: - stderr.print("[yellow] No samples were found. Deleting analysis folder") - shutil.rmtree(self.analysis_folder) - sys.exit(0) - log.info("Samples to copy %s", len(samples_data)) + log.info("Found a total of %s samples", str(len(join_validate))) + stderr.print(f"Found a total of {len(join_validate)} samples") + return join_validate, latest_date + + def copy_process(self, samples_data, output_folder): + samp_errors = {} + links_folder = os.path.join( + output_folder, self.analysis_folder, self.linked_sample_folder + ) + os.makedirs(links_folder, exist_ok=True) for sample in samples_data: + sample_id = sample["sequencing_sample_id"] # fetch the file extension ext_found = re.match(r".*(fastq.*|bam)", sample["r1_fastq_filepath"]) + if not ext_found: + log.error("No valid file extension found for %s", sample_id) + samp_errors[sample_id].append(sample["r1_fastq_filepath"]) + continue ext = ext_found.group(1) - sequencing_r1_sample_id = sample["sequencing_sample_id"] + "_R1." + ext - # copy r1 sequencing file into the output folder + seq_r1_sample_id = sample["sequencing_sample_id"] + "_R1." + ext + # copy r1 sequencing file into the output folder self.analysis_folder sample_raw_r1 = os.path.join( - self.analysis_folder, self.copied_sample_folder, sequencing_r1_sample_id + output_folder, self.copied_sample_folder, seq_r1_sample_id ) log.info("Copying sample %s", sample) stderr.print("[blue] Copying sample: ", sample["sequencing_sample_id"]) try: shutil.copy(sample["r1_fastq_filepath"], sample_raw_r1) # create simlink for the r1 - r1_link_path = os.path.join( - self.linked_sample_folder, sequencing_r1_sample_id - ) - r1_link_path_ori = os.path.join("../../RAW", sequencing_r1_sample_id) + r1_link_path = os.path.join(links_folder, seq_r1_sample_id) + r1_link_path_ori = os.path.join("../../RAW", seq_r1_sample_id) os.symlink(r1_link_path_ori, r1_link_path) except FileNotFoundError as e: log.error("File not found %s", e) - file_errors.append(sample["r1_fastq_filepath"]) + samp_errors[sample_id] = [] + samp_errors[sample_id].append(sample["r1_fastq_filepath"]) if "r2_fastq_filepath" in sample: - file_errors.append(sample["r2_fastq_filepath"]) - samp_errors.append(sample["sequencing_sample_id"]) + samp_errors[sample_id].append(sample["r2_fastq_filepath"]) continue - copied_samples += 1 # check if there is a r2 file if "r2_fastq_filepath" in sample: - sequencing_r2_sample_id = sample["sequencing_sample_id"] + "_R2." + ext + seq_r2_sample_id = sample["sequencing_sample_id"] + "_R2." + ext sample_raw_r2 = os.path.join( - self.analysis_folder, + output_folder, self.copied_sample_folder, - sequencing_r2_sample_id, + seq_r2_sample_id, ) - try: shutil.copy(sample["r2_fastq_filepath"], sample_raw_r2) - r2_link_path = os.path.join( - self.linked_sample_folder, sequencing_r2_sample_id - ) - r2_link_path_ori = os.path.join( - "../../RAW", sequencing_r2_sample_id - ) + r2_link_path = os.path.join(links_folder, seq_r2_sample_id) + r2_link_path_ori = os.path.join("../../RAW", seq_r2_sample_id) os.symlink(r2_link_path_ori, r2_link_path) except FileNotFoundError as e: log.error("File not found %s", e) - file_errors.append(sample["r2_fastq_filepath"]) - samp_errors.append(sample["sequencing_sample_id"]) + if not samp_errors.get(sample_id): + samp_errors[sample_id] = [] + samp_errors[sample_id].append(sample["r2_fastq_filepath"]) continue if len(samp_errors) > 0: stderr.print( "[red]Some files were not found. Unable to copy files from", "[red]" + str(len(samp_errors)) + " samples", ) - msg = "Do you want to delete analysis folder? Y/N" + msg = f"Do you want to delete analysis folder {output_folder}? Y/N" confirmation = relecov_tools.utils.prompt_yn_question(msg) if confirmation: - shutil.rmtree(self.output_folder) - sys.exit(1) + shutil.rmtree(output_folder) + return samp_errors - final_valid_samples = [ - x for x in join_validate if x.get("sequencing_sample_id") not in samp_errors - ] - sample_ids = [i for i in sample_ids if i not in samp_errors] - # print samples_id file - stderr.print(f"[blue]Generating sample_id.txt file in {self.analysis_folder}") - with open(os.path.join(self.analysis_folder, "samples_id.txt"), "w") as f: - for sample_id in sample_ids: - f.write(f"{sample_id}\n") + def create_samples_data(self, json_data): + samples_data = [] + for item in json_data: + sample = {} + sample["sequencing_sample_id"] = item["sequencing_sample_id"] + sample["r1_fastq_filepath"] = os.path.join( + item["r1_fastq_filepath"], item["sequence_file_R1_fastq"] + ) + if "r2_fastq_filepath" in item: + sample["r2_fastq_filepath"] = os.path.join( + item["r2_fastq_filepath"], item["sequence_file_R2_fastq"] + ) + samples_data.append(sample) + return samples_data - date_and_time = datetime.datetime.today().strftime("%Y%m%d%-H%M%S") - json_filename = os.path.join( - self.output_folder, - self.doc_folder, - f"{date_and_time}_validate_batch.json", - ) - relecov_tools.utils.write_json_fo_file(final_valid_samples, json_filename) - stderr.print("[green] Samples copied: ", copied_samples) - log.info("[blue]Successfully created pipeline folder. Ready to launch ") - stderr.print("[blue]Successfully created pipeline folder. Ready to launch") + def split_data_by_key(self, json_data, keylist): + """Split a given json data into different lists based on a given list of keys. + From a single list of samples (dicts), the output will now be a list of lists + where each new list is a subset of the original samples with the same values + for the given list of keys + + Args: + json_data (list(dict)): List of dictionaries, one for each sample + keylist (list(str)): List of keys within the given dictionaries to + split data. + + Returns: + + """ + if not keylist: + return [json_data] + + json_split_by_key = {} + new_key = keylist[0] + next_keys = keylist[1:] + + json_uniq_vals = frozenset([x.get(new_key) for x in json_data]) + for val in json_uniq_vals: + grouped_samples = [x for x in json_data if x.get(new_key) == val] + json_split_by_key[val] = grouped_samples + + list_of_jsons_by_key = [] + for group in json_split_by_key.values(): + list_of_jsons_by_key.extend(self.split_data_by_key(group, next_keys)) + return list_of_jsons_by_key + + def pipeline_exc(self): + """Prepare folder for analysis in HPC + Copies template selected as input + Copies RAW data with sequencing id as fastq file names + Creates samples_id.txt + + Args: + + Returns: + + """ + # collect json with all validated samples + join_validate, latest_date = self.join_valid_items() + if len(join_validate) == 0: + stderr.print(f"[yellow]No samples were found. Aborting") + sys.exit(0) + keys_to_split = ["host_gender", "enrichment_panel_version"] + stderr.print(f"[blue]Splitting samples based on {keys_to_split}...") + json_split_by_panel = self.split_data_by_key(join_validate, keys_to_split) + stderr.print(f"[blue]Data splitted into {len(json_split_by_panel)} groups") + # iterate over the sample_data to copy the fastq files in the output folder + global_samp_errors = {} + for idx, list_of_samples in enumerate(json_split_by_panel, start=1): + group_tag = f"{latest_date}_PANEL{idx:02d}" + group_outfolder = os.path.join( + self.output_folder, self.out_folder_namevar % group_tag + ) + if os.path.exists(group_outfolder): + msg = f"Analysis folder {group_outfolder} already exists and it will be deleted. Do you want to continue? Y/N" + confirmation = relecov_tools.utils.prompt_yn_question(msg) + if confirmation is False: + continue + shutil.rmtree(group_outfolder) + samples_data = self.create_samples_data(list_of_samples) + # Create a folder for the group of samples and copy the files there + log.info("Creating folder for group %s", group_tag) + stderr.print(f"[blue]Creating folder for group {group_tag}") + # copy template folder and subfolders in output folder + shutil.copytree(self.template, group_outfolder) + # Check for possible duplicates + log.info("Samples to copy %s", len(samples_data)) + # Extract the sequencing_sample_id from the list of dictionaries + sample_ids = [item["sequencing_sample_id"] for item in samples_data] + # Use Counter to count the occurrences of each sequencing_sample_id + id_counts = Counter(sample_ids) + # Find the sequencing_sample_id values that are duplicated (count > 1) + duplicates = [ + sample_id for sample_id, count in id_counts.items() if count > 1 + ] + if duplicates: + log.error( + "There are duplicated samples in group %s: %s" + % ({group_tag}, {duplicates}) + ) + stderr.print( + f"[red] There are duplicated samples in group {group_tag}: {duplicates}. Please handle manually" + ) + continue + + samp_errors = self.copy_process(samples_data, group_outfolder) + global_samp_errors[group_tag] = samp_errors + samples_copied = len(list_of_samples) - len(samp_errors) + stderr.print( + f"[green]Group {group_tag}: {samples_copied} samples copied out of {len(list_of_samples)}" + ) + final_valid_samples = [ + x + for x in join_validate + if x.get("sequencing_sample_id") not in samp_errors + ] + sample_ids = [i for i in sample_ids if i not in samp_errors] + group_analysis_folder = os.path.join(group_outfolder, self.analysis_folder) + # print samples_id file + stderr.print( + f"[blue]Generating sample_id.txt file in {group_analysis_folder}" + ) + with open(os.path.join(group_analysis_folder, "samples_id.txt"), "w") as f: + for sample_id in sample_ids: + f.write(f"{sample_id}\n") + json_filename = os.path.join( + group_outfolder, + self.doc_folder, + f"{group_tag}_validate_batch.json", + ) + relecov_tools.utils.write_json_fo_file(final_valid_samples, json_filename) + log.info("[blue]Successfully created pipeline folder. Ready to launch") + stderr.print( + f"[blue]Successfully created folder for {group_tag}. Ready to launch" + ) + for group, samples in global_samp_errors.items(): + if not samples: + continue + log.error("Group %s received error for samples: %s" % (group, samples)) + else: + stderr.print("[green]All samples were copied successfully!!") + log.info("Finished execution") + stderr.print("Finished execution") return From 2c7e080312a993d7d685d6eb4f8065dc2f2497e7 Mon Sep 17 00:00:00 2001 From: Shettland Date: Fri, 11 Oct 2024 14:37:56 +0200 Subject: [PATCH 80/83] Now splits data based on enrichment_panel. Linting --- relecov_tools/pipeline_manager.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/relecov_tools/pipeline_manager.py b/relecov_tools/pipeline_manager.py index b78b8477..f69ba20b 100644 --- a/relecov_tools/pipeline_manager.py +++ b/relecov_tools/pipeline_manager.py @@ -5,7 +5,6 @@ import re import shutil import sys -import re from collections import Counter import rich.console @@ -313,7 +312,7 @@ def pipeline_exc(self): # collect json with all validated samples join_validate, latest_date = self.join_valid_items() if len(join_validate) == 0: - stderr.print(f"[yellow]No samples were found. Aborting") + stderr.print("[yellow]No samples were found. Aborting") sys.exit(0) keys_to_split = ["host_gender", "enrichment_panel_version"] stderr.print(f"[blue]Splitting samples based on {keys_to_split}...") From 0df5848eea31eca1a73b494e7c2fcd0f791d2888 Mon Sep 17 00:00:00 2001 From: Shettland Date: Fri, 11 Oct 2024 14:51:23 +0200 Subject: [PATCH 81/83] Updated CHANGELOG.md pre-release 1.2.0 --- CHANGELOG.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d71fb328..fd20a0a1 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.2.0] - 2024-09-0X : https://github.com/BU-ISCIII/relecov-tools/releases/tag/1.2.0 +## [1.2.0] - 2024-10-11 : https://github.com/BU-ISCIII/relecov-tools/releases/tag/1.2.0 ### Credits @@ -16,7 +16,8 @@ Code contributions to the release: ### Modules -- Included wrapper module to launch download, read-lab-metadata and validate processes sequentially +- Included wrapper module to launch download, read-lab-metadata and validate processes sequentially [#322](https://github.com/BU-ISCIII/relecov-tools/pull/322) +- Changed launch-pipeline name for pipeline-manager when tools are used via CLI [#324](https://github.com/BU-ISCIII/relecov-tools/pull/324) #### Added enhancements @@ -29,11 +30,18 @@ Code contributions to the release: - More accurate cleaning process, skipping only sequencing files instead of whole folder [#321](https://github.com/BU-ISCIII/relecov-tools/pull/321) - Now single logs summaries are also created for each folder during download [#321](https://github.com/BU-ISCIII/relecov-tools/pull/321) - Introduced handling for missing/dup files and more accurate information in prompt for pipeline_manager [#321](https://github.com/BU-ISCIII/relecov-tools/pull/321) +- Included excel resize, brackets removal in messages and handled exceptions in log_summary.py [#322](https://github.com/BU-ISCIII/relecov-tools/pull/322) +- Included processed batchs and samples in read-bioinfo-metadata log summary [#324](https://github.com/BU-ISCIII/relecov-tools/pull/324) +- When no samples_data.json is given, read-lab-metadata now creates a new one [#324](https://github.com/BU-ISCIII/relecov-tools/pull/324) +- Handling for missing sample ids in read-lab-metadata [#324](https://github.com/BU-ISCIII/relecov-tools/pull/324) +- Better logging for download, read-lab-metadata and wrapper [#324](https://github.com/BU-ISCIII/relecov-tools/pull/324) #### Fixes - Fixed wrong city name in relecov_tools/conf/laboratory_address.json [#320](https://github.com/BU-ISCIII/relecov-tools/pull/320) - Fixed wrong single-paired layout detection in metadata due to Capital letters [#321](https://github.com/BU-ISCIII/relecov-tools/pull/321) +- Error handling in merge_logs() and create_logs_excel() methods for log_summary.py [#322](https://github.com/BU-ISCIII/relecov-tools/pull/322) +- Included handling of multiple empty rows in metadata xlsx file [#322](https://github.com/BU-ISCIII/relecov-tools/pull/322) #### Changed @@ -44,6 +52,9 @@ Code contributions to the release: - Moved concurrency to whole workflow instead of each step in test_sftp-handle.yml [#320](https://github.com/BU-ISCIII/relecov-tools/pull/320) - Updated test_sftp-handle.yml testing datasets [#320](https://github.com/BU-ISCIII/relecov-tools/pull/320) - Now download skips folders containing "invalid_samples" in its name [#321](https://github.com/BU-ISCIII/relecov-tools/pull/321) +- read-lab-metadata: Some warnings now include label. Also removed trailing spaces [#322](https://github.com/BU-ISCIII/relecov-tools/pull/322) +- Renamed launch-pipeline for pipeline-manager and updated keys in configuration.json [#324](https://github.com/BU-ISCIII/relecov-tools/pull/324) +- Pipeline manager now splits data based on enrichment_panel and version. One folder for each group [#324](https://github.com/BU-ISCIII/relecov-tools/pull/324) #### Removed From 8f099b6b39ddba7dde31562652e1beee9c1d9556 Mon Sep 17 00:00:00 2001 From: Shettland Date: Fri, 11 Oct 2024 16:04:35 +0200 Subject: [PATCH 82/83] Moved delete folder prompt. Included docstrings --- relecov_tools/pipeline_manager.py | 61 ++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/relecov_tools/pipeline_manager.py b/relecov_tools/pipeline_manager.py index f69ba20b..8256dfa3 100644 --- a/relecov_tools/pipeline_manager.py +++ b/relecov_tools/pipeline_manager.py @@ -99,19 +99,14 @@ def __init__( self.doc_folder = config_data["doc_folder"] def join_valid_items(self): - """Join validated metadata for the latest batches downloaded + """Join validated metadata for the latest batches downloaded into a single one Args: Returns: - sample_data: list(dict) - [ - { - "sequencing_sample_id":XXXX, - "r1_fastq_filepath": XXXX, - "r2_fastq_filepath":XXXX - } - ] + join_validate (list(dict)): List of dictionaries containing all the samples + found in each validated_lab_metadata.json form the scanned folders + latest_date (str): Latest batch date found in the scanned folder """ def get_latest_lab_folder(self): @@ -188,6 +183,18 @@ def get_latest_lab_folder(self): return join_validate, latest_date def copy_process(self, samples_data, output_folder): + """Copies all the necessary samples files in the given samples_data list + to the output folder. Also creates symbolic links into the link folder + given in config_file. + + Args: + samples_data (list(dict)): samples_data from self.create_samples_data() + output_folder (str): Destination folder to copy files + + Returns: + samp_errors (dict): Dictionary where keys are sequencing_sample_id and values + the files that received an error while trying to copy. + """ samp_errors = {} links_folder = os.path.join( output_folder, self.analysis_folder, self.linked_sample_folder @@ -241,18 +248,26 @@ def copy_process(self, samples_data, output_folder): samp_errors[sample_id] = [] samp_errors[sample_id].append(sample["r2_fastq_filepath"]) continue - if len(samp_errors) > 0: - stderr.print( - "[red]Some files were not found. Unable to copy files from", - "[red]" + str(len(samp_errors)) + " samples", - ) - msg = f"Do you want to delete analysis folder {output_folder}? Y/N" - confirmation = relecov_tools.utils.prompt_yn_question(msg) - if confirmation: - shutil.rmtree(output_folder) return samp_errors def create_samples_data(self, json_data): + """Creates a copy of the json_data but only with relevant keys to copy files. + Here 'r1_fastq_filepath' is created joining the original 'r1_fastq_filepath' + and 'sequence_file_R1_fastq' fields. The same goes for 'r2_fastq_filepath' + + Args: + json_data (list(dict)): Samples metadata in a list of dictionaries + + Returns: + sample_data: list(dict) + [ + { + "sequencing_sample_id":XXXX, + "r1_fastq_filepath": XXXX, + "r2_fastq_filepath":XXXX + } + ] + """ samples_data = [] for item in json_data: sample = {} @@ -358,6 +373,16 @@ def pipeline_exc(self): continue samp_errors = self.copy_process(samples_data, group_outfolder) + if len(samp_errors) > 0: + stderr.print( + f"[red]Unable to copy files from {len(samp_errors)} samples in group {group_tag}" + ) + msg = f"Do you want to delete analysis folder {group_outfolder}? Y/N" + confirmation = relecov_tools.utils.prompt_yn_question(msg) + if confirmation: + shutil.rmtree(group_outfolder) + log.info(f"Folder {group_outfolder} removed") + continue global_samp_errors[group_tag] = samp_errors samples_copied = len(list_of_samples) - len(samp_errors) stderr.print( From 6ef3a10832bbd87c172335622084b296879df3b6 Mon Sep 17 00:00:00 2001 From: Shettland Date: Fri, 11 Oct 2024 16:05:45 +0200 Subject: [PATCH 83/83] Removed temporary changes. More logging --- relecov_tools/pipeline_manager.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/relecov_tools/pipeline_manager.py b/relecov_tools/pipeline_manager.py index 8256dfa3..b1549db0 100644 --- a/relecov_tools/pipeline_manager.py +++ b/relecov_tools/pipeline_manager.py @@ -163,7 +163,7 @@ def get_latest_lab_folder(self): log.info("Collecting samples for %s", lab_code) stderr.print("[blue] Collecting samples for ", lab_code) # check if laboratory folder is the latest date to process - if data_folder["date"] != datetime.date(2024, 9, 30): # latest_date: + if data_folder["date"] != latest_date: continue # fetch the validate file and get sample id and r1 and r2 file path validate_files = [ @@ -326,10 +326,11 @@ def pipeline_exc(self): """ # collect json with all validated samples join_validate, latest_date = self.join_valid_items() + latest_date = str(latest_date).replace("-", "") if len(join_validate) == 0: stderr.print("[yellow]No samples were found. Aborting") sys.exit(0) - keys_to_split = ["host_gender", "enrichment_panel_version"] + keys_to_split = ["enrichment_panel", "enrichment_panel_version"] stderr.print(f"[blue]Splitting samples based on {keys_to_split}...") json_split_by_panel = self.split_data_by_key(join_validate, keys_to_split) stderr.print(f"[blue]Data splitted into {len(json_split_by_panel)} groups") @@ -337,6 +338,8 @@ def pipeline_exc(self): global_samp_errors = {} for idx, list_of_samples in enumerate(json_split_by_panel, start=1): group_tag = f"{latest_date}_PANEL{idx:02d}" + log.info("Processing group %s", group_tag) + stderr.print(f"[blue]Processing group {group_tag}...") group_outfolder = os.path.join( self.output_folder, self.out_folder_namevar % group_tag ) @@ -346,6 +349,7 @@ def pipeline_exc(self): if confirmation is False: continue shutil.rmtree(group_outfolder) + log.info(f"Folder {group_outfolder} removed") samples_data = self.create_samples_data(list_of_samples) # Create a folder for the group of samples and copy the files there log.info("Creating folder for group %s", group_tag) @@ -390,7 +394,7 @@ def pipeline_exc(self): ) final_valid_samples = [ x - for x in join_validate + for x in list_of_samples if x.get("sequencing_sample_id") not in samp_errors ] sample_ids = [i for i in sample_ids if i not in samp_errors] @@ -412,11 +416,11 @@ def pipeline_exc(self): stderr.print( f"[blue]Successfully created folder for {group_tag}. Ready to launch" ) - for group, samples in global_samp_errors.items(): - if not samples: - continue - log.error("Group %s received error for samples: %s" % (group, samples)) - else: + for group, samples in global_samp_errors.items(): + if not samples: + continue + log.error("Group %s received error for samples: %s" % (group, samples)) + if not any(v for v in global_samp_errors.values()): stderr.print("[green]All samples were copied successfully!!") log.info("Finished execution") stderr.print("Finished execution")