{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Matrices" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 1: Linear equations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Consider a set of $m$ linear equations in $n$ unknowns:\n", "\n", "\\begin{align*}\n", "a_{11} x_1 + &a_{12} x_2& +& ... + &a_{1n} x_n &=& b_1\\\\\n", "\\vdots && &&\\vdots &= &\\vdots\\\\\n", "a_{m1} x_1 + &a_{m2} x_2& +& ... + &a_{mn} x_n &=&b_m \n", "\\end{align*}\n", "\n", "We can let\n", "\n", "\\begin{align*}\n", " A=\\left[\\begin{matrix}a_{11}&\\cdots&a_{1n}\\\\\n", " \\vdots & &\\vdots\\\\\n", " a_{m1}&\\cdots&a_{mn}\\end{matrix}\\right]\n", "\\end{align*}\n", "\n", "\\begin{align*}\n", "x = \\left[\\begin{matrix}x_1\\\\\n", " \\vdots\\\\\n", " x_n\\end{matrix}\\right] & \\;\\;\\;\\;\\textrm{ and } &\n", "b = \\left[\\begin{matrix}b_1\\\\\n", " \\vdots\\\\\n", " b_m\\end{matrix}\\right]\n", "\\end{align*}\n", "\n", "and re-write the system:\n", " \n", "$$ Ax = b$$\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 2: Covariance matrix\n", "\n", "Suppose we have $n$ observations of $p$ variables in a $n \\times p$ matrix. The covariance matrix is a matrix with special useful properties - it is symmetric and positive semi-definite.\n", "\n", "The sample covariance matrix is given by the element-wise formula\n", "\n", "![cov](https://wikimedia.org/api/rest_v1/media/math/render/svg/61c41f7dd5d200b419a9cd94d8cb92bd47dbe08e)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "n, p = 10, 3\n", "x = np.random.random((n, p))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.5811518 , 0.81170724, 0.46066868],\n", " [0.62916694, 0.56696383, 0.03571622],\n", " [0.15734164, 0.32934947, 0.04289507],\n", " [0.0742373 , 0.80973484, 0.15784067],\n", " [0.71996509, 0.78657021, 0.06061383],\n", " [0.80620927, 0.54386761, 0.52941123],\n", " [0.44361754, 0.83900412, 0.06595371],\n", " [0.09411615, 0.73196712, 0.46633059],\n", " [0.66841256, 0.9355156 , 0.00934562],\n", " [0.90776993, 0.06387907, 0.44189336]])" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.09177719, -0.0213747 , 0.01174369],\n", " [-0.0213747 , 0.07312517, -0.01689738],\n", " [ 0.01174369, -0.01689738, 0.04730807]])" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.cov(x, rowvar=False)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0.82599467, -0.1923723 , 0.10569322],\n", " [-0.1923723 , 0.65812653, -0.15207638],\n", " [ 0.10569322, -0.15207638, 0.42577266]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "v = x - x.mean(axis=0)\n", "v.T @ v" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example 3: Adjacency matrix for graph\n", "\n", "You can represent a graph as an adjacency matrix. This is a $n \\times n$ matrix $A$ for a graph with $n$ nodes, where a 1 at $A(i, j)$ indicates that there is an edge between node $i$ and node $j$. The adjacency matrix is typically a **sparse** graph, where most entires are 0 (no edges) and sparse matrix representations are useful for efficient calculations." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import networkx as nx" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": true }, "outputs": [], "source": [ "g = nx.random_lobster(50,0.7,0.7)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAeEAAAFCCAYAAADGwmVOAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvVmMZOd53/0/+6k6VdXV3dXLdM/OnZTExRwpomRRoixZ\nFgwHlC8MGEKQILngjS6SCyU3UQQIRuw7BURgXfjGSBDICBLhswWbsC1SHCgUxeEuDpfhcHoW9vTe\ntZ46dfbv4qm3z6nqU1095Ewv1c8PaPRM16n9nPd5n+3/SHEcx2AYhmEYZs+R9/sFMAzDMMxRhY0w\nwzAMw+wTbIQZhmEYZp9gI8wwDMMw+wQbYYZhGIbZJ9gIMwzDMMw+wUaYYRiGYfYJNsIMwzAMs0+w\nEWYYhmGYfYKNMMMwDMPsE2yEGYZhGGafYCPMMAzDMPsEG2GGYRiG2SfYCDMMwzDMPsFGmGEYhmH2\nCTbCDMMwDLNPsBFmGIZhmH2CjTDDMAzD7BNshBmGYRhmn2AjzDAMwzD7BBthhmEYhtkn2AgzDMMw\nzD7BRphhGIZh9gk2wgzDMAyzT7ARZhiGYZh9go0wwzAMw+wTbIQZhmEYZp9Q9/sFMAzDMMwnxraB\nN94Abt4E2m0gnwfm5oBHHwUsa79f3VDYCDMMwzCHj8VF4PnngfPnAd8HdB1QFCAMAc8DNA148kng\na18D5uf3+9UORIrjON7vF3FoOOQ7LoZhmJHgwgXgJz8BZBmYniaD24/vA6urQBQBzzwDnDu3969z\nF7AR3g0jsuNiGIY59Fy4ADz7LHDsGJDLDT/ecYClJeB73zuQhpiN8DBGaMfFMAxzqFlcBH7wA6BS\n2Z0BFjgOsL4O/OhHFL08QBytnPCthpN3u+PSNPKAHYeOP6A7LoZhmAPFra7Jzz9PDtGtGGCAjpdl\nuv93v3t7Xvtt4mgY4U8STl5cJA94tyEPgI47dozuNz9/4HZcDMMwB4JPsibbNh0/Pf3JnnN6Gnjx\nReDppw9UDc/oG+HdhpNffBF44YUknDyCOy6GYZh955OuyW+8QX/POn43aBrd/403gC9/+dO9h9vI\naIt1iHBypUK7qUFfnggnVyp0/Pnzt2fHZduf/LUzDMOMGp90Tb5wgULWuj7woW3bRrvd3vn5NY0e\n5wAxup7wpwkn/8VfAIXCJ690PqA7LoZhmH3j06b4PvMZClkPYGVlBYqi4NSpU4MfL46BN9+kfx+Q\nNtPRNcKfJpzc6dAX9MADn/z5D+COi2EYZt/4tCm+jz6inPEAJEnCwGafRgNYWADeew+YnaVK6QPS\nZjqaRvjTJvBzOfrCPS8z/LGwsIATJ05AVXf4+FSVDDnDMMxR53YUVb39NlAqDTxElmWEWUZ6cRF4\n9VVAkmg9P3t2e9FsVg56jxjNnPCnTeDncrRDWl7OvHlxcXHwjksQBBTqYBiGOercjqKqsTHyaH0/\n85BtnrDnAa+9BvzjPwLNJrWQdjrA5GT24/fnoPeI0fSEhyTwoyiC4ziwNI0MbbOZeL3FImCadGCz\nmXn/OI4hSdLOr8H3uUWJYRgGGLom74pcDiiXSRgpHTL2PGB5GdbVqwgcB6hWyVhvbND6rqq0Hnse\nOUa/+AVw+jT99HvW+9BmOppGuN3eMYHfXl7G0q9/jbtUFXIc07GSREn7MKTfrRZ9mRkMNcJix/fo\no5/2nTAMwxx+hqzJCwsLOHbsGEzhAGWhqsBddwHvvENere9TnvfaNSCKYHY6iFot4MMPSb0wDGld\nz+Xot6qSYVVV4OpVuu/jj2/PAe9xm+lohqPz+cEJ/MVFFC5cwESrBRugnVWxSNXQxSL9v1SiL/Hi\nRconALSLun4duHgR0zdvQnrvPfq/521/jtVVSvIfoIZwhmGYfWOnNRlAvV6H4zg7P0YQkMF85hky\nxP/0T2SALYvWbQBaq0VGtFCg5/N9cqZsm7xaw6DNQKlEr+mVV5I1Ps0etpmOpic8N5dtHBcX6UMv\nFGAZBtbX11EolbZ7tYpCeYNOh4oJjh2j8EYUIZZlFBsNSFeukKGW5d7QhuPQ3596ai/eKcMwzMFn\n0JrcxTAMuK6782OkU3xxTN6twHWhr6/DUxRavzud5JhB9TuaRsb61Vdp7S4We2/bozbT0fSEH300\n+RAFjQZ92IUCoGkwTROqqsLO2umEIe2YHnyQvNq33qLH63rNvq5DKpXo/5ZFoY0XXqCK6qUl2qlx\nPphhGIbIWpNTDDXCIsU3M0P52s9+FvjGN8j5sW1gcRFSEECKIsB1E2fINIHxcVqnb96k24CkgEvT\nyFAvLGx/zj1qMx1NI2xZwFe+QgZUsLBAH3aqOq9cLqNWq22vdLZtqsS7fh04cYK83ZWV7HCKotDz\nhSHw8svA17/OwxsYhmHSZK3JAs9DsVqFdukSCWlcvLg91SdSfC+/nPQaF4vA5z5HUUfTRDg+Dj+X\nI6M7NkY/hQLlgLt1P9HmJmq1GpaWlpJ1XzhS/Z76HrWZjmY4GqAv5pe/pB2RoiS5gxSGYUBRFNi2\njUKhQH/0fdotra3Rl6hptJtaXQWaTcRxDMPzqHAripKQ9N13UxP4+fO0Q2NPmGEYJiG9JudyiYDG\ntWsotttouy6tvaJAVqT6Zmdpnf0X/4LUDPt7jTc3gXweoa6j02xiTNyeKqyNoghuGCK8eRPBiROY\nmppK0pCKQo+/vAycPJk87h61mY6uERYJ/GefpS80irZV50mShHK5jM3NTViWBSkIyLhOTdEJIrzm\nfJ5Cz5/9LCJJQu3113Hs+HG6vVikk0SU34vpIDy8gWEYJiG9JscxFVdJEmBZkAwDnY0N8lwFYQhc\nvkwiHf/5P5ORzOo1bjYBRdnqE47jGKGiIPZ9hHGMMAwRBAE0TUM+l0PBMLY/hixvb0ndozbT0QxH\nC86do9m+N29Soj4jnGyaJhRJQmdtjb6EuTnymptN8n7r9WRX1ukgOn4cm8eOAY88Ajz0EO2c0v1v\nPLyBYRgmm3PnKGX361/TumpZgKJAVVUEQZAcF4a0hqoq8MQT1Nt7/nx2r7HnbRVptVotXL9+HSu2\nDT8IEEcRNE1DsVhEPp+HrChbeeEeZLk3X72Hbaaj6wkLzp0D/uiPgJ//nMITInwsy0AUQYoilAHU\nWi0YY2OQP/yQvGDDoN2aqLAzTaDRGN4jzMMbGIZhsllcJGP6zW+SZ3v1KhBFkGUZSqeDuNGg4ioR\nij5zhqKNjgM89xz9rR9dB+IYrutibGwMk5OTkGWZ1vBarddwSxLZgH6iqNc73sM209E3wgCFQe66\niyTJhEKW2Ol0OjCvX4fmeWgpCkq6Tl9a+ouLIjLMH3wAzM4OV8vi4Q0MwzDbEUMcpqfp5/77geVl\nSM0mHM+Dd+IEjMnJ3hQfQDlkTQNu3CDt5zTFIhCGcBwHY2NjZIABSiHWauRVi1RkHNPz9xNFSYvS\nHreZHg0jLHrUdL038Z7qGy7k81hdXUVBUSD3G1lZ3sr/ShcuYGJqaufn4+ENDMMwvWQNcUityU3P\ng3PmDIyu8MY25uepOlpUMQuHynEQ1WqQOh2YlUpyvGGQxoNwiBSFjLBh9D6uSDfOzpIBXlqiNOYe\nFdceDSOc7lETIYe+vmEDlB9ut1oo9LcsRRGFMcpluI0GZm7coC8/3dydhoc3MAzD9DJkiMPQXuHj\nx2ltffHFxFvtth4Fvo9yswn5yhXygMtlMrZCG3ppKcn5pou/ANocnDhBHTFRRAZ4D9tMj4YRFj1q\n588nOqED+oY3NjeRj6LeijXfpy9VUeBFEUxNo/t/7nPZz8fDGxiGYXoZMsRhqBFeW6MI48ICpRdT\n3S52sYh8p0Meba1G9T9zc2SESyUyyEtLdHCzmdQFeR4Z9EKBcsBPPbXna/fRMMLArvqGNU2DPjkJ\nb3ERpmHQlxQEVE0XhsDSEqRGA1q5DFy5QvmM/pOKhzcwDMNsZ8gQh1wuh0ajkX2jSB1OTpIRTbWc\nxnEMOwhQmJsjQy0cK6EJXSrRWj4+Dvzu71IbarNJHnCrRZ7vn/7pvmn9Hx0jvIu+YQAYGx9HdXUV\nWrsNJYrIaOfzJNQBEgjXooiM869+RVM40uOweHgDwzDMdoYMcbAsC0vCW02zsUEOVLdNFKUSKRhW\nKoBpIggCxHEMdWKCDLB4DFEgqyjk8X7+88DEBKURxRCHZ57Zd4XDo2OEgaRv+PvfT/qG+wyxoijI\nWRbijz9GrCiQyuWt+cJRGCLWNEi5HN1f5IbFOCwe3sAwDJPNkCEOlmWh3W4nbaBCUeuNN2id1XW6\nv2FQKvHDD4FiEZ18Hrlcju4jQs8iJN1u0zr9xBP0JFevknHep9BzFkfLCAND+4bRbCJfr6NVKMCI\nY+ipnHEQBFCE0RZ9aGIc1uc+RyfGHlbVMQzDHBqyCmRTqKoKVVXR6XSQ29ykwtk4JocnHVmcmSHn\naXwcWF2Fdv069EqFjLRYxw2DjisW6TF+//fp+Lk5eh0HKFJ59IwwMLhvOAiAS5cg3XsvcqqKtStX\nMO26ZHg1DWEYJkZY9JvJMv37N78BfvzjfQ9tMAzDHEiyCmTTeB6mOx2EL75I+dx8ngyqWGtdd6tA\nFgCQzyM6eRLrYYg5kfMtFrfLCV+9SuqGB1Q86Wga4UF9w2+9RVVypgkVQGl+Hitra5g1DMiNBtDp\nQDVNuq/4sW0a3mCaJCTOMAzDZNM/xAHoGeQwvbEBvVolA9xoUDjZ9+lHVckIp2i1WoBhQK5UaPLS\nffeR0RY60LOzB1486Wga4aywiOdtq5i2LAudTgfrYYipu+5C4/JlTI+PJ/OGv/hF6i/TdXqsF18E\nnn76QIU6GIZhDgzpAtljx8hxefXVrUEOWrWKUJa36nC2IpTCaLsuYBiI4xj1eh2tjQ3ojoOo1YLs\neTQUolLpncQ0Pp5USh9ARnuAwyCyZlsuL2dWTI+Pj8P3fdSaTQSFAuSZGfKWH32UQtqiRSmtGc0w\nDMNsx7bJkN5/P/CP/wj83d+RA9R1XLR2G75QLBRdKHFMHrBlAYuLiOp1rK2twd/cxJznoRRFcKOI\n1mXXTWYNi/t8/DHwt38LXLiwj298MEfTEwa2h0W647D6kWUZU1NTuH79OizLIkMbxyQs3s8BD3sw\nDMPsC2LE6/nztIZ6XlLxvLxMbUW6DtnzIPk+YseBJMtU7ew4W1KToaqi89FHMMbHUXJdSLoO3TDQ\nbDZhmCbkOKbe37Exel5FofV9bo687z1Ww9oNR9cI94dFUuOw+tF1HeVyGXIU0Rf8+c9nS1ayZjTD\nMEwvFy4AP/lJMrhB06j+RqhZhSGNjF1aguT7iAwDfqUCfWKC7n/5MuIwhBcEVDmtKLDq9a1+Xxkk\ntOS6LnKigEsgQtKnTtG/f/ITWvsPUAfL0QxHC0Tf8Po6Gdf0PMs0YQjT96G4LhngrMo+gDWjGYZh\n0ly4QI5OpULrpqZtr79RFBLRmJgACgUYYYigmxqMZRmOaaLdaMDzPFiWBV3ITaacJtM04Xkeojju\nHVVo2zT+UNfJI5Zl8sgPEEfXExacO0cnx1/+JfA3f0N/S/cNd/uI/bk5bI6NYWyQAQZYM5phGEaw\nuEie57FjSSU0MLD+RgxjgK5DXl5GU1VRa7dhyDImdB2KYVCI2nXpOM/bKuCSZRm6rsNzXZhiVGFW\n6nB6+sAV0LIRBshw/qf/RMoqQqpSVE53+83czU141ergx2DNaIZhmAQxOzhtgIGB9TcwDCCOIasq\nHNsGNjYwfeoUDMOgdqWbNxPZS0naJoFpGAba7TYCVYXq+9mpw3QB7QHpG2YjLLAs4Otfp8KB/qHR\nIDnLcAfdU9aMZhiG6ZI1O1jg+9n1N4UCIEkIgwBaPo98HFOdDZDo81+5ksgN942clQFoqopWs4my\nogxOHR6wAtqjnRPu56mnEk84jefBWFlB8fp12kFdvEiN4UIHlTWjGYZhEnaaHaxp2wwoADKsY2OI\nXBd61yveEt0AyBBPTpLHLNqXXJfWYdcFbBtaqQTp7FlaiwelDg9YAS17wmn6K6Z9f0vJxeh0YNl2\nIqMmqu7m5igv8R//I+eDGYZhgJ1nBxeLiIIAgedBVxQKG7suEEUIfR+S70OJ4yTvm8YwKLyt69SG\npGnJmhxFkP/gDzAmqqoHccAKaNkI9yMqpn/0I+CDD5LGb8OAFwQUMgHICDebNMnjvvv29zUzDMMc\nJHaaHTw7i8B10VpawriiQBIGV5IQeh4UWYa0uUmGtj+9p+tJUdfsLP1O53+HGWDgwBXQcjg6jW3T\njOB//mfayVkWnUy1GmTbhtLpUIFArUbHnj0L/OEfAg88QN7zAVVkYRiG2VN2mh28tgbdcZBrt+ED\nFEk0DEDX4QGQSiXycjsdqqSu1ZL7Fov0uCJHLPSld2odTXMAC2jZEwZ61VzqdWokz+Vol2WadDIU\nCmjnciRVmZ7QITh27EA2gjMMw+w5g2YHLy7S6Nfpaai2jU6nA03XIUkS4jhGEATI5/OU6hOzgW/c\nIENbKJAXrKpkTEUP8Jkz2eJJWRzAAlo2wv1qLuvr9AWJnRYAhCHkZhP5Vov0SLN2XOlG8O9+d+9e\nP8MwzEEja0hOo0HDGgoFQNOgnjwJ+cMPEXgeNMPYmtcuC40GVSUD6/vAxgYJftg28K//NfDb3wL3\n3pvIU+6GA1pAe7TD0f1qLnG8bZISAEBRIJVK8BSFdnGDJnKIRnDbvvOvnWEY5qCSNSRnYYFyv12j\nLJVKwPw8fMcBXBe+50ETBtv3k9nBmpbME/7xj4E//3Pghz8kw9zfyTIIxyF96meeOXCRyqNphG0b\n+NnPgO9/nzzfK1eo5UiIdWQUFEiShFCWEVsW8NprvaXzAp6kxDAMQ6RbPjNGxQJAfmYG1bEx+IUC\nIteFlhZLUtWk/ub++8lRevBBumNacnhxkY7Pwvfp9vX1Azm8AThq4eh07vf994G1NQqNiJajep3+\nncttTe0QRFGEKIoQqyokgHZ1n/vc9uc4YI3gDMMw+0K65TMMMx0cSZJQmJjAeruNqFKBlc+Tg3P6\nNEUW0/U3V6/2Kl0JyeHnn6cIpAh9qyq1IYn/P/kkbQgOmAcsODpGOJ37LZdpdzU11XtStNs0ZPrq\nVSq0KpUQxzGazSZqtRriOIbv+zAsi465//7tvXAHrBGcYRhm3xAe6/e/TwWuQu0qRbFYxOryMiZz\nOUi6Dnzzm7tXupqboxqcp58mA33zJq2/+Tzd9uijB6oIK4ujYYRF7lcIiV+/nh12VtVkJ3XzJjzf\nx7rrQpIkzM7OotFowHVd0jKNIiqfP3my9zEOWCM4wzDMvnLuHPBHfwT8/OdAtbo1FEcMyZGjCGVd\nh3L2LPDww4MrnXdycCzrwGhB3yqjb4SzJnkMERCPJAmdIEB07RrGTp9GfnwckiTBNE04ohBAlrPz\nwgesEZxhGGbfmZ+n9s5KhZyXZrNnSM6Nmzdxz0MP7dxqNKIOzugb4axJHgMExGPLgh8E6LguNF1H\nPp+HnDrWUFXYtRrljYUiTDpncQAbwRmGYXbEtu98KFf0Dev69ughAOfGDYow7sSIOjijbYQHTfLI\nEBDvdDrY2NiApWkoKgqUXI7CJrUaGdpGA2q9DqvVQhQEkMOQjPPrr5ORP32ahD2+/e0Dn4NgGIbp\nKVT1fTKQikJ5W89Lipq+9rXdqVHtRFbfcJcoihAEQdKelMUIOzijbYQHTfIQ0mcAgiBAtVpFp9PB\nxMQE8pUKpIWFpIDAdYHLlwHDgKRpgGEgUBTokkSN4uUyHXv5MhUe7EaoYy92ngzDMIPoFynKMoC+\nT1XHL7xAVc6fpr1H9A2fP7/NoIs6GylrvKHgACpd3S5G2wgPmuQxO0snXxiiVqtBVVXMz8+TUgtA\nBlEIcrTb9MV3QyWqqiIMgiQUDZDHLEnAF74A/PSnVHWddcLu5c6TYRgmi/5C1UFoGq1DjkPHf9o+\n26eeAn75S3o8RdnKDcf1OmY2N6lgtl8OGDiwSle3i9E2woMmeeg6cOoUcO0aJicnt+/ASiUykpcv\nk3FNha5VVYXbaCRGstGg24WAuONka0jv9c6TYRimn6xC1WHkcrdHG39+HvjOd4D/+l9p3ZRlWp87\nHZQdpze1d/o0rcNC6ep73xvJfDAw6opZO03yOHMGiGNIQZB9u+9vjTBEFFGo2XWh+D6kIEAkSYmA\neHqAdFpDWtAvjzko9yF2npUKT2ViGOb2k1Wouhuy1rVb5cIF4P/+X1rfJIkeL5+Hr+uICwVK7QkN\nhl/8AnjzzQOtdHW7GG0jPGiSB0C7rMcfpzmU/ZJnQj3LNOnn5Mkt8Q5J17F58iTan/kM8K1vkWpW\nf1l9WkP60+48WX2LYZjbwaBC1d3yabTx047II48Av/d75MDYNlCvQ3ddWottm5wegAzwH//xSBtg\nYNTD0TtU5AEgr/Pzn6fJHpJEuzBFoZNBhKAliaQtO52t4oKO42BT11HQdTLyou9NlOAXi1TQ9cYb\nJG/5aXeePJWJYZhPy6BC1d2S1sa/FWGMLEekWCQH5v77sf7SS6gYBt3W7RvG7Cw5Q//n/5DRHtFQ\nNDDqRniHirwt5ufJK15YoDBIFJEXLLRHLYsMcGpuZXFlBetXrpD6y7VrifqWyB+HId3nf/wPMs5n\nznyy1y92nk8/PZJVgQzD7CGDClW7xHGMKIqgZNXRCD6JNv5OIXBdR61YxNQ99/SOjxUcAUdktMPR\nQO8kj0GIXdm3vgU89hiFTHI5OimeeGJb2Dn6+GMUXnsNnUuXyDiWy3RboUC/y2XKR//mNxSGSY/z\nuhV4KhPDMLeLQYWqXVZWVnDp0qWdH+NWtfF3EQLfkgLO4giMhx1tTxjoneQxLC8r1Fw2Nkik40tf\nop3Yhx9uhZojx4H66quw5uawZts4FsfZH2IYkgH1POC552gA9alTPSX4cRwjjuOkNSoLnsrEMMzt\nYKdCVQD5fB4ff/zxzo9xq9KRQ0LgURTB933ou0ntHVJt6GGMvhEGkkkeu2kRWl2lXZdlAW+/3Rtq\ndl2E16/DimPkfR+xaWJtbQ2zs7NJm5PrkgFfXaX7RRHtHt98k04ww9gqwW/EMT766CM89thjg187\nT2ViGOZ2sFOhKgDLstButxFF0WDH4FalI4eEwNvtNuRWC9Gbb0JJz3PvT+399KeU1htB/YSjYYSB\n3c+ePH6cjOjHHwMTEz0nUNxqwYtj6IUCUKuhFMcITBO1Wg3j4+PU+7a0RCePplFYul4nwytJdIKJ\nEvyFBbinTsEalusdUdFyhmH2mCGFqkoYYtK24b35JkxZ7i2S+qTa+ENC4I3338ddN26gsbmJ8bm5\n7GMbDeC3vwV+8IOR1E84OkYYGD57MoqAv/or4OxZMn7XriVGOAwRbmwgUlWomgZIEqQwxLjjYNX3\n4fg+chsbdHwQkAE2DDLoAJ28tRrlm7tiIMZbb2H84Yd3fs0jKlrOMMweM6hQtdGgwtRr1zC3sYG4\n2aQ1UXiin0YbX4TA06HmrjGPOx3or72GwvHjWK/VoHc6g52S6elEP2HE+oaPlhEWZM2eXFyknZbI\nG585Qx6r2P21WvA8D4ZlJaFnRYGs66i02+jUaojKZap0i2MywqoKrKwk8zPDkE5ETQPCEFG7jfJb\nb1EeemJie05EUej57713jz8ghmFGkrR0ZC5H616qRVOKInTiGLlCIbnPrWrjp9E04L33kv7fVGov\nunEDuTCEaduYGhvDysYGDMOAqvaZpSgij/x2KXcdMJQf/vCHP9zvF3Eg+P/+P9IunZig/xsGffEL\nC4CqwqtWEbRaMNNGGABkGXJX27QdhtAASPPzZOiF4W02KVds2/Q7CBC7LgLbhun7kC5fJq/83XfJ\naNfrdJ/FRTpp336bdquTk9ll/AzDMLuhVCLj9YtfAJubJBVpWeSxyjLCMITjOCj0G2HfJ3Gjd96h\nlN1OuVnbBl55Bfif/xP4678Grlyh9XRsjLxpXQeaTbi2DSWXg+q6UBsNyLkc6o4DK73GhiFFFh95\nhNbCrkOEOKaOlRHgaHrC/Qwqo0+JeXjVKnRN264zHUWA70MJAkgAVi0LliShEMd0rKKQQZVl+lFV\nwDAQhSFiTYOsaVSN3W4nspXFIp30YUjPb5qsKc0wzO3h3DngT/4E+Pf/ntaWVBGWruvwhYJgGCat\nQcO08YHeATVLS8AHH5CB13W6bX19q50zqlbhxTGKur7lrBTqdbimiUajgbGxMXpMIQ2cLu4aMf0E\nNsLAzmX08/Noqyoa6+s41m5TSEaSkuo91wWiCKGiQJ6exsSxY1hfX0e73cakrkNdWyOj2m7T8V0j\nHoYhtCiik0yW6STTNDpZg4CO+/znE0nM2znNhGGYo83mJnm2nU4iUiTLUCUJSruNsFol0Y6USBGA\nwUp+6QE1IswtulByOVonZZnqYlZWEIYhVF1PqrAVBZKuY6LTwdLmJkzThCHLtBbqOnDx4si2LbER\nBigULEkUju7vUZudxY1aDaXPfAaSCA93Q8pbv3UdoefB8H2oioJjx46hsb4O58oVGJYFPZej+9Vq\ndLJHEULPg+a6dJJGEe06xW5vcZEEQvpDPiOaE2EYZg8Rkb8zZ2j9uf/+rVoUyffRBuDcdRcKd9+d\n3V7U74n2j0Z86y1aT4VTYxh0282b9DfPg9Ruw+h/bEWBLMuYlGU0lpdRCQJIlgW8//5Ity2xEV5c\nBP75n4GXX6aTpe/L9rtGs/K7v0v5WlWlE6DZpGM8D7HvQ/F9KI0GcPkypHIZY76PIJeD4/vwwxB5\n04RULALdVibZtiHFMT1GFJHhV1XKSavqYIUv1pRmGObT0B/5EyJFXXzTRKNUIm38LNJKfmfO9OpC\nex51lfSHiUUty9ISQt9HBEBzHFpz04VYqgpjYwMIQ7QnJ2FNTY1829Loy1buxIUL9CV+9BHlRjLk\nJzddF/O+D+3ll+k+H31EHq2mbRUZxAAkVYVkGPT3ahVYXIQqSSgUCpAkCe16HX6pRCfrmTMIJYl2\neYZBF8H4OHD33cDMDL2Oq1cHN9YfASk3hmHuEEMENAqFAlqt1s6PIZT8/uEfSJjoyhUSJPr1r8lA\nZlEqAaeEVSRLAAAgAElEQVRPw9M0yLIMKQypyMrzKKrY6QDtNqQwhDY/jw1VJSdoEOm2pUM89vXo\nesLpEEocU3FUH51OB34YwpqfT4Y1iOKqVC4jiqKkCEv8XZYB24Yky8gbBvwowqrvo1CvoxCGiBQF\nUqFAXnenQ0ZY7PiE0tbycs8OdYtPOs2EYRhmiIBGPp/HRsZ62EOnQ3K8L72U1LNIEq2jjQY5COVy\nopcAkun1ANQ0DdOlEq2RrktOj6rS/dfXgUIBiqpizLKwubmJ6enp7ILYEWlbOppGuH+01uxs0k7U\nPTnjOMbm5ibK5TIkzwPW1pKRhp0OecGKQnrScQxVFFcB9DhiaHWjAeRy0E6exEw+j7W1Nfi1GnKy\nTCdWFCXjErv4vg9VliE1m4PfA2tKMwxzq9g21b5cukQVzP2qWAByuRzaO0nlLi5SC1KhQPcRbZ0A\nebYixFyrAdUqomPH0JIktFothGEIT5YpFSeUBC2L2pdWVmjN7K6LpVIJrVYL7Xa7V8RDCIjMzqL7\ngg91iu5oGuH+0Vq6TsMVrl3byl2Ik9CyrGQKkiiiMgwyxEGAWNMQShI0TUu8YDGLuJtPRqEAlEpQ\nAczOzqKRDtf4Pu0WU8Z/aWkJc6USVNEqkAVrSjMMs1vS7UMffwzcuEFrXb8q1unTMItF+L6PMAy3\njzUUBljX6f79oWdZpseUZYSqCtdxEH34IcLpaYxPTcE0Tayvr8O1beRcd0u4A2GYpPl8H+g6KZOT\nk1hbW0Mul0sqqUesbenoGeFBPcEphaxYVVGtVjE5OQkpipKTA6DfrktGu9FAuLZG+Q1ZTtqXfJ+M\nbz5PBlucZIoCSZJQGh+H3WohdF0o4ralJUBR4MYxdEUhz3qn4dusKc0wzG5Itw9NTwNTU+R1iq4N\ngNagrqa99PjjME0TnX4ZyUaD1LVEAVY+TwWqaXQdiGN4ngfHcWCaJkzThNxub3m5uVwOtueRERaF\nqaLQVRjxbgjbNE3kcjnUajVMTEzQ2hrH22e0H+IU3dEzwoN6gksl6pt75RU04xiapiGXy5EBFicH\nkJwkngdMTKDjurDvvhszlkUhnnyePN9uGBpAUk1dLgMAJEmCEYaINzYoFNRsJhXZjoMJVSXDfc89\ng98Ha0ozDDOM/vYhQV/kD4qypWmPl1/GMU1DGIZ0HxGyXl+ndcrzyBNVlCTqJygW4d64gU4YolAs\nJp608HRnZmCaJqrr64gLBUhLS3S7qibrcl96bnx8HIuLiygYBnTP69VPSHNIU3RHzwjvVBk4P4/g\nd34HznPPYWJyMhEe7y8KALYGMyyfPo3ygw9Sld7Zs7RTjGMyrEIzWpy44n5LS1DCELamwbKsrTBL\nHMdwOx0UTZM89vffpwujvw/uk0wzYRjmaNFf+5KmXxsfoI1/tQpUq5hpt+HX61QwKpyOpSVyJEyT\n7l+t9swnjuMY1XodUFWMqWpvKFsMsCkWoTabGN/cRGQYUGSZ2jHDkH4ch54jCLa8dAXATC4HRRjg\nQX3BhzRFd/SM8JDKQOXECZjf/ja0zU06SVstOlGFpxrHdIJMTABf/SruKhQQi93g/DwZzYUFOuGa\nzWSqkm3TRbGxAVQqkCcmoG1uwnVd8rhBBVmKokAOQwobFQqUf+k/8VZXgSefPHS5D4Zh9pD+2pc0\nqcgfCgUyfkK0yDCAIEAkKpcB0rOXJFLaqlQo0pcqaI1lGevr6wiCANOnTtFs4FSh61Yl9EcfAboO\nxTThSxIUywJOnEjWRoBey4cf0vN0ZTWN++7rVe7K4pCm6I6eERajtQYgSRLGjh8nkfL776e+t6tX\n6cSUZfodx+T1FouQuvfZolgkYfH5eSrhF7niyUky6PfeSyeW60JrNGB3OjBNE5IkwfM86KqaTGHS\nNLoIXn2VLppikU7QKKJpKIcZ284eJ/noo8nmYjfHMAyznUG1L2mENv7589T9kc9vCWdIhgGl2UzW\nSqH2V6mQMX7uOVrLCgXEjQbWfR9RFGFmZoYie0IhC0hUBh1nq05G9X34rRZdz/k8OTXtNuWrRWja\ncSgl99nP7tjXvMUhTdEdPSM8NzdYBKMfXU/CLt18LoCtsMqOTE4CX/1qUkkodpSmSb8NA8rx49A+\n+ghepwPNMBD5PjRFoYujW5iwlSNZWKATcmmJtKMP4ckGoLdK0/fps1GUJPSvaXTRAaSIM+iYJ58E\nvva1Qy9ZxzB3hJ308NMUi3SMcBK6uvVKHNMgh6Ul8qRFFLDRSKKCb74JTE4iWF2FpusYO3uWClSB\nHoWsrQlyQo0QgCrLcKMIUaEAWTzmzAwZYeE9+z5Vct9773AjfIhTdEfPCD/6aFJJN+wEBbb3EPf3\nqO3E/Dzw2GPAr35FwhuVSu/tpRLkEycQXLsGyXGgyzKNQewfV2iaJGBeLB7u4Q39VZpZn/+1a8B/\n/+/07yeeoAKQfnyfp0oxzE4MUcUCKIcrLSzQcZVKMnbV8yCFIVzXhVEsQhG6B7qeOBEAIEmIJAmb\n+Twq7TakK1cogijWr1KJnIlr15Iq6CAAOh1Inocwn4fXbsMUoeYrV3qLxdIOyLCxhYc4RXf0ZCst\nC/jKV5Le32GIHmIhEZnVo7YTqgr84R/SLq/TIS+60aBdZ6MBQ1XhlkpYtSxIMzN0oqZuR61G95ue\nph64w2pwRJVmpUKbkywDvLhI800rFfp5/XX6Wz9i5OMISNYxzB1hSO1LHMd49aWXEC0sJIZLUSji\nNz0N6dgxRLqOeGWFNv9itGAaTYO/tgZlbAzK2bP0t6tXt4pWAdD6F8cUbjZN8qoNA3j0UTiPP47F\nz3yGDGyxSIY4jmmTLbCsnSV8gUOfojt6njBAX9Yvf0lfXlbRQj+iklCMI+zvURuEODnuu4+Md6Wy\nNa1kyxMvFuEBeOfdd/H7X/sa9e/13Y7ZWcrZ7DaMftDYqUpTIHoQC4XEQPfnw/sZAck6hrkj7KL2\npRIE6LRayAvBDNHN0dXAt2wbQaUCVaxDKyvJMQDCbsh6XNPoGr3rLmpjunGD1i/DoHVPTItTFHIi\n7rkHKBZhNZu4/t57uEu8qP5iMXGfnSR8HefQp+iOphGen6cwZlb/XBalEuUpf/Ur4EtfGp4PBnpP\njosXtyQus06kShDAunZt4O0ADm35PYCdqzQFCwu948+A3YWjDrlkHcPcEYbVvjQamF1fh7S8TFG3\n9Iz0OAY6HShBgE4cwwQSL7lW26pXcRwHuq5DCQJ6TMOgtTWfJ895ZibxYsXIxMce23oJhUIBYRjC\ncZytDpGtYrFXX00kLWV5uyiI71M0M4oOd4oORzEcLTh3jr689XXy1AZJRPo+3a5pwH/5L2Qod3P8\n+npycgzZlardnjrXdQe/3kNafr+rKs1B48+A3YWjeKoUw/SSrn3pZ3EReOEFmI0GAklCqGnJNLfu\n79j3qfVobQ0bV6+i3W4jFiHpMITfrYbWdJ0MYZpSiQz7PffQZmBsjK7jPvEhSZIwMTGBtbW13vvP\nz1O08vRpuqZtmwzuygq99qtXkxzwj350qA0wcFQ9YcG5c/SFP/88LeIiBKyqZPTE/598kk6KuTng\nG9+4teOBXVVkW5YF27Zhpgsf0hzS8vtdVWkuL9OFnJXDGhaOAg61ZB3D3BFE7cv5870dBKnhC5Lr\nQm02t/QJtvA8hEGAwDBQHB9H0GyiHsfYUFWUCwXkazU4vo+cZZGsr9zny6WvWYCM6Fe/mhlBnJ2d\nxQcffIATMzOQRCrO82hDUC7TOvrBBzTm9eGHR7JN8WgbYYC+0O9+l4qedtOTeqvHA8Mrsj0Pk7aN\n6J13aBep672TTQ5x+f1uqjTRbO5YRJIZjhJ4Hl3sN24A/+t/0fON2EXKMJ+I/tqX/roLw4CmKLA9\nD4ZhbOkdBJ0O4iiCMTYGSVGg5fOouC68qSk0XRc1ScJEHEMTA2pEO2U/165RMdZ99w1sJSwBmLhx\nA/6NG9AVJWljSg+WEBuKp5++M5/TPsNGWGBZt+ZF3crxg3aljQblO69dw0SrBVcocfVPNjFN4Nvf\nPpxGZUiV5s2bNzFp2zCypEG72I4DqdFATzA+9dkhipLCkiDgXmKGAbbXvvTXXRQKkLtRvDAMoaoq\nIt9H0OlALRQgi+MUBQgC6LaNyZkZGIaBdq0GS1FI5SoM6XqU5WRynOtSodb3vw/8xV9kOyCLi5Be\nfRXTroumpmFycnL7e/A8Cj3/7GfU/nTIQ89ZHN2c8F7z1FN0cjoO/b+blxG5UGVyEo6q0i61WKRQ\njGUBly/T7jU9s/MwMSQfvrq6Cl8UgwzA7XTQk9nq++xQLtNOv1IhL/j06SRP/IMfcAsTc3QRtS9L\nS8C77/b2+SoKpLExGLIMz3URuy46rRaichlqf1pMaD+HIUzThBNFiC2Levkff5wM7vHj9Puxx4Av\nfAH4vd+jMHJWS6gIi+fzyE1NwXacRP43TacDPPQQbSJGtB2RjfBeIXalS0vUlN49AVEqAYoCTdPg\n+37viRhFtHP9wheAn/70cJ6AQ/LhkiQhsqwdDXUchpBFA3/q4hWfHQD6rNI5J+4lZhji3DngO9+h\njWm/VoGmQY0iRI6DlqrCnppCbnZ2+6ZYTI9rtaiQNI4R+D4VW508SYbykUfot6jdEDUs/Q5IX1hc\n6/60+7s/0mML0+2Ih3BS0k6wEd5Lzp0D/uRPgJdf7h2PCECWZSiKgiAIkvBOu03l+nfddXhPwJ2q\nNEFG2K9UElWyfsIQYRxDnpvL7iXuHjNQxWyEL16G2TWeBzzwAPCtb5GnKjzX+++H8uUvw7YsbEQR\nJo4dg1Qs0ua/v+pZ9BP7PqwwhD0+Dly/TrUxFy/Svz1vew1L2gFxnMx2xEKhADvd3eD7tEl4/PFk\nc51uRxwhOCe812xukjF2HCq1F9WFsox8ECDc2ICWz1NINT015LD2ww7Kh3eRJAmxqm6fbyqwbdTG\nxlC2LOC997b3EneP2VHF7LB+dgxzuxC1GQO0CKr1Ok6urkKx7STFk+oJ3qJeB2wbuiTB+/hjuvb6\nC6lKJfK80zUsIiz+7LN0Hfel1yzLQrVaReh5UDoderyssYUizfT004ezRiYDNsJ7ieiZPX06aV5P\nKWh5+Ty8QgGzjzxCF4vn0e5SlO0rCvA3fwN885s7990eNLIUyrpVzWOLizBqNfp7q5Xo03aHgMfN\nJmRVhfruu5TT6tffToesdmIEL16G2TU71GaEYYg1TcPdv//71GVw9SoZU8+ja0sYWceh63NiAko+\nD3tzE+X+tqNOhzzel14CvvjF3kIqERZfWKC1sN3eckDkKEIpitDZ3IT14IODxxaOYDsiG+G9pL9n\ntn9XuryMzc1NzHY6tFsUlb/psv16Hfi3/5bC2oel8jddpVko0EXafW+Feh1qPk+GN46B99+nf3fD\n8vH0NPKtFuR33yUBlGaTdunlMl3ArRbtmIepmI3gxcswuyZdmyHa+rqbf9txMOt5UC2LlOmEc3Dt\nGnDpEhnwrooWZmeByUnocYwgCBBFEY0uBJLxg1/5Cnm6zz67Xc1KhMUzJHzls2fxgW3jsWHDGjRt\npFJLbIT3kiE9s5ZlYeO3v6WB1kKyrb+9J47pJDxsU4TOnQO+/nXgz/6M3tvkJKDrCDwPUT5P7zWO\nydBubJCBPXUKYaWCKAxJEKWraYtqlaotKxW64Ofnsbq6iqmpqd7Zzv2M2MXLMLvm0UfJAL7+Oo0H\nTG3uo2oVc4pCM4JPn6afkyfp5+xZ8mqXlxMBDVAaSdd1uK6LnK6TZ9sfQs7Sdd8hLF6MY9y3G2ne\nwyzhmwEXZu0lQ3pm1dVVlD/4AI7Iq2QdK3rxDlvl74ULwC9+QW0LDz20VaWpdTqQbJu8YzFW7dQp\nen8bG8DSEgzPo8/O92khEUa8+/l4nodLly4Nfw0jdvEyzK55913qLLh0Kcn5FouILQuNOIYxPZ1I\nxL7wQjK9bH6ejKWuk0fcbG5VVlthiGBjI6nJeOqp3shcViHVDmFxSZJg7SZVdFglfAfAnvBeIk7A\ndDhISLTJMvxXXoE6Po61ahVTqpqImqeJoiScfVimCPVPUZqe3gp52e+9B1mSyAgfP06Lg9h8dDqI\nlpbgTk6SAZUkur1QoGN8H3j1VTi/8zuwLGtnLxgYuYuXYXaFGCP60ENkQFMSsa7rQlEUqGrXFJRK\ndF298gp5tVNTFD2anibxm1YrCSFPTmLFcVD88pcHR/j6azF2IeE7lMMq4TsANsJ7iaZRrte2t+V6\no7U1qBsbmJybQ1AuY3VtDZVKBfl+o9HfD3sYKn+zpih1w1GtdhvW6iowPr69Mto0EeZykHSdFpDX\nX++da9qdshRevoz8sWPDX8eIXbwMM5T+DXDfqEDHcbavMZqWjBE9fZoM71NPUZ43VdVseh6WX3kF\nd2kaBm5/+2sxhkn4DuMwS/gOgMPRe8WFCyS9trZGhUfdcBAKBSCfR9BuIzZNqK0WzKUlzOTzWF9f\n721gH9QPe5CnCA2ZoiQFAfSbNwdWLAeGgcLGBl38opc4DKlAbXUVaLVgvPceJmq1nXfYI3jxMsxQ\n+jfAYlRguw00Gmi3WtkRN1mmYz74gMa4ZhSA6roO0zR7+3uzSNdiiJbFfgWt3SKmJ41QhwMb4b1A\nhIOOHaPKwE6n5+a42YTvujByOSo+UlUY6+uYtaxeQzyoHza92zxoDJmiZNZqgycoAQgBKAD1V09P\nUwvF5csUvq5WgVYLim1j7L33qLDk7bcp5NbPCF68DLMjtk11GK5LYhpvvkm/wxD48pfhzs1B6XRg\nOE6ioNVoUH+wbVPKqFTa3haYolgsolqt7vw6+msx+hW0dovj0P2eeurW7nfA4XD0naY/HHTmDBU/\npAyT12wCXcUsAFsGSV9fx8zcHFY3NqDEMYwgIAN88WKSSxbTlg5q5e+QinDNcRD3j0JLEYYhdFWl\ndgmRRzfNrc8ujmMEkoScaSaFJQsLFHYTu/cRvXgZZiCLi8Bf/iVVNufzmdOJ7FIJ9iOPQJqZ6WkV\n6png9sILtIE9fjzzaSYmJnDz5k2cOHFi8Gvpr8XoHyyR5Yn34zi08f7e90YupcRG+E7THw4qlbbn\nZdptWLreW1jUnVxitNuYME14ly9Dn5mB9P772eO+xseTisb9wra3j3d8883t8ncpVACDRzeQkVVc\nl6o6T56kSMHNm/SeFQVxHCOWJArpKMr2wpKJiZG9eBkmkwsXaON/9Spdg922ojRxGCK8cgVzoljq\noYeyH6tUyo4sdRkfH8elixcRXr1Kalv9zoEYxdp/7QkFrZ/8hK7l6ensaJnv0yYgirb3HI8IbITv\nJIPyoSIv8+qr8FJjxLahKMDNm8grCqq6DqdQQL5Q2H5cGFLv39/+LRU/7PWJurhIm43z5+mi0XV6\n7WFIOaWVFeDBBymU3l98paqIdxjeEDkOtFotuUjFhbq0RCPYJAmKJEFKe9OaRpue8+dJJ/c//IeR\nvHgZZhvp1Nf6OtVOZNC0bWz6PnKGkWxYs4R/ZmbICGellBoNqAsLuG9hAf7KCpR8frtzcOIERaiy\najHOnaPnfP55qmkRz9Edr7j1/yefpCjWiG6i2QjfSXbKh87PA6US1v/f/0PZMKhXFkhO4jim+wYB\npGPHYJZKqFaryGW14igKGZ25uWyVmjuJ2HUP2s0GAeVus8LEAKRSCfGNGwMfXhOfSzqcVSqRR1yr\nIV5bgxJFdNG3Wsk8U1mmheiJJ9gAM0eD/tSXrmeOCG2326jX65ienobjuiioKvBP/wTcdx9dW2kv\nVpKoMGt1tddILy5S9bQkQSuXYUcRzH7VujAkBbzZWepTzroO5+aoq+Ppp7dH0ebmyHiPeB0HG+E7\nyZB8qGcYuFIo4At//MfA3/89GVMxXUmSaCdbKACyjFwuh3q9Dtu2Uej3hsWu89Qp+vde9Q2nd92D\n8jqzs7SztSwyjn277mhmBpEoFukvzgpD6LYNybLoc0hjGMDMDJpxjHy7TZ62UBMTi4gkUaGWEKVn\nmFGmP/VVLG4TxvA8D+vr65gul6HZNto3byLO5yGFIaV8JiaS9eT0abom//RPgZ//PNF+F+NEu+m0\nnOdhdXUVcRz3OghRRMb0oYeGOweWdWTlZLk6+k4iFLLEIIaLF3vGft28ehUzMzPQymU6UXM5Mh7T\n08mFoChAFEGSJIyPj6NarW4ffp2umt6rcV/9u+5BCAUs2+7tP2w2AQBqLofG+Hhme1XcbEIOQ0jj\n4wOrp2PHQfTgg8DDD/fOM9X1g101zjC3k6zU1+xsz4jQMAyxurqKimHAXFqC0mgAmoZAVclYdjpJ\nDtmyaO7522+TOp0YRbi6um2cqKZpVCAZBMlzp0cRTk/zONEdYCN8J+l0KBzz3HMkNHHlChmvK1cQ\nvfYazBdfxEkxYPvMmSQELfpgNa1n7rBpmtB1Hc2uAQOQPUVoL/qGswQ4BpF+b12BDSwsAJ4Hc3WV\nNildiUrU6/T/eh3R8jKUMIQURfT3vl197PsIfB/6vfcOfu6DWjXOMLeTrNRXagMcxzFWV1dRkiTk\nNze3tNg1XYfv+3QtxzEZToA2vbIM3HMP8Fd/RX/73vfIgXCcnlnokiQhl8vBcZzts9BFCHtEZwHf\nDtgI3ykuXAD+7u/I6Ka0WlEoAMUibFWFVCjAWFqiNoBmk3aNrRb16QnjG8c9Ie3x8XHU63VEUZQ9\n+Bq48x7gEAGObYiK8FYrWShefx34+7+HcfEicrUa7cBXVoCPPqKK6suXIdXriBSFPpulJeoPXlnZ\nGiwe1mrYPHsWWt9s0h5YL5o5CgxKfXU3wLW1NWhRhGKzmRROgrxY3/cpuiZJdG0Byeb+vvsSL3Z8\nnIzqfffRGiAciFYLVhQhWF8frCMNHGxRoX2Ec8J3ApErvfdeMh59xHGMRqOBiYkJ2iGmW2o+/3kq\nkggC+pGkHgOr6zpyuo728jIKljW4qvGTeIBZLUZZxRFDBDgyERXh589TrjuOgbExSOPj6LTbyU7Z\ndem2KEIsy1T1LAaLR1HPBKXNBx6AbJo7Py/rRTNHgUHDYUoleA8/DO+551ARRZ2p4xRFgSzL1KEh\nSXSNic19ekSoLAN//ddkwO+9l9I+qVGEuizjg2vXMPaNb0AZdE3yONFM2AjfbvpzpadOkdBEqjXH\ncRxIkgRTnKwiV/raazQj+L77qEii0SDjZ9vJ9KQoQlFR8LGuo/DUU4Pn6N6KB7hTi5HnJW0CYn7x\nkIKztbU1lMtlaFlGWlGo+KNaBep1yIoCs9FAXKtBUlV6P90WhdhxoHY6tCCI0HxqglKz0cD4MM1o\n1otmjgJZw2G6G+Vquw33vvugvPMOXUeie6CL8IZV4Qn3h5IB8mJfeikZP9g3ilABoCkKnCBARhNl\nAqeHtsFG+HbTnyvNUMhqNBoolUq9lYSaRrmWhQUy2OLngQfo4kqp2egzM7j5yis4aZoY6Ivu1gMc\n1mIE0HOn5xcPGcn48ccfQ9M0lNMiAY0GFXSMjyebjkIBUqkE7coVxNPTkPJ5MsLdDYC7tARtaYkW\nlnKZDHC3gjwOQ5TffhvFnfLBrBfNHBUGDIeJowjy6ipmNY2U5nK5ZPavJFGLURzDabcR6zqke++l\nCub+zb2mUY1LtUqORQYPDRL8SMPpoW2wEb6dZOVK+xSyvDiG7/vZczOF7OI99ySTSzJCzRKAsbEx\n1Go1TE1NZb+W3XiAu2kxAugCnJ+nTcKzzyYbgwEYhgFX5JYECwt00QsjL0lUvRkE8AoFRNPTkNOC\nJYoCz7KAsTHojQaFsE1za+GIggCW40B/7jkS5MgSAmG9aOYokB4OMzHRE6XyXBeuaUJTVfKOwzBp\n33NdIIogyzIcRYE+Pg59p7GEprnV1fCJ4fTQNtgI304G5UpTClntRgOlnWbftlpUCfzZz+5Y+FTO\n5+F++CEZmn6pOGHsdvIAd9tilEbML/7Vr8iTHWDkdV2Hl55o5HlkhOM4kaDrdGhW6coKQtPMVA2T\nWi1oouIyjsnIdsNofhQhtix6nCtXWC+aOZr0D4e5dq3HiLZaLRQKBUidTpJmWlqi66S7vkgAyqoK\n5ezZHdNMKBZpM/xp4PTQNtgI3052ypXOz8MzTaw8/zzulmWqLJTlnlwvZJkujqefpt3i+fPbPeFG\nA1hYwMzly2hUqyQr1y8VVyoB3/nOzh7grbQYpcnlyHhevQrcfff2DYfnoVitIm40qO0oCEhS8/r1\nRIEHoIvxww+BWg15w0BcLCYFWN33aayv0/OZJoXBRB8jgCAIYBgGvWdJor+zXjRzlBgyHCaOY9i2\njWPHjtFGOI7JCOs6rVWGQT++D01RgLvu2vn5yuXeQQ+3CqeHMmEjfDsZkitVymXMfOMbpLHaVzyx\n5cVWq3RhPPUU8MtfJio1QI9UnD42hnarhciyIKd1kzsdMkAvvQR88YvZCjW32mLUz/w8Xew3byb5\noe7mANeuoWTb6Pg+7ZpXVynsJTYIpkn/npoi46nr0NpthB99hNrUFMJ8HrLvI7eyAjeOkZdlWjQs\nixYSRUGsqgiCgEL6UUSPPzbGetHM0WLIcJi250HTNCqQTEtYdofDoFajDWt/JfROPPEErV1ZHRnD\n4PRQJtwnfDsRFYoDUBSFipVEZeFDD21XeRI5EzHua2mJDLGQisvngVIJkqrCMAx00rOJfZ+O/cpX\nyDg++yyFq/r5JC1GaTSNjOjqavLaXniBQmGWBWl8HGEY0gzgfJ4Mr6IkhR2i0CqK4IchAlmGmsvB\nqtVg+j6MTgeSLEM3TTiOQ6Ftw6C5puUyQteFHkWQPI8+L9Gz6HmsF80cDYYNh2m34a6voyDyr8Ui\nbXrFRDNVpetXGOBhRlWsF//qX/Es4NsMG+HbydwcGYJPQzpnIsZ9XbtGF1wu12M4TdOkAqgslRqR\nv82SihvSYrQrymXgS18C3nknmVlaKgGKAiUIkKtWkxyUCEELj73rvXphCLfTQaFQgJHLQcvnYVWr\nyOoDyOMAACAASURBVLfbMCwL+XwelmWh0+mg4ziINA2YmUFjehrh9DRVWufz9D4fewz41rfoNQm9\naIYZVYYMh/G+/GWs5fOwANqg2jZthm2bNsNBQB7pAw/szqsVXuw99/Q6B7tBzAJ+5hlOD2XARvh2\n8uijSUP6JyErZ3LuHHl2wsCnVGpyQYBoc3OwSs0gqbghYXPbtvHqq6/u/FpVlR5fUehHFFABUJpN\nRF2xDQCJfq0orioUEC0uot5owDRNKOK1KAp9Bq67ZbBVVUWxWATiGBvNJjzPQ8fzoFUq5AWMj9Pw\nBtaLZo4SQzbSG56H+LOfhfwHf0Ab1LvuIpGNUomiWHffTZGlHSJ3W/R7scI5WF+nKNig9c736fb1\n9ZGdBXw74Jzw7cSyKBScVVC1G7JyJrYN/Pa3ZIjjuCeXrCkKbly9ivJOKjVCKu7pp5PHHRI2lySJ\nwsk7EQSkix3HZACXlqgAS5Yh12oAgLjToSrwbu5XiL7HcQzHcVAol6H6fq94gCTRZiP1NymOYeZy\nCKansbS0BN/3qdhE5JlnZ3tfGwsCMKPOkI10rVbD2NjYNlENnDxJaS1xfQ1zGIQX21/kyLOAbxts\nhG83WQVVu2FQzqQ/7JS6oGQAke+j4TgYvxWpuCFhc0mStk9qStNo0HzQGzcoLC2GMoyNUa+i60KS\nZSoaE/NJ19dp/m+3YlMxDOR8n3bmjUZvZbQwxOI9+T5QLqNQKkEzDCwtLdHYtPT0qDQsCMCMOkM2\n0s1mEydOnNh+Q6pdEu12j3JWD76ftBMO8mJ5FvBtgY3w7UYUVO1GBEMwaLcJDA076bqO5eVljI+P\n90rWpXuHxeMI0mHzjBYjZXER40tLNEghXbmt60mBWLVKBrR/eILnAWEI2XHodZTLiGUZYaGAeH2d\niqwkCWY+T2Fn0Rss5gmLoRVigRFh7K76lmEYyOfzsDc3UXRder433ujtk2ZBAGbU2WEjHQQBOp0O\n8oOugfl5unZfeYXWgKtXP50Xe4RnAd8O2AjfCUTOZDdykMN2m+mZxH0GNrIs1NfXETsOXNuGcfNm\nj2TdljFzXTJSX/oSXYBZYfNUi5ESBBjb2Ej0mtP9x6urdLHOzmbvxLthrkjT4Pg+lMuXUS8UEORy\nyFsWio0GtFwuCVPHMW1WxCZBhNjE83oevUbhKbsuxtptxGtriOfnIS0tbe+Ttizg29/+9N8jwxxU\n+jfSqfXBrdVwvNGA/PHHyea5H9ME7r8f+LM/I5169mL3DTbCd4rblTMRM4nr9W0GttNs4qFmE0Yc\no33zJozTp7PzRLUajQj8wQ/ISz93rjdsvrm51X8sLjyv1aIcrsBxKDctBigcO0ZiHP3IMgLf3xLT\n0GQZM2EIeXqaDGmjQV6/MOBRlMhNLi0lvYy+T5+V2LWL93HjBnQAq+UyypOTJNiRxvNoo/CznwHH\nj3MxCDOaiI30P/wDXZvXrm2tD5FtYzIIaFyoLFPKpl/WVdSfTE9/cr0A5rbARvhO8mlzJumZxDMz\nPQY2jmM0V1Yw6XlQFAVRvY7O5ibMQVrSp05RNeSzzyZe9zPPAD/8IYWjRG4XgBRF23PC9ToZRaHu\nFQSJwUzhxjH8TgeFsbFEhtJ1yYDOzNBCYBj0/7U12mQ0GrRYVCr0PAC916kp+nujQRGAjQ2gUoE0\nOQmz00Gz2dxuhDsd6rs+dqz3vTLMKJAeN/raa9Sfn8/TtdX1eB3HQb5cpk10GNL1nZZ15Z7dAwUb\n4b3gk+RMhswkdmo1FBoNKGNjkBQFuqLAu3GDJqGMjSUHeh4Z/mo18Vx/+EPgv/032gikW4xkGVCU\n7YVZjkMXvSi+kmXggw8oB5tS2el0OlhzHBzL5aCmCz40jYxupULPZRi0aKgqFZrl80lkIJcjgyu0\nbiWJDP6lS/RZdIu1CqqKxcVFRF0BegDJIPIzZ3r7pOfnuTqTOdz0jxut14GLF8nQrq+T6MbEBFAu\nw/M8qhEB6HorlZKZ5Z/7HF1TLOl6YGAjfBAZMpM4jmO4KysoGAakrnes6jpc14V3/ToMMd5PeJuW\nRdrNInfabAL/5t/QRbu5Sc9TrQIrK2TkVBWa55HRrtfpJwzpcYKAPFPh3UYRMDGBThxjdXUVUzMz\nUBsNuk14qaLYqtUiIw7Q42ka8PDDvTmrxUXgm9+kmcqiuO3SJVpsUhXgiqLANE20Wi2UxCLTL7+X\n7pP+7nfv6FfGMHeM/nGjjgO89RZFikTh5OIisLqKaGMDiqpuG4aydQ3+5jfAj3/M0aEDBBvhg8iQ\nmcQd24bebkNNzeuVJAk5y0K7VoO6uAhF9N8qCu14U4VNkCTaRQcBeaMzM+SNGgbQ6UAqlxFKEuJm\nE5JpJiPM0qFfTSPjvLaGsFpFTdMwdfw4csLw1WpJxTO9QHpuQVZ7UTpMNjdHu/Vnn6U5qf1V2ACK\nxSKqGxsognqJM+X3svqkGeawkDVu9N13e8eCplI80doaJup1SMvLZJzTw2Huvpuu5c3N/Xs/zDbY\nCB80djGTuL26ipKmQerr8VMUBZqqIl5epuIpoLeyWBRFAbQrVlUyTJubdIFPTpLhXF1FZXOTJOom\nJqjqsn/0YnewQuj7aLsuKlFEwhu5HD1ff8VzWrc2HTYWZLVpnTtH06AWFuhzEX2N3clTZhRB6XTQ\nuece5B58kJ73+vXtLVqu29snzTCHgaxxo563pdHeQzfF01JVKM0mDNdNirHSLYa+z5vSAwYb4YPG\nkJnE3q9/DaXVgprV8hQEMDwPfhTBt21od9+dVEQ2GnRRCz1nx8kebdY9NtA0Ck+rahLK6iOUJDQk\nCUVVhWoYvePR0hXPoohLKPSkw8bD2rQ8j/RtK5Vtk6ekYhF+GGKxWsXdV670VIj2tC11OsBPf0pG\n/5MomTHMfpA1bnR5OTnHM3CDAIWpqSR99NBDvQdkifcw+wob4YPGkJnEC6dPYz4IIK2vk3FJ99u2\n20AUIVQUtHUdahyjFMc0bWhpKTHA/aRHmwHwgwABACcMYS4uQq5UthnhIAjgdDqwKhUKiy8t0cUt\ncsxAbyX0ygoZ0DBMFgYhErBTm5bok+6X3+sye/06Nl9/HZ2xMZgTE9nvr9Gg9qp0ixbDHCTSVc8i\n4vO//zf18qZpNjPP8TAM0Ww20Wq1aFKbadL1df/929cTlnU9ULARPmjsoAnreR7WOh3c/eCDwJUr\nSZ5VhHk9D2E+j6jdRnl8HCu2Dd/3MRkEkIAdtWahacDmJvwgQDsMUSwWEQQB2u02UK8jD0Du5paC\nIIBt27AMA6ppJsZ2c5OKuQwj8aCjiB67UqHQ8pkzdPtu27R2kudbXIT62msozsxgvV7HnCQNnkgy\nPb29RYthBtFvFG+niEX6sRcXqYf/2jUqWszn6TpdXKRaiMXF3j7fruKcwPM8NBoNtNtt5PN55PN5\nuK5LrXtRRJ5z/+aVZV0PFGyEDxo7GJ2VlRVUKhUoQo4u3YpUrwOahiCOoSgKFE3DbKWCtZUVOCsr\nyBWL6Mnq9uWTY0lC0G4jCEMUJicpv6xpiHQdXquFqqqiYNuQTXPrglfDMAlhizywrgMnTvS2HXU6\nwL/8l8C/+3e3/nkMkudrNEhgpFBATtNgui6q1SomRS48TRRR6Jvblphh9LcCieiRUG8TkZuvfe3W\nUxtZbUbvvUe36ToZR2FwDSMxyuk+X10H4hhBEGB9fR2+76NYLGJ+fh6KosC2bTSbTeoYkGXynPth\nWdcDBRvhg4YwOhkyla3FRcw+8ggJa4jxgAAds74OOA7iKIImSYCiQJZlTOdycAG0uoZTUZTEO+0W\nS8WSBMdxIHdVruSUxywrCkzDgDI2Bn95Ge1GgwYpiMdJq2oB9Lj5fBJydhx6bZ9URnKQzvXCQk+F\n6Pj4OG7evAnLsmCmh1n0T1ritiVmEP2tQIOkZl98kUQybiW10f/Yq6sUzZqcTJ4nLaxRKiUer0g1\nPfccMD2NuF7HWr0O07IwMzNDErBdcrkcNlZXEW5uQmm1yMsGthdn8Qb0wMBG+KAxM0MX4ptv0v+7\nRUa+52FiYwPlTicJTV29SuHoOCYD7PuQfR+yqlJ/cBBACgIYpokoilCv16EoCvQ4RlQqQVEUqLYN\nN44RxzFyug4p6zVJEjRFgXzmDKLLl6GJAqtyeXuIOz0ebafBFLslS+c6o0JUURRMTExgY2MDc3Nz\nycKU1QrFbUtMP1mtQFloWqI6tdvURv9jp6I4PYY+Lazx0UfJJjuOk7qPhQWEQYBSHCM/P0/1Hqn2\nQ7lWQ6VeR9RqQRHXwJUryWb0xAk659Mzy5l9ZWAKjdkHLlwA/vzPkx1wuUw72EIBTQB6pQLJsqjH\n9623SGBDUagIQ9cRS/8/e98WI8d5pff9da+uvs6dMyQ1vIgUJZG2bvbajtdrId4svH7I+mWD5C1I\nAAOBk2we8hLEcbAIkjzs0z4kDw6QxeYhMRAYyCJZrx3JjnyXaFK2RUmmKM6QnJ77pW/V1XXPw6m/\nq7qme3pEkcOh9H8AwZme6urq6q76/nPOd77DwCQJkmUR6TQawOYmWBBAkiQYhoFioQBFURCUSugo\nCrq2jSgIYFnWwIp6AEnELFUqaJVKiPn0oqwXLQfvSXyQw7xffpn26zj0+wiFqGVZUFUVjURgNrQV\nChhUiAoIDGsFGodsaWOUyMm2ycP8X/5LuhZu36YWuvfeG+zzzcNxqINgd5euJcMgojUMxLqOHmPQ\ndB2s2aSoudWif8vLQKMBxTThSRKltysVuodUq0S+775L7/ftt+/rVAk8eIhI+Lggu1quVCjdlaRg\n+Qze2dlZurAbDUr5Og6lqSwLkGXEYQiJMbpoJYkuXM+j5xgGZE2DHASQT59GJSHQNmPQtrbAOHkO\nQ9JexBhDqGmICwWw2dnUOSvTu4tWi477QQ7zzo+HHKEQBYCJiQmsra2hqOtQXXfQQSsLoRAV4BjW\nCnQYjCptZGu/775LWalika4j3qkwOZm282XBWwkti7bt9QbIOmAMUhiSIJK7YvHSTHIfUKIIjuMg\nlmWwbLkoitJSkRAoHhsIEj4OyK/ETXPAnKMXBP008kCrkSQRCSdOVHEYIq5U0osT6Nd+FdtGzNi+\naSqRZaEXRdC5gENV02iWI47p8VYLWhAg+PSnoS0uDtatfT9NRf+X//LgJ7Nkx0Nubg7tWwYAhTFU\nJAndnR1UXn55tHhGKEQFgOHmOB8E+dJGtvZbrdL+p6fTRWOjQT+3WiTMmp9Pr0fXHby+TZMW2pbV\nvx57rgtD18kfng8+4cLFRGwlSRJUAF6hAJ2/brY/f2aGFqZCoHgsIEj4OGDYSjwx58DVq+g1myiW\ny/0+3v4FLctEjqqKWJLgdLuwoii1pozjfvtSKMuQyuWhKeSwUEidrra36eLW9dTliltgViroui4q\nGxt0c+FiD94CUa+n49EeBvh4yH//74Hvfz9dLPAoPPnduHgRv9nbw3O+D+nGjUH3LC5O+TAK0YfZ\nviJwtBhljnNYZEsbuj5Y+717d3/ZxPPSLFUYAvU6YtBiGDs7iMMQMtdmmCZ9v3o9oFBAEASI45iM\ncRSFvnPvv58a4fR6/clJiiyjrSjQw5C+r3lbVyFQPDYQJPyocdBKfGEBoWVh8/vfx/nETrI/wDuO\n02hQltH54hexvLSEy/U6XVy8vpv4N0e7u1B3d4mEK5X+jYHxKUW6TgTqecDf/E1qAmLb6fatFort\nNqR6nY6Diz0WF4ncjmI82vw88Md/TPVwTRtw0EKpBFgWtJUVPLGyAndnB6ZlDbpn8ePlntofBA+z\nfUXg0eAgc5zDQlWBt96iKDhbVx5WNokigDEEQYBer4fQ9yHdvIl2tYpyq4VIlhH7PlRVha7r1I7o\nuoCuo9frQdd1umajiBZ8nJBdl67VpGtCmZxE0G4jLhbBFhdJF5EvywiB4rGAIOFHjTEr8W3XhXvx\nImTLotSUpqURoK7Tyrfdhr2xAfPkSfJ7/slP0vRTHCOOIshRRErKlRWqUZXLgKJAabehdrs0zWhv\nj8j0C1+gVLjv00qcC8RkGWGvh5CnzAEioFu3gF//GvjX//poUlvPPUevPzMzaERQrwM//jHAGIzJ\nSbQcB2b+xhOGJJDhwyIOi4fZviLw6HCAOQ4AbG1tQVVVcqEaBUUBrl3bn83KGWsAACQJvuehG4Yw\nTRNqUvstyTJlVJJOBs/z0Ol0oMYxVMsC6/UAz4NmmrRo5j3AkkTPKxQovS3LwKVLkGZm0Fxbg/rs\ns5jg7Xl5CAvLYwGhjn7UOMRKfGFhgVJNlQoRwNwc/c8jVEmCu72NSnZM4O4uRX+ahtgw4JkmraC5\nOOTePeDWLWi7u/ANg1Ld165RL+LODglH7t3rzyjlNypJkhBx8uKpLlkGPvMZ4JVXiKweNnjb0uZm\n+li9TguHQgEol1EoFuG6LoIgGHwur6U/+STwrW8d7ni5aG5qiiLcUalL3r7CnbmO4lwIfDgc5MgG\noNvtYofP4R4Fx6G0cD6blRhrcMRxjJbrwvU8FItFaJoGxhgYn0iWgHcylMtlqIqCdhRhRVXBajWw\nIKCoNwypbBQEdG8IArpWX3iBMjHPPAPz4kXsDDPryEIIFB85RCT8qDFmJT47O0s/8HnAQxBLEtxO\nB/PdLhHp1BRdkI0G0GggDgJSTcsyrZ4VhX4uFhFHESJdT1NVnkc9yjs7FMlVq9T6kETfqueRkpoL\nsbKpLsc5OrHHyy8DP/whvabv7+u7lCQJhUIh9dLl4G1LFy/SeRh3vB+2fUUIX443RjmyJSgUCtjY\n2Dh4H5ubRLj5xVmp1Cf4KIqwtbWFWJIwUyjQ9cjBB6T4/sDMbMYYVEVBbW4OruNQ9kpVSbfx9NPU\nKw/QYrxYpGshI8qcmprCtWvXcP78+dHth0Kg+MghIuFHjTEr8T5yq+osfNeFyhjUN99MiSgZbYbz\n5+FNTiLkz5+cpMdLpb5y2tzaItJtNGhVPTFB5MEj4j/4A+D554Fz5+DNzKB74gT9/gd/AFy5khJ4\nVuzxsMHbltbWgJs3h/ZdlkoldDodxPy88RT9iy+mNpbjjvdBtK8IHF9kHdmGwDRN8k/Pw/NoYfzr\nX1OLkOPQ71lCn5sDJAmR72NjYwOyLGN2fh5Srbb/9Rjbfx9I6sesVIJhGPB9n67PZ5+l8tG5c0Ct\nlmbEuBNe5thVVUX7oGhYWFg+cohI+FFjzEq8j8yqOg+v10NJ04YbAMgyfFmGFgSUxp2fp4s2DIFO\nB2GzibDdhm6adHFPTBBxTE7SRX31KkWdSe3VsSzEcYypIRONAByt2OOll8iP+h//YyK9RITGwdN9\nruPA4OMUswrRccf7oNtXBI4fhjmyZWAqCrT1dcRvvUWp4CBIzTGAdJLZxgYtWl2Xske1GkWuxSK6\na2uQFAWTk5MUkVartODNfl/5JLMsMq50qqqi1+nQ95ybz+TvCdwjPYOpqSnsrq+j3Gjsn7M9Nycs\nLI8BBAk/aozyRs4jWVXniQZhCM/zUJAkItAhYM0mXfxJChoA/VypIJBlOLoOKwjoNbJuVHwu79IS\nRbwge0g36UseiqMWe0gS8MlP0mtm0uaQJLAoQgVAb2cHxic+MVwhGsckVvuzP6OFRrbd6EG2rwjh\ny/FFtrTBMx6tFrC0BPnOHcxvbCAMQyiel+oQVJVIVtMos/T+++lEs91d2mZqCrEkQVpdxeTsbGox\nyYed8FqsLFNaOAzT728Y0nczKaWojBEJf/7z6Xc4e08ABj3Sk/cwu7kJ+8YNWlTn52wDtH9e8hJ4\nJBAk/KgxZiXeh6YBTzyReiYnq9rYthF2u2lTfh5hCLnTIT/pIV7PjDEy8eBjz/JtFZY1MJdUUZTh\n6bksjlLssbpKkf38PB1j1jxEVSHJMn65tIQvPP00lKyJSXKTxZ07lKL2PODChcF2I8M4MEsRx/Ho\nWhuHEL4cf+Qd2XZ3KQOUuFDF5TKCIICyu5uOGvR9qs1aFomqbJsWuNzkJgyBvT04ExNwJidRaDTo\ne3byJJE379dfW0sj4EqFvm+KQv8vLNDPrRZU38eOZWFybw+M16BLJdqmXqfnZz3S63Xg6lUUGMOu\nLCMoFge//0DqO/Af/oNQ8z9CiJrwcUDeG3kUpqcp5XXzJpHNzg6idhu670NuNqlVaGOj76AFgAgp\nDCFxB59R4C0P+bYKXmtaXwdApB2Na+05SrHHKGFbUgdut9sAY1hdXU3reD/6EfA//ycJ0MKQbp6l\nEkUE8/N0M5uZoXrftWvpTS6H7e1tvMNH0Y2CEL48HuCObO+8Q1GxrhNRJk510vo6EVx2hvf0NKWj\nHWe/5assI9Y0xPU6rMlJ+k4BfX9nALR/7mAXhrTo63aJ0Gs1eo29PUCSIAGodToI33uPvo+3b9N3\nc2mJWg673TRNnekUYOUyDMvav3D2fXovL7wg1PyPGCISPg7Ir8SHiYCSlW3fyk5RgCBAb2YmrU8p\nCl3ge3upHZ7jgIUh/Z73qc2CW04OE4CNmks6Ckcp9igU6P2vr1NUy1PpjCGOIkgbG/gdw0D7e99D\nVKlA8jyKdPgoR8eh41UU4OzZNEJRVSLiRoNuaPlaMgDHcaCNM3oQwpfHB/PzFNlevEjZi14PkCSY\nrRZinh3hNd1CgbbhauZWq+9sxREkwirdcShNfO4cRc/37tG1puspeV+4QCnjT3yCiHV+nr7L3HWr\nWkUcBPB0HUr2+9TrpZE4t3PNdQrwLoEy/25nLSx5aluo+R8ZBAkfF2S9kfOGEHxlWyymNd2tLWB6\nGg5jKOh6/4bRt8NbWQEmJhA5DjqWhSneQzwEfQce7jqVF4BlxxPy7Q/CUYo9mk06N4lbVjYq9lwX\nEWModDqQbBuhbVNGgKcUORyHyPYHPyDl9MICRc3dLu1fVckm83d+h4g6Id5ut5ve2EZBCF8eH7z6\nKl1fFy+mvuh7e5A3NtCxLOhzc33TGvC2Jf494sNSdL3/WK/Xg14o0LSj6Wn628ICff8qFcq8cPvX\nf/bPgC99KfWf/tM/peEPk5N9oldVlRTSQNqjH8fUpeC6wE9/SvvlXu8JTNPE9vY2oiCA1O0OFygK\nG8tHBkHCxwncG/nVV0lV6/t0YV+7Rjd+bkv39NN0UW9tIXz9dWiqOugXzeePOg78J55AvLw8kjij\nKEpJmCsm8wKwTOtDPKJNqg8uZDqKeaVvvEHEaZr7CBgAnM1N1LpdMMui8Y2NBpQoAuN2k0AqhJmd\npZ9/8hNaAPFpUJ1OKrD66U+pFLC4CCwuwnGctI97GPgNs9cDvv1t4TN9nJFXwmtavyNAmphAp9tF\njZdzwpAWbVnBnmGkegJNQ5DM6FY1ja7NTocIEqBsS6dDqeCdnf3TjObn6XuSi8j1IICXuODt69EH\niOT/6q+IuBuNvkBRiiKUwhDu7i7Mp54aLlAEhJr/EUGQ8HHD/DytRP/oj0hV+9//OxEEn3zCBxAA\n6NVqWGo0MDM/T+ShqpRW5XaWto3AcaCMGlEIImEJSJWVWQEYj/KiiG4yd+/CuHsXcatFN5zc8QCg\nlNgXvvDwL2JuonHqFEWy2eMFEDkOlM1NKEldT2EMcRAgUlXInU6qSM20gcC2KV24sQGcP0/7C4J0\ndCSfo3z9OnD1KmqaBotH4Pm0dKtFiycA+G//TfhMH3eMUsK325BUFVEU9ResYaOB2PcRJkTLGIMs\ny5BlGaxcBut04DkOdMOgBS6vI2fR6dBc4X/zb/YLol59la6tp54amFTGWi3sbm+j9olP7L/uAPpu\nlcuU9p6aGhAoBvPzuGcYuPDss6PPgVDzPxIIEj6usCyKlv7iL+iCGNIm02g0UJqcBDt/nggkR0Sw\nLMRra1D4zX+IgCmKIpq7e+FCelGfOUMCEt+nf40G8JvfAAA0bpEXhoMDERYX0zGID3uIAzBoopE9\n3uQ8eZubkGQZUvI78zzIkoQwiiDziTOmmbaB8Dmuup72gpom/Y33f3J3Ll1HHEWY2dqC+vrrNCCd\nn4Nymfbzi1/Qc/7O3xneOiZ8po8XVleJLO/eHRwKsr4OnkOq1+uIoghWt4tCEIDJct/G1XVdwHXR\nAxAUi5B8H1NAainZ7dJ3imde5ueBr3xl/+d+QESuBQFWf/YznD11anhmq92mxeLKCvX8Z3r5S46D\nlXEiQkCo+R8BBAkfZ4zpU202m6lfdJaIMkpnqdGgwd6bm3Rh54nY9+mC5spKgIjkxRdJJbq9PTDA\nIWq3Ebpums4KQ3rdW7eo/eLf/tuHXwPN36j48fK6uSQh2t0dFLCEISRZhh8EiGQZEle0njyJKIoQ\n3ruHWJahShJ5+TYaFE1wn16+vSwDuo4oDBEaBlirRUrW5WUS1DzxBEU4ALWejejd7vtMO44YsP6o\nUa9Tzf/nP09rury0s72NqN2GJcuwFhagl8uQNjeJUPORqKbBLBZhF4toAJAWFug6bDbpu7S4mGaP\n9vYGLCr7OOCaVxSl36dvDHsub28KAoqeMyRsmiaeO0yJSKj5jxyChI8zxgx3KBaLqNVq9Eu5DFy6\nRFOEeH2YMbBeD4qq0s2g0SBSKJXognUc6NvbCM6do5uCrg++HhdocTHYQeB16KPAsBtVZv5y2G4j\nCkOqx2WOjzEGRZYRJQsP1zTR6vXA7t1DwfMQKQp6ngfLsiDHMaWlm02KLjSNfvY8wDQRhiH1XjNG\nN+TZWfr/1VdpcXDYNLPwmX604NOxlpfp+59v4wtDeI0GSoxBX19P51cP00bEMWRFQalUwt7eHkIA\nMt/f5cuDE79GqeYPcc3btj2chHlnw4huhrGCyoOOS+ChQZDwccaY4Q4L2Zt8vU49jrx2mVhYhpIE\njffB3r1L2/FWJEWBbxjQOp10FNviIq3af/ELIojPfIaitcSNSur1oPB0LU+tcYHIYQYiPAiMulEt\nLADlMrzvfx+aJIFlFiNILAdlWYbNGCBJCIIApqbBkmVIlQpixvoj5AoA1M3NVA3L3caSOnLsnNIz\n1AAAIABJREFUupABenxrixYErRbdxA1jsCwwDkKZ+mjAp2OdOEHkNWRakqfr8KMIRU5M9XqqQM4j\njoFk3q+mafA8D6am7XeyAkar5sdc85Zlod1uY3Jycv8feWcD1zrcD4Sa/8ghSPg447DDHbItTJUK\npUcbDcR7e5B8H1IQpPVM7gAVx8D8PBzfh8aHGfBZuz/9KUUFv//7aTSXuFG5d+7As20SRA0TZh0F\nmRx0oyqVYJ49SzeiOE6NFTSNSLJYRNBqoWwYkLIKUUkCA6DrOhRFgbe9jViSKD2dfW+zs0CxCGdl\nBRpA58lx6EYuSXRObHvA6vNQEMrUo0V+OtYIW9hGuw1rYiK1nOQZkThOF6FAf9gCzxrpqopwd5cW\nf7UalSj49cI93oelh8dc8+VyGWtra8P/yN9DENyf1epRdjYI9CFI+DjjMMMdWq19zfl8glJQqcC9\ndQuFiQmqCc/NpQrIRgOo16GaJmRNo8eiqD+DeJ9hSCIQcWQZtm1j7sKF4cdzFGQybnHCTRWy0WgY\nArduIQxDyLJMo+QkaejgdZkxGIzBkyS0220YhgGFP6dYBGQZjqZBr1bpPLVa6ecky/usPg8FoUw9\nWuSnYw3pCvA8D67rYmpujrJInKAlib4z3HADSFX2QQBsb6O0tYWQq+BLJVrcciFjuQx89avDr48x\n13y5XMbNmzeHW6by93DjxvAWpHE4qs4GgQEI28rjjDFj1gBQxDVsehIAPwgoNRoEVI86cYJSzSdO\nkBp6agq+oiA+eZLaGp5/nqK3iQnqNbx69YM5ZQGDZPKwMG5xMsxwJBlYEbkuZFlOFxs8gsnC88Di\nGJplIQxDuK4Lu9FAA0Cz04Hv+wiCACo/55JELSfZiTgZq89DQyhTjwajpmOdOZPO9QV1H5TLZUi8\nbu/79L1SVbqmoijtEohjyr4ktpSSpiGMYyJFrsOoVuk7t7ZG2aZhNpFjrnmdMZSbTXhvvknX2I0b\ngyMUT52i7/MB5jxD4ThH19kgMABBwscZfLgDn9ySh+elAx2GIG63iYRleeiIQ8zOAkEA9vTTwDPP\nEFH3eun2fIJSBpIkEYkdhIdNJuMWJ/npMhy1GqIwpFouY3RjHCaySfYbqyoYYygWCihaFvTZWfi+\nj7W1NfR6vfQ88AxCflB7ZgHzzjvvoNfrHfy+hDL1aDBKgcxV9p0OXNuG67oo8YiyXKbFXxCkvsuV\nCl0vvR79vLnZT09LUYRWqYQwe236PpHd7/4ukfMwv+ZR13yrBfzqV8B3v4uTm5sIb94c9JD+7nfJ\n63x7G/j7f5/q2+O86DkchxYGX/uaqAc/AggSPu44aLhDduxgHr6PwPOgRtHo9FLSP6xsb6ePZdOz\nPK2aiTpPnDiBc+fOHXzMD5tMxi1OeFrOtlN3o81NYG8PriRBtu3UujLvlR1F/RmxcacDPQjAOh2w\n2VmY1SqmpqZw6tQpWJaVkip3G8vuJ2P1GYYhtra2hM/0ccFBCuREZW9vbWFCUSBlP1M+cIGnndtt\nSmfrenotJj7P7MwZsHIZnufRd7DVomuC20VmVfH5BWv+mq/XqZ88WXBLtRocRUkHj1SrdE3cukXZ\nK26Bu72dCjGHwffp79vbokXuEUKQ8HEHH+6wtrafiPNjBzkSu8Xu1BSUjJdtHnEcI2YMkm2nD2ZJ\n6X7TqkdBJuMmT+UnTu3tIW42IbsuJFmmIQ7Ly2lPqOdRSnlnh35O9q3yRcnmZn9CFWMMxWIRnVaL\n9tNsEnHv7NDPfC5sEml1Oh1YlkW+1QdBKFOPBmMUyN1aDffOn4f59NO0kGs0iEQ7HRL66TqVdV56\nCfhX/4rqqCdPkgBrepoI1vdRCAKEOzu0j8VF+s6O8mvOInvN377dn4jEpzrpur5/pjcvq3z60+Sy\nB5D/9Be+QN/d5WUi3I0N+n95Oa0B/+mfCgJ+hBDCrMcBo4Y75EVFWVP3T30KJxoNuohHIOJRdHal\nnK+nftAJSsDRkMlBk6fyE6cSy0jeHyydP0/nb2Oj33qFbjdNTSc30SCZKawUCrRNo9E38bA8D2x1\nFZGqQiqXiYQ7ncFFgWEAvg+/1cKMLPd9hYdCKFOPDmOEfdvb2zBnZiBduEC997kZ1SiV6Pvw5S8D\nf/iH9F37u3+XvjuZbeOJCWx6Hoqf/ezoz32UkPGll4A//mPgT/6EvkeZBZymafB9n8RZUTRwzfcN\nYP7zfyZyzVrgrq4K//JjCEHCjwuGDXfodOgC5GmwvKn75uaBBhqSJGF2enqwNpZv1chNUBqLoyST\nYYuTzc3Bdq1CgUg5CBABcKemYHHV9OIipeKWluj5qkqCtOTceZ4HIyu+4u1It25BLhQgJX3Y0okT\n9Ld2m/bn+5QNePddmsLjuphUVYqUs/aWWQhl6tFhjLBvd3cXp06dol8ytpEDWF6m/eTry5ltNcfB\nxptv4uxBZYiDVPG7u/Qdz/TpQ5IgSRIKYQh/awuaYewf5JDvO7csobg/xhAk/DghP9zh1VeB732P\nIsFhPbvDZgNnwBgDi+PBdoZ8q0YmrXooHDWZZBcn/+f/kNDFNFOv5ygictZ19La3ockypRa5f/Ta\nGhG1otB5SBYlsecB9TrkrFsYn4ajKECvB03T0CoWManrtM9Wi7bh/cKmCezuwlNVWHNztKjh9pZ8\nZCIglKlHjaywLxe9hpIEdu8eqk89Nfr52YXm//7fI6NcwzAQhiE8zztYDzBMyMgV3NyTPenT58fp\nGwYa1SpmrlwZ/vqi7/yxgSDhxxF8ZfvcczQgPDt7OIthrTpZ8L7FvJtP1oeai44Og0dFJnxx0uvR\nTSpJA/dTh8niZPnaNZxW1TS6X12l2t7MDN30ymWq6TKG0LLAgFSYw4U4PGUdRZDLZdiShMreHpT1\n9bRnlPsKyzIiVYXVbEKNYyLhcple+/XXKX04MUELga9/XdSDjwqWRTaS3/kOfd68LMMYvG4Xp2wb\n8ve+d7isxQH1ZcYYKpUKWq0WpqamRh/PMCFjPsLOReTS+jq2d3cxM4rcRd/5YwMhzHqcMU4lPKpV\nh4MLRvIXMm/V4NaUeZIehkfd5mDbZLV55Qq1W33yk2nblaYhjmO0HAfGhQv0+NNPE7HyoRaWRe/3\n858HFhcROA61l9h2Wu/l/aCGAUxMQPI8FGUZ4cpKeg4Zo0xC4tYVRhEkSQJrNNJjVVWKkl97jXo8\nhTL1aPHGG9Sny1XSfEBJsQhbkqBMTqadAT/4AZUzOPILzTH15WKxiFardfDxDBMyjvGQLpfL41ve\nRN/5YwFBwo87DlIJZ1t18uCpuOz0pCwWFsjAo1Yjb+Tj3uYwZuKUl9QA+2nBfHsXV4J3OsCVK9h8\n4QW0r1xJU5d8fvLEROpOFsco2TYCXgP2fTpvJ070W1ki16XRiVtbacq60aCa5IkTwGc/Kwj4KMH9\nop94ghaw3M4V1C3Q7XZhmmaatSgUKGtRrw9faI6pL/NI+EAMEzKOUXCbponnn3/+4P2KvvPHAiId\n/bjjIJUwMHTWbl/U9alPjU41Ow6JlL7xDZqXy8VgqpqOS+O/f+ELtBh4lOnUMZFDp9NBsVhMrf6G\ntXdllOAd18XE2bOUBZiepsiJe2/zoRCeB8Xz4DKGoFiEMjWVpqQT69BGFKHMGJ1Py6L9ZT2Ef/1r\nWiSJut3DR94vOjN5C4zBU1XIspw6oQGDWYvnnwf+xb8YXDRl68tDFoBlwwDu3UOkKJD44JSsfmOU\nkHFMhC0mIn10IEj4o4BRLUzA4Kxd0yQSybYzDANf8X/963Tjef7549/mMCZyaLfbqfsRMNQzOqsE\nv3DhQnqjC0Mi4kIh7RWNIgAAUxQEs7PYi6K+uQN/XhzHcH0f6vw8Hd/cHKXCsxB1u6ND3i8a6E/e\nwtISvLfeQimKUuFetutgVNaCl4Ree23wemq1gKUlKHfuYGFzE4HnQdN1uva4FmNxkUobX/7y/mvo\nML7x4yD6zh8LCBL+qGBYCxOPWgHylH3vPbqZcH/oPHyf6stRtD+1fNzbHMZEDq1WCydOnEgfGKYc\nzyjBFSVzaXCbwsR/uo/EuEHRdexubsJxHMRxDEVRoCgKGGP9gREjW71E3e5oMMovGqDI9MoV3HIc\nnONq+Lyw76CsxcsvAz/8IS1eTTPtU2cMsCywahU9VaWRohzJQBH0esMnjo2JsMdC9J0/NhAk/FFC\nvoUpH7XOzQE//zmR9PLy8U0t3w8OiBziOEa73cbFixfTB4cpx0cpwZP67z6EIWCa8H0ftVoNtVoN\nURQhCAIEQQDf92HbNsIwhOL7pMS9cSM17eDe1aJu9/Bx/Xqa4ckbb8zNwQNg+z6Kly4NGGMMYFTW\nIlsSAsjjOTPVzDAMOHnNRt7hanp6/6J3WIR9WIi+88cGgoQ/ijgoaj1//vinlu8H+cjB8/p9lZ5t\nY2pzE/rGRlqLy5uSjGrXAoYTNn+eacLt9VBO2lgkSYKmaX0BWNTroXfnDordLkVRrRbdfHlastej\nlOSXvnR/N1uB4bDt9Dter9OAg3feISU0H06SSQ3vmiYMRTnYWvSgrMUBDle6rmNvb49+ybnaDThc\nLSwMLn7zEfZhIfrOHysIEv444rinlu8HPHL467+mm9CdO331c9jrYbrbpWkzvBa3uDhoSjKqXQsY\nTtgbG4BhIN7ZgdzrQdc0EmNl69KtFiq7u+jaNiLLImetfN16d5eO4RvfoGhKKKU/HOp1Ksm89hot\nyJpNIt9mkxZmfO5vtdoX0QWui3hpCfNRBP/kSajc/SybsZibG682HuFwpUgS1F4Pwc4OFFUd73DF\nMU50OQxZPcfjls36mEKQsMBHBxMTqWd0YnYPAD3fh1ytUj03DFPXqkuXKCLpdg9u1+KtXu+9R8/f\n3aWb+YkTiGwbpu9D3tykNiR+g3ddoF6HpGlQPA+OrsPKE3AY0o398mX6+c//XPQMfxi88cZ+C9Pb\nt0nlL0nA3h5Fs40G/Tw/D5TL2G02UajVIO3tAX/1V6mCPRcto1wGPvGJ4a99gMMV8314soz2/Dxq\nly59MIerg0SXWRyk5xA41hAkLPDRwBtvAP/jf1CN7de/HugBdl0X1WqVtsu6Vt24QdHGu+8Cn/vc\nwc5gpkkRhiTRzTlxUnJtG0qzSSlIPuRhZ4du3El7iKZpWGMMZmLc0Uc++uaj7fJpSYHx4P2/PGJs\ntWhBxmuzXIjHPcDDEKjX4SQua2XfRxhFcBiD0mqBTU6m7WYAbb+6SiT9wgv7SW6MwxUmJrDjeajd\nj8PVQaLLj4Ke42MOQcICjz/y/Z+G0VenxoUCPM+Dnr2hAqn95K1bwD/9p8BvfkP7GRZp1Ov094kJ\nIthTp/pWho6mocxT1LJMN+5Wi9KCiRWitLAA3fPQarXSxcAws5RRaUmBg5H//AHKdDCWfpalEpUQ\neMuRLCNWVcRLS5g0TTDLgixJiIMAYRRBaTSA2dnB1ykWgQsXhmcsxvSpVyoVrI8bCXpQzXmc6PJx\n1nN8zCFIWODxR77/M9P76b/3Hgq+D6nT2d/7ef48PWdqisa+DYs0ms10KMTly/T/228T0VoWumGI\n8vw83eA1LZ1NzI0/zp8HymVUfB9ra2sol8uQwnC0WcpxMt7PipuO8w0///l7HtXZs8coy1QmaDT6\nEW7PcaBFEeTk7wwkovJ8n0h4aiqt4fOsRaVCn3M+YzGmT71SqaCSbW8bhsM4XH0U9RwfcwgSFni8\nMar/M+n93KlU4N29S1HskKEO8P2U9IZFGlevUn3v8uU00pmbA5aWELz/PjTHgVKp0P43N2l/YUg3\nS0midCEAVVVh6jq66+soWtZos5TjYLyfFzclwygQhkRwPPX5xS8+ekW3bQOvvEILqxs3UjFWskga\nACfhMEQQx4h6PUiKQu8pWZipqoper4dYlsE6HSLdfNZiWMZiTJ/6oSAcrj6WECQs8HhjjGd003FQ\nPndudJ0sT3rZSMO2gZ/8hMxNsvtPCH53chKd996jmcy+T17b779PZKwodOOu1/vCrxqAVVmG+dnP\nQp6eHv2eHqWBR17cNEoE9P/+Hw03yCq6jzpyrteB//SfyFK0UOin/7GzQyRs24grFcSVCkJFQQQg\nqtWgbGzA8X1YcQyJ+4J7HmAYkCQJiqLADwJorjva4jWfsRAOVwL3CUHCAo83xtTi2u02FsZFa6NI\nbxzBd7swzp2jGjGHohAZtNsUkfEbfKUCWdeBe/fgvvoqCpcuDR+Tx/fxsAw8DiLKt98+XDuMqqb9\nrX/+59Qfu7t7tJEzXywsL9N74LV2gEhT1xHJMpy1NcQrK7CrVYSFAmRZhlYuQ11dBcuK5DJRrKZp\n8NptqLYNpuvDsxb5xZtwuBK4TwgSFni8MaYW98ILL4w3ux9FemMIvtlsYiafBm+3qTVFVVMVdq0G\nzMyga9sISyV0GUOBt0m9+OL+G/zDSEuOSzF7Hm3zzDOHN4bg2/3Jn1A0zNtz8hgVOd8vskro7W1a\n7GQhSYijCLbrQjEMmJqGoueRsCpZ9OzZNuJej95/drEQx1CiCH4YwqvVoL/88mjVfHbxJhyuBO4T\nYpShwOONMbU4SZLGk/Ao0juA4MMwRBiGg0Mh6nUSBPE2GN7OlAx76HQ6qNVqcFwXcak0OCYviwed\nlnzjDTID4bXzxUXa/+ws/b+4SNHjxgbws5/tP55RqNfJotEwKCoeFQHyyHlqisjzjTfu/73kldBD\nPMBjTYPb60GSJBiGQZ+hphFhui4AQFFVhJpGtfxCgYi2XAZqNbD5eUSzs9ianT24bS2/eDtorOhB\nEA5XH2sIEhZ4vPEwa3EHEHyr1YKqqmnfL+9L5YrahHh5b2oQBHBdl9TRcQx/Z4cMI2wb+L//l3qV\nuaPTg0xL8qhxaoqIcBhReh6wspJOihq2MNh/AtI+3EqF0sLjPgfTTHuh77fmnVdCD7EUbccxgihC\nwTDSBRivFzca9KumIeImHKpK731ujhYpxSL0YhGrUYR4mGc4R37xxh2u1tYOT8TDZhQLfKwgSFjg\n8Ua2Fnc/OIj0DiD4VqvV94sGkPalGkaqqAWIhHUdnU4HJU2DtLmJyUaDSGhvjyKpdpvERd/9LgnB\nLl9+MGnJYf2zw7C+npqbqCoR69Wr/dnKQ5Htw+WLjnF9sMCgsviDYpgSPmspCsBxHDQ7HZhzc2CJ\nMr0P7pYVhlAMA7HrUgbAcegfr+HbNpRz5xBKEroH1eaHLd64w9X2Np3/Ud9L36e/b28Lh6uPOURN\nWODxxsOsxR0gtmm1Wpjjwx7yfam1Gt3sg4AMQywL7vIypjwPkGXIhoGe69J8WYDSmr5PZLa2RoT8\nmc98+BvzsPm5w9BuD6bd+YCDpSXgyhXEcTxoeDKsD5f3RR8G99sLPUwoxy1F79yBb5rY2trCzMwM\nZMboeLiJCj/GIADu3oXS64H5PuJOB8wwiIAbDVo0GQbYiy9iqtFA++23YRUK+32k+QJk2OJNOFwJ\nfAAIEhZ4/PGwps1kCX56uu8FHHse1Nu3UTFNinqzkSRA9eD5eUrRTk3BazRQajYhVauALEOJY4Td\nLiJuY8kjuZ0dEkY5DvDP/znwla8An//8/bX4HDQ/Nw/PI1LJv/flZeCppxDJMn7xi1/gd3/3d+lv\n+fcLjJ6XPAz32ws9Sih35gzi5WXsbW2hWq1SHRigDABPe8sy1YM7HcD3IZXLcDUNchiCFYtEkGFI\n2ygK8Dd/g9OyjE4Q0Gc/zEf6q18d/bkIhyuBQ0KQsMDjj4c5bebSJeBb36I6KWOALCMIQ1T39qC9\n9Ra19fAbeBamSTdvALhzB7JpgiWkxRiDqqoIggCaotA4w26X9nPvXqpa/q//FXjzTbrhf9AWnzHt\nVQMYIm4aSDHnXzMfOQO07QdpzbmfXuhRQrlyGb1nnwVeeQWlqamBxwHQ59zt0nmW5X4PN5NlhIoC\nKY6JfOOYshitFhBF0OIYnqL0W5v66PUOn7EQDlcCYyBqwgIfDTyMWtwbb5AZRK1GJGNZQKkEV1Eg\nVyrUm2pZpCpeXaWbN3+NToei6LNnoU5MQJMkunm7LuB5UOMYEZ8xzFOdxSLts1RK9+37afr2G984\nvLJ4THvVAIbNSwZGp5iHRc5R1FcSu66Lu3fvHvya99MLzYVyngfcvUsOWW++Cdy4gcb2NtxnngFz\nHPoc+Pspl2mRxX/n0a7jIKrV0CsUaEFWKtGiqdGgYzNNMF1HtduFyz9XgD4Px6HP9oknPrzaW+Bj\nDxEJC3x08CBrcdle1FOn6AadDIVwXTetj8oykWWvRwrjiQmKgj/1KXrOL38JiU/T6XSIABK/4vb2\nNnRJAisU6PiU3OWYSQkPmGMcRsgzpn/6+vXrePLJJ1EsFvfPS+ZIUsxxHA+2eeUjZ56iTWrkruti\na2sLp7NThPK4n15oVaXZwLadpsOTNLGysYGJapU+qzhOx/rxEYa8TanXo3P5xBOIZRn1RgNPXbhA\nmY7VVRLW8XMgy5AVBb2dnXTmdBwPmneIyVcCHxKChAU+WngQtbhhquLMUIjojTdglMsUcXGxDyd4\nxyGSP3GCorVs7TRj4C+7LozVVYTFIhRZTg00ssimhE+fHmzxGXfTH9M/HUURIt5GlRE3DTh4BQHQ\nbIK9/TZm19Yo8iyViKiy+86NZAzDcDB9OwwftBf6jTeA73yHZjZPTAycK9/30dN1TNVqlJWIY5r7\nywl4Z4cWRLpOpP3lLwOaBiMMsfmTn+DCqVOQ1tfTlHWvR9sxBkWSoO7uIp6aAjt7lvyjs73DYvKV\nwIeEIGGBjyY+TC1ulKq4VELw9NO4ubODz5w92xf5gDEiqKkpuoFvbRFZDqudcuztQVYUOK6LoixT\npDnMGCKfEj7sTX9M/7QkSSkJA0Quy8v0fqKIyGtrC+h0wBoNFJtN4PZtIt84JjWxrqce2ZmRjGNJ\n+IP2QmezEpcu0WIhQ8K2baNQKFDNnbuUXb9OEWutRv+qVVo0ZRYLsizDMAx0m00UNzaAkydph5mM\nhSRJcOMY4blzKF6+PPz4jtPkK4HHDoKEBQSyGKMqbrfbKFSrkJ54Yv8fedsOTyFzgs4jDIFmE6Ek\nIQpD2M0m5IkJGJKEfVsPUx0f5qY/xst4HwmXy2Sh+cMfEsFyE4sTJxADCJrNdJGQHD/eew+YnAR+\n7/fob54HrK9DXVnBxN4e7SM7sYrjg1g05rMS2cVC8r663S4mJibS52R7nRcWaCE0bH4zgHK5jN7y\nMoojMhYAIPk+utvbKI46xuMw+UrgsYUgYQGBLMYNbWg2B006ODg58HnF3D96mONSp4M4ihCEIYqF\nAuD72JZl7K6uYmJiAmY2Ah+mOj7MTX9U/3RClNXVVaitFqV2OVFm4fup+9ewtHaxOGBugV/9ihYh\nUQTVdVHgETWvFy8upt7SH8SiMZ+V4IuF118HikX4AIIgSGv02XPEGJUjomjk/OZSqYTe3bsH1s8N\n04Q7bkzho5x8JfBYQ5CwgEAWY1TFhUJh/w0fGCSHOKYU8ijVsesiBsCiCFIQgJ08iZlSCd1uFzs7\nOzAMA5OTk5SizqiOB3CYm362f9r3yXwjIcpSswm50+k7SCEMKV07M0Op260tOg+JzaPqef3WHUgS\ncOEC1V1/9jPgr/+aUrlJH3TQaiFSlMHIeXmZIufTp4FvfvNw9eBRWYmFBSLUq1fR63ZhmeZwf3DD\noNe1LIrWh7R3VatVrLVatO0IaIqC6RMnDj7Whzn5SuAjDUHCAgJZjFEV75ualAUnhx/9iFKui4sD\nlopotykS3dlB1G5DZwxsbg4ol8EAWJaFQqGAtbU1dLtdWIYxoDoewGFu+rx/+pvfJJGYqhIhyTJC\n30dkmhTRApT2bTSoFmyawLPP9oky6nTQ9n2cOHeOiHVigkYX3rlDEabnEWmXSoAspyYkeXDDi8Pi\noKxEIpTbevVVLHgeHTs3PuHZCEmiaJ77Zg9BoVBAwBgC3x99Mxy1EMriYUy+EvhYQJCwgEAWY1TF\nY7GwADz/PBEV7zl97z26SUcREZHnIY4iSKZJZO15FEXqOhhjKJfL6LRasJpNevzGjUHLRE37YDf9\nON5Xm2aM0XAC1yX18MrK4HPqdXpckoCTJ9GcnKT2n6Ul6s11XVIiKwodR6cD/Pa3QLEIRZIQadpg\n5Ly4SCl7RTl8S8/qKh333bu0gOGEnJyHnqpibWoKiy+8QOdxyDZYXSUDlBFkzhiDVq0ivHMHiu+n\nbVq6ni5QRi2EsnjQk68EPjYQJCwgkMWDmMqkacDf+3tEQLdvE5FUKnRj13XEYQh3aQkFHl01GvTv\nxAlA11Fot4F6HZGmQdJ1IsSsZeLiIhHFuJs+FzVdvkyq4qWlft1acRxKR3PiAihKNox02lBCmtKd\nOzi7ukqka1n0j48uzPZLT08Drgup2URYqQA8cs4Lsw6j7q7Xge9/H/j5z+k1Mj3B/DxsKwo0XYdk\nGJTmHgbTpOPY3NwfDbdawNISZtbXKQPgeXRscZwuXHSdzt1BxicPevKVwMcKgoQFBLIYoyoeC/68\nKCK7yxdfBM6e7QuJoKrwHQeMMbKr47OHed2UMUiKAkWWYU9NoTQ5Obj/MCRi577XByEvarpyhVTb\n6+sIrl2DsbqatlX1eoMtWUFARDw7iyiOoXe7VMfmiuZGY/D8MEbHNj8PR5Zh2jZF8cPSwOPU3W+8\nQYuH5WU6N9Xqvk28Xg/y3bs4Gcfwz5+HOkytzt/HCy/QPrPe4vV633xFnZiA3WpBZ2yQbIOAFin3\n7lHNe5Rl6AdRewsI5CBsKwUEsuCq4s3N+3v+5iZFnn/xF2lbDa8Vd7tAq4We6yLi/awcQZB6SEcR\n2KlTaMXx/nm2skzE+uSTRPKjLBNHiZo0DahWoXU6cGdm0mPM18GTsX9RpwP/zh0EsgwnjhGvrlI9\nOJmT3AcXkQGIJAmxZY0eh5hVd+eRnX88gljjOMbO3h6suTmolQr8114DfvlLSttfv06xYYowAAAf\noElEQVT/372bzmd+9tnBOb/1Oi2KCgWgXIZmGHB0nVq2svaWvk/HUKmMnrE8bgiIgMAYiEhYQCCP\nDzuVCdhv9pFx3AquX4ep6+novCgispIkIslKBdrkJOJ6fXCEIJD2u168eHB99fr1dEhFvla6tQVI\nEqLsiL882UsS4iiCvbQERZJQKZdh2zYcx4Gxtwcpr0bOkHLE26rCkOrhU1OpKI3XtoH96u58T/AI\nO03bthHHMUqaBq/RQLi9TXOYFxYocuYpa4Ci6NlZWrR8/evAn/0ZnZtarR/JM8agWBZcy4K5u4vk\nwfQzA9K+43I5Pf7DDgEREDgA8je/+c1vPuqDEBA4VuCm/6+8QjXSw6Sl+Q35H/5DqmXOzOyPLnUd\n8cwM3mw2ceqZZyBbVr8FCJKU1o17PbBaDRGAXq+HAhdg+T7VMU+fpkh3Y4Mi740N4NOfTlOpnMx+\n/GMi3GaTSHBvj1Kr77wDP47RiyIUSiWwICBhVca7OooiOJ0OtCCAXqmASRJUVUUYRYhaLUiaBpY9\nL0EA37Kwa9toJald0/OAmzfptVut9BhWV0lZHYYkYuNE9+1vA9eu0Xarq3RufJ9+T1qIoijC5uYm\nZkwTytoa5CCAE4bQNA1M10kQp+u0fa9H/7/9Nn2eL71E+63XKePgOGm03Osh9H3olkUEXKvRcfFo\nX5ZTrcDEBPWB2zbwT/7Jh5/7LPCxBov35bsEBAQApLVJSSJSHUbGvp8OC/ja10g1/K1vkXhqCFqt\nFn7729/iJX7jvnMH+F//i/atafRavR4wN4egWMTq6ipOzs9DajSIjEwzHTLAGKWxOx2K9M6fJyJ9\n800iOz6aL4tGA9HqKrqOA4kxNItFqNUqqtvbUJKWqCiK0Ol0YAQBVMbAMvuI4xjBzg78KII2MQFZ\nlhH4Pnzbxu7EBErVKgpBAPfOHRiGAYUxIsCcCxV2duj9lsvUb+w41G9cLqcez3FM52J9nZy5Jiex\n0+lA7nZR7XTo+bKMbrcLiTEYkkTngDtkdbuU1VAUWiD9o38E/OVf0mcZx/350PB9dH0fd/b2cOn3\nfo8+w4yIrd/6FAS0z89+Fvjbf3v8EBABgUNApKMFBEbhfqYyffvbByppG40GqlmhEWOUdo2iND0d\nBECrBUWSUAwCuCsrMAEiqMQQAwCRhW0T4d68SRFfo0Ek43npmMSk/QkAYs9Dz/MgFwowNQ2G68IO\nAjQBGM0mZNPsT4nShgi/GGNQNQ3M99HpdCiVG0WQJyawcPo0WLtNixLLQtd1UdI0MNdNd+C6dIyb\nm+ns3mvXaHHhunROq9X0mEslOsd37yLc3UWoKKjFcZ+AAUDTNHS7XeiaBtbppC1TWYesEyeA//gf\nKa3MBVYZRbURRdj+yU/gMwa1VBoQsQ2k8zsd4B/8A+BLX/qg3yYBgaEQJCwgcBA+6FSmMWYfrVYL\nc9meU55qLZWodtrpUPq4WgXOnYNcKqF76xaMJ54Ay5J7q0XRHUDkIElEuMUi/a1SoSiSG3DMzwPl\nMnpJPdVMWpEkXUep1UJ86hSCu3fhOA5UXYdhGBSd5scrAoCmQQlDaIktp6nrZDrieXRMmgZVluGH\nIXqeB5OTOT/mOE79ndfW6P9Oh0g3EYRljxnVKmLG4L7/PiZsm/qrM/V2PiwiiiLIPL2fHTcI0PZc\n+Hbp0r63JEkSyuUyms0mpqam+u9zX+tTvU7HJiDwgCBIWEDgMDjsVKYDzD7iOMbe3h4uXryYPpgd\n8iDLRJ6MUW/rqVPQb9zAZhAgbrVSK8tWi8iAR4OeRyQGpITcbKZkF8dAvQ4/CNBxHEwYRmrzKMtA\nEIB1u1BPnUJ4+3Zql8nY8BQ8Y4BlQep2IUkS2Pw8EejGRrpPAKZporu3h57vw8gecxDQ+dzYGIho\n4Xl0/njLVqJGjopFbDoObE3DGSBd6CgKwBhYHEOPY4SuC/nUqXSgRB6mCbz/fioQy+HSpUtQx9X/\nhT2lwAOGaFESEHiQOMDso9PpQNf1wRv9sCEP3CZxaQleEGBiZgZBEGBrawtxr9ePNvvkFYapeQaQ\ntjEpCpG8LCPWNHjLy7BKJch5ZTOPPi0LvclJEmrZ9mirxigCDAMsiuBPTlK0Gob7eocZYzB0He1O\nBxEnYGDw/fL3oCj98YH9xzUNUb2OzXv3oGkayoaBSNdpoVIopOKpWg3SwgL2LAvx2bOjj9s06TjX\n14f+WdO04R7UWQh7SoEHDEHCAgIPElmzjxyazSYqeYFSfsgDd8WamADu3EEXFFHOzs4ijmO07t5F\nDAymvH0/FQ9xqGpqlZmkhSVJgskFXdl6L29R6nQQWRb1DxeL6WzeXo8WFq5LZB+GwLPPYvO552j0\nIlcw53uHowiyoqCgaXB6PTpuz6OWIdsejLL5z5kFTBDH6DoOKnGMiYkJ6IwhjCKKlD2PxFpzc8DM\nDNSpKciyDPsgEuXkPKx3+bAQ9pQCDxgiHS0g8CCRHSE4PZ0KezwP0cYGpnntlEeF+V5Y2yZl9e4u\n2Vv6PvTEU3pmchK99XXYkgSLR218WEF+ClBCynGpBH9nB34Yolguk3CqXKaUdrb/mDHAdcEYA/N9\n4Pd/n47/xz+mtiZdTxXC588DU1Ng29sISiVKG/d6+yN63wfKZRSaTdhRhG6zCfnUKRpckSdsTUvV\n3gB830e324VpWdBcFwhDqLJMJJxZNPRV12EIzTCwo6qj5/7OzdE57vXu77MV9pQCDwGChAUEHjQu\nXaI2pddfJ2KRZcQAtPV1lG2b3Jz4fN1ymVyZ7twhIuJTiX79awS7uyjEMXjMyzodGJoGJ46phcgw\noIQhmGnuG9AQRREC30e73UZXljENQOKRMRdbZU0wogjY2YHOGNzZ2XTE4Sc+QYuIQoEi4a0tIuXV\nVVitFrU1lUpE6t0uERwnbN8nYvc8hKUS/GIRnu9D39lBKQigxnE//RszhkhREPd66IFmBBeLRSiK\nQvvsdKAoCgKuCOeTmwCK2m0b0pkz2LNtjDCwpPM7O3v/NV1hTynwECBIWEDgQYL3FtdqZO9YLgOq\nSr20hgFlcjL1iV5aIm/p6Wl6nm3Tz2tr1EfbbqMEALdukVo6CMAkCaamYXd3FyyO4fo+fNOEGQT9\nWq/neQiCABpjKFsWpGIRbhDAiCIiLtum49reJvJOyBLFIqJyGbLjkD81T41XKiRoarcpmuRzg30f\nKh+HGIZ0zEFA+9J14JOfJHLf24PT66FSqWDSMOAHAYK9PTitFhRFQRRFCMMQWhRBiWNIIMWzwhcL\nUQRsbEDp9QDfR+w4YFFEC5YgoKjYMGA89xzay8ujRykCdH65Ucf9uKEJe0qBBwxBwgICDwrc9/jE\nCRr7Nz3dHxLQi2Nq+wEo+uT11ldfJSKRZaoDT09TytNxEDQakAsFilwbDSIPVUWsqlAlCUVVRby4\nCC8xtHAcB2EYolAowDRNSL4P6DokSULIpxwZBpHm3ByR+61bRLTFInDqFALuV83rp55HhLy7S+Sb\nESXFmUi2n9rmgrFKhQZXJCMGOTEyxqAZBjTDQKSq2NvbQ6lUgqqq1E9cLkPe24OdpKXhukS2qgpW\nKiG2bUQAZEmi86SqtI1pQrl2DVOGge6776IYx4M2mXNztOCoVslm8lvfSu0xx0HYUwo8RAgSFhB4\nEMj7HgODftFvvglLUShtywfPt9tEbpYF/OEf0mMJaceKgjAMoStKOmkpaUWKwxByHAMLC2DlMlkt\nJn7ObtZrOo77JOxzoRg3B6lW6fWeeoqOaWcHCEMorkt1V1mmvwcBvf6FC0R2vJ6cjEOUeD07COj/\napUWE5JEQxXm54E4HoxONQ2IY0iSBEVRoCgK1YgZA2ZnwSwL7NYtOj+9Hj2uaYCiINZ1xFyIFkW0\nkDl5ks7P9jbO3bqFYGWFDEtyow9RLgNf/SrV7E3zg7mhff3rwp5S4KFAkLCAwINAfmwgR+K+9F6r\nhcszM3Rj930irZs3aRADr29eudIn7fDmTchhCJafcQsAQYDe1BQs7rksy0R+29tpZMr7fItFSL0e\nDVXgj0sSkX0yWhFhSMcxNQV3eRmB46By8mQ67KFeTyP3ZhP4/OeBTgftt96CmrQIoVSi9PbKShoV\ndzpUP240YHa7kBSFIvFCYb9CmztlyTJYuYx2qQTLtql9g4vPPA+SLKcmIlNTRPiuS+l9JKMWW62U\nmDl4a9dPfwp85jP354YmIPAQIEhYQODDYtTYwASu68JnDMaTT6YCql/9ikiQD4hYXqaoNCHtnVoN\nLAxhZoVOigJsbiLwPGj5FqhqlQiTEzUnNQBKpwO12UzJZWUlNfLgU5mefBIoleAqCjqdDmYvXKDF\nwZtvpkIkVaXjX1kBrlxBY28PpVOniAj5Mdy7R+TL7TQ9DzEA1fPI/xqgfTCWqpTDkI4hOV7GGPQg\nQGwYFAF3u5RKB8BKJdhxjAp3GOOjCZM0uBxF5Aq2t0cuXvxcOA5FwBMTVDLgke0HcUMTEHgIECQs\nIPBhcf16GjkNQaPRQKVSSaNUzyM1NL/B89Tv+nrfJrHR7aL83HPAO+8QKUhSf9wh6/VgeB6lsisV\ner6uw5+ehry2lkbavg/cugUlCKB5XupI9e67dKzdLhH75z7XrwEzxtKoeX2djivbk2xZ/QXDQE0Y\nSJXer71G++d+1ZoGtrsLxmviUUQE3G6TmExVByNXz4PV7SJWVdquWKQMQ7EIOYrgtNsofPazUN96\ni46RD7QA2U9CVRHt7kKemEhbp7I2lidODI6APKwbmoDAQ4AgYQGBD4vV1QOHNui6jhMnTqQPDCM3\nTrIJms0mFp5+mn758Y8p5ZqkcFkQ0DzflRWKfpOBB2GhAK9ahbGzQ/vjk4YUBaHvE+GWSrQvgOrA\n3Cc5AWMM/cFq7fZ+H+zMgmEfCdfrpPg+eZJqqUm0HqsqbcdboiSJiDOxswxnZyGVy+lwh40NKJ4H\nxk1MfL/vOc10Hd0nnoA6M4PJ06fTtiheO2YMahwjchzI29vAs88CZ84MumiZJh3Dq69SJCwg8Agh\nSFhA4MNizNCGgalJwHBy4321QF9EZTWbaSTMSdgw4JkmTP67qlJEvL4OTZIQhSERnK7T/jwPLIqg\neB4JsjodIsPpaSJvSaJ+5iRSlCQpFVB53r7+4/6xtttk7MH/3moN1pn5rOTEatMzzTTy5oKpchnd\nKIK1sUHp60TNDcZSI49qdTBtXihgamsL9nvvEdGfPEnbdTqp7aVpwrFtqM88Q3X2YZiZoVrwH/2R\nSDkLPFIIEhYQ+LA4YGjDUAwjtyjqp7Nt20ap3QZ7/XUitUqFxE+NBv3j1o2OQxFgkj6Wo4iES7re\nd54CAKbr2DRNPHH5MhgfRs9FXQC9xtWrQLkMxliqpE5UzPuQLBiiKEpJeGlpcOCDrpMxhq7DN000\nfR8TlkX9xpn2I4k7ZzWbaZ04isCiCKFpkgo8N95QbjZRvH6dzgt/Hxk7UDUMsXf7NkpRhJEmlpzY\nr18XqWiBRwpBwgICHxYHDG0YimHkxoc2AHA2N3GiXqfaZY7U4slJtG7dQiGxmYQs0wJAVRF3OqSm\n5u0+SeTMikXsGQZOXrxIF/zt24OvzQVXS0s0EYkj72udPVZVpWESwP4adw7u/Dw6AImidnZoEeA4\nAAApjmlgBO9V5u1OngfPMKCdOEGPZzIHqmmikzh8YXJyUAUNMvqQJQm9KMKBXcCqSqUEAYFHCEHC\nAgIfFtmhDeNG4QGjhzZwNe/SEhRNG7qvII4hKQqYbVMqljtwNZuAbZOYSVUp3crJy/exsLSE8N49\nKKOINRFcsenptCac97Xm4AuGXo8i4WE17sz7cms1FO/cIWOQSoXq0GFIAyNu30asafQ61Sq9ZrsN\nrKxA4nXe3H5VVUUUx4gBsEaDIu4cJqpVSLl69z6IsYQCxwBiipKAwIcFH9qwuXm47bPkBqRDGzQN\n8Dyoq6uQR4zjCx0HpXabtuW15kTsFGkawlKJCDEbPaoqQsOAdO0aPZ59bY5EcKVsb6ckrGmkdrbt\nzAGkC4YDBVyZ9xXaNiZu307rxfz1ikUwAHGpRGIpVaXHSyUwWUbAGEWqXEiWgDEGSVURSlLqcT1w\nkkIoqgopK4YbBjGWUOAYQJCwgMCDwMsvE/kladYDkSU33k6kacCNG4hfew1Ks9mfHJRHvLcHKYoo\ntZslvqQfty966nQGnsc0DVEck6I6T6wckgS5203JFSBlMa/LAvS8kyeB9XXUVlehvPUW1YNte/B4\nuZDqzBlo9ToYt5nMot0mEubHnZklzGo1IAwRM0ZEmwPTdWqlGvJeBxY1B0GMJRQ4BhAkLCDwILCw\nAHzta9RKcxgiPnOGtltepprqu+8Ct28jWlmB5nmQNzcpfbuxkUaCYQip0QBTlDQK5ogiSs/yWnAu\negSAyDTp9U6eHCTWZN+wbSgrK6jeuQPcuEHTngyDhkx0OkSGOztEuteuobS1BWV9nR7b2kqP17Zp\n+xdfBHQd+vo6wvyoRWBQoJYbbchqNWqXGhHtSsViasKxsUFZiGYz7Qs+c+bg8y/GEgocE4iasIDA\ng8JLL5ET02E8iW/fJrLitdCEpIK9PYrgDIMiw0aDnKfm5wHfB/N9+CdPpv7QHJJE/svAfkvIzDbw\nfXrdF1+k1iRVpd8bDcB1IVsWCrJM++Cp58VFqj1fvUoReKkEaBp820ZsWbQtt5Lc3KR/n/88LUzu\n3qWJR8OmGmWPMfG57kPX0atWUeB1YT47OOklLmxvI+LRdtYjOgioLWmYqjsLMZZQ4JhAkLCAwIPE\nYTyJGw3yWf7KV+j3q1cpKrQsBFFEE4KAdHBDEFAEaxjolkrQsu1FHJqGOI7JxCMXVQ6Am4I88wxF\niz/6ET1umrSPchlBEAxOUbp6lY75xRdpwbC8DHS7UHs9sG53MKrmgrClJepFbrcpmh1xLBJjiDM+\n11lExSK8Ugnmxga9fhxT1AtA1nU4ngede2vz93b6NPUs/+AHdLzcJSsLMZZQ4BhBkLCAwIPG/Pxo\nT2JVBb7zHRqYwIc9JEMbsLyMqNeDFoZEfnxoA2OkKLZtBJIEc5gIqlSi2ip/Ti5S7jth8WiYu1ud\nPUtR5t5en0gV1+1PSupPUTp3jtLO586Rx/X6OlrXr6MyN5f2MrdaaZpc04i8Z2aorjsMycKB+T4R\ndu59KYoCX1VhLizQ+bh7lxYzsgwWhpCiCJGiQAoCOj/ZdiXfHzAh6UOMJRQ4ZhAkLCDwsDDMk/gv\n/5KIIjttKRnagKeewuorr+Ds6ir9XVFoW650vnMHSqORDrvPQpbhFwpQPY+IPhdV9sGJNe9upetA\nuYygXEZnZQXT584Nn6J09SpFkKdPY2dtDfOXL9Pi4tQpij555M97j/f20jR5HqUSCbOiaH+NG9Tv\nG4YhHbPrpuMUXRcsiuADCAwD2t/6W8Bbb9HfEpLun4PEhASGIcYSChxLCBIWEDgqjJm2FKsqNiwL\n559/nqYR5dLOcbEIbX19pJrSNU0Uu91B5XQYAu029FYLMldch+Ggu5Xv0+8vvYQQwA6AM888M3qK\n0tLSfjvIcjmtM3NyNwzg7l0ovg/JcVJbSr6oiCJEmobINKHla9wgEnZ5VG6atL+MwIv5PjqnTmHi\n3Dk6p0k2oT+uUZIoA/H66xS9i7GEAscQgoQFBI4KY6Yt9Xo9aJoG+dw5Sr3mtg2THl/WapGNZQ4R\ngGhiArKipOMEk1qq1utB8jwiKN5n7LpEiJ5HadtSCazTSVuUxkxRAjA4wGFhgfbz05/Sa/d6gOtC\n8TxEvLbN920YQLGI5uXLKA55rwClo7utFhEp94jm8H2oioL1ahUTwEA2Aevr9B59P02//7t/N3Lx\nIyDwKCFIWEDgqDBm2pJt27AsazCqNE0iM89DxJXCm5u0TZYcfR9Krwf/i1+E2ukMCq4UBTFv8SkW\niXxVdb+SGR98itJQ8DYpgExEFGW0t3ahgOaTT6JUrw+aeYQhFNum4Q6KQosJHkVHEbltPf88mvl+\nZ03rj4PsY3kZuHlTkLDAsYQgYQGBo8KYaUuTk5PpxKVSiaLd3/yGokdNIzFSHFN69uZNSjvzWm0c\nY+30aTwpSYOCq0YDCAJInkdRaxSl6ee8knlhAbIso8KHIYyZonTp0iVo2UVFvU4Lh6w15dYWXM+D\nyodGFAoDdprld97BzvnzFEFfvUrH5vtAqwU5CKDyecJ7e3TsYUjR+Oc+B+PMGQTXr+8fqZiH8IgW\nOMYQJCwgcFQYM22JMUaiq3qdCIkx4Px5It1GA3EY0pSkYpFUvuvr1LJz+jRw8iSsmzehrq6mQiTL\nIjJsNBCuryNaXITCHaayamSuZC6XYZRKuHjxYvr4AVOUKpnJRftGGQK0/0IBzswM7EoF5t27dA74\n0AnbBvN9TP7ylxTtTk0Bv/1tv3+ahSFcXYfGGIm7eE+1pgHvvAPVsvCpT31q/HkXHtECxxiChAUE\njgqHmbbEo8ksmZkmMDWF3uoqNNumNqE4Jocq16UJRr0ealtbZA/putSHXC4TYSkKNq5cQeniRVhb\nW2QUko3IRwmuxkxRGkB+lGFm28A0EU5Pk2d2tl4MQA0ChJ4H/PKX9BhXa8sy2NmzsG/eREGSoExM\nDPphj2pBGgbhES1wjCFsKwUEjgrZaUvDMCya5JBluJqGqFaj6Ni2KZqdmaF+240N6I4Dpv3/9u5n\np6ktiuP4r6W99vZYEIgkaHJBhjchEgcmDpz4Ar4Gjn0OJzrxCZz4EBqdyciEiQPwXwIRUKOFAjmU\n3sHq7jmc7l2SGy779Ob7mSl4sjUxvy7O2mv9kU3M2tuzZ/79t45nZ+0552xROvMhobhowsmtXZQU\nXmXotijNzGS/l39frP47aEn68cMqVtfVnCTS0pLaCwvqJon9iLv4wcFdQWq3/f+eDjOiUWJUwsBl\ncduW3rzxV2+harKv0umoMj8vuW1I7vvm5tT7+FGnx8eqTE1lk7ZcE9P6uhrXr6s3OxteT5hruBo0\nNrlFE58/Z9elimsXpfAqw/4ihV6tpvrurnV8F1YZdtttne7u2t/FrTLsvy/Wu3eqTU+r60ZSFp8/\n6sqUw4xolByVMHCZQtuWQtWkk6a25vDXr+FKeWJCvSSx/8yuOnaVY79inN7YUPXgwL+e0HEjLfN8\nW5SKG4p8XdS5LUr1oyNNfvgw/L54ako9d9XKfS23flFXr2r261cdTU76zyv5K/g8ZkSj5Ahh4DKF\nti2FqklJSlP19vfVbjRUbTT8lbJbhlBc6ydJ9br+bDbV+v7dfl0MVsfdqc1z16X29625ybehqNhF\nnabZFqVWS3+dnCjx/YhdUtU9s1odXjpRr2tiYkIn3a7/vNLZCr6IGdEYA4QwcNnctqW9PWvESlN/\nNdnt2jvdTke9lRVNV6u2ws+jV63aNR3PCkNJaszMqLG9bYGZD9Z8sPkariT74HD7tr23XVg4M7VK\nUtZFnTvvoGHqnAq/enKSzbz2LHqoXbumZH9fWlkZPu/gIZ4K3s2IXl3lfTBKjXfCQAzFbUtuyYNr\nqnKjFxcXpVu3VP35U9dareA949NaLbzCUBp+5+umW7mrUEky3HAlWejt7Fg4P31qQVzcDnV0ZLt8\ne73BeQfPGVXhS6r09yD7lk5IUqPZzCrt4nndM/MVvDsvM6IxJghhIJb8tqUnTyzcWi0Lt1bLmpTc\nu9cvX0YO+ugliUaMqzDFivHmzWyD0+amfQg4PbW7x27tYr0+PHO5uB3q3j3p5UsbGVmseH0Vfk6l\nVlPd7S8OLZ3Ir1/MbZwafFA5PLSvf/rkPy9QYoQwEFuSWGhsblol6ROaXtV3pdm0CVqjltn73vm6\nmcuTk7YJaXk5W7t444Z1FReD1bcdqlKxru/i955z7uqVK2pUKtYZHQrr/Ll9M6K3t7Pg9Z0XKDFC\nGCiD/B1i33vZ0PQqp9vN5kmHnhF653t4aH/u0aN/Xz0+eCC9fm3Pyq9pPO/cjYaFdGFj1LnndjOi\n09QC/PFjwhdjicYsoAzcHeKdHf/XQ0M2nIMD27d79264gcn3zveiGphCXd+jzp2m9r3Ly+EBJqFz\nO1xBwpgjhIGyCN0hlsLTq6Qzd3IHDVedjnUqu+8vDtlIU+vM3tu7uAYmX9e379zFLuo7d8JXkHzD\nQRyuIOF/oNIL7iMDcOnW1qRnz6T5+bM/1pWk9+/PTq+Ssju5xRnK7fbZBqbDQ9vJu7QUbri6KFtb\nWdd3mtoZvn2zv0+h63tQ4fpmZksW1ouLwxOxXAVPBzTGHCEMlM3amvT8uYXV3FwWSr9/S69eWdNU\ntWo/gu717M5vaImBu6e7tSU9fGiBG2q4umgHB9ZFvb4uvXhhqxnd6EzfXuX89ih3ZarTsQ8KLqzz\nV5BWVwlgjD1CGCijYjXp7uRub9uO4SSxRQ75atKnLBXjqAo/z1XwGxtW4S8v258ZdWUKGGOEMFBm\nrpp0d3KbTRuM8fatDbfIV8p5ZawYQxV+njv38bF0/77NwD7vyhQwxghhYByFKuWyV4zjem7gP0II\nA+PMVymPQ8U4rucGLhghDABAJNwTBgAgEkIYAIBICGEAACIhhAEAiIQQBgAgEkIYAIBICGEAACIh\nhAEAiIQQBgAgEkIYAIBICGEAACIhhAEAiIQQBgAgEkIYAIBICGEAACIhhAEAiIQQBgAgEkIYAIBI\nCGEAACIhhAEAiIQQBgAgEkIYAIBICGEAACIhhAEAiIQQBgAgEkIYAIBICGEAACIhhAEAiIQQBgAg\nEkIYAIBICGEAACIhhAEAiIQQBgAgEkIYAIBICGEAACIhhAEAiIQQBgAgEkIYAIBICGEAACIhhAEA\niOQfK3GqO5m5UkcAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nx.draw_kamada_kawai(g, nodesize=200, alpha=0.5)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "m = nx.adjacency_matrix(g)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "<173x173 sparse matrix of type ''\n", "\twith 344 stored elements in Compressed Sparse Row format>" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[0, 1, 0, ..., 0, 0, 0],\n", " [1, 0, 1, ..., 0, 0, 0],\n", " [0, 1, 0, ..., 0, 0, 0],\n", " ...,\n", " [0, 0, 0, ..., 0, 0, 0],\n", " [0, 0, 0, ..., 0, 0, 1],\n", " [0, 0, 0, ..., 0, 1, 0]], dtype=int64)" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m.todense()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrix representation in Python\n", "\n", "We simply use nd-arrays with two dimensions to represent matrices. There is a `np.matrix` class, but it is not often used because most numpy creation functions return `ndarray`s, and confusing behavior can result when mixed with `ndarray`s." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.06774977, 0.47570098, 0.7371909 , 0.84900474],\n", " [0.89349125, 0.48335136, 0.5983335 , 0.84058831],\n", " [0.34086422, 0.42671514, 0.86893581, 0.03561096],\n", " [0.75748027, 0.94098489, 0.3285091 , 0.8260875 ]])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M1 = np.random.random((4,4))\n", "M1" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[0.06774977, 0.47570098, 0.7371909 , 0.84900474],\n", " [0.89349125, 0.48335136, 0.5983335 , 0.84058831],\n", " [0.34086422, 0.42671514, 0.86893581, 0.03561096],\n", " [0.75748027, 0.94098489, 0.3285091 , 0.8260875 ]])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M2 = np.matrix(M1)\n", "M2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Matrix multiplication**" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1.32401103, 1.37563049, 1.2540497 , 1.18499284],\n", " [1.33308358, 1.70496206, 1.74393325, 1.88058454],\n", " [0.72752345, 0.77270024, 1.27334793, 0.70844852],\n", " [1.62980286, 1.73267609, 1.67826093, 2.12820432]])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M1 @ M1" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[1.32401103, 1.37563049, 1.2540497 , 1.18499284],\n", " [1.33308358, 1.70496206, 1.74393325, 1.88058454],\n", " [0.72752345, 0.77270024, 1.27334793, 0.70844852],\n", " [1.62980286, 1.73267609, 1.67826093, 2.12820432]])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M2 * M2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Transposition**" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.06774977, 0.89349125, 0.34086422, 0.75748027],\n", " [0.47570098, 0.48335136, 0.42671514, 0.94098489],\n", " [0.7371909 , 0.5983335 , 0.86893581, 0.3285091 ],\n", " [0.84900474, 0.84058831, 0.03561096, 0.8260875 ]])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M1.T" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[0.06774977, 0.89349125, 0.34086422, 0.75748027],\n", " [0.47570098, 0.48335136, 0.42671514, 0.94098489],\n", " [0.7371909 , 0.5983335 , 0.86893581, 0.3285091 ],\n", " [0.84900474, 0.84058831, 0.03561096, 0.8260875 ]])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M2.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Inverse**" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-1.12872357, 1.27794536, 0.13284281, -0.14606798],\n", " [-0.05230806, -1.62586277, 0.52671501, 1.68545608],\n", " [ 0.43062073, 0.27370063, 0.88405168, -0.7591817 ],\n", " [ 0.9233212 , 0.57134475, -1.07334356, -0.2735146 ]])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.inv(M1)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[-1.12872357, 1.27794536, 0.13284281, -0.14606798],\n", " [-0.05230806, -1.62586277, 0.52671501, 1.68545608],\n", " [ 0.43062073, 0.27370063, 0.88405168, -0.7591817 ],\n", " [ 0.9233212 , 0.57134475, -1.07334356, -0.2735146 ]])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M2.I" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Properties of a matrix" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true }, "outputs": [], "source": [ "M = np.arange(16).reshape((4,4))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 1, 2, 3],\n", " [ 4, 5, 6, 7],\n", " [ 8, 9, 10, 11],\n", " [12, 13, 14, 15]])" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "16" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.size" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(4, 4)" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Norms\n", "\n", "Just as with vectors, we can measure the size or norm of a matrix. There are many possible norms. \n", "\n", "The following norms can be calculated using `np.linalg.norm`\n", " \n", " ===== ============================ ==========================\n", " ord norm for matrices norm for vectors\n", " ===== ============================ ==========================\n", " None Frobenius norm 2-norm\n", " 'fro' Frobenius norm --\n", " 'nuc' nuclear norm --\n", " inf max(sum(abs(x), axis=1)) max(abs(x))\n", " -inf min(sum(abs(x), axis=1)) min(abs(x))\n", " 0 -- sum(x != 0)\n", " 1 max(sum(abs(x), axis=0)) as below\n", " -1 min(sum(abs(x), axis=0)) as below\n", " 2 2-norm (largest sing. value) as below\n", " -2 smallest singular value as below\n", " other -- sum(abs(x)**ord)**(1./ord)\n", " ===== ============================ ==========================" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "35.21363372331802" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.norm(M)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "35.21363372331802" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.sqrt(np.sum(M**2))" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "35.13996365902469" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.norm(M, ord=2)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "35.13996365902469" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.svd(M)[1][0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Trace\n", "\n", "The trace of a matrix $A$ is the sum of its diagonal elements. It is important for a couple of reasons:\n", "\n", "* It is an *invariant* of a matrix under change of basis\n", "* It defines a matrix norm" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "30" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.trace()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "30" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "M.diagonal().sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Determinant\n", "\n", "The determinant of a matrix is defined to be the alternating sum of permutations of the elements of a matrix. Let's not dwell on that though. It is important to know that the determinant of a $2\\times 2$ matrix is\n", "\n", "$$\\left|\\begin{matrix}a_{11} & a_{12}\\\\a_{21} & a_{22}\\end{matrix}\\right| = a_{11}a_{22} - a_{12}a_{21}$$\n", "\n", "This may be extended to an $n \\times n$ matrix by minor expansion. I will leave that for you to google. \n", "\n", "What is most important about the determinant:\n", "\n", "* Like the trace, it is also invariant under change of basis\n", "* An $n\\times n$ matrix $A$ is invertible $\\iff$ det$(A)\\neq 0$ \n", "* The rows(columns) of an $n\\times n$ matrix $A$ are linearly independent $\\iff$ det$(A)\\neq 0$\n", "\n", "Geometrically, the determinant is the volume of the paralleliped spanned by the column vectors of the matrix." ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.0" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.det(M)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Matrix operations" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": true }, "outputs": [], "source": [ "A = np.arange(12).reshape((3,4))\n", "B = np.arange(12).reshape((4,3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Addition" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 2, 4, 6],\n", " [ 8, 10, 12, 14],\n", " [16, 18, 20, 22]])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A + A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Scalar multiplication" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 2, 4, 6],\n", " [ 8, 10, 12, 14],\n", " [16, 18, 20, 22]])" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "2 * A" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Matrix multiplication" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 42, 48, 54],\n", " [114, 136, 158],\n", " [186, 224, 262]])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A @ B" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 80, 92, 104, 116],\n", " [ 92, 107, 122, 137],\n", " [104, 122, 140, 158],\n", " [116, 137, 158, 179]])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.T @ A" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 14, 38, 62],\n", " [ 38, 126, 214],\n", " [ 62, 214, 366]])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A @ A.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First, let's review some linear algebra topics:\n", "\n", "### Linear Independence\n", "\n", "A collection of vectors $v_1,...,v_n$ is said to be *linearly independent* if\n", "\n", "$$c_1v_1 + \\cdots c_nv_n = 0$$\n", "$$\\iff$$\n", "$$c_1=\\cdots=c_n=0$$\n", "\n", "In other words, any linear combination of the vectors that results in a zero vector is trivial.\n", "\n", "Another interpretation of this is that no vector in the set may be expressed as a linear combination of the others. In this sense, linear independence is an expression of non-redundancy in a set of vectors.\n", "\n", "\n", "Fact: Any linearly independent set of $n$ vectors spans an $n$-dimensional space. (I.e. the collection of all possible linear combinations is $\\mathbb{R}^n$.) Such a set of vectors is said to be a *basis* of $\\mathbb{R}^n$. Another term for basis is *minimal spanning set*." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Column space, Row space, Rank and Kernel\n", "\n", "Let $A$ be an $m\\times n$ matrix. We can view the columns of $A$ as vectors, say $a_1,...,a_n$. The space of all linear combinations of the $a_i$ are the *column space* of the matrix $A$. Now, if $a_1,...,a_n$ are *linearly independent*, then the column space is of dimension $n$. Otherwise, the dimension of the column space is the size of the maximal set of linearly independent $a_i$. Row space is exactly analogous, but the vectors are the *rows* of $A$.\n", "\n", "The *rank* of a matrix *A* is the dimension of its column space - and - the dimension of its row space. These are equal for any matrix. Rank can be thought of as a measure of non-degeneracy of a system of linear equations, in that it is the *dimension of the image of the linear transformation* determined by $A$. \n", "\n", "The *kernel* of a matrix *A* is the dimension of the space mapped to zero under the linear transformation that $A$ represents. The dimension of the kernel of a linear transformation is called the *nullity*. \n", "\n", "Index theorem: For an $m\\times n$ matrix $A$, \n", "\n", "rank($A$) + nullity($A$) = $n$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solving linear equations (Matrix-vector multiplication)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We return to solving the system of equations\n", "\n", "$$\n", "Ax = b\n", "$$\n", "\n", "Expanding,\n", "\n", "\\begin{align*}\n", " \\left[\\begin{matrix}a_{11}&\\cdots&a_{1n}\\\\\n", " \\vdots & &\\vdots\\\\\n", " a_{m1}&\\cdots&a_{mn}\\end{matrix}\\right]\n", "\\left[\\begin{matrix}x_1\\\\\n", " \\vdots\\\\\n", " x_n\\end{matrix}\\right] =\n", "\\left[\\begin{matrix}b_1\\\\\n", " \\vdots\\\\\n", " b_m\\end{matrix}\\right]\n", "\\end{align*}\n", "\n", "which can be rewritten as a weighted sum of the column vectors of $A$\n", "\n", "$$\n", "x_1 \\left[ \\matrix{a_{11} \\\\ \\vdots \\\\ a_{m1}} \\right] + \\cdots + x_n \\left[ \\matrix{a_{1n} \\\\ \\vdots \\\\ a_{mn}} \\right]\n", "= \\left[\\begin{matrix}b_1\\\\\n", " \\vdots\\\\\n", " b_m\\end{matrix}\\right]\n", "$$\n", "\n", "So solving the system of equations means finding the appropriate weights $x$ such that the sum of weighted column vectors of $A$ is the same as $b$. Put another way, we are trying to express $b$ as a linear combination of the column vectors of $A$.\n", "\n", "Note that we have two different useful perspectives on a matrix - as a collection of column (or row) vectors that span a vector space, and as a function that transforms or maps a vector into another vector. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Solving for m = n" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": true }, "outputs": [], "source": [ "A = np.random.random((3,3))\n", "b = np.random.random((3,1))" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.9955822 , 0.01409361, 0.3081781 ],\n", " [0.02769147, 0.25728312, 0.36249502],\n", " [0.819182 , 0.67269385, 0.38365708]])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.48881805],\n", " [0.94095385],\n", " [0.02464686]])" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the solve function." ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-0.5869833 ],\n", " [-1.26775132],\n", " [ 3.54040529]])" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.solve(A, b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Using the projection onto the column space of A." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-0.5869833 ],\n", " [-1.26775132],\n", " [ 3.54040529]])" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linalg.inv(A.T @ A) @ A.T @ b" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Underdetermined System ($mn$, the system may be *overdetermined*. In other words, there are more equations than unknowns. They system could be inconsistent, or some of the equations could be redundant.\n", "\n", "There are many techniques to solve and analyze linear systems. Our goal is to understand the theory behind many of the built-in functions, and how they *efficiently* solve systems of equations." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Special Matrices\n", "\n", "Some matrices have interesting properties that allow us either simplify the underlying linear system or to understand more about it. \n", "\n", "#### Square Matrices\n", "\n", "Square matrices have the same number of columns (usually denoted $n$). We refer to an arbitrary square matrix as and $n\\times n$ or we refer to it as a 'square matrix of dimension $n$'. If an $n\\times n$ matrix $A$ has *full rank* (i.e. it has rank $n$), then $A$ is invertible, and its inverse is unique. This is a situation that leads to a unique solution to a linear system.\n", "\n", "#### Diagonal Matrices\n", "\n", "A diagonal matrix is a matrix with all entries off the diagonal equal to zero. Strictly speaking, such a matrix should be square, but we can also consider rectangular matrices of size $m\\times n$ to be diagonal, if all entries $a_{ij}$ are zero for $i\\neq j$\n", "\n", "#### Symmetric and Skew Symmetric\n", "\n", "A matrix $A$ is (skew) symmetric iff $a_{ij} = (-)a_{ji}$.\n", "\n", "Equivalently, $A$ is (skew) symmetric iff\n", "\n", "$$A = (-)A^T$$\n", "\n", "#### Upper and Lower Triangular\n", "\n", "A matrix $A$ is (upper|lower) triangular if $a_{ij} = 0$ for all $i (>|<) j$\n", "\n", "#### Orthogonal and Orthonormal\n", "\n", "A matrix $A$ is *orthogonal* iff\n", "\n", "$$A A^T = I$$\n", "\n", "In other words, $A$ is orthogonal iff \n", "\n", "$$A^T=A^{-1}$$\n", "\n", "Fact: The rows and columns of an orthogonal matrix are an orthonormal set of vectors.\n", "\n", "\n", "#### Positive Definite\n", "\n", "Positive definite matrices are an important class of matrices with very desirable properties. A square matrix $A$ is positive definite if\n", "\n", "$$u^TA u > 0$$\n", "\n", "for any non-zero n-dimensional vector $u$.\n", "\n", "A symmetric, positive-definite matrix $A$ is a positive-definite matrix such that\n", "\n", "$$A = A^T$$\n", "\n", "IMPORTANT: \n", "\n", "* Symmetric, positive-definite matrices have 'square-roots' (in a sense)\n", "* Any symmetric, positive-definite matrix is *diagonizable*!!!\n", "* Co-variance matrices are symmetric and positive-definite\n", "\n", "\n", "Now that we have the basics down, we can move on to numerical methods for solving systems - aka matrix decompositions." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" } }, "nbformat": 4, "nbformat_minor": 2 }