From 299cd032a9b64afafa11b596b69d5381d2c8498c Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Thu, 28 Sep 2023 21:17:18 +0300 Subject: [PATCH 01/51] Create file protein_tools.py --- protein_tools.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 protein_tools.py diff --git a/protein_tools.py b/protein_tools.py new file mode 100644 index 0000000..e69de29 From e5cae11352dd7919bb7f47ff9e0f4dc84f64099a Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Thu, 28 Sep 2023 23:31:06 +0300 Subject: [PATCH 02/51] Add main function --- protein_tools.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/protein_tools.py b/protein_tools.py index e69de29..586b4e3 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -0,0 +1,28 @@ +def main (*proteins, options = None): + proteins = list(proteins) + + operations = { + 'compare': compare, + 'length': count_length, + 'percentage ': count_percentage, + 'pattern': find_pattern, + '3Letter_name': rename_threeLetter_name, + 'plasmid_code': transform_to_plasmid_DNA_code + } + + if options == ('compare' or 'pattern' or '3L_name'): + result = operations[options](proteins[:-2], proteins[-2], proteins[-1]) + return (result) + elif options == ('3Letter_name'): + result = operations[options](proteins[:-1], proteins[-1]) + return (result) + elif options == ('length' or 'percentage' or 'plasmid_code'): + result = [] + for protein in proteins: + res = operations[options](protein) + result.append(res) + return (result) + else: + raise ValueError('Incorrect options input, please try again') + +main () From 8e0ed9be69b8f415e575bee84328ffeab7cb5aab Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Thu, 28 Sep 2023 23:36:02 +0300 Subject: [PATCH 03/51] Add optionds placeholder --- protein_tools.py | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/protein_tools.py b/protein_tools.py index 586b4e3..9bb1165 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -1,4 +1,28 @@ -def main (*proteins, options = None): +def compare (): + pass + + +def count_length(): + pass + + +def count_percentage(): + pass + + +def find_pattern(): + pass + + +def transform_to_DNA_code(): + pass + + +def rename_three_letter_name(): + pass + + +def main(*proteins, options = None): proteins = list(proteins) operations = { @@ -6,8 +30,8 @@ def main (*proteins, options = None): 'length': count_length, 'percentage ': count_percentage, 'pattern': find_pattern, - '3Letter_name': rename_threeLetter_name, - 'plasmid_code': transform_to_plasmid_DNA_code + '3Letter_name': rename_three_letter_name, + 'plasmid_code': transform_to_DNA_code } if options == ('compare' or 'pattern' or '3L_name'): From 3eede334049fb7d32c7a953441094f6459f45b66 Mon Sep 17 00:00:00 2001 From: zmitserbio <144448919+zmitserbio@users.noreply.github.com> Date: Fri, 29 Sep 2023 00:32:21 +0300 Subject: [PATCH 04/51] Add compare function --- protein_tools.py | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/protein_tools.py b/protein_tools.py index 9bb1165..22817f6 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -1,5 +1,23 @@ -def compare (): - pass +def compare(sequences: list, round_dec=3, percentages=False)->dict: +#""" +#Compare aminoacids between reference sequence and other sequences +#arguments: +# - sequences (list): reference sequence and other sequences for comparison +# - round_dec (int): a number of decimals to round the number to +# - percentages (bool): whether percentages are returned instead of fractions +#return: +# - comparisons (dict): dictionary with compared sequences as keys and percentages/fractions as their values +#""" + comparisons={} + for seq in range(1,len(sequences)): + comparison=[] + for j in range(0,len(sequences[seq])): + comparison.append(sequences[0][j]==sequences[seq][j]) + if percentages: + comparisons[sequences[seq]]=round(sum(comparison)*100/len(sequences[seq]),round_dec) + else: + comparisons[sequences[seq]]=round(sum(comparison)/len(sequences[seq]),round_dec) + return comparisons def count_length(): From 1bf4f432f5314d88120abbd1d2d699da13293cb3 Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Fri, 29 Sep 2023 00:42:15 +0300 Subject: [PATCH 05/51] Add function count_length for length option --- protein_tools.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/protein_tools.py b/protein_tools.py index 9bb1165..5032099 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -2,8 +2,14 @@ def compare (): pass -def count_length(): - pass +def count_length (protein: str) -> list: + """ + Сounting the length of an amino acid sequence/protein in the number of amino acids + :param protein: sequence of protein + :return: number of amino acids in an amino acid sequence/protein + """ + length_p = len(protein) + return length_p def count_percentage(): From f0255700a6772842e0845d4f3889716601f9f0ad Mon Sep 17 00:00:00 2001 From: zmitserbio <144448919+zmitserbio@users.noreply.github.com> Date: Fri, 29 Sep 2023 00:43:01 +0300 Subject: [PATCH 06/51] Correct if else structure for find_pattern function --- protein_tools.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/protein_tools.py b/protein_tools.py index 22817f6..f7835df 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -52,9 +52,12 @@ def main(*proteins, options = None): 'plasmid_code': transform_to_DNA_code } - if options == ('compare' or 'pattern' or '3L_name'): + if options == 'compare': result = operations[options](proteins[:-2], proteins[-2], proteins[-1]) return (result) + elif options == 'pattern': + result = operations[options](proteins[1:len(proteins)],proteins[0]) + return (result) elif options == ('3Letter_name'): result = operations[options](proteins[:-1], proteins[-1]) return (result) From 6917d986b42ea5f4572a6802d93d701be115411c Mon Sep 17 00:00:00 2001 From: zmitserbio <144448919+zmitserbio@users.noreply.github.com> Date: Fri, 29 Sep 2023 00:48:08 +0300 Subject: [PATCH 07/51] Add find_pattern and supporting compare_pattern functions --- protein_tools.py | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/protein_tools.py b/protein_tools.py index f7835df..f4d7ba0 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -28,8 +28,41 @@ def count_percentage(): pass -def find_pattern(): - pass +def compare_pattern(sequence: str, pattern: str)->bool: +#""" +#Compare a given pattern to a fragment of sequence of the same length +#arguments: +# - sequence (str): sequence fragment to compare with the pattern +# - pattern (str): pattern for comparison +#return: +# - (bool): whether pattern and fragment match +#""" + for i in range(0,len(sequence)): + if not sequence[i]==pattern[i]: + return False + break + return True + +def find_pattern(sequences: list, pattern: str)->dict: +#""" +#Find all non-overlaping instances of a given pattern in sequences +#arguments: +# - sequences (list): sequences to find the pattern in +# - pattern (str): pattern in question +#return +# - finds(dict): dictionary with sequences as keys and lists of indexes of patterns and the number of patterns as values +#""" + finds={} + for j in range(0, len(sequences)): + find=[] + for i in range(0, len(sequences[j])): + if compare_pattern(sequences[j][i:i+len(pattern)], pattern): + find.append(i) + i+=len(pattern) + else: + continue + finds[sequences[j]]=[len(find)]+find + return finds def transform_to_DNA_code(): From ad7bf5b5c61863d9eafcf445715028a5de0f5e7c Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Fri, 29 Sep 2023 00:51:21 +0300 Subject: [PATCH 08/51] Add function transform_to_DNA_code for plasmid_code --- protein_tools.py | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/protein_tools.py b/protein_tools.py index 5032099..17f1c06 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -21,7 +21,35 @@ def find_pattern(): def transform_to_DNA_code(): - pass + """ + Transforming of an amino acid sequence/protein to DNA sequence + :param protein: amino acid sequence of protein + :return: sequence of protein in the DNA sequence form + """ + retrnaslation_dict = { + 'F': 'TTC', 'f': 'ttc', + 'L': 'TTA', 'l': 'tta', + 'S': 'TCG', 's': 'tcg', + 'Y': 'TAC', 'y': 'tac', + 'C': 'TGC', 'c': 'tgc', + 'W': 'TGG', 'w': 'tgg', + 'P': 'CCC', 'p': 'ccc', + 'H': 'CAT', 'h': 'cat', + 'Q': 'GAA', 'q': 'gaa', + 'R': 'CGA', 'r': 'cga', + 'I': 'ATT', 'i': 'att', + 'M': 'ATG', 'm': 'atg', + 'T': 'ACC', 't': 'acc', + 'N': 'AAT', 'n': 'aat', + 'K': 'AAA', 'k': 'aaa', + 'V': 'GTT', 'v': 'gtt', + 'A': 'GCA', 'a': 'gca', + 'D': 'GAT', 'd': 'gca', + 'E': 'GAG', 'e': 'gag', + 'G': 'GGG', 'g': 'ggg' + } + + return ''.join([retrnaslation_dict[i] for i in protein]) def rename_three_letter_name(): From 843eb6833c8cf194b96d985384281ecb2376fc4a Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Fri, 29 Sep 2023 00:53:47 +0300 Subject: [PATCH 09/51] Change the key name plasmid_code to DNA_code --- protein_tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protein_tools.py b/protein_tools.py index 17f1c06..c66199b 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -65,7 +65,7 @@ def main(*proteins, options = None): 'percentage ': count_percentage, 'pattern': find_pattern, '3Letter_name': rename_three_letter_name, - 'plasmid_code': transform_to_DNA_code + 'DNA_code': transform_to_DNA_code } if options == ('compare' or 'pattern' or '3L_name'): From d2b05845286a97d10f0e7b4a3d123f31754e2460 Mon Sep 17 00:00:00 2001 From: Olga Bagrova Date: Fri, 29 Sep 2023 14:05:44 +0300 Subject: [PATCH 10/51] Add count_percentage function --- protein_tools.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/protein_tools.py b/protein_tools.py index d7bafdc..a2dea7c 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -20,7 +20,7 @@ def compare(sequences: list, round_dec=3, percentages=False)->dict: return comparisons -def count_length (protein: str) -> list: +def count_length(protein: str) -> list: """ Сounting the length of an amino acid sequence/protein in the number of amino acids :param protein: sequence of protein @@ -30,8 +30,24 @@ def count_length (protein: str) -> list: return length_p -def count_percentage(): - pass +def count_percentage(seq: str)->dict: + """ + Count percentage of each amino acid in sequence + arguments: + - seq (str): sequence for counting + return: + - dict: dictionary with counted percentage + """ + l = count_length(seq) + res = {} + for aa in seq: + if aa not in res: + res[aa] = 1 + else: + res[aa]+=1 + res.update((key, round(value/l*100, 2)) for key, value in res.items()) + res={key: value for key, value in sorted(res.items(), key=lambda item: item[1], reverse=True)} + return res def compare_pattern(sequence: str, pattern: str)->bool: From b7a67dcfca402b6a6453088ad9196c44c0210afd Mon Sep 17 00:00:00 2001 From: Olga Bagrova Date: Fri, 29 Sep 2023 14:07:45 +0300 Subject: [PATCH 11/51] Add rename_three_letter_name function --- protein_tools.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/protein_tools.py b/protein_tools.py index a2dea7c..d808b1f 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -119,8 +119,30 @@ def transform_to_DNA_code(): return ''.join([retrnaslation_dict[i] for i in protein]) -def rename_three_letter_name(): - pass +def rename_three_letter_name (*seqs: list, sep = '')->list: + """ + Transform into a three-letter amino acids entry. + arguments: + - seqs (list): list of sequences for transforming to three-letter entire + - sep (str): separator between aminoacids, default = '' + return: + - list: transformed sequences with separators + """ + res=[] + threel = {'A': 'ALA', 'R': 'ARG', 'N': 'ASN', 'D': "ASP", 'V': 'VAL', + 'H': 'HIS', 'G': "GLY", 'Q': "GLN", 'E': 'GLU', 'I': 'ILE', + 'L': 'LEU', 'K': 'LYS', 'M': 'MET', 'P': 'PRO', 'S': 'SER', + 'Y': 'TYR', 'T': 'THR', 'W': 'TRP', 'F': 'PHE', 'C': 'CYS', + 'a': 'ala', 'r': 'arg', 'n': 'asn', 'd': "asp", 'v': 'val', + 'h': 'his', 'g': "gly", 'q': "gln", 'e': 'glu', 'i': 'ile', + 'l': 'leu', 'k': 'lys', 'm': 'met', 'p': 'pro', 's': 'ser', + 'y': 'tyr', 't': 'thr', 'w': 'trp', 'f': 'phe', 'c': 'cys'} + for seq in seqs: + threel_form = '' + for aa in seq: + threel_form = threel_form + threel[aa] + sep + res.append(threel_form[:-1]) + return res def main(*proteins, options = None): From 441b615ad26e8444d93da49d359a9228ae7c7319 Mon Sep 17 00:00:00 2001 From: Olga Bagrova Date: Fri, 29 Sep 2023 14:24:41 +0300 Subject: [PATCH 12/51] Fix rename_three_letter_name function --- protein_tools.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/protein_tools.py b/protein_tools.py index d808b1f..2ddc18f 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -141,7 +141,9 @@ def rename_three_letter_name (*seqs: list, sep = '')->list: threel_form = '' for aa in seq: threel_form = threel_form + threel[aa] + sep - res.append(threel_form[:-1]) + if sep: + threel_form = threel_form[:-1] + res.append(threel_form) return res From 1e2fd63863135ff2a3397b33735003c6b5adafb1 Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Fri, 29 Sep 2023 16:03:47 +0300 Subject: [PATCH 13/51] Fix function transform_to_DNA_code --- protein_tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protein_tools.py b/protein_tools.py index 2ddc18f..eb4200f 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -87,7 +87,7 @@ def find_pattern(sequences: list, pattern: str)->dict: return finds -def transform_to_DNA_code(): +def transform_to_DNA_code(protein): """ Transforming of an amino acid sequence/protein to DNA sequence :param protein: amino acid sequence of protein From 968a091a3072aaa55f06bf5f7495a456cf12e00d Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Fri, 29 Sep 2023 16:04:52 +0300 Subject: [PATCH 14/51] Fix function rename_three_letter_name --- protein_tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protein_tools.py b/protein_tools.py index eb4200f..65efdd3 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -119,7 +119,7 @@ def transform_to_DNA_code(protein): return ''.join([retrnaslation_dict[i] for i in protein]) -def rename_three_letter_name (*seqs: list, sep = '')->list: +def rename_three_letter_name (seqs: list, sep = '')->list: """ Transform into a three-letter amino acids entry. arguments: From fea73ed150cc2b030c182bea05927f703c5537ec Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Fri, 29 Sep 2023 16:08:20 +0300 Subject: [PATCH 15/51] Fix 2 annotation and key for function DNA_transform --- protein_tools.py | 52 ++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/protein_tools.py b/protein_tools.py index 65efdd3..828779a 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -1,13 +1,13 @@ def compare(sequences: list, round_dec=3, percentages=False)->dict: -#""" -#Compare aminoacids between reference sequence and other sequences -#arguments: -# - sequences (list): reference sequence and other sequences for comparison -# - round_dec (int): a number of decimals to round the number to -# - percentages (bool): whether percentages are returned instead of fractions -#return: -# - comparisons (dict): dictionary with compared sequences as keys and percentages/fractions as their values -#""" + """ + Compare aminoacids between reference sequence and other sequences + arguments: + - sequences (list): reference sequence and other sequences for comparison + - round_dec (int): a number of decimals to round the number to + - percentages (bool): whether percentages are returned instead of fractions + return: + - comparisons (dict): dictionary with compared sequences as keys and percentages/fractions as their values + """ comparisons={} for seq in range(1,len(sequences)): comparison=[] @@ -51,14 +51,14 @@ def count_percentage(seq: str)->dict: def compare_pattern(sequence: str, pattern: str)->bool: -#""" -#Compare a given pattern to a fragment of sequence of the same length -#arguments: -# - sequence (str): sequence fragment to compare with the pattern -# - pattern (str): pattern for comparison -#return: -# - (bool): whether pattern and fragment match -#""" + """ + Compare a given pattern to a fragment of sequence of the same length + arguments: + - sequence (str): sequence fragment to compare with the pattern + - pattern (str): pattern for comparison + return: + - (bool): whether pattern and fragment match + """ for i in range(0,len(sequence)): if not sequence[i]==pattern[i]: return False @@ -66,14 +66,14 @@ def compare_pattern(sequence: str, pattern: str)->bool: return True def find_pattern(sequences: list, pattern: str)->dict: -#""" -#Find all non-overlaping instances of a given pattern in sequences -#arguments: -# - sequences (list): sequences to find the pattern in -# - pattern (str): pattern in question -#return -# - finds(dict): dictionary with sequences as keys and lists of indexes of patterns and the number of patterns as values -#""" + """ + Find all non-overlaping instances of a given pattern in sequences + arguments: + - sequences (list): sequences to find the pattern in + - pattern (str): pattern in question + return + - finds(dict): dictionary with sequences as keys and lists of indexes of patterns and the number of patterns as values + """ finds={} for j in range(0, len(sequences)): find=[] @@ -168,7 +168,7 @@ def main(*proteins, options = None): elif options == ('3Letter_name'): result = operations[options](proteins[:-1], proteins[-1]) return (result) - elif options == ('length' or 'percentage' or 'plasmid_code'): + elif options == ('length' or 'percentage' or 'DNA_code'): result = [] for protein in proteins: res = operations[options](protein) From 4ef3eac88e2e328596c33b9d200a512190195fd6 Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Fri, 29 Sep 2023 16:11:36 +0300 Subject: [PATCH 16/51] Fix 2 last elif call in main function --- protein_tools.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/protein_tools.py b/protein_tools.py index 828779a..fc1f87b 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -165,10 +165,10 @@ def main(*proteins, options = None): elif options == 'pattern': result = operations[options](proteins[1:len(proteins)],proteins[0]) return (result) - elif options == ('3Letter_name'): + elif options == '3Letter_name': result = operations[options](proteins[:-1], proteins[-1]) return (result) - elif options == ('length' or 'percentage' or 'DNA_code'): + elif options == 'length' or options =='percentage' or options == 'DNA_code': result = [] for protein in proteins: res = operations[options](protein) From 80be85dfeb618432b54f6d2c391de821f3b5b390 Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Fri, 29 Sep 2023 16:15:05 +0300 Subject: [PATCH 17/51] Fix key name of persantage --- protein_tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/protein_tools.py b/protein_tools.py index fc1f87b..dc663de 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -153,7 +153,7 @@ def main(*proteins, options = None): operations = { 'compare': compare, 'length': count_length, - 'percentage ': count_percentage, + 'percentage': count_percentage, 'pattern': find_pattern, '3Letter_name': rename_three_letter_name, 'DNA_code': transform_to_DNA_code From 5f2770d78efecfa12a87a3a92671fc85c756cc35 Mon Sep 17 00:00:00 2001 From: zmitserbio <144448919+zmitserbio@users.noreply.github.com> Date: Sat, 30 Sep 2023 14:55:35 +0300 Subject: [PATCH 18/51] Add verify function and is_protein and strink_check subfunctions --- protein_tools.py | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/protein_tools.py b/protein_tools.py index dc663de..1ecfc59 100644 --- a/protein_tools.py +++ b/protein_tools.py @@ -146,10 +146,50 @@ def rename_three_letter_name (seqs: list, sep = '')->list: res.append(threel_form) return res +def is_protein(seq): + """ + Checking wheter a sequence is a protein sequence + """ + aminoacids=['F','f','L','l','S','s','Y','y','C','c','W','w','P','p','H','h','Q','q','R','r','I','i','M','m','T','t','N','n','K','k','V','v','A','a','D','d','E','e','G','g'] + for i in seq: + if i not in aminoacids: + raise ValueError('Incorrect input: protein sequences containing 20 common aminoacids in one-letter format were expected. Please try again') + +def string_check(sequences): + """ + Checking whether a sequence is a protein sequence and is of type str + """ + for seq in sequences: + if type(seq) != str: + raise ValueError('Incorrect input type: protein sequences of type str were expected. Please try again') + is_protein(seq) + +def verify(sequences,options): + """ + Argument verification for all options + """ + if options=='length' or options=='percentage' or options=='DNA_code': + string_check(sequences) + elif options=='3Letter_name': + string_check(sequences[:-1]) + elif options=='compare': + string_check(sequences[:-2]) + for i in range(0,len(sequences[:-2])): + if len(sequences[i])!=len(sequences[0]): + raise ValueError('Incorrect input: same length protein sequences were expected. Please try again') + if type(sequences[-2]) != int or sequences[-2]<0: + raise ValueError('Incorrect input type: positive integer value was expected as the second-to-last argument. Please try again') + if type(sequences[-1]) != bool: + raise ValueError('Incorrect input type: bool value was expected as the last argument. Please try again') + elif options=='pattern': + string_check(sequences) + for i in range(1,len(sequences)): + if len(sequences[0])>len(sequences[i]): + raise ValueError('Incorrect input: pattern length shorter or equal to protein sequence length was expected. Please try again') def main(*proteins, options = None): proteins = list(proteins) - + verify(proteins, options) operations = { 'compare': compare, 'length': count_length, From c54a7ae0559f3a61e8b2a8b6ea7e7879bfd85dfb Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 15:13:09 +0300 Subject: [PATCH 19/51] Update README.md --- README.md | 93 +++++++++++++++++-------------------------------------- 1 file changed, 28 insertions(+), 65 deletions(-) diff --git a/README.md b/README.md index f918170..44f5e41 100644 --- a/README.md +++ b/README.md @@ -1,65 +1,28 @@ -# HW 4. Functions 2 -> *This is the repo for the fourth homework of the BI Python 2023 course* - -### Homework description - -На прошлой неделе вы делали утилиту для работы с последовательностями нуклеиновых кислот (с весьма строгим ТЗ). Пришло время для чего-то более самостоятельного. - -#### Основное задание - - -Напишите утилиту для работы с последовательностями белков. Там должно быть минимум 5 различных операций, должна быть какая-то точка входа через которую пользователь будет всё это дело использовать. На этом, по сути, всё. Всё целиком зависит от вашей фантазии и креативности. Можете опираться на ДЗ №2 и №3. - -Самая главная часть задания - это файл `README.md`. Сделайте краткое введение, напишите описание тула, приведите документацию по использованию со списком аргументов. Добавьте примеры использования. Возможно, вы захотите сделать секцию Troubleshooting. ***Почему это нужно?*** В этот раз проверяющий не будет знать того, как должен работать ваш тул. Это ваш авторский код. Даже самая прекрасная функциональность, не будучи отраженной в README, скорее всего останется незамеченной. README - это ваш способ познакомить пользователя с тулом, показать всё лучше и обосновать, почему именно ваша команда должна получить наивысший балл. - -Есть люди которые, любят писать документации, а есть те - кто не любит. Найдите в вашей команде того, кто любит. И в будущем в своих рабочих проектах всегда держите рядом такого человек (или будьте им). - -Примеры некоторых README, которыми можно вдохновляться: - -- [MetaFX](https://github.com/ctlab/metafx), тул Артёма Иванова. Там еще и [wiki](https://github.com/ctlab/metafx/wiki) крутое. -- [samovar](https://github.com/nvaulin/samovar) -- [MetaGEM](https://github.com/franciscozorrilla/metaGEM) -- [Pharokka](https://github.com/gbouras13/pharokka) - -Типовые секции, на которые стоит обратить внимание: Title, Overview, Usage, Options, Examples, Troubleshooting, Contacts. - -**Tехническое требование к заданию.** - -Это задание будет выполняться в командах по 3 человека. Каждый из членов команды должен внести ***как минимум*** 2 функции. Каждое внесение функции должно сопровождаться коммитом с осмысленным описанием коммита. Ниже приведена последовательность действий для успешного выполнения задания (аналогично ДЗ №2): - -1. Посмотрите состав своей команды здесь ([**ССЫЛКА**](https://docs.google.com/spreadsheets/d/1KMBBBu8LqauRpDJb0v1ldPwpvzNn8-KakcHexAcqLsE/edit?usp=sharing)). -2. Тимлид делает форк данного репозитория. **В форке создает ветку `HW4_`, в ветке создает папку `HW4_`, в этой папке вы всё делаете.** -3. Члены команды могут либо делать свои форки, либо работать в репозитории тимлида в качестве колабораторов ("contributors"). В любом случае делаете клоны => пишите код локально => пушите. -4. В конце тимлид делайет pull-request из `HW4_` своего репозитория в `main` этого. - - -А также: -- Сопроводите программу лучшим `README.md` файлом в вашей жизни (на английском языке). -- В этом ДЗ проблемы с качеством кода (нейминги, пустые строки, анноатции типов, док.стринги, пробелы) могут привести к снижению балла. Воспользуйтесь линтерами чтобы себя обезопасить. IDE по типу PyCharm или VSCode имеют фунцонал по авто-исправлению многих проблем такого рода. - -Автотестов на GitHub в этом ДЗ нет, но вы можете прогнать линтеры на качество кода локально (как в ДЗ №3, подробнее читайте [тут](https://plausible-cannon-091.notion.site/Code-auto-checks-02b2ea69c1d545fca07b50ce5933ed5f?pvs=4)). - -- Программа должна сохранять регистр символов. -- Программа должна работать только с последовательностями белков. -- Запрещается использование сторонних модулей. - - -### Форма сдачи - -Прикрепите ссылку на pull-request тимлида в Google Class (можете сделать от лица каждого члена команды, но это не обязательно). - - -### Pазбалловка - -- За каждую из 5 операций - максимум **1.5 балла** -- За README - максимум **2.5 балла** -- Если вы не внесли как минимум 2 функции от себя, вы получаете 0 баллов (на баллы остальных членов команды это не влияет). -- За фото созвона в README можно получить 0.2 доп. балла (но не более 10 баллов суммарно) - - - -### **Предполагаемый учебный результат** - -Это задание позволит вам проявить креативность и учиться быть не только кодером, но и автором. Также это задание поможет окончательно закрепить материал по функциям который мы прошли. - -Удачи! ✨✨ +# protein_tool.py +> *описание к тому, как работает программа protein_tool.py* +This program contains the function `...`. The `...` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output + + +**list of options:** + +- 'compare' - Compare amino acids between reference sequence and other sequences; +- 'length'- Сounting the length of an amino acid sequence/protein in the number of amino acids; +- 'percentage' - Count percentage of each amino acid in sequence; +- 'pattern' - Find all non-overlaping instances of a given pattern in sequences; +- '3Letter_name'- rename_three_letter_name, +- 'DNA_code' — Transforming of an amino acid sequence/protein to DNA sequence. + +# Procedures description +## count_percentage +### Introduction +The **count_percentage** procedure calculates the percentage of all 20 proteinogenic amino acid residues, case-sensitive in the protein sequence. +### Inputs +To start using the count_percentage procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘percentage’`. +### Outputs +The result of the procedure is a list of dictionaries with the percentages of the corresponding amino acids in each sequence. The dictionary contains only amino acid residues whose percentage in the sequence is not equal to 0 (which are contained in the sequence at all). Also, the dictionary is ordered from the largest percentage of content to the smallest. Cases of amino acid residues are taken into account. +> :warning: Attention: We use rounding to 2 decimal places. In some cases, **the sum of percentages** of all amino acid residues for sequence **may not be exactly 100%** due to rounding. +### Usage example +```python +main('LAlLAlwWGPdPA', options = 'percentage') # [{'A': 23.08, 'L': 15.38, 'l': 15.38, 'P': 15.38, 'w': 7.69, 'W': 7.69, 'G': 7.69, 'd': 7.69}] +main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] +``` From 627721bf907af6ce7a8d15bcd1e406b3ddf5d019 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 15:16:19 +0300 Subject: [PATCH 20/51] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 44f5e41..2d87b75 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # protein_tool.py -> *описание к тому, как работает программа protein_tool.py* +> *discription how the protein_tool.py work* This program contains the function `...`. The `...` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output From fec205a6ebeb9188d37d65d1549b8d03cc4ebe70 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 15:21:33 +0300 Subject: [PATCH 21/51] Update README.md --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 2d87b75..4fef45c 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,9 @@ This program contains the function `...`. The `...` function takes as input an a - '3Letter_name'- rename_three_letter_name, - 'DNA_code' — Transforming of an amino acid sequence/protein to DNA sequence. + + + # Procedures description ## count_percentage ### Introduction @@ -26,3 +29,18 @@ The result of the procedure is a list of dictionaries with the percentages of th main('LAlLAlwWGPdPA', options = 'percentage') # [{'A': 23.08, 'L': 15.38, 'l': 15.38, 'P': 15.38, 'w': 7.69, 'W': 7.69, 'G': 7.69, 'd': 7.69}] main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] ``` + +## rename_three_letter_name +### Introduction +The **rename_three_letter_name** procedure transform one-letter amino acids entry sequences to three-letter with separator. It is case-sensitive procedure. +### Inputs +To start using the rename_three_letter_name procedure, enter one or more protein sequences for which you want to get three-lettered sequences. After the protein sequences put a symbol that will be a separator. And specify the `options = ‘3Letter_name’`. +### Outputs +The result of the procedure is a list of three-lettered sequences. Each amino acid is separated by the specified separator. The case of the three-letter amino acid coincides with the case of the one-letter designation at the input. +### Usage example +```python +main('wWGPdPA', '', options = '3Letter_name') # ['trpTRPGLYPROaspPROALA'] +main('LAlLAlwWGPdPA', '-', options = '3Letter_name') # ['LEU-ALA-leu-LEU-ALA-leu-trp-TRP-GLY-PRO-asp-PRO-ALA'] +main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] +main('qwerty', 'G', options = '3Letter_name') # ['glnGtrpGgluGargGthrGtyr'] +``` From 61eed0b7b20f5cba212b00aa0c280d7dcc31a026 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 15:35:46 +0300 Subject: [PATCH 22/51] Update README.md --- README.md | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 4fef45c..6215b49 100644 --- a/README.md +++ b/README.md @@ -6,19 +6,19 @@ This program contains the function `...`. The `...` function takes as input an a **list of options:** - 'compare' - Compare amino acids between reference sequence and other sequences; -- 'length'- Сounting the length of an amino acid sequence/protein in the number of amino acids; +- 'length'- Сounting the length of protein in the number of amino acids; - 'percentage' - Count percentage of each amino acid in sequence; - 'pattern' - Find all non-overlaping instances of a given pattern in sequences; -- '3Letter_name'- rename_three_letter_name, -- 'DNA_code' — Transforming of an amino acid sequence/protein to DNA sequence. +- '3Letter_name' - Transform into a three-letter amino acids entry; +- 'DNA_code' - Transforming of an protein to DNA sequence. # Procedures description -## count_percentage +## percentage ### Introduction -The **count_percentage** procedure calculates the percentage of all 20 proteinogenic amino acid residues, case-sensitive in the protein sequence. +The **percentage** procedure calculates the percentage of all 20 proteinogenic amino acid residues, case-sensitive in the protein sequence. ### Inputs To start using the count_percentage procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘percentage’`. ### Outputs @@ -30,9 +30,9 @@ main('LAlLAlwWGPdPA', options = 'percentage') # [{'A': 23.08, 'L': 15.38, 'l': 1 main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] ``` -## rename_three_letter_name +## 3Letter_name ### Introduction -The **rename_three_letter_name** procedure transform one-letter amino acids entry sequences to three-letter with separator. It is case-sensitive procedure. +The **3Letter_name** procedure transform one-letter amino acids entry sequences to three-letter with separator. It is case-sensitive procedure. ### Inputs To start using the rename_three_letter_name procedure, enter one or more protein sequences for which you want to get three-lettered sequences. After the protein sequences put a symbol that will be a separator. And specify the `options = ‘3Letter_name’`. ### Outputs @@ -44,3 +44,18 @@ main('LAlLAlwWGPdPA', '-', options = '3Letter_name') # ['LEU-ALA-leu-LEU-ALA-leu main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] main('qwerty', 'G', options = '3Letter_name') # ['glnGtrpGgluGargGthrGtyr'] ``` + +# Procedures description +## DNA_code +### Introduction +The **DNA_code** procedure transforms a protein into a sequence of nucleotides for a DNA chain (this can be used in gene ingeniring). +P.S. codons chosen at the discretion of the tool authors. +### Inputs +To start using the DNA_code procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘DNA_code’`. +### Outputs +The result of the procedure is a list of dictionaries with the nucleotides of the corresponding amino acids in each sequence. +### Usage example +```python +main('LAlLAlwWGPdPA', options = 'DNA_code') # ['TTAGCAttaTTAGCAttatggTGGGGGCCCgcaCCCGCA'] +main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'DNA_code') # ['CGACGACGAcgacgacgaCGA', 'TGGGGGCCCgcaCCCGCA', 'TTAGCAttaTTAGCAttatgg'] +``` From 58911961801ad368aa4ce1b752c9c20ba0ce33c3 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 15:42:33 +0300 Subject: [PATCH 23/51] Update README.md --- README.md | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6215b49..b945156 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,18 @@ This program contains the function `...`. The `...` function takes as input an a - '3Letter_name' - Transform into a three-letter amino acids entry; - 'DNA_code' - Transforming of an protein to DNA sequence. +## length +### Introduction +The **length** procedure calculates the length of protein sequence in number of amino acids. +### Inputs +To start using the length procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘length’`. +### Outputs +The result of the procedure is a list with the numbers of amino acids in each sequence. The list contains only numbers of amico cids in the sequence. +### Usage example +```python +main('LAlLAlwWGPdPA', options = 'length') # [13] +main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'length') # [7, 6, 7] +``` @@ -45,7 +57,6 @@ main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r' main('qwerty', 'G', options = '3Letter_name') # ['glnGtrpGgluGargGthrGtyr'] ``` -# Procedures description ## DNA_code ### Introduction The **DNA_code** procedure transforms a protein into a sequence of nucleotides for a DNA chain (this can be used in gene ingeniring). @@ -53,7 +64,7 @@ P.S. codons chosen at the discretion of the tool authors. ### Inputs To start using the DNA_code procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘DNA_code’`. ### Outputs -The result of the procedure is a list of dictionaries with the nucleotides of the corresponding amino acids in each sequence. +The result of the procedure is a list with the nucleotides of the corresponding amino acids in each sequence. ### Usage example ```python main('LAlLAlwWGPdPA', options = 'DNA_code') # ['TTAGCAttaTTAGCAttatggTGGGGGCCCgcaCCCGCA'] From 4a8075071e71456b74fede9b8b89889de3075f9c Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Sat, 30 Sep 2023 16:22:56 +0300 Subject: [PATCH 24/51] add folder HW4_Bobkvo with files --- HW4_Bobkov | 1 + 1 file changed, 1 insertion(+) create mode 160000 HW4_Bobkov diff --git a/HW4_Bobkov b/HW4_Bobkov new file mode 160000 index 0000000..4dd89f9 --- /dev/null +++ b/HW4_Bobkov @@ -0,0 +1 @@ +Subproject commit 4dd89f9a27b900b76582513fdf95410d73ad1532 From 6b783625c3b099ef5123be798e8ad684bbeae59f Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Sat, 30 Sep 2023 16:51:52 +0300 Subject: [PATCH 25/51] folder --- HW4_Bobkov | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HW4_Bobkov b/HW4_Bobkov index 4dd89f9..83b3aa9 160000 --- a/HW4_Bobkov +++ b/HW4_Bobkov @@ -1 +1 @@ -Subproject commit 4dd89f9a27b900b76582513fdf95410d73ad1532 +Subproject commit 83b3aa987bc0a1abaa2d72ca51517b801cfcb2a7 From b0f927dbedde8f989f234592366fb76482da4276 Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Sat, 30 Sep 2023 17:06:07 +0300 Subject: [PATCH 26/51] add new folder again and remobe old version --- HW4_Bobkov | 1 - 1 file changed, 1 deletion(-) delete mode 160000 HW4_Bobkov diff --git a/HW4_Bobkov b/HW4_Bobkov deleted file mode 160000 index 83b3aa9..0000000 --- a/HW4_Bobkov +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 83b3aa987bc0a1abaa2d72ca51517b801cfcb2a7 From da10f7b963fcd6abeb304b33ad6ddd01f75bdaf1 Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Sat, 30 Sep 2023 17:33:00 +0300 Subject: [PATCH 27/51] add files to new fold --- HW4_Bobkov/README.md | 72 ++++++++++++ HW4_Bobkov/protein_tools.py | 220 ++++++++++++++++++++++++++++++++++++ 2 files changed, 292 insertions(+) create mode 100644 HW4_Bobkov/README.md create mode 100644 HW4_Bobkov/protein_tools.py diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md new file mode 100644 index 0000000..b945156 --- /dev/null +++ b/HW4_Bobkov/README.md @@ -0,0 +1,72 @@ +# protein_tool.py +> *discription how the protein_tool.py work* +This program contains the function `...`. The `...` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output + + +**list of options:** + +- 'compare' - Compare amino acids between reference sequence and other sequences; +- 'length'- Сounting the length of protein in the number of amino acids; +- 'percentage' - Count percentage of each amino acid in sequence; +- 'pattern' - Find all non-overlaping instances of a given pattern in sequences; +- '3Letter_name' - Transform into a three-letter amino acids entry; +- 'DNA_code' - Transforming of an protein to DNA sequence. + +## length +### Introduction +The **length** procedure calculates the length of protein sequence in number of amino acids. +### Inputs +To start using the length procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘length’`. +### Outputs +The result of the procedure is a list with the numbers of amino acids in each sequence. The list contains only numbers of amico cids in the sequence. +### Usage example +```python +main('LAlLAlwWGPdPA', options = 'length') # [13] +main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'length') # [7, 6, 7] +``` + + + +# Procedures description +## percentage +### Introduction +The **percentage** procedure calculates the percentage of all 20 proteinogenic amino acid residues, case-sensitive in the protein sequence. +### Inputs +To start using the count_percentage procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘percentage’`. +### Outputs +The result of the procedure is a list of dictionaries with the percentages of the corresponding amino acids in each sequence. The dictionary contains only amino acid residues whose percentage in the sequence is not equal to 0 (which are contained in the sequence at all). Also, the dictionary is ordered from the largest percentage of content to the smallest. Cases of amino acid residues are taken into account. +> :warning: Attention: We use rounding to 2 decimal places. In some cases, **the sum of percentages** of all amino acid residues for sequence **may not be exactly 100%** due to rounding. +### Usage example +```python +main('LAlLAlwWGPdPA', options = 'percentage') # [{'A': 23.08, 'L': 15.38, 'l': 15.38, 'P': 15.38, 'w': 7.69, 'W': 7.69, 'G': 7.69, 'd': 7.69}] +main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] +``` + +## 3Letter_name +### Introduction +The **3Letter_name** procedure transform one-letter amino acids entry sequences to three-letter with separator. It is case-sensitive procedure. +### Inputs +To start using the rename_three_letter_name procedure, enter one or more protein sequences for which you want to get three-lettered sequences. After the protein sequences put a symbol that will be a separator. And specify the `options = ‘3Letter_name’`. +### Outputs +The result of the procedure is a list of three-lettered sequences. Each amino acid is separated by the specified separator. The case of the three-letter amino acid coincides with the case of the one-letter designation at the input. +### Usage example +```python +main('wWGPdPA', '', options = '3Letter_name') # ['trpTRPGLYPROaspPROALA'] +main('LAlLAlwWGPdPA', '-', options = '3Letter_name') # ['LEU-ALA-leu-LEU-ALA-leu-trp-TRP-GLY-PRO-asp-PRO-ALA'] +main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] +main('qwerty', 'G', options = '3Letter_name') # ['glnGtrpGgluGargGthrGtyr'] +``` + +## DNA_code +### Introduction +The **DNA_code** procedure transforms a protein into a sequence of nucleotides for a DNA chain (this can be used in gene ingeniring). +P.S. codons chosen at the discretion of the tool authors. +### Inputs +To start using the DNA_code procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘DNA_code’`. +### Outputs +The result of the procedure is a list with the nucleotides of the corresponding amino acids in each sequence. +### Usage example +```python +main('LAlLAlwWGPdPA', options = 'DNA_code') # ['TTAGCAttaTTAGCAttatggTGGGGGCCCgcaCCCGCA'] +main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'DNA_code') # ['CGACGACGAcgacgacgaCGA', 'TGGGGGCCCgcaCCCGCA', 'TTAGCAttaTTAGCAttatgg'] +``` diff --git a/HW4_Bobkov/protein_tools.py b/HW4_Bobkov/protein_tools.py new file mode 100644 index 0000000..1ecfc59 --- /dev/null +++ b/HW4_Bobkov/protein_tools.py @@ -0,0 +1,220 @@ +def compare(sequences: list, round_dec=3, percentages=False)->dict: + """ + Compare aminoacids between reference sequence and other sequences + arguments: + - sequences (list): reference sequence and other sequences for comparison + - round_dec (int): a number of decimals to round the number to + - percentages (bool): whether percentages are returned instead of fractions + return: + - comparisons (dict): dictionary with compared sequences as keys and percentages/fractions as their values + """ + comparisons={} + for seq in range(1,len(sequences)): + comparison=[] + for j in range(0,len(sequences[seq])): + comparison.append(sequences[0][j]==sequences[seq][j]) + if percentages: + comparisons[sequences[seq]]=round(sum(comparison)*100/len(sequences[seq]),round_dec) + else: + comparisons[sequences[seq]]=round(sum(comparison)/len(sequences[seq]),round_dec) + return comparisons + + +def count_length(protein: str) -> list: + """ + Сounting the length of an amino acid sequence/protein in the number of amino acids + :param protein: sequence of protein + :return: number of amino acids in an amino acid sequence/protein + """ + length_p = len(protein) + return length_p + + +def count_percentage(seq: str)->dict: + """ + Count percentage of each amino acid in sequence + arguments: + - seq (str): sequence for counting + return: + - dict: dictionary with counted percentage + """ + l = count_length(seq) + res = {} + for aa in seq: + if aa not in res: + res[aa] = 1 + else: + res[aa]+=1 + res.update((key, round(value/l*100, 2)) for key, value in res.items()) + res={key: value for key, value in sorted(res.items(), key=lambda item: item[1], reverse=True)} + return res + + +def compare_pattern(sequence: str, pattern: str)->bool: + """ + Compare a given pattern to a fragment of sequence of the same length + arguments: + - sequence (str): sequence fragment to compare with the pattern + - pattern (str): pattern for comparison + return: + - (bool): whether pattern and fragment match + """ + for i in range(0,len(sequence)): + if not sequence[i]==pattern[i]: + return False + break + return True + +def find_pattern(sequences: list, pattern: str)->dict: + """ + Find all non-overlaping instances of a given pattern in sequences + arguments: + - sequences (list): sequences to find the pattern in + - pattern (str): pattern in question + return + - finds(dict): dictionary with sequences as keys and lists of indexes of patterns and the number of patterns as values + """ + finds={} + for j in range(0, len(sequences)): + find=[] + for i in range(0, len(sequences[j])): + if compare_pattern(sequences[j][i:i+len(pattern)], pattern): + find.append(i) + i+=len(pattern) + else: + continue + finds[sequences[j]]=[len(find)]+find + return finds + + +def transform_to_DNA_code(protein): + """ + Transforming of an amino acid sequence/protein to DNA sequence + :param protein: amino acid sequence of protein + :return: sequence of protein in the DNA sequence form + """ + retrnaslation_dict = { + 'F': 'TTC', 'f': 'ttc', + 'L': 'TTA', 'l': 'tta', + 'S': 'TCG', 's': 'tcg', + 'Y': 'TAC', 'y': 'tac', + 'C': 'TGC', 'c': 'tgc', + 'W': 'TGG', 'w': 'tgg', + 'P': 'CCC', 'p': 'ccc', + 'H': 'CAT', 'h': 'cat', + 'Q': 'GAA', 'q': 'gaa', + 'R': 'CGA', 'r': 'cga', + 'I': 'ATT', 'i': 'att', + 'M': 'ATG', 'm': 'atg', + 'T': 'ACC', 't': 'acc', + 'N': 'AAT', 'n': 'aat', + 'K': 'AAA', 'k': 'aaa', + 'V': 'GTT', 'v': 'gtt', + 'A': 'GCA', 'a': 'gca', + 'D': 'GAT', 'd': 'gca', + 'E': 'GAG', 'e': 'gag', + 'G': 'GGG', 'g': 'ggg' + } + + return ''.join([retrnaslation_dict[i] for i in protein]) + + +def rename_three_letter_name (seqs: list, sep = '')->list: + """ + Transform into a three-letter amino acids entry. + arguments: + - seqs (list): list of sequences for transforming to three-letter entire + - sep (str): separator between aminoacids, default = '' + return: + - list: transformed sequences with separators + """ + res=[] + threel = {'A': 'ALA', 'R': 'ARG', 'N': 'ASN', 'D': "ASP", 'V': 'VAL', + 'H': 'HIS', 'G': "GLY", 'Q': "GLN", 'E': 'GLU', 'I': 'ILE', + 'L': 'LEU', 'K': 'LYS', 'M': 'MET', 'P': 'PRO', 'S': 'SER', + 'Y': 'TYR', 'T': 'THR', 'W': 'TRP', 'F': 'PHE', 'C': 'CYS', + 'a': 'ala', 'r': 'arg', 'n': 'asn', 'd': "asp", 'v': 'val', + 'h': 'his', 'g': "gly", 'q': "gln", 'e': 'glu', 'i': 'ile', + 'l': 'leu', 'k': 'lys', 'm': 'met', 'p': 'pro', 's': 'ser', + 'y': 'tyr', 't': 'thr', 'w': 'trp', 'f': 'phe', 'c': 'cys'} + for seq in seqs: + threel_form = '' + for aa in seq: + threel_form = threel_form + threel[aa] + sep + if sep: + threel_form = threel_form[:-1] + res.append(threel_form) + return res + +def is_protein(seq): + """ + Checking wheter a sequence is a protein sequence + """ + aminoacids=['F','f','L','l','S','s','Y','y','C','c','W','w','P','p','H','h','Q','q','R','r','I','i','M','m','T','t','N','n','K','k','V','v','A','a','D','d','E','e','G','g'] + for i in seq: + if i not in aminoacids: + raise ValueError('Incorrect input: protein sequences containing 20 common aminoacids in one-letter format were expected. Please try again') + +def string_check(sequences): + """ + Checking whether a sequence is a protein sequence and is of type str + """ + for seq in sequences: + if type(seq) != str: + raise ValueError('Incorrect input type: protein sequences of type str were expected. Please try again') + is_protein(seq) + +def verify(sequences,options): + """ + Argument verification for all options + """ + if options=='length' or options=='percentage' or options=='DNA_code': + string_check(sequences) + elif options=='3Letter_name': + string_check(sequences[:-1]) + elif options=='compare': + string_check(sequences[:-2]) + for i in range(0,len(sequences[:-2])): + if len(sequences[i])!=len(sequences[0]): + raise ValueError('Incorrect input: same length protein sequences were expected. Please try again') + if type(sequences[-2]) != int or sequences[-2]<0: + raise ValueError('Incorrect input type: positive integer value was expected as the second-to-last argument. Please try again') + if type(sequences[-1]) != bool: + raise ValueError('Incorrect input type: bool value was expected as the last argument. Please try again') + elif options=='pattern': + string_check(sequences) + for i in range(1,len(sequences)): + if len(sequences[0])>len(sequences[i]): + raise ValueError('Incorrect input: pattern length shorter or equal to protein sequence length was expected. Please try again') + +def main(*proteins, options = None): + proteins = list(proteins) + verify(proteins, options) + operations = { + 'compare': compare, + 'length': count_length, + 'percentage': count_percentage, + 'pattern': find_pattern, + '3Letter_name': rename_three_letter_name, + 'DNA_code': transform_to_DNA_code + } + + if options == 'compare': + result = operations[options](proteins[:-2], proteins[-2], proteins[-1]) + return (result) + elif options == 'pattern': + result = operations[options](proteins[1:len(proteins)],proteins[0]) + return (result) + elif options == '3Letter_name': + result = operations[options](proteins[:-1], proteins[-1]) + return (result) + elif options == 'length' or options =='percentage' or options == 'DNA_code': + result = [] + for protein in proteins: + res = operations[options](protein) + result.append(res) + return (result) + else: + raise ValueError('Incorrect options input, please try again') + +main () From 612dceb71bab51009f15f01b00a0269fe50bab3d Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Sat, 30 Sep 2023 17:58:28 +0300 Subject: [PATCH 28/51] finally i delited files_copies --- README.md | 72 ---------------- protein_tools.py | 220 ----------------------------------------------- 2 files changed, 292 deletions(-) delete mode 100644 README.md delete mode 100644 protein_tools.py diff --git a/README.md b/README.md deleted file mode 100644 index b945156..0000000 --- a/README.md +++ /dev/null @@ -1,72 +0,0 @@ -# protein_tool.py -> *discription how the protein_tool.py work* -This program contains the function `...`. The `...` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output - - -**list of options:** - -- 'compare' - Compare amino acids between reference sequence and other sequences; -- 'length'- Сounting the length of protein in the number of amino acids; -- 'percentage' - Count percentage of each amino acid in sequence; -- 'pattern' - Find all non-overlaping instances of a given pattern in sequences; -- '3Letter_name' - Transform into a three-letter amino acids entry; -- 'DNA_code' - Transforming of an protein to DNA sequence. - -## length -### Introduction -The **length** procedure calculates the length of protein sequence in number of amino acids. -### Inputs -To start using the length procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘length’`. -### Outputs -The result of the procedure is a list with the numbers of amino acids in each sequence. The list contains only numbers of amico cids in the sequence. -### Usage example -```python -main('LAlLAlwWGPdPA', options = 'length') # [13] -main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'length') # [7, 6, 7] -``` - - - -# Procedures description -## percentage -### Introduction -The **percentage** procedure calculates the percentage of all 20 proteinogenic amino acid residues, case-sensitive in the protein sequence. -### Inputs -To start using the count_percentage procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘percentage’`. -### Outputs -The result of the procedure is a list of dictionaries with the percentages of the corresponding amino acids in each sequence. The dictionary contains only amino acid residues whose percentage in the sequence is not equal to 0 (which are contained in the sequence at all). Also, the dictionary is ordered from the largest percentage of content to the smallest. Cases of amino acid residues are taken into account. -> :warning: Attention: We use rounding to 2 decimal places. In some cases, **the sum of percentages** of all amino acid residues for sequence **may not be exactly 100%** due to rounding. -### Usage example -```python -main('LAlLAlwWGPdPA', options = 'percentage') # [{'A': 23.08, 'L': 15.38, 'l': 15.38, 'P': 15.38, 'w': 7.69, 'W': 7.69, 'G': 7.69, 'd': 7.69}] -main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] -``` - -## 3Letter_name -### Introduction -The **3Letter_name** procedure transform one-letter amino acids entry sequences to three-letter with separator. It is case-sensitive procedure. -### Inputs -To start using the rename_three_letter_name procedure, enter one or more protein sequences for which you want to get three-lettered sequences. After the protein sequences put a symbol that will be a separator. And specify the `options = ‘3Letter_name’`. -### Outputs -The result of the procedure is a list of three-lettered sequences. Each amino acid is separated by the specified separator. The case of the three-letter amino acid coincides with the case of the one-letter designation at the input. -### Usage example -```python -main('wWGPdPA', '', options = '3Letter_name') # ['trpTRPGLYPROaspPROALA'] -main('LAlLAlwWGPdPA', '-', options = '3Letter_name') # ['LEU-ALA-leu-LEU-ALA-leu-trp-TRP-GLY-PRO-asp-PRO-ALA'] -main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] -main('qwerty', 'G', options = '3Letter_name') # ['glnGtrpGgluGargGthrGtyr'] -``` - -## DNA_code -### Introduction -The **DNA_code** procedure transforms a protein into a sequence of nucleotides for a DNA chain (this can be used in gene ingeniring). -P.S. codons chosen at the discretion of the tool authors. -### Inputs -To start using the DNA_code procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘DNA_code’`. -### Outputs -The result of the procedure is a list with the nucleotides of the corresponding amino acids in each sequence. -### Usage example -```python -main('LAlLAlwWGPdPA', options = 'DNA_code') # ['TTAGCAttaTTAGCAttatggTGGGGGCCCgcaCCCGCA'] -main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'DNA_code') # ['CGACGACGAcgacgacgaCGA', 'TGGGGGCCCgcaCCCGCA', 'TTAGCAttaTTAGCAttatgg'] -``` diff --git a/protein_tools.py b/protein_tools.py deleted file mode 100644 index 1ecfc59..0000000 --- a/protein_tools.py +++ /dev/null @@ -1,220 +0,0 @@ -def compare(sequences: list, round_dec=3, percentages=False)->dict: - """ - Compare aminoacids between reference sequence and other sequences - arguments: - - sequences (list): reference sequence and other sequences for comparison - - round_dec (int): a number of decimals to round the number to - - percentages (bool): whether percentages are returned instead of fractions - return: - - comparisons (dict): dictionary with compared sequences as keys and percentages/fractions as their values - """ - comparisons={} - for seq in range(1,len(sequences)): - comparison=[] - for j in range(0,len(sequences[seq])): - comparison.append(sequences[0][j]==sequences[seq][j]) - if percentages: - comparisons[sequences[seq]]=round(sum(comparison)*100/len(sequences[seq]),round_dec) - else: - comparisons[sequences[seq]]=round(sum(comparison)/len(sequences[seq]),round_dec) - return comparisons - - -def count_length(protein: str) -> list: - """ - Сounting the length of an amino acid sequence/protein in the number of amino acids - :param protein: sequence of protein - :return: number of amino acids in an amino acid sequence/protein - """ - length_p = len(protein) - return length_p - - -def count_percentage(seq: str)->dict: - """ - Count percentage of each amino acid in sequence - arguments: - - seq (str): sequence for counting - return: - - dict: dictionary with counted percentage - """ - l = count_length(seq) - res = {} - for aa in seq: - if aa not in res: - res[aa] = 1 - else: - res[aa]+=1 - res.update((key, round(value/l*100, 2)) for key, value in res.items()) - res={key: value for key, value in sorted(res.items(), key=lambda item: item[1], reverse=True)} - return res - - -def compare_pattern(sequence: str, pattern: str)->bool: - """ - Compare a given pattern to a fragment of sequence of the same length - arguments: - - sequence (str): sequence fragment to compare with the pattern - - pattern (str): pattern for comparison - return: - - (bool): whether pattern and fragment match - """ - for i in range(0,len(sequence)): - if not sequence[i]==pattern[i]: - return False - break - return True - -def find_pattern(sequences: list, pattern: str)->dict: - """ - Find all non-overlaping instances of a given pattern in sequences - arguments: - - sequences (list): sequences to find the pattern in - - pattern (str): pattern in question - return - - finds(dict): dictionary with sequences as keys and lists of indexes of patterns and the number of patterns as values - """ - finds={} - for j in range(0, len(sequences)): - find=[] - for i in range(0, len(sequences[j])): - if compare_pattern(sequences[j][i:i+len(pattern)], pattern): - find.append(i) - i+=len(pattern) - else: - continue - finds[sequences[j]]=[len(find)]+find - return finds - - -def transform_to_DNA_code(protein): - """ - Transforming of an amino acid sequence/protein to DNA sequence - :param protein: amino acid sequence of protein - :return: sequence of protein in the DNA sequence form - """ - retrnaslation_dict = { - 'F': 'TTC', 'f': 'ttc', - 'L': 'TTA', 'l': 'tta', - 'S': 'TCG', 's': 'tcg', - 'Y': 'TAC', 'y': 'tac', - 'C': 'TGC', 'c': 'tgc', - 'W': 'TGG', 'w': 'tgg', - 'P': 'CCC', 'p': 'ccc', - 'H': 'CAT', 'h': 'cat', - 'Q': 'GAA', 'q': 'gaa', - 'R': 'CGA', 'r': 'cga', - 'I': 'ATT', 'i': 'att', - 'M': 'ATG', 'm': 'atg', - 'T': 'ACC', 't': 'acc', - 'N': 'AAT', 'n': 'aat', - 'K': 'AAA', 'k': 'aaa', - 'V': 'GTT', 'v': 'gtt', - 'A': 'GCA', 'a': 'gca', - 'D': 'GAT', 'd': 'gca', - 'E': 'GAG', 'e': 'gag', - 'G': 'GGG', 'g': 'ggg' - } - - return ''.join([retrnaslation_dict[i] for i in protein]) - - -def rename_three_letter_name (seqs: list, sep = '')->list: - """ - Transform into a three-letter amino acids entry. - arguments: - - seqs (list): list of sequences for transforming to three-letter entire - - sep (str): separator between aminoacids, default = '' - return: - - list: transformed sequences with separators - """ - res=[] - threel = {'A': 'ALA', 'R': 'ARG', 'N': 'ASN', 'D': "ASP", 'V': 'VAL', - 'H': 'HIS', 'G': "GLY", 'Q': "GLN", 'E': 'GLU', 'I': 'ILE', - 'L': 'LEU', 'K': 'LYS', 'M': 'MET', 'P': 'PRO', 'S': 'SER', - 'Y': 'TYR', 'T': 'THR', 'W': 'TRP', 'F': 'PHE', 'C': 'CYS', - 'a': 'ala', 'r': 'arg', 'n': 'asn', 'd': "asp", 'v': 'val', - 'h': 'his', 'g': "gly", 'q': "gln", 'e': 'glu', 'i': 'ile', - 'l': 'leu', 'k': 'lys', 'm': 'met', 'p': 'pro', 's': 'ser', - 'y': 'tyr', 't': 'thr', 'w': 'trp', 'f': 'phe', 'c': 'cys'} - for seq in seqs: - threel_form = '' - for aa in seq: - threel_form = threel_form + threel[aa] + sep - if sep: - threel_form = threel_form[:-1] - res.append(threel_form) - return res - -def is_protein(seq): - """ - Checking wheter a sequence is a protein sequence - """ - aminoacids=['F','f','L','l','S','s','Y','y','C','c','W','w','P','p','H','h','Q','q','R','r','I','i','M','m','T','t','N','n','K','k','V','v','A','a','D','d','E','e','G','g'] - for i in seq: - if i not in aminoacids: - raise ValueError('Incorrect input: protein sequences containing 20 common aminoacids in one-letter format were expected. Please try again') - -def string_check(sequences): - """ - Checking whether a sequence is a protein sequence and is of type str - """ - for seq in sequences: - if type(seq) != str: - raise ValueError('Incorrect input type: protein sequences of type str were expected. Please try again') - is_protein(seq) - -def verify(sequences,options): - """ - Argument verification for all options - """ - if options=='length' or options=='percentage' or options=='DNA_code': - string_check(sequences) - elif options=='3Letter_name': - string_check(sequences[:-1]) - elif options=='compare': - string_check(sequences[:-2]) - for i in range(0,len(sequences[:-2])): - if len(sequences[i])!=len(sequences[0]): - raise ValueError('Incorrect input: same length protein sequences were expected. Please try again') - if type(sequences[-2]) != int or sequences[-2]<0: - raise ValueError('Incorrect input type: positive integer value was expected as the second-to-last argument. Please try again') - if type(sequences[-1]) != bool: - raise ValueError('Incorrect input type: bool value was expected as the last argument. Please try again') - elif options=='pattern': - string_check(sequences) - for i in range(1,len(sequences)): - if len(sequences[0])>len(sequences[i]): - raise ValueError('Incorrect input: pattern length shorter or equal to protein sequence length was expected. Please try again') - -def main(*proteins, options = None): - proteins = list(proteins) - verify(proteins, options) - operations = { - 'compare': compare, - 'length': count_length, - 'percentage': count_percentage, - 'pattern': find_pattern, - '3Letter_name': rename_three_letter_name, - 'DNA_code': transform_to_DNA_code - } - - if options == 'compare': - result = operations[options](proteins[:-2], proteins[-2], proteins[-1]) - return (result) - elif options == 'pattern': - result = operations[options](proteins[1:len(proteins)],proteins[0]) - return (result) - elif options == '3Letter_name': - result = operations[options](proteins[:-1], proteins[-1]) - return (result) - elif options == 'length' or options =='percentage' or options == 'DNA_code': - result = [] - for protein in proteins: - res = operations[options](protein) - result.append(res) - return (result) - else: - raise ValueError('Incorrect options input, please try again') - -main () From 4cda1c144452fcc260aa4f452b703991c0f5324a Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 20:21:31 +0300 Subject: [PATCH 29/51] Update README.md --- HW4_Bobkov/README.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index b945156..403548d 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -1,6 +1,6 @@ # protein_tool.py > *discription how the protein_tool.py work* -This program contains the function `...`. The `...` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output +> This program contains the function `protein_tool`. The `protein_tool` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output **list of options:** @@ -12,6 +12,25 @@ This program contains the function `...`. The `...` function takes as input an a - '3Letter_name' - Transform into a three-letter amino acids entry; - 'DNA_code' - Transforming of an protein to DNA sequence. +## compare +### Introduction +The **compare** procedure compares the first aminoacid sequence provided with the following ones. +### Inputs +To start using the length procedure, enter sevreal arguemts: +- _an arbitrary number_ of sequences, where the first sequence is a reference to which the following sequences are compared; each argument should be of type 'str'. +- _second-to-last_ argument is the number of decimals to round the number to; type 'int' +- _last_ argument determines whether percentages are returned instead of fractions; type 'bool' +### Outputs +It returns a 'dict' object where: +- *keys* are compared-to sequences (type str) +- *values* are either fractions or percentages of type float. +### Usage example +```python +main('LAlLAlwWGPdPA', 'LAlLAl', 3, False, options = 'compare') # {'LAlLAl': 1.0} +main('LAlLAlwWGPdPA', 'LAlLAl', 'GPdPA', 3, True, options = 'compare')) # {'LAlLAl': 100.0, 'GPdPA': 20.0} +``` + + ## length ### Introduction The **length** procedure calculates the length of protein sequence in number of amino acids. From 1aa6619a5c070b58fb67330376a978ea6d010258 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 20:48:13 +0300 Subject: [PATCH 30/51] Update README.md --- HW4_Bobkov/README.md | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 403548d..0a322cc 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -12,6 +12,10 @@ - '3Letter_name' - Transform into a three-letter amino acids entry; - 'DNA_code' - Transforming of an protein to DNA sequence. + +# Procedures description + + ## compare ### Introduction The **compare** procedure compares the first aminoacid sequence provided with the following ones. @@ -30,7 +34,6 @@ main('LAlLAlwWGPdPA', 'LAlLAl', 3, False, options = 'compare') # {'LAlLAl': 1.0} main('LAlLAlwWGPdPA', 'LAlLAl', 'GPdPA', 3, True, options = 'compare')) # {'LAlLAl': 100.0, 'GPdPA': 20.0} ``` - ## length ### Introduction The **length** procedure calculates the length of protein sequence in number of amino acids. @@ -44,9 +47,6 @@ main('LAlLAlwWGPdPA', options = 'length') # [13] main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'length') # [7, 6, 7] ``` - - -# Procedures description ## percentage ### Introduction The **percentage** procedure calculates the percentage of all 20 proteinogenic amino acid residues, case-sensitive in the protein sequence. @@ -61,6 +61,23 @@ main('LAlLAlwWGPdPA', options = 'percentage') # [{'A': 23.08, 'L': 15.38, 'l': 1 main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] ``` +## pattern +### Introduction +The **pattern** procedure find all non-overlaping cases of a given pattern in aminoacid sequences provided. +### Inputs +To start using the pattern procedure, enter one or more protein sequences for which you want to get a summary, where the first sequence is a pattern, which is searched for in the following sequences; each argument should be of type 'str' and at the end add `options = ‘pattern’`. +The *find_pattern()* function goes through a sequence in the following way: it takes a subsequence of aminoacids in front of an index equal in length to the pattern and compares it to the pattern. If there is no match, index is moved one aminoacid to the end of the sequence. If there is a match, the index is saved, and the function jumps to an aminoacid next to the subsequence, then the algorithm repeats. Comparison is performed by *compare_pattern* subfunction. + +### Outputs +The result of the procedure is a dict object where: +- *keys* are aminoacid sequences (type str) +- _values_ are lists where the first element is a number of pattern instances in a given sequence, and the following elements are indexes of these occurances +### Usage example +```python +main('LAlLAlwWGPdPA', 'LAlLAl', 'GPdPA', options = 'pattern') # {'LAlLAl': [2, 0, 3], 'GPdPA': [0]} +main('LAlLAlwWGPdPA', 'AlLAl', options = 'pattern') # {'AlLAl': [1, 2]} +``` + ## 3Letter_name ### Introduction The **3Letter_name** procedure transform one-letter amino acids entry sequences to three-letter with separator. It is case-sensitive procedure. From 763eb0d343542075c65d6ed2c25ea0fa2d26b8a4 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 21:20:47 +0300 Subject: [PATCH 31/51] Add files via upload --- HW4_Bobkov/photo_2023-09-28_23-38-46.jpg | Bin 0 -> 112235 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 HW4_Bobkov/photo_2023-09-28_23-38-46.jpg diff --git a/HW4_Bobkov/photo_2023-09-28_23-38-46.jpg b/HW4_Bobkov/photo_2023-09-28_23-38-46.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d6f6f2edb46ebd26eaa73a16ad189e6ec9bf63b8 GIT binary patch literal 112235 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 z zxGJtf@o05=Dc2ob{5)^HrSQ(Eri?{qW{vIhPQ?SGsfBD(aPhg*A(mIH1CQbW!L<1@ z>TpN(-N_>j$KMtP%Kpy-N8r=ntPhFsya#aismY>~1`RJX(PW*na$2~=-HWEMIkEgD zsy$-zU7jUjUPEszu`Yu6;nxoH2d6ZxaDcQ)p=xD-_zK1`2 z)3IL0;>q(HQoYc9(#evmy+m|#dpbGUYUqG2bH(`T!;ZrG z5NB}8P4m14tx#1FuE9OOldwffNx~7;?56$W<0YYi!C33bZl(a~zJ~qEsqihA_+HoU zP^@}W`jYM&Nfr~nxmFD*>8Ezoc@-@v5EDA;1iXEp4cvpU$NQ0+AZ43okz(JXEviYm zSXYVV8kTsoql}yTGQZ38Ll198VSfCDf$8bgGWWNp*NRmmz7qHlkn(N2g)I^x4sWHY z_v3F_4@Z^q(~Qh@s-3LNv}v4XEru)FHnx_XZcX9% zw~}Z{+B^0OvO#i$s?qoXd$FWaJskx z`mMv%(olDAlhu6Q2m6*et&BV)q;jzn;;%5<8K^DrEl-`)aaE;f-4Gls#rK>9-kSg&yZH@Rvb+=!(m8D~#I`V2**dTa`$;Rs(z zR3IYl=trHn-N;zB*H>IRSu5TZHv@t1LMEG+*Z2o}Jae5;L9uT5Ogo7Sw;6ND;y$Vz zCP60Buoa>+!_uyo_o}HWH_vL-$Z6<9K>Y(v`zOq0YJt-oUG|*wrmDSPOq83OitR?5 zN+MN_LETEx<%;S?pF)!n5bx)#+s3@?Q?T9il@oLj#VPdUg-$~G>D=0#4 zYC&MrMr}cgp0IcLA@rc4GR{AuJ_@nO+2S%1e>*?y9)?rC+Nzr74lV*Y9m)zQFj?1U z){OGqPOTV~Reo!dkyT%#G^r~wWiz!P-#D0Ae%{jRX1r0;v40nFteOYYi;?(}-=F2r zl@!N1r(1P#bbk-p1x>FXS-vr_-IkDyTpBtZgBw2WBY-x%Oc7r(t1tugHYZb}yYA-R zkOWe2ia2BoPeQFDzBE2?vLm_@9KAeKC~2{Vx6PJ>di_ZI0XVcNI^w|i`BH`ue)gl9 zdOH7HtCkxZ^tG`4dk)MIsjYMi8*UNrikrVcj|N8L{tZSgD8AIpG*lx6Ek@mh?{LRW zx;)wX^;kK`l4n#bD&%d$aO{jHbOnY~4o9Iz=~<}FBY!FWLMI~rdm{_ScZ+v#RvLT% z6!uGNwb@A{EU- zkCHz#3-AQi(D2@V>71p{xnP>mJx=eW#vE;Ey-s?tw1q>QnRI&;!aBW_twEWtt;40- zW3$yTQ;i|@gtEHqlzCZOm)W&fm70#shjX7i2O54p;lbZzXy6#zjW}3+I#_M&Um~3^ zcEey!H%m>FdIe-d;?%KAFVC633eJB#O8?TVFo&@Nb0bu~E3<<>&aKD|ADp_UfgjW@ zYh+WULGioHf4CIFj(*=&hoh~rx;Eyc%9hIc$L=?VH>Z|@cBLYZ0fMu;Gm#pK-O&6R za81P$dM5l89av&4xN{u1lD8cmD);i}c`D|&gmkOm+?b)9%+F1_3+e~8I}!T5PXc+JY47;#>R9C^*hN~1GR-R{9LLN8RgMA zJE?1ws}e39xVyAUyToj)5sv^5n(fj?H>o`$etT{|?G^5&c5Ah1mNwqsB>ZE$!pkyz zIzi<`8wJKE<7pJM;d|E2eu;-R>tL_nereYJAs*U8$L=CSBB`E&P7t$g`4Tn#$a0j) zKKVvZbZNW>J4Itp^O{3<60MfFz>s{~QrZKvlmnGvHraYp%Mx~Glh30C^@Vd8?2)}_PoQAcAIbs>xNJL9G7ucW>A-p_&ym;Ph@3Wj!m^x zY}ExY#6>uHq~|w(hB!e~xVy0E)Ot0rxf;i{22p!lCaj~aD_u_ew@8*K&la}M>C(&2 z6X&RzrKDcYNWmY7S_ZoE?;hMP@Aw3j7sIfr?`r<~u|4^+oAD=CBg*Pp-Q$2ae6p2j z>iZ8XhVivCCll4XaF~q-qc`$K3w;f><8L|@Zum#A^*XZ;53PwRXWY}vKJC4yi&HM` z2+lrtDrM`PvdC;sZqc!jZf<{WQle()Kjffc>L1?g%4uEVo1IrML|y7@I@@l-Oub#u zjX#$;=?`&ZA?(oBNb~I-`na)pY~6F}EW67!ob5{2hzaHQO8L`R>9htO#ZSeack4Le z^nNktbnLd_B3yC7iQ}BETESdBT0=`ZWyHPg0Q!9CYB-_Vta8JDuUfl%e{73?NLkZP z#GOue%TdIbX;n8@mCKQHf04RByin9=(54tsLi6VK{EN^J0SnCb3mbI=fEpxSB@&lbqUwb)> zSLpA3r_^$lePo|dxZ)sP+g&)XrGTBGLR*8KN7HMil-$d~!1R_%BIz-Unl8vu;ue|s z7{BhsuxD>S|E0NB9RVCF&#}$A@wB(E(3dK&ybCh1zlk2XXt>;67MY7-&2-R?s*Uf^ zi7l<)M@UAQl%+q!P_C#*&9NY_ce~&NLnMEd1b>v3thczV&+PN0kWlTty={ND=Gz%l z2Q84(3t*uJak%tQV~Im5ZT96?)-KumR(@pG7<9ylFKg~2A8(e;91nApgrwA$ZXB`R zTn)Ia|HE$rPaaT{%T~@$GaY=KU?E;vwrDrAae2NlhRM7vq6?wdi!B~wz+1JCENUKE zXHLkN@@=qsqvuyiDBAzlF;TRQR$fh6-Z8OirqQoVpi18q`HD&&0 zeb&r0H6;n;M#oBJoA2pzbu>-lBz*I+IyBJaBAqz0LxW5-+d9`|@5SF*545UI~akeYpZ{!*URuh zKf$s1Hb`er9||CaCT@>4udEzu8~RrYIk#@2mcHDzM_l7@PMbMH9y@Z0tMK?Gz$NsX z5dQ60Zz5V`@_7rHlO&oDATxP3a=kuBewTiXv}k6^BAZn)I@daNiJh(>Rg6pYNH&S>u8?O^5c#~rP@E5;t zAeeeY3V@iEUd^oAn=^h{Eu(ikxWr(tXrKPr$zov7)Ur#A(tLL)q)XF7;4Q zp^OmJEf;SUWNuNKr9!HfE4vkT*=ZRPXDzl^?YuV_$1E2JyQ~^wpED-mjSG~NjT^r$ zDVx>?bug)p9g6j@s+*TIF;x=ov{VT;P48Gd-sdu0KBvn&JdJ)p{6m`W*Pju}TdZ%I z_PrjxwFT-3em-%vc-h7aeTo`utO0ptcEWg>GDbP;q78oI}NC}5JQ8{qhEomQVv zpyS~4bdrDm?ald!oioMdbH+k;B2HM|?;QQO{MhS!7Wo=xQT-OFV{WP8rbguimlX0^fY>%wRr(rUqhhhY^kB2W`V+-!^S5X8MX%Um z%?mPxxReR@AD9jX7fQ-QD&9x@qLDo9q{ zshzNvvflsEY|-g;kIQRK^CO*0?+N!@(@X%2TWu#bDRFS!FrGDXaAY(@*FPMqPx3!QcKJ=soV(#P`uVHxM-fnq>=>n!v^}Sp61ZH_HTK)J*pU3hV^xCQ;*O{}n zM+=|_m6Ci3w*dkCFAAmZlp}NGsPu)LQ@ftr;4K%B-nk_*2`_X&*pF4b1j#VESkA1U zwVft?P3(3iYuVZ^QPA>3lYTgnZ?%7Vz^@w^x~SO0YqJ%T(5&0}!yWhcBvjLTOYZYT zuQpuTVp!jm-lLj&ljepE_S3^x*tTNO)>i^sHDt{w6Gl$zzCEy+*3Bi=i`#_e3v%y; zS5HPCikc*8Ki%Q>qBjFUlVgY&gIn|V)^-s>EoP``uj-1j;2;hy7=L2kDH1ZC|VF(C`Q^y30F*xzVvgf>))^N1APqQH8^;`w)<(T zeoN5(Bf7q{RZ#kCg7TFKWzg3h!n}Z$)4?+2Xvsza$Wx(VIOb})-W`|l9u;t)t@0399@au&W2;h+Nam`9SHuhl9e8p zbbs*{m(@%|UKvBj>JZ9W|M_W_gB)L4t0dP0Zp&bew%S6;5_vlza%!2)=Bh#KFnc^% z$2bPIH4O=N2>-B_)8vG`2E^0I33q}SnlG!L)D`TQ+KItQSh(!>ALY+UwPRi!0$JLX z0XMJvXG>+5*Il;w-CIMSGJjP|;5x2qO1aws5$G-aWdbv5yu6>;z+}oRu>HWH6i-@` zaTy%BBoJ1m{Dd|MWLa!(2-2@;-CE!stnDMu(uXEt%ibM)&gS9Ya98|{dC5F4=BwaVfZ(L39UzZXJ3>{H`O59+iZKntTYKD zC5oB7(a`t#gd=6nPT?>-zkb~goWms~3JZ>fClogW7rhxAGa7Q@t~4_La$={_&p))W z8Srio(R`6H!rFn4pa9zIWr3w%Zbz#h^`-L2WrIAbeTx+RC4Ig&)|9@BpOfL%H=2J~ znCtyS-ct(`;>ade6DlX#((6Va7CZ|5s&*3wQlU-$NZBDG5q!6@u=L05(Z*q07KA)P zN^c>~F#UTGQT<^X7FiV2U8OEliiHi(r@PksF7Q)M(WF6p!qHB$hr1RuJOV+g3Cl#& z9SmnVXe7KpxWX00n+tj5pi0BK?P-&h>qp(1-+*0=;c1^fR=V2V=<%KI4-0Y=+-C2# z#EHhcYHl!@&7G>O7RglfGO?&a=>Qwr;$JckAbBLEr5r(@vdLJx=7`zT!4K}ShUc1< z$git)(?zUrTRK&+4%KReJL5ZdC~JpHyHlCkRH@sRFUl+se`f{Sz2I%=WW3`2Uh(Vk zrq0Lk%St@|A~UsWfD0$1c1f)or8~P+Gn_s8?8W2Mc>Y^CpP&@~N=Kk;$(&tH({{Mc zWWLg+U*1q$X?3syeWvnm^^lqSFcSKRT(^=_EvaYwXlg5Jk@rWK2kr7|`9n=%c;cL= z?V}MEhsT?Ca}X&H_VHB^jfGL*lKQ<`9zh%aYjyxwiaEW+MdyG=pSdd^fJ+?9m#j8w zP{)=XvXYE_J_=tQ^$PswLEXv;(K(7D94;^50qyl?`A6)dF3FZMAhD$MDyM@1vO!9G zN%?Q)nUDB-#biyHs-Ny#M{pQKnRB)v)*vlXIO3X!0*No}uD@2Mxjt^&dWs!R*@8Bf zRSWDvjedu_@HQR`xfA#5XkbwZGaVXac{=(;j4D5Vs3M26>qy}zdzZi;EAtcg-RV5( z(ty6U`NPV5!(P8_o<#he5SB{MPb{gM;U2@aO>nbVLIrY$o|jAB&u%V(D@zensHH77 zi`yzDGZOIBCBNqf-5+!CqZ)d>2FrWp?sxF&^fIrDXVC~#NX6X<=6r8t=<$Q{n;ctJ zM>W~q;+K_t#FwA{htlJ)e%ha#3BcWdT7Q-Fny6){2Y~54YW-7BuA=`28!wl@2Ljhq zpofoN1wPpD*Uf(cB11W$&-T~H{5MTFupZ{{rw-upuna7on%lxx)(xLcgDvSNqJ^yR z9>d)C!L0KY&Js_0h4=U+wQt{}0O4{n4B@v@vQ_$dU+xOU_HX*$C_kR-IqmD3eDvEm zaHNrY`I!=I-$!Q%DH0b{>Ui2P$2=;Kz(s!pWV3`pPOl5H(MSKS9RM&qmLO$)M0!(~ zK4ogp-SZ5Q$t;V85QT5WO*X6gZhJwIDXTnFRrAfZGkg)ebxAz>j1b(oWd9%-h;DYs zBflAseh2D2TTO^Tfv3&M^|jg56hS z?RQf*dv@PCN0W}b+~Ck&bBKZKV!YEETEKPp<}t2GRqw-F$7Cc9@3j$LN3}|?JXFWk zOnjiF`*Ad%{aEX9y|UAddN-f;q7ygJo;&56q@?Wfnq0*Gts~#%3m`m0_t_N|xZtrs zNhDJ7dI-xtdsB3rIz85K14>;>o{15mJ1^t;M{&DD3;ZSSRcJ;%?d2Q{g*H{gP8IfZ zVpw^^@R(OnZjpSZvE%xc9-$x%^o4)S`FoxW;eDIOEDdg+?In)Va+?ML{JUJn%Qf0z zq=rxOvr`}0DK3v8jRvtFXv?M2bMWEQ5=5t}%rGpEer(sWIP#Zk8-Pxa9y2dFp5)-} zU6s*u>s8*HifQwEbfu@~SB8X%z$d!1-jK}fNB&V(?xQIZe_)>nLaS$!PyHejwWl)* zC`!pO=HZnVS3oOql5)(LXF9PLfLM%W^#Jx39NeY@D#k>VkQL!$7!n`YI)CBJugd=6 zp>H1(Gf?)RSKL!dwn#URRf9jaZ_7$(x_emd0*DzK|6_Hp4D&w$@?10mywHt=01Lpv z-?#>I4HowDTQsn6&~MHFh_`W&Fdoq}pkrd)!p0@O$M~3qgp~Ig-~A{2FPNAgSdg;{ z$Xa?pzg~j`{n`x-5^(r2YpF&+pKFJTZ7WE*+vQ!C^SpxfG)W=&=yvSy$R>6*S$Pbs zlX02Csj)Ed!9dnwNs4}TF%{QFhVquFXt%SGg7g0(|DT@(P4?&gSm>B1^9qcAUFUzR z1pgArb0$FakubL247;6Gm0-ri`fYv}^qBs?;Q!0>(25OjJYaJgSSz4$-^NN`99wzA zbdEVaXNNC7^C6KLpWHh3GYfs4&MS#gaKJ~ZCum4s;yb_~5MroawAn7iT01DkY-Vaw3O7l7fyTl76qub|jh{ydU*OzBwmawQ^KQRThk6qmgVT}chXWuK#KF@RKqT7&A;^y0s*Wk*8 zEEUVU9AxH#2jzFiGHaaW6}ycxkNz*9l$^K1KE4uQ$ZK$Mz0HHqc>$E#ygud8|FUuc z_@!O|?~M`2i3x2#`7C((X^}eBWjQ@qyJ72{PCP?S z@v>j~$$e?I>5BbQvS-w_zNF5m@8bQz?&B4F=XVQFZ7zUjS=T(kdmjd!z6FBmr!=|n z?(U93!Ub@>nOc4By%yRtZzQy52Tz}^1Sq3sW`5cEHRQpWd;RK;t&8SqSD?Gs`UOD9 zvmH8ZB;(_Sm&Z^COFN~TQcggXU27HHg zlqGUeHq3>cZ_b6N*}jdJYJix$|BPu?vG3H^l_ZugwL#@C&_tV>!hXMZX@!xA5iwhQ zmc(9e;uGb&5lBV!arWBt=20Eu5}Jh@^EBszYLJ#~DSU>=<<+RU;UFSV1jSlv4XIE2 zS}8S!0=cOZ*HrfQkdhs?k0WzlzPV1^TBYu}qM5wz{R8T~Il_hPxjP<9!iGm5S)BGr z8p;@xWsmyWjlX#J_Lu{VNhZnt>1!d%dO4=!=QHfDRoxQuSHI|EySnDk8fat$G2enb z!bZt=8xf<*^x@K&EE!9R96f4c7jJJM8f7yb!)KaADAn%8+#89I4JCBWzcs?1H$>3? znBpu#_(=o#(*zn}#P_M`@o~Wus)AfwA~b1K>V67^3PW^+AC1Q+vw4m)6BqnVwxz;&YON4U$V}$T&T*bbU#mC z$Yn2SO~?se%LiwuWC-PNa;Od2un>|on9X?qS{H6(xZi9d*YRJRrQ>R_8pz0S)0* z@7|k>Z0O&a;z-I4@@;DvD|?85iHnp?m5dz5nkL|1{Ah(U6YGrP0@yQn9z&U$Ap*;F zOU}$x@+ES?ExtSO@7MP91aykl5mScZ&l@)Gl8bIXGU_VeAs6;7wg`kNdc`5SY_2y) zTcXCjCip?!K}N~P$$Z;` zsVK=DJ|(TOdh=>!+N+hHl6xlOtmnRS{E_Q;EHpu-GQhb5~@G<5v}IMETW6)x~vp^^`D=Jj_jGzpG*VxHJCcSId^ z0W=Ehy^Wp_UxqNH8>wm1%eb=X71;#73CmWV%^Iw@EfPkQavQcgh5Q^l%E$Kj@s1B% zzMh?6-yP5w$i~MC*e;XF`xk%!nMYzeviLhK^Icn!=-g>3I*-;7Ji-tfb+t z!Qw_9|6gWs1OLA6O_^6BVI;Rwc2a{g17wWuC-M)Zg~_!g+>~V#mZg8k6&JCsW3JgN zyIt5lw`sIj3{e?Ln58;!Jwtx(|H?R(DXSW=a*PAtOvh_dR zU(8WNIeV7(d^O1AMW5IirQyS_w8En7XiX>A1g_5VXAdlukQA6cDxj}F+^ZxIT&z`6 zUlOMDf3@}msqEprr8OHTVkjjY3tUb4LS`; zbEqU+>FhxEbW-sF`WY0#=*PkA`I@~ID!nq5!mXpGp=&q8H&RB%HYq!|)qEvN6sSAw z!IPTn6QGeHYZ?0EF@_?-4>7@E+C`(bYafF)33>;{QG{t2L2*$+hF7Y?&37X^Irw>%){8a&Ef5uUH$exweK9lS z%)ZDSTS0l9E1_bqUS@7&Vq{@0e;s9Y&dt<)#2Gb4D`x!8qNQhVLea>;DDHy_=AO;H z)S=hoziAIi-`cb0FHEl24$B+vXKfB-7%%C)&8k~}r`KVHZYL4)RNaS@2Cn^K#OAHZ zlwWFeETk9$DOf#M6y|9-a0kVIX)`Yb*3fVI0((L%ACfDQ_Oo9JkjAzVv@lRToYWZ- zbGxrtWVG&aqziW-%KBoJ{&iu&Iko>fJEa@5+7GOI zWu%hjgEM7{eADe$#K%kaxAFb@Bt{%{Z=n|Xjw$~#nF}2qvP{8zEeCPL7XaGmIlKED zMNMz?`P(N1qFkDv1;$N2`@E7a2=^rz1%lOO(Vl4!o-ugw7+!JTsccAudI~BuXqmH< z%EtTt`4snw5+u(gRqKY#?ya~i9yptp#A)r9J}V3=T$gped&-CY5XpBq`9Ym4Mtd1*OlKjJ45(-nIFUhJBC1Bu>6`ZornkR8Pyx zG;Yp1yR#om*;SXTU7Npx_~ljicK-!{CvotGCEBbCWJk#BQ$tUb6=XXA>mzB->MTY# z`*ErvF>OviuJX`Zh*53qxUZGR5Kn*0(jJLPxGk5XbS)_L7U@8tsmQ0@7-4yxAp?ky zJgE_i{F+1I7#my%@Agyo3jpNP7aSb8!pRw)QrU36N*+-n2s6qKX&YwS&)mC zG3IX}g|*9yd2MAs9o%i)jc!|h;{h-1SnX=~Y8SMVZ5)^?0+-4}6R%!$l)j{KKzL=T z2AMdg1B(LTY%!iaLaQeOTC4!|g8PYJhpQ1*=>(Q>9D;l}Q<)r9kKbHyg~_r}!p&E9 z`2OJe(&NxLZcp(hzQ)kk`54c6#hK4L57zG2E32_j9a(Y7d zA}_HFQv~l}62(fiaN;M(yQS2rO$=Cy!t`|qD&gDc8^dbYt$6a;F*%fvO&}s*f=+ zb`VE>V}E)uGrn0>!F}D^Y&U}w6K_e>98)|U>0)r{6DTl?c2~RN65d(TwWGUas`1K* zk`JD|BpI;KQSl^_=FT0rIFfg&Yi5mE82_d98*ywRNw$hAWRo|ub3`YZD4Z&$?`DpX zsfFlKy?Y_OhW@bFRa|f2dJ-Gyb?y4Pp{6zx)Wk+{a)$*!!)s5yIT0vfLj1=kEybK?km3@U?^{yfnzVC#ZB4rZKV+1TEzmey=v%UvhqF@gdSHeYC62}6 zC64)MZMeU$u)H%zB^CX-lL^^I$;nBbnUJ3p?uJ4xNpe^4Cqan-T{m8Me;Kc5ud-g{ zRrJEyvZBh~+rbnydWy1RsNcV`@7S?^EH8z5-3S@h7F%0ot(Ci2J8OVKDW|v}QZFRQ zsT?y*ZCWHH%x7aGue2oiGViYJRH&CP}e_f?@=%mZoPw`3{ zzqa(3p&B=h3+z!T%M~OneA7?qB~jIa#-0rF4GObRSXWsUYj_XSJjOk12_uh!#=yh$ ztVjI($wG~97U{l!=6)q6a%|?X*wZf&)kX?D2BujpS;%OVs@YXZi-Lx0Jr4z*wCCh@ zvJcvAFx)SHCz-zngAl>A@B&3GJZ&03_|YYe&4S!5 zWwfYWHWOu5l|4p-{^Z4skr!LVEvtgh(Kw^42q*2i=1|Hlgv zh9ORUoi{s^K3nIan`_Dd8PWka@`#CbH{?Q}b4###sYK1e#qxC*O!IUP^iqL>nn2dtMhL-3F??)3w_{eB0s`Zt| z1QM;;wJ?SEuZ6~8;|NGli8jZ4-SYTM`zd$#nrrF*ot_2$>20yEJWL7Z? z?qDA_R!kJ|lF{an^CyqKVe;+?;S1YC6hfkf!!Y5OCkkpI!g--}D>Kn?A3Az0DM|$b zIN*yHhGb%G{8mDS3TR|(hG+82$AW`5ai1~`0C~RS5~*`==#&EeU5W2vTR0FYi!H8` zo$ai}@@isb2CPN%9mGEcQ2o6ml6EO^s-Jmz#PF-6eUh^1#rlk6KOjsffU+QS0X&%8 z>)k?`6s_NUCz8+gL5Ow#y0fTvssz_SNpL`RPSe8ERXRmM&fRRHP6bV!NVTzW1UDn> zC$M~abVbD--DA=4Tl-gBSuH7zzqa1%Ta9!jyqqFU5^;Lcc}do28ZavM@Ao(wzGa7 zp6y~3P92i{5pQW?uzELDgWzLQ?&*wymb9K=G7vVNFawRTwBczo!RZzKeki+QT0Myu zz;;3vk%trOuqt?Kch$O-jtXg?wRVDV|5!RYkAo-r{+q&D^j%eBj)puKQZ;f*%U$Wz zSAjf}k9+bmT>B*$MNRH4F%8R=#6QkC&Lnb;k0&I@J|Nu50vEefT2Xo%$Guxk|C~+8 zWb=AxrHucRvRq86t^8;ujpN~U!KQqzO@UT?CV!p!2U>;tD*cp|O82R&N|GJlKVL|} zM^u&;V$*!urP#|DHXy!WipHk=w81Eoc&3;J*TNQ_z+%iO*n~SICBE#KA(5EdD4L{( zM?wvmfS6l5jymSvZcx;44vDn#thr9|A|_n*+c0ZnvcVGrWY67Rl>6xCx!=+fIfRdc zJ;JhMZ7035tRun+78bnN95uVtmHsc^jL_a`7$P;++}^v)suWhJ;LFY6xIl{Ig}LO~ zn;Ua^7~WXlkW6@$^MsD9SnN5!aDA|hZIkmeA@49-LZj4r?#$qoD%AAweOJGebX6R= z$#@T^qsPgj078)9%Z#Lox2*(*-T_f?x@*k3t9)wH&v@B`Rb4-LxV4Rcz5qVob?%H` zu?DTqEhDsz8K2!Xu_p~ck}^x!jDI_-5JKjNV{%uBL%J{wm6AZ5Jw%h}LGQi$9=!Z* zY-P+au~`mCjluHPFR@YvO%wn|rQ>Yw>xlzc23c9!?wQ#Yc>x;WnvW?gYr6yE19B(f zlQw&&h*N`gM;L1BE$0}M1(|1g8@>e>0IwZ(kKzh^t~D)BX(Nko09xi2Q_G^t=8BTL zQqKV-KD#Yu>;iZmt!^-P(%5TwcN4wWHqq7eZC14W^)VIZ3qaWisjU4LLhi_7Hmy?m zH3fxkMP##laG5XU@7lWjR{)-%^b?n!iQw zXN~OtZ5<0R02qv_k>CR5I9f{wxsgh{6tn&Z3d)KY{n%^petc|#Yr~>4uRZ$*58~7_ z`!@8++lZ-E<32fNSj3Hz#ukrmoo{pDX(^^F^7EzgSb2Kor0q-h6(ye<7&)=S5{f)C zOh^29&nSyO3#U*<+d~wRo&Usu1m3dh(?=2om+4|245T{nBtyeuDGiR1IIvA2ac6;b zm{u6$1xmGHQOIKtOt*HG4eU+KCz!@rh>Msz{t4R8Ypq{Q`EnY~6e)MvqH2Q~B-X_e zEA+&kpClgTz%Y&DxBbBcfIDC`(eyTw*cd}qXedmT??>)X?Q3OjSq>SrU?y}!PE3HN~Z|~1` zQ6I+i5e;JrQ!W16LG1(B9^R%e$CrnqQInHlO;J8>WVtkX-fYn_Bvi7q=^KLY;ec1 z?%CSyyZK_PL~h7DcZQu}+|yILlE|l0CzH}9a@JDGCtO$L&|qU`Z*d21@v^jHOk%FO zl5VtXo<}g2kkmdctuDxYJ*L)C>!D-+s(f+lK^{q|Qw^Q2J;@Y(f~maQd!zQ*xuL3( z=xC%RD(WH_35EL~9tQO?90-~`AT%;E+HTehm2cSOxt%szUE@?ctk-oKAV}{wwK;=5_ihM^S$1@-;5U#IuAk_1V zXH9A;QBhw`UBX@~K2f{}k`G)ufoL=1iC4t2GhODERbR{*3&#+(P=?Pz%IJ~%mnn)$ zUH*gSpb|2G%e5weeHI}^J9WkM8oY#mZlcOC{Q85aS34*@`Alo8tLRR0ZNAo8s4%e9 zFc?KypQVMH^E8a62(*2xi-(7h?TuY6tclDsg_sgupR~z(6O+V&-bcKNp!~q$Oo zdf;{U;H~+VMzzB`2~Qz3ng)6yS-l_!hr^9H4DeDKWw3fwPDgUpqucifNRla9&v<^# z{cc3pLr=w}NyW+Z1lnO?d}*Th(E^wuOLPZuUIJ3h-5fM4w6yx8LTSWJ3X#pFRp zq*r=W_-5!)x~ZW<;8Ck*!pox84v8&SzRBL zZeIX1if-aDD;bqJH(YPq)qHS?_SP{zQF+MWVX#oJKFp5#NJk3@LXK-X2E(04iJd<4 z+MsfLHZ7oPz5nO{kMZ!1g1qEDj!jxXx*LFr=qPV~&euS^MfI_+F3|TTb@DU&HyzJ3 z^%LQcwO`XYn(WtY-H=c{YbxyLnGmCaJDblpnmG;$ppyLm*!!yB$dY7BF_suh%*@Qp z%*@PKVpfTn8A?nkW-c)^bBUQ5YcyV_BTO?ooiR)5hONQ5M_Q#6s13Y`DYa4uw~`D0d)xL0#$;%-o;=r&7i@8 zqeR-;0Xx_t4iK(qgt5CR7J4-4UUmIvuKi3Lr-ruKLb9sR5Vb*1;Utto+D?2luu7X9 z7)@W#%5jHa`{1yc{S<8dQpDF_#J1AQ6NF}|>5M#YetR^66X8PvamnIsiR7Ts@-DJA zZw286+>JI3_JGB)u^L{uRIOz_8}j07|LrwCf3S3#=eP!|46Ydsj|bl`;#10}QI@1P zLqbXEUUaTe;>9pMEb=?a+CvFmnXx+8uRnn)p(_GN6*652p4TG>vbhO^LO{{m$QSU?XYuMkPp+wvRV z55;~hUEHQIxa%6y3_URV*=~KK^V2okz$GSDBkc>X@s)p=p}GopqLQHEd!8{%i~m=y z^^?3sZ~zxV3(PJE!X=ohBt1aI!tyb{hz0TiNiiS@xI$@F{A@-SaN2TP^tVtiZXb}dhb(JV`g+emA9HHGlsoP!>aq`(nu&MX2G6R$ZIF%WTB$Q> z!U{A_G7=9zXpNcV6CP1qr%05>s^@&<{tt>y7o(;n!v`Xe|-`YGsW!K98QJL<8@s;^4!2{X~TCd zfPg|cRjA#6j_Vb~p9S_8@=G9!dnAOv_RF74wfP2olyPbsV)za=-@Nb>T zis}d|{rH3{Ja!|NB+XrDrA*tWO&cDLKgp2|E?GViWYzVx`m-_W)_NRf^S}x8@aEEl z^R=R@E6v|u^Ysvs#9qOYjs=#9mD7bJIeNKnx?X8E{?xXjy}$*y(v|!-5WA=nA8okLs)f+-juS zjdMJUdg(Wth`(bF*{u-1_bj%fUEO!dOVU+OtYV1)ayJOeOTT=W(RyhP-9rUUwi)4y z@b&y?yim5AK^|~ZWynEu8_>x?V_zqKGvBJ@U-4M|?hpp`%ZIOG_03z(8X7%{EQxyF z`lXmoN^o}|`)CKAp1KJ7mztjfs-I93uJLamv>?nNT{aJ>O z?~>3p7jI{bZ@->^K;M#?px%1gKsPhd&90Gg<6k4S1wN2fK9N_LZ{$)>C=0h^J_PgZ zNY4pF;`M4PX#H`(FCD+4D{aK4O_NO3)$PU^i9fkv8@(BX{=Px3GD}Z4$#jDe0!yaN z!oStYE+JK;lNHp^Rnsy=XMIclWC<30LqG=4q|p1z*uW#o&cgi2Z&NCSP&BkeLnCJ7 ziBK^JbC4{SZ-f#F=48$4=$Ora=@D;lDh?efd$>;!*^yApSicc|wNif&{)v=;CHf6= zGM$7h&F~R=`CFlfXFT0%p15~9ZRZ-w+2U4W$SGKs-B?Dqq))ZGpp0%fKgKuqVvTNlrm2(ls8jOy1TJOD)5}oXJ&Wrv&H=gs{eMpqk54 z{_DuqxF=p7#CHZ}!50JJ%$^e`Dev$ea@4D6yS|0~Qy=4}oIXQ3Au>6q$tGA+P5DfWG^JDb$+HqH;y-KgkRh0}}k-#+_t zj6`x2-9nO;J?Fgjy&xOXTpgdYnQSS$aOM;>mDw->5J{1?C9t2*gzayj-$0|Za4L4Z z*5z7EyraBTqz^+0R`x($I=_KvAnIZuAJ$X=Q(T>}K8Eg&VV2V6KS3yt(zoH8!DnUS z@tTb*S$Fw6ADm^F;Oiqh@s@aN7bYOfe%Nq)da%1Q%j&}K{wt55x%sN>k+sio*5A1C zH}qBYNoVhrTzRF9jG?v%)f;~BMOf@#v#5H#A6vo%@JL#&a`_xvwK4IIoUU5w_7}~M ztZQ}J@&gkZp|rI$dxu06*E?!LAG{YuAcjboOwR zKz~VIZdWx_`Qph~9tiSGODZQ`I$8p_?-Mvt#d@eUTxZJIh;?Idd6l14b)CTFkE3j} zw0y+&Q~~WReyk3iQ}<;;DD-)8yu$Yxj`eo~Ja?sCRD^$|*}(<+L7nral!T^ZOKhz7 zt{z;#POkC0HDUX|Z_ZsPKYB^F)~`m7;(jb#@I3T695#7*bN9YCDP2QMtdd+Fbd6B> z{#eJDeHv>!hkkduOf`9?%6SvlzXs!-~%Gcc4fbm$~QtodJF`WDLZcDiIr zAF}(9B!wFMyup2Y;o7;BlH+-b>gIK2A(7hPIvYl(A;vk~ZZhz_i@`(YPFOc9Qo6sG z3RPR)kNYl3T|yinQh5Wb(w^Ty61FQKp(~VKCU7?buf9*G=Wy<8Q@)Y`k6yol(joF% za^HJc>3SS*H8RAeOV&w$Eb=c&3yS-HoM;g>>6gnAO4ECKI>qIXR!|&oy9^LykIYh8 zx&8@vZHjYEZwmNlO}h2 zHY&(H(O7DF$+nh{(efG*r?-2NVd)j!ej>Q;v#;7`4>SCT|Cthqu%mizPg-@5Hd-oW z$1J=f+VHg+6>9;$B`x@p0qG!;!KsUuBA2S;Xpv*ppD8Dc3F9EvxEPP4wZ2sSlJiH^ z6%PAqZbPK@Ec-3wurg){D29jjX;X;Hbl8ohSF&BbUapX;ASi|7%}C`@X1H*D>Z{xz zi0Jobi8`zHJ0vM2pQ(zD-o%~Tb z7bwxaeagI9ITlmlp(3`5E9atn9Yb;y|Dg4ok=aY(45R)HikO=8uDs-&^e!B;_!qjo zf>h}8GO%82DM^O5ha?#oTo&$dnR4=NTCEm&Xahs&Z5kazZ-SmMH&C{Kb+}AOw>)v4 z{-4a2YZ&!o1=^t#V!$fc?8y9G=3@e#v zpWLo#<90*4uVU2~=?ED;fCtde#Eb@(t#GXN)m$TLU*!k|R%PlsGPM*lewwspO2E8A zr&UO<1lvW2_+I*>Ehm3*@smHfzuTGq6W_b#N1uJ)=Z3hpBjcNP$xZOYxnc7g2(-

;iYh4e!EkONPHBqaE?RuaS)oeree-Yh_t;V(iH+WT!K=A3Og*?`jjh_wjah9Cv>! zQS_zka=&{|-jDe=P+aB%rnlv#)kufQ#(bZ9Rb~k3I83R)X(}4m90uE0E*s_ZL?qlS^2-KbYraFQCoug9^oQBhN}esU8g1Ks`PuwKZ|=N zCwFy(W9giVIZuU*jt*QO0IHvwMb@1f{|`jc?dWHyA_T#L_Ldx-mUGT6ewR zb#~x|9zS?FcfEWv>cj{?3d?RRy$0Qh^n6%5VJbfZu*_Ow*E6-O&AOdfd0CeI95gM- zIu8p#sj;*IV(g4K1u z!=zDwM7@ap-SUJHf;I)uG^|a03zF&?=R1^OcR^bg85;S z$8Y{X#TvBpw|k|hK1pZdizCIwYOi$`!!susBD3H6BVYR$R`;9dVa&?x@B#4|MI{c> zClA?u9*efG-_5KG-^kWjL|&s?%1AHRj*Br`+MfATrm)rB{2|Z#W4`a#qbzTvo-A@aU8O>BK)3SOfl8L-1~z1(6lazPo{J(Eyb|B zifuV--C8pi&Fdyr)w3p3TGKOSVu2TI6XO@ESnGDx#VG?Mn&kiJ#=>9tTW}_F} z0P>`8hiO)|(*UK6#(L&ep*HCt^5y-xf#l>ia_7=GEz30lC% z4+~yX+Br?OS0~%F;#?!{e2Xozf`%sH+$QXh9k*X-kJjB#!WWOgw-3|~94`eG51)vF z4$FSSZy=R#{jI*gTxg8^T*kDN1Ye7bPsMg$JFpdq7a^E^1Y}UGnA|)k%YmO^JI(N! z9APlM6Cv;8pYzpe5bj1{@sB+Vdp<-kGrzuubXxMe)iv!t`9!s0w=Yw-Ub!^xy|0&d z;&Tdn;q2Yta`JnR_&8bxnz_}1eNW)gN(d|j%V!k%tdy;ukwh-jTWIdZ{oLJ>XU^rI z0S3*o81%vQ#jakct57|P`Pg07SPK|ie~I}+Y5=Q0&LWwmm2T$v>pI zk;5o*FYDyAUNuqV`sHDApUghFVNoSei`9v5_8f6J{)%G6I=zlRmBcvP#oS^eF&TH- z_De?jxuk_9COb5{-<#&Y{qxl`k$nsRw-9F`-FS?h*(YCQC$EC4nqDU}h!e6DaAcX= zF_YDn;%1ZpIBY=)DqiF4bZO=V()7ZO_q?>!91;+khkoVCMsTr`h^^Wl+Q4sC_*W4 z74#1Exk(DTvu0wib}$-3(KyVtZ@jBAvJaE3apF(e0U~*zi}cHfkmK54c4KT1mklA# zy>kH_fS#=>Ybf{c-s659?7Q8MiGGl;Bi)|?>!$2I6dy}-w$2C3qb%kJIk#_0q$q~u zd35K%>>L|Ab2L6xR#dr~%H~MvhraIVp*${l%79k~WAP{U5^F|NCruSCEQ!P@yAhm- z?l_FpE`Rc8meG&k%t}V3(;y1hwsD)6N7dkUQU-&la+@|hF?g`Wr=ft*CSmL++eQL( z8_|U=yC$}iB45|(w=qsBK?2)$@Y)oG+9iEOT9Ie(^26yhGl zi%-EU)G>I4GPK%ms)$SIPTUHL=$=v%8gY0Ql&77DZxv}FQr|`_G!Q@i4ppVck|N6f zYZSSeu}xiR;V)!0p8$lckDPofdcAde?WbbXutT4^Q z(J30Mn`0GEd+=(XQ45hV<%9zXGRj13BeRTxP7@zORt)F?3KUVtGuwxL+J8WIAu2gx z$A01rWx&WKe?SnsI0%u|BWC3yYglB9B5hJ>ibxXyRkS1eqZEPZtGK6h+;Unjc^x-B zcRTKfJWgY7mv9gN=cYp#V~EK9fG)3NAWiNQHPOo(U20jKM`t7WV$Ms}EnYo9Eb~zlVCUB~NNs$>6|J5HB!6qGdC6t5eYmdStOo)RDb6{Q;+LvFY=HSBr6O%&# zxoLqvI$gYt16Ilttcp$MmotJ!VCs_hp}tL$@LK%_GASo1XWXtiXFA1R;`)`HJDDKb zR4(JW&Ym=9(+?KiL{@8fYlYoal{!MW<*@f+wiP|})8}sYJ!A`c_ZRN5AwJZ_tHdMx zNeh18B<%JZ&f@aWl{391e$O~<1Mhmzn#VY9YgX^)g}3>i7ux2m@m1(|fi<_g@An}m zE#$j&x3#H**qatS7MESsE#f{sI0C53?h66sp|W4+T}ciL>$M{*)_QC1%D`idpcO^6 zE46~=ukTe=ych}cOQMZT7Vc;W3`xlKa@ZgWq{B-Y!L%MGk56T{N-#X^16705qdiIY zOcFVieRSnP%$Ml^OZ|tHP#NR`5RdI<3IWQmHWMO#<#%z zC-%n2`172r?y}qHU3Bp4ECJIRlfZ?CkF? zHW+W94iu_Lr6wo=q!ZN{!oeuDWv0~2YmUP8HYz07cR3Xv&NJK22)VT>IS3pr< zj-G-o4}F$OUXQEzX5M<+6Q^~f@0^ZU`w(M5Y`;Q%O=WhvDUsk0|Ca%NRsQ7a`nTi! z4@uC$pM5b*(u2vYFR&qlV8Vzf@G>Dfue0l>)^j(jBVkPBl#@c=vHMjjCQp)YO{R*X zxu(Kb5h?0XtzWEfsyK}V+Pbci#6x{4)x#IwTuQ+!E8Bc-{a$AOD!Vn!GI`;0*Hd-t zvT0@a%jH&s)%M=6b+2KkTZ2U*_p~H0ukQp!RJE@^C#eLbKPK-JGndsACU^3DNQ({T ziZ;auw!SjCN?_vU2kRdfb&TKWc44+%wTl_WxtX_B7}sWL+&Vmu2;;J<4~jl$h5{K% zsvtNTTs<_-c`vL^+m%FBm)(>)J8F?{xdO6clUf2PKEO6y zQ6xSD$|G&%>8{Y&y7{3(eMfh^p+(i~9Yw{Oc^;~i<8xd00!RQvGRJJhm=vH}0M*ny z+F)cpgwPyecx{s$^?_ZQyt=^`v1RuS2fU_gs*oF!qHgf;7$md9GbjI=qK zz;6o^hG`VX*@+cGI>O$=_UkIlA*_q}25t3bALN8iurvXzfajOnLuB~2vebnkm2?(Y zV0;)?uvPVeHeFA$`^?rO-KhCnq<499tr7>lLPp4=wJ&~3_uIz110&)Y>xP1w=-#HQ z$6k-OPeM#|LSR^JCgNv!d0v44p(x+pRL}Y_lQxoP50GLGA997D;DJQbvV?VLaa4xw z5tXsL>kQ&5#DCHreNhF&00Q^y4r(O)s@>3$1TX<@QhR;|Dw{hb%3WA=T`V#W=V9JU z3Gt)Eu00KtQu=`mkp7XR>gqdHg(q1$No2W@{Wg}-XtW}OxfH%&$;?pKcqmskGuJq1 zFyM|=R9xc@O>*WLGeb7vQEYR^d?PK%!s?rHjG9L9p+~w0j-2LZx5a+&1yFWh0KR+7 z2;K4l`6n{}j`MG<_-P2VDJ3)})50}&pCZLmXtb+h;jr;OPr#PgZXS`D7VMgtLCFCj zW>l0#PYjp6OzAQy9Z?pr*3MTQ1B^o7=rU*jqv^2HAE7*CE%_U-44mUC{Ks@vvvbWm z4~A>obug?|+sk$-Z4BQzFJ9jF$C3O3&rblC_p1iNSC%4*E|P}(uZ+D`t3p2gODqY7 z6e>IJDu8(nBGcshvvM5{Tqtw<;tM%ZbBpC2s$tAH`a-->PVUg;aH>QL|?js?O0nfo}N<;}pv=7D2Hu!bA zW1{qKTxDM;Blw(iqO%SQ%sG!*J}22Q>}H~aSCgC#*-S~6vtQDxgQ;a*{EC@o1ky^` za654}6peu@wN@--Oz9G)P9`;KAor#M?>8* zYYVEMXpSF;f29zllyQD4EtXp{5aRMa0TxI$;x3k#Y?%u*|oS#Z-$8QJi0qOxA3i zYLHQMeVqQaG>a=!ew~c>;LR_H3M6soq#tvCblVPc;P<6{kI1$%o2758Oep_#d3;f+ zfNrp@9$v1JMD5@ZCAbv`Ndwz5tSKrdw&%#J;dMX`+(bv4K+zh!jwZqTRvbx71Pt}QK`VU!;WvMe>k6P^^KT>NRZcRDN z3%w~bSe*H9y1u`GAUXBb3`TACaKY2j(Y)SJU(HC+G1~ewo6fbx&bX55Qzlkr<+-Bk zmWabbddfK!naJ2)j#whyqAru&dJUwyEkYaEFckF%|L7#>^C^238^)ariX#>qske#z z))7}TRkEjKG~pT3R!)+kd`|T;ISXkIYv}Kzov8SIiufVC+oatX5Fe*161y_?uaw?Y zlmmYxw?&60!p1?R4VxsqTF9lg}D_~Dw%^S50V?Lq0$3?;#S z!1vTD;#^wH_xgUjX4J}2W(A(6LSX2_VE8|A^G~n#&7*vrG#FS+OkH)dCn9nY@5R03 zr%OTyQ=&j6?P6*9Et-NB!eMnuONudUJU%CtC4}dUdMFoUGMkN9CfFG6C@0wVgizHum<EvwxZx72zLTGfVfP$altjs)0H3$~N zg<&F^4GTA|#qMb<5;rZ#?%a^99xci*Qg5YfWq&1azV#shb~}Bvh~PN8mfj zm2O&q06BliIR5UxR8Ok!hb7nW?*2R*`nX z6Qsa}=}F#y(YCa5N*ZCZ$|0>8HM@!>C^g;DvC=^pu|!%e&s5yVtWXnDTPfQr+lNNM zi8_dEy~<*+*puHtd4EB>c`_snm^HJXH5r1#9x#R!0g*_JG&5l!u$=4YD1}CBegqGS zBOAOo8YGbz=xt9#L`1~@C@AqlanTP2>TupXr(qYMi7}a zo-n?fCXO<0`PnS{*NU|YAE8_+Y5v)6w!=A`{>6EfT+HxNNw@HC`^d9eXS99=>PQyA z6=ITu;-*%tdO;D$^y>aM(9B;INUNp!dh_}w1tED=y`GKuiW= z69Z~gd&GH~I$<2lc^DeQ?r zJSq$6k7_xBAlZPLACQ|lZgp@SN6;olxKwrhwezYB0kQnLpr|9vspa|GH|3T5U_bnc znW>?+(X<(+Kby0SJKP7|)g8>jYFb>#5BrJfLW`+y+(G{?n3q2b3ih5qaZv=_k{8&1 zyhB8vEWry$$ku-i9~?1O{xS5*61>#=$27hgAVhOkVp!4#>Otu;kS}CJiNTG6-hp3N<)?Ev9>q>6}jp<9@qE8dDi)ruM_Dn zSPw_X>XHO#)C4VdThE^f>VH+%{+l2p3kt4+(5>!j|k&umLMOs8`LVWGB^xI|eE zBI_oMcQjjrjih!SK1SVX+;sp8}*yQAc8=iUqKoJs8MQ7Xl814m+YH_ePwIb>stC$=YKB$_eGF` zEgG_Tg(v4NNs|wGJGV2%9LY0DbIVab{y#q)NL6+A81=jRhH8%HD*~sQUuNK7#^@Sx zt6){pv~`!CG{k^f+K2NKq%2SAtJqW%vzQ`W zHoVX!28>9d({QnDTXNym4x4KE!zxFtHj)E~<4VP|c3f*1C@n_>QMKo-e=e9_{el_> zSJ#p%A`C~OB)&sx)c>nsuz1DZ38z`lp@%k$=1g0dgvv{|*7P9Isl*OrF2DEJ4_vzIb*7%8>k2E7jXn}GYA>}IW$iU%?a%V&p=k^hq*|V&H6pYgLth5=W>b&qL*wFiMdzpweMoOo@uIS|%$K^)te^2?Y+x zSjX!aX`&BCMrodg%$#AV0IG+bo4zfKVZbyw`vuFQkdwuTHBvzVho;(1+fAsS-S;NI z$6HK_21K~5axjX7AV*mnICN{4t5RAg)e;-atIpdlVeVh3lyMpFDLPXuBWl1403!jx zh$?#FtlOZde}fSwmu}R}=_(xNwwq|2tm{DS$YPEPw^D^SjfF(_XiYonbu!kk#7i=A z_3W=yQq*WwKM$x6pj4JoRVbvQhzA=@r&I}VKP%fM!fVj{J_Lu6Y^AD*CQN}?76_4~ z4JBM^K#6A820CA*wXKvAsUrM>C5mVE%-B~TmRKBSuZ%r`ZWKx-CjS=akf6rt>WCC_ z^y&tAeKuD!s6~ka|En-rRW*iOowcehsHt~SX55LbIule)VDSX3R>Z^b+x*#Nb6iW& zJ`f5N5QerjMcHr!Pye3Ol`<2O^c$94wXqTdZEHCZAb?HsIPBy+`E~T=izq~&2{XfH zzeEZY$r$8av3Hy#col*YlDpQJvs&IlHLJW%shR~xi#T$V8+{U%4^g*Sr3ksiQXIne zD%my0H;IF@tRFkI0HPv7s2#a#8nhXQTUUXlJcV$W=DV|(PDS|gAYsXogj)S?-1c?> z2FC|d_nzA?jZ^9U+4nPi>QFkeP8-liXv-058-0yl*zUKynQn)Mo*mOCPDKjQm_f;w zS{ARE8Wk8HJ@m1jowjzRdew|Ji@nwKY?$K6v9-Cf;_I_*xW*??!XvUSo^9@H6^lrx zv)zf-D~eh_V%8I|X;$yqu>(o&E1RE*WCJdN0uTX;&d!Fozuc>lyWXCbGOX=h2yfwI|&9X z`uX%uGmo(rv%P{jYPs!w9$C=Td~cfeYsd0Lz=FKZdFFXhmbczHV5N|FWevxbHiu@q z3MNO@R!QYpAvs!6xIAy3KcT`RzGMtpi&IraR~1c}##NJBxF45aXozI9<)K6Vgh&^4 zyLRSGDZ$GWSANEV$Qk|+&~-l~Ot2Y`J+slTwHBG^8Ev1Ogi zGWv>jRPh50aXCTUW(FhLReF(5>D#R6bI@43&L9e=3}cmG-EW}sGV9cmF>*?DZgl@L znYw1|tjbA2c6w7>kW*kN5CUF9sm9i-@gX^8=Q=BU9KgP7J5~9>Ec}{|O%*w*NzsOh zbbg_u#N8?5Nj<42AxasrfiF8YV(=Qq5tPu+3Wbm+UqEacBMb}6&4+`^` zCExSDX5^}f45DzS0JhwG7OgGtCR>WM0Vw?=OE=9nl3~dKxL2iYdwtf`YgX@6XlQ;? zV>`|AUIbP1T!JFKewb9a-o-hYjlfC^QzD$gH6DciHBsv`jB zm>^%caUp1ryA>ban4O4TOec$6cv(#6{9Z-~~8Xg)390URw9O#p}6$lI*2?7~~kWo<4 zF+MRLm4JwWNy*SDATXhJW)@LML0R>CeM1i<8Zongicwwfwy=S7QXYvhI*Xb^P(d=O z$v6MGe{s4(^8?Lzi|52N=p!8#RATgd9G!|@<9TxZZ%o2oxN=Ru{^#XCGWfrv2Q&Xr zxc?3P{6AFhKX3mHv`QpIcNvm@j1^gEMHgS%Cib7<|Lb!2tZSo*dF*OWGnXvZzVh5?8b94UaHSJBc{$B2lJ} zAc?gH+IP@ewu-V}hF$y*_}%yjephr264$A^>%G~v8l8>n8VxhNL5{;DK4mU_$s4hX z+*lin%K*Oz1}Q2Q9M$1#9gLn!w}vh^-b46cVjq@d!B zK-K|JrXaOnxV$9k?G4-8y(G*s4VZyq29j#d+?XoX z=?)Pi(FI|(?zx6-Wo)3S?J5!yAm+?O<^3g1Z3_mmQ$51^^RlJu3Z;r`dGPl0Wmta^ z+U6%}>ayu9pmGeO0B|yNfCLS}wlWSgCO2#glpR1AsnT&Pdl%da!V8Ds8<2ISQT;MA z6wd3<1m_2Fsw&w)B>T@j3tO8**c72q8i>9*87*znu!7wAe5#M?0&BbQRw zqx^I!TQI8~vbn5MiGyw;Hd@*dt2ok|eRc{e{Qi;WnTHwHBB|9rQ^t@Owt|Dl?Ovdn z7bd~_Qec6rD|c!F5Qk{&GwwS;Uz{DXtT3t^0Ruuk^KI?naJ$tl zTikcrqr@E|TZupcz&9~9_n)LuhL7vsQeuoa2)$O4k{Zp=^daF2gY&Uf_<^4+({&dtMb z)gm`P62DLjUwJ|L|MUaVnzePl!njL_ZJg|aiiMx zR>GA(=a~$gh`PN#TDisNl;4x|4=x_&E*U=)`d#eh{A-WQQ^vlOqFPskhpk!Cm!M+& zSoQqT7i%|Zul%;xFHuYgsezy6%ToJ8LI?CO%>;GsC?3|BZJ3=&2=i&3^=EGMc58xt zZ@t**NeHH7>I0-x^SIzIdL z9U-odb(ie5(Nd3@%J5m%D@0#@0dWfPBHA(}{+A_h94!Qz$NWqx?_$dq!O}jp%iVX8pUJEsHTTP3%&>}N$L-ALTc3b}u{iJs)Z=uy` zT^r2k@J45kunER`HE%OLF8&x6Gh|G zZK4hkwc%;D9C$Eu@08xI6j9+mv=`GZxED9`gF6?q7uw2BZe|*fnDbL#uC|-$QNx@} zOoap?YERF^h9m)a){yP#hm2F8aS9kE^UaL`2k|Xv5N5S!(zm|x*r#C*i`fHh+Ql_d zP^T#EA%n-JCy^HWCL#8?5Ody`*&AuCvlK>Ig480Uu^m3TGgrnfDQM{Akv15}%W~5a zignl(`pLSyzkzO&qqcVRGp|=F^D-V>a|CgWgHI*sYh=Il(!u4S!yD#22=?9=Ew5z! zw0Y$4IiH*YAD3*J4}hEJFN*C*cFj`DKIZ!xYS{9lxgiw3+ugX5VzAZ=mWPcz@-}%+ zCvK|T8l|1X$e{Gt%*+_bN5Lgfjhzqf`!*8fz-6VRbU5xKu~;SZEM~2j2s0*KRg=42 zplz}N5a36*wsugf%IflA5TZo&s9uJkGwt|w+W9p*QUFREciSw$3;QHmrkiWSMQ)(% z)+KynU2|m&s3}l0eJ8YExuKD#B60+{wKE5T>cO?58^E2gz>~Nx8=~D&H$1Sh{DY*H zwb)ZM$S_TWfktsVwG!ksWA@DtqfhROIc2yW?~vI-_(m}{8xr-HSv^C*R{feu(aQC> zXj>|56SmD9$HmPrt$sRtdkAW$Xwv>-bs&3?`2k(peN$rhU=pmiqT}ewOLch|8qCBq zP~|7A+OiA#nj`!&#xR`$$1<|ngt0EF8%@UvoVEnc;_R`Grq@|?t63al_?ZTT5JO9I zr>nrR4Y|zKg=gtG&dwiTlo;NcE;PKES&YTuldw|*K;(j=w^jhrot3kR(qw<@b3>>7?wrHPpPLZ0;#OQZ8l`w6% z=)+EnX&v5gTcB$=x3AT42+upiYB-rZSrpn^9)eWtsCk=CwuXLNTsE1qbu<4=Vy~T7 zc30|)Z1|*C0;I*Nv>w=SXCloA2P8a8WD5P+%GP3*O-v`_NYK-Gt_FFa0Mux0ePlUb zRqbgdHS@2Ed=;)~oEArBE@>R)=O81WB*_w0>1*3Ld#|kheGy8Q7P}!`zlGe<`gSso zRc3@O58^s$^T9>UECiEwq@mne3)^E1R+%gJ`Y+9}eG~$maLAqvu2CFmKpYeZCY&l7 z+Xj&@;Bp)?0`*R9Xpu^ZjaDv9zHdu*NrZg6gF?iWP+8CZNGVwa*Jzq-;_mZroZV*T}TCTRM;KY z_9_oRa9v&;*?7_x!xQIrGeV^#s4dO9h>vd z9~olGKl|uv%%FxBPjFfWug`Not-a2_+<}!}E0g#xGJhU%E#=chMYVazN>g`qgN4qN3*~#BS|vH8tbh5RXw7ai3+Ns)90QoG1OhQ zlPOtS@FEg+kWzCI7OdqW+s`pk*;ia6QxMBDWh(r}0N_c->QRX#}0eqxEt)w$a)To+u=(?^{55o=A@Nb|w@iPD$Mjdk|0BDL} zS$E5o2^dU$uUx~CT`61P(PFXG>m-M>)<){M>hg=1Mbs9misvIchxfHedH~=e2v{wU za-!jC{ilR?5Ws?2%g~ax3OX|s8>dRr1 zgWZrAgXNyEkJFOTfqC@jYN-0BYy*s%D%nlS%D@QV`~s)UzkeA-_i9>FUET%rM)v~h z9x7>VI!nIa_8D9SkkPn_*M^TjV%m)oWkAclsD)>v_tJ%Fzpk|hkPOn^iAw!s)27a( zD{ATA6bM{l#~z(uJvFr}o!aU;Wz{?}WN-P#s6ACxqB~EkY5H9@s1Vw*s@(|)LQ@4% zZ^8{R60Nt$CrSsn0hd}3J{GorxvCa>E!hy6-K93DpsvBynK17Bt637V#&x28qQ#{e z=Rus@Q;_3FV|alzJfjy-;O5{$#zm~{qy9UUFgh@9#DJd@ z4rqCmWb9$s2KW%NmGleZ`g$K=W>ENO5l!ne~l!F9oHR{yoh#f_jk5Mo)!HfEp{)&N0U z-YLT`L80JJpyy~TgVK~e35&{Y>OS&8F1ff;IgCx*=Kqb~%)Vz=W6F`@T=|hD5J6Ip zEXiG%VN@s9lN@qH`w|HkFceCD{hkF5yRKM8SeMg8tr zu5Ec%r7`?@7Un$dCT?$|qb+!4-iiot9|YxA(=XKi?Ix}<6z|=f>28k0gG57Y`$|*7g;-k9f)qmOJQHleBGX$t} za+{d(D_T2y*Qvk9B=!ciLcz;9z#=ZtX|&~g5c*(|I9ALwLj)9jgw8F6w3TRaqT0QoMploV-g9syt>cOvF zw?UNrs+Op&P|5?5a{INNycMnj&)Yx+(+=9i*D=6}Biw8f=iOIG(JTQ>keX9 z3vNOsjPRzSfTr&ezC|6+>2jA5zKVYf<_h<745FvqMG-MC*lu0+(6?;&^WB_DE)v)L z{)|#}I})A!2$n!SD8A%HLGaMHj^xu-H|Hrgba9p~3+5WbWJ@eo?Z)Uwl_jzlHLEL2 z_=S%Y+B{BZ537f&%*MIH$(-)gqJ?dI|B0IsL$MnKnSTq;o5fC@W9)y}EX#)B;5Eo3 zGSt@vNz29IoR+{lc=bf3>;dLwYfZSw)!ipQzqA%@Pd0Nae}+usSUQm&BLEYnC&$*L z+=!LY;imJDk1fFwto?Z!CClfD6a$9N32u7^C52Yj)W$uey=weHB}=EC6}Wv{17`fe zu+j;xP00_fPEWXTSKpJ3nqd#E5uPh7?1}HNYNR8z2l1w&57Ff=Cb9N@$ zu3trE>iP&Kbma_U6JP&&mR*;*f6N_l552(=lS`;nC{+^kizx4L&%epq0=Gcg{bd1M z4`6XDG{ZMRibzDHG}fY}5=d|>?$$yf zxLZqcUbK|{`M%e_t8;PAe{n9hti7}LTG=x5%rno-^mi&XmProy9&H1OkFt)mn@NbjNaiW$h4Is4@-NNw!?fYZGnP+1b?4mJY_RzxBBfuQCA6U#4cK%9cw zt`QrEu&>58#-qN(P|rx64T_bHZCb~D`ohrnq0M+8h@{k&SIiyXQ_8=K!bm7x8pmAE zCVJ`7W+d)U1a-#qQE5!IoyXkHW9T-tSk?Smc^s<6tF|4w<_m*AKPx;_-oSxAJAjj? ztm|N~#Jb!)3%HTFk%JX>Nb_O; z!ScwjX?Yz@T`?hnmb7PZJ8iq$cfDt%14W+zNK24*!wpR~J?6%GWz%DObjz994=!Fe zWZ&)9PvFnEqD&`1AqD?(8$U5Q^70ZC5&zn%cHe`HRw8flD*>r5CVCX@*=!LmytFo# z&oBvq)B1uQ0>l%xy^74eUzgM`BB2bi(n=bDq|p#HXnR%QFxYD1s)ZwOYV@e4UJHV) zJ?~`^`5QwR%+|KFIChly<(hr&HwLu|<{x>5f~swdFP50H>ef`Gz*2KE-bPvxA?C6r znjHM;Um;aB<@60)o>V5UeH7Cisjw`x5Zl29-^eD4)3sTCuXG4o}Q1dz{2LK$B##G%p;z%J|Ox zh&(n$nTkKYIE~yQssTz&@}^@XZt!$6+2>2E-Z=vMYBmwHv?b+#rtcoxIqaA%eSW>6 z!~f(Xo334UuMF)(yyzsx!*ZP2&}aEcm%X#S=&+3oS>`6bRM%ndNT^r2^i%UP{C{1G zdk*LFvL*jFxI#rfz1(qo(SsDq8TAjC&f?8Y%!&KLBF4@~EJ}`sX|7L$O|aauF;nRQ zNlJ8{4=iR?HaA{Ba7~nSL*0a~U%A+a~BXxZGM+^mwy74` z)%4_&isE%w$#?Zry5}y%;xAFBT+5H=!8<8h)OG4qIpQ>}ddaL@vw=Db!aafuDH5RV zIdzSC3@yXKL0D6}|mGhT#mb3cOTk*3$ zYMC67@pFSf=$Pc&Bc0Z=#A(6cAGE(-(Q<``f41JNt#Xpe$JVe7NuA0Ojqw0W)Kn^ zbI0L~beFrW>5X~Xse=GqraDF$x3+SN`+SS>fmP9g_~A?|oh!P0Pnu)2x#cY@UV_ibDmzQ2n8MTSePvfnfRs8Q_Ik;(9% zAizn|e6Ce?RN+Yg#YQx+@hG2jYh1YC)X=->xwUPH>)r4Xz#r#*Z=ROU|055MWbC`M zP-#$S98&lK(JXn>&1f-$W8Q<0Ru`i*j#%i(fQ;Ul(vt88CP*aZkM?9$De?92q$f#j|P??m` zxlZHQG6>*7sd~_nT`;8K+7}u1W3YJBMD?VdLb0Q>{JuJUp z?6Lo2Z3*-^?EOy&zVcpI6Jqkc=^HYbYg11C;~c>O;irLeC$9H95c;gZE!>7e8pXl3 zqFK--v+TfvYx%lXVD-tk4gI5GU$+k2To|Io_Mnt-f{x3J`Si@`zf{!?O7Pvbc(28l zBVN0e{-i0g=F0~;K>XE9Ql?gfgfTX3t_H~aGB|)wHlbY!iBM4>k ze8|pliGA)GX8Gf(BFg1dP~{`*0VP4=R!_Q07?mP}P7eo*FGH{WA4EW!5jS1ix>}kh zxcS5cVK4o5s&_ArYiwyD=K`lYg%Z~KVwG=Q?hX<1mvJzeh2l4ZotOK;WvkN<{g(|S zcuFL*5Bxl8mYma96HO&3Znf9iea+H%86!ahxwo@0JF3my+4%ZXwLhG~xS&L+Ghv%6 z;X#PT%H8fIFriDgi*V}Wb7?T*rJl69`Cy?IDqnMN2sEM(v+f3F@NK1cVS=B@C0&%) z-2jqZaK?fPznTRY1^KzKK(M_Yais04t5NoDiq@4L?rZVa_f>>`xXFIJvE@aGSi)w_ z_!H}8;4fhVd4oPHHX)x*hW=_yeC~UE2s1h_3U{~5$^ZEiLfx^4e)%f)6z&%XL}acm zQT#!lyZ(RkW7)}|Uk%#4ZkbK`f4xBkZX)F&ku_%xbH+uAvc zead?p@*n_d-B2jQrPi?NbFsm`0i&OQ0eIRX}ec=jNdAg}g&ooBAHdjx`WuXiX= z9A*l)p{|1)*1Ax7`%P}^<&oh=lKvvFx^3I4Y&MK`=6a;Se7+wqQr(W0VyA;}&&-0I zRf+--Yx#M&vFzD0cAP!Ps}XoyW`dqP4-2<3ZhOzpnJ!2Td4FMLQ{i7&$`dR(dbDsk zId#<10&!h*T)z3ZW^9CiWPqLMFKgt5rP0{LM`hlq;fOdVNY_blaGN*e&fV2s<0+rt zHBjj^PcOo8AsKfKXcub5u{Wz@-7vnMMG5S6Q^LH>TXsz0jQy;Gt#Goejv!??VQLAO z3;GS1LbJ&aBD#GF;wsFA(Rz3RNqi^KFJD+5ivFeC4pcCG#9+BLqlQ<%8W4{-Ewcr6 zaHfiZc8a8NtSxk@hfN~3!s0Vf-w=__Dq4~=i4zZ=*=NT3$e6@E6A#Io{^6(6yzz`4 z^Z%gwExBcxUyg*ebLayG7Z@8<>$;ZYC3J(jlgPB zx21&)P|h}JZx&ORZR9;Z%_ST-v_C(;Fx}29`l+RBb0u*?se(#&XYL*DpLsB)Pso8v zJ77DCeVabqSWY<_9vk|hytU=D$ZQt$%uREW^1iLly>#qTvN|6PM~Z~e$8!F;>@p+F z*-!BvPnxE9>fOj_t;)_RNwzkOEsQjL#yyia`6T8iBbJ_fYd@TjzdH)fKoZC|!k)t$LHsyG?v1XkWrj4A;9;U!MS*!;XaUJ?w;mElL7A zB=gVsWRI*eB)ah=VC&DE>f(DjS)7Cq`Nx#+9pijPkH)$IO|Q8rImbIDRtMj^xiC|1 z`Zb$ya#k^0s*?5*#-Y4gkxRTDNN4lc1JBlG4XmE6@)?39B$#()(7=&AyE06&((;o8 z*cjsW@g-xdiaf*D;k8bKLH$AG!cneAWT9pnkcMkqYLxcg9xVSw4Mr@IENn}DCIO_3 z?vI=R>*X5+J6oM;Gzw3jj+P<`%u?1-fH9wo6p<&p$elk{8>;C#g5E*&go{L#le9VG zwxOBAt!d=Y!YU7Pk_XL_zal@stho%M09weyzG4z@)ImZ+PeITXki`TnI`|3mgowkC z-Rsk9EgE0S(-xY9#abpPXrTFHfxT$vI229nv4|VRi zgM|}L1%=`P%H)vp&IguXgCSVz=XgzslR~wR6zF7L^^NfYXd7}-H~{BR9uNe+mEKIB za3RhSW_r=D4vOPUn(dQIx6I{1;oh{Kd4E@y<~U_aI)-SP)~ zvbz40=JT&q3uu|>g_Re6^T?5t}9X;GmgUK zo#0H_hJ9S5v(YdnLyq4V@_JvedIUb60Ut*X=4rsZf~Xtq&b8$5X$y~3w_>5VnL|Dh zoF=^Zyxv32Sz)kJhhb%fDRh|QbXnM*cGVu8O%c`?y618_h4JhHSIN@g57Pp5IP~>IE9hACDPDV^I*=lWU zSdpQwBlCw}I2MTHYZ1u;O9h;UWNR6DC#ZVxIhiwWidfnwZz|+*P*#L3^g;#k9_O|V zS;z7M41NW0f(*M(qG0aTy{m|C=nuC@4n@HF1oGhdD}?bRii!{0!N=S1$D-+9R z;0tKDDq}M=6jFG6ziIP2=E@xW$krSzh;+m#FuRsL{o7JDy3-4DueXx<(K0)b+7ELI&>UBQhAba>9lU>yryLh7U z(^M@?KN}-k|t)kh&~(Pz4yr$_+E-C;9-RvTk?;D|nsu#&1wU8|!0m1nqf=*r%&eY^74^?+hMSXJ4XVG45 zFbv6TbcWvW0?MT92Xal{o-8()3;Bq0Tfbh<+U&we@bx!v#d<89$(it!zhYL+0Bx3U zIRB*QCs_>+w+sVyCB(LA$SY%MjYs()wfKiouY1-~{t}J2F4fojXZWwqHZ#7Jc=)g< z;vU0yETcV1f$~j%8Sq1j*xfT))b^*HG@#L&J4L(QyjAx%4LZTWpiB+T+)KRWcqYD91YJyb!n|wM0 z$GOah>2>G~$Z769fDyBI90U3TAV(sKiwu0&kE?HLcQz_b`Jl6nF29pMIn)mErd4q! zpKJ$C8`(9RrvZQ1YnH-s--hVhIN`1~;{eyz#e7-05}T+(&ctbNyRD>r2V~ozSVV*` zETlDb2sm9EB>itdu9B2aB+bQ04 zGHu1Q#JF!aK$r((GL$gqDq5LovsO^b~;{o4#ID&G-0zV<*fTUio`!y5M%cXP6{QUgM&bhCe&|? zjNT9ZyPInI?l#gDL&>7|S#a#E$e3Gbr$}ZJ%fsx4{|4Q=3%{`ZlFTf@jD7CBYtCCx_}?rNyF`FN>KT| zgi}Oe?wVU*-iJKa$!Zuz=EVPf@0zXUwb^+pjaN-W3=y%TReU@dTW%la|f z57$~ubldQM?HuX61W$YY3d`4(lUmSRUKHkF~Lit?3VS`;(z{)TOYC-gC}RF4R{_;>j`D0{y3XEule2g<@m_BU1Z# zxkBnHB19&l(6v^fx(B!IK`1VEybdKnol%k#qUhfk4;luq`l{=sV2RVj8usgN1Ud&S z(hSg;ANC~RG!n*|t>^+{^Cg53u^t*Bj-EO|`8BBtfODLQ+?66S$iqrcyj=N)N3Crc z-WPtpd|OGg=jZOA93f9o8|hc5$`d#~HqZj4VGq;GrP%i=IO!r1nv|Fe{6l@|~V()1mYK0>%lPHi0){Qb2> zr_m%VNsybO#JM~;p}=68;#8r!S>ijuYl{i)VN9nq$Em;ujuZgbYmjni*JhO%ef=@k zZwy`AoS{BG+q+rk^puBbrWg5PKptd~%9H*NHd5MtDYZ5}Ql>|$dG%46%m>_1jPz^5 z-UwjA==zbr@V+4kqZx0HU2)bd9gMY#um<{7SZ2t;x!UYIah*`EXZyxmv6V!T=XHC) zc`!xiL1RD+kHx4x50c1QOc|z}`i6=j`1NKA?ASV9*f!_6QDcnujyEW*Thie6_U6d6 zsT3^HG)!=S?sf49?m@0DD2>B`eWhDqmn|ix=bJ+Ef`dgEtgav+10^U*(1PKfUMD6_ zLCdyuaGdK|8D33E-!+qfWe9&k7<$}u-lCYDJ8c0juF_?d>`YI!I`!&ZE3k%LziXyL zDH8&xeq|+rQ$)8;V6J_m+d!$fAg2dN7#n)vdUj**>#jFGA7YW4`3A~Z3YDVNHH8y zjBX+c4jDr8hwa?0Y$63&K4s8*7Hdo(xXB7aZsVp2|&|%UZ}*az7WCe}G0#G#N$t21REV6(`_Fw-S6Hz2n;YHnVqo zCMj^_no%IrGlIYJ(fa{#ujhvoadO3VVBB(-ESMu5T{BpYjuvf!z@}Y;lF|fI9XGl_~vQi2(OeVPSCmLMHLt*Gyg;T>2=KqB&7LN!_POq`JLgWKFE;= z-TNBHc~@Y~Qc&F+Ye)=E)~;xIQQ})D!wtu=AN&f8B)i`NA% zH>qF|zB7RHA7!HuT(qz%8&UP&l^|JekSl6O|2D?tt5bGM!uBH^HnW1Pw;^st&W?iS z9woh(m+ed!0el`4>^HpsqLSck(gsIX@`x9EiN7&O7tQ`y>`ZUI_qJ{u`SBwlH)ZZ0 zTk5KWuvR&}#?mWXw9Dj_3rZ!kb0tcMagt1yVAnnY;&|PQqo}a)I>j{LV_Ej679y|a z+UaOMTta$D#?a&C&Q9WOoX|$w)lz5cjgcY<5Qpxr`D3i;3={OCjfLFuc0!#j0|0eN zjU?asjX@K$A{l-;3}Z1l>9W^`uqF#zFZRoQXvmul!h@l*$i$|RBTk!Mp-QF|%iDnj zcM$bFAK5=>ibbRQ5YhYKFW(Hpi#HpB?D3*lU5eAl2rFUFrF+)jix|K;#ntp)r3wx= zCO-|C64-GoNkPCgHVGV*Ch+N9f!txs&pJml4)2_3oH$R1A%v=f{U{Q*z%LBl2QslR zmSJzD!qL9NoJ0VPC;6tbVJ$bunGqaQ$$#*#3}=d=Ha}OvK-?4kTMMVT+m@y@!vhuk zG7qd=YH=QniNQ6ltA9SC+Ae0-Ok5U{@sIHiQSoA+{_OSSOXf_oY4o_tNx>^~`B2ZW z)z1HU0*g)&lFg?jW%(ImjtW$U<N&P zyG3>b$QZg@`Lfkf}9yc4FyznvaH9_rCmsg|_o?{A#_CEuZEq zWM2QFS--Un^z2@MAvk+8rMOcO*m(i6YGzSE1X(0^!-%rMJqAI$i1=3;h(MWUKy=@@ z76czF5v9||bq4-qTOZ!|3Q_b63Dy3Mu{7H_BxYcF{s3Mhlh{y{3+2B_M7+<1i5m~O z%|=rVxp3RK>@;N~_-@|e*tmRafnoc`00}rwwL$LFrw*>NGh0c)u6ILQB{0V|MS|Ij z*=^saK`RY@*pL!a@piUBgW^tr8)32vC?%wB%m|cI_yu$yH%BhWPQX|EK8jKm7&lV(Pe?9 zvSEmDpo1BctLraHZBF8;YRc{trs~Nv-wu@sLG_QBk@5Z)guV7n#%pXU@)BTOoV&q8=PNNrH;%ws+E^if#z4+%~- z#g=qs_b5fVnr$r(^n3l+AWi?!Qj9=8dl#k?0pbxDV0So;#kiV86B}4h{O*BckghIQ zxZr_P`$|iUAEos3C@In+8v&1ss^%(D(3J`*#eO$LDx0 z56%j{>3W~C&yvo*!tvgF$bS1Rv=kM``?@o>0&U+R?nioZD(Mx=ifF5M&i>pCG~2{ zCynvF!BqVA^(m^}X0AWi@uq22&aRxqRstu- z`?wlQP|hJrt0iE0k2iOsGBCi`fo9G*!{vxT3fdYE`>pqAGQ9TV%Zo(S$$Fp|`56^h zm5%lMPhA(GkjlpLj}uvftXZ81R-@UOuR&nM(z}r4V_@>=J-T<2FPOT{Z2MkB0QWxc zi=g*!j6vR+#uDJ0A?MlB%c=p$At0*sRH+n>9p>Qo# zs=Ze5YPu?D4lbDU_0{yqtFXoC5gEo+IG^vX)F-ee`#D(?a!An(G+C7~PkhmTuKf&vB<8QKuml%nBpO?xtbNykHp zM#y3?1T{Y7L}V*Q!0Dau0`q4Rl}N7%JL^Gh{iLT}@+u8)$!Im<{O`+G>p`<y3G1k_kfFPMd_^~PhD+q36Yo9<&L#C^mUnqtGr#| zg=)|@!luqY9xefMRug}^PG3z~yMv$K3LZi&j+H|jarTP&AN?ZSFH$M=-ZeQp_w(P{ zpRkJz+!oK?xQN97}vr3)Nd9pWrSGG!tl-M2VV} zcYG_!`6QY%Ao>#xAC~`_fq%rYD~IS9&nS&-hBUnA%=%yJ^b@;01*=(^EF+4HTSsY~ z(HilO8|VfQ(%2~DXv{xOy5?TmkyG^+Fj=?&!1q{(XOfxwg)<5Bp(fw<+K! z0vY2i11G?&HGN^vlAV(gaOURJcq)(w;ikMGDKOh#rK8dwr5H9le(+Xy6No`2N3ZV=!q z#tdyT%(0=rGnI8P@Txm3rD_UUByj#U<1vXPY$-e`FQ-hzwtWBO6GfTir;8Dp%uW+8 z6w76{Xhhs$Q)-f~rP~!h9p%$Csgcls2!kF;fk&r5Ti1;}PGE*^!qo(%F?om}cQMAj z`nojnOs?tyKP@~YOc1;eNq|q$f|lx=F*+S2l`sNagor7}5$tyxZgk^I>8=Ow(1i;m zAhl`0G&n0|pWvCX_Hub!iXXwfKp(dxmA1m-7?a0$S0Wu_%VP{503?7Uj`P8U> zp4zeyP+_Z^#M+XHVRPkU#%ZI!RzI(i`tle^UXyvCv0`9agJGA#>vR!G{F4@8pKZ~b zLniiI`l(%REcD=`g~@(w+Aijb>@0+6Nz?U8BhbS(Pl8&H(+AE-u9JcJpoHQncZYE? zF{|{h!8c!{0OeoryO{r5NBL;UraALzM(*%uwt#NvGb1|CuDwzZ1ivFd7WU&1%I`jQ z^<>L==0sKEii8sz`@|9QFa>Zr0%x;kvj;7I9MI{nSsN}zgPTlXiQ(3y^G4s0*DNiI z&oKuIYNK`R4kgG_UN;4ITTi-nvtt}lf@b`iR;8^68{Uwnc5^2SJ~Ncl*1iB1=#L1Z za#uz+dw4e?%>6|JuSKk^?7jxkK#2Qyw%!UmPizIw@ifTmr?R_#c~2%y1*VU?#cj|e zWwC|RBdtYISdMaoFowA=Xw>tG7RExV31dJnw4?<#UOt~}(r$G@;;$SLVVW?OaIPps zd)9d*H2CegFZ4}}0-df^Lk*rioeB{{r%7Ft=NH?lX2-qgMHiDE{LwLzR2OQ}pAoP2 zaob)#gS!vT=mbRm2MIbo`J&XyPGEqsRP9Pr%-ZYBe4RuQBnBVCRK}%N_(BP$VtEz<+>`_$DVy)p)cd;!<*Lj zEU`yND<0YU`#5^JrcI=&u5aCm^Y&xUWRWkd-c5=lgO)q_Ud4!r#Oe=$bV;-9g`^dmVwOUAhu%YLC!9U1f zZ|_n6qjj1%jW>RY1Ft?hPLw9lGavTM9$6N1p_0_N->y>Hx6J_edxyZvNXnzU1uT%- zL;eWH!d|n9N3SZz4wIkv!&P}0F70-nrHVhNpWdz#+vIflz|IkPO&T}RE`YfV3w{`?s)S_$Y%TekZs{PA+lk{hOkbfmBOI( zl#dyPhO#(lC~Jp`{sBbB%f;jkWObOl$_|nP?W0cbz6jzLs&4Iog~iV2(Ihk2T0jQQ zM6{(g8>P`@b_lSedQYP;Fadn@a8h}nrW{|P;isT>uD8xbh0(2EIKy=7CtAf>u)f%B z{V`BhHYh7$Sqe>wE@1WI_?cc@2Fbp|Oc0Rj_YPv@5i6QfU1z>xCYuBulwIKWYhucu z(vVB}91b{lkuzUi8gX6Kk#wG6c1wfHI312~f11b}CQdY@CnL#XuALK3WzcE-Fpc7${w3(Sr94~mFa;I%uRlA)b#ZL9XBuMNn zLhZA!dBjK3Vye7Li+t0vVGr-P4rlh(7KkymRpjGq0xKLivZI8mx~$lh@$e&BKv@t)Cpi#LDvb@s5UvZs%^c&l$*+Mtcr$tk z;$o@=sc{a^#twV~*p5svAfDU7UjKBhS3Fb)OZ_wiCg0DPLc<$roY&9?ST7r$!xv|B zgd1&#!^#tT?G)?@yVn(RVYsZEjW*?hbwK);gH9Rufr+ zAsb)cJzjf|)z_g!kcgo+^@~mSr@kyDwk->@nHC*j*@K2cHp|%A~TqYK)aL1LoFEyu=QYvu(Us_Gm)8}Oyj)d**v z-t1L-9(=l*KIm?wAh%<%l{(OG93_a%L4+eHd zC?KY57VK3`1SiIf3C;G1q+ewuJ?pSyM2tV}sXzH(SzM`5*+nx+L%hJPwAU7$#4>u2 zy`X0`Txs4PBMGp4*s<-I+3AYOq$39l)czH>LbB}rSX+!auZ(Flx;t3CO~>Z#Q`(l# zXy|LZ!Ah#})GniqqOe1&dsv>~rJFb=u|XQ%3(1;}*9w@qtabk|-K^|ae~G?+auEO) z$#o=eJ$IhYfbuSdsSfcJ`wZ1QqB5~lWV4}8iAw$n%eK8FOu0-w>l}57N)I%BWV27J zqB)6YbKEG52MZ-ILGbEdHVV~)CF7nLLo)(L+96sK;FT_hSU78;HSAK@xuekF5G)Sr0kBfGS$`Ze<>~eVHG0k$|d%{FHTNyC= zI~N9o^Jk`%aI~uXH%2B%{bRN$gt(E(P#CPzp(WtFo}e*DgpNElP;`8575PUk#Uf%V zpWfj~@%9G9>e)AaMl|b|vn*n3Eh$w_bi6%eR9FPppc$OL)x1Ve|Mi5`X*I_LxM=!i>ao zt0no$Jbd(cZI5M+Y(EXG7(xk62d|c+QbQM6eK@RVjLoP=iE*=L)i=n)gUuq4yCopT zqZ6jnFKkC5vd0xr53#_wF) zGr?L8d6XwlDJPh$zN$?YqdSJQrtfvMH#IaC9G0u03ND^L8ZB0+#I03&ck;HQk6WyS zZ^^rbQz#b~;}A8I+5N$=hi%b&>?hg3Jir<2Urd>G-EWNPO~Ixdd?~Ht>WA51TN6** z55oW+Ey*QV_VZV&Qm;2>+?mur}WZhCa=a!<2c38X+7R` zi28>dk^ELPrGnSAC4tWE)jiMI0L!@MYlGxMmKb`CbL~N9+)yC1^kyT#aVG@-D7hii9oX#pnL>%^u z4qQJ%0nmaSg`R43^%W(w0>nL@4MK7IT>cQ}d~Eirhfc!XgcIr^g4%!Vh-LmLs`EHc z-9p`6=h5#esCZ*ORAG*4$%J9n%8Hqqd^Q9SerNx%~wogAH)MZB@*)fH zX=h6h(F>Eo{r8YdUu2JFQMwfoWRo~~(S-fGyTH7$m`U)i+SNh#qJwRgXMB`_I3kRW;q zm^QSlkrl$enJ%dP;Bf>@0_3PvW z813?DG>E&l1mu@*SUg_Ohe6nTc+ATP{z*r{Uu7FLOS-*;9V>LySRO7}%CQ@(nK|nAowP~Fy-8!TD2JdC%oPz*$rz$A& zQvsiYjVeEV6zM5-iK!B%(lCasj$j$_JCGy(I@@dqxb7a|N?a6Nw^5SDiulKcFn8S- zQni2_`vY;*oWkhI)&(XpcM0nwZlcPZSz}4(*lWM`N||fSZ!vfMeZv>2s%krh`-9br zHfgZdHf(m7dk@p3_vwz0wsf7hjvSL_j8**m;&5EHwa+K?_9=RRf&m!vZ`Bib<+37R zp51n&>R`I-VroZLV`EESQ~9CCuA5=bv*ULo(5jnEGhbg}vjgcZKtgRPUke2KDym(74#2|{zX_L|qhX8e%~0xNJ*DY)sg+~B=m;G<(|^6WIJ zZ<~sPYY|XM2fVg1AQw%dazH5M4?ltYZaIrxxE^D4boJK&891-W8q0o=HY@z06a(;&nGTjQ{nqR;fO@Imtuusw5qcL-ud_-@2hcLt~3alRnza(?0N{ zh28kR7>r)^ietMUUx89!lLG{yqux#4JYi@gc*2xNpX1U&y+_!2Q|e&v-LjiYiHzN2x|K7(0xPKfXz3q%{m{Sav4dwavL8a3Rw?sd6A%lCy}cBC zS#8FtlZztuM}a1NG^7Wf3;%%~mP6Ez(ZYfe5b~Chs1vWQvE{S9aCcIGbh4!`L?A5~ zZ&866UMjFCr$^B?(kOCgJYp{uEPm)TC~!p2aXi~YlL)S{7&M(k1|~3$(nG5qPpOtb zy8VSRL?8jTwu?qcz+)nAe+3@y;!LWV=hU5rzh~7ee)GbY$Je%(4$N08n zFF6{ax}|Nx(Jv#E(z4$yF;?{#{;W+xi`7XNRs>Mt>D#(dID zk@Da}4C-si65eAQb)je9@A;H!0*B#(^-;Rl+yQUqfFI6?FIN{0)>D|~p2VH4y7xX} zdbtp+SWRF&F1{-Ix1#Zwq=r+t)Rshs`uyj){Rp4Dq(oE_;@y2=P0YwL0IQ zFP6z|YA~Ejbb}K*oV+v0sGWcsmYnA=vfyoUlRZr&Zhc8VMV>@)*GLe1ul2Tr5w=HM z#2Bk=`#{#ZC3|TfP3$oazT~Z#q3ZSg%L#%0rWU|X!Fc5BZ>xbo0E}CxwC9DkQ!5o` z!ZUnBHFp0q_q+WS>}!9aoQG`E2L=zhQotiNal|Sz+n?Q^d|*pdg7FJ;^c=Bg2lt3S z(GgZAWH)SHINmcV2RYE@_|G%OjYo$0EhAQEjv$y_DYt8+=%%iF10?-KT*!S2%7?PL z8xPXBP?ugq98vhh)tG;`K>3fxI@(qAc=*WxPS4CHXs}Vtg(nSpheuwjmNr}?e!_s* zcZxLEo|{9FY%@Dus&R3_rji(0mKzc?93Xj}gtYFt9j6WjV`|K#1b8MQtp9Y2XSb4POr66~m?*+u0< z;){!5K3#K}H?N!r>sX_Xv{=Ipw#n#VI>2Y`u}>0)`DpF@BbESFaf?Uq-$z%aZGf9| zw7m6h;=JNcNN!u`fQ+Bq>1GZ>41v9nf}7ouqPy6CT~uF24qwPA6eVraKHRVOWsXrT z$aPWMjmu|BCjx4L|Nr*XZtQ(@i-O=`I|2trwg}p(LHgI!= z7AdvSA}|UFy#YaF&Wg@>|L4|`sxkGH0^a#}clSBpaYd2ZB#N$TND+7E?9f15JoJYM zL5T&s@2<>K!U+yW-=+?F{Od@DJ!q81kusPD`5JcxhLwOaypeXZ&rH1T!sOeUb#VJQ zvDM`ILD$FWjD8?oykS=qpIIci$PME^xbP7E8{?@M!&-Mh-hVoxFbCt9(r2KHffM$f z>nT#MkDJ~9=Hs{dUzHxeTIHbcI3o1#J&E$qbbp#U2#?l1{piJ@dav`ZX35{j!jl=5 zx+q|pPI{Yvy8wL5xP1$iK2$z0N^Sl-v3W-LCYYZS*8<_AKvCcn9^UrieVsuF#+PBT zm`A(U@FWp}VM0^3X_5a3+x{O{gzDR9BIAEoP)HC@5K5HW$iQjcNRYI*^_~1}-$|jP zei-78_g&^1Op##M;pzujZ_qy{U7YlU+GwLYu zKg)v$%sDg<$SHkImrq18kgqMjB!|pr*>@8RqZAdCY5b!Ov+yL+@%)kR=m-D>vRRxX zJ)rR~4e$1eM+o{QyJ299ga=QG9Y3@6ZAMlCI(U#8+Kg@*lLrP6NAfKD7O4R{36(KE zidGx*FXY-Qp#~7@8R8)hqGSV&6FlMS0bZXYIvIZy26MMB%qqRHh;OXGi1Z8B_HqgTvr3xXa)S?ht}I!QCx*fB+#uzB_rI=eNJz z_niG}_dUDsIeSibo$Bi9?&@2gTXpMJ)xBDictj#g``zHHH(@shO{-w7W@~72g18HA ze=#dN;eM18WXuVNou8YUlR9HhM?4!A6MTs~gi9nD`EzcZ$oqD};(0w$CH_D?!+C?# zhrKG}MmEZMFBYP`?C>&iCp})CJ*1SuP=Rt`r2*-fk2)46ORDT2DXXcV)wf>OLrDn3 zm&4Dln;%AdR)vYm;t+PTWAnfvh0y zr=-d&(f{Vt{~nw(8-}CX()l%13LO1|V&CvG@Aki9IR^2X_qyrV$KyVMD^)|Kj}`x8 zM9*^ezcT;pvHAb&%n_yfYTiU7w7@(+mtby1#_xO8R1tYejTSEh0Mn75e*bq;Er-)y zBE+CSEb0YyGsH$p;$LNw`CB?_`o#aZFucSY16FK()1@ca?R|#QS9L@j+@n@%V4(7IizYU3zD0um^&Up89BHylT4C z=Gv@EAn|b?^%JC!4;SKS{K6pHZ^JaE(4XSUKSH&6Y5vg|kV!e@V2$ zqDwSJ%j~8iLe3DE^dYL8s+s3n!^Nkh4`fx8d!3Tk!m1<`>U)`+gYi80IwuHf861Wc zS2KHSzPE^azg`o5Tp1HnEsIfqfe#fC(0|F`>hZxF54%Io)ARySM@Ynh!fOsvAb`WX zZk-@Z-`M8vg~CB7w7#Elzq(mMQ%!_{WR8l zC8mJ?rvnSkr=cWfl!nBwTr=xlV$mHVjZkcy;j_$G%T(SLyhf_Pq#l-YTz@l^)pC7$ z0{ppi{h){#?dO%yNwYV!6m4^bxgk zU%b@;zo!?0V;2Y;xcCJxz+=naIKCHxx?gT4ahe?J$877I+{&fL-UG7vNPzZiogOXK zOB@qjP^G+|`X7|=B7=(a?543Y$O z0ZuKf2I}74Y(5G7?c>s`!a*AWo^#6*X_gXyvf4Lz4b<(tsW1yukmBAd7IYtj4g9SO zg8*R`JSZo^pl|4yA)idXKJPuEOeW}QQ6=im<^B#|)~F*xm`V0HC~MFir2v*F$sE%& z0^9Q%8VRX)`i4@F!Op<-Eb-OuD;%ZgsYVrRSmEy%2ZaCBWsU4q%i_n$Do`={g-G z0YW~$8QCmA*162dvqrKHbbM8HlFWoRQ+p1cFJkehMJBkgo>`?D5LUVNcObrh*2~&x z+H`j=tXpUR?=LVFLw6Pq7=?58*bTWO<90agod)$lGFTnS%}wn?T(q*ysDiTAmamUF zfYLbcQ;J*(-wVEolh-<(eNy_G-yxvyv4L)z7oWHH z9c}9dt=rntkL6rQ&O0(^JC(<2EyW`HaQgbQsZSh$P}>hN$ZADh3_oC7^L&SohL5IvJe)ruTM7)hd^^h=tRQipSiY((YKr2~n+&t&os{l;=UBGGwQx-l{LY_4r3B zV9^U#;b4Yx3jI{^T!EsvbMKPp1jfmRU*sLnYT#8pN zAJRTZHJVk!K6cq03BTo8QHYem@jV3KIoKh<21JTpOWIhelLyK#VtXwuy6iX2%`adZ9e@eUWuJNB!U^sOzRtiN}{k zJ7igMO==sU%vLwohfL(0QvTrW*8@!8g}X-nQs=kbH*QV@RST$G>a&FHL%+ZGLuiRI@pO<$|iWjsDWH1C0-JEySW~6aW zp9ktum}Ro$o>+HOj7B9IS-WH}w>3-3@i|^sski5wQk9d{) zv0z#&#Ss-ell*LL)IM#0c@iJu!6o*r|K00ti3p0=94~^frY2$0pG8GGCl!t&@0kN9 zY2Qu?-x!7P(LDayJtOcwXz?IV`%V`;mrLqMf1MIyTiy~rB0E^m(DbqQmm`Nf-`)(~ zPy_KVw51aV$H3dBj?DGN2W}4&f5^`t58>70(=YTOEsIqJA{~DHLXetVR?4w1Q2N?=G&shU;Q3t%a+s_uomXP3MmimYS;CCTm-SW- z4Ens0lLM@L<;hA_*)>?TY%T8g+iz=vUjXzaQq^VNvkE%g$xEf`uo5|btHTM@CzYyp zc~0PLPaksd56X9mWr<{KlPt^go7bzOHN0D0=>>YB*szk{?lM*Ce7q%*&oF1o)%||0 zG#u-$_{F)MW}KaV2yPJ+UpQzR+e2!l#T}cm{54LOBTi39+UIEG>mU@hOE^p225J5V zH+EmXh?w7hDgG5e&417Rg6;ctT5C)%t-pn!z(tZwr4voJk(#VA$d7N943c|rln@Jf zt<)+xt#_dkZox_-?i9tesa;E~j6lbt#}`yBhi;Qd6hC)|kh~xF61!(d(IffwYdE9N ze&uzPQIsZX!l-oBi*2x|p|RDm9BD6^BefGw0Bwh)Rc(`~H;GAGoB&Azp%uEmNVv%W zZ_LGtsr1h`BDbz6tUUW2(9Yf;wGQ_q%qq2uHsRFGOMS^_@!>1fGu*TzDXh{*H813Y zWh&Ju95vLNa#g8HtA5;+&XO!#s`pVK`w?I7j0wegf4O9t-na1x9)zNb&#yHdBYm_VM`zc zvr2Djh~!x51%IrrE}7*qZAYs!9Me}S36rbsC4Sak^71Q>ZF-ELu#`eW7#Zir_ z9B%ykL+)rw=OIkWaP{3z1=Id#;=xEWL0lZMJLLulGW*5{%&#ls+Tp~_js4!MeOpqQ z__5|x!at3Siisy6HuYn5Lu=*s(~tDQJM7QN%HJ1Ehwq~2ylt%SkbL=j>A=A=d*Wr! zZ7iTr8qT6bGd)J@ToilZAjg-olnvp@GpX$si%vsSf%h?B-5VPcLHu0@QtEhp2LHk1w?DqULxu3e4uuObRY2 z;*sw|?F&D2Cm=Vt@H&@I#!Z(qt86fnI!4j~GM(&76N?k;$3#3bgnUKUFP;Z|em_v~ z&5v&WL?0r53=-a?KBKtu3q4ekdvO5}-pOTKSE2L+@9mgYd^28-Q5lFz{xUaTM8o42 zSzTRVqU^L|(jOZ@Ys`1>)mUgpat!zu^e$HaZCszw2ce`l!o;wq2L*F(TL( zKdBA5#Bb9QEO4?IY@jd8(V#t(*`%4NGJ2d#i80+MRx_aZlqp^O9Ro5QuTNYF< zbDwgFflhboA^`;#x3;3O^2?V~bK31#M|VcdK&Oikpw&l}l8N|U;W_s?^*lN+&W-pm zq#^pUxBztE@twvxiOTvrbaHF)V3A0sd`c8QSIEn%(tX4FycGK}-HzY1Z#skFg37DN zF7VM8=~z;N7zGs_9St1|6CE8L6BQNZuVYCJ6igCg0Wxw%Qlv*oX&E9423ajEW|7xI z?^)!4timAI&+_K~@*IhViuw#?u&&C1=70Tw{z*Qbj+N1&C*?TPKX=50Tb48h6HS?( z{1+kgkE}|cf>N9Be^9RBKHQI7NXG+( z%l_(~MFJ9@hI2dh;Lkp>NK+CH#SZ$=emy3nUF9kT3vS~76)xcHCk-;tvMctn?+bM; zZ=1pYlMmeuGCAVt(0A36foa?>i07A48=Yv%Xv=^2+h6*SDkX&aOK+{e$=3;EoOu3;8_@W}AqkY<%?W=wTzket{wDPZ z+kg)QQcJ<*;@y?EV?;~oV!z*;d4Lu?ChNpXQd|fAu}OPmR41Tv)Nwf!R}0HsR214y zDSUtyJ%%uRE`%MfghZN_>G9CfDLXYX<^JT#py5we`<+|N!T5bn7GPvJ_w6vESjnZNR^Ra&F3~D%-}RZL$Sj|fh(%w!fhdBVZ4o7 zRjN=-1p^ufExLu&Br|gzZ=ulR}0mJ1cYkJ03r?6Rl}Fz`oyKBk>m~;Cs9Ua5U$WWFH`za4KU!sE%8yZW;MJi&Rdnf zW3XdQnQ2d!e#w{u{8d5%q-#t|(hZLC(z6MyeCV=J|Lw9!Td&7ALtr}xB2L`N~=t=&~z7L~0vdY+3(0?~H(R7p3 zb=REDiwCN%+Ey4*DG)PB`V`jAM5|*{ zqh=(#8)kn3ex^({mEz(7kqy2$><~lOTMuK*6SCuu*#cQ=+9+ub{|CdbHOh;oTUI?> z3WlcE#g20%^8VA_U7owVAn9dpq_X26DQ%*KzvKPQb&Q)uhlk+y8PHL{qc<$ZzYVxm>+zECugFg-0$+QeXYh=XEpWkTx+Ykp|S`w8bGT_@V-IWg{f{DzkA zgAfs(7DDcTAt`3IIse99xS5P|;h;`f9^q+Z#W=^y$HMt8?%x>cLNkNV;=}<{_c_0V zyW^Sfip@}IKaOfCvlOZVlG+H{1a$^rjmKyz@^s|mGC8WQ02JkHO^Z{r=9v{=yM~K;tqQ$PNt=ONi^mhqX61!NZBcT9>!59 z&kr$$NWgUJVFw%| z2h~Vi%>{S?N{XbXIUUjCjO=6-Xx;NB)&Vku7rAW_i!t<`CmFy2JTGW{#2sZke{Oy% z&7N=F*MfhEpwO(1V3`WziGxOPGJ{|w)tpO7w9*DPq&1~%3t=LKDMkkrlu;POWe*nr z=^ZZ@nyMX4VFV6_$O!t;e}0K#+m%@_(}}uLS7`L0veC`#WF5b86}Vd}UGA26V6r0N zC2C#y$4`A^^A(Pp_hgm~`!7-lXwEDREo4PWfy>cq1_4yyI-??tpNzb166&QLFtZFz;tb)?_W9gKiFP7WlKG02 zDtH!GqLrXYGO9L6b#CG-6gD$lkeL* zPxZ1qgj`a!MdV5{PNZZGlwX*mAd_v$P0ng(C>t>aM-hJgJx$oDk)*H7VyQS6wq-!0q7CUx44HM`qmX-21+8 zzZ%c~8Mh!Gd3%}$n(v;i_QC#G*6ZlOtF2%nCa#RnS5~YGcZy`37CMx42HK=>Q(Tm! zlTrfJ1rBOPc^fDsj~d}p##_~Axwp;DhZ>)Qrq(S=txXMXbx)oM_9rtv4A`B`#S-Hw zJ%m@+3EqtVem7@Gu{^C<-QX*Xm3D1>kfh3is#vJ>=_z(Fa?X6JHT2x7HfQ{>Fm{rm z2m<9;-<|GkI-8jD>zo8N@0M0NbM1MZ@l{mwRUk$WeZV*#l2=EiZuWk;oq10RIeDK_ zuLlSE)y+{$Hf%N}Yo#)Ka8cq1xLs=Oci9M9ms1AE5hB)Z4cxIA#*U-AHeg!8|J#W$ z6?W~LB9~{GnRos_5z?#xfjvG!Xu@e)-rCvZ90+iGr_ZA8xMwXr?u3*gHVdYoC zT1ZXm9?$rFw3>Nq^MLv@V3?OcGQfw~w_+PdlD6ZWi_oVJZL4cJhq)BKU3wjWdtt5) zzR(B~ET|e@unxKg9f8=E9j5jDpp1%Rb`&d~w*3f`+~}rI<+zxOt2sem^JTr&S9P~3 z|FA)h)y!HEQLpf|{R+xrn(w@e;`U+t)ehMLvS;*bCKg~ps6#x|RxQTMFvA~HXykOw zi)qx&19KpuH5$MD88h%M#pyST)3&A`e@`i@w4BbLaC0Uy#W8OGRZqnYT!@8`TdgeC z%JV3Yb~~IucCBr|Ipw46Z}AxTZ%Nh44p(pT-ve-mr$Q%z!J`&=jgh#~H~FZB&=IDl zh0{e+bnSb}Vj3{#wom*?2DB+001n~H7NPS%T}@n#Y|lJH%;(HatIr!< z{CaIn_cgb0lRp=+O7}I%a6Wh|a#iCCtktQ`wO{D-3>x+hdCT_1a~#@_U<^^ZrgAP+ zu9-~Frqm#NMy9AwlknzTveXas4AE{#?y30c9`QWgAo&;Dw-?S?RzO)YokjfNC82eU zV#iV%&Ghk@3pQf@@sT=H9PCHM@~?eJEK6D!uzI(aRx|8cgqXsX19~rR+X-E7 z@Wz7MW}7C{jE_dY1DL`N7bX5dN%SFmMUWfjQXB!IHISXDa6Y06s`xNqK!f%icn5L1 z3))6j;Q0|B9MzVSfigp*E`#E3@6A=(a_OpOej)(Uc-}S*Y)4Eh4xVZz$K`H|*?D>d z;95L9)OD>9osCEZ9@!!!HsYd0^^cY|3~xpA?nFxo*EUq>2nH>B$kJF)N|K7pu@zht zoDP@R9A#Q)zSYA|>XI51<`*2a3Uy5a-rgXBgH)-4ko zSuqXmB>=sB=eAb4lw~^Z26WeO#of@Oa${hvkA&Aw)-7o^c00Se-k6V~`Mg+@SUp?^ z(i|b^1~PvvF)|$l__wC`QWF9pO78UzCQ4s%&wXRK^$scgZ{7oq&_WWu8HZC=WM*p| z&_bI3;I-)KO+X}8Vo~kc;DtdbJEH0?E*OlZT)P`2vdjT} zob*icl~q|I5sCNAql#g8Dze@oW+BRdc3rmGlYVEOR1tSToab48oNj9OylaKiZbm!2 z)ehTz2C2}j<_@d`agcL6niSXHUK^OTTBEzpIr;YR_vBmpm-n4%65k%VN}78x!Rtip zN47%3A()|W?__uT?M9qijO*#}9Fcu7rfaPNMfI+`Q(<&!kD^H-ulVvMu3%uA5O#1nv)H^=N$2zQ{gM-Z0yO+ zDQLcTI{byKyJEL~p)g)=)rN)zP+rCCM|YAw=K?!JQ1Ksmr>zOV-iWF&OZ_Zk>e9#8 zDX%#Pg8+E5*@bf{FMnAmr57-DG)?KXPmys5HPl;-==I`{s<#_froMTzvoZWLy?O6< zT~lF)uj^G*OguyS?ct6ym(;p5RCw8hyc=8W2OsTtqt2Hhs_i~P>9}*xj4`|Kbg~Fg znyl){8jhvp!W_3PTc$-QR`xqhTecyk*!=j; z;_GPHT{5j!1%w1IPGV(LysR9CXL~hnj2l|DRb=1R-wI_v<_bLh$WPbQ!C!oaSyJLL@}I;rzg^!|LWex?8d7>R&9V(s{d#AHHh8C!TVqk%@j{`3 z+vtk>M4ku-+V{?vVYFk+&hF3*Hxk3IoI52X>(Xu<-U=7Dw`+zA2ptJMue$o2<`a|Z zFC8CE2kyQM9N4x)&y?!i>le3Yx67&>fQIP$u^b`FTlZe;Uvxc7#+b{9TSK3{Hs$1m((U{+@Rj#{9PAMrYkH?;Cb z^k(-#AENeVwcPIOiLKk)SlW-cs47e;_V4!!!;Op(#qtCkttqSMiXs)pWs&f8OZKtx zO^+gl`^?+ZQXcO+z3z4VRW0A1RS>p}Yv?9yJ?o{esqqqRV{%>Fm@ajFEcL5OzXfkD zU8Ekf9T(jYT^o+2=S93Bls>~HM?$p3ZA3y$%Z$dYp#-+AbQDm;rx9@4>7cc@jW!{6 zq$M=QR(}uNmg@endixlc+yCl4=tqmqqt`1i0mC9T(oG%9bP!t%j_%k#_*IJRCRYq~ zaH#mowV$#~&l+L5y4byXt$wB1ZP6vy>h$IsN3#U>Ag)Iio$#LwpDsFb^!ugxKUse+ zpQ5?L#;n}^X+$ovIc;`oeHt5}Bv;`aY6gm-27S)Gfo!&_KC{P|B<17UKdaMQdSLJ4XQ)e*pzQf<_99ntWM=8)E^d5awXW z)<|A(v5*f-*5DXRRaaCZ7Sc&^V3H}r8RQO((%Xo?p<-JJh$e$bxyn{N-1%(fGX(n5 zbZZBizMFoJVMKi$x!T*oQgB^GPEJx0&FZ$srIP1rI+P)4jIk)HUMRC>kao_C|C~Pr z^`#T9I$^eTSKT_L$WU@R0G!<1E?#GUc(Aj{8xR1}%r>+Pnv)LBInyrM3;<9iKky9$k@Ii1b2;fCtEAwZlZu4 zXUKr@Npu_T&bf}wngU+vg+qoq8DCN(!hym06&`K$sQEzs z)yuQR_%-Z;ceK85-muaB#WmPw#E!c(i-Tc?JUFQMTO=(;#o3EbpNd8$MElnkeBqSj zxkwj~$u)L;(wfj6Oh22c;&yiSlK8?}IdUrn-De zCUbnEB_(bsA`9De02E6hZZ6>*axo&r%j#b0V5@mArv)4`H11Z8@^)@yuljXuB#t{4 z$}t(GxJ?*4N+sm%I^dz)G{FQGiZ)&l_E5fdR`aC|VFAKM%UVa^So00B2{@=+S}gMK zzg&U%@KlLii44xH3L|!OTZ-HI_)Ek#ztV9%3JMh~o(52;)D;dUq-lKL{t#}XF8wwU z$;^xlNoU(QER6SA-}3WQc zGObjD?Iw9aO1QJ|r@azJ+S-us%ySB*h`ibr zN_iu)vSDcCyy&9-gWU}sB>hI{6BT=r5i(=LMbAI?rJi^3_!GX|>};|ObsHrN(-hC1Sd zNL%*kLH$XV3c`)4tv{GkG|m6_^e;+S&H!@E;zi(LJI{BpY!#lLeunwxgrLH&@VKNi z{gjT%TC+1$OIaC*9?8?GM<47za?7VDG1g#ziA=DXFy&e0bqNPpCQ3b6Jb$Y_CP zY&H0yt9sto3#<^=Nzh|-wOs0E=l5fj{Kps-de_)i?46OlH%DVhePc=V?N@z6}B-bKDrdkeOCd zF$|V3ckWXV{j)G$DK!BEj>%5(%PqIK<6zr}u!N^Pth zc6D%9R0g+lPmIyC>*9d|wjJVf2HJ@>LtEGbCf72#TS|~kH~HY#0@pC(K?dRR9b8e{ zrU^^1XteQ$ut($y7-^R>OOdIq(U4NVX~F_593^`~v?v@QyN^HBDzCR@WxrFDgX~xt zDuP=F(sGkI-N}~=F@%PsK?u;zW9r$ZuQ%G95Ph`XW|HCteTy-XHw3RmYNg=rOv8$o z8?a)4MKHoB_NJp4SdTcm*L8>0a3;H&*fIRR7YTTp-29PKM~kC(eKu5|$Ia>2RgASd zz-BdqdYM&Ozt)aZL!S<6GD~G4i_wKv6~$0$$X8Y2F*ukvLw1!fJA$!z@5{)?4+^E| z=2l_FsA{YGNhu|2a7AklW`&wBQG~4tbBe(;p#Ad8^98@t0*zNFyh$gp;kV|t;BIz@P1wM%Er!AlJbO{@W_D+h zHRL#yV`)9>o?u4is$!QvH`{pLWp#A1#{P0GLCF_6DdPR-m1`N!nv@Hz8_~_tzz{v{Y ze33K3TRmrmBJekbjsI^+GG2j7SU&pyD}+6da=mE@X)(K!tAo3IGpwEN zj{51L{X=WB@=*=9$7YIyae?qCQnF)=Jk-O#W%xx>!aS%LM}~2dIMA2_P@c(>nZxJ} zO~rC}aBqG{61i5DHP+zDaxr3OvD0$KHJ9O*o!OC1&MyRs3Q}nt=MhU*oKQJB_nnDy za$Q}5S${)15UmbLzxHQR4k+S(Q+Nez+d(-+4ueCV6`50rEeTFwFgRk`a?4yy`H9@w z+Uf;2lI=#?iF2uar$29=RrN0Nub_D>L$DGD@sV>>8Uo&30VtY2r@JP^m;H9mV)V4tVW=rT-csajN9OrrJD&t5e%wr-{6%RX7vOl~;VnZxDfAO> z3>#vyi#pq~Yx4LTrv(n1dZl_8!X+d`Rtx9dPga&$Y#&qo^ii0C*-d+P5FkT{h6@-~ z#vRzQ!k_DW{^@Hzs%p$MMvlW0D6pbJYgT>={XO3KF}E7+?d6F+j5cMWeEP1c|omHdk=XqH-_G`Ds97j zppov%>mRE_v>8CuW1BwmaYj_*QF7XBfx333B2U}X%Fj}=aB@fydlTz3{=Hy8q&Ts% zs#8pkyIhSoXdFy$%Hcz4UQ#vWt}=jMyXJ{eH021n5ITN7XjExexI^WpDR$h&^)JjM z=^WE?*$elyG|BEOs)a|E>O)d&Yn2)1B-6#34?)Tc&?!-!aMHFMG7!Q|Tk(v33Aw6s zH{)&1E4nvlt0uaJCMm{J6DFGIVn4>L=zfD92MVy=Y(H$mlordH2FQ5pPzqckk#ZY% zxJ3v)6ynGq18cF;)Z_V1xE7bh{*EC>8)351ABRv3-iyV}HFBkriSoK3z6YoV)l|&TM2?}TT#*K(WO+T5*4J0IF)3oG4X*K7`(W+b|vZ3vbZxO za1un>R83J-q0rkfqW~3J9|JAJz)srK2L*E`&~Dp{YQT^-oK5bl1=>uFn1JH;utjTn zxfI48yR%idrAPAFxXn@7fhf8nq<@jpO}Kwe>MlBr%lOeJqk%g{b|oQG|I$mUo$z)hrF0P76_=-<_Xf7_Wm)o->g8Auf`h+;2z4op6=F=Z z7jA#Ou0E0?caOdOiOF%8%w`|&Et%8~v_Dip>ResMthpyfb-edc&Up!Zqt(pZ9HM2H ziL`=U)av1Hs$E_i*8D7jIzjVIKRp8H?uYt+8M;$w$*IWr?Vze?s4J5%(P7Sr|h&F~o9@P-!4e%77jt zcc;&|Y9~HklpMMf7E|r=LVStbneqrblD2HXfg6W0Q|9ijR>q4{7XFGe!_sqQnSrGK za%OQtgt&~2L{fP2eQfQ|<8xsO9_OErjTs-Xn5FG<$ZEzbT>z`nkaya#4)bqQXnj&x zxoJ4>-Bcz8Swmk=8r|OJVGa-A*?p|R%05g@n&m>1wx6Gxak|hG*5r;dM)10qwS&2$ ze~cDRHx3oqTEynW+UbQS&vniaRT(;OGOCQI#+_Q0?dF02bS{w}w?@r};$A21%~z4} z!#EwL6afjNXx&29UCbQ!@t?1Remqx>?J}woxl%UVR*rFxDP0b1<2;OZw5R2sy0v#| z%01M+T+Fxm&idBt9GEt(;?_hUn`h-*eo5Mns8by4Xns?2u@e{RovvC^psAFyG}$u$ z)T8-IG3)az&LrS_(7l^7C}ktw88U?zt7P{XO-h*|hf|f4kSj_VBZ3SxGlxUxiNS3% z_W}hD7_cMLOGr|Y0O|t(@wIPrjC}ZoCA4Tz-g0S4&qciS7}dLyD96LoDB3DWV4f** zF}(INqv0KPxAaao%!HWSaLey9y1k};eILt}dXdn$SVXY}(Hct7ma*{5bg1 z$0f$jd9pcf`ZwA^p1nGsCu>AX2|vdyq>#b&IVh8}G!Bc(kB(AWifrxcu9aEJIg39h zpfGR{tBWq5T#E@AAcx_LUDRoV(e7*ahN04(`)ld?@*7`5^6V*O;@D(^q7UD$-#yAd;O5cH@^M<7 zTzXIXGl@Ll#WWvIyR2w;yva{(dL~BPb2f&tg|g z|J+As8~C}>MR9rB@-QJ-TFYs!3N)8MSl0rcYN!}N7WX2IQ)_B0h$tq~T-CJzKH!!l zskdfL!zO4xngH=nj}a(&w`IRN!)U-lU!cY?6&LS{rWmr-WRc|0CGtScK%n}IZB>sz zlu)f9J3QSEwi67ivMm-`^(TJ9MFLN?|IiPcG6ShSy#U!X(EGD#N?G<U z3{OlPYIagu;7&8Sp+t&Bhb%1i#;%q5f3pjY4^hzCNOd(&I-_9ATmU69hZhu^5KZOP z4qS5!B~8NR)#~;R+J>3`r;A#{#E+T!u1{f~MSqhJ_(kDjqvz+3)sha+X@4aPK+E;;>cyzkvHl#5cXt8JjXDQM6^#U`{0k6= z=V;dvvt0SDP=aD+4n)`1z4|#|6+k<^xJ*Za3ewY_N;LhdbyY^ThZzuoRDQLA#o{L7 zXl++rluuMzOlmodYHPUcB|z)#JF%*%cVMg>)tPrDfvYqn#!y&kqtU{ngt9SY%TQx8 z3^`iR*bL{GTfnLn4yqz}?|`mP)7v4@``=ez|N9ou3K0Iojy`XbJ8#qL&7a@Ke~(|t z5Ohw7GlG*G=4GXamE5we+Y(akVEBNF4CVrGX#Xyo!~Q!LEuohJw=<-fz2NurY z8A;%J;l!#~D+gu+n*RkZ;-5MWkwuT3Xd4Q5<9d{S>RMV{Fws)|8Z7*>4gin=6>nzB za9ZY#A_BQG9;G3u2lV!G=7ZgY9I^gP9Z?ei#%Fk17{Ri>+X|e9x`;f2=RQHmx!2Ds zdhIM>EF1x%X0g3s9CBw2_z2-4F^TGDST(LJRM#RMj;UxCwAeRyCprSxN!<(R-(nc{<)!x^9e!Nwig=u-I` zTTHR9&rG9TTBdFF<4Pg;AiabgGFm{wMXWkRKp4;jVZM~x4P1<{&ky`Kfaz95>L!pn zs<)nH`hFqLU`?;E>xtc765K@ag{`sRn!fO;=H*lM_6mDr8XJ#(Inmkdy>4||azBt! zmVXgg_$F%c0^7~><~)FX>n(fW=gl3>uk=wXjc5^(K5)By6qM%?#yXq~tc*;N^FuGV zeuVctINo&{TQ|RRi{MUIE#2di0i;=m7h@`$4QZCjZQoqDB+Mry#TPCTfQpOrdTaw? zk*gba6l~uHa|6(KY(u02gT|YOGB!ZnnjJM>ys_cR+8sVKXhB%&QE52Z?_PDAz3Ntb z%0oH+$d`*$pE@@$0<6iJQ|o66{7)u+`0+Sq zr3n4l^sw?fUH}aYft{;=IpF-Rwr~EjkgN)>(ln4wY2CEGpew+ge0}WRpuVSYI>Rac z>biVA4FXwTxrHEYSln3rS%EcauhSuoK7uv^Q!Bbfm$vd8z#@}mFFQ7xR_xrnA7WM_ zJDyT0HM;`uvM9N9yf`jDB-!oLKfF|d!vaZ1gzDpWKCz_&A2eBJM&Cv4Wf~}5zDZW) zcw$eov!?IAQs*hU%l-dE)(a(2j*^{R$o;S5?%f}EDc0Dm5DhBC!syRMeMNYt|6z2@ z))~t$A%E~a{MV29z@g3g8E2DA^`eoRQW~MAUE$D8j876x*BQdX*Uc-ZM)n{Llk%lM zHNRAUY*ze(65n0f?%vf}eOLykgl^BKO;F!CbRnVApvBfc>^PuuL){Rf5KRXxFq zs#~w>Xe`ER=QsH=(rL9{c6YbZd|L$zT9w3`P@{2P2dbqHfp!Dg)K}NeQ9lte z&J)mk^|Yl9;uxB`(3I&W9xy4M0UzB9o_p%kd(i3IgtKE>ZC?#KdKKg&4G~Ji&PsEZ zdJFtNW46X2CO=;XWl}GC*|69|O?&!RG(%gEQ_>)P&a=( zi>^&Y&N_3UrPJAVW;?J|sWXl<#Uby8%`cTt@5;OWP<7%oxjPkG)Lo0doBMCX z9Xo4I9UpC<)9XGR`QQKjGmYoSgssQEoW-2s0e9-6vM$h1{&_SKx)_yDcK#wIB&1;eQG`@pR)1|`btin@x44e z&FptCXW}n?$wvfeXfGc%qXBMO_C@EG%aOjoxJmxQMj0n*iwhueLV3}3_ zEl$V1_6LHJWmmdHZb7GOz9{|d2!YM=w2(t*;FeGQ)?*L!G`R&;@Oh`3f}!) zYH}8kTN>GG$B%I*JDdMvw}gbmSFV3awqE;k;I!~EO6o&*AxZLColKxRFnG8ks>C26 zO2Gygg}o-TG$1IFM#lajH0B+!*i@~nl`pdL(k7V-ft4D|_+@({0Z9%VZ(K|T3Kam$ zjjC8@nC0?Dgy$1ClJs}S`0R86BA3#Ja2svHr*1M zyX%PU`45WB$`E3pOr=>$IgYE}7(U0%giwa17qiJEShInwMYL@Oxrd-M{;~~9_5X*r zpTyn1Z*DdevJ93o)atM2V!GmZGwQ{)RI%I`qeP}7kKh!H-K0(Tbc(D|uUmfykf__y zZ6j+PD`*^P2AK3)jj9!o8b=E9sDXsTN60~}v?)bmE|F_2by4*W%L&azz|Vd6C63Vc@r@=?iFR-=yfT&!#A^`|AFurQk#>Qm8# z+jk1_^BV(=@!1tuipnKW+y5Ne^3NjG7UU8|biGfxtDs2uS&~hh?09IE15aeS?gF=d znlev(j2GTP8g2T2J{na%AJbIowA6inU)sb6jb|#U;BMv|9gGT?fmuWq>+R_Xt5PzI z8jq?9W@siNyGhtBqQKz#o$mHwSJof$#QKe}XNmCs^1fv*{@4 zCmR8qUoDF`HHh@w3*P5ZJ1PpUGCw<|m>7oIb?XvEksk^=2&&(btwAv$fCX+5aY53fDJTn5>u53FVS^pbWc=8PW%2Ae9oqjM$0~4 zp~Jm2lYC4!KMtfF=!y@L>@lBS>cWbu8jY-oiUBb!D}1>M5%RJk&cKO7OTlDw5=M)U_FM~U8H|lVu7_qV`)Mqk87BJb7GXeH! zZQ@2%$Q|{p_Y@~36^@%)%C99`ri!d|>VPRM8fqZMH>2VWN>N49(_30WiqArE-8lP0 zmF0su`~UKWHp44DjU(Fh(a64Y^+BGv1;nrcyOn~EcAPcRJ4$`DHJ-QNbel0k$Dl~} zS^>7KT#`tYsOPVyxiBa~o+sOtJF94NI=uze8V>bMNGl0tVtIz7Arq9NFnGLRylA|L ziB~D)Fj;%E5&VPS?7aqeQ*!iaAbPLZFWS98+1eQ{C4pvb$KooTP{|2SZ*q1vQ1Y2g z{L3qT`Ozd=K7e?#0yyDdSmm}p*uSa(EgS4wADNj(OZ6r4L@B5Ui7QMhqTq8f_d|cq zsHj9MYAo$U4Fg!NHMI>e)td8vBk!%E;%JyZVcea;eQ<(J>Th>p68>vMm2{P*R&HGNlL+4!OH$ebEN*W1~;8NC_KLoy#=1)&3?(2NFh zehu!^DKd9fkj^oiM~q%Gsu~?e(63rY(y42l<4CE}lMue|u9U~3v^f;8RHP1%$4O@} zoH5|xv(8M*zqX7VO=r4nkTu4)uIQT}N#yaBjU7!FECA~xq(~dcOrQT2q$$AjSYEeg zp&qV!wjT@HxW3CP!LQEwZX{uEm)%n3A)|QWm0};l68v(HBcD!Dps3cGdu<_v4y>0= zXkczxo}mXuT7p*cI@1b@)<+6efOR_KrCuHHqfditL}@DZc#`!JnWlIIMX#_awWQ(X ziV|q#(=_m~HSnm@GzAmX9OWot#dJxm79ZVqN8|=T&R0N2LFNjf+wOM12je$QVLncM zES0X^7|CoI!FUB65ECA`b-GWzq;ip~tT%vleJEd#c_cHfrBnS!67Ob2PwH|Sf_QZJ zPG<-NU4EMDHL@eZ*NT_b2a{W1Ko({!U@#SOxDi@9lXMyBSnUL!$*y$4F7c24{A2t! z=IZ*@Es{QLJ5O+i{q04jVnR@2(&^*-S-Rb08J?AE(M%JXnc)2Ni-#pTIjgc`Y3`OQ^_DT6EYUe8G@v3q zW_I&3hAn4Z^Flgth@h6>VB-LTBaxBu--NM4p2&ar)$_{^W5zg?QAn+ncyptCmVU1L z{d43EgX{P2w=R-_40F~MeA^V7cnv%v-d(B43&!=_E$4!33z~>RJ!bg~pFREbwiviw z6|`rF)*krnrJ?Uq%3YfYj&Ea zckHa|fIC-P%Flk8=GLsfy*%p&CoM@Qt@cD(#?r5k=^9yA5bl2ly%oo8d95)56d8&} zA=d&@YPBoXS=M1{R+LIMHAj&z4hLcbA=P>jKj*yCY-9gg|dOAj~G&l)t<3#DbzcdwaPqRhW?;IG&}-jCI;A^w3f z;iWm9yWKrt6rzc4qHT7p*(%FV0Cui7^RR2|InHFdGRbk78!(Kfi_vMdIMaacd15RR zC-B%e1r8aIkn(T_|5`G@ z2q(daZv$QC19SG6CA+EYMoWC)<6EA=;rffB1H0?`3q=9KW7o*t32(FEyOf@%nPA`IXe0(X7PM2g}}&AxAuJ)+c>qx__XKW%iA5548_rbE#OMGhG`V0kE7YzfQYS+d@{`e6-%KVmZP_ z;uGD(nt@2_DTttkz1DJ^PcrPTbF3FQfi z9u95mh)0u{?@2j#?g9obo!;*1ZKQ6LG(idZar@GSYXx*h?a&S zzmnh!bAf_v!q@`xyt(BVH;=1qM1dTg^*FU$j11Dgx<2u{k%E!JdPWwIe4!R&Ts*-H zT}K+wBe0LYzAKf=c=LxRY8~OZq)P@Dj?(#I!tUq^8*q`5Cc=eug$TT_X^sk%FV`{O zSCkpJ0p3t*G3J96ts!!U6bNB$1`rhvHZ``m_8{7X@-XSt2SZ%5)l1OPR|O*im*hRW zP4)}?fpvj6O=;j2gET)ZNN%sZed?=2R)a-C?2Y#nQ(P?cJ4X~C zrT^EATp5h@@k;S(kOf0p5Nls5o?P1d?+;`T@bu4;Ekhr#5*Pn9iI*}PE~y~UV6aTa z6It=={zMh%dasSd_=(flVC!UiKcq`>EeDr?ZsI6=vVvcx*q{Ji3RzCa;~X!47yLC! zQ;&SP$@Q52{s0_2hd077-dU_A!=ov~0N&M#K-!lvhb-9A>hUH6U{~o~?FdbpMX7z} z2S6Ku~|DX=FDM3+axrx#7>k5VU#@rjLpkIsEoAkWq zivxcGe&Hh*Q~s&pHe^ms@$T;~Ex_zqo8MG3N?8A7_1wV>%zF#eX-=1t3to}s;J0~UqNj`2XfZjGt&YhKM;$& zL=%}?A9(`PjYc5sr|X?ml%}hki0iYj4+BBJ*z(1NFMPyx((aH}6lHm5)W=t1gB5Ko z*vDEMc(tI9R(7&8RMaL--$ZPtK=_RU5sJFYEqOeAX=LV_EzW?B*i(glg?$ysR~xd{ z-q&V==ue=vv5WK_<7Jzi{zW|V_<^)SnSujVnOY3YVh+K*uNb~U{)d_Xg^!1|OD1F$ zuH=P}!YFzlxyVKG)jETIgr|l~uh41N@$-MfrX^q0hIAgk%aRw~#If1~-5xP3`CXGlb5Zp>bpP$!UtwMIp!1xVQO2kRHE zmGKSIFOF9CA+u4trl84{kt2Z~D%FmxzhZ+N<1PgZ*WBGc&1akoK&oi>?dm%o1MBgY z26HoZRj;1(5oK%e0?@r)uLjDhTODQQB=rntd4h9L8(A&p2Wg(iY+O#Mh@GfgB5A_A zXRBIPA1ugpZtyaXMMjJrgyl=v*tf_@;hGyoaeVq#*Su2&c5Lw_*pfezU`kZi+DjkJLcD;Q8;1b@Y`vQWi4qAoJa-#m@vjDoN(5>nn14 zQ7inq-|**NnGEs!7{?=D)WQmrx_RM7^)Jm7^T;ywq$@}3_{Js0xN)nr;uZv)Bo|W% z?k6FmsfKl?=TXNigBEr{#IsL@5vyWMlr@8IZMF81dl8d9(q|N4kfaK>Qk_pz&>N{J z+xa6^yW0xjVDRmGSm6&*_IjcHFE_jQk#`g)^I&R1LB43N7HXxck=YX$p7!-_*sRap0u`h}I%T>HDJhKQh}^$efz-kR{2_i{}s;KLgWMj;_io<+u(d%dvk z4w@R#V7hjSGCpw1u+Fh6mv&9C>6%LS+W@2?^NjeKhW*dc^T|w0t z5{_3pB_lzZvZ{#F2BQtO)p?STS{L=i7E`h^zkXRoFMhr*yR=h5sgEBmCw83^D;UNY z{ge#fwQz1~GcLH(-Y8DUCA6;E%0$g4kB?S7bkjJZo@oyCEhaI{XE*q6EIodXT?7}G z7gr`|?DLl$&K3UldY!7-X|>IHN7fh;)T>r@mvbn%T6CpC9bA*r{W^HZ-n_h=X(sq# zwZo`=tX#u(VM%dGB`lYjC#u)&bTLvtmDXbBO!dPoM{p7C8cpJ(XH(Qy z4X;T|x`-My>89B=+Ncg0dkbq1=Z6Kig_2)2m)moRf1p~nY<2y(n1?p3Q!;HmP`8ri z=#K78LDPr2VO&j1Ncl{hA8#KZ2`C|KC@6SXXm|v8I2c$cX!!qh$bpAKzy=`VaB^|u z;^9+LabN+(CDaM1c_sh$$Z?XUrK8vI|0nST`?p2Tgk^(%<)STb`u{r{Ij^z*FI{f> zgw==`YVy8QWKg|DRhCt2Th&qZgPp@{L!yH}SRCqG@LS&n!5AIP1=2a89J%;YL^s7F z$2YkhIw}4%CsYyj5LM-$b+hV5LVDY&=P>(#9;ia)9{MvV8Fiq2GM71w0~5>|B}f|2 zvoSINuD5hO_ki9S(qwmSu2~>3mrml?!o`HEkLJl!B?wu%2g-iuG#J7*GyRYk3oyf9 z>8cKAA2k!|Hc)apD9BfN>(r%|w*~(|4Zx0q22CLjk}fme{~H^Bpula0TD?l8ADU2g z^K9l>KZI1MH`(A`+-l5b0XjjeMISoY%t1px8vs zsqk^wi>pJM@cH*N`@0((B8I^q+RH#Ul2VcN(3if2#3MRBziU`nrC4Zn+2bkzpB!M*AGdtA+l0r~W}G;YZPSVQtXZ3*ym%A=%ZU~x1U8bgd+z$B7(3MVurw0fF{J_Y2@sUwP6clt zh>v2C1&Ei13ot4!wEBD4&oV}(7rtKuC5a46##NW$Y7f9;AabC;qe4MCZxAoW;(R2% zEt`|!k<1K$FK6-xr&IFs%VXH@y+a?i0iYgJDV0knbGen_${#UcXl}gc*IO6YQpV=8 z!InY+C5c0oSiofF>dG)CaS$aKHS>o|TkY%cEXXxce^RRx$kHC9P7OTGl}hnE%5We3 z>Ha$I=zcOl$fwbFJv(WUi2{1cD>js7LtwUI=#=1{dBFZ{?`QH;TQn=y@G~!Qyvngt zYH{fW0v8c1Z_$H9p63S_R{5~=MD}-kDqoIf-`qb>spRx#b5zT-PIHhF1IF0gLuy%c zV$4#z5<;osHR_ZJousfeHkC>hDKFaG!duwQb#yqwADoZ4!SO#iN|xKOY5CD8TQ$5i z#dcU_b^#}^14ri)&V^jexTs$`MTAMKKb08qFiOZ1=dFrDpT!eH&g4YNCEFi@%`^MFLhdjX~VA8Uta-fUK`jHi(+q;e6oY0_@r;h0@5^~Z znJg%&{<>pW!PN_dv_&LLWOU?n zlW34A%>=ZXwY+e#;E{k9{6=Jw9oi+m@@C-oY47AmveFU+m4lpd@!%D;lVK526eRJ= z3vpr)vPdynNkajK0n&;LEl&Z^@=)UpKsv!FiyvCW;V?fLGbq&==kzI6B$EJ$-xQ0l z-|~`~-2u3>W8ec7F1BrWAT}R8&_Rnc4$l9W$sL1<$qY1x^&?IhX}hcuCcp;`hV6$| zhxP$GR*5X*I$CJiAGwtnsIGlkO%g0RKt?Z-qud+Kg z8bhYi!K5t-rZi^Lz~%^#KrSP%pYG@vi$Ug4%FF)#?{oeioqDd^L{R4thZ$YLm1&lk-&vL0UXkYY zD?>%L0&hNPic3Mx0w@Lr&EXH{YEO+Y@-_Sq6yNvSn{tXYg~Y*ddin#B|8mxT6yXu> z`K!U`2oKva2F*tyG=ay}nZRf1@{IL=@A%meX@-O?_cgqKv}TUAM%ZaoyM-S2P(QJG zFT^Bw=O=IwP)MC6E5L=}n;45QTqb6u=}T`o+?C;J?BiJ;P}nkQ3ka6% zdC3z774pc&SqL4{wL+hg5Chl6_Qk&I*ZVTS8Vqg4q4x(Nc}nWcq?q9G#Wfp$m`;x3 zoREakz@iA-`b9{ly-}F2Y-GefqE(6+Z)pO}crJ*dx?;oRF}cB?ei}lDgC8<^@*sWL zl7T&n(^g$NXQG=S$B~M3FS;Kd-$Tufvgw|i-?>mgivj#Hwf|qbf6*l>tT(7oSi8m! z1p3h!wNcU0^2$m#g5(;cHvXmi!>RQy%85b^H>I}%d=@dnoFAY4ab(Nxr*N3GIf=_1 zX(Dd%RwW?bT0s{G7V1(1PW$HvV$vtBz{w?XPvt0c>q6j+Yz#$J~fE#w=? zxXNnHPIT8Ta@=t$io6o?$u@9`nvxob0<|$#IY!ZK3qme+(6~VA+~MfJ;RkYeeTN&A zqdtcAA0$P|^He^BAzMabdaYT3Y(*o4BCQZji3*nXqTqG)cmHJR*HIb^ZAO%Hyj_myoiy&|+%rhy z_!j~?r&Q7c|EDr@`b^e@^5sF&cY-Eb{6B&Q{GqTF`i6GhLV7)w@25>~fM%yFd9mpx z=CH5`=daMU5a8HD)BmiW%IOpAb$Z5=Dlo*uT zvS;wGto8o)t{06e>ylMvmaJ1Vpj_+m#BZJk7e2yE&g#j zakrJWi=%}>sWs=NAX7X}>1s{22SeesO)LkQYAMV~Da9*6)jByQ)cfF{JOiJ(JNe-l z1)`_mW!vp9cSDAuwznmjwj*emPz4{YCS~9XtKUB+_0roL=3c>6hV0lU80DoXNM=z- zpg#`%3-t$7DmVY0}HjbF>vGAQuknnRe7nfzP;3!2Xu7A0t=w z^TgRviU{ADXvW6{>HBYiR4FFt=EKjG{P3y6uNHja$OuF=zLTxkrwbXaS+S+{sUCuW zv$8=%%A`c$(iuKa9tW>T-R(#mkTpzC+E*J*5l$Bj+;;o>hR>i=^HS+g&53e|ejF;XN0$ysW+k*nDgniXz_iWIgSf@a~S z`wZ>dIx|nT@Q8}Rn_GhDeq*jy+aWzXugTpSVndxh15l@Py=%=?qP5oAjor9|4H#1|86OBJm zF+O<$0^xil#TOog(mOsPdpovOuI2}|Ryse`EU%^Jl`LiX`1>vGm45KS0gWUY&ZM7% z99JOI4=MnhsV$3*qL;i9bDrUWrQm$c-5P^Wu^Qa>>u}<}u<3R7{*?F%D^Z%Em+LrJ z@u@oN8-4focI6p*DAzbR`o_{{`U?U$qpfPvwN@$v8Shg0aqJc@Z$c;6aI3b%X`Zw3 z8|QwW3sGjSlEAYGEkZMQve2}8fySjp#XDIWpAg=n>6O=HhLvCB61J6WEO>Db0x zjD!pYU*WJ-(qGq%U)3rGmC~J6scE^kofYH^F}mcV3tZU)0L|VsPGh}hvXDqAd%K;7 zaRu>qL+TfPi$=b_BN_(d{q2NkJ?t&Jt`)1&w0YkFaThA(bcUxf`^2b~CDU@HcR+Lb z5Jn>&g`td!zECWA|6R!PlRq!_$6J* zO3kaj6BDEvWzuB=Xc;sZ^5(LO2>c}F6n*JS1)hgY|6 z=vg+oC`)z?o@zAulmHJu%Z68iOQ)QmF?B`_j;daG@h>)op4_&dl7YurD5%X}03v~2W{Dm4<-?iv*+A>!E6{(-tz`pgIkqM^GEtEI^<0PY&{nGzWLIUQcl<2zZ& z6ja~h0zf9PzElv;!TFW&D6(b2Q~SbaJPUwQasKDO`jp}Q*L&i6U(urktZ&W z11WY>mB243Eh(!8#V@5w(D|a(FA1Zc7gQ$lmloO_@SfgBC7pklK6PBm4kMx4cKt2E zXOruXQnWH}@@^BcS?lNJS#p?YcCYwdRUPimRyBcYxgU!#t2H z6|wNx$cKYFBZYBRQ7vPSKC0lUMp?#NwZ;&7WBYnb+4gu0$sd zu0%SRgZR};N3;&A>|-I(!YziE{aSmmS&2*vPOXB2#>qpL^TXt zGh0}sq6ZGPDz;5|e57fdV3a!w3LO(Nlk7xf;x|tRjrwhzAq5A?q7lxs(b-d7w1}^Q zq!>qQKhVk9%wN%AIeh7wX<~oaO7yl34Z%8-AVcpxe;e@*v%=2jeYPk2SUmFw%5hE? z@7ZSfREWn)s(~+`Jg5OsaXTVb)@rDWBADp~0O&YzHb^sj^W6 z!q9OlOChT~dO$$Z@Fm29yC-*-T3wmLQi)8Fb=cue;GByE8xEu=Xr87}4h~bUPZE#| z4Ur2z21u{tm|powudUux%fU-o&4Jt%8fNK__gOP!N-DA!d#!${x3eB@Myq`70)`dna1|ckSug5=J=!Eke*TMOlohFXfI(g~)j}Jl zzx4Z!NLTba%I$m%B~zL31MSmNxFaDCWO8^%!g*06Gb~IA-&D-;YQyy~R~ko2!X@N3 zo(JgG2lKY)AegqNSX(X*Ogp}$RwCS{=n#ClSeXL15Bw@{7)HChMZ_XTsfD8gB*9+_ zTQ>I|VBmIs$n*T(!C5Z|IKS_ev5s)|r;=<{2L+9pI7?cADKBM1==XZm6JI_bJO*T_ z`h;W+Q2k2H)4ES&RzqP-H zVu>+XV51=`!efSt0*R_eig!(0D8D_2!eL4&497Ve9j|+%)3n}BQSs6B`817u;j|1Z zt!;&RTL@)%cgR~xw8b4sB>L4?cZFa(*f|SagS1$EB&Wfd9y+IomdNZOvMcp%U7Npa zz~(BX&lkRxt;k#c_k|u9=3X}!Qg%Y_askHLp)EVP8Fc4@9p4JCf9`q!{iJJczu zti=OA&l!3S&%>SeHfkx!+m*bsgO=A!PGmIK=%IWZ2>g}AaS2&ovAy7@5I(T3!5Fhx z?G`SaewYs#L?z!IdH3O{5eyB_Ca1x+c`@{x?62N`P?ykS#s*ZK*mu4Y&(F4vS&`J? zW($nS!b3~X-u`P7PFGL(gMy3|^OWeG<*(U`Os8lVpyc~%ecSZhWbr#xX?#%Pe3!h7 zMSwy^61R+*K5xEH#9RE!!vfA4&&W_0Rs3k#GBRuxb^*slCk}}z!`M%6u|x_vuTHIw zc+Zqo&p*TajVr#Cesxga+9zI(ff^48ZqT?hsIQGHP*^Svg>o>^p?ph4O?W4%z(ax~ z)tD~C(PpZhX099TYTM*TI1!nk&%reenI*(%<) zUON-NOKofPb8m;F)GIp8B_n*f1?lP%?F>CY7;l?#l?305!46VQ$+V3^@@}W# z0|B&G`cgLZAn|4fdl4E*8zk+hFqZ-O()8&V?yG;!h7N{qW*m_-oL=u0gh~u=%WO7cy2rJ z68iwN!9h|vtzI?if1quCVlX&j-Ek*uq02*=6hC# zO8a`KRBe9a=Onzjej|9zzH4B%NR5^P*R8XNUx6LsN&MmuML$~dw9`9`)SKE#GY(nX zTq>fH$JzjBGj@zOH@H?>2$-oE{PEu#zB4mAo+g2wyu`H%n!aI`Du0U0jjy)tXfz3FnAvRy2Mo;0qbC0pY>WMt6 z9L_I&Gy?qdpM3<{WDEZ>66@y6Q)Id8rG@Fp*fhT}5#0*{DwqT_Zn_D$;+&CXJJpjB zA8UNs*66OvC+3|Z)~d_t@B9A>y9q5?LWrQ|Dq6321l~Z<(ACUw_8#}VME z{2CO1zz!aL!%;8tY&x&QeyeqZZ~BUN)FxBJ6ddlQC1{FT=wzhH6Z!34J>kxm5Mf*I ziuEsiX|v2nnaZWUN)@vL+}?en51rC3i{1UG6Y!gPi*`PoTKE!n?JwhsC?n&nl{BWT??OKaI>dQDl-} zb;@{Hhhh}YD+(WP#33V=FP*}C1FZ5mxxM;szhQMc@X8@YEu4R+#I=~M>nOb0KF>Ib4%46 z!6pp)*n-?je$@)t{hIH#F1wv3hMfi`r%R0E=jd{C03LifTdH2M!NVJL%x($0NJqiW zy*AqkDAag&91r9cPd@0Dj2hcRwavi_Cycv1AZc>g^xg^j5728fONDWQ9rf&@ey@{Q zA()rmSL~|nhx1&Cd1d^>jti;(-1`russxMvVm{M-WSev}w9Y@Dp_NJIvivuaHJL>yw zCpPg(B%Tm1n%8bI8-ZYs101uc%eNqGWALyGne!T2QpLC1DXB z?mWT@4G|wtN%%b9A{(^A%7QFM{y=?NnRoW?x4Ja>flpgc+H0|DzPH0HoOiPGm7Bbq zsQ#pXQNy;)&gJUd7QZ8AI4`iCxwSIywgyvQFt3?q?vg}unjaHxHK@l<$jw{MYDV@b zW>Sk^d5zD7w0LD8_EyWP!F;Up7AHy%~L1!ATNwhQ5pZ>kMY^i|tDJW}wK%+^NlUirT$5NQ7W6EgK9w$Y_1W<5I1_Tv zx6#cX3J;`b_ESEt%be5^F9`5s8#(WF*G|I>n=t%xz-B zbz;qOP7fSyv+a2xyh6p_*`_j?g6QQjR2au|B^+~sN8tNT1?$no#l(OFIT*OlbU8RS zbBETy!qjm&7bI}8LbDPTfr3_ujTwy0V&%FgaR?mavAY?6QKS=`xC<7JMN*WEpT9p6 z5_%T?Z$Z7jlN}Eku{ht6GY}!eH#TqaD3EsVIU*!&Lf)s4Wr31LXty&~$ha}Md^O{M z>w?_k04iq^FXI_uyazE9)j(QR)M@V8R?phc@J*X3%!tnFZl~QxvIv)dY=Hq+ZHQKp z`&y`)$$uB)%w+R5!NnvVbjn4G&84ipRDCA_iO;M+;xm)2;O*!TVPErmS2_n5yHlx( z?f1dYy|y0|++oQ3l`^qcj(KZpHTFqB6H19gd`Itmg<>gRb4qD2Bvyfcpyt8ny#sI`!G=uq4w+qdQMp{%HpBT}e*t3U=oPpx%bth$Yq>d#WX*ar9E( z!|q=D(cMTR&bRn3Y&K})F067 zBTQP$$GpEE?oCoiyRR$D3LYQ22O|@2&ZSeenG=@*OAMkFyr zLJ1tzSh90D21#T&6FD$$9$(u9UGSr8=egRb?cER=i_OC+t~$Pk`wanVECk4bXCG%Y z8n;O0w6>Rx*$`G55{|9y5cY0tPi5D$85*<>u9})9p3oZ^60UvofhKPS9}{G6u;wxjx7WD83xamRRJU(adx6=&U_wI^aF-=tq!&zEG2f-FiqiK6-bKGg+AJ6Ycf1ts!p@84pSdJ0ru zDrC>VgdfyE5;DhNHyiQUhqXeztG)wp5EqFUT!?%{@|K z5mkUM2;Bw9Gi15t#%UK%LAOKK?b`di{oWO0?Cd(j^B*=*osop0-P+?S5kiR|B`gxYo5>p~Z2*9r6 z8tJQpBIOm(iqx?lF9p zx`}L^&W#6QP_bedQwhS5ev@(pTeC%abxNMMAP*0DEbB#|m6NQl7JCY_1olLli9sI! zBIqq5E7A?*5h^%|)8f+!uTx&@gfyX0{wr(@-E-QQPB4Esp|udtp=p0_oS|>Y0{aR zN0-~FM$<6)7x{ROZ=tJjN6)@&?TZIQN(;W4&E1C1mtBY71??1W?ob<1+4d^J;^5qD zgvqgLuycc+yzUheH{cyQ9Q6_%f%EC^5+JtKgVhRQAhBhSuS9QhR(9P(D}B^sLVW7p z=nYm|^K1NI41|>*(}-g}IqNjgeSE@Ki%gdG7+y45R;1uBzX0ksUIoo|NDb|5=IKCA z=j5~QL-%F;fC{A0U}Y}{u6TcC3<%H8^fC9As?WQ z(4A8B`t_5!%NoI*|5LN?K7nP-1WA}aS++#UWKxcO^IhTIHr6)V4oN7(5*mu3n&;X+ zipYf{nBn2Bn-sGVNgW#}$NCClaUVl+tZz%>GK`rltpaf5A`L*~ zIvzc{g5HdpsiWmq4zWL&7pff98RzX>wZbGvSCSC>RoS=15Ye3n2wP^%-Six($-#h*vyaBShD^}K4$7Lc7bgw#<g2Lh%TFw{C??0z{l~%VkW8J6925x4LU5ORN*N0rTU)P2v%&lb`u5N3@ zYt*Q9tH~?1w);k2$UU02g{95gf zDFuV9rt^k-)S-ua?zf#$xt1_Qu^Sc1^KA8V{7_ficfPW9vRdkeRE}LXr5NKk*!JfL6D$0dGs6$DY?XP^TpzN#IcI{d%LYy-OG{Y8NpcBmN z??Nj7AwgvfE(w@WI5}#A9wa19Qzl19g&P-aXP*BUdprm9w4{~V{}x0I;&X}X6U)o9zYr`g0L*>3A9&Z;EgQ_8W} z=_%yY>~s#)w3Na!C%wCDS(s!}pm}!5`aPrkd8qAmXvCpyU6)V_NeG>NU|_Z(E(8Hl zE6#MAigf+C^R^QHPjZOc$9aQ4=xgkve@s7_34@FTP(ae9K|~GdM{x$q$7_0se{tG5 zX&@rJkGq;FKGR9cu)+y1KWF>NGOEotM@4yC#b08<7IfiE%RO2E zMcd>-9cqSSfg^^rfiP+-CKq~4rW!`p&v$~FbtMZ!nk)0Icd%B)^zT``z|YZ-k>Jt)u7*v>au}`=X-^>xwYSGh%sfwML@4ZQJ8rj%VWAHgwtc zpA!QQfSuNK8}0Sscwb+Z423Z^?KnwM;(2jW`J-y)!Ef34i&0@z(vjHQ1WZxk%;3}? z8+NA<}pgwhbek_AObAA!G$ zTnB*C5dTx|unagZ64Fh9R6YQ?P`QFRCV z32kyu47Y!hane?QHtQoou5alIR@+nGc(cE#AL56PPEB^RVKrfu`4GUxe)?WWKsFF& zrtmD%@D=s5fj%VRWP*oAU7Rl3Q7I@v;DEam7^4VOZqL zGEm89@iJ)XC`LlnJg5Od`Me(0PkrKuIGHeD0a9%&!vhVo%n}?1`cm5~`Or`E1x@h% z^~Bzk?8c@0@}Kw}0Av7M+?eYy{^`FSmsrq$!lM!wTydVHwJa-1gV>_tvbshg695gJ zO4bHKeV!dYyYuAD?+v{x+;+q^|-ZfDke&M6X z5>8=AsgKl}9?1=!Tq&OwQaAu4CzdLJdU!_CAYWF%>?|t-`1;AmX!MKXROTBF zG9xU;CtHls&TRpfsCEp)?^>+nW3v5)bS}TYY-d8rvQV2;O%rJ0^4mTs7p5E<{EZ)Y z>jZCx+yGlcQ5@a=W}zTvaXP>3I+c!X(s2EGU$0Et{G232F4 z^1j9@^Pn<3(h9wU#@Uuo=Z-SZJ>VMLakrPAv^2RX@?osE(4|l24h;mf`k? zib&)XmsX9Ko4h1oBwbi8%hcWJvaJ)9jM8A(_WfJf>-+%c1jA#3ixmEfBt^OmtpL~7 z%Xj<*TN1^x=M~9>(cc=8>Oa98=iKM_D`kX5P!k!3(~15_<1MNZ>98d-IH`S=N(SLX znd*sTfIzCy_>l(AK|vx-9`}&=Bt8N^ZH5n3Ja-r-a8jKdLnU)zJzJULTi)m{0O;-Pr4QYh{& zh0p}o;4Upt+)5f;O3@aILve?8)8|=v-*fiEe%Rf!=WKHCY%X%qQSq#D4;a5!G8y9+#wV>5}Wxd3Ble)#FsLWGYPKZ~u zbvzh~yUMotkM7@E|90)O@5Kb@%WJYhjmWmKP>m)TG z2q$R&3#a-Y095~{6|5^AyZwv3%GN9Vk7u_uN3QfANKC`4dJKLzy@G%I+mQZ2 z-L$xB;_n$v|D2JIVmNr#JvsHXNKKAzP7lnNE;g*w{-j&bCxxMymkiC&~%+ zEpY7nVI(2$VfrOh=W*``@zBENP_4yRYsd*|Zl|COKfOd!AT^yxuv97BVjuI~TLh?b;4@L1dDj$PW%cht5w^wXZ%f%sBfOH!N!4V+pb=ihAUTZ1}{D z(WOgi&eeO_x-{(~Cy3bltY~LzxUGR|kAgl+zTCs;5}pV$o6ph|&x8F%Z{GM5{zww_ z7k*2W%B0CGgB3fh20=a9fh%HGJ- zf@AXSwx1e)5E)%CyE`bA0g$}UOIvPV+4}iH`W$K86eblyMMcFH z$;WEu>uz*pUANY6vm&1@nD#Snj`OSx&b?fwJ$(gddET7nNvSrpv!U~t{KwZnfKdx< z61Dn2D84v^1SEF|@$m4mFupjr06Z%EJJb&#?jb3%+B#P6#wlqyz*rbxkI?*XcDdBL z9|W|Vf|k}{x&;$YgA1`))t-7iD~JCzsrnx@-wqKBW?U!lYoHaMwU#j4p8M%x@ZFQj z`(#R2Nnz$SLM+O=j%_5T)tyacT5YVBwGK_^PS;Egu{j0O7huOedd@5w-Mv{dk z)2CAb_tPg`UYRdNrGCwPo0Nrh8@0`{{W`RiQIuvVy)s_Nt=yU#*^x-!Ue9?S$2jlm zgC|K?j_c3R!gh0SiT5Kt`JG?lef?OB{k&9q^wW3VbsJLl=Ftm5`!>ed{JV9r{|5?K zj?LL{4(i=Pk4^5zGGz34AF*+Hj`6&?UKjfvaD4v{KHV`d_V z%|8G`@7s>3pjuEQ-hOjoy^h%=Ix91ty@Di6oK1FJTzYyj$Sr?)=jt^4ZZs)jODlqH1(GKGIKnsyD{3?Td; z*D2LgxW6ld*fve{S%XY{$XXuJGrYeo%lbOwXy4ug*z8@1Zy0M24| zTsR3KG%1zrIAtd50OhBsmZA_#V6}>vf|elj(>afRJjk>gVB|2*q6>%p4JCvyO%2oo zc$_!u-ADS=?xGBeRA&msfIW8hH!*){>k))-NSvmNdDH07hnd;o(A z&WNy#uRUiib;i3d9xBna4Jmn^iVP#-b`1m{0rcj$o@gE~autbmhPs@%xT*pWmX~g% zCBwYc99zAk0Y}zhKN(9&kkC6jl(3X7qP$DBC&Ru&cOu;?PX9i~Y$pz~jZ%4A)(A+M z@;p~*-O<(&)rj~ifieT($jLvwWKm!(^vkN_b>^@(b38uoO4msI7BPlfMKf*Pji5r# zC_(GR98^Bzd?fM=q9U=Ok>4WjCNAgb*)``RBe$2k9i1PQz(gvO;DWCy(!IT1ucq1o{*bJ_r?DeI!lx7oRJx(^h!{2o@-5%}-{RZ}rl%QSgGV&W+R0izsN)lg z#>Pl8ANA(kWNR(-dgLuvba^M?8GmaLEBtV;kH8eXE^$=KiIBCt6TU&YIf5^rm$lv~ zWf)H|eym#drhjhk!Nk`CmWP|Hc<1=egSdm$!f%h1+VJwNT7U;zl%aZ=(KB{a07bg_~`2BmcqqnWL37?V|Qa$`1#?tOOQXS!1jt@(c_6{*z zVVF2O!o|CvVRLC6HJ@lCi9ilA1;CbmebYJ_AE-9|BkgWTT^HQ!pGop>NWwEP!o0Es z6nq0u2rTM`vOZB{{U_?ox^B|Cl^QJ0)^oQY@4Oclnp=l9J9HBpyP|-M|E}J-4!{P} zias_$@-=xS)w;+vRr~Ra*>FyjdNvR@)nI%JC)KwPwrCJFU z3lX|K`S()SurN68&-uCbzieegv2>bi>sD#MF1A9$H;fsoVG@Q!q?{2Rlu~X~wGd|i z^Y5-o(`GSz&0E3cK2S2*R&6^;YrUsOvAE9OPf_}V6;_L*T8LLUhj38kpbj%iDi>yx z4E&rUdAY3TE(8AXuD(@o-W|MVJe+oPFWps6h|S?2j+Z^Qsv)x3C|6yga_!{f3h+cW zWfm=z{7WSM7j0s-kr!D#ju*5Itg^Uc#b{HrK4GqbCM}>0tYng%00{v-kyNhxPH)Y_ zty8?tn+uyrN>c}Syp(ks zWxfZ9WabnLGntxmN1V5^t1nN!&Po2$j}cjZbOcRlUnYK*W+?r3tB-`Unk1dvuk$b5 zYB|aLmp%Ibjy1A!Z~T&VHYQ$jP@3SXyhh0swx6q}^ZJEnxt7B01Ny`dk-B7!FRUD1 zD?mjh2FCC^P$dPt)@2EX^zN5S1oYQcl-i|p(R{iGk6$6gZF5YCjW;{K#3UA*L|@kgXg&Je z@aPvi?REm!qr5)eZD-lDpubdp6-g)Wl{zF1GO6Du(65~DLg?481(eLDH-2$1Jx47}Xg;>Ys39q;sfk&Ht~nM*pt z!2B>#sd~IAQfl_};37 zg;bJJtp3z&*ak?j?k6r?LAD>1FNYAWe{#o3z8Gno^dx zQyR1i`mwbSvJB5%O`1|>WhjJq_sZaC|F^j^@(Y!z|e=sNi%kHNp3CKRy{|jE#0^S zFs)K=TtGO@hy;UwRjRvT<#~UFXrVqsNAZ5> zc+i`Q3iDtH?=-*H<618LLgkD+euc7C<}#OMFiBH+;Je8C{>rUPxRPSV1edWW5sb@& zLukNbLHbk%?D}N{d;&o)Kl#sfUGWR5h89@pn##iQI2}12)jjPWJSQTubXIQg`wurO zE|KlEHNS3cuOGxkAH>XKc(RNbI7G_RY?l3uKc!%23h$ocw8fyr*L7t_aOZa*Iid+p z?qGua``?LEQwU81lZ&Na8&7!Nz+8+y4adrr?PSLh$)3~R}BDkO7r18PLh=h^i zC^l+IrY;$X9^0k2%5*d7E@;vuc-qzd9<5am_q+9J08`R`>HsVrj%L&l3nx~N;R4)A z1@#k)X{ep134SL8OF+A(`t@;pdcH%$L7w#1QpR#(O#OX;3-U3Slu6h>bu+zK}FpLC}zdat!U#M@WQ+vprQ)ZXf2!s^S*83 zkL90~4j=s?cme%Q^S|MMww%gt2TLj<6{f6KcS^??%f%JsEeqBy_1?SqUPTdyiG~(_ z;Y`M4L{q38RWn6zA05FQtvs99Jkz@xZPFw&Qc16PD=fQu`$4=#USoj7s04 zQG{Bb22HIkb|52x6f-uaKY`C~zeBBakBDP5#}H$5O`$y#d44XX)hUmy=jus5vb~|G zZ+(80mXyVg!+SUJ&enL8Fye&Lkvdhl8?2wy10&CyBkeWeAU1f1(Q!3S>$#Dx{G#4P zQTgSrPfVKXY>zeaL)ha5AgS;V0f%QODDu&p->E=dHnuJBR61<34=nX4U2SuWUP7x2t#dBZ=c9H6T7Fz%$^w=v(VPuem{+^M8<^U2XKZxqt}u2| zqdO2#kAZxv0HZ4TWdzW2n zlm#{$sYSfMi9mY|e7S|`zhGDU{cO<^rYR&G2hAvJM0=I(A_|0|>dhBW{CfYPA#MKZg5srTYu%-Zcj_IT&ka!@cTe>=(?LVGn~fLm)8gIqNwaRvU}> zLA_PT^c#%#3qfYX_(A>uUeU2(wZ`-_#!%O1Pxd2~QV`-mOPtx|qMo!Pw~T@BXcwrK zb5D^8F5F@gPgk)?=83krmQj-J>9u;{dgnHzh)dKNH+V3|PsUi;IGsOcRdq)ov({d? zwj(C2%+-Sw1cg>W$(?Xc5v$rQ4QZHMgR*lsY5V2U%yVc~V^pi1Hx?)&-z^KxjqP?P z|L}qAUk#Kct41enGTl(Lnh*5RZ^qD$tq|m+Ov_K7;j&w>Y&MX(K%S}DP9tZ(-h_C3 z4N{*n9i`Z>4&^D1@vd7eV1B{EntGvt8ni?>mRKXhuyO#bFUlCn>5M91lK1b^HJ=3O zT11^9U*y{QU}~eH{LzJt4WQJ+%E6pDjJ7moyy=@XBaGlH1ho$|jmfqj#aNY{Td@WL z)I67D%fVR%#cjdmL-O*cX+f`ny;`01ez(Qr#~Ob3cztBMh>B&!an=*N9Xh*n-zZ;l|c^yFr(q>AGrEa%+gB;UTe!OBdE}w1X<;_pvwL+^R%QJlpe`c;~#+W zd%o8&(`p}L_#uHEQ~@m-27#|X{xo2SKu^*chWAf@2MUxBCkA2$KUia7kH0~d_YnOL zSzmsi&O=uFu9xU=fpspJ|5OqT|vD=U!q*2`Qrq&%mM@tqq6rhBMnP^V)T1KAGxLixbz94>!(KmZjj#msjdaKJ31tBx`Zk( zTGGqO;sl00YjFf3K^+ek`BunhSjOt+EbrTO3^l%Wg+~#`;Qc^!o?+}d7!xItY4`jE zLA4h!eMzjs6!;X|De(8$p@<4UE!h!BVA;Ate?FCWuwx=R&@t@Y(alhe&>jdaRsk;} z7OpvKWbRv6%!zXDxP2iYgVy z4C-p50f;l3VRx`-#zvVsMKTg6WW%Xu9Y{i^;+>gWG^m9VOGjcM=DyI4>ddNL#70$x z=b0`E5~>}7_-!TS`Y@6<^+*J7lw0Zvf=hSiJdC`slI9dq&i5;SAE^=5+Ke=$`51D7 zXx(dy@_IezNQ6G|t|uV197YwOCFuHjKhS$T5%}WICou3Zrvh3S>$2KveaOASGSOr( z*V}5JeS|njxvNx!Uj>D#kxkNPNgF3;7G(o0YWfvdqo99Q+r}$7vhFNi!BbT~lNG!a|-^S^o={L#1@?vB{ zXo!cMylT*dg}N_7&4X-*u##;(uV7P$SHn;T4P_^(}@9Nk>B!h0j$Wyq&Emt9#d9jb-)Rg98d+FXvo% zC-#U|bjyEl(}0CWruj~g{4S2^2uIqpcgw~}J>wS?Hzj*_xY*`1qy?p4=6dEKt(%@7 zf#7^nml`vLab{hvdQGc<%Pxn+JC1!DjL~>r{r)KS?C~9zXv@CWq|oQK-O))}E`pTG zgOEOGrNWmy*IWBNz$NjuZ1+syn8*tMms4pv?maS#e${Jv!$Y0GG5s4oG-38C@6@OhXR~8G#P`_=@GuNPXqjZ5aQQ#Ce*d#8CCR zt$232;6vU$)X_Wb1?6>^jy^NWTz_MNdynWD3(Tl=u)N@0ZJKw_3e1I4Cv+aFP)YW$ zwS(9e-RqeBp$-<2)G1v5acR(VOg=5SDxfL>Q;=_*vyBBcuUoz<{2_UiO*dQ8p-)l^ z)kdVRLdfReql|_d_g@!2x%XwjG`@r<6=@B1c1BgZo6*+=2srPaWRGo!AlC#9iL4ZLVEvb0`3cdS<;XNh zBsS-`$Esp$<0B&Q5tY)VK?X)&EKa-CTJYxGBL{=^@?eIHNt%@k-8LSkoHyR&iYR|3&$dAOc# zBpC*i*}I9Ix?i<>4nsf3(kW{l9O-x-rBRp4J{J*v@%2-;wxP*my@)B9-0df8KNw7+ z_4ae%B6iR8=BLG_Y)mp^G=ry}WV~Hd@ToAytDT17585eII0iei4^(7)CQCmiiRR3z zFrh1w{)nm45EiJ}fK(a%0XPxdgb(TS<;Z7Do_X(m)rcSZqU<6}U5cWB;M$Qu^E8Lz zD&P1hRn8B36%03Gs98QB)U35MsWT2ji9`pBgc}E}CRbRF`G0&}HBJvXXM{;rIUliy9FjZJTRz3^GFEAQ=p`{|$V>>nv`t*6PH5HSrH0KJ`M78O+thEC2(im?!-idAjMqxJ_X<-ZAH0urjNZkxXkHuGo$NjQGBmIH-r;P*ZcaKnm495C z2~(wVqb>mFJS0v7xzn&bk49{pDGW@k00mN(fWY@?gTgKaP3sk*ez5HN$6%%>v4SZK zSXNh3p3!zwbw*Yt`v(B}qHP$QyD7aUJ!SD_mqIn{EaFzTa6MruEOH@(BT`vweCyE( zf%TmWOunM9IL1970o>%|tn84&Cvt%Zw6+Cj^?x>w?A4ineUoABQ1h`U&=zB^#N1XW z!uTTjJc~FnPf7@}t!zc051U14`5=L13((J>wAZ1;2jCkF1|4XB{HXN%B^?|^n~fiGcg3T{@fipd2O`k=+ZWN z>kHy|--I%VH~D2WR#TZKKjxLDVYxu;4Lnm4`2Dg=T@b*HqKRvCTQy*Es}Vav@M}QN zSPZc7^LRd373q0;T*w*4d$U+aDHw^6y^x3_%`M?g$yMBCK%$~-w{p3c|8%s$eNtAn zQanpIQwFEKJqYg@Q5+OlKiGTLkT3tMvS`B_MU;)QEZaAbPC>{$8813?0tD4h(&{?l z2-E{-XddDH(o;?Ji>m6r3GZciw*HqjO}&5lsn_bOwTS-+>zaW5{}eP@%76rLv#<-+hqh4}ce1_y>@Yg|0^yX55~$Q;?^dE z;n}AYdYhN1+KT5&;}nNHb;|c!xpvVCg<1u5I5D*xdJ1z2=&95SNrgd4-P=m$BN}e~ z%HA{r!L!%-EM6J5UM2evsB{v$fWiy-Xu^23hCs-TA`MeQbG;I3nMyhhRpO2?-8Bx8 z00J0;QCxTB-S^`Zuwz9JCB+!i+>coQ4uq`pmN3SY%?Y$?PF3C(VuuQ25@XIAw6|s# zjJ4&$#InvJauP3QDIQ4v0S^p^(VZhBIajEYt_$YRVkIE2jT1ddycOf-OgIJHcbD~{|8==(^iOhK)(o!B>kxcbDU8}AM--=K!g zbFd;p{zgX7ksQX#LRg53w?hbT8mFxx! zxYVi)atc&%IV$v|Og%3kQ4|^hKzs@$(tMlkH`WKb!#u$H=@|UroUL*w*ag8P@19m# zjpZ!5%=FgiU0fSp#+cGTkp9TU^I0n95QN&GHDl_|8EJRzycOuq5|AUq1u2)j1T@gU zNVkiS{;8UFZ`ab!$CdktIx)!67V}H+A@RF1=zIC_p$qRt@Cm~Y$-|dPk&=)5O2d92 zLRw(_2|YGhuMp>#P|q8b&;`cy5Rs8x7X438kHd50OBZY!TkA}#-KT1UaNnoMXI2ih z^8)9@Onik7m9FWTCwk)-e`7mFJxkK`ZsC#DJpu4XOIM<6SLzIs21a*9i467W(Z;J9 zWehV|gusTWw-h@yiRNTbM=Q0*Bsgwu(vN8rETmYA4T=WO(q#A!&f#Mub?b-`OdH+#UFN%~vxmTM@yn=22sUMz5xM zBoyw>kYHNBH52>2v6Iq}3T!@gP0E}ui+Vs{rc<#-|3XRJ1}7nZt3*Yi`GMlh6?rdM zQ+N{@E&ds)6nl#M1fpLqa<;|xK;Sh;*#^e+{2N68FWj1U0KaGgc zD_;!WSf`|BsnW1)@+%Z?@Fe;J=*s^Y=aFl7devlrTGa*Bg=V{t^a_2933=t0#TaZI z)Us}OM-u1tik*^=__u`7iWC1O5DyPS8|9PwW9p{O51bz*9!Y32t?moOtk~&!t?|gd zAI4qpIhb-m_E;IW{}AwSLx`)la?vf=S+>za_2ugbz3w&7Ms0HOYaS^mF`N0IKNl_` zbu!#&_^{B9ut()AMZe{&;&Kyhm)J4z=M4e@TyqU1${viGOM7CgXLqHG?sfKjn9%L_ z?<G+vX)t82LxS8Z(qt&=`gHMcM0oK4~ZN5Jkbr{g(#3goOU@DUHeL-Xk4 zY!|dnyLpO+$Ks~IdTg(pbHXhq-o)%aS|yMWp=k4qF_rk6rfo*lcO-q)ZLa{G#^xl) zoGsd^G4V1YPt<30G2Oa0uGQ{7`=UVeeXLcWKo~YUN6V79b*)tB=kt7yZ`bx0(m#7= zQDD`bW%3bCZ>ycBKn2Tk5n8$aElT3dv=wV1m|dJ?{yq2$v3w@tRp}`9lXkvUay!L; zjJSE;F(F&e&$!~1a0;$HchT8&hn|oU>Mq4PmvBkycumPs+LH{ympXVG5ZN8!6d5*n zc*)9Ux>y_rYu?;@oRr;{LDcFQUKQaN?5Bu&99sHQ7ecHv*9GAfC$qwlPRrL%>H|LC z!x0FOT(Npty^2c~=bQ6dCyc5!OElq(x`M2Up~FUQ?=7ZCOB;4wQNeyRKyCv=UK5734uv-{Hnt@~UZ~)j!|yLp zP7w@M*?r>G|4JV*a0zuWPNSUmdzo`+Y2E=kM#q_B`?vZ&y)&)h+0-N0Dnv-9 z;K_Tnt94+lRbJ?Tq35BpEBF%5?bWOQj21%|*o|On!0mN<;$KwJ6z(U#Lc^?qWvZ%y z4+Ms#<}lURCmugP>eZjV*FUq5{qcurFNjll5+-q!8^C(c z1QPBGk;^(k;y*ewZ9m$Q_yd@HFM@{Iv$Cr@6kUXoUhz)@%ut*CFBxYyAL>7LalhSV`0P};1-x( z&G(;rY&NS0X!s`gh?DsJ5V>eUJ)Ul(UioEP zY2%O{ou&4pcG_=9f#^M)OX!=WbsL96L8jFEpA^veZZtd}9AFY>Gd9niq4w8({fP_x z6nzNzjXZ?p0%gr`2<>~a!We7OCrH~F4Py^{fXKf{W%zxWC|M^Ev&WBSm@}}^+Y@M~ z&*6V`()3qq6%AD{iGtmHC`v? zM9a_BM~;f&(#XAXuhF_uIUo8G;CpR`M-IogsN9Z{+XUxAmD)!_$bNaLU+`_I<>(MWS7}MLgzHp`G!y!uh&MFs32;kn?%^ z41rBUVg(P3dySZ6WR3%0H@~8`srf|^GxgQtFU)f-IBupd?LfLfoL)84)E2-~W&@~C zclguy=>S|+tBzadCu?E(Z_Ay7xGJXt2ab_BTC_8y$#^kF{Eno0q5HqLs#8{?+HtTE zbsi6zVA1#tzpp*Q3Q^{P!v}fRD9u&sDDBHyp0+4`jxchfC? zsH?axP+A3@wCIy_FwzK_FuI3U9GOeyPHpKx*%nLVf8P2=1Jq>>@5Tmi&<8Kx5xP+5 zi(p+jhdMA*Jwu6I;6SF^beT;XVZ3D*@rOjz|<=EHe)G&)Viy%i*^)|?wN^<@wAW$p*x z0mxR)k=-pCRmhqUA1wQaDoO^el8QBgA=7*TR}bekFSTo@-PY`xABB6{H@_2NBOp)J z+u#Kf-pziEtKT!pOz4G9OSP`?`qDhh&}z5cmNUt(=h6hz=5|p{#4eo)u{jJfj@JEc zF{4Mg`ttqKQHXR5INnDe!S|aTLANL3-&Nw!wtnZW#xhuS&h;`(bKVETdp6&p#hi7H zwxxK}Rq;y6Z_5?wZtT>LpbXj{R zzAs>)SzRjezDky5Xy+j`;+<;e`#*r+E*c^F773rHyW^fmw_IST>oA`Ou5D8M^8WVUtivvKE2!so zi8Nx$if&a6JHJoC*Azy@aGqtqRJ~+~L1Wgh2-(j>xXZk+np4RN?+rL)P*j`*SS2`% zebqQY$3*p;Y6#}huxx7ChE?9t`A?{lmrG~^`tUf9Hum*5)M{5E>hoF@>= z7OzG!Peb0`gz(<0>?NPW@a$FgB#t2j=V zPUkvpEek~Fg^d^RdwCiW%lA*N)o3|9!|x;Aah&PHaH;7T%@1VaD)f;WfVXIWnG8Vk zBXN5&HpkoM%>yec_O`LpmC7kw_tG#21#6JwC_6P!vcdbJ@`y+vbC%gYrAV!B((2Vv zB{oPwT-EZscLEJhtT$j%aSAVB1y{{USXDdubn?YkGz28enTMpW1;U@n0 zg(?^!P$>CeisCvQ_+;;G3qzVo9TQp?!HbDPrBnGUT6!mNhQRxk&Dp0!zBiESx?~_=_xOA!2=;Zjk8&Ty>YQDPF4MHwrjkc!Mn_Wv?o6k^m^4Ylc zHD3MkO82%L6>AEuB5IB1jVeeu85MqPFMsYEA1iTn=8Nq;(l2rTF5Z_1r%Z5ewKM3| z6A!Zx<~2l#X%`ccVHA3%rAfP+kMPwTnozv&u2IL#KM&w#8DXZikL}c&f~P977$Rd* z=>7oOQ)HOe)btYC=@9nTUT>X-b`k}wf7YRO%h6-KUMDqsK4b| z+>v{+AC$%fLxqw7=E!u7*xj?vvck#MJu>|UEh?E2&H?s?J57r+QVAz4ljIT%Sq`_2ZYTOe25e257~YjC zxK+9V z{1lEq3nh1-UX_cGh5Q!IpWumn)Y@Zv^~UTT8>Y;TJ7P8K1$T15G#u%0q^oPS69%0T ztPzTfm>atiC(1aU3aLL>7L5*gqC}FlCj5g}wFhrRCG_ljf)O1E%sx#UP z@7)!US)e-K{7w=T@5G>0=C7uPu4PDq%pXAB&vlGQY{hd~OIfn-h0v6d0xMpabit5Q zpeLDm_jNPNF;;A$w+k$>`qy2SDDd4d2c-PK$*abg;qQ;YL#YR0<_0)M389CH(#(@V zJQn`tQ=3P+@>VX(V=RFsqi2XEkE=oDS)nE5eT+i!Dg!F-g|2-M>lnN%Fzlt&T|RB! z$3jqEdoP4NTNXPxE<=r>VI1lSD>gBdwf26(I5TrB)3)fyd62bs_o5Gi0N%*d&z)mq=fo)C4`mu=m&VQJr`vXr87Y7i_5si{s7iGllvW9kZW;(pyT;@ZA*QOBeojeLz?1d6f9KSSm@-=7VfXeen~moi@snQP z$^=jI6J+_=++g?c_wjR5Pf>XWcO<^WfOS7RllG9= zh%y`PQil)?jsuv9Beep?!Q0Hm4r5^UofZPRy02?AL?3{e$kE+@)T#Iq1zp;H2ozg@ z@1gMiDM7K8|1@9=kp1H}#t53bKw2mdLK|G5HO!r+2!RrKTr>RDwzq$EIyinf_2F)e z=u=7IP>7*^_akEWJY-FwHz@y~UB}>r9X09_bfX*{} z2V>Xj{5?myz65(hhc!lFi)W~(=|9y9UmSv%ycv>@5?}c$fABuW2MunJKtipI~Vbc4=4%Eyj>!HH);Fvi3@BlIPF(Y zYkG0%!ffQXdsM62_?5~$Vg03t0~;En>=$`_&ifCyX50dPv#GjUQu=YF*|Ro0ojN?@ zb5RG3;vC~{vCT7!`Rml$Ow6Bz_Eby|wX?8yZa932;nCZw4|C}{l9Rm?nleHjEvS!v zz{1S7LRIfatf~QA>x|b1P~_fdJq;J05^vAkdK2P0^#`EPH#$^PJn>c3I`9aK8Y22L z_vDLA7DU&}a`bH|@YA+&o9AHlA3#Zo%eq?A=ErwLsUcO z`%OKz*-7E5yF-lv$f&nL=XzLoyU!thXj;t2k`dZ$VMy;?mt3R7_Z(L{!9U{0I(fvu z?tZ*oZ%speD!3wX{oQ7z6Y Date: Sat, 30 Sep 2023 21:21:42 +0300 Subject: [PATCH 32/51] Update README.md --- HW4_Bobkov/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 0a322cc..68dcf12 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -106,3 +106,6 @@ The result of the procedure is a list with the nucleotides of the corresponding main('LAlLAlwWGPdPA', options = 'DNA_code') # ['TTAGCAttaTTAGCAttatggTGGGGGCCCgcaCCCGCA'] main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'DNA_code') # ['CGACGACGAcgacgacgaCGA', 'TGGGGGCCCgcaCCCGCA', 'TTAGCAttaTTAGCAttatgg'] ``` + + +![OUR COMMON PHOTO FROM THE GOOGLE MEET ](HW4_Bobkov/photo_2023-09-28_23-38-46.jpg) From fb74369d5d0fb3ead90c713258002ea8a1a295ac Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 21:22:31 +0300 Subject: [PATCH 33/51] Update README.md --- HW4_Bobkov/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 68dcf12..4b34343 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -108,4 +108,4 @@ main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'DNA_code') # ['CGACGACGAcgacgacg ``` -![OUR COMMON PHOTO FROM THE GOOGLE MEET ](HW4_Bobkov/photo_2023-09-28_23-38-46.jpg) +![OUR COMMON PHOTO FROM THE GOOGLE MEET ](https://HW4_Bobkov/photo_2023-09-28_23-38-46.jpg) From a15a4c322fb95e37e1bf4f5f4d15fd9ae6d68878 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 21:27:33 +0300 Subject: [PATCH 34/51] Update README.md --- HW4_Bobkov/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 4b34343..6b453bf 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -108,4 +108,6 @@ main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'DNA_code') # ['CGACGACGAcgacgacg ``` -![OUR COMMON PHOTO FROM THE GOOGLE MEET ](https://HW4_Bobkov/photo_2023-09-28_23-38-46.jpg) +![OUR COMMON PHOTO FROM THE GOOGLE MEET ](https://github.com/GlebBobkov/HW4_Bobkov/raw/HW4_Bobkov/photo_2023-09-28_23-38-46.jpg) + +([https://HW4_Bobkov/photo_2023-09-28_23-38-46.jpg]) (https://github.com/jon/coolproject/raw/master/image/image.png) https://github.com/jon/coolproject/raw/master/image/image.png) From a730b3517c8d2a4335a49917e54309b6e1345832 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 21:28:16 +0300 Subject: [PATCH 35/51] Update README.md --- HW4_Bobkov/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 6b453bf..8669180 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -108,6 +108,6 @@ main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'DNA_code') # ['CGACGACGAcgacgacg ``` -![OUR COMMON PHOTO FROM THE GOOGLE MEET ](https://github.com/GlebBobkov/HW4_Bobkov/raw/HW4_Bobkov/photo_2023-09-28_23-38-46.jpg) +![OUR COMMON PHOTO FROM THE GOOGLE MEET ](https://github.com/GlebBobkov/HW4_Bobkov/raw/HW4_Bobkov/HW4_Bobkov/photo_2023-09-28_23-38-46.jpg) ([https://HW4_Bobkov/photo_2023-09-28_23-38-46.jpg]) (https://github.com/jon/coolproject/raw/master/image/image.png) https://github.com/jon/coolproject/raw/master/image/image.png) From 3a6fbc85b8510c9dd5f1aa00fcdcc961a62252f1 Mon Sep 17 00:00:00 2001 From: Gleb Bobkov Date: Sat, 30 Sep 2023 21:30:36 +0300 Subject: [PATCH 36/51] Change main() to protein_tool() --- HW4_Bobkov/protein_tools.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/HW4_Bobkov/protein_tools.py b/HW4_Bobkov/protein_tools.py index 1ecfc59..c7ebf5a 100644 --- a/HW4_Bobkov/protein_tools.py +++ b/HW4_Bobkov/protein_tools.py @@ -187,7 +187,7 @@ def verify(sequences,options): if len(sequences[0])>len(sequences[i]): raise ValueError('Incorrect input: pattern length shorter or equal to protein sequence length was expected. Please try again') -def main(*proteins, options = None): +def protein_tool(*proteins, options = None): proteins = list(proteins) verify(proteins, options) operations = { @@ -217,4 +217,4 @@ def main(*proteins, options = None): else: raise ValueError('Incorrect options input, please try again') -main () +protein_tool() From 1e5c186943ddbf2771dbf3713308ff21e400563a Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 21:44:57 +0300 Subject: [PATCH 37/51] Update README.md --- HW4_Bobkov/README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 8669180..40118a1 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -1,7 +1,10 @@ -# protein_tool.py -> *discription how the protein_tool.py work* +# protein_tools.py +> *discription how the protein_tools.py work* > This program contains the function `protein_tool`. The `protein_tool` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output - +> :warning: Attention: +> 1)> :warning: Attention: That programm register depended. +> 2)> :warning: Attention: Before using some of options read 'Procedures description' carefully. +> 3)> :warning: Attention: If you input sequenses or 'options' with mistakes, the ptogramm will write it to you **list of options:** @@ -14,8 +17,6 @@ # Procedures description - - ## compare ### Introduction The **compare** procedure compares the first aminoacid sequence provided with the following ones. From 12fc927e4d6b462904861e9a333acbbf9c281290 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 21:45:58 +0300 Subject: [PATCH 38/51] Update README.md --- HW4_Bobkov/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 40118a1..656704c 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -1,10 +1,10 @@ # protein_tools.py > *discription how the protein_tools.py work* > This program contains the function `protein_tool`. The `protein_tool` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output -> :warning: Attention: -> 1)> :warning: Attention: That programm register depended. -> 2)> :warning: Attention: Before using some of options read 'Procedures description' carefully. -> 3)> :warning: Attention: If you input sequenses or 'options' with mistakes, the ptogramm will write it to you +### :warning: Attention: +### 1)> :warning: Attention: That programm register depended. +### 2)> :warning: Attention: Before using some of options read 'Procedures description' carefully. +### 3)> :warning: Attention: If you input sequenses or 'options' with mistakes, the ptogramm will write it to you **list of options:** From 84d8b4bb4bcf187bad52c65bbec58db1af887507 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 21:46:52 +0300 Subject: [PATCH 39/51] Update README.md --- HW4_Bobkov/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 656704c..0ffee6d 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -2,7 +2,7 @@ > *discription how the protein_tools.py work* > This program contains the function `protein_tool`. The `protein_tool` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output ### :warning: Attention: -### 1)> :warning: Attention: That programm register depended. +### 1)> :warning: Attention: The programm is register-dependent. ### 2)> :warning: Attention: Before using some of options read 'Procedures description' carefully. ### 3)> :warning: Attention: If you input sequenses or 'options' with mistakes, the ptogramm will write it to you From 28f2075ca79ad2702b6b567406453d07546c305b Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 21:47:44 +0300 Subject: [PATCH 40/51] Update README.md --- HW4_Bobkov/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 0ffee6d..ab8dff1 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -111,4 +111,3 @@ main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'DNA_code') # ['CGACGACGAcgacgacg ![OUR COMMON PHOTO FROM THE GOOGLE MEET ](https://github.com/GlebBobkov/HW4_Bobkov/raw/HW4_Bobkov/HW4_Bobkov/photo_2023-09-28_23-38-46.jpg) -([https://HW4_Bobkov/photo_2023-09-28_23-38-46.jpg]) (https://github.com/jon/coolproject/raw/master/image/image.png) https://github.com/jon/coolproject/raw/master/image/image.png) From fdd87f516cd259822ed55adf04bc60d9e3081ad1 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 21:50:45 +0300 Subject: [PATCH 41/51] Update README.md --- HW4_Bobkov/README.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index ab8dff1..c1e2eff 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -31,8 +31,8 @@ It returns a 'dict' object where: - *values* are either fractions or percentages of type float. ### Usage example ```python -main('LAlLAlwWGPdPA', 'LAlLAl', 3, False, options = 'compare') # {'LAlLAl': 1.0} -main('LAlLAlwWGPdPA', 'LAlLAl', 'GPdPA', 3, True, options = 'compare')) # {'LAlLAl': 100.0, 'GPdPA': 20.0} +protein_tool('LAlLAlwWGPdPA', 'LAlLAl', 3, False, options = 'compare') # {'LAlLAl': 1.0} +protein_tool('LAlLAlwWGPdPA', 'LAlLAl', 'GPdPA', 3, True, options = 'compare')) # {'LAlLAl': 100.0, 'GPdPA': 20.0} ``` ## length @@ -44,8 +44,8 @@ To start using the length procedure, enter one or more protein sequences for whi The result of the procedure is a list with the numbers of amino acids in each sequence. The list contains only numbers of amico cids in the sequence. ### Usage example ```python -main('LAlLAlwWGPdPA', options = 'length') # [13] -main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'length') # [7, 6, 7] +protein_tool('LAlLAlwWGPdPA', options = 'length') # [13] +protein_tool('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'length') # [7, 6, 7] ``` ## percentage @@ -58,8 +58,8 @@ The result of the procedure is a list of dictionaries with the percentages of th > :warning: Attention: We use rounding to 2 decimal places. In some cases, **the sum of percentages** of all amino acid residues for sequence **may not be exactly 100%** due to rounding. ### Usage example ```python -main('LAlLAlwWGPdPA', options = 'percentage') # [{'A': 23.08, 'L': 15.38, 'l': 15.38, 'P': 15.38, 'w': 7.69, 'W': 7.69, 'G': 7.69, 'd': 7.69}] -main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] +protein_tool('LAlLAlwWGPdPA', options = 'percentage') # [{'A': 23.08, 'L': 15.38, 'l': 15.38, 'P': 15.38, 'w': 7.69, 'W': 7.69, 'G': 7.69, 'd': 7.69}] +protein_tool('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] ``` ## pattern @@ -75,8 +75,8 @@ The result of the procedure is a dict object where: - _values_ are lists where the first element is a number of pattern instances in a given sequence, and the following elements are indexes of these occurances ### Usage example ```python -main('LAlLAlwWGPdPA', 'LAlLAl', 'GPdPA', options = 'pattern') # {'LAlLAl': [2, 0, 3], 'GPdPA': [0]} -main('LAlLAlwWGPdPA', 'AlLAl', options = 'pattern') # {'AlLAl': [1, 2]} +protein_tool('LAlLAlwWGPdPA', 'LAlLAl', 'GPdPA', options = 'pattern') # {'LAlLAl': [2, 0, 3], 'GPdPA': [0]} +protein_tool('LAlLAlwWGPdPA', 'AlLAl', options = 'pattern') # {'AlLAl': [1, 2]} ``` ## 3Letter_name @@ -88,10 +88,10 @@ To start using the rename_three_letter_name procedure, enter one or more protein The result of the procedure is a list of three-lettered sequences. Each amino acid is separated by the specified separator. The case of the three-letter amino acid coincides with the case of the one-letter designation at the input. ### Usage example ```python -main('wWGPdPA', '', options = '3Letter_name') # ['trpTRPGLYPROaspPROALA'] -main('LAlLAlwWGPdPA', '-', options = '3Letter_name') # ['LEU-ALA-leu-LEU-ALA-leu-trp-TRP-GLY-PRO-asp-PRO-ALA'] -main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] -main('qwerty', 'G', options = '3Letter_name') # ['glnGtrpGgluGargGthrGtyr'] +protein_tool('wWGPdPA', '', options = '3Letter_name') # ['trpTRPGLYPROaspPROALA'] +protein_tool('LAlLAlwWGPdPA', '-', options = '3Letter_name') # ['LEU-ALA-leu-LEU-ALA-leu-trp-TRP-GLY-PRO-asp-PRO-ALA'] +protein_tool('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57.14, 'r': 42.86}, {'P': 33.33, 'W': 16.67, 'G': 16.67, 'd': 16.67, 'A': 16.67}, {'L': 28.57, 'A': 28.57, 'l': 28.57, 'w': 14.29}] +protein_tool('qwerty', 'G', options = '3Letter_name') # ['glnGtrpGgluGargGthrGtyr'] ``` ## DNA_code @@ -104,8 +104,8 @@ To start using the DNA_code procedure, enter one or more protein sequences for w The result of the procedure is a list with the nucleotides of the corresponding amino acids in each sequence. ### Usage example ```python -main('LAlLAlwWGPdPA', options = 'DNA_code') # ['TTAGCAttaTTAGCAttatggTGGGGGCCCgcaCCCGCA'] -main('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'DNA_code') # ['CGACGACGAcgacgacgaCGA', 'TGGGGGCCCgcaCCCGCA', 'TTAGCAttaTTAGCAttatgg'] +protein_tool('LAlLAlwWGPdPA', options = 'DNA_code') # ['TTAGCAttaTTAGCAttatggTGGGGGCCCgcaCCCGCA'] +protein_tool('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'DNA_code') # ['CGACGACGAcgacgacgaCGA', 'TGGGGGCCCgcaCCCGCA', 'TTAGCAttaTTAGCAttatgg'] ``` From f0cb4580871b951c6afce3666f88eb761cb59a5d Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 22:02:40 +0300 Subject: [PATCH 42/51] Update README.md --- HW4_Bobkov/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index c1e2eff..89bfcf0 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -1,6 +1,6 @@ # protein_tools.py > *discription how the protein_tools.py work* -> This program contains the function `protein_tool`. The `protein_tool` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output +This program contains the function `protein_tool`. The `protein_tool` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output ### :warning: Attention: ### 1)> :warning: Attention: The programm is register-dependent. ### 2)> :warning: Attention: Before using some of options read 'Procedures description' carefully. From b683dd93369e711078f9ed05f28f934596bd1466 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 22:04:03 +0300 Subject: [PATCH 43/51] Update README.md --- HW4_Bobkov/README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 89bfcf0..8bba30f 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -1,10 +1,10 @@ # protein_tools.py -> *discription how the protein_tools.py work* +> *discription how the protein_tools.py work*\ This program contains the function `protein_tool`. The `protein_tool` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output ### :warning: Attention: -### 1)> :warning: Attention: The programm is register-dependent. -### 2)> :warning: Attention: Before using some of options read 'Procedures description' carefully. -### 3)> :warning: Attention: If you input sequenses or 'options' with mistakes, the ptogramm will write it to you +### 1)> The programm is register-dependent. +### 2)> Before using some of options read 'Procedures description' carefully. +### 3)> If you input sequenses or 'options' with mistakes, the ptogramm will write it to you **list of options:** From 04de74fd178dc0b36cae0f9fb9996010febf7df9 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 22:04:47 +0300 Subject: [PATCH 44/51] Update README.md --- HW4_Bobkov/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 8bba30f..2d367f9 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -1,5 +1,5 @@ # protein_tools.py -> *discription how the protein_tools.py work*\ +> *discription how the protein_tools.py work* This program contains the function `protein_tool`. The `protein_tool` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output ### :warning: Attention: ### 1)> The programm is register-dependent. From ce992edc7b58c52a4d4747fe607cd9630469aee2 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 22:09:55 +0300 Subject: [PATCH 45/51] Update README.md --- HW4_Bobkov/README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 2d367f9..655b85f 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -108,6 +108,11 @@ protein_tool('LAlLAlwWGPdPA', options = 'DNA_code') # ['TTAGCAttaTTAGCAttatggTGG protein_tool('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'DNA_code') # ['CGACGACGAcgacgacgaCGA', 'TGGGGGCCCgcaCCCGCA', 'TTAGCAttaTTAGCAttatgg'] ``` +# Contacts +[Gleb Bobkov](ссылка на гитхаб Глеба): teamlead, count_length and transform_to_DNA_code functions. +[Dmitry Matach](ссылка на гитхаб Димы): compare, find_pattern functions, is_protein, string_check, verify +[Olga Bagrova](https://github.com/Olga-Bagrova): count_percentage and rename_three_letter_name functions + ![OUR COMMON PHOTO FROM THE GOOGLE MEET ](https://github.com/GlebBobkov/HW4_Bobkov/raw/HW4_Bobkov/HW4_Bobkov/photo_2023-09-28_23-38-46.jpg) From 06ff93d20c2a2ae569e016a25b08c1f9f6331760 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 22:11:45 +0300 Subject: [PATCH 46/51] Update README.md --- HW4_Bobkov/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 655b85f..43b06ef 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -109,9 +109,9 @@ protein_tool('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'DNA_code') # ['CGACGACGA ``` # Contacts -[Gleb Bobkov](ссылка на гитхаб Глеба): teamlead, count_length and transform_to_DNA_code functions. -[Dmitry Matach](ссылка на гитхаб Димы): compare, find_pattern functions, is_protein, string_check, verify -[Olga Bagrova](https://github.com/Olga-Bagrova): count_percentage and rename_three_letter_name functions +[Gleb Bobkov](https://github.com/GlebBobkov): teamlead, count_length and transform_to_DNA_code functions; +[Dmitry Matach](https://github.com/zmitserbio): compare, find_pattern functions, is_protein, string_check, verify; +[Olga Bagrova](https://github.com/Olga-Bagrova): count_percentage and rename_three_letter_name functions. ![OUR COMMON PHOTO FROM THE GOOGLE MEET ](https://github.com/GlebBobkov/HW4_Bobkov/raw/HW4_Bobkov/HW4_Bobkov/photo_2023-09-28_23-38-46.jpg) From b6bd43c31d8a0f73cb4d2fa8fbe6ee8f4b647e16 Mon Sep 17 00:00:00 2001 From: zmitserbio <144448919+zmitserbio@users.noreply.github.com> Date: Sat, 30 Sep 2023 22:35:58 +0300 Subject: [PATCH 47/51] Correct minor spelling and wording errors --- HW4_Bobkov/README.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 2d367f9..829406f 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -1,34 +1,34 @@ # protein_tools.py -> *discription how the protein_tools.py work* -This program contains the function `protein_tool`. The `protein_tool` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences, in the form (*str*), as well as the name of the procedure to be performed. After this, the command performs the specified action on all transmitted sequences. Carefully read the rules of using each options, because this affects the rules for entering arguments, as well as the output and the type of data in the output +> *Discription how the protein_tools.py works:* +This program contains the function `protein_tool`. The `protein_tool` function takes as input an arbitrary number of arguments in the form of amino acid (aa)/protein sequences of type *str*, as well as the name for the procedure to be performed. After this, the function performs the specified action on all provided sequences. Carefully read the rules of usage for each option, because they specify correct ways of entering arguments, as well as the output and the type of data in the output. ### :warning: Attention: ### 1)> The programm is register-dependent. -### 2)> Before using some of options read 'Procedures description' carefully. -### 3)> If you input sequenses or 'options' with mistakes, the ptogramm will write it to you +### 2)> Before using some of the options read 'Procedures description' carefully. +### 3)> If you input sequenses or 'options' incorrectly, the program will provide you with helpful error messages. **list of options:** - 'compare' - Compare amino acids between reference sequence and other sequences; -- 'length'- Сounting the length of protein in the number of amino acids; +- 'length'- Сount the number of amino acids in protein sequence(s); - 'percentage' - Count percentage of each amino acid in sequence; - 'pattern' - Find all non-overlaping instances of a given pattern in sequences; - '3Letter_name' - Transform into a three-letter amino acids entry; -- 'DNA_code' - Transforming of an protein to DNA sequence. +- 'DNA_code' - Transform protein sequence(s) to DNA sequence(s). # Procedures description ## compare ### Introduction -The **compare** procedure compares the first aminoacid sequence provided with the following ones. +The **compare** procedure compares the first amino acid sequence provided with the following ones. ### Inputs -To start using the length procedure, enter sevreal arguemts: +To start using the length procedure, enter sevreal arguments: - _an arbitrary number_ of sequences, where the first sequence is a reference to which the following sequences are compared; each argument should be of type 'str'. - _second-to-last_ argument is the number of decimals to round the number to; type 'int' - _last_ argument determines whether percentages are returned instead of fractions; type 'bool' ### Outputs It returns a 'dict' object where: - *keys* are compared-to sequences (type str) -- *values* are either fractions or percentages of type float. +- *values* are either fractions or percentages (type float). ### Usage example ```python protein_tool('LAlLAlwWGPdPA', 'LAlLAl', 3, False, options = 'compare') # {'LAlLAl': 1.0} @@ -37,11 +37,11 @@ protein_tool('LAlLAlwWGPdPA', 'LAlLAl', 'GPdPA', 3, True, options = 'compare')) ## length ### Introduction -The **length** procedure calculates the length of protein sequence in number of amino acids. +The **length** procedure calculates the length of protein sequence(s) (equal to the number of amino acids). ### Inputs To start using the length procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘length’`. ### Outputs -The result of the procedure is a list with the numbers of amino acids in each sequence. The list contains only numbers of amico cids in the sequence. +The result of the procedure is a list with the numbers of amino acids in each sequence. The list contains only numbers of amico acids in the sequence. ### Usage example ```python protein_tool('LAlLAlwWGPdPA', options = 'length') # [13] @@ -64,14 +64,14 @@ protein_tool('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57 ## pattern ### Introduction -The **pattern** procedure find all non-overlaping cases of a given pattern in aminoacid sequences provided. +The **pattern** procedure finds all non-overlaping cases of a given pattern in amino acid sequence(s) provided. ### Inputs To start using the pattern procedure, enter one or more protein sequences for which you want to get a summary, where the first sequence is a pattern, which is searched for in the following sequences; each argument should be of type 'str' and at the end add `options = ‘pattern’`. -The *find_pattern()* function goes through a sequence in the following way: it takes a subsequence of aminoacids in front of an index equal in length to the pattern and compares it to the pattern. If there is no match, index is moved one aminoacid to the end of the sequence. If there is a match, the index is saved, and the function jumps to an aminoacid next to the subsequence, then the algorithm repeats. Comparison is performed by *compare_pattern* subfunction. +The *find_pattern()* function goes through a sequence in the following way: it takes a subsequence of amino acids in front of an index equal in length to the pattern and compares it to the pattern. If there is no match, index is moved one amino acid to the end of the sequence. If there is a match, the index is saved, and the function jumps to an aminoacid next to the end of the subsequence, then the algorithm repeats. Comparison is performed by *compare_pattern* subfunction. ### Outputs -The result of the procedure is a dict object where: -- *keys* are aminoacid sequences (type str) +The result of this procedure is a 'dict' object where: +- *keys* are amino acid sequences (type 'str') - _values_ are lists where the first element is a number of pattern instances in a given sequence, and the following elements are indexes of these occurances ### Usage example ```python @@ -81,11 +81,11 @@ protein_tool('LAlLAlwWGPdPA', 'AlLAl', options = 'pattern') # {'AlLAl': [1, 2]} ## 3Letter_name ### Introduction -The **3Letter_name** procedure transform one-letter amino acids entry sequences to three-letter with separator. It is case-sensitive procedure. +The **3Letter_name** procedure transforms one-letter amino acid entry sequences to three-letter amino acid sequences, separated by a specified separator. It is a case-sensitive procedure. ### Inputs -To start using the rename_three_letter_name procedure, enter one or more protein sequences for which you want to get three-lettered sequences. After the protein sequences put a symbol that will be a separator. And specify the `options = ‘3Letter_name’`. +To start using the rename_three_letter_name procedure, enter one or more protein sequences for which you want to get three-letter sequences. After the protein sequences put a symbol (type 'str') that will be a separator. And specify the `options = ‘3Letter_name’`. ### Outputs -The result of the procedure is a list of three-lettered sequences. Each amino acid is separated by the specified separator. The case of the three-letter amino acid coincides with the case of the one-letter designation at the input. +The result of the procedure is a list of three-letter sequences. Each amino acid is separated by the specified separator. The case of the three-letter amino acid coincides with the case of the one-letter designation at the input. ### Usage example ```python protein_tool('wWGPdPA', '', options = '3Letter_name') # ['trpTRPGLYPROaspPROALA'] @@ -96,12 +96,12 @@ protein_tool('qwerty', 'G', options = '3Letter_name') # ['glnGtrpGgluGargGthrGty ## DNA_code ### Introduction -The **DNA_code** procedure transforms a protein into a sequence of nucleotides for a DNA chain (this can be used in gene ingeniring). +The **DNA_code** procedure transforms a protein into a DNA sequence that may encode it (this can be used in genetic ingeneering). P.S. codons chosen at the discretion of the tool authors. ### Inputs To start using the DNA_code procedure, enter one or more protein sequences for which you want to get a summary, and at the end add `options = ‘DNA_code’`. ### Outputs -The result of the procedure is a list with the nucleotides of the corresponding amino acids in each sequence. +The result of the procedure is a list with type 'str' elements - nucleotide sequence that corresponds to the amino acid sequence. ### Usage example ```python protein_tool('LAlLAlwWGPdPA', options = 'DNA_code') # ['TTAGCAttaTTAGCAttatggTGGGGGCCCgcaCCCGCA'] From 0f3793941e406edf27bb28970420e5133c47d7bb Mon Sep 17 00:00:00 2001 From: zmitserbio <144448919+zmitserbio@users.noreply.github.com> Date: Sat, 30 Sep 2023 23:12:38 +0300 Subject: [PATCH 48/51] Upload find_pattern() explanation picture --- ...1\210\320\276\321\202 30-09-2023 230702.jpg" | Bin 0 -> 34726 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "HW4_Bobkov/\320\241\320\272\321\200\320\270\320\275\321\210\320\276\321\202 30-09-2023 230702.jpg" diff --git "a/HW4_Bobkov/\320\241\320\272\321\200\320\270\320\275\321\210\320\276\321\202 30-09-2023 230702.jpg" "b/HW4_Bobkov/\320\241\320\272\321\200\320\270\320\275\321\210\320\276\321\202 30-09-2023 230702.jpg" new file mode 100644 index 0000000000000000000000000000000000000000..c4c8ca7bb922dc33269b46e61f6a4f13170e34bb GIT binary patch literal 34726 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 JYA^cz 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 E06lBb4FCWD literal 0 HcmV?d00001 From af86f0d2f7003226414180448d52b009c64a03d2 Mon Sep 17 00:00:00 2001 From: zmitserbio <144448919+zmitserbio@users.noreply.github.com> Date: Sat, 30 Sep 2023 23:21:48 +0300 Subject: [PATCH 49/51] Delete function explanation picture --- ...1\210\320\276\321\202 30-09-2023 230702.jpg" | Bin 34726 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 "HW4_Bobkov/\320\241\320\272\321\200\320\270\320\275\321\210\320\276\321\202 30-09-2023 230702.jpg" diff --git "a/HW4_Bobkov/\320\241\320\272\321\200\320\270\320\275\321\210\320\276\321\202 30-09-2023 230702.jpg" "b/HW4_Bobkov/\320\241\320\272\321\200\320\270\320\275\321\210\320\276\321\202 30-09-2023 230702.jpg" deleted file mode 100644 index c4c8ca7bb922dc33269b46e61f6a4f13170e34bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34726 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 JYA^cz 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 E06lBb4FCWD From d40e3e99f03d80119bfdcc433b51d126ee2c6436 Mon Sep 17 00:00:00 2001 From: zmitserbio <144448919+zmitserbio@users.noreply.github.com> Date: Sat, 30 Sep 2023 23:23:49 +0300 Subject: [PATCH 50/51] Upload find_pattern() explanation picture Picture with English file name --- HW4_Bobkov/explanation.jpg | Bin 0 -> 34726 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 HW4_Bobkov/explanation.jpg diff --git a/HW4_Bobkov/explanation.jpg b/HW4_Bobkov/explanation.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c4c8ca7bb922dc33269b46e61f6a4f13170e34bb GIT binary patch literal 34726 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 JYA^cz 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 E06lBb4FCWD literal 0 HcmV?d00001 From ab3d60c7118e23a97fa2224e652226effc194ed1 Mon Sep 17 00:00:00 2001 From: GlebBobkov <144066346+GlebBobkov@users.noreply.github.com> Date: Sat, 30 Sep 2023 23:33:29 +0300 Subject: [PATCH 51/51] Update README.md --- HW4_Bobkov/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/HW4_Bobkov/README.md b/HW4_Bobkov/README.md index 2f28862..bb578c8 100644 --- a/HW4_Bobkov/README.md +++ b/HW4_Bobkov/README.md @@ -67,7 +67,9 @@ protein_tool('RRRrrrR', 'WGPdPA', 'LAlLAlw', options = 'percentage') # [{'R': 57 The **pattern** procedure finds all non-overlaping cases of a given pattern in amino acid sequence(s) provided. ### Inputs To start using the pattern procedure, enter one or more protein sequences for which you want to get a summary, where the first sequence is a pattern, which is searched for in the following sequences; each argument should be of type 'str' and at the end add `options = ‘pattern’`. -The *find_pattern()* function goes through a sequence in the following way: it takes a subsequence of amino acids in front of an index equal in length to the pattern and compares it to the pattern. If there is no match, index is moved one amino acid to the end of the sequence. If there is a match, the index is saved, and the function jumps to an aminoacid next to the end of the subsequence, then the algorithm repeats. Comparison is performed by *compare_pattern* subfunction. +The *find_pattern()* function goes through a sequence in the following way: it takes a subsequence of amino acids in front of an index equal in length to the pattern and compares it to the pattern. If there is no match, index is moved one amino acid to the end of the sequence. If there is a match, the index is saved, and the function jumps to an aminoacid next to the end of the subsequence, then the algorithm repeats. Comparison is performed by *compare_pattern* subfunction. +The image explanation of that function. +![The image explanation of that function **pattern**](https://github.com/GlebBobkov/HW4_Bobkov/raw/HW4_Bobkov/HW4_Bobkov/explanation.jpg) ### Outputs The result of this procedure is a 'dict' object where: