{ "cells": [ { "cell_type": "markdown", "source": [ "# Support Vector Machine\n", "\n", "*You are seeing the\n", "notebook output generated by\n", "[Literate.jl](https://github.com/fredrikekre/Literate.jl) from the\n", "[Julia source file](https://github.com/JuliaGaussianProcesses/KernelFunctions.jl/blob/master/examples/support-vector-machine/script.jl).\n", "The rendered HTML can be viewed [in the docs](https://juliagaussianprocesses.github.io/KernelFunctions.jl/dev/examples/support-vector-machine/).*" ], "metadata": {} }, { "cell_type": "markdown", "source": [ "In this notebook we show how you can use KernelFunctions.jl to generate\n", "kernel matrices for classification with a support vector machine, as\n", "implemented by [LIBSVM](https://github.com/JuliaML/LIBSVM.jl)." ], "metadata": {} }, { "outputs": [], "cell_type": "code", "source": [ "using Distributions\n", "using KernelFunctions\n", "using LIBSVM\n", "using LinearAlgebra\n", "using Plots\n", "using Random\n", "\n", "# Set seed\n", "Random.seed!(1234);" ], "metadata": {}, "execution_count": 1 }, { "cell_type": "markdown", "source": [ "## Generate half-moon dataset" ], "metadata": {} }, { "cell_type": "markdown", "source": [ "Number of samples per class:" ], "metadata": {} }, { "outputs": [], "cell_type": "code", "source": [ "n1 = n2 = 50;" ], "metadata": {}, "execution_count": 2 }, { "cell_type": "markdown", "source": [ "We generate data based on SciKit-Learn's sklearn.datasets.make_moons function:" ], "metadata": {} }, { "outputs": [], "cell_type": "code", "source": [ "angle1 = range(0, π; length=n1)\n", "angle2 = range(0, π; length=n2)\n", "X1 = [cos.(angle1) sin.(angle1)] .+ 0.1 .* randn.()\n", "X2 = [1 .- cos.(angle2) 1 .- sin.(angle2) .- 0.5] .+ 0.1 .* randn.()\n", "X = [X1; X2]\n", "x_train = RowVecs(X)\n", "y_train = vcat(fill(-1, n1), fill(1, n2));" ], "metadata": {}, "execution_count": 3 }, { "cell_type": "markdown", "source": [ "## Training\n", "\n", "We create a kernel function:" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "Squared Exponential Kernel (metric = Distances.Euclidean(0.0))\n\t- Scale Transform (s = 1.5)" }, "metadata": {}, "execution_count": 4 } ], "cell_type": "code", "source": [ "k = SqExponentialKernel() ∘ ScaleTransform(1.5)" ], "metadata": {}, "execution_count": 4 }, { "cell_type": "markdown", "source": [ "LIBSVM can make use of a pre-computed kernel matrix.\n", "KernelFunctions.jl can be used to produce that using `kernelmatrix`:" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "LIBSVM.SVM{Int64, LIBSVM.Kernel.KERNEL}(LIBSVM.SVC, LIBSVM.Kernel.Precomputed, nothing, 100, 100, 2, [-1, 1], Int32[1, 2], Float64[], Int32[], LIBSVM.SupportVectors{Vector{Int64}, Matrix{Float64}}(23, Int32[11, 12], [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1 … 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1.0 0.8982223633317491 … 0.6360692761241019 0.27226866397259536; 0.8982223633317491 1.0 … 0.7710611517712889 0.4654568122945319; … ; 0.27226866397259536 0.4654568122945319 … 0.7536774603025823 1.0; 0.1378713016583555 0.2643436673110578 … 0.5573025470555464 0.9233874841127124], Int32[1, 2, 3, 4, 6, 7, 24, 25, 30, 46 … 53, 54, 56, 58, 72, 74, 78, 86, 89, 99], LIBSVM.SVMNode[LIBSVM.SVMNode(0, 1.0), LIBSVM.SVMNode(0, 2.0), LIBSVM.SVMNode(0, 3.0), LIBSVM.SVMNode(0, 4.0), LIBSVM.SVMNode(0, 6.0), LIBSVM.SVMNode(0, 7.0), LIBSVM.SVMNode(0, 24.0), LIBSVM.SVMNode(0, 25.0), LIBSVM.SVMNode(0, 30.0), LIBSVM.SVMNode(0, 46.0) … LIBSVM.SVMNode(0, 53.0), LIBSVM.SVMNode(0, 54.0), LIBSVM.SVMNode(0, 56.0), LIBSVM.SVMNode(0, 58.0), LIBSVM.SVMNode(0, 72.0), LIBSVM.SVMNode(0, 74.0), LIBSVM.SVMNode(0, 78.0), LIBSVM.SVMNode(0, 86.0), LIBSVM.SVMNode(0, 89.0), LIBSVM.SVMNode(0, 99.0)]), 0.0, [1.0; 1.0; … ; -1.0; -1.0;;], Float64[], Float64[], [-0.015075000482567661], 3, 0.01, 200.0, 0.001, 1.0, 0.5, 0.1, true, false)" }, "metadata": {}, "execution_count": 5 } ], "cell_type": "code", "source": [ "model = svmtrain(kernelmatrix(k, x_train), y_train; kernel=LIBSVM.Kernel.Precomputed)" ], "metadata": {}, "execution_count": 5 }, { "cell_type": "markdown", "source": [ "## Prediction\n", "\n", "For evaluation, we create a 100×100 2D grid based on the extent of the training data:" ], "metadata": {} }, { "outputs": [], "cell_type": "code", "source": [ "test_range = range(floor(Int, minimum(X)), ceil(Int, maximum(X)); length=100)\n", "x_test = ColVecs(mapreduce(collect, hcat, Iterators.product(test_range, test_range)));" ], "metadata": {}, "execution_count": 6 }, { "cell_type": "markdown", "source": [ "Again, we pass the result of KernelFunctions.jl's `kernelmatrix` to LIBSVM:" ], "metadata": {} }, { "outputs": [], "cell_type": "code", "source": [ "y_pred, _ = svmpredict(model, kernelmatrix(k, x_train, x_test));" ], "metadata": {}, "execution_count": 7 }, { "cell_type": "markdown", "source": [ "We can see that the kernelized, non-linear classification successfully separates the two classes in the training data:" ], "metadata": {} }, { "outputs": [ { "output_type": "execute_result", "data": { "text/plain": "Plot{Plots.GRBackend() n=3}", "image/png": "iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAIAAAD9V4nPAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdd0BT59oA8OdkJ6yA7C17ORGloogC4qxWa23do1atrdbaabWt7e1Va+us2ms/62rr1rqvGxUnKrJBQISwZwhJyD7fH+eaRgIICgTI8/vr5M17Th6OyJP3Pe8gSJIEhBBCyFjRDB0AQgghZEiYCBFCCBk1TIQIIYSMGiZChBBCRg0TIUIIIaPGMHQACCGEXolSqUxJSUlKSrKwsBg/fnyDdcRi8f/93/8VFhYOGTJkzJgx2vL4+PijR4+amZnNmjXLycmpvULuWIwuEV67du3UqVMlJSW2trbTpk3r27evoSNCCKFXsmXLls2bN/P5fDab3WAiJEkyKirKzs4uMjJy8eLF2dnZH330EQBcuXJlwoQJy5cvFwgEISEhSUlJ1tbW7R6+4RHGNo9ww4YNGo3G2dk5NTX1559/vnLlyoABAwwdFEIIvTy1Wk2n0/fu3bt169a7d+/qV7h48eLcuXNzcnKYTGZsbOyUKVPy8vKYTObw4cNHjBjx8ccfA8Do0aOHDBny2WeftXv4hmd0LcKlS5dqj9PS0s6dO4eJECHUqdHp9KYrXLt2bejQoUwmEwAGDx4sFAozMzMDAwOvXbu2fv16qk5MTMx///tf40yExjtYJjs7OyEh4bXXXjN0IAgh1LaKi4ttbW2pYzqdbm1tXVRUVFVVpVAotOW2trbFxcWGi9GQjK5FCAAbNmygugI+/vjjmJiYxqpNGDGCXVnJ5nAAYNzrr/v7+7dfiB2PSqViMIzxt6VBeDd04d3QZeLo6PKikQdCobyiQtrSK0+cGOnj40kQhLaEw+Hs3r2bRntxe4bBYKjVau1LpVLJZDKpfzWVSkUVqlQqqslohIzx13fp0qVLlixJS0t76623PDw8Fi1a1GA1TXZ2b6mUY2ZGEIToyJEHL+p86NrUGg29Gf/fjATeDV14N3SZe3m57N3bdJ3Y2PydO5NbeuWMjIxlyz7icrnaEj6f35wsCACOjo5paWnUsUwmq6qqcnR0tLCwMDExKSoqcnR0BIDCwkLqwAgZYyIEABqNFhQUNGvWrLNnzzaWCNlstoWpqa2LSzvH1jHht35deDd04d3QRWuzb8x0On38+PHm5ubNP+XmzZsBAQGWlpZjxozZvHmzUCjk8/knT57s3r27j48PAIwdO/bo0aP9+vXTaDTHjx+fN29eGwXfwRndr295ebmNjQ0AqNXq2NhYX19fQ0eEEEKv5P79+19++WVxcbFAIIiOjg4NDf3+++8BYPTo0QcOHBgxYkRwcPDIkSMHDRoUGhp64sSJ3377jepi/eqrr4YOHSoQCAoKCtRq9TvvvGPoH8UwjC4RBgcHOzo6WllZJScnu7i4rFixwtARIYTQK/Hx8VmzZo32pYWFBXVw8eJFb29v6njfvn3Xr18XCATLly/38PCgCoOCgtLT0y9dumRmZhYVFcVms9s58g7C6BJhVlZWUlKSSCRydnbG5iBCqAswNzcPDg7WLw8JCdEeEwQxZMgQ/TrW1tZvv/12GwbXGRhdImSz2bq/HAghhIwcjvVCCCFk1DARIoQQMmqYCBFCCBk1TIQIIYSMGiZChBBCRs3oRo22nT+ys6t0VvPrYkiS1F3k0Mg1824wNJoFfn40vG8IdWyYCFvNzZKS79assbKyMnQgqKOYNnXqXB8ftnGvUotQx4eJsDWNGTPGycnJ0FGgjmLmjBmGDgEh9GL4jBAhhJBRw0SIEELIqGEiRAghZNQwESKEEDJqmAgRQggZNUyEBlZVVfWv774L7dHDwdLS28lpysSJ165dM3RQCCFkRDARGlJ8fHyQt/fFNWsWpKQcFgo3FhU5/f332OjoD+bPJ0mypVcrLS19+PBhi05ZtWrVv/71ryYqTJw48eTJky2NpDH79++fOnVqExVu3rwpEola6+Pmzp27d+/e1rpag+7fv79169Yvvvji0aNHbfpBCKG2g4nQYCorK0dHRy8SCq/V1c0CGAQwGmCdRvNIqTyzd+/a1atbesHY2NgvvviiRadERUUNGzasiQrTp08PCAhoaSSNkcvlEomk6Y/LyspqrY8TiUQymay1rtagL7744tatW7t3705LS2vTD0IItR2cUG8wGzds6C2Xf6XR1Cv3ANglk4397rsPlywxMTFp5tXEYvHly5cLCgp27NjB4XBmzJhx7tw5T0/PBw8eJCYmfv311wKB4Pz586WlpZ6enlOnTmWz2QDAZDKppcIEAsGDBw/8/f3379/P5/Pnzp1rZmYGACwWi06nA0BCQgKVw86dO+ft7T19+nSqXKlU7tu378mTJ6NHj5ZIJE5OTv7+/vViu3r16pUrV/z8/LTNXI1Gc/Xq1du3b6tUqsGDB0dGRgLA5cuXa2trjx8//uDBg/DwcE9Pz4sXL96/f58giMjIyIEDB1LnyuVygiBYLFa9T1EqlYcPH05PT7e2tp44caKzs7PuzTlz5kxaWhqPx3v99de1EV6/fv3KlSsajSYgIGDy5MkEQaSlpR07dqyurs7Dw2Py5MmmpqZN3/ZLly4BQN++fZv5z4QQ6oCwRWgwZw4fntlIeyUCwJpGu379+qtcf8uWLa+//vrNmzft7Ow0Gs3OnTvr6uq8vLzOnTs3atQoqs6RI0eOHTsGACkpKYsWLVq6dKmNjc3Vq1fHjx9PVVi/fv39+/cB4OzZs3PmzNm2bZujo+Mvv/yibXq++eabhw8f7t69+9q1a999990bN27UC2PXrl2zZ892dHR8+PDhDz/8QBXKZLL//Oc/VlZWdnZ2ixcv3rJli378xcXFBw8etLOzs7CwmDZt2sGDB6nyqVOnLl++vF5lhUIxePDgAwcOuLq6ikSi2NhY3Xfv378fFxfn6uqqVqsjIiISEhIA4Ny5c7Nnz7azs3N3d7906ZJarc7Ozo6MjORyub6+vmlpaUVFRS935xFCnQu2CA2moKTEo/F3PWm0/Pz85l/N1NQ0MjLy6dOn7733nrZw6NChv/zyC3X8448/UgczZ87s3r3748ePfXx8dK8glUoPHTpkamo6a9YsCwsLkUhkbm6uW4HP5//1118A0KdPnxkzZqxbty4hIeH27dv5+flUG7R79+76gX3zzTe7d++mOmBLS0vFYjEA8Hi8Q4cOURVCQkJmzZr14YcfRkZGmpmZvfHGG8HBwdRbe/bs+d/d8PRcv3795MmTAWDu3Ln1AgOA3bt3A8CJEycaXAs7IiIiIiKCOmYwGLt27erTp098fHxUVNTChQsBYM6cOQCQlJTk6en50Ucf0XF1UISMCSZCg+FxONLGB4ZICKL5/aKNCQkJ0R7v37//X//6l1qtNjExqaioKCgoqJcIvby8qJ5AExMTPp9fXl5eL9/07t2bOnB2di4vLweA9PT0oKAgDocDAEwms0+fPvUCEIlEAoEgNDSUevnaa69dvHgRAFQq1bJly86dO0ej0VgsVkFBgX7wdXV177///s2bN+l0OkEQKpWKKh85cqR+5YSEhGHDhjW2I0RhYeGCBQsyMzNZLJZEIqF+kMmTJ48YMcLX13f06NGzZs3q2bNnZGTk6tWrXVxcxowZ8/bbb9d7enrixAkqeMrHH3/s4dHENxmEUKeBidBgevfpc+P8+ciG3hIBPKqr088rLUU9CASAysrK9957LzExkfrb7e3trdbbMUq3GUQQhP6wVQaj/m+Lubm57iDPmpoa/QBoNJpMJuPxeABQV1dHlf/xxx+PHj1KTk5ms9nJycna53+6Nm/eLBKJ0tLSGAzGpUuXFixY0MRPamJiIpVKG3v3yy+/7Nmz58mTJwmC2LRp05UrVwDA19c3Jyfn3r17R48eDQsLi4+P9/Pzi4+PT01NPX78+Ntvv71jxw5tFzEA9OjRQ/ebQbdu3ZqIByHUieAzQoN594MPtrBYhQ299S2d3qdHj8DAwBZdkM/nV1ZWNvhWZWUlk8mkdsa4ceNGTk5Oi8NtyMCBA3NycuLi4gAgPj7+9u3b9Sqw2ezQ0ND9+/cDgFKpPHLkCFVeVlbm7OxM5Wlt/yf1I1RVVWnruLm5MRgMkiR161y5cuXevXv1PigmJubQoUNUOxUA5HK57rtlZWUeHh4EQcjlcioYACgvL6fRaKGhoevWrfPx8cnKyqqqqtJoNIGBgStWrBg5cmS9gaAeHh5DdVhYWLzEHUMIdUDYIjSYMWPGjJ04MeL48Z0yWfizQiHAKgZjN5sd98cfLb3g4MGDAcDb29vV1fXy5cu6b3l7e4eFhQUHB7u7u4vFYl9f31b4AQCsrKz27t07efJkHo/n4eERHh7O5XLr1dmyZcuYMWNOnTpVWlrq7u5ONTQnT568adOm6OhoiUTi7e2trbxgwYIpU6a4urquXLly5syZUVFRmZmZpaWluiNRt23b5u7u3r9/f91PiY6OnjdvXo8ePQYMGFBcXDxlypSPPvpI++7ChQvnzJlz+vTpnJwcPz8/Kk2uW7fu1KlT/v7+JSUlZmZmkZGRR44cWbFiRZ8+ferq6gQCQdMzLClz5sy5du1aYWHh0qVLV65cuW/fvgZbtwihjqyBHjBEmRwYOJTJtHVxaWb9hXFxD1NSWrQfoVqt/vf3369bu9aWRvMhiFqCeCCTBffq9Z+9e1969p5EIlEqlXw+XywWs1gs7TQDkiSTk5M1Gk3Pnj3FYjGXy2UymdSMCBMTE6VSKZPJqCkTACAUCs3NzWk0mlAo5HK5bDZbJpNpNBqqh1Oj0YhEIj6fr/1Q6oI+Pj4NZgKpVJqamurm5sbn8xUKBfUkUiKRpKSk2Nvbu7i46F5NrVaLRCIej8dms0UiUWpqqqurq729vVgsphphIpGIRqM1OLGhuro6MzPT1taW6gEWiUQsFot6hFlaWvrkyRNfX19TU1NtDAUFBQKBoFu3btrHpZWVlY8fPzYzM/P392/OkBmxWKxUKrUvzczMdDuQeVzuzqFDu/zGvCqVSr/b3Gixra1H79rVdJ2//87auTO5pVe+fHlmSUmh/kgx9OowETaqHRIhRSQSXb16NS8vz8zMrH///i3tETWszZs3q9VqKyuro0eP1tTUxMbGNjZixQhhIjRCmAg7I/z1NTxzc/Nx48YZOoqXNGzYsLNnz2ZlZU2aNImak27oiBBCqGUwERpYSUnJhg2bDh8+XVpawGJx+vfvv2TJfO2E944vKCgoKCjI0FEghNDLw1GjhhQXF+fj02Pz5sTc3JVS6SWh8ODFi73feGP61Kmz9ac3vNBLLLq9YsWKb775pokKY8aMOX78eEsjaUw7L7o9bdq033//vbWuBgD37t3bsGHDwoULr1692oqXRQgZFiZCgyktLR0x4nWx+CuZ7CzAWwDBAOEkuUqhSDp27OaqVd+39IIvsej2uHHjxo4d20SFDz744NWnM2q186LbcrlcOw2/VWzcuDEpKenChQspKSmteFmEkGFh16jB/PzzBpXqNZL8SO8dJ5ls99q10Z9+ukw7jPOFRCLRyZMnnz59unbtWi6Xu3jx4sOHD/v6+t67dy8pKWnNmjXZ2dlnzpwpKyvz8vKaPXs2Nf6TWsAaAJ48eXLz5s1evXrt27ePz+cvXLjQysoKAKRSKTUq8vbt27W1tQRBnD171tPTc/78+UwmEwBkMtlvv/2Wm5s7ZsyY2tpad3f3Xr161YvtzJkzV69e9fX1pdH+98VLo9GcOXPm7t27CoVi0KBBr7/+OgCcPHmypqZmz549ly5dGjlypJ+f38mTJx88eAAAUVFR1MLc0PioUZlM9scff6SlpdnY2Lz99tu6672JRKLjx48nJSWZmppOmDBBG+H58+cvXbpELbo9Z84cgiAePnx49OhRiUTSvXv3OXPm1Lv/1Apz0dHRzfxHQQh1CtgiNJjjx/8rl09r5M2BDIZ9ixbdptFoJiYmDAbD0tKSmoqwa9euiRMnZmdn+/v7kyR55MgRMzOzAQMG3Lt3b/jw4dRo4ZMnT54+fRoAMjMzP/vssxUrVgQGBiYnJ2sH72zbto3aae/KlSsLFizYv39/7969//rrr08++YSqMG7cuKtXr/br12/Hjh0ffPDB3bt36wX266+/LlmyJCgoKD8/XzszTyaTHT161NvbOyAg4Jtvvvnpp58AwMTEhEajmZubW1paslissrKyy5cvBwQEeHp6Lly4cN++fdS5c+bM+fbbb+t9ikwmCw0NvXjxYnBwMIvFqjfjPjExMT09PTg42MrKKiYmhnr31KlTixcv7tGjR79+/ZKSktRqdWZm5ujRo11dXQcOHFhRUVFaWtr8+48Q6rywRWgwZWVFAO6NvUsQ3RtcgbMxDS66PWLEiDVr1lDH3333HQDI5fLhw4f37t378ePH9abVy+XyAwcO8Hi8yZMnm5ubC4VC3ZmCAGBvb089cvPz85syZcqmTZvu37+flJSUl5fHYrEmT57c4Nqb33///f79+8PDwwFAIBAIhUIA4PF41DLZYrHY3d39/fff/+STT/QX3d6+fTsAUMt/b9++ffr06QDw/vvv6zcHf//9d1NTU+0OFfUMHjyYWm2gurq6pqZm7969/fv3T0hICAsLmzZtGo1Ge+eddwAgLS2te/fus2fPZrFYb731VrPuO0Ko88NEaDAcjolIJG7sXYKofeFmeC+ku0/e77//vnr1ag6Hw2azKysrCwoK6iVCT09Pqr+Uy+Xy+fyKiop6ibBHjx7UgYODQ0VFBQA8fvw4ICCAmrNPp9N79uxZLwCRSFRUVKRd+7t///4XLlwAAKVSuXDhwgsXLtjY2CiVysLCBlaaE4vFc+fOvXPnjo2NjVQq1T7ta3An4aSkpCFDhjR2H/Ly8mbPnp2fn0+tQkctuj116tQxY8a4u7uPGjVqzpw5/fv3j4qK2rhxo4ODw8iRI995553Ro0c3dkGEUFeCidBgQkKCz569RpINPnAS1tUlahtGL027rEx5efmSJUsyMjKo+f6enp4avQ2BX7iQin4FPp9fXV2tfal7TOFwOHQ6XSKRUEuvaUfK7N279+nTp0+ePGEwGImJiYMGDdL/uM2bN9NotNzcXBqNduHChffff7+J2MzNzWtraxt7d/ny5REREV9//TUAbNy4kRrz6enpmZ6enpSUdPTo0cjIyNu3bwcFBV27di03N/fvv/9+9913N2/ePGnSpCY+FKGOQ61W79mz59GjR35+fu+++67+ztUbN27UXYO3Z8+eI0eOFIvFW7du1RYOGjQoLCysnSLuSPAZocF8+OE8JnMrwFP9t+j0r/r2HeDn59eiC1pZWZWVlTX4llAopB4fAsClS5eePHnS8ngbMHDgwLy8PGpd07i4uDt37tSrwGKxwsLC9u7dC8+6Xqnyqqqqbt26UcuR/Pbbb9r6lpaW2h+hqqrKxsaGRqNRuwpr65w7d+7mzZv1PmjUqFGHDh3SbqVbb2xqVVWVnZ0dANTV1WmfNRYVFZEk2bNnz2+//dbLy+vp06dlZWVKpbJ79+5Lly6NiorKzs5+lZuDUHv64IMPfv3116CgoMOHD0+b1sDgg2od//73vzMzMwGgtrb2q6++0pbLGtkqvMvDFqHBxMTETJ/+9p9/DpHJ/gMw4llxGYOxgsc7/scf9f/Wv9DgwYMtLCxcXFxsbW2pwZZaXl5e0dHRPXv2dHd3JwjipRcyrYfP5x84cOC9996Ty+V9+/YdOnQo1bmq65dffhk9evSJEyeqqqoCAwOp/2lTpkzZunXr4MGDpVJpv379tJWXLFkyd+5cLpe7evXqOXPmREZGpqSkVFRUDBgwQFtn586d7u7u9b63RkRELF26tHfv3j169CgrK1uwYMGiRYt0Lzt16tTjx48XFBT07t2bajtu27btjz/+CAgIKCwsdHZ2joqKOnbs2CeffBIUFCSRSCQSiXYrY60FCxYcOnRILBbfunXrm2+++f3333X3aULIUEpKSnbt2pWVleXi4jJ58mQHBwf9nbdXrVpFHWRkZGzYsEE7o5fBYGhHEhgtXGu0Ue2w1qhGo/n55w2rVv2gVnMYDB+AWqk0KSxs2K5d2zw9PV8qalCpVGKxWH/RbQDIyclRq9U+Pj4ikYhadJuaGkEdNLjotkwmYzKZdDq96UW3NRoNdeUDBw7oJi1tSBkZGa6urhwOR7vgtUKhyMzMtLOzs7a2rne12tpaFovFZrPr6uqo/9vm5ubaRbepKR/6PT8AIJVKs7Oz7ezsqPafXC6n0+lUu7OmpiYvL8/T05PJZGpjoJ6V2tjYODo6aj86Ly+Px+N1795df7k4iUSiUCi0L01MTBoMQwvXGjVCBllr9MSJE19++aV247AhQ4bMmDFj7ty5DV5n2bJlAoHg0KFDAFBcXOzm5rZmzRo6nT5s2DDtOABjg7++hkSj0T79dNkHH7x/8+bNvLw8U1PTkJCQV9z3nMFgUElFf6yNNrlq/y9RcwGpA+0xAGjTErV1g+4BFba2wk8//aRQKMzNzU+cOOHj46OfBamQtMuwaTMHi8XS/q+rNypHm4+5XK52AI52/z/tbsP6eDye7oAd3ZoWFhbat7QxdOvWrd7+umZmZk2sGGdiYmJiYtLYuwgZSnFxsY2Njfalra1tcXFxgzWVSuUff/yh3eCTTqePGDFCJBIVFxevXLly3bp18+fPb4+IOxhMhIbH5XKjoqIMHcVLGjt27MWLF8Vi8cKFCzvv0uEIdXwKhWzcuHG6jW8+n3/w4EEajcZisXQXUVIqlY31VZw6dYrFYmkXhbC1tT158iR1PGrUqBkzZsybN0+78IXxwESIXomvr29rbfOLEGoCg8FcunSp7mN4LpdLJS1HR0fdaccFBQWNPaPZuXPn7NmzGxwiHhoaKhKJKioqbG1tWzv2jg4TIUIIdQI0Gj0iIqLBZ4Th4eEikejOnTuhoaFZWVlpaWkxMTEAUFBQUFhYqH1gUVhYeOHChc2bN2tPlEql2sx64sQJe3t73S5W44GJECGEOjcej/fDDz+MHz8+JibmypUry5cvt7a2BoATJ07s3LlTuynNnj17wsPDdQfibdmy5c8//wwICCgrK3v06NHevXuNc0tRTIQIIdTpvf/++8OGDUtOTl62bJl2XNhbb72luxLTW2+9NWvWLN2zli5dGhERQS261K9fP2qqsRHCRIgQQl2Bn59fvVU4bGxsdLs6vby86p3CYrEGDBjQ4GBvo4KJsNXQSDI6IoKJE6rQMwqFgmaUHU0IdS74V7vVfBMcXKtUGjqKtqJWq1+4GKnxaObdMHF0ZBrfSHSEOh1MhK3GlsfrwoOOcfUQXXg3EOpK8OsqQggho4aJECGEkFHDRIgQQsioYSJECCFk1DARIoQQMmqYCBFCCBk1TIQIIYSMGiZChBBCRg0TIUIIIaOGq2MghNoJqVaTJNk61yIIGq75h1oJJkKEUHuoelpQIKghW6kXigZqN09rc0f7VrkaMnKYCBFCba46vyhVQN5hv6EiWK1yQRYpG5hzKYAstnByaJULImOGzwgRQm2rOr8oJU99hx3ZWlkQABQE5xY7Ku2JvKawuLWuiYwWtggRQq1Ao1bXlZfrPwKUSWTpxaw77CgVwWzdT1QQnFusKHhyyU+Rx+Q0lWKZPB7bwqJ1Px11JZgIEUKvSqNWF6Q+SauxkRBm9d5SAl3A9m31LEhR0Di3WFH5hY8Z0NQYHHd44u+r5NlYt0UMqAvARIgQeiUatbooM/+ByDWDE9z+n66gcZ6wezZdR6DxJDMu+QNpYmPTPlGhzgWfESKEXp5GrS5Kz30gcs1gGyALNlMdzTSOFZWeUSMprzB0LKgjwhYhQuglUT2iD2vdMw3RFmwRKhdCxiXz/GoCCABgsQhnH2c6m23o0JDhYSJECL0MjVpdkJrzQOSWzurTKXqW6mimV9mjOEoJ9ZJfVzYgMcmzlwfmQoSJECHUYlRb8IHILYMdDBqNocNpLhXBEtP/N75UTLfUKOhEUoJHT8yFxg4TIUKoZbRtwY78XLA5ilhetxQASQlufs4ErX6zlsZk0lmtNvERdWSYCBFCLfBcW7DzK2J53VIQVcmZAES9t0zJWs9ARw6fb5DAUHvCRIgQaq4u0xbUVcTyLAJP/XJTdbUy5bJfEGAu7PI6xUNuhJDhdbG24AuJ6ZY3GJGZqSUyodDQsaC2hYkQIfRiz7Jgh54v2OrEdMvrdMyFXR8mQoTQCzzrETWuLEihcmFGCubCrgwTIUKoKcbWI6rvf32kmAu7LkyECKFGadTqQmNtC+oS0y2vM7Bd2GXhqFGEUMOwLahLTLe8AZGa5MsmjAKqhMtjOQd60Bj4V7TTw39ChFADuuRMiVckpltepL1BAzX10qX28YCkTLeenpgLOzv890MINUBSUppY42CQnZU6Mg1B1wCdOs5lBxFSAMyFnR/+4yGEGkCSpBAsDR1FR/eEHURKAZIyHT3tgSAAgMbjGSQSlUq1c+fOhw8fBgQEzJ8/n8Ph1Ktw+vTp1NRU6pjFYi1dupQ6rq2t3b59+5MnT0JDQ2fMmEHTW2rOGBhdIkxNTT1w4EB6erqFhcU777wTFRVl6IgQQp1YLjtIXcd0TC6kXrqWFxgkjIULF6akpMyfP//PP/+MjY09fvx4vQoHDx4sLi7u168fALB1FhkfPXq0paXl+PHjN27cmJGRsWbNmnaNu2MwukS4ZcsWCwuLKVOmCASCCRMm7Nu3b9y4cYYOCqEOhyRJQ4fQaeSzfPPBlzq2V99s/wCKi4v37duXk5Pj5OQ0ceJEe3v7jIwMPz+/etXGjh27ZMkS3ZJbt26lp6cXFhayWKz+/fu/9tprX331lZmZWTvG3iEYXSL89ddftccCgeDQoUOYCBGqR1FbKxDU1jBsDR0Iapa7d+96eno6OTkBgJmZWUhIyM2bN/UT4fXr1ysqKnx8fCZNmkT1ncbFxQ0aNIjFYgFAYGCgiYlJYmLioEGD2v9HMCxj7A7WEggEjo6Ohjr3vewAACAASURBVI4CoY5FWVubnSy4TgypZVgZOhbULCUlJdbW1tqXNjY2RUVF9er4+Ph4enqyWKxt27b169dPLBYDQHFxsY2NTdMnGgOjaxFqnT59+tKlSykpKY1VKK+oyJFIcgoKAMDLy8vS0qgHDqjVakOH0IF04buhFIufpBbFQriQbt3MHXdJAE3n2Zu3rZFtdisUCtm4ceMYOsNTeTze8ePHaTQai8VSqVQ6NRX6g2VWrlxJHXz55Zd9+/bds2fPokWL2Gx2TU1N0ycaAyNNhDdu3JgzZ87ff//t4ODQWB0Lc3NbU1MLW1sA4PP5DKMfHo13QFeXvBsaleppWuF12lARw7b5nUUajcY4hxo2SH+D39bCYDCXLl3K0xmVyuPxqDvv5OQkEAi05QUFBVQ3aSPXYfTp0ycvL4868cGDB1S5Wq0uKSlp4sQurAv+Z36hO3fuvPnmm3/++efgwYObqMZiscyYTN0OB4S6No1KJSZ5QiY+GuyIaDR6RESEubm5/lvh4eESiYR64JeRkZGRkRETEwMAeXl5+fn51B+62tpaahRMZWXl1atXV69eDQBjx4794osvCgoKnJ2dz549y+fze/fu3b4/VodgdIkwISFh/PjxO3fujI6ONnQsCCHUCrhc7po1ayZMmBAZGXnt2rWvv/66W7duAHD69GlqciFJko6Ojq+99hqPx4uLi4uOjn7nnXcAwN3d/YMPPhg4cODAgQMvX768bds2Op1u6J/GAAhjGyQdExNz5coV7fjgsLCwU6dONVhzcmDgUCbT1sWlHaPruFQqVZfsDHw5XfVuqGSyhAfFl1hjW3QWdo3qGm9x86vM603X+fvvrJ07k1t65cuXZ5aUFDbYIqTk5OQkJSX5+/trx4tWVVVVVVV5eXkBQElJSWJiolwu9/Pz8/Hx0T0xOTk5Ozs7ODjY1dW1pVF1DV3wP3PTjh49qlQqtS+75J8zhJAR8vT09PT01C2xsrKysvrf0F97e3t7e/sGT+zRo0ePHj3aPL4OzOjSgKmpqaFDQAgh1IFghwZCCCGjhokQIfQMTgdERgkTIUIIAECjVAoy8rPAy9CBINTeMBEihECjVD5NzrkjDchj+Rs6FoTaGyZChIydRqnMS86+J/V/yg4wdCwIGQAmQoSMXXGW4K7UP5cdaOhAEDIMTIQIGTuZXF3OMMYVJhGiYCJECCFk1DARIoQQMmqYCBFCCBk1TIQIIYSMGiZChBBCRg0TIUIIIaOGiRAhhJBRw0SIEELIqGEiRAghZNQwESJk1FRyuUKmVBFGt0c3QlqYCBEyXmq5PDfpyT1NXxnNzNCxIGQwmAgRMlJqufxJ0pNbij5FLNyDEBk17A9ByBip5fLcxJxbyuAilqehY0HIwLBFiJAxkgmFqXI3zIIIASZChIyWhmAaOgSEOgRMhAghhIwaJkKEEEJGDRMhQggho4aJECGEkFHDRIgQQsioYSJECCFk1DARIoQQMmqYCBFCCBk1TIQIIYSMGiZChBBCRg0TIUIIIaOGu08ghFCnp1Aotm3blpSU5OPjs3jxYh6PV69CXFzcf//73+LiYi8vr3nz5llbWwOAWCzeunWrts6gQYPCwsLaNe6OAVuECCHU6c2fP//YsWPDhw+/cePG5MmT9SvMnDmTRqOFh4cnJib269dPKBQCQG1t7YoVK9o92A4HW4QIIdS5FRYW/vXXX0+fPnVwcBg7dqydnV1aWlpAQIBuncePH9PpdACYPn26h4fHlStXJkyYAAB0Ov3zzz83TNwdBiZChBDq3OLj4728vBwcHADAxMQkJCTk1q1b9RIhlQUBQKVSiUSibt26US/VavV3331Hp9OHDh06cODAdo68g8CuUYQQ6tyKi4upZ34UGxub4uLixip//vnnPXv2DA8PBwAGg/HWW29xuVyhUDh69OgNGza0R7gdD7YIEUKoE1AoZOPGjWMw/vmjzeFwTpw4QaPROByOUqnUlsvlcg6H0+BF1q9ff+bMmevXrxMEAQA2NjZ//vkn9dawYcMmTZq0ePFibdvReGAiRAihToDBYC5dulR3OKiFhQWNRgMAJycngUCgLRcIBM7OzvpX2Lp169atW2NjY+3t7fXf7du3r0QiqaqqsrGxaYPwOzRMhAgh1AnQaPSIiAhzc3P9t8LDw2Uy2bVr14YMGZKamvr48eMRI0YAwJMnT/Ly8oYOHQoAv//++48//hgbG+vi4qI9USgU8vl86nj//v3Ozs5GmAUBEyFCCHV2HA5n3bp1b775Znh4+M2bN7///ntLS0sAOHfu3M6dOx8+fCiRSObNm2dpaRkVFUWdsmLFitmzZ//222/bt28PDAwsLi4uKCjQdpMaG0yECCHU6c2aNWvYsGGpqak//vijp6cnVTht2rSxY8cCAJfLzcrK0q1PjRpdtmzZqFGj8vPzLS0te/bsqT8N30hgIkQIoa7A1dXV1dVVt8TCwsLCwgIAaDSah4eH/ik0Gi0wMDAwMLCdQuyocPoEQggho4aJECGjQwLU1dYpsUMIIQDARIiQsSEBqp8K0ouZeSw/Q8eCUIeAXwkRMiIkQGWuILWAfpc9VE0wDR0O6rgUCkVJSYlKpdKW8Pl8KysrA4bUdrBFiJARqX6KWRC9QF1d3fTp07lcrpubm6eOLrwAG7YIETIWGrW6UCC6y56AWRA14Ycffjh37txvv/0WFBSku9watah3l4SJECFjQQCQBIFZEDXtzp07n3zyyZw5cwwdSPvBrlGEEEL/sLW1pZbkNh6YCBFCCP3jk08+2bNnj+4q3l0edo0ihBD6R1xcXF1dnY+PT9++fXUXXZs6deqsWbMMF1cbwkSIEELoHzweLyQkRL+8sT0OuwBMhAghhP7x7rvvvvvuu4aOol3hM0KEEEINqKysTElJEQqFhg6kzWEiRAgh9Jzjx497eHhYW1v36NHD0tLSz8/v/Pnzhg6qDWEiRAgh9I8bN25MmjSpZ8+eR48ejYuLO3ToUPfu3V9//fWEhARDh9ZW8BkhQgihf/z6669vvPHG4cOHtSVvvvnmqFGjduzYsX37dgMG1nawRYgQQugfAoEgKipKt4QgiGHDhnXhmYWYCBFCCP3D2dk5NjZWt4QkyWvXrrm4uBgoojaHXaMIIYT+MX/+/GHDhmk0mqlTpzo6OhYWFu7evfvChQu3b982dGhtBROhkUqvqorLzi6TSm15vEFeXv5ddJsxhFBLDRky5MCBA8uWLTt06BBV4unpefz48eDgYMMG1nYwERqj4+nplfn5PyiVvgCZYvGK6uoMV9c3/P0NHRdCqEOYNGnSpEmTSktLi4qKnJ2dbWxsDB1R28JEaHSKJJKnAsE1pZJ6PtwX4LRSGSEQFLm4OJqaGjg4hFCHYWdnZ2dnZ+go2gMmQqOTVFY241kWpNAAZiqVd8vKMBEiZLS2bt2an5+/du3aI0eO3LhxQ79CTEzMqFGj2j+wdoCJsHOrlMnOZWbmC4VmTGaQo+MQNzfaizYSUyqVFiRZr9CCJBUqVZuFiRDq6LKystLT0wEgPz//wYMH+hWCgoLaPah2gomwE0urqDj08OG/lcpwkqwC2CESrRUIPgkLY9KamhXjxOdfZzDeej7tXWMwnPj8No4XIdRxbdy4kTr4+OOPP/74Y8MG085wHmFnRQL8lZh4QaEYQ5LmAO4A/1ap3hCLr+TmNn1ibxubOA7nlE7D8RRB3OBw+nT15+EIoea4cOFCfHx8vcLz58832F/aNWAi7KxKpVIPjcb++cLZanVyUVHTJ9II4qOBA7fY2vZhsSaz2X1ZrC22tktee+2FfaoIIWNw4sSJ69ev1ys8duzYhQsXDBJPO8Cu0c5Krlab6z3qMweQqdUvPNecxVoQEiJXq8vr6sZzuWw6vW1iRAh1EcXFxb6+voaOoq1gIuys7Hm8JACNTqO+GOAXAKDTM6qq/JoxQZ5NpzvjMFGE0DNTpkwpLy/PyMjgcrn//e9/teVlZWXJycnffPONAWNrU9g12lmx6fQgR8dP6XQlAABsBXgdgAewSCRKu39/zY0bNXK5gUNECHUqrq6uHh4e5ubm3bp189AxduzY2NhYXFkGdUSTAgNPs1hBT5/akSRDpbpNkgwAIMm5CsUFpXLV/fvLwsIMHWOzyFSqW0VFFTU15iYm/RwcrLlcQ0eEkDFas2YNAPz11182NjbR0dGGDqf9YIuwEyMIYqyPzw/R0YSZ2XoqCz4znCTpUqmwMzQKM6uqfoiNdUtJmZuXF5qe/p8bNy4/eWLooBAyXuPHj/f29q5X+OTJE3ln+HvycjARdlwqjSausPBIaurZ7OxCsbixajSCkCgUnnrlXiRZKZO1aYSvTqnR7H348JJM9qlGEw0whyTvKBSPsrPza2sNHRpCRmrDhg0LFy6sVzhjxozff//dIPG0A0yEHVSRWPxdbKxpUtKM3NyhGRkHb906npbWWGU+h5OnV5hLEJZsdpsG+erSq6qi1GoHnRImwGcKxb2uuwUoQh3cnTt3YmJi6hXGxMTcunXLIPG0A3xG2EH9Fh9/UCoNfPZyikIxQSBItLbuZWurX/m17t2/qak5olRqZwLeBJByOFYcTvtE2xwlEolALLZks93MzbVr39TI5W568z2cAWql0nYPsOurKSoVkrh+UNckk8m2bNmSkJAQEBDw0Ucfmb7CgHCRSMTW+w7NYrGEQuGrxdhxGV2LsLS0dM+ePUuXLu3IQ4GLJBJXlSpQp4QAWKFU3svTb/gBAPSxszN1c3uNxdpBEMcAPmAwFpmavhsS0j7RvpBIodh0+/bfN28yExIy7t377urV1IoK6i0bLjeVUf/bWDpBWJmZtXuYXZywoCj9qSKeFW7oQFCbmDdv3rlz5yZOnBgfHz9p0qRXuZSPj8/p06d1SzQazZkzZ/QfHHYZRtcijIuLO3bsGJPJTE1NXbVqlaHDaViNXO6iN1neBaCm8Wd+4/z8SlxdE8rKaqRSGos1yty8jWNsge13734jEo0iSTGAKUAZQNTDhzaDBtnyeD6WlvuZzASFos+zypUAa5nMD11dDRlxlyMsKErPVdxiRSloHaiTALUWgUBw6NCh/Px8Ozu7kSNH2trapqSkvPQa2QsXLgwNDX3nnXcWLFjg5OSUn5+/ZcuW+Pj4HTt2tG7YHYfRtQgnTpx44sSJadOmGTqQpthwuZl6C55lAFibmDRxlj2PRyfJ5MJC65wc4uHDXdev705IUGk0bRnpixWKxfy6ulMk2RdgLEAfgJ0AKxSK67m5AEAjiIUDBswxM5vBYm0hiI+ZzMEczpt9+uAMilZUU1yWmqu6yY7GLNhV3b9/39vbm9o7kMfj9e/f//bt2y99tb59+x46dOjatWsRERHe3t6RkZEJCQknT5708/NrvZA7FqNrEXYK1lyulMc7r1DEPGsX1gF8yWKN99QfHPqPh6WleY8f31cqtb37a4uLD9LpU3v2bON4m1IokeQqle8BbAcAACXATwAHAUTPxoXa83grhgx5XF39WCzuxuW+z+GUSKXZQqHuo0T0KkTV0lR6XyXR0UdOoZdWUlLSrVs37Utra+vi4uJXueD48ePHjBnz6NEjkUjk5ubm7u5O79ILMWIibFRZWVmWRJL59CkA+Pr6WjVj0bJWNLdPn28ePNhRVzdEqSyl0/+m0WJ8fd1MTFSN7xp45fHjP3WyIAB8ptEElZTI/f3pr7ygtroZS5g2KLeqaiJJTnz2kgnwJcAIADVB6P4snmZmjlzun0lJMqEwTKPJoNF2EcQbgYG9GxocZHAvfTcMQqPRaDSkps36BkiAtrt4p0M241aYs5TeDvWffbzQOYVsyJAhugnJ0tLy/PnzNBqNy+UqlUptuUwm4/F4Lb1+PQwGo1+/fq94kc4CE2GjrKysnCwtLe3tAcDU1LSdvxBZMRifDR78pKYmu7bWnMX6wtLShMls+pQahaL78yUEgCtBSNTqVhk+ytAb1dIcSrl8pF5hFMAdC4t6F9xz//7sysrpzxrBVQAxKSk2r73m1iEHzrzc3TAIGo1GoxG0NmteazSatrt4p0M041a4KB4PKt7d0iv/h0HftGmTic7zES6XS9156kmetjw/P9/Z2bml19+3b19hYeEXX3xx9uxZ/W2YACA8PHzo0KEtvWyn0Gn+M7c/BoPBYzItLCwMGIOHhYVHswNg0ek1APVql5HkCzNom2LQ6frLUdQRhNvzw3mEcrlMJJquM0TICuBHhWJTdvaMPn30LoCQ0aHRaL179zZvaBxceHi4QqG4fPlyZGRkUlJSTk7OiBEjWnr92NjY5OTkL7744sGDBwcPHtSvYGlpiYkQtRWVRnPxyZPkoiKZWu3G54/y87N5qaEiIc7OP2Vlfa/Ta3cdwMTU9KV3WdKQZJ1K9cI8KlerL2RnZ5WXa0jSy9o6xtubq9Na8rW3319UFK3Tb6MBOMlkzn++q7lUKu2hd+WeACW4xAxCL8Jmszds2DB58uTQ0NB79+6tXr2az2/xhNGdO3dSBytXrly5cmVrx9ihGV0ijI+Pj4mJUSqVdXV1VlZWYWFhp06dMmA8MpVqbVzc1Lq61Wq1KcB1iWRZefnbwcH+Oo++myna0/PXysp3hMLZSiUP4DyD8TebvaRv35eIqlImO5CYWCESWQCUAQzq3j3Kza3BmtVy+fq4uPfl8n9rNHSAE7W1/yos/CgsTJvL+9jYXDM3/7Sm5iuVig+QB/ARkxng6lqvt9aMySzRu3gJgBmL9RLxI2Rspk6dGhkZmZKS4uvr6+LiYuhwOhmjS4QhISFVVVWGjuIf57Oz35NKFz17wD4c4LxCMTwx8bthw1p6KTpBLBowIKmi4tvHj0USCYNO72Fnx2p5c1CiVK6Pi9suk0UAAIAcYGVW1oHaWqqLUqZSncvKelxeTgJ4W1tXSCQ/yWQjn3VpztNo/GWyrxMTPwgN1V5wSWhobF5eVF6eTKm04HCifHz018dxNDXNYTByFApPgIcAuwHyAIoJoseLBstUy+UMgsB8iZC9vb29vf1Ln37mzJnCwsImKvTp0yekwyzT0bqMLhF2NCmlpZufH2bmCOCoVlfJZE2McMkWCnOFQgad7t+tm73O8LA6lepEauq4urrpKhUX4FJu7urCwgWhoS4tGW9y9enTxXJ5xLOXbIAf1eqQ8vIauVxFkhtu3vxYLt+k0RAAJ2prVwCMeH7u/yC9/kyCIIa6uw91d2/6c2cHB4+Njw+Uy6tJciWAF0AGSX6bnc0iyeiG5o3ECQTnMjNdSVIOUEWnv9mzZ5C1dfN/TISQrt9+++369evUsVwul0qlBEHw+fzq6moA4PF4y5cv76qJEMd6GZhSrdYf5mwKIG9kgL5Mpdp0+/bde/eCU1O9k5P/iIs7nJKiTURnHj9eIJF8q1J5AjgCzCDJI3L5nwkJLQpJUFk5TG9dmwiN5qlIdCQp6Ze6unc1GisAS4BZJNmNJPVnZjBJktS7wgt1t7CYGxKSR6OdBxgC4AQQCXBFobiXnV1RV1ev8rW8vPzU1Lsy2Xm5PFYuPyeVnnv4MLO6uqUfihCi/P3331VVVVVVVfHx8Q4ODrt375ZKpVVVVRKJ5Ndff3V2dp41a5ahY2wrmAgNzMXCIu75EiVAOknaNjIN6K/ExDlVVUcVindJcrFGc1OhMC0ouP5s5HRKScnM59uXgQAgl8san32oj0Gj1U87ABKCYNBo+TU19Xps+QD1Ju4KATQMBvFSMxfTKyoWaDS6nblMgJlK5a2iono1L2Rl7VGptOPnnAB2KxRnGt+gAyHUTP/+97+nT58+c+ZMDocDADweb/78+WPGjPnpp58MHVpbwURoGGqSvJafv+fBA41GM5fByHxWLgVYwGC85u7e4BR4NUnmVlbO1GlsEQCrVaqbubn/q6DR6HenWgDIWjIB3NfBYf/zTxZlALEE4cXn6/ekfwbwFkFoH7rWAMxgMkf6+jb/43TJFYpuek1JG4CEgoLn4lGp+CRZb7k5XwChXsMRIdRS2dnZ1GptumxtbXNycgwSTzvARGgAQrn8+9hY87S0FcXFK0pLY0gymk4PZbOHs9l92WyOr+9oH58GT5QolfZ6CdIaoO7Z5ARrHi/l+XcVAAIAi5aMJRnk7HzVzOwbBqMagARIAhjOYkV6ebHpdCaTWa/9NwCgmM0eyOGMZrNfZ7NDORyfwMBQJ6fmf5wuGzOzG3qF8QDC57fGZtBoUr18qQYgX3kBHYSQv7//9u3bdQcVlpaW7ty509/f34BRtSkcLGMAfz16tE4q1a4jGqZWb6PRYu3tY3x8mt5K14TJLNVLAFUAnGfz9kb4+793797fSiU11FIO8CGDEebm1qKOShpBfBoWdjk3N0YgkKpUdiYmY/383ExNAWB0QMDUhISDSqXNs4+exmROCgwMcXCoqKvTNN6j20y9bG2/Iog3SDLsWckVgDsAvOdX62DQaFwuN0Wh0F1d/xhB+LZ8zglCqJ4VK1YMGjTI3d19+PDhNjY2JSUlFy5ccHFx+fTTTw0dWlvBRNjeSIDCmpqY5/PZPI1mW1nZ2z3055Q/h04QLlZWB0pL39Y5/WsGY+CzAZm+lpayPn0ikpM9NRouSSYTxODu3Ud5ebU0SDpBDPfwGO7hoS2h1gXtY2tL9u4dkZLioNHQAApptLH+/iEODgDQKvtFmLFYPDb7B5lMDeADkAZgCbAC4Odnu4yqSZIAoBHEO717T7pzZ5VCMYIklQB/0Gg7OJzPAgJePQaEjJyzs3Nqauqvv/4aFxeXkJDg5OS0du3ad999l9ORNvpuXZgI25tSrTbTa58xAaB5yxZP7d170927p8TisUqlmCD+YjIt7eym6MxM6GVr2ysyskwqVWo0k0xMXn257Xr62tn1tbOj+ir5TbZfX87EwMC7SUk/K5UyAC+AIoDpLNbcwMC0qqpjSUmgVJIALDb7zV69Ph8y5Ehm5o9VVQyC8Le3X+np+RKTJhFC+kxMTJYtW7Zs2TJDB9JOMBG2NxadLgJQUsnvmXIAdvNWBOUxGJ+GhaVXVZ2vrGQzmeOtrZ1NTeVqdUZVVaVM5mBi4mdpSRDEK3ZRvpBuCqyWy48kJwuqq2kANAZjhJ9ffweHl75yiIMDh8GYk5pKKJUaABMud26vXpV1dVcTEv5WKqntejPl8il3707u3/+FbWiE0EtQq9Xnzp1LTExkMBiff/65XC6/cePGwIEDX31Ti44JE6EBhLq6fpab+7NKRT34kgMsYDAivb2bfwV/Kyv/Z2t1JpWVHU5KGqlW+6lUDxiMw2z2vJAQhya38G1FIoXipxs3Nsjl1LT6Crl8flJStVQa0+TWiU3rYWPTIyJCTZI0AOrp5u/3719QKrXj2HwB/lQo5qakLBs0qBV+BoSQDolEMnLkyPj4eCcnJxsbm88//5zFYi1atGjVqlVvv/22oaNrEzhq1ADG+viUu7r2ZbE+ZjIXMZnBbLadj8/LjbSsqKs7+uhRnEz2k1L5AUnuUir3iMXb797VtHw++8u5kJ29/FkWBABrgP1K5fWcHOUrb1BHJwgqC2pIEnSyIMUPoKbZkyWKJJLj6ek74+NPZmZWyWSvGFin8xKLGyBjtmnTpuLi4qysrB07dlAlBEGMGTPm2rVrhg2s7WCL0AAIgpgQEBDt5fVUJGLQaF+am3NfdnO7WwLBZ0qlpU5JL4ABSmVmdbV/u+wk/KSiot4SayyAfgAFYnH3hvaLeQkEQTQ4C7KZmfZiTk5CTs7nCoUHQHJZ2bq8vJFBQf0dHVslto6vrrKqolopZrZ4LwJktO7cufPhhx86OztnZWVpC11cXK5evWrAqNoUJkKDMWOxejR7bUyhXH44OVkgFBIkyWAyx/j797GzA4AqsdhX7/t+kFqdV1fXPlN+aA1lKVWrdjUQACYcTqZCoTtL/yaAUzMSbZFYnJiTE6dQUL/ovUhyvEIRmpISYGNjatBtGtuHrKoqI70ijhEpp3XNRzuoLdTV1en3IhQVFXXVB4SAXaOdgkihWHfjxuLS0hSZLFkuPycWJzx6dCU3FwDMuFyBXv1cOr0txnM2yNvW9vjzk/ykAAkE4dyq28q/1avXRBYrFoAE0ACcIoh32ewJzRgp86C4+H2lUvfrninAZLU6qby8FcPrmGRVVelpFTcYkRK6ITeXRp3O4MGDf//9d4lEop1/XFhYuGvXrq66Ky9gIuwU/puVtVIu1251ZA9wRKm8lJ2tJskBzs4/sVgKncqFABfp9PbpFwWAaE/PXzicPTQa1VH5BGA0kznK17d1p210t7D4cPDgtXZ2PbjcXlzu/zk6fhoebteM76d1Mpm93ndbJ7W6VqFosH6XoZRIMtLKrzOiMAuillq8eLFcLg8KCtqwYUNRUdG8efOCgoLc3d1nzpxp6NDaCnaNdgJPKipGPv/XnAPQC6BILHYxMwvx8Rnw+PH7SqUbSSbQaHtYrJnBwUxaO33F4TEYX4aHn0xPX1dWRpCkKZs9JjCwLdKwDZc7r+VbwHQzN39Eo0U9P3LnAZNp//yoWjVJXn36NK24WKpUullajvT1bbcmdRtRy+XlhK2U3jqPaZFR4fP5d+7cWbNmzbVr1+Ry+d27dxcuXLh8+XJ2J/9P0QRMhJ0BQegPDNE82/8owt29h739/eLiKxKJjYXFSkdHdvvOK+cxGB12Pt9rTk4/PH48Ti7Xzk25C3Cdxfpa5+msXK1ed/PmOKn0c5XKAuCKWLyytHRGSIg3HweYIGO0fv16V1fXNWvWGDqQ9oOJsBPwtrY+VVs7S6dRKAFIJojJzxYe68bhxHTvbqDoOjQegzFvwIBJDx74KZXeGk0SjVbC5S4KDtbtuT2fnT1LLF78rNU4gSSD5fKxCQnfdt0nIgg14cyZM2PGjDF0FO0KE2EnEOPtvbq4mCeTvUWSAJAHMJvJHO3nR8PNFprB3dx8ZUREXm1t/aGtBAAAIABJREFURV1dlImJ07NvD1rJxcWbnu87dQOwVqmEcnln7yBF6CUMGTLkzp07ho6iXWEi7ARMmcwvw8MPpKWtKi+nAfDY7LGBgQHtNRymCyAIwt3c3L2R6RZyjaZ+bgQwb+Emjgh1GZMnT3799dcXLFgwadIkvs4DAgcHB8cuOgEXE2HnYMpkTuvVy9BRdCZipfLvtLTsigo1Sdqbmo4LCnLWawtSnM3M7kilYTolKoBMkpzSddfaR6gJmzdvfvz48ePHj//zn//olq9YseL77783VFRtChMh6oKq5fKfbtz4Ti6fQJJ0gHiZbP6tW2/07RvY0AoGMX5+H1ZXH1co3AAAQA6wlMHo7+rKaK+Rtwh1KJ9//vmcOXP0yx1eYTH9Dg4TIeqCTqWnr5HLxz0bXhQCcFahiE5KWjVsmH5lNzOzSSEhYx89slGpLADSSHKwh8frLd/EEaGuwdXV1dXV1dBRtCtMhKgLyq6sHP38zEt7AL5aLVYqG1xZzdfS8tuhQ2vk8jqVaiqPR+AoJGTcSJI8efLkjRs3SkpKHB0dhw4dOnLkSEMH1Yaw8wd1QSSA/lRKuUKxNyGhRCJp7CwLNtvexASzIDJyQqFw8ODBb7zxxoULF0pLS8+cOTNq1Kjo6GipVGro0NoKJsL2IFer75eWnn/69FF5ueqV9ydCL+Rsbh73fEktgJIkV5SV7bh5M9kIFhpVSOsUZNdfVRy1hR9++CEvLy8xMTEpKenixYupqanx8fGJiYnr1683dGhtBRNhm0utqPj+6lVNQkJoSoro4cNVV6/m1NQYOqgubqy///ts9sNnL0sA3gH4HCAC4IJCcTApyYCxtYPaktKMXNljZgdd7gd1cPHx8Z988kkPneWi+vXr9+GHH967d8+AUbUpfEbYLDVy+cXs7AKh0JzN7uHkFNLs0VMihWL/w4fXFAob6rVSmadUjoiP/3ro0HZeCM2oOJqavvfaa4sTE0uEQhuSZAAsB6AecdgCuGs05XV1NlyugaNsG7UlpelZ4pusKBnN5MW1EdLj4OCgUqnqFapUqq46iRCwRdgcGZWVP1+//vrTp39WV39fUiJ48GD5xYtCubw5594rKpqvUtnolLgBTFAqHxlB75xhOZmafhwWZsrjnQe48SwLUngAyi46Wb62pDQ9SxLHisYsiF7asmXLfvnll1u3bmlLrly5smfPnsWLFxswqjaFifAFSIA/Hj26KJe/TZIuAH0A/gAYJZevio2tqKt74enVEomP3kNBf7W6svEhG6gVufL59ZaKUgKkkqRtF91itCCn7CZrGG7Di17FrVu36HR6WFiYm5tbv379nJ2dIyMjORzOkiVLoqOjo6OjN27caOgYWxl2jb5AoVjsp9HU6wldCJCsVB5PTZ3Xr1/Tp5tzuU8JAp4fyp9Dp/O7aL9cRzPS13dZRcV+uTwIAAAkAIsYjIHu7rqT5UmA24WFD/LyhHK5o7n5cB8fl1bdVbg9kSQoCPzVQq/E2to6MjIyMjKysQo2NjaNvdVJYSJ8gTqVykpvZ1crADpAvlD4wtNDHB03ZWdPVSi0y1yWARxgML6ytW3tSFED7Hi8uaGhcx890shkZgAlBBHp7T3UzU1bgQT45e5d/+rq/1OpnADiJZJPKysH+fsPdHExYNgIGdCUKVOmTJli6CjaFSbCF3AwMTmsVxgP4A8gaMbpVhzO6z16DExJma1U+mg0yTTaH0zmlD59eAy88+3E1czs88GDlRpNnUplzmLVeze+uNinunrbs6EBgwGuKBT9MjKC231bR4SQoeCf4xcwZTLtrK1XFxd/8WwjXAHASoCvAR6ZNGs8QrCDg6+1dXxJSYJYbG1uvsLOjoNZsN0xaTSmXhYEgLSiouXPD5DjAURrNI+rq3s0tDApQqjrwb/ILzajd+/tCsXvFRWRAJUAyQB8gI8IItjcXKXRNGdpZlMmc2gn72rTqFQFmfl1svoDfwgCHFz4JjadNWco1Wr954HmJCnvosNKDUKmqqxVFgGQpkxHLqOz/qp0arGxsbt27SIIYs6cOeHh4fXeLSgoOHDgQGJiIovFGjNmzPjx46n1lQ4ePJiQkEDVYbPZq1atau+42wsmwhdj0miLQ0MflpbuT06WyOVfk+RYADVJHsrP/76s7JOwMLOGmhpdiUalKkzNvV/nW8Kon87ppCok45Y/STK7WbFotE63PpmjldX18vLA5x8DX6fRpjSyeSFqERLI3Jo4kYJQk5MBaHTisBkz2YM/hMDx6u3o3r1748aNW79+PUmSY8eOvXTpUkhIiG6FnTt3FhYWjhw5sra2duHChQKBgJopcfr0aZFINHDgQABgd+lNqjERNldfO7sbT56slclCn5V8plZ7SKX70tJm9u5tyMjamEalyk/Ovif1fcLp2WCFw3KXsvupBF1K0GSuZrT3ezp1oskJQ9zcVj992k8mo/4waAB+otE4lpba6fb5tbVFYrEFm+3F5zM79sZMSrFYSdLJjvRdpFicIJQP0ZA/UC9V5Ps1in8V1F51Metv2MCMysaNGxctWjR37lwAyMnJ2bx58759+3QrfP3119qvsGq1eu/evdopg5GRkV14+qAWJsLmIgHKa2tDny+cQJJfV1QYJqBWQZLKujrQGxarW6Ewq+CexDebFdhgEigQ3y+XuqrJY6AxAYAU+Y3lcVPXhrhqh6UQBMHowHnRlMn8cODAjxISVBKJA0E8JsleTk5z/P0BQCiX/xYfbyuV9lerC+j0P2m0yb169eioA8eVYnFWcv5tejjZkRpbFbInGvKkbomG/KJKthsTYXu6d+/ejBkzqOPw8PAlS5bUq6DbkVNYWGhvb699efbs2czMTG9v79mzZ1tYWLRDtAaBibC5NCSpv2E5DYDWRBbp4DQaQWp2iYipIZr6NcglA3LZAdDQWuEaUlFRJ1CT57UrM5AwWKj4YceDb4bx/te1SNPIXW3pdt7u0JFaKrrsebxlYWEylapGoZjG5dIIQkOSdSrV1rt319XWDqP+fdXqCoBhCQl2gwa9sL1bq1DcKiysqKmxNDXt7+Rk3fZzRpVicVay4DoZXs20f3HttlSjeFooTlNppHSCbcvzJEk6QL0uNQZZvwS9KrFYLNSbzUUQhJOTEwCUlJRYWVlRhdbW1iUlJY1dJykpacuWLbGxsdTLvn37KhQKExOTM2fObNq0KSEhgc/nt8kPYGiYCJtCAlTL5eYsFp0g6AQho9HEAKY6FQoAuJ30AaFGI0jNfljjksYOeXHlRtSpKgEG1FufiIThaeqfgfm/Rc1opLpv6Y2e8LQj50IA4DAYHAaj9P/bu+/4tqq7f+Cfc4e2ZMl7jzh24jg7ISEJ2aGBQCCUkR+jLdCG0TIfSsfTlvG0KS20tKRQNhQoLS0zbAgbEiCTDMdJ7HjvLVv73nvO7w/FRrbjxI6HZPu8X/7DOjr36kiW9dU943s8nhf27nW6XHrGmhWlhLHlQLDRscCdgcDLZWUXTZlygvPsbWh4Ze/e6wOBaYwdJeSBkpKlkyYtCVm5OOQUt7tof8WQR0EG1uA50OApoowIhMWbJsabphGc6C9Y6drR5LFo7HUgA2iu6ribYTegAKH7YFAC3xC2c/zwBQJLly4VQ1b1mEymTz75RBCE//znP7/97W971NfpdEeOHAFgNBr9nSkhfT6fqY9vcsXFxeecc85DDz00e/bsYMmtt94a/OXHP/7xvHnznnnmmd5Xk2MDD4R9Cng8f62qyjx0qJqxtOjo9dOnr5o48UeHDj2lqsH3UStwlSyfnZcX5oaegqGIggAIEYDeueJ8QshugJSIu/WLMRpiYZvf/7etW5/y+4Md4G7gp0Ad8OvOCvnAox0dJziDR1Vf3Lt3q9/vAAAsZuzSQOCMw4cnxcUlDFv/cFtdyy5tRqt+iK8Fi9s+6AisoOxFwAh4q113tgc+yLGf2Vf9gNbe7G3V2JbObw4xGtskkK8IuZexX3VVE8gmh3587X4+VHSS9MADD5hDVm1FRUUJggDghz/8YXAI8LjS0tIqKiqCv5eXl6cdbwZ7WVnZqlWr7rjjju9973u97xUEYcqUKbW1tYN9DpGKB8I+5TP2iqoSVQWwub7+N1u3/mbZss+A2UVF+YCbsUOaZhLFDw4frm1vP3PChP6so4gIQxQFARilOIJPgW7XyQL5t92Q0O0BO2NhvlpiNB/rYDbZLfoIG3J4r6jozkCgaxjYDDwInAbcCgQ/e2oAi6F3B/m39jY2XqyqjpASPXCDonxaU3PuxInD1GwGqGSItx50KzVuJZmyezsLjJTd61bOdys1Zvn4WxB0KJUaW4/ul4yU/Vov/lRjW1V6KSBIwn9MUnWqdcXQtnacEARh5syZtoHPZ77oooueffbZSy+9FMCzzz570UUXBcuff/75lStXJiYmVlZWrlq16vbbb9+wYUPXUYyxurq6pKQkAJWVle+///5DDz00RE8l4oySz+5wkENGkM9nbI3P93Vt7fLMzN+tWjUhP78C+Bul232+V53OiUVFv/vsM2+vjUsi0dBFQQAEQqp1liSsAL4BALgFcp9OfDremN/zYYm4W7/4/Zb8Nysygj8H99f7WlsH34YhVNHauqL7iK8IzAMKAQAU+KMsn5Z+oquZdr8/vdcCxFTGXP3Izx5ROgJ1Kr24R6FK17cH+hxeYowCvb8lWGy6lBx7Qqrl+RTLszn26FzHd4QTjklzQ+4nP/lJS0vLnDlzZs+e7XQ6r7/++mD5hg0bDh48COCee+6pqKi4//77s7Ozs7OzFy1aBIAxlp2dPWfOnCVLluTn51988cXf/e53w/k0hhN/R/bXSk17srkZyckCIe8fPvxuIBD8RLQAP9c0h8fzTlHRdyO8m3RIo2BQjCHHKNmqOjb4tDaByNH6tCTz+YQcJzkZJWKt/turolYtkRR8ODkfBoejd+WwkASh9+BVM1AIlAIP6HQ5GRmTTtjaeLN5nyxDUUILDwhC7GjL4s3AjvctmQB9Tg0zywkieVtl3abaC+Qdq85hlhPN4Z7FM55FRUV9/fXXe/bsIYTMnDlT6Oy7KikpCU6i+dOf/rRx48au+sEKgiA0NTUVFhb6fL5JkybFjulESzwQ9pcbkCQJQHsgEKWqPa4LrqD073V1ER0IKa0sOLrLmVY4dFEwyCQl5DoSTl6vO7do/wwrWcFHk/NhjIxYmJeY+ILTeXvI/Nh2YKckKQkJdrP5kuTkVIsFQEDTdjc0tPp8cWbzjLi40MWF02Ji7pKkA4oytbOkCnhEln+ZkjKiz2TQrLpESXhZpZeHFkrCS1Zdn39ooxRvkva6lHsouz34wULIv3Ti6w7DumFvLncygiDMmTOnR2HXMgmTyXTcGTQmk6n3UWMSD4T99awsn5aYCCBwvKRcRkA53gKD8Oqoa6gubSRgABhjh+nEIY+Cg+EW7Z9jBSn4cFJkxMIZiYkbDx8GcD1gBnYDVxFy4dSpC1NTu+oUNjc/v2fP+YqyWNMKJOluSfre7NmTOuemS4Lw4/nzr9i5c1ogMEtVD0vSVlG8cvZsizzEY3jDzSKnmKT3XMpdlP0voAMCAvm9USqxyGed4Kgc+4pq90fN3ieBGKDVpotPt67hSWS4yMcDYZ+cqloITAYqgbtk2R8bG+wWcxgMR3tNCf8aSImw7q+O2vrCYvdW3RqVBJdtkSGfUjF4ndeFH0bCdeF/9u59ntIdwLmAG8gBziKkNmSaqEtRnt+9+2O//9hlkarerKord+361fLlXduJJFssv1m6tNjprHC7043GVQ6HGMETZU8gx3FmrfurJm8+ZZJA1FhjdpKp25RRBlrv2d/oOUoZEQgSzZPijFNSLXNTLXM15hcJXyzIjRo8EPap2GjcYLG0alqMwbBwwoRzk47tzisSsigj49qSkgc711GUAj/W6b4XSf2iHbUNhcXuL3Rn+oVI36bVLdo/x8qwXxeqlLa5XMuB5cDPOgu9lM6vrb2g8y+7s67uB4oS2jmYDFyhqrvr688I6fwkhOTY7TkjsvSYqarL6VaGIeoQCMnmWcnmWX1VONL6nltZS9krgAHoqOr4WUfgswlRSwDwKMiNLjwQ9skoy1dkZ8cfb83NObm5H8ryrOLiHKAd6JDlBRMmfHj4cJPHE2cyLZ44cWJY8y8ErwVHRRQM6hovzM1VJcOxz1DZZBJGcL8qn6Y5el26GQEtpMe7ze1e3qsDfJKmvenuvZhyJDBVLd9fvMuT26wf6THI9kCZR82nrGsRt1VjD7cHlnnVJr6/BDfq8EB4ilZmZa3Mymryeg2S9OHRo0cLC/9PUXKAI+3tv25uPpSZee6kSWFp2Ci6FgwVHC9sPvKNCB8AAVqasSZzerYwUqNrZlmuB9Tu/xKVQOjWIlEmU6kg9Mg2VywI9nAkU2WqWr7/6HZ37lH98ZOhD6v2QKNGb+hRqNH/51Je54GQG3X4OPagxBqN7X5/SUXFO4oyH4gGTgfeU5RD5eX1Hs/It6ejtr6w2DXqomCQW7Tv0C/7Sr/iK/2Kbfozv/ZOKdt3lHZfijB8CHBaaur/imJXlPMA18rymSFfaOYkJj4py6GLH5uAZ2V5dsKAJ80OEtO08v3F2905YYmCABhjQO9FMgLre30Fx0UsHggHa29Dw5WKEvo6isAPFGVvQ8MIt2SUXgv2pUw/ZYRj4brJk6vS02frdLfI8gad7jS9ftLkybNCgpxNp7t4xowz9Po/CMJmYKMgLNHr18+cOfKTQlWPp9ptCVcUBGDTx4rktR6FovCKpY+8MxwXyXjXaJ80t/uvNTX20tIlEyeentznv3dAUey9NqBwMOYfqY/voI66+sJi19axEgWDyvRTmFcg+w5kjEgfKSHkovx8V25uWXt7kiiusFr1Ys+Lnunx8ROXL99eU1PgdsfZbL9KSDCO4EBmKEbC+S02SjfBIL3hVf9M2c2ABPgEcrdFbjFJfU6u4biIxQNhn6YS8pKi1CrKr/bt+0d9/ZWzjv8fnhQVtVWSLuyeX+1zSUoZwUSaHXX1hUWurbozfULk7vx3asr1k+EFRioWArDI8tSYmBNUMEnSGcnJUpjiX+SY5Di7xv1Oi/cRCkkgmsOQYJHTPGq9SYrHCTep4LhIw7tG+xT8V04CnlJVtbGx1Ok8brU5CQlb9PoPQkreIeQzg2HmSO3g6nc6C4vdX+i+M/aiYFC5fvJXI9tHGvk0v19lx8ljN5IEIqVaTpsed1Gu/QyRiM3euDLnlCOt7QeaX/Oqo3m3am78Ge/favvpskDg48bGrONd5ImE3LJw4cY9e37V3j4RKAKsUVE3z5wpjNQyas3vr0Hy0PaIdgQqq1wFCnUJRBdrzEwwTT35McOpTD8FXmDfwZGcRxqx/G1tRYcbD4grw90QAKBMLW77KEA3A1MBgEGlhUWta6fGrhMiL4EDxx0XD4T9YgDUXrsKdHHo9TeefrpHVRs9nrNNJtMo7zSrde+t86gafQnIBjpqXPe2+l6dZF8T3laN8HhhxPI5nUcK6j4TVnZI0eFuCwA4AyUqu+hYFDwmT2WXt/r3xRgmh61ZHDcQo/sje8S8K8uZ0Sf53DFJUsbAtwqLNCr11XvKNLqv871hpey3PrW9xV8Uawzz51q5fjLxUjaOrwv9TmfRgZrIiYIAfKqLstk9Cimb7VW3hqU9HHcK+BjhSTDgcUHYZzJNH6kxv4GhtLmuzROyL+4guZUaxs7u8Q1JY5e3+RuH6iEGY+TXVESUiqLaL4QlkRMFAUiCTEh1j0JCqnWC7rj1OS4C8SvCPh3WtEWS1CqK+YmJN+flReA0OEZpdcHR3c7UiqHrg2LQjre9qp6xSNlbI6L6SGvc7i/Ly1tdrlib7YyMjFjj8K5doRQ+Yci+9AwJu35CtetJlV0HdM3V8onkYbt+STibxXEDwQNhnzSr9aKoqIzMzH7Wp4w1+3w2na734rPhEIyCu9pSCg3zhjCZh0lKIGQL2MbQQoG8a9WN3GqQkxr5NRXH9UFJye7i4l8EAtlAQWPjHysqVk6ZErpn03ggC+YUc261e75KfwHkAYcl4Z4Uy0SdOOqHCbjxgwfCEzH2L6QplG4+dGh3VVUWYzWa5hKEvISEtZMnxw3b9QEDqgqO7namHjQM8f6COtFm0+na/LdT9jtAD4DgDVl4PNZwXrCCS6mpaN+tUAWgBsmSYsm3yGH46A/7eGGd2727uPjzQCD42NMYOy8QOP3gwanx8TbdcPUKkoi5Lg8VY8iN0qc0ep/xqh6jZIozLuZRkBtdeCAcAk/v3r2soeE5SoNhcyel36uufqixcc3UqfP6TkkzGITStrbAkEfBoKyoRXXufQ2efAY7gcsi29NtawTIAFp9JeUd5SrdDEwAoAQ+OtRytSSwDOs8h2HicDTmBMK7pmJ3be21ihL6qCbgClX9prFxyfDsR994tLwqEOs3ROJqUZ1oTbGMi63MuTGJB8LBavJ6XS0tvwjZkWAu8FOgJhB4oaBganz8MK2mGL7cxgRCknlmknkmZQGBHLu4oZQCqHTtUukOoGvXwBXAEyp9vqy9jBDRrs8atkYdXxhjocfvT+iVWi+J0iM+33A8XOPR8v01xp36pYwnbeG4ocZnjQ5WRUfH4l571C0GDgHnadrB5uawtGpIdEXBIJV6GYsPiYIACoFy4FON3VXt2j/CzQsK1zzSOJvtm1495ztlOdFqHfLHajxafqDGsEO/RCNhzibDcWMSD4SDpRdFZ68kMu2AEYij1NM9B+lQCbjdapiv5lXgOuA2wA/cAtzj11wM4RnBKtNP2e6dXH24fCQfdF5S0nOyXBhSsgPYIkk+Vf2gvPxwa2ufRw5Q8Fpwu34pJbz/huOGBf/XGqyJdvu/CPGETB4H8E/gLOBFSZprNg/5IwZcruL9lTvExUN+5hOTBCMhDUALEA3cA6QBj3TeeRNlv6xx7QrXQFGDlOr3HxnJRzRK0nXz51+2a1d2IDCZ0n2CUCwITNPse/fmUPqpLL9qNF43b55drz/lh2BAU0nlgRr9Tv0SHgU5bvjw/67B0oviOVOmLC8o+LOizANqgE1AJSATctRguMRuH9qHC7hcRfsqPseSVjlxaM/cRaO+Ktee9kA9wCxyXKp1pty5di3dMqes4yyVPg+8Cnzd/bi7m7x542rGRJrV+utlyyo7Ohq93mxFcR848I6iBHuTrw0EtijKHTt23H7GGad8/sbi8v21xl36pbxHlOOGFe8aHQILU1MvX7jwN7Gx2YJwtiAUimK9TrcpNvaG008f2okNistVvH94o2BAaz/Q/EaT71q/tsev7Wvx/exg87tdmwnYDRNy7HlGaR3QAvSYnKJT6bjbnZwA6VbrnPj4wzU1v++MgkFnMmb0eFpOde5MQ3F5Qa2BR0GOGwH8inBopFqtN55+OgMaPJ4Wny/JbB5Mn1hfGquatmtzWvXDFQUBlHfsVOhjwIrgTYa1Cs0qa79skv3sYIlZTs6POW9Xw3OMaUDoZ7QKqAGtPSxryAKCscMLX2urweE4ee1h0Oz15vQqzAUavd5oQ+9MPSfRUFx+oNawU7+MR0GOGwH8inAoESDBZMqLjh6OKAiAMgSEAX+qDohHaemKgp2m+jWlx3oNgUjApu7VNhESr7FhWTxwUgrRfy6tKCxo9A3dLJUBsRsMFb0KywDHwN8JwWtBHgU5bsTwQMj1cNy3hMS6B0KrnAhsAS4BngeeBy4GdgnEpxOHeEy0/9yi/XNpxaGCBm84YuHpmZl3y3Loa7QLaNTr400DW//eUFy+v9a4g0dBjhtBPBCOJqzvPRGHiizqgeLOWxrwMDBXo+4Dza9VdHxN2bG1esmWKZJQB2wAGoBG4GcCmWHTRYkknHsOuEX7Z9LKw+GIhTPi420ZGQt0uicJeQO4TZKuNJs3nDaw1D+NR0f37BjGtEbvgVLntoqO7S6lKtzN4bj+4mOEp6iora2oqYkBubGxOUM9NfS42iqqy9t0Tl38sD5KunVmcdt6lb4MZALXA9HA5wxGhdJG78MdgQenxJxPQExSQlbUpPL26ymbAziAp+36qAzromFtW3+4RftnWMkKPpycD+NQjBe2+f0vHzhQ1toqABa9ft20aX39uc+fPLk2LW1HQ4Pb50txOO5MSBB6LTA9geCq+Z36JXS0RUGVegSIKvMdaf1QpVdStgxob/H93SoXZ9uXgqfC4SIeD4QDplD6+M6d1ra2iwMBAC/qdO/ZbNfOmycLw3h53VJeVVCBr/QrVTK8icQscspEO8ra1ygUGo0Cvuy8R2DsJwHtcJu/yKHPBRCly5wWm+5TmzTqMkgrpGEevOw/t2j/HCtZwYdW47G0PgY9SZmUfgo52Fp8vvu/+OLPfv/ZjAE44vP94OuvV86YMT029rj1k8zmpKxTyTMXXDW/Y7StF2z1FVe6vmEsGdBUVsbYW8CM4F0qPbs98JNGb2GccUp4G8lxJzWa/utGno/SN4uKKpubDbKcn5w8LykJwObCwrOamn7amVbtskDgry0trxYWXpKfH3psk9crEHIKMwZ7aymvKqhgX+lXqiPS8WiRU6bGpDR595V3rOiRTVNj6yrarzNGxxrEaAAEglEa3ivUU+MW7R8J5+oVT/BmnKd63r5Dp5CP9M3Cwns7oyCAXOAtRVlcUDB96dIhbG1XHtHBXQuyBk9Bg7eEUlUUdMmWyQ798KZBb/EVl3c4Nfo1EA3UAd/rioJBGvtFk/c8Hgi5yMcDYZ88ivJwUdGtmvYLStuBx5ua7i8tvXnBgm9qa5/tnlz0Rkofq63tCoRfVVe/UViYxRgFKghZN3Xq3MRTX/Dgb28vqlS+0q8emSjYhRAR6D0kqSl00aGWz3Ps883DtpZxSChEr4jHZmy6RAfzCqeQm7u4peWs7t8FooEESp2BQMwQ5VJvGKJV80da33crKzT2PGADrS1z3txh/Dr0slFuAAAgAElEQVTdOn9IGnlc1a69Gv0KiAYANAO9N1pJVKln+BrAcUOFT5bpU7bTuVlRrqM0F5gLPKooq5zOD0pLRcZ6fASKgNT5cflVdXXhgQNf+Xxv+/3v+v2f+3zb9+7dU19/ys1gmtZBokY4CgKwyCkieaVX8evAhSp9vbx9xwi3Z5DK9FO+8k4tH3hu7t4DXARgvfadODWNxeUFtfpdg86m3R4oc6t5GvsTEFzEmaSx/7T4XH7NOSTtPB6mMbkzCgJIA3qnuCvQh28WMcf1Hw+EfbrE55vcveQnmvZNVZVGSKB7uQIondMi3jl8+FlF6drNPQZ4TlHeLizEaKMX7Xa9XiRXAm0AgADwB6AEOAeYGKDDPn91yJXrJ385wFiY5XB80L2kDaglZEjWiTYWlx+o1e/QL9MGPS7Y5m/Q6GXdy4jG1ruUygGdx6s2VLl2lDi31nu+0Zj/hHUJEPoy2oA84ImQEjdwfawxaUAN4Liw4F2jfYrqtVYhGnCr6ry0tN+WlPw25N6NonhaaioABhBV7TFVMQkIjOwOQUMl07bQKh8ua5/GkAhIwEXAa53XSCT4dMPcxAEa6L72a/Pybm1ufigQWM4YgHLg+7J8/pQhGPQKrpofqvWCjFGgd5+Bjg1kR/tK185mr0+lPwUSW/0769x/zbYvsMh9bjJsEC0uuh2Y11nwIHAJ8ASwBmgHPhZIWuRMoRrn3n///aeeegrAj370o1WrVvW4t7a29oEHHui6ecEFF8yff6xT/Z///OfLL79st9tvuummWbNmjViDR9i4uyJUFOXuu+9esGDB2rVrv/766xPU3Nt9fTSAPUCy2Xxubu7exMQVOt2DhPydkJU63a6EhLWTJgEggHq8GfPDshXTiIgxTjLJMcA/gC+B2zrzi1ZKAkZdFAwa0P6FsUbjLWec8fvY2Kl6/TS9/mKr9czTTjstufdg2MAM+ap5m84hkrd7FIrkDbPc3wsyV6CyySup9DPgfGA+Yz9R6KclbdtOsLVWVtR8WbiUkOeAdqANeAGoBR4AZgJrgU8FIknCwPIJcMPhyy+/vOSSS84999xzzjnnoosu6v2519DQ8Nhjj03oZLMdy5L43HPP/e///u9VV101ffr0FStW1NTUjHjbR8i4uyK855573nzzzYcffnjXrl1nnXVWUVFRbB9T4V+2WI60t99BafDLQjNwo053waRJAiFXzppV43IdamkBsC46OsVi6ToqwWrd5vcvDDnPO4RkhikB5pDIsM0+0nqJSv/VOSfwkCRcmmHt7y4TKvUw0K79KyLBgPa1jzUar58/lFNOhmPVvN2Qo3Nv9mkzGPtBsNNSIL83y61Gqb9/pkZvhUbv7v7lJpniDLdS29dFoV60T405r9r9dHvgD4xpCpUp+wLoGhYoEslek3TRIJ4WNzQeeOCBG2+88YorrgBw+PDhTZs2Pf/88z3qWCyWa665pkfh/fff//vf//68884DsG3btieeeOKOO+4YmTaPsPEVCDVNe/jhh//1r3/NnTt37ty5r7322jPPPHPbbbcdt7Jgte6Ojp7V3r4AcAJ7BeHCadMmdi6mTrZYki3H+XBfP336D7dt+2kgsI5SCrwoCA/q9bdNmzaMz2qYmaSESY6FZe0/CGg+gOhEXYZ1tqkfU0bb/KUVHbsZSwBkgopU64xoQ+4INLg/BhQLh1Bw1fyQ544hECZHr6nseMrp3whYgY4444Qk8/L+n0GhAaDn35SxFJUePsFRomBIt86nlAqCUO3a0+hdqdKbgUSBbJWE5yfah3KRCXfKduzYceWVVwZ/P+OMM/773//2rtPe3n7DDTcYjcY1a9YsX74cQCAQ2Lt376JFi7oO3LJly0g1eaSNr0BYX19fV1fX1f09f/78vXv39lVZIGRNSop5zpwql8soSd+1WMR+JAqJN5l+tWzZe0VFjzc2CoTkxsf/ZuJEvXjqn3pUUSgLZ94yAEYpdpJ9tTCQjAHOQHlZe7VKvwCCCw3byjsuZexIjHH8xsKQVfNDnztGJPpM2yIAlCnCwLMuGCVze+AAkBdaSMg3erG//cApllkxxtY23z/9mmLRWaP1F5DRliJn9HI6nc3NzT0KCSFZWVkA6uvrY2JigoUxMTG1tbU9aloslh/96Ef5+fkVFRUXXnjh//3f/91www0NDQ2Msejo6K4D6+rqhvl5hM24C4Q6nc7UmQfZ4XDU972wob6+vrCjQysqAjBlyhRmNPZzqE8HrM3JQU7ntjyMqeopjhIGnM7iI82HhBWUDmDWw3BgwIDaUNWxV6XvdkZBAHaN/rvaPW+4V3kPSIk8mXnA9h5Iy88aUCzUBp70tbmksqDO+LXuDMoEDGQOy8CJdODnjzPkNPvuUOnSrj8Zwbs6oUwvTD3p373rvaEjUfHGmccKGQY0VWfMYMP2r+r1+2fMmBH6fdThcGzfvl0QhFdeeeWee+7pUV+n0x04cACAyWTyde6L6fV6Lb26srKzs//0pz8Ff8/Ly7vllltuuOEGs9kMwO/3n+DAMWN8BUKbzRYIBBRFkWUZgMvlsvedJjQuLi47Li46ORmAwWAY0PXQkPC3tRUVNn4mrXKLjrBPagp2f/W/vkpVIK17mZ0yPRFAImmKVrlhCnzw794rCj0v90VRSMtL01utxz1QOt6CeqaqlQdLve7jLDyoUuN3GpaASBH05EMYBMeEqNll7YsoO4OyNIF8ZRAbJtpX9eePPtD3xthGhu2l0Ot0mzdvDo1Ger0++MpfddVVV111VV8HpqWllZWVLV68GEBZWVlaWlpfNQHk5eU1NTVpmma32y0WS1lZWXx8fH8OHNXGVyBMTk7W6XRHjx6dPHkygKNHj2ZkZPRVWRAEnSybBriNzlDxt7UdKaj7TFrpEkfpRBvteOsrAhEVBYPK9VOqWC7pNT3SqrUu2vd57vSUvmJhD0xVy/cX73Dnlukm975Xk3RDswh/2Nh06dNiUjxqvUILDFKWQezvRBtuZAiEZGZmdk3p7L9LLrnkmWeeufzyywE888wzF198cbD86aefXr16dXJycnV1dVJSkiAIlNJHH3107ty5oigCuPjii5966ql58+a5XK7//ve/f/7zn4f2GUWOiPtUGlZGo/GCCy548MEHAVRVVW3evPmyyy476VFhUX6o+jNh+aiNgrDIccC73ct2GsQInUyvEUkluh4/rVLC58LSon1V/o6Ok56BqWr5/qPb3bnF+um9T6WSSI+CQYSIZjnZLKcomsurNp5g7QQ3ivz4xz/2eDzTp0+fNm1aIBC47rrrguU/+clPDh06BOCRRx5JSkpauHBhZmbmJ5988vjjjwcr3HnnnR9++OH8+fOnTp06d+7cc845J2zPYZiNrytCAH/84x/Xrl2bnZ3d2tp68803z5w5M9wtOj5VY2456uT1IlW6ba675QaF/pSx9YBIyOsSuSsr6sxwt2tgnFLcZ+oytu/TiZPjQgcRNVXVQrpGCWM1JbXb3blH9dPD0cwhQ1mg1LmtQ1HB5hPSQMinmbb5Nt2Y7RAbJ6xW69atWw8cOEAIyc/PJ52T/qqqqoLXl7/97W+vvfbampqa2NjYjIwMsXNyX0ZGRmFh4d69e6OioiZOjKDR/SE37gJhRkbGvn37qqqqoqKirP3r8uJOgSxYpsZcUON+xen/OwCrLi7Fcp5IRl+eEacU97m6tKGwQICvq5CBke5pEmrJtHL9pBFv3RArbvukQ7mBsasAgAGoL3GunBxtDm42wo1ehJBpvRZxdc0IBZCampqamtr7QEmS5swZ+53k4y4QBh33T871B2MaCOnPUJ9A5FTL3NTRP9HMKcV9qKVqnh0B2qETo2XzGUYxfuxND1Goy6PKx6LgMQkqva/O/cdM24KwNYvjht84DYTcKegIVJR37FapTMAkgWXa5vbI4EWZ6tdaRaLXiQMez49kLc7XZ/pLfsd8mcB+teVGpbrVNC/KPNZig19t7bGhIABgllcdvi0sOC4i8EDI9YszUFbeUa3SLUAqAIUWFbVdnGNHMBYy0MqOHS2+aoKZQLlAyrOiTj9BvuZRxKVU5QZKXmbH+kXnAV9Q71TPDsU4XRbM4W3b0BIFA9DQq7heEoZgqw2Oi2RjrXuHGyZVrm9U+kowCgIAclT6n4qOPcEbZe3bmrxLVFqo0P8odItf+6C4bZdPawlXa4eQ6jt8PfWFlsjA5SzQEagIV5N6U6i7xVfY4PmmI9Bz36WA5vSo9ZSdPMO4UYoVyH6gKrRQJPfHGvk4AjfG8UDInRw7tgtrfPfiSQHNB0Bjfqe/lbK7Qt5O6Sr9a63r4Mg2c1gQ5u/dzxvNNNaP0DIy6j0FBc0flrXPr+i4+KgTBc2bFeoC4FZq9je9crDl6JFW/76mt8rbtzF24oQ4JDtqkSwsJ+RxoBD4VBLOi9IXO/Q5JzyK40Y93jXKnRwB6WMvKQrAr7Udb2xpvkdtHeTjMlCf2qIxn1GMFcO0sx2VUz/yHVzGuj39dwSDQYrv65CR5FKqa93tKv0muEOWSq9W6adFbT/OjlpS1LZDpVuAdAAAa/bdp7HXJkSdKBG2WU6eGnNug+cll/KkLBhijKlWXf6IPA+OCyceCLl+0QmySgu7J2X+1CQ5AAhER9AzjS/QIpBuucI15lc0l1609zMXszNQXt6+g7JpQAzwoV1vz7CePvJ5nKMMU55yb12uObu2cniSCPtFR0I/9t8YAXXuYpXe37lPZNDSgBZX7fpGpfd2RkEAhLKftQf+rVKvJBhPcEJRMCRZZoeWeJS6Vn+1SlWrzuYwTIrA3EAcN0g8EHL9kmGdW+Q8X6UPASsARvCGJNyebvsOAIPoIORDoAb4dqcCgTwSYzg2tuTX2kqc2/yaTJDG8Ildn5huPS0YJilT2wOlPtWll0xRuqyu2OlVG0udhSrdBsQBAFiL70+UvTYhasnIPm8IRIpxXHF1+5tGtTED5AgY0U+INvfc4ztcAtQNZPcqzvUoXwCn9Sqf69NaLMIAJjGVtm91+mWVXg84mn0fVrtezHWs0ot9ZujluNGIB8JI5G1sclMDJRH01dsoxU+JPrPSdadbuYEAFl18muWcrv3HJ0QtONq2XKW/Y1gMtIpkk1HeFmc6C4DG/IdbtgTovzs/l1mz71G/9ugkx1lupeaoc5tKv0vZdIEcEskLmVGnRekyANS4C1X6QGcUBEAou7098JzG/CIZ6UmMOtEa67iUMqWKdjiEKELEsG8G0kUnmDwoC3mhAIDgqCToobUCCd2rN4kkpv8nb/YebvNN1NhTwZuUrfRr3z3aduWUmLWDbDbHRRQeCCOOp7Gp8HDrF7pVLML6oHSiLbuPESaLnDIlZnWt+2G3slESDDH6lGjjmuBdTd5DCrsh5OqEMHadV33Zo9QVt21V6KdACgDKQNmtpc4F+TGxsmD2qW3ArF6PM82vtZmkhF7lI0EgcgQmWEkwTehQfq3Rd0JmKm2XhNo4Y65X/bvGNoXUrRXIfuNAtoxv9JZr7E/dy+YqNEqh7jG2dIQb53ggjCyexqaDh1q/0K3yCaMs/ZssmNOt83uXuwLtjJ3Ro5CyFc2+1zR2STAKdorW2E2tvrfiTTNEogeagB4vQoNIxnLCw1Ng1aUnmFoaPHM0dg1jCSL5SBa25NhX6kRbs2+LW71So7cA8QRfSMJvsmwLeu0HciIqdXf/AwWlqtTDAyE3lvBAGEG8ra0HD7V+Pgqj4AmIggS09ygkaNGYRlnP7YoYy/FpPgAxxlSPuomyv4TcWSKScr04d3ibOwolm2fGGpzOwJsBLWCRHVH6C4LRLtdxZnnHp22+9ZSpRsmUFbVSLw4sjbtOtPm0QqBbYnqGIzpx2RC2n+PCLrI638Y5d6urgEwbS1EQQLQhSSSPdi/zEvKGVZckkCM9KhNSrBcNAGKNUyzypwK5DNgOFBHyhCx8Jzuq55UlF6QTo+KM01Msc6P02cEoqLFAQfPrzd4lCn1ZY++71Q2HW97za20DOm2SOVcSbkFItnFCnjPL0mhMns5xJ8ADYWRhA+m5GhVsukybrlwULgcKARfwuSQsSbXk2fW5InkB3dZdtIlkU7RhIgCv2ujTOhhk4F7gOoJ7HYZ0kxye0cHRqNq1x6fdTNkfgalANmM3BegLJc4vB3QSqy4txWKXhZki+alA7pWEVVb5ryM/cZfjhhvvGuWGXbZ9eZv/aIPnBwHqNkmOJPNMoxQLINu+8GjbEo2tp2ymQA6J5JkM29zg4NPRts8C2rtdCwMoY82+NQ59pZXvjdc/Tn8VY1d2LzvNr6mMaQNaixlnzIvWZ7nUSo0WmaQJBmkAk045brTggZAbCXZ9tl3fc7mbRU6ZFnu+01/gUbcbJVOUfm1waYRHbdDYtO7L44hG72jw3s4DYT8xBqDnOhMCK2WKOMCkBKJgiNJNGLKWcVzk4YGQCyeByA7DZEf3QpV6GEvvVTdF0bwj1KzRTxKNAVoKZIWUBYCGcGWq47hIxscIuYijF6MIKehVXGiQRv8mvyMl1ZIvkquArq0EFZHcEGfi6bM57jj4FSEXcfSiQyfWanQLw5mdZe2S8IsEE1870V82XUaGTansmMMwEzAA2+ONE5LNvXMUcBzHAyEXkXLsK4rbbvNrGRpbJqBSIG+lWWcHp9hw/WSWYx2GNLdSohPkRPMic2RkCee4CMQDIRd+DLTdX+pVnTrRaNNlSoJRFsx50ed41Hqv+qksmC3yeT32suBOrNF7qNpVptK7gclulHYodyWY6pLMM09+JMeNPzwQcmHmVZuK2z5R6TkaWyeQcpH8I9UyLcaYA8AkJYQrs+ioplB3tatIpTuB4NSYXJWuqvcsdOhbDFLEpUvluLDjgZALJwZW3PaxX3sLmIRjqbdvqXQtNMsx/CP7lLUHSjX2/c4oGCSq9IZW/z+T+KvKcb3wQMiFk1up1tjCYBTsZFTpbxq9D6VZ54WtWSOIgTV4Clp9tRrzmeWYFMt0WRjs5FiVKoz1vpKOU6g6yDNz3JjEl09w4aRoLspyexVP9I+PJYOUqQebN9e4pruUl73qtmbvbQXNW1xK9SBPa5TsIumZTU0gX5tkvv6E446DB0IunGTR2jv1NlCsF43D9IiMaU2+g+XtX1W7dnnU+mF6lH6qc+/3a1drbCOQAdgYzlPpB6XOrwZ5WqsuQxI+Aj4LKftGIs9G6/k6Qo47Dt41yoWTWU4WyUsqDof0jnol4bdxxv72i3YEKqpcBQr1CESKNWYmmKYRCJQpXrVRYwGjFBe6c55PaznS+pFKL6NsGdDc6P2bQ1+SYVswxM+q31r91ZRd1b0slbK0gNauE22nfFoCYZLjOyXOG32aHWwqSJEsVGfbVwlEHmSDOW5M4oGQCycCMtG+vLjtXJWeo7H5nbNGp/Zzpkyte2+dR9PoK8AEwFXjurfV90qcaVJ1x36GRYwlEfJJlN6caV0QzDR9tO2zgPYKMC14uEovavFfZvMXO/Th2e+XMaXX5sMArJQpgzyzTrROjl4T0Nr9WptOzNaLcwZ5Qo4bw3gg5MLMKMVOjf2u01/iVf+hF4023VmS0K9+UZX66j1lGt3X+Ta2UPZ/XrWwor2Gst2ABQAYWn1/IHg707YooDlVmtQVBYM0+psGzw/CFQiNcoxP+xJYFtoihoN6sfe46anQibbBXFly3DjBxwi58CMQ7PqJSebZ0Ya8fkZBAG6lmrGze3yZo8xF2aPHouCxkp+3+RspUxXqZUjpdZoUlXoG1fpBSDHnS8JPgJLOAr9Iboo1pg9opySO4waJXxFyoxUD7b5ULqgWyO9eQoBshXboRRtB751pC/Xhu2YySDE59tNK29doNIbBQVAYb8pNMvOUqhw3ongg5EYrk5RAyBawjd2LGdAExIUWETSIZKIkGI2SqiovMnZx5z0eSbglyTw0/ZAn4Nda/VqbTojqPfZplpOmxlygUq/G/HpxKkCGuzEcx/XAu0a50Uon2mw6nUB+CviCJQSbJaFZIPd3r7hHFjzBHtds+1KLfI8kfEcg94rkf2RhVqol2SwnD18j/ZqzsOXNwpbSo20ph1qrC5pf86nNvatJglEv2nkU5Liw4FeE3CiWFbWo3rO/3j0VsAMdFjk63XZBqfN9t1qu0WsBm0C2SMJj2fZVwfoiMUxyrPaqTV51qyQYzfI5Ium5jfsQYqBHWrf4teeBecHbKj1wpHXd1Nh1fCUDx0UOHgi5UYxASDTNSDTNoEzpCi25ju84A2Wt3jtVpth0jljjBQLp9j43SrEjs6NTu79UpauPRcFjpqrs+63+XTGGKSPQAI4Leuutt5588kkAGzZsOPvss3vf+/rrr4eW/OUvfzGZTE899dTXX38dLDEYDA888MDItHbk8UDIjQU9LrCidJlRuswwteVbXq1dY+f2KKTsNI/yaUzvWT4cNzy++OKLK6644tFHH2WMXXbZZW+99dbChQtDKyQlJc2Zc2yl6fvvv19YWGgymQB8/PHHiqKsWLECgE43lvdB44GQ404FAyUQAFAW6AhUBqjLINotunQSMs4nCzpC6hjrdiBBnSwM9/8d82ltitZhkKIHn8KbG+02bdp00003XXLJJQAKCgo2bdrUIxDOnj179uzZwd+fffbZq6++uuuuhQsXXnPNNSPZ2rDggZDjBoAytdb9TZO3lMFI4DProtwBJ2UXaGyiKGyXyKs59qUGKSZY2abLFMkzKrsR6FocqYjCgw7DacPXQo/aUNK2VWUTgXSCXUYpMCHqjP6vzuTGnl27dv3whz8M/r5o0aJ///vffdU8cuTI9u3bX3rppa6SV199defOnTk5Odddd11cXFxfB452PBBy3AAcaX3Po15B2f8AElDa5lsL7ADsADR6jYaDRW3nTY29MHixKAvmVMukKtfpKv0NkA8US8LdiaZkveg4tUdXqLuifYdLaWEQREJTLFOjDd3WfqjUU9T6mULfBbKPlQReP9L2yynR5w3ueXMRrbW1tb6+ZwZ5QsikSZMA1NfXR0cfW7cTHR1dV1fX13meeOKJtWvXJiYmBm8uWrSIUmqz2V577bUZM2bs3bt3rMZCHgg57uQoC1R27GzxH9XoacDPOov/C/w8GAU7TVHZMlegyqpLD96ONU6y6hIbPA/7NLdeNFvk1CZvbZP3VVm0JZqzewxkKtRd7znoUTpkwRBnyrDI3fLgaNRX2PK2ov2V4VwAKlrK26/xad8km2d21Wn0HlLZ7V1READDeQHtSY9ab5J671DIjSZev3/GjBmC8O2aN6vVunv3bkEQ3njjjXvvvbdHfVmW9+zZA8BsNnu9x/Y183q9Vmvv9LYAoKrqP//5z8cff7yr5Lrrrgv+cvnlly9YsOC55577n//5nyF8RpGDB8IIwnqMJnER43Drex71JsZcQHxIcSWwtEdNyqYF6AehJXoxKrjJcI1rT0WHS6WPAnk+rcSr/Mpu2JppWxSs5gyUlzr3aPROhtlAnTPwB7u+rOteAHWeAwr9RTAKAgCiNfZCg2dKoim/a66QR3Ez1jO/NmULfOpXPBCOdnqdbvPmzRbLt4O+BoMhGBe///3vf//73+/rwLS0tLKysiVLlgAoLS1NS0s7brW33nqLMbZ69eredxFCcnJyGhsbB/scIhVfUB8pfK2t1bWeNin+5FW5U9XiPVLU9mlhy3uVHdv7n2K0I1Du12Yxdg0gAaGbvCcCFT0qCzjSNT+FgboClc2+ApdSHdCcDd4Glb4HzAT0QJ7KXmnz6z1KHQDGtDLn1yrdyvD/gFxgiUrfbvXFtQfKu87cHmhirMfEdwlY4FWbvr0tSEBT9zogqJUEPkt11BMIyczMnBAiOblfuSDWr1//9NNPa5qmadrTTz+9fv36YPmjjz5aXf3tLtBPPvnkVVddJUnHro4YYyUlx7LgHjly5J133lmwIGwblg03Hggjgq+t7VBB/efSSq94/F4LbpB8Wsv+phdL22Oc/sfcyhsNnh8WNL/jVmr6c6xLaVZpMAItBjaH3HMJsKkrrw0AoEog71rlNABupe5A06vFTkNZ+9LiNlrY8o7GzgS6ZdNW6YZWfxUAt1LDsBToloBNY7c2eatCCgig9WqdGpqPJsaYLgp/AUK7FpwCedsip/bnmXJj0vXXX88Yy8vLy8vLEwTh2muvDZbfeuuthw8fDv5eX1//7rvvhl5WMsZmzpyZm5s7Y8aMOXPmbNiw4bzzxuxIM+8aDT9fW9uhA3WfSytdpzqHgjuxateeek8xZf8P+F2whOEyhS4uca6cFnvhSQ8XCAGCQyyzgFjgFuBuIApIFIiNYRpwC2OZAtklkucm2hcTImrMV9z2uUI/BtIAqAzAIeB84O7uicJtGqMAVOanrHeHVaxKA1037Po4j/oqYzeHVPABX5uk73bdtsgpMYaqFt+ZKv0VkAbskYS7MqyzeSKb8cxisXzyySdHjhwBkJv77eyqhoYGo/HYdOLo6OiGhga7/dsBb0EQWlpajh49GggEsrKyQrtkxx4eCMNM8/uLCmo/l850ifaT1+YGrj1Q3uAllE0BeiyHStNYll9r05/slbfp0iThWZUGJ6A/BjwLnAtU6UQ5yTzZrl/d5n/bp/rMssWuXxfMYtPiK9bYNcEo2GkycC7wPvDt12qBfGSVowAYpGiB7KA9VxzuMsvffvokmKY1eR8MUAtjVwECUC6Sq5LN+T32bEq3zo8x1DR67vZTj0myJppX8KWEHLqHwKDQ2CbLcmgUDJIkKTjvdMzjgTDMqKJ0wMaj4PCp95Rq9EHgp0DvC+5ojflPegajFGvXH271X6rRe4E0YJVIttgNLMu2OFghzji9xyE+1UPZ1F5nmkXIy4x1BcJ3ZOE1u34dAIMYbRC/crMXGPt/nfeWicLd8aZvZy4IRJ4Sc151xz/bAn9kjMiCLs06w6o7zsQHs5xsjhrGTOIcN8bwQMiNcZs54/kAAAsnSURBVIrmBjKAPGAHsCLkHgbs04tn9eckmbZFUf6jte61KnVLgjnBODHGuPgE9XWijpDKHrOABVJmkr7yaZOBHKDcLOkzo87qup7Lcawodf7FpdwPzCWoEsjhCVELe1zMiUSXbjs9vV/Pm+O4/uKBkBvjdKLFoxYDNwJXAq/g2Cb1VCB32vUxIulvBkWHPlsvmFv9VQpVKfMzpp1gH3mHfkKt+0GVfT8kp4xTIM9OtJ8jEjlA23VCXo/DRWKYaF+hULdPbZbFJIM4he/KxHEjgwdCboxLNE90KT9X6QfAn4DvAmmAleDTWGNmmnUA08HL2re1+UWV3gDEtJCPaz3PZ9vPcAXqPYpbL+qjjVkG8ds5nzrRlmbJrXTN1ej/MOQS7JeETRm22cFlDCfILCMLZllnHszz5ThuoHgg5MY4i5ySbG6rcc+g7ArGrhGEzTL5LMex+qRzZEK1+Itafekaey54k7KlAS3rUPNvQH7K2BygqsF7X4IpPsk8o+uQGGOuTZ/c7HvRq3hNsinGcBZP+MlxkYkHQm7sizflOwyZHYEdKvWZ5FiLfMlAz9DoKdfYsyEFfuCvDDvAjqVrUelF9Z5lUbo6k5zYVUkWLImmWYNtPcdxw4wvqOfGBVkwRxsmx5tmntrScpV6OwcXg7YCS4HQpGWiSn/Z5C3veSTHcRGPB0KOOzm9aAUKQwqagN7rE5ID9OSLMTiOizQ8EHLcySWZcyXhFqArPWkWsKdHHYIDRsk0wg3jOG7w+Bghx52cWU5Os7iqXDMpW8OQIJAPKTtE2RfAGZ1V6kXhd3HGVeFsJcdxp4QHQo7rlxhjrt2Q4VZqVVpmELMkYXKx87qANoGy0wVSIpBPM23zdTxnOseNQjwQclx/iURv02UCoJQKgjAleq1XbfCqO3SixSxdcIL19RzHRTIeCDnu1BmleCPfQpLjRjk+WYbjOI4b13gg5DiO48Y1Hgg5juO4cY0HQo7jOG5c44GQ4ziOG9d4IOQ4juPGNR4IOY7juHGNB0KO4zhuXOOBkOM4jhvXeCDkOI7jxjUeCDmO47hxjQdCjuM4blzjgZDjOI4b13gg5DiO48Y1Hgg5juO4cY0HQo7jOG5c44GQ4ziOG9d4IOQ4juPGNR4IOY7juHGNB0KO4zhuXOOBkOM4jhvXeCDsU1tbm6Io4W5FpPD6fJTScLciUni9Xv5qdPF6vYyxcLciUrS0tGiaFu5WdFNZWfnEE0/cdNNN9913X191Dh8+fMUVV6xatWrjxo1dn3uMsUceeWT16tUXXXTRtm3bRqq9YTDuAmFpaekf/vCHiy+++Oqrrz5xTafT6ff5RqZVkc/n9Ubav3cY8UAYyuPx8FejS2tLi9vtDncrutmyZcu7775bWlr6+uuvH7eC1+tdvnz5xIkT77zzzrfffvtXv/pVsPyJJ5647777fvazn61evfrss88uLy8fwVaPqHEXCA8dOlReXu5wOL788stwt4XjOG7YXX311S+99NL555/fV4UXX3wxMTHxrrvuWrx48d/+9rfHH3/c6/UC2LRp08aNG1euXLlhw4Y1a9Y88cQTI9jqETXuAuHZZ5/98MMPr1mzJtwN4TiOiwh79uxZsGBB8PdZs2b5fL6SkhK/319QUNBVvmDBgt27d4evjcNLCncDOI7juEFpamqqrq7uUSgIwrRp0/pzeH19/YQJE4K/E0IcDkddXZ3NZmOMORyOYHlMTExdXd0QtjmijMFAWFtbu3///t7lK1euFEWx/+ep8fl2lZZuLy0FYDAYJGnoXyuLqoqAX7Xm499DfvKhpWqq2C4SQsLdkIigUlVyiuCvBgBAZarkHIOfJKemDoognKSnLSozM+usswZ65sB7782cOTP0f9BsNn/zzTeCILz33nv3339/j/qyLH/11Vf9ObPFYvGFzIdwu91Wq9VqtQLwer02my1YGPxlTBqDb9/CwsIHHnigd/nixYuNRmP/z/Pe/v0NDQ0ABEFITEwcUBAde/x+v16vD3crIgV/NULxVyOUTqezWCwnrhM/c2b8zJkDPfPR888PBAKhJVarNRh0L7/88ssvv3ygJ+ySnp7e1e3Z1NTkcrnS09PtdrvNZispKUlISABQUlKSnp5+yg8R4cZgIFyxYsWKFSsGf568vLy8vLzBn4fjOG7wUlNTh/aEf/vb39atW5eWlrZ+/fp77723tLQ0KyvrscceW7p0aWJiIoBLL7300UcfXbBggdPp/M9//vP3v/99aBsQOcZgIDwxVVU7Ojrcbremaa2trZIkBXsAOI7jxqR33333sssu8/v9gUAgOjp67dq1zzzzDICf//zn+fn5aWlpOTk5v/jFL+bOnZuWltbW1ta1yuKOO+44++yz8/Pzm5ub165de9bAu3NHCzLeVsLu2LFj9erVXTcXLVr0xhtvhLE9HMdxYaEoiiRJXYOOLS0t9fX1OTk5ofMhGGNFRUVRUVHBDtKxatwFQo7jOI4LNe7WEXIcx3FcqHE3RngKmpqadu7cWVFRsXjx4vE5febNN9/86KOPkpOTN2zYEBUVFe7mhFNtbe2uXbtqamq+853vZGZmhrs5YbZr164tW7Y0NjZOmTLl8ssvNxgM4W5R2DDGXnrppX379rnd7vz8/Msuu2xAc9S58OJXhCd31lln3Xnnnb/+9a8//fTTcLclDB566KEbbrghOzt7+/bty5YtG+cZRxcuXPiHP/zh9ttv37NnT7jbEmZNTU3r1q1rampKT0//xz/+sXTp0h6T+8cVRVH+9a9/mUymzMzMp59+esWKFTz/6ijCxwhPjlIqCMLy5cvXr19/3XXXhbs5I0rTtKysrMcff3z16tWapuXl5f35z39eu3ZtuNsVNsE3w5QpUzZu3HjBBReEuznhpGkapVSWZQAejychIeH999/vysg1nnV0dNjt9kOHDuXk5IS7LVy/8CvCkztpnogxrKSkpKamJrguUxTFFStWjM/L4i7j+c3QgyiKwSgIgFKqKMpJF5KPE9u2bYuOjk5KSgp3Q7j+4mOE3InU1dU5HI6uz7uEhISioqLwNomLQLfddtvKlSv7mdlyDFu3bt2XX37p8/k2b97MvxaMIvzrLQDMmzdP6uWaa64Jd7vCT5IkVVW7biqKwpNpcT3cf//9n3zyyVNPPRXuhoTfs88+u2vXrrvuumv9+vX19fXhbg7XXzwQAsD27dvVXh577LFwtyv8kpOTnU6ny+UK3qyuruYdPlyov/zlL4888sjHH388thdc95PNZktNTb311lsTExM//PDDcDeH6y8eCLkTycjImD59+ssvvwygo6PjvffeO++888LdKC5SPP7445s2bXr//feTk5PD3ZYw83q9XRMPGxoaKioqMjIywtskrv/4rNGT++Uvf7lly5YjR444HI64uLj77rtv+fLl4W7UyHnnnXe+973vnXvuubt27crPz3/hhRfC3aJwuvbaa3ft2lVQUJCSkmK325966qnp06eHu1HhUVlZmZGRkZ6eHhsbGyzZuHFjaP7CceWdd9658cYb58yZwxj7+OOPL7zwwkceeSTcjeL6iwfCkyspKWltbe26mZ2dbbfbw9iekVdRUbFt27akpKQlS5aM8y0Jjxw50tHR0XVz0qRJ43ZOhN/vP3DgQGhJVlZWdHR0uNoTdgcPHiwsLBQEYerUqXzhxOjCAyHHcRw3rvExQo7jOG5c44GQ4ziOG9d4IOQ4juPGNR4IOY7juHGNB0KO4zhuXOOBkOM4jhvXeCDkOI7jxjUeCDmO47hxjQdCjuM4blzjgZDjOI4b13gg5DiO48a1/w/7OXHp+wMY+AAAAABJRU5ErkJggg==", "text/html": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ], "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n" ] }, "metadata": {}, "execution_count": 8 } ], "cell_type": "code", "source": [ "plot(; lim=extrema(test_range), aspect_ratio=1)\n", "contourf!(\n", " test_range,\n", " test_range,\n", " y_pred;\n", " levels=1,\n", " color=cgrad(:redsblues),\n", " alpha=0.7,\n", " colorbar_title=\"prediction\",\n", ")\n", "scatter!(X1[:, 1], X1[:, 2]; color=:red, label=\"training data: class –1\")\n", "scatter!(X2[:, 1], X2[:, 2]; color=:blue, label=\"training data: class 1\")" ], "metadata": {}, "execution_count": 8 }, { "cell_type": "markdown", "source": [ "
\n", "
Package and system information
\n", "
\n", "Package information (click to expand)\n", "
\n",
    "Status `~/work/KernelFunctions.jl/KernelFunctions.jl/examples/support-vector-machine/Project.toml`\n",
    "  [31c24e10] Distributions v0.25.117\n",
    "  [ec8451be] KernelFunctions v0.10.65 `/home/runner/work/KernelFunctions.jl/KernelFunctions.jl#65fe151`\n",
    "  [b1bec4e5] LIBSVM v0.8.1\n",
    "  [98b081ad] Literate v2.20.1\n",
    "  [91a5bcdd] Plots v1.40.9\n",
    "  [37e2e46d] LinearAlgebra v1.11.0\n",
    "
\n", "To reproduce this notebook's package environment, you can\n", "\n", "download the full Manifest.toml.\n", "
\n", "
\n", "System information (click to expand)\n", "
\n",
    "Julia Version 1.11.3\n",
    "Commit d63adeda50d (2025-01-21 19:42 UTC)\n",
    "Build Info:\n",
    "  Official https://julialang.org/ release\n",
    "Platform Info:\n",
    "  OS: Linux (x86_64-linux-gnu)\n",
    "  CPU: 4 × AMD EPYC 7763 64-Core Processor\n",
    "  WORD_SIZE: 64\n",
    "  LLVM: libLLVM-16.0.6 (ORCJIT, znver3)\n",
    "Threads: 1 default, 0 interactive, 1 GC (on 4 virtual cores)\n",
    "Environment:\n",
    "  JULIA_DEBUG = Documenter\n",
    "  JULIA_LOAD_PATH = :/home/runner/.julia/packages/JuliaGPsDocs/7M86H/src\n",
    "
\n", "
" ], "metadata": {} }, { "cell_type": "markdown", "source": [ "---\n", "\n", "*This notebook was generated using [Literate.jl](https://github.com/fredrikekre/Literate.jl).*" ], "metadata": {} } ], "nbformat_minor": 3, "metadata": { "language_info": { "file_extension": ".jl", "mimetype": "application/julia", "name": "julia", "version": "1.11.3" }, "kernelspec": { "name": "julia-1.11", "display_name": "Julia 1.11.3", "language": "julia" } }, "nbformat": 4 }