From afd5626bf0014673cf6dfe43ff1ccc6a9b0f012d Mon Sep 17 00:00:00 2001 From: larikovaAA Date: Sun, 24 May 2026 22:20:06 +0300 Subject: [PATCH] Laba 1 --- .DS_Store | Bin 0 -> 10244 bytes LarikovaAA/.DS_Store | Bin 0 -> 6148 bytes LarikovaAA/bst.py | 83 +++++ LarikovaAA/config.py | 3 + LarikovaAA/data_generator.py | 20 ++ LarikovaAA/docs/data/results.csv | 19 ++ LarikovaAA/docs/performance_chart.png | Bin 0 -> 89535 bytes LarikovaAA/docs/report.md | 89 ++++++ LarikovaAA/experiment.py | 94 ++++++ LarikovaAA/hashtable.py | 30 ++ LarikovaAA/linkedlist.py | 50 +++ LarikovaAA/main.py | 53 ++++ LarikovaAA/results_analyzer.py | 297 ++++++++++++++++++ LarikovaAA/task1/.DS_Store | Bin 0 -> 6148 bytes LarikovaAA/task1/428b.md | 0 LarikovaAA/task1/task1/.DS_Store | Bin 0 -> 6148 bytes LarikovaAA/task1/task1/bst.py | 83 +++++ LarikovaAA/task1/task1/config.py | 3 + LarikovaAA/task1/task1/data_generator.py | 20 ++ LarikovaAA/task1/task1/docs/data/results.csv | 19 ++ .../task1/task1/docs/performance_chart.png | Bin 0 -> 89535 bytes LarikovaAA/task1/task1/docs/report.md | 89 ++++++ LarikovaAA/task1/task1/experiment.py | 94 ++++++ LarikovaAA/task1/task1/hashtable.py | 30 ++ LarikovaAA/task1/task1/linkedlist.py | 50 +++ LarikovaAA/task1/task1/main.py | 53 ++++ LarikovaAA/task1/task1/results_analyzer.py | 297 ++++++++++++++++++ 27 files changed, 1476 insertions(+) create mode 100644 .DS_Store create mode 100644 LarikovaAA/.DS_Store create mode 100644 LarikovaAA/bst.py create mode 100644 LarikovaAA/config.py create mode 100644 LarikovaAA/data_generator.py create mode 100644 LarikovaAA/docs/data/results.csv create mode 100644 LarikovaAA/docs/performance_chart.png create mode 100644 LarikovaAA/docs/report.md create mode 100644 LarikovaAA/experiment.py create mode 100644 LarikovaAA/hashtable.py create mode 100644 LarikovaAA/linkedlist.py create mode 100644 LarikovaAA/main.py create mode 100644 LarikovaAA/results_analyzer.py create mode 100644 LarikovaAA/task1/.DS_Store create mode 100644 LarikovaAA/task1/428b.md create mode 100644 LarikovaAA/task1/task1/.DS_Store create mode 100644 LarikovaAA/task1/task1/bst.py create mode 100644 LarikovaAA/task1/task1/config.py create mode 100644 LarikovaAA/task1/task1/data_generator.py create mode 100644 LarikovaAA/task1/task1/docs/data/results.csv create mode 100644 LarikovaAA/task1/task1/docs/performance_chart.png create mode 100644 LarikovaAA/task1/task1/docs/report.md create mode 100644 LarikovaAA/task1/task1/experiment.py create mode 100644 LarikovaAA/task1/task1/hashtable.py create mode 100644 LarikovaAA/task1/task1/linkedlist.py create mode 100644 LarikovaAA/task1/task1/main.py create mode 100644 LarikovaAA/task1/task1/results_analyzer.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..16e0b9b3c6b5c9c7e587ccc23fca624ba2bc80d0 GIT binary patch literal 10244 zcmeHMO>Yx15FNLX$R-i$A3)@YdZ^$ZBqcpmPzez!5}epJA&r`3t9-1~o^nV0j~7Pz3-swhSATf{_NDL$f5(EDN19)e%)tlC)YhoZVkQmr8!1bYxPTO&I zW34V7xabxDwual<@E!XA#k8I6IJ>b{p?Id+)2`uWs#YglfoJ z9sfibVZ|zuR7u}FCEbfD`-}Osn3HKP_ZbvZU<}kJ$C1Z15$eo;YF*CYwN!P^r6;{G zb5&UE&nMfb4=VmtmhYb-n?fsntJMRyQ3UGBM?67BYh=U-6;@PJzIOxOHyAZDva_qg z{vP!dVz%B>GK3j}869S⁢fTvbQ-guN&Yd5rT>e5uCR(JfAfwfgXkk)sl~>%R6Pt zvOADL#Lfy}rbuXc)$R};*Q0F@y_ zqF58wz8B|5y+jDcVRm*_VPy_kqgnz4SzF=h*Q#Rh5&1(afj>uL{i%F%P|7%-Db!1V zB5xeS3ZvP+k*=W4br_ASPk?Iz!HQA^T(ii+I3AN~=g!m4f%9F!pL3e)@pjJTcve&` zRg#a-WB@O&%B8YW(YIKtA7se zx9=sq*Fqk-_5_Hgd_-P+16m$gwQf9XRZV`JI^wWuHCtF4c|M?Zmh)}vX literal 0 HcmV?d00001 diff --git a/LarikovaAA/.DS_Store b/LarikovaAA/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c6bd8db2884095779bdbeab24cb07c83c906d288 GIT binary patch literal 6148 zcmeHK%T59@6g`DeP$9v%abuh>Ai=nBIifCH^8v^JB5`C44^xU>F zQiiP()0^C$(%y4>d&o?u0913Wx8On%_hfWUVO<4cBDd7I!7IM=v^jhH%^wK z{eV}%E3j?~$g^9*F^+J87(brhH0F%F7EbB)Pi^c0n~a-a%Gi6%&9nX;`|8AQp^FqF zTw{nq9zz{Cj9v85VfGH%Wc11HW2{F~V$PcC*~t(vL&|k0i?yi_C$7rOkKBXgAM(8= zYvt~$FmRX^+_0hvTd6ZfLT*lFg?EQnW#o{n+%mqW`zv%To;l1C>+5K4&N{_6Cwh-N z>a)HX*O(I9vu8zT>lVwBiZo+CCi%JGBt0Ny;<57~1L@}NS-quSO>W7atxKDevo@q((ZwV#GpH$S>~X9+aun~=wQ(+#4l%Nr8RQ7fe+Xz9 LeB%}PRRz8P3)rk- literal 0 HcmV?d00001 diff --git a/LarikovaAA/bst.py b/LarikovaAA/bst.py new file mode 100644 index 0000000..c505d24 --- /dev/null +++ b/LarikovaAA/bst.py @@ -0,0 +1,83 @@ +def bst_insert(root, name, phone): + new_node = {'name': name, 'phone': phone, 'left': None, 'right': None} + + if root is None: + return new_node + + current = root + while True: + if name < current['name']: + if current['left'] is None: + current['left'] = new_node + break + else: + current = current['left'] + elif name > current['name']: + if current['right'] is None: + current['right'] = new_node + break + else: + current = current['right'] + else: + current['phone'] = phone + break + + return root + + +def bst_find(root, name): #Итеративный поиск в BST + current = root + while current is not None: + if name == current['name']: + return current['phone'] + elif name < current['name']: + current = current['left'] + else: + current = current['right'] + return None + + +def bst_find_min(root): #Поиск минимального узла + current = root + while current['left'] is not None: + current = current['left'] + return current + + +def bst_delete(root, name): # Рекурсия только в глубину + if root is None: + return None + + if name < root['name']: + root['left'] = bst_delete(root['left'], name) + elif name > root['name']: + root['right'] = bst_delete(root['right'], name) + else: + if root['left'] is None: + return root['right'] + elif root['right'] is None: + return root['left'] + else: + min_node = bst_find_min(root['right']) + root['name'] = min_node['name'] + root['phone'] = min_node['phone'] + root['right'] = bst_delete(root['right'], min_node['name']) + return root + + +def bst_list_all(root, records=None): #Возвращает отсортированные записи + if records is None: + records = [] + + stack = [] + current = root + + while stack or current: + while current is not None: + stack.append(current) + current = current['left'] + current = stack.pop() + records.append((current['name'], current['phone'])) + current = current['right'] + + return records \ No newline at end of file diff --git a/LarikovaAA/config.py b/LarikovaAA/config.py new file mode 100644 index 0000000..5a7b157 --- /dev/null +++ b/LarikovaAA/config.py @@ -0,0 +1,3 @@ +N = 10000 # Количество записей +REPEATS = 5 # Количество повторений каждого эксперимента +HASH_TABLE_SIZE = 1000 # Размер хеш-таблицы \ No newline at end of file diff --git a/LarikovaAA/data_generator.py b/LarikovaAA/data_generator.py new file mode 100644 index 0000000..07a656c --- /dev/null +++ b/LarikovaAA/data_generator.py @@ -0,0 +1,20 @@ +import random + + +def generate_test_data(N): #Генерирует N записей с именами User_00000 ... User_N-1 + records = [(f"User_{i:05d}", f"+7-999-{i:05d}") for i in range(N)] + + records_shuffled = records.copy() + random.shuffle(records_shuffled) + + records_sorted = sorted(records, key=lambda x: x[0]) + + return records, records_shuffled, records_sorted + + +def get_names_for_operations(records, num_find=100, num_delete=50, num_nonexistent=10): #Подготавливает имена для операций поиска и удаления + existing_names = [name for name, _ in records[:num_find + num_delete]] + names_to_find = existing_names[:num_find] + [f"None_{i}" for i in range(num_nonexistent)] + names_to_delete = existing_names[num_find:num_find + num_delete] + + return names_to_find, names_to_delete \ No newline at end of file diff --git a/LarikovaAA/docs/data/results.csv b/LarikovaAA/docs/data/results.csv new file mode 100644 index 0000000..79b501b --- /dev/null +++ b/LarikovaAA/docs/data/results.csv @@ -0,0 +1,19 @@ +Структура,Режим,Операция,Повтор1,Повтор2,Повтор3,Повтор4,Повтор5,Среднее,Стд_откл +linkedlist,случайный,вставка,3.030525333015248,3.011153083993122,3.067337290965952,3.026814332988579,3.0305452499887906,3.0332750581903385,0.018473609585193725 +linkedlist,случайный,поиск,0.023072624986525625,0.023000167042482644,0.023063208034727722,0.023132542031817138,0.023077582998666912,0.02306922501884401,4.2179776992719985e-05 +linkedlist,случайный,удаление,0.01565887499600649,0.01571191701805219,0.01575241598766297,0.015799874963704497,0.015716666996013373,0.015727949992287903,4.674933972158777e-05 +linkedlist,отсортированный,вставка,2.7900312499841675,2.842725833004806,2.8324795000371523,2.8226387499598786,2.824206833029166,2.822416433203034,0.01769628256337186 +linkedlist,отсортированный,поиск,0.0026340839685872197,0.0026223339955322444,0.002628166985232383,0.0026764170033857226,0.0026917500072158873,0.0026505503919906914,2.805286048400875e-05 +linkedlist,отсортированный,удаление,0.00025987502885982394,0.00026162504218518734,0.0002579580177552998,0.00026395899476483464,0.00025770795764401555,0.00026022500824183223,2.3452089690404486e-06 +hashtable,случайный,вставка,0.19747637503314763,0.1957802499528043,0.195026625005994,0.1953300409950316,0.1995006250217557,0.19662278320174664,0.001669692081198908 +hashtable,случайный,поиск,0.0007510409923270345,0.0007478750194422901,0.0007428750395774841,0.0007420409820042551,0.0007448329706676304,0.0007457330008037389,3.327822630240364e-06 +hashtable,случайный,удаление,0.00037333305226638913,0.0003679579822346568,0.0003666249685920775,0.000368500011973083,0.00036679196637123823,0.00036864159628748896,2.448879400144638e-06 +hashtable,отсортированный,вставка,0.19373183301649988,0.19131775002460927,0.20354575000237674,0.19244924996746704,0.19410508294822648,0.19502993319183587,0.004370349591521971 +hashtable,отсортированный,поиск,7.366598583757877e-05,7.358303992077708e-05,7.379200542345643e-05,7.329200161620975e-05,7.29589955881238e-05,7.345840567722917e-05,2.9900259428386626e-07 +hashtable,отсортированный,удаление,5.0292001105844975e-05,5.037500523030758e-05,5.124998278915882e-05,5.0540955271571875e-05,5.050003528594971e-05,5.059159593656659e-05,3.409075164884719e-07 +bst,случайный,вставка,0.012036708008963615,0.011527249997016042,0.011410709004849195,0.011799749976489693,0.011473792023025453,0.011649641802068799,0.00023466763426973204 +bst,случайный,поиск,6.741698598489165e-05,8.07500327937305e-05,6.450002547353506e-05,6.416701944544911e-05,6.570800906047225e-05,6.850841455161572e-05,6.225842896923898e-06 +bst,случайный,удаление,5.729199619963765e-05,5.966599564999342e-05,5.4165953770279884e-05,5.4958974942564964e-05,5.529198097065091e-05,5.627498030662537e-05,1.9839081193124104e-06 +bst,отсортированный,вставка,3.063095625024289,3.0107702090172097,3.0406965000438504,2.9900419160258025,3.014387540984899,3.02379835821921,0.025407148276338564 +bst,отсортированный,поиск,0.0002975420211441815,0.0002921670093201101,0.00029941595857962966,0.0002905830042436719,0.00029925000853836536,0.0002957916003651917,3.6993963362568915e-06 +bst,отсортированный,удаление,0.0003683330141939223,0.00036570901283994317,0.00037129101110622287,0.0003595000016503036,0.0003665830008685589,0.00036628320813179014,3.891304706952938e-06 diff --git a/LarikovaAA/docs/performance_chart.png b/LarikovaAA/docs/performance_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f9cf84cfa9979ae749d4f274b26f797ffb64fa GIT binary patch literal 89535 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

?R!S1+@%Xp~6P}{aei*A3Phi)nzAan;4ZNNix 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 z

F~{^5F@@v*VT&jv9;@#ey5^yg$2CuPNa(duY#kQ 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 Yw>t$sYxv1@eOCKU-8=5-Fl6@s0h 0: + ax.annotate(f'{height:.3f}', + xy=(bar.get_x() + bar.get_width() / 2, height), + xytext=(0, 3), textcoords="offset points", + ha='center', va='bottom', fontsize=8) + + plt.tight_layout() + plt.savefig(filename, dpi=150) + plt.show() + +def save_report_md(results, filename="docs/report.md"): + ensure_directories() + + results_dict = {} + for res in results: + key = (res['structure'], res['mode']) + results_dict[key] = res + + def get_val(struct, mode, field): + key = (struct, mode) + if key in results_dict: + return results_dict[key][field] + return 0.0 + + ll_random_insert = get_val('linkedlist', 'случайный', 'insert_mean') + ll_random_find = get_val('linkedlist', 'случайный', 'find_mean') + ll_random_delete = get_val('linkedlist', 'случайный', 'delete_mean') + ll_sorted_insert = get_val('linkedlist', 'отсортированный', 'insert_mean') + ll_sorted_find = get_val('linkedlist', 'отсортированный', 'find_mean') + ll_sorted_delete = get_val('linkedlist', 'отсортированный', 'delete_mean') + + ht_random_insert = get_val('hashtable', 'случайный', 'insert_mean') + ht_random_find = get_val('hashtable', 'случайный', 'find_mean') + ht_random_delete = get_val('hashtable', 'случайный', 'delete_mean') + ht_sorted_insert = get_val('hashtable', 'отсортированный', 'insert_mean') + ht_sorted_find = get_val('hashtable', 'отсортированный', 'find_mean') + ht_sorted_delete = get_val('hashtable', 'отсортированный', 'delete_mean') + + bst_random_insert = get_val('bst', 'случайный', 'insert_mean') + bst_random_find = get_val('bst', 'случайный', 'find_mean') + bst_random_delete = get_val('bst', 'случайный', 'delete_mean') + bst_sorted_insert = get_val('bst', 'отсортированный', 'insert_mean') + bst_sorted_find = get_val('bst', 'отсортированный', 'find_mean') + bst_sorted_delete = get_val('bst', 'отсортированный', 'delete_mean') + + from datetime import datetime + + report_content = f"""# Отчёт по лабораторной работе + +## Цель работы + +Реализовать три структуры данных «с нуля» (связный список, хеш-таблица, двоичное дерево поиска), применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций. + +## Параметры эксперимента + +- Количество записей: 10000 +- Количество повторов каждого теста: 5 +- Размер хеш-таблицы: 1000 корзин + +## Результаты экспериментов + +### 1. Связный список + +| Режим | Вставка (сек) | Поиск (сек) | Удаление (сек) | +|-------|---------------|-------------|----------------| +| Случайный | {ll_random_insert:.4f} | {ll_random_find:.4f} | {ll_random_delete:.4f} | +| Отсортированный | {ll_sorted_insert:.4f} | {ll_sorted_find:.4f} | {ll_sorted_delete:.4f} | + +### 2. Хеш-таблица + +| Режим | Вставка (сек) | Поиск (сек) | Удаление (сек) | +|-------|---------------|-------------|----------------| +| Случайный | {ht_random_insert:.4f} | {ht_random_find:.4f} | {ht_random_delete:.4f} | +| Отсортированный | {ht_sorted_insert:.4f} | {ht_sorted_find:.4f} | {ht_sorted_delete:.4f} | + +### 3. Двоичное дерево поиска (BST) + +| Режим | Вставка (сек) | Поиск (сек) | Удаление (сек) | +|-------|---------------|-------------|----------------| +| Случайный | {bst_random_insert:.4f} | {bst_random_find:.4f} | {bst_random_delete:.4f} | +| Отсортированный | {bst_sorted_insert:.4f} | {bst_sorted_find:.4f} | {bst_sorted_delete:.4f} | + +## Анализ результатов + +### 1. Влияние порядка данных на BST + +На отсортированных данных BST деградирует с O(log n) до O(n). +Время вставки увеличилось с {bst_random_insert:.4f} до {bst_sorted_insert:.4f} секунд — в {bst_sorted_insert/bst_random_insert:.1f} раз. + +### 2. Почему хеш-таблица не чувствительна к порядку + +Хеш-функция распределяет элементы случайно, порядок ввода не влияет на позицию элемента. + +Разница между случайным и отсортированным порядком: +- Вставка: {ht_random_insert:.4f} vs {ht_sorted_insert:.4f} +- Отношение: {ht_sorted_insert/ht_random_insert:.2f}x (почти не чувствительна) + +### 3. Почему связный список медленный при поиске + +Поиск требует последовательного прохода O(n) без возможности индексации. +Поэтому связный список хорош только когда записей мало. +Для больших телефонных справочников он не подходит. + +Сравнение скорости поиска (случайные данные): +- LinkedList: {ll_random_find:.4f} сек +- HashTable: {ht_random_find:.4f} сек (в {ll_random_find/ht_random_find:.1f} раз быстрее) +- BST: {bst_random_find:.4f} сек + +### 4. Сравнение удаления + +| Структура | Сложность | Время на 50 удалений (случайные данные) | +|-----------|-----------|------------------------------------------| +| Связный список | O(n) | {ll_random_delete:.4f} сек | +| Хеш-таблица | O(1) в среднем | {ht_random_delete:.4f} сек | +| BST | O(log n) в среднем | {bst_random_delete:.4f} сек | + +## Вывод: + +| Задача | Рекомендация | Почему | +|--------|-------------|--------| +| Частый поиск | Хеш-таблица | O(1) в среднем, не зависит от порядка | +| Частые вставки/удаления | Хеш-таблица | Амортизированное O(1) | +| Нужен отсортированный вывод | Сбалансированное дерево (AVL/Red-Black) | In-order обход даёт сортировку | +| Мало данных (<100 элементов) | Связный список или массив | Простота, накладные расходы не оправданы | +| Последовательный доступ (очередь/стек) | Связный список | Вставка/удаление в начало/конец за O(1) | + +## Заключение + +Эксперимент наглядно демонстрирует: +1. **BST без балансировки опасен** — на отсортированных данных он деградирует до O(n) +2. **Хеш-таблица стабильна** — её производительность не зависит от порядка входных данных +3. **Связный список** подходит только для специфических задач с малым объёмом данных + +## Дата выполнения + +{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} +""" + + with open(filename, 'w', encoding='utf-8') as f: + f.write(report_content) + + +def print_analysis(results): + print("\n" + "="*60) + print("Анализ резов") + print("="*60) + + best_insert = min(results, key=lambda x: x['insert_mean']) + best_find = min(results, key=lambda x: x['find_mean']) + best_delete = min(results, key=lambda x: x['delete_mean']) + + print(f"\n Лучшая для вставки: {best_insert['structure']} ({best_insert['mode']}) - {best_insert['insert_mean']:.4f} сек") + print(f" Лучшая для поиска: {best_find['structure']} ({best_find['mode']}) - {best_find['find_mean']:.4f} сек") + print(f" Лучшая для удаления: {best_delete['structure']} ({best_delete['mode']}) - {best_delete['delete_mean']:.4f} сек") + + bst_random = None + bst_sorted = None + for res in results: + if res['structure'] == 'bst' and res['mode'] == 'случайный': + bst_random = res + elif res['structure'] == 'bst' and res['mode'] == 'отсортированный': + bst_sorted = res + + if bst_random and bst_sorted: + print("\n Влияние порядка данных на BST:") + print(f" Вставка: случайный {bst_random['insert_mean']:.4f} сек vs отсортированный {bst_sorted['insert_mean']:.4f} сек") + print(f" Деградация в {bst_sorted['insert_mean']/bst_random['insert_mean']:.1f}x") + + ht_random = None + ht_sorted = None + for res in results: + if res['structure'] == 'hashtable' and res['mode'] == 'случайный': + ht_random = res + elif res['structure'] == 'hashtable' and res['mode'] == 'отсортированный': + ht_sorted = res + + if ht_random and ht_sorted: + print("\n Чувствительность хеш-таблицы к порядку:") + print(f" Вставка: случайный {ht_random['insert_mean']:.4f} сек vs отсортированный {ht_sorted['insert_mean']:.4f} сек") + print(f" Отношение: {ht_sorted['insert_mean']/ht_random['insert_mean']:.2f}x (почти не чувствительна)") + + ll_random = None + for res in results: + if res['structure'] == 'linkedlist' and res['mode'] == 'случайный': + ll_random = res + elif res['structure'] == 'hashtable' and res['mode'] == 'случайный': + ht_random = res + + if ll_random and ht_random: + print("\n Сравнение скорости поиска:") + print(f" LinkedList: {ll_random['find_mean']:.4f} сек") + print(f" HashTable: {ht_random['find_mean']:.4f} сек") + print(f" HashTable быстрее в {ll_random['find_mean']/ht_random['find_mean']:.1f} раз") \ No newline at end of file diff --git a/LarikovaAA/task1/.DS_Store b/LarikovaAA/task1/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3fd5035a5e8c95bf8cf5ec86b0446f44175fa7f5 GIT binary patch literal 6148 zcmeHKxlY4C5S@jfSfWWu>5eXv5e21*OhN4*0LM}yVaE|y?V5^zqTo9y_zrk;fMT(N z4k0ol&A!>4W4$lR9z+yocXdWIA)*Az7}$si4@X@)7CZ(9sWGLN>hq?XS52hQUmW6Z zAJZ`%(Fs+w@%>!|57TlAoxX{{BHE){x}+PrqD)u%8TkP3VLY-~WaYeT*HS^7jXG^t z6jdX2lE>G!czSu}SqBmI4-xC-cQf3V*Q=&mEl?G|l#4Uq3^)VMz*aM0Cqc5m)hzhp zodIVc#sKdRDU>lc>=k9}KqF58;0VJau=&!=IjLc8*ek*V37QJj)L>7Hpy?P-EiO0g z6*ZlLJwAfX{PB1RGCS(05>6pk^wt@028ImmYInlt{~7)=(MSF;#e2?xGw{zC2&1Ab zW>}P+tzVYMXKf0-fUm!6^8f$< literal 0 HcmV?d00001 diff --git a/LarikovaAA/task1/428b.md b/LarikovaAA/task1/428b.md new file mode 100644 index 0000000..e69de29 diff --git a/LarikovaAA/task1/task1/.DS_Store b/LarikovaAA/task1/task1/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..ef9fd8d171408c4ec98560565052d7bf8fe4da47 GIT binary patch literal 6148 zcmeHKOHRWu5PfbdD4$A2Y}g>>1eLf!C}qLA2PpkfDnf($L6lYY90qY14#NuGj4jlr z=@ucFk;X5v=Xu6YiX8)R&Bfphr~|0d1uOe(3QWeuH>?zTgy(dQ2Q06WwBJk8-bS=_ zm;$E2Z&N_N-5vBW!yFB)f4{ORoYNbhYFhdp`baUs4aOK1GG23xBMi{x>|J!o7?L~0 zRC`ilK~8s?o1wxPQs$kl>@BR#y=;qnY)>aiIvH`C`x0u*_{6nI-ZAdAhQiglkKBxh zxMig?wo-o&3AqIomn74wN;O7~xzanv5A=D9zNPmZbC>mXm0OUfe36Sj=8A@_Z^0aM zVu#!bJ;4&s94XYd{Fa-AuV(*H0r@s))dP>#ngXVPDe$d;><){F5FO@X6O8ohQq}k ztu+NqfprDS{ current['name']: + if current['right'] is None: + current['right'] = new_node + break + else: + current = current['right'] + else: + current['phone'] = phone + break + + return root + + +def bst_find(root, name): #Итеративный поиск в BST + current = root + while current is not None: + if name == current['name']: + return current['phone'] + elif name < current['name']: + current = current['left'] + else: + current = current['right'] + return None + + +def bst_find_min(root): #Поиск минимального узла + current = root + while current['left'] is not None: + current = current['left'] + return current + + +def bst_delete(root, name): # Рекурсия только в глубину + if root is None: + return None + + if name < root['name']: + root['left'] = bst_delete(root['left'], name) + elif name > root['name']: + root['right'] = bst_delete(root['right'], name) + else: + if root['left'] is None: + return root['right'] + elif root['right'] is None: + return root['left'] + else: + min_node = bst_find_min(root['right']) + root['name'] = min_node['name'] + root['phone'] = min_node['phone'] + root['right'] = bst_delete(root['right'], min_node['name']) + return root + + +def bst_list_all(root, records=None): #Возвращает отсортированные записи + if records is None: + records = [] + + stack = [] + current = root + + while stack or current: + while current is not None: + stack.append(current) + current = current['left'] + current = stack.pop() + records.append((current['name'], current['phone'])) + current = current['right'] + + return records \ No newline at end of file diff --git a/LarikovaAA/task1/task1/config.py b/LarikovaAA/task1/task1/config.py new file mode 100644 index 0000000..5a7b157 --- /dev/null +++ b/LarikovaAA/task1/task1/config.py @@ -0,0 +1,3 @@ +N = 10000 # Количество записей +REPEATS = 5 # Количество повторений каждого эксперимента +HASH_TABLE_SIZE = 1000 # Размер хеш-таблицы \ No newline at end of file diff --git a/LarikovaAA/task1/task1/data_generator.py b/LarikovaAA/task1/task1/data_generator.py new file mode 100644 index 0000000..07a656c --- /dev/null +++ b/LarikovaAA/task1/task1/data_generator.py @@ -0,0 +1,20 @@ +import random + + +def generate_test_data(N): #Генерирует N записей с именами User_00000 ... User_N-1 + records = [(f"User_{i:05d}", f"+7-999-{i:05d}") for i in range(N)] + + records_shuffled = records.copy() + random.shuffle(records_shuffled) + + records_sorted = sorted(records, key=lambda x: x[0]) + + return records, records_shuffled, records_sorted + + +def get_names_for_operations(records, num_find=100, num_delete=50, num_nonexistent=10): #Подготавливает имена для операций поиска и удаления + existing_names = [name for name, _ in records[:num_find + num_delete]] + names_to_find = existing_names[:num_find] + [f"None_{i}" for i in range(num_nonexistent)] + names_to_delete = existing_names[num_find:num_find + num_delete] + + return names_to_find, names_to_delete \ No newline at end of file diff --git a/LarikovaAA/task1/task1/docs/data/results.csv b/LarikovaAA/task1/task1/docs/data/results.csv new file mode 100644 index 0000000..79b501b --- /dev/null +++ b/LarikovaAA/task1/task1/docs/data/results.csv @@ -0,0 +1,19 @@ +Структура,Режим,Операция,Повтор1,Повтор2,Повтор3,Повтор4,Повтор5,Среднее,Стд_откл +linkedlist,случайный,вставка,3.030525333015248,3.011153083993122,3.067337290965952,3.026814332988579,3.0305452499887906,3.0332750581903385,0.018473609585193725 +linkedlist,случайный,поиск,0.023072624986525625,0.023000167042482644,0.023063208034727722,0.023132542031817138,0.023077582998666912,0.02306922501884401,4.2179776992719985e-05 +linkedlist,случайный,удаление,0.01565887499600649,0.01571191701805219,0.01575241598766297,0.015799874963704497,0.015716666996013373,0.015727949992287903,4.674933972158777e-05 +linkedlist,отсортированный,вставка,2.7900312499841675,2.842725833004806,2.8324795000371523,2.8226387499598786,2.824206833029166,2.822416433203034,0.01769628256337186 +linkedlist,отсортированный,поиск,0.0026340839685872197,0.0026223339955322444,0.002628166985232383,0.0026764170033857226,0.0026917500072158873,0.0026505503919906914,2.805286048400875e-05 +linkedlist,отсортированный,удаление,0.00025987502885982394,0.00026162504218518734,0.0002579580177552998,0.00026395899476483464,0.00025770795764401555,0.00026022500824183223,2.3452089690404486e-06 +hashtable,случайный,вставка,0.19747637503314763,0.1957802499528043,0.195026625005994,0.1953300409950316,0.1995006250217557,0.19662278320174664,0.001669692081198908 +hashtable,случайный,поиск,0.0007510409923270345,0.0007478750194422901,0.0007428750395774841,0.0007420409820042551,0.0007448329706676304,0.0007457330008037389,3.327822630240364e-06 +hashtable,случайный,удаление,0.00037333305226638913,0.0003679579822346568,0.0003666249685920775,0.000368500011973083,0.00036679196637123823,0.00036864159628748896,2.448879400144638e-06 +hashtable,отсортированный,вставка,0.19373183301649988,0.19131775002460927,0.20354575000237674,0.19244924996746704,0.19410508294822648,0.19502993319183587,0.004370349591521971 +hashtable,отсортированный,поиск,7.366598583757877e-05,7.358303992077708e-05,7.379200542345643e-05,7.329200161620975e-05,7.29589955881238e-05,7.345840567722917e-05,2.9900259428386626e-07 +hashtable,отсортированный,удаление,5.0292001105844975e-05,5.037500523030758e-05,5.124998278915882e-05,5.0540955271571875e-05,5.050003528594971e-05,5.059159593656659e-05,3.409075164884719e-07 +bst,случайный,вставка,0.012036708008963615,0.011527249997016042,0.011410709004849195,0.011799749976489693,0.011473792023025453,0.011649641802068799,0.00023466763426973204 +bst,случайный,поиск,6.741698598489165e-05,8.07500327937305e-05,6.450002547353506e-05,6.416701944544911e-05,6.570800906047225e-05,6.850841455161572e-05,6.225842896923898e-06 +bst,случайный,удаление,5.729199619963765e-05,5.966599564999342e-05,5.4165953770279884e-05,5.4958974942564964e-05,5.529198097065091e-05,5.627498030662537e-05,1.9839081193124104e-06 +bst,отсортированный,вставка,3.063095625024289,3.0107702090172097,3.0406965000438504,2.9900419160258025,3.014387540984899,3.02379835821921,0.025407148276338564 +bst,отсортированный,поиск,0.0002975420211441815,0.0002921670093201101,0.00029941595857962966,0.0002905830042436719,0.00029925000853836536,0.0002957916003651917,3.6993963362568915e-06 +bst,отсортированный,удаление,0.0003683330141939223,0.00036570901283994317,0.00037129101110622287,0.0003595000016503036,0.0003665830008685589,0.00036628320813179014,3.891304706952938e-06 diff --git a/LarikovaAA/task1/task1/docs/performance_chart.png b/LarikovaAA/task1/task1/docs/performance_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..a5f9cf84cfa9979ae749d4f274b26f797ffb64fa GIT binary patch literal 89535 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

?R!S1+@%Xp~6P}{aei*A3Phi)nzAan;4ZNNix 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 z

F~{^5F@@v*VT&jv9;@#ey5^yg$2CuPNa(duY#kQ zlU+{CX-O}os-b9jl_J2{5UB$&T#Zus?%lik{CaK@gT@BIQ_;;F5f{L!p~1vWL7oUw zy)%JeMu=6zP_M9vHh?J&Nt5#k1C{Q10$Q&b5D}2dub^)%2$XdFMHk@yG;)JF+ET=7 z^!Ki9b0|mf7QPjeh2Y?)A(vVjO`_>KYHZNOV7(QHw`KZ4W>W^BIt`ZH7ix7=KfuNY z$rYe2K~ECKA*%*7Pck^8#n}ml8L_7bWicS$86kSmplCDM5diP0^S~H!3_4&Vv=tQ1 z!2fFn8UP>+apXyjA%`b;<|{Z0G{iPD*0hqkWEO>@w+q-Re3UP`!)6S1TJ}^M%ie)I z2OZcN(*vMj$ZG;%s!T@_Di5>;W3*$US3h6R?;QcTfur?+@(gVh`VdwK`t3-7<(d>z zKZG9N?x?ZR9A~&rsD{IfhDw`^uSoaV0PHHGOuKgj^iXb!M8Y65vMK;D?BPaO-}lvHc>~7Kg!p)xdBx;aB>MAq*oQu% zV@x(E-hy0^)AfrUFm=kF2?9mLqieHV`YVmmh6R&tzrbnr|`p!3pF zQ`Z+$8qoVidn&q7{f`*bH4!NyQO>l|XoWiLjhZ!k8I7-}|({>fW?${=I*?~^q z$G>Jtai&$@GxFxp-y=wr2_T-Ixhd zLn0yM@0|jAmzjBJ4u|#?q+-y5v4P|28gI-uFcmqP;NF-#KS+HGLJ>gC8?ea0e>AU1!xCHp{y+i-R(*(z*}fJIgY8+*Q4<vVIm62R>{Fh9VF0%gV7bGc&2lqpQMj z5H7#!hkjOtV30R+B5|d`b=DbxQywh6@D}i6uNf4UJWIPD-f?6cQ?iW+dn?3L%;pfY zZhKC$H+U|5W3_~@3)r^q*k-FJ(%jR&GR@Jcxuh<+sFHjn&Ma@hQ>#_F2D;5Mx|J2M$aQX-I?V8dphg99lrI0ciN3#~Tk<=VBW zTz||ZhWp$-qa`6Jn`X`ZTI)ltkzMb3c+kM|v$o(Hp<%XHCMGA}!;LanEa_>Rg)aqA z8A5|KP`=-aHNstImxme8VIUP*hu56fWJy^d`5$uBZpV?XyD35(ei-b8p)DA8l)nb| z{q=7A@{12DSw-~O1KNQ&Cp+<@#Q8#O^!@AvY45dNf6$yEOBuUGgKnY^~7m9ke;(3 zmuH6O3%M8cCZ;#r@(y4!c}<pv7>S-I_O(jIGFf2CW5~7!a#Rzy4prw7-vGWz zc}1Gz#IYW;Eoqa3UrOYDmm~ettp>N6J*jUY2hJ7DP6RoNV^~x6)@r}GW8xK0K6Vd{tNPKcE+}Fg?s|76H31kcVfUud|G~K&b3M+;+Y#w&4s~wJ5 z)Ex^+lPD&a`~TGNk}^Z%bEZeD_kIe5APWQ>3l0ncS!maK_1SF014G;tg_0Kz>j6(5 z%ws`V^2gJ`QqQ1jJQWY9OW(rXj`1S9SjkVY*_=dI`+z~CE2yuq?RlV31e%SuXqQ%UjV^Q3u-Uk9g5BW3lsJ8%w#Ns{8wEC#DIAD!36M0^s$cqDQ8!3ns-y{n6ml zwdn4q+B~3M+`iQBar@RS*lbi6YwM!c->)5$1O-iZL;wXRLuRBmMdFkDtv3<8We_}3 zlz1uWuU)_1@Jx0&YjtBWvE=X^5B<4P(h$d$-P0BvA#<@nkEDQA)!**4ljIAAMX(w3 zzqqL&yRVo7nx}em58n+aOXA!Q(!;Xr{QthE^!hT`upCIpBYhH9X5QED=xLaO=`vR$ zV8E4Ofm;sLI|nVjy1JSVAq5+qaJv5x5TH=dn#{fDH?YOBuLNHQmM(oxpBf^a4V| z8>$oCYXkG6-~E2nMjnT~v;I3gZr_&v#jP7I(gW#(rWY<;2y*MjE`ce2)ISIl8p&di z0MqFKaN8tfW7Lqf;{epr0_+0%b=d@GSuzjPuDgM=<)f|f^aRVqrPs=^*y7nFwZG<;XDvpG#H zEj<)+OQr(yfYXJ)$vmYG)QJLEbO0#cHPg*RgpnT$V}~6z$(>fktzW)u19eV>(cDxZ zw8R*i+r-UKd(WlpX&9%QAuyyv7#>Z@y51>3ttL*ld-nwSTht zl6i>aOa|RVhFps>shDwd1PcwqqvmU;tSS23Txs>Zy`sGOQ1?MC-J^BDiTI{}i$f87 zBd+JzJu-KxB(#76IP$ri`hLn7Bt&OzZJp7SJvHFQ7;G#?{iK^A>55CYlxmaE7vZA- zD@YZf`;;gNHT=>5z+aJSp-Vki*QfZ)y+@N&pzhAyI)T_97#Ju8V303@GguxypO6cN zb#0lY0IjEbJe*KTQD|Ob9|-DWzxrEfTn}{3g{dRZ5>Z~2;myIG=-c!Qq@l5RiOkxL zIe-$e-V9xfY#Jkik#oPxmUZj6&CShW5^Kj5A7|hzaBuzEFdu(~#_c~;KyM!aI`Wp{ z>PnFjbPP%eI`Y3E=8HcGI#u4h#SP%2EpfOgWJ>6j3eAqY!oy`}Yh3i?fHW@eq!I3l5at?ht4+ct)OaHp zLebpt0jc-Q+=T z1`*i-_(fDAxW?T~qDEWMNKO1cx6SSXM-m{ajxUDtt{Q$!sPMhJ=aZo?^u zIfrgH0TcNLN7jn=cCJM@;uz2Nj&`BR6g164Xi9d$HBHt?bf~^yop8zT)1=}5m9$ud zv&w~x!ekL0j~J&bImz!mr>M94`_ul>R6ZC$KpbThzK;+M>1G*NZB+5wiZgzLt7)>8 zybcVyj{z%DhG50OWe}N)s!@d|Ss^H4nod>vvP8U`#N|YImnaaubn``26#3V~fFC;P zb{o{~4eawP#b00OrvcsGaVg0l9MV4D8KUMnvBvoZ-nZ2xXG%lIE6 zry1Se_OHl!{;)@Fq&5pNr5Yl$3fWMWgr4e1XD|vNe6s1992y(}xlOzrEt2J-V*05T;>nn3Gs}tl-WF164qMAHa5e|4MUQhCS<*E-7g_T28KvnMlF6xCZUzwIA&w z@%yY0T#=#TXVn#78zHRjApHEkvF2^000y6>U2oEgFTMt19|jDThW(oK4iYI!rdD&$ zZzsUy;DL59QDY6C*7@FgR16Rg^{f=;JSZd&D!)9&C7d5o+FoGDDeI%~*t^5Tf55N5 z7xWn^e%DsWJ#=fD39NzdMeZ)Q2y5^FkdLlxRGiqjW9hs4i;E!x{|u5Jw%=d>)=I~! zNYMNDwc)#eG8X*!vEa$s8@Z>uQs&rvC62U7x8TzYe`E7ZlhM2)+45IvW8(`$3$P3G zO;V=f;^I1H#3!?@K7j)Dk4cqHTMR`Bc1|G)&uP^J;0x@CrqiOWpK&Dw3JXY<&}$e$ zW8;HdNl!QQ|N1uft;hGTUzY2sd+Ac?zSV5MyE%-sjwMPq;;!&TxQoNiIYTy0>~A4$ z?nj}qcr#FuLM;xmUFTReYE@TM#E&uMd2D=;L)f&r;*@&Kyk92%CA)_FjKt7}15Sny z22J*;snscd&({*_;Vbyw2|&T1$B z*KcnFj-s@P@y; zCCGNthW`7yUjDzhspYTbf+Qiz0TJWkpSRkk2Izy55P0z*Wc`8%Y|MSqAp|@0XVcpqVBlGa@9eVT5q6 zPS$yds^!SHG_V>0Mv2|?KkS;+%+tIlYF!i~Kk-D~a&>LdpaH2L3ayrX-IewR_By#T_R7sw6n$_{5 z`_%sV;tJCkz$8WQ!FDOSlE<#q54tLI&KjXhQV#$$-BXAws4iO;0q=mVRe=VHVaR8K zZ{)~2P4^sA86)T|OiGs5k8{&la~~lSrts|WHX22Ut{$|=YpMyY)OdIYcTJ&*^ucw= z|A)PIkIOk<+rL}0mYFq}nYD}<#%@Lk*(N3l!!V+hB8tKwl+BQR$eI~r#@;27O$LdC zkh0&58A8#hR3v*6rJ)pUpZ9T<8LV~xUib4nzx(&k^Yps!WoC3;*Z2BrX{CQWlWE5q5xqK`ezKx7cI?^BEFQ!zG8>^A)| zn_}LSW@H+M0CK3v4E0*|VRj^-3uVGa*FprMR-HT{;9aP90`@$(#M4uESnM~S{rso> zQ?G4ownlbP|1RZ**}6Kj+2xq6_CeG3h=5Ioy=#=p8Lzd$230g>O)V_qvR;sV+ZpIn zIZxgB>rPexfPEro81~$IYu0Ywms;$~op-a_@qzOeFRDoTd6$GRs+!)j3e6k(-d-9L z)o0hAugnh1{rfD>86os z*k9gjaVsZhvw@ENw`MUk zw*sK@iX#FGeeL=;SSIto%7?l^E^}odjfO^c%EI|KDEKeB89%73$DflxGXDo;P=*Mk zv?eoVmP=oj{{)IES-ZU1VDtr$_)6(Q5Vgx6gr%Yk8m^_MgYdKh;#5C?|M=u8UYOoI zEUB~Dq1$lg&;$sP9WjfjPkGb)(jf&Pir?ncLee;q3-9KW%xt{){06pi$QDd01W?A~ z@>igy3PaZ>x(hef;VPK?U|G6@Vc%I|g(yaXpo%VmM7*o;#(t-~uqX@K$-jT$)LQY!X5B`jB=H5Y>Re9+W;isGr21ygobEVNne7 zU)fM8Nu*^ohQ%XZqAFEhb?)+IE6D=TS)9FV z=gy=Z1Deb36Dnt$dMCIXJw(up?Zi_xw9a)R8y`SnD}az9S%Xl{+yNT+m%vowzs6|H z+EgIw$c)P)A%u#f$CELPd&JC_`t>*dE#Ah)CKh_;?QXv1T~znl-kWK@Z20t!Zr!`X zzceKXh$AAkQ_9MHWGOFFEftP50$-_-HOF#)U6i| zjxPpNBH3%SGMCle4<`w6|3~oGaspFXiYI33fO6&wRZr{kF#fAbrDmMrd~r+rxWFBRjUIARaS$K;n{vwZpk_lN>28 z)YJqF%Oq2%aRDQD#Td+Sss_VKTq z+x+oH@0TAB|8OJ{n&BpIHmkE$4B|a0r|=cujXBc}@XK>+n^+rTq+aOhST4(K5KM~N z%Rn+37wnH6kr~-Q(*b9+In<&(d9tevtXbD1_GQ>jxF(2sSpJM|HWyxgy65L&-MwesC5ml~3}j)0xwgq9TN#_!v=uq@nuNEt~?qd^uc*B^Yzd5frD@$_AQ zrtK2gXBUE(*?1B;R(F&Mi8vn=DpH30Mzn3r!j8NHYcqY2i7zPCj11xMSjQ{`?llm+{hWxPYGK^C#u*&Y z_W+7X9@M|MO7}-&aW;g{Eh%jL#MTF-wML9w5%p6(sDKz{%+rva9jJG=A}WL5jCgeX^F-c@F%=1yJ3&;R%i?0$)i?_|J2 zmaQ9trs@g$a% z>~5f>$q;G>Km`9Iv~wu5mKKPnVIa7;Lc5w~bT}Gk6Q4&H&!7}|cPT`lQO@QKWq}~B zn-zkfY~~ag`tKfMtzaxw*ekK3V(s*DB3Eq(@J*}r({s_tWT3Fv{eBcW?d&;o;6<*x zJBXSZY_xaJkWd|2M5WHt{VTrD$w%j)zE=E8`5(@*h<@eg?Ek<_vxrff;y`aS=}KK^ z5;WP!h?Q7jN`r%nL-GtdV@9?7Ga$sHA=x^{>o3U77_Qhtge#T>oWTrV11O12!Y9(Cw(neknu>%)$lF&>UcHMq@11qR z466P31kMQIXjl)sU&|4y%}&+IyB8P4WSF7|u^IuowzGZMhy7?cw5S&WNaVF_=)tc) zXRGagS6gFcvbzL(ag!Tj8i(YQPJ4X7xh&l-LYvzzL2Q8`Aa91X=Io zJoJ0>0M#szCIP!`$&C6)i?U)8!88Isp$4j{eJpD0qC(2vHMYUO_0^P=KYnIRavfXu zWb8D=9g>n#hhz{rS^0C#q$@OxguHXEc(8tmiU9 zAv&(kQ z;Zh@ou;TUe0-m|oI8W_nwNWq)PbhmGxpC!5KsNtHW+d_sbTVre`H z<$!QbJ#i^`Ip|EmUU>r{hOG*|dHMGG^Y>GpvE72W7qz-9ZN8=rqp4yBnXg<8`v2?jY^)?a(j0X}^g(sEJmW29e|T697fV zAVn_ejVqV|2bz`;r#%A>Plv?Av#^5GxaiK3g$tc&z8e?1Iw)k`*#4P%?@1bDQvTDmqh=r2 zIb+bHq`F>8%cwK6{;BiESm(5ws>5?+MTxJMEbm)RR$zosc`_enm7H4$X=&=+v;U-J z0y8dm>jmC^-s0HCnT^Xo1z2kUm_Rc-kzy<4c=+LEJb{WYP{eQ-`8fyoplb(SJ<;q| zJm>Yl&l*-^*oiSFGOoI_4UVYJjs$^n% z??##L%|R+QLi-8V%%$UdhSgVVzfPMrC`Va7Y44Vo$-7Brf10$7>;Q1u{9$EijgeV6 zsx1-fMXSZ=!ez>AUU}2)Rb&&w%IoT@0WtfMm~A3SHoL43>8C_Tcu4ZnlXYIjEMLLH zfGh?b%>{-JFk{43gL4uyNJgvLhsJ#44CON*I`Zw)S-m1PgYh8nkDJ2z(ikw<32Q&S zBdGGnSE0)DOs@l2T4|<|1cSCSzEIARINt_9Lk5`ndB$vrR$8Js=Z$IW%Et(w5WkkR z47wkl<*uM+HUxl}j}OqJ0+4#*dqSZ2JnL7U-_rjbrN)y&hC6fxNm@L;nC9o1 zWwf|ZGmuY_q#8mfk1}C0d5vh=fBQd-`G2oTuUx`KiF*Gl3}+ySSB(qVsGryzeY#UZ z&Np1v#_eTC_NDv$$ItTGFP(YH|I`2AeB^m$G1oUN=;0AjR^R`_bE z7(Cz4wTo53u7nyF+Qkle%OTRDpQHEM(1WWs4C&px=BW*BeOEjAzSrBO+F3f!rl!@` z+^Apge)BeG8?=r)n>)#4NR#W2Nz`;TtoZoy`7><@%L*pT5xrtp4tw zw^qOKQ?ED1O80nUth9NxH*VXCH(FQ!|0U=?{-3xD>no2)3<)vY(8b?VqgrKA2%?ON zz_h0tzwzx;{n@on;>~uC?xpwUi9LePAM7h`B-rhd24gEYPn&L^Dy1yf) zNZ-Emoqy4xm})lJn?Fv@U4BCU8Xex%GUwM{znD|}Bt}qnwQAKywyP~qc9;X(QILv2 z&=O}SK_pNdWOk6JX$8n@W@SgEq@cO(DC|!SQ(v2*R0tN6K^o|F-h=sx|UGP^|rT9BGx~qK?p;fcI>Ba z%In9~wiZ+}tjk$i)qK*h*0qC=4P z-^V+02sE-ocjubsd;aIYg=de7@40iskkn67J7r8NHu=CL`D>rzA5Ojh^L@9X8zJAs z-8vgKzUHAL*|QFOKL6DFd|K-EZ!X?Cdtr`J4^8P7^zzAd8}dz;uRIlJyt#MZFMsm&D`!32dbGIf@|39pmvy*FNH%NMVM@Gh z5?=GX)Q8g84yZG3N3W9x=cSHVHWnyEni$X}wUV*5kg*oJptDmK^GRL%R<<;*vE?>* zbNKgpbIkX23pyn@OSZ#GhLk@7#c6!UZuIjze7T9v^w9drd&7w6=D0w0#yp6?G57mEc(N2$5^(ipc<-#(&D@C;>%qxxkEu ze9-CldAeXYpAsvPZOTef3XKav_(U}Ik8gp9%(n2s7PqTVa-R6P3rINI;*aZVKPh+w z>bl#vZ{MYJ16$#(G_g&E>M(+9r+91anlx={XPiM6Spt$5*Y099R=ZVNy}EVBKWSB4 z7jI+wMPFMyI4D75apM;^0VLE+!<{tvtFRzP-nE1GtICs+m(&kjWayTA3*P%UlmrRC zN+-Bu=h|(f5~_{KL_NQ(Hrf{W(5TPaqewdvd?&Dr1s^!9NAj%l8|*sY-P{-3E5VG= z4??2}Uyzh7(oO~VJtOEn*t*)&aA}MtH=~sveW}xyOXhZ0>a7U6q#IHF`)|&N!Rp+~ zCG;_1x#QE!uwrC0?<>gZG;)D1WBSxx&!5i_)<`2oTO_PkPlGfhIme6o0stkFR^7XG zYxqMy;_+kaxxDMi8g98(llTXd`_|R(-$!jG0Vm9GQ;iUi#uBa+-1_3#=^4CQCOT4D z(DD#N`Su}9I}8)bOh#NJ+iuh}vDN#Nt0CUZ|2AcY8^hNiG9~A@6dTy$5el|)h z=o>PrlAo5woj{0}Vb0U>%f9>WZ??H{mJ1gxN@St$z!}kOU@k>qqx6>1ZJKPc9ide| z%z;a)j}+N}fUJ9DiI()vsKBkdgPP^TB_`tbedT+Al;UYua z3Ix{s@SIt(%qR|rxiZ_W3}8xh(53ZkcX0PKPvmTV<*ivGhg_O+^WA9&hxofn>KAKWKCRmRg&^7qXFZ4Ork8tr~g#pF+>^V9BM0v z5IVx>;yTA0Z}g!7PS#VMoef46kyjB5JZLNzcK%1&KA5*BZS7Oj_V<&26-i6H1K^Ue z&_`t@OgtU&B>wG}`|QHyFs|}!)Hkz@cW&OO%Fn(C`o=)SgaYkDLtg{>MC~RXXYB@s z4BCR$VGOul&{YZn+z}_rJ_935S8wkfVH24IB_@ybAVkobXCrxcllec7Y1i91x=CBF zyup6E*5gF#N+d|!vaB;6HoYZ^l;It=0-C-kgohq;{DBg^bnuGx>vvM&XecSuwhpSS z1f`c`{*Y($Hf{QerT`0&&?iJmKGiH=uNZ|_8LN5DxK&Aa0tFfWw{Y3A_(>5wT>+-e zAnegT+sZpj=z7RF$azn|<-P&u9)I*KBqYRs4vE^uTu;drIlzt6oz>#KGD#hkuvuL` z`Q&poHBm(GTf7d-2Po3jt5wrbVvQK4z{C=JI0eX;g$TXzH5~ewH;*X@5rI!;%K`Sk_Hoh z)V?M2z~pX`ntK|1U1Q@9Gw7!R)@V%RtegLOM=CZMti$=&s06408fiH8BEUT-$Ic-! zb(u0uUr8k|UZ(rm*u=EP0@qQKhy*|RnDCJ0A9C&@Fi6j`>D8S{1J$Y-BK*>4+K=k_ z^I~fPsN2#*?Y5CViW@J+DB-9%haaXk5=4sPL_g(TpKH9;$@D>%+wiOi3>kN0&e}`C zZ7#a|-0MM8yb-PGPWr4HJA+O*V(U%h6$6{FXy4<3JpbVWh#fZm#_{ycGOWa0aFQ79 zq9v?M%pTgXD%=&Mp{_{QVS5?I_JzzX;<{~q>ImelDE~ij>|5xfo1>az6VV@ch;VWhc=@lnqMhk88oAuoI zLdrx)7f+7!@9D>i+I85~b7b|Tns?7Bv+eq}&%GRoM+pRpMs{RD7Xos;sz;GFcNc38 zK=bio*V(g=(&%l>2q4P+`2J851jS3pz$M7@9bR|qXUFod`W#y7N4D47!9hNrqc~hb z2zHrd+5`FGII}s#tD3l5lV>(AE&77{V6C8nMn3nGxXmt9AEro0*|s~tS%L}~%GJmY z$Gs6teRSSI$&{{}{9O&^ph9P7XU>3*zzJ&OyeRrdnc>Oq^!0PCc~6tO@9@QlTFzg6 zwVA~pc{kgT6gk>aYF^?;Y@3>rp>uEq&whH&etv5MTXi$c7)=+}kwTy8Y4rjEs>73# z!N^wx>k^%eP~W`S8BVFXaFac@bfnedHM0})!bRH8(Q=^eB==YWO>!{jGIr3KKV_d9ZJQO?fLGz?{ZqpP~ho) zA6C9AchCzcWN_KP_BwD<4@qLZX9DLx-YCcB&7wl}6nI{7sQO@3-D zqswqr2JCXTT9hLDZYdQAnzGl>5DbR0C=e=LrdV~m&;RrQ4Lp~CVEiwM{s%DAbGe~m z9|1uKf3zn;-b5!zwvC| zs_0s*=gWhz#n7QQhV-P+m{$~Zx$-E0!x5JbLK5k2*w3(1y941F#(UJaZ#JwMX3C90 z$Y#CtJ!(5AC#UEVw&wu&rEI(wSE1J@x2?S-@cU+V%#4`5`;0Q8N~hgl`1QOvuJuQc zuTIR4db-bX?ql7g;&pr)h`!g8K~QTsi%f@zK0dE*1st#->M1lk#7HdpxP0gn9)`OR zNiXvb@yD{jnMOt19$Bfg#c7J$vxi$*N|KjOuWN~xQp4h07pi*N)9P-L-nL{<&(g=) z*)8liqyny#F3w*(DcL>NFh^;k_(i+jn*DH0zvv(7y=gHg6RT!&9esh5ohkr^K@I&2 z{w>larz6 zMuSWYvPfVxTuACb$3t<6;5rcLzJ0cic5;t)c%j?-=s<;RC~3Q9VkIT@ce#PLjJ$DB zVSGt@@uKfFD#F#ctjh=hAbHJIRFS)Z2YO-E$LT#NxIoLK^umsTtwdl3AYVx_3A|2S zXN{wZ27b(X7`Bc14IVz<>%OMeeR*G-`;)co6d#P!U8Xkb-LC_BL6mPlCwT7!_`=w~SlCH^#h|%i zwW(LftJVgsP?{G!^L{PyaMaZ&(zN4dU4{-l^mu13^W=t|?&d240tlBO7TFrUX(k6D z`nG{q-L=cIDpvqFJ6D|`-<2i7WtGRMvB$8fMPF9afx3^bu6K~5XZbeW2*?qVk*R*fftJvHFVs*pA!^4Ua zUX!F^_L9|r-kgs<0TL$m89Tg(A7_Po&n=e{oGbypSF(?$II43q&u{qU4@ZThy?cT_ zxgIzH-S+9(hT^T0H|$66z-{Og78WJ}{NkQlR9$oI4Yo117ra)uXf@=2TP)yvPYc&p z0f*Lc0E-(hXJa{}+QE72*u|(Pt?@cqIH&yp2tX<#U}dJAdS7p~XK=-qZ{V-}wlj9q z9{uM(e|G*Gy6k#n7LtxjxA)@m%!O9^NSMPg|JT94#!3U}+`{g58BCGI=@7;Ul|jv` z^2;YDy#75L%3+Fg3HPaKsK9mVCs+Otmp5+Zt6@PGIp_^K(f z5&pjYNEY3itIj_;VfkzK+rc&VI7LC@Z+{-PE1SQcSM>gCcx2khsBS^fG=0V^hFx3z z<}L9!_9{8Sq`Gd>Y{*y&CQ;G)zK?BQdmQ6d68Al4Wj2DI+=Jt4;o`;nlNtJDa&peg z)mRSFjo-&=24P%fFl>gqeh#}fGPp#TlbW35GoP23q*}cW{+>JM{;|$t^?E7SOEGkL zh~Ioaa({W|Dw>fZIMF%ZW%|BJ_0Kpsw_F;OI^5)7e2C3wHKzT&eJfkrlHmIs>9wkU zKYM9o|2LlM+ao?HsZjti-+j-pe~Ad}aeTI{!67=y{+jZyA@jse{XN`CY!*$J9TjD} zt&aVktDgDee!Y5be%)^__}1%iY)|(+?~WZiRzCdb(a+aSGO7ICle`=HYs>y&)8c&> znKp0C@u#{OnW*>@Dh0)ua_hdodv~N7=$g<3O;{sR1`Zr(i>y+$95n6zYi_xjwu(+`S$Wjto}1#b zKMevwV|ZlEY33%6N1Pd4{nou-Zw|4D_o+@)ovqH9R%_QUNZD+S)O3@BOKtOdp8PXzG#Es9eO;d?K zA9mQabYNUEGz%P2fiE>Rf-w^2S$j;bjZTPP-z@7N*?{JBahZ=G z#_KIQe>t%AYpb&Q?rzNkt}ymi3>v9%2%kDSWueX~6h;Y5rgfQ0S_Y`$^xEMC*bSdw z*`&rH#$lSNE{7!7^6nUuYX_=+e`@K;`{_O_HuDadIXTjz6Sdn9HSgY6K_c~or`&Xt zlkEpZIW?v%NAet{W!DUZxaXFBvb<(3|79AR#v8o-ar3^fhdjTXuI9NEypm7>rcm7r?t=Up0yyne zw0kJ@2g-u)&d)SyA3vtu+R}B80!>aHPk&KxaF^-%H+O&Y05>)Y_PaYl7kn@!f(%Ld zO{}-5C#lo5_}A`js`j_kxug}VR=PZn&MH3&`giT8110~>Eqt}40Wz=s&)@mRCZhFU zOm5Eo8e|c4I1@-eG@35-=&_Ne*svu7dAE%M>>NGzufsh4Jz#LWThuN9ePlH0iFsT8 zVlpU=m5>L%@DMmEfUH@JFW%%lV5xlNfL|-y{QA}aEQB>B3oFmoQCbURKhB7Fsw4Be0Fg-P0OVk+?TW)`B8hSmY}ixpzh|EC`U45Q=CO3`J7~CmOLXia6E#i$2`W^h z0>X*3^fH;l?q&F{Jtij~hSsqsc1+Hj@NMN6(aEYJF;|82-(Aw+ck0jniQ{5zAy%?c z6fCM6NoCI;m^1zobUsZ?7D8jlJ5{CC7^?93bym%UDv>}k)Q+rMGobKo)UT319r+Iz z+cb|Q^{J@Yh(it01&TYvvZtu$P$q&c7U2NyZhjt z?r$x8nb%h|4$twB#arZ7%O*ze4%jZefwC;kBPRttk5+tH?_9!l#u;#gjOzl~$IMO~5RPIH*EQMo7-hJFDUlSR&FsWM;h#x| zR*xDtZ4R}sOaftMH>X0>SVkAxE3B4+am(yDC=OSByL(`MUfvWub#xCAjsz9rA|-!7 zjYskEO2JnBk^RusN7~d(Nk870B#Jr2zj)j!Jg{cXnj@tzM$HzW5qpg!UlyP|VZm@% z)*1U~h$HAN#yW@Bqu|Ci6^39vzHSiXrmn)4EtAqtv)9hmB=O3N^krGnX~C187Y%Ilz|WscD}p z=>P@G4th-pwlZvE_QIH!LK9)QG+5jCE}0bIIsv%r@-i(sQC3i9;r{4ESxE#`vB~j! z2MwmHvbg6R+Y1bTYwb7Q1;m*dqx<%6+qzZeX;KXcLB%-7-LQXDYz>Wr?^2Stl3m{D zodr9sP6#OF@Ke{)$hl!)INm&4X?i>$A6bEI#MmrwLW&(rh2Y3u{<*~m_=(eKyq zy#7w48mfS!q4A(pTgl$lrsuVxuLp&C;Wf_p zawcTSd|!81x(!5@r$6|c$=4e@&iMT&voQL41xI_HY5K8XqbVDwv$`$mFWT6I`^sxs>7Q~O#1_{s{p)h|JVS|h%&zsFT~*MRv&AH1IWeiaqI z`f-1d8Y$AKb+_vqxiqphxmh|HsM*e${h2d!2?d|sVUNGBTuHy@JZ<~3k{tiYyixmc zhB%oN*suDEe{O5U*IT`{SI@(9ZaWC-<50j*vrfv32V0g+fePmk-08~gV^#W0p1e=~ z#8eey0BBvWSb|+AWZyO{{-&CSAFAipcFBta8Nq%R!AR3fuLohoqdJ7RKl1Q5nV@F$ zxnA6ho=5$6W&iO;d|AVk7f(m2)#6|JY_(U}=*^xFFWC-!a=Y~P1ZG-A&5+1h%8}I3 zjI5-VrPs)Zv5%h7l1lqJA|>xyCe@h1tY*#Cbz<-m^w6FJ=?DI|&z9tw6yh0Vh0)C> z&;0%8cQgQr->^UZp|zcz-6deZywakaN7#4{1pCyy7fmHKgi!Y0m|6;bjW1y#w0agJ zkXl?nu!m+#cP5)?{^)?~PioYxIr?zrFhaCjA+rOv6DEv+0FGLLr8PZge9~ty@%~wy zWxTnqt%o|7`HNQ$Lk(qr!zb{toadwsjM+PLjyxd3fdjSE-Y$3)-l6E2A$-uJvIega zQP%AYoHLNVOpFgSm4ekglaWP>{QJoL&|uN>w~t8od2@}@M+JTYKqHZh#MDpZ%Pz0%dW=UoM&}->-q_tE&h6qH?c*H!Xz^p3 z`ZS-n(1}OZ(=qnP9;jTrGDhuOz4y40Gzd_4nbj)0AyHk+wZGhs-IIcuMMoME`lQke z`&P&D44KU$_p}%sFeTgLP)UxTX^$$eZxL08M@qW=)8uRaSvbi>VelZ{2(L`A-L+zp z75-HVdfef037}N|1*bm%w`&nRFu!_)f;_%$DSh|=U~9p$BroYx$FufW<9)eHvZcy9 z^YO$7|9Yq1a!x7^OQPAFX6n18ncUY`~d|hwkj7dr`+@0D3O&|Lo#zIE6(ULt6M1%ysb=33f)hU1o8eOSZ5*b?;EV`Q92IzZ=xGaqg`V$H_j)*Iy|dIe!bb!@u~mQ zLVL2}B*cZHKkq2*{y}DB#PQ@nk1I8Mt9mg0oIFbPrg$ObicI}f<-eFXofHE|QVGry zm>0_)cg&~DN}hN=DViK&YiKBWf0uzp?{oK9y@j_Iwc2-VTBhg7A%8{eH!3=Zllt(Z zVhxejm>D`{1tlt%{#U~5>@)DBmbt zc?ZZ9US_OU8S+gUmIRfcQ`jj_m|Ds9#GyXDQ;cCS zDcJz&s?&OWZ2f`?Onri5PtJTi>%pc4l{+4_`2PL6&FnCm`VIF8hiulX(mNenTF;bl z?dAl-?*q=%f}!1i(fNTm_a%s%?TsYb(aYITQs~LCyxujNM z;8&%kgSRxke$3>(f>y5=YNx?}SPVE`Pf${!nvh<}AjTsGo#~YKTX*+kv!Xz&x3lTp zo3}IR`WIu+f{&$COTuP=P8^hBpKOwQ6mCzK;jyTQWQRH!@FFs2`tCq!-RPy!U``p5 zV*|BYVnst9cQhk5vOmuC5y$e^3Vk3=*MTL)Iw{90*afP|cv@F3c2Vlla>$q`R?ah@ z@YTanqZ&dWyo~`E?#N$qUWO{BeO9Kf6(}<0Pvy^?bJ@{KIW=$-mA2Gb>^7N{V@EuI zTY4G)wXxG4!)x5F{Y!&J19Lc|g#!z80~`xFgBR^!@dR`?ST=V*N}-P-XAFF?DhOpb)F@s zxfq=C6$34m2xF8zO*9=kT)g1Od8X}rlI;mTzcJ`(GsXqR(JG9Hl@B*5lMkhxGS|%7 z>nKlm&?b}LD96MsN55!_I<`8u_QJCt+fBD54UpqMG|}Inj_nkUgteKhlKsxq-kRbH zmYCZj@W_j-$ar}tKf)@@m6?y=G9mKD>Qemsx6Gg{$|%EZvcF14ZZ@^Lan!_Gt3D!z z&Bf6`K7~B^WU5>W%N^r3jzAA0V-c}RVXb1)+=GK-p8)*Kb{mvy(7l45m_TWL_ili1 z$?tR}hjo09%-2%LQ{b}2E-MKcvcS9-Ygw|6#z~C}>xYxic{>~a!_EEn(wKJcBN{?O zYeZ9oVuqWr%1ljaKFG+`yJi{RX^Wb8RPXzG4r;#@B9kEmN?Ulg^}S)=T+ZJ&x?ytP zmO|EY4`$A<+ig>Cur+ptnZ8=|^VR9*pDF40oc*K+O4@?m+m7BWy@c~U^aBqGpUGUR zjQc?4>)@p$aBNky&)N1gWMiq#(3B(ft^0=sZhLX4#3p^Mbsg)dY~h7D?YBFnenO1@ zcvNa?k-(a?6a?RoM`;%OY93GSYD1}@%x53%IFo*01BCh$mm81$r zdC&D(k9G+nd-_JI9*|r2uP->7df3$%Qso~tYi^?uANz-j=CQh@esZgGA}ypvG5I|In{R!-qQ~oKp%Bs(Pd^8UHpzWj9n%>0 zQJIdtdneGno|1dtLA8UBrN<3v#ca7<4pAe7vks0=Wkx&7q#rvfI%(2StEQ1 zONJ2n?W^8`ZE7{?_7`%+Nv`@XFW=Mrbr}Y95J=oHz)iHdmHD z!Lo+(RTzrTe04-p-+S4`v@vp&I7&t4lH{0_sUP?he4?-+5v!nwlhX|*5r=o9i3v~? z=BBKis5?ndlbqBM(W$g}Jk+h+W7{-q7<2O7(`aef8Rsuw9-zdXE+`WZR}HB!!D5Y) zC#&nf^bSbyE+i$*zfe;qwdTu9`;$IJ1K*r%mm;Pg!Ar|l1}wC`YD7$Bg{%7F+zG^p zNbD)u(^7$IMhOu8zPL8Em&^hLGDVw<{3VQdrP&f7BV-UG7(>t`c0JV0aN469`VC&C zF$S3m!9E#>G|tJ3#U^+;EBE)=Pbfj$!SL8kY*3NCgS2MJMo zfPgnS0K*J>KnbU8Jk%Pm2v-cM*c73piG4KBfdo!-W59AW5=X-;bMvMuS&iFEkAa2zH>m$*$0P16y2uOdCem;+gb*3e|MJT( zN!J;>q~emt$#iOmP;1_6xtYK(Mva6{qcYIEWrJorE;=r{K-UQ(c|pyQvYE2#*tnRZ zND1|CX#2-0Ft{4nBQjOg2?}?=KZBsuhMvXF=Qg{g-ulbTK=K;S4%r}uMoUpf7Gv@2 z_ODM=>}#kT1uV~|KvoE!I1=aLp=+_p;`zWBq9~5y4NFFyno8`6se%t72nu?aPXTW%#aQ+ts=+ z|3XF|HL_znCaQS>rpcY@a1Z(K6T3X8-^hRDrZ*M4bDBubF(^(%Ec3qrjuc#6#y1@8o}*_6IbLM|r@kb?ye<$$=XRh&iy}tWrl>g~99kGXg@qn9 zqr@T?XQS@qI_PAe|7b1OA0muO2>Bu1yYb!PCxNpeM>-h5=i1ZjCiJ$7EiLaAe9H@| zG}=Ckg6=_i$yLb->OZvthL-)Wy9k{}Y+U>S6{VWGtXCrNfWRlPl-Jt&MH7FU!&_#K ziYC=*L(MJBY!cZf{e?wf{^;59#YIJ*Y%8UwA$Fay!C;gABE!E483mhmbghj60a$j# zA2~DXV*2C{Vs=~){lK?<>Cql#IrBR=EBn1+vnO30Y?C%eov~lL^Vitbk&Ekgne%;} z@L4`jp02v;d-JEO&t}@)t2gV5QQlp43JLC!)n(YUWwgv4il>AY2hZv`;doTr({~45 z9vpGJ?wDzwXXaj+Gp z2p_NM^}R`Ra;MfeIXHCOwS)Z(^Z{E%PVavs%yDC9cWNa-$aYg7_D4`R>V@BQup@k_ zU4gnKx^nR&S+U1j4mrof8=e5;0bpnpE1z%}NP44oJlpTt*@ny3oY5d(X2Lm9pI)Xb zC{H=wCy{eu8+k`2wBf+;aG$^#k_wYQY1q3+K2&y_rPjkb7oU;Um}i@X;cgIgzfq$` zO=(g?gy#8rgdVrq*whBbhxPH3MhyW*`r(ILDEqug0yLU{QlUlSLEc$C0=}aQNDr<`Y7(e~6WPnZtY|1XM3T>q`C5NY#%nCf-G&18sNmCaAHm;7Hc0av$zUk~65oQY%c zx!>LgtCv~ty}RMQ$-FXO#@yKLd$9f5;x>pKkEkvaF#f{t0Hvqqqi~k2%g(F=TTpZO zp3%nfCRc4%c4FwwJ_%G0E5pWo!kW-BL-5CXEgowH45F4U6SNNK#TjAn(1 zXG6?0&&)rvjdtu7Rq9yZXd=>|bl+SmiwXh4-NGBII5OpJ2={_SqJQ+ASGz|cX-%?@ z7CsCYJqTZ?P)#9fH|;+(p+YDM9#ARt=WrA0krv-)v7PDb*@e3F*PZ3NXOjEH^*0xt zP|oWhJr~-Q0SOC~0j9~j<{R&p_ss^|AE7#fK(4*BF(rLXQ9ZjZB?qF*s;$`SMr4jGdTP023gH^*P`dlt#dQE=!7G<;N23nOJ$r`+*R>vAtY1#J|H;4Cy>TpYO534XVJ_~uzbtEZ@A2-xt~=HLm!h)1(N}7e#(Gp4 zm5?~GCb@F@;F92+QQrQ~vb#pkZ##2lXjL*+6@ij-QpAcrdu3@bo@%d5wZUD#;9HYMuusEedyyHtQuZWCV4x7|kdDvKjPL5`oC7yBh3IJy2U z3N(7*m*{$r$zNEdPaV>iR!4vThWI_*F_*=*ODt!yPq_UDw;>gn>8q|xpyK76*2hZyykDGZ$v8)ALcwt8(KaFb&U|2|?PUI$P$~=W)yy4u_F6dMUfHqS&XHFDDj&)SwlrlPCpkCR z+ExG?Z#ZW`yN8{BUOR5RwPoT)0ij_(H5g&vm*cEa(?@OMK%CAxBUm6o{tZdOR#x&D zGT|E8!yVOZ(2=sX-MMB(7d-Y4%FN8H-T9`K%jZ9uaq^AH|MJ6o?ne(EzwuG1|HYBE zx6Z`G_W8WwUoGpdEb+Rr`q_+c-|kq~-*r=$;xXP`eDl|vg?Vnc8nkev#ftTli#l44 z9v$l)mHX5_Av@y1gvc$RVeFs#LZyR@K7}ojQNRvTu~_*C&gg9WqM1S}l)i zdmo!fJWB_I?VATT#V+`Y%Q*5J&3T1!(Wr6b`yX}SDK7uG5^N(TPmLir(x_e1S}R7J z3qAJwa8zc#&9@DikANYm3Ruda1a|K;(ES?ye=wQ%R$#x@!_Rr7PG5R1dqZ+9dBl;{ zD}xT&U9)WlACI-W`&IQm;uq}kYl>vKY*A6}kN=Ktty{Vz@Hez-FH zqlg;^J|PU6!06veogc9V@cf>aL~NNirA#)byt0uMX;dWtX^UT5#%hccDeJn=WL~i@RHr` zO?rte}0`f@rXfUVBu2&JL7;lE~8gln+#92WDr%% z!Z-98tI&t+XnNg=W5?Ah^UHWPi98_&Uym4<(J1q2Yb>Wg z?M$UJBxX`X-;K7@i{j(LcU&obSk}Crjc@+Az~fo>pZ5>XKM_?nvG2X!tCCI>RB?Zv zJ$*-6lBIY0{;*~xIeDSak5un(mk?A|;^EYC!B-Jg3C5_Z607`*n4hjz0t!KI1_9rl zYgEY3D;hv3uFwH#Ue{PkG=lX?I{!^G^FN-b42;Mp;3braAaR!%(<7%!(F&3t)0>p0 z5wW?5pJ=LW5EV%ouUa*Uz(_1Jry-m)#XDPk3bu!AfrG9OVrJ!g zLMJq23UlZE=!LW{4FSMfa4K1oUUhsYX0eh?o^I}H8Any3uBq$}aBthhw)UZKC8d4j zVpI$JBt}z#O2CagXY=KkOKPvm%%vrSu)o>tK^^SNm_VhDN}h) zm}$roMfAnQtx^3(WB{@ z7f(u#4!asN>*(;mI;^u9+GX6{;;TE?985bs?uzO0Yt4P*r!aJbj%im8#sTrcwxZa; zGi(*_f1>*LMJqqY*YRsk0_IEz4R?Qgr ztbH5Dx|7dH0|{EkY~H%+4QjD1UK{{U(zzrr(ZW}vaxen%ZU8MWNp6WIOOQWt>!xU?IUjiz`h8+;73m%u@7?elsq-^>ep}sF zGMUKzF~9zLEy~G@KKw(9^~_uSw)OXD2}bZVA4 z^4g7sw$GM%cUfb#@rRO(`rO&?&LvELSU=LIwB&^KfKHv-Mtw|K|1kCQvKLbVuk{X0 z+H|4Ij_(f~h@M}zdD|@8iPLt$$L>+`V%zz^rY$zs+1)dC*=QhSqh&Wcq@M)l8X6-~ zgZMW+{L()4i&u#|Z}YELU-(fXM$z^qz__VTqTyWQnmQbWOj zBuN^$>Q>mWVMFs~x0`99?-_*tLA6W?rFkCMrO&R>FmX>NTktmeoWZteWD+Sny@*c2X_x8cOs zpLZF5;}g;ctMS)9>r+$Qqe4Ns(ry<{bI`(NnGt0N6-Ud9QqUH zWabFi*n`Gtk)H+$)mhRra$>s`a_rVjHV_hY0{z&I*n7=MIb{k6hwr;c^yDy3Na;ks zoO5UUl%m2c?Ay#cc65iJpzQ%OT3 z^Xl@M!`mlI&aiw)gaUbrIt=6zVZrkaP1XSe4q#QUfECWc$kN$s;iqDd72R&mgm$$x;Ejw_ z@)hdCV;LD|e+TQ-KxQMg>9_75xOJMy*)DHahmG4pLz^{dAO?`qx_eV&#@4Gf^ji)_ zlGp1=_3GD`{X>()HS5(;T*)4i4jM>i5H6{bcH zYdegHV9!7i+D7eMbIKUEs*h6!LP)7xI(gGv+u5l}bJchJxMOZLhPV)x^*ao->=qq)xbgG_2{* z0GTC2Tl?R(pW8*84PXaJpI{YB@I2*Fa*IVHcv9s*1vSHm9Gh|iwTHlZ4uWkQQrpQm z=GU!elDfW0@QiK}t%=>GLllnI^6~*Kc?^TsSkC2;Z8T7gu}htDIzTuO8A^vDOY$0D}0f;j&I5@CaO0Lx{T`$zOYFD)7N3V?cXY4)DIoQT=)9~Rt3V!RpaOsbij(1-m zFPm1Q?N^8UOiD~$w7S}}GY_WUdwf5%Rj6ZZ|K(p@d{}>O(!sGC&7VGK!w50&(^sdu zADS>Hw9S#S>2F<%@y!?;kB6@9-Cdo!B%ZK+ad)NB!F%HMPO?@f{O=hfKRn~l!4ppA zE5D={YA{P|1slwbJghHX<0;sr%l$#XBYG7BmAP~_A}Irgzu32$gia+VP^FSzvHxJo z96fqeJ_;<5=84Y*<8!E_=%^#fYHnpUfDV-gr_2OePQds}U!JjYNyu&(G-u8n`HKi~O0?>uS@m3WJDS9bEA+tx`^%9z^Sh0w zqOnOGFIc!gM<;CSv6ytJUO{l;eW|wkya1h*+r}NKZ8`3Thh2)7d(C+=v}D%vA10VJ zi9OQW^qA%I_m<4{VX9!$5z~VGx14#%_pRL_`@`|6#gW{uVDIbppEvw+jho)J^m-UuEAev93r}muv%l0E zTlVX{&!QdTGtBG;yY4!h82tW#9rwo0olw@d)#5tu&tG;eecG|KpSlfasGG^S>WBO; z^&jN__->AM!|5nZr@JhlS?9#Ll8uyLk|kqwZy%a3!3-=&SgtVm_7G5mynGvzJ+&bUK81Pb#Sed!<(<6h?VzDxQWLAyWDI+5;cMF1PD%+gUcwi3;yP&Hk zC+pGpNu+sD_j3&UCTHBZGrhEALi5*2IQ15sdcUi|C`0?3$=MH4Uy{?MT5&c5#Ypt^gc%3k`u4>OMQ?CcEM<|RA;B&lv+C*`7 zH%NS9fPIxBCL~mgW-VG=s6G5j0A)aL16kwF=!}4G-*ruk4PG+H<`9D1nHTSb)B@9@Tb+ zpI>ZRnoU|MWQnmHfUb-GZc_Ps+u~EE^GYW5%BcIj_1-+QkNkSR#`}uCR(7JtADd7A z@Wtyx1{VH3+~e3?06wE{M^aMKTZ_e2*wf|TuYgELk;B<__vXpZ+w)6Z|ARDnTqr^EalDD zAZmgdNsmHuL-`yY%e`nL>a%G+Y^U4$Pn`k8M&@vYvmD|hzVYuUa%?INp z+8e8SuWq>uWJM}x_Y-sH>^3q41gF2Pe3Hn z_HKdJK#cNb(!4|9SNEd>Y1oL}gVBeCCp2O&L9V1OX~N3}A61I5d}z6u-JZIAldqb? z8N%f4k~9NQ$At#L06ie8bvOvoOGky|i(ySj$aq&y7at-zCZsFPH0=-zW+zB^Q4Gjg zlq^y@puW_%Vv_akd%(YXEv(1nDGmLKhP+wgdgyn?!MJqnlb8q%lGY6*XnJ}E$zl?1 zBH1{>phR$RBkB77u`c3NaaLxGMv;%DfaiyL$VQg~-C1B3bZXA^HR&tw!6!5`e8$Ts zG1V4FDzer;T(PX^JGC|aAGXD+Uj2{D+b!ZrpjkFHTsqcSg)KRtBI{2-{p@zN1j74zO-t`a@t1_d)&67IxmLdp4C@^UU<{p=hkJYibARA~@@;G>bfK zOFvhJNepn(0RjBn(XmMB%=BM;Zu7@HqhSQoSfip92Ojs~Z7nPJCH&xh1P?1R**!4J zMe)?at!>&d(kYI`Z9MIJW4q`JPpDXS4(l^y9MoVDrp0#7FRhbC>h&|PWO(KaW4e-0 z0Awuo{kGlsRsD1w?rXkt2|`hMnR<}j?=k*Omiy=TlL+31eYVXyZ@F>R=iaD|#n+6O zRf~#8@$Ka*qwdFVjQFztoc@@B2A~b4j2QcHFx(FKI=e~p2HTWdcMNK{4Hn;OGstuo z#+3o8H?o7+HIB$PWm{E@1t(b85JUg)a3jQiEgaipDTtBH_jp9mGyQ~j0 zcBoi;@kM<2pEtJoM6JnD4k!ibtWTQ}&X}+Bdmgr$^0bKGc z`$l*C(8)g|O`K1}u~3PG#HeK5?aOP@sL@#Pd~i~)(CObP1|8hhda^h5ET&4IOJdi% z_d?Fav;=5Z*#9OQX^X+>D)}BA$dM%j-}0U5OE{`(@XwdxpG^Z12C`E z%MxFdBEXvp;o-GIxyRQ zQZdmee1psWM@iM>e6IumXU&XJ8wIj-fSG2S6e8qZMfj)5BHC@VS1*0I$Lndi-_B{9 z7n@NkK?~@uQ3$LXakQWSP;SUXOCu_*e$ishdc$={byroW;j;F^@_WcfX-Z6{E&KO0 z3;t;)+pQytDPt>V$IuhU@dB*U5YaNCf!F;`>bkZFI5aJLttdvCx6`gOMyVd++`|ftzk9aNJiiB z887YQL;BiM24iEl6)%McfRh8^8Oh!kjf(I+Bx@q!zT5zBybUGscaVQc?6qb^!rOWR z!~xd#l1`mEL52G2zYuj0O6k)X^TYu271?XV9A)K6Uh-dSCf=zxqbrN${G@Bb0_X(4 zp)dGjxy)~i-0HAsr|iH{HunjuqV&mg?LS`+k!uUF?h!oz|A zKcYxXlQ?KK_Y1*FJ4+@Stb9M4?49=c;|WKuk9XR%r#p|a{rRib>!WfD#N|=P3%fD) zsfN7?iqwd()vE{YP9|~h@8q<+Tlem!0QG_mK(Ez3qp2`rT3@g#Y!Z#MXlb^5eO+h* zXlS91m_RkaE)Qrj3^ zf7I+3lZ_V6#xW@;PjH|&Zru3HOKaAbq-{(8jkr$8sU4OkXT~|uaP{-6D#I4%j}xMW zdvn?&9ESrT2IzgQt)nqP3`K4gtBB3_N7ddhGe_ zMMB8O?y4%}m7be?m3>g_HS4$eyRaNYc_atPw*C%0_<32MRiDP6gRdLewsILB`yV75X#;PvSugALuveXk;BpC)g~QrNl$|o|lH>-@ zo)xl2M{Ldb`0=*}Dp2mJ^XII|RLZR{pR8s-|GL~N0R~ZVZfo;sZ^^xC#;B>{XTl(r#}C=*w|PZ6rVX*?D@#^{(4(KR}wj~ z;st;mL-#^owZk(<&T1JSNShn|T+qhZMQ<^3VDaMqfRxfBxTMihP=7#Od7uO-x=F63 zYc-M=V5}zZ_6R4J-%dZg((4C7zd_jFJ%T?vM_#Yr4d2nVP z!Atv%Bt!F^Q1Um5IoL=n7_T%8IWffbxumnkymsZR+wmZp4>;&&!J^ipqJ{zNbYN`> zQrJa%ZH(yA03K>^vB@0xQY*10!kuP-)9a>?a7;$8?>j=qtwthy%z934J7)l9k|fyL zLyg|#L<9=kO>Ff(2ErT4G}A>XQpQ>I8`k8!T%G|>MCd>g(#Q_QOcGu_fRck%|D&l3 zy5A16i({uJ-@#&X{`X6uiPOhGbJi=m41$2ctV4$bZ@D$!W?d`${{3Fgl=hKvndpKz z_S6g0{8#LOr!3w3Wse>~78*41niXW+KQV zZd+`BO$50N&ZIo~?dYPnrDh3k)AB^h;nmiX^zHrXv{`z|qfhPFx3O&|@b(QlRNm=y zpALO90&QSE=!>1E1jJpWd9S$~Rhqr#ytrl0(}Kk=-el6lFxF?DN@1mau4mStJ=+V8 zNbF{7=4%KUHM1k-ZFeLE<(-+^v}#6ZL~KkYLdKuUuKz6y+0lV3hrI4%9hwg(4zYec zxt;Du-nghB=h`9oikwGo_kaEMS6NadWIvKa{=DK>@V{xu6TgzFxtSPf;5}=@CbC>R zPQLpCtcu-qzSdmT2s02Kqf>q|o;Ce(Ak(gqMH1GUp~n$~X5wui;xSu({a8=%p|Nor zDz%rcR2zqj+s?rmbiXPu5grXIhfvYw|LX2MpsGB#txYtho>UF71T_i@im_u93mQuR z3rb?c7O^9sqF_UfiLtjWV!_@KP_clBf=N`cAT|U=BvAyBVpNKv!vD-IM00NbbMC$4 z{$t$nbH_azguTE0eeb*8wdR_0t~J+J7z}xMDTCy8lXDu9t=tFobw5^%n^!tD=ZznJ z-;jZP;Erpvg3aubf2DgaXHx0y@KZ~1L>s%|P)WCXv7aqjcinsWUp*G@ezvEP@$6Uf z2fu1Lh3E@2^}h5@x{woT%)CJL%a6(E7uRSv2m*crG>@hsE2S`{jSYcQqa`S5l=AVY z0T1e78V7g&d<08GIXO&@-T18vb)y*G1g6B$#!hhN56JV?A{UK?piZJxV#OY!9!3#R-sz78;y84fLEIe3=)wb3Ktz7l23_PjVKsK%is+Q#oRFQTKCSF-}CbF zX7@M7vX9Gxcha9U5~QnXU)oq&eodZ!tzZ?PIP@NJm9WV(U$8~i?)h&2H?&%z8{Hca zr^6B|Vh=z4<lF|BM`b@J+|R{KVU&!f?8c(uzg}Oa2RZ`mcv4G&CYJWp{Ja zkQ?E3&phUrP&Qp5YpMiGcjv#?N9b2%1y2~9NVk)4YN-ChoMM=_hZ15DTN|b zA?cjR<D7ysx89TEuXMU3>7S`5X;n$C$)8XHt@?QYS`rF=m^&N-2jpOOKzp6A} zy*IPmw>Z^#6Hb!B9Ig6`=_{|k;gEoJ@7S8StU`ijucYx>G3$9m)sgeL1#8`x;@7%& zujd!FX}|vYHOu15o^{?75QsHX?selvEc?ggQ}dg&r1kaBxSr|WDzCVlm;JQKGM{yp zE6V>BsQZss&&g`oMrpY^Cw|mkGSme4ZZE&=a(h~?_<=^iY4}jkh^`<>Ym!e-P&7s8 zI8M-6-nB9!m}S4zcXo$0C3y1uiDiu`{I|hmFz!ldpsw|Zr?NU(JAFiVxz0WSCaOYpqMfzTjn?yE0vw;_dn!JLCch%rqL zRatzB{%QQi@KHuTHGm?`4ii(6K*}l_#SvyK&KP*LH}uszShGYgL_bB8CF|-naMrRp2 zPEiw6QU-F|X^snBw`IeZKsTf?*b6E`&F!FUh@JZhLwKm%-Jp%P%w-xwZ%IpN5ci2! z_Lye+^6X0r1%9(a*h2X)R=!GUB{Ll3iBvZUFr*eHzS1t!U=F~}KBx+@ciJsVXQM`q z&aUIKM?*>5-S5B-jghWQ(^UM3x5s!jCHz1p`! ztX|H|-RJyjFKi`(&cKEYFq0gJuJ}QEqn{-*#3+$N04x7sF)y1JbEpvA5JUpC1f-_TiPD^0Fw4AaBR8JDcJ12!H`S}l{pgkZ@;_Bl zf3>G@>7qq4Y!urJFr;-%Wj^$*qpuEX5OMfbr-1vVMRMb5RnMgq^dQlL<}7^;-eJvS z9&@d;p8e+cNR3A0*N}z4Q0Df34lcPEGyh#%*lZuFoTWY}V0R9bYbeKWaI1Jm}m;JmpCG!X5~${<1?8)~>iXBV!$t zUP1;&_Ew`*c&6(B|9K25PTr7W-;@`!Jo0j$>+$YWrcHA^;=6J=MPQZN52uApTXO(I z7W+$7e%n~7!>Z1dO!X2$? zY8MtRoi{Jm#-BkF4hEGwrCO=KfyQTy5r=cy{*bc`>8%w^E}Rwy`_Jdd6up zVx#hvnjd`qXTrQ`wM?t9MliQWn{kOcCvK9gwJ8mDkvfQBkp57X6%_bWK|UIslK+83 zB(QFzRu-O;C|Mo$22*n*GVq!FWZ?{s@uuMs&3_(2b3=eNEupycjr5G09M1okKaF1} zlO#l=%L)vPtYoT;+BEqb_19TqA?-!e9A{_el?>(p)EHL9=;j5?gWBkGawGNJX&pO! z{k0SEQJSgYnN4Z9$wU^2Q-piU_m%k2l?quI33+CMV;$am)4qK#XNaF%joM2XVff9d zj!-YvOVPMR$z{PF)C-PtRWbn_DM}e;ihDrt)gz&d_2V{KeDJ|iYv1hb?1O~ZxOFX^ z*{uTY!Oym}^(`7jtd>%7M)fav?{Qs{dJ1yV*Q}v?kT^;~g#(kpEtw4h<~qz}Fl0YT zCMf>*Pnj`o+BAyz^V6&CNJfxx)%KoJ%e0@&h8tg_^naY{Eqe(Y=%sso|8iUEXZ+qV zKU4a%#y>WFQ}fU3Fn(iux%o}>m;ICS?|mzV2dIU7jA&MCWDMMn^eMp{TPpi?7|?~#rH5W+V<*Y{lynb&wx7ZnHh68>h6U&&$ zPOVBPvO2;qFkvP{BP3OVoI^u_|I2gHO5@23GFdJCT;sZ@zt&txjvZ&r8hz+`dhT&u57G&5aytNAbD!J+3s3mdqL!z( zMv~^!dUDCr5I^(Lh-1>ttJn*G5K^w>h%T$o#C68Eojd#N*sFwLY9OgQjh)z&)yI9@F^zGk=k0zQ0q*w6~zX8$4m6S1a~M(-Mra0 zagt*%LT9i)bgv*Ff1AZ+AJwwei#WS%PU#W)S=RlleIxQucc;;&DVC24fqIq-Stb9u zC#;UutYst!Xi8P%zTj$|n!H$&H5bwgv^OBF8+)i2PXm8*qz@@8Lnmap)(am#!#Prj zvZ8p4)akBXTe`v~OL&;=Z5*$t4_(RKd(JWAr|%Tc%BgEF1w+DA=ZL_8GnTI0_$UC^ zksii5y#Yqjl#PUHpS z>+2V*m;E9zFvR&mq;iNnXZjZbjM?`hlzN#Vrt0DC?Jd$i;HC9Fa^M{_7yI))vB@Kj z5?aL<5*3xWmvZr09k%c?^ESAA+8Ae1>D~OSU&OW8UzqX8$2XX(7Y(`7CeauDuuSP# z2|E$`t~uN8Nm@k`3;9!rR}P}Db}uzLTJaoVM!hy|QU-iV9SDIW6V0kKP?vR)0`HCV ztFH&ZDUeTq1aw$GyI&khwu!BYq0=>fMCv55&EUKA95Q6c%^qSG>1$I*hMZK;-z?V( zjb{>AeH5H*Ipc&-<=9w&F}fB?)qznPIjb~AU0Tk*kjg_z{S+y?~zASxT9>B(LlpTD=|IiP7@-jiv_v`}gw)~^)AN8k0 zg%^vv?0f%nXK&dn{x>ec?{3F6kVPc5qoi6zP6I8j8Tk;ZfhIj}U)lYwBV}UpQd)PZ z+iRD-k^Z!sF`h+wqk&9+)u@E$Mf8(zmAb~T05#uBE(Ap2)0bC+I34UiC~EqXXMK(N zLfK2@ZuvOC@(~tuR;+MZE)qZ*mDx%tB`HvQfXeag<<;1t`Fyv%>=*T?-yS(|@>MKtlbv5|$2A;%-x}cQPYTN4F~Ql^g|xTdbdI{dO4ZN@MlAmJ zFTYfCCBFozmQK;Yfgx9cv#)L$=pk}^X}srrUMX)u8PRE21zZZvw&xT`J{kpOtX~60 z;`S!F9b3IDDKLJJu=>mAHz@@gCj^IMQ+2>P$`dM+Mr%N%7?rf|J4QEm*zixw^bdz& zTe{NdHMb``hV?Ho+A{Enaz|}|-EuD^{N^P|aOq0Q1KTFwv1`|Z{Wqj^S9SL1*I_S? zky(+y!_!+~&f2;y^B8OFf5JDS{qU|7}?E{lvq{AghHOaGFig0?4q7b2-3jY!%4 zQcJ^|*v(KdztKR7a0Ux$pU{TLr0_@pZ~z!@NbV`yZaP2828lk@J~ zQN|bdxeQ&7$&-~~f$397fJggzxN|BMEEEpu#3{Ap;sI$TAxyn92tg!a;x;iQSB0)k z^z(uM64tHcuY<*%gDND&r!O=j>dxrfuEvv^&PxI{=%^YrQD6obKsokgnR)jrqD4 zJ$ed%JJ~;#(6M^OFmp8whyzN$w$sqFH;~qDM|JE5^HIfvtgjGELu1=DAh93onXNy* z+7RQ5vvilgs6#FDpW3oARF>dRO}&ZP~~7R zJOi6ZWni>|6o@}GVHD&vt&i@ z%%pdUMamVp9YVqQ2;l?&AqWl9cXr=sKjryCDZ@;HuY5<14$BemWwy~N% zRBCC;=r@(w_7{0a1>c1au_l!4?r8bz{ZmQ2@cX?vz#kHzS^<GPR)Rcjo8cH+IV$d2Y4X1ah;x!mjbS=*dBC*oIX$c*Nxa#aEnr1fu7YQ7P*s z?hd8_8i);IKWt=Se6$tdR-RhU$;mDlo~+{Dtcp3HeVVqUY?Cs#u@967HT~DNn;9iU zP0axa#aEEh5BKzJXfIv~inocxJ+D+wsvr((ngxk)6vSkbV=ny?Y2X{APvL(Bp3|_d zj}-)3#H(_=SMLLN;dF0WB~{x_Kg_I?U;?&u4pkcu{ZZRrEpDpmdaEn4u@)TV;|}`t ziva=&gKw_AIPvKgip*Atp&%8T&YkNjKWx*t8yeJesNQC(W$oHuA$VxCih0FdHT+E{ zBLEWBr~0~*3)x@dwz=Qau1%}(0y8uDTKy17)2V0V10g4j{ln(t5O~hLNs}gi%a?x+ zBKw7xw|8$2JU9}&Sc*XyzM%Te4)_tK``!tI_4ga*3y~ahv z`SJlwTw12xGPxCU^Oc5&f0 zi^)kH!vC5SM?R}wzg@;EkKAPkeC`h-h2mbs?`X^W*bRD#Puew}^dB*ohhD`zV?k>M zS>q^jMHDo~5=Y^aejxRmy`Huxwmm7Tk-Wy*n$@g&!zEPA^kEf^E zn{vyN@E+(VV(SBba8~xKi0?Q5lms7{5^y@Qac>Xbu6H8hN|-D&2Gj}@>+f0T;5s`8 zBu)z=@eI0iEvFfeeb%LgFTq#K9l4SB+uC1(1RDZ2(k$rBM_6*_#fg^1tB}hBcnYa9{d+E8(-|ZU9DfPdS zWQ)~^1bDEaS{!Gu=+9N%@+-Ao?Nj=0!KkRW_Xn=&>tw^N) zsCMUA)+cR;K0vnj@3!VTOu{CVqAU83S;>VWju9)!pr~FqRQJv6xt_tfbefsuY z-RUU+39(f})cT#0GdGCwPFXn-*WfLF17=3nBJ(V5s(wYHr|B)pm?#)@s3PYXLlFxw zj^X@5iDW%CBIck;JAA|ldEpmDmppCvJhkNcVE^&hEw8uuSt;0I=h95XVNtaegBxU9 zRC;&G&rRQ*#?!1RhvZSjc~LeM&NvVPIoRc3t%=6u3cvn|wt&lvq%Ft?ikeCs)?F4+ zFYZzd4^{nJLA!4n>nW*_{4L`an7)*<_Dop&~nTC{>f@s6L2}gILM3pCq0o zglYM0vtRKIX0B4cv-{N4GV)oyNzm{Wyf!0g|DMRrmg~2IJbxPTNJ0L^*KwQo1)o~x zXwti~Vek#{!u7;pm)CFF)S1XLAnduC`nd@adjf^k7X|mSMJ3R@A^fwt?b@sg|c#>oGL_6~&SDCl8wRQ0eh-ydn z8|K@zX;W1Yq)NMKd-@#pPwx3m{6%6a^a^t@O!mY1dpT?Vyk?V14OsAYpJQ8e8Tm!P z_8Z?|kmViY)%uU)#^Ma;ya_v~U2ye#ega zE(x#OA8I*|gc^8qOxEFwoiaaDH%wisyZ6yda3IM%(HWH4KgIKv5A&X&(K)dxDJl1s zSVDZn>&%^wJ}4Pr9*Z z%k(8(DXf(HQ{YQ{<#V*GMaG-@ylGs1XdjJ}7@*{t-T~P)m@73IoE}KaRAg0JhWBXD zgY7QI(}}mqPjX$_FXxfwDN>t*8H|bw{@weNJ6;p(Gp60XW$uNS`)$*>2dS-1EIa;9 zKCRUGNvpwdgO!e{+JK=fmOq@;p@(u1lBeCdvzg<=aAVsU65 zO=|P<&OKcE)prfaWDfB2XHfl1#iouE#xinmSNckzA6AyWqSa)Mc`#+t+NWJQcXlw~ zTKTE{B_RW95l*E^7MH_-IqCiHf{|S&{oDh1AqtIV)&<|}Ey!P$7A|^I-kY<1*ZQr5 zQK=_6SVANyM|{)`35pR)*tc(AhjxQsUhe)bV9}NKb70?-Vt{Bi5rY@Xf1}$5i!ZJ; z-~2A>*wXpj_LGI+8*&RZKfNV~%1}Z-8OaDjmp7Is1p#3lI9WWs$FHfB-#?gzfnl-8{Dk)xC>z!`oDCYKjx(YTK2cHL4 zu<0|t;NIH6Imdpi72kOBi0>M{X5uiX^aPwz;kj*KqoH3`YCE)W%fh4-n-lj*t>z^i zn^-S+qwRxfxr5w(@0p}_VW*^&MYppb`gSaPKmEDstx{a2?3@3CIR20yz->p<=vIXW zlrHK!Qlc|EqR^t?udZq2fVy`Wz`1&L2)BB9Y22Dwxuy|d9^!F&m*}HaE&BcbU?uA>nl?t7d{`FO3;G0Ir1cYeGD;x_x(Bb zHB}i?^@U;NAf!8#T)iYwWq7 zOyT+PT!#Lh(A=3s%J0+fij$7_~4Cj5(CXTBmc+f8NT2Kl%MHmZTK9TS8xcP07|c4ZWK_08P=!7 z720W}s?VLnFCZU>s@|p4l-U0{kjir5_-^*4or-;Cdw0E9E@`!Z1W0`kem!J4eux2U zv%K!PjTsr@NeXzf^0h;8qf1wJ8488)b{nBksa7wKdXA2ck+-9E#Q*t&C5LGS%EyyN zmwb_-ui?kGckI0YvO~nutczGcYXBD{&7s$ANK^T{rn<3|%9SsVsg_}TN@*{VSmB5X z859-~3GUym{92{=TBla(QI?@49sd)~vI%dg4|Ic(GJ{2=rTrtlJ~+2XY3$uEV`i{M zWHl&ZE|8}b02?-JC>=R(ecgkGA;rK-R#qucZZSXz}6+TBhI^6q0*)0zt|Cs?YbQ-39}S^S7NXncla= zOV@gMG=S&zqf-u)rcRC$@$ceD8b#40Cq{tekb;36gfeibR!u`hyi!TltWXA!%%_Ku zoAu!}a6=p&)kz@Dt61p7N42pdP74y*=yU_6l-p>2-~$fR+^-;7!(9#MT9fCMI`@d3Vzve{gYS z#n!Tg5Qy%Q=4uQ`rzwa~$aTfT|Lke?w$qbtRoKt)Yf(T6_n(+3i4)s_>s zK{Uv_?zUGrW51gpLFKRk*Y9ospV_QtypeQA6M#G@(_@(;h$jWy5N;ea{z7NK~ej<3-NUIhp9w)Acbob10 z%Ly|t$#pAQH!#^HBi7>_)Ri-*Pg}+0n^<0-9Ay<%*5f|@2Go@+j2vu+xgl_X70HL> z$98tJBD%rXA#G(9#tkRj$ZLVFL~~Flx$$cv0|%0Iah2LBM|~a>_b1_dqJIHN?adDo zPh20wSGMQm@+Z-tbtdK*wgU;zj%BVNX|kZMw*$aSY12akkXRRu1ZaV6uR@(nt>PKl zG&Q~>LO0qC=`$oE@H3c>c%lR*EdcDSmi1mR-R9}73e8V6Rc6Qsuj2a_>j z!yGGNDI~zO#P7;mzRnKROkD(&htT8knhp{?1ATgBkGyX6IeI(|qhpas42*>Eqw9CR-r$LAuy7XKbetjvMd0SA_(zmOpLZn2QqDieZt9{ zFGBL&0k#;Yb#6EyuMtDU^Bi#0!JwF>rH;|ZzQgM~L-YAYhd3(Bv(zaTTQ9C2UKp*q z4uFO!S+~v18a_O)iet~)JGNQ4MK(w~v{(G!tjJDy*WMhuB>U7+I%N=SHr$>H|A>=f zaM=-NV)xO{-QPA@cAzv|)cU@Y!C2eH2ks4Ae<*6lz$aZ@hb0zVZ7D#8CKF8$i}Z zHLS%5#6`ecez&KN^Pzr~Dd{DMCDvycf}yg43M?b3kfwoYv?tKHf|BUeP(BUYz$`QA zS6roFur~C)jn4<|2RJNi&r(ra81({gEsOwH{T7cqHe<@g2jwhV>$d!PfWp&y-NoBM zmW5%yH9(=P?}X?2Il;gg;NyTB+T4??v;9mq?P^^4AK~AwN{qU8=+L3{4YJx7XF-`_ zEjDM`1l~kFRbxUAKZtjzj)#H*n7~-rSRyBciY5N0`Dn0KH3`|c2z8qoTcH`})wre= z`T~Fl@vToazZlsrhlpBD8UwlT^~=CX(uZp6BckQZ*-n`}8rM^y8izl5$7#`@N33PR zf91g0f6xWy?4ZfNSHO+6BbfEIsMt`jWTwqKN*ck^s|#yh_;(Qv3FSrrsS9V%i!-tB!2ay z7+9$}DP+1D=?nDd6+q*L(>8Wgv$bbok|@(6Wgep$cFZS`10bp9E+T-b7qDATY$5z=6DtCdy|S}M z4UvSW(xrX)JZZV@pi$xP*;<&`75uxri~Y!{)sfUy%8y4!tKVot`lZ{U!SM_{(~w@x z4D1vDSpkj$dGpyVH@Gb7Dd9STwTaDIEWI-xkW_Ftg!X}HNLR~0pTBe-QxUK~VQ0Eu zxm{?OtcU^1D9(D*;Iy#k$w_R|jP^XFtN5eG zelI)B7BGTv%3AWJ&P^$m#gjAY+uISoofJ_=oV zlTZD9&ZoJLSLz2V={AR62pKYHrsV}F~ogiemR z^Di=%Z%5rfY`wtN0=ttB`dtroE;s9!OFVznB7*^soeVhHGvd7>VRGm`-VCbjkC*EoaQ9A4zPY#&WHG0CJk#q-9`&Xm~aK zm9m(6C*$|>Pku@=i}=0qY{Me;Y3xExKl#LhxsarYE`FMT$E?<{w+_EJ30pd?GJo^U zH|0sg&0Pi8VfYsivZ^|%&uoF@C>{jtupLAaX~s!( zSWJDendy}5GI&%WqH?k|JXdybR>JtWaN~SlhiPnhEe+C(QIu!m-!RI@%xi*ud)J+~ z(e@KCz}C_9lEI1HHiVJ?Hx-1b;$0xq^TPiK%3qsZI&q z@9@;<1fUPV?T0f#*hr<i+R?NJ< zCAOA#7mvw{HksEJ5vGzGxt@5vojz<}&#BQoG2=?&mGk{maV41E&lOUXlrCJ&owJiE z2s(Y+{=|qKjrY4v%leF81Rpc#|1r0ge$xCd^jeeL{q68N zmTSBn?jm%L2xhqe?h_~XtzJmbue5`$KL$Dr5y$|X0>@@AFui5Xn#XU{p@mqbN)-%8 z(wl(u0=?`4T9@!cOl`SqKu$G{Tw&kB$4WSff;%ly4T-&%6uOm~$=bW_ifweZ?g7+Z zrhd!YVp{P64lRr>MhI4khbT)(aXQOg-ZK%YQ^Ut-T#kG>Q%h zkJc(Pz5CnZMv>c#O~uLUhVBe^<6f+fldS4zw(Dt^ zz2wFpmD}5Q76I3?;2&@N>Yk7?da%oMfX=C?AEd?*QPrn4x5ut$AE(fM-tO-1BhOA< z7Cm`$innT?YMw_olMu>~LVyZMQ63_cwaIA*ojb6{p#FqJmlV6uM~NT5^GETK>26a2 ze+x;yIo3o$wib;0HUhGoLVU0Wd^cQUL`J&!zV?)NGXzK5 zZK&bv{t+4$bf1|Nc~=;2mOBcokXg4j)g0Q?2#u_$$4mmx#&gM>;bqUY&e8B3GK2#a zJAeM$9Pi|P&Q$G(ljo%@uU5Ub<>}Jqn$H%lRKsYn==A70Lt?mI$gaGy-Nuj=MraN# zEtTfuezSXie`ZPT05d6oDtr{M2Idq=wT@m6_Dq&1HTc89J*RI@>CeebPk;Ms#w6o) ziz@01Zt9ywVWA9;HfdkKE*(1xHvnxoA9|mN0Qbi83rAFpq`bfqZm?ZauC67+E%W&* z;$DAk;4s_XnSIPkzFZpBt!mf)^@a_-4=H3{*`)ov6W{vagFXy&OUuac=@PT>=KwtkeutX_RBZot+OrCs)<2h7aEQq=CKE-swoh%3>(taRo6pF)!)Gb zf88&M!mB|`7Pf@!GxQ@rM+2e4eDrU}zt@m-xyW`$Bm~8EqtsHvL%<9)q4i;Atdg4z zgfBsJoONzw)Jl{AnPl9Hsc&t^UJn5b)SwdG32G95JyZ#|M|d--DHXrBcDVd*4)^_J z*=k++^W?1BrgJb#>1^1>QBp2o#n=JKM~{pc^IgNuvGwh%{5a+0q+!+e)K2zGcY8bR z^8;;sD)^dx()k~Af9aAvXyQj+NjsXwd^W%_EF#5cd%1`R;9OC?UKJ1qKdK z)DVLRAxsFJ_8{8BJ{fwcSsi*OHJ&tL#16LGcG^jz6UzjT-k>BhZRo6CJ1}chmbpw^T|_ozY<6k#ERolv;>003?}mvNk)z93A0Py6VPUzfoBllrTP}GR|&`ol?nH08Rv;q7iKLd zq%DaT$==ED!$|d4jq-t4r54M9zapR zl6=N~LiKLEiVpr@<%t+AOc_~^7jdXG)Q3N6dZJP|M zt<)y-qlkgsaIV(zRpw-AdQv29*P$C1TdPrRS?(R%9c}+ALp(60m_AhhE2;AJPB*e{ zPf}3x)5}_bzgW${uB)c~RD4Qa5V>+E1_Lo(m&PFW=AX^7Uj~^tEdFIlV7D?-olV?K ze04M})i5l-#_M$AR?*VwzV6G-tOIA@gZN1bRCYbPWE(9Sx*>;XTp@{{3pYw1>+cHX zpJ(0Lvd{INZKgBQU#0=rB+tNAp@`3$K#O-k;`=7s6BeJ|mXUtS*hSrZVOg3-wLP^e z>7H4p%u8|q>e-TY<33s0)}l$zbaseAlm~Pw$CIz@*>tMO3mP2^R4FTyiy}YIAJh5! zxNq0_7JnLTH^H@USm?f0PNNPl8T+e3q($0KZdQtpoSZJciNnVCNot&*a(4w<#}m0H zKZ;)w_IbLU$6@~oF_V70G0yDTj+%QdhWZRGoPEM;c<$s42j6S_=7e7l8DHqftXRdf zLR1}iOj_6@L5eAwUA=ybH-6ZByu|6zxX^|do-Ei3!SA_MAP;-au}YPC4(JkbyVdLl zdV@pXG-DFUh^Ozz-U{aa+$g$nzV)@ZNw)J+7S`EN_q%uZY`-zS!RIZEzfo`Pyp;Rr z`<}?X`e4ACrpABW%D?_>I>52z?N;@U3@Z{K^9>l*Vq zb*|qqofDtez5EQ1<2komm3#PR;>YjwVk<`EH(r^sy~m)$2IG%?(xP>ba!-D6d;750 zfG(C_pU7>&_Zq(Pz3nRoe%J6fkHg3U%H_e&r>n^gLAj+t{n5h6DYE3?TD#3TJlr#$fEk(pjhx`mW>kA3Tm zK*DQa3x2`rvlm-^iZdVhB|q@mm}O@FS#n_9#*+#bo$R;)YTr`z2s%;bm;MCfkr6#- z2C=x4kBYXw>2OVBBz(97Mb?)sTWU6$K@7ouV^hd!YlsGd3BY=Q!r@<(Fkmr_79SJ3 zQicXgY6fDZId2-RL_5oCAZZ3j%}!8??qZ~z?P9zM>$ZI8y!3@0^V3WXs3#E1rQlvl zWO%2IeFjbGL{?RlT2j0do|D%Tijq92nP+a^97Gg*=)U0-UFh8xr^>@qG{MJ(AEiUD zUJWxGI8%1YpIs)-AbYei(VmaE*cRb986q^@uKuCSgmq=mn+^)u3&7dKb!!(@IqXz^ zH?L=VGckXdQD?iOI#hJ=vq0gc-z3?_W|KZ;vY2Y18mH;iZ|T7hMx*^{wHDnqA6WGi z)Jjo~SfGSzK_}VE6H!(g%-=wo93!3k#U32ER2Aem1 z;@#DKoUpIK-pfyT#CQ)QaA4lg(6Q_dDH%I%Xd07(sA>yUsN_yg$^ZlEsPKLpB|eXo}XkkrPG#wELcQL$i$lGTW;OE z)2upm0QV;I=*jAPcoMsH|LxZF+{6?N4{tH^n=RiwDZDLWu#^K)k8iyzAX)0O2oLt4 zaBu#QkeF+|wBO$?TRxMnVkXww=|^~K z4h9-;+pT{-V$MO{gGX3@-tcm>Dh&1Eh%|9(MfkN`Vtm)~c9}vkmRbH#t9InH?Kh{E z{HhEMpWL2wn#!b0N<-tk2Cz#}${b|jshdjM!7D{K8V-Prz!3qk5)b7e?#QAz>K&tq zf={kYS75>ICaMUj_smKPIh{KwP;((ANg#LC1U8M3ghwb|EDH0^m*T8DUp5^I7;9R1 zvUX5t-j^s5L|lW89z>kR7^WA$B3=nS!Q?R;$*(oI4}rIVeDTbxhJvND=6pKn0=Ri_ z!Rgr83-rrG`%%|`d>RSrZ2rmHB`b;sxf&Y42$G;{q5#>ccuW+(1D-adLG?kKyk*2O z_0TmV2%!WolEF^Jn>7!k5XvYAb#D3H5HKHcxHxSL z+c?%VkH_FKBK8Aq)(7{Wrfp7BBCT<&Ah>c_(ZL5;UJ1KV&K1g(Zl*a6L297qc0{Y#^NUs`Sr74=#r=)!pP;xl_+&LP@&!yw!Jd*jmep4s9 z3O$TY&YU}UG{m+1eu+fvTcqBZl=a+^PSO|lVn|LTi|Np>nlX}ql)e{g8*01Y19Bt_ z<6j>xdA$Cy*~#*NRKs4+t!3ZYrN#)fK%MPRQ4KD9$m*?TQH7J)ZPEPsjaLnhntm;5 zN4IKQ&2K{swJ!PxH`DU;VJu*f<1}N6Y867KyWg;Xyz|cfQIYhDw&JQ3%0oWIm9IVv zsdzDWsz);aj6ce#yjC@vLaY>OU`HjmnWr)radwp_aD9pLwale-3ty>a;BU4m*b zPB)F4HoZK+W9lL*!&Z(P@y$({Y~g9TFgNYm%7(O~`=HU8d zIt#}W^ZQ-Dk5@|H%^fP-#!kfb832a$y{_>U>G_{xU9UOIrF;D2t+yIEG%3iu9CPnk zNn1}Lx;+gS6B83xGve`!XdsYK3SMq47EtENx6AE!&6%pbJf6jHirvqhri%Y+VG+J8 z)!uvKhn|K|*7GT3Ul$)!nPyCOe;$zO6BAt{%j6Hw6S*Zdy<>7}8V|7rwmi^IW}#0x zCdNn3OD$>tY{{)fNoL_FYn;X|!d8c!*ktB?W;)BZ+K`vxlZtqkDN<5VO7SPpP&FrZ zZNxbjd9VD}G}nHBN2AJe5LPslC=1%LMasEn&skX-2Lnq{ws1Fg3O+0>j9+#8P#vIa zgZ23z>`8GEsw70(w0I{mBzbc2Q&)^5dOxKHdE!=McdDvSB}M}sq-sxpxUTwOo!)@1 zA?KUoOs{0%nJ<}@ob(+HG%-9LHNJU0nq;ou85dBFRfDG5L!`YzCnvbTH+{{>JQCrx z(LO*ov{29BJjqd#apb*Wv_M9n*Aslf*=(AetNkU;41A&D`z6H<<6|nUzA^QAZwA$f z)h%QOFkkS3se3YJCrC>N0N2X$vl+ML*dM>VD;q0-knOTHV(B*6R{OPC*&jt#j9fM1 zL@pUuOO9*5H}u!-W)CP#9Nu8>trRtSUxL`a+k*j241U8Gc3z=Lf8r)@5<->NdYkR z2rDmo|L~GHWVa_JC4E-1>t^&!@zxWNHZF93+!bcdw+uhBpbjHF=R7)>^I3I=2$#JX ztfoxxW7H1n+liwmT(m$MU#K73St#}B!fRSDpt*G40$pW|26Fn#?T_r1cgXIZJ!q{S z$ksG!DW|F*>e+Z3&#Wq(S$)jUY)WdB(lEC-Nu0r>?eG1X0t^GFWU&e2KMr%nS zw2IHUe(p5LAYg9c*b8aw^^1XQ}^HUscZxv=I`qsbYQ)$wP+}Qd$_|pm&US2EokG)kygG>h) zEX?Cu+S2*E6j%2b2s`Ot`dht)-+1`34Yrez_1wi-KY`|%04TX>v()7ZCbMGq)Tn{v zidKJ2+I+Wh)x}fU*At&T9{*mAwgbRh5_vieX?#&EXkBtDH*dG0n;a?B3l@8V#i-E| zB3|&(`X8AXX!I8<_89P{SZw$>CJ)my{#V>yI-!m#g6fwctYCjnlWlmPk*EVjYTtA+G|Vl6;EVL*8`SrgiqK_laD8 zZX6{=dCSqdam!nrxbIJq;Rgw#E=#XtH5$y?(4^SA>4$12$P|}W_LP|PKn}3Qyv|jP zS}6vq_CfC~RKkh2gM7M^%2GP+B%iT2C<9QLE{K^Qk|9@Qt9A?Ka-XswR0(_4F>9UA zA?6q+RxO^qHRUeI=Mz(@_-Seho#XHN&CY-3&8Qx6F`zQjqUqcoL-wajj|zYJR`U}MEu&xW2E(Zj)Ee?$*K(bV#fBKMkX`m(lnm(iWFJt$7pMwoSJ zNs`(2Di0zpN|(#~E&6qw-vUCF9492y6$(sEwKfZd&K0PJ>zU9l*tOejc~YSX>`bR;dxQejkTxujU z*vTo;0f`!Jom)PFDoc{lnhxGt!WiWLr_s z3tRxHPYjqr2SVEh^-}z$ksPNe(9iaYnpraAIo%cw5 z>|2WI^~hMJ*m#Ni0O>jR)3i@;+nOu%py>Lxfmv-oT_ZHpdt+k8-PD5O2J;U zW_}pCwOOqh(ep`5)s6avYO*G&@ba-)rMlmJ7`O#+&&yx0DA$0>RswYLn6_=?2gFV7W z?nlD=S$r3|^W^2hSJn8v42?QZ&R@g>nSMi{k@=V8on)TrVWc~~NahaV$ED_p=Aps9 z*Qf%p`$snCYc5!!zCT>;R+Gfy`Vak1jP%)xm{AY2{EUp(g;LKn;^Rl;Z993n^_wj1-K|co)?lz zmz=h0qam{*+TwsglK~Og3JJ+n$X|+ERKOwRC@a|AaAzvrZERwB?ZsZ1ZO0kC1f`Oh zu>4|5l1i0s`4B6*l^!iM=^Pyhu_e5GAL5F5=nN&Xv15D8`92zPS)&1!>C90&I~v<4 zEovU-9+HByG$n?9#=IGg>r`We&ec{nbs+0U_nz3}=X!j@+O=zMx5=4seg6aa;#UDr z#a%&zB!G_(khrj6)Gk$7ECth?KEZv}TXO?Y)^t3wWPCLzl`H6V3v2b2c*co4#xH9( ziOqb|w{Rc^M#D$fs9YJj<(o!>NqXH1K{6fD-q4bUbW|z!2=QPSw^_EVS2-KMfzwJ_ z)?Kn;j?f9&1nXj1$6W&L4yG5TEEa0<1v-nX+&aU)T)$olkewT*I!HjtR@=%(jl~*B zJA=G0pQJ23X7d(5fSyJ(1xRW*kX*Cjv$OInZ6jyeJbOwOtxQ_=ZxQ~Zii%=m!|N1F z6Y3PCa*~aAZabOyIT@>vF71^ubh+5^C93w$$I5yaR9Dvf^XlYohs(f2{WWMvd!eQpE2Xexx54 zfJa|SCxp|wD&Qoc`#ycm#K#eUKpjk|P*OB4ZT)Z_d2v2wEMs8Ih<8nxRg+h^!<=IS zc&SZSUNlM0O93cW4SgU0b1sCM3SQ_>c7h5{pwU0RXiU^P`CrU>ycn z@e)o)$W8cDg}=!r^C5W1SQr?aPQye(c5HKzK7EPKy73Eur@PRL6+&FD-2Q==LFrjy2O)!dtr_iJVv08yDusJAg^i`h)nRA504Q^iGyr-A ztQirxgZvmv+`CXe8m|IcXUcbbc`VW!5Q;8`GpdHGYy+~(KWyQ= z7q1oZ%_a4q1WYk9muM^P7YzXuN!_8RQihL=`ZOdEqur! zT-DR}dUpqhCNSc!-ObJ(3)Xfzzpr@}H$2PSpOZ)Nx{Oah-76fa3xFABHr8iwA@TGZ zHgVjzMtf)?4q%Nh+*Lcil#EWceV@u0e%hQhmJ~LWs1a zQp(3dAi3F9DKKlPaiClKDdx;}^Zoq&>)1m_?e%>ez*4tIHuLLf8acJqq@ujhM&(S& zqm3o8SaWd1_46O!bvQ*`ocA6{ydmzinpu2Q#9orBlm|r{r{%UxL0M)*L7}$?xoIN3 z>!JHHKBADj^z4}Ektoe5c#v^kA6h?_;wnf8)2UGxx6F|iNa7EixlTVS0;R0Snhr>A z0W`wT#Pz!Q7YJ+0pe{Wx(eXKkP_>9`q8WgKhQ?~?fnem#EGe8h=a>Y`_9t?~e@J>> zhX`siYj&sX4L-*7x4h*T?A&L4jP-}<<8=bl6LRX1Nblva_eHLD4}fP|K;ac^Iu?qV z!ai#AFt)Z~TPZ3evUkD|d=l5&)*U=}uqYI3F=GRFSko}8A$opdYaSHGdgw02NHezr zsbh)BlDw1CjQY;WF0d`7?n5`%iykf^CvFlv5Ft_grwA;R*bWBlfQCM3*|50ysV9As z^uTz+ip2unHZ}S%GQ&)(W7d}Wus zvwiU};(HZTNxKwxE(Zh zBKtWxTSFpD`~COjZZp|KfImU3VU39uC6+DGIzEeMf7oSSisuKRk?vW>7JqCz*23JR zl(0zxS-wVuV!2%EcwT#y`WnQ^cPBNtHvAeezcC>NHkB*!B%N8hfM0KjIpCfBZ;_EHGe-VGc&=sj zwB2XHAz5oiZn#JytSOVKFzKm9QzCI<%lbr?LF*B2nz%KA9Cj2 zBUw1@9ikDdl=J5HVEJhTsn!~XRnfqkWg$mfw+B7tH&n*6oZ7@Xd636({CNVW)~oyZ)F zlO~zI*=S^-ix((lkW264r%4SV9Mi6nGd+!yvj!{AcaA<918i&XxapZ-I`@MbLM>(S z=L_Sw-#srEB{K;Rsrp7#+ZT?p%9v>Wo?dxhbis8uwa=eCGsCe2Z4+I>Uo zK(d1tF<~;K7&`QpS$qUOdnm7lS(SjCnA`J~alKkhyz2xG>4xsX#=XSSo=nxxTr*^7 ze_p0Y`lNE@QIm3$ADn9%F9$_(ycTaBhzQBNdT#UzV0JgIi^V2GQsX3S%63(@2VTzt z;J|t5NJw*`TZV1Kt>i1k6i&;`l@p9fA?5INGpn#!zDsx|Zkt(L^UQgW`Q}58o5(_S z&YaPZ*nbs5QVD|^iE{|rr0s@B+{Lx6r|j=^jiXnJC#6gnr<}edgKt?-sJLQ_?qY{)dfJ|t z5tks^3d+H(`x17@<6>fJ+RGC}2)tAdENtm4$bVM4Zls0RZ`ep!r|L0?J4K8h{r)20 z{9rkcVWmLJzEOBQ;5zX441z%Gy##<`%5DUPgP#W!vDW+G2(C105~#b^6CQNn$_x`@07UW8&AB zW!*<=7RZR4fZd468VOofuP~THBu3fN&L)a;4E@U;^z}+tZ|1uX#dw^ z^c=S*^tvbbqx!Js;`5(-bX0J-yfWwliiP+A_CaQ5b4SZb&#(=-JinWsRLswQLpYHE z4nt}k89b*siQF0{%UFBaQfmw5#L-1#*#r=!P$diJrYE;YjU$8@p;OkA?_A~)PlQpd zYML;3==v8hl%Q-#0VJgL-@-LHHcKmjH%>vpyVYEL27%dpP;rKWX1>05I&)v;A1U+S zWAL2QA3{ICrJz0hW$@J7dC0Nu@2NpFv-9}-J^Nv86Tfk+)Kw2aW*X55yV)1Y=vG*{ zp|tT&k%m{}?~7?5xrF)t`pYjQi-1wr!rp%WeH(`+Kh2p_#nshyG3^~2e-wIm)6+*} zV``$VX3IU|&vYiMaYZ1o2plgqY#=zw;%jZ(_mWgvo=(C)MH-?68^a=XV8=HIhrZOr zp$T2S;mJE_F3`@T@~whmY%!~&#gW5@E2Cjv3^Ea0aHDg_j+N=veK&E^q~`dpR-2Z8 zZ+L5BShtL)y?1yG&FVt>9pTCAkB1j^imB2Tc#z4ED&1 zNZ|D1gK@9aLnppjp?dV<&9azP5Mte4<0jkIFwPeQQj^DnT_7gqrd*fdPwF>%W7fhvvnv9*HjDEA~~DD*E3+gPlD%lbT8sz##$ zZP>03gJfCg)QoH7PhWnz zwY}rTDRC(O_tdpfJFOAxy!?9d<4d$_|4%PrPRW~| Yw>t$sYxv1@eOCKU-8=5-Fl6@s0h 0: + ax.annotate(f'{height:.3f}', + xy=(bar.get_x() + bar.get_width() / 2, height), + xytext=(0, 3), textcoords="offset points", + ha='center', va='bottom', fontsize=8) + + plt.tight_layout() + plt.savefig(filename, dpi=150) + plt.show() + +def save_report_md(results, filename="docs/report.md"): + ensure_directories() + + results_dict = {} + for res in results: + key = (res['structure'], res['mode']) + results_dict[key] = res + + def get_val(struct, mode, field): + key = (struct, mode) + if key in results_dict: + return results_dict[key][field] + return 0.0 + + ll_random_insert = get_val('linkedlist', 'случайный', 'insert_mean') + ll_random_find = get_val('linkedlist', 'случайный', 'find_mean') + ll_random_delete = get_val('linkedlist', 'случайный', 'delete_mean') + ll_sorted_insert = get_val('linkedlist', 'отсортированный', 'insert_mean') + ll_sorted_find = get_val('linkedlist', 'отсортированный', 'find_mean') + ll_sorted_delete = get_val('linkedlist', 'отсортированный', 'delete_mean') + + ht_random_insert = get_val('hashtable', 'случайный', 'insert_mean') + ht_random_find = get_val('hashtable', 'случайный', 'find_mean') + ht_random_delete = get_val('hashtable', 'случайный', 'delete_mean') + ht_sorted_insert = get_val('hashtable', 'отсортированный', 'insert_mean') + ht_sorted_find = get_val('hashtable', 'отсортированный', 'find_mean') + ht_sorted_delete = get_val('hashtable', 'отсортированный', 'delete_mean') + + bst_random_insert = get_val('bst', 'случайный', 'insert_mean') + bst_random_find = get_val('bst', 'случайный', 'find_mean') + bst_random_delete = get_val('bst', 'случайный', 'delete_mean') + bst_sorted_insert = get_val('bst', 'отсортированный', 'insert_mean') + bst_sorted_find = get_val('bst', 'отсортированный', 'find_mean') + bst_sorted_delete = get_val('bst', 'отсортированный', 'delete_mean') + + from datetime import datetime + + report_content = f"""# Отчёт по лабораторной работе + +## Цель работы + +Реализовать три структуры данных «с нуля» (связный список, хеш-таблица, двоичное дерево поиска), применить их для хранения записей телефонного справочника и экспериментально сравнить производительность основных операций. + +## Параметры эксперимента + +- Количество записей: 10000 +- Количество повторов каждого теста: 5 +- Размер хеш-таблицы: 1000 корзин + +## Результаты экспериментов + +### 1. Связный список + +| Режим | Вставка (сек) | Поиск (сек) | Удаление (сек) | +|-------|---------------|-------------|----------------| +| Случайный | {ll_random_insert:.4f} | {ll_random_find:.4f} | {ll_random_delete:.4f} | +| Отсортированный | {ll_sorted_insert:.4f} | {ll_sorted_find:.4f} | {ll_sorted_delete:.4f} | + +### 2. Хеш-таблица + +| Режим | Вставка (сек) | Поиск (сек) | Удаление (сек) | +|-------|---------------|-------------|----------------| +| Случайный | {ht_random_insert:.4f} | {ht_random_find:.4f} | {ht_random_delete:.4f} | +| Отсортированный | {ht_sorted_insert:.4f} | {ht_sorted_find:.4f} | {ht_sorted_delete:.4f} | + +### 3. Двоичное дерево поиска (BST) + +| Режим | Вставка (сек) | Поиск (сек) | Удаление (сек) | +|-------|---------------|-------------|----------------| +| Случайный | {bst_random_insert:.4f} | {bst_random_find:.4f} | {bst_random_delete:.4f} | +| Отсортированный | {bst_sorted_insert:.4f} | {bst_sorted_find:.4f} | {bst_sorted_delete:.4f} | + +## Анализ результатов + +### 1. Влияние порядка данных на BST + +На отсортированных данных BST деградирует с O(log n) до O(n). +Время вставки увеличилось с {bst_random_insert:.4f} до {bst_sorted_insert:.4f} секунд — в {bst_sorted_insert/bst_random_insert:.1f} раз. + +### 2. Почему хеш-таблица не чувствительна к порядку + +Хеш-функция распределяет элементы случайно, порядок ввода не влияет на позицию элемента. + +Разница между случайным и отсортированным порядком: +- Вставка: {ht_random_insert:.4f} vs {ht_sorted_insert:.4f} +- Отношение: {ht_sorted_insert/ht_random_insert:.2f}x (почти не чувствительна) + +### 3. Почему связный список медленный при поиске + +Поиск требует последовательного прохода O(n) без возможности индексации. +Поэтому связный список хорош только когда записей мало. +Для больших телефонных справочников он не подходит. + +Сравнение скорости поиска (случайные данные): +- LinkedList: {ll_random_find:.4f} сек +- HashTable: {ht_random_find:.4f} сек (в {ll_random_find/ht_random_find:.1f} раз быстрее) +- BST: {bst_random_find:.4f} сек + +### 4. Сравнение удаления + +| Структура | Сложность | Время на 50 удалений (случайные данные) | +|-----------|-----------|------------------------------------------| +| Связный список | O(n) | {ll_random_delete:.4f} сек | +| Хеш-таблица | O(1) в среднем | {ht_random_delete:.4f} сек | +| BST | O(log n) в среднем | {bst_random_delete:.4f} сек | + +## Вывод: + +| Задача | Рекомендация | Почему | +|--------|-------------|--------| +| Частый поиск | Хеш-таблица | O(1) в среднем, не зависит от порядка | +| Частые вставки/удаления | Хеш-таблица | Амортизированное O(1) | +| Нужен отсортированный вывод | Сбалансированное дерево (AVL/Red-Black) | In-order обход даёт сортировку | +| Мало данных (<100 элементов) | Связный список или массив | Простота, накладные расходы не оправданы | +| Последовательный доступ (очередь/стек) | Связный список | Вставка/удаление в начало/конец за O(1) | + +## Заключение + +Эксперимент наглядно демонстрирует: +1. **BST без балансировки опасен** — на отсортированных данных он деградирует до O(n) +2. **Хеш-таблица стабильна** — её производительность не зависит от порядка входных данных +3. **Связный список** подходит только для специфических задач с малым объёмом данных + +## Дата выполнения + +{datetime.now().strftime('%Y-%m-%d %H:%M:%S')} +""" + + with open(filename, 'w', encoding='utf-8') as f: + f.write(report_content) + + +def print_analysis(results): + print("\n" + "="*60) + print("Анализ резов") + print("="*60) + + best_insert = min(results, key=lambda x: x['insert_mean']) + best_find = min(results, key=lambda x: x['find_mean']) + best_delete = min(results, key=lambda x: x['delete_mean']) + + print(f"\n Лучшая для вставки: {best_insert['structure']} ({best_insert['mode']}) - {best_insert['insert_mean']:.4f} сек") + print(f" Лучшая для поиска: {best_find['structure']} ({best_find['mode']}) - {best_find['find_mean']:.4f} сек") + print(f" Лучшая для удаления: {best_delete['structure']} ({best_delete['mode']}) - {best_delete['delete_mean']:.4f} сек") + + bst_random = None + bst_sorted = None + for res in results: + if res['structure'] == 'bst' and res['mode'] == 'случайный': + bst_random = res + elif res['structure'] == 'bst' and res['mode'] == 'отсортированный': + bst_sorted = res + + if bst_random and bst_sorted: + print("\n Влияние порядка данных на BST:") + print(f" Вставка: случайный {bst_random['insert_mean']:.4f} сек vs отсортированный {bst_sorted['insert_mean']:.4f} сек") + print(f" Деградация в {bst_sorted['insert_mean']/bst_random['insert_mean']:.1f}x") + + ht_random = None + ht_sorted = None + for res in results: + if res['structure'] == 'hashtable' and res['mode'] == 'случайный': + ht_random = res + elif res['structure'] == 'hashtable' and res['mode'] == 'отсортированный': + ht_sorted = res + + if ht_random and ht_sorted: + print("\n Чувствительность хеш-таблицы к порядку:") + print(f" Вставка: случайный {ht_random['insert_mean']:.4f} сек vs отсортированный {ht_sorted['insert_mean']:.4f} сек") + print(f" Отношение: {ht_sorted['insert_mean']/ht_random['insert_mean']:.2f}x (почти не чувствительна)") + + ll_random = None + for res in results: + if res['structure'] == 'linkedlist' and res['mode'] == 'случайный': + ll_random = res + elif res['structure'] == 'hashtable' and res['mode'] == 'случайный': + ht_random = res + + if ll_random and ht_random: + print("\n Сравнение скорости поиска:") + print(f" LinkedList: {ll_random['find_mean']:.4f} сек") + print(f" HashTable: {ht_random['find_mean']:.4f} сек") + print(f" HashTable быстрее в {ll_random['find_mean']/ht_random['find_mean']:.1f} раз") \ No newline at end of file