From 2f4ee082b382936ccace16d1c9ba47db8d88a0ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kowalczyk?= Date: Thu, 16 Apr 2026 21:18:19 +0200 Subject: [PATCH 1/3] refactored gaussian elimination functions, added rank and det linalg functions --- matrix_calculus/linalg/__init__.py | 6 ++ matrix_calculus/linalg/matrix_properties.py | 32 ++++++++ matrix_calculus/matrix_processor.py | 91 ++++++++++++++++++--- tests/gaussian_elimination_test.py | 48 ++++++++--- tests/linalg_matrix_properties_test.py | 54 ++++++++++++ 5 files changed, 209 insertions(+), 22 deletions(-) create mode 100644 matrix_calculus/linalg/__init__.py create mode 100644 matrix_calculus/linalg/matrix_properties.py create mode 100644 tests/linalg_matrix_properties_test.py diff --git a/matrix_calculus/linalg/__init__.py b/matrix_calculus/linalg/__init__.py new file mode 100644 index 0000000..e24b365 --- /dev/null +++ b/matrix_calculus/linalg/__init__.py @@ -0,0 +1,6 @@ +from __future__ import annotations + +from .matrix_properties import det +from .matrix_properties import rank + +__all__ = ["det", "rank"] diff --git a/matrix_calculus/linalg/matrix_properties.py b/matrix_calculus/linalg/matrix_properties.py new file mode 100644 index 0000000..3056a74 --- /dev/null +++ b/matrix_calculus/linalg/matrix_properties.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +from ..matrix_processor import MatrixProcessor + + +def det(matrix: list[list[float]]) -> float: + """Calculate the determinant of a square matrix.""" + processed_matrix, stats = MatrixProcessor.gaussian_elimination( + matrix, + stats=True, + normalize_diagonal=False, + ) + + if not stats["reversible"]: + return 0.0 + + determinant = (-1) ** stats["rows_swaps"] + for i in range(len(processed_matrix)): + determinant *= processed_matrix[i][i] + + return determinant + + +def rank(matrix: list[list[float]]) -> float: + """Calculate the rank of a matrix.""" + _, stats = MatrixProcessor.gaussian_elimination( + matrix, + stats=True, + normalize_diagonal=False, + ) + + return stats["rank"] diff --git a/matrix_calculus/matrix_processor.py b/matrix_calculus/matrix_processor.py index b3f9652..17ddabe 100644 --- a/matrix_calculus/matrix_processor.py +++ b/matrix_calculus/matrix_processor.py @@ -1,12 +1,61 @@ from __future__ import annotations +from typing import Any +from typing import Literal +from typing import overload + class MatrixProcessor: + @overload + @staticmethod + def gaussian_elimination( + matrix: list[list[float]], + pivoting: bool = ..., + stats: Literal[True] = ..., + normalize_diagonal: bool = ..., + ) -> tuple[list[list[float]], dict[str, Any]]: + pass + + @overload @staticmethod - def gaussian_elimination(matrix: list[list[float]]) -> list[list[float]]: + def gaussian_elimination( + matrix: list[list[float]], + pivoting: bool = ..., + stats: Literal[False] = ..., + normalize_diagonal: bool = ..., + ) -> list[list[float]]: + pass + + @staticmethod + def gaussian_elimination( + matrix: list[list[float]], + pivoting: bool = True, + stats: bool = False, + normalize_diagonal: bool = True, + ) -> list[list[float]] | tuple[list[list[float]], dict]: + if pivoting: + result = MatrixProcessor.gaussian_elimination_with_pivoting( + matrix, + normalize_diagonal, + ) + else: + result = MatrixProcessor.gaussian_elimination_without_pivoting( + matrix, + normalize_diagonal, + ) + + return result[0] if not stats else result + + @staticmethod + def gaussian_elimination_without_pivoting( + matrix: list[list[float]], + normalize_diagonal: bool = True, + ) -> tuple[list[list[float]], dict]: M = [row[:] for row in matrix] n = len(M) eps = 1e-12 + rows_swaps = 0 + rank = n def swap_rows(row1, row2): for col in range(n): @@ -22,25 +71,37 @@ def swap_rows(row1, row2): diagonal_element_value = M[row][diagonal_element] swap_rows(diagonal_element, row) + rows_swaps += 1 if abs(diagonal_element_value) < eps: - raise ValueError("Matrix is singular") + rank -= 1 + continue - for col in range(diagonal_element, n): - M[diagonal_element][col] /= diagonal_element_value + if normalize_diagonal: + for col in range(diagonal_element, n): + M[diagonal_element][col] /= diagonal_element_value for row in range(diagonal_element + 1, n): - factor = M[row][diagonal_element] + factor = ( + M[row][diagonal_element] + if normalize_diagonal + else M[row][diagonal_element] / diagonal_element_value + ) for col in range(diagonal_element, n): M[row][col] -= factor * M[diagonal_element][col] - return M + return M, {"rows_swaps": rows_swaps, "rank": rank, "reversible": rank == n} @staticmethod - def gaussian_elimination_pivoting(matrix: list[list[float]]) -> list[list[float]]: + def gaussian_elimination_with_pivoting( + matrix: list[list[float]], + normalize_diagonal: bool = True, + ) -> tuple[list[list[float]], dict]: M = [row[:] for row in matrix] n = len(M) eps = 1e-12 + rows_swaps = 0 + rank = n def swap_rows(row1, row2): for col in range(n): @@ -57,14 +118,24 @@ def swap_rows(row1, row2): if highest_pivot_row != diagonal_element: swap_rows(diagonal_element, highest_pivot_row) + rows_swaps += 1 pivot_value = M[diagonal_element][diagonal_element] if abs(pivot_value) < eps: - raise ValueError("Matrix is singular") + rank -= 1 + continue + + if normalize_diagonal: + for col in range(diagonal_element, n): + M[diagonal_element][col] /= pivot_value for row in range(diagonal_element + 1, n): - factor = M[row][diagonal_element] / pivot_value + factor = ( + M[row][diagonal_element] + if normalize_diagonal + else M[row][diagonal_element] / pivot_value + ) for col in range(diagonal_element, n): M[row][col] -= factor * M[diagonal_element][col] - return M + return M, {"rows_swaps": rows_swaps, "rank": rank, "reversible": rank == n} diff --git a/tests/gaussian_elimination_test.py b/tests/gaussian_elimination_test.py index c78e090..99dce8e 100644 --- a/tests/gaussian_elimination_test.py +++ b/tests/gaussian_elimination_test.py @@ -6,44 +6,68 @@ def test_gaussian_elimination(): + print("\nTesting Gaussian elimination without pivoting...") + # Test 1x1 matrix matrix = [[2]] - res = MatrixProcessor.gaussian_elimination(matrix) + res = MatrixProcessor.gaussian_elimination(matrix, pivoting=False) assert res == [[1.0]] # Test 2x2 matrix matrix = [[2, 4], [1, 3]] - res = MatrixProcessor.gaussian_elimination(matrix) + res = MatrixProcessor.gaussian_elimination(matrix, pivoting=False) assert res == [[1.0, 2.0], [0.0, 1.0]] # Test 3x3 singular matrix - with pytest.raises(ValueError): - matrix = [[2, 4, 6], [1, 3, 5], [0, 2, 4]] - MatrixProcessor.gaussian_elimination(matrix) + matrix = [[2, 4, 6], [1, 3, 5], [0, 2, 4]] + res, stats = MatrixProcessor.gaussian_elimination( + matrix, + pivoting=False, + stats=True, + ) + print(res) + print(stats) # Test 3x3 matrix matrix = [[2, 4, 6], [1, 2, 5], [0, 2, 4]] - res = MatrixProcessor.gaussian_elimination(matrix) + res = MatrixProcessor.gaussian_elimination(matrix, pivoting=False) assert res == [[1.0, 2.0, 3.0], [0.0, 1.0, 2.0], [0.0, 0.0, 1.0]] def test_gaussian_elimination_pivoting(): + print("\nTesting Gaussian elimination with pivoting...") + # Test 1x1 matrix matrix = [[2]] - res = MatrixProcessor.gaussian_elimination_pivoting(matrix) + res = MatrixProcessor.gaussian_elimination(matrix, normalize_diagonal=False) assert res == [[2.0]] # Test 2x2 matrix matrix = [[2, 4], [1, 3]] - res = MatrixProcessor.gaussian_elimination_pivoting(matrix) + res = MatrixProcessor.gaussian_elimination(matrix, normalize_diagonal=False) assert res == [[2.0, 4.0], [0.0, 1.0]] + # Test 2x2 singular matrix + matrix = [[2, 4], [4, 8]] + res, stats = MatrixProcessor.gaussian_elimination( + matrix, + normalize_diagonal=False, + stats=True, + ) + print(res) + print(stats) + # Test 3x3 singular matrix - with pytest.raises(ValueError): - matrix = [[2, 4, 6], [1, 3, 5], [0, 2, 4]] - MatrixProcessor.gaussian_elimination_pivoting(matrix) + matrix = [[2, 4, 6], [1, 3, 5], [0, 2, 4]] + res, stats = MatrixProcessor.gaussian_elimination( + matrix, + stats=True, + normalize_diagonal=False, + ) + print(res) + print(stats) # Test 3x3 matrix matrix = [[2, 4, 6], [1, 2, 5], [0, 2, 4]] - res = MatrixProcessor.gaussian_elimination_pivoting(matrix) + res = MatrixProcessor.gaussian_elimination(matrix, normalize_diagonal=False) assert res == [[2, 4, 6], [0, 2, 4], [0, 0, 2]] diff --git a/tests/linalg_matrix_properties_test.py b/tests/linalg_matrix_properties_test.py new file mode 100644 index 0000000..3defc6c --- /dev/null +++ b/tests/linalg_matrix_properties_test.py @@ -0,0 +1,54 @@ +from __future__ import annotations + +import numpy as np +import pytest # noqa: F401 + +import matrix_calculus.linalg as linalg + + +def test_determinant(): + # Test 1x1 matrix + matrix = [[5]] + assert linalg.det(matrix) == 5.0 + + # Test 2x2 matrix + matrix = [[1, 2], [3, 4]] + assert linalg.det(matrix) == -2.0 + + # Test 3x3 matrix + matrix = [[6, 1, 1], [4, -2, 5], [2, 8, 7]] + assert linalg.det(matrix) == np.linalg.det(matrix) + + # Test 2x2 singular matrix + matrix = [[2, 4], [1, 2]] + assert linalg.det(matrix) == 0.0 + + # Test 3x3 singular matrix + matrix = [[2, 4, 6], [1, 2, 3], [1, 7, 5]] + assert linalg.det(matrix) == 0.0 + + +def test_rank(): + # Test 1x1 matrix + matrix = [[5]] + assert linalg.rank(matrix) == 1 + + # Test 2x2 full rank matrix + matrix = [[1, 2], [3, 4]] + assert linalg.rank(matrix) == 2 + + # Test 3x3 full rank matrix + matrix = [[6, 1, 1], [4, -2, 5], [2, 8, 7]] + assert linalg.rank(matrix) == np.linalg.matrix_rank(matrix) + + # Test 2x2 singular matrix + matrix = [[2, 4], [1, 2]] + assert linalg.rank(matrix) == 1 + + # Test 3x3 singular matrix + matrix = [[2, 4, 6], [1, 2, 3], [1, 7, 5]] + assert linalg.rank(matrix) == 2 + + # Test 3x3 singular matrix + matrix = [[2, 4, 6], [1, 2, 3], [4, 8, 12]] + assert linalg.rank(matrix) == 1 From 7df6111356aa72cfd1bb4e9b553ca128f9a9cbaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kowalczyk?= Date: Thu, 16 Apr 2026 22:24:22 +0200 Subject: [PATCH 2/3] added benchmark script for gaussian elimination and lu decomposition --- ...mination_and_lu_decomposition_benchmark.py | 184 ++++++++++++++++++ 1 file changed, 184 insertions(+) create mode 100644 benchmarks/gaussian_elimination_and_lu_decomposition_benchmark.py diff --git a/benchmarks/gaussian_elimination_and_lu_decomposition_benchmark.py b/benchmarks/gaussian_elimination_and_lu_decomposition_benchmark.py new file mode 100644 index 0000000..c5ad086 --- /dev/null +++ b/benchmarks/gaussian_elimination_and_lu_decomposition_benchmark.py @@ -0,0 +1,184 @@ +from __future__ import annotations + +import argparse +import os +import random +import time +from collections.abc import Callable + +import matplotlib.pyplot as plt + +from matrix_calculus.lu_decomposition import LUDecomposition +from matrix_calculus.matrix_processor import MatrixProcessor + + +def generate_matrix(n: int, seed: int = 0) -> list[list[float]]: + random.seed(seed) + + A = [[random.uniform(-1, 1) for _ in range(n)] for _ in range(n)] + + for i in range(n): + A[i][i] += n # stabilność + + return A + + +def measure_time(func: Callable, *args) -> float: + start = time.perf_counter() + func(*args) + end = time.perf_counter() + return end - start + + +def benchmark_gaussian_elimination(out_dir: str, n_max: int): + sizes = list(range(10, n_max + 1, 10)) + + times_no_pivot = [] + times_pivot = [] + + for n in sizes: + M = generate_matrix(n, seed=42) + + t1 = measure_time(MatrixProcessor.gaussian_elimination, M, False) + t2 = measure_time(MatrixProcessor.gaussian_elimination, M, True) + + times_no_pivot.append(t1) + times_pivot.append(t2) + + print(f"[Gauss] n={n} done") + + path = os.path.join(out_dir, "gauss_benchmark.png") + + plt.figure() + plt.plot(sizes, times_no_pivot, label="bez pivotingu") + plt.plot(sizes, times_pivot, label="z pivotingiem") + plt.xlabel("Rozmiar macierzy (n)") + plt.ylabel("Czas [s]") + plt.title("Eliminacja Gaussa – porównanie") + plt.legend() + plt.grid() + plt.savefig(path) + + print(f"[SAVE] {path}") + + +def benchmark_lu_decomposition(out_dir: str, n_max: int): + sizes = list(range(10, n_max + 1, 10)) + + times_no_pivot = [] + times_pivot = [] + + for n in sizes: + M = generate_matrix(n, seed=123) + + t1 = measure_time(LUDecomposition.decompose, M, False) + t2 = measure_time(LUDecomposition.decompose, M, True) + + times_no_pivot.append(t1) + times_pivot.append(t2) + + print(f"[LU] n={n} done") + + path = os.path.join(out_dir, "lu_benchmark.png") + + plt.figure() + plt.plot(sizes, times_no_pivot, label="bez pivotingu") + plt.plot(sizes, times_pivot, label="z pivotingiem") + plt.xlabel("Rozmiar macierzy (n)") + plt.ylabel("Czas [s]") + plt.title("LU faktoryzacja – porównanie") + plt.legend() + plt.grid() + plt.savefig(path) + + print(f"[SAVE] {path}") + + +def print_example_results(): + M = [ + [2.0, 1.0, 1.0], + [4.0, -6.0, 0.0], + [-2.0, 7.0, 2.0], + ] + + print("\n====================") + print("MACIERZ WEJŚCIOWA") + print("====================") + for row in M: + print(row) + + print("\n====================") + print("GAUSS BEZ PIVOTINGU") + print("====================") + result = MatrixProcessor.gaussian_elimination(M, pivoting=False) + for row in result: + print(row) + + print("\n====================") + print("GAUSS Z PIVOTINGIEM (bez normalizacji przekątnej)") + print("====================") + result = MatrixProcessor.gaussian_elimination( + M, + pivoting=True, + normalize_diagonal=False, + ) + for row in result: + print(row) + + print("\n====================") + print("LU BEZ PIVOTINGU") + print("====================") + L, U = LUDecomposition.decompose(M, pivoting=False) + print("L:") + for row in L: + print(row) + print("U:") + for row in U: + print(row) + + print("\n====================") + print("LU Z PIVOTINGIEM") + print("====================") + P, L, U = LUDecomposition.decompose(M, pivoting=True) + print("P:") + for row in P: + print(row) + print("L:") + for row in L: + print(row) + print("U:") + for row in U: + print(row) + + +def benchmark_gaussian_elimination_and_lu_decomposition(out_dir: str, n_max: int): + os.makedirs(out_dir, exist_ok=True) + + benchmark_gaussian_elimination(out_dir, n_max) + benchmark_lu_decomposition(out_dir, n_max) + print_example_results() + + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + parser.add_argument( + "--output", + type=str, + default="results", + help="folder na wykresy", + ) + + parser.add_argument( + "--n", + type=int, + default=150, + help="maksymalny rozmiar macierzy", + ) + + args = parser.parse_args() + + benchmark_gaussian_elimination_and_lu_decomposition( + out_dir=args.output, + n_max=args.n, + ) From d81967dc28e62e5fcc1c41e559235f33fafcd945 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Kowalczyk?= Date: Thu, 16 Apr 2026 22:43:25 +0200 Subject: [PATCH 3/3] generated benchmarks for gaussian elimination and LU factorization, finished and generated report --- reports/imgs/gauss_benchmark.png | Bin 0 -> 34067 bytes reports/imgs/lu_benchmark.png | Bin 0 -> 33552 bytes ...elimination_and_lu_decomposition_report.md | 220 ++++++++++ .../code.txt | 380 ++++++++++++++++++ .../report.pdf | Bin 0 -> 94529 bytes 5 files changed, 600 insertions(+) create mode 100644 reports/imgs/gauss_benchmark.png create mode 100644 reports/imgs/lu_benchmark.png create mode 100644 reports/matrix_gaussian_elimination_and_lu_decomposition_report.md create mode 100644 reports/resources/gaussian_elimination_and_lu_decomposition/code.txt create mode 100644 reports/resources/gaussian_elimination_and_lu_decomposition/report.pdf diff --git a/reports/imgs/gauss_benchmark.png b/reports/imgs/gauss_benchmark.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f0e9c46f9d967eb84b92f3fac6687f4b95d16c GIT binary patch literal 34067 zcmdqJcTiQ|)+KrX0VRs$s3JjvWXVZI0YN}ea*itbkTZ%R5=C-WiAn~^Q31(WCFdlP zL2`O?4|b65`R|p-?D7c{v$X6bjQ9 zg~FITj{|?X**iK5|0n8rSJP3=*4)v>2yKRXVB~0LW$S45)cA_C8QS5gtqngHFAtY6 z=anapj&=^B+}zgx^BY{YXbbMII!;}1l?!%qS`H`_u@Uk=j4Y|lrzq4*A9`Ep2Vznwv9KzE^4c8@&w=f1a6X@uBm8PTcivON(46oya%qvax%wiRjmNcNYc= zO*plRUWU*LZML$e*mXSo4(DnXzJRIVbNsDh@mlqI;IzYy>HFe|^uBWT{lyl_ z+9l7N?&cS2a=toYo}QX|{`&Qn&)o+wNfaNnw6sQ@N30v0nl?sk>w5F_s&v~~AH+8n znYB9x$3>*4rKx;=#MZnO5OALLp4uMXAzb;{7ktgMi?c2Sh9%E_md{1&1Ox_tgz4Hl zIOr?4H~IMSqwlicBCU{3a99}e4V_Zcky7i5?;UGY(h;qVzk5@)s$F?QXl{NR8A?9)9)p7Rc|gv?l_)5i98y665T0Ts`c2@^8XOP5@aHkv=F=hBRik3Y)Ojr(xt zHF~~-`pT(Ey7TI2>-to~r-!LHl9G}y{r%BvHM{7Y<)QXkjUb8}#shhJ;-^PjZh>`l zV^uDh7Tw9A3kzLICZpx{0yd*mK0ZE}SXhfg#jIk^%PrfLLG(e?J3Le?v(Za-o2PEx?C4NrQA(6+ zkG{dCS1FKwKkDP1*F-tmC4Y+68h*C5noWIsCBD_c4_8!$IX(Eh*idNFy!qGQ%M%iq zrN)7Q7>JYA+Cv+qMB(u4Zg{Yb-Cb4|7JvO3can=2>)&3z)Jo2+Tjf za@&Kc`S%vOQep9uC~j!a(ro?Gv28Nt+h`z`5*`+`8uW!7u#n<|b5d6GD^IT-0_c;< z2TT~;bm@rA%-_ZSitmRfhii*tRYFEaMy?(nYQ^RcG9DyEFG%4fiMeDvOue@}RQ#Gt zuX1u>K^A`Jy8TnbVY_OO*Y|K|WhPW?^}TKddT(#9=kw!iU6FuDvaS^Ui)`jxy5*DC zz0t9XENwB|K20X{5YJVsl|hGVbtzSAwF%Vx=5|ZDWqcN0bja*6xc|P2%1}<}N^%)* zJvlz)P2fI0Et>E-O@eI}{hGl&z}FWw?tN%|u)EgXn<`7sYcu@ijnmRE-X}d**fsJx zrW#(yNq7jtkj=Z3CHD6BG2SL7D#ErIta9Pr9rxhAq5WmDBaZ)Qy@8lc%6qi1{cs|h z+n~$9=eQ|=cLbKh~v7?F8aC|sCf)g zKeIJhxwt}iCwx+rl0*wFx*5KG`-Ue@VM=Ke9v*ILYP#NXE$kuRFY${%{Jc#FU`tzu|rbfhd{fgy4o>Oo{Y;4Qx%ib-MU;U^>&`k33@}7Tt zWo7Q&E3%)t7k|^z`L4a*8%hID64*lh%2E$JJ;nJgx|kRlUqB?zEG^+5trhsw+LS+E z?9U{nq-@r)t!WxAu^cM3rZsDev=5Gnin?oR$^>7w_#R9R(_=)1<8|=Y=;!Chqb?I( z0+zpm4ZQbXv8H&wBV|=upHHyG?D=p9xAyeJ;}R+91p=hHt4l1j^v91M;`?`HWodmkAnytf!#;n4`d&8Sosd~KW+Mdk znuuQ16!pE@ZHr6f1lGw2_5IJ!>@Cj2%=yj)WC>dPlM@rI5+%KcH_Gj%UYKaPyH^?& z523fE9Dl!^T3NAHOcMRs8$IF7L(l*NdYrfG0%;S+kW>51?~nGi`|}AnhVbiyk6utS zg5jU8^+I=w(Cyo|gFPVWeax?-5UF_d`BAH!qN3v$AK0WY_U&IfP?zqRn`e;F(OC&R z`_Uq&py2TL5LSh-K33TNW2*IFff0^j@MS5B%9Xl$6vp35l`ZU!T-6#Z$I|g9)w)2>kdxQCF9GqpsTt@^lEY z<}}?lWwb(Lju8*5oL9t`DDBOLu{k%ni_JTY_c!M%7(}Xa@*er&5Iz|x&7E;e5VS^> z!^A*X+)v)AJ2_Y?GPx%sqXG%6c?K_8z&;(?(U)%U5QiQX>HH7-1PQ_sE3H{?mt;B?pFP98@qWXuWA*| zxwW(7+z~u%CD@fLu{6l+QL#Oj2|F8gwAs#`mXR?(!fN5X3^}gZrfgxP*|>0WZVuab z%w}PZGzY@^OkR4$wr* zgOyGkpFVw}^8dP4cd7*GZ!^c`N7lm%Nn3hR$9nT(``H!}*%2uz2gopqA`bo#wr}I( z+iJZI(IE?KYblogL+$NBFhd5LyGt}*yOml#qX4yVQOk>zcfY4=OnQC+;yE&tGt1X^mJbPX_;nw zom;nVJ<3vf{_^EZ-RAP9#>Sqkhp8`E|CTu{bZrcpgppjj^ddi>o1FcTU82Zw_r@0K z#f#EtG&*?)%0SCQyVoyY&T5;Njks-f3VqV6a?bMv7~nPp3jug5m|iTJSnB94R8q!k z*Wzwks^=Br5Yfp&JneP+oZOLeK0j`^KQd9;cvNOHCZ3kr+@&dl~9z*P_yD zs7QKs;x*tChY{`0h7R3UZl1h?t17|py$L-pYQLkwbVfgz1YCxda}RZa4eg4 z`xTyIyubxtD7`_o`i(z-Q%Q$2Iu`Q#asRR*oBXVZ?Y43)O#B;UBr1M$0_%~|bcj+I6-R~07eZ~g8b$kvARoDgE?m2*gu!@>$(8E>;tUODz%~x zlRUWIpQ&sCB^BTswSj?wdcJ-q?1Vi4)S8u!Z1|L1vrur%hla-N7_j*{92`CyaAA^Q)V*< zgX!9etBRkC8P)zB&tx8eEUJ2k5QgHcU)Rvwt)o z-9U|Ux@!XAo*c!Y0XHRs`tbXSl-;ECbA6xo8)fTIb~g7HQnr4mDU<)c2}t6mUZvwy zYM5l(&*Zmn-!92SCB~)tEbOlh<Ib&wgZmMXFNvUPl~nWn^Zu`=5`j-vDvy?`)rX z*AX^M0>BV>+IP+u<{z`b=hWK<5}~fw?%KqfrZ*dac(bNJawcZxxp?f3p}B)@UQx&2 z(&pwY2A&((tV)S?WbX80&W>ch5D~5XRXP_RK75!c;Sr61v`~66(P3gpGfgIXih%D? z>wo`p+Q(Frw1zoj1Vu_y1TlA8H6vx-f+Yu#_3~h$-&*YHc^(Xp=4?%E8LCtMJKNiNjr=(_Np617;SMcTrJM*|{)b zv7P38e0;vkW22|h4(hf_DM#Z$gtUSe>FJYf^-q7izvUz|*=zkdA+2(g)jyS`iMv}3%+15oj<*+6f$2Dg8;i(X!^%)zL9qvpZh(d1I55 zj!qGFy&FId5s19xxzk$Ckbvxdg7+S!IyVZP(T)BX&%??eOyX(r8~ z)dzpFHFMS3AAd%=IXrRN85k{Ky@m4GmX)#zq&QrE{Fw|^brO*0Bs69fc##M^g&NIg z+<4xma*^d^Z-!VBIw59}s(GzbPhdFG6A0xOJqT(tC zN074AF04*%cr^ne8kY>->k(pe(7mVy;0tWFxd+J!& zr3mUUaHcOCcjrKM){sTY9Hbxt>)}X1rW?n*6K5HU_1gaaes7VP!moUTwQ`&*rroHF zw6wSH-l2bDPd*SDlYtaOEoeoBq%4+*H}D)^q+cuQzR@Z+@2&Onpb@g^XbHcDw43(! z_A;`v4o7<%;sZ%!_GUoKoXn+E-8_8?D3nVLRSVDyNoJ=<4t@RoPY3eoIn;An9IPTB z&07A-F#@#dxjW_pnJi^;(y-EbC4S+hua9w-Ykom|@Z`AO|H zVD~McLAJ(RCN{RZr6S_upshF$n*_PoD7yVd=t;Nu76BU@8>eQ0?<;)DzK?hDy$=>y z0XnBxEW?!&k>)GLz&j37l--2aZg08*Wu?>7{O|rRPt~AY?yvcrwnNLZzO|JKk%UBL zXmQ*jG^$8j6*-cp=F(%ZoLatKWQ+!C`u9YikCw;yk2XXI<0%C=LBqC&Kz5-h@u1LsNtf z7@mO7c3d11)pyJMn(w5_;^CP-T~-E4&k2UAiYDkd&W;EEQuliTn?xhs10$$~8DNMC zz(Yx>{~VRB#bhB_S=Ry3e1p7G4oz+%eP}@Wb$YDpj4_c8;y;>J@c{DV$yWK^o&7iu zr5upb#@3d@G7UKi$v`HxG)VXlZYqK z-SiW1V@4ZA?DqliFX17^b@)PyAR`ICorzfxU}|n|Ts8vp*4*9QJv60D3crKG2E38YLlnhpU5-at^$_NT+PMhD zn${DwY`bOrK8;dQRY2FNR8vMq*Y7jw|5!Kl;%EiG$@gG;XDT<{{PKIjR9}Ie3G|eJ ziRel*K{YXZLS}pA&hZ|0h+2)iQ>pdHJ=oQBD@fPQ%Ujs<>l!=~9k9AFDtWpUOGU|j z=?Y7GVkF_y-*^(~Z@o#^tA8h}u1=9E8frD0 z0g^|22FZ|+?=gogwqPZq+M+mSR#qOsNCB9AO10ho^AqFAc(n*5!>%MTEH@Vnm(|fY z*~?xCv--cCrV!y*iZAC6PK9v?Jv5$Ilq7!sDP3?SZ;qU zLCDq|ni!;MkY#W?=L`G~v~vtle-was*@Mjv^#|AIXal#za$p|FgwDs+5|Bm^z6H=# zP@V(C5#Z#Dv$dejs2p(0T7|~g05clf+n3(0H3QKxRA7V!1)Bg? z00OW#S4RlI1AyPu`%&yxg9Xn4cqF?{zrm~4Tn)3vMxV)xpe4AzoAh3~nMd#b$#))r8*F<)GkP8k=HRe|Re-)y-?C*dCHwl#16 z_xD4X4HT7-4V^*^ml@O{1Rz#84 zrv8iv?G9{7K*{z&IiTRwtcNN?To2@-5_H;GP<&BPL?hBz;dPEch?@|zuCvObc3_CwH2y=snyWC z1tRj(YTK1$2@fjZkGboP_#k|^zicm1iM#Ruzz~2bV7_r91OOYa-DLf31LC&}%O(-6 zFUM@S*Owg3c~0Hv(tkd?kvJ(Mb3cAU|J9G;#Lb*<5f+SEHLgOoL{_WIS@-G4eFwr@ zO)Ed@6?PQ?P!sP4jPa()_yfenpp_sH*o(mC)#gh%%o89G>G*JW0XQJ;9#NO&!CTte z@g_nW(3m20v$(kU#0hjU833<5q0dW8Pe(%dg`XeBc>)3^PR?N1V|}00Seq?@4_t~( zY8RRBHm@o*;e)-<4#_(pD9C|s256%UT`#n=P>QHiAiz(|A=c+Gb9IU1#IzH*lZ%mG zsaWu_bkxyk73K(M3PJ?GZE3p*u;cBOo3bnavZ{FBBV95LNw3QKBjwN3|_4|i-fTLF#qrF z22spaxNb!#OCs3)+qYNvLv=n*t(YQKE_njgkML?>JiYuX4Mu=nF7QWCa80<35ylm`We z)eTK++qRXT%U^P|e+`94$+4rD!{A}wMMvL*iF4bVdhG^;FEwabCi_UwF6ww40W@&i zbl?-Lfb52Zk1BBAeg;Y9F3`50Gz&k@*cZ<1qX0eLhkdp=6an)*I)ml|+UQd8z&Lid;*8Rzt)Q&{3}N@bC;2{r&3* z6qF3q8Twbg*+nBOu+uM5QMtBKS7hJx+_SrM=@Q*Qr$ffK7AJT_q#y9ZB^KpUb4bq{ zSU~U%FlWG4JkD~_W($q9Y@Jiuj~>)5<}0Wh!EyL@)!bsNt*8KZ-%*A`ol8fXsY3tH z;fNmDDOR6MAW~h3KmvL;kk<)F(rvl0`N=@u*kei`M#k0e0p7&$`{`gl&qe;X`KvZ> z%3eFGQZNG#FmRoX?G3_GLutN5Mh5ch%g_y2>#Q`*oQL_-*c}Cg^C2E1B$s}tW;2uV zlKW0OLf$GYzEjQu(8cU`&xbCeJ2H*TP2T*;Dmv^V%Oy{o+mFBGxO=T0udWKzu>*!s zvPTcl+$Q$Ht*;bS=9~TgM=7+$>rCSfU*ckxh-h3Z$|tYtV|{T-Kr=ZTFdB3w2Up|~ zG)ykJ@n>0xN#jWhQ17seGrV#cV6PB|VFOgu^C~cAl`tt@+q19zY4Rvbv#FJ&;_|=G z#$;B)nomY7&m~-v`PKhHc;XW2<45|q4B1pEf?oCX^eh$Sebfwt{tBSrE6F^#wHr6P|C|q< z#i!j&RP3-giu{kT2>WgZwX}W9klx{1b0;+Oy#v6Bfn@XmR3k)ryca^_3H*-R_t9D} zF+iIz27Zs7WnB}iky66qp^ortvM6Eqzt_DEcbX<9QtIoaSF5*_rl+TUm#h3i5qt$` zTzI;@BBDjg1!Ey+7tlyLlw(Lzy--y@rlvaN9{LeWA_^Xm;x<()g5#cB4?tr6qnSKm zH3OZv9AJfwjg1eW`c(tT=C*l^XdXQuuxe{-N9`I2kD%Bg`2f<+)Y_Udj9UcQv9E%` z0Ri|rB~r=M?K}KGHt}yhVEyn2`}g0-;s&$_v<9pVz8#TEr#!)!uVRX;1Q!aeM+8Bd zQwAD=A!bkn zSc`)0Z0HaTN-$KMPZ(Dw)#9Ml92pbZG8JCKC8Rt|w`Uk8Dwz;b{KrCn;(s=!?n znSBaO!j`AKEQoP{#6QZ{$K!FoBJUiG+3b*CXLlO1IUUtYNKQr=OAsb*Ktf~`5!wHk zPYaC5>3+8lDi(Os_84v;T*q5)@<$^sglbSL5a0$$-LPzAAJhY+oS-xTCm}c%7KITa z#1|o|5RDu}7@P7boTKAocUmJ85Y$0^pJOMRx?^Y5XN`R5f<0V;iUPJnGjIFeJ@d<>N5H-Fx~?0l=jqA= zU5+Y;{HS}v(89keEl(A5Udcr^l|nWF+UezWJw0oWQ$K!0Ku)%LE~BVu{Q9~bLTJGHptqL*!RKk^L!qB`Pg7eS0|g6u z+(N^zm>u&9K8iq`CoH&m^ZTM;QB$FKg=*CUsTKn45e`91Ep`u3b4UYB=7S=n5qJ-~ zj*@;$HD2K9^j-y^HdJVL2gLH$5$?3{=?9dYy!=%V(GORvy6vsrLw?|{UdII3NU3KF z{0R!^)~=tLUC~<|(p+mi7@17qUtNqz!6O$E?(`k&(m7q%_}5gB`2U?fFHQ zyJH5xrv%)O8D1 z4SS-^Z%OS#y3Iv!5+Jh=gj4-)#wh9@L85SlqPR!@)IpoKsfZX}T*BrGJl?!p|K zu}V5I=U^cDgv~K_mxu1$zKscC-C$D&+~u22^LC-=#O>L#ai21T5QCMQr$LZ@1-i3! z%%)5YWIE`80^YnaTA%z%skb}#>u{~~Xf|i$S;;&b7rt88!p=m>#5=i)Xx-Jwe2!U~ z?S-f2oFl~b)fBHcPEGjzGcRi;rM%_{sJiZOqibzqd-@XgB=k20Lsp@BPenj$9W1jo zc>dk>U@`LoK0b8t-+F(g$`T`+3igzeq9Ospcu9EdFo}waPH>Nb7!R~lr1%QZv<=!`aO#g5Q2aoSb!XeG>3G;b|@4#H#aPSf~u-&ZN3gTL!h;sg$Bs9 z_v2lw(eiMJtq53)<{Yj2_XAT6xis?Vpe>mPTCK^vxVOT=qPYliWB>bGSdeHtpj&Ni zYcmGB%NNUmP)G=GV`Jrj{DSmi44E9D9#oL9GMAmG+5WyhuFCPmJvB8oa6p+h29O|} zEIdFzJRl<20DlN>D)isZmKM+vMb0Jx>AA+o#~oLOqaaF3Z6}mq!9aeqt6h5V;DJ+) zl!Xg$KB6F19vtZa+4A)1(;WSpVf()O54CGO-NN%z%T@B2W5nikbR9yJ{e(^m45?Tu z&t>+ZCoECR_TGdK4K`x$hFf+`n7PcudX%{D&&41K^G#qN7^j+hCBXsG+>NLv z@)0aQaJA81i^L10EIa^s&!V@v@D*@d6$crana~dMLMC;{EfyXrv%L&^pd*&o z4-6^7!-x+E$V_EvXQzR9cn@SmJ&-4jP*5)+5r4BiJiDw+2t;+>@4$4h!J;Fy1Q<2a9(_^; zCsQn3^zX-|&i!s60DV(Co11Y#qgZf=0MVTu1UFHbg|w8**+1Jh=h_z`K=Sl{Fo&aW zRE)AsOeb2R?@?flPe{k#ct!EJZQZ-`f$QCr=Id%v+IK8e+h^KNqRGwjC=a{Kba-{8 z@7?nU_AMA{1DD1jG?gLnSh|}f`87N7h<0fL+Ywt^Lq+8+aQTUt+cn^Iz@P%S-%`wZ z<3{ITu|-&TbhP^W!a)9nPV+=5pK;h+ZqXQSr9m8!Bo2dVZL4`Fbn`Qpw)a~*Is_0; z0WL-x;@^sKcE6z~c;uZ*g__%{V0#PpknWcm16{FX^G1DyKv6C}n z^^k2J#LTb2s)7sT%3AdnQ3|5DH1EC%Xld%yc6ys$WwKEe8|USs@Z#44EFGLjYv;CY z?44cT5yuQ+i^EJq!M+DY@5xx@O@!@ZW^S@qUx%ss^yt$iXk2k8f$TN{8w`@^0ZWn4 z(t>;EmpolZ5CAV!0d&`R$z8g7{g8whEoq47ibrIVw5P&h%=z6XH`vlTz{60<@))z^ZO zQp3P&`*GfabCq7Re?S0P&j)@s@trwm0xbV8pT511HsV?6T7D%oihGqXk@mfAWILJf zTQAfJ#O{_J1vz=t(mr$z+#=B+^Vb21cl9m{@W=Y9{KZt;t>*9gil00#;f%1cKA#}< zvftxt8J%OY-Ttk{r@GT;3_6?sN!1J!?sUWjqV@TjDxJxwI8?TNhra7p@ubG;yL`$8 zRSeBWT`$T{!mlNT7*$7ehh1oVuUdb;L^p|5SBqM_aIx>acBq|=9a@VW6(rYnGsv+} zzJf-Cl9;=#$~PcDH@AaRtnRWnmUN6e`IQ~wK|XE|qizkyIs?i{)n-)XB@nkjLkS2A z!!6>*Nu0PFsrP)$hLxW`;_u(Tx~#*IGC)IDjdelx1XZA+;ZEI0M%5!L5p?owFz1V- znkSEVFG^Aq`_t3>^?SCGM4wFNTdNnS^5n^N-_-MtkAVn{j`q*b&u^zF#D1)czM0So z+dRFoZh~<-{^O2?Prg%*8pc-b+EmNh}seY`7y7z;?*R0z@sFW7V?6WZU^$JGl60pD; z+t-ZN;-mnZ(fY;)+XnV~u{m}|^i3tEv<(YgK6BDh&sBwTI|59OJ5|llg6U#B-~|;x z?)lvE$%?uNehT55sgQFDp1!wI@cq2Vv&NLIAhErUU~A%>)>D;=n*!Bitq)tHRL^7s z?04a2CMy#$K2M{oS*i+$49C_6u+PlS;h00Nzv-T;(}o;Htc%sq^V}L6?;=vjd-3m* zZ?levs(fVC2P4K*=I)(8Z*MGvE&(?$GL%`}lXNe2N9Q}oI!RO^y7>QETrJtIjP-#< zvKO85kz&OnRfXd>x(M&*#sBM_a}vkub{`K0wHDlI%1|l&9Fh7iJN?XE&BbA{YfIcd zQS38(ywrDgix%c|9c!89#HN%--$(_`g?_EgjJ}_Z|JR`_1fDE$QfoQe>`wR%C104c zyz{CO8Tj*mH%iO$f`Q{k4o8o@AFJb1K2uS2BaNtXhJ9#k`97r-U9EbE{k~o8YnNTuleY&Vg{ViThjI-k2nGt;Uqx!MeeoPgni>c6$y2raGH!%K<@9te_ z=lwXfEuQV#%6~k2jLoQb;Z6Q^UA^C{DN}M}*74hFPxH(FQ3LPtop>!;zYJA0tgRLM zENx>JH&xt{{{S{?K#Kc;!+_yS7Pk>+8-oDymQZEe}KXP7@YRnY(qXP0vsrbKu#u zv|f95`t(mi=%qv_JaNzW>Mx7$yt|!tHgL53{j#FPbrE;X6UqHl^>eOKXt-F`zl(8M z5+`46&l{^_j{A2Vv!Av7kA#vw`X8TbL6UkPK4EEc#)e@;;)zYIpi`2K7}bRTz` z`^PqSmknHL&!2a)kyd3oyU=+QrD`s+&lyCTPoKhd{sj<9(_vj8Jw#?$bH@ypsi^`( zKK$Q2N$<=VFmmb?8ousfQ7Mf_?(lE13PuRM5Bc@0e8yg$J(kfxD}EX)YtPpsS!X}I z`b!Vap6O!AseoR`$OfO;t$l5k56Q^y{|#Lehyb~EDXtSMJ`tfSY^rB#Hac1nsklQI zlo{lv8 zS$0ZB5}i9lxb3)M;c_-3jUg+-$Ai3ZaP?{fNh&yw57s9un)9)U^%};Lh|)F7H*&@Aqh#i@sy(~4ntIR zMMYp3O1c@S|ARJ_&PyMP9O5~i?}&pQn-+0P0IEyN%rwaV0s~2$FN1kIUJH^+So(`1 zwq=!N8VG_?XIs6211$`Kp%LvFIz_NfH-kjHwQ`D>fO_r__vUEvgFmzx+Qon|8w-%9 zq<5Alz~g|h0KZ4dxIu!L0)~1Dv^5aX_C(E*3P}eWXRh`rsGKlHxDPtI2(XRw7=1e@ zn=oVrpTGG1`!{Atczk@|&u8i2owXN^1CVh7LPHVt#_fAcOUspO z*BUm&d3i}t(9!*TR`YpO_m+|kvq&@D|0)yX^AB()Bn@KeWSNIH*lc`P&m|>G-7UCY zmM!L~&ehC}R}Ub^uz2YFg$u1e87^J=23|ruf$xY(SyMAMbuuU<#3^`Vjn^Uicm(

o{SkQPctUCmVG>QJ3(~MHZ3y-;MT?Hrt`*fND`=&p) z19H~Mo1CGkxbc@)FGPXNci<1=9%$#TV`68=yL>q%o5AAS%L`!t`-MDGuf3I#p`oGC zOKncATy^kyD}iYb{78<@!gt$}(Ac|e8fQ(Qt8IJ87$P*V15Bl&I@3qgohpUDJdys!8zp+ zG6dc;&*sgYo$n)JYZyhz$;r$oVMOK1$&>p3reFfec6b~F4K|DgRHW&zz z54K=Npd#LbwJvn#0AZYVcbiT5c+ESg5Dyx#AT^f~a_U?M#j zFiHzmob2rE16$Bi8#s%DQU1p#H4rzSU6o-4t^LT%d}u@J2tW49&2sE?OfE0Znn*=1 zdjiD6Ko;65+tu4ti-DTRI8LMu77jT}x;i!!*q8r&VNugwl1E&Kn7>LPhT4_6wq3 z*p$!k)ugALfrDwBP;2cMb!{it-@H3ba0tYP|&g98_rgLCkV zk#@3529x(JcgCdHzx-M?I4eM^(ggK@r}5u zS3f;9`y@^H-(O#(n`u5xjP=?L^PMjf6QN<_IvaPSp@-n{{eVSrw!KTg#QTP(j!lVz32 z*sz{vKH?2?8%T0iDwrP~`R8K{u8h1>eQuUS7edB*_LTRt-p{n7+CKC_DkdE`IcLmZstRD=IThW$twbHQ%H z;upa+)`n%-bqR;BIr**?!o(K1S0H0+teM`X;qE?--k*Pka^3N!Zc}$cKT;k2_v43b z)LP=}_5%I<7Sq;UjM?f;3^)8m#W?LT;xALcF~M8TRbOZD%lcP3JZa*?47b>VWG7st zV?4t#&lX_%h5oUbROaqU*PZA!jDk^7Qq0?lw2|cmE11Zyc_(bdzBbpbOtI#RXe#0e z)RNNdI5=xg-~Jb*Z)0U*YwU@;T|MO=Y_Xj`@28)S+?p4>`cR}8Lz5NeQjaOLX~n3g zHWZvqCS1OjP^tUxawd^ zGe=JxbuwjG^wy~2_;uIe`quQjUh>Ko77=B;@b6OB)Dx0kOHQ;wm;8uprL)TWvQeAd zi*><4Te_9y^|Y7&HiaUX_R}sq7jw;XrdM-%j%^ZGhaM9pd-vE1#@^^6dU*f*SyVMO zR+qfiDww*?Lh9MW@wO*~+k*SIBw^ctqm7;F$KSVmkO`{)e7sS;-p_zaev{MsK!U7JgPybE7?KPf^y7i(B?JHd!}pJP{(9f3@=k9dJNPjI zB`r(k!#A@-YX4iQ_d@VIw&Cfyriuw=wZ6;=o0C?1Xy89fU-kX1HH3dyjg{UeCM3<) zi&uhL{_%+vxRsBzKZig_+xGA+#p5*_RPvvPVM>p^40rr|F*?_t zS4sev5$XEM{Zb2f67h78Fp#5|V05C$T7#mW1t%22Oa>*|AGjL*FKgf=TAZkpLI5q4 zPjKgod$A}d1BcqSodt&no|{mTkW|oY$S;cj-KWSA^h*x8T~TL3xHm^FCyZzIS$b9h z7JandNeq9`ycn_L!*KsKs#46_m^d0x^R1IF4ID6!~XXS0ozxx_x$%y@JC3W5-YW@w#?iYU~>GcJj@QjVW-|BS%xg^9isP z@hT&O2E6S=rX1t2IV+C+9JZFYd+%e{1cp1*Poh=m;+|4B2ZDZ0qw}_;JppBvH!* z1R_l#J~i^v2l7RV`bYW;T3maNU7TZWu7M2%Ie!Tjsf$#jzQ@VU_=lL<0h zrpN9o^8uD=i8gXD7KYx?-`_tpMaJgRMn1}60IV(ft|w`K&ZwY;MBI+R@K4TekEFi! zqg7_b#RXnWc4LCQU}y3KiYGbK$(Ba!ZMyiP7aqSO*TN766FMTU1N9!zY6=@0v!zyP zGAhxUmW=FWlkrt9E-noZUENV;<@It^kXeu;Dj)%`fAoTrm0J=SJ^lT~ji-z+4rec{ zM*YY4${xBuyn>_bRh5(qsp--8m{ZGg+I;Smw%UGKO?*Yax_bV}wz~E}lf1j>*U?Tf zyQ`{!%S>;xn>-f@6q#U07dV{|nf>z%eB{yzDH-0Y_0w6!x^4 zSy^Fr)F#{eAerfQiPbTf&eggei4)Z3Z(mD~4(a4Nq1k>-qA8!qB~56mW+t?H zmxm6H?2?D^|NlYj&zDJM!2&q5w+}G_{tJ4<%kuLxc73`1OgY%kKf$7bz0DMqS@5EP z9OPND2pC#8XPC0PBg*HJGI`Eu@E`U?e5V|Bs zI3{9$As(iRACzUpdi@HI966}7G?35TW4#PrG}m0q5D4{X+Ns73r^T}Kl3rBeo>QeF zJq3WWNZCd)*TJb~0fHVj7b?a54;zTc-b0ud4dL7<;C|5wv(wtVvxDfPt)1XOH+yaj zFG{Gm^fXRz_0$o6oBw3;PDI(eR0R4cqfTxq-xep8EbRA2RG?dt6NkMZOaMh9 zHXG8hJ$nNW)#-{-eDcY2%9@2~qrodV*aRoHn-Ap+Rbgh*J*ER3qYL{E&UaEzdR!=64@8A{!hP(YA?%r|s@0HB?4S14^oZurWt^ntt4*5W z$!AE3sEck)c8L3+zt1yKF+wQW<>)dC@_FnT8n!eH(em51@cVS@Qs#rXjmszG`j2%) z#5lth*o*LQ1p%OU)tNUr`NEBH?~;#7#9yQKjmI0TT+#^sX^AQtF${9IO&B4?Spf8;>rSt)R4jAGo!0onBVOI>1tsuNh={ZP9#KlU_&CuZ)tXHyX zp(sOdAMaT&GWmzp(w6JPymb0D1hz=buPN7t&DIfU7sv;oYV6qWqc(V^zDO z(R}@UY-i<(AJ)Aqd^W@3SL zpDqYL{){1^nqk+IO0hQ4|E|wFxhqs@HV{$?74Q<^cmS;lQQ|;m#(-0gflbD2{|3QO zMHnrKB_)oz!>ROY_v6-3Wp;WvtkfTXZ@xg=(505g0 z4E_U7w`8evz(TvKEBbF2ql5?C>BfXcrEvuPCmw}(cXEgb35Hv$m|{;tcl-2576}|H zHmUc;fTQ+UhJ~6`Qr@2b9>b1Kk9cVu{kgFAO?_bh#6whH?zh9oj; z@i1%UU=aeA0sQ&waH=GdLn9QZ9^^Fuc6J3wjIt#Y<@$%LVHK2ZD<~c>3ZuFw`h24w zw~O%eh2K^)br=kjIuSbDNK|_|FAwhaBvtuHTFM ztSDCzp+?#FNqs!*=`oEF-=cB%*)@KHcVH+{!V`pV5WTRGllb5=$T?dzv=dQ|Z|)X` zX1^ic#A>B)la=xO`}xRCuD(0-ck`+k4`qaG#}lEF!--^TfI^LsYat~Pq<9~&A-1)% z_|dKS@^U#y0!zO0q~VU`u`lO$$J__S>wI0oifM9WLj;pxBa#7j2*Y)wiIPpHl#^I; z?@Fd}$~?d_?*CjNedg*S)4huLQJ*5AR%)#;pS7c3SN=ddn=;=0*kX>-DS0-xCn78y z3ls`)q>wlB#%q}iX7G99_C=4hep$;kOpN#m;R-ew|FZW{V3wC*D$ zk5z~__@0J7|Kgy@Az<87yMqe;qvDtF3&MHBymcAq~O z@V2S$6^U{-m$kYJz83C3Go9spBm77!YVo`%*FoRE4+oXufKEs8GB}XIPWKj`nr!Fn zj@C=8c6QkQO$oAntE@NLWfm&QsfJ5G7hfZ-SjDSB!NG18AfTDRUeH|xHeUxYdM#84 zB5X$ZePO&has2wWf`^<^dj9D2YS-;hmde?n^7Px>D8vmO#vs8}Sq+#D*!J`S4ajWo zq^js^eW>^%r6sG5~K3F4g)zIh8)g>yM)653P*yp`b98ZLfXpeX^XKPK7>TAm|Vu&n0@m9%B!CQAy)BwjsF2z%4ifUO`i! zoI}N4fP?hkVRMSBS4CHE%g6-wEFKr2X;2QHt25H7ZrU0g%~(m#L`8VQr$5Ne*Mm8r z?H#j%u+ND&E-?eVSpy+e!J`mljBJ2YllB*D3@9C(*X`qt*_p!^Cs)4GVkH>!F1_Ps zRC(!wi2(=dIfX{;?mWzcdoh)j@K4RE7gb|YU2>r`G}f-W_lRq0VHx&w$Ze?$kSQ9U z8oS*3(T=MAR+Cr|ld9a$b8s_%cD7z7kP=}ORQU$^j5e?g%ZkL_OI&6uWy$$M+<$Nr zNj*)WXK9|Kqpl94(C6(UNYk0G4f*0+O$_<(AL<{?pJQCTPk9?8m>3Pw?Thm(wwUXQ zPUkGHcVf|7qD?|JfpJN5?L+v6^3ogvZMuCaMgNfP+N3@96&#w!c&1imq6jD%Jkx@? zI;#)JG5eL@{?Q7>?I!--+~3jhymMo-M37*3ID$3soIG}*4!@psaTlE|oxC#U ztNryvi3o0TM#tnWHd5?8yUxC)aR%PyC7w|~@U7JV&1a8C^2mXxtn_+Cg#7LXtah8*I zU7pUdxL(sGeh;r!=H*aDg$=faEbBBM2n_!p%G7`D=U?%Gomx2V20jJh>j)ir0c^f2 zZgdMBW^taDUN*VUT$~*lxtc(Z5gK>(1D7&#gcmu91<3%;bDF@}rTv|{DSukmm68GE zD9ZTw{u)tvAMah6#y135-ktwNwbF_-g+hyv0t$|a6d7Vci?V6=t{+&F$!w2Wz z-0Ivjmvi_Wy~`24uOE!QF&v8iRuJ~e8yPXZe^>pk@^;BW+=ZYCVb zadnSgPWW7yWkp?DO!hi)?8VfaeZJUuqnuXVqiE2@2RrF~lA z6Ul@j(dWhG9+~@`Na~vwpgj>)NOAGWT&o~nwB4s~F#T%Mld1A4z4#6(TkjcrtL9m; zas7_uXniiV)aKh}VpQxwHDO5=cy7Yqb(@7^!1>a5SKG}OnwUM}%653d=R*{Cj+i`d z#VowvAL}AiYJ7mWLc*8kZ^uXV;+Gc9*Hdf9?eMlAN_6;R+>n)Sw(lZRZnXaQrRn_s z)}w`p&Lbz$SND=LH7BYR4Qcegsej5{W+Z1ecku<+}HEGp6BUxzRu1w{QHgLcl?gy z`~7_0pWAg5!9$bxyp;adWGMcep)#}oJ|#fv&O3$fr^)D5@by!kv!q{?qkK^0uaL^S zSniG2y)fN9)yDxszbj;#N7jz+a}wf?O8;;c&6{ZP%{76AUEGv*u2g6way;>JT$!cs@0S&hStr~2?rY-u@KfVAj5&|R zMEDO?ZXKWW-2Ncm;=GyX-kw+F(kUf;v*y1uFV`+_VR#5d+&7|mk}(X$YYK{1Wv!!I zVBRNw^Hw;I<%*PnInwGChuJ$j*M|`%&n~3PaksTc|CnE5c-&d{^TUkHbB8S3d(11{ zAe&M22XvPlxVe{HsNKBgO5U^&P`Y&fx|=7LDW#}#=P6YT>l3fOm703f&h28s$BUZF zBdN?N!krSm4XV=g=WHBqt&98gpQwdC&Hq+U(98nyRIHz=XbG*7;Qai>ww}zMQ+2ED6Tl^8rfOBa)Ew@cp z)AY!(u}>d{sz#WkrQgJCjq_rTCU5Ng7xYpyHY2Tr;n!Z2843%jaD`tCa6hd&w3>mD zWu>FIzq(SzU^q>B_xi%An@(4=ZSkV9@msmUmad8hi+{AFRmUFFU9Wxq_D*^4cboY=DyCUkiA;g= zE7Fk6_ha|^8%pn(*i(9YaC3*x+4gp=Z_`N&TKN`oFlFseqVMSGVH;MGZY0Lx!Bzz?NEZsHVcczEDV-mJ_yHJQpdNxR%6 z%gb)$u!dKPEd>WR#avo=QWk7DIhf$<`KPWUq%}&z@M`g~LmjGRe&2I1DI_I{(lyVn zS`b+^qQwzUGxJ2Q{z`z5=`X7?P60kCDS5{HdU8EOjK3b3ov?16SVJM#{B1J(=Fam+ z`Nlg7E~@c0cUG-0+8 zOHMo9{Q+NMO12e{|ljMO&5uwwZI#iw}sQ*qsrEm*_c7;&< z6#Y5XR@KY#0p#i%DwA*HQ&uh0T-f&1SFe&x56n% zk+h{~y<4JL&$+F1T;K33b&q*_)eKdndPgUF%9kG_)QU;rWDVJ)JiX{X8g)kVMOCy& zweX=~>)Q$)?|w~x5so^Ax`=|#iXKZtKiBBR?e&e3P3aWuBfsr4J~yfq4x2{a$1dRp zPmdwFo6L5}gOxf5Hl-cqqX-Y%T=n&K?`*cKt@8ZsL)bW3E0U+oM|e1nFT-Vu!i8-j zi9J>&J0NN3CByiw;eFvM-}?D@G>+pOm4rhggUS*F#{Dl~MY6AW)+9OKDS0PajTjCz%x0>B@MY zh}zX1dDB!}dbyED`jmLRdT7i`-N&kZhn=L)&w49$lUWX^uKFjFOFvj2OIUTAOz~R^ zEw6uD<hl{e8MUIeGKincvTF#dTRJ^VTFXhjyef zejVBW;RF|tx&pZ*I>%f6V+RYLvxbg&Cvted8T_+7Ftm<>_58OU>(==d(Is`6s(kzcf|#3irJ-tGaIqp2q7DY;Or;1hsYuypE#HK~&Wcco7eBS67$x zV$)0Q3Uqcz7b&;RhL)&epm!lQC%6P9=YE4+h+?;7tfQl&UYL_YQeRdpedw59Z{hiM zE!GQ^6srd4IvBKSPYo8YV^>SyYFlzu%Sg7px0x}wM@01hC=&z36BRoKLi_pAl-7Wz zB9JO;ppUmqb%Egmx}QT_&`=d}4MCt_n$z;<*042?S?a)&YHoV(>>AV{q+1U>dRfw# z`9RK%o%`;Y;^bMTz~TB`rvJtX1Wj1|j2MswP)~_#Xaf@o+i(3B2(=YaG9x$@SbGNU zv*^YH%lgMZA~5g>TmUP}XOQ(ar+m3BmYnY%-KK2gFZuVHJneYu&;|BR3z?F2#oW+= z9->(4;G(;BDR5oggNe?AOu+`F)X%*}ziP35ks4U7@!UGE@z#naYs=5(pSAy1Qa0&) z%EH2;Xwe8Z?*_+T-%AL>2tp)mJh~&yVu|YwKpvxvzQTd8|BKAb4u=;4;DeNu`*8V6 zuP=9x4eTb@%uc=V77I46leKN?ERDAfkKr=$Z?v4Tr&M32?6QwwZ()miahnxgPBlJszJP7*jcbLOtmteK36iW$*;l|$n zAgmm`Lg{@SkyWrPJN>aiFVN$eSyj=*8>xPppN}9zyPC^BawwwGr*MM5m0h)Vh`Ay& z{gdp%GiR}%m${B5x5pXi3bO@^Z7!ACsNK*+eWf|hvMI9GycD^rv4A|&j7{mpwr9YXH-ZSUy( z3`=!UT$ktZZNK?7-)uMBlb)2!H=^q^e&45%t6Sd1(>-b5_V7cWz7g8?2}&=19~uJT8ZlJSNH z?qlq!KxaK9pvq{SDq6+%qM4~8Q^tD1Wt=WT>sCePHdn#dV$=za_td_9<&T?Rdc$@i z{RXAQ{DFA~r5$;TRMc0l$B1r3#qxizllw(W2ViasetcTer*;>}8Vg}xv8=kTtv$-$a_>5abO zl&=%aYwD&-WHRq?f1W>vf#Cb9xj~j`U&n^krui{rt!e)7vlK zX0d;?a8lmeYnZ&gcj=DYzv0o)T3Mt?d!3m=Pn9-i_(Hs6=|;;`cKIvCC!;rC&c#}E z`~WV>Fs{NNnmYZ)P<*Jy*}9~n?vSz z`Y)hMP{FcsktVdCmA`$z;|SItDJOxzQnJ>HN{ijPBgcVJ>GDI!4;xNEK6Ro8HnM+IPM8-iIEp@eOv8TihEFbBZ@m26j!*N~Gj#>!EsN)w z0ylw~+o89}BDnm9!L2n?qvwlMWY-m8qnwMjcJawBTh#zIG!r2fjz zumAYKOGge1mm~!U)OBaC2--GrQR<(o*y=lWhGD8$ur2!bhFeZS&c1q+oinsE{ErGB zADc znw^udXt|bfs_W_T_#<-T<2K4|gvNx6tMfIYkM3A)YZ*81{;olj?!xT?-*qGoIvP~7 zX-=)RnA>Q<7VehkwmW1@YI8tj%=Y5e0&lOp^|-h_LH@C)Ouo0#bI3+1=d0`1a=K8} zy{kEVQGWV~&esNy+P;zc^R0njhSBm`OsDu-JKL#MxcNs(U4x0Kj-1sfyIYw?bjS`^~~ayy;Hy8tU_5ojyBM6Z~N8W z90%GVYl{srg>bFho;^Gq_~EDZp7R~~*x}>}kr6$zle4uhwIR0Wk8fuQ<*nd#1EEK; z1K-FxFfxuRa4a??du8jnci;T;V0QFRYL=X1e!Y%QY=`?!xcJ+%_Vgt0x2GXK7 z)ZP6zOw+uS&X6T@Q<%ZqZn2i!YY+ZxreI2c_cgjj%enHeHV=nVt9YHgml{+RlAe>Z z8!olUr<4`786K2bhauHqeC{VbEyleUwIWzu zofMCKW}nsZDxt&5^B)IB$ba*2Xl^Px zn*2-C$xWd&K-HpMlhK|%@MYBa`5I-?m61|Ma0EFwnn!`R{ex>dp8n#toyfgJv8`iI zskEb2{nx?=F4u-9)P7Hfi?#Bi2u2=gwdequ+KD*bCtowHo+})p@EqOFzyC{Iro;xL zb17RxzIbz@m`$u#`B$MWg+ae^c9j0&CCy_-!Srr2$HZQFFeJJ(B}iX*DZM+`bRInr zCfos=_dQIF-aZ$Pjr-4h56|Jss-j?8=>8bqSjW}lk!tthtp*v#?;nvH`Vi*0#|*Is z6_MPR9c^UoBJE5Bg-T-IZm_rGI@!BLLP|mjE$5B+)Sxumy%83Nocu4ja_wA9yIjpX zl2mwwx4qW0gicHIpl-fIf=oqYy!ufyPqeQz$Y7?pF0$S4l<)*cdoEjV^Ra!;MjqcE zq6i$w8`%&#;`+kWN_}gGVnnJ@@`a~9QxL%hreIPoqlc^zOR-m@?F}V`t@-J;!a1Td zj0XM*A$xZe1oyixGErSMO#bAdF4o$kmCItHyhf7uIu4QH>Haz z2kw~Ve*Ew%Zk1$~W7nS9PXbFj*NG*bt9v#3HIH#$4$p^N-?KgVYae45owQmx_gk~= z_(op4v~rglJGQgj`s8)*Ky^erm5|x8?Wav^&wo=d(p~o^rPE7Q?UGZi>EP=9JUmVJ zX$}W&>XQHKQTzP#!#wl7MZ6N~yRNYasAObU4vo*4%&MPqi56&NJ^4j^^%tvvWJ6l< zmluzx=@t@W#D!Uut71?IvljL+xc*CLpZ1bZ??{JOh-{J1?xCpsDyI?Gn5F%*hB7G+ z&m~Acx%z5XlELwXyTjdPOPwXo7gBy7Iu2gpdzjn;4ePIFWz8G&L@~tmrrn#LkSp>D zjnMvX+HuNluRuXC+erAqAFXa7%Ao43T!-RwwL!_Ey?E(V zeP#9Ut*V*N4SfM-WtOn#NZOrm_Gi!eRaX@czob?Xvszm>iNY@qc5)o)ya_ zf0n5D)HZg2zEJgSqmz&Fba2Q?IiF_&qpqCvU2$PeQRTF*sGv^}S8;LKkrG1>s>XxHK3Ng(doq+~*H-I7kTLIjQo z>v;mY=>Gj41_X^J3!DfLTi{-Cf~fcuXtAapoHK^34GI0Ma z>j~@dvpo~_2ahJ#X02`()GzVp-S}%}hn_3>jRa2M65LsAmh_ z*6f{oqkKvBbjt5ZXY`?UqG67M{?r(4DM)0A$4|(1Kn1Py768})Uv`*F1MnKWAyEL0 zEc5%f077^eR2>4fhuDU)>x+h7Klc5QivKy6rW-?$E6B)!2=ZP)K*R6T8MC5v=}*mA zY}mY6*-mIS234w@*d{8r-u%ZJi!0t31?f+s?XM%vSLbsj&T zkE#>0_V^T?K<6E5lVrapaEQsh@Emoh+s115a|u^-ww`-&ZnLYP+`q_ zvr=GNSxUffF!_Or;S{?>(2+8?e{}&Sv|1lcVnAx6p=b_6Us#`YEo4-E`Gc{ER-Hu@ zPJo;Pg`aLeVMx&Ii$Q$+x1^dygfl-?Wtu*G6mj~(v9%Y>4{1dVHNRkMelgT6B3fCk z@;)@wT|i*{eCK-(wyJQE;0#Utb9TH^xuhoaZkWKM{jZo+T0c=l8Qt8S`9Ly_k6O5D zyg&O)WLC)bk6F@Jbo(>r*4}d!!p^a74(Hi}g4)L;7#I}DJ4RbcyasJetUO!OS zX_TQY%zlA?T7~}>-b#?ysLaQyrpJO67OQYEEnuEznu0D2`2va#E7`6J$EMy|M44N6WgD7M7G2 zPyQ?hEv};GTG?h9r*y~JyYE>_OWCtL8FaZ!-_&+pTO~-Vxpcl}v4A3HSL}}M6CCT` zmYCPS_>QtjTg!GGjsH6E+t<|3o~3nG(dgZ@M&DZ4;GMfpmJbRN&|@|hI@%#OfcBb< ztH*4H_|q-BAMo1S8_iXej&$FDFIqq?>S(%bG4ZRUXUNYpmw`)H*8Vmokp6qmJlDl; zVbV2aT57t!-SEE%A>MMLU;n9#UpWL0NyqWF2v{%wwZ{ztY~+|ZDkFj|a)X_Dd4!Y_ zo}vnM@FXWX-|VO}Nsqz?d4I0k!rn+CFGD-QPeYSNs-dU$Up~KZTDU#tWSesb;H04f z+L<=}%EzPr_QqyIhuGOf{;lC!8GEdLNDo9^{EfE1391GnOcqX95Yc?N?#*`C4Zs6J zX+*zR5i*?!)N~oy+=u|W{S)n$wy$}g?4v%6zo_!dOZRUPm zA#qO@7X0wB7=hI8AAHasMd+4=;`Mb=man}58y#=6ZI}RTR}JbxpiD-<9DjRORYnnQ zc-U2VP_zL;F$+MBOH?GsP5A)IL94*4totV_ltX+u#5Dc@n7#&+&cf?IdHw|c9eT9=}IZ^kbbNRWEM#Iq72a|h89N2A*pDd{{QCA z)gW?*vC-%;Yr7=M@vY#StlG%M^|Mb2C(x(7Yu7Hqfid&!X5L*IQ`2c~oZBktFu8Np zs#TClnR%WyCV4^(3?#}7`n`Yi;TuYYl$4cu`1$FwT4Vw|8tJ;kgh0SZ)oE!l(2*d3 z>LrHL8~$l701^gLiTvSOy$v(`j?m*Nw5Gslk~Pv|jT~_CKtmEj?YRQ1Ktgt5VHqs*O4EhuW3ulmgjC>u zu4?K`g@||nHUC{WY4}!=GG!|uL3a;=40U)jU`@j6fru^g=c1+T{I?(VK(vh#l$iw4 zrgZvrk-rvm?Gu}vi!Y_YFDI=LB;tS=UXDo_*WNf)cyeBv7?ztPgKG-fZgI*w*~dzw zwilS9dZIb?a8YqF0M9V))P1Zt|H}MGkvYxe407udfq-I%xd%WI2fU?#l6oDROo$Pb zZ;7TDyrWuN2FP(F!5V?xDL5!7D5VpGe3(~4dMALZIkdOOyb0x3o%{u)f%uycK``<3 zXn|}+=)Ld@^nqz_XPB*FML=GYI`}XOs1wOE1YX2^S0?K?FX&7-3cz{f`kHxObI*U361zY+G25eki zuZgn*P`De?D3U|wy5vOg@+A4gH$*3Fdr$yybyPww^P>{SwV$1i@vY!;taUiD`7uT# z8wAC5c3SfCce{s%t{~#6^5ZMJF6mdeC)aU{OF^x(1UB*r|zDh&g(${)7e%sCt@QHPD_WVGpnd2n#ZM zj?rCL3YHo{%JuT|tIH99Xc*V-8b_-LsB(xgKcWbS&v8uX9HW3TvEcgR zLG}fZeezeMYL@G=OVQ%AHt#XVn?x;G!R`9r{9QOP6bN!20Mh`||D@9u4|n&C?CitQ zZnRaH29WTeKRe#-|0*c^(z1Y={V@{-sHR6z4~5Ca)#3J<2lLL0I)#dAjzlfdI1CpdWIL}K(IBy!iS z0uqb_$C`sn^=Q2Jf0lGI6ya&mq;Q$4#fAp3FJ$MSQ}a zAg1TJR@T7p4O5Z7Mp_ytY{A1Mka}E|elQH)H8nMP2X1}|ccB*?8Jo6j8Mw@MqV;?x zI1R+?MOUhi^?ZJ)A0auApB?nFa zg!YAJ3&Sr6n6?yE9UTt*Z~gl8jU19T?wk28jK=|i9JHwX32X@6W!ZbRptg+rcBg{x7DTG*Qu;*FKOlyHgj{?WT z-}Bu^7s&@eS)ySUh&59W0$zwpum*8H4d@?Vf!&ZP@r^hl+IGM?0BWXQrrwEfsgSPo z9yoBI>6Oag%P0S9$O+WOKCl@YzE_#M5OvJ)%`H_-g01CJylDNQh+;u-{>$+B&(z{VOk#Tmaa?ALY)cS%_X90S%>V zZm0UDgMW51@7>MiG=3xzUW{Ys&V^Y2_`J6Q7R4`^$Vm8}FcNZ%aMU$#;HmFR&IbFBK4bh!GmA^~yt!_dhZ>HGTT=nJRZ8 z5)#UB&1@IB2BX>Xk+#(fw&nqV5-suAvBo)1N1Oq)(g}L}sJBD}g_Yy+j}8o~K~c!Vz*z70w&Dsf#*td+ixb%jV(|eC8#6eP*s(AXA*usH zJ+G%<*hkNC@WXSE#=HCbO-Q;R>%r^sXdoY{n9R;T(3{}NB?4NdIXM`lF-DQw$a~D` z8o`@V31M)@r4;V8Xd;jPd<&2)@2zDA$Z^g8VkN@lb9 z)cf~OY=DRnLl@K%VG$*$YaReu`Km96q)3y=5xPWUizW_?rlRiQVRI7R|V{r5ITnF{9DRu-%i`)$P`Lp+r0FVbPG^4l#&XOCR9?Q8_sHw z)$VG74BP`lBOQJ!VzPIK80!oH0kDI`yAI2f9z69u7@U3ZB$>f7dfKn5sc9ziK`~ro z@;*3tlAvD?enmqbx0ZVK~amcjbjvKC8joDG~>LrChx z_5`zGTZS}HvgDsm=m7BSS+%N`n6sU$HHvmq-T?O2+}hd_T-W!uSjI+W81+#yLL%1Yg7(<4`3V%Z2p$|Z@sPpAWsr@Y>lMpFi0!|; zXQ2^v>uR!&8OsC3hG%)0B`Rtp6l^8G1h>{k zn#*xS80&?VO^Gi-$l?RYJcp3UI+>ZaQtT7*!ABNio zELk#;Yk_mmpQ{5f6{zP-d`7J6(w_$dl34y?ERbvl5@1CPZdk>45#<6l;Y4B&NUG=O z&*vy$k|tvqJX<{Up4j3{V)ZeO3m{n@jR0S=U&2bN2Rj84OBN5E#h=v9t2u-!4O%kE z&H@0ypJzBu)EUYWW31&#ZHo`J9G7+tS?Rz!c(>A}afZYi(O2hd)A1_*Ag)#xm^R?-k z{Kvpyq{ASf5~?-Lnt)n_9r>yNcX}XSX#%TmDP6!cuK+;6mR2-(HFkoei~?s?K>!S# zD+_Ou?_4nj5;~h3!J12b!=j7+E!JiL0D1@`?~1$iQ*#-V9tte#u|g5~ zmTNU;AN%N$39#YSd4sWzlVz-&oWLw_xy%|Qx-KvI4`RTTpX+AO7@&7NlJ>RBDJF0Tw|brrGA$lmbv0(pUVKP#?;+Y>&it3PfjUgHSe+d4my| zKSzbM!mgRRl$4anS0}r4Jja26xvQx7ChB43 zZ(CPB0AK{M_P`V|@NIK@nw}g!ANvH(hlPB(*pOhx8GW3App<^ccL8y6+<1g;NT+FL z7{-p0Wah5$y_*@Edb&p_6v`ZcdG2pMkEc_IfaftEmVpke(It%Z5_mBf2rhooIR>Mt z*DSc|#>ZC=IGVHFZ}`lP-Zwyj`YAxU0OhJpEHJq)^tMYF5gWIbA^U-AO-5Gl8j*YO%uI9wv?8RdGZzydKT*C zMA_EQI2H|RYmdneI@Y@^96o(|!|vU?V@FS_s5t$;y_KE4d+JYme*XG9U2$>O6V$vS zBex=s=JEl=oK3Sd?UUUdsC3=hdctBJp~OwamLKK#sqCdqdFBqWQg~BSASUR3Y%EuH zZtl^PFFYU_%O`ByA4UsaGsVvoRc&qU%jV`(6szwYdH&@p(mGMMTMV_%*V+I5#-WhV zP|7?8wdKLrqG2^_o~V02efo6#RmG!2flBUJxbO=KCdS8ieOY3rSpy(6mKyF@#@qQ} zlW$;Zx)!@^JQoeq*sAQ{&+q%lNLf!0&l_Dqy0ui6mX_}x$tHfJj%!$#)#96# zB|5w4GP}6M;C#*d+`jj1Z5+4k>@sq5*S)+j-*~lqY}+H{jKV^C&(b^h?os`ko|bjk zw3T9RZca!EA3fTfot@p)*Vp%~ zSM%aUc?}H~4^PkSflBXeop0XUEPHHs@OD8#hW7UM=PzD3@PfpLsxTCh`mp@zn z;Eh9padFE(Y4$KWZ=iEiVBWov`a@frZ$iTM)s(B~Hf(tO;sxE8FJIL5Fdsa0=x%AZ znc2M?^%RAhp4@&2q-mugX~D2>%vvk00mdvF>|BLvz2Ubk5c9<7M|_ ziANL_*Vx$FTD!O`C2ggq$jQmURCfQ%)%!a8kDocixPgH|Z$waBe2clcIo{KEjwRkv z*$vRtaUs?P6UFP!&YTHq&^FSm4!q9E`CVmwyO1k4H}`o;isSEZG_ zZPyoK?P&M+l3lmNM9uh7;!|g5Kue33y>zSur&WfgkenQYXX(U%Ek8ehd}1OMSHNJ^ zAq9-U*}7dkb8ET29`g?fFw)oWsvGq^wqw7bptZ9zeW22>r{Z@GQ;0|Tbq9Q>HCpq~ z>pT00p&Q}R(F!L{tj8M;llt;6{3(+W1v1)se1x2+-BDlM^G=8YEfPjW*0qQ6$B(H? zDM;0n*#P4mU*@5s+J>*5aX0wKPvPq07o*3jhbuq4KyM~dxy{IuI)VbfPAHyMNR`*W F`yW&`UwHrk literal 0 HcmV?d00001 diff --git a/reports/imgs/lu_benchmark.png b/reports/imgs/lu_benchmark.png new file mode 100644 index 0000000000000000000000000000000000000000..6e940da60158ccb358896b58fc247ef856962616 GIT binary patch literal 33552 zcmdSBcT`l{*DY9xVgN)y1O!1*KqQ0YWFSW+O3oli&KVTRAd)kP5=4?@kSsZ)wqK*O@E>j)p;tC?<_0$Q+E)4~DQz1I6LT9ABb~c;`c~FP=4Px6%uEcN zba!9d*jQL|Gcua~AMao=w=!g`RkiJet6a4ZRklW*Fa0zzAw15|Ad#8aTl+2r{9{&E zH+0Dt{t+FLMcu^3#kFL;=5hXlFxm@2LBaZthbVt|xs>?Q6L=Mu;|uB`ygY4i6D0&M zj|N`&gnT;g<^O*_Y^i(sI;qxZspax`<;YN~uP8CBgeBV6LRY$eTjc)Xp$bUc~7?5&DAidU;;-YzejR8&@OtUpYmCTTZd zH7FPw(hv8mCJ*@jovAU9cxLvSxT4V2d5=J zZLueD1dg91@w4OpP^OVFIQYt}Z0;6Zm*c1?F^Gg?zI?5U zws5(RG@!Rv9#wUE_(r9~EGQ|799DePd99L^&#AZSG+5x&w?$8vE~$J(dI2iKSGaNGEbkh_M%O-?Q> zh(tV6fMs}+EJ1PY!!LgVS|T>%n^RL$^55kBM$D@d!l-4q=~R2!JRk@I@9;$auw5Fi z)=YF><+8G}Vz78DIO^$y5^Bwh(s1%a9(&^KH0mlo)r(9;`oFyy=(A_IUG43&AtGeS z;t`LslncBeTB7cYd|2NZ(A2bugY8K*>`E*&>hUIb+eZ@+5J;0wXq^cbkbd&SgYT}8 zu<(VC;oEX33apu}QLA zy0n9%X4ju%{>B-T-pY){tf$CG++OCB#8UA~B?|QuaB8+?EM$KCFS!Xn}uBepM zTnEQQ#o*MBN6vez`mpZ2$Ln=iceul2SPfaUYEbiCNiut@V{bDBZoye_*=(W4BIl1U zHXUIx`u!j@G}K`s!TwdA&Lt8Kvj-0zykE+#CWFAr*Kd10UcvQ|yn>IHcOTYbc|^c* z^Fg`Yiq33v$n~QW_|yJs`I^J_FOjQQSbD>SM%!x>N$=lZ{3f4qVb+~IN3ARr!YJ-< zUnV{|dDqcewG1SSp*-Eor>CdaM_i6KnyzAF>n{)H)i*V<+WwUn{y^FirRnBa+tq7O zU^!x1ve88Dz79+A`|Hd5#b#rz5D6WLe9qB4_NxTsjJQ#TzRd(NT-Ir5M6iMMR;RU| zm$7RcwmLWh;?L&e%x`;Gu20s|4$BxA7$oacOU3HJ;hE`9e!gq;+~+zQ)$Vb>E?0Lh9~JBlYrX?RtKw+2eAh_GwKG#On*}vf(8XUML(3@) z3EY~~4l-DwHhWx9c=*kuLI(98oGv)-rw0q(K0ZEm3;IOf%({(O=uC=PuU>w|z_m}7 ztD#_M?ds|}wG|e|XlZFtvmdjC7;g+B!KAO&Yr%8cU2c)$7^{b4r?gB$KHm{10)bR| zdbqUGbK$}ThxOXae!;EQ&UqDPLF<4u~zMc(6F$wy>aJ& z(KW*)*G9-eO(fFS8lH^V&6?=8yMGMoUBL>jfwO1~))X;k2B-7|eh8u&SzR_mAu0 zcCvPz_x1Ep9^1e5n{#b%kGr&C<#_ieJ>PqI4W%<`R>gn(cmp!q-|rJ-%Y_n{u#{EO^$OpCHsN)?D=yp>-oSFS4G8Jx{ZPNsHiZ=$;p5I{0ZMi zO-Y&B+;y-vf`yHJ$zpJRVr8s6YGtGZpNwpE{n5S}rrCEqOOYQKFH*v9Zhu!>Obcvp zm-Lxq@aZ#7g-jUF?-~n9HW5};Hba*30~ufIcWva@U2i+u-?xA?u~mm7z~p}F0<|x) zZQRiEq;fB}=HtER`-e-p%4JrRuu3zKf@a|m)88cPjOTiOc6ySbScX929b$priHvPo{FY{GLEnvO&w zM~LlBKWBTce1>d@yNh|%fkA(ka@{wD%;g>y7MA@r_cI9-6FLA<42m6ziHTTnu5zmm z{bl$M-op|OtufIvxg9&)qI*>X*zM(P#_V)44=-;#tjiXZBErLE#(rJ--d$^JYe&Gi z3`14j-7g?FDb8kcqOHTpaXCBL+uh5^$Z**mGAuM13jO-^A>=QiICfKLQnUcEUa$Lf z3?aNcS{BCdddNvP0SVCU?8F}KQy0gBUbXlE6Vt~54QFfsI)Lk3TZ#!9OxOvzZ^8bU z`CTuu9#FTp++KXi4>;o4R(^hdb93{uFpNBvt-vaDK2oYL+cCto0YzXZHvi@DXTUa8&WR!4D%&Sj!KMy>AdP-B9fI5vM`GOjleYIc{~n)(Rna0LY8+&Buj%&%K#UhaX4MDgT6cSYd%&p=L~^mwVtlOdb)OY+NFJ3 z2^BE^s}uk04|v@Rp--_DnSSsRF52kik-c< zn~4uO+OYHhK8|R#3x?XEMmN2?gt<6ev_ybY<m(zqDj-``Yke&!9Z!sbnt?7X=^zbqVuUH?$XcBT2pzmaUad6a-Id*KZO! z-Qjl`WWuT&EVE8$wwQc!pMv7&`u6r?XlMfgj*V!GhEFdqtku;3@Tyzv&yE8usRi|n z_`Y!9cbpPt>v_o|s|6f%xw~9kL$60m^Kc0W^q0rV2jH5bl9G?1*60F;x$RMBarh_6 zkz!L;v+5H&=P~TtkC`+a=OUgZtsKt4Ie1>$dzSp1vDJ3G+ z3Qd*1!66ccP9_kZpQs~_gTuweB@lA_tpnxA`n-ME$somS6=G;|gy&i#kgP<=O@@49 zi8%-A3sku4J({jN3g{O5beO0{-C#aNJ(4c+&4uq)*<39h^2-*UN4IRU%pV05rqvP<_K#*i;RQ~As>l+l53Q!JNGU?2xf};UB zXg5Px3e3j1*-eLMEzo^f?+Cb&hP4R7lO(A7`-;Z=X7iws{R`N=@o;C!aVfjR_rnJ} z2fHlR2b7c>&;~F8F5?DJv1q1?8{#j`hrGM$V4lPqhx|i>&Qt(nRq5wE9Esm>EF2+y zWB@XOF5ge?4Ui%j>gfMykKX_M_kW>3eyP_e)dDhK9%R0Nj=mEw22=^5HW3D(EctAe zo%}=t`H+Vw4KLlM54iaFGs`S+dS|b3I^S?Gltoosd;9k7lT(ft0JXz1Y4~mhcmc!> zBI9$KoSU0lwi1uvDIyrntTcYpFekmDpeiA3Z2Sny*>3gBswmp}qnq)&*w?OoTSx1L zLiXv?-I9H;83xl!d&arLDwbt(&VBu%bDdGfZu|&xi&Q=N4%8Cl6xDM%&YF}S@lWQKS4>>rZW}1S-Vq*R*%jWoN z6A20lS?;e-U30HBaWu+o(fjPQ^Y`M#i=5dQxVRamH&GIP9R@R#wVu%(2HzC3{Yy$p z+PtabI)t5^xY5wi2;6GgH@g+!^(JlzUOMWPINbur7uWKhtC8T&?={-r9}?9!N#@Tzx2fND$o)PVJ8{clMpjfqgADrT z2b`SI|5y@F%W)ZPY3cJs-}g=7i)^ZRq4`8&X({K?G0+k~FI}sgo|y?4od6KFIFL&Y zYfBAf54I9XZ?FJ&ij^&{?L(GNaXs4gD(?9#gh?eCjhdb4;L-kh@taca2jCB&cByCoP2_Cv!D}~d_yHStNyEkerpQ9E7WfA(1h3^xv9+oFN12aoY z5=eqAe2oifz07*y!VN+~pB6m|O3H?+PROJThcUnbmhbp0YR0@Xb+Ig>nZ+B1^0oG7cF;}fOrW=5K!y_aVfz5!eN(X-8cuDi@QQtatLPt@o>%Z`58U@BXGh%YVABYgWF(UTi)g4PW@G zzyNz?xJdWcXQ9VNzb~4buLZb~0aDW0`P-MJQsfVv#4jKwe%P;l0H~~4?bZw6sxMP1 zEHbiD;OwAF$Gx9|LiSZ+Ut?*Koz=s!dcrq2J&%h03nac-+(fm#h-?s_Va9BAspg^D zuAeC1_u;0Z@-CThBY{liiGe+sua61j1V7*e&Z}3iw#RdYA*_I6_O%+;F5bH1gDnKl zBFN#6^gz|g?#S`!(OQ;9Gq zgX$Q~=ggj4v3U&z;Pf*@OK-L+p+`#?^%f*jYXEBK>i~ZWpzlOzob5k7S8;GIe}a{T zBdor?h0q$1qb_}dBY3WTRXDMt$C964{@v5V<+5)P(uPCE8x6=D{eUl1 z(`Cc!q}LQuAk_RXaI@E!Y?cQ@5_s%yoq6s{Ko@#vTtq|!K{hD6wQ(s)$-w8nCIdNR z`fJYx1ve8!I}BRQol&K!X+f?kDf#&B02F~Dg2|UW zeZ0`WI+*8)ur=^7NKy_TJjFziE7Cw=ldyk`h-iSSMa*fT<+pbEq0L@ii{4Lz0s`lg zcVz8bxnBxj(NW69`-)y-{WGARGB^9HLgmIC3TdA5_-hhq-?3sO)7rQRmgq8-av8R( zAetdZLR0G1XFLa#nGNKf=AAI;?*X>|nWz>3^1&u=w+vVdz@E$LerLy9GSK$=`uWjV z9RQt#AS|R=fu3=!+@6|(;(`aH5eTqWU=A05rv|tt5YQ?PIxk$yIVe!cU5#xAJZ7=K zt_@_@@&G5Kqkip}cRd|V!Q|ABAKz@Qz6uGC^u%%U=7c$~f6K)gGt>I14%&EiS+Db4 z_w3mP_c|pliSH57VH^7&vod>fNXk-bOI@2Vf%AYny5v15@5Ol zNjN?L!*H~uqfHAX1%Z%vcdtiUxs~^&i1f|bwF(m!P%o# z%$kH7!06=b%mxe%RfWlHlyi4=44CBOpU}YA3LW9&W_+bnB++#n#Hit0G49S%`5s35 zZSW>475ZOq*lr=)|fE0tUxmz-3rPgLr-#DArRT)Q zc}EJ~7PMuoOL`}3-^!JTQ&wAB3uH^4j&;thdezp^M_2JCgR<^Y4eM$ zjF!!0kV#fnc6nx=OHQoNw!xo3&HZHOoK%zSn0u7DMh=Wmh2vJ~!F-&=wixYP$Uk&K zYpjajWnkT-YNCe42%-vr}gX@~=v{WJkLzGoXm1 zz`0i?)`yQHnwM_1-7<^Q8Tvy2;|7BsN9D3gcp)50Qg_osvPPw)D*Ik zw7ZmBTahyk(ONpyX$}sHmht*e(O$%_0)K32cU4IrcrPqsmii%mD0lIryd=5Dwlhs1 zujf6^_(meo>Mt>Nkp(mwU^+K;c2Xg|0&hM4uFY+K$_I|BAGD*;A^iawA$iURn?!NZ zu?T9;qZI=HAXnC_1+H66>S1W3@$-(IOygjE44q>^TZhQggGfQBd&nl;P}+eJG;*h? zn`mfgV1C_w7wOxeg@z-Z3~eGJFKCxRdbT{?w>(+`)cP=B9xh*6^o2&bqTGQT#W+6t zQLEbDS}uUrA_m2&-+EIxkf;{$yU}PVGpj*+4WLA%Pi>wv1lr=Add0o%-kv{Hwylv!T^at zvpDb9pPZT=xVsldHR#kbVVSUx=<~5>@jfD=`TB{EKp7xqhd~_^7Tqn0WRcZ~ly_^Y z_70B|{u4gps!=Oa2B*7%?POGqyGBnmG&GX+#S5}?P7fk3MiE^`cmerL#UQ|IzoDcY zZ7(D`e@K;xy5(e}{F2Od`z1m*fb_I7^Q|L>^)l2}I8F^9FE~O%yL#n{7C<(k(_eQu z%t!&3F+O(PT^<7Nh(~g3d;7toNB+^#L`S+!g8oPb1C$aL9sO#SQ5Y9jNk6alO_@6Mi;AYL(svc#7oQroxP@Bp;u9~{jqKS!s7YUZC>v`^ z&*{0)sYZeF_VNO5TTEQsDmpPdTu@%VS7;!C*O3KL3jtkxcHEjLR4;}s0;ehu)EWx( zPXIlkqx4F1c61~-oG(<#hHjphmsfo553zp6r2Olr&I|~G`!6`1fAbp;XrLQFW)M2j zjn3^mt2PCZG(qATDm0R7xv4BkMn)DbnMP4vBK}-?C7t($DlLP(ac*Yu&iWro13I27 zH4-I{sUFv?g)W5)tEz7l&>As>NPU34m;MGme%;1QlM!%>ex}wS01J7yz!vuaC5ShIg8(wQ#m0NMxMeIe z?!(g3i9t($<)`}R4^@{W8GfN(VKVN0=zaZ;IFL)P2XgL!JVkl`z9&Ed^aIZgMTj`D zFe)?zZNZr%GU!T_0_w}p&kqHS(Ty87og(fk8TjlAo5A`(nZgOW3(OWs7Hw{aXOL#KkM}oB#w&(2G;6~IC8_YO z7dmYR*Wds&fnecLT`fSbQuxqjVBd$_4LB7nfC-}@zE%Jh?#)u};jjKW-U#%W`(xwY zE6@YpW;baD!9(e5B`_BRKqvhKbr(2*e8VoX{v34)*qkd@u6zQzG@jQn-{G>bV10wW zYF6Np5f5rlQ#0-d?px^`QMI(oH?%;y3nb;rZ+3)yb$xASW`^+xJy0!>9$q|)APCd; zpe!)iyE-|C)3BeUSo>%A0&J$uQhyKxl)6o&l7^!f0ub%T9etqi#3O(a7&}Ct^O=L= zK=kacccUPi6I;nEN zs-RW3%G;6|FfcUi0RRJJOARDnKqJ+YPUsj|lW#ARp|qy!{pi$6Kf;C&BpYVcKr4rE zHKL-TpM-;M!)p9T*T<@vZU`9qVM}`%hwK4JA0A!&M}Z(eez#ju87?-J0QK25Izhq_ z6y?R9bQ~0Nmf*m_dISUGwF&&-Z-fzboF_*89mwqh^t%sCB4cS~o^I17^oN#BckEG! z2#z$Rm&siwZ=jOk%}1#h5$+aRH65h&Ssujo09ZOPm-Lp7LY8!+g}D8d6Usx$%qXzB zuncYj^4CgP=pv-0YmFp78B~N@KS=syv$yeQ65h@AgDK5)Y_4R?wDU zU=g8efMtUC$@3BLfKD7A56`OBRHOaC-i>f{RBnC02EcnyjyjLe+}Y`=3o$YA@<$bWhcjZkP;muluuN>IyOW8ea&ed}hM(%o8x99x(o5ePZFnMj!X) z=iKj`b#0+h?r!Gsth>&{8o=-&B`=ok4Jht(8`L@oP={OJ0w$TsdDjHE8{69ST(#^i z^Bu<0$$jw=xo*tEDIfCRRj$rHj_%}~6<<$IT~&nKzxn$%zgzL68?(kUFStBo-V;PV z=XXI%nI*>G_ECQf^slNwQ`A6*Ck`jmzo-*P?G^yhq~j&VeShDzO#p*g0R(fFW_2Qn z1>VH027?PAQu;!Lvxc6;nQ`*N9Uk!BB!lkrN<#t-hL#LG4Fz4mS&$%b z9H=A71n!863SI<8{IL0>L*B;B&K~J`87JSUhYDyJX)Ucug0Zp_0PQ_x)`n@4F+a0Q z##<440@NhNLxEnXKU?+qGB<$X&ef=FZfQYy6W~Z1r)ZcdC{|a;CiX0sP1yUMpEwj| znjJqhx55522zliL=y}La`XpNe%iI}|!vQQSf+qmnA1oJi?N0|VE?3$TvN)`3v73*# z12ys?X`(D-Qi=*+;CLN985o1r(HQ7~UY6ULRvm9j9I>1n?WKc;HEL0Z4La5q&`oMD zoq6n*n;`{6v*=%g#H9HHy>FhbV?Qz2l`87~H812mVIh${-}{EyGK1qB~{ zcBTG(FtK?|BG5QKd{MxBi?aV?z5xqpS$4QNkJ#8ECMPE;$f*(%5;~yA%TUOSY!kp7 zG$;s(jTHwfG@0a?`1Hn`xfbMm5NlALj+Y$yl#=3v01%{rLo7k2RN5E0pOH-v#Zxpu zFlD@DOY!e|91bbf3aNbzfJ;V`00KsnM6tGR5Kv?fr>|)UWa>a;+RREq4>%tC zTG)wMT?OW~y-y~@-+J*#SWvA6C+p?qm8}2>P38@Q(HZ0s#orD@%ao-MG*ZG<8Ujzc4A8- z^z!9P)b5SNZ&-DAX=yQ`Y(`<{H7IBd|DBq83bp0Y@d7aoNCRZj(6ML@$eFuc(XI@$nDAU?}RKk#bGA`En8C9R8jrf(^G9Q|1% zP8^zRtcbO1C6i&)gQ%y#q5x?URTbH0!X5@Jc5be@7mmkjuOeTM1c}os;^r`SmMYEuAwN`_6I1O9^S5&%I5}3S(7#T zq03Ls`ulvbHf^ogtWwXfp7P3$R6@UHHOwJ;GP%(5`f=>-xMZLGyLC}wF2{B?#~U6ZKl*F+Sh&h4XlVXDYYJok zgO8y`_lo@mI5-0A;3Mz;edJ?2FYTFX;>6M3izx1BzTP7xkU=2AMekX2kWn(T#Wmk0 zUoB0GMQ-SyEO9-H-IG`X2gUSR&eVms1HhSh?77F3bKiEv@;a5_jp?<9Pj+nZ%;6W# zZ#a(?%X2Ss`Lfn)pI46#9Jt}Ou+MKxr^Kd9%#Kv1VPd5H`;txqeB$3D<~cJmRPUL; zD8Kz)ansIz`xJkhdhS=zZWO=j#TotI4Wid8r+D>Dj5K61Vx(*{;sCdUvxP)yY>%M?s| zlv`%p2krd-6$ye}r_~uCth1kwa_6y@FQVCn>vkXJ1uC3UGrCr>NyRnAw_oKK%j3Ce;ljb>y|YJftB zw99LK#eGPMYpL%2Q?<*y??5!SYfalRqoOgQ773j`6*aYPk&0hnpiMLxi1xtz`WFQu zoHn4TVRTI$ozJc$?h^*J71ePdwVYEQCm>|hO-xk3vMtRAMS#2fJH>=r14z?d(o_8~3kTH|ZSV_zp@Z6dH6y4ZvIj zd2udU0WqYfr^f_}2+A9a_!%IrXxJJQ;A?I$h-m{cRo~b+oV$bxJ@?(aC~%s{$?!EG zgd4DsU%}6T2t(lULv*c9<1|Raej^dlt<&n%Ofi$m3`IzWL}$Q9fkm$w)(YS_7W62H zkLF-&VZ?kInzWj_88x4I=tN}9%ow28O|P>4)5;k*2k?tA zY5#nW_f;CG$73l$i4Fa530(R>ib1hgkeb1uO#}!tbBwaf0rto|xl_Bp;9C zae;p+k@tL>Awz33i#_qs3ZJ-4QDp#YuF)H}lR>QYd=Mh!+Pr|oZr*7(@da1j81C<> zPG>1MkZKfiO;7#UD2;v`vnI2IgEB3@I*c}SQ}o|0aK`CRwQ$9KC$?x}>suVjk1dc0 zwGuyn?E*AzQB@PIzryK^<#!FAO{5{;#r*G*lOxz72aau)ynK?9B)$G9@+halsPOX_ zaR~{N;%lSHi_z9?_6`dJuUeWtm0kUp(!T?LEz>?EYLFB0=8e+)6ob>WkJ`Utis|h9 zi>#QGOX7PHp*fC;-_Y~tRn4jYKK3=@C^RO|MgWz&XD)2>JqePfQu2BAc-N^nySc3t z$Am@Hn}bmqE6h{=!1CVtDl#-OVI`i~VTxsN^dUcA)W<84LuO-1ma zuC9%aU2`|bKA?yanScg|g5d!({`jda2dZn&ShUBu79nFoz^@Lvy&y1dUAwU@#e<9T zjDhYpS#!&w^+Nyd(YNH*>fGxzzt)Hfhozib4zHUD%bxwak-KJlR}FG_FV?()^{40_ zXd&>UJul8Q3({$G>+J(^Xp5x!Gu{|e$af_m*g}-cfC!_@tsrK0TkWsNMGIA_IM|tM zPtJFS^hi&i*Rot@dgf271?a-N4iyM2d;#j~Fgq$xir?Rj#nM~)9U}DGQyur)SKB~qcO0i4n=YgOHglK2& zEY>%SBbGnA^T_R=FQhO23BVl9Y@T;57a^>~zE?*TNZ@gtL(S<2BAt3HhvnI*z=~vs zl{ZS3RzlMZ=K&I5^DlUeh8zpO;r;}2$r^%3_}^<6hg$7uUCC3AD)C zZI3~_AlsNvuc&dNPyO+%FgR8LKr@9U$N75bFW2c`=Cq;;Sk%%aTUBWqn)4<3w;0cx zx(qfnM%_@t6Qft$&1I;S9)O1iNf20-yGsoDbcz6xt=??C20&u=?`Q^Q1qgINv!%^a zJE$7>y2jA*_W7}7(JCN5=Mm9I>bnaOkr2=R95TsbRB5hf5FvzT;Os+|L+w~a55YZU+fZgkdSW02!} zS*x8sXk)iGNyC!gl@Jhg_-7^e@u#pkkd|yrZ%i#)38MaeM}gkJ)yQRjzo;SP7(!a4 zu={tZyBuAO^-1=q_23UhUkTC{PQ(w+&$a9|es$umx3gG3FSrmn>Z-$|PydVk_X(11 z+QZY8DBgigw6|3naAN91+Ah}o=|Ki|0&;U1!E+2M5*wkK9Vm0ikOR!i0I3UPIDKI| zR0Z&$T+anUE>Z^*K%cs##`n0wc-~kgocYc--+0PNL!JQ?aRV_o@HU%2P;>d(br>pz zub%=5&Sg0*7}92FU?2+&1tOP#9>q|Kj38K?OJAU2JgkpzVMiWQHQje59Bj2q!8aAvyT@3CT>ydV0dZ z6mvvNN0(I?3;m&44bx`Q-Wwtd=S*WL8Gn~U1^s80LrF$p_Cr6nr_@rHmyc0R7>eN1 zK(68T;;&sJ5G@co80xF~%Y;jyDNBHIgvf+Iv`WT4_5+KqS|7WRV7==}=>ZYoh+61N zwkmCuL&7yFZ=+zu#SfeVOo2M|Yg1FTFwF5)y?pmll$f+MSa`u#`G<)QxGr$)s9R>k zvLhoe$$*DR1>E9+MM9kXKo|>aX=#Nl&Cbq#3=7kBPl}Db<^h_TPM(@2{ha#Kkw;b} zn5A;6wUxt}#foZksg*Hhj>pd9(kQZ3wSY&b^LV)#6@^7~;RdQ>Q(NWXc-S5&FeZSU za~#@6?EMr3X9=ghhJHZtM+0CmOh*hRS;}FE=MpeMb+aw(PCeM#F{RFcae}!l#v+xr zfd36Ea+OzBKXCXM{`V;Xx#u^d@@S5=RvsFLh9OgWiPT^H?d|P&6KR<=zfglme*=|D4P>n~3B%V``!qludxW#X=Ry@`IFNJEM6&b?CEslk4XXs&mt?~# ziXbOmGF%^3_QR+_td{+oz_OLkvVixw&}=NWA%GB}yHO_WBmsns2B0G-$r^-!cV(#B zT>vaM6PKdENK3PshIbAtJ+G|xNL%C0W<~W9@&btpkzz~YL2R0{rd9D{(2qG0Zc~?m042<^KM=Nh8PBy zNIk%yz&ZLLG%l_U+Mz*Ef?(tZ6ytD^X}Gpm`L^0w>C}IO!_=Z;j#>-C2@aVUfQq0r z@d`|iB(!^!tnSVf1~~Y-W=67qr({wdgzvL?TuOBMO9OOq<3ADW#nG026C$O3%V9gtCmKXK(YVs(r}pa`aPTt$RPu~cvl5hfKymY zd#R=*(iK8DAZLtrV-j2?bdOEJ`kz`R0e2)@q~%P3z=4q-PeOCEStuMiqJF!|GI8ud z%gf6;i~``3{r&s5c>YD?-C?GAn+S7wag&F5gZyW-br`;@%6bBPXqP3Z ziJ^2)VU2nbqToY(3&o@6C?JU}q4p?c3Cf_6c-O*+)BAM84feQ*2!+scLR?%LHYml+ zt}W-K_=fwMY^A?=ihRVP{TgUSjBgIAT#sbStmgh*Sia))Uvcimnk&Ag0O-A0!O|F^ z!YnT#9ocG{ZnPxRt|H%>l3Ef510K*=SK>OfMuXwTD>H4eI=)@zDWeFjq~VaQ!dWp-jj8(tbubRZ)t?g3|aeOfn;3nMX@h0a%9c0#Ip@3VcV>s=I z_XhI+2K?_9Os_`tn?X3|3>P*yb6K!>u0J8ySnU}EtP@@;i|GO341FdV;-&(@=?Qp} z4iJG4yeSfIN&tB)>5u#>aQVKBLg62=Qw~nFA2 zM|aGhhgma0!7EeVy^dQz)A4tF{?qrkb%@e0++WuD;}lp-%3#D6xZFlP7Q}LcQq0wm zf+>gpeBrWZ>d}xTZ^R9EMj*WFksFPL?*rp0GPFm^?-GrMjxjkCCSVsjWHRqXsPQm+ z43LgmNTryOq-q6@M_vhgf3&-7a)b)%V(C^V52h3ex6Ny#RasES^Oa38x?Ib>)G~ue zZoluz)dx!Hf$TSNHk5&$-glUwfKe7;wr!*LKyC@2&w-WmUkQuYFp(6!SJM>cJ~oa8 z%^#F`aRoSPFrs1w@&Y)V#b9a=tRqxhT*Q#@VBHW@nxZBOJ?Sg}IU-l<=ij{d0eXh~ zRx-9n6FAxK8FgC91_=iPSnyM@=K&8O2$E3@ucOt!Ofm?=GhS=OANBLBOjla5j8*H9 zCG>-(Kyo}{_Cov*9R@)4fazxnOf!?9#n7EE#?6uVA|K_lvzt{KWEJDpTx4Y2JG86G zy%#=3MG=yb9mECu`rf^F56uGx(;!i(sgx7IQHz{0EZE;;#V)8)}8 z!J|+E);(ol8Q~-%7R}T$9>|lJhXaf}oFS3VSH6q$_GKp`_wx6}qg6RjJrt47;jPUBFePVE_?3Ef3`lyY9RDotro75w{%p9{vpE zY8tITkf(eMjOW$Zx1&Wp&&d`W8Ei%H_<^`7Q8bJ*NCqO+Q_bStTe*dWj!~E+y>K{% z1jy*a4HPFbxg1FJ6jAdW!AHou-TmCF5d+dBjZx37wYi!Wte@zv4rMaB&~nJ;ggc-{ zD;!xN7Jp10gVFXom`Fp%p|<&s6@M{2&>BKRQSF+FLsJQ@7LBGjFN%tia%#?Yiu^HH zAfyv{m474Aj#i^nv@yz|`h6Jd@NqzzQqMyq6Rg73vlO#$!*osga+JilbI-^purQ*l~BMQkhLR_)(y3MnmR>K2nxH zV*g|vp@k=0_wInF#t<;by>EbJ1{V@>9+e z6-8)yDdrUYF4r_Siz4XkelYJ(Ah%a!E;7eRZZ8joAx#%C@xN!}*c(c^`d_K5{Zv#I zmnKVIxE}n7Q~*wA04XBYkUA#BGznsFY92(XrFF~D`tIjSRA5!vJ%#7TKp==7D1LkX z*~i=aH#85wN4>yE$W_M_T`=KE7Z3!jk->|R+vnR!yAk&UVYYuOEd}Ru^r34q;%KZ* zkmBILkuJN5lt@eEay&Ul(^E23VpRqMTc*4fAfy~{R|2H@J-pvD%BD*IqG>$_5!T9! z9!PnmfwGkdk(crqaW?4|aC{6i{9+q)V>M8+F-xwRq9Kh8xh#!lE>HXOvy#MkUJ?$r zK&|=i{{2jz=d<~XBEoR##>*0Wh_xEEU7g0AyJL>Qo*9;jXUWIVgUNyX@TEbXgcL*VhLVG37EG1WmlkR;0Lp|4y2Suy8)ildz1X_7 zF#Qp0MUH9%55 zTT;%L+I5+Mu;>UWy-zsg*k#@rFW(ZXjrWZ>bM^LzzO=yTN{Bc@5#74wJ!C>fL(`(| zBrE&-lKJ|>Y}3R2{hN+b$x%^CUT04)?io>+D*fw@BhBM*(wUCKisCz)Qx#uP@*j!t z=sY4^!wR4+-V@KrR;re=S6Vf{06%JxhWO^dG|S&%P>=`XY{-zASuqVjEW?BGFs#FM z8EM1W-&rb5ngXNAgHtks3^HYFXcv*+@c?Qd6?(J6Hv=DF6f`s>1o7#j5rLN+xC7na zDPm7frO3d7@!j1OhE8GfO%U8a@OAY4KqRCr9~T}FeW@CL-(cLGXGXwZnv0Fb&#*x) zUQbz8FEdc{7M%+ws*s`%a#AF{Dk4H0Ns)pl+QA`ysh!tunJ8POD8D)hJY~?lr9op? z-_Stt1{4Wdb`a{j2FXiwiMrF3AIo7B*EIDkFXszBdK`7d0|oONk4W;pkUk%QU%4FwgxWNG%*JzLHC%5K{5~xK6Q^3(P_)=;yY5Qp(Qamt8eNMo>V>3R~4cELS*gt zZK(EK3uE`?V&pSsJKCpAjWqbc?d?}ee|`Z4p5Szr*%`KY$+lz_U-G1hi4Vh5Xq^la z_1Oq3Dw?5OdfzX-dQ{L!nhcu){b2djP7vdOyPOWU@;AF-aXPtV`wFx$yLv8 zb#c%nd3Umdr5Lh#PN|8@!y~-ZG&Pv|@Brm)^R)#iy2duORdNBwY4&qySr6gd>6w&k zIN@hg(Lq)*oJ(V06l4jDuz5~y%2GrwbJyZqvxi0|i0FO9VO=$q%DkNn_bBLpPP8h4 zvtc}7q-%D<4mR(H!NWD2D(@>}%lBl>kY{KnXlrhn88T;Qg+)f~73S8Ks>V&OWGtNs zwz49NP)6Y+t-n5LxHOay?hPbj=}0V7sjC#^8;XYWFNiW7N(|#YZ4mA>P`-k*J#|t$ z&`pJy3h+X7&X-vS6!|j-o|>gCdu`TFLXua=M@M46YN@YLPm7;Fg54ZC1@ zln=`zddI#~OoCdBuNuSoJ*3p7vpOzr?JRR9`ltK&F_*BPhxRBt>)*%y9mtX_Ma1}pLC3i1t>7J!-{-kOTPWJL2xR@hkI_qGr0 z+i{~H@I^j7h|I+VcMR8L1gbqdsf>2(VpCJ%XoqkTy?QP=0MIW`@QL2vy1r?G5%k4# zf3m8-UVhi!&WJ+x8nP0jYQ+t$wALjXJBRmCqy3*Bf#&idsU&9)KjZ89>w|v+)r4J& zKfvVOr1raCl_VQa(p7$p%cQ(RzQ9rr%pq8DW!@0a7Z06SP7>cNstJrDH$aRuw3g4I zIo7T>T;fa!ktn($z)w6L=@jx7iIvv#Cx|<+U9v<}%)2mI+ygOig;*g@iIjIB zyX{4-E(9Hvqv7+Bh^%*hdb7Uso7GjQJ_L4H^wLMeqK#IZkpms63n=w3rjjIs7s$N? zaB1El`yU|D)uKDQj9tIN@7HpXaboo2_nwjUZX$OID>SlB2Ea=>YO==c=mM{VMpwi3 zogCL|E3=8MOtF!(GzVj6LV{|&tM!k)yVUCP3WnZaa@eX)HZ>x~hf-~c#7HM{U`sy{ zK%DPy?ZEKZOP&h6r0eD)lKSq*H5i`3L)1686r5gRbSd}ZjeA z&K)(_MChM`O9)rcCV@S1w0>gk!fTtJ>#IhFggN2IIK!ESwUW&a2twZBqU&ATuRrm) z3eEZ>T2{DqI;)lAbU@H?9wTvqkDs4woRy68*dJO7C23>{SD0|+4 z(dv(9?vytMh^113YVpV_auu#DDr+Q`2TA$JpUF-4A5sid z5rPGZPH=|@id;t6Hn;2Jb+(PiZr(Ums)H* zz;TN6$LeWJg{i`)9oNpBum3(2nx#g&c3KsM6GdL5!v=o9$qkYvme1CvK`Yd&H1xRB z8lKomQ`)bXnY6i!CWaIgM3GyQ{%#?HH{&+i3Gyw<%!H_Re9mjfwdI4(aTag(xVUW?!Adv?4Jn||>6HHnvirGO*X z`oht=w8SfZE`ehO^UHPa4Ne1ezmGw0`FX8P-w9O>c2C4w0Ct(z@WsHrB0uqkjMMr0 z{?ygUhF_-wVSyQb0t@-+Gh}q3+U;Zzez^spN)h8grV=A~K8@VLBQHm_f{VKs3RT;^ z4QF$8%^B2MsLVvaGT85%X9ZN3v>iXXMMKO^VseDxmUM;Y>Os%9UQaXKG4 z8cY>MB|{ksnP-X=Dk7=Km=Y-&N~X+0k|8oh<{=@&BcTW9+TQn^^PTgZ@2quB>s_nW zdJXq;-}~PCzyJHXepeLlQsqh`ww~n?GgaxKPv)tx#y)YO{K(BK3{* z8t*h38`VD+MX#%$;fU<{=>YkSy3n@dI-U!*DWU$QSLg|&HJYKnFg#A5>CARLOsQpM zTC}C^<;+Gwr9$=rc3Md^q+T^1Gck!Tox+Y0j+|3{a!_lih{uM9U-Ih2L;987%laR@ zOhez_??qpr#7f+=a_E06-8mM&5s&ZxRP@-K$!N4Fnmn|Y!s>DFqO@_z6YU4Z)jJ=% z@_ql9dRQ%=z9>IPG+Wo>eA4R$*`vGVrdKs;pQbaCcC(ip5t>&0uKKHWzupFyFTd5E zz5butpR^3ZA)HQ)l(tmGE|t(v&;o6DY|!w1#INX{aWM75KWGCSsNHz-iYX6++JjR|3HhsViAroS40H#OW zb>0BJC(|8l$8qoo-cn1JjbR9F9fUz2BM;@}<$YRYyRgDG%oz`rU>Tk_Htpid$=m0} z>CnW-NF-l_9@2fkGIzSVh9C3vD(lv)AYay>`&xD=%|b3YiZN$sw&AC9sbhnl`j=`6 zkC~AAOO`qFBcJZ6t)%N69o0a$@Jya-`qhYPvx~%qfZqK_C+sS^(iHk!wisS=^G5w` z`}39EDMZTrT~P#^@maN7e_gK4 z1X!;)c5zWX?!=$nw(^JeE}25;l$GO4)%KlhuFItqTYP5K|J z7}cB?3f*Myg)x{1m%Q2A-Qq_z74WamW{GQ5BKsERQ#V65sDyQAkaIR(aj+@19t**at`OMs3xbYQdx z4Qm>7VY|N{cs;dzudvcex}aoVjkiW^f9^SC-gGfqre!!jMT;AfI_%_MQ>(ncJJJ5= z>~m5otwgC9NWDPU7Bs-dKVdZZ4OU-T1GDp;TlH8m>17oSPW@FTfjN4VD^vt;#o5kDfYm;?9CiL)&LQb3SjXpd) zss`>VA@vU;SG>RGr}4IXKksxyhQUHzwnRoAlZ8QQq-6ZkddYbYWq0@B#?J=Pi)nM2 z>2XBX^utJLo34;`mE?=40v<{&i_u{4y+~(kgX&?*LBrlQ$Bi-iq-H;|W;*(aIjXLa zW9p?QJ{7r5{n$s2e-$>g^Ls$wqQF$E@pi~@petu+voyYua{YMDBg)UUVFX+|xwrF* zOi7hPR>)&ZL9wF9ET+tO?R;C5Qon@u(m7L?N1B%wo6>}PE3ok^L`+xoMtH=jGDY`1 z6n#p*I}F8aIW;ZXriq`nD_8DRxVwuQG(6b0WUq=`#eRCgusN&O-y!%U-HXP@d1fxV zlsW=pvO0qN`OJlMNh6HD1#-KOtvszR0vp-ZqEEap`1^6rw|xCVrrlG;4lWZ3ymEUL zGuCJDuH3<>d}P(i0EXdix0+YlBIFRt&eG3#y#HHi;JlqY>UDt|p00zxPV1k05Bfyt z9We=}Ae-x@uZ;hs+WrW3pybiT4UNtgOC;p`oew!lgdWzSJK9RrI&FF@sw-%IoK%X! z#`4KAZ$2hrL9uyyUV~8n8P?S67kP>!96FW>z4$JzG$lPk*TJo?e=H0)KKuEV!?jZO z(~Lb@rlb#LRm-T*lC+0Uu3uEQ%FK7Ie64SO>8oz4ybH^WZsl0_t1q+>9kj)bRRyQ* z&Y?=`IlZ(Un#h}@XhMqq(syR(mE&q>o0CUI>OY(^jrH9!T;rR+Wtg{OkgkY+&D~82 z=db+;xXkv@a(F65<}SH{yPp*{$eQme9F?KnpQRe2&Q}+;+RFx`M!ZyV(u0Dlzo|r7 zR7|J)t1ZLq%C!IY9xvZ~=i{$e&G^bZyAUEk%IR}@UO!gaSnqU@8>ELI?U~2k3$7J< z>OZfC1XNb}UgY7`8Z?U%%hSI!l9R^Sz$d_c!$0S96^Ag{mnPL^^2t`U1x%0sOx*L8gFlff`eLwtRDD@dDgBjFtGvaocRH+JH$Ix=j9jH@Rmbf5Mp1heO2=`HE`TMmEuI3Yb16MTYCl?JmzvYQ&wd(}u zuA$WvTkkBBqiT15*TkUv46C^R)S-&m4%*p+>FekVUYO-x(-Ki2L-F!o&G?=86xUka zd3#fNcK+QRJdhOm^Mr&{T~66;hj_j!Hg~4515~LaM{T2Qrmu64E;4(bpG+Ox^~zkY zJ%BvSc)D#3k275*l&todv0clLRGl!%a^D@uY;SFM(s?CaJ$sV7*($z5@k+1wZ%O$< zRj#fBY^5jbN_F#hxX#KY8id%B-H-k;PkY9OYn@f?cMqq}b5PxP2lZ82|Gq@F7iC8) z-=5h#DihD^_tu}{K{?63FgGU|rRbw;u>J~d56fw(1C5VnjU_T27FO}@qph*Hek6zJ zj;ruz}OzXvN_$!;im0AiMfr5m!%n$!XAdPBpu#(FnWIYCe zw21V3E{Eup;}p4ZmK~9ED*6xb86Q|e^EMgV`DX%Kt3F(v^`+G{+TVXR2nc<^)lI|; z9;k0BbRVl3tCWxGeE;W9;w5Ud|2FzlzV{+l^U`hJ={0|jPWi$|N`O(NO+ZdgMRj<- zTj%fR_ku@!|Ye!}_dr9^O z_$p|1Vu9IEk;b{<>co5d9go;043|)dA@+h3R(rxwW(Kcua47-ZuE|?yCNwU%zuwG{e`5K46i{VRBx$$3MrO6%%Pa=^e4L*0-Q& z`(WdC0Zy{GnL>Svo?n0Sm5N!Xa{^4EyGAGw%Q`0Wl*8ULq?g4k6wNM%)lzfhGn=RU zHSbXQ+Ui}8DgNg!w{voLETiql9DC@F2FBB|ht+0j6SmBhMdqt`c&&qO9`1EH1~M3* zUtXWsTD*{Z<88ZSAhjdkr_N=e>l2^B@%O`qaj9%G!{5}`=#o`Nu*PDS9y~#YS$yWj z(_7iK-;PqKd7s$))6?#olh(1`pt|7X$q+a8x!8g7x#Rd?0=2IBNmzO7 zT06VBYEc2f5*#B8Uf2HI7V)uUs9+c}rnpssWp#vc{6gG^FbOLrc@4m{4l&s7&FQ!hy3jITenllKM1)g-+nd zs`$&D8kh2rNv~%vlH8;yT<9Y1rnS(_RXLkVp*wFKQECyhU)%d4XKQAwycbn*QDkY|Ibd*tLN~p=1Q zh4#d+j(mYL!nXEs&&j7#Qk$o#e0e?N<5bZ)Ut>yY$(IMbFPkibWH$+Txj&bzC>mV* zqBu;YJsj`qI(&xy+8c>_1=}8*dT6~FJCs{W#gQqw{xP#J8Fy9`AB;<#5o?{zciZON zS9ssK&p-d`78MDbN$*cio1Si_KSj5gR#>7Rt~h=|c%|o!(d#u9>1oCt3Qu!~TeAgD z?#56D-GcbPT026;Iz8^cV?u|$lo5@+^*c8^zU0*WqZ$G?P`uroc$t}R1Jfe2yVvi5 z=$6NeeJe}PPRSi;-1KzKq1`oJDtr9W=DPZIGv5Uq@kQggCjrvtG)G+l!(YFRdYYcI zx{NAclQ0~dGbTT^Le7}`*_g6@eb>mEBeGFm%vqa8qT5%wwW_4{@+=F{;4L*cba2&c zoO*-#|3Ra#@5~u~FTdxw2cB9|@SL4+=~kv1_wMaBNUuAm1|@nCTs3PjB-&; z@ASk}tQu8Jw+tl+n&pl2&oBbUwS`owIa{YvyhNyrwY!C6gRh4hC z&G9|u#ZYk9zt$*Sj9lcuuR&D&}R z($pJ`4CTJA=tXV(<9H(Tse}5L0%anl7jJVuuAFsgUawFuM$uW=Qe7W(aMD2L9cOZm zicM+hT9M`&etwC(Zo>nq`))SUjU6-n#tVQ7xi^PSpIe~${EBt!Tl+=fCO!oX)s$Y1 z72VhOIleew#y116goIM*TfH}n>jyOFM~C~UM!MrpOK!#}14E=t-g1q|hLpdYPt=2&<`r9%fV6zA@#EuO5-Exj<i*q&HG_ku30Gc!npO0C_o^=5Vs*>_`>&x~J+=-v+S;|3 zm{xmTAEj3vgy{1mowCIM+gUXI!Z2H(7iXss`wI`Z0IbIh<{$4DI;@cO=@uqe_$zDuUaItgbt%_Il!)2Fmm;EZ< zwd|?P6?%5=Hs0V*=|RR?y`8sj>F8lA;3W$uOxJClJwlN!g(gZ&TBhg6Ge&2zB|wAw zWZV~W;_{q0BwnlyG1D1w$o@0b{@%Px5U1$2{N0YdOtmy9_O%uMs zov_kkrhj!YSAnH`RO?TJgAQm2)GEn6Yz{R6Il*4;eHucXh9mZ{%v77s+jw-y-UM_TFwYJ=W zgq6xi67z*`#Kf<)s@e2)*A2;9F=a)m6}#)l-zHq_$vduBcQi~d(C72MAeY>j#g{rC zb{Br)E`-7A6GIrYcSEAqAQ-8{cL@C6IKgK?Q_CX02t_XClW6K{ets zlmcfb^e~=hbhhY z8O`|GiZmSS|M`1jyGVO9|41Iy>CY=DRknt$@J1wvAZcO2`$?dhXerjeHP<5GKd4pW z`gNhC0WX61&g;%Od5!?ZP$)myM5q7++OZDnUt9 zA;6a-S6G?MO!z?B3F^ilZmn68bHjm0_+aCJUlTgVy0Z&_ZpVSqpa2XW4PiK=X*&tU zpg+FSXagfU`TfA#B>>DsLrkfMR8>j92m~d+-dMJGj?S){7N-e4yui``^i7S1!^|Aj zv?exeF?H42)1^17C0h$Kza{J0OI23Ye29p=y<^+jNI{k@dzHRE7CRH3+!{`KBYE!a zWt+;a7b&5xT(UD8WL@ol*_ra~e_m)1)^8JSep=z<QB zo>40i?i^>jAii`2;NaqwkT4KjYnHB;_Mpp_n@8jB<1iN{AuCs-uItx_Qgs(Rc!Xw# zJ1L1g;UkpEFp4CXZ3orINkix(WxVWX_l?Gpfa(U$(grsC7aAtvI(u9uo>$+4TItQ$CKsiz`zQTK ztrjXRNba2~8DmM{=-W*(OjS!dvE^R-XI}eV4&Ht2mX>bsV9+%WJD$*<^grmtshY?X zxoy+Xn0<(5B@0U_m<$gd^hqiL$@t>M3xVd_ckbl=m}FRlc5ltbjiYJm=<5cw58&Bv z)D#8e4EBM8!F-C#nVEA(oO74~4J`3xAu?nG4r=*w7YlOg(Af0v2MYYx?)xMwYcHrM zX6Tkr4L7sV09pZj(2})u813`xuxL=eYHPJ7?f`lS!p9}@5Bx-WXtOJhKTk+_oYpsyF5!kYVr=CK2c_c?yptN)epgfHA z72o~;84zZdwC(zXy?(|t_aY*G_8mJ0)ZgY^yF$Ny{mQ&ZbLBrh*1|RhuZr&>%eqb- zQB$MaBqUT0q6x?-{m0bQw#dk|w3^EJR@x5Ecszvb1|Zlil9H>5e%t<-#y=-WL{1K7 zrFoe4%m3(#2ND|u8Uky=sX$M6cZ_an64ST{DD21c-9e8$VFsg+2vs6#*?$+X5x9)* zm3;SK-zd68iWgIH6}Nbn)E!H=!u}}WcYrsp2Qbk*?Bvh?^_PhVs_eZ^z9X9p`2b6Q zV;6`&d;fEe8jU25S_s+-{4IP1#&Iy*B=TYn?<{o@rd2u&1e5d0GF@|!>U_V|rx_po zOGUs5pU22f#0n`x7zTh3$fuRJISg}JT3VE^NIzC5NHOnW{$^lE?JxvSzOy*>FLN#2 zW&hi*5prA^MW; zQ$G&i{VKHwjlT;Xv*~7_>AK_Zq#6J?&--l>u>&oGiqPK^s{{c$5vvn8p@j4$lm1OK z3q~b>XL0@P)o{-+wuIUB_eO+-93af(eOKK>D4qWmM4~N>OTkqVkbHAo2m#WIoy!aa zGAu1Q;)zmHvX$w8Rnhg#1FtjUPWrSs z$?mTU!g*DR@ii5h6z_vP!Td@!xcESD(?J7dt;#7`x@0!%~0OcV|92WcTvWzla&C#dwgW~r+dCbFj?~MvDTUd-P*q^LRz_BvZBQ+fOYtT^#!UmUvm-q5O5}$a5nRN+CGCHY7P0d+{O$ zMny%vx#G>D&Guy75M<{xIw|_C#&ZxkFK1yPrV&ENgaX(6fv&*6hRdY$@Ar`LOFR%b z(gznF)kNggRuXmdOm!8MvHi*RYKLIlT>Rs;2uI8W8(yxf?kaLAgYvH9n{b5AS|J5? zJFc=VxF55`@)axMAbglM#XEv4WFn+yN`zWHkZDk6-@JKKM%`=lUGs~R&zYg7>_HXn z*s5)gb8Qr$@Yc~`Ss~C#(^%aT!It1n5OD(_>0WVeDX#j93t0&=gWLBa9YVO^SsjzKA?T4*q~HXhh+tEk zT8-(%KIyRa_y0nwK-9=rA=m~sZvzOF{zG_-5>r{KpZqjw18(3JyY|Ht z^9EZH%xs^YW}M_;XIF+1t2N7pAHb}>fdNprd(uc)3jSFmoJP-!=s&osq&kw0-X_+J93HP2LPEZ?>(&_2~2HjCinVsM^}5ft6v7vDv=x>GS8^n9cBpo2!RQ7VBkMM-xJM zFOZ{>5c6LFd91baq2XgMP%~8l=q3O2B7oMaAQ%NgEYgc<7qKbjAZ}V=@RZKrj@^YS zn+qXSl0>J`_cArA(E=pH7sd)8w6ivdme^^isqF%N^Acj!zR(2X{n&s|!Hmw?IS^^M z5P?>X7)m2xXv%)HWu=|~m~xA#XjQ>oke<0Ptw_O2cV#J$54-R{sIz2W9p!XP&m0&S z;0D4q@&u}vi?C<2DpfGJs3Kpm-u3Tj)?Lh7TmVJxUCQ`DZrEOMV|w}?aX6=ECLpyB z(L;e)4@5{d2VsT=TBhWb!!Z&Q5*>Y|Qx(e-LrsjLC01x2IDoFj{XRdGZSd3PuCe~y z9~%RM7-C0-*P5>!k1G(c7aoLhl%tZ5{<1X;-8(I)MwY9xC{W^jq^jri%c6t_hq2=IITio>X z5?PiyriG2eHKqd_xZ)f z#)jO#fAZ2*UAdI7xpNmcl>MFO;pexR`t`kSoI=?JeNiA8XMSZDgnOH^_k`j`2|J0C zTJeZ%yd@-}|6eJ){iIS*K62#N+p6s+{>k)^dmkt;ioyh(1K4}-kZtjb)eANjK^=|CTi71H9M?TNifN?_I4Uz-QrJ5K;GEC`=);R9@h}%Sa-8I6 z@BD{RPQd8s=@9k;x*^{N2mAWQ2~rbj002}Vc}fv(m3OuLd#pAHg(lUBii@*)Lv=~$ znS`Q*x*5ev9}2L(zRFN=^uxTpX@G~S!E!&+M*S&Q2L_wH)$r=U^QdRyfyMyIMy&yNi5Mbbr6nD*f1yoC21d=K-L~@Ab4s*bS1qq;)231b_g!0 zM6Fmx5(U@2RFRY2E*jtvux8lw;x$b`{f!AP1iUy~xZ((XmH76__oMVAJ{QhhZUk;b z!{+=Ln{)*HsS>FtD5=LVU6k4rTM8CL@-skK?)Mob#r+BvmWzOnD1hZb=5`V=4Bv4O z!RJHgg&JrdGA(J-TCH?a4WdEEihw^~5@Z4c&j}TB2mbDXq4X-*IPrOoA0Y9mDA14K z0|m4fmR*R078WU9ZxE*ktgAu%wE<&Q4rI#02DRd-7jN@+x+6!FXBsTys{fn5Cu_%tK zSlZOb-=4rtlN(9IYZPYXfObV7=v^HP`y?c4L5jX_heyZp(hgc!&h{F_f|&vI(z#H8 zjYPScM80EjKW#56slAvnNq99G%zm&!)z(&4?xa$wOKD_&AzoH^f$pN97sx^awbj>@ z^KB#_ceH`PXGvDr$C{cw|4zE$2&2W4#F_jG&%PWp5N|?tlxzb{AO?PGqDJh#@2Hd= z^?qSXz-R=^(s|pz0w=E}F&+PK_dDpd$g8`JPV_GLu!zqNWy^J{b}Fc`D4)ND{h6G6 z3P(np#L+J`yubTNrjvj}O{d(FT+$6Ie9g*Ev~`G(wb=CSW>{=peKP2wzxv zuPXAUlk|Sa6ps1K8z#qKo*2hHAxTSLz`DlN=7!xpu|?a8FXuq|sT^s?A@jv|z}Mg3 z@QotzhWoSeV_ZtRy2t$G_%%9O4HPuq7$KK-J0>*d#V5~}QG9)U?JzQx8v^D60}G>{ zN@TC>qDDYOiX*AzH1NffJ{MsHkqwZX)6Xva7_hxx!1j8t^KS;W_ykr$1JCYITb2Z7 z1d~q>grA>m#@8UKWdjx-`Fs3NK27GnMGTJZcc&y~=RFEr+3XX}4NdZIGlvObhn)ghNbj3&`eTprx3jjTN|I zrw{hC9$K9T*%Ut@OW-l`7-6X==Q7w9v2VeitNCGzYcqH3c#o7k&Y7&fsb?uRaVGRJxw*vxtZ*Pks zKo-tql8;5g!t!v|gD-1U8pZ?q7IyjTi!~(D2~8OVAkuS9#!PTrLUI{F=9bzQ;#n0Y zk%(G7>^q%^K>rP>Dq7s!-K7xyMF^eH6}w`iOu~Qg0r(Ncyb7BZqLxKrw~R0v5LQ53 zvA2VQG7Hi1ICDW-X}*ct9Reuiqfwg<8&TasE$eboA9Pe8reF3Gf01 z{mA$kC3HqutG;_J&SQr*8SF*vy?3+b8B#C^T0wnk#m#PBu-p k taki, że |A[i][k]| > ε + Jeśli taki wiersz istnieje: + zamień wiersz k z i + pivot = A[k][k] + W przeciwnym razie: + zgłoś błąd (macierz osobliwa) + + # normalizacja wiersza pivotowego + Dla j = k do n-1: + A[k][j] = A[k][j] / pivot + + # eliminacja poniżej pivota + Dla i = k+1 do n-1: + factor = A[i][k] + Dla j = k do n-1: + A[i][j] = A[i][j] - factor * A[k][j] + +Wyjście: macierz w postaci trójkątnej górnej +``` + +### Złożoność + +- Czasowa: \( O(n^3) \) +- Pamięciowa: \( O(n^2) \) + (tworzona jest kopia macierzy; możliwy wariant in-place) + +## Eliminacja Gaussa z pivotingiem + +### Pseudokod + +```pseudo +Wejście: macierz A ∈ ℝ^{n×n} + +Dla k = 0 do n-1: + + # wybór najlepszego pivota (partial pivoting) + max_row = k + max_value = |A[k][k]| + + Dla i = k+1 do n-1: + Jeśli |A[i][k]| > max_value: + max_value = |A[i][k]| + max_row = i + + Jeśli max_row ≠ k: + zamień wiersz k z max_row + + pivot = A[k][k] + + Jeśli |pivot| < ε: + zgłoś błąd (macierz osobliwa) + + # eliminacja poniżej pivota + Dla i = k+1 do n-1: + factor = A[i][k] / pivot + Dla j = k do n-1: + A[i][j] = A[i][j] - factor * A[k][j] + +Wyjście: macierz w postaci trójkątnej górnej +``` + +### Przykładowe wyniki + +Dla macierzy wejściowej: +`M = [[2.0, 1.0, 1.0], [4.0, -6.0, 0.0], [-2.0, 7.0, 2.0]]` + +- Eliminacja Gaussa bez pivotingu: +`[[1.0, 0.5, 0.5], [0.0, 1.0, 0.25], [0.0, 0.0, 1.0]]` + +- Eliminacja Gasussa z pivotingiem (bez normalizacji przekątnej): +`[[4.0, -6.0, 0.0], [0.0, 4.0, 1.0], [0.0, 0.0, 1.0]]` + +### Złożoność + +- Czasowa: \( O(n^3) \) +- Pamięciowa: \( O(n^2) \) + +--- + +## LU faktoryzacja bez pivotingu + +### Pseudokod + +```pseudo +Wejście: macierz A ∈ ℝ^{n×n} + +Inicjalizuj: + L = macierz zerowa n×n + U = macierz zerowa n×n + +Dla i = 0 do n-1: + + # wyznaczanie wiersza U + Dla k = i do n-1: + sum = 0 + Dla j = 0 do i-1: + sum = sum + L[i][j] * U[j][k] + U[i][k] = A[i][k] - sum + + L[i][i] = 1 + + # wyznaczanie kolumny L + Dla k = i+1 do n-1: + sum = 0 + Dla j = 0 do i-1: + sum = sum + L[k][j] * U[j][i] + + Jeśli U[i][i] == 0: + zgłoś błąd (dzielenie przez zero) + + L[k][i] = (A[k][i] - sum) / U[i][i] + +Wyjście: macierze L (dolnotrójkątna) i U (górnotrójkątna) +``` + +### Złożoność + +- Czasowa: \( O(n^3) \) +- Pamięciowa: \( O(n^2) \) + +--- + +## LU faktoryzacja z pivotingiem + +### Pseudokod + +```pseudo +Wejście: macierz A ∈ ℝ^{n×n} + +Inicjalizuj: + U = kopia A + L = macierz zerowa n×n + P = macierz jednostkowa n×n + +Dla k = 0 do n-1: + + # wybór pivota (partial pivoting) + pivot = indeks i ≥ k maksymalizujący |U[i][k]| + + Jeśli |U[pivot][k]| < ε: + zgłoś błąd (macierz osobliwa) + + # zamiana wierszy + zamień wiersze k i pivot w U + zamień wiersze k i pivot w P + + Jeśli k > 0: + zamień odpowiednie elementy w L (kolumny < k) + + # eliminacja + Dla j = k+1 do n-1: + L[j][k] = U[j][k] / U[k][k] + Dla col = 0 do n-1: + U[j][col] = U[j][col] - L[j][k] * U[k][col] + +Dla i = 0 do n-1: + L[i][i] = 1 + +Wyjście: macierze P, L, U takie, że PA = LU +``` + +### Przykładowe wyniki + +Dla macierzy wejściowej: +`M = [[2.0, 1.0, 1.0], [4.0, -6.0, 0.0], [-2.0, 7.0, 2.0]]` + +- LU faktoryzacja bez pivotingu: +`L = [[1.0, 0.0, 0.0], [2.0, 1.0, 0.0], [-1.0, -1.0, 1.0]]` +`U = [[2.0, 1.0, 1.0], [0.0, -8.0, -2.0], [0.0, 0.0, 1.0]]` + +- LU faktoryzacja z pivotingiem: +`P = [[0. 1. 0.], [1. 0. 0.], [0. 0. 1.]]` +`L = [[1. 0. 0.], [0.5 1. 0.], [-0.5 1. 1.]]` +`U = [[ 4. -6. 0.], [0. 4. 1.], [0. 0. 1.]]` + +### Złożoność + +- Czasowa: \( O(n^3) \) +- Pamięciowa: \( O(n^2) \) + +## Porównanie czasów wykonywania algorytmów + +### Eliminacja Gaussa + +Obie wersje algorytmu mają taką samą złożoność obliczeniową, więc zgodnie z oczekiwaniami wykresy czasów ich wykonywania się pokrywają. + + + +### LU faktoryzacja + +Tak samo jak w przypadku eliminacji Gaussa, obie wersje algorytmu faktoryzacji LU mają taką samą złożoność obliczeniową. Powodem rozbieżności jest różnica implementacji między nimi - wersja z pivotingiem wykonuje się znacznie szybciej ze względu na użycie biblioteki numerycznej przyspieszającej operacje na tablicach. + + + + + +--- + +Wykonanie: + +* Język: Python3 +* Podział zadań: + * Faktoryzacja LU z pivotingiem i bez pivotingu - Maja Byrecka + * Eliminacja Gaussa z pivotingiem i bez pivotingu - Michał Kowalczyk diff --git a/reports/resources/gaussian_elimination_and_lu_decomposition/code.txt b/reports/resources/gaussian_elimination_and_lu_decomposition/code.txt new file mode 100644 index 0000000..4b327a7 --- /dev/null +++ b/reports/resources/gaussian_elimination_and_lu_decomposition/code.txt @@ -0,0 +1,380 @@ + +========== lu_decomposition_test.py ========== +from __future__ import annotations + +import numpy as np +import pytest # noqa: F401 + +from matrix_calculus.lu_decomposition import LUDecomposition +from matrix_calculus.matrix_multiplier import MatrixMultiplier + + +def test_lu_no_pivot(): + matrix = [[1, 2, 3], [5, 6, 7], [9, 10, 11]] + L, U = LUDecomposition.decompose(matrix=matrix, pivoting=False) + assert L == [[1, 0, 0], [5, 1, 0], [9, 2, 1]] + assert U == [[1, 2, 3], [0, -4, -8], [0, 0, 0]] + + +def test_lu_with_pivot_singular(): + # Test singular matrix (determinant equal to 0) + with pytest.raises(ZeroDivisionError): + matrix = [[1, 2, 3], [5, 6, 7], [9, 10, 11]] + LUDecomposition.decompose(matrix=matrix, pivoting=True) + + +def test_lu_with_pivot_correct(): + # Test correct decomposition + matrix = [[1, 2, 3], [4, 5, 6], [8, 10, 10]] + P, L, U = LUDecomposition.decompose(matrix=matrix, pivoting=True) + L == [[1, 0, 0], [4, 1, 0], [8, 2, 1]] + assert np.allclose( + MatrixMultiplier.traditional_multiplication(P, matrix), + MatrixMultiplier.traditional_multiplication(L, U), + ) + + +def test_lu_example(): + date = 8 + 24 + np.random.seed(date) + matrix = np.random.rand(date, date) * 10 // 1 + # Make sure that generated matrix is not singular + matrix += np.eye(date) * 100 + + # LU without pivoting + L, U = LUDecomposition.decompose(matrix, pivoting=False) + assert np.allclose( + MatrixMultiplier.traditional_multiplication(L, U), + matrix, + ) + + # LU with pivoting + P, L, U = LUDecomposition.decompose(matrix, pivoting=True) + assert np.allclose( + MatrixMultiplier.traditional_multiplication(L, U), + MatrixMultiplier.traditional_multiplication(P, matrix), + ) + + +========== matrix_multiplier.py ========== +from __future__ import annotations + +from matrix_calculus.utils import _next_power_of_2 +from matrix_calculus.utils import _pad_matrix +from matrix_calculus.utils import _strassen +from matrix_calculus.utils import _unpad_matrix + + +class MatrixMultiplier: + + @staticmethod + def traditional_multiplication( + matrix_1: list[list[float]], + matrix_2: list[list[float]], + ) -> list[list[float]]: + + if len(matrix_1[0]) != len(matrix_2): + raise ValueError( + "Invalid matrices sizes. Given matrices cannot be multiplied.", + ) + + n_rows = len(matrix_1) + n_cols = len(matrix_2[0]) + + res = [[0.0 for _ in range(n_cols)] for _ in range(n_rows)] + + for row in range(n_rows): + for col in range(n_cols): + for k in range(len(matrix_1[0])): + res[row][col] += matrix_1[row][k] * matrix_2[k][col] + + return res + + @staticmethod + def strassen_matrix_multiplication( + matrix_1: list[list[float]], + matrix_2: list[list[float]], + ) -> list[list[float]]: + + rows_1 = len(matrix_1) + cols_1 = len(matrix_1[0]) + rows_2 = len(matrix_2) + cols_2 = len(matrix_2[0]) + + if not (rows_1 == cols_1 and rows_2 == cols_2 and rows_1 == rows_2): + raise ValueError( + "Both matrices must be squared matrices of the same size", + ) + + n = len(matrix_1) + + if n == 1: + return [[matrix_1[0][0] * matrix_2[0][0]]] + + m = _next_power_of_2(n) + + if m == n: + return _strassen(matrix_1, matrix_2, n) + + A_pad = _pad_matrix(matrix_1, m) + B_pad = _pad_matrix(matrix_2, m) + + C_pad = _strassen(A_pad, B_pad, m) + + return _unpad_matrix(C_pad, n) + + +========== utils.py ========== +from __future__ import annotations + + +def _zeroes_matrix(n): + return [[0 for _ in range(n)] for _ in range(n)] + + +# sub_matrix is a tuple of the form (matrix, row_start, col_start) + + +def _add_sub_matrices( + sub_matrix_1, + sub_matrix_2, + n, + result, + result_matrix_offset=(0, 0), +): + m1, r1, c1 = sub_matrix_1 + m2, r2, c2 = sub_matrix_2 + result_offset_row, result_offset_col = result_matrix_offset + for i in range(n): + for j in range(n): + result[result_offset_row + i][result_offset_col + j] = ( + m1[r1 + i][c1 + j] + m2[r2 + i][c2 + j] + ) + return result + + +def _subtract_sub_matrices( + sub_matrix_1, + sub_matrix_2, + n, + result, + result_matrix_offset=(0, 0), +): + m1, r1, c1 = sub_matrix_1 + m2, r2, c2 = sub_matrix_2 + result_offset_row, result_offset_col = result_matrix_offset + for i in range(n): + for j in range(n): + result[result_offset_row + i][result_offset_col + j] = ( + m1[r1 + i][c1 + j] - m2[r2 + i][c2 + j] + ) + return result + + +def _set_sub_matrix(sub_matrix, other_matrix, n): + m, r, c = sub_matrix + for i in range(n): + for j in range(n): + m[i + r][j + c] = other_matrix[i][j] + return m + + +def _sub_matrix_to_matrix(sub_matrix, n, result): + m, r, c = sub_matrix + for i in range(n): + for j in range(n): + result[i][j] = m[r + i][c + j] + return result + + +def _add_matrices(*matrices, result=None): + assert result is not None + for i in range(len(result)): + for j in range(len(result[0])): + result[i][j] = matrices[0][i][j] + for k in range(1, len(matrices)): + result[i][j] += matrices[k][i][j] + return result + + +def _subtract_matrix_from(target_matrix, matrix_to_subtract): + for i in range(len(target_matrix)): + for j in range(len(target_matrix[0])): + target_matrix[i][j] -= matrix_to_subtract[i][j] + return target_matrix + + +def _strassen(matrix_1, matrix_2, n): + if n == 2: + c11 = matrix_1[0][0] * matrix_2[0][0] + matrix_1[0][1] * matrix_2[1][0] + c12 = matrix_1[0][0] * matrix_2[0][1] + matrix_1[0][1] * matrix_2[1][1] + c21 = matrix_1[1][0] * matrix_2[0][0] + matrix_1[1][1] * matrix_2[1][0] + c22 = matrix_1[1][0] * matrix_2[0][1] + matrix_1[1][1] * matrix_2[1][1] + return [[c11, c12], [c21, c22]] + + else: + sub_matrix_dim = n >> 1 + + buffer_1 = _zeroes_matrix(sub_matrix_dim) + buffer_2 = _zeroes_matrix(sub_matrix_dim) + + a11 = (matrix_1, 0, 0) + a12 = (matrix_1, 0, sub_matrix_dim) + a21 = (matrix_1, sub_matrix_dim, 0) + a22 = (matrix_1, sub_matrix_dim, sub_matrix_dim) + + b11 = (matrix_2, 0, 0) + b12 = (matrix_2, 0, sub_matrix_dim) + b21 = (matrix_2, sub_matrix_dim, 0) + b22 = (matrix_2, sub_matrix_dim, sub_matrix_dim) + + m1 = _strassen( + _add_sub_matrices(a11, a22, sub_matrix_dim, buffer_1), + _add_sub_matrices(b11, b22, sub_matrix_dim, buffer_2), + sub_matrix_dim, + ) + m2 = _strassen( + _add_sub_matrices(a21, a22, sub_matrix_dim, buffer_1), + _sub_matrix_to_matrix(b11, sub_matrix_dim, buffer_2), + sub_matrix_dim, + ) + m3 = _strassen( + _sub_matrix_to_matrix(a11, sub_matrix_dim, buffer_1), + _subtract_sub_matrices(b12, b22, sub_matrix_dim, buffer_2), + sub_matrix_dim, + ) + m4 = _strassen( + _sub_matrix_to_matrix(a22, sub_matrix_dim, buffer_1), + _subtract_sub_matrices(b21, b11, sub_matrix_dim, buffer_2), + sub_matrix_dim, + ) + m5 = _strassen( + _add_sub_matrices(a11, a12, sub_matrix_dim, buffer_1), + _sub_matrix_to_matrix(b22, sub_matrix_dim, buffer_2), + sub_matrix_dim, + ) + m6 = _strassen( + _subtract_sub_matrices(a21, a11, sub_matrix_dim, buffer_1), + _add_sub_matrices(b11, b12, sub_matrix_dim, buffer_2), + sub_matrix_dim, + ) + m7 = _strassen( + _subtract_sub_matrices(a12, a22, sub_matrix_dim, buffer_1), + _add_sub_matrices(b21, b22, sub_matrix_dim, buffer_2), + sub_matrix_dim, + ) + + c = _zeroes_matrix(n) + + c11 = _add_matrices(m1, m4, m7, result=buffer_1) + _subtract_matrix_from(c11, m5) + _set_sub_matrix((c, 0, 0), c11, sub_matrix_dim) + + c12 = _add_matrices(m3, m5, result=buffer_1) + _set_sub_matrix((c, 0, sub_matrix_dim), c12, sub_matrix_dim) + + c21 = _add_matrices(m2, m4, result=buffer_1) + _set_sub_matrix((c, sub_matrix_dim, 0), c21, sub_matrix_dim) + + c22 = _add_matrices(m1, m3, m6, result=buffer_1) + _subtract_matrix_from(c22, m2) + _set_sub_matrix( + (c, sub_matrix_dim, sub_matrix_dim), + c22, + sub_matrix_dim, + ) + + return c + + +def _next_power_of_2(n): + return 1 if n == 0 else 2 ** ((n - 1).bit_length()) + + +def _pad_matrix(matrix, new_size): + old_size = len(matrix) + padded = [[0] * new_size for _ in range(new_size)] + + for i in range(old_size): + for j in range(old_size): + padded[i][j] = matrix[i][j] + + return padded + + +def _unpad_matrix(matrix, size): + return [row[:size] for row in matrix[:size]] + + +========== lu_decomposition.py ========== +from __future__ import annotations + +import numpy as np + + +class LUDecomposition: + @staticmethod + def decompose( + matrix: list[list[float]], + pivoting=False, + ) -> tuple: + if pivoting is True: + return LUDecomposition.decompose_with_pivot(matrix=matrix) + else: + return LUDecomposition.decompose_no_pivot(matrix=matrix) + + @staticmethod + def decompose_no_pivot( + matrix: list[list[float]], + ) -> tuple[list[list[float]], list[list[float]]]: + n = len(matrix) + L = [[0.0] * n for _ in range(n)] + U = [[0.0] * n for _ in range(n)] + + for i in range(n): + for k in range(i, n): + sum_u = sum(L[i][j] * U[j][k] for j in range(i)) + U[i][k] = matrix[i][k] - sum_u + L[i][i] = 1.0 + for k in range(i + 1, n): + sum_l = sum(L[k][j] * U[j][i] for j in range(i)) + if U[i][i] == 0: + raise ZeroDivisionError( + "U diagonal element equals zero. Cannot decompose without pivoting.", + ) + L[k][i] = (matrix[k][i] - sum_l) / U[i][i] + + return L, U + + @staticmethod + def decompose_with_pivot( + matrix: list[list[float]], + ) -> tuple[list[list[float]], list[list[float]], list[list[float]]]: + A = np.array(matrix).copy().astype(float) + n = A.shape[0] + + L = np.zeros((n, n)) + U = A.copy() + P = np.eye(n) + + for k in range(n): + pivot = np.argmax(np.abs(U[k:n, k])) + k + if U[pivot, k] < 1e-5: + raise ZeroDivisionError( + "Matrix is singular. Cannot use LU decomposition with pivoting.", + ) + + # Switch rows + U[[k, pivot], :] = U[[pivot, k], :] + P[[k, pivot], :] = P[[pivot, k], :] + if k > 0: + L[[k, pivot], :k] = L[[pivot, k], :k] + + for j in range(k + 1, n): + L[j, k] = U[j, k] / U[k, k] + U[j, :] = U[j, :] - L[j, k] * U[k, :] + + for i in range(n): + L[i, i] = 1.0 + + return P, L, U diff --git a/reports/resources/gaussian_elimination_and_lu_decomposition/report.pdf b/reports/resources/gaussian_elimination_and_lu_decomposition/report.pdf new file mode 100644 index 0000000000000000000000000000000000000000..273d571503df541513518f79e22b44c2f8fd2cf3 GIT binary patch literal 94529 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�{E@b^iT^&Uv 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 ZGo-60(#jfJM1c1eA2t({jEXGwe*jO^?I{2N literal 0 HcmV?d00001