{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "Tce3stUlHN0L" }, "source": [ "##### Copyright 2020 The TensorFlow Authors." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "cellView": "form", "execution": { "iopub.execute_input": "2022-12-14T22:53:26.896212Z", "iopub.status.busy": "2022-12-14T22:53:26.895771Z", "iopub.status.idle": "2022-12-14T22:53:26.899798Z", "shell.execute_reply": "2022-12-14T22:53:26.899147Z" }, "id": "tuOe1ymfHZPu" }, "outputs": [], "source": [ "#@title Licensed under the Apache License, Version 2.0 (the \"License\");\n", "# you may not use this file except in compliance with the License.\n", "# You may obtain a copy of the License at\n", "#\n", "# https://www.apache.org/licenses/LICENSE-2.0\n", "#\n", "# Unless required by applicable law or agreed to in writing, software\n", "# distributed under the License is distributed on an \"AS IS\" BASIS,\n", "# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n", "# See the License for the specific language governing permissions and\n", "# limitations under the License." ] }, { "cell_type": "markdown", "metadata": { "id": "qFdPvlXBOdUN" }, "source": [ "# 高级自动微分" ] }, { "cell_type": "markdown", "metadata": { "id": "MfBg1C5NB3X0" }, "source": [ "
![]() | \n",
" ![]() | \n",
" ![]() | \n",
" ![]() | \n",
"
tf.GradientTape.jacobian
方法进行构建。\n",
"\n",
"注:黑塞矩阵包含 `N**2` 个参数。由于这个原因和其他原因,它对于大多数模型都不实际。此示例主要是为了演示如何使用 `tf.GradientTape.jacobian` 方法,并不是对直接黑塞矩阵优化的认可。黑塞矩阵向量积可以[通过嵌套条带有效计算](https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/eager/benchmarks/resnet50/hvp_test.py),这也是一种更有效的二阶优化方法。"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T22:53:33.704964Z",
"iopub.status.busy": "2022-12-14T22:53:33.704370Z",
"iopub.status.idle": "2022-12-14T22:53:33.982510Z",
"shell.execute_reply": "2022-12-14T22:53:33.981813Z"
},
"id": "ELGTaell_j81"
},
"outputs": [],
"source": [
"x = tf.random.normal([7, 5])\n",
"layer1 = tf.keras.layers.Dense(8, activation=tf.nn.relu)\n",
"layer2 = tf.keras.layers.Dense(6, activation=tf.nn.relu)\n",
"\n",
"with tf.GradientTape() as t2:\n",
" with tf.GradientTape() as t1:\n",
" x = layer1(x)\n",
" x = layer2(x)\n",
" loss = tf.reduce_mean(x**2)\n",
"\n",
" g = t1.gradient(loss, layer1.kernel)\n",
"\n",
"h = t2.jacobian(g, layer1.kernel)"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T22:53:33.986560Z",
"iopub.status.busy": "2022-12-14T22:53:33.986051Z",
"iopub.status.idle": "2022-12-14T22:53:33.989710Z",
"shell.execute_reply": "2022-12-14T22:53:33.989070Z"
},
"id": "FVqQuZj4XGjm"
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"layer.kernel.shape: (5, 8)\n",
"h.shape: (5, 8, 5, 8)\n"
]
}
],
"source": [
"print(f'layer.kernel.shape: {layer1.kernel.shape}')\n",
"print(f'h.shape: {h.shape}')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "_M7XElgaiMeP"
},
"source": [
"要将此黑塞矩阵用于[牛顿方法](https://en.wikipedia.org/wiki/Newton%27s_method_in_optimization)步骤,首先需要将其轴展平为矩阵,然后将梯度展平为向量:"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T22:53:33.993118Z",
"iopub.status.busy": "2022-12-14T22:53:33.992570Z",
"iopub.status.idle": "2022-12-14T22:53:33.999939Z",
"shell.execute_reply": "2022-12-14T22:53:33.999275Z"
},
"id": "6te7N6wVXwXX"
},
"outputs": [],
"source": [
"n_params = tf.reduce_prod(layer1.kernel.shape)\n",
"\n",
"g_vec = tf.reshape(g, [n_params, 1])\n",
"h_mat = tf.reshape(h, [n_params, n_params])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "L9rO8b-0mgOH"
},
"source": [
"黑塞矩阵应当对称:"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T22:53:34.003205Z",
"iopub.status.busy": "2022-12-14T22:53:34.002673Z",
"iopub.status.idle": "2022-12-14T22:53:34.006052Z",
"shell.execute_reply": "2022-12-14T22:53:34.005510Z"
},
"id": "8TCHc7Vrf52S"
},
"outputs": [],
"source": [
"def imshow_zero_center(image, **kwargs):\n",
" lim = tf.reduce_max(abs(image))\n",
" plt.imshow(image, vmin=-lim, vmax=lim, cmap='seismic', **kwargs)\n",
" plt.colorbar()"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"execution": {
"iopub.execute_input": "2022-12-14T22:53:34.009264Z",
"iopub.status.busy": "2022-12-14T22:53:34.008630Z",
"iopub.status.idle": "2022-12-14T22:53:34.222801Z",
"shell.execute_reply": "2022-12-14T22:53:34.222222Z"
},
"id": "DExOxd7Ok2H0"
},
"outputs": [
{
"data": {
"image/png": "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K0ypLS2Zen4/xZQ7f16bKf65591bMn23fLYpd8rcB5xjvW0fmHJrR717rHWnveUW59CMn/3MlPqdClsLrPIdFzjHbllpSq27x7i317q3zNZe60f/j3tLppRTl5tyt7V91zk2+4WHTblrLnffxxvybK/NnX+3dfrrt8+9ZdaZhlZFkqR699ePtUXZjh1unzuSVFs/zJR7+a3usTfe6N6e7ECre8s2dA6BXZwBAIDOIUVSSoptwX/MnMFq/f2F6s5VQwAAgMAxL85ee+01XXbZZcrPz1dKSoqWL1/e4eee5+mOO+5Q3759deKJJ6q4uFjvv/++X+MFAABB07NnYm7dlHlx1tDQoOHDh2vRokWH/fl9992nX//611qyZInWrVunk046SRMnTlRTU1PcgwUAAAHE4sxX5plPnjxZkydPPuzPPM/TwoULddttt+nyyy+XJD311FPKzc3V8uXLNX369PhGCwAA0MX5uizdvn27qqurVVxc3H5fJBLRmDFjVFZWdtjFWXNzs5qbm9v/HY1G/RwSAABItJ49JZ9PCBAnBPijurpakpSbm9vh/tzc3PaffVZJSYkikUj7rbCw0M8hAQAAdCpJP1tzwYIFqqura7/t2rUr2UMCAAAWfOfMV74uzvLy8iRJNTU1He6vqalp/9lnpaWlKRwOd7gBAAB0V74uzgYMGKC8vDytXr26/b5oNKp169apqKjIz4cCAABB0aOH/1WzHj2SPaukMdcM6+vrVVFR0f7v7du3q7y8XNnZ2erXr59uvPFG/exnP9MZZ5yhAQMG6Pbbb1d+fr6mTJni57gBAAC6pBTPs50OUVpaqq997Wufu3/GjBl64okn5Hme7rzzTj388MOqra3VhRdeqN/+9rc688wznfJHo1FFIhHVffxxIA5xvlfhXlzs39+W23I43dBKTpIUluGs18xMU+6qavfnJD8vZsot6yL+kUfcY3NybLlLS51DX0+/yJT6grHuz4u1N2CGGt2DrT0NCwpM4TFDcT7U2mLK3SL3HojWr66E5L59LHO05g4S6zwtrM+J5TVh3fapsu2HCWMYeDQaVeTkk1VXV/eFf262f2bn5ioc8ncficZiitTUJGVeyWaunI0fP15HW8+lpKTo7rvv1t133x3XwAAAQCfRs6fk8+JMsc75h4wfkn62JgAAAP6l+56nCgAA/EHlzFdUzgAAAAKEyhkAAIhPjx7+X/qirc3ffJ0IlTMAAIAAoXIGAADik4iLxvrdSL0ToXIGAAAQIFTOAABAfKic+YrFGQAAiA+LM19xWBMAACBAgls5++AD556PsUFufTslKVS50zSM/v37Ocdu3mxKrREj3GM/1WveSf/+7n3IfvcbW+7vfce9d+Nzz2eYck+z9MqUpJkz3WNXrLDlfuEF59ALxtt6VK578z+dY8eca+v1906F+3M+ZLCtV6bWrjWFt466wDk21dDLVJJSR41yD1640JR7/43u7eeyX3jYlFvf+Y5z6MOP2P5+nv0d94t2zp5jy/3wEtsFQTeWu+c/b2irKfeOHe59VYcMMvbK3LHDPdbYa1bl5c6hjSPcXzvW/rsJQeXMVwHYogAAADgkuJUzAADQOfTo8c/qGXxB5QwAACBAWOYCAID49OxJ5cxHVM4AAAAChGUuAACID5UzX/FMAgCA+LA48xWHNQEAAAKEZS4AAIhPIi6l4Xn+5utEqJwBAAAESIrnBWtpGo1GFYlEVLd3r8JhtxZEm7a4t/IYVvuaaTyxC8eZ4i1Cf/pf9+DJkxM2DtXXm8J/+zv31lDfLZ9tG8uSJbZ4i0mTTOGxlS87x4Zka23T0ur+d1Hq+tdNuZfucG/7Mn26KbVabV12TJvze3OMbXYMf6XHjH+HhuqjzrE1/3B/PUhSbm/bvmJRVe0+z7w8W+6E7uNbNplyv14/zDn2glHG/cqwk6/7m6093dlnu8eGM92f72g0qsjJJ6uurs75c9Mv7Z/ZkyYpfMIJ/uY+eFCRlSvN81q0aJHuv/9+VVdXa/jw4XrooYc0evToI8Y///zzuv3227Vjxw6dccYZuvfee3XJJZe0/3zmzJl68sknO/zOxIkTtXLlSvukHFE5AwAAXcJzzz2n+fPn684779TGjRs1fPhwTZw4UXv27Dls/Ouvv66rrrpK1113nd566y1NmTJFU6ZM0ebPNMueNGmSdu/e3X575plnEjoPFmcAACA+h87W9Ptm9OCDD2rWrFm69tprNWTIEC1ZskQZGRl67LHHDhv/q1/9SpMmTdIPfvADnX322frpT3+q8847T7/5zW86xKWlpSkvL6/9dvLJJx/X0+SKxRkAAAisaDTa4dbc3HzYuJaWFm3YsEHFxcXt94VCIRUXF6usrOywv1NWVtYhXvrnIcvPxpeWlqpPnz4666yzdP311+ujjz6Kc1ZHx+IMAADEJ4GVs8LCQkUikfZbSUnJYYewb98+tbW1KTc3t8P9ubm5qq6uPuzvVFdXHzN+0qRJeuqpp7R69Wrde++9WrNmjSZPnqy2trZ4nrGj4lIaAAAgPom4CO0n5yvu2rWrwwkBaWlp/j7OMUz/1JlT55xzjoYNG6bTTz9dpaWlmjBhQkIek8oZAAAIrHA43OF2pMVZTk6OevTooZqamg7319TUKO8Ipyfn5eWZ4iVp4MCBysnJUUVFhXEm7licAQCA+By6CK2ftx49TENITU3VyJEjtXr16vb7YrGYVq9eraKiosP+TlFRUYd4SXrllVeOGC9JlZWV+uijj9S3b1/T+CxYnAEAgC5h/vz5+u///m89+eSTevfdd3X99deroaFB1157rSTpmmuu0YIFC9rjv//972vlypX6xS9+oS1btuiuu+7S+vXrNW/ePElSfX29fvCDH2jt2rXasWOHVq9ercsvv1yDBg3SxIkTEzYPvnMGAADik4jvnMXsF2yeNm2a9u7dqzvuuEPV1dUaMWKEVq5c2f6l/507dyoU+ldd6oILLtDSpUt122236cc//rHOOOMMLV++XEOHDpUk9ejRQ5s2bdKTTz6p2tpa5efn6+KLL9ZPf/rThH73jcUZAADoMubNm9de+fqs0tLSz9135ZVX6sorrzxs/IknnqiXXnrJz+E5YXEGAADiE5DKWVcR3MVZWZl00klOoQUjLnLPW77DNIz6Ee69Na0nbpxn6Jd5/Vzb1wMX3+veG/CiKbZebK/e7N4TNGXuA6bc3vRSU7xeeME51NIrU5Lu7pHiHHveH20tavftc4/99qWDTLm3GNq9hVptfQdTD/NX59F8b8549+BLLzXljr7gvj3DZ9m+uFtTvts5tiHPfT+RJBmujTR7ju11b+ll2qOH+2tHktra/sMUv2yZe+y0K4eaci+/1T32glGm1FJ5uXPo2UPd+9hKUvi277kH33OPe2xTk2kcCL7gLs4AAEDnQOXMV5ytCQAAECBUzgAAQHyonPmKxRkAAIjPoYvQ+imBvSuDjsOaAAAAAULlDAAAxCcRhzWpnAEAACAIqJwBAID4UDnzFZUzAACAAKFyBgAA4kPlzFcpnufZ+s4kWDQaVSQSUd3HHyscdmsrFK13LwCG931gG1BOjnPo/lZbG6TsLMM1XOrrTbmVmWmLN3h5lfvzffEg2/P9evVAU/wFlb93D/4PW/uZ/1nhPs9vfH+AKbe2bnUOfW1tqin1uAPu7bVavv5vptyp9ftN8crKcg61vI4lKbzkPufY2C0/NOUO1brPc2d9til3QYFhHErcdZ5ixgMnlZW2/KZ57ttjyl3V2sc5Nj/P9hw2Nrk/Lxnpxu1jaLO0cUuGc2x9fVRf/WpEdXV1zp+bfmn/zP7hDxVOS/M3d3OzIvfdl5R5JRuVMwAAEJ9EXOestdXffJ0IizMAABCfRBzW9DtfJ2I+IeC1117TZZddpvz8fKWkpGj58uUdfj5z5kylpKR0uE2aNMmv8QIAAHRp5mVpQ0ODhg8frm9/+9u64oorDhszadIkPf744+3/TvP5ODQAAAgQKme+Ms988uTJmjx58lFj0tLSlJeX55SvublZzc3N7f+ORqPWIQEAAHQZCbnOWWlpqfr06aOzzjpL119/vT766KMjxpaUlCgSibTfCgsLEzEkAACQKIcqZ37fuinfF2eTJk3SU089pdWrV+vee+/VmjVrNHnyZLUd4XolCxYsUF1dXftt165dfg8JAACg0/B9WTp9+vT2/z/nnHM0bNgwnX766SotLdWECRM+F5+WlsZ30gAA6Mz4zpmvEt6+aeDAgcrJyVFFRUWiHwoAAKDTS/iytLKyUh999JH69u2b6IcCAADJkIiL0Pbo4W++TsT8TNbX13eogm3fvl3l5eXKzs5Wdna2fvKTn2jq1KnKy8vTtm3b9MMf/lCDBg3SxIkTfR04AAAICA5r+so88/Xr1+trX/ta+7/nz58vSZoxY4YWL16sTZs26cknn1Rtba3y8/N18cUX66c//an5e2Xb/x5Sr15uR10H9nfvbxaVrXdjONM9d7ahH58kxeTeky+0b58pt9LT3WOffdaUeuyUa9yDd9h6gl4w1tarbt2b/+kce66xE4jpKTf0ypQkbd7sHHrWWefZcte4n/Gc2tP2fFc12fpI5re2OMdWVNh6iJ73ne84xy5caEqt+TPdYxPZc1Klpbbk48c7h4YWPmhKXXDjfFN8aMs7zrEtg4aYcufXuvfijMm9D6ck1da6x2a4XTGq3aYK936ZQ4e65+UKVF2PeXE2fvx4Ha1X+ksvvRTXgAAAQCdD5cxXCT8hAAAAAO6677IUAAD4g8qZr6icAQAABEj3XZYCAAB/cCkNX1E5AwAACBAqZwAAID5858xX3XfmAADAHyzOfMVhTQAAgADpvstSAADgDypnvkrxjna5/ySIRqOKRCKq+/hjhcNht18y9Nn5oN7WyqN/f1O4Sai6yjm2JSfflHv9evdYS5sQSQr3bHQPtrSRktTYZCvmZvR0bw9kelIkadAg59DXttj2q7POco/NfdrWZmf2Fvc2O9a2RhnptnZPH+xw354DCwzbUtL8W93bPT14m621WmO6e5sq0z4omT5wrK+HRMpotfUIakl3fP8+DqlNhrFkZiZsHFXVtu2Tn2d4/Xyqh/WxROvrFRk5UnV1de6fmz5p/8x+5hmFM9zbUznlbmxU5KqrkjKvZOu+y1IAAOAPKme+Cs6fZQAAAKByBgAA4sRFaH1F5QwAACBAqJwBAID48J0zX3XfmQMAAH+wOPMVhzUBAAACpPsuSwEAgD+onPmKyhkAAECAdN9lKQAA8AeX0vAVlTMAAIAACWzlLFofkkJua8d9hn6Z1l6ZoVZD37ymJlPuD5rc+2UO3LLJlPuCyi3uwZmDTblNzThvucWUOuNnPzPFv1Ph3sutfMcFptxbVrrH3j3mf025VVPoHGrplSlJd/x3inNsxsIGU+6qalvvvIH73nCO/UP5aFPuB8uKnGNf31Jmyn3BKPfX/bhi9x6fklRa6h6bsWWjKbcGG17Lc+aYUtfc/5QpPrdpj3uwsQevamvdY43VnGir+z6e39MwR0nvVbh/VtXXn2mItfU9TQi+c+YrKmcAAAAB0n2XpQAAwB9UznzVfWcOAAD8weLMVxzWBAAACJDuuywFAAD+oHLmKypnAAAAAdJ9l6UAAMAfXITWV1TOAAAAAoTKGQAAiA/fOfMVlTMAAIAASfE8z0v2ID4tGo0qEomo7uOPFQ6HnX4nZlhjmtoxSWqRe2uW1J4xU24LyxwlKdTU6B5sbJ3S2OQ+lgwZxiFJ+/bZ4gsKnEPNz6FhX7HsJ5JtX7E835LxOTe2HFNmpi3e8pevdSytrc6hsUy395JDQnLfPtb9Cp9neb4lmfaVqlpbyzHLLm7tOvXxx+6xvXu7x0ajUZ18ckR1dXXOn5t+af/M3rJF4V69/M194IAigwcnZV7J1n1rhgAAwB8c1vQVf/IBAAAESPddlgIAAH9wKQ1fUTkDAAAIECpnAAAgPnznzFdUzgAAAAKk+y5LAQCAP6ic+YrKGQAA6DIWLVqk/v37Kz09XWPGjNEbb7xx1Pjnn39egwcPVnp6us455xz93//9X4efe56nO+64Q3379tWJJ56o4uJivf/++4mcAoszAAAQp0OVM79vRs8995zmz5+vO++8Uxs3btTw4cM1ceJE7dmz57Dxr7/+uq666ipdd911euuttzRlyhRNmTJFmzdvbo+577779Otf/1pLlizRunXrdNJJJ2nixIlqsl4424AOAcdAh4DPo0PA59Eh4AjoEAAHdAj4vE7XIcDwmW3KffLJpnmNGTNG559/vn7zm99IkmKxmAoLC3XDDTfo1ltv/Vz8tGnT1NDQoBUrVrTfN3bsWI0YMUJLliyR53nKz8/XzTffrFtuuUWSVFdXp9zcXD3xxBOaPn26DzP9PN5VAABAYEWj0Q635ubmw8a1tLRow4YNKi4ubr8vFAqpuLhYZWVlh/2dsrKyDvGSNHHixPb47du3q7q6ukNMJBLRmDFjjpjTD8H9tl1trRRz/GsqK9s9r/Gv89RM96dof61trZud5f7X4t69ptTq3dv9r8U337TlHnOue0XpnQrbX61DBrtXwiRJa9c6h7aOusCUOrW01D121ChT7qom9302P89WVaiqdn/O83OMbwGVlbZ4Q2VT1dW23P37O4eGSl81pW4ce5FzbMaWjabcsRHnOcdaX5vnn+8e+6lCgZNvXGrdD93fD/PzbGOJtrrv49ZibzjTfZ7W9/zc5p3OsTH1M+VOtphCvleRD+UrLCzscP+dd96pu+6663Px+/btU1tbm3Jzczvcn5ubqy1bthz2Maqrqw8bX/3J+9Gh/x4tJhGCuzgDAADd3q5duzoc1kxLS0viaL4YpmVuSUmJzj//fPXq1Ut9+vTRlClTtHXr1g4xTU1Nmjt3rk455RRlZmZq6tSpqqmp8XXQAAAgOFpbE3OTpHA43OF2pMVZTk6OevTo8bk1R01NjfLyDl+ezcvLO2r8of9acvrBtDhbs2aN5s6dq7Vr1+qVV17RwYMHdfHFF6uhoaE95qabbtKLL76o559/XmvWrFFVVZWuuOIK3wcOAABwSGpqqkaOHKnVq1e33xeLxbR69WoVFRUd9neKioo6xEvSK6+80h4/YMAA5eXldYiJRqNat27dEXP6wXRYc+XKlR3+/cQTT6hPnz7asGGDxo0bp7q6Oj366KNaunSpLrron9/ZePzxx3X22Wdr7dq1Gjt2rH8jBwAAgfDpSpefOa3mz5+vGTNmaNSoURo9erQWLlyohoYGXXvttZKka665RqeeeqpKSkokSd///vf11a9+Vb/4xS/0b//2b3r22We1fv16Pfzww5KklJQU3XjjjfrZz36mM844QwMGDNDtt9+u/Px8TZkyxa+pfk5c3zmrq6uTJGVn//PLzRs2bNDBgwc7nNUwePBg9evXT2VlZYddnDU3N3c48yIajcYzJAAA0E1NmzZNe/fu1R133KHq6mqNGDFCK1eubP9C/86dOxUK/eug4QUXXKClS5fqtttu049//GOdccYZWr58uYYOHdoe88Mf/lANDQ2aPXu2amtrdeGFF2rlypVKt15LxeC4F2exWEw33nijvvzlL7dPorq6WqmpqcrKyuoQe7SzGkpKSvSTn/zkeIcBAACSLCiVM0maN2+e5s2bd9iflR7mLPwrr7xSV1555RHzpaSk6O6779bdd999fAM6Dsd93uvcuXO1efNmPfvss3ENYMGCBaqrq2u/7dq1K658AADgi5XIEwK6o+OqnM2bN08rVqzQa6+9poJPXccoLy9PLS0tqq2t7VA9O9pZDWlpad3itFgAAAAXpsqZ53maN2+eli1bpldffVUDBgzo8PORI0fqhBNO6HBWw9atW7Vz586EntUAAACSp63N/6pZW1uyZ5U8psrZ3LlztXTpUv3xj39Ur1692r9HFolEdOKJJyoSiei6667T/PnzlZ2drXA4rBtuuEFFRUWcqQkAAODAtDhbvHixJGn8+PEd7n/88cc1c+ZMSdIvf/lLhUIhTZ06Vc3NzZo4caJ++9vf+jJYAAAQPEE6IaArSPE8z0v2ID7tUIf7jz9270Ifqq5yzv9BU75pPAP72/rJWbxX4X5UedAgW+6Q3Mfd0mo7LyR1/evOsUt32PpZTp9uCje9eJcsseX+3hz3HqLqafz6pmHgH1SmmlIP3PeGe7CxJ6j53fKVV5xDG7/2b6bUGemJe202Nrm/JjLUaModS7f1m7UI1RsuRWRtOplAlj6ckpTfc49zbEtWH1Pu+nr3WEt/ZEnSvn3usTk5zqHRaFSRk09WXZ3756ZfDn1mb9lSp169/H3sAweiGjw4kpR5JRu9NQEAQFyonPnL3xbyAAAAiAuVMwAAEBcqZ/6icgYAABAgVM4AAEBcDl3nzO+c3RWLMwAAEBcOa/qLw5oAAAABQuUMAADEhcqZv6icAQAABAiVMwAAEBcqZ/4K7OIs9PftCvXq5RTbUjDQOe/ALZtM44hpmHPs3r2m1KaWTH/5iy33uAvdY3/3O1vub1/qPvAtK225Q62GlkmSUktLnWO/N2e8bTCXXuocGn3hZVPqigr3lkznDbU9J38oH+0ce8VQW+shVVebwi0tmTIeX2TKHbt+rnNsaOGDptyaM98QO8eW+4mnnENXrLCl/sal7i2ZLiq2HThZtco2ls2b3WOHDbW1QXqvwr0lU8TYoDC3ead7cGu6LXlTky0e3VZgF2cAAKBzoHLmL75zBgAAECBUzgAAQFy4CK2/WJwBAIC4cFjTXxzWBAAACBAqZwAAIC5UzvxF5QwAACBAqJwBAIC4UDnzF5UzAACAAKFyBgAA4sKlNPxF5QwAACBAUjzPM3YeS6xoNKpIJKK6vXsVDoedfuf19e59Ci+o/L1tQIb+irH0DFPqkGz95EyWL3ePNcxRkl5b6/58jzvwv6bcLV9378UoSan1+92Ds7JMuaP17n+7hJfcZ8qt73zHOXT+z7JNqR8sK3IPfuklU25luvdutIoZ/1YMnT7APfe27bbc9VHn2Jp/uL1PHdK7t2EcCXyPsD7fxraqyslxj03d8Z4p98b6M51jR4wwpTZJ5PZ5fa379mloiOriiyOqq6tz/tz0y6HP7GeeqVNGhr+P3dgY1VVXJWdeycZhTQAAEBdOCPAXhzUBAAAChMoZAACIC5Uzf1E5AwAACBAqZwAAIC5UzvxF5QwAACBAqJwBAIC4cBFaf1E5AwAACBAqZwAAIC5858xfLM4AAEBcWJz5K7iLs1WrpAy3dkgjir/hnjdnhGkYlpZMmzebUmvoUPejyitW2HJfOuUK59hBg2y5P1jp3mrl3jJbO6YfTLaNRQsXOofG7rrblDp8Vl/33B/uNuU2DFsP3mZoUSXp9S1lzrFjjd2YQqWv2n5h/Hj33AsfNKW2tGRq7ZFiyr3l/3Pvajfsifmm3HrgAefQ2XNs3zx5eIl7O6EePdxbVEmS15xuG8sT7m3eZk/PM+VWhXuoucXS2rXusWPH2nIvXuwcesH11zvHRqMJbAWIpAju4gwAAHQKVM78xQkBAAAAAULlDAAAxIVLafiLyhkAAECAUDkDAABx4Ttn/qJyBgAAECBUzgAAQFyonPmLxRkAAIgLizN/cVgTAAAgQKicAQCAuFA58xeVMwAAgABJ8TzPvYncFyAajSoSiWj37jqFw2Hf82c02foUKivLPTZIy/ymJvfY6mpT6p3pZzrH9utZZcqtPFuPvf217n9fZPe09RKs+Yf7/pd7gnG/MmhMzzbFZ/RscQ/uaSueNzYF5++5jFb37blph+29ZFi6e//Y9+T+epBsvWxD+/aYcsdy+rjnrra9Nt+pzTfFDymwvd4squrdt6fxLcX01ml8+Zg+Ig4csMRGdcYZEdXVJeZz82gOfWb/8Id1Skvz97Gbm6O6777kzCvZgvNOCwAAANvirKSkROeff7569eqlPn36aMqUKdq6dWuHmPHjxyslJaXDbc6cOb4OGgAABMeh75z5feuuTIuzNWvWaO7cuVq7dq1eeeUVHTx4UBdffLEaGho6xM2aNUu7d+9uv913332+DhoAAKCrMh0xX7lyZYd/P/HEE+rTp482bNigcePGtd+fkZGhPOuBfgAA0Cm1tko9evifs7uK6ztndXV1kqTs7I5fWH766aeVk5OjoUOHasGCBWpsbDxijubmZkWj0Q43AADQeXBY01/HfZ2zWCymG2+8UV/+8pc1dOjQ9vu/+c1v6rTTTlN+fr42bdqkH/3oR9q6dav+8Ic/HDZPSUmJfvKTnxzvMAAAALqU416czZ07V5s3b9Zf/vKXDvfPnj27/f/POecc9e3bVxMmTNC2bdt0+umnfy7PggULNH/+/PZ/R6NRFRYWHu+wAADAF6ytzf9KV1ubv/k6k+NanM2bN08rVqzQa6+9poKCgqPGjhkzRpJUUVFx2MVZWlqa0tLSjmcYAAAAXY5pceZ5nm644QYtW7ZMpaWlGjBgwDF/p7y8XJLUt2/f4xogAAAIttZWKeTzlVP5zpmjuXPnaunSpfrjH/+oXr16qfqTK8tHIhGdeOKJ2rZtm5YuXapLLrlEp5xyijZt2qSbbrpJ48aN07BhwxIyAQAAgK7EtDhbvHixpH9eaPbTHn/8cc2cOVOpqalatWqVFi5cqIaGBhUWFmrq1Km67bbbzAPLqKpQRjTTLTgnxz3x8uWmccRmfts5dkdlqim35WojjzxiSq1vfct9LP+9zNYW40f/j3vbl5RTl5tyt7V91xSf/cLDzrE1l88+dtCnNOSlOMfu/LutC1plpXvsBaMM7ZgkjSt23/alpabUytiy0fYLgwe7xxovVl1z/1POscOemH/soE95b86DzrHLz3LfTyTph83NzrH/9Yh7OyZJ+vGtMefYlFPXmHJ7a041xW9sGnfsoE9Yr7xkeT+84zb350SSMio2uwdbenFJSjV8FmbceKNz7InNhl5PCULlzF/mw5pHU1hYqDVrbC94AAAA/Mtxn60JAAAgUTnzG4szAAAQFxZn/vL5qQQAAEA8WJwBAIC4HLoIrZ+3RF+Edv/+/br66qsVDoeVlZWl6667TvX19Uf9naamJs2dO1ennHKKMjMzNXXqVNXU1HSISUlJ+dzt2WefNY2NxRkAAOh2rr76ar399tt65ZVX2i+s/+kuR4dz00036cUXX9Tzzz+vNWvWqKqqSldcccXn4h5//HHt3r27/TZlyhTT2PjOGQAAiEtrq5Riu6qMU07pn20dP82PzkLvvvuuVq5cqTfffFOjRo2SJD300EO65JJL9MADDyg/P/9zv1NXV6dHH31US5cu1UUXXSTpn4uws88+W2vXrtXYsWPbY7OyspRnvUbMp1A5AwAAgVVYWKhIJNJ+KykpiTtnWVmZsrKy2hdmklRcXKxQKKR169Yd9nc2bNiggwcPqri4uP2+wYMHq1+/fiorK+sQO3fuXOXk5Gj06NF67LHHjnkpss+icgYAAOKSyMrZrl27FA7/62LpfvTjrq6uVp8+HS/y3LNnT2VnZ7d3Pzrc76SmpiorK6vD/bm5uR1+5+6779ZFF12kjIwMvfzyy/rud7+r+vp6fe9733MeH4szAAAQWOFwuMPi7GhuvfVW3XvvvUeNeffdd/0Y1hHdfvvt7f9/7rnnqqGhQffffz+LMwAA8MVJZOXM4uabb9bMmTOPGjNw4EDl5eVpz549n3m8Vu3fv/+I3xXLy8tTS0uLamtrO1TPampqjvr9sjFjxuinP/2pmpubnat+KZ71QGiCRaNRRSIRffxxnfNKOST33mkxvmYXt0Q+35bcQZLI/cr6nLCPf14in8NQq633qXp20r+JrZ+Uhnl2l/eJRIlGo4qcfLLq6tw/N3197EhExcV1OuEEfx/74MGoVq2KJGRe7777roYMGaL169dr5MiRkqSXX35ZkyZNUmVl5RFPCOjdu7eeeeYZTZ06VZK0detWDR48WGVlZR1OCPi0n//85/rFL36h/fv3O4+vk75LAAAAHJ+zzz5bkyZN0qxZs7RkyRIdPHhQ8+bN0/Tp09sXZh9++KEmTJigp556SqNHj1YkEtF1112n+fPnKzs7W+FwWDfccIOKioraF2YvvviiampqNHbsWKWnp+uVV17Rf/3Xf+mWW24xjY/FGQAAiEtbm/+HNRN9Edqnn35a8+bN04QJExQKhTR16lT9+te/bv/5wYMHtXXrVjU2Nrbf98tf/rI9trm5WRMnTtRvf/vb9p+fcMIJWrRokW666SZ5nqdBgwbpwQcf1KxZs0xj47AmzDis+Xkc1gw2Dmv6gMOagRWEw5pf+1qdevb097FbW6P6858Tc1gz6DrpuwQAAAiKRDQpp/E5AAAAAoHKGQAAiAuVM39ROQMAAAgQKmcAACAuVM78ReUMAAAgQKicAQCAuCTimmSJvs5ZkAV2cfbOO1JmplvssMHutc8dlammcfTv7x4b2vGBKXes/0D33OvfsOUeNdo99113mHLvv/Fu59jsFx425dZ3vmMKf/gR9+Lv7O/Yro00e4577oeXGK+7VFrqHNo49iJT6owtG51jYyPOM+V+801TuM4/3z12xQpb7m9c6v6cW7alJD38sz3HDvrEfz3Sx5T7x7ca9pWSElNuLVjgHnvppbbc1g20dq1zaNOIC0ypMyo2uwcPHWrKvWmz+74ybKjtdf/yKvfcxcXueYNwbcPWVsnvq6Z258VZ8rcoAAAA2gW2cgYAADoHKmf+onIGAAAQIFTOAABAXKic+YvKGQAAQIBQOQMAAHGhcuYvKmcAAAABQuUMAADEpa3N/8pZzHj5yK6ExRkAAIhLa6sU8vlYXHdenHFYEwAAIEConAEAgLhQOfNXiuf5fZQ4PtFoVJFIRB9/XKdwOOz0O6HWFuf8ja223prp6aZwk6Ym99iM9MTtpda+bKH6qHNszT/ctuEhub0TN8+qats88/LcY0NK3Lgbm2zjzlCjc2wsPcM6HBPLvuLcTPcLYHlNJHLbm7W69xmO9bS9FyZyni2ttn08tdV9H0/om3h9vSk8lun+fmh5vqPRqCInn6y6OvfPTb8c+szOza1TKOTvY8diUdXURJIyr2SjcgYAAOJC5cxffOcMAAAgQKicAQCAuLS1+V/pCtaXrr5YVM4AAAAChMoZAACIS2urlJLib87uXDljcQYAAOLC4sxfHNYEAAAIECpnAAAgLlTO/EXlDAAAIEConAEAgLhQOfNXYBdnK1dKGY6dZb4xyT3vI4/YxjFvnntsaP0bptwZo0a5B991lym3JT50al9T6pry3c6xDXnGV2tbmyl89hz34u+SJbah9OjxgnNsW9t/mHKHFj7oHjxnvim35sxxj33iKVPqFStsQ/nGpe4tmS4qthXyV61yj+3Rw9BGSpL3oXtbnpRT19hyt01zD770UlPu2Ir/c459qofttXlNm+2TMrR4kXNs67VzTblTb7vNPfiBB0y5X17lvh8WF9taCn3rW+6xS39nSo0uJrCLMwAA0FnE5Hl+91vqvv2b+M4ZAABAgJgWZ4sXL9awYcMUDocVDodVVFSkP/3pT+0/b2pq0ty5c3XKKacoMzNTU6dOVU1Nje+DBgAAQdKWoFv3ZFqcFRQU6J577tGGDRu0fv16XXTRRbr88sv19ttvS5Juuukmvfjii3r++ee1Zs0aVVVV6YorrkjIwAEAQFCwOPOT6Ttnl112WYd///znP9fixYu1du1aFRQU6NFHH9XSpUt10UUXSZIef/xxnX322Vq7dq3Gjh3r36gBAAC6qOM+IaCtrU3PP/+8GhoaVFRUpA0bNujgwYMqLi5ujxk8eLD69eunsrKyIy7Ompub1dzc3P7vaNR2VhUAAEi2RFS6um/lzHxCwN/+9jdlZmYqLS1Nc+bM0bJlyzRkyBBVV1crNTVVWVlZHeJzc3NVXV19xHwlJSWKRCLtt8LCQvMkAAAAugrz4uyss85SeXm51q1bp+uvv14zZszQO++8c9wDWLBggerq6tpvu3btOu5cAAAgGWIJunVP5sOaqampGjRokCRp5MiRevPNN/WrX/1K06ZNU0tLi2praztUz2pqapSXl3fEfGlpaUpLS7OPHAAAoAuK+zpnsVhMzc3NGjlypE444QStXr26/Wdbt27Vzp07VVRUFO/DAACAwOJsTT+ZKmcLFizQ5MmT1a9fPx04cEBLly5VaWmpXnrpJUUiEV133XWaP3++srOzFQ6HdcMNN6ioqIgzNQEAAByleJ57a9HrrrtOq1ev1u7duxWJRDRs2DD96Ec/0te//nVJ/7wI7c0336xnnnlGzc3Nmjhxon77298e9bDmZ0WjUUUiEX38cZ3CYbe+ZaF69zM897faeqF95vwGX4USeDy9Zq97UbR3b1vuUO1+59id9dmm3AUFxrEk8DmMGQrLlZW23JZ5WvZvSar5h/s+bt72AXm+Jeko5xl9Tn5Oiyn3OxWpzrFD9r1myi3LH6s9E9dhz/p8h1a9bHuAT525fyyW9ytJym3e6R5sfFOxPC+JfD1Y3lSiBw4oMnSo6urcPzf9cugzW9ouqZfP2Q9IGpCUeSWb6ZX/6KOPHvXn6enpWrRokRYtcm94CwAAOjsupeEnemsCAAAESOJq5gAAoJugcuYnKmcAAAABQuUMAADEKREXje2+F6GlcgYAABAgVM4AAECc+M6Zn6icAQAABAiVMwAAECcqZ35icQYAAOLE4sxPHNYEAAAIkMBWzj78UIo6thTsl5funrj++MbjwtJzUpJiWe59J0OVhl5yknoX9HPP/cLvTbkbL/1P59h++94z5Y7pTFP8xnL3vy+GDjWl1rJl7rFXXmnLHdryjnNsy6Ahpty5TXucY2PqY8pdVW37ey4/z/1U+M2bTak1eLB77MNPuPfKlKTZ0937mW5sGmfKfV5Pw+UB1q415bb07QwtNrbZu/56W3xFhXNorwLb614phvd8o7173WNzjb1p36twf/2cOcjQE9T1wzKhYvK/0sWlNAAAABAAga2cAQCAzoKL0PqJyhkAAECAUDkDAABx4mxNP1E5AwAACBAqZwAAIE5UzvzE4gwAAMSJxZmfOKwJAAAQIFTOAABAnKic+YnKGQAAQICkeJ7nJXsQnxaNRhWJRFS3d6/C4bDT79R87N6aJbfZ1gZJBe4tNGLGta6l3ZOl1ZM1d2O6LXdlpXvsmfteN+W2tJ+RJLW2usdu2WLLben3tG+fKXVLlq1tkkVqk6GVS2ZmwsYh2do9WVo9STK1B1Jeni23QVW92/vUIZahNDXZxtLTcCzE8tKRpAMHbPG9ernHZtS7txyTpJ1N7q8fw1u4JClkuPDp/lrbe352Zot77nr3z7VoNKoBAyKqq6tz/tz0y6HPbGm1pJN8zt4gaUJS5pVsVM4AAEC3s3//fl199dUKh8PKysrSddddp/r6ozfgfvjhhzV+/HiFw2GlpKSotrbWl7yfxeIMAADEqS1Bt8S5+uqr9fbbb+uVV17RihUr9Nprr2n27NlH/Z3GxkZNmjRJP/7xj33N+1mcEAAAAAIrGu34VY20tDSlpaXFlfPdd9/VypUr9eabb2rUqFGSpIceekiXXHKJHnjgAeXn5x/292688UZJUmlpqa95P4vKGQAAiFPiKmeFhYWKRCLtt5KSkrhHW1ZWpqysrPYFlCQVFxcrFApp3bp1Sc9L5QwAAMQpcZfS2LVrV4cTAuKtmklSdXW1+vTpeGJJz549lZ2drerq6qTnpXIGAAACKxwOd7gdbXF26623KiUl5ai3LdYz95OAyhkAAIhTMC5Ce/PNN2vmzJlHjRk4cKDy8vK0Z0/HS7i0trZq//79yovj0jt+5WVxBgAAuoTevXurd+/ex4wrKipSbW2tNmzYoJEjR0qSXn31VcViMY0ZM+a4H9+vvBzWBAAAcYol6JYYZ599tiZNmqRZs2bpjTfe0F//+lfNmzdP06dPbz+j8sMPP9TgwYP1xhtvtP9edXW1ysvLVfHJRbD/9re/qby8XPv373fO64LFGQAA6HaefvppDR48WBMmTNAll1yiCy+8UA8//HD7zw8ePKitW7eqsbGx/b4lS5bo3HPP1axZsyRJ48aN07nnnqv/+Z//cc7rgsOaAAAgTsH4zplFdna2li5desSf9+/fX5/tcHnXXXfprrvuiiuvi8AuzvbXp6o15NZbzNIv87FV/Uzj+PZM97JqqN7Q01DSznr3npb9KjeZclflDHOOzd/3nin3mZY+ksaWFY1NtmLujh3u/edq692fE0lafqt77I032npl5tcaegmmp5ty6zDtRI7I0oxRUrQ1wxSf39N9nu9V2J7D+voz3YMNbTglW//LRx6x5b7jNvf3lIyKzbbkgwY5h6bedpspdcYnF990luK+31p6ZUpSv7u+7Z77rsdMuS0HlPpV2noHP7j2AufY+d9yf+30bDM2PkXgBXZxBgAAOouY/K90Je47Z0HHd84AAAAChMoZAACIU+f7zlmQsTgDAABxSsSlLzisCQAAgACgcgYAAOLEYU0/UTkDAAAIECpnAAAgTlTO/ETlDAAAIEConAEAgDhROfNTivfZxlFJFo1GFYlE9PHHdQqHw06/EwrI6baxblKItDzf1nZMxm5CSlWL7RcSxThwy75i3r+bmpxDq2pt7ZgyM21DsXSe+vhjW+7evd1jrc9hQrcPPsf63llZ6R7br/oN22AsvbusLwjLwIcOdQ6NRqOKnHyy6urcPzf9cugzW3pEku395NgaJX0nKfNKNipnAAAgTrRv8hOLMwAAECcuQusnUy158eLFGjZsmMLhsMLhsIqKivSnP/2p/efjx49XSkpKh9ucOXN8HzQAAEBXZaqcFRQU6J577tEZZ5whz/P05JNP6vLLL9dbb72lL33pS5KkWbNm6e67727/nYwMv49BAwCAYOGEAD+ZFmeXXXZZh3///Oc/1+LFi7V27dr2xVlGRobyDF+obG5uVnNzc/u/o9GoZUgAAABdynGfXtjW1qZnn31WDQ0NKioqar//6aefVk5OjoYOHaoFCxaosbHxqHlKSkoUiUTab4WFhcc7JAAAkBRtCbp1T+YTAv72t7+pqKhITU1NyszM1LJlyzRkyBBJ0je/+U2ddtppys/P16ZNm/SjH/1IW7du1R/+8Icj5luwYIHmz5/f/u9oNMoCDQAAdFvmxdlZZ52l8vJy1dXV6YUXXtCMGTO0Zs0aDRkyRLNnz26PO+ecc9S3b19NmDBB27Zt0+mnn37YfGlpaUpLSzv+GQAAgCTjO2d+Mh/WTE1N1aBBgzRy5EiVlJRo+PDh+tWvfnXY2DFjxkiSKioq4hslAABANxH3dc5isViHL/R/Wnl5uSSpb9++8T4MAAAILCpnfjItzhYsWKDJkyerX79+OnDggJYuXarS0lK99NJL2rZtm5YuXapLLrlEp5xyijZt2qSbbrpJ48aN07BhwxI1fgAAkHRchNZPpsXZnj17dM0112j37t2KRCIaNmyYXnrpJX3961/Xrl27tGrVKi1cuFANDQ0qLCzU1KlTddtttx3XwEK1+xWKtTrFxrKy3fPW2y7VEct07+dVX29KbWrLVltry52d5b5Tbyy3Hd0+b6jbdpGkHTtSTbmHDDL2ytyxwz22oMCW+5PKr4vGEReYUlu2Z76h1Z8kRVvdry1obQ0YzrS9We6vdd+3cpt3mnLH1M89eO1aU+4mw/bMqNhsym3pmbhps+21OWyo+/Z5eZUtd3GxKVx797rH5va2fggbxm7plSlJ1dXusVlZttzWeHRbpsXZo48+esSfFRYWas2aNXEPCAAAdDb01vTTcV/nDAAAAP6j8TkAAIgTJwT4icoZAABAgFA5AwAAcaJy5icqZwAAAAFC5QwAAMSJypmfWJwBAIA4sTjzE4c1AQAAAoTKGQAAiBPtm/wU2MVZLCtbsbBb66RQ7X7nvDvr3Vs9SVKBob2NtRVORYV77JmDEreTGrrJ/NOWLc6htfUJ7qtqaMm07m/ubY0k6eyh7i18wum27ZNh6ChTVW0rcOf33OMc25LVx5Tb0o5JsrURU2u6KXfI8sY9dqwpd0/3DmXSoEGm3BaWdkySTD3kiovdW9NJxudbUm5v91jrftWv8nX34MGDTblNLZaef96UeuPk/9c59ryC7rswQYAXZwAAoLOgfZOf+M4ZAABAgFA5AwAAceJsTT9ROQMAAAgQKmcAACBOVM78xOIMAADEiUtp+InDmgAAAAFC5QwAAMSJw5p+onIGAAAQIFTOAABAnKic+YnKGQAAQIAEtnIW+nCXQtFeTrGxgn7OeftVbjKNI1bg3huyttaU2tQvc2O5bR09YoR77LJlptSadqV7M87lt9pyXzDKFq/ycudQS69MSQrf9j334HvuMeXeVOHe59PaX/G9Cvd+mRHPlFq5zTttv2Dpl9nUZMttsXixKbz12rnOsam33WYbywMPOIe+vMr2urf0y/zWt0yptfR3tvj3KtzHfmb/FlPuB9e6v5bnZ9re8y29NS29MiXpvCWznWNjSx52jw1EnYXKmZ+CsEUBAADwicBWzgAAQGdB43M/sTgDAABx4iK0fuKwJgAAQIBQOQMAAHHihAA/UTkDAAAIECpnAAAgTlTO/ETlDAAAIEConAEAgDhROfMTlTMAAIAASfE8z9jAJbGi0agikYg+/rhO4bBbK5JQ7X7n/FVN2abx5OW5x4YSeE0Wa3uOvXvdY3v3to0ltG+Pc2xVq3srIUnKz7M9h41N7s9LRrpx+xjaCW3c4t6OSZKGunfAUuqO90y5N9af6RxrafN1PBL5mnh9rfu2v2CsbRw1e91zm1taFRQ4h1pf94l8vlVZaYs3zHN/rW2e2a3u70HKyTHlTiTL9gxVVznHRg8cUGTwYNXVuX9u+uXQZ7Y0TVKqz9lbJD2XlHklG4c1AQBAnOgQ4CcOawIAAAQIlTMAABAn2jf5icoZAABAgFA5AwAAcWqT//UeLqUBAACAAKByBgAA4kTlzE9UzgAAAAKEyhkAAIgTlTM/sTgDAABx4lIafgrc4uxQN6loNOr8OyFD7IFm25QzDF15gtS+6cAB99i0NNtYQobkB1rTTbmjGYlr39Takrj2TfX1rabUhl1WqfX1ptz19e7JLeM4Hol8TTQ0uG/7aNQ2jgMH3HOf2Gx4sf1zMM6hgWrfZHlTkUzzjEZt8+zZZhhLqt8thY6fqX2T4fmOfvIekdxujLb3wOTl7BwCtzg78MkOedpphUkeCQAAnceBAwc+6XP5xUlNTVVeXp6qq1clJH9eXp5SA7TA/qIErvF5LBZTVVWVevXqpZSUlPb7o9GoCgsLtWvXri7dAJV5dh3dYY4S8+xqusM8u9ocPc/TgQMHlJ+fr1Doiz/Pr6mpSS0tLQnJnZqaqvR02xGYriBwlbNQKKSCgoIj/jwcDneJF9OxMM+uozvMUWKeXU13mGdXmuMXXTH7tPT09G65gEokLqUBAAAQICzOAAAAAqTTLM7S0tJ05513Ks16amEnwzy7ju4wR4l5djXdYZ7dYY7o3AJ3QgAAAEB31mkqZwAAAN0BizMAAIAAYXEGAAAQICzOAAAAAoTFGQAAQIB0msXZokWL1L9/f6Wnp2vMmDF64403kj0kX911111KSUnpcBs8eHCyhxWX1157TZdddpny8/OVkpKi5cuXd/i553m644471LdvX5144okqLi7W+++/n5zBxuFY85w5c+bntu2kSZOSM9jjVFJSovPPP1+9evVSnz59NGXKFG3durVDTFNTk+bOnatTTjlFmZmZmjp1qmpqapI04uPjMs/x48d/bnvOmTMnSSM+PosXL9awYcPar5BfVFSkP/3pT+0/7wrbUjr2PLvCtkTX1CkWZ88995zmz5+vO++8Uxs3btTw4cM1ceJE7dmzJ9lD89WXvvQl7d69u/32l7/8JdlDiktDQ4OGDx+uRYsWHfbn9913n379619ryZIlWrdunU466SRNnDhRTU1NX/BI43OseUrSpEmTOmzbZ5555gscYfzWrFmjuXPnau3atXrllVd08OBBXXzxxWpoaGiPuemmm/Tiiy/q+eef15o1a1RVVaUrrrgiiaO2c5mnJM2aNavD9rzvvvuSNOLjU1BQoHvuuUcbNmzQ+vXrddFFF+nyyy/X22+/LalrbEvp2POUOv+2RBfldQKjR4/25s6d2/7vtrY2Lz8/3yspKUniqPx15513esOHD0/2MBJGkrds2bL2f8diMS8vL8+7//772++rra310tLSvGeeeSYJI/THZ+fpeZ43Y8YM7/LLL0/KeBJlz549niRvzZo1nuf9c9udcMIJ3vPPP98e8+6773qSvLKysmQNM26fnafned5Xv/pV7/vf/37yBpUgJ598svfII4902W15yKF5el7X3Zbo/AJfOWtpadGGDRtUXFzcfl8oFFJxcbHKysqSODL/vf/++8rPz9fAgQN19dVXa+fOnckeUsJs375d1dXVHbZrJBLRmDFjutx2laTS0lL16dNHZ511lq6//np99NFHyR5SXOrq6iRJ2dnZkqQNGzbo4MGDHbbn4MGD1a9fv069PT87z0Oefvpp5eTkaOjQoVqwYIEaGxuTMTxftLW16dlnn1VDQ4OKioq67Lb87DwP6UrbEl1Hz2QP4Fj27duntrY25ebmdrg/NzdXW7ZsSdKo/DdmzBg98cQTOuuss7R792795Cc/0Ve+8hVt3rxZvXr1SvbwfFddXS1Jh92uh37WVUyaNElXXHGFBgwYoG3btunHP/6xJk+erLKyMvXo0SPZwzOLxWK68cYb9eUvf1lDhw6V9M/tmZqaqqysrA6xnXl7Hm6ekvTNb35Tp512mvLz87Vp0yb96Ec/0tatW/WHP/whiaO1+9vf/qaioiI1NTUpMzNTy5Yt05AhQ1ReXt6ltuWR5il1nW2Jrifwi7PuYvLkye3/P2zYMI0ZM0annXaafv/73+u6665L4sgQr+nTp7f//znnnKNhw4bp9NNPV2lpqSZMmJDEkR2fuXPnavPmzZ3+O5HHcqR5zp49u/3/zznnHPXt21cTJkzQtm3bdPrpp3/RwzxuZ511lsrLy1VXV6cXXnhBM2bM0Jo1a5I9LN8daZ5DhgzpMtsSXU/gD2vm5OSoR48enztTqKamRnl5eUkaVeJlZWXpzDPPVEVFRbKHkhCHtl13266SNHDgQOXk5HTKbTtv3jytWLFCf/7zn1VQUNB+f15enlpaWlRbW9shvrNuzyPN83DGjBkjSZ1ue6ampmrQoEEaOXKkSkpKNHz4cP3qV7/qctvySPM8nM66LdH1BH5xlpqaqpEjR2r16tXt98ViMa1evbrD9wa6mvr6em3btk19+/ZN9lASYsCAAcrLy+uwXaPRqNatW9elt6skVVZW6qOPPupU29bzPM2bN0/Lli3Tq6++qgEDBnT4+ciRI3XCCSd02J5bt27Vzp07O9X2PNY8D6e8vFySOtX2PJxYLKbm5uYusy2P5NA8D6erbEt0Ack+I8HFs88+66WlpXlPPPGE984773izZ8/2srKyvOrq6mQPzTc333yzV1pa6m3fvt3761//6hUXF3s5OTnenj17kj2043bgwAHvrbfe8t566y1Pkvfggw96b731lvf3v//d8zzPu+eee7ysrCzvj3/8o7dp0ybv8ssv9wYMGOD94x//SPLIbY42zwMHDni33HKLV1ZW5m3fvt1btWqVd95553lnnHGG19TUlOyhO7v++uu9SCTilZaWert3726/NTY2tsfMmTPH69evn/fqq69669ev94qKiryioqIkjtruWPOsqKjw7r77bm/9+vXe9u3bvT/+8Y/ewIEDvXHjxiV55Da33nqrt2bNGm/79u3epk2bvFtvvdVLSUnxXn75Zc/zusa29Lyjz7OrbEt0TZ1iceZ5nvfQQw95/fr181JTU73Ro0d7a9euTfaQfDVt2jSvb9++Xmpqqnfqqad606ZN8yoqKpI9rLj8+c9/9iR97jZjxgzP8/55OY3bb7/dy83N9dLS0rwJEyZ4W7duTe6gj8PR5tnY2OhdfPHFXu/evb0TTjjBO+2007xZs2Z1uj8sDjc/Sd7jjz/eHvOPf/zD++53v+udfPLJXkZGhvfv//7v3u7du5M36ONwrHnu3LnTGzdunJedne2lpaV5gwYN8n7wgx94dXV1yR240be//W3vtNNO81JTU73evXt7EyZMaF+YeV7X2Jaed/R5dpVtia4pxfM874ur0wEAAOBoAv+dMwAAgO6ExRkAAECAsDgDAAAIEBZnAAAAAcLiDAAAIEBYnAEAAAQIizMAAIAAYXEGAAAQICzOAAAAAoTFGQAAQICwOAMAAAiQ/x9O/Sk1fK1Z9wAAAABJRU5ErkJggg==\n",
"text/plain": [
"