{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import math, random\n", "\n", "import gym\n", "import numpy as np\n", "\n", "import torch\n", "import torch.nn as nn\n", "import torch.optim as optim\n", "import torch.autograd as autograd \n", "import torch.nn.functional as F" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from IPython.display import clear_output\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<h3>Use Cuda</h3>" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "USE_CUDA = torch.cuda.is_available()\n", "Variable = lambda *args, **kwargs: autograd.Variable(*args, **kwargs).cuda() if USE_CUDA else autograd.Variable(*args, **kwargs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<h2>Replay Buffer</h2>" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from collections import deque\n", "\n", "class ReplayBuffer(object):\n", " def __init__(self, capacity):\n", " self.buffer = deque(maxlen=capacity)\n", " \n", " def push(self, state, action, reward, next_state, done):\n", " state = np.expand_dims(state, 0)\n", " next_state = np.expand_dims(next_state, 0)\n", " \n", " self.buffer.append((state, action, reward, next_state, done))\n", " \n", " def sample(self, batch_size):\n", " state, action, reward, next_state, done = zip(*random.sample(self.buffer, batch_size))\n", " return np.concatenate(state), action, reward, np.concatenate(next_state), done\n", " \n", " def __len__(self):\n", " return len(self.buffer)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<h2>Cart Pole Environment</h2>" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u001b[33mWARN: gym.spaces.Box autodetected dtype as <type 'numpy.float32'>. Please provide explicit dtype.\u001b[0m\n" ] } ], "source": [ "env_id = \"CartPole-v0\"\n", "env = gym.make(env_id)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<h2>Epsilon greedy exploration</h2>" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "epsilon_start = 1.0\n", "epsilon_final = 0.01\n", "epsilon_decay = 500\n", "\n", "epsilon_by_frame = lambda frame_idx: epsilon_final + (epsilon_start - epsilon_final) * math.exp(-1. * frame_idx / epsilon_decay)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[<matplotlib.lines.Line2D at 0x7f737815f690>]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f73e4084650>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot([epsilon_by_frame(i) for i in range(10000)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<h2>Deep Q Network</h2>" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "class DQN(nn.Module):\n", " def __init__(self, num_inputs, num_actions):\n", " super(DQN, self).__init__()\n", " \n", " self.layers = nn.Sequential(\n", " nn.Linear(env.observation_space.shape[0], 128),\n", " nn.ReLU(),\n", " nn.Linear(128, 128),\n", " nn.ReLU(),\n", " nn.Linear(128, env.action_space.n)\n", " )\n", " \n", " def forward(self, x):\n", " return self.layers(x)\n", " \n", " def act(self, state, epsilon):\n", " if random.random() > epsilon:\n", " state = Variable(torch.FloatTensor(state).unsqueeze(0), volatile=True)\n", " q_value = self.forward(state)\n", " action = q_value.max(1)[1].data[0]\n", " else:\n", " action = random.randrange(env.action_space.n)\n", " return action" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "model = DQN(env.observation_space.shape[0], env.action_space.n)\n", "\n", "if USE_CUDA:\n", " model = model.cuda()\n", " \n", "optimizer = optim.Adam(model.parameters())\n", "\n", "replay_buffer = ReplayBuffer(1000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<h2>Computing Temporal Difference Loss</h2>" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "def compute_td_loss(batch_size):\n", " state, action, reward, next_state, done = replay_buffer.sample(batch_size)\n", "\n", " state = Variable(torch.FloatTensor(np.float32(state)))\n", " next_state = Variable(torch.FloatTensor(np.float32(next_state)), volatile=True)\n", " action = Variable(torch.LongTensor(action))\n", " reward = Variable(torch.FloatTensor(reward))\n", " done = Variable(torch.FloatTensor(done))\n", "\n", " q_values = model(state)\n", " next_q_values = model(next_state)\n", "\n", " q_value = q_values.gather(1, action.unsqueeze(1)).squeeze(1)\n", " next_q_value = next_q_values.max(1)[0]\n", " expected_q_value = reward + gamma * next_q_value * (1 - done)\n", " \n", " loss = (q_value - Variable(expected_q_value.data)).pow(2).mean()\n", " \n", " optimizer.zero_grad()\n", " loss.backward()\n", " optimizer.step()\n", " \n", " return loss" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "def plot(frame_idx, rewards, losses):\n", " clear_output(True)\n", " plt.figure(figsize=(20,5))\n", " plt.subplot(131)\n", " plt.title('frame %s. reward: %s' % (frame_idx, np.mean(rewards[-10:])))\n", " plt.plot(rewards)\n", " plt.subplot(132)\n", " plt.title('loss')\n", " plt.plot(losses)\n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<h2>Training</h2>" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f7338e80810>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "num_frames = 10000\n", "batch_size = 32\n", "gamma = 0.99\n", "\n", "losses = []\n", "all_rewards = []\n", "episode_reward = 0\n", "\n", "state = env.reset()\n", "for frame_idx in range(1, num_frames + 1):\n", " epsilon = epsilon_by_frame(frame_idx)\n", " action = model.act(state, epsilon)\n", " \n", " next_state, reward, done, _ = env.step(action)\n", " replay_buffer.push(state, action, reward, next_state, done)\n", " \n", " state = next_state\n", " episode_reward += reward\n", " \n", " if done:\n", " state = env.reset()\n", " all_rewards.append(episode_reward)\n", " episode_reward = 0\n", " \n", " if len(replay_buffer) > batch_size:\n", " loss = compute_td_loss(batch_size)\n", " losses.append(loss.data[0])\n", " \n", " if frame_idx % 200 == 0:\n", " plot(frame_idx, all_rewards, losses)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<p><hr></p>" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "<h1>Atari Environment</h1>" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "from common.wrappers import make_atari, wrap_deepmind, wrap_pytorch" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "env_id = \"PongNoFrameskip-v4\"\n", "env = make_atari(env_id)\n", "env = wrap_deepmind(env)\n", "env = wrap_pytorch(env)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "class CnnDQN(nn.Module):\n", " def __init__(self, input_shape, num_actions):\n", " super(CnnDQN, self).__init__()\n", " \n", " self.input_shape = input_shape\n", " self.num_actions = num_actions\n", " \n", " self.features = nn.Sequential(\n", " nn.Conv2d(input_shape[0], 32, kernel_size=8, stride=4),\n", " nn.ReLU(),\n", " nn.Conv2d(32, 64, kernel_size=4, stride=2),\n", " nn.ReLU(),\n", " nn.Conv2d(64, 64, kernel_size=3, stride=1),\n", " nn.ReLU()\n", " )\n", " \n", " self.fc = nn.Sequential(\n", " nn.Linear(self.feature_size(), 512),\n", " nn.ReLU(),\n", " nn.Linear(512, self.num_actions)\n", " )\n", " \n", " def forward(self, x):\n", " x = self.features(x)\n", " x = x.view(x.size(0), -1)\n", " x = self.fc(x)\n", " return x\n", " \n", " def feature_size(self):\n", " return self.features(autograd.Variable(torch.zeros(1, *self.input_shape))).view(1, -1).size(1)\n", " \n", " def act(self, state, epsilon):\n", " if random.random() > epsilon:\n", " state = Variable(torch.FloatTensor(np.float32(state)).unsqueeze(0), volatile=True)\n", " q_value = self.forward(state)\n", " action = q_value.max(1)[1].data[0]\n", " else:\n", " action = random.randrange(env.action_space.n)\n", " return action" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "model = CnnDQN(env.observation_space.shape, env.action_space.n)\n", "\n", "if USE_CUDA:\n", " model = model.cuda()\n", " \n", "optimizer = optim.Adam(model.parameters(), lr=0.00001)\n", "\n", "replay_initial = 10000\n", "replay_buffer = ReplayBuffer(100000)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "epsilon_start = 1.0\n", "epsilon_final = 0.01\n", "epsilon_decay = 30000\n", "\n", "epsilon_by_frame = lambda frame_idx: epsilon_final + (epsilon_start - epsilon_final) * math.exp(-1. * frame_idx / epsilon_decay)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[<matplotlib.lines.Line2D at 0x7f73393b64d0>]" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nKOxFRDLg/wF0AksxrTlRXQAAAABJRU5ErkJggg==\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f73393a85d0>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.plot([epsilon_by_frame(i) for i in range(1000000)])" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAwIAAAE/CAYAAAD1x3TiAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XmYHFX1N/Dv6Z41e0JCSEJCQMKSIAQIiyIQCUgEFUTE\nIAoqL6CAgHtAf4oLCiLixiIIsiibLILs+04CAUICIZCVLIRksk8ms3X3ef+oWz3V1VXVVd3Vk+np\n7+d5wnTfWntCZu6pe869oqogIiIiIqLqktjWN0BERERERN2PgQARERERURViIEBEREREVIUYCBAR\nERERVSEGAkREREREVYiBABERERFRFWIgUOFEZHcRmS0izSJy3ra+H+q5RGSsiKiI1GzreyEi6slE\nZKmIHLmt74Oo3BgIVL4fA3hGVfur6l+29c24ich1IvKeiGRE5BsB+z3l7qSKyBARuU9EWkTkAxH5\nquuYKSIyX0S2isgzIrKTY5uIyGUiss78uUxExLF9rDlmqznHka5zf9Vcs0VE/isiQ2L5hlQQETlX\nRGaJSLuI3OSxvY+IXC0ia0Vkk4g873OeehG5wXw/m03g+tmyfwAiIiIKxECg8u0E4B2/jSKS7MZ7\n8fIWgLMBvOG3g4icAqDWY9NVADoADAdwCoBrRGSCOWYogHsB/B+AIQBmAbjTceyZAI4HsA+AvQF8\nHsBZju23A3gTwHYAfgrgbhEZZs49AcDfAXzdXHsrgKsjfGbnZ9smT99juu6HAH4D4Eaf7dfB+t7v\nab5+z2e/GgDLARwOYCCAnwG4S0TGxnCPREREVCQGAhVMRJ4G8GkAfxORLSKym4jcJCLXiMjDItIC\n4NMicqyIvCkim0VkuYhc7DiHnS7yTbNtg4h8W0QOEJE5IrJRRP7muu63RORds+9jzifxbqp6lao+\nBaDN5zMMBPALWCMbzva+AL4E4P9UdYuqvgjgflidcwA4AcA7qvofVW0DcDGAfURkD7P9NABXqOoK\nVV0J4A8AvmHOvRuA/QD8QlVbVfUeAHPM9QAr6Pifqj6vqltgBRsniEh/v8/puG/7+3m6iCwD8LRp\nP1hEXjbfz7dEZLJp/7SIzHUc/4SIvOZ4/4KIHG9eTxeRReap+jwR+aJjv2+IyEsicqWIrANwsYgk\nReQP5on9YgDHFrp/J1W9V1X/C2Cdx+fcA8AXAJypqk2qmlbV133O06KqF6vqUlXNqOqDAJYA2D/K\n/RARdTczovknEfnQ/PmTiNSbbUNF5EHzc329+XmdMNt+IiIrzc/r90Rkyrb9JETeGAhUMFU9AsAL\nAM5V1X6q+r7Z9FUAlwDoD+BFAC0ATgUwCFZn8Dt259LhIADjAHwFwJ9gPSU/EsAEACeJyOEAICLH\nAbgIVkd8mLn+7SV8jN8CuAbAR6723QCkHJ8JsEYXJpjXE8x7AFZnE8BCv+0exy5W1eaQ514EoN3c\nU1iHw3pSfrSIjALwEKyn60MA/BDAPWYEYgaAceYXSi2s0YuRItJfRBoBTIL1PQaARQAOhfVU/ZcA\n/iUiIxzXPAjAYlijGJcAOAPA5wDsa85zovMGTWDxYITP5HQggA8A/NIEGnNF5EuFDjLXHQ7re+k7\nkkVE1EP8FMDBACbCGmE+ENaoJgD8AMAKWL8Lh8P63agisjuAcwEcoKr9ARwNYGn33jZROAwEeqf7\nVfUl8/S1TVWfVdW55v0cWB33w13H/Nrs+ziswOF2VV1jnqa/AKszCQDfBvA7VX1XVVOwOvITg0YF\n/IjIJACHAPirx+Z+ADa72jbDCm7s7ZsibN8MoJ+ISBHHureHcbF5Et4K4GsAHlbVh83fwROwUpmO\nMdtfA3AYrCfkbwF4Cdb35WAAC1R1HQCY0Y8PzTnuBLAA1i8l24eq+ldVTZnzngTgT6q6XFXXA/id\n8wZV9VJV/VyEz+S0I4C9YH2fRsL6pXeziOwZdJAJdv4N4GZVnV/ktYmIusspAH5lfh82wXoIY49M\ndwIYAWAnVe1U1RdUVQGkAdQDGC8itWY0dNE2uXuiAhgI9E7LnW9E5CCxCmObRGQTrM78UNcxqx2v\nWz3e9zOvdwLwZzMUuhHAegACYFSUGzTDp1cDON8EFG5bAAxwtQ0E0Fzk9oEAtpgf0qWeOwzn38FO\nAL5sf8/M9+1TsH6BAMBzACbDCgaeA/AsrEDtcPMeACAip4pVaGufYy/k/j3m/L3D6qA72z6IcP+F\ntML6JfgbVe1Q1ecAPAPgM34HmL/zW2HVfZwb470QEZXLSOT+7PzAtAHA5bBGoh8XkcUiMh0AVHUh\ngAtgpayuEZE7RGQkiHogBgK9k7re3wbgAQCjVXUggGthdd6LsRzAWao6yPGnUVVfjnieAbDSVe4U\nkY9gPRUHgBUiciiA9wHUiMg4xzH7oCud5B3zHkC2puBjfts9jt3FlfMfdO6PAagz9xSW8+9gOYBb\nXd+zvqp6qdnuDgSegysQMCMu18PqQG+nqoMAvI3cv0f33/sqAKMd78dEuP9C5ni0ua+fZUZiboA1\nfP4lVe2M8V6IiMrlQ1gPc2xjTBtUtVlVf6Cqu8Cqmfq+XQugqrep6qfMsQrgsu69baJwGAhUh/4A\n1qtqm4gcCKuGoFjXArhQumbvGSgiX/bbWUTqRKQBVoe1VkQazJNhO6VkovlzjDlkfwAzTc7/vQB+\nJSJ9ReRTsH7Q3mr2uw/AXiLyJXP+XwB4y5FucgusH8qjTI7+DwDcBACm7mA2gF+Y+zkBwMcB3GOO\n/TeAz4vIoSbA+DWAe101BVH8y5zvaFPA2yAik0VkR7P9ZQC7w0rzeVVV34H1y+MgAPaUnH1h/TJp\nMt/Xb8IaEQhyF4DzRGRHERkMYHqUmxaRGvO9TQKw79uejeh5AMtg/b9QIyKHwCpcf8zndNfAqpn4\nvElbIiKqBLcD+JmIDBNrtrqfw/qZDhH5nIjsah50bIKVEpQRa32fI0xRcRusEdTMNrp/okAMBKrD\n2bA61M2wfojdVeyJVPU+WE827hCRzbCeSgfNCf84rB+Cn4Q13WQrgMPU8pH9B6aDC2C1qnY47rsR\nwBpYoxrfMZ1kmFzNL8Eqit0AqxM9zXHdvwP4H4C55s+Dps02DdaIxAZYufMnmnPCXOPbsAKCNbA6\n4WfbB4rItSJybeHvlkVVlwOwi6ybYI0Q/Ajm358Jet6ANQuS/dlfAfCBqq4x+8wDcIVpXw0rcHmp\nwKWvh9Uxf8uc/17nRhG5SEQeCTj+Z7D+vqbDqnNoNW0wT/SPgxXAbTLXOtUOxJznNqMZZ8EK+D4S\na4arLWJNG0tE1JP9BlZN1xxYv0veMG2ANcHGk7DSSV8BcLWqPgOrPuBSAGthTYSxPYALu/e2icIR\nK2WaiIiIiIiqCUcEiIiIiIiqEAMBIiIiIqIqxECAiIiIiKgKMRAgIiIiIqpCDASIiIiIiKpQTeFd\nus/QoUN17Nix2/o2iIh6pNdff32tqg7b1vexLfH3BBGRt2J+R/SoQGDs2LGYNWvWtr4NIqIeSUQ+\n2Nb3sK3x9wQRkbdifkcwNYiIiIiIqAoxECAiIiIiqkIMBIiIiIiIqhADASIiIiKiKsRAgIiIiIio\nCjEQICIiIiKqQgwEiIiIiIiqEAMBIiIiIqIqxECAiIiIiKgKMRAgInLY1NqJN5dt2Na3QWUye/lG\nbNraua1vg4ioR2AgQETkcOoNM/HFq1+Gqm7rW6EyOP6ql/DVf8zY1rdBRNQjMBAgInJ4a8UmAECG\ncUCv9c6Hm7f1LRAR9QglBwIiMlpEnhGReSLyjoicb9qHiMgTIrLAfB1c+u0SEXWPNCMBIiLq5eIY\nEUgB+IGqjgdwMIBzRGQ8gOkAnlLVcQCeMu+JiCpChqlBRETUy5UcCKjqKlV9w7xuBvAugFEAjgNw\ns9ntZgDHl3otIqLuwkCAiIh6u5o4TyYiYwHsC2AmgOGqusps+gjA8DivRURUjP++uRJT9twe/Rtq\nA/dLZxRrNrfh7jdWYOKOg/DJXYf67ququHXGB1jb3I62VAYTRw/CMR8fgSfmrcYeO/THy4vW4sT9\nRyOZkLg/DhERUdFiCwREpB+AewBcoKqbRbp+4amqiojn4zURORPAmQAwZsyYuG6HiCjP2ys34YI7\nZ+Pz+4zEX0/eN3DfjAInXz8Di5paAABLLz3Wd99XFq3Dz+9/J6dt6aXH4oxbZmXfpzKKUw7aqYS7\nJyIiilcsswaJSC2sIODfqnqvaV4tIiPM9hEA1ngdq6rXqeokVZ00bNiwOG6HiMjTplZr/vh1W9oL\n7pvJKBavbQl13ub2VF6bu9h4I+euJyKiHiaOWYMEwA0A3lXVPzo2PQDgNPP6NAD3l3otIqJSdKQy\nAIC6msI/+tKqKKVMoD2VLv5gIiKibhDHiMAhAL4O4AgRmW3+HAPgUgBHicgCAEea90RE20xH2goE\napOFf/SVWiy8xWOUoJKIyI0iskZE3na03en4Ob9URGab9rEi0urYdq3jmP1FZK6ILBSRv5iHRxCR\nenO+hSIy09SYERFRNyq5RkBVXwTgVwE3pdTzExHFJcqIQCYT/rxeMUNzW2UHAgBuAvA3ALfYDar6\nFfu1iFwBYJNj/0WqOtHjPNcAOAPWJBIPA5gK4BEApwPYoKq7isg0AJcB+IrH8UREVCZcWZiIIrvh\nxSVYvn7rtr6NyOxAoN4xIvDRpjZcdN9c/POlJbh1xgfZ9rSrd/+9O2djrll1+L9vrsTs5Ruz27zS\ngO58bXnO+8sfew8//M9bmLF4XekfpBuo6vMA1nttM0/1TwJwe9A5TH3YAFWdoaoKK6iwp5J2TjF9\nN4Ap9mgBERF1j1inDyWi3q+puR2/fnAe/j3jAzz9w8nb+nYi8UoNeva9Nbht5rK8fTOuYt/73lyJ\n+95ciaWXHosL7pwNoGsmobbO/EDguucX57Xd/foKHLZbr5gU4VAAq1V1gaNtZ5MqtAnAz1T1BVhr\nyqxw7LPCtMF8XQ4AqpoSkU0AtgOwttw3T0REFo4IEFEkap6Ub67A1Bev1KBWj048EK1GoK2zK4/o\n+lMnBe77hX1Ghj5vD3YyckcDVgEYY1KDvg/gNhEZENfFRORMEZklIrOampriOi0RUdVjIEBE0VRw\n8kZnOj8QcHbindzTfwZxjgg01PbuH6siUgPgBAB32m2q2q6q68zr1wEsArAbgJUAdnQcvqNpg/k6\n2nHOgQA886Y4zTQRUXn07t9YREQO7an81CD/EQHvc6TS+YGD8xyNtckS7rAiHAlgvqpmU35EZJiI\nJM3rXQCMA7DYrC6/WUQONvn/p6JrKmnnFNMnAnhatcSpmoiIKBIGAkRUNbKpQcmuYY32iKlBban8\nQMA5qtDQSwIBEbkdwCsAdheRFSJyutk0DflFwocBmGNqBO4G8G1VtQuNzwbwDwALYY0UPGLabwCw\nnYgshJVONL1sH4aIiDyxWJiol3vgrQ/R2pHCVw4Ys61vZZuzi4XhmJzGq9AXAL75z9c821s7uvZf\nu6Udlz0yH/95vasetrekBqnqyT7t3/BouwfW6vJe+88CsJdHexuAL5d2l0REVAoGAkS93Hm3vwkA\nDAQAdJqn+c4ZgfxSg1ZubPVsdwYOv334Xdz7xsrs+0tP+Djqkr1jRICIiHq/3vHoiogoBHttAOca\nAX7Fwn6cgYBz0bCff248ph04BjXJCq6mJiKiqsJAgIiqhj0SkMkJBLxHBPw4A4eW9q5AwK4NYCBA\nRESVgoEAEVUNOyMoTGqQnzazirAI0OKoF2iss36c1iT4Y5WIiCoDf2MRUZEqb6bHbGqQIxuoPWJq\nkF0sXJdMYKtzRKCGIwJERFRZGAgQUZ65KzbhiCuexZQrnsUNLy7B0Vc+j+a2ztjOf9UzC3HRfXOL\nPv53j7yLSx+Z77t9S3sKU//0PN5euSnbduG9c3HbzGUAgBtfWoL9fv0E2jrT0UcEzP61yURualCd\nFQjUckSAiIgqBH9jEVGe3z78LhY3tWBRUwt+/eA8vLe6Ga8uMdPCxzAQcPlj72U75cX4+3OLce1z\ni3y3v7Z0PeZ/1IzfP/Zetu32V3Ovt76lA/M/ao4c4HSmrW+AiBVw2OwRgWSCIwJERFQZGAgQUVF6\n8hqwCbNOQKGFamsSgg1bgwOBqRN2yHnvLDTemlMjYEYEmBpEREQVgoEAEUXSg/v/WfZDeb/VgW0i\nwOYCIwJ1Nbk/Jp3nTDmKju2FxEQYCBARUWVgIEBEedSju2/3f3vySIBNYI8IBO/X0p4uuE+9KxBI\nZzTnq81ODSIiIqoUDASIKBKvIKGnsUcECnXyN7UWrg+or3WPCFhfnWlBQFdqEBERUaVgIEBEodh9\n6nKOCPzk7jn47J9fCL3/rx+cl3192aPzcfBvn7LemEDglcXrMHb6Qzmz+zitb2kveI1h/Rpy3v/w\nP2957hdmRGBov7qC+xAREXUXBgJEFIpdeFvO8YA7Zy3Hu6s2h97/hheXZF9f8+wifLS5DQCQcS0N\nsGJDq+fxa7d0FLzGcRNHhrqXfg01eW2jBjXmvL//3E+FOhcREVF3YCBARHmCnvp3R0BQqpQrEmhP\nea8VsL7FCgSCZvqpr03gM+OHF7ym17Shpxw8Jue9OzAgIiLalhgIEFGeoE5+JRQLp9K5N9nms3qw\nHQgM7uOfslObTKDYiYD61+ePEhAREfUUDASIKJQK6P9nhR0RWLulHQkBBjbW+p6rNpnIrksQlVe6\nEBERUU/BQICIIqmIEQHX1J6tHf6pQYP61AV29Otrih8R6FfvH2AQERFta3xcRUT5gmoEetjYwNjp\nD+W9P+vwXXLa2lLeqUEbWjowsLE2sKNfmyz+eUk/pgYREVEPxhEBIoqkEkYEZixen/O+vdN7RKC5\nLYW+9cnA1YCdRcB77NA/b/tPpu6BGRdO8TzWvQYBERFRT8LfUkQUSnZl4W17G6Gk0rkjAG0+gUBL\nRwoNNUl4TPjj6aCdh+S1TRg5ADsMbPDYG6gJe2IiIqJtgIEAEeXxSv/J2NOGVsCQgHvWIPcqwLaM\nAg21ydA1AMlE/o/MoPqCGo/9iYiIegr+liKiPF59/XSm568fYOt0zRrU4hMIAFYgEHZWoBqP9QaC\nHvoHrU9ARES0rbGSjaiKbO1IIZ1R9G/oms2mI5VBS3sKg/v6z6UPOEcEYL4qNrV2or4mgYbaZNnu\n2bal3br3dKZwKOIeEWjtSPnu21CbQNjuuteiYUEHe+5PRETUQzAQIKoiB13yFJrbU1h66bHZtm//\n63U8PX9NTpsXdwdcAezzy8cxfsQAPHz+oeW43Rx7/eKx0Pu6awSCRgQaa5MImxvklfMfNJpQyoxD\nRERE5cbfUkRVpLk9/8n40/PXhDq2KxDIDQjmrdpc6m3FrtMVtDS3BY0IJPMe6j/7w8me+3rl/HsF\nAm/+31F47adHIsERASIi6sEYCBBRHq/kG3dqUE/mHhFobuv03bfBY4rPsUP7eu4btkZgcN86DOtf\nj2SxK5H1ACJyo4isEZG3HW0Xi8hKEZlt/hzj2HahiCwUkfdE5GhH+/4iMtds+4uYuVpFpF5E7jTt\nM0VkbHd+PiIiYiBARCHZfesKiAPyagS2BIwINNYmQ8+E5JXzH7QGQYVPGnQTgKke7Veq6kTz52EA\nEJHxAKYBmGCOuVpE7MKRawCcAWCc+WOf83QAG1R1VwBXArisXB+EiIi8VfavKSIqC6+OcbqCRgTc\nswYFpQbV1yZDBzdeT/+Dsn8qefpQVX0ewPqCO1qOA3CHqrar6hIACwEcKCIjAAxQ1Rlq/U91C4Dj\nHcfcbF7fDWCKBEVVREQUu8r9LUVEkazb0l7S8Zns9KE9PxJwjwgEpwYlQwc34jFFUFCxcCWnBgX4\nrojMMalDg03bKADLHfusMG2jzGt3e84xqpoCsAnAduW8cSIiysVAgKhKHPy7p0Lv69UvTmUqZ0Qg\n5S4W9iiSttXXJHyDm0F9anPee/XrgwKBCh4Q8HMNgF0ATASwCsAV3XFRETlTRGaJyKympqbuuCQR\nUVXofb+miMhTZ7q0HnymggIBN2dq0KA+tXj8e4dl39cmBa5MIgDA/F9PxcyLphQ8d9BD/962joCq\nrlbVtKpmAFwP4ECzaSWA0Y5ddzRtK81rd3vOMSJSA2AggHU+171OVSep6qRhw4bF9XGIiKoeAwEi\nCiVbI4DKDQgA6wl+o2MBtGQi4Tke0FCbRH1N7kJpXinsQYFA2BWLK4XJ+bd9EYA9o9ADAKaZmYB2\nhlUU/KqqrgKwWUQONvn/pwK433HMaeb1iQCe1rBV20REFAsuKEZEoaQreETAKZ3RnCf1NQkJPWuQ\nV7c+sEaggkcEROR2AJMBDBWRFQB+AWCyiEyElT22FMBZAKCq74jIXQDmAUgBOEdV7VXczoY1A1Ej\ngEfMHwC4AcCtIrIQVlHytPJ/KiIicmIgQEQArJmC7CfeXv3iTKbCIwDDHQgkE5JdI6GQqDUClVws\nrKonezTfELD/JQAu8WifBWAvj/Y2AF8u5R6JiKg0TA0iIgBW5//VJeuxenMbZi/fmLe9kqYP9VJX\nY/24S2UyOR36ZEIizBqUL+ihP1cWJiKinowjAkQEwMr1OOnvr/hur6TpQ730q6/B+lQHMpncJ/VR\nRgS8Ovac+p6IiCoVRwSIqljake5TKE++0kcEGsyIQFo9agRCniPqiAAREVFPxkCAqIq1daazrwt1\nhtOZcPv1VPVmpqB0RnOe4icTEv5DeTz9720zAxERUfVgIEBUxVqdgUCBznDaNdl+pc30WF/T9ePO\nXSxcyogA4wAiIqpUDASIqljuiECB1CB7RKDCAgBbTiBQZI1A1FmDiIiIejIWCxNVsbbOrqf8z7+/\nNnDfTHZBMeR8jYvX9KTNbZ24942VOQuAFasm2RUIOPvuNYlE+EDAY0yAcQAREVUqBgJEVcw5InDG\nLbMC902Z1CAtUySQ8ggELn5gHu55Y0Us50+KYPSQRpx52MdcqUHhC6A5IkBERL0JAwGiKuYMBArp\nTOVGAGGfooflPJ+9uNm6lvbYzi8CvPDjI6xrOYKOZCJR4joCDASIiKgyxVIjICI3isgaEXnb0TZE\nRJ4QkQXm6+A4rkVE8XGmBhXSmc4dEYg7Ncg5lan9Ms5Yw9lhz00NktB1D94jAqXeGRER0bYRV7Hw\nTQCmutqmA3hKVccBeMq8J6IepDXCiECHHQiY93GPCKRdIwJxXyPh+Gnnnj7UIyvJk3eNACMBIiKq\nTLEEAqr6PID1rubjANxsXt8M4Pg4rkVE8YmSGtSRco0IxDwk4EzXySYhxXgNr048YE8fWvyIAOMA\nIiKqVOWcPnS4qq4yrz8CMLyM1yKiIkQZEXh+QRPueHVZ9ml93IFAbmqQPUNRfBfx67AnExKhWJgL\nihERUe/RLesIqNVz8PxVKyJnisgsEZnV1NTUHbdDREYqXbgHPGWP7QFY9QTT753rmD407mLhrtfl\nGHXw67DXOBYU+8Qu2+EXnx/vew4B8JOpe+AnU/dwnDe+eyQiIupO5QwEVovICAAwX9d47aSq16nq\nJFWdNGzYsDLeDhG5hcnBP//IcTh4lyHZ9/YhYfPqw/Iq2C10f84OeSF+Hfako1j4+5/ZDd88ZGff\nc4gA35n8MXxn8sccbYwEiIioMpUzEHgAwGnm9WkA7i/jtYioCGFmyxEI6mq6FvTSMk0f6jxbJlss\nHHxMlKfxfiMCzmLhQmk+nDWIiIh6k7imD70dwCsAdheRFSJyOoBLARwlIgsAHGneE1EPEqYrLwLU\nJR293XIVC+fMGmR/Db5IlPx8vyf3zhGBZIFevVfBMWsEiIioUsWyoJiqnuyzaUoc5yei8siEyO8R\nAWqTXc8M4l4/IHteZ42A+VpwRCDC43i/XWsSiex1kkWNCDAQICKiysSVhYmq0PR75uDYvUeEGxGA\n5Dyt/+ZNrxV93XdXbcY1zy7Ka1+wuhnn3zE7+z47a1DBEYHw1w5KDbKvkyhijJRxABERVapumTWI\niHqWO15bjq/f8Gqogt9EAtja0TXNqL2eQDHOue0NPPDWh3ntF947F/NWbc6+D1uQHJTKM3JgAz63\n9wjsMrQvgHDThxZMDfI4SdhA4KZvHhBuRyIiom7CQICoioUtFt7Snorlei0+58krPA5ZIxA0Y892\n/erxt6/uhyPHW0uYhJk+tGBqkEdb2NSgybtvH2o/IiKi7sJAgKiKhSn4FQG2todfeCxIi8953E/+\nw84aFNQFt/vndkc9eERAzT6sESAiourBQICoioVZFCwhQEtHTCMCPudxP/kPu2hZUB/c3mTXOfvW\nCEjX9KHFzRoUeAj1IGFGwIiIqgkDAaIqFm5RMPFN6YnKrx/mvg+7w5YpUI7g1THPbjMd/0T2q/d+\niYRkA45CqUFB1yEiIqo0DASIqliYRcFEgIGNtd16Hxn1bo8iPzUot8NeX9P14y+7oBh/ImaJyI0i\nskZE3na0XS4i80VkjojcJyKDTPtYEWkVkdnmz7WOY/YXkbkislBE/iLmL0JE6kXkTtM+U0TGdvdn\nJCKqdvy1R1TFwvSzEyK49fSDyhIMqE8tgP2EvtD9hUsN8t7p0QsOwx9P2se+YOC+pbjnO5+s1BmD\nbgIw1dX2BIC9VHVvAO8DuNCxbZGqTjR/vu1ovwbAGQDGmT/2OU8HsEFVdwVwJYDL4v8IREQUhIEA\nURULN2sQMHpIH3zlgNFluL711b2wWXZl4UI1AgHb3ClB7s+689C+OGG/Ha3ra/GpQYXsv9Pgipwx\nSFWfB7De1fa4qtp5YjMA7Bh0DhEZAWCAqs5Q6y/gFgDHm83HAbjZvL4bwBRhnhURUbdiIEBUxcLO\nGuT8Wg7uFKBsIFBoZeGAm8qmBplIIOhU9rYoKxUTvgXgEcf7nU1a0HMicqhpGwVghWOfFabN3rYc\nAExwsQnAduW9ZSIicuLKwkRVLNSCYq6i2zjZl88LBKCe7XkCU4OsjfZT/qBTlXNEoDcSkZ8CSAH4\nt2laBWCMqq4Tkf0B/FdEJsR4vTMBnAkAY8aMieu0RERVjyMCRFUszPShtnJ0ke10HXcnPRNyRCDK\nOgKBIwKj7cIyAAAgAElEQVTZYmEGAoWIyDcAfA7AKSbdB6rarqrrzOvXASwCsBuAlchNH9rRtMF8\nHW3OWQNgIIB1XtdU1etUdZKqTho2bFjsn4mIqFoxECCqQLte9DAuum9uyecJMyLg7lDHyXdEQMON\nCASllOelBoXIg2IcEExEpgL4MYAvqOpWR/swEUma17vAKgperKqrAGwWkYNN/v+pAO43hz0A4DTz\n+kQATysn+ici6lYMBIgqUCqjuG3mstJPFKpzHDwPfxyXz19HwHwtcHzgiEA2NSj8/ZRj1qBKJSK3\nA3gFwO4iskJETgfwNwD9ATzhmib0MABzRGQ2rMLfb6uqXWh8NoB/AFgIa6TAriu4AcB2IrIQwPcB\nTO+Oz0VERF1YI0BUxaKMCJSjWtivFqArQCj+AbG9JkCYYuHsMawRyFLVkz2ab/DZ9x4A9/hsmwVg\nL4/2NgBfLuUeiYioNBwRIKpioRYUQ/lHBNy3kQ0QCq0sHKJYONu5DxEJcESAiIiqCQMBoioW7im5\n/bV8neS03zoCMawsnMyOCBQ+F2cNIiKiasJAgKjCdKYLPCaPoL0zxLkk50us/FKAUhlFS3sKbani\nP6vkLShW+BjOGkRERNWENQJEFWbCzx+L7Vw3vrSk4D7ZFJsSO8nu1YNztrk2/fS+uZi5ZL33ziHZ\nd5sIsY7AvmMG4c1lGyOdf7u+dVjX0lHk3REREW17DASIKkxHjCMCYdj9/1KzZlIegYCdruNOASo1\nCADyU4OC3PKtA/HhxrZI53/y+4dj/VYGAkREVLkYCBBRIIlpZWF3HQAQz+xAftwrIgfVCPRvqMXu\nO9RGOv/gvnUY3Leu+BskIiLaxlgjQESBxPW1WCmPKYDU9TWq4FmDLF0LihV5ESIiol6KgQARBXI/\nWS+W11Sg2RWEwyxo4CGoc59NDeJMQERERJ4YCBD1EkvXtkBVsXJjK9pT6fhOHFuNQMCIQBme1ufN\nGhT/JYiIiCoaAwGiXmD28o2Y/IdnccOLS3DIpU/j+3e9Fdu5JRsI9LwaAaYGERERFY+BAFEvsGjN\nFgDA6x9sAAA8OW91bOdOuJ6sFyvt1RPXgG0u2/evj3Q9O0joSmliJEBEROTEQICoF7CfttckrX/S\ncXZ53fPxFyuV9p8+1K9EwNn5HxJxhh73/XJEgIiIKBcDAaJeoNPk3yezq+jG1+uVmGoEvFKDbH73\n6+zMRw1EsvdtXyPS0URERL0fAwGiXsDuZNv58EVOwuPJ7oCXWiPguaBYtkbA+xjnJRMRf1rZKyJz\n0iAiIiJvDASIKtx7HzXjo03Wqrj2VJnpjCIV8wrEpdYIeBUEa8A265qljwhkr8XcoKrH/wWIiHIx\nECCqcEf/6Xlc/ewiAEDS0Vu/8sn3Yzl/ftFtvjCdbM8aAXOc3+HOUQCvEQkJWOZMJHdEgH1AIiKi\nXAwEiHoRZ2f5/dVbYjlnNjUoYJ8wT1o9pw8NeW2gq/4h93j/M3StiMzcICIiIi8MBIh6kaTjX3Sx\nq/W6hZk1KMyVPBcUK3Cg84pRU4MSXZFAqGsRERFVGwYCRL1IjSOXpthFutzcKTZewlzLu0Yg/D1G\nrxHIHcmI6/tBRETUWzAQIOpFnJ1lj5T8Is9pfQ2aNShMJ9urRqBQHOC8ZtTZf7IDApw2iIiIyBMD\nAaJexDmzT1yz5Ngd6aBZg8pVI+DkNSIQpliYiIiIvDEQIOpFnLMGBS3gVYzgWYMKH5/2Sg0qcJwz\nmPFaR+CAnYf4Hpu3oBgzg4iIiHIwECCqYO6n/s6n4HEHAkEP2MPk+pd6P+5A5K8n74tRgxp99+9K\nDSrpskRERL0WAwGiChbUuY77CXhQqk2Ya3ntUyiAyK0RyL1+oeJh9/YohclERETVgIEAUQVLuQIB\nZ9GuVypOKcqysnCEW3SvI1DoSX9XapBEvhYREVE1YCBAVMHcIwLO93FPl1nqOgLFFAvn1Ai4rl8o\nLskGAlxHoCgicqOIrBGRtx1tQ0TkCRFZYL4Odmy7UEQWish7InK0o31/EZlrtv1FzNCOiNSLyJ2m\nfaaIjO3Oz0dERAwEiCraM++tyXmfEwjEXSMQsC3MDEVetxNlZiN3HFJ4RCB3HQGmBkV2E4Cprrbp\nAJ5S1XEAnjLvISLjAUwDMMEcc7WIJM0x1wA4A8A488c+5+kANqjqrgCuBHBZ2T4JERF5YiBAVMHO\nve3NnPe5IwLxXiuwRiDE8V6d/oIrCwfUCNTVBP/4svfee/QgjN2uD3509B4h7tLbuZ8eh1GDGnHI\nrtsVfY5Ko6rPA1jvaj4OwM3m9c0Ajne036Gq7aq6BMBCAAeKyAgAA1R1hlr/A9ziOsY+190ApkjQ\n/2RERBS7mm19A0QUH2ddQPzTh+a3DepTi41bO4uePjSKpKuPOKhPXeD+9u796mvw7I8+XdK1x48c\ngJemH1HSOXqJ4aq6yrz+CMBw83oUgBmO/VaYtk7z2t1uH7McAFQ1JSKbAGwHYG15bp2IiNw4IkDU\ni6TT5asR8HpYW2jmHifv1KDgY4LWERhcIBCIcm8UnXnC3y35ViJypojMEpFZTU1N3XFJIqKqwECA\nqBdxPnWPv1g4oC3U9KFexcJRagRyb2Bwn9rg/UOfmSJYbdJ9YL7aRSorAYx27LejaVtpXrvbc44R\nkRoAAwGs87qoql6nqpNUddKwYcNi+ihERMRAgKgXyZSxRsDrCbvdVq4FxZydf/f1+zcUCAQ4IlAO\nDwA4zbw+DcD9jvZpZiagnWEVBb9q0og2i8jBJv//VNcx9rlOBPC0RqkeJyKikrFGgKgXyRkRiL1a\nOL8pGwiEuFQxqUG518p9nyywsAHjgNKIyO0AJgMYKiIrAPwCwKUA7hKR0wF8AOAkAFDVd0TkLgDz\nAKQAnKOqaXOqs2HNQNQI4BHzBwBuAHCriCyEVZQ8rRs+FhEROTAQIOpFnE/d43606j0iEP54zwXF\nChwTtI5AIcLkoJKo6sk+m6b47H8JgEs82mcB2MujvQ3Al0u5RyIiKg1Tg4h6EWcgUOpKwG5e55Ns\nalBhXiMUpawjEPf+RERE1absgYCITDUrTS4Ukenlvh5RNXMGAoVSZ6LyeiLftWpvkQuKFTgmqEag\nkLgDISIiot6mrIGAWVnyKgCfBTAewMlmBUoiKoPcEYHy94Tt/n+oEYEiFhRzBhjudQQKYbEwERFR\nsHKPCBwIYKGqLlbVDgB3wFpNkojKwFksHHdHOGjWn3DFwl47hU8Ncq8jUAgnoCEiIgpW7kAgu3Kk\n4VxVkohiVs4agVQmk9cWZa0C7xqB8NfnE34qFUNDIqJc27xYmCtGEsUnZ9agmHs9nen8E9qBQJh1\nBEqvESh4idxzs9dHREQUqNyBgN9qk1lcMZIoPuWcPtQrNSjb2S46NShfXbLrx1Ip04cyDiAiIgpW\n7kDgNQDjRGRnEamDtWDMA2W+JlHVcna2486RT3kFAq6vQcIWC9fXeP9YihwIMBIgIiIKVNYFxVQ1\nJSLnAngMQBLAjar6TjmvSVTNypkalErn1whECTa8U4PyG+tqEkB7/r5RSwTCpCsRERFVs7KvLKyq\nDwN4uNzXISJ3alDMIwKeNQLmWiEuFZha5OAcEShlHQGOCBAREQUreyBARN0nreUbEWisS+a1aYRi\nYa/Rg8/++YW8tvrarus4j6lJRgsE6nxSjIiIiMjC35REvYjzqX2h4tzvHrFrpHMf+/EROH/KuJy2\nbI1AqGLhcNep8Zke6LBxw3DU+OGBxyYTgmd/OBnnTxmHrx+8U7gLEhERVSkGAkS9iN35H9hYW/AZ\n/Zf3H11gj1yJhOCUg8fktEVZWThoQTKn2qT3j6UBDbV5gYjbtANGY+zQvvjeUbth9JA+oa5HRERU\nrRgIEPUidmc7ISjYOx/Utzby+QW5T+ujLCimqqEKfmsdKUDuRcQKHc81x4iIiMJjIEDUi9gP3ZMJ\nKdhJ718fvUQor6OdLRYOt6BYMkRPvcZnHQGR/ECEiIiIisdAgKgX6RoRkEir9oblEweEmzVINdTM\nP341AkCIEQEGCkRERKExECDqRZat3wqga0Rg7PSHYj2/O3gIGnX4cGMrxk5/CPfPXpndN0zs4Tfb\nT5hjmRpEREQUHgMBol4oIYK0x7z/bo9ecCiu/dr+oc/r7mcHBQIL12wBANz9+goA1qhBMuBpv805\nIuAMPAQSYkSAiIiIwuI6AkS9UDIhaE/lrwTstscOAzwXCvPj7ohnZw3yOIXd6bfTldKZcKlByUTx\nNQLFpDsRERFVK44IEPVCyYQgXTgOiMzdEc/WCHhUJNidfjsQCJsaVBuwcBj7+URERPFhIEDUCyUE\nSGfKEgnkijAiEDo1yGcdAWtEgIiIiOLCQICoB2rrTGNLe6ro4xMioRfwiiIvNchEAl5XsvvzTVva\nAURIDXLsErVGgIiIiMJjIEDUAx35x+ew1y8eK/p4a9agcPtGWBMs74n8hJEDffe1O/0frNuK15au\nR0YVIQYEAmsEiIiIKD4MBIh6oBUbWks6vnwjAl298ccuOAynfXInAN4LitU4OvTvrtqMjKKkdQTE\n8V8iIiIqHQMBol4okbAW8Iqbsxu++w79sx17rys5+/zJhCATNjXIp1hYhKMCPYWI7C4isx1/NovI\nBSJysYisdLQf4zjmQhFZKCLvicjRjvb9RWSu2fYX4dRPRETdhoEAUS+UFKvjHTe/LlqhmKM2kUBG\nNVSxcNJZF5BzQa4b3FOo6nuqOlFVJwLYH8BWAPeZzVfa21T1YQAQkfEApgGYAGAqgKtFJGn2vwbA\nGQDGmT9Tu/GjEBFVNQYCRL1QIiFIlSMQcHXFgx7eOoMDu2YhzLNeZ7DgTjniw+IeaQqARar6QcA+\nxwG4Q1XbVXUJgIUADhSREQAGqOoMtf6ybwFwfPlvmYiIAAYCRD3aB+ta0NzWCQBo7UhjUdOWUMcl\ny9Rh9j9tftDhXHW4JimmWLiEGgHGAD3VNAC3O95/V0TmiMiNIjLYtI0CsNyxzwrTNsq8drcTEVE3\nYCBA1IMdfvmz+NI1LwMAvv2v1zHliudCHRemw10M92ntt16pQc4ma0QgZGqQX40AWCrc04hIHYAv\nAPiPaboGwC4AJgJYBeCKmK5zpojMEpFZTU1NcZySiIjAQICox3t/tTUK8NLCtaGPSZTpX3Z+apD1\n1SsJyZnWU5NI5KUG+cUqfjUCIlxHoAf6LIA3VHU1AKjqalVNq2oGwPUADjT7rQQw2nHcjqZtpXnt\nbs+hqtep6iRVnTRs2LCib9ZrdisiomrGQICoQkTpBId58h7HPdiBgVf/ylmiUJvMnzVoUGOt5zVq\nfGoEBCwX7oFOhiMtyOT8274I4G3z+gEA00SkXkR2hlUU/KqqrgKwWUQONrMFnQrg/u65dSIiqtnW\nN0BE4Vj9pHBPNMuWGuR+H3iZrntN2KlBjgP87jHpM5zB6UN7FhHpC+AoAGc5mn8vIhNh/eUvtbep\n6jsicheAeQBSAM5R1bQ55mwANwFoBPCI+UNERN2AgQBRhYhSABxlREBDBheA/6w9XufImbRIreLh\nUKlBPuOUHA3oWVS1BcB2rravB+x/CYBLPNpnAdgr9hskIqKCmBpEFKMn561GZzqDVZta8eayDZ77\nPD1/Ndo6057bgkTJ9um2EQHz1bNY2NGWUUU6476vaCMCREREFC/+xiWKyQsLmvD/bpmFPz+5AJMv\nfxZfvPrlvH3mfbgZ37ppFi5+4J3I5y80h37/hq4BvkKBwOTdwxVcnnzg6Jz3eTUCdrGwZ42AOl4j\nb9Ygv8AmaPrQQvFNugxrJxAREfVWTA0iism6LR0AgOUbtqI9lfHcpzNttb/94abI5y/UCX78e4fh\nE797GoB/eg0APPejydhpu74Fr7f00mM97sFvTCBf/ohAbiDgnxrkf85CwVB7KvpICxERUbXiiABR\nN6qvtf7JbWlLRT620FN+5/bAznQZcu29agScM/6oCQScT/v97sPv3kUKryPQ1ukdgBEREVE+BgJE\n3SiVtjrHW9qLCQSCt+dk3wcEDe5NpUytHpQa5GzKKJDKZJAIkRrkHwgUXkeAIwJEREThMRAg6kYp\nk8PeXMSIQKG0GOf2oBmG4qwjDjqVMzhQBTKZ3Px/v8/jWyPgfO1zYb+ULCIiIsrHQICoG6VMjYBX\nhzWVzuCml5Zk6wicXlm0DutbOgLP7ew/B6UGxTmjkN2ZL1QsvLhpC15dur70GgETDvjtUcxsTERE\nRNWKgQBRzIJSbTrT/hv/NeMDXPy/efjnS0vytp18/YyC13V28IM6++5NH9u+H2oSgm98cmzBa+Sd\nK2Cb85Ne8cT7ABAqEKivTXpfyzFrkHM04fP7jMT2/esBsEaAiIgoCgYCRN0olfHvqNrpQptaO4s6\nt+SMCPjv5w4S+tXXYOFvj8HFX5hQ1HUBvwXF8tvCFAsPaqz1bBfHEc4j/3ryvvjnNw8AwBEBIiKi\nKBgIEHWjVMA893YhbSnFu9lzdVeNQECxsNeCxWHWERjcp87/WmIfm3twfY01itDBGgEiIqLQGAgQ\nxSyoo50KSA2yFbsmlvMJe6Kbpg/NBgIe27xGBJIhioUH9fEbEfB7A9TXWD/KWCxMREQUHgMBojJS\nV2c45VEIbOvqVBcXCTiPC5o1qNA0pFEEBRWFRjb8btEvEID4Fws3mLoCpgYRERGFx0CAqEQbt3bg\nd4+8m037uX/2h9lt7qf7galBQY/XIwrq7BeahrQY7oAH8B4RcJZI+N1Fv3rvBc8F/usI2Au1MRAg\nIiIKz/s3LhGF9qsH5+HeN1bi6AnD87ZlVJF0dHmDioXtvaLGAaOHNOJjw/phQEPXk/Sg1KA4RwQQ\nELsU+hx+AYmIYL8xg/DGso1+l8sLCPrX1+Co8cOLmvmIiIioWnFEgKhE7WbKSq+sn7RrBCBo+tCu\nwttoocAndxmKm755YE7nP3BBsThrBMxXz5WFPRqd6UtBAckVJ03Mv5Z0BQ/uYmERwfWnTsIhuw4t\nfNNEREQEgIEAUYw8Or6uJndg4GR30IstFnYKXJQrxn/1XU/1C392d1vUgER8XhMREVFxGAgQxaTQ\n6rpAyGLhiIGA8ym7PU9/8KxB8Qm7oJhXW9RSBRHHOgJlqHMgIiKqNgwEiGKS9ujBu9uCU4PMOgIl\nVAvb02gGpd0ErTFQrDBBkHu/qJ15gWNl4UhHEhERkRcWCxOF9I8XFmNAQy1OOmA0/vnSEsz7cDOS\nCcl23L3SftQMAKxpbsOJ17yCZeu3ZrdlMopEQrBwTTP+/NRCfHzUAOuYiHGAM8Wmb30NWjrSgesV\nlGVBMY9t3p+jqzHqbYhj+lBGAkRERKVjIEAU0m8eehcAcNIBo/HL/83Lth+xx/YAfKbLNG1XPb0w\nJwgArKlE6xKCH/xnDt5avjH7FD9qsbBzBOG2Mw7CvW+s9J+LH/GOCNgd82JGBBIRxyOdAQ/jACIi\notIxNYioRPZIgNeIgJ0a5NW1t6cStfP67eNLqRXedfv++PHUPcqS/uMl6kxHOTUCRXTn7aCHNQJE\nRESlYyBAVCK7Q++1RID9VNyrn2wvLmbP8NORyvjuG6fuChK8RwQcqUGRc4O6ZlRiHEDFKPM/LSKi\nisNAgKhEdgFwUCqMVwGwncdvjwi0m0DAq+g4qqDOfqw1AuZr+BqB/GNDX0u6AgnGAURERKVjIEBU\nIntKUM9ZgwIWBbCPq0la/wztEYF0QKFvWEGd/VhHBAKmPPX66DlNRcwaZB/P1CAiIqLSsViYKsZV\nzyzEW8s34rpTJ5XtGpc/Nh9L127FVafsBwCYtXQ9zrz19Zwn0If9/pmcY+wUnzeXbcw7X1BqUGcm\nd0TglcXrAAD3vLGipM8ABD8xj3cdAf8pT73qBsIulmZ/Twb2qQPWWUXWIpINYgYHFEMTERFROAwE\nqGJc/th7Zb/GVc8ssr6a95c9Oh/rWzpy9nHP/hO0NkBXalA++8m/exXgVAxLCwcuKFZiJPC3r+6L\nXYb2K3iuKBlO0w4Yjf3GDMZ+Ow0CAIwe0ge//MIEfHavHXDgb5+yrgVgSN86/Ob4vbIzNdG2IyJL\nATQDSANIqeokERkC4E4AYwEsBXCSqm4w+18I4HSz/3mq+php3x/ATQAaATwM4HyNOnUWEREVhYEA\nVRxV7bbUkDCd8qDVgoNSgzpdswbFKXBEoMTv3ef2Hpnf6JkGFG6UAADO+fSuGD2kT07baZ8c67nv\n1w7eqeA9Urf5tKqudbyfDuApVb1URKab9z8RkfEApgGYAGAkgCdFZDdVTQO4BsAZAGbCCgSmAnik\nOz8EEVG1KqlGQES+LCLviEhGRCa5tl0oIgtF5D0RObq02yTqsrUj3W3XClqYK7tPQGffq4DYfW73\niEAsfDr7cV+qlGLhnPOEuC+WBVSE4wDcbF7fDOB4R/sdqtquqksALARwoIiMADBAVWeYUYBbHMcQ\nEVGZlVos/DaAEwA872x0Pf2ZCuBqEUmWeC0iAMCGrR2Fd4pJZ8DTflvKa95Qw44RvKcPjWdEwOvc\nfqeMeyTFPl/oYmGf4CBMAXMx6w5QWSmsJ/uvi8iZpm24qq4yrz8CMNy8HgVguePYFaZtlHntbici\nom5QUmqQqr4LeHYusk9/ACwRkYUADgTwSinXIwKAjVs7sePg7rlWUGqPLWjUoGtEwH/60GTUJXZD\n8Os0xz4iYM8a5JUGFLINCBkIMA7oaT6lqitFZHsAT4jIfOdGVVURiSXX3wQaZwLAmDFj4jglERGh\nfNOH+j39IQq0cWsHxk5/CP9768O8bQMaasw+nbFd73ePvIux0x/y3R6mRiCoWPgzVz6PmYvX4fZX\nl+dta2pux9jpD+Hxdz4Kd7M+vDrIfp3muJ+qB53N61s3cmAjhvSty2svR3YUlZeqrjRf1wC4D9bD\nntUm3Qfm6xqz+0oAox2H72jaVprX7nb3ta5T1UmqOmnYsGFxfxQioqpVMBAQkSdF5G2PP8fFcQMi\ncqaIzBKRWU1NTXGckirYoqYWAMANLy7J2zbQTBkZZ2rQ359bHLi91NQgALj2uUU57/968r4AgHmr\nNgMAmttTBa8RJFpqUEmXinQP7sZLT/g4fnncBDx03qfwr9MPct0XRwQqiYj0FZH+9msAn4GVKvoA\ngNPMbqcBuN+8fgDANBGpF5GdAYwD8KpJI9osIgeL9T/BqY5jiIiozAqmBqnqkUWc1+/pj9f5rwNw\nHQBMmjSJU8ZVua5Uk3wDG2uxHK3Y2I01AqWmBgH5owpjzOw49gJi5eD35D/uznTQ35f7W3f8vqPQ\nUJtEn7oajBjYiMsf75oONmhEwFpRmDUCPcxwAPeZAK4GwG2q+qiIvAbgLhE5HcAHAE4CAFV9R0Tu\nAjAPQArAOWbGIAA4G13Thz4CzhhERNRtyjV96AMAbhORP8KaKm4cgFfLdC3qRbJdPY9HzAMarBGB\nOFODCgmXGhTcoXdvb6hNhjquJD595lhXFXZcyGtaUHdbbdJ/ADLovpwrClPPoKqLAezj0b4OwBSf\nYy4BcIlH+ywAe8V9j0REVFip04d+UURWAPgEgIdE5DHAevoDwH768yhyn/4Q+crOQuOxzZ5mc0N3\nBgKhUoOCu6nuGoKGWuufXWtn+f5J+HWsYw8DAk7o/rYETZMadB77/wmmBhEREcWr1FmD7oNVJOa1\nzfPpD1GQoL6e/YB58dotaE+lUV/jPyNtW2c6++QdANpTadQmEkgkBJmMIpVR1NXkxsHtqfyOeZig\no1D6kDtQaDT3tbm1fAGN3/cx/hEBi2eJQITju2uBOCIiIupSrlmDiEriPS+91fjse03Y/WeP+q5S\n+7+3PsQe//coFq5pto7LKHb/2aP41YPzAABn//sN7Paz3DRkVWsfp4VrtpT6MQAAna5agHo7EGgr\nrUg4iFe/uqE2gca6eJfz6Erlyt/m9/fjJahG4ICxg3OvRURERLFgIEA9SuC89K4mv2k7HzBTj9od\n+Q6T3nPbzGUAgEc9put0r1acySjWNLeFv3HjhP3yZ8ltc6UA2alBzW3hRwSirj7s9eT/zEN3wa2u\n2XpK1ZXKVfjvK0jQSMU/TjsAD373U6gJqDEgIiKi6PiblSpGxtWz9Cu23WKetPert4qL7UAg6JHy\n+pbcmYhSGS1qVp+j9hye1+YOMuqSCSQE2NwafkQg6urDXv3qgX3qsPsO/SOdp+B1zFevTr/f4mFe\nggKBfvU12GvUwIh3RkRERIUwEKAeRbKz0ORvc7f5ddS3mHn57RoAOzUnqC+9zhUIZFQDFwrz4647\nAICWjtwOv4igoTYZaUQgaMadsMqRWhOlWLjY8xAREVF5MBCgHsV+iuxXI9DHkePuOyJgAgF7oS+7\nQ+9+6uzMYV/f0p6zLZXRoqb39Oqwt3bkFyE31CYj1QjUJv17yiHW8vLdLy5hArcg5SpiJiIiIn8M\nBCg2qorl67cWtc/y9VuRyWj2KbICWL25LSe/3goEuia6emPZRmwwT/I3bu3AJjPDT7PpYK9Y34qO\nVCbbod/akc5ZjGxNc1fn/91VzTn3k04XFwjUe4wIeE0v2libzAYsYUQdESjnYmVO2REcj23uVK4g\nETOfiIiIKAYMBCg2N728FIf+/hm8vXKT7z73vbkSh/7+GbyyaF22bdm6rTj098/gz08tyHYeVRUH\n/fYpfPOfr2X3yyhyRgS+/a/X8a2bre0Tf/UE9vnV4wCArSYV58f3zMFP7pmDdkeneOKvnsi+Pui3\nT2Vf//25RTn3mcpkco4Lyys1yEt9bbR/ekGBgFcf2msq1D1jrg8AHMXdUR7/G4fuOtRxHkYCRERE\n3Y2BAMVm5uL1AIBlAaMCby7bCABYsKbrCXzTFuvJ/HPvNyGTyU0NemVxV8CgrtQg5/mcnH3SJ99d\nHerJvntGmrTmjwgcNT6/ENgt7JP72kS0f3o1EVOD3EHMZ8YPxycdHe/ukClQJPC9o3bLvuaIABER\nUY4xfasAACAASURBVPdjIECxsZ/mR+3U1ZnOc2c6k00N6vDovLtHBPw4Hy4nREIFAu65/tMZzWsb\n2q8u7zj3tJ5eqUFeok4HGjU1yA4E7KlKRw5qjHR8VMUsKOb8HnBEgIiIqPsxEKDYdHX8InZya6z9\nrUDAOotXga27RsCP8+oJCZcv3+4KFlLp/FmDvDqr7pSYsKlBQcW/XqJOH2rXVtjfryj5+lF0pQbl\nbyvXNYmKxf8liYhyMRCg2GiIEYGgWYE605pNJ2ntzA8EVLuecAdxdtgTIp6jC27uYCGd0bzjvD6X\nO/sl7JP7qItjFTsi0GhWMS5bINC1kkDeNna6iIiIejYGAlSy91c3Y31LR7ZTHHUqyLQ5sCPVlRq0\nqTV/jv2Mque5X164Nvt67Zb2nNl4EgnJmxEojJUbW/OCgzCfK+yIQPTUoGj7d7hSg6LM6R9F0IgA\n4wAiIqKejYEAlewzVz6Pz1z5fHZEIKi/bD9Bdu5jpvtHhyM1yIuqd2f8q/+YmX19+O+fydmWFMGv\nH5xX6CMAyK0/OOUfM9GZzmQ74J/be0SsgUDk1KCAEYEj99w+r+3QcVZh8EG7bAeguFl9wgj6lqhq\ndvvE0YM89zlx/x3LcFdEREQUBgMBisXaLe1FPwFOm05qZzqTfe0lo4pEArj/nEN892lx1RZEefDu\nLkS2AoEEFlzyWfxl2r6hVr8NWyxcE3HWIGdHfr8xXZ3qWT87ElP3GpG3/5Q9h+O930zF3qMGAugK\ntsKa/+up0e7Pq80Ebgsv+Szu+c4nPY/7/Zf2xoJLPhvt5oiIiCgWhSsviUKy00+8FtAKYqcGdaYy\nnk+urSfLgoz52re+8MxBtiiz0TS6AoGOlBUI2Pn5EqIIOmwHP2rxr/N7ul2/+uzroBGI+ppkdhQj\nKMAq5f6yC4r5FAsLgkczEglBImJxOREREcWDIwIUG7sTn0pH63Ta6UAd6Yznk+u0Y22BhEikwtko\nufh2Ya2tI6051wpzqrCXC1oXwEvaJ7gqlK6UMDcUtVg4bACVrRHwKhYOcX9ERES07TAQoNhodkQg\nWh5KdkQgrZ5Pru02q1g42gw6UQKBBncgkMrkpPokQpwrbAc66qxBzuDKeYVCV7NvudDiXm5hv2tB\n+2VUo84kS0RERN2IgQDFxn4q/Ng7H0U6zvm02ys1KJMBXlywFis2tEIQLRBYsrYl9L51rvNu2NqR\nU9Qb58Pt2oipQX4jAoUksyMC0Y6L+lk9BxyUKwYTERH1ZAwEKDb2QMDDcz/yXBDMj7OT69VhTavi\nazfMRCpjTR/qzuWPS71rjYK1W9pdqUH5vdpvHbJz6POPGtSIE/YdBQBIRiwWdo6yfPWgMdnXhYqT\n7RGK8qcG5bNqBBgJEBER9VQsFqbYODubUTqeznQgZ1Bw3MSRuH/2hzltIoK+5QoEanLPu7m1E33r\nu/6JuJ9uv/urqWisS+LGl5YUPPc/Tp2EI8cPz76POn2o83swefftsfTSY0Mdl00NKtvqXnaxsPeC\nYiwRICIi6rk4IkAlcXYAnV3BKDMHZTLeAUSfOqsT7uwEJyTaTEBRuFODmttSgSMCYacKBYCkq+Pv\nVyzs99GizsRks+856vShYQX9VWR81n0gIiKinoGBAJXE2T9Vnyf7heTWCHS19zPThLanutKMytmx\ndKcGbW7rzAkO3FcOUzxsS7ru22+a0Vqf9mJrBMo9IhD0HVAoE4OIiIh6MAYCVBK/TnyUmYMyPgGE\nPSLgrDeImFofifsJf2daUVvjLBYuvlvrnpffb55+9yxH9tuSRwTKlRlkeMUZTA3qnURktIg8IyLz\nROQdETnftF8sIitFZLb5c4zjmAtFZKGIvCciRzva9xeRuWbbX6Rcw31EROSJNQIU6D+zlkMVGNSn\nFp+ZsEPOtllL1+PeN1dm3zs79M+/vxY7DGjA4L61WNTUgi/sMzLnWGfHMe2IGa5/YXH2dT+Tn9/W\n2bVDOfsJdhpQXTKBDnNTdQWKhcNyd/D9pg91Bwh96mqwpT0VefpPW6LIYuGw7L8Pz3UEzAJw1Ouk\nAPxAVd8Qkf4AXheRJ8y2K1X1D86dRWQ8gGkAJgAYCeBJEdlNVdMArgFwBoCZAB4GMBXAI930OYiI\nqh5HBCjQj+6egx/fMwdn3vp63rZfPTgPt81cln3v7Kv+8D9v4Ws3zMSxf3kR593+Zt6xzo6pc/Rg\n/kfN2dd2oW5bTmqQua+jd8fOQ/uG/hyf/Nh22HFwY+A+uw3vj9FDGvHzz4/PtvktKHaUo/D3FMcs\nPn7cNQG+IwKu/T42rC92Hto3556iOGDnIdhhQAPOmzIu1P5/+PI+mDByQOjz23frFWe0pzKBKx9T\nZVLVVar6hnndDOBdAKMCDjkOwB2q2q6qSwAsBHCgiIwAMEBVZ6iVV3gLgOPLfPtEROTA39Lkq1Be\n+qbWzkj7++3r97TaTtVp68ivETjn07vimR9O9j3/VyaNxoE7D8m+P/nAMXjxJ0egf0PuINiRe26f\nfV2bTOCFHx+BybsP62rzWFDszMN2wfWnTsq2X/LFj/veh/u+bXZgUChlqG99DZ754WQcvtswFGNg\nYy1mXDQFE0cPCrX/ifvviIfOOzT0+YMe+G/Y2oHBfWpDn4sqj4iMBbAvrCf6APBdEZkjIjeKyGDT\nNgrAcsdhK0zbKPPa3U5ERN2EgQD5ausMXgvA3X/vTBdbF+C9j51O4xwRCJtoolDPYMN9vLNo1x6Z\ncK4wnFMsLPltYbmLg7NpSK4n5n4pRD19Pn6vWG7j1k4M6lPX/TdD3UJE+gG4B8AFqroZVprPLgAm\nAlgF4IoYr3WmiMwSkVlNTU1xnZaIqOoxECBfhQIB95P8jlThQMDOJXd2/v3y3+0n8MXUCKjmBiZ2\nUOA+3pmy05m29vELBOyn+lFWNra5O/j2e/e58gIGs5/00H+pdoDi9Te4cWsnBjVyRKA3EpFaWEHA\nv1X1XgBQ1dWqmlbVDIDrARxodl8JYLTj8B1N20rz2t2eR1WvU9VJqjpp2LDiRseIiChfD+1eUE/Q\nGnFEoCPCiEDaUReQ9kkNsqfcdAYkUQp27Y494D/rjrOjb99Tg+MpvXPWILsv72wLy69GwD0ikLef\ned9T5+PPrizs8XdopQZxRKC3MTP73ADgXVX9o6N9hGO3LwJ427x+AMA0EakXkZ0BjAPwqqquArBZ\nRA425zwVwP3d8iGIiAgAZw3qNa57fhH22XEQDtplO999bnppCXbari+enr8G5x6xK4YPaMjbZ9m6\nrbjp5aX42bF75jyJB4CrnlmIrR0pvLBgLT6161Cs3Nias709YERgwepm/PA/b+GtFZsAAH94/H3s\nOLgPrnl2Ed5b3ex5jN1Hb+3MLxYuRJE7ImCPOriPdz6RtwMH54w+tTnrCJjOexEjAu6OvHOGIif/\n1KCezQ4DZixehxcWNGHj1k6saW7HoL4cEeiFDgHwdQBzRWS2absIwMkiMhHW/w5LAZwFAKr6jojc\nBWAerBmHzjEzBgHA2QBuAtAIa7YgzhhERNSNGAj0Er99eD4AYOmlx/ruc/H/5mVfr2luw9+/Pilv\nn/PvfBNvLtuI4/cdmdd5vfyx97Kv55gOvZO7eNjpG/98LS9wuODO2T57A+d+etfs9Z0BSdhFvDKq\n2fUHGmoT+LyZvjQoNehrB++UfT2sfz2amttzvgfZGgGPmXDOmzIOe48aCAD4/lG7Yfcd+uMsx0xL\n7iLgA8YOwUE7D8Gh44biD4+/77uf/b6njwjYpl03I+d93zr+iOltVPVFeMemDwcccwmASzzaZwHY\nK767IyKiKJgaVKUKzfDTmc4UrBFw60hlMG77fp7bmtv8gwQvZx2+S7aT7ryPKP1h+5r/Ov2g7FSk\nbvaT+V2G9sVARz77d4/YFQCw1WPGIq8age8ftRuONFOKnjdlHI52rbngftI/fuQA3HnWJzB1rxE5\n7X5FxT00Duji878Tpw8lIiLqufi4jnLUmo5oZ1qRSoefDtTWWJf0bI+6Mm4yIY4RAf8agYT4rJqr\nQHN7CoC1GJrN3Z+uNcGGu6NtTzPaYs5hX8s6Jnrn1q8j755e071ycm2PrxHwX1AMKC6NioiIiLoH\nf0tTDrsQtjOdKVgs7KWhxicQiBhUJES6pg8NqBHwm0VI0VXM7JzC0r27nYPv7mjbKS05gUB2pp/4\nOuUDXbPquKcJtb8HPTQOCFxQDMhdh4GIiIh6Fv6Wphz20+5iUoMAoMF3RCD8jEKA1fG1Zw1qLTAi\n4MU5i03uFJbeRbvu1B07lailoysQsIOO+hg7tzWuJ+buDn+tT6DSUxS6rboYgyaiUvmNXBERVauq\nCgQ2t3XihKtfwuKmLaGPueHFJfjtw++W8a5K5zV1IwCs2LAV37rpNdw64wP8+O638rY/MncVpt8z\nBwDw0JxV+MFdb2Vz1DvTWlQg0KfWOxCImBmEpIj3OgKu/QY0eM9K48xNr/FYFKyPCVjs/r97ZMFO\nDXJ2wEtLDQrXIW50ff/c99lTKYCZi9fltRfzvSIiIqLuUVU1As/MX4M3lm3ElU8uwF9P3jfUMb9+\n0Jpp56Jj9iznrZXEr/B39vKNeHr+Gjw9f43n9u/8+w0AwO9O+DjOuc16fczHrSLXznQGm9tSnscF\n8asRiMqZGtTqKNh1f9I7z/oEHnvnIzS3pXDtc4sAAJ/bewR+esz4/9/emQfHUZ55+Hl1S5YsyfKJ\njC07NgbbBGOMiYGkOIMhKUiySWGWBAjJpioh9+6y9rKVjas2Fa7deFMJCyTF5iImJJALcxgnhLAQ\nMOYwtsG35fuSZN3XzOjbP7p7pqenZzRjjTQ90vtUTanv/k1ruvt7v+89WLF0BtuPxqcmddrTZcWF\ndPdHoilGvQ3tc+ur+dqVc7nxwlgdpEwLij1y2xL2nuyiNxThjOrEVK0O/71iEXXjSnm9sYWbls5g\n/bvHWFhfzXNbj3HH5VbQcrqGxEgTLShm4KuPvZWwXoOFFUVRFCW4jClDwCFZD3q+kiwQd7DMQA7u\nzDhOI7c3NEBbd7/v9uXFhUnjB8qSjAgA3Ll8Hvc+uyPpejcisYa32z3HW714zuRK5ky2GsuPvrqf\njr4wd33kHKorilk8o5bFM2oTjut8B4A+e7TB6xokInzj6rPil9l/0zUErjh7ClecPfh2NyyqB+DS\nuRMBuGVZA0CC9iASLSiGSch4BDoioCiKoihBRt/So4CBJIZNKM0A3VOuBr/TmOsNRTjV7Z/yc3x5\ncvvR69oSt18SNx4/xDUi4A7YTVW0zPm2fg3S6HHt5nxZsf09w5Ho+QbDMUy0lzuGO1jYL4haswYp\niqIoSnAZk2/poLpZnC7JRgTCkRSNZtcura4Gv9NuswwB/xGBVA368pLkP6nx5ZlVmXWKaXX2xUYf\nUhkC3v38iI4I2C5MTvxBOj740YJi2riN4bpu3lEV0BEBRVEURQky+pYeBUSS9Pynyt3vblC7DQGn\nx7w3FElaKThVgz5Z+lCA8WWZeaI5PfDdKVyD3DjN0FTVh501Udcg+3iFGYwIOClWlRgG/0Z/NlOt\nKoqiKIqSXUa1IbB8zV9Zs2FnwvKhxAjc8shGVj35zlBkxfHgi3uYe9fTXP1fL3KivTfpdvuaumhY\nuY6dxzsS1kU83+fxTQdpWLmOf/vd1qTHc/v4u3v+nWPdv34nL+1q8t03VaPZGyzs7iX25swfDGff\n/c3d0WX9KUY5ptWUJZzTizMaNLW63NZkGSeTx5cOqsepdFyawtgZa0TrHhgTvT5u1I1KURRFUYLL\nqH5Lbz/WwZoNu7J6zL/uPMnajQezdry7n9lOKGLYdaKT7ccSG/kOT285CsCTbx5OWOcNCnZSgqai\npSvW+E/lg+/n8x8xhoc/cwF3XP6+hHXu4l0QXzl33tQq7lw+j+ULpibsd+kcK1C2tKiA+z91HhBz\nU3LTlyKl6c8/dxFrblxEZengIw9fvnwOq69fwOrrF/LdT5zLdz/x/kH3ufKcKXzn4wtpqKsYdNux\nQixY2D82Q12DFEVRFCW4jKm3tBNUG9QYgWQ++RDr5fYLDPa6AA2WLKioQDjZ0Red73ClCfU2tCt9\n3HnCA4YPL5jKP1+TmBKnrjLeEHAbBqVFhXzpsjmsvmFBwn6Xnz0ZgJuWzuCTF0wH/ItopRoRmDK+\njI+dX590PcQarmXFBdx6cQOFBcJNS2ekNVpRWVrEzRfNDOzvJxe4r4RvsLCOCCgB4r2jyTtbFEVR\nxiKj9i3tlzozFA522tDWJFl6IOaO4/e9ksUIJKOipJBO1yhAe2/svL2eEYEqn971gRSWxqTKeBcb\nd1Vfx5jx6yV28vm7G5N+Lj59ocwqFCdDEkqTKUPBGB0RUILN3/Y087EfvpxrGYqiKIFi1L6l/ari\n9tmNzSDVEXD3mKYyBJwAWF9DIMPvM87TuG93BQWnMyKQqj5BqhEBB7+e41DYMQRi18NvRKAvnHm1\nYzfOMZOlXFUywxkdMRojoAScAy1duZagKIoSOEbtW9rPEAi5erv7wpG4XvHB8OsF7+4PD9moGOcK\nrk3lGuQ0gP0asJGBzHrJvYbA8faYm5DXGPHzt0/ViPYe2x0j4ODXOAzZ19dtCPiNCKRyDUoH9erJ\nLtE6AvinbdWsQUpQ0FFARVGUREaNIbDjWAcNK9fxym4r080l9/w5YRvH/WTAGC78jw0s/PfneG1v\nc1rHD3ka2/uaupj/ref45uObB933gb/spmHlurje7Ff2NNGwcl1c0a5WlyHQ3NlHw8p1PL7pID9+\naW+0Iq9fb7w7RuCy+14YVM84T2afZ7cdi07v8GQlqihJDBZ+3+TKpMf25tj327bYx4Vkip21Z3pt\neXRZqY/B0FA3Lum50+GsKVVA6grIQaYqwxSsw43EkgZR6PN/zdfrrIxC1A5QFEVJIFitiiHwemML\nAH985wgXz5kYLRTlxjEE2npCtNsBsgdaurlodp3vMd29/eGIwd3Z3dhkDTP/YfMRvnfjopTaHnpx\nLwBdfZFo6sn1244nbOc2Cg639gDw01camWc3XiGJIeCKEWh0pdpMhtNrP722nEOnelJuW14S/xP5\nwd+fz+XzJids9+CnF3NGTTllxYX86JYlVJQU0huKMP+M8dz9zPa4bd15/n90yxLOnlpFfU05k6vK\nuOqc2LHrKkt54ObFtPWEWDa7jkOnejh/Rs2g3y8V37txEW8faGVqddmQjpMLfnfHJZwRMN3uXlbn\n37r6+gWIwOSqsoyqSSuKoiiKMrKMGkPASXPpZwA49NsN5pau5MGxbtyN7vCAiTMMHDeedDqZnF5T\ndzEsb759gNYed4XfWGEvN35uOZn6u1fYjfurzpnCT15pTL2tp0f3uoXT4hry5cWF9IQiTK+tYGF9\nNQBXz58SXe/nouVm8Ywa6uwAY/d+0fOdOy063TBxaKMBYLk6XTp34pCPkwsWnTk0I2g4MVj3y8L6\n8dx6cUOu5SiKoiiKkgZDcg0SkftEZLuIvCMivxWRGte6VSKyW0R2iMg1Q5eamtJi66v09CdveDoN\n8ZMdscJdqfLSu/3Rw5EBQq6e9+bO5P78Xpx2urtR7FeB1+0a5OTz7w0NxDX0/VzkU1UQ9mNcqXVu\n55qlosyzjbdq73i7IJdfYK+1f2rXEHUdyXOirkGG0IDxdQ9SlCCyduOBQTsqFEVRRjtDfWs/Dyw0\nxrwf2AmsAhCR+cAKYAGwHHhARIa1xee4/fSmyCrjbNPkasSnMhzc6UbDAya6P8AxuwrwgDFpBwy7\nq/l6G9gAp1xFvnptXb2hSFyRL7/A4FRZfPxw/PhL00jtWOYzcuFmqK4fagjkN277LxwZoDhFVWdF\nySXeX+aqJ7ckuC2C5TqqKIoyVhiSIWCMWW+McVLvvApMt6dvAB4zxvQZY/YBu4GlQznXYDguQSc7\n+jjYEu8nf7Clm66+cFxD3uF4Ry/H2uxG/YCJ9sq3dPXT1BXLprOvqYujbTF/+ug+Bjr6whxo7uZE\ney/94QE6+8JxGpwXy3tH2+noDXGyoy/OTcihvTdMODLAvqauqO9+bygS12u1v6Wbtp4Q+5u72Hak\njRMdvXExApng7d33o6I4tfeYU4grkwxMbvwyAyn5g/Pf23Oyi3DEP4WoogQBv0KAzV3xI7vPbDnK\neavX8+aBUyMlS1EUJadkM0bgduBX9nQ9lmHgcMheNmw4jeVtR9r54L3xmXM+eO8LXNhQy+yJiRls\nfvHqAX7x6gG2rb6Gh/66l+//aRf3f+o8/unX8dmAVjz8aty8E8wLsKmxhdt/ssk619yJtPeG2Xyw\nlZdXXsGre2JZidLJMPTSriY++5PXo/M9oUjcSMJbB1o5b/X66HxVWREP3Lw45TFLiwqYWl3GfjuQ\n2OmFL0wjl+bsSan98i+eM5FN+09lnM3mrCmV7DzemdE+SnBZu/EAAJfOyc/4C0UBeMV+Xm893Mbi\nGbU5VqMoijL8DNp6E5ENwFSfVXcZY35vb3MXEAYezVSAiHwB+ALAjBkzMt09Ss8gvp6vN56iblys\n6m1RgVBdXhztEWru7OepzUcAWPfOkUHPt785Vpxm6+H26PRLu5qi00dae/jLzpPpfQGbLYfb4uYH\nTPIA6GWz6/jb3ua4bEN+rPvqB6mvKWf7sXaqyor4zRuHgfgRgXv+7lz+5Ykt0fknvriM3tAAy2bX\nMW9qFeXFhb4Bzl+/ci7LF0zlnGnjk55/411XWtGkLp744sW0dKUfZ6EEE28vq44IKPnEjmPt7D3Z\nyexJyVMiDxcH7dFdJ8mCoihKLhjUEDDGXJVqvYjcBnwUuNLEnOUPA2e6NptuL/M7/sPAwwBLliw5\n7epcfo3lc+ur4xrW7oJdNRXFFLkCG93rOnoHd3M51R2iuryYtp5QNJVowjan0dDd53OsZAFtS2dN\n4G97m2nu7PNd7zDHzuV/vt3D5QQfu91yvA35C2ZOiE6f5Upf6qWgQJh/RnIjAKw0kl6qyoqp0tSS\neY+32V+kwcJKQPEzUXce7+SK/3yRxrs/Erd8JAqPOyPX3nMriqKMJEPNGrQcuBO43hjjdsz/A7BC\nREpFZBYwF9g4lHMNhl9judwTiOqumltTURJX4MttCKSq8Otmlp3Ocm8SQ6B1kKAzP88cv2N5q/06\nOG47TYMYAl6c4OJ0XIMUJRXen5BfdWFFSYWILLezy+0WkZW51qMoijKWGGr33Q+AKuB5EXlbRB4E\nMMZsAx4H3gWeBe4wxgxrnjY/Q8CbHtPJ9ANW5hz3KII7U0RTmqlBHUOgsTmJITCIQVFbUZKwzG90\nwa3bzfTaCiCzVKYQMwTcrkGZpiBVFIgvKAbqGqRkhp1N7ofAtcB84CY769wwnGvwbQ6dsvqzTnX3\nY4zJuJNF3R0VRck3hhQsbIyZk2Ldd4DvDOX46bL7RCfPbj2WsNw7ItDWE6K2ojjqU+9ONfravpZo\nteF008fNmGA1xJP12G8+2BaXachLTXlxwosjk9R1E8ZZhsSO4x1p7wPuEYHYstPNPKQoborTSEmr\nKC6WAruNMXsBROQxrKxz72b7RKmSNTSsXBc3v2bDLtZs2BWd/9EtSwCrFs0dv3yT+z91HuPLivjO\n0+9RKMKq687hz9uPs3bjQc6tr+arV85NW9fz7yZWmVcUZWxz/owaJlaWDr5hFhgVlYX/sPkIJzoS\ne26uWTCV9Z6H7EWz6nh22zHmnzGemoriaJaIX752IOPzzqyrYFp1GUfb/Hvs1205mnL/+tryOFeg\n8WVFUWNkMKbXljOpqpSSwgLeOtAKwCVz6nh5d3Pcdn7pOT8wu46fv7qfc6fXRA2jadUxP/6ZdRVp\naVAU7++rpkLjPpSMqAcOuuYPARd5N8pWUonT5R9+tilu3ptVzr1+y+G2hO0zObaiKMrPbl/Kh86a\nNCLnknSLYY0ES5YsMZs2Zf5QPN7ey8mOPqbXltMfHqCkqIDIgKGuspSjbT2UFhXS0tVHKGI4a0oV\n+5q6OHNCOZEBw4n2PspLCjlpGxJOAHB1eTEDxlBTXkJ4YICiggJ6wxEKCwRjoLmrj7MmV9HS3c+x\ntl7qa8oJDQzQ1NFPSVEBtRXFUQNhYmUpBQVW2s7mzn7GlRRyoqOPmXUVDAxAYaHlYNHVF+ZERx9n\n1lbQF45QWlxIc2cfPaEIDXXjMFi9+a3d/VSXF1NTUcKR1h5auqz5SVWlHG7tobaihAKBosICCkV8\ns/00d/ZRV1lKT3+EAWMYV1pES5elvahAtNCXkjat3f0UFAgHmruZO6WSUp+q2Up2EJE3jDFLcq0j\nW4jIJ4HlxpjP2/OfAS4yxnw52T6n+5440trDxXf/2XP+WGDwkpm1tPaE6OwNM768iHlTx/NHO5Pc\nU1+5NLrP2o0HWHHhDESsxBLd/WGmjLc6Uh75v3189pJZabkhhSID9IQiQy7KqCjK6GNmXcVpJVQ5\nnXfEqDAEFEVRxgKj0BBYBnzbGHONPb8KwBjz3WT76HtCURTFn9N5R6hDr6IoipIrXgfmisgsESkB\nVmBlnVMURVFGgFERI6AoiqLkH8aYsIh8GXgOKAQesbPOKYqiKCOAGgKKoihKzjDGPA08nWsdiqIo\nYxF1DVIURVEURVGUMYgaAoqiKIqiKIoyBlFDQFEURVEURVHGIGoIKIqiKIqiKMoYRA0BRVEURVEU\nRRmDqCGgKIqiKIqiKGMQNQQURVEURVEUZQwixphca4giIieB/ae5+0SgKYtyhhPVOjyo1uEjn/SO\nZq0zjTGThktMPqDvicChOrNPvmjNF52QP1qHqjPjd0SgDIGhICKbjDFLcq0jHVTr8KBah4980qta\nlWTk0/XOF62qM/vki9Z80Qn5ozUXOtU1SFEURVEURVHGIGoIKIqiKIqiKMoYZDQZAg/nWkAGqNbh\nQbUOH/mkV7Uqycin650vWlVn9skXrfmiE/JH64jrHDUxAoqiKIqiKIqipM9oGhFQFEVRFEVRizur\nBQAABrtJREFUFCVNRoUhICLLRWSHiOwWkZUB0POIiJwQka2uZRNE5HkR2WX/rXWtW2Vr3yEi14yw\n1jNF5AUReVdEtonI14KqV0TKRGSjiGy2ta4Oqlb73IUi8paIPBVknfb5G0Vki4i8LSKbgqxXRGpE\n5Dcisl1E3hORZUHUKiLz7OvpfNpF5OtB1DoWGIn3RDafpyJygX1P7haR74uI2MtLReRX9vLXRKTB\ntc+t9jl2icitaegd8jNqhHRm5Z4fbq0i8g37/75VRNaK9c4KhE7JUrskm9pEZJa97W5735IUWu+z\n///viMhvRaQm11r9dLq2/0cRMSIyMdc6vdoSMMbk9QcoBPYAs4ESYDMwP8eaPgQsBra6lt0LrLSn\nVwL32NPzbc2lwCz7uxSOoNZpwGJ7ugrYaWsKnF5AgEp7uhh4DfhAELXa5/8m8EvgqSD/BmwNjcBE\nz7JA6gV+Cnzeni4BaoKq1aW5EDgGzAy61tH4YYTeE9l8ngIb7eebAM8A19rLvwQ8aE+vAH5lT08A\n9tp/a+3p2kH0DvkZNUI6s3LPD6dWoB7YB5Tb848DtwVFJ1lql2RTm32NVtjTDwJfTKH1w0CRPX1P\nELT66bTXnwk8h1XvZGKudQ763Mr2g3CkP8Ay4DnX/CpgVQB0NXh+xDuAafb0NGCHn177x7Msh7p/\nD1wddL1ABfAmcFEQtQLTgT8BVxB7yQZOp+ucjSQaAoHTC1RjvWwl6Fo9+j4MvJwPWkfjJ1fvidN9\nntrbbHctvwl4yPu7AIqwig+Jext73UPATSm0DfkZNUI6s3LPD7dWLEPgIFbjrAh4yr7vA6OTIbZL\nsqnNXtdErHHvvUfjtHq+x8eBR4Og1U8n8BvgPFzv1VzrTPUZDa5Bzs3ncMheFjSmGGOO2tPHgCn2\ndGD028NO52P1tAdSr1hD2W8DJ4DnjTFB1boGuBMYcC0Lok4HA2wQkTdE5Av2siDqnQWcBP5XLJeG\nH4vIuIBqdbMCWGtPB13raGTEr+0Qn6f19rR3edw+xpgw0AbUpThWMrLxjBoJndm654dVqzHmMHA/\ncAA4CrQZY9YHTaeHXGqrA1rtbTPRDHA7Vs954LSKyA3AYWPMZs+qQOl0MxoMgbzDWKaaybUONyJS\nCTwBfN0Y0+5eFyS9xpiIMWYRVm/WUhFZ6Fmfc60i8lHghDHmjWTbBEGnh0vt63otcIeIfMi9MkB6\ni7CGYv/HGHM+0IU1pB0lQFoBsH00rwd+7V0XNK1Kdgj68zTPnlF5cc/b/vU3YBkuZwDjROTT7m2C\noDMZQdbmRkTuAsLAo7nW4kVEKoB/Bb6Vay2ZMBoMgcNY/lgO0+1lQeO4iEwDsP+esJfnXL+IFGO9\ntB41xjxpLw6sXgBjTCvwArCc4Gm9BLheRBqBx4ArROQXAdQZxe7NwhhzAvgtsJRg6j0EHLJHgsAa\ngl0cUK0O1wJvGmOO2/NB1jpaGbFrm6Xn6WF72k9vdB8RKcJynWlOcSw/svWMGm6dkL17fri1XgXs\nM8acNMaEgCeBiwOo000utTUDNfa2aWkWkduAjwI324ZL0LS+D8sQ3GzfW9OBN0VkasB0xjOY71DQ\nP1i9BXvti+8EgS0IgK4G4n3x7iM+KOdee3oB8QEkexnZwEsBfgas8SwPnF5gElBjT5cDL2E9FAKn\n1aX5MmL+t4HUCYwDqlzTr2AZWEHV+xIwz57+tq0zkFptDY8Bn3XNB1braP0wQu+JbD5PSQwgvM5e\nfgfxAYSP29MTsHzpa+3PPmBCGpqH9IwaCZ3ZuueHUytWvNo2rPg1wQpw/kqQdJKFdkk2tWGNkroD\nW7+UQuty4F1gkuc75VSrV6dHWyOxGIGcX9Ok91e2H4S5+ADXYWVn2APcFQA9a7F8BENYvRmfw/Ld\n+hOwC9iA6yYF7rK178COFh9BrZdiDQe+A7xtf64Lol7g/cBbttatwLfs5YHT6jr/ZcResoHUiZVJ\nZbP92ebcQwHWuwjYZP8Ofmc/CIOqdRxWL021a1kgtY72z0i8J7L5PAWW2M+5PcAPiBUALcN62e/G\nakDMdu1zu718Ny7jcxDNQ3pGjYTObN3zw60VWA1st8/xc6xGXyB0kqV2STa1Yb17NtrLfw2UptC6\nG8sv3rmvHsy1Vj+dnmveiCsJRy6vaaqPVhZWFEVRFEVRlDHIaIgRUBRFURRFURQlQ9QQUBRFURRF\nUZQxiBoCiqIoiqIoijIGUUNAURRFURRFUcYgaggoiqIoiqIoyhhEDQFFURRFURRFGYOoIaAoiqIo\niqIoYxA1BBRFURRFURRlDPL/l7UsZ3zvTkIAAAAASUVORK5CYII=\n", "text/plain": [ "<matplotlib.figure.Figure at 0x7f7333b69110>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "num_frames = 1400000\n", "batch_size = 32\n", "gamma = 0.99\n", "\n", "losses = []\n", "all_rewards = []\n", "episode_reward = 0\n", "\n", "state = env.reset()\n", "for frame_idx in range(1, num_frames + 1):\n", " epsilon = epsilon_by_frame(frame_idx)\n", " action = model.act(state, epsilon)\n", " \n", " next_state, reward, done, _ = env.step(action)\n", " replay_buffer.push(state, action, reward, next_state, done)\n", " \n", " state = next_state\n", " episode_reward += reward\n", " \n", " if done:\n", " state = env.reset()\n", " all_rewards.append(episode_reward)\n", " episode_reward = 0\n", " \n", " if len(replay_buffer) > replay_initial:\n", " loss = compute_td_loss(batch_size)\n", " losses.append(loss.data[0])\n", " \n", " if frame_idx % 10000 == 0:\n", " plot(frame_idx, all_rewards, losses)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.13" } }, "nbformat": 4, "nbformat_minor": 2 }