From 6a0d886f5241a3234389ce0952af8be0e7710782 Mon Sep 17 00:00:00 2001 From: wizardforcel <562826179@qq.com> Date: Thu, 11 Oct 2018 21:59:19 +0800 Subject: [PATCH] 10 --- 10.md | 541 +++++++++++++++++++ img/10-1.png | Bin 0 -> 30021 bytes img/tex-3522f8b8d6b2b912a41177e213f96dd2.gif | Bin 0 -> 168 bytes img/tex-3fee5b26f9c6ce2571715fb9b282f431.gif | Bin 0 -> 3815 bytes img/tex-6f2e0e91ebd226538ef465b081f4468f.gif | Bin 0 -> 497 bytes img/tex-7f57ce5c29b329529f4e3f9a3765b114.gif | Bin 0 -> 175 bytes img/tex-8b7f1b39b8e0258e80aea39ca1c24265.gif | Bin 0 -> 217 bytes img/tex-9eee2c1c197de7cf3b522d1cf624846f.gif | Bin 0 -> 297 bytes img/tex-e2d55fffd53a113312172c3c24cc951c.gif | Bin 0 -> 301 bytes img/tex-efd8ffa0fdc4e994808665f543b0fc78.gif | Bin 0 -> 343 bytes 10 files changed, 541 insertions(+) create mode 100644 10.md create mode 100644 img/10-1.png create mode 100644 img/tex-3522f8b8d6b2b912a41177e213f96dd2.gif create mode 100644 img/tex-3fee5b26f9c6ce2571715fb9b282f431.gif create mode 100644 img/tex-6f2e0e91ebd226538ef465b081f4468f.gif create mode 100644 img/tex-7f57ce5c29b329529f4e3f9a3765b114.gif create mode 100644 img/tex-8b7f1b39b8e0258e80aea39ca1c24265.gif create mode 100644 img/tex-9eee2c1c197de7cf3b522d1cf624846f.gif create mode 100644 img/tex-e2d55fffd53a113312172c3c24cc951c.gif create mode 100644 img/tex-efd8ffa0fdc4e994808665f543b0fc78.gif diff --git a/10.md b/10.md new file mode 100644 index 0000000..fdad3ee --- /dev/null +++ b/10.md @@ -0,0 +1,541 @@ +# 十、实现 QR 分解 + +我们在计算特征值时使用 QR 分解并计算最小二乘回归。 它是数值线性代数中的重要组成部分。 + +“数值线性代数中的一种算法比其他算法更重要:QR 分解。” --Trefethen,第 48 页 + +回想一下,对于任何矩阵`A`,`A = QR`,其中`Q`是正交的,`R`是上三角。 + +提醒:我们在上一课中看到的 QR 算法使用 QR 分解,但不要混淆二者。 + +### NumPy 中 + +```py +import numpy as np + +np.set_printoptions(suppress=True, precision=4) + +n = 5 +A = np.random.rand(n,n) +npQ, npR = np.linalg.qr(A) +``` + +检查`Q`是正交的: + +```py +np.allclose(np.eye(n), npQ @ npQ.T), np.allclose(np.eye(n), npQ.T @ npQ) + +# (True, True) +``` + +检查`R`是三角。 + +```py +npR + +''' +array([[-0.8524, -0.7872, -1.1163, -1.2248, -0.7587], + [ 0. , -0.9363, -0.2958, -0.7666, -0.632 ], + [ 0. , 0. , 0.4645, -0.1744, -0.3542], + [ 0. , 0. , 0. , 0.4328, -0.2567], + [ 0. , 0. , 0. , 0. , 0.1111]]) +''' +``` + +当向量`b`投影到直线`a`上时,其投影`p`是`b`沿着直线`a`的一部分。 + +让我们看看 [沉浸式线性代数在线版](http://immersivemath.com/ila/index.html)的[第 3.2.2 节:投影](http://immersivemath.com/ila/ch03_dotproduct/ch03.html)的交互图。 + +![](img/projection_line.png) + +> 来源:[沉浸式数学](http://immersivemath.com/ila/ch03_dotproduct/ch03.html) + +以下是将向量投影到平面上的样子: + +![](img/projection.png) + +> 来源:[最小二乘回归的线性代数视角](https://medium.com/@andrew.chamberlain/the-linear-algebra-view-of-least-squares-regression-f67044b7f39b) + +当向量`b`投影到直线`a`上时,其投影`p`是`b`沿着直线`a`的一部分。 所以`p`是`a`的一些倍数。 设 ![\mathbf{p} = \hat{x}\mathbf{a}](img/tex-a32cff3b4bdd4f46771f4cc817a60308.gif) 其中 ![\hat{x}](img/tex-2a95aaaf954c2187999c6357b04a58dd.gif) 是标量。 + +### 正交性 + +投影的关键是正交性:从`b`到`p`的直线(可以写成 ![\mathbf{b} - \hat{x}\mathbf{a}](img/tex-bb4e955e77268f56bb0aa2b892c69ea5.gif))垂直于`a`。 + +这意味着: + +![\mathbf{a} \cdot (\mathbf{b} - \hat{x}\mathbf{a}) = 0](img/tex-69d4b6b19f75f7e5b87932c6e2d651ae.gif) + +所以: + +![\hat{x} = \frac{\mathbf{a} \cdot \mathbf{b}}{\mathbf{a} \cdot \mathbf{a}}](img/tex-e188ba54d741c47cccdec77b8ef7c5e5.gif) + +## Gram-Schmidt + +### 经典的 Gram-Schmidt(不稳定) + +对于每列`j`,计算单一投影: + +![v_j = P_ja_j](img/tex-efd8ffa0fdc4e994808665f543b0fc78.gif) + +其中 ![P_j](img/tex-7f57ce5c29b329529f4e3f9a3765b114.gif) 与 ![q_1, ..., q_{j-1}](img/tex-e2d55fffd53a113312172c3c24cc951c.gif) 的跨度正交的空间。 + +```py +def cgs(A): + m, n = A.shape + Q = np.zeros([m,n], dtype=np.float64) + R = np.zeros([n,n], dtype=np.float64) + for j in range(n): + v = A[:,j] + for i in range(j): + R[i,j] = np.dot(Q[:,i], A[:,j]) + v = v - (R[i,j] * Q[:,i]) + R[j,j] = np.linalg.norm(v) + Q[:, j] = v / R[j,j] + return Q, R + +Q, R = cgs(A) + +np.allclose(A, Q @ R) + +# True +``` + +检查`Q`是酉矩阵。 + +```py +np.allclose(np.eye(len(Q)), Q.dot(Q.T)) + +# True + +np.allclose(npQ, -Q) + +# True + +R + +''' +array([[ 0.02771, 0.02006, -0.0164 , ..., 0.00351, 0.00198, 0.00639], + [ 0. , 0.10006, -0.00501, ..., 0.07689, -0.0379 , -0.03095], + [ 0. , 0. , 0.01229, ..., 0.01635, 0.02988, 0.01442], + ..., + [ 0. , 0. , 0. , ..., 0. , -0. , -0. ], + [ 0. , 0. , 0. , ..., 0. , 0. , -0. ], + [ 0. , 0. , 0. , ..., 0. , 0. , 0. ]]) +''' +``` + +Gram-Schmidt 应该让你想起来一点 Arnoldi 迭代(用于将矩阵转换为海森堡形式),因为它也是一个结构化的正交化。 + +### 改进版 Gram-Schmidt + +经典(不稳定的)Gram-Schmidt:对于每列`j`,计算单一投影: + +![v_j = P_ja_j](img/tex-efd8ffa0fdc4e994808665f543b0fc78.gif) + +其中 ![P_j](img/tex-7f57ce5c29b329529f4e3f9a3765b114.gif) 与 ![q_1, ..., q_{j-1}](img/tex-e2d55fffd53a113312172c3c24cc951c.gif) 的跨度正交的空间。 + +改进版 Gram-Schmidt:对于每列`j`,计算`n - 1`个投影: + +![P_j = P_{\perp q_{j-1}\cdots\perp q_{2}\perp q_{1}}](img/tex-6f2e0e91ebd226538ef465b081f4468f.gif) + +```py +import numpy as np +n = 3 +A = np.random.rand(n,n).astype(np.float64) + +def cgs(A): + m, n = A.shape + Q = np.zeros([m,n], dtype=np.float64) + R = np.zeros([n,n], dtype=np.float64) + for j in range(n): + v = A[:,j] + for i in range(j): + R[i,j] = np.dot(Q[:,i], A[:,j]) + v = v - (R[i,j] * Q[:,i]) + R[j,j] = np.linalg.norm(v) + Q[:, j] = v / R[j,j] + return Q, R + +def mgs(A): + V = A.copy() + m, n = A.shape + Q = np.zeros([m,n], dtype=np.float64) + R = np.zeros([n,n], dtype=np.float64) + for i in range(n): + R[i,i] = np.linalg.norm(V[:,i]) + Q[:,i] = V[:,i] / R[i,i] + for j in range(i, n): + R[i,j] = np.dot(Q[:,i],V[:,j]) + V[:,j] = V[:,j] - R[i,j]*Q[:,i] + return Q, R + +Q, R = mgs(A) + +np.allclose(np.eye(len(Q)), Q.dot(Q.T.conj())) + +# True + +np.allclose(A, np.matmul(Q,R)) + +# True +``` + +## Householder + +### 引言 + +![\begin{array}{ l | l | c } \hline Gram-Schmidt & Triangular\, Orthogonalization & A R_1 R_2 \cdots R_n = Q \\ Householder & Orthogonal\, Triangularization & Q_n \cdots Q_2 Q_1 A = R \\ \hline \end{array}](img/tex-3fee5b26f9c6ce2571715fb9b282f431.gif) + +Householder 反射产生更接近正交的矩阵`Q`,具有舍入误差 + +Gram-Schmidt 可以部分停止,留下`A`的前`n`列的简化 QR。 + +### 初始化 + +```py +import numpy as np +n = 4 +A = np.random.rand(n,n).astype(np.float64) + +Q = np.zeros([n,n], dtype=np.float64) +R = np.zeros([n,n], dtype=np.float64) + +A + +''' +array([[ 0.5435, 0.6379, 0.4011, 0.5773], + [ 0.0054, 0.8049, 0.6804, 0.0821], + [ 0.2832, 0.2416, 0.8656, 0.8099], + [ 0.1139, 0.9621, 0.7623, 0.5648]]) +''' + +from scipy.linalg import block_diag + +np.set_printoptions(5) +``` + +### 算法 + +我添加了更多的计算和更多的信息,因为它说明了算法的工作原理。 此版本也返回 Householder 反射。 + +```py +def householder_lots(A): + m, n = A.shape + R = np.copy(A) + V = [] + Fs = [] + for k in range(n): + v = np.copy(R[k:,k]) + v = np.reshape(v, (n-k, 1)) + v[0] += np.sign(v[0]) * np.linalg.norm(v) + v /= np.linalg.norm(v) + R[k:,k:] = R[k:,k:] - 2*np.matmul(v, np.matmul(v.T, R[k:,k:])) + V.append(v) + F = np.eye(n-k) - 2 * np.matmul(v, v.T)/np.matmul(v.T, v) + Fs.append(F) + return R, V, Fs +``` + +检查`R`是上三角。 + +```py +R + +''' +array([[-0.62337, -0.84873, -0.88817, -0.97516], + [ 0. , -1.14818, -0.86417, -0.30109], + [ 0. , 0. , -0.64691, -0.45234], + [-0. , 0. , 0. , -0.26191]]) +''' +``` + +作为检查,我们将使用分块矩阵`F`计算 ![Q^T](img/tex-8b7f1b39b8e0258e80aea39ca1c24265.gif) 和`R`。矩阵`F`是 householder 反射。 + +请注意,这不是一种处理`Q`的有效计算方式。在大多数情况下,你实际上并不需要`Q`。例如,如果你使用 QR 来求解最小二乘,则只需要`Q * b`。 + ++ 对于隐式计算乘积`Q * b`或`Qx`的技巧,请参阅 Trefethen 第 74 页。 ++ 请参阅[这些讲义](http://www.cs.cornell.edu/~bindel/class/cs6210-f09/lec18.pdf),了解 Householder 的不同实现,它同时计算`Q`,作为`R`的一部分。 + +```py +QT = np.matmul(block_diag(np.eye(3), F[3]), + np.matmul(block_diag(np.eye(2), F[2]), + np.matmul(block_diag(np.eye(1), F[1]), F[0]))) + +F[1] + +''' +array([[-0.69502, 0.10379, -0.71146], + [ 0.10379, 0.99364, 0.04356], + [-0.71146, 0.04356, 0.70138]]) +''' + +block_diag(np.eye(1), F[1]) + +''' +array([[ 1. , 0. , 0. , 0. ], + [ 0. , -0.69502, 0.10379, -0.71146], + [ 0. , 0.10379, 0.99364, 0.04356], + [ 0. , -0.71146, 0.04356, 0.70138]]) +''' + +block_diag(np.eye(2), F[2]) + +''' +array([[ 1. , 0. , 0. , 0. ], + [ 0. , 1. , 0. , 0. ], + [ 0. , 0. , -0.99989, 0.01452], + [ 0. , 0. , 0.01452, 0.99989]]) +''' + +block_diag(np.eye(3), F[3]) + +''' +array([[ 1., 0., 0., 0.], + [ 0., 1., 0., 0.], + [ 0., 0., 1., 0.], + [ 0., 0., 0., -1.]]) +''' + +np.matmul(block_diag(np.eye(1), F[1]), F[0]) + +''' +array([[-0.87185, -0.00861, -0.45431, -0.18279], + [ 0.08888, -0.69462, 0.12536, -0.70278], + [-0.46028, 0.10167, 0.88193, -0.00138], + [-0.14187, -0.71211, 0.00913, 0.68753]]) +''' + +QT + +''' +array([[-0.87185, -0.00861, -0.45431, -0.18279], + [ 0.08888, -0.69462, 0.12536, -0.70278], + [ 0.45817, -0.112 , -0.88171, 0.01136], + [ 0.14854, 0.71056, -0.02193, -0.68743]]) +''' + +R2 = np.matmul(block_diag(np.eye(3), F[3]), + np.matmul(block_diag(np.eye(2), F[2]), + np.matmul(block_diag(np.eye(1), F[1]), + np.matmul(F[0], A)))) + +np.allclose(A, np.matmul(np.transpose(QT), R2)) + +# True + +np.allclose(R, R2) + +# True +``` + +这是 Householder 的简洁版本(尽管我创建了一个新的`R`,而不是覆盖`A`,并原地计算它)。 + +```py +def householder(A): + m, n = A.shape + R = np.copy(A) + Q = np.eye(m) + V = [] + for k in range(n): + v = np.copy(R[k:,k]) + v = np.reshape(v, (n-k, 1)) + v[0] += np.sign(v[0]) * np.linalg.norm(v) + v /= np.linalg.norm(v) + R[k:,k:] = R[k:,k:] - 2 * v @ v.T @ R[k:,k:] + V.append(v) + return R, V + +RH, VH = householder(A) +``` + +检查`R`是对角的。 + +```py +RH + +''' +array([[-0.62337, -0.84873, -0.88817, -0.97516], + [-0. , -1.14818, -0.86417, -0.30109], + [-0. , -0. , -0.64691, -0.45234], + [-0. , 0. , 0. , -0.26191]]) +''' + +VH + +''' +[array([[ 0.96743], + [ 0.00445], + [ 0.2348 ], + [ 0.09447]]), array([[ 0.9206 ], + [-0.05637], + [ 0.38641]]), array([[ 0.99997], + [-0.00726]]), array([[ 1.]])] +''' + +np.allclose(R, RH) + +# True + +def implicit_Qx(V,x): + n = len(x) + for k in range(n-1,-1,-1): + x[k:n] -= 2*np.matmul(v[-k], np.matmul(v[-k], x[k:n])) + +A + +''' +array([[ 0.54348, 0.63791, 0.40114, 0.57728], + [ 0.00537, 0.80485, 0.68037, 0.0821 ], + [ 0.2832 , 0.24164, 0.86556, 0.80986], + [ 0.11395, 0.96205, 0.76232, 0.56475]]) +''' +``` + +经典和改良的 Gram-Schmidt 都需要`2mn^2`个浮点运算。 + +### 陷阱 + +有些事情需要注意: + ++ 当你复制值时 VS 当你有两个指向同一内存位置的变量时 ++ 长度为`n`的向量与`1 x n`矩阵之间的差异(`np.matmul`以不同方式处理它们) + +## 类比 + + +| | `A=QR` | `A=QHQ*` | +| --- | --- | --- | +| 正交结构化 | Householder | Householder | +| 结构化正交 | Gram-Schmidt | Arnoldi | + +Gram-Schmidt 和 Arnoldi:连续的三角运算,可以部分停止,前`n`列是正确的。 + +Householder:连续的正交运算。 在存在舍入误差的情况下产生更接近正交的`A`。 + +请注意,要计算海森堡化简`A = QHQ *`,将 Householder 反射应用于`A`的两侧,而不是仅应用于一侧。 + +## 示例 + +以下示例来自 Trefethen 和 Bau 的第 9 讲,尽管从 MATLAB 翻译成 Python。 + +### 示例:经典与改进的 Gram-Schmidt + +这个例子是 Trefethen 第 9 节的实验 2。 我们想要构造一个方阵`A`,它具有随机奇异向量和广泛变化的奇异值,间隔为 ![2^{-1}](img/tex-3522f8b8d6b2b912a41177e213f96dd2.gif) 和 ![2^{-(n + 1)}](img/tex-9eee2c1c197de7cf3b522d1cf624846f.gif) 之间的 2 的倍数。 + +```py +import matplotlib.pyplot as plt +from matplotlib import rcParams +%matplotlib inline + +n = 100 +U, X = np.linalg.qr(np.random.randn(n,n)) # 将 U 设为随机正交矩阵 +V, X = np.linalg.qr(np.random.randn(n,n)) # 将 V 设为随机正交矩阵 +S = np.diag(np.power(2,np.arange(-1,-(n+1),-1), dtype=float)) # 将 S 设为对角矩阵 w/ exp + # 值在 2^-1 和 2^-(n+1) 之间 + +A = np.matmul(U,np.matmul(S,V)) + +QC, RC = cgs(A) +QM, RM = mgs(A) + +plt.figure(figsize=(10,10)) +plt.semilogy(np.diag(S), 'r.', basey=2, label="True Singular Values") +plt.semilogy(np.diag(RM), 'go', basey=2, label="Modified Gram-Shmidt") +plt.semilogy(np.diag(RC), 'bx', basey=2, label="Classic Gram-Shmidt") +plt.legend() +rcParams.update({'font.size': 18}) +``` + +![](img/10-1.png) + +```py +type(A[0,0]), type(RC[0,0]), type(S[0,0]) + +# (numpy.float64, numpy.float64, numpy.float64) + +eps = np.finfo(np.float64).eps; eps + +# 2.2204460492503131e-16 + +np.log2(eps), np.log2(np.sqrt(eps)) + +# (-52.0, -26.0) +``` + +### 示例:正交性的数值损失 + +这个例子是 Trefethen 第 9 节的实验 3。 + +```py +A = np.array([[0.70000, 0.70711], [0.70001, 0.70711]]) + +A + +''' +array([[ 0.7 , 0.70711], + [ 0.70001, 0.70711]]) +''' +``` + +Gram-Schmidt: + +```py +Q1, R1 = mgs(A) +``` + +Householder: + +```py +R2, V, F = householder_lots(A) +Q2T = np.matmul(block_diag(np.eye(1), F[1]), F[0]) +``` + +NumPy 的 Householder: + +```py +Q3, R3 = np.linalg.qr(A) +``` + +检查 QR 分解是否能用: + +```py +np.matmul(Q1, R1) + +''' +array([[ 0.7 , 0.7071], + [ 0.7 , 0.7071]]) +''' + +np.matmul(Q2T.T, R2) + +''' +array([[ 0.7 , 0.7071], + [ 0.7 , 0.7071]]) +''' + +np.matmul(Q3, R3) + +''' +array([[ 0.7 , 0.7071], + [ 0.7 , 0.7071]]) +''' +``` + +检查`Q`多么接近完美正交。 + +```py +np.linalg.norm(np.matmul(Q1.T, Q1) - np.eye(2)) # 改进的 Gram-Schmidt + +# 3.2547268868202263e-11 + +np.linalg.norm(np.matmul(Q2T.T, Q2T) - np.eye(2)) # 我们的 Householder 实现 + +# 1.1110522984689321e-16 + +np.linalg.norm(np.matmul(Q3.T, Q3) - np.eye(2)) # Numpy(它使用 Householder) + +# 2.5020189909116529e-16 +``` + +GS(Q1)不如 Householder(Q2T,Q3)稳定。 diff --git a/img/10-1.png b/img/10-1.png new file mode 100644 index 0000000000000000000000000000000000000000..75152a4905c7d1b18c6c54b3b683a0426e11b4a8 GIT binary patch literal 30021 zcmaI8bzD_Z*EI?v3aE&bqJ&6ycc@5699j?ok?xRgP(h`oJCu+v=@tnA=`Ja0knXy3 z`#kUWe)s-y{r!-`iM`ieYt1>w7<267rzkIV1LrOd8XDRS>8Ik#XlR!l;YSAR3Ow_9 z4T}waUA7aGR>gvU?pOvN;csl4ry6!>XxH$OAN0OS&r>wC`)JbQk5!!$)+Sw^N6a5L zY;9b_`5EW0$q--psUj^V&NNdsO2bTsIGui8E%uC4w)5;`rK&-!ENz@FU7M{C3+tPt z_I@SV)l5?cvDj;0X5R{RZ-j(~>KeVeV&r>br)^i;#kFDEJ^QQko0$xQ51tqnrO(NZ zjUyWJ0I!jkx`+UIlzIRE=fQ+vQ9t*(2de*kfO|bR!&HhJB|F63*)jSW8;&8y|4x(6 zvBB+;O1kR(p6wRP1iL5r$T4k#8M|;(gd>#Q0wxB%FQtTrH{Sa9JY#eY95Ama!&HR_ zbrOm$3;NIGtm8-_FP^J}M9 zD{$=5XT5d2_hqsIXoCYT&%VKw$*PyBlC-fY#JP6u+v`97K2}z4x7Zafll3BMZPg!D zl#I?5q3j~jPHYmlFT_s%RD8I+%UjtjIm5L2&HNJn<8O_PjUz?+A8tG$Mm}D66V+eL zJUKicrx&R#-|L;BGR-q%NaSPaTX!+<&R)kE`4AXcvxX*96W7kXv-tk2iC83k(WF$81 zx;qz&kipX`%MO=S>YF6cb2Ri^Ktvn z#J13!z~FdqX)BkL-pP$%w6T3EhNW9tQzI;&B-|Fsq@FTtlG1OTXO>iI>}~(*-C3}a#%`!4Cxil zTMxX>_HO_F{rm9naAa+QHF^Zy(%Rxl56=(ca?DRn@>nx{wzjsJ&vJgu|1C9r1n zxKTfbhoh&bU%?9|Jt=QGyVh+z)*_U#Wf<~&Gy}is6N-K8)2gz^_VV&F{s4PU7abiP z{%*@yw6BCCQZl|ZAI?`w_h;hu$D-7dh-7?L;kX`$>Spju#1k9w+sz>mi)bRBx)nC^ zZ!fFj{eK>$SJ*G($7OI>#F(?b9jNngi{rIiS!1_g6cmih%%nH|Fyr_ya+GM}GBn(U z+z$)C{opZO>`H8EZtgAAed6x!j)jYx@hnH}I)!M0j@Q}X=uBm9l8DtnlyprDlV+1}4NB zrDjC0U%wv6(~L&PxPo`<*7xQ9ucP%|56y>iKWlt5;}!TPd>o+{D$shpg_ z+3{XlS{l3Ef?W8C`%Wj{>Dj?l&EaeStg8TjW4o;AXV?zyf3m(NaaMS(kMY21#XsPZ z1(I_~F-UlNih6o_?qd~+7u4?Gee>qc+C*h|mBZ>?VaKy$2l+%nLq(&GLG+2o@J3i) zXIIy|BKw;^ZmN8hCyQd!kylm@Yx7W6Rz}mtrze$)(}OL~-!!b_6_jD>zTHMwv(qKS zZ8=70ZEgMA<3Jm2WhhVf;O}H7`9ZhWd4J03Y;%BIqF|)Z-wF)4D6@gg#|1BIna#vl z=;^1YzrW))ANoa~g|WH2%bjV+J=mIWGCGu}S-F_xwz;>Lu9o-W`aRyj(^L1<9jmbt zKgad4nYpR zD5Xjs9v|c1x$_j(Rioaswzux=@-{-D;1ZLS~V9z7d>90a@}2e{O-z)&Heoh7|ibKaEQmre&n$` z+S_;UTn=YG1ho$r=s;R@-yb!;GJkY*B$p%{`}611GvhR;jo)jd-&$YQ!>;BqA7cLU z<;&*50UbU4M|l1HbrL-#t$cB_H3&m8%ke8DBzOcEWP9&}v zODwY-kDDy#zBt?Pl9rX7i#1M~f$gHVv(U+`Re{IG#z#j_fTPg1a&$mSiVQ2Pl#@)0uG|lv*GAPu1dnA)&sl!Ii4lcYE39c8V zX0N9k&_xfYF?cPvpUrc&(JuV0Uszb0Sb-xw>++1}q*gLK;$U24)Rc65B4y|!lI zF*@H7{Vbl>k}$>SSIlR&WPK~)4zU=u2St+Q4o=Ebrpp0o`os= zmHaUI`@5?I#Ke+Qbsj;-Be8ZHwFkC~iB5MT9M;DoJEGZk7L&a$eTs~1W~)CHgE!qE zc0btO*8B4_R87>agK)h(COKKb%8C^!Yrow#kZq(@=RUd=0}-z25Y*Hpp8v8|#>_0c z&H`Rq8!HWHC3g!@rpqHYaYx|hpK?e z+KMrg$=CQso3d)|c(Ps|9vh4OD4Z4*xX<&<=$cdrx#8*IR<35bd~y$AWOTF?WQx55 z5n*AIk;2cl6kZ^ z7|+hhMty1o;}+K^IL_Y6U@VV0F=V-P2t;m^9&c9ds-9G-o5#D$bBCz)P2%`E6t ziDBIy{)}Pqd#%i4&E3NT6&0_^_szL8zG^hD+x8&7({70z!bIS<&6ymEiF>nDCQa1;tv=Z{fU^=ptL@gE1IgqxQdHMK=1?t zIfl~^2Le|J>Y+(oOV8&gL9-mqW8F_-LrcrZFmibI3{D%u3HOF|!jqD^;H@1}6dvLb zLnBoVOn^?(TNW6pi@sguyXYelt9XM;#yH_53%gp5*Na@x{^zu(Zf74{&+<@SeCKWD zgPomJmz{-E$V#LFwrK-RUHH1Xx@fTKQ%f8whQ6r5W}Tbqgt4))=|kdwM~dFTB!@;s zGy#geLGA{7Jr}!H)z8n5S)qva(!va+MVo zA3?NBV9+t21*&E#`)+R9z&rhdf=ZWME?>EVfBUu+Ob;65U`Q(*$QFjAJMqP?;?lCd zF&mj+!${G4otp8o?|~$Ji-5f3OeQKg>d%jv=;RZ6qP1(BLyvYA@2v|#y(}&+j^VRT zYO^DI=vgzc8XK2^VULP=cz#F);KA^2k-5zC=XaEpl>V)erxTibz81$F0nN<9O4t4j z)RlSJXx7rq4INz;y{)@Hl0A?8yv|m2)LM1IsyFK5Gf?rxdd)b*%+I}{d_f5yZr$w? z+OYXMArO#1Sn*olapSjTPf0>@a`#)zYk~V@?61%O=x`q0x#KA*$Mfv=etbzuL3+-o zyFyY7q>4%-!qqNzz9;6I0FRL3U<|w29#RM8llL}Tvl3A(nnuOadyoxvq43pgHeN%} zRZ~;bH0&owN8WpUR%u3^aYh8?Vj^z))XdC*A1FLyV34!R%WaUFj+RnGes*@!Ffg=b zplqyb_lR$b9^PLcFE<`3)V+N9@@5-d@)8BxiywoyF3j!%9qg-?jwZ+X?YHeaB_o)sv}2wZA^zdX>WcQ2;T^A!Kcf{hCMW=IVz@_8Y$w zkM~yZt@nR3R-i@2iNmr|Nd`7dO(o}PmWL%JS#5FCbw9iihA{pLI79ek?c1Nl#qh8& zJzMrJ^McwIWK%$1G($dJdJNHucpE>gcx3^{hY9;nR4F= z@(&JHgZ-BcaCQaqoT_G-g_5@`l#1*7XR8JEsvEy+BkSwyw+{}~MO=3kui}yxI#-3m zu6?ricT#gOS3?Du+J@$YE`FehRU3WL#`TQ$SYemqDx`P=o7mpoR=#nUTTwxH%jbALTBrRq z?s@xAf1*itAeqplhP{2s7*Jh(Hbx#tF;&Ks{dFo%&c0DyEWS^1aqUn>VGi68pq)S# zY{M>F$Ha{q&x-Ib`{Uk6xJu8N0(60~^zGYA`P$X*qobqi*0$$6sOjkD*4I%0lN0YG zX3|p^*?DVxyI-(CtK2Q}WIxhE%=0>>=Z4-}TYZxLHjijb&Jw)2 z!HawZ_@v_E{NxCrs(|C#9W9F(eR0L6l>PF;4MJ~-_7gAy$u~wYMBU8_d&sM z&?p~M8m!|C4-PmaWskrAO3=qh!0YwE1AsSN5dm^C_XfSNz87Nk{8-)IoAysNrQN?y zW<+C-(PA+Edy|Ot8tHv{zNpuBe4(za;cLP{pVVTToW@X!`F?w=26aLRXO9S_cEn{j zy8ei{UqI`)i-e>qP5z213<9rFhP(^+5g`FVYEIV9ZUj0JGPFYffsx9)|1QY~&ydz6-PpoH zc0JMwvbH$$suedTIPbDr?8p8*&aHLA$ugaU{F+?38_4Y4{uCPeCc_j8=T7%SYujW3 zI{E4OdEX3E+>6hwtdx{*fOc#`Rw)J~{2rHVWx!cZzvSj~f~u)zs8fKnieK z`urj0p_k}wRxKOHkA{wGBOH<;*C>K&9+yMp|8?N=m{F=uUuI%4speo~@cC1}XK&`x}UM0Ti*w zVO1^3>)b`H;3XX2eQr%LFADIcw$o(u=r?1(kPzd;%^5T(s1#{mze1W7OBVG=xI1@# zcG6o?eDTuQz<}Mboe&=%zhXX0)8bC-Jivz{eDzp*CK5%EJYLtj9V~<^i0T3a2i1W@ zI4Ufx@ySh*Cdh(h#32B{mA*Kh9=?uH9>`SsVd4c8TFTdG2ws(zlcR=t1>hStZdKhm zy#;*j^->R|C|t2}w*yqnOP4OK5t+sQiskwMYgOpFXGZR^tCZRrLMF7}lX;!!BDIN3 zS|vBA`6}}eUwxlLSe*v1=&RR9@)Msi0?Eu{27rZf89hxFqGXI6&{4sb#r>i0e^s|l zH|;!bW$ly6WEBs~i<0|5>QYWY>|k@-U(@YLd2AG-UF*t2Cgj-E-F*|J9YM#npK(0q za(_?0U!~|NF;%Ilt*t!UAD5Pwmt-(3(b+mzfI{!{{{1CnraX3D&&(|xk5~fR2N;^H zX;p~{7yY8d9^jEAlkon0_ELh`ps1=9Gou_ z0mR;{-`&pkhJiJaegFRbc;uzqI?wjb&W$dWk=!~6i{D-s9&y~JZ(;9r#`76NB}O|v zUM)cCD{NJuMQuMrsVZIfvL(7V4yL@WrT`YDr6@qi-u9H|Nf5b+D;^%+BSl3#0Bt-n zmw+e)W|*!`R!4*4pj7Zu1Syz6g-;GPu1>>-`wDeMHAgK7q7Bp;1A7)bk2Pi&YXW?H z1eBry4L#l8qGF!9w)%T3HUBp!l64w`HnKPb9%GLLuyq+DTCPYRze{y(& z_R*Sr<5$leVAdB0UKg#QR8qTsZ9qCRwX1n=K0GaK(?>2b$?dNIs9x<&egx>+%0oHo zY{aZuKS7e(J%Mb!(P>Qk{k2hEzZ>@N1U-+J=>(nr$^kcF7R<;5 zR$Jw`E>rJ$=Db$a%I|e9j3yOKs=GDYEWAIWFMRYT909D5JJ>-I@jO2=4o6i17@Gq^ zB)s#B3*<(2r@vaR2Y*p7Ufk^#Jz<8Dco`U?9>i!3R7*sv0E|*QaOWPc1=dnn8qB}O zz#o@CKX2*j>A~>%5Y!8b6zCkE;9)U9ozyb`03Sj1nQIB6f}#b19e$PE*&B!nhtaP) z?{89cfrxMfA{dFFJ-yS!>#GM7b_#wR&yRoOk_kq@QMRGLZtjm;6OfW#Pf;i)lVo_d zYz2E(sf*WYOVW1(ySd>`vw^+l6oJ{qY*19oSjp8b9M~zttcy21 zgj5d_mDY%l9W%A_)#HHnVP-;J$qA=ZV1%5-<8f@C9-#~}5+gnR)7sPR4jG2@)6>&| z+JoOY5BGtiw|93d@K}r}&d<*;ckFC$tBQ;JASmanLb93+gTwKz>HO+y&I2l{LEme) zcTdhCN|2ABGm404>m&gzRE>&_%|hcb?W0azM9+MKadl(2iT5Jb6Ntf(SUN`fNINx%pa^ zdaCCTQcRD|4(CFSiyIHNhcvC9!7l5K1~{gPF4NBqm7nq5PKnjzi$Q>|O^a$vFz<}) z?272wz`9oeKC4>SpOqn4r|s-o@-UD)GeuFoCM?WM2tt$&FAN(q6F~XMbSc0oC&Cm+ zda90&Wp$^pI+N58-N~sfOXa592XM29? z!fV-wA}WP_1qsFlU_L09gBzOlo*uJvmO3g&qsGavkG2i*2?zvSw$r}n8FwcU5)zJZ zm%%=|bf*T_msUREDU{{wR+W{NS5A;bZ(vs*9eo?@f^HRX3)i>Z5GNPX+pt+n5^@$d|;H*n!ii1b@z zWGD#XkxIL-y&UDgU2~L@J0aXJ@x?m^+y#F681?F_d?K3jpHL}8uCJ>B^?}>8uj!9~ zzwPc~7jYWHkTjB#0K_OU_+Iw?6d7$;JVA8*F84>shMOQE6dAPP|E*eO{aZ1I8-8MB zv~neq2lU;gqQ+v-4M{9O*fJ|AsN9Ket@AiR+r|FG&>BKfu3_Pet*!f3eECc9cV2_UAbBDsE`BHSS;5Q6`y7lfa6iSz2S79< z!kEl95Q)zeiKN8DEkL1Lksn0P{ad~9yv|)P`avLUfIdJ=1cS;`1qI{t)1xljEV+T8;4KP|-CIC9xhg}l(o%Cl@ROiEJGKz=nZRG8TZcF9#; zz(Pc;3{{tAXl#_R4CWPRUZ>NPM=PMB4sP$p2molH>a_sP^8L`-`CA=YE2XF|oeAJU zfmf(XEJlk5=Elmck!#_%{qs?KmXXPPYJB_G8)K%v)-GxLRAVQCF-C$LK|N}*mvQC1 zjgq5krxO1KG2WDL(vMVJ74|G|_*E^ZtPTR0u3Q|qALcdUm^Ci7rMi>9Kf1d^U_8+v zP%n3MCknNK_JC}lgGr}k&ncj69M->u-X^?f@s^8B5quAPab zdTwz9UVM-5NjnWRx zH|2?1CLM})k=yc?8uGr_!atdeO=O%epd*2vD?)AfpFMs0QNqq?(zb);R~%0Ognckj z)8)lb%_@5auhXro*KV^8IL!hh6a*DUe|M>O!sB2PQQ@Gs0^#)tVEQ4{2Fqj8mEnT! z)1w`ig;?W{fq{QOeW2y$jz~x#^*q~CM_@4M=h)Dt)vzckDmpgh2QgC)s=G;l#tmrw zkv{ZHfK-lDSr8PAw|v?G9~rKV6d`Q|2;C1z2?mMh%o|54j>{Mq=~n<>OoIsl{q!}E z0YvlcN)&?D!Zo1kHqKf!MfERST#j1fM(tc4LZ3qO zcr(`EI(?nJ-|ur|YYu zM#p^%6VL?b$N{kI7LZXOF$Msp>`Qr!fzT4@nU02*&vTgc+=mN=PK@323L8o&VwC*+ zF(AOOTS|PyN&g=&z!>*CYzIpsO);@cAUEp$ov5?`91D6nR6{Wv8+L#>2ES`u5LR+{ zbfjTlr~c9fGo6sa^N^CQ?(hLj!aU@6V?fck1!M?*gxeNS- z)S2sX0ouMi8ZhFUWZ6$AEr+h@PTg?zHBJg91nLyGCI5mnBq%;+&` z5uD`b%HsbO5YFC}^c~*3Mo@O|>@TPOeM_3Tg}+9wvz?;k0Q0LZvs++4jO?}%zOt`(toDl02}_IY@@2O_G((-70V|aEzByk z3$$5ol(|mY(0X#i98E$_fHEV-NC>MyLcZx3e+uhnUy#Qo^m5rXxxH$pHHF(z?%y72 zH%x`tIJUmq)J(>Yx7d@rk&U#Z!5U#h8ad)|<(Hz&JQ0H?boVzJobTUq-jF={*04j9 zz;yEwg9EC+B&lKi5wQ)A$%w3T`%}BDzu(Vmt>q)b%EAuit5L~mHjy|a zstC1LHNlmJM)rbWiHARHQ2=A{hQM?}>{&qa0pIlZ#*?@Vk*gML`u+K`eJmnsxev7m zzFsan@?Qz1;Tv6PV?^k_c>463Qqi8ZMM(7gD^&jrv=830OL2~^7#NlWapvr!$@#0) zU7thwRu*zuGvX|6sO5cnhG-8Tak@?C{H^8GIngIi?F1|zLpk7c>#w~O$9rVed^ zZ!N4OOK5>AGV5#|*b&MEJv1NE`?xK!*e~0M8&_Qmmko(sQZO!VE7Kv(TI9TOMSqFt zo+5|&ip2JDT+HssgkUKmVb}=BXMs7y@@^G6en5mW7wKzM`oM#9)e>dKDv0XfiZoQr z3s;K?EjyJIg9(e`pd>GSoCu44I#yD}nPu#kFaMNwm*ux8AQ}m4>kN-$90uo zt{q)#^EirkRIHal^#SE6zsAV}%5{v%qV!x95T3-ahUW{LjH1Y_TZHkZI8^^QnEbIuFY!RZzeG|)|dOn=oaQ+S}uLu+M*d&N0@ZJvFPB{5B zN^z3rrY1aMVvw%ThW*nYwEz4GJ?tn}?Umx;T$5z<57dq_S(noz)EZe@ZoS4zJoIkn zGheKd@3TDEn>nhMdR;MfKtn# z$;~1ly@2)>*6_%zCaWBfR188gD1J!yJ2W(unwEBZy?jbgsK#~_njIm++gQ-7aCUQ3 zsdlvdlA1~)U`q{ByRD=1d{jchT93g%R6^~xkIh^BlR1Y+ND+FDv>{WV6Gh5z;|&$B zC74VWavro0UO~-4U?PYeoWSyoKbRQ+dmC{jooWua?E)qO4NweFaooBM-ss}u;x^z* zz$N8xfbnS*8(<^ajvrl8;c_XNE+DJGI~;F6e#E+hOZpTV@kkdM8h?lr!T#?=EWGfw zdAQQf7~B(2L96X>5B~GV0GvTjpFSg!ziE z=l!jIS9iwKR1%0SA^i?S=m*SN1Ox>dUHY4cIR$m?pvsTdc~pl#V2%aVw6j~l{m=%f zh)e}FjrXi;-hB9=J2wI)0<0NqKmu5{gk>0jBzc4K+^Nr;gY^BaCitOuj+9#L>({xR zPoWc@@X+hGbnmjWv-9-a+}yyOgf>%If9%#m*Q}xkMxAfBC@k(wXwN%<{O*C(X{^k$14^BYa5vJ81oa8&=RkFa zo{t>wAk?20|y7^sl0p!!YnRd#slL7fF3ZR z{DE?QeD-Uv;20XAceqXP_Ev{mJ30aYwMIgdECQSeQHR2wNAtHqjFtRPNy<=CzM5is z*W-Biv)jSn-e@3GHbV(UdtPF4 z3w9>ddqg%G0+D`phtYofk2DAsPoQTP6eie1)6Qcy!0uupBZC7H+K=(^_?{lcaGna- zyU@oebUU!p)7RfRIQR;1s0R46763D7L24JcO&c*+sQq&P>^8(aR z8h-veP-{UzkgH3M%LoO<53Z_*8|8(#gd_?=zexvaV;b)%>r4E@8DFVVbgoQ=L=e#izEKo{olM9HDqa=gFZ@&3j=XP~s1%IP>DD$W4nuGt?mPY`wq1Lo5M zA{GRqF{dA^{ocwma_4FEGV7_Xeual9SjN#(^V@(+2XZy~UrhneKqM~kzWqAf;%jxR z>dby7lO^M14$g;c=90EJJx>2F6+-$+M^2ge+(=i8rSZ@HZ#ZzK2&(4X73iYQoa@(1R$_o?s{6iwe>Wl#!r7!A z@OCDsV>!^|_80{_3sH(uSAxbY&)=FI`FC^7LFp+ekANG?xwyIIOjbMHTlWG962E&G zCKfXj+M;bsMX(r=;o+(Eh_pi?tDvCno&B=5O3?GPqPHljPE>}02b@2cnXozTMAYy0 z$>JzN$B4bcamM_3%)B7-Z~~_@mP-n~y}w_j)N))c2y`3|SVN?*C3!+DS^!~|1?|Q= zP2{Acxj?t93%wu}TpECsbfX>Q&OC0E3Y3A5AU*X&*MrRqM-d@vy*w()%DaYefvVnd z{I9=!cL6EJ67!A+IVeDbAWWI}t}4BZa#u$aitrT(=5AKAq5aC+7T6mZ{iSKoxZLs` z375SlrOy+G<-i4)d6J$>-zOSp!KqCRT8-#%||1V1b;q+)MW@r zUU+Xn1@T3KX#{khpkNYilTYWh7>G>`C=P9b%eZBEZ-LIkcg1dhE3c*#vej(9eT*`h zv14S}2M@;_w2Xn>TPTV`(Fos&6bjE6!Rd-iZ}I1$ zijBGxIr1q;HR1neh=?Ng1#~vi!aMWe3h4Ow)V&^pTnfGA)eSfB335w->KhKqj4f2` z{lAkPklhg(?m1NLXW6Q{VAY^$xuggh%R6&o&fCdZtvDU1#IKo9SP_Xlb@(UbYbe?B z$)eh`TYtg)#>hW8KwFJ%8R_?4(j-T&rIV+2;Q4FX#cEki>C^L>s(iVwi^(un}mz$1n2UzKzdO zJfEYun1-dLgOmrkrr3E)50R~2dh9(r6D1S0M=WHBe_{9UWISv?kW~~QQ}R2ksE#Jv zFd!n1cBjs3sCbA4Z{+#TRDFhI`-_uf!fmiIy46I zTS1q4WMPr3^i~mRmE3;m{05eJ8?L+`AQCtm3>D+&H#WNULqz_GWw4Uq?I4FVI``w| zL+*RBxI-n1}N7Io)N+>xC(7tf= z%gKH4-~qquZl)4y1@bTITuC|V4O_k#zL0LzXqwH-%={yVF>cfMM2+8D0y(T4*ZVNP z=HY|V-`$fYO|bAQR^PEb5TqjBe| zJ`;4O28LN%T3Y%54LusJw}z@n8*&87+i0~D8%S5Id~bJqr6}eBg4P@@#9x`;S?uN; zwfMWSVLcqD?G`5L_{Bod{u2>!GO(8xd!D%>#!!eiWam{v7-fP}3tV&16a=z9wb{;8 z5F;XGU_cEZMIVq1cryCoauJk^m>GZ9RDRdeUtV6mPQvMfSkORO01rwxM88IjGY5FN z`W5PLL8Bd(25D&_5sg^Bpi2%OV8oF5t;i%!5t;zkLc$w$L#Jh|cr!B{`TS^?k0Zd-})pWe_uTtm<1sw*jCNNGuZYQ84`7l3@TB z2Or{o1?yK+jmwSoW_+3E#diB7-4l7$0u zk5S0M?(QF*i{sm=QXvRL)vB<01NLoL@D?bnH}Ip8rH8u7$;tT?yrr;YK0ZF|0JPuT z3W4@0r;g_l4JdsyY-}MQjr4;L9APG~;%L4LFOD!Z)Sn z!?wFiN-$gEP)m>Sxsd@MCGoq*T8Z7i{ZMa;!?kg)u4J!gs!Hc}{xcC@5%i zt&bFS;i_YO9WA#`u5(euqWo3#=l{}XUO1#T&c|wh$@M6^je%%;+?92TxtSw#fF&-hcm z6t;jP<0DQxxWR!X+kp7Us#CYNW&@{efyxBWjnuTrL*}||G#t?xWEcoD7by-sUr6Cy zxKH5Lh^KmV?VYOlPUCL`PB(ksZ5r_V7%vY+pv>DUD&te0R6!qsry)*Mg{7nbuz}ZC7o@6)$q46e1tI`={^NhBwJaX#U6TQbZlRdA&k)(ix?p z@_!_)LVs$ybI# zJdC4KiZxg?^(kqmo;@Wg^B|HLsbufxu}aTX*3EAlwx}0@bA1U5#rBt|#GG&8wEAl$ zrfK-)^Q|$)@Yg#RKT?BEY@G*macGHb;Fq9qjKr~e`KMAQQs2J8iXaQ=mz}5#1ugy* zy~fK+L+g^^)-9d1Q%gsD$LoedyGJ;bT0j1WzU4s4`h?dQ$@SyU2baaU6B53Me>WZ*|wnYg%+`(C!8GE z>*6meea%B?;Pf$aV&yPp_+`|kikydWcU>_ZHKYn`1^LtQ$do<|caNEo*5I1Vh1hCTm9bNb|c#qSFN=`}ESNzV~mm!N_)Lk$$LoD4f} zY8j#knRS;}moj}CBk^CW=VdV;yOc=<4tdhb(VXV*dqEsXuW5y$%qIMKx@BzXCSsWe zZ7QhD&1cun^w-Tgo#*{p<9u?2d3vntOvi_RjV)TNTtqXSC&P}$7b@3doLSu-K_8qi z!f26xb_1?*LTTxAV^Dw@pP{7R+XjO3yRTU%RF6LgW?v(b(Ov5ox_ewO==~*@b$< zjz_Sse%lMFr8*HMGG3`XJYF$FS&)UW5MXEyr$yT5<`LYL8t59!;r(?BTU|qEWBdG} zZTdq|87e;jaaPR}-1KS+K@ZxJ3aQjrob+=jxZU>b7~9qS-lTf@SWbSQx^>22c~&Pl z%cYZaP+F6WZG8U5kmcWkFsTiX5Yb^UPP`ZL2#uR%q?)(rtx-R%97&aKC*jc`_RYtxfoI;iqk% z+fX-6w^C75@x0sm#|y4txrzjBeH}`Cq44i3W}6Ff z^cw&<*kMs*Z5M7En4YyKXk!>>g?aY0ZShzJ$#pr*bBsR|CW4cgfmcs0?1Qo!tQ)v!$zf~X30u&}d48O(@taNA znAh~Va=hWq;Di8}=JPy{0*fO-!R#jcj*~%P$_{OXKKl1R+pSueW*Qw`KG!ABy+Dj~s$TN>zE6RSCZm|`o5$4WsE}p^D-F>Unci+9B zBW!bg?!w%Kf9GbOSl83FFK_M>%wJT5=8EW~F{5Fz&ZrGGx%|H5iT<`zO9v*ueXSv2 zWSw!B24xzq_?gW#TXxN{e=DwuCsmQAVz3=GM*XEynGq@E zY_nO)xv`?@_*{GGrluMi0y#!MdsR{@+DVh2>Lt=R6AMB&BerVyN-4N~&rcSC`nAX780M7>I-1$cSqmMfJ_huUMvK zAUZF|A)b%H=jerWnlxPLgI$$B%oj3gQFbR)KkgP98m*$VXLZB75pFOxXe4od$Y$j8wh=yU6^hMcUMa$)o{PdGb zvAi!Vkq526!d|@6WHw%CZx>=5QagL1U3z6S@w}U#@v)<;-Ull^T}0tyXaUutIzacuZ=PkIvn(YL)L%h%ye z`Ll)g0-PSB_Z%X4Nr;Xm6J_8$gA2{Y&vugX>a{w;YE<7FbPw@364g3(4XVEH&ZOcO zeC+r_Pn|kT6UTXEd!noc*}|k|IT^v8k!NhqeEw=S zDD5wmy8KE6wd3sjSguH@vdypRs$YkzFgEMt2b+o6v}EIUy(IfFc)}L>fhpIRQCy?q z#JHP;fbgLcRaVEPD`*Nt)sw~nt0OD4eu;|hau>pUf1QliZ%5aLvl`Rz&!c{k7R6N6 z<}>-QcTSoIB!-T#@Nld@?bUqGlCPf=PwgniutQ}w>5yijaa=mev~0T{oyle1nMR_H zHTgiw$<^mFsI9RRcrVJ|b~XEWeZN*h_Qef&;xon_ zm-TA8_ty(;=Q~@g?0YAt>LwjIJkJGoH>^p=V>k?}-z=zK_gk?9cK&WZ8GEsP zj!oI#qA_(1*Vy#R^H3|Og%OOOLni+are{A>Y42Alci1-3FgJUhFj>&4Htf(GS{w|! zN^InVkQW<04Lo{I{m;_;zt)Pt`0DtS3!jEaCY!S=tN2i*{MBD^hNscGu2uOH_)$Z% zghLB?TG%RISIQ*J`_|fqcu+$_s>Ft?ccrCXFPzYcODyJ3T{G1CpYidkfGt6|@xx5;Rm?=p6az59HVKMbGE; z1G=@xj$_`uk-@}_Ols2jhE_pk_GZl?s9jATx_b-%YUaOBE?GCXvn1|xsfOv9#-=Ya znLcz{WnasG4aXOG9zN1GjZNv#&WDNfs#sWvt$M&NZk6z63kEJTna`_EPv7Bq{w*WY zd`E`QU;oDoAQ~i@zOuyZgI8wozY{Rr+I29qMcc6&xTLcp(8==*mqhR4ZnapSItqBo zZCEt%(U|y4>AkTt&JQ`z8oBI+-WyM!HKA2GlXO*>o0)}|S)zuyJr?5TEI z?$>@U#3Gp<8=-js0#gc8W!+i+#oXK;G%I0Ik6#>V;lWazfI_jSMjndwA9}!e4ztMf)T-|5a6j;j);j;uXZ@j;Z)b!%& z`s(&LgvtHR?iYeg!;=Yh;>RV>m9-%Rw)Z7)7K3;-PWPnw@vwB22l4J_#Q zhE?CYi+*&^U+HkqYX2h2(8L$wq-OvJnTWiegx4qy)+y^x1L%M3BDdmOg%}4gcCjKo{CB6=>Laxi9M}RdG^K?J zn6VDk_IT*~dlc{N8+O*mv2}j?Kd;i)xd;civOeIZSLIXYr5~WrVlv1dRfBQUGsUJn z$GR5)!(zY0%PbI>Tf>}s_KRm6;fjVx@Q=i1Eoe+-*U4@0PD;c5n?9MDaBqBLmmE(w z>q_NQ^_+54xftennShWSe1ynbPLbK?o5lE*$*S*>Ow;q2@q8fab_L78$pU~5`r2GY zZg}{wT8rEe>SJRE7dXSr!BG__sGu;(OWX3_r#Ttbu#A^`9uJ?!g?^S@Nh5&~iwi(Z z`*1ldy-Mh@9H(td0_y{3D0n*5AN;!qBjVjIj4tx0H*x{<_u&fxSgA|53>zhhr#Z0U z|4(Cw#ov&xvY3%XE<*w=>+PS;zO~^f)88n5OZa5J+o-8t5-*DMeJkP3#;_kx&v*t$ zKf}Rnl=@obv2Jrf%xo7d+>4mk=`{Wxj7e`#;AcE<$YC&vhxTsI1i1|Z%r2B#l8!IS z+O`|h@)geq-C@-?K7N9=tN5GLW8PTRSu>)_9o7KZhAs6y`?C= zm$><(JiFk#XWcW8*x!~_R6js?nW0TYG)fuEN} zac$#&4$h#4MHlni(ls{zxr!Ic@aIL?^~LHFov>flkVzX$3BddFdzgD&0oC7S7UwA5 zUt)mjuVMDk!cr#!Q=Wv#ZIa!unge#B5_bJT@PvE*-H3U+XBm&cgYqULV(X)j`e)NI zvPV(MD{nJQzdyQLD8axp8rItB2lsXfIj$92Z^D;8z;cCC8S-$0q`*&!#MOS9>6kot zOlVH3?1K`O%?gxP8iT6uDxz^0@4lvFd|;=NxYY6ArW2Qc_h-7!3Nb7tjuGnrzppW2 zTCCK8uT2rQxnzP(t+`WyM}+b_+bOerXEph%@$%%5xUD+>hnKK;IO#eWa$#`4kBwJZ zcG11-HJ3>*XIv^kJ9*=U_Ru6wEzd>@zIr9gG>&nGSY@|KCW|jZ`MiOw;nH*_PslZ; z-iVQhY*ZNeT5nc|9mWH%r_OceNi%uu!hD{MnpK5&dy~jy)jTk~#*I25yK|HJ(#9mc z7qN4lkKKGMqpHk0m~Hq9Ntg82=fqU0Gcq2b+uMz~xGaYWvawB`>HX^bOxF&)v$oKgc1*!pD;Epl7OmfDPq#0(_FG~&+A2ZW?7cRt zp0@B4Z%Q;uN=nP(;y^DnUmN3vg>nom5scBtcwtxj&G)I!_abqF!3id=A>cs{8#DtF z3~{9x*b@Htt5=?NjLu-`+ASRaG<`J0vJ^#8jrl&al(W?saoB$i zE#4N3G0NUZcyFZoAzH^qBZK!AShCtP{;%(5*>*J)Q)SOsDCZjHjt571?>|j+A|P*} z=*j zJdnKb1joyOZz5TH|0Rj1>bR&sp_2x@h@Aa(h*7Bh){3kuv2^@>OPPOq)ewcIq&W_M@!Lz|`kHs{ zKe|ITCX<`{A^6#Jq5kI*VpPCGJ6=^;{`IB4j2ubEc)y4JA2~16Qd1tSQA`QVbS1hO z|E;z2np&JoaI;!CIs3hFhMP>_ymjRMJ2_;aY^^AKw`4}QV%9(Pvz2Wt^*cV%5TapB z_|+|9M3dD_vPMnBQ>h=;>&E)(xJ`r_`7iLd-Q!*xK6v(f=eyhrE6jKCS8sTS4NzYZ zl9mXvB-7vj`NpNyD1`Kt#p+0nez*`V$s}j{?k{e?CipK^Q}TvW*uZ7v&Fe{{+Cy7K zdHTP|;}V@L_IuXeqR~rdKYW*%_T~8GxI^%z6_^uozNtfh`zpoS+s}^fj?1aUC@zt@ z&W+U}j`O#B=@=>0S)a99<(1o9Y!5{3*{WH`c`jyA@eAvU9NT&NGZWY?Wx+*mMto-; zXMqLxj14-U&UvCsrJH4DlGAnO?j$pcV~^7qt2=(*Tpt~)iO+7aR#40 zY=9KESw>J$ylS9l`OA~C)geQ>4YfSI0}4@%V?k-~Oa_q8i>+-vI zC&9$3yZx=)A;f1j)LEXS{*kI>VNc48wQzFO9xL3;ebIbK5?yuKpPJ{5h+|lL+0y@0 z+Ls4HxxW1mV=2O!BReTZvMbrQWTY99rm?SClCfk7*_U%@P{}kXLW_wJvSc002$3u& z`%VgF86-;)zx&bmob!Eu@1O5KJaawIec#u8-PiTGKKJ!J^US@aw+#&7`|Bg+w-0eO z-Mw6xkdng!ooMC@3eu63u1C(26rBpMj7oh#d6c)~k(7_XVftG~%GcPWEvXg57m;X@ZeWh} zlUk2B8Z=r>h=Ok%B`Fbcw-Q-35~Yz8`9pz3!FNyD(D_1hLukA#B=i1PcFRdZIn{uN zh*Jftd&i<6?{y3t+FAwpM_l^Y$!Z_2;Z_G1y;x*_RHF&D=>q+M%Z+y@%5Gg{c#!q* zDmWAlmJ^R<<^hfKAGB~21+M~+d~d4iw(*y&v&`NE=q#ThbP=iCL4P=IkaSVE`c@-H zx9jHp(9gPbf!o*I8Hg_$;w~ z*0dlePQXFc1ai;Tn4`(FA{pAJ-;uL}`ThuMAo8#lxvbDFPJJI7R9QhwP_%)Slsnqe z5y!hSAs;=;|5?cLxA|GEuYJxJHYKpM8xBt2941>o-F?fVTY@Z4J5Skaz-bPH2cXi^ z)A1Y5=NVa4xp+mgo zq|{w_q#=`Jjw{xV{XnQ@FA>Jcwu(6AYfC{Y#LFlhb*agrC& zs_?PC6($Oozq;$=QJ+lM@!d0qrWR)hQ?1}jN1OB(-9o1s;{jWeEPUu5!z z(Yrg7;YY>jw+XM>JiI2tC)szhNj;NkTNAp>CahT;wH%gQo_X(=k(AiOHp|{K2`L3n z-6l%x%};?aPfj|HmV0L2NPii18H*8@A}8gLywOs1%>1lfO!95i4H23@Z}3m}8B{G( z6+w24Ck6Y%8uMlHGR6>#x$N?U-q8OUAm-Twv-XJ}KWx4?3s{^~l;=Zsvz9UD+YD}>?5JEr7H_;F58jktDI~xw4+@JSbQvd1pYka%Txxt~gcpxp z7-uMEIcKuVF;u}Z@oFGo2^mlx(ru_Iv00y+(7h|MLaxoe6+If21`lNro0g-^MYTpL z)0AoBW;!o&0+qFD760;@%!;im_uvR6)|?v$w*CgQ08g}M7kpcjB3n&;E?omw*L+l; z5j0GVvS|xhi-3(Wcv`=4HkxM|t)%M5<`m(&XG~P?ub0~0$BtBwWspe~GYTe;G&f|V z$l2|M4ncU#mmj2_Cr;T(g!hC82?PpwE>?ci7g=8FHCk#KwB@r=@0Fp6J3r4Ba4-;2 zf~fk_b9E~9v!0QZaSkaCi_z~6?($FnsYaZ4Um7XMEy`sDc>47f{I<7%Ysl4floR;# zUhY|(CR!wSwozWJh`ET-TjB*iCFhOck*+ugRqsCwZ3MQvy!NwGJTwwYInz0fJwPaG zG@AXgrYA~3Y4DZo~Ei`Zt$_ib zdzE?(lIDa)H3Cofbw1Sgi!#y;mD$5K;xN7n4aQas`q$I4u7jKtBK1@6fnZGf($vY z2B0ccSVhD^)&5mT;QGlI!Js{RQP4?e^b!pKpB)9)J#oun?MjG+u;%i}1W#+tgOZ#I zN07XV%u3ysd$X@DzNZe4v;I_4+%1?a^*M{RQ5-^Jqmu*DluGH>KTPRama|pZPb?Y| zb4o$hrTn#`=s7+w&qEx!>kmHi2T|_z#R1}!BOzO16zji?EdL$k5ch-RK#I?MCp37E zk0jdYM9`iU8V@oRQtnCLbhEs*ETtcG=6*1du1gKq^c*488DZ~RX&plwJ&?J_KdSKt zq@Zt`>q_A;?7vvjQ`*dNR4 zuM;>Fx3a`9WCc2Y;X-3YhC$jgd+;9yGMWZ^KsUNg-#NOdrY!U{V2}-M45&dKDy;G z3Ma_@XtNXLadxoY?mrI?Z!e4N9-fQ*5e9N38VUXY&S!n&%0ZzWMCMq6qK}I|IZwGRE`ip=HUcS z)|bseT}=stYp@?i0s#YknDtP8p)6LvnreqrXf3LJ`sUTCf)b_PX zv@pjSTJ1ZBg|h0_*DJq*sB&^VPGEv7H3D2^?2sX;&Gq?XmJMalt_h^}Z0;VZe~A%R zb-4cL=cg_ACAB&}r@jyNp9dlL6=IvAqBTJir6){XlC0A($u$^Mm@@e^ZlD}Y0$+gj zUuF5hG88ae^h~$gteuyI21x0lAS@pRIRq^thq?EYKT}GH(yqWXEHag*PkS&{d}^sK z&_^MNRU|mii7eRpdK#pZ#vY^FMQ+Of=kz%tE2Y=X3%Xr2-)@Ph=#N?Nz=wLr3EPsH z%Ro23F3Ozj0pH3CupDMTrf*KVM}0<3ORJR_#KOSO6KZRIC#Phq?R z*Z{@?F9Ml|$7ArSc7V3_@b*Z#fr5IZdvhB*{Sh$etX68M18<;b2WF^w{lU}L076;>4yV=&$pbJJTvU@vu)RK zc70kqaO$M_dO>=S@s*^hNB7OMae>J#er%_#3m-h|&oX2L)DycPb0Y7AMF}Ipsi};t z<*{C-cBTKI;oNkl|GfGb*i>{=C);^s;ty~h(YXn}%2TWPph3jCq&tn8Vl9#F)f}c9 z#C%EIN~?qkkkg7wSM>~}V$I517_m}%J}ynk2FsgUjjj7orL$eo-|e(_dHWq(N^EOl zY>S_+jeC`}dB7o~6O~ZKp~j{5AZY836uEn*OV@rS**W@p4yns_u^z0B z7r9+MFeR_TEf;swGQ4B{X;j^sOH7#)1dzZT0WZrXY3!B_} zS5xsQs|ph$pBO81LZ|ZO$eGJ@#bC|F6Fp0HNp=E@V$*z4+tItEo=raL0N6q-DLWDZ ztJ^t{{k)2Yw>>G}W5|a$#>}u)m*^{=>b&e_E&0)j%;_^bW!K2ZJ~`FYS&~119B%@j zVB67Hahg(_8l{cXW=TEVW)qt#QvqifH(-10RVT^caLFEfht$-`H|W?+Wnjb5fD`$j znNnm|PyMCpbE9b7=}9ThQl>!Ap8oYz3u)f0AW$kDBdfY7=l1#4O4&?BqhCX%nX>p$ zooE&R)}a*`crHNbrqYT6P2o9dW3H%<`{p~bN=;4jE4iShZulf~1k;Yz3ZIL9p#@*q z-YRV~deT@bJcKg0KepFj&V#Zuva8s)iuMw92Jfuwuc~91+g`&g-IHdqlf8M$?C+M8 zm->#4US*;ln|ea(xzM;O6m@cHT#B6G-)e%C@jKyqoO~m%dGisgEnwy4Q(Gb6g|;zH zb-}Sv@;;l`QR2b+Zb{qP#L}|sH+P9OSfV@XrISpdmF1UvUes^&@(y7t!BT&~dDBgb zoQU^nm}F3SPO``P?8wk8u$V|(S2)yB>Xn!BcmbHSmF~+SVJZeU`l4#A*g_%JgXwHQ z)2ykLqeGY0U)I;ij+=s0_EUh^#YyYz@lN^EoN0nn@>5x)9-iRAN1S1BHEr@YQ+3Gn z^XECcEAC)o&Q@zjyt6VVi@dg1Zz@XZ$hGwxB+Yn|Es}f&e+P>i5~TolV{pqM1)BRN zZAU3Zr_i{fG^32a>z5-|8K!i}qzKpe&^wIJU_XEUeEA^Ddx=?Dg5t!ByAg}kHZCu6 zk_#$w5+9H)a2YDcy*Dh^&Q8$^s>{D2b1<;AZ)Y^SLV%y8sNi@XgDlU0-{6kk!_9Qq z@uLeRFJ^<06mp?m#(H1p`cR?W=%OT6q$4&XgbRMRK)}kU+hU`kRLX;wcl&2x_oDod zvG`YxZ4ln}Hw~wJ!={EjKbLO=_@XCM5#wO}njLOTUHN@@S>%c6?4cKa?)2xetBg_>Bo34wv|&f2+n9B#JK00cvR) zSHo=6VvQ%Cp^ESo0Hs?i9y+$)Y7*n*(>Jv%>vzp{R%){l>#PK?fo9;fx6 zxso?}ANymvv?1>ts9N+X+cFy9Lp$>lv}HCYE~*@|`KF(V?*xv7aAp2^IEHO!yW2qfm1e_AQ%E5Tdy$e{7?7B*>Q0Dxg+Kt{C) zz)nES=M@2U#8#F(K09v-P;LGkFYdg^Tfoywf#kQYlKV(2(_;Y#K%2KQY!rPpkd*h& zfNQaDfMf}9Q*;Zsrd$N%3St7-^y4+5lfIxMuU1gu_|FmOQo0i~C% z6XX!9=TVFC1Y^YeuMPJBQTAu%5mMDSBxClNJU3*}{1VPhTV~v3s5=u$x8*8k-qKn* zH|N z`h&Gs>2m~-vT|F_0#CXF7E&&MqJ=y6)5Iq3`*)itBk^f=7wrI{Xi#Jdgrk}t(wb=Z zX~QnZzAn8BaYAFaiyxm&&-M1GpGg(37QD%}<&skQ9kyaM>hvcUrf-Vohvm}eUAq?*QYldnCEjhld10*@Rf3!8Lg0JP+s4F zL_=#WV%F>U&$hkpO|S%7y5)maKuJ2!MO3pgsIYKO?T~tst;cP^me0!ciM;v!Bh;}U zzJmfn01>!nx?P|zdx)yd|Y-tq+j{_E%@2+f)d zDlYF22p=G98F>KV$gd;NASa9$mv;x+ZeVr5=x@O2NFET?UhM!bdayvb3}8Pb+6Y9e z*Xw^}V1yj9rRfuuD*!ks!k`l98%aMytXdeC6X>C8O&+z?9jT>~F!3y02HM}uCXQ#nChafh(AK-jv3()t~-iE5S#o|_a#IK&fL#hom;Ma=*< zKa|NEs(OFL(yXw5ZYZ3zDBy5Fm_>&rjB#sy?0Ys$72eG(fBg*{SVRe=CE8QAl*0Z$ z#uKA;O{A9K1j0o|(QM6!*dI>xt%Z!Wo4_;=4S4d;7{@t@Pro8m>4+U65b6*m3SviY z6G{kb5dxLFzpcC>+`Ni9V_`BoZUG$$!vJ|mS{Hj?3pz-HB z*PMw+<_#|Fq%K=TxiRXp903K(qJsBIM#R1!z=fFc%7?ctXwLz0oG7son?B}vs4B`+ zUYMpCWyD)Oc<2nO09MZw#-?`5^X|APY*cJ|MvAPj91;lZlm^_5aX&9pe$SvV&4@X8ltzH2DNj^qUEj>J$5Q;?TTTW>5~9xa;}syKAzO`JS6NE z5^V?kImL9%kq2hfAJ)IuNz z@5R<=My-K@EJ3G!Y*x{1;G{;FrjO~|H=S3A}LzDxK~;bY)Ctl z#IP0TJvD%)(eu?3_x==AjsgVfX+kQ5Q-D5QGI-~+KTMJVk6aU^R%*AMv~>)mM1K}D zkMRel55UaOq zmv^5LZVGP&l^&sXnnh$I(RgNF9Int@zhn-c1_#I^DI`CBa11skig+<6f198wE++TY zI)i${jUMq4QKBJc|6rRl>RF>a`P(k3=b%enXeCS+x@)qJ$O-ud829h0@%)TOFjAd| zg&P?7;S-tI8ug$>)YOoHx9WYY28p^srWw;@qD0}Ml0tFXV7rb=p1aAtQbg(*PSjrh zb%RWLa}c<|o!O@?hJW9?w7IViwhvgTFY=|1LFXpQx1+*cCpI%^9(!BG2 z=8U;1{vbU2UXML_D!mSD2i*=y=Q8}4>Z~qR`-jsanduBy!Tk_3+FaUZ8*t1Su)?V| zazR9!qECP0lQHeIl~1Vd%3V?qpa0zNE9RwBl}WNwuE?XAg3 zv@!4>tNCH)N@$~bL29XBmPLyE;_d4zCH_eaFY~ADxoJ!;{)_p+M}T%nK#cvhK`0(J zO9L<@6m1ms4?4|@`D^0TTD>nRgS%qBa>KTjHqnXr@JP^%ESqPE{V#|rw=^;Us`Il; z^X6HtqW-^|7HA@G@nfgx^lw8m18G#wA@DmsY6@bJl8PIj%*rqzc(a*#*#8#+Lg$M> z-TfBXs7)%GeWYNm>0~CAn!glti z`w^T;w$x+3VQ^_bI0NeCrSkXb$$Xd{7WeCdmqrQF`{9=f9YMLCqIsiH9=h90?90?B ze*7AO9*QOes8ECl7M@114lf#?jf z(|zriy4ZRZ`8=p4QttU3HtBstc=bR<`oCoRDp_9;;=w`aL`>~D{+|&r<=6CLAw(cb z_doq_83bN^Ha4*h@s@RS0!UK9UNnB=uqRP!zI=~l$* zHB^|E*xh%Ukv1sdj_?Tj`h48(?_f;1r^DKTx(wbdZ!nJ9gJz{@J{Z@m$gZG|nBs#VPoyet`_9;!@a3dA5Fz-0 znT?@LE?dqpp{gS{6^gm57^-x|%)9OQ5kcor)}P8NI+nFgZth;2C^2O3`YGk3vEn)9 zMGJA%f4B*F`22~P4ey^k#Zu(c_k$Kw2{#Fz5o63Q{xh%%2HVoMx~shEY1bX-bzECl z=-u5Nx@q7J?8N$ILF;VlIire=dnZ2c;6}%{+W>MM8@FvwCfl!Hvk=Bnk_<#~~mp{nhRn?HawcH@Jqc zI4g@|Cy!zBS^JQD;kycV;|imNQZMVvg`=(@8$9xpw>2r=J}_)sBXb#(kza$pl}MnF zdQ8i*_1A{~M+2o%a{iMc!q9o%`QwKIfPWM|nf^tEk~yB(;}%$f2pb^H7Fcas$xtOy zrD&#kcU1d$`cIg2d!V~rg|SDeopqX5Z+iNGylZz!BEh3=fIx*?W@9z5-K+q#v99fG z0J%;MGd5G-^6tqU3JAqw914DZ1QAEEouO;_n$zpDJ^3sC3I~sT09kx{x^o)VIvbl{ zVDGW8^T_L%m^rF>2C>>nxOqyfo*NPQJEB!}d$>mLe?JXiUcezX{f$s1DHicN0_+6S z#HTGXRu{*Qi-m|!e;C_+uga%>ee|>`>d|3Dq%dMHbvtNqg0MA-Sao14Dzg(rikT1y zGU85#^hsCU1j4qsQ#cCMSYBZyf@aK5*(Tx1OW$`6uju+M`S~{nk3KJ1 zT6LY$q^+e@0TpaB4$bX)kKug6cvciw@|Jq;1>U?gk-f(=RNhwZTB%>R_S$bVp}#kR z^?;*)<7yH^8O=s$7iD*xd^!cxKm6v4#^Hq@7&HCq z!UMW2VVqmIX-_l6vmb{@6-;@zCUL-SXSI?1RGWo(g_T@amw^7drB+ z_LvHP!d9{y`m(*M@QuDZyVZHBXVe_lxT zw~iy+JT`3oU@(^ym{QeI;aoGsan{bi_+-+vN1ZNfW)Q3B5Xlh2 zOApvzNj90ZvW-&s4{>3a8$Fli`RNRp-NiI&Wjbq`b z;L1C&T}-sakDeab9ou&3h}CEdxh*!WL|Z1V&kxIU97cGwy&eO5N}I2D_n57Qwk?a; zdIQ}#QY!TA)?)Na%Gbh6>Ag-I+e$9uMH>Uk=e-?1zGzEjsmh!BHumQyC;h|ztqB2? z7i`rH+@g$h<_La-LOdZ22Cp{y;n$iK@6~&4va@clxUE|B(?lfODEYm-RuBsci$<)df>qnr&~|B_Z!WAy#yZJs=1+mn)X2HH-PH66PU3 z?HZh|9W86Ch0-f0rp_FkGB&VZZqMAarO$N_sc-~w4e!)c&h84pe?xS$+H-};kiT88 zFlq|d-mKTzb1bsh4xn9xjgk#;`<`D?tfb$cKuEgR`Q?XD>6P5-l$;71GuM}DHYf)jI$b33qdR?i%WL;ZLXJoc#$``nc^Smgd z$+eBLfF|~;JBxcUn7Rrc+r2Vc?%RRHbmn@-+Wg@L!^+yWU3j_U+`-Z3QeLYprRx=0 zM;98m8CNi)WQx~Ur_wLTNeOoLB!)vM?v8NyXr@H?n5w1Ek#=&WPR{{tdjrAhz* literal 0 HcmV?d00001 diff --git a/img/tex-3522f8b8d6b2b912a41177e213f96dd2.gif b/img/tex-3522f8b8d6b2b912a41177e213f96dd2.gif new file mode 100644 index 0000000000000000000000000000000000000000..3352d1401dc805278bf429fd9ca93587c6dc4252 GIT binary patch literal 168 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 literal 0 HcmV?d00001 diff --git a/img/tex-6f2e0e91ebd226538ef465b081f4468f.gif b/img/tex-6f2e0e91ebd226538ef465b081f4468f.gif new file mode 100644 index 0000000000000000000000000000000000000000..c3ef204116d3999adeaaf242e1cc47ea9dcec0d6 GIT binary patch literal 497 zcmVNVUD+0% zXsWJkD-}nF1c__IGHvgC&j*UmBEayefI^~i$z0BA6GH&e1U)-aYIVy+2^yY)qucq0 z$K-U{5t}d^3pIek3Ew%GaM(7O_wMJ z50NLHJ)$;dpc1B`pQj(BJFYDQZ6FE)m>z_Ox``pODX^#twRyl4!n`5H0>>ajs~-;w z56Dc;zt1lme#F=SCfllE+SI5Hd)*Ro1n4~i<^}9g*alz#>k|rhAqWJ34y*qp1eAxR z-aQ2m`gwpwPr^NZfL1ur1PYddHUlW85C900$AzERE=tH~phyBiSVCfi!qG)NRsdj4 zi&@VTIS?&f$V}950)kl*cG8@XbA^EdrxpkxK&Svy0yPL+L<*n=)dzjD0xF6^DboW^ znMR#DVF7_SUYkB03zlfa6n$XAEfVzR2d+lqRt@s@gkB1Lan8{wx5EKI3&x|AS~?n!UU?P7K&Ye3mX3Ti^ z?p;Smhk$^9k&)4=RjU+#vM>TQFzA2?kQodtF#;Y6ZUQqzjDPF6x3hF!XZ707(xch? zG=-(Z+cfUsjRs*qp5sm88U_+GqS6((3Mvdc8IBwC*6FoA;Eb@%=|AeMP%5&2nIdEC aTZ=`xoThq)A}TQFzA2?kQodtZ2~7eUmLX;CI$Qrx$JRDSui2Wr$b?8 zrcT8t2a!46qFy#KQzDy+92!O1_!Au?dF!9%$g$n&l(J zAa~wy&BmtIwalx}JML0bWwZ$6=LxH2;N##lU}ddu3%Bp#v1;uXv2Bl;Cd?hiJX@59 Qn`iz4VOEa3HbDk!0MyGz&;S4c literal 0 HcmV?d00001 diff --git a/img/tex-9eee2c1c197de7cf3b522d1cf624846f.gif b/img/tex-9eee2c1c197de7cf3b522d1cf624846f.gif new file mode 100644 index 0000000000000000000000000000000000000000..7a750cdbd5f887f83e3287c6cd4686710288e80b GIT binary patch literal 297 zcmV+^0oMLUNk%w1VKe{|0J8u9|Ns90005Ynn23moW@ctYL`1r}y6*1o+}zx%s;VL) zBFxOpR8&+D5D<2Db^rhXA^8LW00000EC2ui05kv+000Em5XecZ1?Sw&Gyl~9j*~-v zj&@o|F&*Yw9mKg9mEb5;EmMNT$snvCc#}l&2XHJThk?T&ARsD47E*%n2?m4$Zp2Ut z15bwlyPO;;2bVyF2o$A`d|m`7r~nHt01Qtw1Yre-R$N;cE(%W)42>Iv69aq=7FkA( zT>uSh5)J_)4od}31`G&e5}Xuo69#+~lOqeYf(Hzuvuywd1OWqA00WUPb|ef#z!%LG v1+^fsAb%SPt`e9s3D`_fzzNjh=9|9d=iv(k2JZ*oyt_V&^9;Sm5k$(&|i literal 0 HcmV?d00001 diff --git a/img/tex-e2d55fffd53a113312172c3c24cc951c.gif b/img/tex-e2d55fffd53a113312172c3c24cc951c.gif new file mode 100644 index 0000000000000000000000000000000000000000..03ba308b4034f733babd7ec484263fb399c2e31d GIT binary patch literal 301 zcmV+|0n+|QNk%w1VN3uH0J8u9|Ns90004-Hh?tm|s;a8o+}u=DR76BXc6N3U5D>b$ zy3EYXGBPsm?(QNYB4%c0A^8LW00000EC2ui089W5000Eq5J)jdF*57TyXTaJeWZ2} zl5v!5YodVae!?mph*a2fKk+z?qqWN<2AO~YFhC4_zGHHkDX^N)Lcj`G1gcM{OUw0& z3s3We0T$2H00CRlTo9j)FQAaf>B4&k4I3AOfrf=Tf*N@`eG&u>1b!uG8Iu)CZ5azv z8l84s38A18ok$v(1eySY4=@4XfRJvy9k?0{T$Q^_fR-CDZps@2y9r~( z4-Xj%4*>$h0=ZDz9@C#ZB-Yqm1=kGB9O^#od+5pnwY~K98#%)E`t=7DVi5p4$=-KU literal 0 HcmV?d00001 diff --git a/img/tex-efd8ffa0fdc4e994808665f543b0fc78.gif b/img/tex-efd8ffa0fdc4e994808665f543b0fc78.gif new file mode 100644 index 0000000000000000000000000000000000000000..8fe1f60307629ca254eaa2cbfa0be6aa77879c56 GIT binary patch literal 343 zcmV-d0jT~*Nk%w1VMzcI0J8u9|Ns90006qWx|o=lW@cvY?(Pr}5Zv6{%*@O(GBSvW zh<0{%R8&+VA|k4)szgLYA^8LW00000EC2ui07(E6000F35XecZy%?_+mM0IAjbv$# z4?_vTalUXY1p`$CimdMz>rRM(U?&(5Bn88dS6Ubz#vzKhd_A=XkZBKyq>Wb1s+r$U=wx#16XWpgcA#HiV}2T5-eR9KL(0Q6-x~c z6OWP?P9||b2u~RSXaERH0}GWEczb$%7!7U~uOdNZ4*+1h6RHx54h0Ujp#V3Y7stsG z251KfeKpX^4g>>_Xavro3kiSWHUQw03swgV3TWTv83~cgBlITtC8+i${3QP}Ao$g< p#6S}VOHe7OFh@fYee^LD<)vPQh!!cRkvCD}0FDI~Hcp5D06TR5cBcRU literal 0 HcmV?d00001 -- GitLab