diff --git a/Chapter 1/Ch1_Introduction.ipynb b/Chapter 1/Ch1_Introduction.ipynb
index 6143d62..d98ee84 100644
--- a/Chapter 1/Ch1_Introduction.ipynb
+++ b/Chapter 1/Ch1_Introduction.ipynb
@@ -3,7 +3,10 @@
{
"cell_type": "markdown",
"metadata": {
- "collapsed": true
+ "collapsed": true,
+ "jupyter": {
+ "outputs_hidden": true
+ }
},
"source": [
"# Deep Reinforcement Learning in Action \n",
@@ -87,14 +90,14 @@
},
{
"cell_type": "code",
- "execution_count": 7,
+ "execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "5.54 s ± 432 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+ "4.4 s ± 844 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
@@ -105,15 +108,14 @@
},
{
"cell_type": "code",
- "execution_count": 8,
+ "execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
- "The slowest run took 4.44 times longer than the fastest. This could mean that an intermediate result is being cached.\n",
- "412 ns ± 319 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
+ "319 ns ± 274 ns per loop (mean ± std. dev. of 7 runs, 1 loop each)\n"
]
}
],
@@ -121,13 +123,20 @@
"%timeit fib_mem(35)\n",
"# We get 412 ns to run with n=35"
]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
}
],
"metadata": {
"kernelspec": {
- "display_name": "Python [conda env:deeprl]",
+ "display_name": "Python 3 (ipykernel)",
"language": "python",
- "name": "conda-env-deeprl-py"
+ "name": "python3"
},
"language_info": {
"codemirror_mode": {
@@ -139,9 +148,9 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.6.5"
+ "version": "3.10.12"
}
},
"nbformat": 4,
- "nbformat_minor": 2
+ "nbformat_minor": 4
}
diff --git a/Chapter 10/Ch10_book.ipynb b/Chapter 10/Ch10_book.ipynb
index bf7dc05..a9ac867 100644
--- a/Chapter 10/Ch10_book.ipynb
+++ b/Chapter 10/Ch10_book.ipynb
@@ -17,9 +17,91 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 1,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz\n",
+ "Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz to MNIST/MNIST/raw/train-images-idx3-ubyte.gz\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|████████████████████████████| 9912422/9912422 [00:08<00:00, 1221139.92it/s]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Extracting MNIST/MNIST/raw/train-images-idx3-ubyte.gz to MNIST/MNIST/raw\n",
+ "\n",
+ "Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz\n",
+ "Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz to MNIST/MNIST/raw/train-labels-idx1-ubyte.gz\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|███████████████████████████████| 28881/28881 [00:00<00:00, 12552921.64it/s]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Extracting MNIST/MNIST/raw/train-labels-idx1-ubyte.gz to MNIST/MNIST/raw\n",
+ "\n",
+ "Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz\n",
+ "Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz to MNIST/MNIST/raw/t10k-images-idx3-ubyte.gz\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|████████████████████████████| 1648877/1648877 [00:01<00:00, 1283586.12it/s]\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Extracting MNIST/MNIST/raw/t10k-images-idx3-ubyte.gz to MNIST/MNIST/raw\n",
+ "\n",
+ "Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz\n",
+ "Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz to MNIST/MNIST/raw/t10k-labels-idx1-ubyte.gz\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "100%|██████████████████████████████████| 4542/4542 [00:00<00:00, 1829846.20it/s]"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Extracting MNIST/MNIST/raw/t10k-labels-idx1-ubyte.gz to MNIST/MNIST/raw\n",
+ "\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "\n"
+ ]
+ }
+ ],
"source": [
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
@@ -45,8 +127,9 @@
" for i in range(xt.shape[0]):\n",
" img = xt[i].unsqueeze(dim=0)\n",
" img = TV.transforms.functional.to_pil_image(img)\n",
- " rand_rot = np.random.randint(-1*rot,rot,1) if rot > 0 else 0\n",
+ " rand_rot = np.random.randint(-1*rot,rot,1) if rot < 0 else 0\n",
" xtrans,ytrans = np.random.randint(-maxtrans,maxtrans,2)\n",
+ " #print(rand_rot[0])\n",
" img = TV.transforms.functional.affine(img, rand_rot, (xtrans,ytrans),1,0)\n",
" img = TV.transforms.functional.to_tensor(img).squeeze()\n",
" if noise > 0:\n",
@@ -69,7 +152,7 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
@@ -162,9 +245,20 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 3,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/don/git/DeepReinforcementLearningInAction/venv/lib/python3.10/site-packages/torchvision/datasets/mnist.py:75: UserWarning: train_data has been renamed data\n",
+ " warnings.warn(\"train_data has been renamed data\")\n",
+ "/home/don/git/DeepReinforcementLearningInAction/venv/lib/python3.10/site-packages/torchvision/datasets/mnist.py:65: UserWarning: train_labels has been renamed targets\n",
+ " warnings.warn(\"train_labels has been renamed targets\")\n"
+ ]
+ }
+ ],
"source": [
"agent = RelationalModule() #A\n",
"epochs = 1000\n",
@@ -198,9 +292,27 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 4,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/home/don/git/DeepReinforcementLearningInAction/venv/lib/python3.10/site-packages/torchvision/datasets/mnist.py:80: UserWarning: test_data has been renamed data\n",
+ " warnings.warn(\"test_data has been renamed data\")\n",
+ "/home/don/git/DeepReinforcementLearningInAction/venv/lib/python3.10/site-packages/torchvision/datasets/mnist.py:70: UserWarning: test_labels has been renamed targets\n",
+ " warnings.warn(\"test_labels has been renamed targets\")\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "tensor(0.9600)\n"
+ ]
+ }
+ ],
"source": [
"def test_acc(model,batch_size=500):\n",
" acc = 0.\n",
@@ -219,9 +331,30 @@
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 5,
"metadata": {},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 5,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAgBklEQVR4nO3df3BU9f3v8ddmN9lETFYSJclKIqmXEQXEHwijeFsYMjIZRJmOWh3EXLzT1jYIGIcCbYOtvyK2tRHlC+LcCp0Rf/whaLmjDkUEvfI7YuW25cdXilG+IdpqFoJZkt1z//Cy32+EkATOJ+9sfD5mzh979uR13rPZzStnc3I24HmeJwAAelmG9QAAgG8nCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmQtYDfFMymdShQ4eUm5urQCBgPQ4AoIc8z9ORI0cUjUaVkdH5cU6fK6BDhw6ppKTEegwAwFlqaGjQ4MGDO72/zxVQbm6uJGl89H8qlJHle74XO+J7ZtrLzHQaHwj7/308wcvJdpd9TthZttL16L496Sw60Bp3l51IOMuWJLUedxbtJRw+5ufmOMltTx7X2x8vT/0870yfK6ATb7uFMrIUyvD/B4AXcPckT1sZjgvIwffxBC+YntlpW0Cewx+GQWfRCniOC8jhX9M9l4+5w9empC7/jMJJCAAAExQQAMAEBQQAMEEBAQBMOCugJUuWaMiQIcrOztbYsWO1bds2V7sCAKQhJwX00ksvqbq6Wg888IDq6+s1atQoTZo0SU1NTS52BwBIQ04K6IknntAPf/hDzZgxQ5dddpmWLVumc845R3/4wx9c7A4AkIZ8L6Djx49r586dKi8v/8+dZGSovLxcmzdvPmn7eDyuWCzWYQEA9H++F9Dnn3+uRCKhwsLCDusLCwvV2Nh40va1tbWKRCKphcvwAMC3g/lZcAsWLFBzc3NqaWhosB4JANALfL8Uz/nnn69gMKjDhw93WH/48GEVFRWdtH04HFY47PZyEACAvsf3I6CsrCxdffXVWr9+fWpdMpnU+vXrde211/q9OwBAmnJyMdLq6mpVVlZq9OjRGjNmjOrq6tTS0qIZM2a42B0AIA05KaAf/OAH+uyzz7Rw4UI1Njbqiiuu0BtvvHHSiQkAgG8vZx/HMHPmTM2cOdNVPAAgzZmfBQcA+HaigAAAJiggAIAJCggAYMLZSQhnyzt6VF7guO+5yXjc98ze0NVnq5+VRMJdtiQdb3OXfewrZ9EOH3Gnj7nn8vuZ4e53Vi+ZdJftcG5Jbl9DDh+XQNDR45Ls3s9ujoAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAICJkPUAnQpkfL34HRsI+J6ZkuGwz9N1bkleIuEw3HOX3dbmLNpLJJ1ly3OYna4c/CzpLYHssLNsL3eAm9xESDrc9Xbp+10BAKQ1CggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmPC9gGpra3XNNdcoNzdXgwYN0tSpU7Vnzx6/dwMASHO+F9DGjRtVVVWlLVu2aN26dWpra9MNN9yglpYWv3cFAEhjvl8J4Y033uhwe8WKFRo0aJB27typ7373u37vDgCQppxfiqe5uVmSlJ+ff8r74/G44vF46nYsFnM9EgCgD3B6EkIymdScOXM0btw4jRgx4pTb1NbWKhKJpJaSkhKXIwEA+ginBVRVVaXdu3frxRdf7HSbBQsWqLm5ObU0NDS4HAkA0Ec4ewtu5syZWrt2rTZt2qTBgwd3ul04HFY47O5qrwCAvsn3AvI8T/fee69Wr16tt99+W2VlZX7vAgDQD/heQFVVVVq1apVeffVV5ebmqrGxUZIUiUSUk5Pj9+4AAGnK978BLV26VM3NzRo/fryKi4tTy0svveT3rgAAaczJW3AAAHSFa8EBAExQQAAAExQQAMAEBQQAMOH8WnB9jdfebj3CmQk4/F0hI+AuW1IgGHQX3tbmLNrpCTUuH/Nkej5XXD5PAuc4/hcQl8/xpLvnYbxkoJPc9vZW6d+73o4jIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYCJkPQC6yUu6y066/T0kEHb4NMvJdhYdcJYsqb3dWXQgM9NZtpd3rrPs9gJ32Z9MHOAsW5JK34g5yw5+7jD7KzfPQ6+bz2+OgAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGDCeQE99thjCgQCmjNnjutdAQDSiNMC2r59u5555hldfvnlLncDAEhDzgro6NGjmjZtmp599lkNHDjQ1W4AAGnKWQFVVVVp8uTJKi8vd7ULAEAac3KRrhdffFH19fXavn17l9vG43HF4/HU7VjM3XWPAAB9h+9HQA0NDZo9e7aef/55ZWd3faHI2tpaRSKR1FJSUuL3SACAPsj3Atq5c6eampp01VVXKRQKKRQKaePGjVq8eLFCoZASiUSH7RcsWKDm5ubU0tDQ4PdIAIA+yPe34CZOnKgPP/yww7oZM2Zo2LBhmjdvnoLBYIf7wuGwwuGw32MAAPo43wsoNzdXI0aM6LBuwIABKigoOGk9AODbiyshAABM9Monor799tu9sRsAQBrhCAgAYIICAgCYoIAAACYoIACACQoIAGCiV86COyMZGV8vkCR5Sc9ZdjAvx1m2JMnhPxoHcrq+3NOZhwecRXs57h6TrwbnOcuOn+fuR0Yy2PU2Zyr6f1rdhUvK+LLFXXhrvOttzlDmoX85yQ0kuzczP+EBACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAICJkPUAnfK8rxdIkgKZDr9VIcdPg/PynEUfG3Kes+yMdnfPv+CxdmfZOXsOO8sORwY4yw60J91lfxV3li1Jak84i/YSDh+XpKPneDdzOQICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACScF9Omnn+rOO+9UQUGBcnJyNHLkSO3YscPFrgAAacr3/0D84osvNG7cOE2YMEGvv/66LrjgAu3bt08DBw70e1cAgDTmewEtWrRIJSUleu6551LrysrK/N4NACDN+f4W3GuvvabRo0fr1ltv1aBBg3TllVfq2Wef7XT7eDyuWCzWYQEA9H++F9BHH32kpUuXaujQoXrzzTf1k5/8RLNmzdLKlStPuX1tba0ikUhqKSkp8XskAEAfFPA8f6/4mZWVpdGjR+u9995LrZs1a5a2b9+uzZs3n7R9PB5XPP6fFwqMxWIqKSnRxPz/oVBGlp+jSZKSzWl6hBUMOovOyD3XWbYkqcDd3/++4mKkJ8k89C9n2UkuRnpqLi9G2upu9kB22EluezKuP3+yVM3NzcrL6/xixL4fARUXF+uyyy7rsO7SSy/Vxx9/fMrtw+Gw8vLyOiwAgP7P9wIaN26c9uzZ02Hd3r17ddFFF/m9KwBAGvO9gO677z5t2bJFjz76qPbv369Vq1Zp+fLlqqqq8ntXAIA05nsBXXPNNVq9erVeeOEFjRgxQg899JDq6uo0bdo0v3cFAEhjTj4K88Ybb9SNN97oIhoA0E9wLTgAgAkKCABgggICAJiggAAAJpychOALz5OS/v8nuucgszdkhALOsgNhN/8NfcI/rznfWXb+ts+cZesLd1fNSH7Z7Cy7ve24s+yMAe6uhOD0lXnOOS7TFQi5u1KJ2t1dNUNy+9rvCkdAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADARMh6gM4EIrkKZIT9zz12zPfMVHYg4C472//H4oS2iy5wli1JiSx3j0vzqPOdZefuz3aW7fJ56CUSzrKTX7U6y5aXdBYdzMpyli1JyVaHj0vS3eMSSOa4Ce7mzBwBAQBMUEAAABMUEADABAUEADBBAQEATFBAAAATFBAAwITvBZRIJFRTU6OysjLl5OTo4osv1kMPPSTP8/zeFQAgjfn+j6iLFi3S0qVLtXLlSg0fPlw7duzQjBkzFIlENGvWLL93BwBIU74X0Hvvvaebb75ZkydPliQNGTJEL7zwgrZt2+b3rgAAacz3t+Cuu+46rV+/Xnv37pUkffDBB3r33XdVUVFxyu3j8bhisViHBQDQ//l+BDR//nzFYjENGzZMwWBQiURCjzzyiKZNm3bK7Wtra/XrX//a7zEAAH2c70dAL7/8sp5//nmtWrVK9fX1WrlypX77299q5cqVp9x+wYIFam5uTi0NDQ1+jwQA6IN8PwKaO3eu5s+fr9tvv12SNHLkSB08eFC1tbWqrKw8aftwOKxw2N2VngEAfZPvR0DHjh1TRkbH2GAwqKTDS4oDANKP70dAU6ZM0SOPPKLS0lINHz5c77//vp544gndfffdfu8KAJDGfC+gp556SjU1NfrpT3+qpqYmRaNR/fjHP9bChQv93hUAII35XkC5ubmqq6tTXV2d39EAgH6Ea8EBAExQQAAAExQQAMAEBQQAMOH7SQh+aZxYrGBWtu+5xW/6HpmSzM1xlv3RLQOdZQcSAWfZkpT/N3f/AxZsc/cxH43/PeIsO3T15c6yC//3AWfZiX994SzbO37cWXai2e01JjOyMp1lB3JznWXL1f9nJrv3uuQICABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmAhZD9CZd+b9L+Xl+t+PY1p/4nvmCUmHj2awNeAs+/wP251lS1LrwKCz7M+udJe9t/LfnGV/kTjmLHti5v3OsovfCDvLTjZ97iw7EHT3PJGkQMFAZ9mJ8/OcZQc/a3YTnPS6tRlHQAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADDR4wLatGmTpkyZomg0qkAgoDVr1nS43/M8LVy4UMXFxcrJyVF5ebn27dvn17wAgH6ixwXU0tKiUaNGacmSJae8//HHH9fixYu1bNkybd26VQMGDNCkSZPU2tp61sMCAPqPHv/vfkVFhSoqKk55n+d5qqur0y9/+UvdfPPNkqQ//vGPKiws1Jo1a3T77bef3bQAgH7D178BHThwQI2NjSovL0+ti0QiGjt2rDZv3nzKr4nH44rFYh0WAED/52sBNTY2SpIKCws7rC8sLEzd9021tbWKRCKppaSkxM+RAAB9lPlZcAsWLFBzc3NqaWhosB4JANALfC2goqIiSdLhw4c7rD98+HDqvm8Kh8PKy8vrsAAA+j9fC6isrExFRUVav359al0sFtPWrVt17bXX+rkrAECa6/FZcEePHtX+/ftTtw8cOKBdu3YpPz9fpaWlmjNnjh5++GENHTpUZWVlqqmpUTQa1dSpU/2cGwCQ5npcQDt27NCECRNSt6urqyVJlZWVWrFihX72s5+ppaVFP/rRj/Tll1/q+uuv1xtvvKHs7Gz/pgYApL0eF9D48ePleZ1/2l0gENCDDz6oBx988KwGAwD0b+ZnwQEAvp0oIACACQoIAGCCAgIAmOjxSQi95Wf/cZWyjmT6nhtI+h6ZkveP486yL9jxlbPs9nOznGVLUqgl6Cw753N3v0P9t8x7nGVnxtzNPaCt85OEzlbD9y90ll3ycsJZdjJyrrNsSfpqcK6z7MyYu58rGee4OTvZSwS6t38newcAoAsUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMBEyHqAzrz1+lUKhrN9zx380THfM1OCAXfZ7Uln0ZmHY86yJenIyAucZQcSnrPsxLkOH/OYu9/9gsedRat0ygFn2S27L3SWndHm7nkiSfFI0Fl2ZrOzaHMcAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMBEjwto06ZNmjJliqLRqAKBgNasWZO6r62tTfPmzdPIkSM1YMAARaNR3XXXXTp06JCfMwMA+oEeF1BLS4tGjRqlJUuWnHTfsWPHVF9fr5qaGtXX1+uVV17Rnj17dNNNN/kyLACg/+jxlRAqKipUUVFxyvsikYjWrVvXYd3TTz+tMWPG6OOPP1ZpaemZTQkA6HecX4qnublZgUBA55133invj8fjisfjqduxmNvLwgAA+ganJyG0trZq3rx5uuOOO5SXl3fKbWpraxWJRFJLSUmJy5EAAH2EswJqa2vTbbfdJs/ztHTp0k63W7BggZqbm1NLQ0ODq5EAAH2Ik7fgTpTPwYMH9dZbb3V69CNJ4XBY4XDYxRgAgD7M9wI6UT779u3Thg0bVFBQ4PcuAAD9QI8L6OjRo9q/f3/q9oEDB7Rr1y7l5+eruLhYt9xyi+rr67V27VolEgk1NjZKkvLz85WVleXf5ACAtNbjAtqxY4cmTJiQul1dXS1Jqqys1K9+9Su99tprkqQrrriiw9dt2LBB48ePP/NJAQD9So8LaPz48fK8zj9d8HT3AQBwAteCAwCYoIAAACYoIACACQoIAGCCAgIAmHB+MdIzVbruiELBNt9zA//3333PPMFra3eWHcg711m2Egl32ZLyNh9zlu2dl+ss+9K/JZ1l6wt3F90NhILOshP15znLPudzd5fh8vIjzrIlyQt1frWXsxWKtTrLlquzlruZyxEQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATFBAAAATFBAAwAQFBAAwEbIeoDPBT/+pYEaW77mJ48d9zzzBSyScZSf++S9n2c592ewu+z8a3WU7FAi5e+m5fB4GPnf3PPRysp1lBwIBZ9mSFIrkuAs/3uYuOyvTTa7XvWMbjoAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgIkeF9CmTZs0ZcoURaNRBQIBrVmzptNt77nnHgUCAdXV1Z3FiACA/qjHBdTS0qJRo0ZpyZIlp91u9erV2rJli6LR6BkPBwDov3r833AVFRWqqKg47Taffvqp7r33Xr355puaPHnyGQ8HAOi/fP8bUDKZ1PTp0zV37lwNHz7c73gAQD/h+/VAFi1apFAopFmzZnVr+3g8rng8nrodi8X8HgkA0Af5egS0c+dOPfnkk1qxYkW3r71UW1urSCSSWkpKSvwcCQDQR/laQO+8846amppUWlqqUCikUCikgwcP6v7779eQIUNO+TULFixQc3NzamloaPBzJABAH+XrW3DTp09XeXl5h3WTJk3S9OnTNWPGjFN+TTgcVjgc9nMMAEAa6HEBHT16VPv370/dPnDggHbt2qX8/HyVlpaqoKCgw/aZmZkqKirSJZdccvbTAgD6jR4X0I4dOzRhwoTU7erqaklSZWWlVqxY4dtgAID+rccFNH78eHme1+3t//GPf/R0FwCAbwGuBQcAMEEBAQBMUEAAABMUEADABAUEADDh+7Xg/JK4sECBYLbvucEc/zNPiJfmO8v2Mrp3aaMzkch2+3tIzsdHnGVnfOku22s55izbJe+rr5xlB7KynGUnL3Z3Ga7jF+Q4y5ak0JE2Z9nJc93NnsxxUwHt7d3bjiMgAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgAkKCABgggICAJiggAAAJiggAIAJCggAYIICAgCYoIAAACYoIACACQoIAGCCAgIAmKCAAAAmKCAAgImQ9QDf5HmeJKk9EXeTn3STK0nt7a3Osr2MgLPsRJvb30NcfS8lKcPh99PzjjvLdsnl3AHPWbSSDp8n7e3uXj9f76DNWXRGIuEsO9ne7iS3vf3r7+WJn+edCXhdbdHLPvnkE5WUlFiPAQA4Sw0NDRo8eHCn9/e5Akomkzp06JByc3MVCHT9W0ssFlNJSYkaGhqUl5fXCxP6g7l7V7rOLaXv7Mzdu/rS3J7n6ciRI4pGo8rI6Pwdlj73FlxGRsZpG7MzeXl55g/6mWDu3pWuc0vpOztz966+MnckEulyG05CAACYoIAAACbSvoDC4bAeeOABhcNh61F6hLl7V7rOLaXv7Mzdu9Jx7j53EgIA4Nsh7Y+AAADpiQICAJiggAAAJiggAICJtC6gJUuWaMiQIcrOztbYsWO1bds265G6VFtbq2uuuUa5ubkaNGiQpk6dqj179liP1WOPPfaYAoGA5syZYz1Klz799FPdeeedKigoUE5OjkaOHKkdO3ZYj3VaiURCNTU1KisrU05Oji6++GI99NBDXV5by8KmTZs0ZcoURaNRBQIBrVmzpsP9nudp4cKFKi4uVk5OjsrLy7Vv3z6bYf+L083d1tamefPmaeTIkRowYICi0ajuuusuHTp0yG7g/6+rx/u/uueeexQIBFRXV9dr8/VE2hbQSy+9pOrqaj3wwAOqr6/XqFGjNGnSJDU1NVmPdlobN25UVVWVtmzZonXr1qmtrU033HCDWlparEfrtu3bt+uZZ57R5Zdfbj1Kl7744guNGzdOmZmZev311/XXv/5Vv/vd7zRw4EDr0U5r0aJFWrp0qZ5++mn97W9/06JFi/T444/rqaeesh7tJC0tLRo1apSWLFlyyvsff/xxLV68WMuWLdPWrVs1YMAATZo0Sa2t7i7e2x2nm/vYsWOqr69XTU2N6uvr9corr2jPnj266aabDCbtqKvH+4TVq1dry5YtikajvTTZGfDS1JgxY7yqqqrU7UQi4UWjUa+2ttZwqp5ramryJHkbN260HqVbjhw54g0dOtRbt26d973vfc+bPXu29UinNW/ePO/666+3HqPHJk+e7N19990d1n3/+9/3pk2bZjRR90jyVq9enbqdTCa9oqIi7ze/+U1q3ZdffumFw2HvhRdeMJjw1L4596ls27bNk+QdPHiwd4bqhs7m/uSTT7wLL7zQ2717t3fRRRd5v//973t9tu5IyyOg48ePa+fOnSovL0+ty8jIUHl5uTZv3mw4Wc81NzdLkvLz840n6Z6qqipNnjy5w2Pfl7322msaPXq0br31Vg0aNEhXXnmlnn32WeuxunTddddp/fr12rt3ryTpgw8+0LvvvquKigrjyXrmwIEDamxs7PB8iUQiGjt2bFq+VgOBgM477zzrUU4rmUxq+vTpmjt3roYPH249zmn1uYuRdsfnn3+uRCKhwsLCDusLCwv197//3Wiqnksmk5ozZ47GjRunESNGWI/TpRdffFH19fXavn279Sjd9tFHH2np0qWqrq7Wz3/+c23fvl2zZs1SVlaWKisrrcfr1Pz58xWLxTRs2DAFg0ElEgk98sgjmjZtmvVoPdLY2ChJp3ytnrgvHbS2tmrevHm64447+sSFPk9n0aJFCoVCmjVrlvUoXUrLAuovqqqqtHv3br377rvWo3SpoaFBs2fP1rp165SdnW09Trclk0mNHj1ajz76qCTpyiuv1O7du7Vs2bI+XUAvv/yynn/+ea1atUrDhw/Xrl27NGfOHEWj0T49d3/U1tam2267TZ7naenSpdbjnNbOnTv15JNPqr6+vlsfZ2MtLd+CO//88xUMBnX48OEO6w8fPqyioiKjqXpm5syZWrt2rTZs2HBGHz/R23bu3KmmpiZdddVVCoVCCoVC2rhxoxYvXqxQKKSEw09tPBvFxcW67LLLOqy79NJL9fHHHxtN1D1z587V/Pnzdfvtt2vkyJGaPn267rvvPtXW1lqP1iMnXo/p+lo9UT4HDx7UunXr+vzRzzvvvKOmpiaVlpamXqcHDx7U/fffryFDhliPd5K0LKCsrCxdffXVWr9+fWpdMpnU+vXrde211xpO1jXP8zRz5kytXr1ab731lsrKyqxH6paJEyfqww8/1K5du1LL6NGjNW3aNO3atUvBYNB6xFMaN27cSae57927VxdddJHRRN1z7Nixkz7IKxgMKplMGk10ZsrKylRUVNThtRqLxbR169Y+/1o9UT779u3Tn//8ZxUUFFiP1KXp06frL3/5S4fXaTQa1dy5c/Xmm29aj3eStH0Lrrq6WpWVlRo9erTGjBmjuro6tbS0aMaMGdajnVZVVZVWrVqlV199Vbm5uan3wSORiHJycoyn61xubu5Jf6caMGCACgoK+vTfr+677z5dd911evTRR3Xbbbdp27ZtWr58uZYvX2492mlNmTJFjzzyiEpLSzV8+HC9//77euKJJ3T33Xdbj3aSo0ePav/+/anbBw4c0K5du5Sfn6/S0lLNmTNHDz/8sIYOHaqysjLV1NQoGo1q6tSpdkPr9HMXFxfrlltuUX19vdauXatEIpF6rebn5ysrK8tq7C4f728WZWZmpoqKinTJJZf09qhdsz4N72w89dRTXmlpqZeVleWNGTPG27Jli/VIXZJ0yuW5556zHq3H0uE0bM/zvD/96U/eiBEjvHA47A0bNsxbvny59UhdisVi3uzZs73S0lIvOzvb+853vuP94he/8OLxuPVoJ9mwYcMpn9OVlZWe5319KnZNTY1XWFjohcNhb+LEid6ePXtsh/ZOP/eBAwc6fa1u2LChz859Kn35NGw+jgEAYCIt/wYEAEh/FBAAwAQFBAAwQQEBAExQQAAAExQQAMAEBQQAMEEBAQBMUEAAABMUEADABAUEADBBAQEATPw/xF4qV84d/Q0AAAAASUVORK5CYII=",
+ "text/plain": [
+ "