{ "cells": [ { "cell_type": "markdown", "id": "8b005542", "metadata": {}, "source": [ "# Transformer Encoder with Mixed (Legendre + B-Spline) embeddings\n", "Here we demonstrate we can use curves as input embeddings to a Transformer model that learns from tabular data. The\n", "categorical features are treated as regular tokens having embedding vectors. Numerical feature embeddings are points\n", "on curves defined by B-Splines and Legendre polynomials. We also show that it might be reasonable to use B-Splines\n", "do define features of \"spatial\" nature, such as latitude and longitude, whereas use Legendre curves for features\n", "of \"spectral\" nature - there is some overall trend of the target variable behavior as a function of the feature that\n", "can be captured by the lower frequency components." ] }, { "cell_type": "code", "execution_count": 2, "id": "d079f220", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:03.606204Z", "start_time": "2025-11-02T22:20:03.599979Z" } }, "outputs": [], "source": [ "import math\n", "from typing import Sequence\n", "\n", "import kagglehub as kh\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import torch\n", "import torch.utils.data as td\n", "from sklearn.compose import make_column_transformer\n", "from sklearn.ensemble import HistGradientBoostingRegressor\n", "from sklearn.impute import SimpleImputer\n", "from sklearn.linear_model import LinearRegression\n", "from sklearn.metrics import root_mean_squared_error\n", "from sklearn.pipeline import make_pipeline\n", "from sklearn.preprocessing import MinMaxScaler, OneHotEncoder, OrdinalEncoder, StandardScaler\n", "from torch import nn\n", "\n", "import torchcurves as tc" ] }, { "cell_type": "markdown", "id": "58cd7b80", "metadata": {}, "source": [ "## Prepare data" ] }, { "cell_type": "code", "execution_count": 3, "id": "083a250c", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:04.160844Z", "start_time": "2025-11-02T22:20:03.628061Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Warning: Looks like you're using an outdated `kagglehub` version (installed: 0.3.12), please consider upgrading to the latest version (1.0.0).\n" ] } ], "source": [ "file_path = \"housing.csv\"\n", "df = kh.dataset_load(\n", " kh.KaggleDatasetAdapter.PANDAS,\n", " \"camnugent/california-housing-prices\",\n", " file_path\n", ")" ] }, { "cell_type": "code", "execution_count": 4, "id": "0feb5cf4", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:05.173375Z", "start_time": "2025-11-02T22:20:04.189879Z" } }, "outputs": [ { "data": { "image/png": "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qtbF8bvvvosvv/wS+/btw82bN7Fr1y4sX74cgwYNAlC89mJAQAC++OIL7NmzBwkJCRg1ahTs7OwwcOBAAICzszO8vLwwfvx4nDlzBidPnoS/vz+GDRsGOzs7AMCIESMglUrh6+uLy5cvY9u2bQgNDUVgYKCxhk5ERERERlCtp1WsXr0a8+bNw8cff4y7d+/Czs4OH330EYKCgoSYmTNnIicnBxMmTEBmZiZ69OiBiIgIYY1jANi8eTP8/f3Rt29f4SEgq1atEtrlcjkOHToEPz8/uLm5oUmTJggKCuIybkRERES1jESn0+mM3YmaQKvVQi6XIysrCzKZrELvaTl7n976c3ORt96OTUTFKvN7T1WnUp9/sLziJwjOqlzHiEhvDJF3q/W0CiIiIiIiQ2JxTERERERUgsUxEREREVEJFsdERERERCVYHBMRERERlWBxTERERERUgsUxEREREVEJFsdERERERCVYHBMRERERlWBxTERERERUgsUxEREREVEJFsdERERERCVYHBMRERERlWBxTERERERUgsUxEREREVEJFsdERERERCVYHBMRERERlWBxTERUixw/fhzvvvsu7OzsIJFIsHv3blH7mDFjIJFIRJuXl5coJiMjAz4+PpDJZLCysoKvry+ys7NFMRcvXkTPnj1hYWEBe3t7LF68uExfduzYAScnJ1hYWMDV1RX79++v8vESEb0oFsdERLVITk4OOnTogLVr1z41xsvLC2lpacL2008/idp9fHxw+fJlqNVq7N27F8ePH8eECROEdq1WC09PT7Ro0QJxcXFYsmQJgoOD8c033wgxp06dwvDhw+Hr64vz589j4MCBGDhwIC5dulT1gyYiegFmxu4AEREZTr9+/dCvX79nxpibm0OhUJTblpiYiIiICJw9exZdunQBAKxevRr9+/fH0qVLYWdnh82bNyMvLw8//PADpFIp2rZti/j4eCxfvlwookNDQ+Hl5YUZM2YAABYuXAi1Wo01a9YgLCys3HPn5uYiNzdXeK3Val94/EREz8Mrx0REJHLs2DFYW1ujTZs2mDRpEu7fvy+0RUdHw8rKSiiMAcDDwwMmJiaIiYkRYnr16gWpVCrEqFQqJCcn48GDB0KMh4eH6LwqlQrR0dFP7VdISAjkcrmw2dvbV8l4iYiexOKYiIgEXl5e2LRpEyIjI/H1118jKioK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t65oWaFGjRpBJpNh8uTJT11WaPHixdBoNOUuK7RmzRrMnDkT48aNw5EjR7B9+3bs26e/1SSIiIiIqPqp1leO169fj6ysLPTu3Ru2trbCtm3bNiFmxYoVeOeddzBkyBD06tULCoUCO3fuFNpNTU2xd+9emJqaQqlUYuTIkRg1ahQ+//xzIcbBwQH79u2DWq1Ghw4dsGzZMnz33XdQqVQGHS8RERERGVe1vnJckSWYuawQEREREVWVan3lmIiIiIjIkFgcExERERGVYHFMRERERFSCxTERERERUQkWx0REREREJVgcExERERGVYHFMRERERFSCxTERERERUQkWx0REREREJVgcExERERGVYHFMRERERFSCxTERERERUQkWx0REREREJVgcExERERGVYHFMRERERFSCxTERERERUQkWx0REREREJVgcExERERGVYHFMRERERFSCxTERERERUQkWx0REREREJVgcExERERGVYHFMRERERFSCxTERERERUQkzY3eAjK/l7H0vFH9zkbeeekJERERkXLxyTERERERUgsUxEREREVEJFsdERERERCVYHBMRERERlWBxTERERERUgsUxEREREVEJFsdERERERCVYHBMRERERleBDQOiFvchDQ/jAECIiInqV8MoxEREREVEJFsd/s3btWrRs2RIWFhZwd3fHmTNnjN0lIqIajXmXiKoTTqt4wrZt2xAYGIiwsDC4u7tj5cqVUKlUSE5OhrW1tbG790p6kSkYAKdhENU21TrvBstfMD5LP/0gIoPileMnLF++HOPHj8fYsWPh4uKCsLAwWFpa4ocffjB214iIaiTmXSKqbnjluEReXh7i4uIwZ84cYZ+JiQk8PDwQHR1dJj43Nxe5ubnC66ys4isGWq22wucsyv3rJXpcMzWfusPYXRBcWqAydheomiv9fdfpdEbuyavJGHkXuXr8s3qRfhBRpRgi77I4LvHf//4XhYWFsLGxEe23sbFBUlJSmfiQkBAsWLCgzH57e3u99ZEMS77S2D2gV8XDhw8hl7/gV/BU8/LuIv4MEBmKPvMui+NKmjNnDgIDA4XXRUVFyMjIQOPGjSGRSJ77fq1WC3t7e9y6dQsymUyfXTWq2jJOgGOtqZ41Vp1Oh4cPH8LOzs5IvatdmHcrpraME+BYaypj510WxyWaNGkCU1NTpKeni/anp6dDoVCUiTc3N4e5ublon5WV1QufVyaT1fgfcqD2jBPgWGuqp42VV4wrj3lXv2rLOAGOtaYyVt7lDXklpFIp3NzcEBkZKewrKipCZGQklEqlEXtGRFQzMe8SUXXEK8dPCAwMxOjRo9GlSxe88cYbWLlyJXJycjB27Fhjd42IqEZi3iWi6obF8ROGDh2Ke/fuISgoCBqNBh07dkRERESZm0Wqgrm5OebPn1/mK8KapraME+BYa6raNFZjYN6terVlnADHWlMZe6wSHdcgIiIiIiICwDnHREREREQCFsdERERERCVYHBMRERERlWBxTERERERUgsUxEREREVEJFsdERERERCVYHBMRERERlWBxTERERERUgsUxEREREVEJFsdERERERCVYHBMRERERlTBqcXz8+HG8++67sLOzg0Qiwe7du0XtEomk3G3JkiVCTMuWLcu0L1q0SHScixcvomfPnrCwsIC9vT0WL15cpi87duyAk5MTLCws4Orqiv379+tlzERERERUfRm1OM7JyUGHDh2wdu3actvT0tJE2w8//ACJRIIhQ4aI4j7//HNR3OTJk4U2rVYLT09PtGjRAnFxcViyZAmCg4PxzTffCDGnTp3C8OHD4evri/Pnz2PgwIEYOHAgLl26pJ+BExEREVG1JNHpdDpjdwIovkq8a9cuDBw48KkxAwcOxMOHDxEZGSnsa9myJQICAhAQEFDue9avX4/PPvsMGo0GUqkUADB79mzs3r0bSUlJAIChQ4ciJycHe/fuFd7XrVs3dOzYEWFhYRXqf1FREe7cuYMGDRpAIpFU6D1E9GrT6XR4+PAh7OzsYGLCWWqGxrxLVPsYIu+a6eWoepCeno59+/Zh48aNZdoWLVqEhQsXonnz5hgxYgSmTp0KM7PioUVHR6NXr15CYQwAKpUKX3/9NR48eICGDRsiOjoagYGBomOqVKoy0zyelJubi9zcXOH1n3/+CRcXl5ccJRG9im7duoVmzZoZuxu1zp07d2Bvb2/sbhCREegz774yxfHGjRvRoEEDDB48WLT/k08+QefOndGoUSOcOnUKc+bMQVpaGpYvXw4A0Gg0cHBwEL3HxsZGaGvYsCE0Go2w78kYjUbz1P6EhIRgwYIFZfbfunULMpmsUmMkoleLVquFvb09GjRoYOyu1EqlnzvzLlHtYYi8+8oUxz/88AN8fHxgYWEh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1jCWy+U4dOgQUlJS4ObmhmnTpiEoKEi0FvKbb76JLVu24JtvvkGHDh3w888/Y/fu3WjXrp3hPgwiIiIiMjqJztiPIakhtFot5HI5srKyKjz/2HWja4WPnzA6obJdIyI9qczvPVWdynz+iU7OFT6+c1JiZbtGRHpiiLz7Ss05JiIiIiLSJxbHREREREQlWBwTEREREZVgcUxEREREVILFMRERERFRCRbHREREREQlWBwTEREREZVgcUxEREREVILFMRERERFRCRbHREREREQlWBwTEREREZVgcUxEREREVILFMRERERFRCRbHREREREQlWBwTEREREZVgcUxEREREVILFMRERERFRCRbHREREREQlWBwTEREREZVgcUxEREREVILFMRERERFRCaMWx8ePH8e7774LOzs7SCQS7N69W2jLz8/HrFmz4Orqinr16sHOzg6jRo3CnTt3RMdo2bIlJBKJaFu0aJEo5uLFi+jZsycsLCxgb2+PxYsXl+nLjh074OTkBAsLC7i6umL//v16GTMRERERVV9GLY5zcnLQoUMHrF27tkzbX3/9hXPnzmHevHk4d+4cdu7cieTkZLz33ntlYj///HOkpaUJ2+TJk4U2rVYLT09PtGjRAnFxcViyZAmCg4PxzTffCDGnTp3C8OHD4evri/Pnz2PgwIEYOHAgLl26pJ+BExEREVG1ZNTiuF+/fvjiiy8waNCgMm1yuRxqtRrvv/8+2rRpg27dumHNmjWIi4tDamqqKLZBgwZQKBTCVq9ePaFt8+bNyMvLww8//IC2bdti2LBh+OSTT7B8+XIhJjQ0FF5eXpgxYwacnZ2xcOFCdO7cGWvWrNHf4ImIjOBZ39gBwJgxY8p8G+fl5SWKycjIgI+PD2QyGaysrODr64vs7GxRDL+xI6JX1Ss15zgrKwsSiQRWVlai/YsWLULjxo3RqVMnLFmyBAUFBUJbdHQ0evXqBalUKuxTqVRITk7GgwcPhBgPDw/RMVUqFaKjo5/al9zcXGi1WtFGRFTdPesbu1JeXl6ib+N++uknUbuPjw8uX74MtVqNvXv34vjx45gwYYLQzm/siOhVZmbsDlTU48ePMWvWLAwfPhwymUzY/8knn6Bz585o1KgRTp06hTlz5iAtLU24MqzRaODg4CA6lo2NjdDWsGFDaDQaYd+TMRqN5qn9CQkJwYIFC6pq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MUxNTbF3716YmppCqVRi5MiRGDVqFD7//HMhxsHBAfv27YNarUaHDh2wbNkyfPfdd1zGjYiIiKiWqdY35Ol0ume229vbIyoq6rnHadGiBfbv3//MmN69e+P8+fMv1D8iIiIiqlmq9ZVjIiIiIiJDYnFMRERERFSCxTERERERUQkWx0REREREJVgcExERERGVYHFMRERERFSCxTERERERUQkWx0REREREJVgcExERERGVYHFMRERERFSCxTERERERUQkWx0REREREJVgcExERERGVYHFMRERERFSCxTERERERUQkWx0REREREJVgcExERERGVYHFMRERERFSCxTERERERUQkzY3eA9MN1o2uFYxNGJ+ixJ0RERESvDl45/pu1a9eiZcuWsLCwgLu7O86cOWPsLhER1WjMu0RUnbA4fsK2bdsQGBiI+fPn49y5c+jQoQNUKhXu3r1r7K4REdVIzLtEVN1IdDqdztidqC7c3d3RtWtXrFmzBgBQVFQEe3t7TJ48GbNnz37me7VaLeRyObKysiCTySp0vheZ+qBPnFZBVDmV+b0nMUPn3UQn55fu89M4JyXq7dhEVMwQeZdzjkvk5eUhLi4Oc+bMEfaZmJjAw8MD0dHRZeJzc3ORm5srvM7KygJQ/IdWUYWPCl+ix1XHJczlheJPjzitp54QvVpKf995jaFyjJF3swv1l3dfpB9EVDmGyLssjkv897//RWFhIWxsbET7bWxskJSUVCY+JCQECxYsKLPf3t5eb32sLuST5MbuAlG18vDhQ8jl/L14UTUu7/JngMhg9Jl3WRxX0pw5cxAYGCi8LioqQkZGBho3bgyJRPLc92u1Wtjb2+PWrVs1+uvY2jJOgGOtqZ41Vp1Oh4cPH8LOzs5IvatdmHcrpraME+BYaypj510WxyWaNGkCU1NTpKeni/anp6dDoVCUiTc3N4e5ublon5WV1QufVyaT1fgfcqD2jBPgWGuqp42VV4wrj3lXv2rLOAGOtaYyVt7lahUlpFIp3NzcEBkZKewrKipCZGQklEqlEXtGRFQzMe8SUXXEK8dPCAwMxOjRo9GlSxe88cYbWLlyJXJycjB27Fhjd42IqEZi3iWi6obF8ROGDh2Ke/fuISgoCBqNBh07dkRERESZm0Wqgrm5OebPn1/mK8KapraME+BYa6raNFZjYN6terVlnADHWlMZ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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# columns that we know have a very skewed distribution\n", "skewed_columns = ['total_rooms', 'total_bedrooms', 'population', 'households']\n", "df[skewed_columns].plot.hist(\n", " bins=20, subplots=True, layout=(2, 2), figsize=(7, 5)\n", ")\n", "plt.gcf().set_layout_engine('constrained')" ] }, { "cell_type": "code", "execution_count": 5, "id": "b7125f46", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:06.415603Z", "start_time": "2025-11-02T22:20:05.328251Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAscAAAH/CAYAAAC7N3BzAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAf+JJREFUeJzt3XlcVPX+P/DXsMyw6Ay5wMAVlXIBFCXRdK5WLlxJsZ8lLeYCKtZXL5hALnFzt8QsRUyUSgO9aqY37ZqoiCh6E3AhURQlSwxLFu9VGDf28/tDODGBCOPAGeT1fDzO4+Gc85nPeZ8R3vPmcz7nHJkgCAKIiIiIiAgmUgdARERERGQsWBwTEREREVVicUxEREREVInFMRERERFRJRbHRERERESVWBwTEREREVVicUxEREREVMlM6gCag4qKCly/fh2tW7eGTCaTOhwiegIIgoDbt2/DwcEBJiYcp/gz5l0iMrT65l0Wx/Vw/fp1ODo6Sh0GET2Brl27hg4dOkgdhtFh3iWixvKovMviuB5at24N4MGHqVQqJY6GiJ4EWq0Wjo6OYn4hXcy7RGRo9c27LI7roeqUnlKpZJImIoPilIHaMe8SUWN5VN7lRDciIiIiokosjomIiIiIKrE4JiIiIiKqxDnHBlReXo7S0lKpwyAJyeVy3paLiKgafjdSUzE3N4epqelj98Pi2AAEQUBubi4KCgqkDoUkZmJiAicnJ8jlcqlDISKSFL8bSQo2NjZQq9WPdbEzi2MDqPrlt7W1hZWVFa8+b6GqHlqQk5ODjh078ueAiFo0fjdSUxIEAffu3UN+fj4AwN7eXu++WBw/pvLycvGXv23btlKHQxJr3749rl+/jrKyMpibm0sdDhGRJPjdSFKwtLQEAOTn58PW1lbvKRacHPmYquZRWVlZSRwJGYOq6RTl5eUSR0JEJB1+N5JUqn7mHmeeO0eODYSniwh4sn4OOr8f2+D3XF3u3QiREFFzZdQ58fqZhrV3eLZx4iCDMsTPHEeOiYiIiIgqsTgmIiIiIqrEaRWNSJ/T0o/DmE9pT5o0CQUFBfjuu++kDoWIiKS0SNXE+yts2v01QEO+GwcPHgx3d3esXr3aoDHExMQgKCiIt9yrhiPHLdjgwYMRFBTU6O8hIuPRuXNnyGSyGktAQAAAoKioCAEBAWjbti1atWoFHx8f5OXl6fSRnZ0Nb29vWFlZwdbWFrNnz0ZZWZlOm8TERPTp0wcKhQJdunRBTExMUx0i0WMZ/NrbCFrwScPew+/GJwqLYzJ6JSUlUodA9MQ4deoUcnJyxCU+Ph4A8PrrrwMAgoOD8f3332Pnzp04evQorl+/jjFjxojvLy8vh7e3N0pKSpCUlIRNmzYhJiYGCxYsENtkZWXB29sbQ4YMQVpaGoKCgjB16lTExcU17cES0WNrid/BkhbHHMGQzqRJk3D06FFERESIn/vVq1dx9OhRPPfcc1AoFLC3t8f7778vfp4Pe095eTn8/f3h5OQES0tLdO/eHREREXrHNnjwYAQGBiIoKAjt2rWDl5cXANQZGwAUFxfj3Xffha2tLSwsLDBo0CCcOnVK3J6YmAiZTIa4uDg8++yzsLS0xNChQ5Gfn4/9+/fDxcUFSqUS48aNw71798T3/etf/4KbmxssLS3Rtm1beHp64u7du3ofH5GU2rdvD7VaLS579+7FM888gxdffBGFhYXYuHEjVq1ahaFDh8LDwwPR0dFISkpCSkoKAODgwYPIyMjAli1b4O7ujhEjRmDp0qWIjIwUv0SjoqLg5OSElStXwsXFBYGBgXjttdcQHh7+0LiKi4uh1Wp1FqKmNiloIY4mpyJi49eQ/aUPZH/pg6vXruNocqrk340AUFZWhsDAQKhUKrRr1w7z58+HIAji9uLiYsyaNQt/+ctfYG1tjf79+yMxMVGnj5iYGHTs2BFWVlZ49dVX8b///U9n+6JFi+Du7o4NGzbAyckJFhYWAB7UW6NHj0arVq2gVCrxxhtv1KjJ1q9fj2eeeQZyuRzdu3fHP//5T53tMpkMn3/+OUaNGgUrKyu4uLggOTkZP//8MwYPHgxra2v89a9/xS+//CK+5+zZsxgyZAhat24NpVIJDw8PnD59+rE+x0eRtDjmCIZ0IiIioNFo8Pbbb4ufv7m5OUaOHIl+/frh7NmzWL9+PTZu3IgPP/zwoe9xdHRERUUFOnTogJ07dyIjIwMLFizAP/7xD+zYsUPv+DZt2gS5XI7jx48jKioKv//+e52xAcCcOXPw7bffYtOmTfjxxx/RpUsXeHl54ebNmzp9L1q0CGvXrkVSUhKuXbuGN954A6tXr8a2bdsQGxuLgwcP4rPPPgMA5OTk4K233sKUKVNw8eJFJCYmYsyYMTrJiKi5KikpwZYtWzBlyhTIZDKkpqaitLQUnp6eYhtnZ2d07NgRycnJAIDk5GS4ubnBzs5ObOPl5QWtVosLFy6Ibar3UdWmqo/ahIWFQaVSiYujo6MhD5WoXiKWzILGoxfeHv8qcs4cRM6ZgzA3M8PIiTOM5rvRzMwMJ0+eREREBFatWoUNGzaI2wMDA5GcnIzt27fj3LlzeP311/HSSy/h8uXLAIATJ07A398fgYGBSEtLw5AhQ3S+R6v8/PPP+Pbbb7Fr1y6kpaWhoqICo0ePxs2bN3H06FHEx8fjypUrePPNN8X37N69GzNnzsR7772H8+fP4//+7/8wefJkHDlyRKfvpUuXwtfXF2lpaXB2dsa4cePwf//3fwgNDcXp06chCAICAwPF9uPHj0eHDh1w6tQppKam4v3332/0h2xJekFe+/btdV4vX768xgjGtm3bMHToUABAdHQ0XFxckJKSggEDBogjGIcOHYKdnR3c3d2xdOlSzJ07F4sWLYJcLtcZwQAAFxcX/PDDDwgPDxdHJFsilUoFuVwOKysrqNVqAMAHH3wAR0dHrF27FjKZDM7Ozrh+/Trmzp2LBQsW1PoeADA1NcXixYvF105OTkhOTsaOHTvwxhtv6BVf165dsWLFCvH1o2K7f/8+1q9fj5iYGIwYMQIA8OWXXyI+Ph4bN27E7Nmzxb4+/PBDDBw4EADg7++P0NBQ/PLLL3j66acBAK+99hqOHDmCuXPnIicnB2VlZRgzZgw6deoEAHBzc9PrmIiMzXfffYeCggJMmjQJwIPH/crlctjY2Oi0s7OzQ25urtimemFctb1qW11ttFot7t+/Lz7FqrrQ0FCEhISIr7VaLQtkanIqZWvI5eawsrCA2rYdAOCD5Wvh6KA2iu9GR0dHhIeHQyaToXv37khPT0d4eDjefvttZGdnIzo6GtnZ2XBwcAAAzJo1CwcOHEB0dDSWLVuGiIgIvPTSS5gzZw4AoFu3bkhKSsKBAwd09lNSUoLNmzeLdVp8fDzS09ORlZUl/l5u3rwZPXr0wKlTp9CvXz98+umnmDRpEv7+978DAEJCQpCSkoJPP/0UQ4YMEfuePHmyePxz586FRqPB/PnzxZps5syZmDx5stg+Ozsbs2fPhrOzM4AH9UFjM5o5x8Y0gtFST+9dvHgRGo1G5wbaAwcOxJ07d/Dbb7/V+d7IyEh4eHigffv2aNWqFb744gtkZ2frHYuHh0eDYvvll19QWloqFr0AYG5ujueeew4XL17U6atXr17iv+3s7GBlZSUWxlXrqp7N3rt3bwwbNgxubm54/fXX8eWXX+LWrVt6HxeRMdm4cSNGjBghfpFKSaFQQKlU6ixExuDiz1nQeLgZxXfjgAEDdOLQaDS4fPkyysvLkZ6ejvLycnTr1g2tWrUSl6NHj4rTFC5evIj+/fvr9KnRaGrsp1OnTjoDmBcvXoSjo6POH6yurq6wsbERv2MvXryo8x0MPPicHvUdDOgOOtnZ2aGoqEisvUJCQjB16lR4enpi+fLlOlMuGovRFMdSjWDUhqf3Gmb79u2YNWsW/P39cfDgQaSlpWHy5MmPNYnf2tragBHqqn46RiaT1Tg9I5PJUFFRAeDBX/7x8fHYv38/XF1d8dlnn6F79+7IyspqtPiImsKvv/6KQ4cOYerUqeI6tVqNkpKSGrd0ysvLE0fE1Gp1jXmGVa8f1UapVNY6akz0JGqM78a63LlzB6ampkhNTUVaWpq4XLx4scFznZvyO/hh66q+hxctWoQLFy7A29sbhw8fhqurK3bv3t1o8QFGVBwb0whGaGgoCgsLxeXatWtSh9Qo5HI5ysvLxddVE+Orz6c9fvw4WrdujQ4dOtT6nqo2f/3rX/H3v/8dzz77LLp06WLwv+weFVvVBQDHjx8Xt5eWluLUqVNwdXV9rH3LZDIMHDgQixcvxpkzZyCXyxv9F5OosUVHR8PW1hbe3n/cH93DwwPm5uZISEgQ12VmZiI7O1scXdJoNEhPTxfPrgAPTrkqlUrxd02j0ej0UdWmthEqImMjNzdHeWVhBgAuXZyQnJpuFN+NJ06c0HmdkpKCrl27wtTUFM8++yzKy8uRn5+PLl266CxVf7i6uLjU2sejuLi44Nq1azr1UEZGBgoKCsTfexcXF53vYODBZ/C438HAg+kfwcHBOHjwIMaMGYPo6OjH7rMuRlEcG9sIRks5vde5c2ecOHECV69exX//+1/8/e9/x7Vr1zBjxgxcunQJ//73v7Fw4UKEhITAxMSk1vdUVFSga9euOH36NOLi4vDTTz9h/vz5OneJMIRHxWZtbY3p06dj9uzZOHDgADIyMvD222/j3r178Pf313u/J06cwLJly3D69GlkZ2dj165duHHjBlxcXAx4dERNq6KiAtHR0fDz84OZ2R+XnqhUKvj7+yMkJARHjhxBamoqJk+eDI1GgwEDBgAAhg8fDldXV0ycOBFnz55FXFwc5s2bh4CAACgUCgDAtGnTcOXKFcyZMweXLl3CunXrsGPHDgQHB0tyvEQN0dnRHifOnMfVa9fx35u38He/N3Dteq5RfDdmZ2cjJCQEmZmZ+Prrr/HZZ59h5syZAB4UkOPHj4evry927dqFrKwsnDx5EmFhYYiNffBQsnfffRcHDhzAp59+isuXL2Pt2rU15hvXxtPTE25ubhg/fjx+/PFHnDx5Er6+vnjxxRfRt29fAMDs2bMRExOD9evX4/Lly1i1ahV27dqFWbNm6X289+/fR2BgIBITE/Hrr7/i+PHjOHXqVON/BwtGYOHChYJarRZKS0vFdQUFBYK5ubnwr3/9S1x36dIlAYCQnJwsCIIg7Nu3TzAxMRHy8vLENp9//rmgVCqFoqIiQRAEYc6cOULPnj119vfWW28JXl5e9Y6vsLBQACAUFhbW2Hb//n0hIyNDuH//fr37MxaZmZnCgAEDBEtLSwGAkJWVJSQmJgr9+vUT5HK5oFarhblz5+r8v9T2nqKiImHSpEmCSqUSbGxshOnTpwvvv/++0Lt3b/F9fn5+wujRo+sV14svvijMnDmzxvpHxXb//n1hxowZQrt27QSFQiEMHDhQOHnypLj9yJEjAgDh1q1b4rro6GhBpVLp7GfhwoVi7BkZGYKXl5fQvn17QaFQCN26dRM+++yzh8benH8e/qzT3L0NXqj+6sorjS0uLk4AIGRmZtbYdv/+feHvf/+78NRTTwlWVlbCq6++KuTk5Oi0uXr1qjBixAjB0tJSaNeunfDee+/p/C4KwoPfN3d3d0EulwtPP/20EB0d3aAYpfx86PE1i1z4+4+1LpnHdgsD+rgJlhYWD77nUvYKif/60ii+G//+978L06ZNE5RKpfDUU08J//jHP4SKigqxTUlJibBgwQKhc+fOgrm5uWBvby+8+uqrwrlz58Q2GzduFDp06CBYWloKL7/8svDpp5/qfA9W/w6s7tdffxX+3//7f4K1tbXQunVr4fXXXxdyc3N12qxbt054+umnBXNzc6Fbt27C5s2bdbYDEHbv3i2+zsrKEgAIZ86cEddV/64uLi4Wxo4dKzg6OgpyuVxwcHAQAgMD6/y5qutnr755RVYZrGQqKirg5OSEt956C8uXL9fZNn36dOzbtw8xMTFQKpWYMWMGACApKQnAg1u5ubu7w8HBAStWrEBubi4mTpyIqVOnYtmyZQAe3MqtZ8+eCAgIwJQpU3D48GG8++67iI2NrffdKrRaLVQqFQoLC2uMIhcVFSErK0vnXoDUcj1JPw/6PP7cmB9hbmzqyivEz6e5axa58PqZhrV3eLZx4iCDqutnr755RdJbuQHAoUOHkJ2djSlTptTYFh4eDhMTE/j4+KC4uBheXl5Yt26duN3U1BR79+7F9OnTodFoYG1tDT8/PyxZskRs4+TkhNjYWAQHByMiIgIdOnTAhg0bWvRt3IiIiIiodpIXx8OHD3/oAxUsLCwQGRmJyMjIh76/U6dO2LdvX537GDx4MM6caeBfiNQosrOz65ycn5GRgY4dOzZhRERERNLid6Nxkbw4ppbFwcEBaWlpdW4nIiJqSfjdaFxYHFOTMjMzQ5cuXaQOg4iIyGjwu9G4GMWt3J4EEl/XSEaCPwdERH9gTqSmZoifORbHj6nqqS737t2TOBIyBlVPPjI1NZU4EiIi6fC7kaRS9TP356ffNgSnVTwmU1NT2NjYiE+LsrKy0nnuObUcFRUVuHHjBqysrHQerEBE1NI0i+/GsgaOMBYVNU4cZBCCIODevXvIz8+HjY3NYw1S8RvcAKqexlf9carUMpmYmKBjx47G9yVARNTEjP67seBGw9rfzWqcOMigbGxsxJ89fbE4NgCZTAZ7e3vY2tqitLRU6nBIQnK5XHycKBFRS2b0341rX29Y+8DTjRMHGYy5ublBpjWyODYgU1NTzjUlIiKqxmi/G+9ca1h7Y33SHxkch7iIiIiIiCqxOCYiIiIiqsTimIiIiIioEotjIiIiIqJKLI6JiIiIiCqxOCYiIiIiqsTimIiIiIioEotjIiIiIqJKLI6JiFqY33//HRMmTEDbtm1haWkJNzc3nD79x9O/BEHAggULYG9vD0tLS3h6euLy5cs6fdy8eRPjx4+HUqmEjY0N/P39cefOHZ02586dw/PPPw8LCws4OjpixYoVTXJ8RESPg8UxEVELcuvWLQwcOBDm5ubYv38/MjIysHLlSjz11FNimxUrVmDNmjWIiorCiRMnYG1tDS8vLxQVFYltxo8fjwsXLiA+Ph579+7FsWPH8M4774jbtVothg8fjk6dOiE1NRWffPIJFi1ahC+++KJJj5eIqKH4+Ggiohbk448/hqOjI6Kjo8V1Tk5O4r8FQcDq1asxb948jB49GgCwefNm2NnZ4bvvvsPYsWNx8eJFHDhwAKdOnULfvn0BAJ999hlGjhyJTz/9FA4ODti6dStKSkrw1VdfQS6Xo0ePHkhLS8OqVat0imgiImMj+cgxT+8RETWdPXv2oG/fvnj99ddha2uLZ599Fl9++aW4PSsrC7m5ufD09BTXqVQq9O/fH8nJyQCA5ORk2NjYiIUxAHh6esLExAQnTpwQ27zwwguQy+ViGy8vL2RmZuLWrVs14iouLoZWq9VZiIikIGlxzNN7RERN68qVK1i/fj26du2KuLg4TJ8+He+++y42bdoEAMjNzQUA2NnZ6bzPzs5O3JabmwtbW1ud7WZmZmjTpo1Om9r6qL6P6sLCwqBSqcTF0dHRAEdLRNRwkk6rMNbTe8XFxSguLhZfcwSDiJ4UFRUV6Nu3L5YtWwYAePbZZ3H+/HlERUXBz89PsrhCQ0MREhIivtZqtSyQiUgSko4cG+vpPY5gENGTyt7eHq6urjrrXFxckJ2dDQBQq9UAgLy8PJ02eXl54ja1Wo38/Hyd7WVlZbh586ZOm9r6qL6P6hQKBZRKpc5CRCQFSYtjYz29FxoaisLCQnG5du2aAY6WiEh6AwcORGZmps66n376CZ06dQLw4OydWq1GQkKCuF2r1eLEiRPQaDQAAI1Gg4KCAqSmpoptDh8+jIqKCvTv319sc+zYMZSWlopt4uPj0b17d52pc0RExkbS4riiogJ9+vTBsmXL8Oyzz+Kdd97B22+/jaioKCnD4ggGET2xgoODkZKSgmXLluHnn3/Gtm3b8MUXXyAgIAAAIJPJEBQUhA8//BB79uxBeno6fH194eDggFdeeQXAg5Hml156CW+//TZOnjyJ48ePIzAwEGPHjoWDgwMAYNy4cZDL5fD398eFCxfwzTffICIiQmfqBBGRMZK0ODbW03tERE+qfv36Yffu3fj666/Rs2dPLF26FKtXr8b48ePFNnPmzMGMGTPwzjvvoF+/frhz5w4OHDgACwsLsc3WrVvh7OyMYcOGYeTIkRg0aJDORc4qlQoHDx5EVlYWPDw88N5772HBggW8jRsRGT1JL8hryOk9d3d3AH+c3ps+fToA3dN7Hh4eAGo/vffBBx+gtLQU5ubmAHh6j4harlGjRmHUqFEP3S6TybBkyRIsWbLkoW3atGmDbdu21bmfXr164T//+Y/ecRIRSUHSkWOe3iMiIiIiYyLpyHHV6b3Q0FAsWbIETk5OtZ7eu3v3Lt555x0UFBRg0KBBtZ7eCwwMxLBhw2BiYgIfHx+sWbNG3F51ei8gIAAeHh5o164dT+8RERERUQ0yQRAEqYMwdlqtFiqVCoWFhbw4j1qMzu/HNvg9V5d7N0IkTybmlbrx86FGt0jVwPaFjRMHNZn65hXJHx9NRERERGQsWBwTEREREVVicUxEREREVInFMRERERFRJRbHRERERESVWBwTEREREVVicUxEREREVInFMRERERFRJRbHRERERESVWBwTEREREVVicUxEREREVInFMRERERFRJRbHRERERESVWBwTEREREVVicUxEREREVInFMRERERFRJRbHREQtyKJFiyCTyXQWZ2dncXtRURECAgLQtm1btGrVCj4+PsjLy9PpIzs7G97e3rCysoKtrS1mz56NsrIynTaJiYno06cPFAoFunTpgpiYmKY4PCKix8bimIiohenRowdycnLE5YcffhC3BQcH4/vvv8fOnTtx9OhRXL9+HWPGjBG3l5eXw9vbGyUlJUhKSsKmTZsQExODBQsWiG2ysrLg7e2NIUOGIC0tDUFBQZg6dSri4uKa9DiJiPQhaXHMEQwioqZnZmYGtVotLu3atQMAFBYWYuPGjVi1ahWGDh0KDw8PREdHIykpCSkpKQCAgwcPIiMjA1u2bIG7uztGjBiBpUuXIjIyEiUlJQCAqKgoODk5YeXKlXBxcUFgYCBee+01hIeHS3bMRET1JfnIMUcwiIia1uXLl+Hg4ICnn34a48ePR3Z2NgAgNTUVpaWl8PT0FNs6OzujY8eOSE5OBgAkJyfDzc0NdnZ2YhsvLy9otVpcuHBBbFO9j6o2VX3Upri4GFqtVmchIpKCmeQBVI5g/FnVCMa2bdswdOhQAEB0dDRcXFyQkpKCAQMGiCMYhw4dgp2dHdzd3bF06VLMnTsXixYtglwu1xnBAAAXFxf88MMPCA8Ph5eXV5MeKxGR1Pr374+YmBh0794dOTk5WLx4MZ5//nmcP38eubm5kMvlsLGx0XmPnZ0dcnNzAQC5ubk6hXHV9qptdbXRarW4f/8+LC0ta8QVFhaGxYsXG+owiYj0JvnIMUcwiIiazogRI/D666+jV69e8PLywr59+1BQUIAdO3ZIGldoaCgKCwvF5dq1a5LGQ0Qtl6TFcdUIxoEDB7B+/XpkZWXh+eefx+3bt5tsBKM2YWFhUKlU4uLo6GiIwyUiMjo2Njbo1q0bfv75Z6jVapSUlKCgoECnTV5enniGT61W17j2o+r1o9oolcpaR40BQKFQQKlU6ixERFLQqzi+cuWKQXbOEQwiovoxVN79szt37uCXX36Bvb09PDw8YG5ujoSEBHF7ZmYmsrOzodFoAAAajQbp6enIz88X28THx0OpVMLV1VVsU72PqjZVfRARGTO9iuMuXbpgyJAh2LJlC4qKigwWDEcwiIhqZ6i8O2vWLBw9ehRXr15FUlISXn31VZiamuKtt96CSqWCv78/QkJCcOTIEaSmpmLy5MnQaDQYMGAAAGD48OFwdXXFxIkTcfbsWcTFxWHevHkICAiAQqEAAEybNg1XrlzBnDlzcOnSJaxbtw47duxAcHCwQT4LIqLGpFdx/OOPP6JXr14ICQmBWq3G//3f/+HkyZOPHQxHMIiIameovPvbb7/hrbfeQvfu3fHGG2+gbdu2SElJQfv27QEA4eHhGDVqFHx8fPDCCy9ArVZj165d4vtNTU2xd+9emJqaQqPRYMKECfD19cWSJUvENk5OToiNjUV8fDx69+6NlStXYsOGDbwImoiaBZkgCIK+by4rK8OePXvEecPdunXDlClTMHHiRDHR1mXWrFl4+eWX0alTJ1y/fh0LFy5EWloaMjIy0L59e0yfPh379u1DTEwMlEolZsyYAQBISkoC8OBWbu7u7nBwcMCKFSuQm5uLiRMnYurUqVi2bBmAB7dy69mzJwICAjBlyhQcPnwY7777LmJjY+udqLVaLVQqFQoLCzmKTC1G5/djG/yeq8u9GyGSJ5O+eeVx825zwbxLjW6RqoHtCxsnDmoy9c0rj3VBnpmZGcaMGYOdO3fi448/xs8//4xZs2bB0dERvr6+yMnJqfP9HMEgImqYx827RERUt8caOT59+jS++uorbN++HdbW1vDz84O/vz9+++03LF68GFqt1iDTLaTGEQxqiThy3Lj0zSvMu0QGwpHjFqe+eUWvh4CsWrUK0dHRyMzMxMiRI7F582aMHDkSJiYPBqKdnJwQExODzp076xU8ERHpYt4lImoaehXH69evx5QpUzBp0iTY29vX2sbW1hYbN258rOCIiOgB5l0ioqahV3F8+fLlR7aRy+Xw8/PTp3siIvoT5l0ioqahV3EcHR2NVq1a4fXXX9dZv3PnTty7d4/JmYjIwJh3ierQ0PnDRHXQ624VYWFhaNeuXY31tra24i3UiIjIcJh3iYiahl4jx9nZ2XBycqqxvlOnTsjOzn7soIioeeIdLhoP8y6RxPQZneYdLpolvYpjW1tbnDt3rsZV0WfPnkXbtm0NERcRGZg+hSsZD+ZdIqKmode0irfeegvvvvsujhw5gvLycpSXl+Pw4cOYOXMmxo4da+gYiYhaPOZdIqKmodfI8dKlS3H16lUMGzYMZmYPuqioqICvry/nvhERNQLmXSKipqFXcSyXy/HNN99g6dKlOHv2LCwtLeHm5oZOnToZOj4iIgLzLhFRU9GrOK7SrVs3dOvWzVCxEBHRIzDvEhE1Lr2K4/LycsTExCAhIQH5+fmoqKjQ2X748GGDBEdERA8w7xIRNQ29iuOZM2ciJiYG3t7e6NmzJ2QymaHjIiKiaph3iYiahl7F8fbt27Fjxw6MHDnS0PEQEVEtmHeJiJqGXrdyk8vl6NKli6FjISKih2DeJSJqGnoVx++99x4iIiIgCIKh4yEiolow7xIRNQ29plX88MMPOHLkCPbv348ePXrA3NxcZ/uuXbsMEhwRET3AvEtE1DT0Gjm2sbHBq6++ihdffBHt2rWDSqXSWYiIyLAaI+8uX74cMpkMQUFB4rqioiIEBASgbdu2aNWqFXx8fJCXl6fzvuzsbHh7e8PKygq2traYPXs2ysrKdNokJiaiT58+UCgU6NKlC2JiYvSKkYioqek1chwdHW3oOLB8+XKEhoZi5syZWL16NYAHSfq9997D9u3bUVxcDC8vL6xbtw52dnbi+7KzszF9+nQcOXIErVq1gp+fH8LCwsQnSAEPknRISAguXLgAR0dHzJs3D5MmTTL4MRARNRZD591Tp07h888/R69evXTWBwcHIzY2Fjt37oRKpUJgYCDGjBmD48ePA3hwSzlvb2+o1WokJSUhJycHvr6+MDc3F5/Ul5WVBW9vb0ybNg1bt25FQkICpk6dCnt7e3h5eRn0OIiIDE2vkWMAKCsrw6FDh/D555/j9u3bAIDr16/jzp07De6rriT9/fffY+fOnTh69CiuX7+OMWPGiNurknRJSQmSkpKwadMmxMTEYMGCBWKbqiQ9ZMgQpKWlISgoCFOnTkVcXJyeR05EJA1D5d07d+5g/Pjx+PLLL/HUU0+J6wsLC7Fx40asWrUKQ4cOhYeHB6Kjo5GUlISUlBQAwMGDB5GRkYEtW7bA3d0dI0aMwNKlSxEZGYmSkhIAQFRUFJycnLBy5Uq4uLggMDAQr732GsLDwx8aU3FxMbRarc5CRCQFvYrjX3/9FW5ubhg9ejQCAgJw48YNAMDHH3+MWbNmNagvY0zSRETGxpB5NyAgAN7e3vD09NRZn5qaitLSUp31zs7O6NixI5KTkwEAycnJcHNz0zmD5+XlBa1WiwsXLoht/ty3l5eX2EdtwsLCdKaJODo6NuiYiIgMRa/ieObMmejbty9u3boFS0tLcf2rr76KhISEBvVljEmaIxhEZGwMlXe3b9+OH3/8EWFhYTW25ebmQi6Xw8bGRme9nZ0dcnNzxTbVc27V9qptdbXRarW4f/9+rXGFhoaisLBQXK5du1bvYyIiMiS95hz/5z//QVJSEuRyuc76zp074/fff693P1VJ+tSpUzW2NVWSrv4lUyUsLAyLFy+u93EQETU2Q+Tda9euYebMmYiPj4eFhUVjhKk3hUIBhUIhdRhERPqNHFdUVKC8vLzG+t9++w2tW7euVx9VSXrr1q1Gl6Q5gkFExsYQeTc1NRX5+fno06cPzMzMYGZmhqNHj2LNmjUwMzODnZ0dSkpKUFBQoPO+vLw8qNVqAIBara5x94qq149qo1Qqax2QICIyJnoVx8OHDxfvKAEAMpkMd+7cwcKFC+v9aFNjTtIKhQJKpVJnISKSkiHy7rBhw5Ceno60tDRx6du3L8aPHy/+29zcXGeaRmZmJrKzs6HRaAAAGo0G6enpyM/PF9vEx8dDqVTC1dVVbPPnqR7x8fFiH0RExkyvaRUrV66El5cXXF1dUVRUhHHjxuHy5cto164dvv7663r1UZWkq5s8eTKcnZ0xd+5cODo6iknax8cHQO1J+qOPPkJ+fj5sbW0B1J6k9+3bp7MfJmkiam4MkXdbt26Nnj176qyztrZG27ZtxfX+/v4ICQlBmzZtoFQqMWPGDGg0GgwYMADAgyLd1dUVEydOxIoVK5Cbm4t58+YhICBAnBYxbdo0rF27FnPmzMGUKVNw+PBh7NixA7GxsQb8RIiIGodexXGHDh1w9uxZbN++HefOncOdO3fg7++P8ePH1/uUGZM0EVH9GSLv1kd4eDhMTEzg4+Ojc3/5Kqampti7dy+mT58OjUYDa2tr+Pn5YcmSJWIbJycnxMbGIjg4GBEREejQoQM2bNjAexwTUbMgEwRBkDqIKoMHD4a7u3uNh4B8/fXXOkm6asoE8OD2RtOnT0diYqKYpJcvX17jISDBwcHIyMhAhw4dMH/+/AY9BESr1UKlUqGwsJBTLKjZ6vy+cf5BeHW5t9QhSIJ5pW78fKhBFhnp03kXFUodAVVT37yiV3G8efPmOrf7+vo2tEujxiRNTwIWx8aloXmFeZeoDiyOqR7qm1f0mlYxc+ZMndelpaW4d+8e5HI5rKysnrgkTUQkNeZdIqKmodfdKm7duqWz3LlzB5mZmRg0aFC9LwwhIqL6Y94lImoaehXHtenatSuWL19eY3SDiIgaB/MuEZHhGaw4BgAzMzNcv37dkF0SEVEdmHeJiAxLrznHe/bs0XktCAJycnKwdu1aDBw40CCBERHRH5h3iYiahl7F8SuvvKLzWiaToX379hg6dChWrlxpiLiIiKga5l0ioqahV3FcUVFh6DiIiKgOzLtERE3DoHOOiYiIiIiaM71GjkNCQurddtWqVfrsgoiIqmHeJSJqGnoVx2fOnMGZM2dQWlqK7t27AwB++uknmJqaok+fPmI7mUxmmCiJiFo45l0ioqahV3H88ssvo3Xr1ti0aROeeuopAA9uUD958mQ8//zzeO+99wwaJBFRS8e8S0TUNPSac7xy5UqEhYWJCRoAnnrqKXz44Ye8apqIqBEw7xIRNQ29imOtVosbN27UWH/jxg3cvn37sYMiIiJdzLtERE1Dr+L41VdfxeTJk7Fr1y789ttv+O233/Dtt9/C398fY8aMMXSMREQtHvMuEVHT0GvOcVRUFGbNmoVx48ahtLT0QUdmZvD398cnn3xi0ACJiIh5l4ioqehVHFtZWWHdunX45JNP8MsvvwAAnnnmGVhbWxs0OCIieoB5l4ioaTzWQ0BycnKQk5ODrl27wtraGoIgGCouIiKqBfMuEVHj0qs4/t///odhw4ahW7duGDlyJHJycgAA/v7+vJ0QEVEjMFTeXb9+PXr16gWlUgmlUgmNRoP9+/eL24uKihAQEIC2bduiVatW8PHxQV5enk4f2dnZ8Pb2hpWVFWxtbTF79myUlZXptElMTESfPn2gUCjQpUsXxMTE6H/wRERNSK/iODg4GObm5sjOzoaVlZW4/s0338SBAwfq3Q+TNBFR/Rgq73bo0AHLly9HamoqTp8+jaFDh2L06NG4cOGCuJ/vv/8eO3fuxNGjR3H9+nWdC/7Ky8vh7e2NkpISJCUlYdOmTYiJicGCBQvENllZWfD29saQIUOQlpaGoKAgTJ06FXFxcQb4JIiIGpdec44PHjyIuLg4dOjQQWd9165d8euvv9a7n6ok3bVrVwiCgE2bNmH06NE4c+YMevTogeDgYMTGxmLnzp1QqVQIDAzEmDFjcPz4cQB/JGm1Wo2kpCTk5OTA19cX5ubmWLZsGYA/kvS0adOwdetWJCQkYOrUqbC3t4eXl5c+h09E1OQMlXdffvllndcfffQR1q9fj5SUFHTo0AEbN27Etm3bMHToUABAdHQ0XFxckJKSggEDBuDgwYPIyMjAoUOHYGdnB3d3dyxduhRz587FokWLIJfLERUVBScnJ/H+yy4uLvjhhx8QHh7OvEtERk+vkeO7d+/qjFxUuXnzJhQKRb37efnllzFy5Eh07doV3bp1w0cffYRWrVohJSUFhYWF2LhxI1atWoWhQ4fCw8MD0dHRSEpKQkpKCgCISXrLli1wd3fHiBEjsHTpUkRGRqKkpAQAdJK0i4sLAgMD8dprryE8PFyfQycikoSh8m515eXl2L59O+7evQuNRoPU1FSUlpbC09NTbOPs7IyOHTsiOTkZAJCcnAw3NzfY2dmJbby8vKDVasXR5+TkZJ0+qtpU9VGb4uJiaLVanYWISAp6FcfPP/88Nm/eLL6WyWSoqKjAihUrMGTIEL0CYZImIno4Q+bd9PR0tGrVCgqFAtOmTcPu3bvh6uqK3NxcyOVy2NjY6LS3s7NDbm4uACA3N1cn51Ztr9pWVxutVov79+/XGlNYWBhUKpW4ODo6NuiYiIgMRa9pFStWrMCwYcNw+vRplJSUYM6cObhw4QJu3rwpTnmor/T0dGg0GhQVFaFVq1Zikk5LS2uSJG1paVkjprCwMCxevLhBx0FE1JgMmXe7d++OtLQ0FBYW4l//+hf8/Pxw9OjRRoq8fkJDQxESEiK+1mq1LJCJSBJ6jRz37NkTP/30EwYNGoTRo0fj7t27GDNmDM6cOYNnnnmmQX1VJekTJ05g+vTp8PPzQ0ZGhj5hGUxoaCgKCwvF5dq1a5LGQ0RkyLwrl8vRpUsXeHh4ICwsDL1790ZERATUajVKSkpQUFCg0z4vLw9qtRoAoFara1wYXfX6UW2USmWtAxIAoFAoxIuzqxYiIik0eOS4tLQUL730EqKiovDBBx88dgBVSRoAPDw8cOrUKURERODNN98Uk3T10eM/J+mTJ0/q9GeoJK3vHD4iIkMzdN79s4qKChQXF8PDwwPm5uZISEiAj48PACAzMxPZ2dnQaDQAAI1Gg48++gj5+fmwtbUFAMTHx0OpVMLV1VVss2/fPp19xMfHi30QERmzBo8cm5ub49y5c40RC4Dak3SV2pJ0eno68vPzxTa1JenqfVS1YZImoubCkHk3NDQUx44dw9WrV5Geno7Q0FAkJiZi/PjxUKlU8Pf3R0hICI4cOYLU1FRMnjwZGo0GAwYMAAAMHz4crq6umDhxIs6ePYu4uDjMmzcPAQEB4qDCtGnTcOXKFcyZMweXLl3CunXrsGPHDgQHBxvkGIiIGpNe0yomTJiAjRs3PvbOmaSJiOrHUHk3Pz8fvr6+6N69O4YNG4ZTp04hLi4Of/vb3wAA4eHhGDVqFHx8fPDCCy9ArVZj165d4vtNTU2xd+9emJqaQqPRYMKECfD19cWSJUvENk5OToiNjUV8fDx69+6NlStXYsOGDbyNGxE1C3pdkFdWVoavvvoKhw4dgoeHB6ytrXW2r1q1ql79VCXpnJwcqFQq9OrVq0aSNjExgY+PD4qLi+Hl5YV169aJ769K0tOnT4dGo4G1tTX8/PxqTdLBwcGIiIhAhw4dmKSJqNkxVN59VIFtYWGByMhIREZGPrRNp06dakyb+LPBgwfjzJkz9YqJiMiYyARBEOrb+MqVK+jcuTOGDRv28A5lMhw+fNggwRkLrVYLlUqFwsJCXiRCzVbn92OlDqFWV5d7Sx2CJOqbV5h3mXepHhappI6gdosKpY6AqqlvXmnQyHHXrl2Rk5ODI0eOAHjw2NI1a9bUuFUaEREZBvMuEVHTatCc4z8PMu/fvx937941aEBERPQH5l0ioqal1wV5VRowI4OIiAyAeZeIqHE1qDiWyWSQyWQ11hERUeNg3iUialoNmnMsCAImTZok3iatqKgI06ZNq3HVdPXb/hARkf6Yd4mImlaDimM/Pz+d1xMmTDBoMEREpIt5l4ioaTWoOI6Ojm6sOIiIqBbMu0RETeuxLsgjIiIiInqSsDgmIiIiIqrE4piIiIiIqBKLYyIiIiKiSiyOiYiIiIgqsTgmIiIiIqrE4piIiIiIqBKLYyIiIiKiSiyOiYiIiIgqsTgmIiIiIqrE4piIiIiIqBKLYyKiFiQsLAz9+vVD69atYWtri1deeQWZmZk6bYqKihAQEIC2bduiVatW8PHxQV5enk6b7OxseHt7w8rKCra2tpg9ezbKysp02iQmJqJPnz5QKBTo0qULYmJiGvvwiIgem6TFMZM0EVHTOnr0KAICApCSkoL4+HiUlpZi+PDhuHv3rtgmODgY33//PXbu3ImjR4/i+vXrGDNmjLi9vLwc3t7eKCkpQVJSEjZt2oSYmBgsWLBAbJOVlQVvb28MGTIEaWlpCAoKwtSpUxEXF9ekx0tE1FCSFsdM0kRETevAgQOYNGkSevTogd69eyMmJgbZ2dlITU0FABQWFmLjxo1YtWoVhg4dCg8PD0RHRyMpKQkpKSkAgIMHDyIjIwNbtmyBu7s7RowYgaVLlyIyMhIlJSUAgKioKDg5OWHlypVwcXFBYGAgXnvtNYSHh0t27ERE9SFpcWysSbq4uBharVZnISJ6EhUWFgIA2rRpAwBITU1FaWkpPD09xTbOzs7o2LEjkpOTAQDJyclwc3ODnZ2d2MbLywtarRYXLlwQ21Tvo6pNVR9/xrxLRMbCqOYcG0uSDgsLg0qlEhdHR0fDHSQRkZGoqKhAUFAQBg4ciJ49ewIAcnNzIZfLYWNjo9PWzs4Oubm5YpvqObdqe9W2utpotVrcv3+/RizMu0RkLIymODamJB0aGorCwkJxuXbtmkGOkYjImAQEBOD8+fPYvn271KEw7xKR0TCTOoAqVUn6hx9+kDoUKBQKKBQKqcMgImo0gYGB2Lt3L44dO4YOHTqI69VqNUpKSlBQUKAzMJGXlwe1Wi22OXnypE5/VRdKV2/z54un8/LyoFQqYWlpWSMe5l0iMhZGMXJclaSPHDny0CRd3Z+TdG0JuGpbXW0elqSJiJ5UgiAgMDAQu3fvxuHDh+Hk5KSz3cPDA+bm5khISBDXZWZmIjs7GxqNBgCg0WiQnp6O/Px8sU18fDyUSiVcXV3FNtX7qGpT1QcRkbGStDhmkiYialoBAQHYsmULtm3bhtatWyM3Nxe5ubniFDOVSgV/f3+EhITgyJEjSE1NxeTJk6HRaDBgwAAAwPDhw+Hq6oqJEyfi7NmziIuLw7x58xAQECCO/k6bNg1XrlzBnDlzcOnSJaxbtw47duxAcHCwZMdORFQfkk6rCAgIwLZt2/Dvf/9bTNLAg+RsaWmpk6TbtGkDpVKJGTNmPDRJr1ixArm5ubUm6bVr12LOnDmYMmUKDh8+jB07diA2NlayYyciksL69esBAIMHD9ZZHx0djUmTJgEAwsPDYWJiAh8fHxQXF8PLywvr1q0T25qammLv3r2YPn06NBoNrK2t4efnhyVLlohtnJycEBsbi+DgYERERKBDhw7YsGEDvLy8Gv0YiYgeh0wQBEGynctkta6vnqSLiorw3nvv4euvv9ZJ0lVTJgDg119/xfTp05GYmCgm6eXLl8PM7I/aPzExEcHBwcjIyECHDh0wf/58cR+PotVqoVKpUFhYCKVSqffxEkmp8/vG+cfg1eXeUocgCeaVuvHzoQZZpJI6gtotKpQ6AqqmvnlF0pHj+tTlFhYWiIyMRGRk5EPbdOrUCfv27auzn8GDB+PMmTMNjpGIiIiIWg6juCCPiIiIiMgYsDgmIiIiIqrE4piIiIiIqBKLYyIiIiKiSiyOiYiIiIgqGc3jo4mIiIieKA29xRxv/WYUOHJMRERERFSJxTERERERUSVOqyAiSTX0yX0t9Yl6RETUNDhyTERERERUicUxEREREVElFsdERERERJVYHBMRERERVWJxTERERERUiXerIGqGGnqHByKiZqOhD84gMjCOHBMRERERVWJxTERERERUicUxEVELcuzYMbz88stwcHCATCbDd999p7NdEAQsWLAA9vb2sLS0hKenJy5fvqzT5ubNmxg/fjyUSiVsbGzg7++PO3fu6LQ5d+4cnn/+eVhYWMDR0RErVqxo7EMjIjIISYtjJmkioqZ19+5d9O7dG5GRkbVuX7FiBdasWYOoqCicOHEC1tbW8PLyQlFRkdhm/PjxuHDhAuLj47F3714cO3YM77zzjrhdq9Vi+PDh6NSpE1JTU/HJJ59g0aJF+OKLLxr9+IiIHpekxTGTNBFR0xoxYgQ+/PBDvPrqqzW2CYKA1atXY968eRg9ejR69eqFzZs34/r16+LgxcWLF3HgwAFs2LAB/fv3x6BBg/DZZ59h+/btuH79OgBg69atKCkpwVdffYUePXpg7NixePfdd7Fq1aqmPFQiIr1IWhwzSRMRGY+srCzk5ubC09NTXKdSqdC/f38kJycDAJKTk2FjY4O+ffuKbTw9PWFiYoITJ06IbV544QXI5XKxjZeXFzIzM3Hr1q1a911cXAytVquzEBFJwWjnHDNJExE1rdzcXACAnZ2dzno7OztxW25uLmxtbXW2m5mZoU2bNjptauuj+j7+LCwsDCqVSlwcHR0f/4CIiPRgtMUxkzQRUcsRGhqKwsJCcbl27ZrUIRFRC2W0xbGUmKSJqCVSq9UAgLy8PJ31eXl54ja1Wo38/Hyd7WVlZbh586ZOm9r6qL6PP1MoFFAqlToLEZEUjLY4ZpImImpaTk5OUKvVSEhIENdptVqcOHECGo0GAKDRaFBQUIDU1FSxzeHDh1FRUYH+/fuLbY4dO4bS0lKxTXx8PLp3746nnnqqiY6GiEg/RlscM0kTERnenTt3kJaWhrS0NAAPru9IS0tDdnY2ZDIZgoKC8OGHH2LPnj1IT0+Hr68vHBwc8MorrwAAXFxc8NJLL+Htt9/GyZMncfz4cQQGBmLs2LFwcHAAAIwbNw5yuRz+/v64cOECvvnmG0RERCAkJESioyYiqj8zKXd+584d/Pzzz+LrqiTdpk0bdOzYUUzSXbt2hZOTE+bPn//QJB0VFYXS0tJak/TixYvh7++PuXPn4vz584iIiEB4eLgUh0xEJKnTp09jyJAh4uuqgtXPzw8xMTGYM2cO7t69i3feeQcFBQUYNGgQDhw4AAsLC/E9W7duRWBgIIYNGwYTExP4+PhgzZo14naVSoWDBw8iICAAHh4eaNeuHRYsWKBzm00iImMlEwRBkGrniYmJOkm6SlWSFgQBCxcuxBdffCEm6XXr1qFbt25i25s3byIwMBDff/+9TpJu1aqV2ObcuXMICAjAqVOn0K5dO8yYMQNz586td5xarRYqlQqFhYWcYkFGofP7sVKHIJmry72lDsEgmFfqxs+nBVukkjoC6SwqlDqCJ1p984qkxXFzwSRNxobFcfPHvFI3fj4tGItjaiT1zStGO+eYiIiIiKipsTgmIiIiIqrE4piIiIiIqBKLYyIiIiKiSiyOiYiIiIgqsTgmIiIiIqrE4piIiIiIqBKLYyIiIiKiSpI+PpqIHmjJD/UgIiIyJhw5JiIiIiKqxJFjImpW9Bllf1IeOU3ULLXkx0E3lD6fFR85bXAcOSYiIiIiqsTimIiIiIioEotjIiIiIqJKLI6JiIiIiCqxOCYiIiIiqsS7VRAZGO9ZTERE1HyxOCYiIqL64W3ZqAVoUdMqIiMj0blzZ1hYWKB///44efKk1CERET3RmHeJqLlpMSPH33zzDUJCQhAVFYX+/ftj9erV8PLyQmZmJmxtbaUOj4wUp0g8GRr6/8iHhhgG824zwJFgohpkgiAIUgfRFPr3749+/fph7dq1AICKigo4OjpixowZeP/99+t8r1arhUqlQmFhIZRKZVOES42ExS7VR1MUxy0hrzDvNjEWulRfLfSpevXNKy1i5LikpASpqakIDQ0V15mYmMDT0xPJyck12hcXF6O4uFh8XVj44IdIq9U2frBPiJ4L46QOgUhvHYN3Nvg95xd7Nah9VT55UscnmHf/JKyD1BEQ/eFJ+b1qoPrm3RZRHP/3v/9FeXk57OzsdNbb2dnh0qVLNdqHhYVh8eLFNdY7Ojo2WoxE1LypVuv3vtu3b0OlevJG/Jh3iYzY8icv5zTEo/JuiyiOGyo0NBQhISHi64qKCty8eRNt27aFTCarVx9arRaOjo64du1aszwl2Jzjb86xA4xfSk0ZuyAIuH37NhwcHBp1P80F827zjr85xw4wfikZY95tEcVxu3btYGpqiry8PJ31eXl5UKvVNdorFAooFAqddTY2NnrtW6lUNrsf1Oqac/zNOXaA8UupqWJ/EkeMqzDv6q85x9+cYwcYv5SMKe+2iFu5yeVyeHh4ICEhQVxXUVGBhIQEaDQaCSMjInoyMe8SUXPVIkaOASAkJAR+fn7o27cvnnvuOaxevRp3797F5MmTpQ6NiOiJxLxLRM1RiymO33zzTdy4cQMLFixAbm4u3N3dceDAgRoXixiKQqHAwoULa5wmbC6ac/zNOXaA8UupOcdujJh3G6Y5x9+cYwcYv5SMMfYWc59jIiIiIqJHaRFzjomIiIiI6oPFMRERERFRJRbHRERERESVWBwTEREREVVicUxEREREVInFMRERERFRJRbHRERERESVWBwTEREREVVicUxEREREVKnFPD76cVRUVOD69eto3bo1ZDKZ1OEQ0RNAEATcvn0bDg4OMDHhOMWfMe8SkaHVN++yOK6H69evw9HRUeowiOgJdO3aNXTo0EHqMIwO8y4RNZZH5V0Wx/XQunVrAA8+TKVSKXE0RPQk0Gq1cHR0FPML6WLeJSJDq2/eZXFcD1Wn9JRKJZM0ERkUpwzUjnmXiBrLo/IuJ7oREREREVVicUxEREREVInFMRERERFRJc45NhBBEFBWVoby8nKpQ6FGZG5uDlNTU6nDICIw77ZUpqamMDMz43x9ajQsjg2gpKQEOTk5uHfvntShUCOTyWTo0KEDWrVqJXUoRC0a827LZmVlBXt7e8jlcqlDoScQi+PHVFFRgaysLJiamsLBwQFyuZx/zT6hBEHAjRs38Ntvv6Fr164cQSaSCPNuyyUIAkpKSnDjxg1kZWWha9eufIgOGRyL48dUUlKCiooKODo6wsrKSupwqJG1b98eV69eRWlpKYtjIokw77ZslpaWMDc3x6+//oqSkhJYWFhIHRI9YVgcGwj/cm0ZmvPolNsmtwa1T/dLb6RIiAyDebflMsT//UVnlwa1d7l08bH3Sc0DMwsRERERUSUWx0RERERElSQtjjt37gyZTFZjCQgIAAAUFRUhICAAbdu2RatWreDj44O8vDydPrKzs+Ht7Q0rKyvY2tpi9uzZKCsr02mTmJiIPn36QKFQoEuXLoiJiWmqQ6R6GDx4MIKCgoymHyKixmLseerq1auQyWRIS0t7rH46d+6M1atX19lGJpPhu+++e6z9EDUGSeccnzp1Suf+lOfPn8ff/vY3vP766wCA4OBgxMbGYufOnVCpVAgMDMSYMWNw/PhxAEB5eTm8vb2hVquRlJSEnJwc+Pr6wtzcHMuWLQMAZGVlwdvbG9OmTcPWrVuRkJCAqVOnwt7eHl5eXo16fA2d4/m4Wsoc0cTERAwZMgS3bt2CjY2NuH7Xrl0wNzeXLjAiklxD55E+Ls5DJXrySFoct2/fXuf18uXL8cwzz+DFF19EYWEhNm7ciG3btmHo0KEAgOjoaLi4uCAlJQUDBgzAwYMHkZGRgUOHDsHOzg7u7u5YunQp5s6di0WLFkEulyMqKgpOTk5YuXIlAMDFxQU//PADwsPDG704pqbVpk0bqUMgIiKiZs5o5hyXlJRgy5YtmDJlCmQyGVJTU1FaWgpPT0+xjbOzMzp27Ijk5GQAQHJyMtzc3GBnZye28fLyglarxYULF8Q21fuoalPVR22Ki4uh1Wp1lifR4MGDERgYiMDAQKhUKrRr1w7z58+HIAgAgFu3bsHX1xdPPfUUrKysMGLECFy+fFl8f0xMDGxsbPDdd9+ha9eusLCwgJeXF65duya2mTRpEl555RWd/QYFBWHw4MEPjeuf//wn+vbti9atW0OtVmPcuHHIz88H8OCU35AhQwAATz31FGQyGSZNmiQeT/XTlfWNPy4uDi4uLmjVqhVeeukl5OTk6PNxEhHVS0VFBebMmYM2bdpArVZj0aJF4rbs7GyMHj0arVq1glKpxBtvvKEznbA+OfVf//oX3NzcYGlpibZt28LT0xN3794Vt2/YsAEuLi6wsLCAs7Mz1q1bVyPGK1euYMiQIbCyskLv3r1rfGd+++236NGjBxQKBTp37iwOQD3M5cuX8cILL8DCwgKurq6Ij4/X2V5SUoLAwEDY29vDwsICnTp1QlhYWJ19EjUWoymOv/vuOxQUFIiFTm5uLuRyuc5pcwCws7NDbm6u2KZ6YVy1vWpbXW20Wi3u379fayxhYWFQqVTi4ujo+LiHZ7Q2bdoEMzMznDx5EhEREVi1ahU2bNgA4EESPn36NPbs2YPk5GQIgoCRI0eitLRUfP+9e/fw0UcfYfPmzTh+/DgKCgowduzYx4qptLQUS5cuxdmzZ/Hdd9/h6tWr4s+Fo6Mjvv32WwBAZmYmcnJyEBERUWs/9Y3/008/xT//+U8cO3YM2dnZmDVr1mPFT2TMeK2H9DZt2gRra2ucOHECK1aswJIlSxAfH4+KigqMHj0aN2/exNGjRxEfH48rV67gzTffrHffOTk5eOuttzBlyhRcvHgRiYmJGDNmjDjosXXrVixYsAAfffQRLl68iGXLlmH+/PnYtGmTTj8ffPABZs2ahbS0NHTr1g1vvfWW+H+cmpqKN954A2PHjkV6ejoWLVqE+fPnP/T/uKKiAmPGjIFcLseJEycQFRWFuXPn6rRZs2YN9uzZgx07diAzMxNbt25F586d6/+hEhmQ0dzneOPGjRgxYgQcHBykDgWhoaEICQkRX2u12ie2QHZ0dER4eDhkMhm6d++O9PR0hIeHY/DgwdizZw+OHz+Ov/71rwAeJFVHR0d899134rzw0tJSrF27Fv379wfwIOm7uLjg5MmTeO655/SKacqUKeK/n376aaxZswb9+vXDnTt30KpVK3H6hK2tbY0/nqpcvny53vFHRUXhmWeeAQAEBgZiyZIlesVN1Bw86dd6NAe9evXCwoULAQBdu3bF2rVrkZCQAABIT09HVlaW+J2zefNm9OjRA6dOnUK/fv0e2XdOTg7KysowZswYdOrUCQDg5vbH9S8LFy7EypUrMWbMGACAk5MTMjIy8Pnnn8PPz09sN2vWLHh7ewMAFi9ejB49euDnn3+Gs7MzVq1ahWHDhmH+/PkAgG7duiEjIwOffPKJOJBR3aFDh3Dp0iXExcWJ3/HLli3DiBEjxDbZ2dno2rUrBg0aBJlMJsZOJAWjGDn+9ddfcejQIUydOlVcp1arUVJSgoKCAp22eXl5UKvVYps/j2hUvX5UG6VSCUtLy1rjUSgUUCqVOsuTasCAAToPttBoNLh8+TIyMjJgZmYmFr0A0LZtW3Tv3h0XL/5xAYqZmZlOwnZ2doaNjY1Om4ZKTU3Fyy+/jI4dO6J169Z48cUXATxInvV18eLFesVvZWUlFsYAYG9vL07hIHoStW/fHmq1Wlz27t1b41qPVatWYejQofDw8EB0dDSSkpKQkpICAOK1Hlu2bIG7uztGjBiBpUuXIjIyEiUlJQCgc62Hi4sLAgMD8dprryE8PFzKQzcavXr10nldlXcuXrwIR0dHncEYV1fXBuXU3r17Y9iwYXBzc8Prr7+OL7/8Erdu3QIA3L17F7/88gv8/f3RqlUrcfnwww/xyy+/PDRGe3t7ABBz48WLFzFw4ECd9gMHDsTly5d1/vCqUnVc1Qe/NBqNTptJkyYhLS0N3bt3x7vvvouDBw/W63iJGoNRFMfR0dGwtbUV/0oFAA8PD5ibm4t/TQMPTqNnZ2eLv1QajQbp6ek6xUx8fDyUSiVcXV3FNtX7qGrz519MahwmJibi6bwq1ac1/Nndu3fh5eUFpVKJrVu34tSpU9i9ezcAiF+8hvTnu1vIZLIa8RI9qXithzRqyzsVFRX1eu+jcqqpqSni4+Oxf/9+uLq64rPPPkP37t2RlZWFO3fuAAC+/PJLpKWlicv58+fFP35qi7FqAKW+MeqjT58+yMrKwtKlS3H//n288cYbeO211xptf0R1kbw4rqioQHR0NPz8/GBm9scsD5VKBX9/f4SEhODIkSNITU3F5MmTodFoMGDAAADA8OHD4erqiokTJ+Ls2bOIi4vDvHnzEBAQAIVCAQCYNm0arly5gjlz5uDSpUtYt24dduzYgeDgYEmO19icOHFC53VKSgq6du0KV1dXlJWV6Wz/3//+h8zMTPEPDwAoKyvD6dOnxdeZmZkoKCiAi8uD2ym1b9++xgVudd0/89KlS/jf//6H5cuX4/nnn4ezs3ONkVy5XA4AtY5QVHFxcalX/EQtGa/1MC4uLi64du2azkXNGRkZKCgoEPNWfXKqTCbDwIEDsXjxYpw5cwZyuRy7d++GnZ0dHBwccOXKFXTp0kVncXJyalCcVdNsqhw/fhzdunWDqanpQ4+retx/LsYBQKlU4s0338SXX36Jb775Bt9++y1u3rxZ77iIDEXy4vjQoUPIzs7WmWdaJTw8HKNGjYKPjw9eeOEFqNVq7Nq1S9xuamqKvXv3wtTUFBqNBhMmTICvr6/OnFEnJyfExsYiPj4evXv3xsqVK7FhwwbOe6uUnZ2NkJAQZGZm4uuvv8Znn32GmTNnomvXrhg9ejTefvtt/PDDDzh79iwmTJiAv/zlLxg9erT4fnNzc8yYMQMnTpxAamoqJk2ahAEDBojzjYcOHYrTp09j8+bNuHz5MhYuXIjz588/NJ6OHTtCLpfjs88+w5UrV7Bnzx4sXbpUp02nTp0gk8mwd+9e3LhxQxwNqa6+8RO1ZMZ2rUdhYaG4VC8QWwpPT0+4ublh/Pjx+PHHH3Hy5En4+vrixRdfRN++fQE8OqeeOHECy5Ytw+nTp5GdnY1du3bhxo0b4oDF4sWLERYWhjVr1uCnn35Ceno6oqOjsWrVqnrH+d577yEhIQFLly7FTz/9hE2bNmHt2rUPvZjZ09MT3bp1g5+fH86ePYv//Oc/+OCDD3TarFq1Cl9//TUuXbqEn376CTt37oRarX7odSVEjUnyC/KGDx/+0NPYFhYWiIyMRGRk5EPf36lTJ+zbt6/OfQwePBhnzpx5rDj10RweyuHr64v79+/jueeeg6mpKWbOnIl33nkHwIPpLjNnzsSoUaNQUlKCF154Afv27dM53WZlZYW5c+di3Lhx+P333/H8889j48aN4nYvLy/Mnz8fc+bMQVFREaZMmQJfX1+kp9f+2bRv3x4xMTH4xz/+gTVr1qBPnz749NNP8f/+3/8T2/zlL3/B4sWL8f7772Py5Mnw9fWt9Srp+sRP1FJVXetRfcCh+rUe1YuSP1/rcfLkSZ2+DHWtR9UZv8fRnB/KIZPJ8O9//xszZszACy+8ABMTE7z00kv47LPPxDaPyqlKpRLHjh3D6tWrodVq0alTJ6xcuVK8+G3q1KmwsrLCJ598gtmzZ8Pa2hpubm4Nempfnz59sGPHDixYsABLly6Fvb09lixZUuvFeMCDqSC7d++Gv78/nnvuOXTu3Blr1qzBSy+9JLZp3bo1VqxYgcuXL8PU1BT9+vXDvn37YGIi+RgetUAygRMsH0mr1UKlUqGwsLDGxXlFRUXIysqCk5MTLCwsJIpQP4MHD4a7u/sjH/H5MDExMQgKCqpx0eSTrDn/fzf0iY3N4Y+75qyuvNIUFi1ahM8//xzXrl0Tp7QVFhaiffv2+Prrr+Hj4wPgwVQpZ2dnJCcnY8CAAdi/fz9GjRqFnJwc2NraAgC++OILzJ49G/n5+VAoFJg7dy727dun80fwuHHjcPPmTRw4cKBe8T2peZcMwxA/Aw19mmJz/sOLHqhv3uWfZERELQyv9SAiejjJp1UQEVHTetS1HiYmJvDx8UFxcTG8vLx0nqBWda3H9OnTodFoYG1tDT8/v1qv9QgODkZERAQ6dOjAaz2IqNngtIp64Ok9qtKc/785rcK4SD2twtgx71JdOK2C9MFpFUREREREDcTi2EA4AN8y8P+ZyHjw97Hl4v89NSYWx4+p6rZg9+7dkzgSagpVT+mr7Ub3RNQ0mHep6v+et+akxsAL8h6TqakpbGxsxKe4WVlZiY/apCdLRUUFbty4ASsrK50r/ImoaTHvtlyCIODevXvIz8+HjY0NByqoUfAb3gCqbnz/58cc05PHxMQEHTt25BcxkcSYd1s2Gxsb8WeAyNBYHBuATCaDvb09bG1tUVpaKnU41Ijkcjmf2ERkBJh3Wy5zc3OOGFOjYnFsQKampvyFJSJqQsy7RGRoHAIjIiIiIqrE4piIiIiIqBKLYyIiIiKiSiyOiYiIiIgqsTgmIiIiIqrE4piIiIiIqBKLYyIiIiKiSiyOiYiIiIgqSV4c//7775gwYQLatm0LS0tLuLm54fTp0+J2QRCwYMEC2Nvbw9LSEp6enrh8+bJOHzdv3sT48eOhVCphY2MDf39/3LlzR6fNuXPn8Pzzz8PCwgKOjo5YsWJFkxwfERERETUfkhbHt27dwsCBA2Fubo79+/cjIyMDK1euxFNPPSW2WbFiBdasWYOoqCicOHEC1tbW8PLyQlFRkdhm/PjxuHDhAuLj47F3714cO3YM77zzjrhdq9Vi+PDh6NSpE1JTU/HJJ59g0aJF+OKLL5r0eImIiIjIuEn6+OiPP/4Yjo6OiI6OFtc5OTmJ/xYEAatXr8a8efMwevRoAMDmzZthZ2eH7777DmPHjsXFixdx4MABnDp1Cn379gUAfPbZZxg5ciQ+/fRTODg4YOvWrSgpKcFXX30FuVyOHj16IC0tDatWrdIpoqsUFxejuLhYfK3VahvrIyAiIiIiIyLpyPGePXvQt29fvP7667C1tcWzzz6LL7/8UtyelZWF3NxceHp6iutUKhX69++P5ORkAEBycjJsbGzEwhgAPD09YWJighMnTohtXnjhBcjlcrGNl5cXMjMzcevWrRpxhYWFQaVSiYujo6PBj52IiIiIjI+kxfGVK1ewfv16dO3aFXFxcZg+fTreffddbNq0CQCQm5sLALCzs9N5n52dnbgtNzcXtra2OtvNzMzQpk0bnTa19VF9H9WFhoaisLBQXK5du2aAoyUiMg681oOI6OEkLY4rKirQp08fLFu2DM8++yzeeecdvP3224iKipIyLCgUCiiVSp2FiOhJwGs9iIjqJumcY3t7e7i6uuqsc3FxwbfffgsAUKvVAIC8vDzY29uLbfLy8uDu7i62yc/P1+mjrKwMN2/eFN+vVquRl5en06bqdVUbIqKWgNd6EBHVTdKR44EDByIzM1Nn3U8//YROnToBeJCw1Wo1EhISxO1arRYnTpyARqMBAGg0GhQUFCA1NVVsc/jwYVRUVKB///5im2PHjqG0tFRsEx8fj+7du+uMlhARPel4rQcRUd0kLY6Dg4ORkpKCZcuW4eeff8a2bdvwxRdfICAgAAAgk8kQFBSEDz/8EHv27EF6ejp8fX3h4OCAV155BcCDkeaXXnoJb7/9Nk6ePInjx48jMDAQY8eOhYODAwBg3LhxkMvl8Pf3x4ULF/DNN98gIiICISEhUh06EZEkeK0HEVHdJJ1W0a9fP+zevRuhoaFYsmQJnJycsHr1aowfP15sM2fOHNy9exfvvPMOCgoKMGjQIBw4cAAWFhZim61btyIwMBDDhg2DiYkJfHx8sGbNGnG7SqXCwYMHERAQAA8PD7Rr1w4LFiyo9dQeEdGTrKKiAn379sWyZcsAAM8++yzOnz+PqKgo+Pn5SRaXQqGAQqGQbP9ERFUkLY4BYNSoURg1atRDt8tkMixZsgRLlix5aJs2bdpg27Ztde6nV69e+M9//qN3nERETwJe60FEVDfJHx9NRERNh9d6EBHVjcUxEVELwms9iIjqJvm0CiIiajq81oOIqG4yQRAEqYMwdlqtFiqVCoWFhXwgCDVbbpvcGtQ+3S+9kSIhgHnlUfj5UGO76OzSoPYuly42UiTUVOqbVzitgoiIiIioEotjIiIiIqJKLI6JiIiIiCqxOCYiIiIiqsTimIiIiIioEotjIiIiIqJKLI6JiIiIiCqxOCYiIiIiqsTimIiIiIioEotjIiIiIqJKLI6JiIiIiCqxOCYiIiIiqsTimIiIiIioEotjIiIiIqJKZlLufNGiRVi8eLHOuu7du+PSpUsAgKKiIrz33nvYvn07iouL4eXlhXXr1sHOzk5sn52djenTp+PIkSNo1aoV/Pz8EBYWBjOzPw4tMTERISEhuHDhAhwdHTFv3jxMmjSpSY6RqDG4bXKTOgQiIqInkuQjxz169EBOTo64/PDDD+K24OBgfP/999i5cyeOHj2K69evY8yYMeL28vJyeHt7o6SkBElJSdi0aRNiYmKwYMECsU1WVha8vb0xZMgQpKWlISgoCFOnTkVcXFyTHicRERERGT9JR44BwMzMDGq1usb6wsJCbNy4Edu2bcPQoUMBANHR0XBxcUFKSgoGDBiAgwcPIiMjA4cOHYKdnR3c3d2xdOlSzJ07F4sWLYJcLkdUVBScnJywcuVKAICLiwt++OEHhIeHw8vLq0mPlYiIiIiMm+Qjx5cvX4aDgwOefvppjB8/HtnZ2QCA1NRUlJaWwtPTU2zr7OyMjh07Ijk5GQCQnJwMNzc3nWkWXl5e0Gq1uHDhgtimeh9Vbar6qE1xcTG0Wq3OQkRERERPPkmL4/79+yMmJgYHDhzA+vXrkZWVheeffx63b99Gbm4u5HI5bGxsdN5jZ2eH3NxcAEBubq5OYVy1vWpbXW20Wi3u379fa1xhYWFQqVTi4ujoaIjDJSKS3KJFiyCTyXQWZ2dncXtRURECAgLQtm1btGrVCj4+PsjLy9PpIzs7G97e3rCysoKtrS1mz56NsrIynTaJiYno06cPFAoFunTpgpiYmKY4PCKixybptIoRI0aI/+7Vqxf69++PTp06YceOHbC0tJQsrtDQUISEhIivtVotC2QiemL06NEDhw4dEl9Xv4A5ODgYsbGx2LlzJ1QqFQIDAzFmzBgcP34cwB/XeqjVaiQlJSEnJwe+vr4wNzfHsmXLAPxxrce0adOwdetWJCQkYOrUqbC3t+d0NmoUF51dpA6BniCSzzmuzsbGBt26dcPPP/+Mv/3tbygpKUFBQYHO6HFeXp44R1mtVuPkyZM6fVSNcFRv8+dRj7y8PCiVyocW4AqFAgqFwlCHRURkVHitBxHRw0k+57i6O3fu4JdffoG9vT08PDxgbm6OhIQEcXtmZiays7Oh0WgAABqNBunp6cjPzxfbxMfHQ6lUwtXVVWxTvY+qNlV9EBG1NLzWg4jo4fQqjq9cuWKQnc+aNQtHjx7F1atXkZSUhFdffRWmpqZ46623oFKp4O/vj5CQEBw5cgSpqamYPHkyNBoNBgwYAAAYPnw4XF1dMXHiRJw9exZxcXGYN28eAgICxJHfadOm4cqVK5gzZw4uXbqEdevWYceOHQgODjbIMRARNQVD5V1e60FEVDe9iuMuXbpgyJAh2LJlC4qKivTe+W+//Ya33noL3bt3xxtvvIG2bdsiJSUF7du3BwCEh4dj1KhR8PHxwQsvvAC1Wo1du3aJ7zc1NcXevXthamoKjUaDCRMmwNfXF0uWLBHbODk5ITY2FvHx8ejduzdWrlyJDRs28NQeETUrhsq7I0aMwOuvv45evXrBy8sL+/btQ0FBAXbs2GHAaBsuNDQUhYWF4nLt2jVJ4yGilkuvOcc//vgjoqOjERISgsDAQLz55pvw9/fHc88916B+tm/fXud2CwsLREZGIjIy8qFtOnXqhH379tXZz+DBg3HmzJkGxUZEZEwMlXf/jNd6EBHp0mvk2N3dHREREbh+/Tq++uor5OTkYNCgQejZsydWrVqFGzduGDpOIqIWrbHyLq/1ICLS9VgX5JmZmWHMmDHYuXMnPv74Y/z888+YNWsWHB0d4evri5ycHEPFSUREePy8y2s9iIjq9ljF8enTp/H3v/8d9vb2WLVqFWbNmoVffvkF8fHxuH79OkaPHm2oOImICI+fd3mtBxFR3WSCIAgNfdOqVasQHR2NzMxMjBw5ElOnTsXIkSNhYvJHrf3bb7+hc+fONZ6a1BxptVqoVCoUFhZCqVRKHQ4R3Da5Nfo+0v3SG30fLVlD8wrzLtHDNcVDQFwuXWz0fVDjqm9e0euCvPXr12PKlCmYNGkS7O3ta21ja2uLjRs36tM9ERH9CfMuEVHT0Ks4vnz58iPbyOVy+Pn56dM9ERH9CfMuEVHT0GvOcXR0NHbu3Flj/c6dO7Fp06bHDoqIiHQx7xIRNQ29iuOwsDC0a9euxnpbW1ssW7bssYMiIiJdzLtERE1Dr+I4OzsbTk5ONdZ36tQJ2dnZjx0UERHpYt4lImoaehXHtra2OHfuXI31Z8+eRdu2bR87KCIi0sW8S0TUNPQqjt966y28++67OHLkCMrLy1FeXo7Dhw9j5syZGDt2rKFjJCJq8Zh3iYiahl53q1i6dCmuXr2KYcOGwczsQRcVFRXw9fXl3DciokbAvEtE1DT0Ko7lcjm++eYbLF26FGfPnoWlpSXc3NzQqVMnQ8dHRERg3iUiaip6FcdVunXrhm7duhkqFiIiegTmXSKixqVXcVxeXo6YmBgkJCQgPz8fFRUVOtsPHz5skOCIiOgB5l0ioqahV3E8c+ZMxMTEwNvbGz179oRMJjN0XEREVA3zLhFR09CrON6+fTt27NiBkSNHGjoeIiKqBfMuEVHT0OtWbnK5HF26dDF0LERE9BDMu0RETUOv4vi9995DREQEBEEwdDxERFQL5l0ioqahV3H8ww8/YOvWrXjmmWfw8ssvY8yYMTqLPpYvXw6ZTIagoCBxXVFREQICAtC2bVu0atUKPj4+yMvL03lfdnY2vL29YWVlBVtbW8yePRtlZWU6bRITE9GnTx8oFAp06dIFMTExesVIRCSVxsi7RERUk15zjm1sbPDqq68aLIhTp07h888/R69evXTWBwcHIzY2Fjt37oRKpUJgYCDGjBmD48ePA3hw9ba3tzfUajWSkpKQk5MDX19fmJubizfFz8rKgre3N6ZNm4atW7ciISEBU6dOhb29Pby8vAx2DEREjcnQeZeIiGonEyQ+R3fnzh306dMH69atw4cffgh3d3esXr0ahYWFaN++PbZt24bXXnsNAHDp0iW4uLggOTkZAwYMwP79+zFq1Chcv34ddnZ2AICoqCjMnTsXN27cgFwux9y5cxEbG4vz58+L+xw7diwKCgpw4MCBesWo1WqhUqlQWFgIpVJp+A+BqIHcNrlJHUKt0v3SpQ6h2WBeqRs/H2qIi84ujb4Pl0sXG30f1Ljqm1f0mlYBAGVlZTh06BA+//xz3L59GwBw/fp13Llzp0H9BAQEwNvbG56enjrrU1NTUVpaqrPe2dkZHTt2RHJyMgAgOTkZbm5uYmEMAF5eXtBqtbhw4YLY5s99e3l5iX3Upri4GFqtVmchIpKaofJuFU5nIyKqSa9pFb/++iteeuklZGdno7i4GH/729/QunVrfPzxxyguLkZUVFS9+tm+fTt+/PFHnDp1qsa23NxcyOVy2NjY6Ky3s7NDbm6u2KZ6YVy1vWpbXW20Wi3u378PS0vLGvsOCwvD4sWL63UMRERNwVB5twqnsxE1jD6j0xxtbp70GjmeOXMm+vbti1u3bukUl6+++ioSEhLq1ce1a9cwc+ZMbN26FRYWFvqE0WhCQ0NRWFgoLteuXZM6JCJq4QyRd6vcuXMH48ePx5dffomnnnpKXF9YWIiNGzdi1apVGDp0KDw8PBAdHY2kpCSkpKQAAA4ePIiMjAxs2bIF7u7uGDFiBJYuXYrIyEiUlJQAeDC9zcnJCStXroSLiwsCAwPx2muvITw83ACfBBFR49KrOP7Pf/6DefPmQS6X66zv3Lkzfv/993r1kZqaivz8fPTp0wdmZmYwMzPD0aNHsWbNGpiZmcHOzg4lJSUoKCjQeV9eXh7UajUAQK1W1zjdV/X6UW2USmWto8YAoFAooFQqdRYiIikZIu9W4XQ2IqKH06s4rqioQHl5eY31v/32G1q3bl2vPoYNG4b09HSkpaWJS9++fTF+/Hjx3+bm5jojIpmZmcjOzoZGowEAaDQapKenIz8/X2wTHx8PpVIJV1dXsc2fR1Xi4+PFPoiImgND5F3gj+lsYWFhNbY11XS22oSFhUGlUomLo6NjvY+JiMiQ9CqOhw8fjtWrV4uvZTIZ7ty5g4ULF9b70aatW7dGz549dRZra2u0bdsWPXv2hEqlgr+/P0JCQnDkyBGkpqZi8uTJ0Gg0GDBggBiHq6srJk6ciLNnzyIuLg7z5s1DQEAAFAoFAGDatGm4cuUK5syZg0uXLmHdunXYsWMHgoOD9Tl0IiJJGCLvcjobEdGj6XVB3sqVK+Hl5QVXV1cUFRVh3LhxuHz5Mtq1a4evv/7aYMGFh4fDxMQEPj4+KC4uhpeXF9atWyduNzU1xd69ezF9+nRoNBpYW1vDz88PS5YsEds4OTkhNjYWwcHBiIiIQIcOHbBhwwZeFEJEzYoh8m716WxVysvLcezYMaxduxZxcXHidLbqo8d/ns528uRJnX4NNZ2talCDiEhKet/nuKysDNu3b8e5c+fEexWPHz/+oYmvOeP9NsnY8D7HzZ8+eeVx8+7t27fx66+/6qybPHkynJ2dMXfuXDg6OqJ9+/b4+uuv4ePjA+DBdDZnZ+ca95fPycmBra0tAOCLL77A7NmzkZ+fD4VCgblz52Lfvn1IT//j52HcuHG4efMm7y9PjaIp7nOsD96twrjUN6/oNXIMAGZmZpgwYYK+byciogZ63LxbNZ2tuurT2QCI09natGkDpVKJGTNmPHQ624oVK5Cbm1vrdLa1a9dizpw5mDJlCg4fPowdO3YgNjZW79iJiJqKXsXx5s2b69zu6+urVzBERFS7psq7nM5GRC2dXtMqqt8XEwBKS0tx7949yOVyWFlZ4ebNmwYL0Bjw9B4ZG06raP4amleYd4kejtMqqD4a9fHRt27d0lnu3LmDzMxMDBo0yKAX5BER0QPMu0RETUOv4rg2Xbt2xfLlyzFz5kxDdUlERHVg3iUiMjyDFcfAg4tFrl+/bsguiYioDsy7RESGpdcFeXv27NF5LQgCcnJysHbtWgwcONAggRER0R+Yd4mImoZexfErr7yi81omk6F9+/YYOnQoVq5caYi4iIioGuZdIqKmoVdxXFFRYeg4iIioDsy7RERNw6BzjomIiIiImjO9Ro5DQkLq3XbVqlX67IKIiKph3iUiahp6FcdnzpzBmTNnUFpaiu7duwMAfvrpJ5iamqJPnz5iO5lMZpgoiYhaOOZdIqKmoVdx/PLLL6N169bYtGmT+NSmW7duYfLkyXj++efx3nvvGTRIIqKWjnmXiKhp6PX46L/85S84ePAgevToobP+/PnzGD58+BN3z00+xpSMDR8f3fw1NK8w7xI9HB8fTfXRqI+P1mq1uHHjRo31N27cwO3bt/XpkoiI6sC8S0TUNPQqjl999VVMnjwZu3btwm+//YbffvsN3377Lfz9/TFmzBhDx0hE1OIx7xIRNQ295hxHRUVh1qxZGDduHEpLSx90ZGYGf39/fPLJJwYNkIiImHeJiJqKXnOOq9y9exe//PILAOCZZ56BtbW1wQIzJpz7RsaGc46bP33zCvMuUU2cc0z10ahzjqvk5OQgJycHXbt2hbW1NR6jziYionpg3iUialx6Fcf/+9//MGzYMHTr1g0jR45ETk4OAMDf379BtxNav349evXqBaVSCaVSCY1Gg/3794vbi4qKEBAQgLZt26JVq1bw8fFBXl6eTh/Z2dnw9vaGlZUVbG1tMXv2bJSVlem0SUxMRJ8+faBQKNClSxfExMToc9hERJIxVN4lIqK66VUcBwcHw9zcHNnZ2bCyshLXv/nmmzhw4EC9++nQoQOWL1+O1NRUnD59GkOHDsXo0aNx4cIFcT/ff/89du7ciaNHj+L69es6F56Ul5fD29sbJSUlSEpKwqZNmxATE4MFCxaIbbKysuDt7Y0hQ4YgLS0NQUFBmDp1KuLi4vQ5dCIiSRgq7xIRUd30Ko4PHjyIjz/+GB06dNBZ37VrV/z666/17ufll1/GyJEj0bVrV3Tr1g0fffQRWrVqhZSUFBQWFmLjxo1YtWoVhg4dCg8PD0RHRyMpKQkpKSliHBkZGdiyZQvc3d0xYsQILF26FJGRkSgpKQHw4CIWJycnrFy5Ei4uLggMDMRrr72G8PBwfQ6diEgShsq7PGNHRFQ3vYrju3fv6oxcVLl58yYUCoVegZSXl2P79u24e/cuNBoNUlNTUVpaCk9PT7GNs7MzOnbsiOTkZABAcnIy3NzcYGdnJ7bx8vKCVqsVR5+Tk5N1+qhqU9VHbYqLi6HVanUWIiIpGSrv8owdEVHd9CqOn3/+eWzevFl8LZPJUFFRgRUrVmDIkCEN6is9PR2tWrWCQqHAtGnTsHv3bri6uiI3NxdyuRw2NjY67e3s7JCbmwsAyM3N1SmMq7ZXbaurjVarxf3792uNKSwsDCqVSlwcHR0bdExERIZmqLzLM3ZERHXT6z7HK1aswLBhw3D69GmUlJRgzpw5uHDhAm7evInjx483qK/u3bsjLS0NhYWF+Ne//gU/Pz8cPXpUn7AMJjQ0FCEhIeJrrVbLApmIJGXIvFulvLwcO3furPcZuwEDBjz0jN306dNx4cIFPPvssw89YxcUFPTQWIqLi1FcXCy+5hk7IpKKXiPHPXv2xE8//YRBgwZh9OjRuHv3LsaMGYMzZ87gmWeeaVBfcrkcXbp0gYeHB8LCwtC7d29ERERArVajpKQEBQUFOu3z8vKgVqsBAGq1usZcuKrXj2qjVCphaWlZa0wKhUKcj1e1EBFJyZB5l2fsiIgersEjx6WlpXjppZcQFRWFDz74wOABVVRUoLi4GB4eHjA3N0dCQgJ8fHwAAJmZmcjOzoZGowEAaDQafPTRR8jPz4etrS0AID4+HkqlEq6urmKbffv26ewjPj5e7IOIyNgZOu/yjB0R0cM1uDg2NzfHuXPnDLLz0NBQjBgxAh07dsTt27exbds2JCYmIi4uDiqVCv7+/ggJCUGbNm2gVCoxY8YMaDQaDBgwAAAwfPhwuLq6YuLEiVixYgVyc3Mxb948BAQEiBeoTJs2DWvXrsWcOXMwZcoUHD58GDt27EBsbKxBjoGIqLEZMu8Cf5yxAwAPDw+cOnUKERERePPNN8UzdtVHj/98xu7kyZM6/RnqjJ2+F3QTERmSXtMqJkyYgI0bNz72zvPz8+Hr64vu3btj2LBhOHXqFOLi4vC3v/0NABAeHo5Ro0bBx8cHL7zwAtRqNXbt2iW+39TUFHv37oWpqSk0Gg0mTJgAX19fLFmyRGzj5OSE2NhYxMfHo3fv3li5ciU2bNgALy+vx46fiKipGCrv1qa2M3ZVajtjl56ejvz8fLFNbWfsqvdR1YZn7IioOdDrgryysjJ89dVXOHToEDw8PGBtba2zfdWqVfXq51GJ3sLCApGRkYiMjHxom06dOtWYNvFngwcPxpkzZ+oVExGRMTJU3uUZOyKiujWoOL5y5Qo6d+6M8+fPo0+fPgCAn376SaeNTCYzXHRERC2cofNu1Rm7nJwcqFQq9OrVq8YZOxMTE/j4+KC4uBheXl5Yt26d+P6qM3bTp0+HRqOBtbU1/Pz8aj1jFxwcjIiICHTo0IFn7Iio2ZAJgiDUt7GpqSlycnLEi9/efPNNrFmzpsZVyU8arVYLlUqFwsJC3rmCjILbJjepQ6hVul+61CE0G/XNK8y7zLv0aBedXaQOoVYuly5KHQJVU9+80qA5x3+uo/fv34+7d+/qFyERET0S8y4RUdPS64K8Kg0YdCYiIgNg3iUialwNKo5lMlmNuW2cY0xE1HiYd4mImlaDLsgTBAGTJk0Sr0guKirCtGnTalw1Xf12a0REpD/mXSKiptWg4tjPz0/n9YQJEwwaDBER6WLeJSJqWg0qjqOjoxsrDiIiqgXzLhFR03qsC/KIiIiIiJ4kLI6JiIiIiCqxOCYiIiIiqsTimIiIiIioEotjIiIiIqJKLI6JiIiIiCqxOCYiIiIiqsTimIiIiIioEotjIiIiIqJKLI6JiIiIiCqxOCYiIiIiqiRpcRwWFoZ+/fqhdevWsLW1xSuvvILMzEydNkVFRQgICEDbtm3RqlUr+Pj4IC8vT6dNdnY2vL29YWVlBVtbW8yePRtlZWU6bRITE9GnTx8oFAp06dIFMTExjX14RERERNTMSFocHz16FAEBAUhJSUF8fDxKS0sxfPhw3L17V2wTHByM77//Hjt37sTRo0dx/fp1jBkzRtxeXl4Ob29vlJSUICkpCZs2bUJMTAwWLFggtsnKyoK3tzeGDBmCtLQ0BAUFYerUqYiLi2vS4yUikhoHJYiI6iYTBEGQOogqN27cgK2tLY4ePYoXXngBhYWFaN++PbZt24bXXnsNAHDp0iW4uLggOTkZAwYMwP79+zFq1Chcv34ddnZ2AICoqCjMnTsXN27cgFwux9y5cxEbG4vz58+L+xo7diwKCgpw4MCBR8al1WqhUqlQWFgIpVLZOAdP1ABum9ykDqFW6X7pUofQbEiVV1566SWMHTsW/fr1Q1lZGf7xj3/g/PnzyMjIgLW1NQBg+vTpiI2NRUxMDFQqFQIDA2FiYoLjx48DeDAo4e7uDrVajU8++QQ5OTnw9fXF22+/jWXLlgF4MCjRs2dPTJs2DVOnTkVCQgKCgoIQGxsLLy+vR8bJvEsNcdHZReoQauVy6aLUIVA19c0rRjXnuLCwEADQpk0bAEBqaipKS0vh6ekptnF2dkbHjh2RnJwMAEhOToabm5tYGAOAl5cXtFotLly4ILap3kdVm6o+/qy4uBharVZnISJ6Ehw4cACTJk1Cjx490Lt3b8TExCA7OxupqakAHuThjRs3YtWqVRg6dCg8PDwQHR2NpKQkpKSkAAAOHjyIjIwMbNmyBe7u7hgxYgSWLl2KyMhIlJSUAHgwSOHk5ISVK1fCxcUFgYGBeO211xAeHi7ZsRMR1YfRFMcVFRUICgrCwIED0bNnTwBAbm4u5HI5bGxsdNra2dkhNzdXbFO9MK7aXrWtrjZarRb379+vEUtYWBhUKpW4ODo6GuQYiYiMDQcliIh0GU1xHBAQgPPnz2P79u1Sh4LQ0FAUFhaKy7Vr16QOiYjI4DgoQURUk1EUx4GBgdi7dy+OHDmCDh06iOvVajVKSkpQUFCg0z4vLw9qtVps8+cLRapeP6qNUqmEpaVljXgUCgWUSqXOQkT0pOGgBBFRTZIWx4IgIDAwELt378bhw4fh5OSks93DwwPm5uZISEgQ12VmZiI7OxsajQYAoNFokJ6ejvz8fLFNfHw8lEolXF1dxTbV+6hqU9UHEVFLw0EJIqLaSVocBwQEYMuWLdi2bRtat26N3Nxc5ObmiqfcVCoV/P39ERISgiNHjiA1NRWTJ0+GRqPBgAEDAADDhw+Hq6srJk6ciLNnzyIuLg7z5s1DQEAAFAoFAGDatGm4cuUK5syZg0uXLmHdunXYsWMHgoODJTt2IiIpcFCCiKhuZlLufP369QCAwYMH66yPjo7GpEmTAADh4eEwMTGBj48PiouL4eXlhXXr1oltTU1NsXfvXkyfPh0ajQbW1tbw8/PDkiVLxDZOTk6IjY1FcHAwIiIi0KFDB2zYsKFetxMiInqSBAQEYNu2bfj3v/8tDkoADwYjLC0tdQYl2rRpA6VSiRkzZjx0UGLFihXIzc2tdVBi7dq1mDNnDqZMmYLDhw9jx44diI2NlezYiYjqw6juc2yseL9NMja8z3HzJ1Vekclkta6vPihRVFSE9957D19//bXOoETVlAkA+PXXXzF9+nQkJiaKgxLLly+HmdkfYy6JiYkIDg5GRkYGOnTogPnz54v7eBTmXWoI3ueY6qO+eYXFcT0wSZOxYXHc/DGv1I2fDzUEi2Oqj2b5EBAiIiIiIimxOCYiIiIiqsTimIiIiIiokqR3qyCiB4x1DjEREVFLw5FjIiIiIqJKLI6JiIiIiCqxOCYiIiIiqsTimIiIiIioEotjIiIiIqJKvFsFERERGQ1jfdodtRwcOSYiIiIiqsTimIiIiIioEotjIiIiIqJKnHNMRAajz5P+0v3SGyESIiLpNXT+tMuli40UCTUER46JiIiIiCqxOCYiIiIiqsTimIiIiIioEotjIiIiIqJKkhbHx44dw8svvwwHBwfIZDJ89913OtsFQcCCBQtgb28PS0tLeHp64vLlyzptbt68ifHjx0OpVMLGxgb+/v64c+eOTptz587h+eefh4WFBRwdHbFixYrGPjQiIqPEvEtEVDdJi+O7d++id+/eiIyMrHX7ihUrsGbNGkRFReHEiROwtraGl5cXioqKxDbjx4/HhQsXEB8fj7179+LYsWN45513xO1arRbDhw9Hp06dkJqaik8++QSLFi3CF1980ejHR0RkbJh3iYjqJhMEQZA6CACQyWTYvXs3XnnlFQAPRi8cHBzw3nvvYdasWQCAwsJC2NnZISYmBmPHjsXFixfh6uqKU6dOoW/fvgCAAwcOYOTIkfjtt9/g4OCA9evX44MPPkBubi7kcjkA4P3338d3332HS5cu1RpLcXExiouLxddarRaOjo4oLCyEUqlsxE+BWip9boH2pGipt3LTarVQqVSS5hVjyrt/ZgyfD0mjJT8+mrdya1z1zStGO+c4KysLubm58PT0FNepVCr0798fycnJAIDk5GTY2NiICRoAPD09YWJighMnTohtXnjhBTFBA4CXlxcyMzNx69atWvcdFhYGlUolLo6Ojo1xiERERkXKvFtcXAytVquzEBFJwWiL49zcXACAnZ2dzno7OztxW25uLmxtbXW2m5mZoU2bNjptauuj+j7+LDQ0FIWFheJy7dq1xz8gIiIjJ2Xe5aAEERkLoy2OpaRQKKBUKnUWIiJqPByUICJjYbTFsVqtBgDk5eXprM/LyxO3qdVq5Ofn62wvKyvDzZs3ddrU1kf1fRARkbR5l4MSRGQsjLY4dnJyglqtRkJCgrhOq9XixIkT0Gg0AACNRoOCggKkpqaKbQ4fPoyKigr0799fbHPs2DGUlpaKbeLj49G9e3c89dRTTXQ0RETGj3mXiEji4vjOnTtIS0tDWloagAcXg6SlpSE7OxsymQxBQUH48MMPsWfPHqSnp8PX1xcODg7ildUuLi546aWX8Pbbb+PkyZM4fvw4AgMDMXbsWDg4OAAAxo0bB7lcDn9/f1y4cAHffPMNIiIiEBISItFRExFJh3mXiKhuZlLu/PTp0xgyZIj4uipx+vn5ISYmBnPmzMHdu3fxzjvvoKCgAIMGDcKBAwdgYWEhvmfr1q0IDAzEsGHDYGJiAh8fH6xZs0bcrlKpcPDgQQQEBMDDwwPt2rXDggULdO7JSUTUUjDvEhHVzWjuc2zMeL9Namy8z3HLw7xSN34+LRfvc0yNpdnf55iIiIiIqKmxOCYiIiIiqsTimIiIiIioEotjIiIiIqJKLI6JiIiIiCqxOCYiIiIiqsTimIiIiIiokqQPASF6ErXkexYTERE1dxw5JiIiIiKqxJFjIiIiajQt+Yl31Dxx5JiIiIiIqBKLYyIiIiKiSiyOiYiIiIgqcc4xEUmqoXf3SPdLb6RIiIiIWBwTERERGQV9Ll50uXSxESJp2TitgoiIiIioEkeOierAB3oQEf2Bt2WjloAjx0RERERElVpUcRwZGYnOnTvDwsIC/fv3x8mTJ6UOiYjoica8S0TNTYuZVvHNN98gJCQEUVFR6N+/P1avXg0vLy9kZmbC1tZW6vCoiXCaBFHTYd41fpwmQVSTTBAEQeogmkL//v3Rr18/rF27FgBQUVEBR0dHzJgxA++//36d79VqtVCpVCgsLIRSqWyKcKkeWOi2TE/KrdxaQl5h3m1aLHRbJt6tov7qm1daxMhxSUkJUlNTERoaKq4zMTGBp6cnkpOTa7QvLi5GcXGx+LqwsBDAgw+VGs+AbQOkDoGaAdco1wa/J2VcSiNE8niq8smTOj7BvKsr06Ov1CHQE+pU124Nfk/31NONEInxq2/ebRHF8X//+1+Ul5fDzs5OZ72dnR0uXbpUo31YWBgWL15cY72jo2OjxUhEjUc1XSV1CA91+/ZtqFTGG5++mHeJjNgTmHMa4lF5t0UUxw0VGhqKkJAQ8XVFRQVu3ryJtm3bQiaT1asPrVYLR0dHXLt2rVmeEmzO8Tfn2AHGL6WmjF0QBNy+fRsODg6Nup/mgnm3ecffnGMHGL+UjDHvtojiuF27djA1NUVeXp7O+ry8PKjV6hrtFQoFFAqFzjobGxu99q1UKpvdD2p1zTn+5hw7wPil1FSxP4kjxlWYd/XXnONvzrEDjF9KxpR3W8St3ORyOTw8PJCQkCCuq6ioQEJCAjQajYSRERE9mZh3iai5ahEjxwAQEhICPz8/9O3bF8899xxWr16Nu3fvYvLkyVKHRkT0RGLeJaLmqMUUx2+++SZu3LiBBQsWIDc3F+7u7jhw4ECNi0UMRaFQYOHChTVOEzYXzTn+5hw7wPil1JxjN0bMuw3TnONvzrEDjF9Kxhh7i7nPMRERERHRo7SIOcdERERERPXB4piIiIiIqBKLYyIiIiKiSiyOiYiIiIgqsTgmIiIiIqrE4riRREZGonPnzrCwsED//v1x8uRJqUN6pLCwMPTr1w+tW7eGra0tXnnlFWRmZkodlt6WL18OmUyGoKAgqUOpt99//x0TJkxA27ZtYWlpCTc3N5w+fVrqsB6pvLwc8+fPh5OTEywtLfHMM89g6dKlMNab4Rw7dgwvv/wyHBwcIJPJ8N133+lsFwQBCxYsgL29PSwtLeHp6YnLly9LEyzVG/Ou9Jh3mw7zbuNhcdwIvvnmG4SEhGDhwoX48ccf0bt3b3h5eSE/P1/q0Op09OhRBAQEICUlBfHx8SgtLcXw4cNx9+5dqUNrsFOnTuHzzz9Hr169pA6l3m7duoWBAwfC3Nwc+/fvR0ZGBlauXImnnnpK6tAe6eOPP8b69euxdu1aXLx4ER9//DFWrFiBzz77TOrQanX37l307t0bkZGRtW5fsWIF1qxZg6ioKJw4cQLW1tbw8vJCUVFRE0dK9cW8Kz3m3abFvNuIBDK45557TggICBBfl5eXCw4ODkJYWJiEUTVcfn6+AEA4evSo1KE0yO3bt4WuXbsK8fHxwosvvijMnDlT6pDqZe7cucKgQYOkDkMv3t7ewpQpU3TWjRkzRhg/frxEEdUfAGH37t3i64qKCkGtVguffPKJuK6goEBQKBTC119/LUGEVB/Mu9Ji3m16zLuNhyPHBlZSUoLU1FR4enqK60xMTODp6Ynk5GQJI2u4wsJCAECbNm0kjqRhAgIC4O3trfN/0Bzs2bMHffv2xeuvvw5bW1s8++yz+PLLL6UOq17++te/IiEhAT/99BMA4OzZs/jhhx8wYsQIiSNruKysLOTm5ur8/KhUKvTv37/Z/Q63FMy70mPebXrMu42nxTw+uqn897//RXl5eY3Ho9rZ2eHSpUsSRdVwFRUVCAoKwsCBA9GzZ0+pw6m37du348cff8SpU6ekDqXBrly5gvXr1yMkJAT/+Mc/cOrUKbz77ruQy+Xw8/OTOrw6vf/++9BqtXB2doapqSnKy8vx0UcfYfz48VKH1mC5ubkAUOvvcNU2Mi7Mu9Ji3pUG827jYXFMtQoICMD58+fxww8/SB1KvV27dg0zZ85EfHw8LCwspA6nwSoqKtC3b18sW7YMAPDss8/i/PnziIqKMvokvWPHDmzduhXbtm1Djx49kJaWhqCgIDg4OBh97ETGgnm36THvUm04rcLA2rVrB1NTU+Tl5emsz8vLg1qtliiqhgkMDMTevXtx5MgRdOjQQepw6i01NRX5+fno06cPzMzMYGZmhqNHj2LNmjUwMzNDeXm51CHWyd7eHq6urjrrXFxckJ2dLVFE9Td79my8//77GDt2LNzc3DBx4kQEBwcjLCxM6tAarOr3tDn/Drc0zLvSYd6VDvNu42FxbGByuRweHh5ISEgQ11VUVCAhIQEajUbCyB5NEAQEBgZi9+7dOHz4MJycnKQOqUGGDRuG9PR0pKWliUvfvn0xfvx4pKWlwdTUVOoQ6zRw4MAat3D66aef0KlTJ4kiqr979+7BxEQ3nZiamqKiokKiiPTn5OQEtVqt8zus1Wpx4sQJo/8dbqmYd6XDvCsd5t1G1OSXALYA27dvFxQKhRATEyNkZGQI77zzjmBjYyPk5uZKHVqdpk+fLqhUKiExMVHIyckRl3v37kkdmt6a01XTJ0+eFMzMzISPPvpIuHz5srB161bByspK2LJli9ShPZKfn5/wl7/8Rdi7d6+QlZUl7Nq1S2jXrp0wZ84cqUOr1e3bt4UzZ84IZ86cEQAIq1atEs6cOSP8+uuvgiAIwvLlywUbGxvh3//+t3Du3Dlh9OjRgpOTk3D//n2JI6eHYd41Hsy7TYN5t/GwOG4kn332mdCxY0dBLpcLzz33nJCSkiJ1SI8EoNYlOjpa6tD01pyStCAIwvfffy/07NlTUCgUgrOzs/DFF19IHVK9aLVaYebMmULHjh0FCwsL4emnnxY++OADobi4WOrQanXkyJFaf9b9/PwEQXhwW6H58+cLdnZ2gkKhEIYNGyZkZmZKGzQ9EvOucWDebRrMu41HJghG+igVIiIiIqImxjnHRERERESVWBwTEREREVVicUxEREREVInFMRERERFRJRbHRERERESVWBwTEREREVVicUxEREREVInFMRERERFRJRbHRERERESVWBwTEREREVVicUxEREREVOn/A6yUkHJOxaBjAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# apply log transformation and plot histograms\n", "df.loc[:, skewed_columns] = df[skewed_columns].apply(np.log)\n", "df[skewed_columns].plot.hist(\n", " bins=20, subplots=True, layout=(2, 2), figsize=(7, 5)\n", ")\n", "plt.gcf().set_layout_engine('constrained')" ] }, { "cell_type": "code", "execution_count": 6, "id": "6104b6aa", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:06.556766Z", "start_time": "2025-11-02T22:20:06.552013Z" } }, "outputs": [], "source": [ "spectral_cols = ['total_rooms', 'total_bedrooms', 'population', 'households', 'median_income']\n", "spatial_cols = ['longitude', 'latitude', 'housing_median_age']\n", "numerical_cols = spectral_cols + spatial_cols\n", "cat_cols = ['ocean_proximity']\n", "label_col = 'median_house_value'" ] }, { "cell_type": "code", "execution_count": 7, "id": "42a6afb2", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:06.612726Z", "start_time": "2025-11-02T22:20:06.605479Z" } }, "outputs": [], "source": [ "train_df = df.sample(frac=0.8, random_state=2025)\n", "test_df = df.drop(train_df.index)" ] }, { "cell_type": "markdown", "id": "397233ed", "metadata": {}, "source": [ "## Preprocess data" ] }, { "cell_type": "code", "execution_count": 8, "id": "0bafb573", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:06.674946Z", "start_time": "2025-11-02T22:20:06.664800Z" } }, "outputs": [], "source": [ "X_train, y_train = train_df.drop(label_col, axis=1), train_df[[label_col]]\n", "X_test, y_test = test_df.drop(label_col, axis=1), test_df[[label_col]]" ] }, { "cell_type": "code", "execution_count": 9, "id": "edc5cc43", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:06.729594Z", "start_time": "2025-11-02T22:20:06.723046Z" } }, "outputs": [], "source": [ "feat_preprocessor = make_column_transformer(\n", " (OrdinalEncoder(), cat_cols), # categorical: ordinal encode\n", " (make_pipeline(\n", " SimpleImputer(),\n", " StandardScaler()\n", " ), spectral_cols), # spectral: impute then standardize\n", " (make_pipeline(\n", " SimpleImputer(),\n", " MinMaxScaler(feature_range=(-1, 1), clip=True)\n", " ), spatial_cols), # spatial: impute then minmax-scale\n", " verbose_feature_names_out=False\n", ").set_output(transform='pandas')\n", "label_preprocessor = StandardScaler()" ] }, { "cell_type": "code", "execution_count": 10, "id": "c2033adc", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:06.853363Z", "start_time": "2025-11-02T22:20:06.777965Z" } }, "outputs": [], "source": [ "X_train_pp = feat_preprocessor.fit_transform(X_train)\n", "X_test_pp = feat_preprocessor.transform(X_test)\n", "\n", "y_train_pp = label_preprocessor.fit_transform(y_train)\n", "y_test_pp = label_preprocessor.transform(y_test)" ] }, { "cell_type": "code", "execution_count": 11, "id": "4bc16d63", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:06.897372Z", "start_time": "2025-11-02T22:20:06.880231Z" } }, "outputs": [], "source": [ "X_train_pp[cat_cols] = X_train_pp[cat_cols].astype(np.int32)\n", "X_train_pp[numerical_cols] = X_train_pp[numerical_cols].astype(np.float32)\n", "X_test_pp[cat_cols] = X_test_pp[cat_cols].astype(np.int32)\n", "X_test_pp[numerical_cols] = X_test_pp[numerical_cols].astype(np.float32)\n", "\n", "col_sets = [spectral_cols, spatial_cols, cat_cols]\n", "X_train_tensors = tuple(torch.as_tensor(X_train_pp[cols].values) for cols in col_sets)\n", "X_test_tensors = tuple(torch.as_tensor(X_test_pp[cols].values) for cols in col_sets)" ] }, { "cell_type": "code", "execution_count": 12, "id": "62795527", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:06.953657Z", "start_time": "2025-11-02T22:20:06.949391Z" } }, "outputs": [], "source": [ "num_cat_features = [\n", " len(cats) for cats in feat_preprocessor['ordinalencoder'].categories_\n", "]" ] }, { "cell_type": "code", "execution_count": 13, "id": "f41b0089", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:07.023273Z", "start_time": "2025-11-02T22:20:07.018898Z" } }, "outputs": [ { "data": { "text/plain": [ "16512" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(X_train)" ] }, { "cell_type": "markdown", "id": "0b4ea603", "metadata": {}, "source": [ "## Evaluate baselines" ] }, { "cell_type": "code", "execution_count": 14, "id": "514c96b4", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:07.605820Z", "start_time": "2025-11-02T22:20:07.096739Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Baseline RMSE = 46763.53109042211\n" ] } ], "source": [ "baseline_model = make_pipeline(\n", " make_column_transformer(\n", " (OneHotEncoder(), cat_cols),\n", " remainder='passthrough'\n", " ),\n", " HistGradientBoostingRegressor(loss='squared_error')\n", ")\n", "baseline_model.fit(X_train, y_train.values.ravel())\n", "pred = baseline_model.predict(X_test)\n", "baseline_rmse = root_mean_squared_error(y_test, pred)\n", "print(f'Baseline RMSE = {baseline_rmse}')" ] }, { "cell_type": "code", "execution_count": 15, "id": "c24ef3aa", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:07.664528Z", "start_time": "2025-11-02T22:20:07.623271Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Baseline RMSE = 65307.28156452821\n" ] } ], "source": [ "baseline_model = make_pipeline(\n", " make_column_transformer(\n", " (OneHotEncoder(), cat_cols), # categorical: one-hot encode\n", " (make_pipeline(\n", " SimpleImputer(),\n", " StandardScaler(),\n", " ), spectral_cols), # spectral: impute then standardize\n", " (make_pipeline(\n", " SimpleImputer(),\n", " MinMaxScaler(feature_range=(-1, 1), clip=True)\n", " ), spatial_cols), # spatial: impute then minmax-scale\n", " ),\n", " LinearRegression()\n", ")\n", "baseline_model.fit(X_train, y_train.values.ravel())\n", "pred = baseline_model.predict(X_test)\n", "baseline_rmse = root_mean_squared_error(y_test, pred)\n", "print(f'Baseline RMSE = {baseline_rmse}')" ] }, { "cell_type": "markdown", "id": "d1d20a3e", "metadata": {}, "source": [ "## Train and evaluate transformers" ] }, { "cell_type": "markdown", "id": "f37428a6", "metadata": {}, "source": [ "### Define modules" ] }, { "cell_type": "code", "execution_count": 16, "id": "8d2a3aad", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:07.690048Z", "start_time": "2025-11-02T22:20:07.680492Z" } }, "outputs": [], "source": [ "class EmbeddingLayer(nn.Module):\n", " def __init__(self, n_spectral: int, n_spatial: int, n_cat: Sequence[int], emb_dim: int, n_coef: int = 10,\n", " dropout_p=0.1):\n", " super().__init__()\n", "\n", " # offset for the categorical feature of each column\n", " offsets = [sum(n_cat[:i]) for i in range(len(n_cat))]\n", " self.register_buffer(\"offsets\", torch.tensor(offsets))\n", "\n", " # embeddings for each type of feature\n", " self.spectral_emb = tc.LegendreCurve(n_spectral, emb_dim, degree=n_coef - 1, input_map='real.rational')\n", " self.spatial_emb = tc.BSplineCurve(n_spatial, emb_dim, knots_config=n_coef, input_map='real.clamp')\n", " self.cat_emb = nn.Embedding(sum(n_cat), emb_dim)\n", "\n", " # post-processing for the embeddings, before feeding them into the transformer\n", " self.postprocess = nn.Sequential(nn.LayerNorm(emb_dim), nn.Dropout(dropout_p))\n", "\n", " def forward(self, x_spectral, x_spatial, x_cat):\n", " spectral_emb = self.spectral_emb(x_spectral)\n", " spatial_emb = self.spatial_emb(x_spatial)\n", " cat_emb = self.cat_emb(x_cat + self.offsets.to(x_cat.dtype).unsqueeze(0))\n", " emb = torch.concatenate((spectral_emb, spatial_emb, cat_emb), dim=-2)\n", " return self.postprocess(emb)\n", "\n", " @staticmethod\n", " def get_offsets(n_cat: Sequence[int]):\n", " sum = 0\n", " yield sum\n", " for n in n_cat:\n", " sum += n" ] }, { "cell_type": "code", "execution_count": 17, "id": "4ec38da2", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:07.739869Z", "start_time": "2025-11-02T22:20:07.733838Z" } }, "outputs": [], "source": [ "class SinusoidalPositionalEncoding(nn.Module):\n", " def __init__(self, emb_dim, max_len=16, base=16.0):\n", " super().__init__()\n", " h = emb_dim // 2\n", " pos = torch.arange(max_len)[:, None]\n", " div = base ** (2 * torch.arange(h) / emb_dim)\n", " ang = pos / div\n", " pe = torch.empty(max_len, emb_dim)\n", " pe[:, 0::2] = ang.sin()\n", " pe[:, 1::2] = ang.cos()\n", " self.register_buffer('pe', pe)\n", "\n", " def forward(self, x):\n", " return x + self.pe[:x.size(1)].unsqueeze(0).type_as(x)" ] }, { "cell_type": "code", "execution_count": 18, "id": "a99e5af1", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:07.799369Z", "start_time": "2025-11-02T22:20:07.793759Z" } }, "outputs": [], "source": [ "class TransformerModel(nn.Module):\n", " def __init__(self,\n", " n_spectral: int, n_spatial: int, n_cat: Sequence[int], emb_dim: int, n_coef: int = 10,\n", " num_heads: int = 4, num_layers: int = 4, dim_feedforward: int | None = None):\n", " dim_feedforward = dim_feedforward if dim_feedforward is not None else 4 * emb_dim\n", " super().__init__()\n", " self.embeddings = EmbeddingLayer(n_spectral, n_spatial, n_cat, emb_dim, n_coef)\n", " self.pe = SinusoidalPositionalEncoding(emb_dim, max_len=n_spectral + n_spatial + len(n_cat))\n", " self.transformer = nn.TransformerEncoder(\n", " encoder_layer=nn.TransformerEncoderLayer(\n", " emb_dim, num_heads, batch_first=True, dim_feedforward=dim_feedforward\n", " ),\n", " num_layers=num_layers\n", " )\n", " self.fc = nn.Linear(emb_dim, 1)\n", "\n", " def forward(self, tensors: Sequence[torch.Tensor]):\n", " emb = self.embeddings(*tensors)\n", " pos_emb = self.pe(emb)\n", " encoded = self.transformer(pos_emb)\n", " pooled = torch.mean(encoded, axis=-2)\n", " return self.fc(pooled)" ] }, { "cell_type": "markdown", "id": "817ed516", "metadata": {}, "source": [ "### Define config" ] }, { "cell_type": "code", "execution_count": 19, "id": "7ab11b16", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:07.866564Z", "start_time": "2025-11-02T22:20:07.860817Z" } }, "outputs": [], "source": [ "# architecture\n", "n_curve_coefs = 16\n", "num_layers = 4\n", "emb_dim = 32\n", "num_heads = 4\n", "\n", "# training loop params\n", "num_epochs = 100\n", "print_every = 10\n", "batch_size = 32\n", "\n", "# optimizer params - common heuristics for transformers\n", "optimizer_params = {\n", " \"lr\": 0.001,\n", " \"weight_decay\": 0.1,\n", " \"betas\": (0.9, 0.95),\n", "}\n", "\n", "# sizes\n", "num_features = X_train_pp.shape[1]\n", "train_set_size = len(X_train_pp)\n", "test_set_size = len(X_test_pp)" ] }, { "cell_type": "code", "execution_count": 20, "id": "e81502c0", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:07.921233Z", "start_time": "2025-11-02T22:20:07.917966Z" } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/alex/git/torchcurves/.venv/lib/python3.12/site-packages/torch/cuda/__init__.py:174: UserWarning: CUDA initialization: The NVIDIA driver on your system is too old (found version 11040). Please update your GPU driver by downloading and installing a new version from the URL: http://www.nvidia.com/Download/index.aspx Alternatively, go to: https://pytorch.org to install a PyTorch version that has been compiled with your version of the CUDA driver. (Triggered internally at /pytorch/c10/cuda/CUDAFunctions.cpp:109.)\n", " return torch._C._cuda_getDeviceCount() > 0\n" ] } ], "source": [ "device = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n" ] }, { "cell_type": "markdown", "id": "e9754f6b", "metadata": {}, "source": [ "### Define training loop" ] }, { "cell_type": "code", "execution_count": 21, "id": "5cc731e1", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:07.976661Z", "start_time": "2025-11-02T22:20:07.972972Z" } }, "outputs": [], "source": [ "train_ds = td.TensorDataset(*X_train_tensors, torch.as_tensor(y_train_pp).float())\n", "eval_ds = td.TensorDataset(*X_test_tensors, torch.as_tensor(y_test_pp).float())" ] }, { "cell_type": "code", "execution_count": 22, "id": "20135e6a", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:08.030645Z", "start_time": "2025-11-02T22:20:08.021205Z" } }, "outputs": [], "source": [ "def train_epoch(model, optim, lr_scheduler, criterion, train_dl):\n", " tr_loss = torch.tensor(0.).to(device)\n", " for *xb, yb in train_dl:\n", " pred = model(x.to(device) for x in xb)\n", " loss = criterion(yb.to(device), pred)\n", "\n", " optim.zero_grad()\n", " loss.backward()\n", " optim.step()\n", " lr_scheduler.step()\n", "\n", " with torch.no_grad():\n", " tr_loss += loss * torch.numel(yb)\n", " return tr_loss.item() / train_set_size\n", "\n", "\n", "@torch.no_grad\n", "def eval_epoch(model, eval_criterion, eval_dl):\n", " eval_total_error = 0.\n", " for *xb, yb in eval_dl:\n", " # predict\n", " pred = model(x.to(device) for x in xb)\n", "\n", " # compute label and prediction in terms of the original, unscaled labels\n", " label_orig = label_preprocessor.inverse_transform(yb.view(-1, 1))\n", " pred_orig = label_preprocessor.inverse_transform(pred.cpu().view(-1, 1))\n", "\n", " # compute loss on the original labels\n", " loss = eval_criterion(\n", " torch.as_tensor(label_orig, device=device, dtype=torch.float32),\n", " torch.as_tensor(pred_orig, device=device, dtype=torch.float32)\n", " )\n", " eval_total_error += loss * torch.numel(yb)\n", " return eval_total_error.item() / test_set_size" ] }, { "cell_type": "code", "execution_count": 23, "id": "4842ca96", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:08.081178Z", "start_time": "2025-11-02T22:20:08.075876Z" } }, "outputs": [], "source": [ "def get_linear_scheduler(optimizer, warmup_steps, total_steps):\n", " def lr_lambda(current_step):\n", " if current_step < warmup_steps:\n", " return float(current_step) / float(max(1, warmup_steps))\n", " progress = float(current_step - warmup_steps) / float(max(1, total_steps - warmup_steps))\n", " return max(0., 1.0 - progress)\n", "\n", " return torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1)" ] }, { "cell_type": "code", "execution_count": 24, "id": "465ffbfa", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:20:08.143154Z", "start_time": "2025-11-02T22:20:08.129889Z" } }, "outputs": [], "source": [ "def train_eval_model(name, model: nn.Module, batch_size: int, print_progress=True, **optim_kwargs):\n", " model = model.to(device)\n", " optim = torch.optim.AdamW(model.parameters(), **optim_kwargs)\n", " criterion = nn.MSELoss()\n", " train_dl = td.DataLoader(train_ds, batch_size=batch_size, shuffle=True)\n", " eval_dl = td.DataLoader(eval_ds, batch_size=128)\n", "\n", " total_steps = len(train_dl) * num_epochs\n", " warmup_steps = int(0.1 * total_steps)\n", " scheduler = get_linear_scheduler(optim, warmup_steps, total_steps)\n", "\n", " for epoch in range(1, num_epochs + 1):\n", " train_loss = train_epoch(model, optim, scheduler, criterion, train_dl)\n", "\n", " if print_progress and (epoch % print_every == 0 or epoch == num_epochs):\n", " model.eval()\n", " eval_loss = eval_epoch(model, criterion, eval_dl)\n", " eval_rmse = math.sqrt(eval_loss)\n", " model.train()\n", "\n", " print(f'[{name}] Epoch {epoch}, tr loss = {train_loss:.4f}, eval RMSE = {eval_rmse:.2f}')\n", "\n", " return model" ] }, { "cell_type": "markdown", "id": "cc071bff", "metadata": {}, "source": [ "### Run experiments" ] }, { "cell_type": "code", "execution_count": 25, "id": "a3838a7c", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:46:45.806827Z", "start_time": "2025-11-02T22:20:08.191314Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[Transformer] Epoch 10, tr loss = 0.2086, eval RMSE = 53314.85\n", "[Transformer] Epoch 20, tr loss = 0.1865, eval RMSE = 48611.22\n", "[Transformer] Epoch 30, tr loss = 0.1748, eval RMSE = 47873.05\n", "[Transformer] Epoch 40, tr loss = 0.1702, eval RMSE = 47460.96\n", "[Transformer] Epoch 50, tr loss = 0.1654, eval RMSE = 47742.28\n", "[Transformer] Epoch 60, tr loss = 0.1596, eval RMSE = 46844.31\n", "[Transformer] Epoch 70, tr loss = 0.1538, eval RMSE = 47298.07\n", "[Transformer] Epoch 80, tr loss = 0.1450, eval RMSE = 46950.22\n", "[Transformer] Epoch 90, tr loss = 0.1366, eval RMSE = 47268.73\n", "[Transformer] Epoch 100, tr loss = 0.1311, eval RMSE = 47060.50\n" ] } ], "source": [ "model = train_eval_model(\n", " \"Transformer\",\n", " TransformerModel(\n", " len(spectral_cols), len(spatial_cols), num_cat_features,\n", " emb_dim=emb_dim,\n", " num_heads=num_heads,\n", " num_layers=num_layers,\n", " n_coef=n_curve_coefs,\n", " ),\n", " batch_size=batch_size,\n", " **optimizer_params,\n", ")" ] }, { "cell_type": "code", "execution_count": null, "id": "6743bdfd", "metadata": { "ExecuteTime": { "end_time": "2025-11-02T22:46:46.038201Z", "start_time": "2025-11-02T22:46:46.035391Z" } }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }