{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Ising Model\n",
"\n",
"\n",
"Below we sketch algorithm for the two dimensional Ising model\n",
"\\begin{equation}\n",
"H = -\\frac{1}{2}\\sum_{ij} J_{ij} S_i S_j.\n",
"\\end{equation}\n",
"We will take $J_{ij}=1$ for the nearest neighbors and $0$\n",
"otherwise. $S_i$ can take the values $\\pm 1$.\n",
"\n",
"On an $L\\times L$ lattice, we can choose\n",
"$$\\omega_{XX'}=1/L^2 $$ if $X$ and $X'$ differ by one spin flip, and\n",
"$\\omega_{XX'}=0$ otherwise. This can be realized by selecting a spin\n",
"at random and try to flip it.\n",
"\n",
"The energy diference $\\Delta E = E(X')-E(X)$ in this case is cheap to\n",
"calculate because it depends only on the nearest neighbour bonds. If\n",
"$\\Delta E <0$ the trial state is accepted and if $\\Delta E>0$, the\n",
"trial step is accepted with probability $\\exp(-\\beta \\Delta E)$. \n",
"\n",
"\n",
"Keep in mind\n",
"- One can keep track of total energy and total magnetization at\n",
" every step. The total energy and magnetization needs to be computed\n",
" from the scratch only at the beginning. After that they can be\n",
" updated (add difference due to spin flip).\n",
"- the quantity $\\exp(-\\beta\\Delta E)$ takes only 5 different values\n",
" at fixed temperature. It is advisable to store those five numbers\n",
" and not recompute them at every step.\n",
"- Simulation can be started with random configuration\n",
" corresponding to infinite temperature. The temperature can be slowly\n",
" decreased through transition which is around $\\beta J\\approx 0.44$.\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Algorithm\n",
"\n",
"- Choose temperature $T$ and precompute the exponents $[\\exp(-8J/T),\\exp(-4J/T),1,\\exp(4J/T),\\exp(8J/T)]$.\n",
"\n",
"- Generate a random configuration $X_0$ (this is equivalent to infinite temperature).\n",
"\n",
"- Compute the energy and magnetization of the configuration $X_0$.\n",
" \n",
"- Iterate the following steps many times\n",
" \n",
" - Select randomly a spin and compute the Weiss-field felt by\n",
" that spin, i.e., $W_i = \\sum_{j\\; neighbor\\; i} J_{ij} S_j$.\n",
" The energy cost to flip the spin is $\\Delta E = 2 S_i W_i$. Use\n",
" the precomputed exponents to evaluate acceptance probability\n",
" $P = min(1,\\exp(-\\Delta E/T))$.\n",
" - Accept the trial step with probability $P$. If accepted,\n",
" update spin lattice configuration, update the current energy ($E = E\n",
" + \\Delta E$), and the current magnetization $M = M - 2 S_i$.\n",
" - Ones the Markow chain equilibrates, meassure the total\n",
" energy and magnetization (also $E^2$, and $M^2$) every few Monte Carlo\n",
" steps. {\\textit{\\textbf{Be carefull:} Do not meassure only the\n",
" accepted steps. Every step counts. Meassure outside the\n",
" acceptance loop. }}\n",
" \n",
"- Print the following quantities:\n",
" - $\\langle E\\rangle$, $\\langle M\\rangle$\n",
" - $c_V = (\\langle E^2\\rangle -\\langle E\\rangle^2)/T^2$\n",
" - $\\chi = (\\langle M^2\\rangle -\\langle M\\rangle^2)/T$\n",
"\n",
"\n",
"The relation for specific heat can be derived from the following\n",
"identity\n",
"\\begin{equation}\n",
"C_v = \\frac{\\partial \\langle E\\rangle}{\\partial T} =\n",
"\\frac{\\partial}{\\partial T}\\left( \\frac{\\textrm{Tr}(e^{-E/T}E)}{\\textrm{Tr}(e^{-E/T})} \\right)\n",
"\\end{equation}\n",
"and similar equation exists for $\\chi$.\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Simulation of the Ising model"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"from numba import jit\n",
"from numpy import *\n",
"from numpy import random\n",
"\n",
"N = 20 # size of the Ising system N x N\n",
"\n",
"@jit(nopython=True)\n",
"def CEnergy(latt):\n",
" \"Energy of a 2D Ising lattice at particular configuration\"\n",
" Ene = 0\n",
" N = len(latt)\n",
" for i in range(N):\n",
" for j in range(N):\n",
" S = latt[i,j]\n",
" # right above left below\n",
" WF = latt[(i+1)%N, j] + latt[i,(j+1)%N] + latt[(i-1)%N,j] + latt[i,(j-1)%N]\n",
" Ene += -WF*S # Each neighbor gives energy -J==-1\n",
" return Ene/2. # Each pair counted twice\n",
"\n",
"\n",
"def RandomL(N):\n",
" \"Radom lattice, corresponding to infinite temerature\"\n",
" #random.randint\n",
" return array(sign(2*random.random((N,N))-1),dtype=int)\n",
"\n",
"def Exponents(T):\n",
" PW = zeros(9, dtype=float)\n",
" # Precomputed exponents : PW[4+x]=exp(-x*2/T)\n",
" PW[4+4] = exp(-4.*2/T)\n",
" PW[4+2] = exp(-2.*2/T)\n",
" PW[4+0] = 1.0\n",
" PW[4-2] = exp( 2.*2/T)\n",
" PW[4-4] = exp( 4.*2/T)\n",
" return PW"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[[ 1 -1 -1 -1 -1 -1 1 1 1 1 1 -1 1 -1 1 -1 1 1 1 1]\n",
" [ 1 -1 1 1 1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 1 -1 1 1]\n",
" [-1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 -1 1 -1 1 -1 1 -1 1]\n",
" [-1 -1 1 1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 -1 -1 1 -1 -1]\n",
" [-1 1 1 -1 1 1 -1 1 -1 1 -1 -1 -1 1 -1 1 1 1 1 -1]\n",
" [ 1 1 1 -1 -1 1 1 -1 1 -1 1 1 1 -1 1 -1 -1 1 1 1]\n",
" [-1 -1 1 -1 -1 -1 -1 1 1 1 1 1 -1 1 1 -1 1 1 -1 -1]\n",
" [-1 -1 -1 1 -1 1 -1 -1 1 1 1 1 -1 -1 -1 1 -1 -1 -1 1]\n",
" [-1 -1 -1 -1 1 1 -1 -1 -1 -1 -1 1 1 1 1 -1 -1 1 -1 1]\n",
" [-1 -1 1 1 -1 1 -1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 1 -1]\n",
" [ 1 -1 1 1 -1 1 -1 1 1 -1 1 1 -1 -1 -1 1 -1 -1 -1 -1]\n",
" [ 1 -1 -1 -1 1 -1 1 -1 1 1 1 1 -1 -1 -1 1 1 -1 -1 -1]\n",
" [ 1 -1 1 1 1 -1 1 -1 1 -1 1 1 1 1 1 -1 1 -1 -1 1]\n",
" [ 1 -1 1 -1 -1 -1 -1 -1 1 1 1 -1 -1 -1 1 1 -1 -1 1 1]\n",
" [-1 -1 1 -1 1 -1 1 -1 1 1 -1 -1 -1 1 1 -1 -1 1 1 -1]\n",
" [ 1 -1 -1 1 1 1 1 -1 -1 -1 1 1 -1 1 -1 -1 -1 1 -1 1]\n",
" [ 1 1 1 -1 -1 -1 1 -1 -1 -1 1 1 1 1 -1 1 1 1 1 1]\n",
" [-1 1 1 -1 1 1 1 -1 1 1 1 1 -1 1 -1 1 1 -1 1 -1]\n",
" [ 1 1 -1 1 1 1 1 1 -1 1 1 1 1 -1 -1 1 -1 1 1 1]\n",
" [ 1 -1 1 1 -1 1 1 -1 -1 1 1 -1 1 1 -1 1 -1 -1 -1 1]]\n",
"Energy= -8.0\n",
"Exponents= [3.39803455e+01 0.00000000e+00 5.82926629e+00 0.00000000e+00\n",
" 1.00000000e+00 0.00000000e+00 1.71548176e-01 0.00000000e+00\n",
" 2.94287767e-02]\n"
]
}
],
"source": [
"latt = RandomL(N)\n",
"print(latt)\n",
"print('Energy=', CEnergy(latt))\n",
"T=2.269\n",
"PW = Exponents(T)\n",
"\n",
"print('Exponents=', PW)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [],
"source": [
"@jit(nopython=True)\n",
"def SamplePython(Nitt, latt, PW, warm, measure):\n",
" \"Monte Carlo sampling for the Ising model in Pythons\"\n",
" Ene = CEnergy(latt) # Starting energy\n",
" Mn = sum(latt) # Starting magnetization\n",
" N = len(latt)\n",
" n_accept = 0 # how often we accept\n",
" N1=0 # Measurements\n",
" E1,M1,E2,M2=0.0,0.0,0.0,0.0\n",
" \n",
" N2 = N*N\n",
" for itt in range(Nitt):\n",
" t1,t2 = random.rand(2) # one random number for random spin, the other for accepting the step with probability.\n",
" t = int(t1*N2)\n",
" (i,j) = (t % N, int(t/N))\n",
" S = latt[i,j]\n",
" WF = latt[(i+1)%N, j] + latt[i,(j+1)%N] + latt[(i-1)%N,j] + latt[i,(j-1)%N]\n",
" # new configuration -S, old configuration S => magnetization change -2*S\n",
" # energy change = (-J)*WF*(-S) - (-J)*WF*(S) = 2*J*WF*S\n",
" # We will prepare : PW[4+x]=exp(-x*2/T)\n",
" # P = exp(-2*WF*S/T) = exp(-(WF*S)*2/T) == PW[4+WF*S],\n",
" # because PW[4+x]=exp(-x*2/T)\n",
" P = PW[4+S*WF] # exp(-dE/T)\n",
" if P>t2: #random.rand(): # flip the spin\n",
" latt[i,j] = -S\n",
" Ene += 2*S*WF\n",
" Mn -= 2*S\n",
" n_accept += 1\n",
" \n",
" if itt>warm and itt%measure==0:\n",
" N1 += 1\n",
" E1 += Ene\n",
" M1 += Mn\n",
" E2 += Ene*Ene\n",
" M2 += Mn*Mn\n",
" \n",
" E,M, E2a, M2a = E1/N1, M1/N1, E2/N1, M2/N1 # , \n",
" cv = (E2a-E**2)/T**2 # cv =(-^2)/T^2\n",
" chi = (M2a-M**2)/T # chi=(-^2)/T\n",
" return (M/N2, E/N2, cv/N2, chi/N2, n_accept/Nitt)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"= 0.0008137585279641207 = -0.0036002430488528193 cv= 1.6069034702218936 chi= 70.65938686079888 p_accept= 0.1902246\n"
]
}
],
"source": [
"from numpy import random\n",
"\n",
"Nitt = 5000000 # total number of Monte Carlo steps\n",
"warm = 1000 # Number of warmup steps\n",
"measure=5 # How often to take a measurement\n",
"\n",
"\n",
"(M, E, cv, chi, p_accept) = SamplePython(Nitt, latt, PW, warm, measure)\n",
"print('=', M/(N*N), '=', E/(N*N) , 'cv=', cv, 'chi=',chi, 'p_accept=', p_accept)"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"T= 3.5000 M=-0.0018 E=-0.6596 cv= 0.5910 chi= 2.7307 p_accept= 0.5481\n",
"T= 3.3966 M= 0.0025 E=-0.6864 cv= 0.5970 chi= 2.9004 p_accept= 0.5323\n",
"T= 3.2931 M= 0.0070 E=-0.7172 cv= 0.6254 chi= 3.3216 p_accept= 0.5152\n",
"T= 3.1897 M= 0.0074 E=-0.7508 cv= 0.6493 chi= 3.8418 p_accept= 0.4966\n",
"T= 3.0862 M=-0.0015 E=-0.7855 cv= 0.6732 chi= 4.3061 p_accept= 0.4781\n",
"T= 2.9828 M=-0.0073 E=-0.8224 cv= 0.6893 chi= 5.4311 p_accept= 0.4580\n",
"T= 2.8793 M=-0.0034 E=-0.8692 cv= 0.7298 chi= 6.8063 p_accept= 0.4341\n",
"T= 2.7759 M=-0.0174 E=-0.9269 cv= 0.8122 chi= 8.4824 p_accept= 0.4066\n",
"T= 2.6724 M=-0.0333 E=-0.9819 cv= 0.8767 chi=11.4143 p_accept= 0.3791\n",
"T= 2.5690 M= 0.0659 E=-1.0650 cv= 1.0584 chi=19.0296 p_accept= 0.3420\n",
"T= 2.4655 M= 0.1172 E=-1.1532 cv= 1.2916 chi=28.2185 p_accept= 0.3032\n",
"T= 2.3621 M=-0.1289 E=-1.2784 cv= 1.6454 chi=50.3603 p_accept= 0.2524\n",
"T= 2.2586 M= 0.1942 E=-1.4665 cv= 1.5967 chi=89.8242 p_accept= 0.1803\n",
"T= 2.1552 M= 0.8302 E=-1.6086 cv= 1.0273 chi= 2.4898 p_accept= 0.1278\n",
"T= 2.0517 M= 0.8836 E=-1.6972 cv= 0.7395 chi= 0.9042 p_accept= 0.0960\n",
"T= 1.9483 M= 0.9278 E=-1.7829 cv= 0.4728 chi= 0.2107 p_accept= 0.0664\n",
"T= 1.8448 M= 0.9490 E=-1.8378 cv= 0.3305 chi= 0.1187 p_accept= 0.0482\n",
"T= 1.7414 M= 0.9652 E=-1.8836 cv= 0.2252 chi= 0.0640 p_accept= 0.0337\n",
"T= 1.6379 M= 0.9766 E=-1.9189 cv= 0.1504 chi= 0.0402 p_accept= 0.0230\n",
"T= 1.5345 M= 0.9842 E=-1.9436 cv= 0.1034 chi= 0.0227 p_accept= 0.0155\n",
"T= 1.4310 M= 0.9901 E=-1.9634 cv= 0.0624 chi= 0.0122 p_accept= 0.0098\n",
"T= 1.3276 M= 0.9941 E=-1.9779 cv= 0.0364 chi= 0.0064 p_accept= 0.0059\n",
"T= 1.2241 M= 0.9966 E=-1.9869 cv= 0.0217 chi= 0.0036 p_accept= 0.0034\n",
"T= 1.1207 M= 0.9982 E=-1.9931 cv= 0.0113 chi= 0.0018 p_accept= 0.0018\n",
"T= 1.0172 M= 0.9992 E=-1.9968 cv= 0.0052 chi= 0.0008 p_accept= 0.0008\n",
"T= 0.9138 M= 0.9997 E=-1.9987 cv= 0.0021 chi= 0.0003 p_accept= 0.0003\n",
"T= 0.8103 M= 0.9999 E=-1.9996 cv= 0.0006 chi= 0.0001 p_accept= 0.0001\n",
"T= 0.7069 M= 1.0000 E=-1.9999 cv= 0.0001 chi= 0.0000 p_accept= 0.0000\n",
"T= 0.6034 M= 1.0000 E=-2.0000 cv= 0.0000 chi= 0.0000 p_accept= 0.0000\n",
"T= 0.5000 M= 1.0000 E=-2.0000 cv= 0.0000 chi= 0.0000 p_accept= 0.0000\n"
]
}
],
"source": [
"from numpy import random\n",
"wT = linspace(3.5,0.5,30)\n",
"wMag=[]\n",
"wEne=[]\n",
"wCv=[]\n",
"wChi=[]\n",
"N=20\n",
"latt = RandomL(N)\n",
"Nitt = 5000000 # total number of Monte Carlo steps at each temperature\n",
"warm = 1000 # Number of warmup steps\n",
"measure=5 # How often to take a measurement\n",
"\n",
"for T in wT:\n",
" # Precomputed exponents : PW[4+x]=exp(-x*2/T)\n",
" PW = Exponents(T)\n",
" (M, E, cv, chi, p_accept) = SamplePython(Nitt, latt, PW, warm, measure)\n",
" wMag.append( M )\n",
" wEne.append( E )\n",
" wCv.append( cv )\n",
" wChi.append( chi )\n",
" print('T=%7.4f M=%7.4f E=%7.4f cv=%7.4f chi=%7.4f p_accept=%7.4f' % (T,M,E,cv,chi,p_accept))"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEGCAYAAABmXi5tAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAA110lEQVR4nO3dd3xUVd748c+Zkt4TQgJJSOgISAtNFIKNomJjFXZtoPK4rvvos65bdJ/HR93q6m91LY8Vu9hFrCuLIIjSe6QIAUkIJKSQXqac3x93EgIkJGRmMjOZ7/v1uq+55cw95+Ym33tz7rnnKK01Qgghuj+TrwsghBCia0jAF0KIICEBXwghgoQEfCGECBIS8IUQIkhYfF2A00lKStKZmZm+LoYQQgSMjRs3lmite7S2za8DfmZmJhs2bPB1MYQQImAopX5sa5tU6QghRJCQgC+EEEFCAr4QQgQJv67DF0KIjrLZbBQUFFBfX+/ronSJsLAw0tLSsFqtHf6OBHwhRLdQUFBAdHQ0mZmZKKV8XRyv0lpTWlpKQUEBWVlZHf6eVOkIIbqF+vp6EhMTu32wB1BKkZiYeMb/zUjAF0J0G8EQ7Jt05lgl4AsRyOyNcHANfPskVBzydWmEn5M6fCECicMGhZvhwCrYvwry14Kt1ti2fyX87B3flk/4NQn4Qvgzhw0KtxgB/sA3xt28rcbYlnwWjLoeMs+FI9th5cNG0M+a7NMiBzOz2czw4cObl+fMmcPvfvc7AGbPns3DDz/M3LlzaWhooKysjLq6Onr37g3A4sWLueWWW3j33XeJj4/3Svkk4Avhr3Z+DB/eBo3VxnKPITDyp5B1HvSZBJFJx9MOuAi2vAlL/wdu+QpMUlvrC+Hh4WzZsuWU9bm5uTgcDvr27cvatWsBePnll9mwYQNPPvlkc7rrr7+ep59+mvvuu88r5ZOAL4S/WvUoRCXDBU9Cn3MhqtX+sAzWcDj/D7D4Nsj9AIbP7rpy+qEHPs7l+8JKj+7zrF4x3H/Z0E5994033uDyyy9vN92sWbM477zzvBbw5TZACH9UlmfU1Y+5CYZeefpg3+Tsa6DncFj2INgbvF5Ecaq6ujpGjhzZPL399tsArF69mjFjxrT7/fj4eBoaGigtLfVK+Txyh6+UWghcChRrrYe1sj0H+AjY71r1gdb6QU/kLUS3lPuh8Tn0yo5/x2SGix6A16+C9S/CxNu9U7YA0Nk7cXe1VaVz+PBhevTowEUbSE5OprCwkMTERA+XznN3+C8D09tJs0prPdI1SbAX4nR2fAhpYyEu48y+1/8C6DvVeIBbd8wrRRNnLjw8vMMvSdXX1xMeHu6Vcngk4GutVwJlntiXEEGv5Aco2g5Dr+rc9y96wAj23/zDo8USnTdkyBD27t3bbjqtNUeOHMFbAz91ZR3+RKXUVqXU50qpNv/fUkotUEptUEptOHr0aBcWTwg/seMDQMHQKzr3/dQRcPa1sOb/4Fi+J0sm2nFyHX5Tk8xLLrmEFStWtPv9jRs3MmHCBCwW77SnUVprz+xIqUzgkzbq8GMAp9a6Wik1E3hcaz2gvX1mZ2drGfFKBJ2nxkN4Asz/vPP7OHYQnsiGYVfDlf/nubL5sZ07dzJkyBBfF6NVdXV1TJ06ldWrV2M2m9tMd+eddzJr1iwuuOCCDu23tWNWSm3UWme3lr5L7vC11pVa62rX/GeAVSmV1M7XhAg+Rd/D0V0wrJPVOU3iMmD8f8DWRcZLWcKnwsPDeeCBBzh06PTdXwwbNqzDwb4zuiTgK6VSlKunH6XUOFe+3ml3JEQgy/0AlAnOar/NdrvO+xWExRovYwmfmzZtGhkZp38If+utt3q1DB4J+EqpRcB3wCClVIFS6mal1G1KqdtcSWYDO5RSW4F/AnO0p+qShOgutDbq7zPPNV64cld4PEy+B/Z9BXuXub8/EfA88mRAaz23ne1PAk+eLo0QQe/INijbB+f80nP7HHcrrHsWlt5vNNeULheCmpx9IfzFjg9AmWHILM/t0xIKF9xvNPPcLj1pBjsJ+EL4A62N+vu+ORDp4Tcsh14FqSNh2UNgC47xXkXrJOAL4Q8ObTKaUrrbOqc1JhNc/BBUFhjVO8Jv3HXXXaxcuZIrr7ySkSNH0r9/f2JjY5vb8X/77bfMmTOHH374wSP5SW+ZQviD3A/AZIXBl3hn/1mTYcDFsPJRow/9iATv5CM6rKysjDVr1vDYY48xebIxhsGKFSt45JFH+OSTT5rT2Ww2Hn74YZ5//nm385SAL4SvOZ1GZ2n9LzBa1njLhQ/AM5OMbpen/cl7+fiDz3/n+fcPUobDjL+2m+zVV1/lkUceQSlF37592bx5M3l5eZhMJmpraxk0aBB5eXm89957TJ/eXhdkcN5553HTTTdht9vdfgNXqnSE8LWCdVB5qPN953RUz7Ng5M+MLhfyvvZuXkEqNzeXP/3pT3z11Vds3bqVF198kREjRvD118bP++OPP2batGlYrdYOd5lsMpno378/W7dudbt8cocvhK/t+ADMoTBohvfzmvZnKFgP79wAt34Fif28n6cvdOBO3Bu++uorZs+eTVKS0ZFAQkIC1157LW+//TZTp07lrbfe4vbbjW6rO9NlckcuEKcjd/hC+JLTAd8vNoYoDIvxfn5hMTD3LeNt3jevlS6UPUxrjatTgWazZs3i888/p6ysjI0bN3L++ecDvukyWQK+EL7047dQXeSd1jltSciCa16F8v3w3nxw2Lsu727uggsu4J133mkesaqsrIyoqCjGjRvHnXfeyaWXXtrceVpHu0wG2LNnD0OHuj+oiwR8IXwp9wOwRsDA9h/eeVTWeXDJo7BvGSz9767NuxsbOnQo9913H1OmTGHEiBH86le/AuDaa6/l9ddf59prr21O29Euk4uKiggPDyc1NdXt8nmse2RvkO6RRbfmsMOjg4zg+5OXfVOGz38La5+By/4JY270TRk8xJ+7R27LueeeyyeffEJcXFybaf7xj38QExPDzTfffMo2v+weWQjRigMrobbE+61zTufiP0G/8+HTu+HAat+VI0g9+uijHDx48LRp4uLiuPFGz1yMJeAL4Ss7PoCQKOOBra+YLTD7JYjvA29fB+UHfFeWIDR+/HjOPvvs06aZN2+ex0bAkoAvhC/YG2HnxzBoJli9M2B1h4XHwdy3QTvgzTlQX+nb8givkYAvhC/krYD6Y13bOud0kvrDT16Bkj3wwa1Gc1HR7UjAF8IXcj+A0Fij/txf9JsKM/4Ge76AZQ/4ujTCC+RNWyG6mq0edn0KQy4z+qv3J+NuheKdsPpx6DEYRv7U1yUSHiQBX4iutm8ZNFT6tnXO6cz4G5T+AB/fCbHpRrNR0SFKKa677jpee+01AOx2O6mpqYwfP765B8zFixezbds2zGYz7777LgDbt29n+PDhAMyfPx+TyURkZCTz5s3zaPk8EvCVUguBS4FirfWwVrYr4HFgJlAL3KS13uSJvIUIODs+gPAE6DvF1yVpndlq1OcvnA5vzIZrXoOBF/u6VAEhMjKSHTt2UFdXR3h4OEuXLqV3794npHn44YdZsmQJSUlJ3HfffQBERUWxZcuW5jS1tbVMmjTJPwM+8DLGmLWvtrF9BjDANY0H/s/1KURwqSqC3Z/D8NlGYPVXEQkw7zN4/Sp4ay5c9RwMu9rXpeqwv637G7vKdnl0n4MTBvPbcb9tN92MGTP49NNPmT17NosWLWLu3LmsWrUKMLpICA0Nbe5crS0RERFkZmaybt06xo0b55Hyg+cGMV+plMo8TZLLgVe18VrvGqVUnFIqVWt92BP5n+yZrc9gd/q2f5CWHSgpTuxM6YRldXxd03qlTpxvYlKm5nRNaVr7NGEyPpUJszI3zytOXde03DSZTMeXm7aZTCYsyoLVbMWqrFhMxnzTOovJgtVkxaSkDcBpaQ2f/Bc47TDxDl+Xpn2RSXDjx0ZTzfduhobqgH8btyvMmTOHBx98kEsvvZRt27Yxf/785oC/evVqRo8e3aH9ZGdns2rVKv8L+B3QG8hvsVzgWndKwFdKLQAWAGRkZHQqs4U7FlJv993YnRr/7a7Cm0zKhNVkJcQcQqg5lBBTyPF580nzphDCLGGEW8IJM4cRZgk7ZTncEk6YJYwISwSR1kiiQ6KJDokmwhJxSo+EAWHbO7D7U7j4j9BjoK9L0zFhsXDd+0Z3yh//p/Hs4Zxf+rpU7erInbi3nH322Rw4cIBFixYxc+bME7adaZfIu3Z59r+Urgr4rf11thoVtdbPAc+B0ZdOZzJb97N1nflal2jZd1HThUFrfXwe3fyT0ehT0pz86dTOE7Y7tbN5u0M70FrjxGmsb7lOO3FoB07tbJ53aAcOp+OEZad2YnfacWgHdqcdm9NmfDps2HWLT6fNmHfaaXQ20uBooNFx/LNpvrqxmkZnI/X2ehodjdTZ66h31FNnr+vwz9CkTMYFwBpNVEgUUdYookOM+fjQeOLD4kkISyA+LJ7EsMTm5ShrlO8uFJWH4fN7IH08TLjdN2XorJAImPOm0T7/yz9AfQVMvQ8C8aLbRWbNmsWvf/1rVqxY0dxzJhhdIldUVHRoH57qErmlrgr4BUB6i+U0oLCL8vYrrVb1yN8NWmsaHA3U2+ubLwBN8zW2Gqpt1VQ3GlOVrcqYt1VT1VhFta2a4tpi9h7bS0VDBdW26lbzsJgsJIQmkBCeQGJYIj0je9IzwjVFHv+MtkZ79sKgtdHixd4Ilz8NJrPn9t1VLCEweyF8HA0r/268jTv9r8YA6eIU8+fPJzY2luHDh5/QI+aQIUN4/fXXO7SPPXv2MGnSJI+Wq6sC/hLgDqXUWxgPayu8VX8vApNSqrlax10NjgbK68spqy9r/myampZL6krYU76HkrqSU6rgwi3hJ1wEBicMZmSPkQxOHIzV1IkHrVvehB/+ZQTIpP5uH5/PmMww6wmjmue7J43qnVlPGv3xiBOkpaVx5513nrJ+8uTJ3H333a0OlHKy1atXc//993u0XJ5qlrkIyAGSlFIFwP2AFUBr/QzwGUaTzL0YzTI929ZIiBZCzaGkRKaQEpnSblqb00ZJbQlFtUUcqT1CUU0RR2qOUFRbRFFtEd8VfseSfUsACDOHMTRpKKOSRzGyx0hGJo8kNjT29BlUHIIvfgd9JsG4//DE4fmWUsYziLBYWP4naKgy7vz97QUyH6muPvW/y5ycHHJycgCj9c2FF17IsmXLuPDCC9v83ubNmxk6dGi7rXnOlKda6cxtZ7sGfuGJvITwJKvJSmpUKqlRbQ8uUVRTxJajW9hSbEwv73gZuzZagWXFZjVfAEb3HE1GdMbxOzetYckvjX5pLn+q+1R/KAVTfgOhMfDFb42hEue8ASGRvi5ZQLj33ntZu3btadOUlJTw0EMPeTxvGQBFiDNUZ69jR8kOth7dalwEjm6hosF4ENc7qjcTe01kUq9JjCvaR8xnv4GZjxhdFnRHW96Ej35hdMMw+gY463KI6eWTouzcuZPBgwcHZguuTtBas2vXrjMaAEUCvhBucmonByoPsP7wer4t/Ja1R9ZSY6vBrDXDVRjnnD2fc9ImMSxxGOZAfGDbnt2fw1d/hKIdxnL6BBh6RZcH//379xMdHU1iYmK3D/paa0pLS6mqqiIrK+uEbRLwhehCNnsD29+4jNWVeXyXMYIdx35Ao4kOiWZC6gQm9ZrErP6zOvcA2J+V/AC5i+H7xT4J/jabjYKCAurrffcOTlcKCwsjLS0Nq/XE3yMJ+EJ0pfUvGEMGXvoYZM/jWP0x1hxew7eF37K6cDXFtcXcPuJ2fj7y574uqfecLvgP/4nxFq/wCgn4QnSVsv3wf5MgYzxc98EpLydprZn3r3lUNVbx/qz3fVTILnZy8DeHGv3yjF8AvUb5unTdjgxiLkRXcDrhozuOt1dvpR5ZKcXU9KnsKd/DoepDPiikDyQNgCn3wM9Xw+1rYPT18P1H8FwOvHARbH/PeClNeJ0EfCE8Zf3z8OM3MP0vEJvWZrKc9BwAVuSv6JJi+ZXkIXDJo3D3TuNFtNoSeP9meGw4rPir0Zuo8BoJ+EJ4Quk+WHo/DLgYRv7stEn7xPShb2zf4Az4TcJiYcLP4Y6N8LP3IGU4rPgL/GMovH8L5K833mMQHiXvRAvhLofN6FjMEgKXPd6hTsVy0nN4NfdVqhqriA6J7oJC+imTCQZcZEyl+2Dd87DlDdj+LvQYAunjoPdo6D3GWJZuHNwiPz0h3LX8T3BoozFKVAebHk5Nn8rCHQtZfWg107Ome7mAASKxH8z4K5x/H2x9C3Z/ZtT1b3rF2G4Jh9QRRvDvPdqY4rOk184zIAFfCHfsWw7fPAZjbjKaHHbQ8KThJIQlsDx/uQT8k4VGG28mj7vVqNYpy4NDm6Bwk3Fh3fAirHnKSBseb7T0iU2HyB5Gc8/IHhCReOK8P48u1oUk4AvRWTUl8OF/QNJAmPaXM/qq2WRmctpklh1chs1p634vYXmKUsadf2I/OPsnxjqHDYp3Hr8AFG6BI9uhthRc40OcIizOuABE9YS4DOMCEZfhmtIhJs2okuvmJOAL0Rlaw+Lboe6YMSJUSMQZ7yInPYfFexezuWgz41I9N4xdt2e2QurZxjTmpuPrnU6oPwY1R42Lcc1RoxVQTenx+aojsH8VVBWedHFQEJ16/ALQdDGITYe4PkarK6v7XXf7mgR8ITpj7bNGH/cz/m60MOmEiakTCTGFsKJghQR8TzCZjMHXIxKgx6DTp3XYoPIQHDsIx/JdnwehIh/y18KOD0A7TvxOVM8W/xm4PmMzIL4PxGcGRBfREvCFOFOHt8HS/4aBM9zqBTPCGsGEXhNYkb+Ce7Lv6fYdfvkVs9UI0vGZrW932KHqsHEBaLoYNE2Ht8DOj8FpO55emYyLQWJ/VxWU6zOhn3Fh8JNO8yTgC3EmGmvgvfnGg8DLn3K7hciUtCmsLFhJXkUe/eL6eaiQwm1mi+suPh36nHPqdqcTqouMC0D5fqNJadk+KN0L+eugsarFvkKMC0tCP+P9A0soWMKMZwaWsBbLLeZDo2HQDI8flgR8Ic7E5781/qhv+AgiE93e3ZS0KTzEQyzPXy4BP5CYTBCTakwZ40/cpjVUFxu/J00XgdJ9Rj9LjdVgbwB7/fFPWnnBLKqnBHwhfGrH+7D5NTjvbug7xSO77BnZk6GJQ1mRv4Jbht/ikX0KH1MKonsaU2Y7g5BrbTxPaHkBsDec+vzAQzzStYJSarpSardSaq9S6netbM9RSlUopba4pv/xRL5CdJnyH+HjuyBtLOT83qO7zknPYdvRbZTUlXh0vyIAKGVU7YTFQFQPowopqX/7D507ye2Ar5QyA08BM4CzgLlKqbNaSbpKaz3SNT3obr5CdBmH3ejfBeDqFzz+Es/U9KloNKsKVnl0v0KczBN3+OOAvVrrPK11I/AWcLkH9iuEf/j6r1CwDi79R9utOtwwMH4gqZGpLM9f7vF9C9GSJwJ+byC/xXKBa93JJiqltiqlPldKDW1rZ0qpBUqpDUqpDUePHvVA8YRww/5VsPIRGHkdDJ/tlSyUUuSk5/Bd4XfU24NjeD7hG54I+K21Szv5sfMmoI/WegTwBLC4rZ1prZ/TWmdrrbN79OjhgeIJ0Un564y+2hP7wYy/eTWrnPQc6h31rD281qv5iODmiYBfAKS3WE4DClsm0FpXaq2rXfOfAVallAxqKfyT0wmrHoWF04120de8BqFRXs1ybM+xRFojpVpHeJUnmmWuBwYopbKAQ8Ac4KctEyilUoAirbVWSo3DuNCUeiBvITyrqgg+XAB5K+CsK2DWP42XZbzMarZybu9z+brga5zaiUnJ2ETC89z+rdJa24E7gH8BO4F3tNa5SqnblFK3uZLNBnYopbYC/wTmaH8ePV0Ep73L4JlJcHCNMZDJT17ukmDfZEraFErqSvi+9Psuy1MEF4+8eOWqpvnspHXPtJh/EnjSE3kJ4XEOmzGIyTf/MEZVumEJ9GytZbF3TU6bjFmZWZ6/nGFJw7o8f9H9yf+NIriV/wgvzTCC/Zib4NavfBLsAWJDYxmVPCq4x7oVXiUBXwSv7z+CZ86Do7th9kKjGqcT/dp7Uk56DnvK93Co+pBPyyG6Jwn4IvjY6uCT/4J3bjBeY/+PlTDsal+XCjACPiB3+cIrJOCL4OF0wJY34Yls2LAQzvlPmPcFJGT5umTN+sT0oW9sXwn4wiukt0zR/WkNe/8NS++H4lzoNRquehYyz/V1yVqVk57Dq7mvUtVYRXRItK+LI7oRucMX3duhTfDKZfDGbLDVwuyXjAezfhrswehMza7trD602tdFEd2M3OGL7qlsP3z1kNGHfUQizHgYxswzuqL1c8OThpMQlsDy/OVMz5ru6+KIbkQCvuheakph5d9h/QtgssDke4y6+rAYX5esw8wmM5PTJrPs4DJsThtWk2e7YxbBSwK+6B6qimDTK/DtE8YwcqOuNwYqiUn1dck6JSc9h8V7F7O5aDPjUsf5ujiim5CALwKXww4/fGkMO7jnX8awcINmwoX/67URg7rKxNSJhJhCWJ6/XAK+8BgJ+CLwlOw1gvzWRVBdBJHJcM4dxl190gBfl84jIqwRjE8dz/L85dydfTcWk/ypCvfJb5EIDI01xpuxm16Dg9+CMsOAi2H09canh4cd9AdXD7iau1bcxTu73+GnQ37a/heEaIcEfOG/6ishfy3s+gS2vw+NVZDQDy64H0b+FKJTfF1Crzo/43wmpk7kyc1PcnHmxSSFyxASwj0S8IX/qCmFg9/Bj9/Cj6vhyDbQTrCEw9ArjCqbPueAam2Qte5HKcXvx/+eq5ZcxWMbH+OP5/7R10USAU4CvvCdysNG9cyP38KB1XB0p7HeEgZpY40mlX3OMeZDIn1bVh/Jis3ixrNu5MUdLzJ74GxGJo90a38bjmzg3wf/zZieYxiXMo7Y0K7r71/4nvLncUiys7P1hg0bfF0M4Qm2OjiyHQ5tNKaCDVC+39gWEgUZE4zg3mcS9BplDC0oAKi11TJr8Sziw+JZdMmiTj/Aza/K59pPrqWqsQoAheKsxLOYkDqBCb0mMCp5FKFm+bkHOqXURq11dmvb5A5feJ7TCSV7jgf3QxuhaAc47cb2mN5GUB97ixHkU84Gs/wqtiXCGsFvxv6Gu7++u9MPcOvsdfzX8v8CYMkVS6hoqOC7w9+xpnANr+S+wos7XiTUHMqo5FHNF4DB8YMxm8yePhzhQ3KHLzqvscYYQKR8P5QfMKaju+DQZuMBK0BojBHce485PgXoy1C+pLVmwdIF5Jbk8vGVH5MYnnhG3733m3v5NO9TnrrgKc5LO++E7bW2WjYUbWDN4TWsObyGH8p/AIwBWa7sfyXzhs0jISzBo8cjvOd0d/geCfhKqenA44AZeEFr/deTtivX9plALXCT1npTe/uVgO9DDhvUlUNtqTEdy3cF9RbBvbroxO+ExkBiP6M3yrRsI7gnDgCT9NHnCXkVeVy95Gou7XspD016qMPfe3Pnm/xl3V+4feTt/HzEz9tNX1JXwrrD61iev5wvf/ySMHMYPxvyM24ceqPU+QcArwZ8pZQZ2ANcBBQA64G5WuvvW6SZCfwSI+CPBx7XWo9vb98S8N2gtXEH3lgNDVXQUOn6bFqugvoKqCuD2jIjqNe5PmvLoaGilZ0qiE2D+MwTp4QsiM+C8PigaUHjK//Y+A8W7ljIazNe69AD3M3Fm5n/xXwm9Z7EP8//JyZ1ZhffvGN5PL31af514F9EW6O5fuj1XD/keqJCojp5BMLbvB3wJwL/q7We5lr+PYDW+i8t0jwLrNBaL3It7wZytNaHT7fvTgf8vcuM5nwd0erxt7KuOZ3u4LzTNbnWNy87T9zutBsDczjtxyeH/cRlpwMcjWCvB3tD+5+NNUaVSkd+BiFREJEA4QlGr5IRrs/wBNe8a1tsOsSly8NUH2v5APetS946bR370dqjXPPJNURYIlh06SJiQjrfgdzust08veVpvsr/itjQWOYNncfcwXOJsHp+SEitNTW2Guod9ViUBYvp+GRWZlQ7NxVO7aTB0UCjo9GYnI3Ny/X2eursddTaa6m11VJnrzOWbbXU2mub5+vsdThdfz9N+SnUCctNTMqE1WQ9PpmtrS5bTJbmdRaTxVivjO0nbws1hzIgvnNvjXv7oW1vIL/FcgHGXXx7aXoDpwR8pdQCYAFARkZG50r09nVG3+eBzmQ1enw0WcBkBmu4EXAtYSd+hsUcXzaHQmgUhEYbU0iUUdXStBwa7druWicBPKBEWCP49dhfc8/X9/DOnneYO3huq+lsThu//vrX1NhqePaiZ90K9gCDEgbx+PmPk1uay1Obn+KxTY/x6vevcvOwm7lm0DWEWcJa/Z7D6eBYwzHK68spbyinrL6MioYKKhoqONZwrHm+ovH4cmVDJXZtb7MsTcGx5cXA7rQbQd3ZiN3Z9ndPJ8wcRoQ1gnBLOOGWcEzKhHbd/LV2Y9y0zqEd2Jw2bE4bdqcdm8PWvOzQjk6VJTEskRXXrujUd0/HEwG/tcvtyT+djqQxVmr9HPAcGHf4nSrRTZ+0cefellaK1+pNhGulUu3Pm8zGvDK5JnXSp8nYbrIY3QKYzC2CuyvAC9GKaX2m8V7qezyx+QmmZU5r9YHqoxseZVPxJh6e/DAD4wd6LO+hiUN5+sKn2VK8hSe3PMnfN/ydV3JfYWbfmdTaapuDell9GeX15VQ0VDQHzZOFW8KJDY0lNiSWuNA4+sf1JzbUmI8NiSXcEo5d240g6gqmJ0z6+LzFZCHEHEKoOZQQU8jxebMxH2I6vhxpjSTcEk6ENYIISwQR1gjCzGFeaZHkcDqw6+MXgaZjOWHeYWtO07TuTKveOsoTAb8ASG+xnAYUdiKN5/Qe47VdC+FrSinuHXcvVy+5msc2PsaDkx48YfvH+z7mjZ1vcN2Q65iRNcMrZRiZPJIXLn6B9UfW89SWp3j1+1eJDYklPiye+LB4+sf1JyEswVgOjT8+HxZvBPTQ2KBo8282mTFj9ptj9UTAXw8MUEplAYeAOcDJDYWXAHcopd7CqO6paK/+XgjRtr5xfbl+6PW8tOMlrhpwVfMD3N1lu3nwuwcZ03MMv8r+ldfLMTZlLC9Pfxmtdbt168L33P6/QWttB+4A/gXsBN7RWucqpW5TSt3mSvYZkAfsBZ4Hbnc3XyGC3W1n30ZyRDJ/XvtnHE4HFQ0V3LX8LmJCYnhkyiNdOlKWBPvA4JHXG7XWn2EE9Zbrnmkxr4FfeCIvIYQhwhrBPdn3cM/Ke3h799t8c+gbjtQe4aVpL0nPmqJV8j67EAFsWuY03tvzHn9b/zec2skfxv/B7Q7WRPclr0AKEcCUUtw7/l6sJiuX97ucawZd4+siCT8md/hCBLi+cX1ZOnspcaFxUpcuTksCvhDdQHxYvK+LIAKAVOkIIUSQkIAvhBBBQgK+EEIECQn4QggRJCTgCyFEkJCAL4QQQUICvhBCBAkJ+EIIESQk4AshRJCQgC+EEEFCAr4QQgQJCfhCCBEkJOALIUSQkIAvhBBBwq3ukZVSCcDbQCZwALhGa13eSroDQBXgAOxa62x38hVCCHHm3L3D/x2wTGs9AFjmWm7LVK31SAn2QgjhG+4G/MuBV1zzrwBXuLk/IYQQXuJuwO+ptT4M4PpMbiOdBr5USm1USi1wM08hhBCd0G4dvlLq30BKK5vuO4N8JmmtC5VSycBSpdQurfXKNvJbACwAyMjIOIMshBBCnE67AV9rfWFb25RSRUqpVK31YaVUKlDcxj4KXZ/FSqkPgXFAqwFfa/0c8BxAdna2bv8QhBBCdIS7VTpLgBtd8zcCH52cQCkVqZSKbpoHLgZ2uJmvEEKIM+RuwP8rcJFS6gfgItcySqleSqnPXGl6At8opbYC64BPtdZfuJmvEEKIM+RWO3ytdSlwQSvrC4GZrvk8YIQ7+QghhHCfvGkrhBBBQgK+EEIECbeqdIQQQriv3uagoLyWH0trOVBaS73NwS+m9vd4PhLwhRCiC1Q32PmxtIYfS2tdU03z5+HKenSLRug9Y0K5PacfSimPlkECvhBCeIjWmqPVDewtrmZfcbXxebSGvcXVHKmsPyFtYmQIfRIjGN83kT6JEa4pkj4JESREhng82IMEfCGEOGNaawor6tl9pJIfiozAvveoEeQr6+3N6SJDzPRPjuKcfon0S44iKymSjAQjuEeHWbu83BLwhRDiNMprGtl1pIo9RVXNn3uOVFHVcDywJ0WF0j85klkje9G/RxT9kqPonxxFSkyYV+7UO0sCvhBCYDw43Vtczc7Dlew6UsXuI1XsLqriaFVDc5rYcCuDUqK5YlRvBqVEMyglmoHJ0cRGdP3demdIwBdCBBWtNYeO1bHrsBHQmwL8/pIaHE7jyWmoxcTAntFMGdiDQT2jm4N7cnSoX92xnykJ+EKIbqvB7uCHompyCyvILaxsDu5VLerZ0xPCGZwSw8xhKQxOjWFwSjR9EiMxmwI3sLdFAr4QoluorLexs7CSXNf0/eFKfiiqwu66a48MMTMkNYYrRvZmcGo0g1NiGJQSTVRo8ITB4DlSIUS34XBqdh+pYt3+UtYfKGf7oQoOltU2b0+KCmVorximDurB0F6xDO0VQ0ZCBKZueNd+JiTgCyH8ns3hZPuhCtbtL2Pd/jLWHyhrrpbpHRfOiPRYrh2bzlm9YhjaK4bk6DAfl9g/ScAXQvidepuDzQePGQH+QCmbfjxGnc0BQL8ekVx6di/GZyUwNiuB3nHhPi5t4JCAL4TwC8VV9SzfVcyyncV8s7eE2kYHSsGQlBiuHZvO+KwEsjMT6BEd6uuiBiwJ+EIIn9Bak1tYybKdxXy1q4itBRUA9IoN46rRvckZmMzYrARiwwOjjXsgkIAvhOgydY0OVu8tYdkuI8gXVTagFIxKj+OeaYM4f3Ayg1OiA7qtuz+TgC+E8BqtNftLalix+ygr9hxlbV4pDXYnUaEWJg9M4vzBPckZ1IOkKKmm6QoS8IUQHlXbaOe7faWuIF9MflkdAH17RPKz8X04f3Ay47ISCLHI+Etdza2Ar5T6CfC/wBBgnNZ6QxvppgOPA2bgBa31X93JVwjhP7TW7DtabQT43UdZt7+MRoeTcKuZSf0TWTC5HzkDe5CeEOHrogY9d+/wdwBXAc+2lUApZQaeAi4CCoD1SqklWuvv3cxbCOFD9TYHS7YW8vLqA3x/uBKAAclR3HhOH6YMTGZsVjyhFrOPSylacivga613Au09YBkH7NVa57nSvgVcDkjAFyIAFR6r4/U1P7Jo3UHKa20M6hnNg5cP5fzByaTFy128P+uKOvzeQH6L5QJgfFuJlVILgAUAGRkZ3i2ZEKJDtNasP1DOK98e4IvcI2itueisntx0ThYT+iZIq5oA0W7AV0r9G0hpZdN9WuuPOpBHa78JupV1xgatnwOeA8jOzm4znRDC+06utokJs3DLuVlcN6GP1MkHoHYDvtb6QjfzKADSWyynAYVu7lMI4UXFlfW88t0BFq3Lp6ymkYE9o/jzlcO5YlQvIkKkcV+g6ooztx4YoJTKAg4Bc4CfdkG+Qogz9ENRFc+vymPx5kJsTicXDO7J/EmZTOyXKNU23YC7zTKvBJ4AegCfKqW2aK2nKaV6YTS/nKm1tiul7gD+hdEsc6HWOtftkgshPEJrzdr9ZTy3Mo+vdhUTajFxzdg0bj63L1lJkb4unvAgpbX/VpNnZ2frDRtabdovhHCT3eHki9wjPL8yj60FFSREhnDDxD5cP6EPifLma8BSSm3UWme3tk0q44QIMrWNdt7dUMAL3+SRX1ZHZmIEf7xiGFePTiM8RNrNd2cS8IUIEg6n5qXV+3ly+V6O1doYnRHHfTPP4qKzenbL8VvFqSTgCxEEdh2p5Lfvb2dr/jEmD+zBf57fn+zMBF8XS3QxCfhCdGMNdgdPLd/H08v3EhNu5Z9zR3HZ2anS4iZIScAXopva+GM5v31/G3uLq7lyVG/++9KzSIgM8XWxhA9JwBeim6lpsPPIl7t5+dsDpMaE8dK8sUwdlOzrYgk/IAFfiG5k5Z6j/P6D7Rw6VscNE/vwm+mDiQqVP3NhkN8EIbqBY7WNPPTJTt7fVEDfHpG8e9tExspDWXESCfhCBLjdR6q4/sW1lNY08oup/fjl+QMIs0p7enEqCfhCBLDcwgque2EtVrOJj34xiWG9Y31dJOHHJOALEaC25h/jhoXriAwx8+atE8iUfm9EOyTgCxGANv5Yxk0L1xMXaeXNWyZI3/SiQ2TYeCECzJq8Uq5/cR1J0aG8vWCiBHvRYXKHL0QA+eaHEm55dT1p8RG8ect4kmPCfF0kEUDkDl+IALF8dzHzX1lPZmIkby2YIMFenDG5wxciAHyZe4Q73tzMgJ5RvH7zeOKliwTRCXKHL4Sf+3TbYW5/YxNDesXw5i0TJNiLTpOAL4Qf+2jLIX65aBMj0+N4/eZxxEZYfV0kEcDcCvhKqZ8opXKVUk6lVKtDarnSHVBKbVdKbVFKyZiFQrRDa83Cb/Zz19tbGJeVwCvzxxEdJsFeuMfdOvwdwFXAsx1IO1VrXeJmfkJ0e8dqG7nnvW0s/b6IC4ck88Tc0TL0oPAItwK+1nonIIMpCOEh6w+UceeizRytbuAPlwzh5nOz5O9LeExXtdLRwJdKKQ08q7V+rq2ESqkFwAKAjIyMLiqeEL7lcGqeWr6Xx/69h/SECD74+SSGp0m/OMKz2g34Sql/AymtbLpPa/1RB/OZpLUuVEolA0uVUru01itbS+i6GDwHkJ2drTu4fyECVlFlPXe9tYXv8kq5fGQv/njFMKmvF17RbsDXWl/obiZa60LXZ7FS6kNgHNBqwBcimCzfVczd726lrtHB32efzewxaVKFI7zG61U6SqlIwKS1rnLNXww86O18hfBnjXYnD3+xixe+2c/glGie/Olo+idH+bpYoptzK+Arpa4EngB6AJ8qpbZoracppXoBL2itZwI9gQ9ddy0W4E2t9RdulluIgHWgpIb/fGsz2woquGFiH+6dOUQGLBFdwt1WOh8CH7ayvhCY6ZrPA0a4k48Q3cHB0lpe+CaPdzbkE2ox88x1Y5g+rLXHY0J4h/SlI4SXbc0/xnMr8/h8x2HMJsUVI3tz10UD6R0X7uuiiSAjAV8IL3A6NSv2FPPs13ms3V9GdJiFBZP7MW9SJj2ll0vhIxLwhfCgRruTj7Yc4vlVeewpqiY1Now/XDKEa8emS1NL4XMS8IXwgMp6G2+uPchLq/dTVNnA4JRo/t81I7hsRC+sZumjUPgHCfhCuOFgaS0LV+/n3Q351DQ6mNQ/kYdnj2DygCRpTy/8jgR8Ic6Q1pr1B8p58Zs8vvy+CLNSXDaiFzefm8Ww3tIdgvBfEvCF6CCbw8ln2w/z4jf72VZQQVyElZ9P6ccNEzNJiZUHscL/ScAXoh0VtTbeXHeQV749wJHKevomRfLHK4Zx9eg06bZYBBQJ+EK0oq7RwZq8UpbuLOLDTYeosxn183++ahg5A5MxmaR+XgQeCfhCYNTL7ztaw9d7jrJidzFr95fRaHcSZjVxyXCjfv6sXjG+LqYQbpGAL4JWTYOd7/aVsmJPMSt2H6WgvA6Afj0iuX5CH6YM7MG4rATp50Z0GxLwRdCotznYVlDB+gNlfLuvhPX7y2l0OIkIMXNOvyRum9KPKQN7kJ4Q4euiCuEVEvBFt1VRa2PjwTLW7S9nw4EythVU0OhwAjCoZzQ3TcokZ2APsjMTCLHIy1Gi+5OAL7oFrTWHjtWx8cdy1h8oY8OBcnYXVaE1WM2K4b1jmTcpk7GZCYzpE098ZIiviyxEl5OALwJOvc3B7iNV7DpSyc7DVXx/uJJdhyuprLcDEBliZnSfeC4ZnsrYrARGpMVJ80khkIAv/FiD3UHhsXr2l1SfENj3l9TgdI12HBFiZnBKNJeO6MWQ1BhGpccxOCUai/RfI8QpJOALn7E7nByuqCe/vJaC8joKymrJL6+joLyW/LI6iqrq0S2GsU+LD2dIagyXnN2LISnRDEmNISMhQtrEC9FBEvCFV1Q32DlSUU9xZT1FVfUUVTYYyy3mj1TW43Aej+gmBamx4fSOD2dS/yTSE8JJi48gMzGCgSnRxEj3wkK4xd0xbf8OXAY0AvuAeVrrY62kmw48Dpgxxrr9qzv5iq7VaHdyrK6RY7U2ymsaKa+1cay2kbLaVtbVNFJUWU9No+OU/USFWkiOCSUlJoyxmfH0jg8nPT6CtPgI0hPCSY0Nl9YyQniRu3f4S4Hfa63tSqm/Ab8HftsygVLKDDwFXAQUAOuVUku01t+7mXfQ0FrjcGrsTo3N4cTu0NicTmOdw7WuxbZGh5MGm5N6m4MGu5MGu/HZvGxzUm93UG9zUNvgoNbmoLbBTk2jndpGBzUNxqcx2bE5dJtlC7WYiI8IIS7CSnxECEN6xZAzKJmU2FB6xoSRHB1Gz5hQkmPCiAqVfyiF8CV3BzH/ssXiGmB2K8nGAXtdg5mjlHoLuBzwWsC/9IlV1NucHUqrddvB7IR0bSw0zbbcjwa0BqfWzXXQWmucGjTGOt1indMV0PVJ8w6tT9iHJ1nNilCLmchQM5EhFiJCzUSEWEiIDCE9PoKIEDORoRYiQsxEhJiJDbcSHxlyQnCPjwiR1i9CBBBP3nLNB95uZX1vIL/FcgEwvq2dKKUWAAsAMjIyOlWQ/j2iTntXemqmZ56s5eAWqnnd8e0mpYz1ChQKkzK2K5TxqYxPkwKzUiilMCmF2WR812RSJ2wzmxQWs8JqMmExKyxmExaTwmJSWM2udSYTVrMixGIizGom1GIi1GJ8Ni9bjXVmedApRNBpN+Arpf4NpLSy6T6t9UeuNPcBduCN1nbRyro2o7HW+jngOYDs7OxO3ds+NmdUZ74mhBDdWrsBX2t94em2K6VuBC4FLtCt148UAOktltOAwjMppBBCCPe51STC1frmt8AsrXVtG8nWAwOUUllKqRBgDrDEnXyFEEKcOXfbwD0JRANLlVJblFLPACileimlPgPQWtuBO4B/ATuBd7TWuW7mK4QQ4gy520qnfxvrC4GZLZY/Az5zJy8hhBDukbdchBAiSEjAF0KIICEBXwghgoQEfCGECBKqo10L+IJS6ijwYye/ngSUeLA4vtRdjqW7HAfIsfij7nIc4N6x9NFa92htg18HfHcopTZorbN9XQ5P6C7H0l2OA+RY/FF3OQ7w3rFIlY4QQgQJCfhCCBEkunPAf87XBfCg7nIs3eU4QI7FH3WX4wAvHUu3rcMXQghxou58hy+EEKIFCfhCCBEkAjrgK6WmK6V2K6X2KqV+18r2HKVUhasnzy1Kqf/xRTk7Qim1UClVrJTa0cZ2pZT6p+tYtymlRnd1GTuiA8cRSOckXSm1XCm1UymVq5S6s5U0fn9eOngcAXFelFJhSql1SqmtrmN5oJU0fn9OoMPH4tnzorUOyAkwA/uAvkAIsBU466Q0OcAnvi5rB49nMjAa2NHG9pnA5xgjiE0A1vq6zJ08jkA6J6nAaNd8NLCnld8xvz8vHTyOgDgvrp9zlGveCqwFJgTaOTmDY/HoeQnkO/zmwdG11o1A0+DoAUlrvRIoO02Sy4FXtWENEKeUSu2a0nVcB44jYGitD2utN7nmqzDGc+h9UjK/Py8dPI6A4Po5V7sWra7p5JYnfn9OoMPH4lGBHPBbGxy9tV/iia5/mT5XSg3tmqJ5RUePNxAE3DlRSmUCozDuwloKqPNymuOAADkvSimzUmoLUAws1VoH7DnpwLGAB89LIAf8jgyOvgmjX4kRwBPAYm8XyovOaDB4PxZw50QpFQW8D9ylta48eXMrX/HL89LOcQTMedFaO7TWIzHGxx6nlBp2UpKAOScdOBaPnpdADvjtDo6uta5s+pdJG6NuWZVSSV1XRI/qFoPBB9o5UUpZMYLkG1rrD1pJEhDnpb3jCLTzAqC1PgasAKaftCkgzklLbR2Lp89LIAf8dgdHV0qlKKWUa34cxvGWdnlJPWMJcIOrBcIEoEJrfdjXhTpTgXROXOV8Ediptf5/bSTz+/PSkeMIlPOilOqhlIpzzYcDFwK7Tkrm9+cEOnYsnj4vbo1p60taa7tSqmlwdDOwUGudq5S6zbX9GWA28HOllB2oA+Zo16Nvf6OUWoTxRD5JKVUA3I/xEKfpWD7DaH2wF6gF5vmmpKfXgeMImHMCTAKuB7a76lkB7gUyIKDOS0eOI1DOSyrwilLKjBH83tFaf3LS330gnBPo2LF49LxI1wpCCBEkArlKRwghxBmQgC+EEEFCAr4QQgQJCfhCCBEkJOALIUSQCNhmmUJ0NaVUIrDMtZgCOICjruVxrj6dhPBb0ixTiE5QSv0vUK21fsTXZRGio6RKRwghgoQEfCGECBIS8IUQIkhIwBdCiCAhAV8IIYKEBHwhhAgS0ixTCCGChNzhCyFEkJCAL4QQQUICvhBCBAkJ+EIIESQk4AshRJCQgC+EEEFCAr4QQgSJ/w8NlBE4/nrrfwAAAABJRU5ErkJggg==\n",
"text/plain": [
"