{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Solving adjoint equations using `firedrake-adjoint`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This notebook demonstrates how to use `firedrake-adjoint` to solve an adjoint equation and extract the solution thereof.\n", "\n", "Suppose we have a PDE in 'residual form'\n", "\n", "$$F(u)=0,\\quad u\\in V,$$\n", "\n", "for some function space $V$.\n", "Given an objective functional $J:V\\rightarrow\\mathbb R$, the adjoint equation is given by\n", "\n", "$$\\frac{\\partial F}{\\partial u}^T\\lambda=\\frac{\\partial J}{\\partial u}^T,\\quad\\lambda\\in V.$$\n", "\n", "We seek to compute the adjoint solution, $\\lambda$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Suppose the PDE involves a parameter $\\nu$ which is defined as a Firedrake `Constant` or `Function` (rather than a float).\n", "Then `firedrake-adjoint` enables us to compute the gradient $\\mathrm dJ/\\mathrm d\\nu$.\n", "Whilst we might not actually need this for our application, performing the computation endows the `SolveVarFormBlock`s with adjoint solutions.\n", "Why is that?\n", "\n", "Taking the transpose of the adjoint equation gives\n", "\n", "$$\\frac{\\partial J}{\\partial u}=\\lambda^T\\frac{\\partial F}{\\partial u}.$$\n", "\n", "Now, expanding the gradient $\\mathrm dJ/\\mathrm d\\nu$ using the chain rule gives\n", "\n", "$$\n", "\\frac{\\mathrm dJ}{\\mathrm d\\nu}\n", "=\\frac{\\partial J}{\\partial u}\\frac{\\mathrm du}{\\mathrm d\\nu}+\\frac{\\partial J}{\\partial\\nu}\n", "=\\lambda^T\\frac{\\partial F}{\\partial u}\\frac{\\mathrm du}{\\mathrm d\\nu}+\\frac{\\partial J}{\\partial\\nu}\n", "=\\lambda^T\\frac{\\partial F}{\\partial\\nu}+\\frac{\\partial J}{\\partial\\nu}.\n", "$$\n", "\n", "In order to compute the gradient $\\mathrm dJ/\\mathrm d\\nu$, it is therefore sufficient to evaluate:\n", "1. the adjoint solution, $\\lambda$;\n", "2. the _partial_ derivative of the PDE residual w.r.t. the parameter $\\nu$;\n", "3. the _partial_ derivative of the objective functional w.r.t. $\\nu$.\n", "\n", "In order to compute the gradient, `firedrake-adjoint` does all three of these things." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The forward problem" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Import Firedrake with adjoint mode activated." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Code in this cell makes plots appear an appropriate size and resolution in the browser window\n", "%matplotlib widget\n", "%config InlineBackend.figure_format = 'svg'\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "plt.rcParams['figure.figsize'] = (11, 6)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from firedrake import *\n", "from firedrake.adjoint import *\n", "continue_annotation()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We employ the same finite element discretisation of Burgers equation in $\\mathbb P2$ space as in the [Firedrake demo](https://firedrakeproject.org/demos/burgers.py.html). Here $\\nu$ is the viscosity." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Define a simple mesh\n", "n = 32\n", "mesh = UnitSquareMesh(n, n)\n", "\n", "# Define P2 function space and corresponding test function\n", "V = VectorFunctionSpace(mesh, \"Lagrange\", 2)\n", "v = TestFunction(V)\n", "\n", "# Create Functions for the solution and time-lagged solution\n", "u = Function(V, name=\"Velocity\")\n", "u_ = Function(V)\n", "\n", "# Assign initial condition\n", "x, y = SpatialCoordinate(mesh)\n", "u_ = interpolate(as_vector([sin(pi*x), 0]), V)\n", "u.assign(u_)\n", "\n", "# Set diffusivity constant\n", "R = FunctionSpace(mesh, \"R\", 0)\n", "nu = Function(R)\n", "nu.assign(0.0001)\n", "\n", "# Define nonlinear form\n", "dt = 1.0/n\n", "F = (inner((u - u_)/dt, v) + inner(dot(u, nabla_grad(u)), v) + nu*inner(grad(u), grad(v)))*dx" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Having set up the residual,`F`, we are able to compute weak solutions of the PDE." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Timestepping details\n", "end_time = 0.5\n", "timesteps_per_export = 4\n", "num_timesteps = int(end_time/dt)\n", "num_exports = num_timesteps//timesteps_per_export\n", "\n", "# Store forward solution at exports so we can plot again later\n", "forward_solutions = [u.copy(deepcopy=True)]\n", "\n", "# Time integrate\n", "i = 0\n", "t = 0.0\n", "while (t < end_time):\n", " solve(F == 0, u)\n", " u_.assign(u)\n", " t += dt\n", " i += 1\n", " if i % timesteps_per_export == 0:\n", " forward_solutions.append(u.copy(deepcopy=True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot solution at each export timestep." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "c8e3cdf3b5e640b6883e2aecc68e202e", "version_major": 2, "version_minor": 0 }, "image/png": "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j44dO8bEiRMrvVXx008/HfPmzYtTTjllp+dv06ZNdOjQIWbMmFGp/be//W2Vvh+HUskgYkdOPvnkeO2112LWrFkVbSUlJfH73/8+evXqFb17997lOXZXz549o0mTJtW6JgCgKu+SAwAZ5KabboqhQ4fGwIED48ILL6x4W+G8vLy49tprq32eQYMGxZ/+9KfIysqquEWnSZMmccwxx8QzzzwTgwcPrrT56Je+9KVo1qxZDBs2LC655JLYvHlz3HnnndGxY8dYuXJltT7mqFGj4vbbb4/zzz8/5syZE126dIn77rsvWrZsucuxmzZtim7dusXXv/716NOnT7Rq1Sqef/75eP311yveNadp06Zxww03xMiRI+P444+Pc845p+JthXv16lVx+9DOXHTRRXH99dfHRRddFP37948ZM2bEu+++W6Xfx0HSj3/84zj77LOjadOmMWzYsB2u7rnqqqvi/vvvj6FDh8bll18e+fn5ce+998bixYvj0UcfrbRHTHVNnz49TjjhhBg7duwnfs3z8vLijDPOiNtuuy2ysrJi//33j7/+9a+xevXqGn9MAGiMBCYAkEGGDBkSU6dOjbFjx8Y111wTTZs2jeOPPz5uuOGGHW60ujMfryo5+OCDo3379pXan3nmmUr7l0R8tJHqI488EldffXV8//vfj86dO8e3v/3t2HvvveO//uu/qvUxW7ZsGdOmTYvvfOc7cdttt0XLli3j3HPPjaFDh8aXv/zlXY699NJL49lnn43HHnssysvL44ADDojf/va38e1vf7ui3wUXXBAtW7aM66+/Pq688srYa6+94rTTTosbbrgh2rZt+4kf45prrok1a9bEI488Eg899FAMHTo0nn766ejYsWOlfkcddVT87Gc/i4kTJ8bUqVOjvLw8Fi9evMPApFOnTvHKK6/ElVdeGbfddlts3bo1Dj/88HjiiSc+ccXLJ9m8eXNEfLTiaFduu+22+PDDD2PixImRm5sbZ555Ztx0003eohgAqiErtTu7iAEAkBY//OEP4/7774+FCxdGbm5uussBgAbLHiYAABnkxRdfjJ/85CfCEgCoZVaYAAAAACRYYQIAAACQIDBp4GbMmBHDhg2Lrl27RlZWVkyZMiXdJQEAAEC9JzBp4EpKSqJPnz4xYcKEdJcCAAAAGcPbCjdwQ4cOjaFDh6a7DAAAAMgoAhOqKC0tjdLS0orj8vLyWL9+fbRv3z6ysrLSWBkAAEBmSaVSsWnTpujatWtkZ7vJI5MITKhi/PjxMW7cuHSXAQAA0GAsX748unXrlu4yqAFvK9yIZGVlxeTJk2P48OGf2C+5wqS4uDh69OgRgzuNjJzsZrVc5e75oHeXdJdQLUUH1M/P385s3q883SV8Knv13JjuEmrNid3+me4SMsLZbV9NdwnAHvZA0dHpLqHee+H9A9NdQq0qWdom3SV8Kq0WZdYKg7YLt6W7hGpp8c7KdJewU9vLt8X0wnuiqKgo8vLy0l0ONWCFCVXk5uZGbm5ulfac7Gb1NjDJyWme7hKqpUlu/fz87Ux288wOTJq0LN11pwyV26ppukvICK1aZ9aTUmDXcrf7+bcrTVpWfR7XkGQ3z4znfTvTJDezfjfl5GRGvfX1dcp/sr1B5smM2Q8AAABQh6wwaeA2b94cCxcurDhevHhxzJ07N/Lz86NHjx5prAwAAADqL4FJAzd79uw44YQTKo4LCgoiImLEiBExadKkNFUFAAAA9ZvApIEbPHhw2NcXAAAAasYeJgAAAAAJAhMAAACABIEJAAAAQILABAAAACBBYAIAAACQIDABAAAASBCYAAAAACQITAAAAAASBCYAAAAACQITAAAAgASBCQAAAECCwAQAAAAgQWACAAAAkCAwAQAAAEgQmAAAAAAkCEwAAAAAEgQmAAAAAAkCEwAAAIAEgQkAAABAgsAEAAAAIEFgAgAAAJAgMAEAAABIEJgAAAAAJAhMAAAAABIEJgAAAAAJAhMAAACABIEJAAAAQILABAAAACBBYAIAAACQIDABAAAASBCYAAAAACQITAAAAAASBCYAAAAACQITAAAAgASBCQAAAECCwAQAAAAgQWACAAAAkCAwAQAAAEgQmAAAAAAkCEwAAAAAEgQmAAAAAAkCEwAAAIAEgQkAAABAgsAEAAAAIEFgAgAAAJAgMAEAAABIEJgAAAAAJAhMAAAAABIEJgAAAAAJAhMAAACABIEJAAAAQILABAAAACBBYAIAAACQIDABAAAASBCYAAAAACQITAAAAAASBCYAAAAACQITAAAAgASBCQAAAEBCTroLgD3t1hvPiYXvrY7b75i22+c4ftBBceH5g6Jzp7x4f8WGuOPu6fHq64s+cUzfw7vHpRefGL16dIg1azfFffe/ElOfe6tSn7OO7RMjTuwXHdrsFe+uWBPXP/pivLWscLfrBAAAoHZYYQIJhx6yT1xz1VfjyWf+HhddNilenvXP+Pk1p8e+PTvsdEznTnkx/qdfjzf/b1lcdNmkeGTy7PjBd4fGUf32rehzwnEHx/dPOy7ueOZ/4+yb/hQL/rU2fvft0yO/VYu6uCwAAABqQGBCg3LV906Ovof3iK+f1j+mT70ypk+9Mjp3alOjc3xteL94bfaiePCR12LZ8nVx9//MjH8uLIzTvnrkTsd89ZS+sWpVcfzuzhdj2fJ1MfmJN+KlmQvijNP6V/Q54/Sj4rFX3oq/vPpOLCpcHz9/6PnYum17DP/cYbt9vQAAANQOt+TQoNz2u+ej2z75sXjJmrjnvpcjIqKoeEs8PfmKTxz33Atvxy23PRsRH60wefix1ys9/tqcxXHsMQfudPyhh+wTc95cWmXM6G99ISIicnKy46ADO8fvX55d8XgqFfG/7y6Lw3t1qf4FAgAAUCcEJjQoJVu2xfbtZVFauj3WbyipaL/o0nt2Oe5j+e32ivVFJZUe31BUEvnt9trp+J2NabVXbjRrlhOtWzWPJk2yY92mLZX6rNu0Jfbt2G6X1wUAAEDdEpjQKKxYWZTuEgAAAMggAhMahZrckrN+Q0nkt628mqRd270qrVhJ2tmYzSWlsW3b9ijeuCXKysqjfeuWlfq0b90y1iZWnQAAAJB+AhManA8/LIvs7KxKbTW5JefteSviyL4945Ep/95vpP+RveKdeSt2Ov7teSvic0ftX6ntP8ds314eC/65Ko7+TPd48R/vRUREVlbE0Z/pHg/M/L/qXRgAAAB1xrvk0OCsKiyOQw7uEp07tYm8Ni0iK+ujW3I+6V9R8b9XeTw6ZU4M6L9vnHn6UdGjW35c8M3Px0EHdo7Jj79R0WfUyONizPdPqTh+/Mm50aVLXlxy4eDo0S0/Tv3KEXHCcQfHw5P/Hbo8/NjrcfrAz8awo3rHvp3y4+ozvhAtmjWNKa++XTefGAAAAKpNYNJITJgwIXr16hXNmzePo48+Ol577bV0l1RrHnz0tSgvT8WkOy6Kvzx0eXTqWLO3FX573or42Q1PxFdO7hN3/XZkHH/sQXH1Tx+LxUvXVvRpn9+q0nlXFRbHmGseif5H9Iq7fjsyzjz9qLjp1qfj9TmLK/q8OGN+3PKXGXHpyQPjoR+eGwfts3dcOnFyrHdLDgAAQL2TlUqlUukugtr14IMPxvnnnx8TJ06Mo48+Om699dZ4+OGHY8GCBdGxY8ddjt+4cWPk5eXFkC6XRE52szqouOY+OGyfdJdQLRsOqp+fv53ZtH95ukv4VFrtW5zuEmrNl3osSHcJGeG8dq+kuwRgD7tvwzHpLqHee3bZQekuoVZtXpyX7hI+ldbvZdbfrNst2LbrTvVAi7d2fvt8um0v3xbPr7wjiouLo02bmv0xl/TKrO9Wdsstt9wSo0aNipEjR0bv3r1j4sSJ0bJly7j77rvTXRoAAADUSwKTBm7btm0xZ86cGDJkSEVbdnZ2DBkyJGbNmpXGygAAAKD+8i45DdzatWujrKwsOnXqVKm9U6dOMX/+/B2OKS0tjdLS0orj4uKPbmvYXl5/l+Nt37413SVUS1lpZt3iUr41s+pNKttSuutOGap084fpLiEjbM7J7DkMVOXn36415N9/ERHlWzPjed/OlJVm1t+st2+vv68B/lO9fq3y/2uzG0bmEZhQxfjx42PcuHFV2qcXfvJb86bVynQXUE3T0l0ADcU76S4gQ9ye7gKAWjA53QUA7JZ169ZFXl5m78HT2AhMGrgOHTpEkyZNorCwsFJ7YWFhdO7ceYdjxowZEwUFBRXHRUVF0bNnz1i2bJlvcOqtjRs3Rvfu3WP58uU206JeM1fJBOYpmcA8JVMUFxdHjx49Ij8/P92lUEMCkwauWbNm0a9fv5g2bVoMHz48IiLKy8tj2rRpMXr06B2Oyc3Njdzc3CrteXl5fhlR77Vp08Y8JSOYq2QC85RMYJ6SKbKzM+t2LAQmjUJBQUGMGDEi+vfvHwMGDIhbb701SkpKYuTIkekuDQAAAOolgUkjcNZZZ8WaNWvimmuuiVWrVkXfvn1j6tSpVTaCBQAAAD4iMGkkRo8evdNbcHYlNzc3xo4du8PbdKC+ME/JFOYqmcA8JROYp2QKczVzZaW8txEAAABAJXadAQAAAEgQmAAAAAAkCEwAAAAAEgQmAAAAAAkCkwZuxowZMWzYsOjatWtkZWXFlClT0l0SAAAA1HsCkwaupKQk+vTpExMmTEh3KQAAAJAxctJdALVr6NChMXTo0HSXAQAAABnFChMAAACABCtMqKK0tDRKS0srjsvLy2P9+vXRvn37yMrKSmNlAAAAmSWVSsWmTZuia9eukZ1tzUImEZhQxfjx42PcuHHpLgMAAKDBWL58eXTr1i3dZVADWalUKpXuIqgbWVlZMXny5Bg+fPgn9kuuMCkuLo4ePXrE4E4jIye7WS1XWfc+6N0l3SXUqqIDGt7X7JNs3q883SWkzV49N6a7hHrvxG7/THcJjdbZbV9NdwnALjxQdHS6S6gXXnj/wHSXUG0lS9uku4RotahuV0y0XbitVs/f4p2Ve/yc28u3xfTCe6KoqCjy8vL2+PmpPVaYUEVubm7k5uZWac/JbtYgA5OcnObpLqFWNclteF+zT5LdvPEGJk1alu66UyOX26ppuktotFq1tgQZ6rvc7X5GRkQ0aVn1eXB9ld08/c9jm+TW7c/3nJza/Xi1+XrH9gaZR2DSwG3evDkWLlxYcbx48eKYO3du5OfnR48ePdJYGQAAANRfApMGbvbs2XHCCSdUHBcUFERExIgRI2LSpElpqgoAAADqN4FJAzd48OCwTQ0AAADUjBuKAQAAABIEJgAAAAAJAhMAAACABIEJAAAAQILABAAAACBBYAIAAACQIDABAAAASBCYAAAAACQITAAAAAASBCYAAAAACQITAAAAgASBCQAAAECCwAQAAAAgQWACAAAAkCAwAQAAAEgQmAAAAAAkCEwAAAAAEgQmAAAAAAkCEwAAAIAEgQkAAABAgsAEAAAAIEFgAgAAAJAgMAEAAABIEJgAAAAAJAhMAAAAABIEJgAAAAAJAhMAAACABIEJAAAAQILABAAAACBBYAIAAACQIDABAAAASBCYAAAAACQITAAAAAASBCYAAAAACQITAAAAgASBCQAAAECCwAQAAAAgQWACAAAAkCAwAQAAAEgQmAAAAAAkCEwAAAAAEgQmAAAAAAkCEwAAAIAEgQkAAABAgsAEAAAAIEFgAgAAAJAgMAEAAABIEJgAAAAAJAhMAAAAABIEJgAAAAAJAhMAAACABIEJAAAAQILABAAAACBBYAIAAACQIDABAAAASBCYAAAAACQITAAAAAASBCYAAAAACQITAAAAgIScdBcAe9oND38nFr29Iu649rHdPsfxgw6KC88fFJ075cX7KzbEHXdPj1dfX7TT/vn5e8Wlo06Mgw7sHPt0bReP/WVO3H7HtEp9TvlynzhpyKGxb8+9IyLi3YWr4s57ZsT8d1fudp0AAADUDitMIOHQQ/aJa676ajz5zN/jossmxcuz/hk/v+b02Ldnh52Oada0SRQVb4n77n8l3lu0eod9+h7ePaZNnxdXXHl/XHbFfbF6zaa4+bozo0P7VrV1KQAAAOwmgQkNSsEt58bhAw+M4RcNjqff/008/f5vomO3/Bqd42vD+8VrsxfFg4+8FsuWr4u7/2dm/HNhYZz21SN3OmZV4ca4feK0eHba21GypXSHfX5x41/jL399MxYuWh3L3l8fN936dGRlZcWRfXvWqD4AAABqn1tyaFAmjn009tmvYyxd8K+47+anIiKieN3meGzBTTsflJ0Vz73wdtxy27MR8dEKk4cfe71Sl9fmLI5jjzlwj9aam9s0cnKyY9OmrXv0vAAAAHx6AhMalC2btsb2D7dH6QcfxoY1myraLzvphp2OKT2wU5Rs2VZxnN9ur1hfVFKpz4aikshvt9cerfWS/zo+1q7bHHPeXLJHzwsAAMCnJzChUVi5ZO1OH/ugVW4dVvKRb5x5dJw4+JD47g/vj20fltX5xwcAAOCTCUxoFGpyS876DSWR37byapJ2bfeK9RtKdjS6xs762oD4xpmfi++NeTAWLV6zR84JAADAniUwocHZvq0ssptkVWqryS05b89bEUf27RmPTJld0db/yF7xzrwVn7q2s78+IL55zjHxwx8/FAv+uepTnw8AAIDaITChwSl8f10cdESv6NgtP7aWlMamoi01uiXn0Slz4tc3nRNnnn5U/O9r78WJgw+Jgw7sHL/89dSKPqNGHhcd2reO8Tc/WdF2wH4dIyKiRfOmkZfXIg7Yr2N8uL0sli5bFxER55xxdIw879j4+Q1PxKrC4oo9UT74YFt8sPXDPXb9AAAAfHoCExqcRye+EN+79Ztxx4s/iuYtmsWIz10bq99fX+3xb89bET+74Ym4cMSguOiC42LFvzbE1T99LBYv/Xfo0j6/VXTq2KbSuLt+O7Li/wd9pkt88cRDY1VhcZw9YmJERJz6lSOiWbOc+OlPTqs0btIfX45Jf/zb7lwqAAAAtURg0khMmDAhbrrppli1alX06dMnbrvtthgwYEC6y6oVKxaviYJTf/WpzvHSzAXx0swFO338+l8+VaVt8Jd3fttPRFQEJwAAANR/2ekugNr34IMPRkFBQYwdOzbeeOON6NOnT5x00kmxevXqdJcGAAAA9ZLApBG45ZZbYtSoUTFy5Mjo3bt3TJw4MVq2bBl33313uksDAACAesktOQ3ctm3bYs6cOTFmzJiKtuzs7BgyZEjMmjVrh2NKS0ujtLS04ri4uDgiIraXb9th/0y3ffvWdJdQq8pKy9NdQp0q39q4rvc/lW0p3XWnRq50sw2W02VzTuP93oRM4WfkRzLp92n51vQ/jy0rrdu/wW/fXruvSWrjNc/H50ylUnv83NQugUkDt3bt2igrK4tOnTpVau/UqVPMnz9/h2PGjx8f48aNq9I+vfCeWqkx7Vamu4BaNi3dBUD98U66C2jEbk93AUA1TE53AdCgrVu3LvLy8tJdBjUgMKGKMWPGREFBQcVxUVFR9OzZM5YtW+YbnHpr48aN0b1791i+fHm0adNm1wMgTcxVMoF5SiYwT8kUxcXF0aNHj8jPz093KdSQwKSB69ChQzRp0iQKCwsrtRcWFkbnzp13OCY3Nzdyc3OrtOfl5fllRL3Xpk0b85SMYK6SCcxTMoF5SqbIzraFaKbxFWvgmjVrFv369Ytp0/59X0Z5eXlMmzYtBg4cmMbKAAAAoP6ywqQRKCgoiBEjRkT//v1jwIABceutt0ZJSUmMHDky3aUBAABAvSQwaQTOOuusWLNmTVxzzTWxatWq6Nu3b0ydOrXKRrA7k5ubG2PHjt3hbTpQX5inZApzlUxgnpIJzFMyhbmaubJS3tsIAAAAoBJ7mAAAAAAkCEwAAAAAEgQmAAAAAAkCEwAAAIAEgQkAAABAgsCkgZsxY0YMGzYsunbtGllZWTFlypR0lwQAAAD1nsCkgSspKYk+ffrEhAkT0l0KAAAAZIycdBdA7Ro6dGgMHTo03WUAAABARhGYUEVpaWmUlpZWHJeXl8f69eujffv2kZWVlcbKAAAAMksqlYpNmzZF165dIzvbTR6ZRGBCFePHj49x48aluwwAAIAGY/ny5dGtW7d0l0ENZKVSqVS6i6BuZGVlxeTJk2P48OGf2C+5wqS4uDh69OgRgzuNjJzsZrVcZWb5oHeXdJdQrxUdYL5Ux+b9ytNdQkbbq+fGdJfQ4J3Y7Z/pLoE95Oy2r6a7BGg0Hig6Ot0l1JkX3j8wbR+7ZGmbPXauVotqvvqj7cJtu+yzffvWePWl66OoqCjy8vJ2pzTSxAoTqsjNzY3c3Nwq7TnZzQQmCTk5zdNdQr3WJNd8qY7s5gKTT6NJy9Jdd+JTyW3VNN0lsIe0am0pONSVi1q/HvdtOCbdZdSJJi2rvnaoK9nN99zz8Sa5Nf8ZmZNT/TG2N8g8fmsCAAAAJFhh0sBt3rw5Fi5cWHG8ePHimDt3buTn50ePHj3SWBkAADRcjWV1CTRkVpg0cLNnz44jjjgijjjiiIiIKCgoiCOOOCKuueaaNFcGAAAN13ntXkl3CcCnZIVJAzd48OCwry8AANQtK0wg81lhAgAAsIdZYQKZT2ACAAAAkCAwAQAAAEgQmAAAAAAkCEwAAAD2MJu+QuYTmAAAAOxhNn2FzCcwAQAAAEgQmAAAAOxhbsmBzCcwAQAA2MPckgOZT2ACAACwh1lhAplPYAIAAACQIDABAAAASBCYAAAAACQITAAAAAASBCYAAAAACQITAAAAgASBCQAAAECCwAQAAAAgQWACAAAAkCAwAQAAAEgQmAAAAAAkCEwAABqJ+zYck+4SACBjCEwAABqJ89q9ku4SACBjCEwAAAAAEgQmAAAAAAkCEwAAAIAEgQkAQCNh01cAqD6BCQBAI2HTVwCoPoEJAAAAQILABAAAACBBYAIAAACQIDABAGgkbPoKANUnMAEAaCRs+goA1ScwAQAAAEgQmAAAAAAkCEwAAAAAEgQmAACNhE1fAaD6BCYAAI2ETV8BoPoEJgAAAAAJAhMAAACABIEJAAAAQILABACgkbDpKwBUn8AEAKCRsOkrAFSfwAQAAAAgQWACAAAAkCAwAQAAAEgQmAAANBI2fQWA6hOYAAA0EjZ9BYDqE5gAAAAAJAhMAAAAABIEJgAAAAAJAhMAgEbCpq8AUH0CEwCARsKmrwBQfQITAIBGwgoTAKg+gQkAAABAgsAEAAAAIEFgAgAAAJAgMAEAAABIEJgAAAAAJOSkuwDY0254+Dux6O0Vcce1j+32OY49pW+c/4NTolO3/FixZE3cc93j8foL7+y0/6DPfyZOPeWIOGC/jtG0aZNYsmxtTPrj3+L1OYsr+lzwzc/HBd88ttK4ZcvXxfmj7trtOgEAAKgdAhNIOKTfvnHVhBFxz/VPxGvPvx2Dh/eLn9x1UXxn6E2xdMHKHY7pc1j3mP3G4rhz0kuxeXNpDP3SZ+O6a78W3/7u/8TC91ZX9Fu8ZE18b8yDFcdlZeW1fj0AAADUnMCEBqXglnPj8IEHxuEDD4zhFw2OiIgRn7s2Vr+/vtrnOPXC42P29Hnx6MQXIiLivpufiiOPOziGXTAobh/z0A7H3H7HtErHd02aEZ8feGAcc/QBlQKTsrLyWL+hpIZXBQAAQF0TmNCgTBz7aOyzX8dYuuBfcd/NT0VERPG6zfHYgps+cdwLj71eEYYc0q9XTP799EqPz3lpXgw86fBq15GVFdGyRbPYtGlrpfZ99mkXj/zp0ti2rSzenrci7rznpVi9ZlO1zwsAAEDdEJjQoGzZtDW2f7g9Sj/4MDb8RxBx2Uk37HLcx9rt3SY2rN1Y6fENazZFu71bV7uOs742IFq0aBovzphf0fbO/JVx/S+fiuXvr4/2+a1ixLmfj9/cfG6M/Nbd8cEH26p9bgAAAGqfwIRGYeWStXX2sb4w+JAY8c3Px9XjHoui4i0V7a/NXlTx/0WL18S8+f+KB/7n23HCcQfHU8/8vc7qAwAAYNcEJjQKNbklZ8OajdGuQ5tKj7fbu3WlFSs7c+Lxh8QPvjs0rr1uSsx5c+kn9t1cUhrvr1gf+3Rtu8vzAgAAULcEJjQ427eVRXaTrEptNbklZ96cJdH32M/ElD9Mr2g7YtDBMe8/3iJ4R04cfEhcecXQ+On4x+N/X1v0iX0jIlo0bxpdu7SNZ6fZBBYAAKC+EZjQ4BS+vy4OOqJXdOyWH1tLSmNT0ZYa3ZLzlz+8FDc+cnmcfvEJ8dq0t+P4U/vFgYd3j99c+UBFnwuuGhbtO+fFz+96MSI+ug1nzPdPidsmTot5C1ZGfru9IiKitPTDKNny0f4k377ohHjl1YVRuLo42ue3jpHnHRvlZamYNv2dPXj1AACk230bjkl3CcAekJ3uAqgbEyZMiF69ekXz5s3j6KOPjtdeey3dJdWaRye+EOVl5XHHiz+KB/8xPvbep12Nxs+bszhuGH1vDD33mPjts1fFsSf3iZ9ddFcsXbCyok9+xzbR8T/OO+zkvpGT0ySuGP2leOz+0RX/vvPtIRV99u7QOn5y1bD4nztHxbU/OjU2bvwgLr3ivigu/uDTXzQAAPXGee1eSXcJwB6QlUqlUukugtr14IMPxvnnnx8TJ06Mo48+Om699dZ4+OGHY8GCBdGxY8ddjt+4cWPk5eXFkC6XRE52szqoOHN8cNg+6S6hXttwkPlSHZv2L093CRmt1b7F6S6hwftSjwXpLoE9yAs5qBuNaZXJs8sOStvH3rw4b4+dq/V7NV9P0G7Brt/tcvv2rfG3addGcXFxtGnTZpf9qT+sMGkEbrnllhg1alSMHDkyevfuHRMnToyWLVvG3Xffne7SAACADJbOsARqm8Ckgdu2bVvMmTMnhgz5960h2dnZMWTIkJg1a1YaKwMAADKdVYg0ZDZ9beDWrl0bZWVl0alTp0rtnTp1ivnz5+9wTGlpaZSWllYcFxd/tNx9e/mul5s1Ntu3b911p0asrNStJtVRvtXn6dMo21K66058KqWbP0x3CexBm3P8zIG60Jh+dqbzd3H51j33fLystObrCdb2imi78JNfJ338msFuGJlHYEIV48ePj3HjxlVpn154TxqqqedW7rpLozYt3QUAe4L38mpYbk93AdBoTE53AdQz69ati7y8PbfnCrVPYNLAdejQIZo0aRKFhYWV2gsLC6Nz5847HDNmzJgoKCioOC4qKoqePXvGsmXLfINTb23cuDG6d+8ey5cvt5kW9Zq5SiYwT8kE5imZori4OHr06BH5+fnpLoUaEpg0cM2aNYt+/frFtGnTYvjw4RERUV5eHtOmTYvRo0fvcExubm7k5uZWac/Ly/PLiHqvTZs25ikZwVwlE5inZALzlEyRnW0L0UwjMGkECgoKYsSIEdG/f/8YMGBA3HrrrVFSUhIjR45Md2kAAABQLwlMGoGzzjor1qxZE9dcc02sWrUq+vbtG1OnTq2yESwAAADwEYFJIzF69Oid3oKzK7m5uTF27Ngd3qYD9YV5SqYwV8kE5imZwDwlU5irmSsr5b2NAAAAACqx6wwAAABAgsAEAAAAIEFgAgAAAJAgMAEAAABIEJg0cDNmzIhhw4ZF165dIysrK6ZMmZLukgAAAKDeE5g0cCUlJdGnT5+YMGFCuksBAACAjJGT7gKoXUOHDo2hQ4emuwwAAADIKFaYAAAAACRYYUIVpaWlUVpaWnFcXl4e69evj/bt20dWVlYaKwMAAMgsqVQqNm3aFF27do3sbGsWMonAhCrGjx8f48aNS3cZAAAADcby5cujW7du6S6DGshKpVKpdBdB3cjKyorJkyfH8OHDP7FfcoVJcXFx9OjRIwZ3Ghk52c1qucrG44PeXdJdQoNVdIB5Whc271ee7hIarb16bkx3CVTDid3+me4SqKfObvtqukuAeu+BoqPTXcIe89y7PWLBf/06ioqKIi8vL93lUANWmFBFbm5u5ObmVmnPyW4mMNmDcnKap7uEBqtJrnlaF7KbC0zSpUnL0l13Iu1yWzVNdwnUU61aW5IPu5K7veH8DG3S8qPXVrY3yDwCkwZu8+bNsXDhworjxYsXx9y5cyM/Pz969OiRxsoA2F2bF+dFq32L010GsJvu23BMRESc1+6VNFcCwCcRmDRws2fPjhNOOKHiuKCgICIiRowYEZMmTUpTVQB8GsISyGyCEoDMIDBp4AYPHhy2qQEAAICacQMlAAAAQILABAAAACBBYAIAAHXo401fAajfBCYAAFCHbPoKkBkEJgAAAAAJAhMAAACABIEJAAAAQILABAAA6pBNXwEyg8AEAADqkE1fATKDwAQAAAAgQWACAAAAkCAwAQAAAEgQmAAAQB2y6StAZhCYAABAHbLpK0BmEJgAAAAAJAhMAAAAABIEJgAAAAAJAhMAAKhDNn0FyAwCEwAAqEM2fQXIDAITAAAAgASBCQAAAECCwAQAAAAgQWACAAAAkCAwAQAAAEgQmAAAAAAkCEwAAAAAEgQmAAAAAAkCEwAAAIAEgQkAAABAgsAEAAAAIEFgAgAAAJAgMAEAAABIEJgAAAAAJAhMAAAAABIEJgAAAAAJAhMAAACABIEJAAAAQILABAAAACBBYAIAAACQIDABAAAASBCYAAAAACQITADYLa3f8ysEAICGy7NdAAAAgASBCQAAAECCwASA3bJp//J0lwAAALVGYAIAAACQIDABAAAASBCYAAAAACQITAAAAAASBCYAkGE2L85LdwkAAA2ewAQAAAAgQWACAAAAkCAwAQAAAEgQmAAAAAAkCEwAAAAAEgQmAABQh+7bcEy6SwCgGgQmAAC14NllB6W7BOqp89q9ku4SAKgGgQkAQC34Uo8F6S4BAPgUBCYAAFCH3JIDkBly0l0A7Gk3PPydWPT2irjj2sd2+xzHntI3zv/BKdGpW36sWLIm7rnu8Xj9hXd22v/Qo/aLkT/6anQ/oFPktmgaq9/fEE/98W8x5a7pFX2ys7Pi3IKhceLpR0W7jq1j7fqSmPr8W3Hfny3LBYDGxC05AJlBYAIJh/TbN66aMCLuuf6JeO35t2Pw8H7xk7suiu8MvSmWLli5wzFbt2yLJybNiMXz/hVbt2yLQwfsF5dff1aUfrAtnv7TR0+Kzrh0SJxy/rHxy+/+MZa+uyp6faVvXFkwNEpKSuOxv8ypy0sEANLovg3HCE0AMoBbcmhQCm45Nw4feGAMv2hwPP3+b+Lp938THbvl1+gcp154fMyePi8enfhCLF9YGPfd/FS899b7MeyCQTsd897b78dLf3kjlr27Kla/vz5efGx2zHlpfhw6YP+KPof03zf+99l/xOsvvBOr318fL728IF5/Y0kcclCX3b5eAOovm74CQGazwoQGZeLYR2Of/TrG0gX/ivtufioiIorXbY7HFtz0ieNeeOz1uH3MQxERcUi/XjH599MrPT7npXkx8KTDq13H/od2i0P67Rv/c9OTFW3zZi+OoeceE/vsu3esWLwm9t937/jsod3it79/odrnBSBz2PSVT2KVCUD9JzChQdmyaWts/3B7lH7wYWxYs6mi/bKTbtjluI+127tNbFi7sdLjG9ZsinZ7t97lx7/v9Z9GXn6ryM7Jjj/d8nQ8c/+siscemvB8tGzdPH7/0o+jvCwV2U2y4657Z8TzL+58bxQAAADSQ2BCo7Byydo6+TjfP/3WaLFXbhx8ZK8YOear8a8la+Klv7wRERHHDTsiTjitf9w4+n9i6bsro9tJn43Rl3wh1q3bHM88/1ad1AdA3Xl22UFWmQBABhOY0CjU5JacDWs2RrsObSo93m7v1pVWrOxM4fL1ERGxZP7KaNuhdXyzYGhFYHLh1afGQxOej5ce/+h4Xk52dO7YJs4963MCE4AGSFgCAJlNYEKDs31bWWQ3yarUVpNbcubNWRJ9j/1MTPnD9Iq2IwYdHPPmLK5RHdnZ2dG02b+/xXJbNItUeapSn7LyVGRlZSWHAgAAkGYCExqcwvfXxUFH9IqO3fJja0lpbCraUqNbcv7yh5fixkcuj9MvPiFem/Z2HH9qvzjw8O7xmysfqOhzwVXDon3nvPjld/8YERFfGTEo1qzYEMvfK4yIiMOO3j++dsmJ8Ze7X6oY8+pzb8XZl38pVq9YH0vfXRXdjzkwzjztqHjq2b/voSsHAABgTxGY0OA8OvGF+N6t34w7XvxRNG/RLEZ87tpY/f76ao+fN2dx3DD63hjxw1PigiuHxYrFq+NnF90VSxesrOiT37FNdNynXcVxdnZWXHDVV6Jzj/ZRtr08Vi5dG3df93g89ce/VfT53U8eifN/cEpcdt2Z0bZDq1i7viSeeHpu3PunvwUAAAD1S1YqlUrtuhuZbsKECXHTTTfFqlWrok+fPnHbbbfFgAEDqjV248aNkZeXF0O6XBI52c1qudLG44PD9kl3CQ3WhoPM07qwaf/ydJfQqLXatzjdJVAN9jHhk3hbYdi5+zYck+4S9pin5/eKd86+MYqLi6NNmza7HkC9kZ3uAqh9Dz74YBQUFMTYsWPjjTfeiD59+sRJJ50Uq1evTndpANBgCUsAILMJTBqBW265JUaNGhUjR46M3r17x8SJE6Nly5Zx9913p7s0AAAAqJfsYdLAbdu2LebMmRNjxoypaMvOzo4hQ4bErFmzdjimtLQ0SktLK46Liz9a9r29fFvtFtvIbN++dded2C1lpW4VqQvlW32e06lsS+muO5FWpZs/THcJ1HObc/wchZ05LefleKDo6HSXsUd8/DvbbhiZR2DSwK1duzbKysqiU6dOldo7deoU8+fP3+GY8ePHx7hx46q0Ty+8p1ZqbLRW7roLu2laugsAiHgn3QVQ792e7gKg3puc7gL2qHXr1kVeXl66y6AGBCZUMWbMmCgoKKg4Lioqip49e8ayZct8g1Nvbdy4Mbp37x7Lly+3mRb1mrlKJjBPyQTmKZmiuLg4evToEfn5+ekuhRoSmDRwHTp0iCZNmkRhYWGl9sLCwujcufMOx+Tm5kZubm6V9ry8PL+MqPfatGljnpIRzFUygXlKJjBPyRTZ2bYQzTS+Yg1cs2bNol+/fjFt2r/vUSgvL49p06bFwIED01gZAAAA1F9WmDQCBQUFMWLEiOjfv38MGDAgbr311igpKYmRI0emuzQAAAColwQmjcBZZ50Va9asiWuuuSZWrVoVffv2jalTp1bZCHZncnNzY+zYsTu8TQfqC/OUTGGukgnMUzKBeUqmMFczV1bKexsBAAAAVGIPEwAAAIAEgQkAAABAgsAEAAAAIEFgAgAAAJAgMAEAAABIEJg0cDNmzIhhw4ZF165dIysrK6ZMmZLukgAAAKDeE5g0cCUlJdGnT5+YMGFCuksBAACAjJGT7gKoXUOHDo2hQ4emuwwAAADIKAITqigtLY3S0tKK4/Ly8li/fn20b98+srKy0lgZAABAZkmlUrFp06bo2rVrZGe7ySOTCEyoYvz48TFu3Lh0lwEAANBgLF++PLp165buMqiBrFQqlUp3EdSNrKysmDx5cgwfPvwT+yVXmBQXF0ePHj1icKeRkZPdrJarpDo+6N0l3SWwE0UH+B6p7zbvV57uEvgU9uq5Md0lUAdO7PbPdJdAI3N221fTXQINWMnm8jjpc6uiqKgo8vLy0l0ONWCFCVXk5uZGbm5ulfac7GYCk3oiJ6d5uktgJ5rk+h6p77KbC0wyWZOWpbvuRMbLbdU03SXQyLRq7TYJap/tDTKPnwwAAECjdt+GY9JdAlAPWWHSwG3evDkWLlxYcbx48eKYO3du5OfnR48ePdJYGUB6tH4vOzbtb5UJAP92XrtX0l0CUA8JTBq42bNnxwknnFBxXFBQEBERI0aMiEmTJqWpKoD0EZYAAFAdApMGbvDgwWFfXwAAAKgZe5gAAAAAJAhMAACARs2mr8COCEwAaFRav+dXHwCV2fQV2BHPGgFoVGz6CgBAdQhMAAAAABIEJgAAAAAJAhMAAACABIEJAI2KTV8BAKgOzxoBaFRs+goAQHUITAAAAAASBCYAAAAACQITAAAAgASBCQCNik1fAQCoDs8aAWhUbPoKAEB1CEwAAAAAEgQmAAAAAAkCEwAAAIAEgQkAAABAgsAEAAAAIEFgAgAAAJAgMAEAAABIEJgAAAAAJAhMAAAAABIEJgAAAAAJAhMAAACABIEJAAAAQILABAAAACBBYAIAAACQIDABAAAASBCYAAAAACQITAAAAAASBCYAAAAACQITAAAAgASBCQAAAECCwAQAAAAgQWACAAAAkCAwAQAAAEgQmAAAAAAkCEwAAAAAEgQmAAAAAAkCEwAAAIAEgQkAAABAgsAEAAAAIEFgAgAAAJAgMAEAAABIEJgA0Ki0fs+vPgAAds2zRgAAAIAEgQkAAABAgsAEgEZl0/7l6S4BAIAMIDABoFGxhwkAANXhWSMAjYoVJgAAVIfABIBGxQoTAACqw7NGAAAAgASBCQCNiltyAACoDoEJAI2KW3IAAKgOzxoBaFSsMAEAoDoEJgA0KlaYAABQHZ41AgAAACQITABoVNySAwBAdeSkuwDY0254+Dux6O0Vcce1j+32OY49pW+c/4NTolO3/FixZE3cc93j8foL7+y0/2cHHhA3Pnx5lfZvHPHj2LBmU8XxV0YMiq9/68Rot3ebWDRvRfzuJ4/Eu3OX7XadQM21fi9baAIAwC4JTCDhkH77xlUTRsQ91z8Rrz3/dgwe3i9+ctdF8Z2hN8XSBSs/cexFg34WWzZvrTguWru54v/HDTsiLr7mtLhtzIOx4M2lMfyi4+Pnf7w0Rh3/8yhet3lHpwMAACBN3JJDg1Jwy7lx+MADY/hFg+Pp938TT7//m+jYLb9G5zj1wuNj9vR58ejEF2L5wsK47+an4r233o9hFwza5diidZtjw5pNFf9SqVTFY6ddfEI8ff8r8dxDr8ayf66K2656KEq3bosvnf25Gl8nAAAAtcsKExqUiWMfjX326xhLF/wr7rv5qYiIKF63OR5bcNMnjnvhsdfj9jEPRUTEIf16xeTfT6/0+JyX5sXAkw7f5cef8MwPo2mznFiyYGX86Zan453ZiyMiIqdpkzjws93jodufq+ibSqVi7swFcciR+9bkEgEAAKgDAhMalC2btsb2D7dH6QcfVto75LKTbtjluI+127tNbFi7sdLjG9ZsinZ7t97p+PWFG+M3Vz4Q//z78mjaLCe+fM7AuOHhy+O7w34Z7731frTJ3yua5DSpVFNExIa1m6LbAZ1qconAp2T/EgAAqkNgQqOwcsnaWj3/ikWrY8Wi1RXH8+Ysji69OsRpo06Im//7vlr92EDN2PQVAIDqEJjQKNTklpwNazZGuw5tKj3ebu/WVVaH7MqCuUvj0KP2i4iIjetLomx7WZVVKu06tI4Nq2t2XgAAAGqfwIQGZ/u2sshuklWprSa35MybsyT6HvuZmPKH6RVtRww6OObNWVyjOvbrvU+sX/3RrT3bPyyLf/5jefQ99jMx65l/REREVlZW9D32oHh80owanRcAAIDaJzChwSl8f10cdESv6NgtP7aWlMamoi01uiXnL394KW585PI4/eIT4rVpb8fxp/aLAw/vHr+58oGKPhdcNSzad86LX373jxERMfzCwbFq+bpY+u7KaJbbNL58zsDo8/nPxNXf+G3FmMm/fzG+96tvxj//b3ksmLs0hl80OHJbNIvnHnx1z108AAAAe4TAhAbn0YkvxPdu/Wbc8eKPonmLZjHic9fG6vfXV3v8vDmL44bR98aIH54SF1w5LFYsXh0/u+iuWLpgZUWf/I5touM+7SqOc5o1iVHXDI/2nfOi9IMPY/G8f8WPzpkQf3/lnxV9ZjzxZuS1bxXf/P7Jkb93m3jvnffjJ+f9LorWuiUHAACgvslKpVKpdBdB7ZswYULcdNNNsWrVqujTp0/cdtttMWDAgGqN3bhxY+Tl5cWQLpdETnazWq6U6vjgsH3SXQI7seEg3yOZwKavmavVvsXpLoE68KUeC9JdAo3Mee1eSXcJNGCbN5XHsYf9K4qLi6NNmza7HkC9kZ3uAqh9Dz74YBQUFMTYsWPjjTfeiD59+sRJJ50Uq1ev3vVgAAAAaIQEJo3ALbfcEqNGjYqRI0dG7969Y+LEidGyZcu4++67010aAAAA1Ev2MGngtm3bFnPmzIkxY8ZUtGVnZ8eQIUNi1qxZOxxTWloapaWlFcfFxR8tf95evq12i6Xatm/fuutOpEVZqVs9MkH5Vl+nTFW2pXTXnch4pZs/THcJNDKbc/xeoPaUbP5oftkNI/MITBq4tWvXRllZWXTq1KlSe6dOnWL+/Pk7HDN+/PgYN25clfbphffUSo3shpW77kKaTEt3AQCZ7510F0Cjc3u6C6BRWLduXeTl5aW7DGpAYEIVY8aMiYKCgorjoqKi6NmzZyxbtsw3OPXWxo0bo3v37rF8+XKbaVGvmatkAvOUTGCekimKi4ujR48ekZ+fn+5SqCGBSQPXoUOHaNKkSRQWFlZqLywsjM6dO+9wTG5ubuTm5lZpz8vL88uIeq9NmzbmKRnBXCUTmKdkAvOUTJGdbQvRTOMr1sA1a9Ys+vXrF9Om/fs+gfLy8pg2bVoMHDgwjZUBAABA/WWFSSNQUFAQI0aMiP79+8eAAQPi1ltvjZKSkhg5cmS6SwMAAIB6SWDSCJx11lmxZs2auOaaa2LVqlXRt2/fmDp1apWNYHcmNzc3xo4du8PbdKC+ME/JFOYqmcA8JROYp2QKczVzZaW8txEAAABAJfYwAQAAAEgQmAAAAAAkCEwAAAAAEgQmAAAAAAkCE2LChAnRq1evaN68eRx99NHx2muvfWL/hx9+OA4++OBo3rx5fPazn42nnnqqjiqlsavJXL3zzjtj0KBB0a5du2jXrl0MGTJkl3Mb9oSa/kz92AMPPBBZWVkxfPjw2i0Q/r+aztWioqK47LLLokuXLpGbmxuf+cxnPAeg1tV0nt56661x0EEHRYsWLaJ79+5xxRVXxNatW+uoWhqrGTNmxLBhw6Jr166RlZUVU6ZM2eWY6dOnx5FHHhm5ublxwAEHxKRJk2q9TmpOYNLIPfjgg1FQUBBjx46NN954I/r06RMnnXRSrF69eof9X3nllTjnnHPiwgsvjDfffDOGDx8ew4cPj7feequOK6exqelcnT59epxzzjnx4osvxqxZs6J79+7xpS99KVasWFHHldOY1HSefmzJkiXx/e9/PwYNGlRHldLY1XSubtu2Lb74xS/GkiVL4pFHHokFCxbEnXfeGfvss08dV05jUtN5+uc//zmuuuqqGDt2bMybNy/+8Ic/xIMPPhg/+tGP6rhyGpuSkpLo06dPTJgwoVr9Fy9eHKecckqccMIJMXfu3Pjud78bF110UTzzzDO1XCk15W2FG7mjjz46jjrqqLj99tsjIqK8vDy6d+8e3/nOd+Kqq66q0v+ss86KkpKS+Otf/1rR9rnPfS769u0bEydOrLO6aXxqOleTysrKol27dnH77bfH+eefX9vl0kjtzjwtKyuL4447Lv7rv/4rZs6cGUVFRdX6yxR8GjWdqxMnToybbrop5s+fH02bNq3rcmmkajpPR48eHfPmzYtp06ZVtH3ve9+LV199NV5++eU6q5vGLSsrKyZPnvyJK0avvPLKePLJJyv90fnss8+OoqKimDp1ah1USXVZYdKIbdu2LebMmRNDhgypaMvOzo4hQ4bErFmzdjhm1qxZlfpHRJx00kk77Q97wu7M1aQtW7bEhx9+GPn5+bVVJo3c7s7Tn/70p9GxY8e48MIL66JM2K25+vjjj8fAgQPjsssui06dOsVhhx0W1113XZSVldVV2TQyuzNPjznmmJgzZ07FbTuLFi2Kp556Kk4++eQ6qRmqy2uqzJGT7gJIn7Vr10ZZWVl06tSpUnunTp1i/vz5OxyzatWqHfZftWpVrdUJuzNXk6688sro2rVrlV9OsKfszjx9+eWX4w9/+EPMnTu3DiqEj+zOXF20aFG88MILce6558ZTTz0VCxcujEsvvTQ+/PDDGDt2bF2UTSOzO/P0G9/4RqxduzaOPfbYSKVSsX379vjWt77llhzqnZ29ptq4cWN88MEH0aJFizRVRpIVJkCDd/3118cDDzwQkydPjubNm6e7HIiIiE2bNsV5550Xd955Z3To0CHd5cAnKi8vj44dO8bvf//76NevX5x11lnx4x//2O241CvTp0+P6667Ln7729/GG2+8EY899lg8+eST8bOf/SzdpQEZygqTRqxDhw7RpEmTKCwsrNReWFgYnTt33uGYzp0716g/7Am7M1c/dvPNN8f1118fzz//fBx++OG1WSaNXE3n6XvvvRdLliyJYcOGVbSVl5dHREROTk4sWLAg9t9//9otmkZpd36mdunSJZo2bRpNmjSpaDvkkENi1apVsW3btmjWrFmt1kzjszvz9Cc/+Umcd955cdFFF0VExGc/+9koKSmJiy++OH784x9Hdra/FVM/7Ow1VZs2bawuqWf81GjEmjVrFv369au0MVZ5eXlMmzYtBg4cuMMxAwcOrNQ/IuK5557baX/YE3ZnrkZE3HjjjfGzn/0spk6dGv3796+LUmnEajpPDz744PjHP/4Rc+fOrfj31a9+tWLH/O7du9dl+TQiu/Mz9fOf/3wsXLiwItSLiHj33XejS5cuwhJqxe7M0y1btlQJRT4O+bzPBfWJ11QZJEWj9sADD6Ryc3NTkyZNSr3zzjupiy++ONW2bdvUqlWrUqlUKnXeeeelrrrqqor+f/vb31I5OTmpm2++OTVv3rzU2LFjU02bNk394x//SNcl0EjUdK5ef/31qWbNmqUeeeSR1MqVKyv+bdq0KV2XQCNQ03maNGLEiNSpp55aR9XSmNV0ri5btizVunXr1OjRo1MLFixI/fWvf0117Ngx9fOf/zxdl0AjUNN5Onbs2FTr1q1T999/f2rRokWpZ599NrX//vunzjzzzHRdAo3Epk2bUm+++WbqzTffTEVE6pZbbkm9+eabqaVLl6ZSqVTqqquuSp133nkV/RctWpRq2bJl6gc/+EFq3rx5qQkTJqSaNGmSmjp1arougZ1wS04jd9ZZZ8WaNWvimmuuiVWrVkXfvn1j6tSpFZsQLVu2rFJSf8wxx8Sf//znuPrqq+NHP/pRHHjggTFlypQ47LDD0nUJNBI1nau/+93vYtu2bfH1r3+90nnGjh0b1157bV2WTiNS03kK6VLTudq9e/d45pln4oorrojDDz889tlnn/jv//7vuPLKK9N1CTQCNZ2nV199dWRlZcXVV18dK1asiL333juGDRsWv/jFL9J1CTQSs2fPjhNOOKHiuKCgICIiRowYEZMmTYqVK1fGsmXLKh7fd99948knn4wrrrgifv3rX0e3bt3irrvuipNOOqnOa+eTZaVS1qcBAAAA/Cd/5gIAAABIEJgAAAAAJAhMAAAAABIEJgAAAAAJAhMAAACABIEJAAAAQILABAAAACBBYAIAAACQIDABAAAASBCYAAAAACQITAAAAAASBCYAAAAACQITAAAAgASBCQAAAECCwAQAAAAgQWACAAAAkCAwAQAAAEgQmAAAAAAkCEwAAAAAEgQmAAAAAAkCEwAAAIAEgQkAAABAgsAEAAAAIEFgAgAAAJAgMAEAAABIEJgAAAAAJAhMAAAAABIEJgAAAAAJAhMAAACABIEJAAAAQILABAAAACBBYAIAAACQIDABAAAASBCYAAAAACQITAAAAAASBCYAAAAACQITAAAAgASBCQAAAECCwAQAAAAgQWACAAAAkCAwAQAAAEgQmAAAAAAkCEwAAAAAEgQmAAAAAAn/Dy0oquNYIdhMAAAAAElFTkSuQmCC", "text/html": [ "\n", "