{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":112509,"databundleVersionId":14254895,"sourceType":"competition"},{"sourceId":696121,"sourceType":"modelInstanceVersion","modelInstanceId":527976,"modelId":542033}],"dockerImageVersionId":31193,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import warnings\nwarnings.simplefilter('ignore')\nimport numpy as np\nimport pandas as pd\nimport os\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport seaborn as sns\nfrom PIL import Image\n\nfrom torch.utils.data import Dataset\nfrom PIL import Image\nimport torch\n\nimport timm\nfrom transformers import get_cosine_schedule_with_warmup\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms\nfrom sklearn.model_selection import GroupKFold,StratifiedGroupKFold\n\nSEED = 42","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:41:06.726382Z","iopub.execute_input":"2026-01-07T22:41:06.726994Z","iopub.status.idle":"2026-01-07T22:41:19.774386Z","shell.execute_reply.started":"2026-01-07T22:41:06.726965Z","shell.execute_reply":"2026-01-07T22:41:19.773785Z"}},"outputs":[],"execution_count":1},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/csiro-biomass/train.csv')\ntest = pd.read_csv('/kaggle/input/csiro-biomass/test.csv')\nimg_train_dir = r'/kaggle/input/csiro-biomass'\nimg_test_dir = r'/kaggle/input/csiro-biomass'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:41:19.775466Z","iopub.execute_input":"2026-01-07T22:41:19.775995Z","iopub.status.idle":"2026-01-07T22:41:19.804581Z","shell.execute_reply.started":"2026-01-07T22:41:19.775972Z","shell.execute_reply":"2026-01-07T22:41:19.804046Z"}},"outputs":[],"execution_count":2},{"cell_type":"code","source":"train.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:41:19.805355Z","iopub.execute_input":"2026-01-07T22:41:19.806102Z","iopub.status.idle":"2026-01-07T22:41:19.828418Z","shell.execute_reply.started":"2026-01-07T22:41:19.806081Z","shell.execute_reply":"2026-01-07T22:41:19.827828Z"}},"outputs":[{"execution_count":3,"output_type":"execute_result","data":{"text/plain":"                    sample_id              image_path Sampling_Date State  \\\n0  ID1011485656__Dry_Clover_g  train/ID1011485656.jpg      2015/9/4   Tas   \n1    ID1011485656__Dry_Dead_g  train/ID1011485656.jpg      2015/9/4   Tas   \n2   ID1011485656__Dry_Green_g  train/ID1011485656.jpg      2015/9/4   Tas   \n3   ID1011485656__Dry_Total_g  train/ID1011485656.jpg      2015/9/4   Tas   \n4         ID1011485656__GDM_g  train/ID1011485656.jpg      2015/9/4   Tas   \n\n           Species  Pre_GSHH_NDVI  Height_Ave_cm   target_name   target  \n0  Ryegrass_Clover           0.62         4.6667  Dry_Clover_g   0.0000  \n1  Ryegrass_Clover           0.62         4.6667    Dry_Dead_g  31.9984  \n2  Ryegrass_Clover           0.62         4.6667   Dry_Green_g  16.2751  \n3  Ryegrass_Clover           0.62         4.6667   Dry_Total_g  48.2735  \n4  Ryegrass_Clover           0.62         4.6667         GDM_g  16.2750  ","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>sample_id</th>\n      <th>image_path</th>\n      <th>Sampling_Date</th>\n      <th>State</th>\n      <th>Species</th>\n      <th>Pre_GSHH_NDVI</th>\n      <th>Height_Ave_cm</th>\n      <th>target_name</th>\n      <th>target</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>ID1011485656__Dry_Clover_g</td>\n      <td>train/ID1011485656.jpg</td>\n      <td>2015/9/4</td>\n      <td>Tas</td>\n      <td>Ryegrass_Clover</td>\n      <td>0.62</td>\n      <td>4.6667</td>\n      <td>Dry_Clover_g</td>\n      <td>0.0000</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>ID1011485656__Dry_Dead_g</td>\n      <td>train/ID1011485656.jpg</td>\n      <td>2015/9/4</td>\n      <td>Tas</td>\n      <td>Ryegrass_Clover</td>\n      <td>0.62</td>\n      <td>4.6667</td>\n      <td>Dry_Dead_g</td>\n      <td>31.9984</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>ID1011485656__Dry_Green_g</td>\n      <td>train/ID1011485656.jpg</td>\n      <td>2015/9/4</td>\n      <td>Tas</td>\n      <td>Ryegrass_Clover</td>\n      <td>0.62</td>\n      <td>4.6667</td>\n      <td>Dry_Green_g</td>\n      <td>16.2751</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>ID1011485656__Dry_Total_g</td>\n      <td>train/ID1011485656.jpg</td>\n      <td>2015/9/4</td>\n      <td>Tas</td>\n      <td>Ryegrass_Clover</td>\n      <td>0.62</td>\n      <td>4.6667</td>\n      <td>Dry_Total_g</td>\n      <td>48.2735</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>ID1011485656__GDM_g</td>\n      <td>train/ID1011485656.jpg</td>\n      <td>2015/9/4</td>\n      <td>Tas</td>\n      <td>Ryegrass_Clover</td>\n      <td>0.62</td>\n      <td>4.6667</td>\n      <td>GDM_g</td>\n      <td>16.2750</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":3},{"cell_type":"code","source":"test","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:41:19.829085Z","iopub.execute_input":"2026-01-07T22:41:19.829304Z","iopub.status.idle":"2026-01-07T22:41:19.836612Z","shell.execute_reply.started":"2026-01-07T22:41:19.829287Z","shell.execute_reply":"2026-01-07T22:41:19.835772Z"}},"outputs":[{"execution_count":4,"output_type":"execute_result","data":{"text/plain":"                    sample_id             image_path   target_name\n0  ID1001187975__Dry_Clover_g  test/ID1001187975.jpg  Dry_Clover_g\n1    ID1001187975__Dry_Dead_g  test/ID1001187975.jpg    Dry_Dead_g\n2   ID1001187975__Dry_Green_g  test/ID1001187975.jpg   Dry_Green_g\n3   ID1001187975__Dry_Total_g  test/ID1001187975.jpg   Dry_Total_g\n4         ID1001187975__GDM_g  test/ID1001187975.jpg         GDM_g","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>sample_id</th>\n      <th>image_path</th>\n      <th>target_name</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>ID1001187975__Dry_Clover_g</td>\n      <td>test/ID1001187975.jpg</td>\n      <td>Dry_Clover_g</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>ID1001187975__Dry_Dead_g</td>\n      <td>test/ID1001187975.jpg</td>\n      <td>Dry_Dead_g</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>ID1001187975__Dry_Green_g</td>\n      <td>test/ID1001187975.jpg</td>\n      <td>Dry_Green_g</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>ID1001187975__Dry_Total_g</td>\n      <td>test/ID1001187975.jpg</td>\n      <td>Dry_Total_g</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>ID1001187975__GDM_g</td>\n      <td>test/ID1001187975.jpg</td>\n      <td>GDM_g</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":4},{"cell_type":"code","source":"train['group_id'] = train['Sampling_Date'].astype(str) + \"-\" + train['State'].astype(str)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:41:19.838662Z","iopub.execute_input":"2026-01-07T22:41:19.838963Z","iopub.status.idle":"2026-01-07T22:41:19.848305Z","shell.execute_reply.started":"2026-01-07T22:41:19.838946Z","shell.execute_reply":"2026-01-07T22:41:19.847374Z"}},"outputs":[],"execution_count":5},{"cell_type":"markdown","source":"# Data Exploration for Modelling techniques\n","metadata":{}},{"cell_type":"markdown","source":"## Data Cleaning and Format setting\n- converting this data from long format to wide format, with image getting all it's values in row fashion","metadata":{}},{"cell_type":"code","source":"class config:\n    weights = {\n            \"Dry_Green_g\": 0.1,\n            \"Dry_Dead_g\": 0.1,\n            \"Dry_Clover_g\": 0.1,\n            \"GDM_g\": 0.2,\n            \"Dry_Total_g\": 0.5\n    }\n    model_name1 = 'vit_base_patch14_reg4_dinov2.lvd142m'\n    base_lr = 1e-5\n    reg_lr = 3e-4\n    epochs= 42\n    warmup_ratio = 0.1\n\ndef long_to_wide(data,\n                 index_cols=['image_path','group_id'],\n                drop_col = 'index'):\n    df = data.pivot(index=index_cols, columns='target_name', values='target')\n    df = df.reset_index()\n    df.columns.name = None\n    cols = list(config.weights.keys())\n    df[cols] = df[cols].fillna(0.0)\n\n    ##applying transforms lop1p()\n\n    for c in cols:\n        df[f'log_{c}'] = np.log1p(df[c])\n    return df\n\ndf = long_to_wide(train)\ndf['image_path'] = df['image_path'].apply(lambda path: os.path.join(img_train_dir,path))\ndisplay(df.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:41:19.848978Z","iopub.execute_input":"2026-01-07T22:41:19.849267Z","iopub.status.idle":"2026-01-07T22:41:19.894395Z","shell.execute_reply.started":"2026-01-07T22:41:19.849244Z","shell.execute_reply":"2026-01-07T22:41:19.893516Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"                                          image_path       group_id  \\\n0  /kaggle/input/csiro-biomass/train/ID1011485656...   2015/9/4-Tas   \n1  /kaggle/input/csiro-biomass/train/ID1012260530...   2015/4/1-NSW   \n2  /kaggle/input/csiro-biomass/train/ID1025234388...    2015/9/1-WA   \n3  /kaggle/input/csiro-biomass/train/ID1028611175...  2015/5/18-Tas   \n4  /kaggle/input/csiro-biomass/train/ID1035947949...  2015/9/11-Tas   \n\n   Dry_Clover_g  Dry_Dead_g  Dry_Green_g  Dry_Total_g    GDM_g  \\\n0        0.0000     31.9984      16.2751      48.2735  16.2750   \n1        0.0000      0.0000       7.6000       7.6000   7.6000   \n2        6.0500      0.0000       0.0000       6.0500   6.0500   \n3        0.0000     30.9703      24.2376      55.2079  24.2376   \n4        0.4343     23.2239      10.5261      34.1844  10.9605   \n\n   log_Dry_Green_g  log_Dry_Dead_g  log_Dry_Clover_g  log_GDM_g  \\\n0         2.849266        3.496459          0.000000   2.849260   \n1         2.151762        0.000000          0.000000   2.151762   \n2         0.000000        0.000000          1.953028   1.953028   \n3         3.228335        3.464807          0.000000   3.228335   \n4         2.444614        3.187340          0.360677   2.481610   \n\n   log_Dry_Total_g  \n0         3.897386  \n1         2.151762  \n2         1.953028  \n3         4.029057  \n4         3.560603  ","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>image_path</th>\n      <th>group_id</th>\n      <th>Dry_Clover_g</th>\n      <th>Dry_Dead_g</th>\n      <th>Dry_Green_g</th>\n      <th>Dry_Total_g</th>\n      <th>GDM_g</th>\n      <th>log_Dry_Green_g</th>\n      <th>log_Dry_Dead_g</th>\n      <th>log_Dry_Clover_g</th>\n      <th>log_GDM_g</th>\n      <th>log_Dry_Total_g</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>/kaggle/input/csiro-biomass/train/ID1011485656...</td>\n      <td>2015/9/4-Tas</td>\n      <td>0.0000</td>\n      <td>31.9984</td>\n      <td>16.2751</td>\n      <td>48.2735</td>\n      <td>16.2750</td>\n      <td>2.849266</td>\n      <td>3.496459</td>\n      <td>0.000000</td>\n      <td>2.849260</td>\n      <td>3.897386</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>/kaggle/input/csiro-biomass/train/ID1012260530...</td>\n      <td>2015/4/1-NSW</td>\n      <td>0.0000</td>\n      <td>0.0000</td>\n      <td>7.6000</td>\n      <td>7.6000</td>\n      <td>7.6000</td>\n      <td>2.151762</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>2.151762</td>\n      <td>2.151762</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>/kaggle/input/csiro-biomass/train/ID1025234388...</td>\n      <td>2015/9/1-WA</td>\n      <td>6.0500</td>\n      <td>0.0000</td>\n      <td>0.0000</td>\n      <td>6.0500</td>\n      <td>6.0500</td>\n      <td>0.000000</td>\n      <td>0.000000</td>\n      <td>1.953028</td>\n      <td>1.953028</td>\n      <td>1.953028</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>/kaggle/input/csiro-biomass/train/ID1028611175...</td>\n      <td>2015/5/18-Tas</td>\n      <td>0.0000</td>\n      <td>30.9703</td>\n      <td>24.2376</td>\n      <td>55.2079</td>\n      <td>24.2376</td>\n      <td>3.228335</td>\n      <td>3.464807</td>\n      <td>0.000000</td>\n      <td>3.228335</td>\n      <td>4.029057</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>/kaggle/input/csiro-biomass/train/ID1035947949...</td>\n      <td>2015/9/11-Tas</td>\n      <td>0.4343</td>\n      <td>23.2239</td>\n      <td>10.5261</td>\n      <td>34.1844</td>\n      <td>10.9605</td>\n      <td>2.444614</td>\n      <td>3.187340</td>\n      <td>0.360677</td>\n      <td>2.481610</td>\n      <td>3.560603</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":6},{"cell_type":"code","source":"cols = [f'log_{c}' for c in config.weights.keys()]\nfig,ax = plt.subplots(3,2)\nax = ax.flatten()\nfor idx,c in enumerate(cols):\n    sns.histplot(\n        data=df,\n        x= c\n        ,ax=ax[idx]\n    )\nplt.tight_layout()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:41:19.895052Z","iopub.execute_input":"2026-01-07T22:41:19.895331Z","iopub.status.idle":"2026-01-07T22:41:20.748339Z","shell.execute_reply.started":"2026-01-07T22:41:19.895311Z","shell.execute_reply":"2026-01-07T22:41:20.747588Z"}},"outputs":[{"output_type":"display_data","data":{"text/plain":"<Figure size 640x480 with 6 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAAAnUAAAHVCAYAAACXAw0nAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABtf0lEQVR4nO3de1xUZf4H8M8gV5Hhplzl5iUES00UQjNvIOYlKXfXWlK81rZgIL+ttDLUtrCt1Dbx1irYlqvVqpklppiaioUoKoWUpmHKJUKuKrd5fn/4Y36NgM4MM3OYw+f9ep3Xy3nOOc/zPQhfvpzLcxRCCAEiIiIiMmsWUgdARERERO3Hoo6IiIhIBljUEREREckAizoiIiIiGWBRR0RERCQDLOqIiIiIZIBFHREREZEMWEodQEegUqlw9epVODg4QKFQSB0OEelACIHq6mp4eXnBwqLz/J3KvEVk3oyRu1jUAbh69Sp8fHykDoOI2uHy5cvo2bOn1GGYDPMWkTwYMnexqAPg4OAA4NYXVqlUShwNEemiqqoKPj4+6p/jzoJ5i8i8GSN3sagD1JculEolkyORmepslyCZt4jkwZC5i0UdkRYKCwtRVlam177du3eHr6+vgSMiInPWnpzSGuYZAljUEd1VYWEh+vULwo0b1/Xa386uK86dy2fCJSIA7c8prWGeIYBFHdFdlZWV4caN6wibnQylp79O+1YVXcI3m5airKyMyZaIALQvp7SGeYaasagj0pLS0x8uvoFSh0FEMsGcQobWeSZ1IiIiIpIxFnVEREREMsCijoiIiEgGWNQRERERyQCLOiIiIiIZYFFHREREJAMs6oiIDGzJkiVQKBQaS79+/dTrb968ibi4OLi6uqJbt26YOnUqSkpKJIyYiOSA89QRmUB+fr7e+/L1P+apf//+2L9/v/qzpeX/p9sFCxbg888/x8cffwxHR0fEx8fjsccew9GjR6UIlYhkgkUdkRHdqPwNgAJPPvmk3n3w9T/mydLSEh4eHi3aKysrsXHjRmzZsgVjxowBAKSlpSEoKAjHjx/HAw88YOpQiUgmWNQRGVHD9WoAAoP+/AJ6BPS76/a34+t/zNePP/4ILy8v2NraIjw8HCkpKfD19UVOTg4aGhoQERGh3rZfv37w9fVFVlZWm0VdXV0d6urq1J+rqqqMfgxEZF5Y1BGZQDc3X74OqBMJCwtDeno6AgMDUVRUhKVLl2LEiBHIy8tDcXExrK2t4eTkpLGPu7s7iouL2+wzJSUFS5cuNXLkRGTOWNQRERnYww8/rP73gAEDEBYWBj8/P3z00Uews7PTq89FixYhKSlJ/bmqqgo+Pj7tjpWI5INPvxIRGZmTkxPuuecenD9/Hh4eHqivr0dFRYXGNiUlJa3eg9fMxsYGSqVSYyEi+j2eqSMiMrKamhpcuHAB06dPR0hICKysrJCZmYmpU6cCAAoKClBYWIjw8HCJIyVz1p6n7H+PT9ybLxZ1REQG9re//Q2TJ0+Gn58frl69iuTkZHTp0gVPPPEEHB0dMWfOHCQlJcHFxQVKpRLz589HeHg4n3wlvRjiKfvf4xP35qtDF3VLlixpcWNwYGAgzp07B+DWBJ7/8z//g61bt6Kurg5RUVFYs2YN3N3dpQiXiAgA8Msvv+CJJ57Ab7/9hh49euDBBx/E8ePH0aNHDwDAypUrYWFhgalTp2rkLiJ9tPcp+9/jE/fmrUMXdQAn8CQi87N169Y7rre1tUVqaipSU1NNFBF1BnzKnjp8UccJPImIiIjursMXdYaewBPgJJ5ERKSbwsJClJWVGaQvQz3QQHS7Dl3UGWMCT4CTeBIRyZ0hi7CioiL84Q9/xM2bNwzSX7OGunqD9mdIhiw8+TSt6XToos4YE3gCnMSTiEjOCgsL0a9fEG7cuG7QfkOmvwgX377t7qfobBbydm1AY2OjAaIyLEM/SQvwaVpT6tBF3e1+P4FnZGSkegLP35+tu9sEnsCtSTxtbGyMHC0RUcdhyDNXQMc++1JWVoYbN64jbHYylJ7+7e6vuQizc/U2yIMIVUWX2t2HsRjySVqAT9OamtGKul69eiE7Oxuurq4a7RUVFRg8eDB++uknnfvkBJ5EZEzGyFsdgTHOXJnD2Relp7/sizBj4ZO05sloRd2lS5fQ1NTUor2urg5XrlzRqg9O4ElEpmSIvNURGfrMFc++EHVMBi/qdu3apf733r174ejoqP7c1NSEzMxM+Pv7a9UXJ/AkIlMwZN7qyAx15oqIOiaDF3XR0dEAAIVCgdjYWI11VlZW8Pf3x9tvv61VX5zAk4hMwZB5i4ha4tO0pmHwok6lUgEAAgICkJ2dje7duxt6CCIig2LeIjIOPk1rWka7p+7ixYvG6pqIyCiYt4gMi0/TmpZRpzTJzMxEZmYmSktL1X8JN9u0aZMxhyYi0gvzFpHh8Wla0zBaUbd06VIsW7YMQ4YMgaenJxQKhbGGIiIyCOYtIjJnRivq1q1bh/T0dEyfPt1YQxARGRTzFhGZM6MVdfX19Rg2bJixuifSSXtm0+fLtzsP5i0iMmdGK+rmzp2LLVu2YPHixcYagkgrhppNvyO/fJsMg3mLiMyZ0Yq6mzdvYsOGDdi/fz8GDBgAKysrjfUrVqww1tBEGto7m35Hfvk2GRbzFhGZM6MVdWfOnMGgQYMAAHl5eRrrePMxSUHf2fQ743sfOyvmLSIyZ0Yr6r766itjdU3U6bTnvj7Ovq495i0iMmdGnaeOiNrHELOxc/Z1IqLOwWhF3ejRo+94ueLAgQPGGppINto7GztnX9cN8xYRmTOjFXXN96U0a2hoQG5uLvLy8lq8MJuI7oyzsZsG8xYRmTOjFXUrV65stX3JkiWoqakx1rBERHpj3iIic2Zh6gGffPJJvj+RiMwK8xYRmQOTF3VZWVmwtbU19bBERHpj3iIic2C0y6+PPfaYxmchBIqKinDixAnO1k5EHRLzFhGZM6MVdY6OjhqfLSwsEBgYiGXLlmHcuHHGGpaISG/MW0RkzoxW1KWlpRmrayIiozBU3kpJScH27dtx7tw52NnZYdiwYXjjjTcQGPj/TzCPGjUKhw4d0tjv6aefxrp16wwSAxF1PkaffDgnJ0c9G37//v1x//33G3tIIqJ2aW/eOnToEOLi4jB06FA0NjbixRdfxLhx4/D999/D3t5evd28efOwbNky9eeuXbsa5gCIqFMyWlFXWlqKxx9/HAcPHoSTkxMAoKKiAqNHj8bWrVvRo0cPYw1NRKQXQ+WtjIwMjc/p6elwc3NDTk4OHnroIXV7165d4eHhYbD4iahzM1pRN3/+fFRXV+O7775DUFAQAOD7779HbGwsnn32WfznP/8x1tBEdBt93x3b2d4ba6y8VVlZCQBwcXHRaP/www/xwQcfwMPDA5MnT8bixYvbPFtXV1eHuro69eeqqiq9YiEi+TJaUZeRkYH9+/erEyMABAcHIzU1lTccE5lIe98d29neG2uMvKVSqZCYmIjhw4fj3nvvVbf/+c9/hp+fH7y8vHDmzBm88MILKCgowPbt21vtJyUlBUuXLtUrBiLqHIxW1KlUKlhZWbVot7Kygkql0qoP3mxM1D7teXdsZ3xvrCHy1u3i4uKQl5eHI0eOaLQ/9dRT6n/fd9998PT0xNixY3HhwgX07t27RT+LFi1CUlKS+nNVVRV8fHz0iomI5MloRd2YMWOQkJCA//znP/Dy8gIAXLlyBQsWLMDYsWO16oM3G1OzwsJClJWV6bWvvpce5YTvjtWOIfLW78XHx2P37t04fPgwevbsecdtw8LCAADnz59vtaizsbGBjY2NzjEQUedhtKJu9erVeOSRR+Dv76/+a/Ly5cu499578cEHH2jVh7FuNua9KealsLAQ/foF4caN6+3qp6Gu3kARkVwZIm8BtyYtnj9/Pnbs2IGDBw8iICDgrvvk5uYCADw9PfWKnYjIaEWdj48PTp48if379+PcuXMAgKCgIEREROjdpyFuNgZ4b4q5KSsrw40b1xE2OxlKT3+d9y86m4W8XRvQ2Nho+OBIVgyVt+Li4rBlyxZ8+umncHBwQHFxMYBbkxvb2dnhwoUL2LJlCyZMmABXV1ecOXMGCxYswEMPPYQBAwYY/LiIqHMweFF34MABxMfH4/jx41AqlYiMjERkZCSAW0VZ//79sW7dOowYMUKnfg11szHAe1PMldLTX69LiFVFlwwfDMmKofPW2rVrAdy65/f30tLSMHPmTFhbW2P//v1YtWoVamtr4ePjg6lTp+Lll1826HERUedi8KJu1apVmDdvHpRKZYt1jo6OePrpp7FixQqdizpD3WwM8N4UItJk6LwlhLjjeh8fnxYPeBERtZfBi7rTp0/jjTfeaHP9uHHj8NZbb+nUpyFvNjaE9ty039nm/SIyB8bIW0REpmbwoq6kpKTVKQHUA1pa4tdff9Wqr454s3F7b9rvbPN+EZkDQ+Yt0k97/li+HZ94p87K4EWdt7c38vLy0KdPn1bXnzlzRuuCqyPebNyem/Y747xfRObAkHmLdGeoJ9xvxyfeqbMxeFE3YcIELF68GOPHj4etra3Guhs3biA5ORmTJk3Sqq+OfLOxvjftE1HHY8i8Rbpr7xPut+MT79RZGbyoe/nll7F9+3bcc889iI+PV7/94dy5c0hNTUVTUxNeeuklrfrizcZEZAqGzFukP0P9scwn3qmzMnhR5+7ujmPHjuGZZ57BokWL1IWZQqFAVFQUUlNT4e7ubuhhiYj0xrxFRHJglMmH/fz88MUXX+DatWs4f/48hBDo27cvnJ2djTEcEVG7MW8Rkbkz2hslAMDZ2RlDhw415hBERAbFvEVE5spC6gCIiIiIqP2MeqaOiIiIyNAMORehnF4KwKKOTEbfyUU5kSgREQHAjcrfACjw5JNPGqxPOb0UgEUdmYQhJhflRKLSaE9RLae/gIlIeg3XqwEIDPrzC+gR0K/d/cntpQAs6khr7XmNT35+vt6Ti3IiUWkY4i9iOf0FTEQdRzc3X74AoBUs6kgrhnqNj52Ll84/iJxIVBrt/YtYbn8BExF1dCzqzEx7X3qt7+Ww9r7Gh2fbzBf/IiYiMg8s6syIIc6WtfdymL6v8eHZNiIiIuNiUWdG2nu2jJfDiIiI5ItFnQT0fZqweb/2vvRan/E5rQgREVHHxqLOhAw1v46+U3sYYnxOK0JERNQxsagzofY+Tdjehw3aMz4fdCAiIurYWNRJQN+nCQ31sIE+4/NBByIioo7NQuoAiIiIiKj9eKaOiIxK34ds+Iqxjs9QD1DxQSwiw2BRR0RG0d4Hc/iKsY7LGC9VB/ggFlF7sagjIqNoz4M5nFOxYzP0S9X5IBaRYbCoIyKj4mvG5MtQ/7d8EIukZshbAKS8dYRFHREREXVKxriVQMpbR2RT1KWmpuLNN99EcXExBg4ciHfffRehoaFSh0VEdEfMXUTSMfStBFLfOiKLom7btm1ISkrCunXrEBYWhlWrViEqKgoFBQVwc3OTOjwiolYxdxF1DHK5TUQW89StWLEC8+bNw6xZsxAcHIx169aha9eu2LRpk9ShERG1ibmLiAzJ7M/U1dfXIycnB4sWLVK3WVhYICIiAllZWa3uU1dXh7q6OvXnyspKAEBVVdVdx6upqQEAlP9cgMa6GzrFWlX0863xrvwIK0uFTvtKvX9nHbu9+zN2PccuLgRw6+ftbj+XzeuFEDrHKCVdc5dUeas17f3eYH8dt7+OHJtZ9Cd17hJm7sqVKwKAOHbsmEb7c889J0JDQ1vdJzk5WQDgwoWLjJbLly+bIuUYjK65i3mLCxd5LobMXWZ/pk4fixYtQlJSkvqzSqVCeXk5XF1doVDcuVKvqqqCj48PLl++DKVSaexQOw1+XY2jM3xdhRCorq6Gl5eX1KEYVWfPW3I4BkAex8FjMAxj5C6zL+q6d++OLl26oKSkRKO9pKQEHh4ere5jY2MDGxsbjTYnJyedxlUqlWb7zdyR8etqHHL/ujo6Okodgs50zV3MW7fI4RgAeRwHj6H9DJ27zP5BCWtra4SEhCAzM1PdplKpkJmZifDwcAkjIyJqG3MXERma2Z+pA4CkpCTExsZiyJAhCA0NxapVq1BbW4tZs2ZJHRoRUZuYu4jIkGRR1E2bNg2//vorXnnlFRQXF2PQoEHIyMiAu7u7wceysbFBcnJyi8sg1D78uhoHv64dm6lylxy+D+RwDIA8joPH0HEphDCzeQCIiIiIqAWzv6eOiIiIiFjUEREREckCizoiIiIiGWBRR0RERCQDLOqIiIiIZIBFnQ5SU1Ph7+8PW1tbhIWF4dtvv5U6JLOXkpKCoUOHwsHBAW5uboiOjkZBQYHUYcnO8uXLoVAokJiYKHUoJAFzz12HDx/G5MmT4eXlBYVCgZ07d0odkk7kkufWrl2LAQMGqN/CEB4ejj179kgdVrvILTeyqNPStm3bkJSUhOTkZJw8eRIDBw5EVFQUSktLpQ7NrB06dAhxcXE4fvw49u3bh4aGBowbNw61tbVShyYb2dnZWL9+PQYMGCB1KCQBOeSu2tpaDBw4EKmpqVKHohe55LmePXti+fLlyMnJwYkTJzBmzBhMmTIF3333ndSh6UWWuVGQVkJDQ0VcXJz6c1NTk/Dy8hIpKSkSRiU/paWlAoA4dOiQ1KHIQnV1tejbt6/Yt2+fGDlypEhISJA6JDIxueUuAGLHjh1Sh9Eucspzzs7O4l//+pfUYehMrrmRZ+q0UF9fj5ycHERERKjbLCwsEBERgaysLAkjk5/KykoAgIuLi8SRyENcXBwmTpyo8b1LnQdzV8ckhzzX1NSErVu3ora21izfVSzX3CiL14QZW1lZGZqamlq8usfd3R3nzp2TKCr5UalUSExMxPDhw3HvvfdKHY7Z27p1K06ePIns7GypQyGJMHd1POae586ePYvw8HDcvHkT3bp1w44dOxAcHCx1WDqRc25kUUcdRlxcHPLy8nDkyBGpQzF7ly9fRkJCAvbt2wdbW1upwyGi/2PueS4wMBC5ubmorKzEJ598gtjYWBw6dMhsCju550YWdVro3r07unTpgpKSEo32kpISeHh4SBSVvMTHx2P37t04fPgwevbsKXU4Zi8nJwelpaUYPHiwuq2pqQmHDx/G6tWrUVdXhy5dukgYIZkCc1fHIoc8Z21tjT59+gAAQkJCkJ2djXfeeQfr16+XODLtyD038p46LVhbWyMkJASZmZnqNpVKhczMTLO8l6AjEUIgPj4eO3bswIEDBxAQECB1SLIwduxYnD17Frm5ueplyJAhiImJQW5urlknLdIec1fHIOc8p1KpUFdXJ3UYWpN7buSZOi0lJSUhNjYWQ4YMQWhoKFatWoXa2lrMmjVL6tDMWlxcHLZs2YJPP/0UDg4OKC4uBgA4OjrCzs5O4ujMl4ODQ4v7dezt7eHq6mqW9/GQ/uSQu2pqanD+/Hn154sXLyI3NxcuLi7w9fWVMDLtyCXPLVq0CA8//DB8fX1RXV2NLVu24ODBg9i7d6/UoWlN7rmRRZ2Wpk2bhl9//RWvvPIKiouLMWjQIGRkZLS4AZl0s3btWgDAqFGjNNrT0tIwc+ZM0wdEJDNyyF0nTpzA6NGj1Z+TkpIAALGxsUhPT5coKu3JJc+VlpZixowZKCoqgqOjIwYMGIC9e/ciMjJS6tDo/yiEEELqIIiIiIiofXhPHREREZEMsKgjIiIikgEWdUREREQywKKOiIiISAZY1BERERHJAIs6IiIiIhlgUUdEREQkAyzqOrlRo0YhMTFR6jCIiPTGPGZa/v7+WLVqldRhUCtY1JHJpKenQ6FQQKFQoEuXLnB2dkZYWBiWLVuGyspKk8RQXFyMhIQE9OnTB7a2tnB3d8fw4cOxdu1aXL9+3SQxEJH5kjqPzZw5Uz2+lZUV3N3dERkZiU2bNkGlUhl9fOrYWNSRSSmVShQVFeGXX37BsWPH8NRTT+H999/HoEGDcPXq1Tb3q6+vb/fYP/30E+6//358+eWXeP3113Hq1ClkZWXh+eefx+7du7F///42921oaGj3+EQkD1LmMQAYP348ioqKcOnSJezZswejR49GQkICJk2ahMbGRoOMQeaJRR2pXbt2DTNmzICzszO6du2Khx9+GD/++KPGNu+99x58fHzQtWtXPProo1ixYgWcnJy0HkOhUMDDwwOenp4ICgrCnDlzcOzYMdTU1OD5559Xbzdq1CjEx8cjMTER3bt3R1RUFGbPno1JkyZp9NfQ0AA3Nzds3LjxrmP/9a9/haWlJU6cOIE//elPCAoKQq9evTBlyhR8/vnnmDx5skaca9euxSOPPAJ7e3u89tprAIBPP/0UgwcPhq2tLXr16oWlS5dqJNGKigrMnTsXPXr0gFKpxJgxY3D69Gn1+iVLlmDQoEH497//DX9/fzg6OuLxxx9HdXW1Vl+/6upqxMTEwN7eHp6enli5ciUvPRH9jtzzGADY2NjAw8MD3t7eGDx4MF588UV8+umn2LNnj8a7cO+Wjy5cuIApU6bA3d0d3bp1w9ChQ1v8cVtaWorJkyfDzs4OAQEB+PDDD7X+OgHAuXPn8OCDD8LW1hbBwcHYv38/FAoFdu7cqVM/pB0WdaQ2c+ZMnDhxArt27UJWVhaEEJgwYYL6LNXRo0fxl7/8BQkJCcjNzUVkZKS62GkPNzc3xMTEYNeuXWhqalK3b968GdbW1jh69CjWrVuHuXPnIiMjA0VFReptdu/ejevXr2PatGl3HOO3337Dl19+ibi4ONjb27e6jUKh0Pi8ZMkSPProozh79ixmz56Nr7/+GjNmzEBCQgK+//57rF+/Hunp6Rpfgz/+8Y8oLS3Fnj17kJOTg8GDB2Ps2LEoLy9Xb3PhwgXs3LkTu3fvxu7du3Ho0CEsX75cq69VUlISjh49il27dmHfvn34+uuvcfLkSa32JeoM5JzH7mTMmDEYOHAgtm/frm67Wz6qqanBhAkTkJmZiVOnTmH8+PGYPHkyCgsL1X3MnDkTly9fxldffYVPPvkEa9asQWlpqVYxNTU1ITo6Gl27dsU333yDDRs24KWXXtL7GEkLgjq1kSNHioSEBPHDDz8IAOLo0aPqdWVlZcLOzk589NFHQgghpk2bJiZOnKixf0xMjHB0dNRqrLS0tDa3Xbt2rQAgSkpK1HHdf//9LbYLDg4Wb7zxhvrz5MmTxcyZM+869vHjxwUAsX37do12V1dXYW9vL+zt7cXzzz+vbgcgEhMTNbYdO3aseP311zXa/v3vfwtPT08hhBBff/21UCqV4ubNmxrb9O7dW6xfv14IIURycrLo2rWrqKqqUq9/7rnnRFhY2F2PoaqqSlhZWYmPP/5Y3VZRUSG6du0qEhIS7ro/kVx1ljwmhBCxsbFiypQpra6bNm2aCAoKEkJol49a079/f/Huu+8KIYQoKCgQAMS3336rXp+fny8AiJUrV9411j179ghLS0tRVFSkbtu3b58AIHbs2HHX/Ul3PFNHAID8/HxYWloiLCxM3ebq6orAwEDk5+cDAAoKChAaGqqx3+2f9SWEAKB5tiwkJKTFdnPnzkVaWhoAoKSkBHv27MHs2bP1Hvfbb79Fbm4u+vfvj7q6Oo11Q4YM0fh8+vRpLFu2DN26dVMv8+bNQ1FREa5fv47Tp0+jpqYGrq6uGttcvHgRFy5cUPfj7+8PBwcH9WdPT0+t/vL96aef0NDQoPE1d3R0RGBgoL6HTyQrnTWP/X785rG1yUc1NTX429/+hqCgIDg5OaFbt27Iz89Xn6lr/nr+/hj69eun9aXqgoIC+Pj4wMPDQ91mqK81tc5S6gCIgFvJQ6lUwtXVVd3W2mXSGTNmYOHChcjKysKxY8cQEBCAESNG3LX/Pn36QKFQoKCgQKO9V69eAAA7O7sW+9w+fk1NDZYuXYrHHnusxba2traoqamBp6cnDh482GL975OglZWVxjqFQsGn1ohkwNh5TJvxAwICAECrfPS3v/0N+/btw1tvvYU+ffrAzs4Of/jDHwz2QAeZHos6AgAEBQWhsbER33zzDYYNGwbg1n1oBQUFCA4OBgAEBgYiOztbY7/bP+ujtLQUW7ZsQXR0NCws7nzy2NXVFdHR0UhLS0NWVhZmzZql1Riurq6IjIzE6tWrMX/+/Dbvq7uTwYMHo6CgAH369GlzfXFxMSwtLeHv769z/3fTq1cvWFlZITs7G76+vgCAyspK/PDDD3jooYcMPh6RuZF7HruTAwcO4OzZs1iwYAEA7fLR0aNHMXPmTDz66KMAbhWCly5dUq/v168fGhsbkZOTg6FDhwK4dfatoqJCq5gCAwNx+fJllJSUwN3dHYBhvtbUNhZ1BADo27cvpkyZgnnz5mH9+vVwcHDAwoUL4e3tjSlTpgAA5s+fj4ceeggrVqzA5MmTceDAAezZs6fFAwZ3IoRAcXExhBCoqKhAVlYWXn/9dTg6Omr9sMDcuXMxadIkNDU1ITY2Vuux16xZg+HDh2PIkCFYsmQJBgwYAAsLC2RnZ+PcuXOtXib5vVdeeQWTJk2Cr68v/vCHP8DCwgKnT59GXl4e/v73vyMiIgLh4eGIjo7GP/7xD9xzzz24evUqPv/8czz66KMtLufqysHBAbGxsXjuuefg4uICNzc3JCcnw8LCQqf/AyK56gx5DADq6upQXFyMpqYmlJSUICMjAykpKZg0aRJmzJgBAFrlo759+2L79u2YPHkyFAoFFi9erHHVIDAwEOPHj8fTTz+NtWvXwtLSEomJia1e2WhNZGQkevfujdjYWPzjH/9AdXU1Xn75ZQAtH0wjA5Hwfj7qAJpvMBZCiPLycjF9+nTh6Ogo7OzsRFRUlPjhhx80tt+wYYPw9vYWdnZ2Ijo6Wvz9738XHh4eWo2VlpYmAAgAQqFQCEdHRxEaGiqWLVsmKisr24zrdiqVSvj5+YkJEybofLxXr14V8fHxIiAgQFhZWYlu3bqJ0NBQ8eabb4ra2lr1dmjjRt6MjAwxbNgwYWdnJ5RKpQgNDRUbNmxQr6+qqhLz588XXl5ewsrKSvj4+IiYmBhRWFgohLj1oMTAgQM1+ly5cqXw8/PTKv6qqirx5z//WXTt2lV4eHiIFStWiNDQULFw4UKdvxZEctGZ8lhsbKx6fEtLS9GjRw8REREhNm3aJJqamjS2vVs+unjxohg9erSws7MTPj4+YvXq1S1iLioqEhMnThQ2NjbC19dXvP/++8LPz0+rByWEuPVgxfDhw4W1tbXo16+f+OyzzwQAkZGRodNxk3YUQvzfnZ1Eepg3bx7OnTuHr7/+2mRj1tTUwNvbG2lpaa3e39aZ1NbWwtvbG2+//TbmzJkjdThEZol5zHSOHj2KBx98EOfPn0fv3r2lDkd2ePmVdPLWW28hMjIS9vb22LNnDzZv3ow1a9aYZGyVSoWysjK8/fbbcHJywiOPPGKScTuSU6dO4dy5cwgNDUVlZSWWLVsGAOpLS0R0d8xjprNjxw5069YNffv2xfnz55GQkIDhw4ezoDMWqU8Vknn54x//KHr06CFsbW1FcHCwWLt2rXpdcHCwes6325cPPvig3WNfvHhRABA9e/YU+/fv11j3888/tzm2vb29+Pnnn9s9vrFpcwwnT54UgwcPFvb29sLZ2VlERESIM2fOSB06kVlhHjOMDz74oM1Yg4ODhRBCbN68WfTt21fY2NgIb29vERsbK8rKyiSOXL54+ZUM5ueff27zHanu7u4ac7MZWmNjo8ZTW7fz9/eHpWXHPjEth2MgMnfMY9qrrq5GSUlJq+usrKzg5+dn4oiIRR0RERGRDPCNEkREREQywKKOiIiISAZY1BERERHJAIs6IiIiIhlgUUdEREQkAyzqiIiIiGSARR0RERGRDLCoIyIiIpIBFnVEREREMsCijoiIiEgGWNQRERERyQCLOiIiIiIZYFFHREREJAMs6oiIiIhkgEUdERERkQywqCMiIiKSARZ1RERERDJgKXUAHYFKpcLVq1fh4OAAhUIhdThEpAMhBKqrq+Hl5QULi87zdyrzFpF5M0buYlEH4OrVq/Dx8ZE6DCJqh8uXL6Nnz55Sh2EyzFtE8mDI3MWiDoCDgwOAW19YpVIpcTREpIuqqir4+Piof447C+YtIvNmjNzFog5QX7pQKpVMjkRmqrNdgmTeIpIHQ+YuFnV6KCwsRFlZmUH77N69O3x9fQ3aJxERyVNlZSVqa2t12sfe3h6Ojo5Giog6AhZ1OiosLES/fkG4ceO6Qfu1s+uKc+fyWdgREdEdVVZWwj+gFyquleu0n5OzCy5d/ImFnYyxqNNRWVkZbty4jrDZyVB6+hukz6qiS/hm01KUlZWxqCMiojuqra1FxbVyRL6UBjuli1b73Kgqx77XZqG2tpZFnYyxqNOT0tMfLr6BUodBRESdlJ3SBXZOPXTap7i4WKftecnWvLCoIyIikrmGG7WAwgIhISE67cdLtuaFRR0REZHMNTXcBIQKo5/bAIfu7lrtw0u25odFHRERUSdho8clWzIfneedOkREREQyxqKOiIiISAZY1BERERHJAIs6IiIiIhlgUUdEREQkAyzqiIiIiGSARR0RERGRDLCoIyIiIpIBFnVEREREMsCijoiIiEgGWNQRERERyQCLOiIiIiIZYFFHREREJAMs6oiIiIhkgEUdERERkQywqCMiIiKSARZ1RERGtnz5cigUCiQmJqrbbt68ibi4OLi6uqJbt26YOnUqSkpKpAuSiMweizoiIiPKzs7G+vXrMWDAAI32BQsW4LPPPsPHH3+MQ4cO4erVq3jsscckipKI5IBFHRGRkdTU1CAmJgbvvfcenJ2d1e2VlZXYuHEjVqxYgTFjxiAkJARpaWk4duwYjh8/LmHERGTO9CrqevXqhd9++61Fe0VFBXr16tXuoIiIpGDo3BYXF4eJEyciIiJCoz0nJwcNDQ0a7f369YOvry+ysrJa7auurg5VVVUaC5EpFBcX4+rVq1ovlZWVUofcaVnqs9OlS5fQ1NTUor2urg5Xrlxpd1BERFIwZG7bunUrTp48iezs7BbriouLYW1tDScnJ412d3d3FBcXt9pfSkoKli5dqlMMRO3RcKMWUFggJCREp/0cnZxwPCsLSqVS633s7e3h6Oioa4h0G52Kul27dqn/vXfvXo3/gKamJmRmZsLf399gwRERmYKhc9vly5eRkJCAffv2wdbW1iAxLlq0CElJSerPVVVV8PHxMUjfRK1pargJCBVGP7cBDt3dtdqnqvQXHFwxH0FBQTqN5eTsgksXf2Jh1046FXXR0dEAAIVCgdjYWI11VlZW8Pf3x9tvv22w4IiITMHQuS0nJwelpaUYPHiwuq2pqQmHDx/G6tWrsXfvXtTX16OiokLjbF1JSQk8PDxa7dPGxgY2NjbaHxSRgdgoXWDn1EOrbW9W/aZzIXijqhz7XpuF2tpaFnXtpNM9dSqVCiqVCr6+vigtLVV/VqlUqKurQ0FBASZNmqR1f4cPH8bkyZPh5eUFhUKBnTt3aqwXQuCVV16Bp6cn7OzsEBERgR9//FFjm/LycsTExECpVMLJyQlz5sxBTU2NLodFRJ2coXPb2LFjcfbsWeTm5qqXIUOGICYmRv1vKysrZGZmqvcpKChAYWEhwsPDjXGIRCbVXAhqtShdpA5XNvS6p+7ixYsGGby2thYDBw7E7NmzW32U/x//+Af++c9/YvPmzQgICMDixYsRFRWF77//Xn1JIyYmBkVFRdi3bx8aGhowa9YsPPXUU9iyZYtBYiSizsNQuc3BwQH33nuvRpu9vT1cXV3V7XPmzEFSUhJcXFygVCoxf/58hIeH44EHHjBIDETU+ehV1AFAZmYmMjMz1X/V/t6mTZu06uPhhx/Gww8/3Oo6IQRWrVqFl19+GVOmTAEAvP/++3B3d8fOnTvx+OOPIz8/HxkZGcjOzsaQIUMAAO+++y4mTJiAt956C15eXq32XVdXh7q6OvVnPkVGRM0Mkdu0sXLlSlhYWGDq1Kmoq6tDVFQU1qxZY7D+iajz0WtKk6VLl2LcuHHIzMxEWVkZrl27prEYwsWLF1FcXKzxyL+joyPCwsLUj/xnZWXByclJXdABQEREBCwsLPDNN9+02XdKSgocHR3VC282JiLAuLnt4MGDWLVqlfqzra0tUlNTUV5ejtraWmzfvr3N++mIiLSh15m6devWIT09HdOnTzd0PGrNj/W7u2veaPn7R/6Li4vh5uamsd7S0hIuLi5tTgsA8CkyImqdKXIbEZGx6FXU1dfXY9iwYYaOxWT4FBkRtcbccxsRdW56XX6dO3eu0R9EaL4McfsLrn//yL+HhwdKS0s11jc2NqK8vJyXMYhIZ6bIbURExqLXmbqbN29iw4YN2L9/PwYMGAArKyuN9StWrGh3YAEBAfDw8EBmZiYGDRoE4NZl0m+++QbPPPMMACA8PBwVFRXIyclRz3h94MABqFQqhIWFtTsGIupcTJHbiIiMRa+i7syZM+pCKy8vT2OdQqHQup+amhqcP39e/fnixYvIzc2Fi4sLfH19kZiYiL///e/o27evekoTLy8v9UShQUFBGD9+PObNm4d169ahoaEB8fHxePzxx9t88pWIqC2Gym1ERFLQq6j76quvDDL4iRMnMHr0aPXn5ocXYmNjkZ6ejueffx61tbV46qmnUFFRgQcffBAZGRkar9358MMPER8fj7Fjx6qnB/jnP/9pkPiIqHMxVG4jIpKC3vPUGcKoUaMghGhzvUKhwLJly7Bs2bI2t3FxceE9MERERNTp6VXUjR49+o6XIg4cOKB3QEREUmFuIylUVlaitrZW6+3vNGUXdW56FXXN95w0a2hoQG5uLvLy8lq8DJuIyFwwt5GpVVZWwj+gFyquleu8b2Oj6u4bUaeiV1G3cuXKVtuXLFmCmpqadgVERCQV5jYytdraWlRcK0fkS2lav9j+2pUL+PqfSVCpmowcHZkbveapa8uTTz5p0HcjEhF1BMxtZGx2ShfYOfXQbnFwkjpc6qAM+qBEVlaWxpOpRERywNxGZHy63Ctob28PR0dHI0ZjnvQq6h577DGNz0IIFBUV4cSJE1i8eLFBAiMiMjXmNiLTa7hRCygs1C8R0IaTswsuXfyJhd1t9Crqbv8iWlhYIDAwEMuWLcO4ceMMEhgRkakxtxGZXlPDTUCoMPq5DXDo7n7X7W9UlWPfa7NQW1vLou42ehV1aWlpho6DiEhyzG3UXpyeRH82/3dfIemvXffU5eTkID8/HwDQv39/3H///QYJiohISsxtpA9OT0JS06uoKy0txeOPP46DBw/CyckJAFBRUYHRo0dj69at6NGDlTYRmR/mNmoPTk9CUtNrSpP58+ejuroa3333HcrLy1FeXo68vDxUVVXh2WefNXSMREQmwdxGhsDpSUgqep2py8jIwP79+xEUFKRuCw4ORmpqKm8mJiKzxdxGROZMrzN1KpUKVlZWLdqtrKygUvG+ACIyT8xtRGTO9DpTN2bMGCQkJOA///kPvLy8AABXrlzBggULMHbsWIMGSERkKsxt9Ht8kpXMjV5n6lavXo2qqir4+/ujd+/e6N27NwICAlBVVYV3333X0DESEZmEoXJbSkoKhg4dCgcHB7i5uSE6OhoFBQUa29y8eRNxcXFwdXVFt27dMHXqVJSUlBj6kEhPzU+yent7a700T57LJ1lJKnqdqfPx8cHJkyexf/9+nDt3DgAQFBSEiIgIgwZHRGRKhspthw4dQlxcHIYOHYrGxka8+OKLGDduHL7//nvY29sDABYsWIDPP/8cH3/8MRwdHREfH4/HHnsMR48eNfhxke74JCuZI52KugMHDiA+Ph7Hjx+HUqlEZGQkIiMjAdz6q6Z///5Yt24dRowYYZRgiYiMwdC5LSMjQ+Nzeno63NzckJOTg4ceegiVlZXYuHEjtmzZgjFjxgC4NfFxUFAQjh8/jgceeKBFn3V1dairq1N/rqqq0vdwSQd2OkyIe7PqNyNHQ3RnOl1+XbVqFebNmwelUtlinaOjI55++mmsWLHCYMEREZmCsXNbZWUlAMDF5dYZn5ycHDQ0NGicAezXrx98fX2RlZXVah8pKSlwdHRULz4+PnrHQ0TypFNRd/r0aYwfP77N9ePGjUNOTk67gyIiMiVj5jaVSoXExEQMHz4c9957L4BbN9RbW1urJzhu5u7u3ubN9osWLUJlZaV6uXz5sl7xEJF86XT5taSkpNXH/dWdWVri119/bXdQRESmZMzcFhcXh7y8PBw5ckTf8AAANjY2sLGxaVcfRCRvOp2p8/b2Rl5eXpvrz5w5A09Pz3YHRURkSsbKbfHx8di9eze++uor9OzZU93u4eGB+vp6VFRUaGxfUlICDw8PncchIgJ0LOomTJiAxYsX4+bNmy3W3bhxA8nJyZg0aZLBgiMiMgVD5zYhBOLj47Fjxw4cOHAAAQEBGutDQkJgZWWFzMxMdVtBQQEKCwsRHh6u/4EQUaem0+XXl19+Gdu3b8c999yD+Ph4BAYGAgDOnTuH1NRUNDU14aWXXjJKoERExmLo3BYXF4ctW7bg008/hYODg/o+OUdHR9jZ2cHR0RFz5sxBUlISXFxcoFQqMX/+fISHh7f65CsRkTZ0Kurc3d1x7NgxPPPMM1i0aBGEEAAAhUKBqKgopKamwt3d3SiBEhEZi6Fz29q1awEAo0aN0mhPS0vDzJkzAQArV66EhYUFpk6dirq6OkRFRWHNmjUGOR4i6px0nnzYz88PX3zxBa5du4bz589DCIG+ffvC2dnZGPEREZmEIXNbc1F4J7a2tkhNTUVqaqo+4RIRtaDXGyUAwNnZGUOHDjVkLEREkmNuIyJzpXdRR0REZE4qKytRW1ur1bZtzRdIHYeu/0f29vZwdHQ0UjQdA4s6IiKSvcrKSvgH9ELFtXKd9mtsVBkpItJXw41aQGGBkJAQnfZzcnbBpYs/ybqwY1FHRESyV1tbi4pr5Yh8KQ12Spe7bn/tygV8/c8kqFRNJoiOdNHUcBMQKox+bgMcumv3ANONqnLse20WamtrWdQRERHJgZ3SBXZOPe663c2q30wQDbWHjZb/l50JizqZKywsRFlZmcH77d69O3x9fQ3er7nFS0RE5kPu9+GxqJOxwsJC9OsXhBs3rhu8bxsbW/z3v58Y9LVwRUVF+MMf/oibN28YrM9mdnZdce5cPgs7IqJOqLPch8eiTsbKyspw48Z1hM1OhtLT32D9/vrjaeR+9I7RXgkXMv1FuPj2NVh/VUWX8M2mpfj6668RFBRksH4BngEkIjIHneU+PBZ1nYDS0x8uvoEG66+q6BIAgUF/fgE9AvoZrN+is1nI27UBdq7eBo33RuVvABR48sknDdZnM54BJCIyH3K/D49FHemtm5uvEYpFw2u4Xg1jFKHNZwDLyspY1BERkeRY1HUg+fn5Hbo/c2foIpSIDEOXSYGbmdsN7ESmwKKuAzDm5UEAaKirN0q/dIsximfeq0edhb6TApvbDexEpsCirgMw1uXB5nvUGhsbDdYn/T/eq0fUfrpOCgz8/w3sFy5cgIeHh1b78LVf1BmwqOtAzOUeNbrF2Pfq8Wld6ky0nRQY0H96CoCv/SJ5Y1FH1E6GLsZ5BpDozvSZnoKv/aLOgEUdUQfDM4BE2tFlegq+9os6AxZ1RB0UzwASEZEuWNQRdRKcr4+ISN5Y1BF1Msaar8/QU7vwki4RkW5Y1BFRuxjrsi4v6RIR6UY2RV1qairefPNNFBcXY+DAgXj33XcRGhoqdVhEsmeMy7qd6ZKuqXKXPm9taGxshKWlbr8mdN2H88dRR6fr96iUbzuRRVG3bds2JCUlYd26dQgLC8OqVasQFRWFgoICuLm5SR0eUafA17DpzlS5S9+3NigsukDoOAWIPvsAnD+OOh5950OU8m0nsijqVqxYgXnz5mHWrFkAgHXr1uHzzz/Hpk2bsHDhQomjIyJqnalylz5vbWie102fueA4fxzJgT7zITa/7aS2tpZFnT7q6+uRk5ODRYsWqdssLCwQERGBrKysVvepq6tDXV2d+nNlZSUAoKqq6q7j1dTUAADKfy5AY92N9oSuVlX08604rvwIK0uFQfpkv+zXnPutKi4EcOvn7W4/l83rhRAGGdtUdM1d7clb1dXVAIDGuhtouHldq/ga626adJ/aX69AoWrQap/qsmKj72OKMbiPfvuYOi7dvp9v1QXV1dXS5C5h5q5cuSIAiGPHjmm0P/fccyI0NLTVfZKTkwUALly4yGi5fPmyKVKOweiau5i3uHCR52LI3GX2Z+r0sWjRIiQlJak/q1QqlJeXw9XVFQrFnc80VFVVwcfHB5cvX4ZSqTR2qEbFY+mYeCy6EUKguroaXl5eRum/o2hP3moPuXw/8jg6FrkcB6D/sRgjd5l9Ude9e3d06dIFJSUlGu0lJSXw8PBodR8bGxvY2NhotDk5Oek0rlKpNPtvxGY8lo6Jx6I9qZ40aw9dc5ch8lZ7yOX7kcfRscjlOAD9jsXQucvCoL1JwNraGiEhIcjMzFS3qVQqZGZmIjw8XMLIiIjaxtxFRIZm9mfqACApKQmxsbEYMmQIQkNDsWrVKtTW1qqfKCMi6oiYu4jIkGRR1E2bNg2//vorXnnlFRQXF2PQoEHIyMiAu7t2jyDrwsbGBsnJyS0ug5gjHkvHxGPpPEyZu/Qll/9DHkfHIpfjADrWsSiEMLN5AIiIiIioBbO/p46IiIiIWNQRERERyQKLOiIiIiIZYFFHREREJAMs6nSQmpoKf39/2NraIiwsDN9++63UIenl8OHDmDx5Mry8vKBQKLBz506pQ9JLSkoKhg4dCgcHB7i5uSE6OhoFBQVSh6WXtWvXYsCAAerJK8PDw7Fnzx6pwzKI5cuXQ6FQIDExUepQSAdyyBPMER2fueaHJUuWQKFQaCz9+vWTOiwWddratm0bkpKSkJycjJMnT2LgwIGIiopCaWmp1KHprLa2FgMHDkRqaqrUobTLoUOHEBcXh+PHj2Pfvn1oaGjAuHHjUFtbK3VoOuvZsyeWL1+OnJwcnDhxAmPGjMGUKVPw3XffSR1au2RnZ2P9+vUYMGCA1KGQjuSQJ5gjOjZzzw/9+/dHUVGRejly5IjUIQEGe4uszIWGhoq4uDj156amJuHl5SVSUlIkjKr9AIgdO3ZIHYZBlJaWCgDi0KFDUodiEM7OzuJf//qX1GHorbq6WvTt21fs27dPjBw5UiQkJEgdEulJLnmCOaLjMPf8kJycLAYOHCh1GC3wTJ0W6uvrkZOTg4iICHWbhYUFIiIikJWVJWFk9HuVlZUAABcXF4kjaZ+mpiZs3boVtbW1Zv26qLi4OEycOFHj54ZISswRHYcc8sOPP/4ILy8v9OrVCzExMSgsLJQ6JHm8UcLYysrK0NTU1GKWd3d3d5w7d06iqOj3VCoVEhMTMXz4cNx7771Sh6OXs2fPIjw8HDdv3kS3bt2wY8cOBAcHSx2WXrZu3YqTJ08iOztb6lCIADBHdCRyyA9hYWFIT09HYGAgioqKsHTpUowYMQJ5eXlwcHCQLC4WdSQLcXFxyMvL6xj3NOgpMDAQubm5qKysxCeffILY2FgcOnTI7JL25cuXkZCQgH379sHW1lbqcIgAMEd0FHLJDw8//LD63wMGDEBYWBj8/Pzw0UcfYc6cOZLFxaJOC927d0eXLl1QUlKi0V5SUgIPDw+JoqJm8fHx2L17Nw4fPoyePXtKHY7erK2t0adPHwBASEgIsrOz8c4772D9+vUSR6abnJwclJaWYvDgweq2pqYmHD58GKtXr0ZdXR26dOkiYYTU2TBHdBxyzQ9OTk645557cP78eUnj4D11WrC2tkZISAgyMzPVbSqVCpmZmWZ7P4McCCEQHx+PHTt24MCBAwgICJA6JINSqVSoq6uTOgydjR07FmfPnkVubq56GTJkCGJiYpCbm2uWCZvME3NExyPX/FBTU4MLFy7A09NT0jh4pk5LSUlJiI2NxZAhQxAaGopVq1ahtrYWs2bNkjo0ndXU1Gj8NXHx4kXk5ubCxcUFvr6+Ekamm7i4OGzZsgWffvopHBwcUFxcDABwdHSEnZ2dxNHpZtGiRXj44Yfh6+uL6upqbNmyBQcPHsTevXulDk1nDg4OLe5Zsre3h6urq9ney9QZySFPMEd0PHLJD3/7298wefJk+Pn54erVq0hOTkaXLl3wxBNPSBuY1I/fmpN3331X+Pr6CmtraxEaGiqOHz8udUh6+eqrrwSAFktsbKzUoemktWMAINLS0qQOTWezZ88Wfn5+wtraWvTo0UOMHTtWfPnll1KHZTDmOGVBZyeHPMEcYR7MMT9MmzZNeHp6Cmtra+Ht7S2mTZsmzp8/L3VYQiGEEKYsIomIiIjI8HhPHREREZEMsKgjIiIikgEWdUREREQywKKOiIiISAZY1BERERHJAIs6IiIiIhlgUUdEREQkAyzqiIiIiGSARV0nNmrUKCQmJkodRoeiUCiwc+dOqcMgIhNjPiQ5YFFHJpGeng6FQgGFQoEuXbrA2dkZYWFhWLZsGSorK00SQ3FxMebPn49evXrBxsYGPj4+mDx5MjIzM00yPhFRs/r6erz55psYPHgw7O3t4ejoiIEDB+Lll1/G1atX1dvNnDlTnTutrKzg7u6OyMhIbNq0CSqVSqNPf39/KBQKbN26tcV4/fv3h0KhQHp6urEPjSTEoo5MRqlUoqioCL/88guOHTuGp556Cu+//z4GDRqkkcRuV19f3+6xL126hJCQEBw4cABvvvkmzp49i4yMDIwePRpxcXHt7t+QDHG8RNRx1dXVITIyEq+//jpmzpyJw4cP4+zZs/jnP/+JsrIyvPvuuxrbjx8/HkVFRbh06RL27NmD0aNHIyEhAZMmTUJjY6PGtj4+PkhLS9NoO378OIqLi2Fvb2/0YyNpsagjAMC1a9cwY8YMODs7o2vXrnj44Yfx448/amzz3nvvwcfHB127dsWjjz6KFStWwMnJSesxFAoFPDw84OnpiaCgIMyZMwfHjh1DTU0Nnn/+efV2o0aNQnx8PBITE9G9e3dERUVh9uzZmDRpkkZ/DQ0NcHNzw8aNG+869l//+lcoFAp8++23mDp1Ku655x70798fSUlJOH78eJv7nT17FmPGjIGdnR1cXV3x1FNPoaamBgDw5ZdfwtbWFhUVFRr7JCQkYMyYMerPR44cwYgRI2BnZwcfHx88++yzqK2tVa/39/fHq6++ihkzZkCpVOKpp5666/EcO3YMgwYNgq2tLYYMGYKdO3dCoVAgNzf3rvsS0Z0ZOx+uXLkSR44cwYEDB/Dss88iJCQEvr6+GDlyJNatW4fXX39dY3sbGxt4eHjA29sbgwcPxosvvohPP/0Ue/bsaXHmLSYmBocOHcLly5fVbZs2bUJMTAwsLS21/hqcO3cODz74IGxtbREcHIz9+/fz9hQzwKKOANw6xX/ixAns2rULWVlZEEJgwoQJaGhoAAAcPXoUf/nLX5CQkIDc3FxERkbitddea/e4bm5uiImJwa5du9DU1KRu37x5M6ytrXH06FGsW7cOc+fORUZGBoqKitTb7N69G9evX8e0adPuOEZ5eTkyMjIQFxfX6l+qbSXi2tpaREVFwdnZGdnZ2fj444+xf/9+xMfHAwDGjh0LJycn/Pe//1Xv09TUhG3btiEmJgYAcOHCBYwfPx5Tp07FmTNnsG3bNhw5ckTdR7O33noLAwcOxKlTp7B48eI7Hk9VVRUmT56M++67DydPnsSrr76KF1544Y77EJH2jJ0P//Of/yAyMhL3339/q+sVCsVd+xgzZgwGDhyI7du3a7S7u7sjKioKmzdvBgBcv34d27Ztw+zZs7WOr6mpCdHR0ejatSu++eYbbNiwAS+99JLW+5OEBHVaI0eOFAkJCeKHH34QAMTRo0fV68rKyoSdnZ346KOPhBBCTJs2TUycOFFj/5iYGOHo6KjVWGlpaW1uu3btWgFAlJSUqOO6//77W2wXHBws3njjDfXnyZMni5kzZ9517G+++UYAENu3b7/rtgDEjh07hBBCbNiwQTg7O4uamhr1+s8//1xYWFiI4uJiIYQQCQkJYsyYMer1e/fuFTY2NuLatWtCCCHmzJkjnnrqKY0xvv76a2FhYSFu3LghhBDCz89PREdH3zW2ZmvXrhWurq7q/YUQ4r333hMAxKlTp7Tuh4j+nynzoa2trXj22Wc12qKjo4W9vb2wt7cX4eHh6vbY2FgxZcqUVvuZNm2aCAoKUn/28/MTK1euFDt37hS9e/cWKpVKbN68WZ1PHR0dRVpa2l3j27Nnj7C0tBRFRUXqtn379mnkR+qYeKaOkJ+fD0tLS4SFhanbXF1dERgYiPz8fABAQUEBQkNDNfa7/bO+hBAANP86DQkJabHd3Llz1feKlJSUYM+ePVr99dncv67y8/MxcOBAjbN7w4cPh0qlQkFBAYBblzoOHjyovifwww8/xMSJE9Vn/06fPo309HR069ZNvURFRUGlUuHixYvqfocMGaJ1XAUFBRgwYABsbW3VbYb6vyDq7KTKh2vWrEFubi5mz56N69eva7WPEKLVs3oTJ05ETU0NDh8+jE2bNul0lg64dXw+Pj7w8PBQtzHHmAftL7ATGUl+fj6USiVcXV3Vba1dJp0xYwYWLlyIrKwsHDt2DAEBARgxYsRd++/bty8UCgXOnTtn0LgBYOjQoejduze2bt2KZ555Bjt27NC4x6WmpgZPP/00nn322Rb7+vr6qv/NG5iJOo++ffuq/zBs5unpCQBwcXHRup/8/HwEBAS0aLe0tMT06dORnJyMb775Bjt27GhfwGQ2eKaOEBQUhMbGRnzzzTfqtt9++w0FBQUIDg4GAAQGBiI7O1tjv9s/66O0tBRbtmxBdHQ0LCzu/O3o6uqK6OhopKWlIT09HbNmzdJqDBcXF0RFRSE1NVXjAYVmtz/o0CwoKAinT5/W2Ofo0aOwsLBAYGCgui0mJgYffvghPvvsM1hYWGDixInqdYMHD8b333+PPn36tFisra21iv92gYGBOHv2LOrq6tRthvi/ICLT5MMnnngC+/btw6lTp/SO88CBAzh79iymTp3a6vrZs2fj0KFDmDJlCpydnXXqOzAwEJcvX0ZJSYm6jTnGTEh8+Zck1HwPiRBCTJkyRQQHB4uvv/5a5ObmivHjx4s+ffqI+vp6IYQQR44cERYWFuLtt98WP/zwg1i3bp1wdXUVTk5OWo2VlpYmlEqlKCoqElevXhXff/+92Lhxo+jdu7fo1auXuHr1aqtx3e7LL78U1tbWokuXLuLKlStaH+uFCxeEh4eHCA4OFp988on44YcfxPfffy/eeecd0a9fP/V2+N09I7W1tcLT01NMnTpVnD17Vhw4cED06tVLxMbGavT9448/CgBiwIABYs6cORrrTp8+Lezs7ERcXJw4deqU+OGHH8TOnTtFXFycepvm+2C0VVlZKVxcXMSMGTPE999/LzIyMkS/fv0EAJGbm6t1P0T0/0yZD2/cuCGGDx8unJ2dxapVq0ROTo746aefREZGhggNDRWDBw9WbxsbGyvGjx8vioqKxC+//CJycnLEa6+9Jrp16yYmTZokGhsb1dvenkvKysrE9evX1Z+1vaeusbFRBAYGiqioKHH69Glx5MgR8cADDwgAYufOnVodI0mDRV0n9vskVl5eLqZPny4cHR2FnZ2diIqKEj/88IPG9hs2bBDe3t7Czs5OREdHi7///e/Cw8NDq7HS0tIEAAFAKBQK4ejoKEJDQ8WyZctEZWVlm3HdTqVSCT8/PzFhwgSdj/fq1asiLi5O+Pn5CWtra+Ht7S0eeeQR8dVXX6m3wW03Ap85c0aMHj1a2NraChcXFzFv3jxRXV3dou/Q0FABQBw4cKDFum+//VZERkaKbt26CXt7ezFgwADx2muvqdfrWtQJIcTRo0fFgAEDhLW1tQgJCRFbtmwRAMS5c+d06oeIbjFlPhRCiJs3b4rly5eLgQMHCjs7O2FjYyP69esnFixYIAoLC9XbxcbGqnOnpaWl6NGjh4iIiBCbNm0STU1NGn3eLZdoW9QJIUR+fr4YPny4sLa2Fv369ROfffaZACAyMjK0PkYyPYUQet5FTp3evHnzcO7cOXz99dcmG7Ompgbe3t5IS0vDY489ZrJxO7oPP/wQs2bNQmVlJezs7KQOh6jTkSIfmtLRo0fx4IMP4vz58+jdu7fU4VAb+KAEae2tt95CZGQk7O3tsWfPHmzevBlr1qwxydgqlQplZWV4++234eTkhEceecQk43ZU77//Pnr16gVvb2+cPn0aL7zwAv70pz+xoCMyESnzoSns2LED3bp1Q9++fXH+/HkkJCRg+PDhLOg6OqlPFZL5+OMf/yh69OghbG1tRXBwsFi7dq16XXBwsHqOpduXDz74oN1jX7x4UQAQPXv2FPv379dY9/PPP7c5tr29vfj555/bPb4pvfbaa20ey/jx44UQQrzxxhvCz89P2NjYCH9/f5GYmChqa2sljpyo85AyH7bXBx980GZ8wcHBQgghNm/eLPr27StsbGyEt7e3iI2NFWVlZRJHTnfDy69kED///LN6tvXbubu7w8HBwWhjNzY24tKlS22u9/f31+n1OFIrLy9HeXl5q+vs7Ozg7e1t4oiISBdS5kNtVFdXazzZ+ntWVlbw8/MzcURkKCzqiIiIiGSA89QRERERyQCLOiIiIiIZYFFHREREJAMs6oiIiIhkgEUdERERkQywqCMiIiKSARZ1RERERDLAoo6IiIhIBljUEREREckAizoiIiIiGWBRR0RERCQDLOqIiIiIZIBFHREREZEMsKgjIiIikgEWdURE7XT48GFMnjwZXl5eUCgU2Llz5133OXjwIAYPHgwbGxv06dMH6enpRo+TiOSNRR0RUTvV1tZi4MCBSE1N1Wr7ixcvYuLEiRg9ejRyc3ORmJiIuXPnYu/evUaOlIjkTCGEEFIHQUQkFwqFAjt27EB0dHSb27zwwgv4/PPPkZeXp257/PHHUVFRgYyMDBNESURyZCl1AB2BSqXC1atX4eDgAIVCIXU4RKQDIQSqq6vh5eUFCwvzuPiQlZWFiIgIjbaoqCgkJia2uU9dXR3q6urUn1UqFcrLy+Hq6sq8RWSGjJG7WNQBuHr1Knx8fKQOg4ja4fLly+jZs6fUYWiluLgY7u7uGm3u7u6oqqrCjRs3YGdn12KflJQULF261FQhEpGJGDJ3sagD4ODgAODWF1apVEocDRHpoqqqCj4+PuqfY7latGgRkpKS1J8rKyvh6+vLvEVkpoyRu1jUAepLF0qlksmRyEyZ0yVIDw8PlJSUaLSVlJRAqVS2epYOAGxsbGBjY9OinXmLyLwZMnexqCMyEZVKBW2fSxJCaP2DrlAozOZeMrolPDwcX3zxhUbbvn37EB4eLlFERCQH/E1AZAIqlQrePn6wtLTUarHpaq/1tt4+flCpVFIfYqdWU1OD3Nxc5ObmArg1ZUlubi4KCwsB3Lp0OmPGDPX2f/nLX/DTTz/h+eefx7lz57BmzRp89NFHWLBggRThE5FM8EwdkQkIIVB89Rf8IfUQFHc5q6ZqbMB/54/B1NWHYNHlztsKlQqfxI3U+gwgGceJEycwevRo9efme99iY2ORnp6OoqIidYEHAAEBAfj888+xYMECvPPOO+jZsyf+9a9/ISoqyuSxE5F8sKgjagdtL6k2NTUBABQWFrCw6HLHbYWF9tvy/FzHMGrUqDt+H7T2tohRo0bh1KlTRoyKiDobFnVEemq+pFp89Rftd+IJNSIiMhIWdUR60ueSKms6IiIyFhZ1RO2kyyVVIiIiY+HTr0REREQywKKOiIiISAZY1BERERHJAIs6IiIiIhlgUUdEREQkAyzqiIiIiGSARR0RERGRDLCoIyIiIpIBFnVEREREMsCijoiIiEgGWNQRERERyQCLOiIiIiIZYFFHREREJAMs6oiIiIhkgEUdERERkQywqCMiIiKSARZ1RERERDJgVkXd8uXLoVAokJiYqG67efMm4uLi4Orqim7dumHq1KkoKSmRLkgiIiIiCZhNUZednY3169djwIABGu0LFizAZ599ho8//hiHDh3C1atX8dhjj0kUJREREZE0jFbU9erVC7/99luL9oqKCvTq1UunvmpqahATE4P33nsPzs7O6vbKykps3LgRK1aswJgxYxASEoK0tDQcO3YMx48fb7O/uro6VFVVaSxERERE5sxoRd2lS5fQ1NTUor2urg5XrlzRqa+4uDhMnDgRERERGu05OTloaGjQaO/Xrx98fX2RlZXVZn8pKSlwdHRULz4+PjrFQ0RERNTRWBq6w127dqn/vXfvXjg6Oqo/NzU1ITMzE/7+/lr3t3XrVpw8eRLZ2dkt1hUXF8Pa2hpOTk4a7e7u7iguLm6zz0WLFiEpKUn9uaqqioUdERERmTWDF3XR0dEAAIVCgdjYWI11VlZW8Pf3x9tvv61VX5cvX0ZCQgL27dsHW1tbg8VoY2MDGxsbg/VHREREJDWDF3UqlQoAEBAQgOzsbHTv3l3vvnJyclBaWorBgwer25qamnD48GGsXr0ae/fuRX19PSoqKjTO1pWUlMDDw0PvcYmIiIjMjcGLumYXL15sdx9jx47F2bNnNdpmzZqFfv364YUXXoCPjw+srKyQmZmJqVOnAgAKCgpQWFiI8PDwdo9PREREZC6MVtQBQGZmJjIzM1FaWqo+g9ds06ZNd93fwcEB9957r0abvb09XF1d1e1z5sxBUlISXFxcoFQqMX/+fISHh+OBBx4w3IEQERERdXBGK+qWLl2KZcuWYciQIfD09IRCoTDKOCtXroSFhQWmTp2Kuro6REVFYc2aNUYZi4iIiKijMlpRt27dOqSnp2P69OkG7ffgwYMan21tbZGamorU1FSDjkNkTlqbPqg1CoUCFhZmM+c4ERHpwGhFXX19PYYNG2as7okIgFCpAIsuWj/N7eHVE1cu/8zCjohIhoxW1M2dOxdbtmzB4sWLjTUEEUEAqiZMXX0IFl3uXKgJlQqfxI2EEMJEsRERkSkZrai7efMmNmzYgP3792PAgAGwsrLSWL9ixQpjDU3U6SgsLGBh0eWO26juuJaIiMyd0Yq6M2fOYNCgQQCAvLw8jXXGemiCiIiIqLMyWlH31VdfGatrIp2pVCqtLzvyYQIiIjJH/M1FsqdSqeDt4wdLS0utFm8fvxbzKhLdTWpqKvz9/WFra4uwsDB8++23bW6bnp4OhUKhsRjyVYhE1DkZ7Uzd6NGj73iZ9cCBA8YamkiDEALFV3/BH1IPQXGXM3B8mID0sW3bNiQlJWHdunUICwvDqlWrEBUVhYKCAri5ubW6j1KpREFBgfozb0shovYyWlHXfD9ds4aGBuTm5iIvLw+xsbHGGpaoTXyYgIxlxYoVmDdvHmbNmgXg1jydn3/+OTZt2oSFCxe2uo9CodDpHdV1dXWoq6tTf66qqmpf0EQkO0Yr6lauXNlq+5IlS1BTU2OsYYmITKq+vh45OTlYtGiRus3CwgIRERHIyspqc7+amhr4+d261D948GC8/vrr6N+/f5vbp6SkYOnSpQaNnYjkxeT31D355JNavfeVSEpNTU1aLURlZWVoamqCu7u7Rru7uzuKi4tb3ScwMBCbNm3Cp59+ig8++AAqlQrDhg3DL7/80uY4ixYtQmVlpXq5fPmyQY+DiMyf0c7UtSUrK4s3BFOHpesbGm7tZLx4SJ7Cw8MRHh6u/jxs2DAEBQVh/fr1ePXVV1vdx8bGRrfvSyLqdIxW1D322GMan4UQKCoqwokTJ/iWCerAtH9Dg6qxAf+dP4Y1XSfXvXt3dOnSBSUlJRrtJSUlWt8zZ2Vlhfvvvx/nz583RohE1EkY7fKro6OjxuLi4oJRo0bhiy++QHJysrGGJTKI5ocq7rTc7Ula6hysra0REhKCzMxMdZtKpUJmZqbG2bg7aWpqwtmzZ+Hp6WmsMImoEzDambq0tDRjdU1E1KEkJSUhNjYWQ4YMQWhoKFatWoXa2lr107AzZsyAt7c3UlJSAADLli3DAw88gD59+qCiogJvvvkmfv75Z8ydO1fKwyAiM2f0e+pycnKQn58PAOjfvz/uv/9+Yw9JRGRS06ZNw6+//opXXnkFxcXFGDRoEDIyMtQPTxQWFmq8peTatWuYN28eiouL4ezsjJCQEBw7dgzBwcFSHQIRyYDRirrS0lI8/vjjOHjwIJycnAAAFRUVGD16NLZu3YoePXoYa2giIpOLj49HfHx8q+sOHjyo8XnlypVtTvtERKQvo90UNH/+fFRXV+O7775DeXk5ysvLkZeXh6qqKjz77LPGGpaIiIioUzLambqMjAzs378fQUFB6rbg4GCkpqZi3LhxxhqWiIiIqFMy2pk6lUoFKyurFu1WVlZ8WToRERGRgRmtqBszZgwSEhJw9epVdduVK1ewYMECjB071ljDEhEREXVKRivqVq9ejaqqKvj7+6N3797o3bs3AgICUFVVhXfffVerPlJSUjB06FA4ODjAzc0N0dHRKCgo0Njm5s2biIuLg6urK7p164apU6e2mASUiIiISO6Mdk+dj48PTp48if379+PcuXMAgKCgIERERGjdx6FDhxAXF4ehQ4eisbERL774IsaNG4fvv/8e9vb2AIAFCxbg888/x8cffwxHR0fEx8fjsccew9GjR41yXEREREQdkcGLugMHDiA+Ph7Hjx+HUqlEZGQkIiMjAQCVlZXo378/1q1bhxEjRty1r4yMDI3P6enpcHNzQ05ODh566CFUVlZi48aN2LJlC8aMGQPg1qTHQUFBOH78OB544AFDHx4RERFRh2Twy6+rVq3CvHnzoFQqW6xzdHTE008/jRUrVujVd2VlJQDAxcUFwK2JjRsaGjTO/vXr1w++vr7Iyspqs5+6ujpUVVVpLGR+VCoVmpqatFqIiIjkzuBF3enTpzF+/Pg2148bNw45OTk696tSqZCYmIjhw4fj3nvvBQAUFxfD2tpaPblxM3d3dxQXF7fZV0pKisZ7aX18fHSOh6SlUqng7eMHS0vLuy42Nja3dhLSxtxRaFsINzY2ar0tn2gnIpKewS+/lpSUtDqViXpAS0v8+uuvOvcbFxeHvLw8HDlypD3hAQAWLVqEpKQk9eeqqioWdmZGCIHiq7/gD6mHoLC4898mqsYG/Hf+mE5f0wmVCrDo8v9F7l1YWFlD1VCv1bYeXj1x5fLPGq/CIiIi0zJ4Ueft7Y28vDz06dOn1fVnzpyBp6enTn3Gx8dj9+7dOHz4MHr27Klu9/DwQH19PSoqKjTO1pWUlMDDw6PN/mxsbLT+xUYdm8LCAhYWXe64jbDg5ddbBKBqwtTVh2DRRbtCWJtthUqFT+JGQojOXjYTEUnL4H9WT5gwAYsXL8bNmzdbrLtx4waSk5MxadIkrfoSQiA+Ph47duzAgQMHEBAQoLE+JCQEVlZWyMzMVLcVFBSgsLAQ4eHh7TsQIplqLoTvtDSf/dRlWyIikpbBz9S9/PLL2L59O+655x7Ex8cjMDAQAHDu3DmkpqaiqakJL730klZ9xcXFYcuWLfj000/h4OCgvk/O0dERdnZ2cHR0xJw5c5CUlAQXFxcolUrMnz8f4eHhfPKViIiIOhWDF3Xu7u44duwYnnnmGSxatEh9SUahUCAqKgqpqalwd3fXqq+1a9cCAEaNGqXRnpaWhpkzZwIAVq5cCQsLC0ydOhV1dXWIiorCmjVrDHY8RERERObAKJMP+/n54YsvvsC1a9dw/vx5CCHQt29fODs769SPNvfo2NraIjU1FampqfqGS0RERGT2jPZGCQBwdnbG0KFDjTkEEREREcGI734lIiIiItNhUUdEREQkAyzqiIiIiGTAqPfUEQG3Xuml7cS0CoWCbyUgIiLSA397klHp8o5WS0tLePv48T2iREREeuCZOjIqXd7RytdNERER6Y9FHZmENu9o5fk5IiIi/fHyKxEREZEMsKgjIiIikgEWdUREREQywKKOiIiISAZY1BERERHJAJ9+pQ6nqanJINsQERF1JizqqMMQKhVg0QU2NjY67GS8eIiIiMwJizrqQASgasLU1Ydg0eXOdwaoGhvw3/ljWNMRERH9HxZ11OFoM1GxsODl145G20vifL8vEZFxsKgjonbR9bK5h1dPXLn8Mws7IiIDY1FHelGpVFq9o5UPNHQG2l82b36/b2NjI7p0ufPZWJ7RIyLSDYs6mdO2+AIAIQQUCoVWffr6B6D46hXtA+HNb7KnzWXzJh3O6vGMHhGRbmRT1KWmpuLNN99EcXExBg4ciHfffRehoaFShyUplUoFbx8/FF/9RavtLaysoWqo17r/P6w+BAUfaCCdaHdWr/mMnrZ/kHQEuuagjz/+GIsXL8alS5fQt29fvPHGG5gwYYIJIyYiuZFFUbdt2zYkJSVh3bp1CAsLw6pVqxAVFYWCggK4ubkZfDxdzn5pewnJGH0KIVB89Rf8IfUQFHfZvrn40uXJU/CBBtLT3c7qqUwYiyHomoOOHTuGJ554AikpKZg0aRK2bNmC6OhonDx5Evfee68ER0BEciCL6xorVqzAvHnzMGvWLAQHB2PdunXo2rUrNm3aZPCxms9+WVpaarV4+/hBpbrzryhj9Pl7zb9A77Q0F326bEtEt+iag9555x2MHz8ezz33HIKCgvDqq69i8ODBWL16tYkjJyI5MfszdfX19cjJycGiRYvUbRYWFoiIiEBWVlar+9TV1aGurk79ubKyEgBQVVV11/GamppQfPUXPPKP3XctboRKhV3PT0J5efkdbwo3Rp/N/QJAfW21VmfqmrfV5kwdt+W2xtxW/N8fLVVVVXf9Pm/+uZXqUq0+OSgrKwtJSUkabVFRUdi5c2eb47QnbxFRx2OU3CXM3JUrVwQAcezYMY325557ToSGhra6T3JyssCtW/e5cOEik+Xy5cumSDkt6JODrKysxJYtWzTaUlNThZubW5vjMG9x4SLP5cKFC+1PRP/H7M/U6WPRokUafyWrVCqUl5fD1dVVq6c/9VFVVQUfHx9cvnwZSqXSKGMYE+OXnrkfg7HiF0KguroaXl5eBuuzI7o9b1VUVMDPzw+FhYVwdHSUMDL9mPv3M2D+x8D4pVVZWQlfX1+4uLgYrE+zL+q6d++OLl26oKSkRKO9pKQEHh4ere5jY2PTYkoFJycnY4WoQalUmuU3XzPGLz1zPwZjxC9lUaNPDvLw8NBpe6D1vAXcOnZ+P0jL3I+B8UvLkNM2mf0d79bW1ggJCUFmZqa6TaVSITMzE+Hh4RJGRkSdgT45KDw8XGN7ANi3bx9zFhG1i9mfqQOApKQkxMbGYsiQIQgNDcWqVatQW1uLWbNmSR0aEXUCd8tBM2bMgLe3N1JSUgAACQkJGDlyJN5++21MnDgRW7duxYkTJ7BhwwYpD4OIzJwsirpp06bh119/xSuvvILi4mIMGjQIGRkZcHd3lzo0NRsbGyQnJ2v9fsyOhvFLz9yPwdzjv5O75aDCwkKNSyzDhg3Dli1b8PLLL+PFF19E3759sXPnTp3mqDP3r6e5xw+Y/zEwfmkZI36FEGY0ZTsRERERtcrs76kjIiIiIhZ1RERERLLAoo6IiIhIBljUEREREckAizojO3z4MCZPngwvLy8oFIo7vtuxI0pJScHQoUPh4OAANzc3REdHo6CgQOqwtLZ27VoMGDBAPTlleHg49uzZI3VYelu+fDkUCgUSExOlDkVrS5YsgUKh0Fj69esndVhmITU1Ff7+/rC1tUVYWBi+/fbbO27/8ccfo1+/frC1tcV9992HL774wkSRtk6X+N977z2MGDECzs7OcHZ2RkRExF2P19h0/fo327p1KxQKBaKjo40boBZ0PYaKigrExcXB09MTNjY2uOeeeyT9PtI1/lWrViEwMBB2dnbw8fHBggULcPPmTRNFq0mf3/8HDx7E4MGDYWNjgz59+iA9PV2nMVnUGVltbS0GDhyI1NRUqUPRy6FDhxAXF4fjx49j3759aGhowLhx41BbWyt1aFrp2bMnli9fjpycHJw4cQJjxozBlClT8N1330kdms6ys7Oxfv16DBgwQOpQdNa/f38UFRWplyNHjkgdUoe3bds2JCUlITk5GSdPnsTAgQMRFRWF0tLSVrc/duwYnnjiCcyZMwenTp1CdHQ0oqOjkZeXZ+LIb9E1/oMHD+KJJ57AV199haysLPj4+GDcuHG4cuWKiSO/Rdf4m126dAl/+9vfMGLECBNF2jZdj6G+vh6RkZG4dOkSPvnkExQUFOC9996Dt7e3iSO/Rdf4t2zZgoULFyI5ORn5+fnYuHEjtm3bhhdffNHEkd+i6+//ixcvYuLEiRg9ejRyc3ORmJiIuXPnYu/evdoParC3yNJdARA7duyQOox2KS0tFQDEoUOHpA5Fb87OzuJf//qX1GHopLq6WvTt21fs27dPjBw5UiQkJEgdktaSk5PFwIEDpQ7D7ISGhoq4uDj156amJuHl5SVSUlJa3f5Pf/qTmDhxokZbWFiYePrpp40aZ1t0jf92jY2NwsHBQWzevNlYId6RPvE3NjaKYcOGiX/9618iNjZWTJkyxQSRtk3XY1i7dq3o1auXqK+vN1WId6Rr/HFxcWLMmDEabUlJSWL48OFGjVMb2vz+f/7550X//v012qZNmyaioqK0Hodn6kgnlZWVAGDQFxCbSlNTE7Zu3Yra2lqzex1TXFwcJk6ciIiICKlD0cuPP/4ILy8v9OrVCzExMSgsLJQ6pA6tvr4eOTk5Gv/fFhYWiIiIQFZWVqv7ZGVltfj+iIqKanN7Y9In/ttdv34dDQ0NkuQafeNftmwZ3NzcMGfOHFOEeUf6HMOuXbsQHh6OuLg4uLu7495778Xrr7+OpqYmU4Wtpk/8w4YNQ05OjvoS7U8//YQvvvgCEyZMMEnM7WWIn2FZvFGCTEOlUiExMRHDhw/XaeZ7qZ09exbh4eG4efMmunXrhh07diA4OFjqsLS2detWnDx5EtnZ2VKHopewsDCkp6cjMDAQRUVFWLp0KUaMGIG8vDw4ODhIHV6HVFZWhqamphZvxXF3d8e5c+da3ae4uLjV7YuLi40WZ1v0if92L7zwAry8vCT5Q0af+I8cOYKNGzciNzfXBBHenT7H8NNPP+HAgQOIiYnBF198gfPnz+Ovf/0rGhoakJycbIqw1fSJ/89//jPKysrw4IMPQgiBxsZG/OUvf5Hs8quu2voZrqqqwo0bN2BnZ3fXPljUkdbi4uKQl5dndvdDBQYGIjc3F5WVlfjkk08QGxuLQ4cOmUVhd/nyZSQkJGDfvn2wtbWVOhy9PPzww+p/DxgwAGFhYfDz88NHH33UIc5oUMezfPlybN26FQcPHjSL7/vq6mpMnz4d7733Hrp37y51OHpTqVRwc3PDhg0b0KVLF4SEhODKlSt48803TV7U6ePgwYN4/fXXsWbNGoSFheH8+fNISEjAq6++isWLF0sdnkmwqCOtxMfHY/fu3Th8+DB69uwpdTg6sba2Rp8+fQAAISEhyM7OxjvvvIP169dLHNnd5eTkoLS0FIMHD1a3NTU14fDhw1i9ejXq6urQpUsXCSPUnZOTE+655x6cP39e6lA6rO7du6NLly4oKSnRaC8pKYGHh0er+3h4eOi0vTHpE3+zt956C8uXL8f+/fsleyhI1/gvXLiAS5cuYfLkyeo2lUoFALC0tERBQQF69+5t3KBvo8//gaenJ6ysrDRySlBQEIqLi1FfXw9ra2ujxvx7+sS/ePFiTJ8+HXPnzgUA3HfffaitrcVTTz2Fl156SeP9yx1RWz/DSqVSq7N0AJ9+pbsQQiA+Ph47duzAgQMHEBAQIHVI7aZSqVBXVyd1GFoZO3Yszp49i9zcXPUyZMgQxMTEIDc31+wKOgCoqanBhQsX4OnpKXUoHZa1tTVCQkKQmZmpblOpVMjMzGzzftDw8HCN7QFg3759ktw/qk/8APCPf/wDr776KjIyMjBkyBBThNoqXePv169fi5/TRx55RP0Uo4+PjynDB6Df/8Hw4cNx/vx5dUEKAD/88AM8PT1NWtAB+sV//fr1FoVbc44UZvCae4P8DOv8CAfppLq6Wpw6dUqcOnVKABArVqwQp06dEj///LPUoWnlmWeeEY6OjuLgwYOiqKhIvVy/fl3q0LSycOFCcejQIXHx4kVx5swZsXDhQqFQKMSXX34pdWh6M7enX//nf/5HHDx4UFy8eFEcPXpUREREiO7du4vS0lKpQ+vQtm7dKmxsbER6err4/vvvxVNPPSWcnJxEcXGxEEKI6dOni4ULF6q3P3r0qLC0tBRvvfWWyM/PF8nJycLKykqcPXvWLOJfvny5sLa2Fp988olGrqmurjaL+G/XEZ5+1fUYCgsLhYODg4iPjxcFBQVi9+7dws3NTfz97383i/iTk5OFg4OD+M9//iN++ukn8eWXX4revXuLP/3pT5LEf7ff/wsXLhTTp09Xb//TTz+Jrl27iueee07k5+eL1NRU0aVLF5GRkaH1mCzqjOyrr74SAFossbGxUoemldZiByDS0tKkDk0rs2fPFn5+fsLa2lr06NFDjB071qwLOiHMr6ibNm2a8PT0FNbW1sLb21tMmzZNnD9/XuqwzMK7774rfH19hbW1tQgNDRXHjx9Xrxs5cmSLPPLRRx+Je+65R1hbW4v+/fuLzz//3MQRa9Ilfj8/v1ZzTXJysukD/z+6fv1/ryMUdULofgzHjh0TYWFhwsbGRvTq1Uu89tprorGx0cRR/z9d4m9oaBBLliwRvXv3Fra2tsLHx0f89a9/FdeuXTN94OLuv/9jY2PFyJEjW+wzaNAgYW1tLXr16qXz71qFEGZwTpKIiIiI7oj31BERERHJAIs6IiIiIhlgUUdEREQkAyzqiIiIiGSARR0RERGRDLCoIyIiIpIBFnVEREREMsCijoiIiEgGWNRRC6NGjUJiYqLUYciWQqHAzp07pQ6DiIhkhkUdSSo9PR0KhQIKhQJdunSBs7MzwsLCsGzZMlRWVhp17OZx21qWLFnS5r6XLl2CQqFAbm6uUWMkIiLSlqXUARAplUoUFBRACIGKigocO3YMKSkpSEtLw9GjR+Hl5dXqfvX19bC2ttZ73KKiIvW/t23bhldeeQUFBQXqtm7duundNxERkanxTB3d0bVr1zBjxgw4Ozuja9euePjhh/Hjjz9qbPPee+/Bx8cHXbt2xaOPPooVK1bAyclJ6zEUCgU8PDzg6emJoKAgzJkzB8eOHUNNTQ2ef/559XajRo1CfHw8EhMT0b17d0RFRWH27NmYNGmSRn8NDQ1wc3PDxo0b7ziuh4eHenF0dFTH4eHhATc3N6xYsQI9e/aEjY0NBg0ahIyMDPW+AQEBAID7778fCoUCo0aNAgBkZ2cjMjIS3bt3h6OjI0aOHImTJ09q/bW43bFjxzBo0CDY2tpiyJAh2LlzJ88QEhFRq1jU0R3NnDkTJ06cwK5du5CVlQUhBCZMmICGhgYAwNGjR/GXv/wFCQkJyM3NRWRkJF577bV2j+vm5oaYmBjs2rULTU1N6vbNmzfD2toaR48exbp16zB37lxkZGRonHXbvXs3rl+/jmnTpuk9/jvvvIO3334bb731Fs6cOYOoqCg88sgj6oL222+/BQDs378fRUVF2L59OwCguroasbGxOHLkCI4fP46+fftiwoQJqK6u1jmGqqoqTJ48Gffddx9OnjyJV199FS+88ILex0RERDIniG4zcuRIkZCQIH744QcBQBw9elS9rqysTNjZ2YmPPvpICCHEtGnTxMSJEzX2j4mJEY6OjlqNlZaW1ua2a9euFQBESUmJOq7777+/xXbBwcHijTfeUH+ePHmymDlzplbjtxWHl5eXeO211zS2GTp0qPjrX/8qhBDi4sWLAoA4derUHfttamoSDg4O4rPPPlO3ARA7duy4a0xr164Vrq6u4saNG+q29957T6txiYio8+GZOmpTfn4+LC0tERYWpm5zdXVFYGAg8vPzAQAFBQUIDQ3V2O/2z/oSQgC4dXm2WUhISIvt5s6di7S0NABASUkJ9uzZg9mzZ+s9blVVFa5evYrhw4drtA8fPlx93G0pKSnBvHnz0LdvXzg6OkKpVKKmpgaFhYU6x1FQUIABAwbA1tZW3Waory0REckPH5SgDis/Px9KpRKurq7qNnt7+xbbzZgxAwsXLkRWVhaOHTuGgIAAjBgxwpShqsXGxuK3337DO++8Az8/P9jY2CA8PBz19fWSxENERJ0Hz9RRm4KCgtDY2IhvvvlG3fbbb7+hoKAAwcHBAIDAwEBkZ2dr7Hf7Z32UlpZiy5YtiI6OhoXFnb9NXV1dER0djbS0NKSnp2PWrFntGlupVMLLywtHjx7VaD969Kj6uJufuv39/X7N2zz77LOYMGEC+vfvDxsbG5SVlekVR2BgIM6ePYu6ujp1myG+tkREJE8s6qhNffv2xZQpUzBv3jwcOXIEp0+fxpNPPglvb29MmTIFADB//nx88cUXWLFiBX788UesX78ee/bs0bhkejdCCBQXF6OoqAj5+fnYtGkThg0bBkdHRyxfvlyrPubOnYvNmzcjPz8fsbGxeh3v7z333HN44403sG3bNhQUFGDhwoXIzc1FQkICgFsPctjZ2SEjIwMlJSXqOfX69u2Lf//738jPz8c333yDmJgY2NnZ6RXDn//8Z6hUKjz11FPIz8/H3r178dZbbwGATl9fIiLqHFjU0R2lpaUhJCQEkyZNQnh4OIQQ+OKLL2BlZQXg1n1m69atw4oVKzBw4EBkZGRgwYIFGveB3U1VVRU8PT3h7e2N8PBwrF+/HrGxsTh16hQ8PT216iMiIgKenp6Iiopqc147XTz77LNISkrC//zP/+C+++5DRkYGdu3ahb59+wIALC0t8c9//hPr16+Hl5eXusjduHEjrl27hsGDB2P69Ol49tln4ebmplcMSqUSn332GXJzczFo0CC89NJLeOWVVwBAp68vERF1DgrRfDc6kYHMmzcP586dw9dff22yMWtqauDt7Y20tDQ89thjJhvX1D788EPMmjULlZWVep8BJCIieeKDEtRub731FiIjI2Fvb489e/Zg8+bNWLNmjUnGVqlUKCsrw9tvvw0nJyc88sgjJhnXVN5//3306tUL3t7eOH36NF544QX86U9/YkFHREQt8PIrtdu3336LyMhI3HfffVi3bh3++c9/Yu7cuQCA/v37o1u3bq0uH374YbvHLiwshLu7O7Zs2YJNmzbB0tJSY11bY3fr1k2vaUYM6fXXX28ztocffhgAUFxcjCeffBJBQUFYsGAB/vjHP2LDhg2Sxk1ERB0TL7+SUf3888/qt0/czt3dHQ4ODkYbu7GxEZcuXWpzvb+/v0YRaGrl5eUoLy9vdZ2dnR28vb1NHBEREZkzFnVEREREMsDLr0REREQywKKOiIiISAZY1BERERHJAIs6IiIiIhlgUUdEREQkAyzqiIiIiGSARR0RERGRDPwvjJkorzp1fy8AAAAASUVORK5CYII=\n"},"metadata":{}}],"execution_count":7},{"cell_type":"markdown","source":"# Model and Data loader preparation","metadata":{}},{"cell_type":"code","source":"##using timm\nclass WeightDataset(Dataset):\n    def __init__(self, df, is_train, cols_dict=config.weights, transforms=None):\n        self.df = df.reset_index(drop=True)\n        self.targets = [f'log_{c}' for c in cols_dict.keys()]\n        self.is_train = is_train\n        self.transforms = transforms  # timm transforms\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        row = self.df.iloc[idx]\n\n        img = Image.open(row[\"image_path\"]).convert(\"RGB\")\n\n        if self.transforms is not None:\n            img = self.transforms(img)  # -> Tensor [3, H, W]\n\n        if self.is_train:\n            targets = torch.from_numpy(\n                        row[self.targets]\n                        .astype(\"float32\")\n                        .values\n                    )\n            return img, targets\n\n        return img\n\n\nsplitter = GroupKFold(n_splits=5)\n# splitter= StratifiedGroupKFold(n_splits=5)\n\ndef get_loaders(data,splitter,train_transforms,val_transforms,batches=[16,32]):\n    loaders = []\n    for idx,(train_idx,val_idx) in enumerate(splitter.split(X=data.drop(columns=['group_id']),groups=data.group_id)):\n        print(f'Making loader: {idx+1}')\n        train = data.iloc[train_idx]\n        val = data.iloc[val_idx]\n\n        train_d = WeightDataset(train,is_train=True,transforms=train_transforms) ##changed for timm\n        val_d = WeightDataset(val,is_train=True,transforms=val_transforms)\n\n        loaders.append(\n            (\n                DataLoader(train_d,batch_size=batches[0],num_workers=2,pin_memory=True,shuffle=True),\n                DataLoader(val_d,batch_size=batches[1],num_workers=2,shuffle=False)\n            )\n        )\n    return loaders","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:41:20.749158Z","iopub.execute_input":"2026-01-07T22:41:20.749355Z","iopub.status.idle":"2026-01-07T22:41:20.75711Z","shell.execute_reply.started":"2026-01-07T22:41:20.749338Z","shell.execute_reply":"2026-01-07T22:41:20.756317Z"}},"outputs":[],"execution_count":8},{"cell_type":"markdown","source":"# Defining Models","metadata":{}},{"cell_type":"code","source":"class BioEstimatorD(nn.Module):\n    def __init__(self, name):\n        super().__init__()\n        self.backbone = timm.create_model(\n            name,\n            pretrained=True,\n            num_classes=0,\n            global_pool=\"\"\n        )\n\n        self.embed_dim = self.backbone.num_features\n\n        self.head = nn.Sequential(\n            nn.Linear(self.embed_dim, 512),\n            nn.ReLU(inplace=True),\n            nn.Dropout(0.1),\n            nn.Linear(512, 256),\n            nn.ReLU(inplace=True),\n            nn.Linear(256, 5)\n        )\n\n    def forward(self, x):\n        feats = self.backbone.forward_features(x)  # [B, N, C]\n        cls = feats[:, 0]                           # CLS token\n        return self.head(cls)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:41:20.75771Z","iopub.execute_input":"2026-01-07T22:41:20.758363Z","iopub.status.idle":"2026-01-07T22:41:20.771192Z","shell.execute_reply.started":"2026-01-07T22:41:20.758346Z","shell.execute_reply":"2026-01-07T22:41:20.770517Z"}},"outputs":[],"execution_count":9},{"cell_type":"markdown","source":"## Defining Transforms","metadata":{}},{"cell_type":"code","source":"import timm\nfrom torchvision import transforms\n\nmodel = timm.create_model(config.model_name1, pretrained=True)\ndata_config = timm.data.resolve_model_data_config(model)\nbase_val_tfms = timm.data.create_transform(\n    **data_config,\n    is_training=False\n)\n\n\ntrain_transforms = transforms.Compose([\n    # --- your geometry aug ---\n    transforms.RandomHorizontalFlip(p=0.55),\n    transforms.RandomVerticalFlip(p=0.55),\n    transforms.RandomRotation( degrees=30,\n    interpolation= transforms.InterpolationMode.BILINEAR,\n    expand=False),\n\n    # --- timm-approved preprocessing ---\n    *base_val_tfms.transforms\n])\n\nval_transforms = base_val_tfms\ndel model","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:41:20.771937Z","iopub.execute_input":"2026-01-07T22:41:20.772246Z","iopub.status.idle":"2026-01-07T22:48:32.303656Z","shell.execute_reply.started":"2026-01-07T22:41:20.772224Z","shell.execute_reply":"2026-01-07T22:48:32.302192Z"}},"outputs":[{"name":"stderr","text":"'(MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/model.safetensors (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e37960ed0>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: b924f569-2598-483f-a34e-ad1c02047846)')' thrown while requesting HEAD https://huggingface.co/timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/model.safetensors\nRetrying in 1s [Retry 1/5].\n'(MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/model.safetensors (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e37869bd0>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: 904ed610-6ce7-4809-920a-c12c1d6c8b12)')' thrown while requesting HEAD https://huggingface.co/timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/model.safetensors\nRetrying in 2s [Retry 2/5].\n'(MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/model.safetensors (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e3786ad10>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: 0caa7da3-e25f-4e54-9419-7154af90a73c)')' thrown while requesting HEAD https://huggingface.co/timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/model.safetensors\nRetrying in 4s [Retry 3/5].\n'(MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/model.safetensors (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e3786bed0>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: 9858a809-70a6-4f94-9ed9-9bb2a0eaf986)')' thrown while requesting HEAD https://huggingface.co/timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/model.safetensors\nRetrying in 8s [Retry 4/5].\n'(MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/model.safetensors (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e37870f10>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: bdbffd18-6f30-49e2-8f41-f2d516cdab26)')' thrown while requesting HEAD https://huggingface.co/timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/model.safetensors\nRetrying in 8s [Retry 5/5].\n'(MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/model.safetensors (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e37871f10>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: 3e1d3b03-5049-494f-81fa-09500f0480b8)')' thrown while requesting HEAD https://huggingface.co/timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/model.safetensors\n'(MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e37678490>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: 7b96db74-dbfb-43a2-999b-5f34d3af6e37)')' thrown while requesting HEAD https://huggingface.co/timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin\nRetrying in 1s [Retry 1/5].\n'(MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e37679210>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: 2f3f3579-8ad4-42c0-83e2-d4dcad84247c)')' thrown while requesting HEAD https://huggingface.co/timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin\nRetrying in 2s [Retry 2/5].\n'(MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e3767a2d0>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: 84fb2dfc-94f2-4a3d-801d-e1d4510c43e7)')' thrown while requesting HEAD https://huggingface.co/timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin\nRetrying in 4s [Retry 3/5].\n'(MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e37873710>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: c31ad6b2-df68-4e73-abc6-b700035e7aff)')' thrown while requesting HEAD https://huggingface.co/timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin\nRetrying in 8s [Retry 4/5].\n'(MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e378707d0>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: 5a358ef0-f93d-4697-90ea-3e0d6b99c53d)')' thrown while requesting HEAD https://huggingface.co/timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin\nRetrying in 8s [Retry 5/5].\n'(MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e37871110>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: 48e4565a-5802-4a24-a1cb-2b948a681337)')' thrown while requesting HEAD https://huggingface.co/timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin\n","output_type":"stream"},{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mgaierror\u001b[0m                                  Traceback (most recent call last)","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/urllib3/connection.py\u001b[0m in \u001b[0;36m_new_conn\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    197\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 198\u001b[0;31m             sock = connection.create_connection(\n\u001b[0m\u001b[1;32m    199\u001b[0m                 \u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_dns_host\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mport\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/urllib3/util/connection.py\u001b[0m in \u001b[0;36mcreate_connection\u001b[0;34m(address, timeout, source_address, socket_options)\u001b[0m\n\u001b[1;32m     59\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 60\u001b[0;31m     \u001b[0;32mfor\u001b[0m \u001b[0mres\u001b[0m \u001b[0;32min\u001b[0m \u001b[0msocket\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetaddrinfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhost\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mport\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfamily\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msocket\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSOCK_STREAM\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     61\u001b[0m         \u001b[0maf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msocktype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mproto\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcanonname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msa\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/lib/python3.11/socket.py\u001b[0m in \u001b[0;36mgetaddrinfo\u001b[0;34m(host, port, family, type, proto, flags)\u001b[0m\n\u001b[1;32m    973\u001b[0m     \u001b[0maddrlist\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 974\u001b[0;31m     \u001b[0;32mfor\u001b[0m \u001b[0mres\u001b[0m \u001b[0;32min\u001b[0m \u001b[0m_socket\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgetaddrinfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhost\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mport\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfamily\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mproto\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mflags\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    975\u001b[0m         \u001b[0maf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msocktype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mproto\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcanonname\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0msa\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mres\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mgaierror\u001b[0m: [Errno -3] Temporary failure in name resolution","\nThe above exception was the direct cause of the following exception:\n","\u001b[0;31mNameResolutionError\u001b[0m                       Traceback (most recent call last)","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/urllib3/connectionpool.py\u001b[0m in \u001b[0;36murlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[0m\n\u001b[1;32m    786\u001b[0m             \u001b[0;31m# Make the request on the HTTPConnection object\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 787\u001b[0;31m             response = self._make_request(\n\u001b[0m\u001b[1;32m    788\u001b[0m                 \u001b[0mconn\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/urllib3/connectionpool.py\u001b[0m in \u001b[0;36m_make_request\u001b[0;34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[0m\n\u001b[1;32m    487\u001b[0m                 \u001b[0mnew_e\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_wrap_proxy_error\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnew_e\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mproxy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mscheme\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 488\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mnew_e\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    489\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/urllib3/connectionpool.py\u001b[0m in \u001b[0;36m_make_request\u001b[0;34m(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)\u001b[0m\n\u001b[1;32m    463\u001b[0m             \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 464\u001b[0;31m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_validate_conn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    465\u001b[0m             \u001b[0;32mexcept\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mSocketTimeout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mBaseSSLError\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/urllib3/connectionpool.py\u001b[0m in \u001b[0;36m_validate_conn\u001b[0;34m(self, conn)\u001b[0m\n\u001b[1;32m   1092\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_closed\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1093\u001b[0;31m             \u001b[0mconn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mconnect\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1094\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/urllib3/connection.py\u001b[0m in \u001b[0;36mconnect\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    752\u001b[0m             \u001b[0msock\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0msocket\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msocket\u001b[0m \u001b[0;34m|\u001b[0m \u001b[0mssl\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSSLSocket\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 753\u001b[0;31m             \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msock\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msock\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_new_conn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    754\u001b[0m             \u001b[0mserver_hostname\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhost\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/urllib3/connection.py\u001b[0m in \u001b[0;36m_new_conn\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    204\u001b[0m         \u001b[0;32mexcept\u001b[0m \u001b[0msocket\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgaierror\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 205\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mNameResolutionError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhost\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    206\u001b[0m         \u001b[0;32mexcept\u001b[0m \u001b[0mSocketTimeout\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mNameResolutionError\u001b[0m: <urllib3.connection.HTTPSConnection object at 0x7e7e37871110>: Failed to resolve 'huggingface.co' ([Errno -3] Temporary failure in name resolution)","\nThe above exception was the direct cause of the following exception:\n","\u001b[0;31mMaxRetryError\u001b[0m                             Traceback (most recent call last)","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/requests/adapters.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m    643\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 644\u001b[0;31m             resp = conn.urlopen(\n\u001b[0m\u001b[1;32m    645\u001b[0m                 \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/urllib3/connectionpool.py\u001b[0m in \u001b[0;36murlopen\u001b[0;34m(self, method, url, body, headers, retries, redirect, assert_same_host, timeout, pool_timeout, release_conn, chunked, body_pos, preload_content, decode_content, **response_kw)\u001b[0m\n\u001b[1;32m    840\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 841\u001b[0;31m             retries = retries.increment(\n\u001b[0m\u001b[1;32m    842\u001b[0m                 \u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0merror\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnew_e\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_pool\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0m_stacktrace\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexc_info\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/urllib3/util/retry.py\u001b[0m in \u001b[0;36mincrement\u001b[0;34m(self, method, url, response, error, _pool, _stacktrace)\u001b[0m\n\u001b[1;32m    518\u001b[0m             \u001b[0mreason\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0merror\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mResponseError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcause\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 519\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mMaxRetryError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_pool\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mreason\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mreason\u001b[0m  \u001b[0;31m# type: ignore[arg-type]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    520\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mMaxRetryError\u001b[0m: HTTPSConnectionPool(host='huggingface.co', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e37871110>: Failed to resolve 'huggingface.co' ([Errno -3] Temporary failure in name resolution)\"))","\nDuring handling of the above exception, another exception occurred:\n","\u001b[0;31mConnectionError\u001b[0m                           Traceback (most recent call last)","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/huggingface_hub/file_download.py\u001b[0m in \u001b[0;36m_get_metadata_or_catch_error\u001b[0;34m(repo_id, filename, repo_type, revision, endpoint, proxies, etag_timeout, headers, token, local_files_only, relative_filename, storage_folder)\u001b[0m\n\u001b[1;32m   1542\u001b[0m             \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1543\u001b[0;31m                 metadata = get_hf_file_metadata(\n\u001b[0m\u001b[1;32m   1544\u001b[0m                     \u001b[0murl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mproxies\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mproxies\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtimeout\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0metag_timeout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mheaders\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mheaders\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtoken\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtoken\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mendpoint\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mendpoint\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/huggingface_hub/utils/_validators.py\u001b[0m in \u001b[0;36m_inner_fn\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    113\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 114\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    115\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/huggingface_hub/file_download.py\u001b[0m in \u001b[0;36mget_hf_file_metadata\u001b[0;34m(url, token, proxies, timeout, library_name, library_version, user_agent, headers, endpoint)\u001b[0m\n\u001b[1;32m   1459\u001b[0m     \u001b[0;31m# Retrieve metadata\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1460\u001b[0;31m     r = _request_wrapper(\n\u001b[0m\u001b[1;32m   1461\u001b[0m         \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"HEAD\"\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/huggingface_hub/file_download.py\u001b[0m in \u001b[0;36m_request_wrapper\u001b[0;34m(method, url, follow_relative_redirects, **params)\u001b[0m\n\u001b[1;32m    282\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mfollow_relative_redirects\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 283\u001b[0;31m         response = _request_wrapper(\n\u001b[0m\u001b[1;32m    284\u001b[0m             \u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/huggingface_hub/file_download.py\u001b[0m in \u001b[0;36m_request_wrapper\u001b[0;34m(method, url, follow_relative_redirects, **params)\u001b[0m\n\u001b[1;32m    305\u001b[0m     \u001b[0;31m# Perform request and return if status_code is not in the retry list.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 306\u001b[0;31m     \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mhttp_backoff\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mparams\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    307\u001b[0m     \u001b[0mhf_raise_for_status\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresponse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/huggingface_hub/utils/_http.py\u001b[0m in \u001b[0;36mhttp_backoff\u001b[0;34m(method, url, max_retries, base_wait_time, max_wait_time, retry_on_exceptions, retry_on_status_codes, **kwargs)\u001b[0m\n\u001b[1;32m    324\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mnb_tries\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0mmax_retries\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 325\u001b[0;31m                 \u001b[0;32mraise\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    326\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/huggingface_hub/utils/_http.py\u001b[0m in \u001b[0;36mhttp_backoff\u001b[0;34m(method, url, max_retries, base_wait_time, max_wait_time, retry_on_exceptions, retry_on_status_codes, **kwargs)\u001b[0m\n\u001b[1;32m    305\u001b[0m             \u001b[0;31m# Perform request and return if status_code is not in the retry list.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 306\u001b[0;31m             \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msession\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mmethod\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0murl\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0murl\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    307\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mresponse\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mstatus_code\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mretry_on_status_codes\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/requests/sessions.py\u001b[0m in \u001b[0;36mrequest\u001b[0;34m(self, method, url, params, data, headers, cookies, files, auth, timeout, allow_redirects, proxies, hooks, stream, verify, cert, json)\u001b[0m\n\u001b[1;32m    588\u001b[0m         \u001b[0msend_kwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msettings\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 589\u001b[0;31m         \u001b[0mresp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mprep\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0msend_kwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    590\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/requests/sessions.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, request, **kwargs)\u001b[0m\n\u001b[1;32m    702\u001b[0m         \u001b[0;31m# Send the request\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 703\u001b[0;31m         \u001b[0mr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0madapter\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    704\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/huggingface_hub/utils/_http.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, request, *args, **kwargs)\u001b[0m\n\u001b[1;32m     94\u001b[0m         \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 95\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0msuper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     96\u001b[0m         \u001b[0;32mexcept\u001b[0m \u001b[0mrequests\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mRequestException\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/requests/adapters.py\u001b[0m in \u001b[0;36msend\u001b[0;34m(self, request, stream, timeout, verify, cert, proxies)\u001b[0m\n\u001b[1;32m    676\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 677\u001b[0;31m             \u001b[0;32mraise\u001b[0m \u001b[0mConnectionError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mrequest\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrequest\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    678\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mConnectionError\u001b[0m: (MaxRetryError('HTTPSConnectionPool(host=\\'huggingface.co\\', port=443): Max retries exceeded with url: /timm/vit_base_patch14_reg4_dinov2.lvd142m/resolve/main/pytorch_model.bin (Caused by NameResolutionError(\"<urllib3.connection.HTTPSConnection object at 0x7e7e37871110>: Failed to resolve \\'huggingface.co\\' ([Errno -3] Temporary failure in name resolution)\"))'), '(Request ID: 48e4565a-5802-4a24-a1cb-2b948a681337)')","\nThe above exception was the direct cause of the following exception:\n","\u001b[0;31mLocalEntryNotFoundError\u001b[0m                   Traceback (most recent call last)","\u001b[0;32m/tmp/ipykernel_47/15771.py\u001b[0m in \u001b[0;36m<cell line: 0>\u001b[0;34m()\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mtorchvision\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mtransforms\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mmodel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcreate_model\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmodel_name1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mpretrained\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m      5\u001b[0m \u001b[0mdata_config\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimm\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdata\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mresolve_model_data_config\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      6\u001b[0m base_val_tfms = timm.data.create_transform(\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/timm/models/_factory.py\u001b[0m in \u001b[0;36mcreate_model\u001b[0;34m(model_name, pretrained, pretrained_cfg, pretrained_cfg_overlay, checkpoint_path, cache_dir, scriptable, exportable, no_jit, **kwargs)\u001b[0m\n\u001b[1;32m    136\u001b[0m     \u001b[0mcreate_fn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mmodel_entrypoint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel_name\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    137\u001b[0m     \u001b[0;32mwith\u001b[0m \u001b[0mset_layer_config\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mscriptable\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mscriptable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mexportable\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mexportable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mno_jit\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mno_jit\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 138\u001b[0;31m         model = create_fn(\n\u001b[0m\u001b[1;32m    139\u001b[0m             \u001b[0mpretrained\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpretrained\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    140\u001b[0m             \u001b[0mpretrained_cfg\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpretrained_cfg\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/timm/models/vision_transformer.py\u001b[0m in \u001b[0;36mvit_base_patch14_reg4_dinov2\u001b[0;34m(pretrained, **kwargs)\u001b[0m\n\u001b[1;32m   3492\u001b[0m         \u001b[0mreg_tokens\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m4\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mno_embed_class\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   3493\u001b[0m     )\n\u001b[0;32m-> 3494\u001b[0;31m     model = _create_vision_transformer(\n\u001b[0m\u001b[1;32m   3495\u001b[0m         'vit_base_patch14_reg4_dinov2', pretrained=pretrained, **dict(model_args, **kwargs))\n\u001b[1;32m   3496\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/timm/models/vision_transformer.py\u001b[0m in \u001b[0;36m_create_vision_transformer\u001b[0;34m(variant, pretrained, use_naflex, **kwargs)\u001b[0m\n\u001b[1;32m   2677\u001b[0m         \u001b[0mstrict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2678\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2679\u001b[0;31m     return build_model_with_cfg(\n\u001b[0m\u001b[1;32m   2680\u001b[0m         \u001b[0mVisionTransformer\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   2681\u001b[0m         \u001b[0mvariant\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/timm/models/_builder.py\u001b[0m in \u001b[0;36mbuild_model_with_cfg\u001b[0;34m(model_cls, variant, pretrained, pretrained_cfg, pretrained_cfg_overlay, model_cfg, feature_cfg, pretrained_strict, pretrained_filter_fn, cache_dir, kwargs_filter, **kwargs)\u001b[0m\n\u001b[1;32m    455\u001b[0m     \u001b[0mnum_classes_pretrained\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m0\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfeatures\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0mgetattr\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'num_classes'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'num_classes'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1000\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    456\u001b[0m     \u001b[0;32mif\u001b[0m \u001b[0mpretrained\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 457\u001b[0;31m         load_pretrained(\n\u001b[0m\u001b[1;32m    458\u001b[0m             \u001b[0mmodel\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    459\u001b[0m             \u001b[0mpretrained_cfg\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpretrained_cfg\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/timm/models/_builder.py\u001b[0m in \u001b[0;36mload_pretrained\u001b[0;34m(model, pretrained_cfg, num_classes, in_chans, filter_fn, strict, cache_dir)\u001b[0m\n\u001b[1;32m    224\u001b[0m                 \u001b[0mstate_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mload_state_dict_from_hf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0mpretrained_loc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcache_dir\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcache_dir\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    225\u001b[0m         \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 226\u001b[0;31m             \u001b[0mstate_dict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mload_state_dict_from_hf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mpretrained_loc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweights_only\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcache_dir\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcache_dir\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    227\u001b[0m     \u001b[0;32melif\u001b[0m \u001b[0mload_from\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m'local-dir'\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    228\u001b[0m         \u001b[0m_logger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minfo\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf'Loading pretrained weights from local directory ({pretrained_loc})'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/timm/models/_hub.py\u001b[0m in \u001b[0;36mload_state_dict_from_hf\u001b[0;34m(model_id, filename, weights_only, cache_dir)\u001b[0m\n\u001b[1;32m    241\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    242\u001b[0m     \u001b[0;31m# Otherwise, load using pytorch.load\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 243\u001b[0;31m     cached_file = hf_hub_download(\n\u001b[0m\u001b[1;32m    244\u001b[0m         \u001b[0mhf_model_id\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    245\u001b[0m         \u001b[0mfilename\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfilename\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/huggingface_hub/utils/_validators.py\u001b[0m in \u001b[0;36m_inner_fn\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m    112\u001b[0m             \u001b[0mkwargs\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msmoothly_deprecate_use_auth_token\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfn_name\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfn\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__name__\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhas_token\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mhas_token\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    113\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 114\u001b[0;31m         \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    115\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    116\u001b[0m     \u001b[0;32mreturn\u001b[0m \u001b[0m_inner_fn\u001b[0m  \u001b[0;31m# type: ignore\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/huggingface_hub/file_download.py\u001b[0m in \u001b[0;36mhf_hub_download\u001b[0;34m(repo_id, filename, subfolder, repo_type, revision, library_name, library_version, cache_dir, local_dir, user_agent, force_download, proxies, etag_timeout, token, local_files_only, headers, endpoint, resume_download, force_filename, local_dir_use_symlinks)\u001b[0m\n\u001b[1;32m   1005\u001b[0m         )\n\u001b[1;32m   1006\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1007\u001b[0;31m         return _hf_hub_download_to_cache_dir(\n\u001b[0m\u001b[1;32m   1008\u001b[0m             \u001b[0;31m# Destination\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1009\u001b[0m             \u001b[0mcache_dir\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mcache_dir\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/huggingface_hub/file_download.py\u001b[0m in \u001b[0;36m_hf_hub_download_to_cache_dir\u001b[0;34m(cache_dir, repo_id, filename, repo_type, revision, endpoint, etag_timeout, headers, proxies, token, local_files_only, force_download)\u001b[0m\n\u001b[1;32m   1112\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1113\u001b[0m         \u001b[0;31m# Otherwise, raise appropriate error\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1114\u001b[0;31m         \u001b[0m_raise_on_head_call_error\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mhead_call_error\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mforce_download\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlocal_files_only\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1115\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1116\u001b[0m     \u001b[0;31m# From now on, etag, commit_hash, url and size are not None.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;32m/usr/local/lib/python3.11/dist-packages/huggingface_hub/file_download.py\u001b[0m in \u001b[0;36m_raise_on_head_call_error\u001b[0;34m(head_call_error, force_download, local_files_only)\u001b[0m\n\u001b[1;32m   1656\u001b[0m     \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1657\u001b[0m         \u001b[0;31m# Otherwise: most likely a connection issue or Hub downtime => let's warn the user\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1658\u001b[0;31m         raise LocalEntryNotFoundError(\n\u001b[0m\u001b[1;32m   1659\u001b[0m             \u001b[0;34m\"An error happened while trying to locate the file on the Hub and we cannot find the requested files\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1660\u001b[0m             \u001b[0;34m\" in the local cache. Please check your connection and try again or make sure your Internet connection\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n","\u001b[0;31mLocalEntryNotFoundError\u001b[0m: An error happened while trying to locate the file on the Hub and we cannot find the requested files in the local cache. Please check your connection and try again or make sure your Internet connection is on."],"ename":"LocalEntryNotFoundError","evalue":"An error happened while trying to locate the file on the Hub and we cannot find the requested files in the local cache. Please check your connection and try again or make sure your Internet connection is on.","output_type":"error"}],"execution_count":10},{"cell_type":"markdown","source":"## Defining Loss Function","metadata":{}},{"cell_type":"code","source":"def get_weights(weights=config.weights):\n    w_list= []\n    for things in weights.items():\n        w_list.append(things[1])\n    return torch.tensor(w_list)\n\nw_tensor = get_weights()\n\nclass weightedMSE(torch.nn.Module):\n    def __init__(self,weights):\n        super().__init__()\n        self.weights = weights\n        \n    def forward(self,inputs,labels):\n        loss = (inputs-labels)**2\n        loss = loss*self.weights\n        return loss.mean()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:48:32.304192Z","iopub.status.idle":"2026-01-07T22:48:32.304426Z","shell.execute_reply.started":"2026-01-07T22:48:32.304316Z","shell.execute_reply":"2026-01-07T22:48:32.304326Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Setting Up HyperParams","metadata":{}},{"cell_type":"code","source":"NUM_EPOCHS = config.epochs","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:48:32.305543Z","iopub.status.idle":"2026-01-07T22:48:32.305904Z","shell.execute_reply.started":"2026-01-07T22:48:32.305705Z","shell.execute_reply":"2026-01-07T22:48:32.305722Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Training","metadata":{}},{"cell_type":"code","source":"# processor = AutoImageProcessor.from_pretrained(config.model_id)\nall_loaders = get_loaders(df,splitter,train_transforms,val_transforms,batches=[16,32])\n# all_loaders2 = get_loaders(df,splitter,train_transforms2,val_transforms2)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:48:32.306799Z","iopub.status.idle":"2026-01-07T22:48:32.307034Z","shell.execute_reply.started":"2026-01-07T22:48:32.306932Z","shell.execute_reply":"2026-01-07T22:48:32.306941Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def train_one_batch(model,batch,loss_fn,optimizer,scheduler,scaler,DEVICE):\n    images = batch[0].to(DEVICE)\n    targets = batch[1].to(DEVICE)\n    optimizer.zero_grad()\n\n    with autocast(device_type = DEVICE):\n        outputs = model(images)\n        loss = loss_fn(outputs,targets)\n\n    scaler.scale(loss).backward()\n    scaler.step(optimizer)\n    scaler.update()\n    scheduler.step()\n    return loss.item()\n            \ndef val_one_batch(model,batch,loss_fn,scaler,DEVICE):\n    with torch.no_grad():\n        images = batch[0].to(DEVICE)\n        targets = batch[1].to(DEVICE)\n        with autocast(device_type= DEVICE):\n            outputs = model(images)\n            loss = loss_fn(outputs,targets)\n    return loss.item(),outputs.float().cpu(),targets.float().cpu()\n\nfrom sklearn.metrics import r2_score\n\ndef get_competition_metric(preds, targets):\n    weights = np.array([0.1, 0.1, 0.1, 0.2, 0.5])\n    w_flat = np.tile(weights, (preds.shape[0], 1)).flatten()\n    y_true = targets.flatten()\n    y_pred = preds.flatten()\n    y_bar_w = np.sum(w_flat * y_true) / np.sum(w_flat)\n    ss_res = np.sum(w_flat * (y_true - y_pred)**2)\n    ss_tot = np.sum(w_flat * (y_true - y_bar_w)**2)\n    return 1 - (ss_res / ss_tot)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:48:32.307836Z","iopub.status.idle":"2026-01-07T22:48:32.308064Z","shell.execute_reply.started":"2026-01-07T22:48:32.307962Z","shell.execute_reply":"2026-01-07T22:48:32.307971Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# def freeze_backbone(model):\n#     for name, param in model.named_parameters():\n#         if \"backbone\" in name:\n#             param.requires_grad = False\n\n# def unfreeze_backbone(model):\n#     for name, param in model.named_parameters():\n#         if \"backbone\" in name:\n#             param.requires_grad = True\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:48:32.30883Z","iopub.status.idle":"2026-01-07T22:48:32.309051Z","shell.execute_reply.started":"2026-01-07T22:48:32.308949Z","shell.execute_reply":"2026-01-07T22:48:32.308959Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def set_seed(seed):\n    import random\n    random.seed(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed_all(seed)\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = False","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-07T22:48:32.309784Z","iopub.status.idle":"2026-01-07T22:48:32.310061Z","shell.execute_reply.started":"2026-01-07T22:48:32.309956Z","shell.execute_reply":"2026-01-07T22:48:32.309966Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\nfrom torch.amp import autocast,GradScaler \nfrom tqdm.notebook import trange,tqdm \nDEVICE = 'cuda' if torch.cuda.is_available() else 'cpu' \nscaler = GradScaler(DEVICE) \nexperiment = 1 \n\nfor seed in [108]:\n    set_seed(seed=seed)\n    print(f'Training SEED: {seed}')\n    model_file = f'/kaggle/working/seed_{seed}_ver_{experiment}_best' \n    os.makedirs(model_file,exist_ok=True)\n    for idx, loaders in enumerate(all_loaders):\n        if (seed == 42 and idx == 4 )or (seed == 108):\n            print(f'Training fold {idx+1}')\n        \n            model = BioEstimatorD(\n                name=config.model_name1,\n            ).to(DEVICE)\n    \n            for p in model.parameters():\n                p.requires_grad = True\n            \n            backbone_params = model.backbone.parameters()\n            head_params = model.head.parameters()\n            \n            optimizer = torch.optim.AdamW(\n                [\n                    {\n                        \"params\": backbone_params, \n                        \"lr\": 1e-5  # Low LR for the pre-trained backbone\n                    },\n                    {\n                        \"params\": head_params, \n                        \"lr\": 3e-4  # High LR for the fresh regression head\n                    },\n                ],\n                weight_decay=0.01\n            )\n                \n            scheduler = get_cosine_schedule_with_warmup(\n                optimizer,\n                num_warmup_steps=int(0.1 * NUM_EPOCHS * len(loaders[0])),\n                num_training_steps=NUM_EPOCHS * len(loaders[0])\n            )\n        \n            criterion = weightedMSE(w_tensor.to(DEVICE))\n            best_loss = float(\"inf\")\n            best_r2 = -float(\"inf\")\n            trigger = 0\n            patience = 8\n        \n            for epoch in trange(NUM_EPOCHS, desc=f'Fold {idx+1}'):\n                train_losses = []\n        \n                for batch in tqdm(loaders[0], desc=\"TRAIN\", leave=False):\n                    loss = train_one_batch(\n                        model, batch, criterion,\n                        optimizer, scheduler,\n                        scaler, DEVICE\n                    )\n                    train_losses.append(loss)\n        \n                avg_train_loss = np.mean(train_losses)\n        \n    \n                val_losses = []\n                all_outputs, all_targets = [], []\n        \n                for batch in tqdm(loaders[1], desc=\"VAL\", leave=False):\n                    loss, outputs, targets = val_one_batch(\n                        model, batch, criterion,\n                        scaler, DEVICE\n                    )\n                    val_losses.append(loss)\n                    all_outputs.append(outputs)\n                    all_targets.append(targets)\n        \n                avg_val_loss = np.mean(val_losses)\n                preds = np.vstack(all_outputs)\n                targets = np.vstack(all_targets)\n        \n                epoch_r2 = get_competition_metric(preds, targets)\n        \n                print(\n                    f\"Epoch {epoch+1} | \"\n                    f\"Train {avg_train_loss:.4f} | \"\n                    f\"Val {avg_val_loss:.4f} | \"\n                    f\"R2 {epoch_r2:.4f}\"\n                )\n        \n                # ================= CHECKPOINT =================\n                if avg_val_loss < best_loss:\n                    best_loss = avg_val_loss\n                    best_r2 = epoch_r2\n                    trigger = 0\n                    torch.save(\n                        model.state_dict(),\n                        f\"{model_file}/DINO_fold{idx+1}.pth\"\n                    )\n                    print(f\"--> Saved (R2={best_r2:.4f})\")\n                else:\n                    trigger += 1\n                    if trigger >= patience:\n                        print(\"EARLY STOPPING\")\n                        break\n        \n            del model, optimizer, scheduler\n            torch.cuda.empty_cache()","metadata":{"trusted":true,"scrolled":true,"_kg_hide-output":true,"execution":{"iopub.status.busy":"2026-01-07T22:48:32.311293Z","iopub.status.idle":"2026-01-07T22:48:32.311495Z","shell.execute_reply.started":"2026-01-07T22:48:32.311396Z","shell.execute_reply":"2026-01-07T22:48:32.311405Z"}},"outputs":[],"execution_count":null}]}