{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"provenance": [],
"authorship_tag": "ABX9TyOLSl8Lc1IogC23tATXokEf",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"language_info": {
"name": "python"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"
"
]
},
{
"cell_type": "code",
"source": [
"import numpy as N\n",
"import pylab as P\n",
"\n",
"def _blob(x,y,area,colour):\n",
" \"\"\"\n",
" Draws a square-shaped blob with the given area (< 1) at\n",
" the given coordinates.\n",
" \"\"\"\n",
" hs = N.sqrt(area) / 2\n",
" xcorners = N.array([x - hs, x + hs, x + hs, x - hs])\n",
" ycorners = N.array([y - hs, y - hs, y + hs, y + hs])\n",
" P.fill(xcorners, ycorners, colour, edgecolor=colour)\n",
"\n",
"def hinton(W, maxWeight=None):\n",
" \"\"\"\n",
" Draws a Hinton diagram for visualizing a weight matrix.\n",
" Temporarily disables matplotlib interactive mode if it is on,\n",
" otherwise this takes forever.\n",
" \"\"\"\n",
" reenable = False\n",
" if P.isinteractive():\n",
" P.ioff()\n",
" P.clf()\n",
" height, width = W.shape\n",
" if not maxWeight:\n",
" maxWeight = 2**N.ceil(N.log(N.max(N.abs(W)))/N.log(2))\n",
"\n",
" P.fill(N.array([0,width,width,0]),N.array([0,0,height,height]),'gray')\n",
" P.axis('off')\n",
" P.axis('equal')\n",
" for x in range(width):\n",
" for y in range(height):\n",
" _x = x+1\n",
" _y = y+1\n",
" w = W[y,x]\n",
" if w > 0:\n",
" _blob(_x - 0.5, height - _y + 0.5, min(1,w/maxWeight),'white')\n",
" elif w < 0:\n",
" _blob(_x - 0.5, height - _y + 0.5, min(1,-w/maxWeight),'black')\n",
" if reenable:\n",
" P.ion()\n",
" P.show()"
],
"metadata": {
"id": "FddTV2bAxCtx"
},
"execution_count": 28,
"outputs": []
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "qDfGWH9TpL_e",
"outputId": "876719e5-20cf-4be3-b288-e3fb6552c7c3"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[[0.001 0. 0. 0.001]\n",
" [0. 0.001 0. 0. ]\n",
" [0. 0. 0.001 0. ]]\n"
]
}
],
"source": [
"# Hebb's rule\n",
"\n",
"import numpy as np\n",
"\n",
"x = np.array([[1, 0, 0, 1],\n",
" [0, 1, 0, 0],\n",
" [0, 0, 1, 0]])\n",
"\n",
"\n",
"y = np.array([[1, 0, 0],\n",
" [0, 1, 0],\n",
" [0, 0, 1]])\n",
"\n",
"\n",
"N_pattern = x.shape[0]\n",
"\n",
"n_input = x.shape[1]\n",
"\n",
"n_output = y.shape[1]\n",
"\n",
"learning_rate = 0.001\n",
"\n",
"W = np.zeros((n_output, n_input))\n",
"\n",
"\n",
"for k in range(N_pattern):\n",
" for j in range(n_output):\n",
" for i in range(n_input):\n",
" W[j, i] += learning_rate * x[k,i] * y[k,j]\n",
"\n",
"\n",
"print(W)\n",
"\n"
]
},
{
"cell_type": "code",
"source": [
"y_test = W @ x.T\n",
"\n",
"print(y_test.T)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "faf-XsHQvkSg",
"outputId": "0d1cbb72-4e65-4386-83fb-09959747b25c"
},
"execution_count": 22,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"[[0.002 0. 0. ]\n",
" [0. 0.001 0. ]\n",
" [0. 0. 0.001]]\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"hinton(W)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 406
},
"id": "O4xFw8pxxEtC",
"outputId": "ba7c5342-293e-497d-b752-17d2cbd1bdbc"
},
"execution_count": 29,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGFCAYAAABg2vAPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAH10lEQVR4nO3dsY3sNgBFUdpYJQpU6fbw8XtQpQyYKFgH7uCPAVq45zQwD1iBc1cM5q+fn5+fAQBk/b17AACwlxgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACDua/eAMcb4/fv37gkAsM2vX7+2fr43AwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADi/hc/Yfyp67rGeZ67Z7zWWmvMOXfPADZyjn7m7efo62Pguq7x/f09juPYPeW1nucZ932/+kEG/pxz9HNvP0dff01wnqcH+EPHcfiPAMKco597+zn6+hgAAD4jBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEvT4G1lrjeZ7dM17teZ6x1to9A9jEOfq5t5+jX7sHfGrOOe77Hud57p7yWmutMefcPQPYxDn6ubefo6+PgTH+fZDf/EcA2M052vb6awIA4DNiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIj72j0Arusa53nunvFqa60x59w9A3gpMcBW13WN7+/vcRzH7imv9jzPuO9bEAB/xDUBW53nKQT+A8dxeLsC/DExAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBhgq7XWeJ5n94zXe55nrLV2zwBe6mv3ANrmnOO+73Ge5+4pr7bWGnPO3TOAlxIDbDfn9EUGsJFrAgCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABA3NfuAcD7Xdc1zvPcPePV1lpjzrl7BlFiAPjIdV3j+/t7HMexe8qrPc8z7vsWBGzhmgD4yHmeQuA/cByHtytsIwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkB4CNrrfE8z+4Zr/c8z1hr7Z5B1NfuAcC7zTnHfd/jPM/dU15trTXmnLtnECUGgI/NOX2RwYu5JgCAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIj76+fn52f3CABgH28GACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACDuHwUpumsnTxFPAAAAAElFTkSuQmCC\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"hinton(y_test)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 406
},
"id": "dMOUho2Vxxfx",
"outputId": "6d67b628-3126-4963-e131-f9e45a6f825a"
},
"execution_count": 30,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGFCAYAAABg2vAPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAHwklEQVR4nO3dsY3kRhRF0ZIwdGgw0s5hsTkw0jLKoTFy1hEkQYamxe6550TwPF7UN/jb5+fn5wAAsn6/ewAAcC8xAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgLiPuwdU/Pz58+4JAG/px48fd0/49rwMAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIjzC+M3cRzH2Pf97hlva6015px3zwB4SWLgDRzHMR6Px9i27e4pb+u6rnGepyAA+BvOBG9g33ch8B9t2+ZlBeAfiAEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWLgDay1xnVdd894a9d1jbXW3TMAXtLH3QP4d3POcZ7n2Pf97ilva6015px3zwB4SWLgTcw5fcwAeApnAgCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMR93D0A+KvjOMa+73fPeJq11phz3j0D+EUMwIs5jmM8Ho+xbdvdU57muq5xnqcggBfhTAAvZt/3bx0CY4yxbdu3fvmAdyMGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwPwYtZa47quu2c81XVdY6119wzgl4+7BwB/Nucc53mOfd/vnvI0a60x57x7BvCLGIAXNOf0sQT+N84EABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQNzH3QMAvpvjOMa+73fPeJq11phz3j2DLyQGAL7QcRzj8XiMbdvunvI013WN8zwFwTfiTADwhfZ9/9YhMMYY27Z965ePIjEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGAD4QmutcV3X3TOe6rqusda6ewZf6OPuAQDfyZxznOc59n2/e8rTrLXGnPPuGXwhMQDwxeacPpa8FWcCAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxP32+fn5efcIAOA+XgYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAEDcH+Nij1cxnhxsAAAAAElFTkSuQmCC\n"
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"# Hebbian learning\n",
"\n",
"class Hebb:\n",
" def __init__(self, x, y):\n",
" self.n_input = x.shape[1]\n",
" self.n_output = y.shape[1]\n",
" self.W = np.zeros((self.n_output, self.n_input))\n",
"\n",
" def fit(self, x, y, lr):\n",
"\n",
" N_pattern = x.shape[0]\n",
"\n",
" for k in range(N_pattern):\n",
" for j in range(self.n_output):\n",
" for i in range(self.n_input):\n",
" self.W[j, i] += lr * x[k,i] * y[k,j]\n",
"\n",
" def pred(self, x):\n",
" return self.W @ x.T\n",
"\n"
],
"metadata": {
"id": "Bg91mXemyJQV"
},
"execution_count": 37,
"outputs": []
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "Wz-cXdeH28we"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [],
"metadata": {
"id": "Go-z9m8xyF9o"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"import numpy as np\n",
"\n",
"x = np.array([[1, 0, 0, 1],\n",
" [0, 1, 0, 0],\n",
" [0, 0, 1, 0]])\n",
"\n",
"\n",
"y = np.array([[1, 0, 0],\n",
" [0, 1, 0],\n",
" [0, 0, 1]])\n",
"\n",
"\n",
"model = Hebb(x,y)\n",
"\n",
"model.fit(x, y, 0.001)\n",
"\n",
"test = model.pred(x)\n",
"\n",
"hinton(test)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 406
},
"id": "UOeXn4Sh0Ngp",
"outputId": "618f06de-70b1-469a-9c04-9b246fd705e4"
},
"execution_count": 38,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
""
],
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAgMAAAGFCAYAAABg2vAPAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAHwklEQVR4nO3dsY3kRhRF0ZIwdGgw0s5hsTkw0jLKoTFy1hEkQYamxe6550TwPF7UN/jb5+fn5wAAsn6/ewAAcC8xAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgLiPuwdU/Pz58+4JAG/px48fd0/49rwMAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIjzC+M3cRzH2Pf97hlva6015px3zwB4SWLgDRzHMR6Px9i27e4pb+u6rnGepyAA+BvOBG9g33ch8B9t2+ZlBeAfiAEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWLgDay1xnVdd894a9d1jbXW3TMAXtLH3QP4d3POcZ7n2Pf97ilva6015px3zwB4SWLgTcw5fcwAeApnAgCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMR93D0A+KvjOMa+73fPeJq11phz3j0D+EUMwIs5jmM8Ho+xbdvdU57muq5xnqcggBfhTAAvZt/3bx0CY4yxbdu3fvmAdyMGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwMAECcGACBODABAnBgAgDgxAABxYgAA4sQAAMSJAQCIEwPwYtZa47quu2c81XVdY6119wzgl4+7BwB/Nucc53mOfd/vnvI0a60x57x7BvCLGIAXNOf0sQT+N84EABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQJwYAIA4MQAAcWIAAOLEAADEiQEAiBMDABAnBgAgTgwAQNzH3QMAvpvjOMa+73fPeJq11phz3j2DLyQGAL7QcRzj8XiMbdvunvI013WN8zwFwTfiTADwhfZ9/9YhMMYY27Z965ePIjEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGAD4QmutcV3X3TOe6rqusda6ewZf6OPuAQDfyZxznOc59n2/e8rTrLXGnPPuGXwhMQDwxeacPpa8FWcCAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxP32+fn5efcIAOA+XgYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAECcGACAODEAAHFiAADixAAAxIkBAIgTAwAQJwYAIE4MAEDcH+Nij1cxnhxsAAAAAElFTkSuQmCC\n"
},
"metadata": {}
}
]
}
]
}