{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Convolutional Neural Networks\n", "\n", "This section covers some basics of convolutional neural networks (CNNs) in PyTorch, including the most important components of convolutional layers and associated operations (e.g. pooling). Some code in this notebook was adapted from [Dive Into Deep Learning, ch. 6](https://d2l.ai/chapter_convolutional-neural-networks/). The goal is to give an introduction to these operations so that you understand how to compose neural networks built from these operations.\n", "\n", "Another excellent resource is the visualizations in this [convolution arithmetic tutorial](https://github.com/vdumoulin/conv_arithmetic#convolution-animations)." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "id": "tqyGnmjo124l" }, "outputs": [], "source": [ "import torch\n", "import torch.nn as nn\n", "import torch.nn.functional as F\n", "import torch.optim as optim\n", "import torchvision.datasets as datasets\n", "from torchvision import transforms\n", "import torchvision.utils\n", "from tqdm import tqdm\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Convolutions for Images\n", "\n", "Convolutional layers are actually a misnomer, since the operations they express are more accurately described as cross-correlations. Here, we'll look at what the convolution (cross-correlation) operation looks like for a 2x2 convolutional kernel, shown below.\n", "\n", "Here, we show a fixed kernel; however, it's important to remember that when training a neural network, these kernels are *learned* via SGD (or another optimization method).\n", "\n", "\n", "\n", "\n", "\n", "Notice how the output is *smaller* than the input. This means that, over several successive layers of convolution operations, our tensors can shrink to size zero if we don't monitor their size or combat the shrinkage with pooling (see below).\n", "\n", "One of the most common applications for convolutional layers and convolutional networks as a whole is when dealing with image data. Typically our data is represented as 3 separate channels (RGB) each of which can be thought of as an array of pixel values. To help us uncover relationships between pixel values and extract various image features, we can use a 3 dimensional kernel to convolve over the various channels. Here is an example of a basic 2x2x2 convolutional kernel acting upon some input data.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Convolutional Layers\n", "\n", "A convolutional *layer* cross-correlates the input and kernel and adds a scalar bias (not shown above) to produce an output. The two parameters of a convolutional layer are the kernel and the scalar bias. You can see how these are stored in PyTorch layers in the example below. \n", "\n", "When training models based on convolutional layers, we typically initialize the kernels randomly, just as we would with a fully-connected layer.\n", "\n", "The convolutional layer output is sometimes called a *feature map*, as it can be regarded as the learned representations (features) in the spatial dimensions (e.g., width and height) to the subsequent layer. In CNNs, for any element $x$ of some layer, its receptive field refers to all the elements (from all the previous layers) that may affect the calculation of $x$ during the forward propagation. Note that the receptive field may be larger than the actual size of the input.\n", "\n", "In practice, our convolutional layers are composed of many kernels \"stacked\" on top of each other; the depth of these stacks corresponds to the `out_channels` argument in PyTorch's `Conv2D` layer." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Padding\n", "\n", "One tricky issue when applying convolutional layers is that we tend to lose pixels on the perimeter of our image. Since we typically use small kernels, for any given convolution, we might only lose a few pixels, but this can add up as we apply many successive convolutional layers. \n", "\n", "One straightforward solution to this problem is to \"pad\" the inputs before applying convolution: add extra pixels of filler around the boundary of our input image, thus increasing the effective size of the image. Typically, we set the values of the extra pixels to zero. \n", "\n", "In the figure below, we pad a $3×3$ input, increasing its size to $5×5$. The corresponding output then increases to a $4×4$ matrix. The shaded portions are the first output element as well as the input and kernel tensor elements used for the output computation: $0×0+0×1+0×2+0×3=0$ .\n", "\n", "\n", "\n", "\n", "In general, if we add a total of $p_h$ rows of padding (roughly half on top and half on bottom) and a total of $pw$ columns of padding (roughly half on the left and half on the right), the output shape will be\n", "\n", "\\begin{equation}\n", "(n_h − k_h + p_h +1)×(n_w − k_w + p_w + 1).\n", "\\end{equation}\n", " \n", "This means that the height and width of the output will increase by $p_h$ and $p_w$, respectively, relative to the output size without padding. Note that $n_h$ and $n_w$ are the input height and width; $k_h$ and $k_w$ are the kernel height and width.\n", "\n", "In many cases, we will want to set 𝑝ℎ=𝑘ℎ−1 and 𝑝𝑤=𝑘𝑤−1 to give the input and output the same height and width. This will make it easier to predict the output shape of each layer when constructing the network. Assuming that 𝑘ℎ is odd here, we will pad 𝑝ℎ/2 rows on both sides of the height. If 𝑘ℎ is even, one possibility is to pad ⌈𝑝ℎ/2⌉ rows on the top of the input and ⌊𝑝ℎ/2⌋ rows on the bottom. We will pad both sides of the width in the same way.\n", "\n", "CNNs commonly use convolution kernels with odd height and width values, such as 1, 3, 5, or 7. Choosing odd kernel sizes has the benefit that we can preserve the spatial dimensionality while padding with the same number of rows on top and bottom, and the same number of columns on left and right." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Stride\n", "\n", "When computing the cross-correlation, we start with the convolution window at the upper-left corner of the input tensor, and then slide it over all locations both down and to the right. In previous examples, we default to sliding one element at a time. However, sometimes, either for computational efficiency or because we wish to downsample, we move our window more than one element at a time, skipping the intermediate locations.\n", "\n", "We refer to the number of rows and columns traversed per slide as the stride. So far, we have used strides of 1, both for height and width. Sometimes, we may want to use a larger stride. The figure below shows a two-dimensional cross-correlation operation with a stride of 3 vertically and 2 horizontally. The shaded portions are the output elements as well as the input and kernel tensor elements used for the output computation: 0×0+0×1+1×2+2×3=8 , 0×0+6×1+0×2+0×3=6 . We can see that when the second element of the first column is outputted, the convolution window slides down three rows. The convolution window slides two columns to the right when the second element of the first row is outputted. When the convolution window continues to slide two columns to the right on the input, there is no output because the input element cannot fill the window (unless we add another column of padding).\n", "\n", "\n", "\n", "In general, when the stride for the height is 𝑠ℎ and the stride for the width is 𝑠𝑤 , the output shape is\n", "\n", "\\begin{equation}\n", "\\lfloor (nh−kh+ph+sh) / sh \\rfloor \\times \\lfloor (nw−kw+pw+sw) / sw \\rfloor\n", "\\end{equation}\n", "\n", "\n", "If we set 𝑝ℎ=𝑘ℎ−1 and 𝑝𝑤=𝑘𝑤−1 , then the output shape will be simplified to $\\lfloor (nh+sh−1)/sh \\rfloor \\times \\lfloor (nw+sw−1)/sw \\rfloor$ . Going a step further, if the input height and width are divisible by the strides on the height and width, then the output shape will be $(nh/sh)×(nw/sw)$.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Pooling\n", "\n", "Often, as we process images, we want to gradually reduce the spatial resolution of our hidden representations, aggregating information so that the higher up we go in the network, the larger the receptive field (in the input) to which each hidden node is sensitive.\n", "\n", "Like convolutional layers, pooling operators consist of a fixed-shape window that is slid over all regions in the input according to its stride, computing a single output for each location traversed by the fixed-shape window (sometimes known as the pooling window). However, unlike the cross-correlation computation of the inputs and kernels in the convolutional layer, the pooling layer contains no parameters (there is no kernel). Instead, pooling operators are deterministic, typically calculating either the maximum or the average value of the elements in the pooling window. These operations are called maximum pooling (max pooling for short) and average pooling, respectively.\n", "\n", "In both cases, as with the cross-correlation operator, we can think of the pooling window as starting from the upper-left of the input tensor and sliding across the input tensor from left to right and top to bottom. At each location that the pooling window hits, it computes the maximum or average value of the input subtensor in the window, depending on whether max or average pooling is employed.\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": { "id": "OWXVNd-6125L" }, "source": [ "# Convolution In A Neural Network\n", "\n", "Below is an implementation a simple convolutional network We use `torchinfo-summary()` to view the size of the data as it flows through the network; additionally, we print and the size of the weights and biases of the layers during a forward pass. (You won't normally need to access the weights/biases directly when training models in PyTorch; this is purely for illustration.)\n", "\n", "Next, we'll compare this simple CNN with a fully-connected network, to see how we benefit from using convolution during training. We construct a similar, densely-connected network with around 2x the parameters of our CNN." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Khtuz5gE125M", "outputId": "cf02949f-9ebd-4f58-a7f9-4d0449eecb4e" }, "outputs": [ { "data": { "text/plain": [ "==========================================================================================\n", "Layer (type:depth-idx) Output Shape Param #\n", "==========================================================================================\n", "├─Conv2d: 1-1 [64, 16, 28, 28] 160\n", "├─MaxPool2d: 1-2 [64, 16, 14, 14] --\n", "├─Conv2d: 1-3 [64, 32, 12, 12] 4,640\n", "├─MaxPool2d: 1-4 [64, 32, 7, 7] --\n", "├─Conv2d: 1-5 [64, 64, 7, 7] 2,112\n", "├─Conv2d: 1-6 [64, 4, 3, 3] 6,404\n", "├─Flatten: 1-7 [64, 36] --\n", "├─Linear: 1-8 [64, 10] 370\n", "==========================================================================================\n", "Total params: 13,686\n", "Trainable params: 13,686\n", "Non-trainable params: 0\n", "Total mult-adds (M): 0.93\n", "==========================================================================================\n", "Input size (MB): 0.20\n", "Forward/backward pass size (MB): 10.41\n", "Params size (MB): 0.05\n", "Estimated Total Size (MB): 10.67\n", "==========================================================================================" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from torchinfo import summary\n", "\n", "class ConvNet(nn.Module):\n", " def __init__(self):\n", " super().__init__()\n", " \n", " self.conv1 = nn.Conv2d(1, 16, 3, 1, 1) # in_channels, out_channels, kernel_size, stride, padding\n", " self.max1 = nn.MaxPool2d(2, 2, 0) # kernel_size, stride, padding\n", " self.conv2 = nn.Conv2d(16, 32, 3, 1, 0)\n", " self.max2 = nn.MaxPool2d(2, 2, 1)\n", " self.conv3 = nn.Conv2d(32, 64, 1, 1, 0)\n", " self.conv4 = nn.Conv2d(64, 4, 5, 1, 0)\n", " self.flatten = nn.Flatten()\n", " self.linear1 = nn.Linear(36, 10)\n", " \n", " @property\n", " def trainable_layers(self):\n", " \"\"\"A utility property to easily access a list of all model layers.\"\"\"\n", " return [self.conv1, self.conv2, self.conv3, self.conv4, self.linear1]\n", " \n", " def forward(self, inputs):\n", " \"\"\"Implements the forward pass.\"\"\"\n", " x = self.conv1(inputs)\n", " x = self.max1(x)\n", " x = self.conv2(x)\n", " x = self.max2(x)\n", " x = self.conv3(x)\n", " x = self.conv4(x)\n", " x = self.flatten(x)\n", " x = self.linear1(x)\n", " return x\n", "\n", " def print_weight_shapes(self):\n", " \"\"\"Utility function to print the shapes of weights in trainable layers.\"\"\"\n", " for layer in self.trainable_layers:\n", " print(f\"Weight shape: {layer.weight.shape}; Bias shape: {layer.bias.shape}\")\n", "\n", "conv_net = ConvNet()\n", "batch_size = 64\n", "summary(conv_net, input_size=(batch_size, 1, 28, 28))\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "id": "pm6h6wUE3spR" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Weight shape: torch.Size([16, 1, 3, 3]); Bias shape: torch.Size([16])\n", "Weight shape: torch.Size([32, 16, 3, 3]); Bias shape: torch.Size([32])\n", "Weight shape: torch.Size([64, 32, 1, 1]); Bias shape: torch.Size([64])\n", "Weight shape: torch.Size([4, 64, 5, 5]); Bias shape: torch.Size([4])\n", "Weight shape: torch.Size([10, 36]); Bias shape: torch.Size([10])\n" ] } ], "source": [ "conv_net.print_weight_shapes()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "==========================================================================================\n", "Layer (type:depth-idx) Output Shape Param #\n", "==========================================================================================\n", "├─Linear: 1-1 [64, 16] 12,560\n", "├─Linear: 1-2 [64, 10] 170\n", "==========================================================================================\n", "Total params: 12,730\n", "Trainable params: 12,730\n", "Non-trainable params: 0\n", "Total mult-adds (M): 0.01\n", "==========================================================================================\n", "Input size (MB): 0.20\n", "Forward/backward pass size (MB): 0.01\n", "Params size (MB): 0.05\n", "Estimated Total Size (MB): 0.26\n", "==========================================================================================" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class FCNet(nn.Module):\n", " def __init__(self):\n", " super().__init__()\n", " \n", " self.fc1 = nn.Linear(28 * 28, 16)\n", " self.fc2 = nn.Linear(16, 10)\n", "\n", " def forward(self, x):\n", " x = torch.flatten(x, 1) # flatten all dimensions except batch\n", " x = F.relu(self.fc1(x))\n", " x = F.relu(self.fc2(x))\n", " return x\n", "\n", "\n", "fc_net = FCNet()\n", "summary(fc_net)\n", "summary(fc_net, input_size=(batch_size, 1, 28,28))\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "s_0maSFi124x" }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQEAAAEICAYAAABf40E1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAACZGElEQVR4nOxdd1hU19N+zzZYepVeBRURQexdY+9doyb2lliiJkZ/0RSTmNiiRpNYYqIxlthR7L0hoogKShOkSEfaUrYz3x/AfqiowF40mn2fZx6WW2bOuWXunDlzZhgRQQcddPjvgvemG6CDDjq8WeiUgA46/MehUwI66PAfh04J6KDDfxw6JaCDDv9x6JSADjr8x6FTAnUExthYxtgZjnhdYoxNqcV5rowxYowJuGjHK2TVqo0v4NWeMfaQMVbEGBtcxf4HjLEuXMjSQacEXojyhzqPMaZXm/OJaBcR9eS6Xa8T5QrE4w2I/hbAL0RkREQBz+4kIm8iuvTaW/WOQqcEqgBjzBVARwAEYOCbbc1/Ei4AHrzpRvxXoFMCVWMcgBsAtgMY/7IDGWMTGGOPGGOFjLEExtjYStuvVTqOGGMzys3cfMbYr4wxVr6Pzxj7iTH2pJzHrJeZ8YyxSYyxqHJL5TRjzOUV/ZnEGEtjjKUzxj6rxKcVYyy4vD3pjLFfGGOi8n1Xyg+7V26WjyrfPogxdpcxJmGMxTPGeleS48IYCyq/FmcYY1YvuW5TGWNxjLFcxthRxph9+fZ4AO4AAsvlPmeJMcYSGWPdy39/wxjbzxjbWS43gjHWgDH2P8ZYFmPsMWOsZ6VzJ5Zfu8Ly+zb9Gd6fl1+LNMbYlMrWEGNMjzG2mjGWzBjLZIxtYoyJy/dZMcaOlV/LXMbYVcbY2/F+EZGOniEAcQA+BtAcgBKAzQuOMwQgAdCw/H87AN7lvycAuFbpWAJwDIAZAGcA2QB6l++bASASgCMAcwDnyo8XlO+/BGBK+e9B5e3zAiAAsATA9Re0z7Wcz57ytvqUy+1evr85gDblfFwBRAGY+0ybPSr93wpAAYAeKPuAOABoVKmN8QAaABCX/7/8Be16D8ATAP4A9ABsAHCl0v7Eija+4HzNfgDfAJAB6FXejx0AEgAsBiAEMBVAQqVz+wGoD4AB6AygBIB/+b7eADIAeAMwALCz8jUAsBbAUQAWAIwBBAL4sXzfjwA2lcsUosySZG/6Wa7W8/6mG/BvIwAdUPbiW5X/Hw1g3guONQSQD2AYAPEz+ybgeSXQodL/+wAsKv99AcD0Svu648VK4CSAyZWO5ZU/yC5VtM+1nE+jSttWAvjjBf2ZC+DwM22urAQ2A1j7gnMvAVhS6f+PAZx6wbF/AFhZ6X+j8mvuWv5/TZXA2Ur7BgAoAsAv/9+4vB9mL+AVAOCT8t9/VrzU5f97VFwDlCmNYgD1K+1vi3IFgzI/xpHK1+ttobfDXHm9GA/gDBE9Kf9/N14wJCCiYgCjUPYlT2eMHWeMNXoJ74xKv0tQ9vADgD2Ax5X2Vf79LFwA/FxuduYDyEXZA+rwknMq80sql4dys/kYYyyDMSYB8AOAF5rwAJxQ9rV/EV7Uv2dhX94OAAARFQHIwcv78DJkVvotBfCEiNSV/kdFWxhjfRhjN8pN9nwAffH/fX7ZfbBGmXVwu9K1P1W+HQBWocxCO1M+zFhUy768duiUQCWUj+9GAuhc/mJkAJgHwJcx5lvVOUR0moh6oGwoEA3g91qITkfZUKACTi859jHKrAazSiQmousvOacyP2cAaeW/N5a32ZOITAB8gTKF8jLZ9V+yv7pIQ5kyAwAwxgwBWAJI5YD3C1HuXzgIYDXKhnhmAE7g//v8svvwBGUKxbvSdTclIiMAIKJCIvqUiNxR5kyezxjrVpf94Qo6JfA0BgNQA2gMwK+cvABcRZmz8CkwxmzKHWWGAOQoM0NLayF3H4BPGGMOjDEzAAtfcuwmAP9jjHmXt8GUMTbiFfy/ZIwZlJ8zEcDe8u3GKPNpFJVbMB89c14mypx0FfgDwETGWDfGGK+8vS+zfF6EPeV8/MpfzB8AhBBRYi141QQilPkgsgGoGGN9AFSext1X3i4vxpgBgC8rdhBRKcoU/FrGWD0AKO9/r/Lf/RljHowxhjK/iRq1exZeO3RK4GmMB7CNiJKJKKOCAPwCYGwV3noegPko+7LloszR9OyLVB38DuAMgHAAd1D2dVKh7EF6CkR0GMAKAP+Um/D3AfR5Bf/LKDNVzwNYTUQVQUyfARgDoLC8DXufOe8bAH+Vm78jiegmypTIWpQ96JdR6YteXRDROZS9YAdR9vWtD+D9mvKphdxCAHNQ9rLnoazvRyvtPwlgPYCLKLteN8p3ycv/LqzYXn7tzwFoWL7Ps/z/IgDBAH4joot12R+uwMqdGjr8i1D+hdpERDV+wXTgDowxL5QpWT0iUr3p9tQVdJbAvwCMMTFjrC9jTMAYcwDwNYDDb7pd/0UwxoaUxwOYo8ziCnyXFQCgUwL/FjAAS1Fmot5B2Xz9V2+0Rf9dTAeQhbJZEDVqN7x7q1Bnw4HySLKfAfABbCWi5XUiSAcddNAKdaIEGGN8ALEoiyxLAXALwGgiiuRcmA466KAV6mqJaSsAcUT0CAAYY/+gLNy1SiXAGNN5J3XQoe7xhIisn91YVz4BBzwdbZWCZ6LBGGPTGGOhjLHQOmqDDjro8DSSqtpY58kmXgQi2gJgC6CzBHTQ4U2irpRAKp4OuXREHYeE6qDDvwWMMfTo0QNWVlYIDw/H/fv333STXo66WJWEMuXyCIAbykI176F8ie0LjqfakJOTE40dO5aWLFlCnp6eteKhIx1xTT179qT4+HjKy8ujsWPHvvH2VKLQKt+/ulqeiLLVWbEom29d/Ipja9whsVhMCxYsoEePHpFCoaCffvqJXF1d3/RF1tF/mMzMzGjcuHEUGhpKCoWCAgMDqV69em+8XZXo9SqBGiqMGneoefPmdOnSJVIoFKRSqSgrK4vWrFnD+YUzNTWlTz75hLZv305NmjQhPT29N30j3xlq0qQJ/fXXX7Rv3z4yMjJ64+3RhhwdHWnFihWUkJBARUVFtHv3bvLy8tKab79+/ejUqVP03nvvcdHOd0cJ2NnZ0aZNm6ikpIRUKhWpVCq6efMmjRo1itMba2RkRHPmzKGsrCySyWR09epVunnzJn333Xe0ZMkSev/998nQ0JAzeU5OTvTrr79SXFwcXb58mZo0aULlTlPOSCQS0SeffPLGzVRTU1M6dOgQSaVSSklJIW9v7zfaHm3I3Nycli1bRtnZ2VRcXExr164la2trTnjfuXOHSkpKaOHChVzwezeUAJ/Pp/79+1NsbCypVCpSKpWkVCpp4sSJJBAIOLuxQqGQRo0aRbm5uaRSqUitVmtkSaVSkkqlJJFI6NChQ2RiYqK1PCsrK9qwYQPJZDKNrC+++ILEYjGnD6yBgQEFBATQ+vXrn9tna2tL+/btoz59+tTpS+Pk5EQPHjwguVxOEomEjh07RjweT2u+PB6PXFxc6Pvvv6eIiAgqKCig/Px8OnXqFG3dupUcHR0574uBgQF98cUXJJVKKSkpidasWUPm5uac8U9MTKT8/Hxq2rQpF/zeDSVQr149WrduncYCyMvLo3nz5pFQKOT05pqamtLatWs1CqAyqVQqUigUVFxcTKGhoWRjY6OVLD6fTwMGDCClUkmFhYWUkZFBJSUllJiYSI6OjpxaAyYmJhQREUHff/99lft/+eUX2rlzJ+cvSwU1bNiQTpw4QTKZjEpKSqh///5a908kElGfPn0oJCSEcnJyqKioiGJjY+n8+fMUHx9PBQUFpFAoKDs7m1MHsomJCc2dO5ckEgkVFRXR/PnzObUMAdCjR48oPz+fGjZs+MJjBAIBNW/enLp06fIqC+TtVwKGhoa0ZMkSys/PJ5VKRXK5nFauXMnJl7gy8fl8+uSTT6iwsFDz4isUCsrLy6PU1FSKjY2lPXv20IgRI6hFixYkEom0klevXj1KSEggiURCa9eupY4dO9LRo0dJKpXS3LlzqUWLFpz1zdfXl548eUITJ06scv/06dPp2LFjnF7PyjRo0CCKj48npVJJ69at00oB8Hg8cnNzo9WrV9OTJ0/o4cOHtGPHDhoyZIjma2xpaUn169en4OBgUiqVtHXrVk78OmZmZjR//ny6f/8+5ebm0g8//EBWVlacX6/Dhw9TcXExffLJJ1XuNzY2pnnz5tGVK1do586d1KhRo5fxe7uVAI/Ho86dO1N6errGCggJCaEOHToQn8/n9MKbm5vTvXv3nvr6Z2Rk0IoVK6h3797k4+PDmSzGGA0ePJiKi4spLCyMBgwYQAYGBjR16lRKS0sjtVpNoaGhnMlau3YtJSQkVNkHPp9PBw4coD179nD+MANlQ54dO3aQTCaj+Ph48vPz04qfu7s7nT17lhQKBZ05c4Zat279wvt59uxZUqlUdOvWLa1fVqFQSIsWLaK0tDTKyMigNWvWkK2tbZ1cs88++4ykUmmVlpuFhYXGGfkipf4Mvd1KwMDAgMLCwjQKIC0tjT788EOtv8JVUb9+/aikpOQpJSCRSGjfvn20bt06mjFjBjVt2pSTLwqfz6czZ85QdnY2zZs3j6ytrWnixIl08+ZNjX/gxIkTnPTLxMSErly5QtevXycLC4vn9tvZ2VFGRgb99ddfnF9XExMT+vzzzykzM5MkEgktXrxYaxkffvghZWZmUkJCArVq1arKY8RiMc2ZM4eKiopIoVDQhx9+qHVfBg0aRNnZ2ZSdnU1ff/11nVgAFdSpUyfKzs6m48ePP+XTMDIyok8++YRycnLo888/J2Nj4+rwe7uVgJGRkUYByGQy2rx5M9na2hKPxyNTU1OysLAgc3NzTpyDixYtes4P8KxCOHv2LCfjS319fUpJSaGUlBSaMmUKzZ49myIjIykpKUkz+/Hxxx9z8kCNGjWKJBIJLViwoMr97du3p+LiYjp69Ch9+umn1LhxY84e5latWtGNGzdIrVbT0aNHOfGeVyiBvXv3PudY5PP5ZGtrSzNmzKDo6GhSKpV06dIlrb7YPB6PWrRoQZGRkVRcXEw//fQTOTg4aPYbGxuTu7s7devWjUaMGEG9e/cmFxcXrZyeenp6dOLECcrLy6NvvvmGrKysSCgU0uDBgyk6OpoCAgLIzMysuvyqVAJvbO2ANkhKSsKJEydga2uLXr164b333oOBgQFUKhWOHDmCf/75Ryv+58+fR5MmTdCsWTM0avR8Hk1DQ0N07twZX3/9NdatW4fQ0NqvgbK0tIRIJIKBgQEmT56MR48eYePGjRCJRJg3bx709PRw8eJFbbqjQaNGjSASidCsWTPMnj0bT548eWp/nz59IBQK4eXlBYVCwYlcPp8Pd3d3DB48GD4+PkhMTMS2bduQn5+vNW8AICI0adIEAwcORFxcHPLy8uDs7IyWLVuiffv2aNeuHWxtbcEYw99//42MjIxXM30BPDw8sHz5cri5ueHixYtYs2YNUlNTIRAI4OPjg3HjxsHLywt2dnbIzMyEjY0NIiMjsWbNGty6datWMuVyOdauXQsHBwdMmjQJHh4eyMjIQPv27WFvb48HDx6gffv2cHd3R0lJCRISElBaWor4+Hg8fvyyzPWV8KatgOpaAm3atHlqRuDWrVt09+5devz4McnlciotLSWlUkkJCQlVTn/VhBhj5OjoSH5+ftSlSxeaMWMGbd26leLi4jSyKiyCxYsXayXLwMCANm3aRHfu3KEDBw5Q9+7dSV9fn2bOnElZWVm0evVqznwe7u7utG/fPrpx4wZlZWVRUlLSU1RYWEiJiYk0atQo8vDw4GS4IxKJaPjw4fTo0SMqLi6m5cuXc2Y++/j40MmTJ6mkpITi4+Ppzp07FBwcTGFhYRQeHk67d++mW7dukVwup+TkZK2i90QiEc2ZM4ckEgnl5ubS8OHDiTFGIpGIBgwYQBcvXqSsrCxKT0+nr7/+mlq1akWzZs2i3Nxcref4hUIhdezYkQ4dOkSpqalUVFREEomEkpOT6cGDB3Tu3Dm6efMmXb9+nU6fPk2BgYE0dOjQalsCb1wBVFcJrFixQqMEqqKKqTuVSkXXrl3j5CGrID09PTI3NycnJycaP348ZWdnk1qt1jzU2vI3NzcnBwcHsra2JqFQSI6OjhQQEEByuZyTqLPKZGVlRY6OjtS2bVvq2bMneXh4kIeHB82bN49yc3NpxowZnE63mpub099//00KhYIuXbpELVq04GzKUyAQkI+PDy1atIgmT55MGzZsoAkTJlCfPn3IxcWFGjVqRKdOnSKFQkFLlizRSm7btm3p3r17pFQqadCgQaSvr0+GhoY0a9YsSkpKouzsbJo/fz55enqSkZER8fl8+uWXXygtLY1GjBihdV95PB45ODjQ119/Tbm5ubRs2TLy8vIiZ2fn58jJyelFPoK3VwmIRCLasWNHlS+/VCqluLg4ysjIIKVSSSqVimJjY6lLly6cvjwVJBaL6cCBA6RUKqmoqIh+/PFHzmWMGzeOkpOTKS4uTusYhBcRY0wzVhUIBLRr1y66e/dudR1M1ZbRtWtXksvlVFJSQlu3bn1qDM2VDKFQSAKBgPT09EggEGj6NXDgQIqNjaXc3Fytr2PXrl0pISGB1Go1OTg4kEgkosmTJ1N+fj6Fh4fTsGHDyMDAgIAyf8SYMWMoPT2dfvnll5qM2V9KNjY2tHnzZjp48GBt/VFVKoG3ItGoWCyGnZ3dU9uICIGBgZg/fz46dOiAO3fuaPbp6+s/dzwX4PF4+OCDD9CzZ08wxpCRkYETJ05wKsPe3h49e/aEjY0NtmzZgoKCAk75V4CIUFpaVhvD0tISDRo0wJkzZyCTyTiTIRKJMGDAAPD5fMTExGDfvn1ajcmrAhFBqVRCpVJBLpdDpVKhtLQUjDF06NABTk5O2LNnDyQSidZyKsjLyws///wz1qxZg4SEBHz77bcIDAyEjY0NevTogR07dmDLli2Ijo7Gt99+y4n/QyAQoGPHjhg2bBjS09M586kAQJ193bkeDgwZMuQpCyA5OZm2bNlCly9fJqlUSqWlpZp9ly5d4vRLIxKJyNLSkvr27UthYWGa0OElS5Zw+lXT09Ojjz/+mHJycigqKoqrUNFX0pQpUygiIoLz+P2uXbtSTk4OqVQqOnDgQJXTknVF3t7edObMGZLL5TR06FCt/SouLi504sQJkkgkVFBQoLFCr127Rlu2bKFdu3ZRUFAQpaen0507d+iLL77g1IozMTGhFStWUGhoKHXs2LG2fN7u2YHTp08jNjYWTk5OEIvFsLe3x6RJkwBA81WTSqV4/Pgxrl69WisZBgYG0NfXR1klKUAoFMLJyQmNGjXCgAED0LNnTxgbG0MqlSI4OBg7duzgrH8AYGFhAT8/P5iZmeHEiRPIzMx89UlawtjYGL1790ZERARSU7nN+9KxY0eYmJjgyZMnCA4ORm5uLqf8XwSBQIA+ffqgY8eOuHfvHu7fvw+1+rliTjVCUlIShg4dim+++QZz5syBXC5Hfn4+nJ2dYWFhAZlMht27d+P+/fu4evUqiouLOepNGaytrdG5c2fcvn271jMNL8JbowRkMhmmTJmCadOmoUuXLnB0/P+6kenp6cjMzERwcDACAgJw+/btWsno0qULunbtCoGg7LKYmJigY8eOsLOzg4GBAQAgNzcX58+fx7x585Cenq59x8qhp6eHzp07o2fPstJ4ISEhdTYUqIzu3bvD1dUVS5YsQWFhIWd8HRwc0KZNGxARoqOjceTIEc54vwrOzs5o27YtiAi///47kpKqTK1XY8hkMixduhQmJiaQyWSIiIiATCbDw4cPkZWVhezsbEil0lczqiH4fD5at24NW1tbrF+/HnK5/NUn1QBvjRIoLS3FjRs3kJSUhM6dO6Nx48YAyqyAhw8fIi4uDrdv39bqArVt2xYff/wx9PX1q9yfnZ2NPXv2YOvWrZwqAAAwMjJCx44d4eT0soLE3EIsFqNt27aIiopCRESE1l/Lyhg1ahQ6duwIIkJxcfFzMQl1BcYYGjVqhPbt2yM4OBghISFQKBSc8ZdKpfj4448541cd8Pl8eHh44P79+zh79mzFEJozvDVKAChTBKmpqdi9e3ed8D927BgKCgrQuXNnODg4wNfXF1lZWbh79y7u3buHsLAwhISEIDk5mXPZJSUliIuLAwBkZmYiJSUFSqWSczmVYWFhAWtra5w5c4Zzh51cLoe+vj7i4+Nx4sQJzs3jF0FfXx+enp6wsrLCpUuXEBcXx/lL8yagVquRkZGB7Oxsznm/VUqgrnHz5k3cu3cPhw4dgpGREaysrCCVSpGdnY0nT56goKCgzh4ouVyOsLAwnDt3TvMF4/LLXBV4PB7S0tLw+PFjzmXt3bsXkZGRkEgkiI+Pr3OFVgEzMzO0bt0ajDGUlJS8Nrl1CaVSiV27dkEsFteNgDc9M1Dd2YH/Aunr65OtrS2ZmJhwnlGoKhIIBGRhYUH6+vpvvO9ckYODAx08eJDi4uJo0KBBr+U6vkVU5ezAv6I0ua7ugA5cgTEGAwMD8Hg8SKVSqFTvdEHhmuI2EbV4dqNuOKDDO4UKR6QO1cdbETGogw461B10SkAHHf7j0CkBHXT4j0OnBP6jcHFxwcSJE9G4cWNNmHRdgTEGsVgMU1PTp8Kydfh3QOcY/A9CX18fffr0wXfffYedO3dixYoVnAcLVcDR0RFdu3aFr68v7OzsEB0djYMHDyImJqbO4yB0qB50SuAlMDY2RocOHWBvbw9TU1O4uLhApVLhwYMH2LVrF+cx3K8LJiYm6NWrF8zNzTF8+HA8evQI27dv53TtAADUr18fP//8M5o0aQJLS0uIxWLk5+fjvffew4IFC3D79u13IpoPKFu01KVLFzRs2BCBgYFaRZU2bNgQbdq0gVgsRt++fSESiZ47JjQ0FCkpKUhNTcXt27eRm5tb+2XgbzpQ6N8YLMTj8ahfv360ceNGSk1NpezsbMrNzaXi4mIqKiqirKws2rBhwxtvZ23JycmJ7t69q6ngdOfOHfL39+c0sMbR0ZGCgoJIJpORQqGggoICyszMpMzMTCosLKTr169zlmzjTZJQKKQOHTrQ5s2bKTo6mrKzs+mrr77Saumym5sb/fTTT/T48WNSKpUvTHabnZ1NqampFBMTQ+PGjdM8u4aGhi9KDff2ZhZq3rw5RUREUGxsLI0fP568vLyoVatW1Lx5c/L19SVPT0/y8PAgPz8/GjNmjNY3tmPHjpr6g89e/Ir8gvHx8bV+iF1cXOj3338nX1/fVx7r7+9Pa9eupdTUVFq+fLnW0X2MMWrVqhUlJCRQXl6eprDKrVu3OK2gO2zYMCopKaHg4GDavHkz+fv7k5mZGZmZmdHChQspJydH6+Ij1SUPDw/q3Lkzffzxx/Tpp5/Sp59+SuPGjSNvb+9a30M+n0+9evWia9euUX5+PslkMk2au4iICBo4cGCt28vj8Wjs2LGaXAwVeTV3795NZ8+epYKCgqeqYVXU4DA3Nycej0disfhF6dzfTiXQt29fkkgkmk4XFxdTZmYmFRUVUW5uLkmlUk2NwOLiYpowYYLWD824ceM08kpKSujgwYM0d+5cio6OptLSUiotLSW5XE6DBg2qMW9TU1P666+/qKioiGbOnFllOmrGGJmamtJ7771HERERpFQqSaFQUEREBCepug0MDKh58+bUpEkT2rVrFxUVFZFSqaS2bdty9lLOmDGD5s+fT0Kh8DmeLVq0oMePH1NOTg65u7tz/tILhUJq1aoVbdq0ie7du0cFBQVUVFREhYWFT1FBQQElJibSnj17yN7evsb38dq1a5SRkUG3b9+mgwcP0rhx4+j777+n48eP05UrV2rdfkNDQzp06JCmVNvixYvJ0NCQeDweCYVCMjQ0JG9vbxo8eDD99ttvGgUUERFBpqamL+P9diqBlStXUlFRERUVFWm+xFVRhYnUqVMnrR+i1atXU2lpKUkkEvr555/J2tqaWrRoQWFhYU8pgcGDB9eYd7du3TQv9qxZszRKoCKDkbGxMfXu3Zv++ecfys7O1tzg4uJi2rx5M+cFSlu0aEHHjx+n4uJiCg8Pf20mekxMDCmVSmrSpAlnPBlj1LBhQ/r1118pKSmJoqOjafv27ZpiMSKRqEqqX79+jS0sgUBAfn5+LyypPnv27FoPCczNzenSpUukVCpfmb2Kz+dTZmYmqVQqiomJqZUS+Nc7Bh88eICAgAAkJydj9OjRsLS0BI/HQ1FREVQqFRQKBRwcHCAQCBAaGoorV65oJc/IyAj9+vUDEUFPTw+enp6oX78+evfuDRcXlwqlpcksU1M0atQI1tbWAMqW8jLGYGdnBwsLC02u/GHDhgEALl68iPr168Pb2xtSqRRXrlzhPGnFnTt3cPDgQfj6+qJRo0bo1q0bDh48yKmM14WKac+2bdvit99+w969e5GcnKzJpfgixMfH11iWSqXC3bt3q9xnYWGB2bNn49SpU3j48GGNeevr60MoFAIANm7c+NJj27ZtCz09PUilUly/fr1Wzup/vRL466+/8Ndff4HP5+PmzZto06YN9PX1ERkZifz8fBQUFGDr1q2wt7d/KtlobVGRLio6Ohp8Ph9dunSBs7MzjIyMIBKJoFKpIBAIcPXq1VopnMePH6OgoACWlpYYPXo0oqOjMXDgQLi7u8PPzw9yuRwxMTG4fPkydu7cia+//hre3t7IyMjgrAhJBczNzdGmTRu0a9cOYrEYfD4fenp6nMp4HRAIBPD19cXkyZNx69YtHD16FLdu3Xpjy4grirgUFRXV6nwTExPw+XwAqHJmAPj/hVILFiyAgYEBwsLCsHDhwlrNEPzrlUAF1Go1AgICcOzYMfB4PE22GBsbG83NrvhKa4PIyEjs2bMH58+fB5/Px4QJE9CuXTtYWVkhPz8ffD4fjDFs2rTplV+YqnD+/HmcOXMG48aNg4eHB/bs2QOVSoWCggJERkbi1KlTOHToEO7fv4/3338f7733HhhjCAoKQlpamtb9A8ryCNjY2GD48OGYM2cO3NzcAJRlzUlJSeFEBlD2oHp7e8POzg52dnYwMzNDTEwMCgoKOFsbr6enh4EDB2LWrFnw9PTErl27cP36dU541xZ2dna4detWrbNPxcfHIygoCE2aNMGYMWOwadOm5xZF1a9fH8OHD4dQKMT169exa9cuZGVl1UreW6MEKvDs0tAuXbrAyMgIAHDjxg1OZKxZs0bzwkVHR2PixImYOHEirKysNNtq+6CVlJTgt99+AxHB2dkZjDHk5ubi5MmTSE1NRUREBCQSCezs7DBixAiIxWKo1WocPnyYk74BZS9O3759MW/ePDg7O2u279y5kxNrCihL2tqhQwcsWLAAtra2qFevHkxNTREfHw+JRKK5lqamplrJmTJlCiZMmIBjx44hODgYJSUlXDS/1rC0tET//v2xbdu2WvNQqVQ4evQohg0bhs8//xwFBQX4559/UFRUBCcnJ7Rp0wa9evXC0KFDcfDgQfz+++8IDw+vtby3TglUBo/Hw4ABA2BqaoqrV6/i5MmTnPCtHOhRkbtw2LBhmgfX2toaXl5euHbtWo15ExGioqLw448/apKXyuXy577AFXUQ+Xw+iIizpKNCoRDjx4/HvHnz4OLiAgBISUnB6tWrcfjwYU4ChurXr4/Jkydj0KBBaNCgwVNhwg0bNtT8JiJ8/fXX+Oeff3DkyBHk5OTUWNa4ceMQHx+PtWvXQiQS1ckQoCLLVOfOnWFiYgKgbAjSpEmTp/wC0dHR8Pf3h0KhQFBQkFYyQ0JC8Msvv+D999/H4sWL0bJlS6SmpqJnz55wcHCAubk5YmJisHnzZu2DrrT06icCiABwF+WeRwAWAM4CeFj+11zbOIEXUYcOHej+/fukVqspMDCQFi5cSP7+/tS9e3cyMTHhxONsY2OjmYapPBNx4cKFOqtJD4BGjhxJycnJpFQqSS6XU9u2bTnh6+DgQJGRkZr55aSkJJo6deoLvdy1oU8++YSysrI09Rlu3rxJf/75J8XGxj5XQUomk9Hjx49p+fLlZGpqWuMSaL/99hs9fPiQPvjgAxo2bBgNGzaM+vfvT40bNyYDAwNOpjw//PBDunnzJmVkZGhKkj958oSkUqnm/+zsbE05stzcXDp//jzt2bOHVq9eTT179iRLS8sayzU2NqY+ffpQVlYWFRUVaeI61Go1PXz4kLp161bTGQjupwhRpgSsntm2EsCi8t+LAKzgWgmYmprSuHHjKCQkRPNyymQyKi4upry8PLpy5QonhS6MjIxo2rRpFBcXR9nZ2bRmzRo6ePAgyWQyksvltHv3bs5enGdp1KhRlJKSQiqVih4+fMhJGXQA1KdPH1IoFKRSqSg4OJh69+7NqQIAQIsXL6aSkhKSSqW0fPlyatSoEfXr149u376tiekICgqi/fv3082bN0kul1NRURE9fPiQFi1aVKNpShMTE/r6668pPDyckpKS6N69e3T9+nWKioqiW7du0cCBA18UOFNtmj17NmVlZVFubi516dKFrKysyNLSkiwtLalBgwY0depUunr1KqnVatq3bx8tWLCA5s6dS2fPnqX09HTKz8+nJ0+e1KrEvEAgoJUrVz4XtPb48WOaOnVqTac2X5sSiAFgV/7bDkAMl0rAysqK1q1bRyUlJZoIrYqvs0qlovj4eGrcuLHWDzJjjJo3b07R0dGkUChoxYoVZGFhQXp6epSenk4qlYrOnDnD6ctTmSpbAlu3buWEJ2OMLl++rPkK//HHH6Svr6+p5cfn8zmpgHz9+nVSKBRUXFxM06ZNo5UrV2pCYLOysiggIIDs7Ow0wS/9+vWjgIAAevLkCRUXF9Ply5dp2LBh1X7AeTweGRkZUb169cjQ0JD4fD5ZW1vT8uXL6fjx4+Tk5KRVf5ycnOjgwYNUVFRE9+/fp7Vr19KMGTNozpw5tGPHDo0FsGjRIjI1NSXGmKZGYv369alTp07Ur1+/WlUk0tPTo127dpFKpSKFQkFyuVxTc1Mul9OtW7do6NChTwWdVcivgl+dKIEEAGEAbgOYVr4tv9J+Vvn/Z86dBiC0nKp9UYyNjWnWrFl05coVio2NJZlMRhKJhLKysujs2bPUvHlzTl4YKysrCg8PJ6VSSSdOnCBvb28SCoU0dOhQTRmqv//+m9MXvzKNHj1a8+L069ePE548Ho8yMjKequSsVqspJCSEtm7dSps2baKlS5eSv78/OTs711pORTBUhZyK4q3Z2dl04sQJatCgQZXXe9myZRQZGUlpaWkUGxtLrq6u1ZZZ1de+Q4cOtGXLFq2VQAWNGTOGAgICKDMzkzIyMighIYEiIiJo06ZN5Ofnx/kzUK9ePfrll180luimTZto5syZtGvXLoqOjia5XK6Joh0zZgwxxkhPT4969+5Nffv2rUqh14kScCj/Ww/APQCd8MxLDyCP6+GASCQiPz8/Onv2LJWWltL3339PjRs3JnNzc85ugK2tLZWUlFBBQQEtXryYbGxsaOzYsZSUlERqtZoSEhKoRYsWnN94oEz7L1myhJ48eUJKpfJFi0FqTIwxWrp0KUml0heWeFcqlVRYWEj//PNPreUsWLCAIiIiKDExkaKioigsLIx+/vln6t+/P9nZ2b3y3rZq1YocHR1rNJ6vPD7m8Xjk5OREGzdupL/++ovzys4NGzakhg0bkqurK6frLZ6ldu3aUWJiIkmlUlq/fj0JBAJNNWlfX18KDg7WKNv79++TtbU1iUQiGjNmDM2aNauq6FLuIwaJKLX8bxZj7DCAVgAyGWN2RJTOGLMDULvJy5dAqVTC3t4e9vb2AMqm3R4+fFgnnmGRSISOHTuiYcOG6NatG2xsbCCRSLBs2TKEhoZyLg8om15r164dTE1NERERUat4hKpARNi1axd8fX3Rrl07GBgY4MmTJ5oAk6SkJCiVSqSlpWH//v21lrNu3TqcOHECbm5uSEpKglQqRXJycrUqASkUCty8ebPGMlu3bo0bN26AiNCyZUuMHz8eXl5eWLJkCefVj2JiYjjl9yIYGxtrZqSEQiEGDhwIlUqlqZmZkZEBpVIJkUgEgUAAsViM3NxcnDlzBiqVqtrRpbVWAowxQwA8Iios/90TwLcAjgIYD2B5+V/Oi9AJBAI0a9YM9evXB1D20nCdraa0tBR5eXmws7PT1AcsKirC9evXce7cOezdu5dTeZUhFAo1QUnbt2/nNPnGw4cP8emnn6Jv374wNzdHXFycZlowJCQEcrkcCoVCq/BkpVKJBw8e4MGDB1w1+5Xo1KkTSktLIRAI0KNHDxQWFuLHH39EcHDwW5u8JDQ0FFlZWXB2dsbUqVMxbtw4KJVKGBsbgzEGIkJaWhoSEhKwa9cuzdR2TZWeNpaADYDD5S+fAMBuIjrFGLsFYB9jbDKAJAAjtZBRtWAbG3h5eUEkEiE3Nxd37tzh/EYXFhZixYoVmDp1KqytrREWFoaLFy/i4sWLePDgQZ0UnqyAv78/HB0dKw+XOAMRIT4+Hhs2bOCU75vGtm3bMHjwYBQXF2Pfvn24dOkSoqOj31oFAAA5OTlYunQp+vXrB19fX7i5uSEjI0NTcPfRo0e4ePEiYmJiEBkZWWs5tVYCRPQIgG8V23MAdKt1i6oBMzMz2Nraori4GMuWLcPly5c5v9lSqRR//PEHgoODYWhoiLS0NKSkpLyWiLTs7GzOs/y86wgMDMTt27chk8mQnZ391mZ9eha7d+/G5cuXNWHXEokEeXl5AMoqZGdnZ2v97L+1EYOxsbE4cOAA/vnnn1qt5qsOiouLOa8FXx1ERUXh/PnzMDQ0xL179zi3Bt5FVC7o+i5BqVQiMTERiYmJdSbjrSxDxufzoa+vD6VSyWnZ6X8TDAwMIBKJNEumddCBA7w7ZcjUavU7X2qqpKTkjS+G0eG/AV3dAR10+I9DpwR00OE/Dp0S0EGH/zh0SkAHHf7jeCsdg28KPj4+6NevH9avX69z2unwFDw9PdGiRQv4+PhALBYjOzsbJ0+e5CxTU11CpwSqCUtLS8yZMweMMV1BzRrA0NAQH3zwAfr27Yvi4mLs2LED58+ff2NJQLmGkZERmjRpgvHjx6NPnz6wsbGBUChEcXEx/Pz88NFHH9UqY1J1IRKJsHr1ahgbG2Pr1q21y2ikzSpCrgh1tAqLSxo9ejQdPXqU/Pz8XkvVnHeBGGPUoUMHyszM1FQ6unv3Lk2fPp0MDAzqVK6vry9988039Nlnn9HkyZNp6dKlFBoaSkFBQTRp0iROZNjY2NDUqVPp3LlzlJ+f/9xqTIlEQocPH66TZcZAWZGVL7/8kgoKCkgikdDMmTNfdc7bWXfg3wDGGDw9PREcHIxHjx69MxF8hoaGaNasGTp16oTmzZuDiJCUlIQtW7ZwslLOxMQEPXv2hJWVFUpLS0FE8PLywvz58xESEsJ5NKSzszM+/PBDNG/eHK1atYKpqSmICKWlpZoAs8jIyFrlhnwWlpaWGDBgAGbOnIlGjRpBICh7lT777DPN6tIPPvgADRo04GwVaGVYW1tj3bp16Nu3L8RiMYYPH45Lly7VitdbpwTMzMzQrFkzNGvWDB06dMCePXtw7NixOl3QY2hoCHd3dxw9erTWueQrUJEq2s7ODo8fP0ZGRgYcHBxw7do1DB48GCKRCHZ2dvDw8ICHhwdEIhEYYwgNDcXSpUtx9uxZreQLhULY2tpi4sSJ6N+/Pxo0aAB9fX0wxsDj8TSKQFslwBjD+vXrMXr0aJSWluLWrVvYunUrunfvjv79+8Pe3h7379/nJBrSyckJO3fuhIeHh2bpbcWQreIF5PHKfODOzs7o2rUrYmNjay2Pz+dj7dq1GDFiBKRSKe7cuYP8/HwcPHgQBw8eRH5+PogIISEhsLa2rnXq8ZfBwsICDRo0gKGhIX755RcEBgbWXqG+6aFATYYDhoaG9M0332jKkkkkEsrPz6djx47VaXIHExMT2r59O/Xu3VtrXhMnTqTHjx9XmdCjIiWXRCKhJ0+eUFZWFmVlZVFhYSEplUq6fv16rRJWVpCrqysdPXpUk+knIyODgoKC6Mcff6Rx48bRnTt3SKlU0rJly7Tup5WVFcXHx5NSqaTw8HB67733CAA1adKE9u3bR8ePH6cvv/ySjI2NtZb1v//9jxQKBSkUCsrPz6fQ0FD6448/aMmSJdSqVSvq06cPBQYGkkKhIKlUqlXCFMYY2dra0t27d0mpVNLt27c5SwJbXfLw8KA//viD8vPzKTY2loYNG1bdc9/+4YBSqURQUBCUSqVmtZhQKMT333+PDh064NChQ3Ui19jYGAUFBZBIJFrzOn36NJo3b46WLVtqvk4VyMvLw82bN5GVlYWgoCDNF+Szzz7DnDlzYGFhAVtb21o7mj755BM0b94cQUFBmiInqampKC4uhru7O3744QdkZ2cjICBA227Czs4Ozs7OkMvluHjxIi5cuACgLJ9BbGwsZs+ejV69eqG4uBhr1qzRSlavXr0AAKmpqfjtt9+wa9eu5wq1MMbQo0cPKBQKrZbdmpiYYPz48fD29oZMJkNYWBgePnwIPp//WpYt83g8dOzYEb169QKfz8e3336r9f16q5SAQqHA2bNnNSaxSCRCu3btkJ2dDUNDwzqTa2lpCYFAwMlipbS0NMyaNavaxwuFQjRp0gQqlQqhoaFaJerYv38/rl+/jlOnTj21VNnAwAAfffQRzMzMsHDhQq1XTjLGMHjwYDDGUFJSgqtXr2q2d+7cGf3799fUXHB3d9dKFgBcunQJvr6+yMvLQ3BwMORyOXg8HkpLS6Gvrw8+n6+peJSTk4PAwMBa96t58+aYPXs2AICIYGxsjN69e6OoqAghISF1YvpXhoODA3r06AFbW1uEh4fj7t27Wvsc3holwBiDhYUFbGxsIBaLkZGRgRYtWuB///sfLl++jOPHj1d5Hp/Ph7m5OfLy8mqtqfl8vqY23OtGq1at4O/vD7lc/sI+Vhcvqprk4eGBnj174t69e5xYAQYGBpqvs1qtRmZmJng8Hho2bIgpU6agQYMGGv8DF1izZg2aNm2Kvn37YsOGDTh9+jRCQkIgkUjQuHFjWFpawtPTEzweDyKRCA4ODrWav3dzc8OCBQtQr149TS3A4cOHY/jw4cjPz8fKlSuxcePGOssFYWpqiuHDh6Njx47IzMzEypUrERsbq/V1fCuUQIX2q8jxZ2BggLS0NDRu3BhEhJ07d2oSLVSAz+fDxcUFXbp0gY+PD5YvX47MzMxayS8tLa0TD++roK+vjwULFsDU1BQFBQW19v6+Cu3bt4epqSk+/fTTWtezqwzGmKaQpp6eHlq2bAm1Wo3JkyejR48enBc9lUgk2LRpE1q3bg0fHx94enpi+PDhkMlkcHBwgJGRkSYdV1FRUa2dyPXq1YO3tzcYY7h9+zby8/NhaGiIRo0awdzcHEOGDMGRI0fqJAehWCzGoEGDMG3aNJiammLDhg04d+4cJ9bpv14JtGvXDl9++SW8vLyQn5+Ppk2bgoggk8kgl8shlUqxdOlSREdHQygUam60q6sr6tWrB09PT6Snp7+wumt18KaUwIQJE9CpUycAwLFjx2qtxF4GZ2dn9O7dG6ampoiOjuYkiKe4uBhnz56Fv78/jIyMMGvWLIwdOxbu7u6aMl5cIygoCOvWrcOPP/4IfX19uLq6avZFRUVBLBbj6tWrOHLkSK1LhN2/fx8zZsyAsbEx4uPjUVxcDH19ffj6+uKjjz6Cl5cXPvvsM2zbtg3BwcGcTn86OTnhs88+g7OzM44ePYpt27ZxlkD1X68Epk2bhm7duoHP58PU1BTp6ek4dOgQTpw4gZycHFhYWKBZs2YQiURo2bIlHj58CAcHB2RkZCAhIQHHjh3TJGx8m2BmZoYBAwbA0NAQqampWLFiRZ0ooqZNm8Ld3R2///47ZxmaiAgbN25E586d0bZtW7i4uMDFxQVZWVnYs2cPfHx80LJlS83cOheQyWTPDdkYY7hy5Qq++OIL5OXlIS8vD7m5ubVWdEVFRTh58iQYY0/di8jISFhZWeHzzz/HqFGjkJycjJCQEM4chRYWFpg0aRIaNmyIx48f4/Dhw0hISOCEN/AWKIH79+/j3r17ePToEY4ePYqLFy9CIpFAKpWitLQUjDFcunRJM95TqVTg8/lQqVQgIqjVaiiVSq1eIEtLS5ibm3PYq5ejotCqr68v+Hw+QkJC6sTENDU1RdeuXUFEmqq3XCElJQXffPMNvvzySwiFQqSkpCAwMBCBgYFYtWoVmjdvDgCcPcyzZs3CggULUFpaitzcXJSWlqJevXooKChAQkICMjIyOJFTVfJXuVxeNtUmEMDAwACZmZmcWgHNmjXDxx9/jLS0NHz//fcIDAzkdibiTccIvCpOgM/na8pkVS619DppxIgRdPr06TorNvIsGRsb09GjRzX1Al9VsKO21LZtWwoJCaHly5fXqP5fdYkxRsbGxmRqaqq5f4wx2rx5M5WUlJBSqaxRlaGX0bVr10ipVFJcXBwNGzaMvv32W1IqlRQaGkoNGzbkRIa/vz9169atyiI3zZs31xQDOXLkCAkEAk5k+vj4kFQqpdzcXFq4cKG270CVcQL/+qXEFV9ylUr1RsblQNkX09jY+LXIYoyhW7duaNiwIYgIJ0+erJOhjEAggI+PD1QqFQICAuokWSsRobCwEAUFBRrLrHfv3ujQoQNEIhFiYmI4ib1gjIHP5yM+Ph6TJk3CyZMncfjwYVy7dg1+fn6ws7PjZNHX0qVLceLECWzZsgUtW7aEgYGBZuaIx+NpZFhZWcHU1FRreTweD2PGjIFQKER2djYuX75cJ+/Av3448G9AeHg4oqOjX8vqQQcHB7z//vtwd3dHTEwMTp48WSc33tvbG+PHj0dycjKys7M5518VLC0tMXToULi5uYExho0bNyI3N1drvk2aNIGFhQXu37+PK1euAAAyMzM5rzx048YNdOzYEYMHD0bHjh0REBCAY8eOAQB8fX01U4cqlQrW1tZarx709fXFhAkTNAFVFfUGuIZOCVQDBQUFAAB7e3sIBII6zf5rY2MDe3t7qFQqLF++HHfv3uV8wZK+vj5atWqF0tJSbN26FY8ePeKU/4vg5+eH1q1ba6YIXxS3UFMsXboUzs7O2LVrFxhjEIvF6NatG1q2bMmpBRkeHo7Tp0/D398fLi4umDJlCqZMmaLZT0QoKCjAp59+iujoaK3l9evXD2ZmZoiLi8PevXvrbPm1TglUA6WlpTA3N0erVq1w6dIljVLgGgKBAL6+vvDy8sL9+/cRHh5eJwrH1tYW48ePx8OHDxEeHv7aVkXWlSVlYWEBqVSKnJwc9OnTB40aNULfvn3h6OiIBw8eICcnh5M+BgYGIigoCF26dMGMGTPQvHlzjdkvkUhw584dnD9/nhNnp1Ao1AxjCgsL6zQkWacEqoH09HRs374dOTk5dbpaUSQSwcrKCmKxGDdv3kRqairnLyifz4e/vz9sbGzw888/v7ahAADEx8cjNTUV3t7eOHfuHGdxD+fOnQOfz8eECRNgZGQEe3t76OnpISUlBZs2beJ0Oi03NxeHDh3Cw4cPNcuVgTJr8fbt24iMjOQkgEcoFMLHxwdZWVlYv359nVak0imBaqCoqAhHjnBeV/U5yOVyREVFISUlBVZWVjAwMOA8Kw2Px4OTkxOMjIzg7u4OS0vLOs18UxkZGRn4/vvv8fvvvyM6Opqzabtjx47B0NAQ3t7eaNWqFRISEnD16lUcOnQId+/erZNUcBEREYiIiOCcbwXkcjm+/PJLCAQCjZ+jzvCmpwdrspT4v0DW1tb0888/U0pKCk2YMIFEIhGn/Hk8HnXo0IEiIyNp3bp1ZGpq+sb7rC3p6emRra0tubi4kI+PDzVo0ICsrKzeeLv+hVTlFOFbWYbsXQZjDPb29pgzZw6aNm2K8ePHcz5FKBAIYG5uDrlcjsLCwtfmE9DhjaPKMmQ6JfAvhUAgAI/He2drLerwRvDu1CL8L0BXhFSH14V/fcSgDjroULfQKQEddPiPQ6cEdNDhPw6dT6CacHZ2hqurK+RyOW7fvq0bsz8DJycnCAQCPH78+LlrU5EaztPTE1KpFLm5uRg1ahQsLS1x9+5dREREaJX8swJCoRBdu3aFk5MTLl26hISEhDe26Oxtgk4JvAA8Hg8eHh7o3LkzWrduDScnJ1hbW0OlUiEsLAzfffcdUlNT30jbhEIh+Hw+FApFrR5yxhjMzc3h4+MDOzs7zfbmzZtDJBJh9+7dCAkJqRHP4uJi8Pn859qjr6+Pbt26YejQoWjatCkUCgWKi4vRunVrGBkZITk5GZGRkfjhhx8QGhoKuVxe4/5UQCAQoGXLlpg1axZCQ0Nx+PBhHDlyhLNgqGbNmmHWrFkwNDREZGQk1q5dW6eRfC8CYwwODg4YMGAA2rVrB4FAgB07duDkyZO14vdKJcAY+xNAfwBZRNSkfJsFgL0AXAEkAhhJRHmsLDj8ZwB9AZQAmEBEYbVq2RsEn8/H4sWLMWTIENja2sLCwuKprDU+Pj4IDAx8rUqAMQYXFxf07t0b7733HgQCAb777rtqJ8wUCARo3LgxunXrBmNjY/Tp0wdWVlbQ19fXHGNmZgYejwe1Wl1jJVDVakChUIhFixZh/PjxqFevnib7j7GxMeLi4qCvrw8nJyfY2dnBzs4OmzZtwrZt22q9UIaIUFJSgtDQUNy9exfTpk1Dz5498csvvyA4OLjW8fdubm4YO3Ys+vXrh2bNmkEoFCI3Nxfm5ub4/fffObFiqguxWIz27dtj9uzZaN26NSwtLQEAR48erT3TakTzdQLgD+B+pW0rASwq/70IwIry330BnATAALQBEMJlxKClpSX99ttvNHHixOf22draUosWLWjSpEnUvn37WkdVeXp60vXr1zW15dRq9XN0+fJlatWqVZ1HeAkEAmrQoAENGzaMjh8/TrGxsZSTk0MRERE0efJkMjIyqjavmTNn0uPHjyk/P58kEskL+6ZSqeiff/7hJCnGd999RxKJhNRqNYWEhFCPHj3I3d2dPD09ydHRkZydnWnhwoWUk5NDSqWSDh48qFWkn76+Ps2bN4+2bNlCpqam1KZNGwoICKC4uDg6c+YMLVmypMb9cnNzox07dlBeXh7J5XJSKpWUnJxMSqWS8vPzadeuXeTl5VWje1FbMjc3p88++4xiY2MpMzOTfvvtNxo8eDDdv3+fbt26RadOnaJly5aRiYnJi3hUGTFY3bBeVzytBGIA2JX/tgMQU/57M4DRVR2nrRJgjFG7du002WN27txJkZGRVFxcTMXFxVRSUkJSqZTkcjldvny5VheZMUZhYWGkVCqfKiwZExNDs2bNIi8vL3J1dSVTU1NOi5IyxjT8GGPk7+9Pa9asobt375JEIqHi4mKSy+WUnp5O33//PXl7exOfz6+RjG3btpFcLtf0SaFQUEFBAUVFRVFoaCilpaVp+n3q1CkSi8Va9cnDw4PS09NJpVJRdnY2LVq0iPT09Kp8cVevXk1qtZpu375NHTp0qLVMfX19+uSTT2jNmjWaa2lgYEDW1tZkbW1N+vr6NeY5cuRISk1NpcjISJo9ezaNHj2a/Pz8KCIigkpKSkgul1NaWhrNnTuXDA0NOXsmnn0+nJyc6ODBg5osQ/Pnz6dp06bRw4cPSS6Xk0wmo8zMTJJKpfT333+/SJlyqgTyK/1mFf8DOAagQ6V95wG0eAHPaQBCy+mVF8LLy4vS09OJiKi0tJRKS0tJrVZTaWkpVYZUKqVNmzbV6mJ/+OGHVFBQoFEAmZmZ9Ouvv1LXrl3rLLUZY4xmzpxJ8+bNo06dOtHBgwcpJSWFZDIZFRcXU05ODs2ZM4eGDRum1ddm/vz5dPToUTp06BANGTKEunXrRq1atSIzMzOysbGhs2fPkkKhIJlMRosXL9aqT8bGxrR3715SqVRUUlJCf//99wtfQMYYtW/fntRqNQUEBFSZuqu6ZGBgoHk5uLo/PXr0oKNHj1Lfvn2fsiJMTU3pypUrVFxcTCqVijIyMmjMmDGcr/VgjFHfvn3p7NmzGitkzZo19Oeff1JOTg7FxsbSzp07aeDAgVS/fn0KDg6mvLw8+uijj6riVzdKoPz/vJoqgZpaAh9++KHmRVer1VRSUkKJiYmUkpJCqampFBcXR2lpaVRUVETff/99jS+2oaGhJk+dSqWiwsJC2r59+3OmFY/HI0NDQ85Ka/P5fAoMDCSVSkW5ubmUnJxM9+/fp3379tGsWbO0/iK/jHg8HllaWtIXX3xBWVlZpFar6cSJE1r1TU9Pj7755huSSqWkVCopJCTklTn+GjVqxIkSMDMzoy1bttAHH3xQZ9fsWXkrV64khUJBarWavvvuu5eZ4rW6P76+vnT79m2SyWQUFhZGc+fOpT/++IMkEgndunWLhgwZovlAicVimjt3LqnV6hcpck5rEWYyxuyIKJ0xZgegYoVLKgCnSsc5lm/TGhkZGbh16xbUajVycnLw6NEjPHr0CJmZmcjMzERkZCRGjx6N7777rlb8+/btC3d3d02Rihs3buCLL77Q5MDT19eHg4MDnJyc0KZNG8hkMly9ehVZWVnIy8urdaZefX19lJSUICkpCZs2bcK1a9cQHx//WlKk169fHzNmzNBM1wHAhQsXtMpg4+vri0mTJkEoFEIikeC77757ZabkCuekvr4+DA0NnyskUxPweDyIxWIIhcI6y8RTAYlEghMnTmiqO/ft2xfbt2/nJG8in89H9+7dsWLFCnh6euLMmTP4+++/0b59ewwYMABBQUH46quvcPv2bc2MTGlpaa2ew9oqgaMAxgNYXv73SKXtsxhj/wBoDaCAiDgpznbu3DnEx8dDJpM9V2wSKKvXPmbMGJSWltbqIWrXrh2MjY3BGINarca1a9c0ckxNTdG3b1+MHTsW3t7ecHR0hEqlQnJyMm7fvo3g4GAcOHCgVnXoHB0d0bVrV1y6dAlbtmyps6xFz8LQ0BDDhw/HzJkzIRQKNdsnT56MR48eITAwsFYvUbNmzTR1IQMCAnDu3LmXHs/n8+Hn5wegLOORp6cnUlJSaiwXKHsJ1Go1evbsqSlVVzEFycWLWZW8iIgI7N+/HzNnztTUPeQCTZs2xdatW2FhYYFDhw7hxx9/RJcuXdC/f3+cOXMG33777XPl1fX09ODp6QmlUlmzqdZqmOp7AKQDUAJIATAZgCXKTP2HAM4BsKjkH/gVQDyACFRjKFDd4cDLyNjYmJYsWUJqtZpiYmKocePGNeZx6tQpjYdcKpVS586dNSbWhx9+SJGRkaRUKqv0pqenp9OSJUtqVTa8R48eJJfLKSoqij755BOytbV9LaZs06ZNKSwsrMr+PHjwoFal3o2MjOiff/4hmUxGcrmc2rRp88pzhEIhrVu3jtRqNV29epWaNGlS6z4JhULq3r07ffvtt7Rt2zbat28fnTlzhn744Yc6LV3fpk0bCg4OpgcPHlCDBg205mdlZUV//vknlZSU0J49e8jZ2ZkaNGhAkZGRdOLECfL19a3yPAcHB7p27RolJSXRqFGjqjqm9j6BuiZtL9qiRYsoNTWV0tLSaPjw4bXisWrVKiosLCS1Wk3FxcWah8bR0ZF27NihUQAZGRm0c+dOWrZsGa1cuZJCQkJIpVJRdHQ0ffzxxzUe07q4uNBXX31FsbGxlJGRQUeOHKFx48ZxOrZ8kdxVq1ZRWFgYXbx4kXbv3k2xsbGkUqkoPz+fnJ2da8zTz8+Pbt++TSqViqKioqp1LXx9fSkyMpITnwDw/zMCtra25O3tTSNHjqQzZ87Q2rVr6yyBSpcuXeju3bucKYFmzZpRZGQk5eTk0HvvvUdCoZA+//xzio2NpQEDBpBQKHzuHD6fTyNGjKCMjAzasWMHOTo6VsX73VQCzZo1o5iYGFKr1TRv3rwqL1B1yNfXl+Li4kilUpFUKqWRI0cSAGrfvj1FR0eTWq2mtLQ0Gjt2LDk4OJCpqSlZWlrShx9+SGq1muRyOYWHh1Pr1q1rLNvY2Jg6depEe/fupaKiIoqLi6PJkydz5nysivh8PllaWlKjRo2ofv365ODgQCNHjqSSkpJaK4EpU6ZQWloaqdVqunHjRrWmUUePHk1KpZIKCgpo+fLlnHvX+Xw+tWnThhITE6l///51ci0nTZpERUVFtH79+lpZg5XJ2tqa1q1bRwUFBTR9+nQyNDSkdu3aUVxcHG3fvp0sLCyqPM/f358iIiIoLS2Npk6d+qJr/3YWH3kZ+vfvjz/++AP169cHYwwKhaLWzqD79+8jMDAQCoUCfD4fnTt3hqOjI/z9/eHg4ACgLCruxo0bSE1NRUFBAUpKStCwYUMAZRF5jRo1goWFRY1lFxYW4tq1a1i0aBE2bdoEU1NTjBkzBtbW1rXqS3VQ4WCNjo7WJADVNtbeyMioRvUFBQIB2rZtC8YYHj9+jAMHDnCeREWtVuPOnTtITExEkyZNOOVdAT09Pejr6yMlJQUymUwrXs2aNcN7770HQ0NDXL58GSUlJfD09IRMJsOSJUuq9Hc1atQIBw4cgLOzM/bt24cDBw5UfFyrhbdaCWRnZ0NPTw88Hg/Tp0/Hli1bas1LrVbjxo0byMrKAo/Hw4QJExAYGIjJkydDLBYDKKtua2ZmBjc3N7Rq1QqbN2/GmDFjAABEhPv379faq19aWoqEhAT8+eefuHnzJtq3b4/+/ftrXcbb0NAQXl5esLCweGXK7x49emhVJLTiwSMiuLq6ws3N7aXHz507F1OnTkVhYSE2b95cZ8U1+vbtC29vb1y9epVTvsbGxhg4cCDGjx/PGc/27dujUaNGOH36NLKzs0FE4PP5kMlkSElJeerl1tPTw8CBA3Hx4kXY2dnhn3/+waJFi2ruGH/TQ4HaDAcYY2RjY0MHDx4kuVxOBw4c4Gw+vUGDBhQVFUVSqVQTNFTZaVYVKZVKKioqoq+//pqMjY21ku/m5kb79u0jiURC06ZN48Q8njlzJl27do2mTZtG9erVI4FA8FSEooGBAfXr149iYmJIoVBQWloaOTk51VhOo0aN6MqVK6RQKEilUlGXLl1ILBZr5rF5PB6JRCIyNDSksWPHUkpKCikUCgoMDNS6FiKPxyNjY+OnhoM8Ho/s7e0pKCiIli1bxmnAl0AgoLFjxz4VXXr16lVavXq1Vk7I8ePHU0pKisY/whijHTt20IoVKzTHVAzlfvnlFyoqKiKpVEqbN2+uzrPybvgEGGPk7e1NR48eJalUShs3btTamfQsNWzYkFavXk1paWkaZ+GzHnSVSkVyuZxycnLoxo0bNG/ePPLw8Ki1TH19ffLw8KCffvqJCgoKaPXq1S8c/9WUvvnmG816gbCwMJo5cya1b9+enJ2dyd/fn6ZPn04JCQmkUCjo7t271K1bt1orn4r2q1QqysnJoYCAAOrXrx/5+vpSnz596Msvv6Tg4GCSyWSaY6paC1JTaty4Me3du1czJtfT06N27drRgQMH6MCBA5w7WgUCAQ0dOpSys7MpIyODEhMTNdf40qVL5OHhQcbGxpoirNVds9CvXz+Kjo6me/fuUaNGjUggENCpU6fI39+frKysyMXFhYYMGUJnzpyhoqIiSktLo19//bW6/qO3Xwkwxsjd3Z02bNhA+fn5dOTIEXJ3d+f05laQnp4eDRs2jLZu3Urp6emar1t6ejo9fPiQIiIi6ODBgzRnzpwaVyuuV68eeXh4kKurK7m6upKfnx99/PHHdPbsWUpISKBTp05Ru3btOPtyDRgwgO7evauZ4VAoFJSRkUGxsbGUkpKiWXNx7do1rSsvN23alPbu3UtyubzKBUoVVLEmY9myZbV25lamUaNG0eXLl8na2posLS1p+PDhFBgYSN99912dTbtaWlrSlClTaPDgwdSwYUNau3YtxcTEUGFhIaWnp9OyZcuoY8eO5OPjQ/7+/tXi2aZNG7p06RLJ5XL6+++/acCAAXTy5EnaunUr7d+/nxITE6m4uJjy8/MpKCiI+vbtW5M1EW9/ynFbW1ssXrwYEyZMQEpKCj7//HOcPHmyzhJ8CAQC1K9fH0OGDEGfPn2Qn5+P06dPIzExERKJBNeuXasV33bt2qF58+Zwc3ODWCyGm5sbGjRogKioKAQFBeHUqVO4f/8+Z04yPp+PkSNH4vPPP0eDBg2eWj4MAFKpFKdPn8aPP/6I27dv18ipVBUcHR2xdu1aeHl5oUGDBk8F0MjlcqSmpuLevXvYsmULrly5orUzDSgrSrp+/Xpcv34djDHUr18f586dw4EDB+qk4nJVsLCwQMeOHdGnTx+0b98enp6eSEhIwN27d3H69Gls3779lTwEAgFGjRqFL774Ag0aNACPxwMRQalUIiMjA3K5HGlpabhx4wZ+//13JCYm1uR+vd0pxytKdgcEBEAoFOK3337D0qVLX8sNtra2hru7O1JTU5GWlqZ1thqBQAAbGxu0bNlSE10nlUoRERGBhISEOlFqlpaWaNasGfr27Qs/Pz+YmZnBx8cHRITg4GDMnDkTDx480FoBAGX3ys7ODj4+PvDz83vK2SiVShEfH4+QkBDOKhABZbkL2rVrhwYNGkAsFiM8PBzBwcFaJSmpLaysrNC8eXN8/PHH6NChA2JiYvDRRx/h3r171Tq/IkK1T58+sLa2xoMHD1BcXIz79+9DKpUiMTER8fHxtSmJ93YrAZFIhN9//x1DhgzB/v37sXr1akRFRb2O5r1TsLS0hKOjIwwNDeHi4gIiQmJiIu7du1endRb/i2jQoAG8vLwgkUgQEhJSo3JofD4f9vb2muxLpaWlXNyfKpXAG/cHVNcn0KdPH8rOzqYtW7aQnZ1dnYzxdKSjd5zebp+AoaEhLC0tIZFIXtsYTwcd3jG83RWIiouLUVxc/KaboYMO7xze6ohBHXTQQXvolIAOOvzHoVMCOujwH8db4xP4N4AxBhsbG7i7uyMjIwOPHj16003SQQetoVMCrwCPx4OVlRUaNmwIFxcXdOrUCS1atMD69et1SkAH1K9fH++//z4ePnyIM2fOvJUzV++EEmjfvj3Gjx+Pf/75BxcuXOCMr0AggLe3NyZOnIiOHTvCyMgIjx8/RkhICG7evMmZnGdhYWEBX19ftGvXDm5ublixYgUePnzICW8fHx+MHTsWBw4cQGho6HP7u3fvDltbWwQFBSEhIYETmRUQCARP5eGTy+WchAy/KRgZGWHUqFH46quvEBcXh8ePHyM4OPhNN6vGeCeUQPfu3TF27FgAwOXLl2tdbqoy+Hw+OnTogOXLl0MsFiMqKgqnTp1CSEgIcnJy8OTJE61lPAtTU1N0794d77//Ppo0aQJbW1sYGxsjKioKP/30k9b8GWOYN28eRowYAVtbW0yYMOG5Y3766ScYGBjgs88+41QJ2NnZYezYsZoyaACQmJiIPXv2ID8/H61bt8bdu3dx48aNGkXWvUkYGBigcePG4PP5cHV1rVVCmX8D3gklYGhoCMYY2rVrB7FYXOv035Whr6+PgQMHws7ODsuWLcOBAwdQVFTEeeYboOzldHd3x4IFCzB06FCoVCoEBQUhOjoavXr1Qvv27TlRAgYGBmjZsiUMDAxgb29f5TFubm7g8XjPLTLSBkKhEO+99x4+/fRTWFpagscr80f7+/uje/fuUKlUMDAwwMOHD/HNN9/UurDm6wZjDAKBAIwxXLx4kTNr7VkZEydOhKmpKVq0aIHGjRvj6tWrz2UaBsrWZVy4cKHGyvutVwIikQiOjo5gjOGzzz7jRAFU8G3atClSU1MRFBRUZcFNLsDj8TB48GB88803cHR0xIULF7Bx40bcunULU6dORbdu3dCvXz/cu3cPffv21aoIar9+/dCgQQMUFRXh+vXrLzyO6yhSOzs7DBkyRJMurYK/UCiElZUVAEAmk+H27du4cuWK1vI8PDzQu3dvXLx4EQ8ePNBkVBKJRPD29oaFhQX69euHtm3bwtXVFQcOHMA333yjlXXXvn17uLu7V/ly1hZNmjRBQEAA7OzswBgDn88Hj8eDl5fXc9auSqXCqVOnIBaLcfz48RopgrdeCbRt2xYdO3ZESEgIzp8/zxlfhUKBO3fuYNSoUWjRogWioqKeWj1YUaREGzDGsGHDBowbNw4FBQVYs2YNVq1aBblcDgMDA3Tv3h1isRhqtRoKhULrYc7w4cPB5/NRUFCAS5cuvbRdXEAoFMLLywtfffUVBgwYACKCXC7Hvn37sG/fPrRu3RrdunVDu3btUFhYiPDwcK2jQk1MTDB69GgsXLgQ0dHRSE9Ph6WlJRo1agSBQAADAwMAZencVCqV5tpquzLU2NiYU+sJKLOU0tLSEB8fj+7duyMtLQ1Hjx5FSUkJGGMoLS1FaWkpiAiHDx/GnTt3apdj800vHqpJUpHKxOfzyc3NjW7evElqtZpOnTrFaZFQHo9HXbp0obi4OLp27Rp16dKFhEIhCQQCsra2Jjc3N61leHh4UHZ2NkkkEk2acZFIRPr6+jR37lzKysqijIwMWrx4MTk4OGgly9DQkAoLC0kul9OxY8eqzBxkaGhIEomECgsLX5S3vkby5s6dS/Hx8ZoMzvfv36eePXs+dZybm5umlt8L6ufV6Jno3bs3xcfHU1ZWFj1+/Jhyc3PpyZMnlJmZSenp6ZSYmEgxMTG0d+9emjRpEvn4+FRZKLU6ZGNjQ//8848mUcrgwYM5e/4AkEgk0tRXVKvVFBoaSp07d6axY8fS4sWLNenIa8CT0zJkbxz16tXD8uXL4efnB5VKxXmN+NLSUoSEhGDp0qVYvHgxVqxYgdWrV4OIMG3aNOzevVtrx9mTJ09w7do1tG3bFlOmTEGrVq0QGhoKExMTTJkyBVKpFJ988gmOHDmitdXRqVMnzbp+qVRapW9j4MCBEAqFWuUz4PP5cHZ2xgcffICvv/4apaWlyMrKwuXLl/Hrr78+l4ilwplW6YNQa9SvXx8LFiyAQCDA119/jXv37qFx48YoLCxEQUEBJBIJ7t+/j9LSUpSUlGj99a9rVGTPbtu2LYCy4cGBAwegVqthYGCA5ORkjB07FuHh4Vpdu7dWCRQVFaGwsBClpaUIDw/H77//zvlYViqVIiAgANbW1liwYAG2bNkCPT09CAQCbN68WWv++fn5WLx4MXr37o3mzZujbdu2+OCDDyAWi8Hn87Fnzx5OMv0AwJUrV6BWqzVOuaqgbWZjoGw8vmLFCvTo0QNEhNjYWGzduhX79u2rsnxc7969AZRNF2pTf9HU1BSLFy9GmzZtEBAQgBs3bqCgoAAREREoLCysNd83jQqHN1D2YUpMTMSZM2fg7e2Nrl27Yu7cuZg+fbpWDuu3VgmYm5vD0tISSqUSP/30E6cOmcoQiUQQiUQAyh40AEhLS+MsPXZkZCQiIyNhYmKCZs2a4eOPP0bv3r3BGIO/vz+mT5+OH3/8UeuxcnFxMXJycmBnZwcnJyd07twZt2/ffsqR2rRpU/B4PJSWltYqEMrJyQkff/wxunbtCpFIhOjoaHz11Vc4duzYC8eqjRs3BlCmEMPDw2vVt/r162Ps2LEYNWoUSktL4enpia+++gpqtRoxMTH4888/8ejRI84/EiqVCjk5OWVr8jnyo7wMycnJ+OGHH3Du3DnMmTMHnTp1Qvv27WFqaors7Oxa831rlYC/vz+8vb2xZ88enDt3jpPYgGdhbm6OGTNmYMqUKRAKhTh69Ch8fX1hbGwMMzMzTmWVlJTgyZMnyMrKwsGDBxEaGorZs2djxowZuHjxIidOz3PnzmH8+PHw8fHB2rVrERMTg8zMTAiFQujr66N79+4ax2F1U2FVQCAQYPDgwRgxYgQMDQ1x//59zJs3D5cvX36p2d2lSxcolUpERkbWqqCrvr4+PvnkE4wbNw4ikQilpaWoX78+RCIRDAwM0KNHDzg5OWHBggXIzMysMf+XQSKRIDg4GJMmTdJ8KOoSubm5uHnz5lOWja2tLfz8/HD27Nla830rlYChoSH8/PxgZ2eHgICAOpm+EwgE6Ny5M+bMmQOJRIIlS5bg1KlTGDhwIH744Qd4e3vj7t27nMhijMHV1RXz5s1DYWEh1qxZg4cPH8LBwQFz587FBx98wIkSWLVqFRo0aIB27dqhadOmaNq0KZRKJXg8HgQCgeZL+ffff9fYvPTy8sKAAQM0Jc4XLVqEixcvvvQcMzMz1KtXD3K5HBkZGbWydoRCIQYOHAgej4dDhw7h8uXLiIqKQlZWFkxNTbFy5UoMHToU+/btw/Hjxzm1BpRKJTIzMzUfoIqYAS5lWFpaQiAQQCaT4cGDB89VrTY0NNS6UtVbqQQaNGiALl26QCqVIi8vj3MzDyh7QOfMmYPS0lL88ssv+OuvvzRJHtVqNaean8/nw9fXF++//z527NiBuLg4yOVyZGdnQ61Wc1aOLCYmBiNHjoSZmRn8/PwwaNAgjTluZWUFKysr8Hg8HD16tMa8K4Ka+Hw+Tpw4gRs3brz0eEtLS8yaNQtAmYP0VSXMX4SioiKMHz8eRUVFSEpKQlFREeRyOYgIAwcOhKWlJeLi4rR2nlUHw4cPR1BQUK0smhdh3LhxMDc3h0Qiwd27dzXDt5s3byInJ0czRNUGb6USMDMzg62tLW7fvq3VWOhF4PF4GDZsGDp27Ig7d+7g6tWrmiSPZmZmL3Wu1RYVSiU3N7fW9RRfBSJCeno60tPTERsbi4CAAE1f5s2bh88++wyGhoa1iucXi8XQ09NDVFQUFi5c+NwX61mMGTMGc+fOhUqlwooVK3D69Ola9YnP5yMkJETz4legYcOGmDp1Kuzt7fHFF19wmtm4MoqKipCRkQE3Nze4u7vD0tISGRkZnCgcS0tLzJ49G0SEU6dOYceOHZp9ycnJnIVXv3VKQCgUwsHBAaampoiNja2TVVuMMRgaGoLP5yMjIwMxMTHg8Xiws7PD/PnzIRKJ6kSuXC5HQUGBZgxd4Wyqi6kstVr9VPbaxo0bQ19fHyUlJVo5IaVS6UvPF4lEGDlyJBYtWgQjIyNkZGRotd5j9erV6NOnDx4+fAgnJycolUpIJBI4OTnBxsYGGzZswI4dO+ok3BsAkpKScOXKFbi5uaF58+Zo0qQJYmNjOZHXv39/1KtXD6WlpUhPT3/KF1A5UEib+pHAW6gEDA0N0aRJE2RmZuLAgQN1spAHKPP8qlQq2NraomvXrgCAqVOnws3NDX/99ReOHz/OqTylUgkTExN4eHhAKBRCoVDAwsICPB4PISEhnMp6FgKBAC4uLhAIBIiIiEBcXFyNeVTMw/v5+WHjxo1YvXo18vLykJ+fr5nKNTMzw7p169C3b1/IZDIkJSVh6NChWsV4ODk5wc7ODo6OjuDxeBAKhVAqlcjKysKmTZuwYcOGOl3eW6FM1Wo1+Hw+xo8fD6lUiqNHj2ptDZw/fx63bt2Cp6cn7OzsYGRkpBkOpKWlITw8HI0aNcLw4cOfshJqirdKCTDG4OHhgUGDBkEikdSZ2VxaWorbt28jJCQE7dq10wTrZGdn49SpU5g/fz6nX5aKYKfY2FiYm5vDysoKjDH06NEDeXl5OHLkCGeyqkLjxo01sx21nerau3cv9PX10a9fP7Ru3RpnzpyBQqFAXFwcUlJSIJFIYGRkhObNmyMmJgbHjx/Hjh078ODBA63avn37dsTGxkIgEMDExASurq549OgRzpw5gwsXLrxyWKItsrKycPHiRQwaNAj29vaapdgnTpzQ+vlMSUnB2LFj0ahRI42/owIlJSXIzc2FWq1G/fr1tZLzVikBHo8HW1tbeHp6cla+qioQEW7cuIHFixdj+vTpAKBZ2bdnzx7OFilVRmpqKgICAjBlyhQsWLAA5ubmaNy4Mf744486L7JiZmamMSlr+/XKzMzEypUrcfToUYwePRrDhg2DWCyGoaEhGjZsqJkB2LNnD06dOoUrV65wUh0oMDAQgYGBWvOpLYgIT548QVJSEiwtLZGXl4cffviBsypSKSkpSElJeW67qakp7O3ttR4KAG+ZEiAiyGQy5Obm1nkyCrVajStXrnCyqq06KCwsxJkzZzBgwABMnz4dAoEAmZmZOHv2bJ2Htz569Ag3btyAo6Oj1kOP6Oho/PDDDwgJCYGBgYFGqVSUH0tKSnqrE4lUhXv37mHZsmVo1qwZ8vPzcezYsTqfibC1tdUsioqPj9eK1yuLjzDG/gTQH0AWETUp3/YNgKkAKlzzXxDRifJ9/wMwGYAawBwieqXbt7oFSQHAxsYGHTt2RGZmJu7evftWh4Q+CyMjI7Rq1Qqurq5gjCErKwsXLlx4LfUWGjZsiFatWiEoKEiXNu1fDjc3N4wfPx4zZsyAQqHA6NGjERQUVJ1Ta1eGDEAnAP4A7lfa9g2Az6o4tjGAewD0ALgBiAfAr4tVhDrS0X+VRo8eTXFxcZSdnU2TJ08mPp9f3XNrt4qQiK4wxlxfdVw5BgH4h4jkABIYY3EAWgF4+xKv6aDDvxQnTpzQDNvS09O1DpnXxicwizE2DkAogE+JKA+AA4DKoWIp5dt00EEHjlBQUMDprEdtQ982AqgPwA9AOoAaJ8BjjE1jjIUyxp5PeauDDjq8NtRKCRBRJhGpiagUwO8oM/kBIBWAU6VDHcu3VcVjCxG1qNJRoYMOOrw21EoJMMbsKv07BMD98t9HAbzPGNNjjLkB8ARQdwn6ddBBB63xSp8AY2wPgC4ArBhjKQC+BtCFMeaHMo9jIoDpAEBEDxhj+wBEAlABmElE3C/010GHdxz6+vqws7ODs7Mz6tWr99z+nJwcSKVS3L59W+vo1VfGCbwO1CRO4GUYPnw4SkpKcOLECS7Y6aBDteHi4oJu3bpBLpfj6NGjWsevjBgxAsOGDYO/vz/c3d012yvCupOTk1FQUIBp06bVJMtwlXECb1XE4MvA5/MxZcoUpKWlvfVKwNzcHD4+PujTpw8sLCxARLh+/TqOHTtWZ/UP6hKGhobo168funXrhszMTFy8eBHBwcHvVORg165dsXTpUvB4PNy5c0frxLddunRB9+7dIZfLcfnyZU3qNRMTE02NAycnJ/z444+YM2eOVmsw3hkl4OrqCl9f3yqTWb5NcHZ2xpw5c9CrVy+4u7uDMYbCwkLNQ7Fz506cPXu2zsNSuYBAIMDEiRPh4uKCoUOHomHDhigpKcGwYcMwYMAAziMTjYyM4Orqil69esHHxwe2trbIzMzEnTt3IJVKcebMGc7rK1bA0tIShoaGMDEx4aT+wPr163Hv3j1ERkbiyZMnmrwZIpEIAwYMwMKFC+Hi4oLOnTvjo48+0iRoqQ3eGSXQt29fmJub16kMHo8HHo+Htm3bYv78+cjNzcXHH3/MyUIYIyMjDBs2DGPGjEHr1q0RHR2NxYsXIzY2Fg8fPoS3tzdWrFiBevXqISYmBklJSRz06Hl0794d8+bNw8KFC3H//v1Xn/ACNG3aFJs3b4a7uztEIhHS09OxYsUKzWIYrpb3CgQC+Pn5oV+/fmjRogXq1auH+vXrw9DQULOsuF+/figtLcWYMWPwxRdfIDIyEnl5eZzIB8osN0dHRwiFQs54VtzjqqylXbt2wcXFBR999JFm5aRWeNOFR2oaNiwUCsne3p7MzMw026ytrSkiIoJkMhn98MMPnIVnmpub08yZM+nvv/+mI0eOUFRUFGVlZVFBQQEpFApKSUkhIyMjreUYGBjQ2rVrqbCwkEpKSujKlSvUrl07EolExOPxCCgrRDF69GiKjo5+roCHNuTu7k6TJ0+m33//na5evUp5eXlUXFxM8+fP14rvunXrSKlUkkqlotTUVNqxYwdFRERQfn4+5efn0y+//ELffvstGRsb11qGg4MD7d27l7Kzs6m4uJjkcjkVFRVRamoqlZSUkEqlIqVSqSG5XE6pqak0c+ZMzq4fAGrfvj2FhISQTCajNWvWPPVs1hV9/vnnlJ2dTSqVip48eUKtWrWqznlVhg2/cQVQUyXg4+NDISEh9Pnnn2tipl1cXCg/P5+KioqoZcuWWl9gxhg1bNiQzpw5o3mQFAqFhpRKJanVasrMzCR3d3etZInFYlq1ahUpFAp68uQJrV+/nlxdXas81sPDg/bt20d9+vSptTw9PT3y8fGhxYsXU0hICBUUFJBMJqPi4mK6fv06xcfHU3FxMU2ePLnW127hwoVUWFhIKpWKCgoK6PHjx5STk0Mqleqpa6hUKikmJoY+++wzEovFNZIjEAho8+bNVFRUREqlknJycmjbtm3UpEkTMjAwICMjIzIyMqLGjRvT33//rVEKEomEFi5cyNnL6OLiQnv27CGlUkkFBQXk6+vLGe+X0dSpUyktLU1zTbt161ad897+CkRmZmYYOHAgxGIxoqOjn1tim5KSolUBiwrUq1cPp0+fhqOjIwoLC3Hnzh0kJCSgsLAQcrkc/v7+6Nq1q6a6Tm3B5/PxzTffYP78+cjOzsZPP/2E3377rcpVg/r6+pg0aRKaNWtWqywyRkZG8PT0xHfffYf27duDMYYnT55oathduHAB8fHx2Lt3L0pLS3H48OFa9anCS66np4fS0lJEREQgNDQU06dPR3FxMQ4fPgxjY2O0bdsWlpaWqF+/PhYvXgy1Wo0///xTk4XoVfDw8ICfnx/09fWhVqvx0UcfYd++fc8dFxkZiY0bN6Jfv34QCoUoKCiodX2DqmBkZKQpGArgtflqAgMDMW3aNNjY2GjN661RAmKxGOPGjcPkyZOxbds2XLx48akLTkTYvXs3J2PlMWPGwNnZGU+ePMGqVauwZcuWp2K17969C8YYlEqlVje9devWmDx5MuRyOf755x/8+uuvL0weWZHj0NDQsFY3fuHChRg/fjwYYwgNDcX+/ftx48YNREZGahJgNGvWDJ06dUJoaGitZyEcHR3h7e0NPp8PtVqN4uJi7NixA+bm5khMTMTWrVshlUrRokULTJs2DS1atIC5uTm++uor+Pn5YenSpdVyGMpkMk0psYKCAhQWFsLExARFRUVPKRGRSIShQ4dqlNI///xT3WW31UKFnwgo83PUVbarZyEUCsHj8cAY01Bt8dYogd69e2PevHmIiorCxo0bq5yHfVWa6+qgItMwESE5ORm7d+9+SgEYGhpCX18fRITw8PBaB2qYm5tj6dKlMDU1xcWLF/Hzzz+/NHusSCSCtbU10tLSajUdJJFIsHv3boSFhSEiIqLKbEXdunUDAGzbtq3G/F8EtVqNsLAwjB8//qntp06dwqlTpzB27Fh0794dI0eOROfOndG7d2/s3LkTEonkpXyTk5Nx5MgRNGjQAPXq1cPOnTvxyy+/IDw8HImJicjLy4NYLIa5uTn69+8PkUikUUqv4l1d8Pl82NnZwdbWFgBw9uxZznNeikSipxyOKpUKcrkc3t7eMDU1RWlpKfLy8rRydL4VSqB58+ZYunQpcnJysH79+ucutL+/P4RCIZo0aYKSkhKUlJQgKioKMpmsxl9qT09PeHh4QC6XIygo6LmqNd27d0e9evWgVquxefPmWml+oVCIcePGoXXr1sjJycEXX3zx0qkrxhg6deqEZs2a4cSJEwgLC6uxzFWrVr10v7W1NUaNGoXMzEwEBATUmH9tsWvXLoSGhqJJkyZo1qwZ3n//fdy8eROhoS9fV1ZaWopt27bBwMAAH330EWxtbbF48WJIpVLcv38faWlpMDU1hUwmg5WVFYCyFG5cDQUYY3Bzc8PYsWNRv3595OfnIzQ0lLPUc6ampvDx8UGTJk3g7Oys2V7xERg8eLCmXw8ePNAuBd2bdgq+yjFoaWlJ586do6KiIlq0aBEZGRmRp6cnvffee+Ti4kJ9+/al69eva5xMt27doitXrtDy5cupadOmNXa4zJo1S+Nxfe+9957bv2PHDpLL5SSVSsnS0rJWTh1LS0u6ceMGqVQq+t///vfKkuq2trZ0/vx5ys3Npc8++4xzJ5OVlRWtWrWK0tPT6fvvv9eKV4cOHSg1NZXUajUpFAo6ceLEK88Ri8W0aNEiUqvVlJiYSOPGjSN9ff1qyTM1NaUpU6bQoUOHSCqVkkqlqpKUSiXNmTOnpqW8X0hCoZAmT55MEomEVCoVBQYGkqenJye8LSws6Ouvv6abN29SZmbmU/148uQJ3bt3j1JTU0kul5Narabjx49Xl/fb5xjk8Xjo3r072rRpg0ePHkEsFmPXrl2oV68e9PX1kZSUBHt7e/j4+CA5ORnHjh0Dj8dDgwYN0LZt21rVZ2vevDmAstjsZ+vxGRkZwd3dHXw+Hw8fPqy11u/atSucnJyQnp6OnTt3vtRaYYxh8eLFaN26NSIjI3Hq1KlayXwZ/P39MWTIEJw8eRK//fYbJzyJSFO/wcrK6qVmslKp1KQ5t7W1RZMmTXDs2LFqRRQWFBRg586duHDhAn7//Xe0bNkStra2cHBwQNu2bTWlz+Pj47Fz507OxuwVPhoDAwMAZfP6XBXCmTp1Kj766CNYWloiJSVF4yPR19eHq6srvL29nzre29sbPXr0qH09wjdtBbzMEnB2dqbbt2+TUqmkwsJCevjwIYWHh1NQUBAtWbKEWrRoQUuXLqVHjx5R9+7dyczMjMzNzcne3p5cXFzI0NCwxlp43759pFKpKCws7LkvdN++fSk5OZnUanWt4xGEQiFt3LiRSkpKaMmSJSQQCF567Lhx4yg/P5+kUimtWLGiJqmkqkX16tWj3bt308WLF6lBgwZa83N2dqZTp06RQqEglUpFaWlpNGrUqJeeY2JiQr/99hup1WpKS0ujGTNmkIGBQY1lM8bI2NiYLCwsaMyYMRQXF6f5gq5du1YTc8EFmZubU3x8vIb/8uXLtYp5qEy7du0ipVJJUqmUPvvsM3J2diZnZ2fy8vKin3766TkrR6FQ0L1796hHjx6v4v32xQk0bNiQjh49Sl999RWNGDGC2rdvT6ampmRiYkJ6enrEGKNZs2bRnTt3yMTEhJMb8MEHH9CtW7foiy++eG7fTz/9REVFRaRWq8nHx6dW/N3c3Ojy5cukVqtfGA9Q8UAvWrSIsrKySK1WU15eXnXngqtN+vr69Pnnn1N4eDh17dqVk5eEMUb29vZ07do1zQN67do1atas2QvPsbW1pejoaFIqlXTp0iVq0aKFVm1o1aoVhYaGklwuJ6VSST/++CM5OTlxeu1atmypiYWIjo6mgQMHcqZk9uzZQyqViuLj48nU1JQAEJ/PJ39/fzp+/PhTQVCVFUFSUhJ99NFHL/v4vX1KoKLzPB6vynGzs7MzHTt2jFauXEl6enqc3ADGmEZm5e16enq0c+dOksvlFBYWprk5NaX69evTtWvXSK1Wk7OzMzHGNDL5fD4JhUJq1KgR/fbbb5SXl0dqtZpUKhWtXLnylb6DmvazS5cuFBYWRvv37+f8JenQoYMmQEcul1NwcDCNGjXquWg6Ho9H77//PuXk5FBkZCT1799fa9m9e/emrKwsUqlU9ODBA04snGefhT/++EPzEt64cYPatGnDGf+9e/dq7vv+/fvpk08+oa+++kpj2ajVasrPz6epU6dSly5daO/evRplEBUVRV26dHmRxfh2KoEXEY/Ho/Xr11NQUBA1atSI05v8ogcrOjqaVCoVTZ48udYvpIODAx09epQUCgX98ccf1LdvX+rWrRutXbuWNm/eTFevXqWYmBhavXq1Rl5BQQE5ODhw2h9XV1fat28fBQcHU9u2bTk1lYEyZ1/Tpk0pPj6e1Go1qdVqevLkCS1cuJDc3d3J2NiYDA0NydTUlBYvXkzp6em0fft2srW11UpuvXr1aMWKFSSVSkkmk9GXX37JmZleQW5ubhoFIJVKaeXKlZzy//333zWRkFU5OKVSKa1atUrjmG7atClFRkZSYWEhSaVSSk5OpjVr1pCLi8uzvN8+x+DL4OrqCmdnZ5w9e7bKCi1cgs/no0OHDnB0dMSTJ09w4cKFCuVVY6SmpmLlypUwNjbGkCFDMGzYMABl8+m5ubl49OgRvv32W5w/fx6tW7dG/fr18dtvvz03VakNRCIR2rdvj1atWmHt2rW4efMm5wVOpFIpoqKisH//fsybNw+MMZibm+OHH37AwIEDERYWBoVCgdLSUoSGhuLTTz9FWFiYVtWDraysMH78eHzwwQcoLS1FcHAwLl26xFn13goQEdRqNQQCAR4+fMh5XcpVq1ZBJpOhV69eEAqFYIzBzMwMjDHk5OQgNDQUAQEBmkVY4eHheP/99zFixAi0atUKLi4uaN68OZydnasVPPdWKgGhUIiePXsiJycHu3fvrpOyYJVhb2+Pxo0bQywW49ixY1qHJl+7dg3Tpk3DkCFDIBaLAZTVlrt27RrCw8NRXFyMFi1awNbWFo8fP8aGDRs4K2vFGIOLiwtGjBiB5ORkXL9+XeuU1S+CSqXCzp07YW9vDycnJ7Ro0QIGBgZo06YN2rRpAyLC48ePYWhoiP/9739aZdDV09PDiBEj8O2330IoFCI8PBzLli3DtWvXaq2wX4SioiLcv38fTZs2hUQi4bzeYWxsLL788ksEBARAJBJBIBCgdevWEAgECAsLw4ULF56bbQkPD0d4eDhMTU3h5+eHhIQEJCcnV0/gmx4K1GY4YGBgQEOHDq3uyimtqXfv3hQZGUmlpaU0adIkzuaaX0bu7u508uRJ+vnnnzmdEdDX16elS5dSTEwMzZw586WzE1wRj8cjf39/+uWXX+jw4cP04MEDOnXqFB0+fJg+/PBD8vDw0FpGixYt6Pr16xqzOSwsjAYMGMCZr6gyMcZo0KBBtGLFCho/fjznw406pHfLJ/A6ady4cZSVlUUJCQnk6+vLqYPuRSQUCqldu3bUrFkzTuV1796d4uPjadu2bVSvXr3Xdg0FAgHZ2NiQm5sb9ejRg7y8vMjNzY0TBWdvb0/79+9/auycm5tLa9as0drH8I7Ru+UTeJ1ITk5GYmIirl69iuTkZM7Ny6qgVCpx/fp1zvna2dnh4cOHWLt2LScrLqsLlUql8Wtwnd2nsLAQmzdvfmrNAxEhLS2tzkuTvwt4pxKN1hXEYjFsbGxQVFSEnJyc16IE6gqmpqYwNjZGWlpanVc71uFfhyoTjeqUgA46/HdQpRKobRkyHXTQ4R2BTgnooMN/HDrHoA5vDJ6engDKVvjp/BNvDjol8C+GiYkJWrduDbFYDKlUiuDg4DoPjHpd8PLywqFDh5Cfn4+ePXtqXbHnTYAxBktLS3h4eMDS0hI8Hg+xsbGIi4urswCsusBbrwQsLS01GVh4PB7UajUePXqEsLAwTkNtXydEIhHq16+PwYMH49NPP4WZmRkuXbqE6dOnvxNKwMPDA1988QXc3d3x559/al1L702Ax+PBy8sLH374IQYOHAh3d3cIBAKcOHECM2bMeLuK4LzpQKHaBgsJhULq1asXbdiwgcLCwjRpwBUKBT148IDmz59fqzXpb5pEIhGNGDGCjh07Rk+ePKH8/HzaunUrdejQgZMaBzUhV1dXmjlzJjVp0oQTfowx8vb2po0bN1JGRgbFxMS8thTdXJObmxsFBARQbm4u3b17l9avX0/Xr18niURCM2bM4HxBFkf0bkUMGhkZ0aJFi+jChQt0+fJl2rJlCx04cIBCQ0NJpVLRhQsXar3m/1U0adIkOnjwYJXpx7QhfX196tq1K507d47y8/Pp9OnTNG3aNLKzs3utDwuPx6POnTvTsWPH6NixY+Tl5cUJX3Nzc/r+++8pMzOTkpOTadCgQVqFLZuZmdHXX39Nhw4dokmTJr2268MYoxkzZlBWVhatXr2aWrZsSZaWljRq1ChKTk6mO3fu1EmkImOMnJ2dadCgQTR79mxasmQJzZ07lxwdHavL491SAjwej+rVq0eurq7k4uJCVlZWZGdnR61bt6bU1FS6du1arXIMvoj4fD75+PiQlZUVhYeHk1KppJMnT3Kq8Zs2barJp7hlyxby8vKqdq49LsnMzIwuX75M9+/fp379+nGyvsDNzY3Wrl1LKSkplJWVRV9//bXWlpqvry9FRUWRUqmkqKgo6tGjx3Nx/La2ttS6dWvatGkTBQQE0P79+2nOnDla5U+oWMa+a9cusrKy0mxv0KAB3b17l6RSKWfWE1BmHc6fP59OnTpFISEh9PjxY8rOzqa8vDzKzs6mM2fOkIWFRXV4vVtKoCoSCAT0v//9j+RyOR09epTs7e215ikWi2nAgAF05MgRevz4MT148IBkMhkpFAratGkTZ3H99vb2dPjwYZLL5RQSEkIdOnR4IyYlY4w2bdpE6enp9P7773OiAIRCIb3//vuaBKQLFizgpFRXy5YtKSEhQVMhKiMjg44dO0ZffPEF+fv705dffkmXL1+m9PR0KikpIZlMRo8fP6br169rbTkYGxs/p3D4fD4FBASQXC6nTp06cXZPDAwMKDAwkPLy8ujixYs0efJk6tu3Lw0ZMoQyMjIoJSWlus/6u6MEzM3NacCAAc+ZqW3atKH09HTKzs6mefPmaXXheTweNWnShAIDAzUvfUW6qopsOZ9//jlnN9rX15eKioro3r171KtXrzpVABXZjKra17t3byopKaHz588/9ZXT5jo2atRIUzPw2rVr1KZNG076V6EEKifcqLhPUqmU5HI5yWQykkqldO/ePZo9ezb5+PiQQCCos+v70UcfUX5+Pv3888+c8hUIBCQUCjVtZ4zR1KlTKTc3tyZl1d4dJeDo6Ej/+9//qHPnzpqHul69evTo0SPKzs6mlStXkrW1da0vuEgkovfee48ePXpECoWCCgoK6OzZszRy5Ei6cOECKRQKSk1N1boOYQUZGhrSr7/+SklJSfTBBx/UycNZQQYGBvThhx9Sr169ntvn5OREycnJlJ2dzUlNRx6PR506daLjx4+TXC6n69evU9u2bTnry7NKoLIyKCkpoZSUFJo+fXqN6xxqQ8eOHSO5XM65EniWxGIx7d69m/Lz8+nDDz+s7nnvlhJYt24dDR06lEQiETVs2JCCg4MpNTWVPv3001rXAwDKXsjx48dTWFiYpkjn+PHjydzcnPT09OjIkSMkl8tJIpHQokWLOPmi+Pj4UE5ODt25c0fzkgiFQs1aeAMDA07Mcj6fT5MnT6aCggL6/fffn3o5rKysaPfu3VRUVETfffcdJ/I8PDwoNDSUZDIZnT59mjp06FBlLgYrKyuytrauscymTZtq/DOVlYBEIqGzZ8/S0KFDX+taf4FAQOfPnyeFQkGzZ8+uU1m9e/emuLg42rhxY02U3LulBDZt2kSffvopjRw5ks6cOUORkZE0ffp0rdan8/l8mjFjBhUVFZFEIqEdO3ZoprB4PB4NGjSIYmNjNZlg+/Tpo7VPgDFG06ZNo+LiYtq6datmrDlgwACaMGECNWjQgPr370+9e/cmkUiklSxvb2/Ky8uj0NDQpwplMMZo5syZlJeXRwcPHiRzc3Ot++Tl5UV//fUXqVQqunfvHnXu3Pm59pubm1ObNm1o8+bNtGnTJmrfvn2N0sQbGBjQvHnzKDk5+SlFUFxcTDExMbRt2zYaPnw4ubi4vJYcEO7u7prp6rqc+hSJRLRlyxYqKCigoUOH1uRD9O4oAU9PTwoICKDw8HC6e/cu7d+/nwYOHKh1gop+/fpRbGwsFRUV0a+//qrxIOvr61OPHj3o5s2bJJPJSKVS0cmTJzm5oTwejxYuXEjx8fHUsmVLMjExoYkTJ1JkZCSlpqbS3LlzadCgQfTgwQNq3769VrK2b99OJSUltGDBArK2tiZPT09q1aoV9erVi4KDg6mkpETr4QhjjNq3b0+nT5+mvLw8unTpEs2bN0+jAMzMzMjW1pY6d+5MP/74Iz148IAUCgUVFhbSwYMHqV27djWSp6enR9OnT6eff/6Z1q9fT5s3b6YLFy5QUlISyeVySk5Opl27dr005TlXNHjwYEpOTqasrCzOhopVUcuWLenatWt09OjRmvptaqcEADgBuAggEsADAJ+Ub7cAcBbAw/K/5uXbGYD1AOIAhAPw51IJ8Pl86t27N0VFRVFiYiItXryY3NzctNb0fD6fLly4QEqlknbt2qXJumNgYED9+/enq1evUlZWFkVGRpJcLudMCfD5fDp27BhFRUWRl5cXTZgwgSIjIyk0NJQWLlxIPj4+ZGxsTPHx8bRu3TqtZKWlpZFcLqf9+/fT33//TcePH6fg4GB68OABFRUVUVBQEC1evFgrGXZ2dnTmzBlSKpUUGxtLgwYN0hQEGTZsGK1fv57++usvunXrFslkMrp//z7duXOH0tPT6fHjxzRu3Dit5Ovp6ZGPjw+NGTOGli1bRnfv3iWFQkGnTp2qsYJ5GYnFYnJyciITExMSCoXk6OhI27dvp7y8PPruu+/qJK1ZRf+++uorys3NpXHjxtXUOqx1ZiEVgE+JKIwxZgzgNmPsLIAJAM4T0XLG2CIAiwAsBNAHgGc5tQawsfyv1hCJROjVqxcWLVoEFxcX3L59G0eOHOEkU42VlRUcHBzAGMPPP/+MrKwsGBkZ4f3338eMGTPg7u6O33//HU2aNIG7uzsHvfl/ODs7w9jYGCNHjkTXrl3x+PFj/Pzzz7h8+TKKi4thYmICExMTODg4aCXn+++/R/fu3eHr64v79+8jKSkJpaWl8PPzw+7du7FlyxatquryeDzMnTsX7dq1Q1FREebMmYPExETMnz8fDRs21GTAvXnzJnbt2gWZTIbIyEh06tQJEydOxM2bN3Hz5k2t+iiXyzVVlw0MDBAUFITVq1ejS5cukMlkGDx4sFb8gbLqzWPGjIGrqyuKiorw6NEj6Ovro1u3bsjPz8f27dshl8u1lvMs+Hw+unbtilGjRuHkyZMICgripqxaLUz3IwB6AIgBYFe+zQ5ATPnvzQBGVzpec5w2lkBFsYzY2Fg6e/Ys/fXXX5Sens6Zt9nY2JiioqJIpVLRkCFDaODAgbRx40ZKSUmh5ORk+t///kc2NjZ04MABTi0BHo9H27ZtI5lMRpmZmXT37l0aMmTIUxp+0KBBJJPJaMeOHVrJMjAwIHt7e2rYsCHZ29uTh4cHbdy4kSIiIjiJS3BycqIbN26QWq2my5cvU7t27eivv/6i/Px8kkgkFBoaSl9//TX5+/uTgYEB6enp0ezZsykiIoLS0tJo9uzZnJdZEwqF9Mknn5BEIqF79+5pzc/S0pKuX79OBQUFdPr0abp69SpJJBIqKCgghUJBf//9d504Iyv8LMeOHaO0tDQaPXp0bRLeau8TAOAKIBmACYD8SttZxf8AjgHoUGnfeQAttFUC3bp1o9DQULp+/Tq1adOGPvvsMyouLqZPP/2UkykggUBADx48IJVKRTk5OZSTk0PFxcV09+5d6tu3r0bGvn37OFUCjDH6+OOPSa1WU2FhIa1fv/652Y2KCLFq1JqrEfXp04cSEhJo2bJlnATvDBw4kB49ekT5+fnUoEED+u2330gqlVJ8fDyNHDmSHBwcSCwWk42NDS1YsIBu3bpFeXl5JJFIaOXKlXWW+FRfX59u375NRUVF9P7779eaj1gspuPHj1NJSQlNnDiRzM3NqXv37hQdHa0psJKTk0NffPEF2drakp2dHWcZsfX19WnGjBlUUlJCq1evrm3ZPe0SjTLGjAAcBDCXiCSMMc0+IqKapghjjE0DMK06x06YMAEbN26ERCLB3LlzERISAicnJ2RnZ6Nhw4bQ19eHVCqtifjnoFarsWrVKvzvf/+Di4sL5HI5/v77b6xbtw4xMTEVyqpOoFQqUVpaiidPniA8PBwKhQKMMVhbW2PkyJGwtLTEqlWrcO7cOc5kGhsbo1WrVigoKMD58+chkUi05ikQlD1ORkZGWLVqFbp37w61Wo2goCC4uLigUaNG6NmzJzw9PWFsbAw+n48HDx5g+fLlOHz4MGcVg5+FTCaDUqkEn8/X1HmoDTw9PdGiRQskJCTgr7/+gpmZGXr27Al3d3ckJycjNTUVjRs3xpdffonJkyejtLQU169fR1hYmFZ1IxhjaNy4McaNG4eoqCgEBgZycr80qKYFIARwGsD8qsx81OFwQCwW061bt6ikpIRmz55NIpGI9PX1afDgwRQZGUn37t3jtESXSCQisVhM+vr6VZrHXFsCQFnI8IYNG0gqlVJGRgatW7eOJkyYQKdOnSKZTEZZWVnUsWNHTr+O7dq1o4SEBPruu+84W23p5eVFW7dupSdPnlBxcTGp1WpSKpVUVFRERUVFVFhYSDk5ObRv3z6aNGkSmZqa1pkDrTLx+Xy6efMmSaVSmjhxYq35TJ06lfLz82nHjh3k5+dHf//9N8nlcoqOjqZhw4aRnp4etWnThvbt20eZmZmUmZlJS5cu1dppbWhoSD/88AMVFhbSDz/8oM2wrXaWACv75P8BIIqI1lTadRTAeADLy/8eqbR9FmPsH5Q5BAuIKP1Vcl4EkUgEZ2dnMMbg4OCAGTNmwNnZGQMGDIC7uztiYmLA5/Nry/45vIm17enp6fjpp58gEokwePBgfPTRRxAIBJDL5cjKysKcOXNw9epVzuQZGhqic+fOSEtLw/Hjxzkr0xUVFYWPPvoIV65cgY2NDT788EOkpaUhMDAQQFnlnqtXryIxMfG1ZhLq0qUL7OzsoFAoNKW7aoPExERIpVKMHj0aY8aMQXFxMW7evIl169bh6NGjUCqVuHHjBkaOHIk2bdpALBbj9u3bWluRvXr1wsyZM/Hw4UOcP39eK15VohpWQAeUaZFwAHfLqS8AS5SN9x8COAfAopJ/4FcA8QAi8Ap/wKssAaFQSDt27KAnT56QVColtVpNJSUllJqaSklJSXTx4sU6nZN9liosgf3793PO28LCgiZNmkR79uyh48eP09atW6l79+6cx7m7ubnRw4cPacOGDW9lzoVXEY/HI2dnZ2rXrh117NiR9u/fTzKZjIKDg7Xiq6enR2vWrKFjx45RYGAgrVq1itOVqlWRWCymQ4cOkUwmo2vXrtHw4cO1WVlaO0uAiK6h7MWuCt2qOJ4AzHwV3+pCqVRi2bJluHPnDmxsbGBkZASJRIL4+HhIpVIkJSXVeUHSqlAX6bByc3Px559/4s8//+Scd2XweDzk5OTg8OHDnBfrfJMQi8Vo0aIFjIyM8N5772HUqFEQCoWwsLBAeno6du/erRV/uVyO+fPnc9Ta6sHR0RHdu3dHaWkpcnNzER8fD5lMxqmMtyK9WExMDGJiYt50MwCUtUWhUMDOzu5NN6XWyMnJwYoVKxAUFPSmm8IpHB0d8dVXX8HOzg5EhOTkZE2KucDAQOzbt+8Nt7DmkMlkSEhIQFRUFDZs2IA7d+5wLkNXfKSGcHV1RdOmTZGbm4tr16696eboUAlmZmZo3bo1DA0NoVAokJqaqvGip6Sk1EkAT11DIBCgRYsWyM7ORnx8vLbsdBWIdNDhPw5dBSIddNDheeiUgA46/MehUwI66PAfx1sxO6ADt2CMwdDQEJaWltDT04NEIoFEInmnpgt1qD50SuA/Bh6Ph0aNGqFPnz6YPHkynJ2dcfXqVZw9exa7d+9GRkbGm26iDq8Z74wSMDExgZubG+rXrw9zc3MolUpER0fj3r17b+XUUF2Bx+PBz88P/v7+0NfXR05ODjp27IjOnTvD1tYW+/fvx61bt7SWIxQK0bt3b9jZ2aG4uBixsbGaIJfi4mIkJydrtajmVTA1NUX79u1hZmaGixcvIiMjo04Xgb3NeOuVgKmpKQYMGIDWrVvD09MTYrEYBQUF4PP5SE9Px5o1axAZGVkjnn5+fujTpw9+/PHH5/YZGf1fe+ceFPV57vHPu1x2uQgLiCAKKKAEFUQNaI21xIlBqYmxY5s0jtiGjpMJSTWXpiSamtgmbdIa07THtDp0qtEmRj3HxJEkh5McovUWFQkX5bIqlcDKRVjCJeAu+5w/gD0aJYns4i51PzPv7PL77bzv9333tw/v9Xn8iY6OpqyszFFVuKlYLBb27dvH6dOniYmJQavV8qMf/Yj58+eTnZ2Np6en3UYgLCyMrKwsVq5cSWRkJG1tbZSWltpOera0tHDo0CF27NhhlxOTryMpKYn169cTGxtLdnY277zzzpAaneHMsDUCoaGhpKSkcO+99zJz5kzKy8s5cOAABw8epLGxkZiYGO6//37GjBlzw0YgISGB1atXc/DgwWs2BD388MNkZGSwYcMG9u/f78gq3TTa2tooKiqiqKgIjUaDyWQiMTGR8ePHM3PmTAICAuw6qhoeHs6qVasICgqisrISESE4ONh2z8/Pj7S0NGJjY1m3bh0tLS2OqpqNkJAQW4/wyy+/dFovwNvbmwkTJmC1Wq/avORKDDsj4OnpSVJSEg8//DDz5s2zbafMz8/HZDLZ9vTrdDoCAgIIDAwcVDl6vZ4NGzbwwgsvkJeXB0BmZibZ2dmMHTsWg8EwJEZAKcW8efNYsGAB27dvp6SkZEhP3FmtVo4cOcKhQ4eIiIhg6tSphIaG2vWwXrx4kZdffhmNRnNNGyUnJ/PYY48xffp0MjMzKS0tZfPmzfZW4ypCQkK44447CA8Pp7KykrKyMoeGCu93B3clfn5+REREEBkZiZeXF0op7r77bjw9PRk1ahQiwu9//3vefPPNQZWplCIiIoIVK1awYMECvL29AXjttdfYtWuXffW7UfdiQ5G4gdNhs2fPlrKyMuns7JSSkhK5++67r/EspNFoZOnSpbJv3z65/fbbb/i0VXx8vJw6dUouX74sBw4ckJkzZwogv/zlL6W5uVnMZrNs377doafF+oNNPvvss1JWViYdHR1SU1MjqampN8Vd9pNPPikmk0ksFou8/vrrdtfFx8fnuh6fvLy8JDExUY4ePSqXL1+Wzz//3OF1GT16tOTm5orFYpHjx49LdHS0Q/KdN2+e7N27V6qqqsRoNEpdXZ0tXbx40RZF2mQySWtrq5jNZmltbbW5Qn/iiScGVa6Hh4csWbJEjh07JkajUfLy8iQnJ0fy8/PFaDTKqlWrvm1e9nkWchV8fX2JiIjAYDCwdu1aCgoKrvEBoNfruf3227FYLHR0dNxwGefPn+fChQtMnTqV2267jbS0NEpLS1FK2ZIj8fLyYsmSJfzud78jLCyMY8eOsXv3blJSUtDr9Q4tayBOnTpFd3c3/v7+BAQE2JWXiAzo6clsNlNaWsqePXtISkoiKCiI1NRUux2MfpX+7+nw4cMO64IXFBTQ0tJCZmYmPj4+zJ8/n4iICNra2igsLKSyspLw8HAaGxuxWCzU1tZSV1fHH/7wB06cOMGBAwcGVY+HHnqI9evX09nZydq1a3n77bfp6upiy5YtfPLJJzz11FO8/vrrgx/yOLsXcCM9AaWUxMTEyE9+8pOvDcc8ZcoUOXHihOzatWtQvgaUUpKeni7t7e1iNpvl3XfflYSEBPnVr34lLS0tYjabHeY7rt9Pf3V1tRgMBsnJybHV7Qc/+IHceeedN+XMv5+fn1RXV4vFYpG///3vQ17etGnTxGQySXd3t2zbts2hHobS09OlqalJenp6JDMzczAOOb8xpaamislkkl27dg0Y8ao/PN6kSZMGXU5oaKhcuHBBysvLJTEx8Zr7GRkZ0tra+m2Dnfz7BB/5pkbLyckRg8EgS5cuHXQ+Wq1WVq1aZQtmmZubK//617+kp6dHmpqaHBKmC3odiZw+fVrOnDkjGRkZV3X9R44cKS+99JLk5uY6rLzrJU9PT3nkkUekpaVFLBbLkMfRAyQ5Odk2/Lhw4YJdsSMH+mEMlRHQ6/Xy6aefSnFx8TVBcR2dnn/+eens7JQnn3xSAgMDRa/XX+VkZvz48dLY2HhVRKmvSdc1Av9W24YDAwN55JFHyMrK4sMPP+Tjjz8edF5ms5lDhw5RVFTE5MmTWbFiBWPGjEFE+Otf/+qwybrZs2czatQo/vjHP/LBBx/YunRarZbg4GDuuusu7r//fiIjIx1S3vWYNm0ay5Ytw8/Pj+bm5kFPXg2EUoqgoCCCgoKuuScimEymIVm+u3z5Mmaz2aErAxqNhqysLCZPnsw777xDeXm5w/K+HjqdDo1GQ2JiImvXrmXdunVMmjQJjab3p5uWlobJZKKqqmrQZQy7OYGBCA0N5Z577mHZsmUYjUa2bt1Kc3PzoPOzWq1UVlayfft2dDodEyZMQKfToZSiqqrKYQ9WUlISDQ0NHDlyBC8vLzw8PIiPj2fmzJl8//vfJykpiaamJru9KQ/E2LFjycrKIjExEaUUb731FiUlJQ7Lf9SoUcTFxbFgwQK0Wi0VFRXU19eTnJyMl5cXVquVM2fOONxbDoDBYODzzz936OqKr68vK1eupKmpiX/84x9DvvR4/PhxiouLmTVrlm2795dffsmLL75IR0cHI0eOJD8/364yXN4I6PV6wsPDmTp1KhMmTBjwc1FRUaSlpREdHY3RaCQ5ORk/Pz9KSkoGvSHliy++YOvWrZhMJnJyckhISKC9vZ3W1tbBVucaOjo6CA8PZ926dVRWVuLp6UlKSgpxcXFUVFRQW1tLfX29zUOOPeh0OvR6vW1rcEBAAA8++CD33Xcffn5+HDp0iDfeeMPuHZY6nY6YmBgSExOZN28eU6ZMITExEV9fX5RS1NTUEBYWhpeXFyJCbGwsiYmJVFdX09DQYFfZ3t7eNq9Px48f59y5cw41Al5eXkRGRlJTU0NaWhpz5szhiy++4Ny5cxgMBoefv9izZw9GoxG9Xo+3tzeLFi0iJiaGkJAQOjo62L17t92GyKWNwOLFi1m6dClRUVFER0cTHh4+4Gc9PDxsXaTU1FRiY2PZt28f58+ft2tXWnt7O3l5eSxcuJCEhATKysooLCx02H+A/fv3M3nyZBYtWkRKSgqXLl3i0qVLbNq0iby8PF588UXq6uoGXV5QUBDf+973SE9PZ8SIEYwYMYJLly4Bvf/VZsyYQWhoKBaLhZdeeonKykq76xQVFcVrr71GXFwcERERtngEHR0ddHZ22gwA9A4HvLy8+NnPfkZeXh579+61q2y9Xk9qaipKKYqKimhsbLS3OteglGLs2LH8+te/BqCzs5OGhgZ27NjBm2++6XD/k4cPHwZ6h4hxcXEsX76csWPHcuHCBYeE4HNZIzBr1iyefvppZsyYYesyvvvuu5w8eZKOjg6+853vsHz5ckJDQ+nq6mLfvn3s3LnT9mMREaqrq6mrq7Nby6RJk4iPjwegtbXV9iNyBP1LnZs2bQJ6x7FdXV00NTXR1dWFn58ftbW1g85/4sSJPP3000ybNg0PDw+UUlcZlH7DqdFo+PnPf24LmmEwGMjPz6etrY2qqqobWmZbuHAhd9xxB1qt1vbd7d+/H4PBQEBAAI8++ihRUVH09PSwa9cufvvb32K1Wh3SrlqtlpEjRwK935UjXMhrtVoWLFhAcXExtbW1LF68mDvvvJODBw9isVgIDQ1lyZIlPPbYY4waNYpXXnllSE9kXrx40S7X6dfg7JWBgVYHVq1aZYsCfM8990hYWJgEBgbKxIkT5Te/+Y2UlJRIZ2ennD9/XrKzsyU0NFQ8PT2vSo5y1b1o0SKpqKgQs9kseXl54u/vP+Sz59AbzKOurk7mzp076DzWrVsnJpPJFiZroGSxWKS7u1u6u7ulq6tL2traxGg0yp49eyQ+Pv6GytyxY4d0dXXZwqCPGzdO/P39RavVyuOPPy4NDQ1isVikpqZGgoODHdZePj4+kpOTI21tbdLZ2SkvvPCCBAYG2p3vnDlz5NVXX5XY2FiB3s1o/v7+otFoRKPRiJeXly1OYElJyY2GC//WKTg4WDZs2CB/+tOfBhs2bnhtFiooKOChhx5i0qRJZGVl8cADDxAdHc2YMWNsgSQ2b97Mli1bqKqqGvKgIUopNBoNd911F0uWLGH79u1DPik0bdo0vL29B73ZZdy4caSmpuLr62u71q+5p6eHs2fPsnPnzgEnAq1WK9XV1Tc8RPD29kYphdlsZuPGjfT09ODp6cmyZctYvXo1wcHBNDY2snz5crsmb7+Kj48PixYtwtfXFxFh2bJlHDx4kI8//tiueYH58+fj4+Nj6+ZbrVba29tt961WK+Xl5bz33nusWbOGhIQE/vnPfzr8+fD19SU8PJyGhgaHboN2WSPw2WefkZ+fT3h4OOnp6VitVsxmM/X19eTm5pKbm0tZWdlNOSZssVhs8QI1Go1tPDvUzJ49m6amphs+ANVPdXU15eXlzJ49Gz8/P9tyWWtrK4WFhTzzzDOUlpY6WHXvd7dw4UI++ugjHnzwQYKCgpg7dy5TpkxhzJgxWK1W8vLyOHr0qEPL1el0aLVaWx03b97M0aNH7Z4YrK2t5d577+W2226jtbX1us+ciKCUQqvV4ufnZ1d5A6HT6QgODnbIJPFVOHso8E2bhZKTk+XZZ5+VzMxMSUlJcUgE4sGkP//5z7au87Zt2yQiImLI4+j99Kc/lY8++siuzS6jR4+Wxx9/XD744ANZuXKlrFixYsg3uIwbN06OHj0q3d3dtn3z/eny5cvyySefyKxZsxwaWcnDw0OeeOIJ6enpkebmZlm/fr1DhgL9bbh7925paWmRNWvWSHR0tPj7+4tOpxOdTicBAQESFxcn+/fvl9ra2kGdV/k2afr06XLq1ClZs2bNYJ+94TUc6Kf/yKuzqampobGxkZCQEH784x8TEhLCc889R2Fh4ZCV2R/rzp7/ZEajkY0bN7Jx40YHKvt6qquryc7OZuPGjbaVAL1ej8lkwmAw8Nxzz3H8+HGHLt0ppZgxYwZms5ni4mI+/PBDhy3lGo1GXn75ZQIDA3nqqaf44Q9/yN69e6mvr0cpRVRUFN/97neJjIwkNzd30D23b8LDw8PWG3ZkD9jljYCrkJubi7e3N6tXryYwMJCGhgaHrhJcj4CAANvs/XDj5MmTNqcier2eiRMnUlFRweHDhx2yYvNVenp62LJlC83Nzbz//vsOH2oUFhbyi1/8gsWLFxMWFkZGRgbBwcF4eHjQ3t6O0WjkL3/5Czt37hySjV2enp5ERkai0WgwGgcd3/f6eTs0t39jmpqa2LRpE5cuXUKv17Nt27Yhj4EYFBQ0bI0AQHl5+ZBvq+1HRCgoKKCgoGBI8u/p6bH1Sn19fZk6dSrh4eF4enrS2tpKTU0NZ8+eHbIJ6hEjRpCenk5DQ4PDexpuI3AD9G/iuVnU19fT0dEx5KsQbm6Mzs5Ojhw5clPL9PHxISEhgbq6OodvRnKHIXNhQkJCUEoNmR8+N8MHb29v4uPjbQFKB3ngyh2L0I2bWxx3LEI3btxci6vMCTQBHX2vw4mRuDUPNcNNL7iu5ujrXXSJ4QCAUurE9boqroxb89Az3PTC8NPsHg64cXOL4zYCbtzc4riSEXBsBIqbg1vz0DPc9MIw0+wycwJu3LhxDq7UE3Djxo0TcBsBN25ucZxuBJRSC5RSFUopg1Iqx9l6BkIpVa2UKlFKFSmlTvRdC1ZK5Sulqvper3Wsf3M1/k0p1aCUKr3i2nU1ql5e72v3YqXUdBfS/LxSqravrYuUUhlX3HumT3OFUirdSZojlVL/q5Q6rZQqU0qt6rvu0m09IE52JuIBnAViAG/gM2CSs52cDKC1Ghj5lWuvADl973OAl52scS4wHSj9Jo1ABvA+oIBZwDEX0vw88NR1Pjup7xnRAuP7nh0PJ2geDUzvez8CqOzT5tJtPVBydk8gFTCIyDkRuQy8DSx2sqYbYTGwte/9VuA+50kBETkAfNVp30AaFwPbpJejgF4pNfqmCL2CATQPxGLgbRHpFpHzgIHeZ+imIiJGESnse98GnAHG4OJtPRDONgJjgJor/v6875orIsB/K6VOKqVW9l0LE5F+Dw8XgTDnSPtaBtLo6m3/aF/X+W9XDLNcTrNSahwwDTjGMG1rZxuB4cQcEZkOLASylVJzr7wpvf0+l15vHQ4a+3gDiAWSASOwwalqBkAp5Q/sAVaLyFUuoYdRWzvdCNQCV0baHNt3zeUQkdq+1wbgv+jthtb3d+v6Xu2LoTU0DKTRZdteROpFpEdErMAW/r/L7zKalVJe9BqAHSLyn32Xh11bg/ONwHFgglJqvFLKG3gAeM/Jmq5BKeWnlBrR/x64GyilV+uKvo+tAN51jsKvZSCN7wGZfTPXs4DWK7qyTuUr4+Ul9LY19Gp+QCmlVUqNByYAnzpBnwJygTMi8uoVt4ZdWwPOXR24Yua0kt6Z3jXO1jOAxhh6Z6U/A8r6dQIhwEdAFfA/QLCTdb5Fb/fZTO+4M2sgjfTOVP9HX7uXALe7kOY3+zQV0/sDGn3F59f0aa4AFjpJ8xx6u/rFQFFfynD1th4oubcNu3Fzi+Ps4YAbN26cjNsIuHFzi+M2Am7c3OK4jYAbN7c4biPgxs0tjtsIuHFzi+M2Am7c3OL8HxMxU5UFha0GAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "mnist_train = datasets.MNIST(root=\"./data\", train=True, download=True, transform=transforms.ToTensor())\n", "mnist_test = datasets.MNIST(root=\"./data\", train=False, download=True, transform=transforms.ToTensor())\n", "\n", "\n", "# Construct the DataLoader and show one batch\n", "train_loader = torch.utils.data.DataLoader(mnist_train, batch_size=64, shuffle=True)\n", "test_loader = torch.utils.data.DataLoader(mnist_test, batch_size=64, shuffle=True)\n", "\n", "# Show one batch of images. Each batch of images has shape [batch_size, 1, 28, 28],\n", "# where 1 is the \"channels\" dimension of the image.\n", "for images,labels in train_loader:\n", " grid_img = torchvision.utils.make_grid(images)\n", " plt.imshow(grid_img.permute(1, 2, 0))\n", " plt.title(\"A single batch of images\")\n", " break" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "import torch.optim as optim\n", "\n", "criterion = nn.CrossEntropyLoss()\n", "optimizer_cnn = optim.SGD(conv_net.parameters(), lr=0.001, momentum=0.9)\n", "optimizer_fc = optim.SGD(fc_net.parameters(), lr=0.001, momentum=0.9)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "5it [00:00, 19.72it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 1, step 1] cnn train loss: 0.015\n", "[epoch 1, step 1] fc train loss: 0.015\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "155it [00:06, 24.82it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 1, step 151] cnn train loss: 0.014\n", "[epoch 1, step 151] fc train loss: 0.014\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "305it [00:12, 24.63it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 1, step 301] cnn train loss: 0.009\n", "[epoch 1, step 301] fc train loss: 0.009\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "455it [00:18, 25.00it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 1, step 451] cnn train loss: 0.007\n", "[epoch 1, step 451] fc train loss: 0.007\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "605it [00:24, 25.84it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 1, step 601] cnn train loss: 0.006\n", "[epoch 1, step 601] fc train loss: 0.006\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "755it [00:30, 25.34it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 1, step 751] cnn train loss: 0.005\n", "[epoch 1, step 751] fc train loss: 0.005\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "905it [00:35, 25.76it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 1, step 901] cnn train loss: 0.004\n", "[epoch 1, step 901] fc train loss: 0.004\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "938it [00:37, 26.80it/s]\n", "6it [00:00, 24.40it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 2, step 1] cnn train loss: 0.002\n", "[epoch 2, step 1] fc train loss: 0.002\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "156it [00:06, 25.79it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 2, step 151] cnn train loss: 0.001\n", "[epoch 2, step 151] fc train loss: 0.001\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "306it [00:12, 25.78it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 2, step 301] cnn train loss: 0.001\n", "[epoch 2, step 301] fc train loss: 0.001\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "456it [00:17, 25.74it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 2, step 451] cnn train loss: 0.001\n", "[epoch 2, step 451] fc train loss: 0.001\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "606it [00:23, 25.27it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 2, step 601] cnn train loss: 0.001\n", "[epoch 2, step 601] fc train loss: 0.001\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "756it [00:29, 25.39it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 2, step 751] cnn train loss: 0.001\n", "[epoch 2, step 751] fc train loss: 0.001\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "906it [00:35, 25.56it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[epoch 2, step 901] cnn train loss: 0.001\n", "[epoch 2, step 901] fc train loss: 0.001\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "938it [00:36, 25.41it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Finished Training\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "from tqdm import tqdm\n", "\n", "print_every_iters = 150\n", "\n", "for epoch in range(2): # loop over the dataset multiple times\n", "\n", " fc_total_loss = 0.0\n", " cnn_total_loss = 0.0\n", " \n", " for i, data in tqdm(enumerate(train_loader, 0)):\n", " # get the inputs; data is a list of [inputs, labels]\n", " inputs, labels = data\n", "\n", " # zero the parameter gradients\n", " optimizer_cnn.zero_grad()\n", " optimizer_fc.zero_grad()\n", "\n", " # forward + backward + optimize on CNN\n", " outputs = conv_net(inputs)\n", " cnn_loss = criterion(outputs, labels)\n", " cnn_loss.backward()\n", " optimizer_cnn.step()\n", " \n", " # forward + backward + optimize on FC\n", " outputs = conv_net(inputs)\n", " fc_loss = criterion(outputs, labels)\n", " fc_loss.backward()\n", " optimizer_cnn.step()\n", "\n", " # print statistics\n", " fc_total_loss += fc_loss.item()\n", " cnn_total_loss += cnn_loss.item()\n", " if i % print_every_iters == 0: # print train loss every 100 mini-batches\n", " print('[epoch %d, step %5d] cnn train loss: %.3f' %\n", " (epoch + 1, i + 1, cnn_total_loss / (print_every_iters * (i+1))))\n", " print('[epoch %d, step %5d] fc train loss: %.3f' %\n", " (epoch + 1, i + 1, fc_total_loss / (print_every_iters * (i+1))))\n", "\n", "print('Finished Training')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "157it [00:02, 75.85it/s]" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CNN test loss is 0.10700725481673411\n", "FC net test loss is 2.3106368286594465\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "fc_total_loss = 0.0\n", "cnn_total_loss = 0.0\n", "\n", "for i, data in tqdm(enumerate(test_loader, 0)):\n", " inputs, labels = data\n", " cnn_loss = criterion(conv_net(inputs), labels)\n", " fc_loss = criterion(fc_net(inputs), labels)\n", " fc_total_loss += fc_loss.item()\n", " cnn_total_loss += cnn_loss.item()\n", " \n", "print(f\"CNN test loss is {cnn_total_loss/len(test_loader)}\")\n", "print(f\"FC net test loss is {fc_total_loss/len(test_loader)}\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "accelerator": "GPU", "colab": { "name": "Pytorch Neural Networks.ipynb", "provenance": [] }, "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.9" }, "widgets": { "application/vnd.jupyter.widget-state+json": { "010f027118004c2fbee6aed2d07fa82d": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_9223946c39f1443895c2fd3740066bde", "max": 4542, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_ff638207da16486fa1987328a76aba8f", "value": 4542 } }, "1593d444d9984a1c9ff4b42bba9bdc68": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "1a95479ffd584cc1aca34ce90b534a5c": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_3e3ff350668e46b28649fa566e1de2be", "placeholder": "​", "style": "IPY_MODEL_440b276bf2254e7a9ea35dc8f7cc547b", "value": " 5120/? [00:14<00:00, 349.11it/s]" } }, "29f8fb2be10741feacd1d22a580660d2": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2f76a86e1d3d4420880037612815cc4a": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "2fb452b4a79e42c487a7489c2eace311": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "373637de8dcd435592de2476fea099c6": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "3b23000de58f48ddac67bfccefd3ec30": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_87a729e024f24994bf3c0916e99b14f2", "max": 9912422, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_f653d600425547daa51e2e231059f9d4", "value": 9912422 } }, "3e3ff350668e46b28649fa566e1de2be": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "418ec74a838f487989ed6c1c0fae9595": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_dd3d8ab00a094ca396b5a70f95fcd761", "IPY_MODEL_7802db5dcd914e54addc96458dcb5775" ], "layout": "IPY_MODEL_9c16241ea93145958f65481debb1c0fb" } }, "440b276bf2254e7a9ea35dc8f7cc547b": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "5cf4f68c2a4140a59ca08ee743378343": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "71e7d6d3e3014666a71aa79aea1c7f28": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_010f027118004c2fbee6aed2d07fa82d", "IPY_MODEL_1a95479ffd584cc1aca34ce90b534a5c" ], "layout": "IPY_MODEL_1593d444d9984a1c9ff4b42bba9bdc68" } }, "7802db5dcd914e54addc96458dcb5775": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_2f76a86e1d3d4420880037612815cc4a", "placeholder": "​", "style": "IPY_MODEL_5cf4f68c2a4140a59ca08ee743378343", "value": " 29696/? [00:00<00:00, 125312.44it/s]" } }, "83042eea96fd464ea1884b87b53b43b7": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "87a729e024f24994bf3c0916e99b14f2": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "8b8f12aafc47487d80939b419b7147ec": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_83042eea96fd464ea1884b87b53b43b7", "placeholder": "​", "style": "IPY_MODEL_d25f785560bf4623b89d4bd404ef7c76", "value": " 9913344/? [00:00<00:00, 14388502.64it/s]" } }, "8ce0bbffb7ae4682b631c745635ddd35": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_c7c023dd05af4f239722f8b3645d19e2", "IPY_MODEL_a5bccf9ca43842778a1a12dd3d7c59f3" ], "layout": "IPY_MODEL_d39efb1e96d04e9ca07f7bd7b62117b3" } }, "9223946c39f1443895c2fd3740066bde": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "9b48992bb08f407195f44fd70fcfdc9c": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "9c16241ea93145958f65481debb1c0fb": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "a5bccf9ca43842778a1a12dd3d7c59f3": { "model_module": "@jupyter-widgets/controls", "model_name": "HTMLModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HTMLModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HTMLView", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_db0791f32cb14cbababb6fcc00a52f50", "placeholder": "​", "style": "IPY_MODEL_2fb452b4a79e42c487a7489c2eace311", "value": " 1649664/? [00:15<00:00, 106140.15it/s]" } }, "c7c023dd05af4f239722f8b3645d19e2": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_373637de8dcd435592de2476fea099c6", "max": 1648877, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_9b48992bb08f407195f44fd70fcfdc9c", "value": 1648877 } }, "c7c2553bdca14a5eb67f7dcc24745d88": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "d25f785560bf4623b89d4bd404ef7c76": { "model_module": "@jupyter-widgets/controls", "model_name": "DescriptionStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "DescriptionStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "description_width": "" } }, "d39efb1e96d04e9ca07f7bd7b62117b3": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "d61d6c67935b4483b33720016d312242": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "db0791f32cb14cbababb6fcc00a52f50": { "model_module": "@jupyter-widgets/base", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } }, "dd3d8ab00a094ca396b5a70f95fcd761": { "model_module": "@jupyter-widgets/controls", "model_name": "FloatProgressModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "FloatProgressModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "ProgressView", "bar_style": "success", "description": "", "description_tooltip": null, "layout": "IPY_MODEL_29f8fb2be10741feacd1d22a580660d2", "max": 28881, "min": 0, "orientation": "horizontal", "style": "IPY_MODEL_d61d6c67935b4483b33720016d312242", "value": 28881 } }, "f653d600425547daa51e2e231059f9d4": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } }, "f68079fa2e8a404c9d0c441a8db9434e": { "model_module": "@jupyter-widgets/controls", "model_name": "HBoxModel", "state": { "_dom_classes": [], "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "HBoxModel", "_view_count": null, "_view_module": "@jupyter-widgets/controls", "_view_module_version": "1.5.0", "_view_name": "HBoxView", "box_style": "", "children": [ "IPY_MODEL_3b23000de58f48ddac67bfccefd3ec30", "IPY_MODEL_8b8f12aafc47487d80939b419b7147ec" ], "layout": "IPY_MODEL_c7c2553bdca14a5eb67f7dcc24745d88" } }, "ff638207da16486fa1987328a76aba8f": { "model_module": "@jupyter-widgets/controls", "model_name": "ProgressStyleModel", "state": { "_model_module": "@jupyter-widgets/controls", "_model_module_version": "1.5.0", "_model_name": "ProgressStyleModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "StyleView", "bar_color": null, "description_width": "initial" } } } } }, "nbformat": 4, "nbformat_minor": 1 }