loodvanniekerkginkgo commited on
Commit
7ae8833
·
1 Parent(s): 5554fb7

Added example notebook for Georgia

Browse files
Files changed (1) hide show
  1. notebooks/pIgGen_example.ipynb +467 -0
notebooks/pIgGen_example.ipynb ADDED
@@ -0,0 +1,467 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "id": "7c6c914c",
7
+ "metadata": {},
8
+ "outputs": [],
9
+ "source": [
10
+ "from datasets import load_dataset\n",
11
+ "import matplotlib.pyplot as plt\n",
12
+ "import numpy as np\n",
13
+ "from scipy.stats import spearmanr\n",
14
+ "import seaborn as sns\n",
15
+ "from sklearn.linear_model import Ridge\n",
16
+ "from sklearn.model_selection import train_test_split\n",
17
+ "import torch\n",
18
+ "from tqdm.auto import tqdm\n",
19
+ "from transformers import AutoModelForCausalLM, AutoTokenizer"
20
+ ]
21
+ },
22
+ {
23
+ "cell_type": "code",
24
+ "execution_count": null,
25
+ "id": "00cfd012",
26
+ "metadata": {},
27
+ "outputs": [
28
+ {
29
+ "data": {
30
+ "text/html": [
31
+ "<div>\n",
32
+ "<style scoped>\n",
33
+ " .dataframe tbody tr th:only-of-type {\n",
34
+ " vertical-align: middle;\n",
35
+ " }\n",
36
+ "\n",
37
+ " .dataframe tbody tr th {\n",
38
+ " vertical-align: top;\n",
39
+ " }\n",
40
+ "\n",
41
+ " .dataframe thead th {\n",
42
+ " text-align: right;\n",
43
+ " }\n",
44
+ "</style>\n",
45
+ "<table border=\"1\" class=\"dataframe\">\n",
46
+ " <thead>\n",
47
+ " <tr style=\"text-align: right;\">\n",
48
+ " <th></th>\n",
49
+ " <th>antibody_id</th>\n",
50
+ " <th>antibody_name</th>\n",
51
+ " <th>Titer</th>\n",
52
+ " <th>Purity</th>\n",
53
+ " <th>SEC %Monomer</th>\n",
54
+ " <th>SMAC</th>\n",
55
+ " <th>HIC</th>\n",
56
+ " <th>HAC</th>\n",
57
+ " <th>PR_CHO</th>\n",
58
+ " <th>PR_Ova</th>\n",
59
+ " <th>...</th>\n",
60
+ " <th>hc_protein_sequence</th>\n",
61
+ " <th>hc_dna_sequence</th>\n",
62
+ " <th>vl_protein_sequence</th>\n",
63
+ " <th>lc_protein_sequence</th>\n",
64
+ " <th>lc_dna_sequence</th>\n",
65
+ " <th>hierarchical_cluster_fold</th>\n",
66
+ " <th>random_fold</th>\n",
67
+ " <th>hierarchical_cluster_IgG_isotype_stratified_fold</th>\n",
68
+ " <th>light_aligned_aho</th>\n",
69
+ " <th>heavy_aligned_aho</th>\n",
70
+ " </tr>\n",
71
+ " </thead>\n",
72
+ " <tbody>\n",
73
+ " <tr>\n",
74
+ " <th>0</th>\n",
75
+ " <td>GDPa1-001</td>\n",
76
+ " <td>abagovomab</td>\n",
77
+ " <td>140.25</td>\n",
78
+ " <td>98.530</td>\n",
79
+ " <td>97.010</td>\n",
80
+ " <td>2.730</td>\n",
81
+ " <td>2.590</td>\n",
82
+ " <td>NaN</td>\n",
83
+ " <td>0.337837</td>\n",
84
+ " <td>0.263108</td>\n",
85
+ " <td>...</td>\n",
86
+ " <td>MRAWIFFLLCLAGRALAQVKLQESGAELARPGASVKLSCKASGYTF...</td>\n",
87
+ " <td>GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG...</td>\n",
88
+ " <td>DIELTQSPASLSASVGETVTITCQASENIYSYLAWHQQKQGKSPQL...</td>\n",
89
+ " <td>MRAWIFFLLCLAGRALADIELTQSPASLSASVGETVTITCQASENI...</td>\n",
90
+ " <td>GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG...</td>\n",
91
+ " <td>1</td>\n",
92
+ " <td>2</td>\n",
93
+ " <td>2</td>\n",
94
+ " <td>DIELTQSPASLSASVGETVTITCQAS--ENIY------SYLAWHQQ...</td>\n",
95
+ " <td>QVKLQES-GAELARPGASVKLSCKASG-YTFTN-----YWMQWVKQ...</td>\n",
96
+ " </tr>\n",
97
+ " <tr>\n",
98
+ " <th>1</th>\n",
99
+ " <td>GDPa1-002</td>\n",
100
+ " <td>abituzumab</td>\n",
101
+ " <td>193.31</td>\n",
102
+ " <td>99.825</td>\n",
103
+ " <td>97.620</td>\n",
104
+ " <td>2.745</td>\n",
105
+ " <td>2.545</td>\n",
106
+ " <td>3.690</td>\n",
107
+ " <td>0.205246</td>\n",
108
+ " <td>0.100155</td>\n",
109
+ " <td>...</td>\n",
110
+ " <td>MRAWIFFLLCLAGRALAQVQLQQSGGELAKPGASVKVSCKASGYTF...</td>\n",
111
+ " <td>GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG...</td>\n",
112
+ " <td>DIQMTQSPSSLSASVGDRVTITCRASQDISNYLAWYQQKPGKAPKL...</td>\n",
113
+ " <td>MRAWIFFLLCLAGRALADIQMTQSPSSLSASVGDRVTITCRASQDI...</td>\n",
114
+ " <td>GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG...</td>\n",
115
+ " <td>1</td>\n",
116
+ " <td>4</td>\n",
117
+ " <td>0</td>\n",
118
+ " <td>DIQMTQSPSSLSASVGDRVTITCRAS--QDIS------NYLAWYQQ...</td>\n",
119
+ " <td>QVQLQQS-GGELAKPGASVKVSCKASG-YTFSS-----FWMHWVRQ...</td>\n",
120
+ " </tr>\n",
121
+ " <tr>\n",
122
+ " <th>2</th>\n",
123
+ " <td>GDPa1-003</td>\n",
124
+ " <td>abrezekimab</td>\n",
125
+ " <td>114.75</td>\n",
126
+ " <td>98.350</td>\n",
127
+ " <td>89.055</td>\n",
128
+ " <td>2.740</td>\n",
129
+ " <td>2.705</td>\n",
130
+ " <td>NaN</td>\n",
131
+ " <td>0.138773</td>\n",
132
+ " <td>0.101180</td>\n",
133
+ " <td>...</td>\n",
134
+ " <td>MRAWIFFLLCLAGRALAQVTLKESGPVLVKPTETLTLTCTVSGFSL...</td>\n",
135
+ " <td>GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG...</td>\n",
136
+ " <td>DIQMTQSPSSLSASVGDRVTITCLASEDISNYLAWYQQKPGKAPKL...</td>\n",
137
+ " <td>MRAWIFFLLCLAGRALADIQMTQSPSSLSASVGDRVTITCLASEDI...</td>\n",
138
+ " <td>GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG...</td>\n",
139
+ " <td>2</td>\n",
140
+ " <td>2</td>\n",
141
+ " <td>2</td>\n",
142
+ " <td>DIQMTQSPSSLSASVGDRVTITCLAS--EDIS------NYLAWYQQ...</td>\n",
143
+ " <td>QVTLKES-GPVLVKPTETLTLTCTVSG-FSLTN-----YHVQWIRQ...</td>\n",
144
+ " </tr>\n",
145
+ " <tr>\n",
146
+ " <th>3</th>\n",
147
+ " <td>GDPa1-004</td>\n",
148
+ " <td>abrilumab</td>\n",
149
+ " <td>327.32</td>\n",
150
+ " <td>98.575</td>\n",
151
+ " <td>98.605</td>\n",
152
+ " <td>2.715</td>\n",
153
+ " <td>2.565</td>\n",
154
+ " <td>1.005</td>\n",
155
+ " <td>0.000000</td>\n",
156
+ " <td>0.054971</td>\n",
157
+ " <td>...</td>\n",
158
+ " <td>MRAWIFFLLCLAGRALAQVQLVQSGAEVKKPGASVKVSCKVSGYTL...</td>\n",
159
+ " <td>GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG...</td>\n",
160
+ " <td>DIQMTQSPSSVSASVGDRVTITCRASQGISSWLAWYQQKPGKAPKL...</td>\n",
161
+ " <td>MRAWIFFLLCLAGRALADIQMTQSPSSVSASVGDRVTITCRASQGI...</td>\n",
162
+ " <td>GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG...</td>\n",
163
+ " <td>1</td>\n",
164
+ " <td>3</td>\n",
165
+ " <td>0</td>\n",
166
+ " <td>DIQMTQSPSSVSASVGDRVTITCRAS--QGIS------SWLAWYQQ...</td>\n",
167
+ " <td>QVQLVQS-GAEVKKPGASVKVSCKVSG-YTLSD-----LSIHWVRQ...</td>\n",
168
+ " </tr>\n",
169
+ " <tr>\n",
170
+ " <th>4</th>\n",
171
+ " <td>GDPa1-005</td>\n",
172
+ " <td>adalimumab</td>\n",
173
+ " <td>313.39</td>\n",
174
+ " <td>99.300</td>\n",
175
+ " <td>96.120</td>\n",
176
+ " <td>2.705</td>\n",
177
+ " <td>2.495</td>\n",
178
+ " <td>NaN</td>\n",
179
+ " <td>0.183387</td>\n",
180
+ " <td>0.085628</td>\n",
181
+ " <td>...</td>\n",
182
+ " <td>MRAWIFFLLCLAGRALAEVQLVESGGGLVQPGRSLRLSCAASGFTF...</td>\n",
183
+ " <td>GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG...</td>\n",
184
+ " <td>DIQMTQSPSSLSASVGDRVTITCRASQGIRNYLAWYQQKPGKAPKL...</td>\n",
185
+ " <td>MRAWIFFLLCLAGRALADIQMTQSPSSLSASVGDRVTITCRASQGI...</td>\n",
186
+ " <td>GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG...</td>\n",
187
+ " <td>0</td>\n",
188
+ " <td>2</td>\n",
189
+ " <td>0</td>\n",
190
+ " <td>DIQMTQSPSSLSASVGDRVTITCRAS--QGIR------NYLAWYQQ...</td>\n",
191
+ " <td>EVQLVES-GGGLVQPGRSLRLSCAASG-FTFDD-----YAMHWVRQ...</td>\n",
192
+ " </tr>\n",
193
+ " </tbody>\n",
194
+ "</table>\n",
195
+ "<p>5 rows × 30 columns</p>\n",
196
+ "</div>"
197
+ ],
198
+ "text/plain": [
199
+ " antibody_id antibody_name Titer Purity SEC %Monomer SMAC HIC \\\n",
200
+ "0 GDPa1-001 abagovomab 140.25 98.530 97.010 2.730 2.590 \n",
201
+ "1 GDPa1-002 abituzumab 193.31 99.825 97.620 2.745 2.545 \n",
202
+ "2 GDPa1-003 abrezekimab 114.75 98.350 89.055 2.740 2.705 \n",
203
+ "3 GDPa1-004 abrilumab 327.32 98.575 98.605 2.715 2.565 \n",
204
+ "4 GDPa1-005 adalimumab 313.39 99.300 96.120 2.705 2.495 \n",
205
+ "\n",
206
+ " HAC PR_CHO PR_Ova ... \\\n",
207
+ "0 NaN 0.337837 0.263108 ... \n",
208
+ "1 3.690 0.205246 0.100155 ... \n",
209
+ "2 NaN 0.138773 0.101180 ... \n",
210
+ "3 1.005 0.000000 0.054971 ... \n",
211
+ "4 NaN 0.183387 0.085628 ... \n",
212
+ "\n",
213
+ " hc_protein_sequence \\\n",
214
+ "0 MRAWIFFLLCLAGRALAQVKLQESGAELARPGASVKLSCKASGYTF... \n",
215
+ "1 MRAWIFFLLCLAGRALAQVQLQQSGGELAKPGASVKVSCKASGYTF... \n",
216
+ "2 MRAWIFFLLCLAGRALAQVTLKESGPVLVKPTETLTLTCTVSGFSL... \n",
217
+ "3 MRAWIFFLLCLAGRALAQVQLVQSGAEVKKPGASVKVSCKVSGYTL... \n",
218
+ "4 MRAWIFFLLCLAGRALAEVQLVESGGGLVQPGRSLRLSCAASGFTF... \n",
219
+ "\n",
220
+ " hc_dna_sequence \\\n",
221
+ "0 GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG... \n",
222
+ "1 GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG... \n",
223
+ "2 GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG... \n",
224
+ "3 GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG... \n",
225
+ "4 GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG... \n",
226
+ "\n",
227
+ " vl_protein_sequence \\\n",
228
+ "0 DIELTQSPASLSASVGETVTITCQASENIYSYLAWHQQKQGKSPQL... \n",
229
+ "1 DIQMTQSPSSLSASVGDRVTITCRASQDISNYLAWYQQKPGKAPKL... \n",
230
+ "2 DIQMTQSPSSLSASVGDRVTITCLASEDISNYLAWYQQKPGKAPKL... \n",
231
+ "3 DIQMTQSPSSVSASVGDRVTITCRASQGISSWLAWYQQKPGKAPKL... \n",
232
+ "4 DIQMTQSPSSLSASVGDRVTITCRASQGIRNYLAWYQQKPGKAPKL... \n",
233
+ "\n",
234
+ " lc_protein_sequence \\\n",
235
+ "0 MRAWIFFLLCLAGRALADIELTQSPASLSASVGETVTITCQASENI... \n",
236
+ "1 MRAWIFFLLCLAGRALADIQMTQSPSSLSASVGDRVTITCRASQDI... \n",
237
+ "2 MRAWIFFLLCLAGRALADIQMTQSPSSLSASVGDRVTITCLASEDI... \n",
238
+ "3 MRAWIFFLLCLAGRALADIQMTQSPSSVSASVGDRVTITCRASQGI... \n",
239
+ "4 MRAWIFFLLCLAGRALADIQMTQSPSSLSASVGDRVTITCRASQGI... \n",
240
+ "\n",
241
+ " lc_dna_sequence \\\n",
242
+ "0 GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG... \n",
243
+ "1 GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG... \n",
244
+ "2 GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG... \n",
245
+ "3 GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG... \n",
246
+ "4 GCCGCCACCATGAGAGCCTGGATCTTTTTCCTGCTGTGCCTGGCTG... \n",
247
+ "\n",
248
+ " hierarchical_cluster_fold random_fold \\\n",
249
+ "0 1 2 \n",
250
+ "1 1 4 \n",
251
+ "2 2 2 \n",
252
+ "3 1 3 \n",
253
+ "4 0 2 \n",
254
+ "\n",
255
+ " hierarchical_cluster_IgG_isotype_stratified_fold \\\n",
256
+ "0 2 \n",
257
+ "1 0 \n",
258
+ "2 2 \n",
259
+ "3 0 \n",
260
+ "4 0 \n",
261
+ "\n",
262
+ " light_aligned_aho \\\n",
263
+ "0 DIELTQSPASLSASVGETVTITCQAS--ENIY------SYLAWHQQ... \n",
264
+ "1 DIQMTQSPSSLSASVGDRVTITCRAS--QDIS------NYLAWYQQ... \n",
265
+ "2 DIQMTQSPSSLSASVGDRVTITCLAS--EDIS------NYLAWYQQ... \n",
266
+ "3 DIQMTQSPSSVSASVGDRVTITCRAS--QGIS------SWLAWYQQ... \n",
267
+ "4 DIQMTQSPSSLSASVGDRVTITCRAS--QGIR------NYLAWYQQ... \n",
268
+ "\n",
269
+ " heavy_aligned_aho \n",
270
+ "0 QVKLQES-GAELARPGASVKLSCKASG-YTFTN-----YWMQWVKQ... \n",
271
+ "1 QVQLQQS-GGELAKPGASVKVSCKASG-YTFSS-----FWMHWVRQ... \n",
272
+ "2 QVTLKES-GPVLVKPTETLTLTCTVSG-FSLTN-----YHVQWIRQ... \n",
273
+ "3 QVQLVQS-GAEVKKPGASVKVSCKVSG-YTLSD-----LSIHWVRQ... \n",
274
+ "4 EVQLVES-GGGLVQPGRSLRLSCAASG-FTFDD-----YAMHWVRQ... \n",
275
+ "\n",
276
+ "[5 rows x 30 columns]"
277
+ ]
278
+ },
279
+ "execution_count": 2,
280
+ "metadata": {},
281
+ "output_type": "execute_result"
282
+ }
283
+ ],
284
+ "source": [
285
+ "model_name = \"ollieturnbull/p-IgGen\"\n",
286
+ "df = load_dataset(\"ginkgo-datapoints/GDPa1\")[\"train\"].to_pandas()\n",
287
+ "\n",
288
+ "# Example: Just predict HIC, so we'll drop NaN rows for that\n",
289
+ "df = df.dropna(subset=[\"HIC\"])\n",
290
+ "df.head()"
291
+ ]
292
+ },
293
+ {
294
+ "cell_type": "code",
295
+ "execution_count": null,
296
+ "id": "f6da015f",
297
+ "metadata": {},
298
+ "outputs": [
299
+ {
300
+ "name": "stdout",
301
+ "output_type": "stream",
302
+ "text": [
303
+ "1Q V K L Q E S G A E L A R P G A S V K L S C K A S G Y T F T N Y W M Q W V K Q R P G Q G L D W I G A I Y P G D G N T R Y T H K F K G K A T L T A D K S S S T A Y M Q L S S L A S E D S G V Y Y C A R G E G N Y A W F A Y W G Q G T T V T V S SD I E L T Q S P A S L S A S V G E T V T I T C Q A S E N I Y S Y L A W H Q Q K Q G K S P Q L L V Y N A K T L A G G V S S R F S G S G S G T H F S L K I K S L Q P E D F G I Y Y C Q H H Y G I L P T F G G G T K L E I K2\n"
304
+ ]
305
+ }
306
+ ],
307
+ "source": [
308
+ "# Tokenize the sequences\n",
309
+ "tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
310
+ "\n",
311
+ "# Paired sequence handling: Concatenate heavy and light chains and add beginning (\"1\") and end (\"2\") tokens \n",
312
+ "# (e.g. [\"EVQLV...\", \"DIQMT...\"] -> \"1E V Q L V ... D I Q M T ... 2\")\n",
313
+ "sequences = [\n",
314
+ " \"1\" + \" \".join(heavy) + \" \".join(light) + \"2\"\n",
315
+ " for heavy, light in zip(\n",
316
+ " df[\"vh_protein_sequence\"],\n",
317
+ " df[\"vl_protein_sequence\"],\n",
318
+ " )\n",
319
+ "]\n",
320
+ "\n",
321
+ "print(sequences[0])"
322
+ ]
323
+ },
324
+ {
325
+ "cell_type": "code",
326
+ "execution_count": null,
327
+ "id": "afeb8db8",
328
+ "metadata": {},
329
+ "outputs": [
330
+ {
331
+ "data": {
332
+ "application/vnd.jupyter.widget-view+json": {
333
+ "model_id": "48c1bb6d281f476abd0156e2cf5ef1e4",
334
+ "version_major": 2,
335
+ "version_minor": 0
336
+ },
337
+ "text/plain": [
338
+ " 0%| | 0/8 [00:00<?, ?it/s]"
339
+ ]
340
+ },
341
+ "metadata": {},
342
+ "output_type": "display_data"
343
+ }
344
+ ],
345
+ "source": [
346
+ "# Load model\n",
347
+ "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n",
348
+ "model = AutoModelForCausalLM.from_pretrained(model_name).to(device)\n",
349
+ "\n",
350
+ "# Takes about 60 seconds for 242 sequences on my CPU, and 1.1s on GPU\n",
351
+ "batch_size = 16\n",
352
+ "mean_pooled_embeddings = []\n",
353
+ "for i in tqdm(range(0, len(sequences), batch_size)):\n",
354
+ " batch = tokenizer(sequences[i:i+batch_size], return_tensors=\"pt\", padding=True, truncation=True)\n",
355
+ " outputs = model(batch[\"input_ids\"].to(device), return_rep_layers=[-1], output_hidden_states=True)\n",
356
+ " embeddings = outputs[\"hidden_states\"][-1].detach().cpu().numpy()\n",
357
+ " mean_pooled_embeddings.append(embeddings.mean(axis=1))\n",
358
+ "mean_pooled_embeddings = np.concatenate(mean_pooled_embeddings)"
359
+ ]
360
+ },
361
+ {
362
+ "cell_type": "code",
363
+ "execution_count": 20,
364
+ "id": "232b5c29",
365
+ "metadata": {},
366
+ "outputs": [],
367
+ "source": [
368
+ "# Train a linear regression on these\n",
369
+ "X = mean_pooled_embeddings\n",
370
+ "y = df[[\"HIC\"]].values\n",
371
+ "\n",
372
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
373
+ "\n",
374
+ "lm = Ridge()\n",
375
+ "lm.fit(X_train, y_train)\n",
376
+ "\n",
377
+ "y_pred = lm.predict(X_test)"
378
+ ]
379
+ },
380
+ {
381
+ "cell_type": "code",
382
+ "execution_count": 23,
383
+ "id": "1ee0d783",
384
+ "metadata": {},
385
+ "outputs": [
386
+ {
387
+ "data": {
388
+ "text/plain": [
389
+ "SignificanceResult(statistic=np.float64(0.436477769713997), pvalue=np.float64(0.0017165045450545625))"
390
+ ]
391
+ },
392
+ "execution_count": 23,
393
+ "metadata": {},
394
+ "output_type": "execute_result"
395
+ }
396
+ ],
397
+ "source": [
398
+ "# Calculate score\n",
399
+ "spearmanr(y_pred, y_test)"
400
+ ]
401
+ },
402
+ {
403
+ "cell_type": "code",
404
+ "execution_count": null,
405
+ "id": "fcf44ff3",
406
+ "metadata": {},
407
+ "outputs": [
408
+ {
409
+ "data": {
410
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHcCAYAAAAqQ4tyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8fJSN1AAAACXBIWXMAAA9hAAAPYQGoP6dpAABtIUlEQVR4nO3dd1RU19oG8GdAeldABREQEUVFCaLBAnajRsVoYolB7FHsMYnGROxorLl6xZiixhKN3RiV2MBYYu8FuxiVICpd+v7+8GOu41BmgGHa81tr1mL22efMe2YYzsvZTSKEECAiIiLSEQbqDoCIiIioPDG5ISIiIp3C5IaIiIh0CpMbIiIi0ilMboiIiEinMLkhIiIincLkhoiIiHQKkxsiIiLSKUxuiIiISKcwuSGd17p1a7Ru3VrdYcj4999/0bt3b1SpUgUSiQRLly5Vd0jFcnNzQ2hoqPR5dHQ0JBIJoqOj1RbT296OkTSTun93QkNDYWlpWa7HlEgkGD16dIn11qxZA4lEggcPHih1/NDQULi5uZUuOD3F5EZLXblyBb1794arqytMTU3h7OyMDh06YNmyZSp7zY0bNxZ6EX7y5AmmT5+Oixcvquy11SEjIwPTp09XyR/hCRMmICoqClOmTMG6devw3nvvlftraKK9e/di+vTp6g6jws2dOxc7d+5UdxiFmj59OiQSCRITEwvd7ubmhvfff7+Co6LiqPJvk65gcqOFTpw4gSZNmuDSpUsYNmwYli9fjqFDh8LAwADfffedyl63uORmxowZOpnczJgxQyV/QA4fPowePXpg0qRJGDBgAOrWrVvur6FKgYGBePXqFQIDA5Xab+/evZgxY4aKotJcmpzcUMX55JNP8OrVK7i6uiq13w8//IDY2Fjpc1X+bdIVldQdAClvzpw5sLGxwZkzZ2BrayuzLSEhQT1BqUB6ejosLCzUHYZKJCQkyH12qqCq99DAwACmpqblflzS7d97ZWRkZMDc3FzdYZQrQ0NDGBoaKr2fkZGRCqLRbbxzo4Xu3r2L+vXrF3pxdHR0lCtbv349mjZtCnNzc9jZ2SEwMBB//vmndPuuXbvQtWtXODk5wcTEBB4eHpg1axby8vKkdVq3bo0//vgDDx8+hEQigUQigZubG6Kjo+Hv7w8AGDRokHTbmjVrpPueOnUK7733HmxsbGBubo6goCAcP35cJsaCW+PXr19H//79YWdnh5YtWxb5HhS0XR89ehQjRoxAlSpVYG1tjZCQELx8+bLE9zAhIQFDhgxB1apVYWpqikaNGmHt2rXS7Q8ePICDgwMAYMaMGdLzKqlJ5d69e/jwww9RuXJlmJub491338Uff/whF7cQAv/973+lxy3KgwcPIJFIsHDhQixZsgSurq4wMzNDUFAQrl69KlO3oC/B3bt30aVLF1hZWeHjjz8GAOTn52Pp0qWoX78+TE1NUbVqVYwYMULuvRJCYPbs2ahRowbMzc3Rpk0bXLt2TS6uovpNnDp1Cl26dIGdnR0sLCzg4+MjvZsYGhqK//73vwAgPe83z728Y3xbTk4OKleujEGDBsltS0lJgampKSZNmiQtW7ZsGerXry/93jRp0gQbN24s8XXeJpFIkJ6ejrVr10rPuaBvUHG/90X1FSus/4Wi711ZCSHg5uaGHj16yG3LzMyEjY0NRowYIS37559/EBwcDAsLCzg6OmLChAnIysqS27d169Zo0KABzp07h8DAQJibm+Orr74CUPJ3FVDue1Lg8ePHCA4OhqWlJRwcHDBp0iSZv3nA60Tzs88+g4uLC0xMTODl5YWFCxdCCFHoMTds2AAvLy+YmprCz88PR48eldleVJ+bffv2ISgoCFZWVrC2toa/v7/M79qbn3lxf5tWr14NiUSCCxcuyMU2d+5cGBoa4vHjx4XGrmt450YLubq64uTJk7h69SoaNGhQbN0ZM2Zg+vTpaN68OWbOnAljY2OcOnUKhw8fRseOHQG8/sJZWlpi4sSJsLS0xOHDhzFt2jSkpKRgwYIFAICpU6ciOTkZ//zzD5YsWQIAsLS0RL169TBz5kxMmzYNw4cPR6tWrQAAzZs3B/C6+aVz587w8/NDeHg4DAwMsHr1arRt2xZ//fUXmjZtKhPvhx9+CE9PT8ydO7fIPyBvGj16NGxtbTF9+nTExsYiMjISDx8+lF58C/Pq1Su0bt0ad+7cwejRo+Hu7o4tW7YgNDQUSUlJGDduHBwcHBAZGYmRI0eiZ8+e+OCDDwAAPj4+Rcby77//onnz5sjIyMDYsWNRpUoVrF27Ft27d8fWrVvRs2dPBAYGYt26dfjkk0/QoUMHhISElHiOAPDLL78gNTUVYWFhyMzMxHfffYe2bdviypUrqFq1qrRebm4uOnXqhJYtW2LhwoXS/3xHjBiBNWvWYNCgQRg7dizu37+P5cuX48KFCzh+/Lj0P8Np06Zh9uzZ6NKlC7p06YLz58+jY8eOyM7OLjHGAwcO4P3330f16tUxbtw4VKtWDTdu3MCePXswbtw4jBgxAk+ePMGBAwewbt06uf1VHaORkRF69uyJ7du34/vvv4exsbF0286dO5GVlYW+ffsCeN0MMHbsWPTu3Rvjxo1DZmYmLl++jFOnTqF///4lvhdvWrduHYYOHYqmTZti+PDhAAAPDw+ZOsr+3r9N0feuOC9evCi0PD8/X/qzRCLBgAED8O233+LFixeoXLmydNvvv/+OlJQUDBgwAMDr71m7du0QFxeHsWPHwsnJCevWrcPhw4cLfZ3nz5+jc+fO6Nu3LwYMGICqVasq9F19k6Lfk7y8PHTq1AnNmjXDwoULcfDgQSxatAgeHh4YOXIkgNeJXPfu3XHkyBEMGTIEjRs3RlRUFD7//HM8fvxY+newQExMDDZv3oyxY8fCxMQEK1aswHvvvYfTp08X+3d6zZo1GDx4MOrXr48pU6bA1tYWFy5cwP79+wv9XSvub5O7uzvCwsKwYcMG+Pr6yuy3YcMGtG7dGs7OzkXGolMEaZ0///xTGBoaCkNDQxEQECC++OILERUVJbKzs2Xq3b59WxgYGIiePXuKvLw8mW35+fnSnzMyMuReY8SIEcLc3FxkZmZKy7p27SpcXV3l6p45c0YAEKtXr5Z7DU9PT9GpUye513N3dxcdOnSQloWHhwsAol+/fgq9B6tXrxYAhJ+fn8x5f/vttwKA2LVrl7QsKChIBAUFSZ8vXbpUABDr16+XlmVnZ4uAgABhaWkpUlJShBBCPHv2TAAQ4eHhCsU0fvx4AUD89ddf0rLU1FTh7u4u3NzcZD4DACIsLKzEY96/f18AEGZmZuKff/6Rlp86dUoAEBMmTJCWDRw4UAAQkydPljnGX3/9JQCIDRs2yJTv379fpjwhIUEYGxuLrl27ynxeX331lQAgBg4cKC07cuSIACCOHDkihBAiNzdXuLu7C1dXV/Hy5UuZ13nzWGFhYaKwPzuqiLEwUVFRAoD4/fffZcq7dOkiatWqJX3eo0cPUb9+/WKPpQwLC4tCYyvu9/7t39sCAwcOlPkeKvreFaUghuIeXbt2ldaPjY0VAERkZKTMcbp37y7c3Nykn0vB9+y3336T1klPTxe1a9eW+d0pOFcAYuXKlTLHVPS7WprvycyZM2Vey9fXV/j5+Umf79y5UwAQs2fPlqnXu3dvIZFIxJ07d6RlBe/T2bNnpWUPHz4UpqamomfPntKygr9b9+/fF0IIkZSUJKysrESzZs3Eq1evZF7nzd/vtz/z4v429evXTzg5Ocn8vTl//nyhf6N1GZultFCHDh1w8uRJdO/eHZcuXcK3336LTp06wdnZGbt375bW27lzJ/Lz8zFt2jQYGMh+1G/e1TAzM5P+nJqaisTERLRq1QoZGRm4efNmqeO8ePEibt++jf79++P58+dITExEYmIi0tPT0a5dOxw9elTmv0IA+PTTT5V6jeHDh8v8Vzpy5EhUqlQJe/fuLXKfvXv3olq1aujXr5+0zMjICGPHjkVaWhpiYmKUiuHN4zZt2lSmOc3S0hLDhw/HgwcPcP369VIdFwCCg4Nl/uNq2rQpmjVrVuh5FvznWWDLli2wsbFBhw4dpJ9BYmIi/Pz8YGlpiSNHjgAADh48iOzsbIwZM0bm92P8+PElxnfhwgXcv38f48ePl2suLa7ZrSJjBIC2bdvC3t4emzdvlpa9fPkSBw4cQJ8+faRltra2+Oeff3DmzBmFjltWyv7ev0nR964k27Ztw4EDB+Qeb97xAIA6deqgWbNm2LBhg7TsxYsX2LdvHz7++GPp57J3715Ur14dvXv3ltYzNzeX3r16m4mJiVyTobLfVWW+J2+/561atcK9e/dkXtvQ0BBjx46VqffZZ59BCIF9+/bJlAcEBMDPz0/6vGbNmujRoweioqLkmrsKHDhwAKmpqZg8ebJcHzZFvjeFCQkJwZMnT2Q+9w0bNsDMzAy9evUq1TG1EZultJS/vz+2b9+O7OxsXLp0CTt27MCSJUvQu3dvXLx4Ed7e3rh79y4MDAzg7e1d7LGuXbuGr7/+GocPH0ZKSorMtuTk5FLHePv2bQDAwIEDi6yTnJwMOzs76XN3d3elXsPT01PmuaWlJapXr17sPBIPHz6Ep6enXMJXr1496fbSePjwIZo1ayZX/uZxS2pGLMrb5wm8vsj89ttvMmWVKlVCjRo1ZMpu376N5OTkQvtjAf/rhF5w3m+/loODg8xnVJi7d+8CQKnPryJiBF6/P7169cLGjRuRlZUFExMTbN++HTk5OTLJzZdffomDBw+iadOmqF27Njp27Ij+/fujRYsWpTq/kij7e/8mRd+7kgQGBsLe3l6uvLCO4yEhIRg9ejQePnwIV1dXbNmyBTk5Ofjkk0+kdR4+fIjatWvLXaS9vLwKfX1nZ2eZpsKCYyjzXVX0e2Jqairtt1LAzs5Opo/Sw4cP4eTkBCsrqzK9dkZGBp49e4Zq1arJbS/r96YwHTp0QPXq1bFhwwa0a9cO+fn5+PXXX9GjRw+5c9FlTG60nLGxMfz9/eHv7486depg0KBB2LJlC8LDwxXaPykpCUFBQbC2tsbMmTPh4eEBU1NTnD9/Hl9++aXcnRVlFOy7YMECNG7cuNA6b0+m9eZdJFKeiYmJ3IUgPz8fjo6OMv9pv+ntP/LqUJEx9u3bF99//z327duH4OBg/Pbbb6hbty4aNWokrVOvXj3ExsZiz5492L9/P7Zt24YVK1Zg2rRpKhnKXtjvfUHH87e9fRdAHZ9v3759MWHCBGzYsAFfffUV1q9fjyZNmhSZuCiiIr/7pRmxpC0MDQ3Rv39//PDDD1ixYgWOHz+OJ0+eSPtC6QsmNzqkSZMmAICnT58CeN1pMT8/H9evXy8yuYiOjsbz58+xfft2mTlL7t+/L1e3qNukRZUXdJq0trZG+/btFT4PZdy+fRtt2rSRPk9LS8PTp0/RpUuXIvdxdXXF5cuXkZ+fL5MIFDTBFcxBoextYVdXV5m5KIo6bmkU3AV7061btxSatdTDwwMHDx5EixYtir2AFMR3+/Zt1KpVS1r+7NmzEkfdFHzWV69eLfazLu53RdUxFggMDET16tWxefNmtGzZEocPH8bUqVPl6llYWKBPnz7o06cPsrOz8cEHH2DOnDmYMmWK0sPgS9PEYGdnJ9NMUuDtOwaKvnflqXLlyujatSs2bNiAjz/+GMePH5ebA8vV1RVXr16FEELm/Av7jhRF0e9qgbJ8Twp77YMHDyI1NVXmjoeyr21ubl5kgvnm96Z27doKx1bS71NISAgWLVqE33//Hfv27YODgwM6deqk8PF1AfvcaKEjR44U+h9dQbtywX9PwcHBMDAwwMyZM+XuwBTsX/AfzJvHy87OxooVK+SOb2FhUWgzVcGcHElJSTLlfn5+8PDwwMKFC5GWlia337Nnz4o8R0WtWrUKOTk50ueRkZHIzc1F586di9ynS5cuiI+Pl+l3kZubi2XLlsHS0hJBQUEAIB1p9PZ5FXfc06dP4+TJk9Ky9PR0rFq1Cm5ubiU2DxZn586dMkM4T58+jVOnThV7ngU++ugj5OXlYdasWXLbcnNzpefXvn17GBkZYdmyZTK/D4osDfHOO+/A3d0dS5culXu/3jxWUb8rFRFjAQMDA/Tu3Ru///471q1bh9zcXJkmKeD1yJ03GRsbw9vbG0II6e9bQZ+0omb2fZOFhYXCv0cFPDw8cPPmTZnvyaVLl+SmUVD0vStvn3zyCa5fv47PP/8choaG0pFmBbp06YInT55g69at0rKMjAysWrVK4ddQ9LtaoCzfk8JeOy8vD8uXL5cpX7JkCSQSidwxT548ifPnz0ufP3r0CLt27ULHjh2LvFPUsWNHWFlZISIiApmZmTLbCvsbX6Ckv00+Pj7w8fHBjz/+iG3btqFv376oVEm/7mXo19nqiDFjxiAjIwM9e/ZE3bp1kZ2djRMnTmDz5s1wc3OTdsqrXbs2pk6dilmzZqFVq1b44IMPYGJigjNnzsDJyQkRERFo3rw57OzsMHDgQIwdOxYSiQTr1q0r9Ivl5+eHzZs3Y+LEifD394elpSW6desGDw8P2NraYuXKlbCysoKFhQWaNWsGd3d3/Pjjj+jcuTPq16+PQYMGwdnZGY8fP8aRI0dgbW2N33//vUzvRXZ2Ntq1a4ePPvoIsbGxWLFiBVq2bInu3bsXuc/w4cPx/fffIzQ0FOfOnYObmxu2bt0q/e+z4L80MzMzeHt7Y/PmzahTpw4qV66MBg0aFNk+PnnyZPz666/o3Lkzxo4di8qVK2Pt2rW4f/8+tm3bJtdcpIzatWujZcuWGDlyJLKysrB06VJUqVIFX3zxRYn7BgUFYcSIEYiIiMDFixfRsWNHGBkZ4fbt29iyZQu+++479O7dWzrXR0REBN5//3106dIFFy5cwL59+wrti/EmAwMDREZGolu3bmjcuDEGDRqE6tWr4+bNm7h27RqioqIAQNrhcuzYsejUqZP0olgRMb6pT58+WLZsGcLDw9GwYUNpP4oCHTt2RLVq1dCiRQtUrVoVN27cwPLly9G1a1fp78fp06fRpk0bhIeHlzj/kZ+fHw4ePIjFixfDyckJ7u7uhfbPetPgwYOxePFidOrUCUOGDEFCQgJWrlyJ+vXry/SNU/S9K29du3ZFlSpVsGXLFnTu3Fmuz0/B7OkhISE4d+4cqlevjnXr1ik1MZ+i39UCZfmevK1bt25o06YNpk6digcPHqBRo0b4888/sWvXLowfP15uOH+DBg3QqVMnmaHgAIptxrS2tsaSJUswdOhQ+Pv7S+c6unTpEjIyMuTm8ymgyN+mkJAQ6bxN+tYkBYBDwbXRvn37xODBg0XdunWFpaWlMDY2FrVr1xZjxowR//77r1z9n3/+Wfj6+goTExNhZ2cngoKCxIEDB6Tbjx8/Lt59911hZmYmnJycpEPL8dZwzbS0NNG/f39ha2srAMgMTdy1a5fw9vYWlSpVkhtyeOHCBfHBBx+IKlWqCBMTE+Hq6io++ugjcejQIWmdguGoz549U+g9KBhSGRMTI4YPHy7s7OyEpaWl+Pjjj8Xz589l6hY2pPbff/8VgwYNEvb29sLY2Fg0bNiw0GGSJ06cEH5+fsLY2FihYeF3794VvXv3Fra2tsLU1FQ0bdpU7NmzR64elBwKvmDBArFo0SLh4uIiTExMRKtWrcSlS5dk6g4cOFBYWFgUeaxVq1YJPz8/YWZmJqysrETDhg3FF198IZ48eSKtk5eXJ2bMmCGqV68uzMzMROvWrcXVq1eFq6trsUPBCxw7dkx06NBBWFlZCQsLC+Hj4yOWLVsm3Z6bmyvGjBkjHBwchEQikRsWXp4xFic/P1+4uLgUOtRXCCG+//57ERgYKP2d9fDwEJ9//rlITk6Wew8UmSrg5s2bIjAwUJiZmckMWS/p9379+vWiVq1awtjYWDRu3FhERUXJDQsuoMh7V5iSYnB1dZUZCv6mUaNGCQBi48aNhW5/+PCh6N69uzA3Nxf29vZi3Lhx0iHqbw8FL2rovSLf1fL4nhS8D29KTU0VEyZMEE5OTsLIyEh4enqKBQsWyAzTFuJ/3+f169cLT09PYWJiInx9feW+H28PBS+we/du0bx5c2FmZiasra1F06ZNxa+//ioT89ufeUl/m54+fSoMDQ1FnTp15M5VH0iEKMWMUURqVjBh2ZkzZ6R9jXTRgwcP4O7ujgULFsjMnkukCSZMmICffvoJ8fHxal0qgd8TeYmJiahevTqmTZuGb775Rt3hVDj2uSEiIqVlZmZi/fr16NWrl86tAaUL1qxZg7y8PJnh+fqEfW6IiEhhCQkJOHjwILZu3Yrnz5/LLYFA6nX48GFcv34dc+bMQXBwcKlGiukCJjdERKSw69ev4+OPP4ajoyP+85//FDnNBKnHzJkzceLECbRo0QLLli1Tdzhqwz43REREpFPY54aIiIh0CpMbIiIi0ilMboiI3rJmzRpIJBKcPXtW3aEQUSkwuSFSsStXrqB3795wdXWFqakpnJ2d0aFDB73u7FcW06dP14sRII8fP8ZHH30EW1tbWFtbo0ePHoWuNVWSpKQkODo6QiKRyCyFAADXrl3Dhx9+iFq1asHc3Bz29vYIDAwscubw/Px8REZGonHjxjAzM0OVKlXQtm1bXLp0qVTnSKQqHC1FpEInTpxAmzZtULNmTQwbNgzVqlXDo0eP8Pfff+O7777DmDFj1B0iaaC0tDS0adMGycnJ+Oqrr2BkZIQlS5YgKCgIFy9eRJUqVRQ+1rRp05CRkVHotocPHyI1NRUDBw6Ek5MTMjIysG3bNnTv3h3ff/89hg8fLlN/8ODB2LBhA0JCQjB69Gikp6fjwoULSEhIKNP5EpU79U6QTKTbunTpIhwcHMTLly/lthW2VIamyMnJEVlZWeoOo1Dh4eGFLj9QHvLy8sSrV6+k0+SfOXNGJa9Tkvnz5wsA4vTp09KyGzduCENDQzFlyhSFj3PlyhVRqVIlMXPmTAFAbNmypcR9cnNzRaNGjYSXl5dM+ebNmwUAsX37dsVPhEhN2CxFpEJ3795F/fr1YWtrK7ft7YUGJRIJRo8ejQ0bNsDLywumpqbw8/PD0aNH5fZ9/PgxBg8ejKpVq8LExAT169fHzz//LFMnOzsb06ZNg5+fH2xsbGBhYYFWrVrhyJEjMvUePHgAiUSChQsXYunSpfDw8ICJiQmuX7+O6dOnQyKR4NatWxgwYABsbGzg4OCAb775BkIIPHr0CD169IC1tTWqVauGRYsWlTmGVatWSWPw9/fHmTNnSnyfDxw4gJYtW8LW1haWlpbw8vLCV199VeJ+b77n9evXh4mJCfbv3y/dnpWVhYkTJ8LBwQEWFhbo2bNnoavZr1ixQrq/k5MTwsLC5FZsVmYV8a1bt8Lf3x/+/v7Ssrp166Jdu3b47bffSty/wLhx49CzZ0+0atVK4X0MDQ3h4uIiF//ixYvRtGlT9OzZE/n5+UhPT1f4mEQVTt3ZFZEu69ixo7CyshJXrlwpsS4A0aBBA2Fvby9mzpwp5s+fL1xdXYWZmZnM/vHx8aJGjRrCxcVFzJw5U0RGRoru3bsLAGLJkiXSes+ePRPVq1cXEydOFJGRkeLbb78VXl5ewsjISFy4cEFar2DRQW9vb1GrVi0xb948sWTJEvHw4UPpYoKNGzcW/fr1EytWrBBdu3YVAMTixYuFl5eXGDlypFixYoVo0aKFdDHT0sbg6+srateuLebPny++/fZbYW9vL2rUqCGys7Oldd++c3P16lVhbGwsmjRpIr777juxcuVKMWnSJBEYGKjQe16vXj3h4OAgZsyYIf773/+KCxcuSO/c+Pr6irZt24ply5aJzz77TBgaGoqPPvpI5hgF71H79u3FsmXLxOjRo4WhoaHw9/eXiVvRhTbz8vKEiYmJGDlypNy2r7/+WgAQKSkpJZ7bb7/9JkxNTcX9+/elr13UnZu0tDTx7NkzcefOHbF48WJhaGgo+vfvL92enJwsJBKJCAsLE1OmTBGWlpYCgHB3dxebN28uMRaiisbkhkiF/vzzT2FoaCgMDQ1FQECAdMX1Ny96BQAIAOLs2bPSsocPHwpTU1PRs2dPadmQIUNE9erVRWJiosz+ffv2FTY2NiIjI0MI8bp54e2mpZcvX4qqVauKwYMHS8sKEgtra2uRkJAgU7/gwj18+HBpWW5urqhRo4aQSCRi3rx5Msc2MzOTWZlb2RiqVKkiXrx4IS3ftWuXACB+//13uferwJIlS5RaUf5NAISBgYG4du2aTHlBctO+fXuZFaAnTJggDA0NRVJSkhBCiISEBGFsbCw6duwo8vLypPWWL18uAIiff/5ZWqZocvPs2TMBQMycOVNu23//+18BQNy8ebPYY2RkZIiaNWtKm7BKSm5GjBgh/f0zMDAQvXv3lvkczp8/L/18qlatKlasWCE2bNggmjZtKiQSidi3b1+x8RBVNDZLEalQhw4dcPLkSXTv3h2XLl3Ct99+i06dOsHZ2Rm7d++Wqx8QEAA/Pz/p85o1a6JHjx6IiopCXl4ehBDYtm0bunXrBiEEEhMTpY9OnTohOTkZ58+fB/C6ecHY2BjA61EuL168QG5uLpo0aSKt86ZevXrBwcGh0PMYOnSo9GdDQ0M0adIEQggMGTJEWm5rawsvLy+ZET3KxtCnTx/Y2dlJnxc0pxQ3SqigyW/Xrl3Iz88vsl5RgoKC4O3tXei24cOHQyKRyMSTl5eHhw8fAgAOHjyI7OxsjB8/HgYG//tzOmzYMFhbW+OPP/6QlrVu3RpCCEyfPr3YeF69egUAMDExkdtmamoqU6co8+bNQ05OjkJNcwAwfvx4HDhwAGvXrkXnzp2Rl5eH7Oxs6fa0tDQAwPPnz7Fr1y6MHDkS/fv3x6FDh1ClShXMnj1bodchqihMbohUzN/fH9u3b8fLly9x+vRpTJkyBampqejduzeuX78uU9fT01Nu/zp16iAjIwPPnj3Ds2fPkJSUhFWrVsHBwUHmMWjQIACQGbmydu1a+Pj4wNTUFFWqVIGDgwP++OMPJCcny72Ou7t7kedQs2ZNmec2NjYwNTWFvb29XPnLly9lypSJ4e3XKUh03j7mm/r06YMWLVpg6NChqFq1Kvr27YvffvtN4URHmfN+O56CJMfLy0umnrGxMWrVqiXdrgwzMzMAr/v7vC0zM1OmTmEePHiABQsWYM6cObC0tFToNevWrYv27dsjJCQEe/bsQVpamjSBfvP13N3d0axZM+l+lpaW6NatG06fPo3c3FzFTpCoAnAoOFEFMTY2lnYSrVOnDgYNGoQtW7YgPDxc4WMUXLAHDBiAgQMHFlrHx8cHALB+/XqEhoYiODgYn3/+ORwdHWFoaIiIiAjcvXtXbr/iLpiGhoYKlQGQXhBLE4Mixyws7qNHj+LIkSP4448/sH//fmzevBlt27bFn3/+WeQx39y/KKWJp6wqV64MExMTPH36VG5bQZmTk1OR+0+bNg3Ozs5o3bo1Hjx4AACIj48HADx79gwPHjxAzZo1Ze40va13794YMWIEbt26BS8vL+nrVa1aVa6uo6MjcnJykJ6eDhsbG4XPk0iVmNwQqUGTJk0AQO4Cdvv2bbm6t27dgrm5ubTJyMrKCnl5eWjfvn2xr7F161bUqlUL27dvl2laUSaZKquKisHAwADt2rVDu3btsHjxYsydOxdTp07FkSNHSnyfysLV1RUAEBsbi1q1aknLs7Ozcf/+/VK9toGBARo2bFjo7MinTp1CrVq1YGVlVeT+cXFxuHPnjkw8BUaNGgXg9Z2nwkbwFSho9iq4u+bk5IRq1arh8ePHcnWfPHkCU1PTYmMiqmhsliJSoSNHjhT6X/7evXsByDdnnDx5UqYvyqNHj7Br1y507NgRhoaGMDQ0RK9evbBt2zZcvXpV7rhvDlMuuOvw5uufOnUKJ0+eLNtJKaEiYnjx4oVcWePGjQEU3rRTntq3bw9jY2P85z//kTnHn376CcnJyejatau0TJmh4L1798aZM2dkEpzY2FgcPnwYH374oUzdmzdvIi4uTvp89uzZ2LFjh8xj1qxZAIAvvvgCO3bsgIWFBQAUOvleTk4OfvnlF5iZmcn0RerTpw8ePXqEAwcOSMsSExOxa9cutG3bttg7QUQVjXduiFRozJgxyMjIQM+ePVG3bl1kZ2fjxIkT2Lx5M9zc3KT9ZAo0aNAAnTp1wtixY2FiYoIVK1YAAGbMmCGtM2/ePBw5cgTNmjXDsGHD4O3tjRcvXuD8+fM4ePCg9GL//vvvY/v27ejZsye6du2K+/fvY+XKlfD29pZ2EFW1iohh5syZOHr0KLp27QpXV1ckJCRgxYoVqFGjBlq2bFkur1EUBwcHTJkyBTNmzMB7772H7t27IzY2FitWrIC/vz8GDBggrXv69Gm0adMG4eHhJXYqHjVqFH744Qd07doVkyZNgpGRERYvXoyqVavis88+k6lbr149BAUFITo6GgAKPeeCuzT+/v4IDg6Wlo8YMQIpKSkIDAyEs7Mz4uPjsWHDBty8eROLFi2S6bMzZcoU/Pbbb+jVqxcmTpwIGxsbrFy5Ejk5OZg7d65ybxyRijG5IVKhhQsXYsuWLdi7dy9WrVqF7Oxs1KxZE6NGjcLXX38t1zQQFBSEgIAAzJgxA3FxcfD29saaNWuk/WiA1/0eTp8+jZkzZ2L79u1YsWIFqlSpgvr162P+/PnSeqGhoYiPj8f333+PqKgoeHt7Y/369diyZYv0QqhqFRFD9+7d8eDBA/z8889ITEyEvb09goKCMGPGjArpAzJ9+nQ4ODhg+fLlmDBhAipXrozhw4dj7ty5MDIyKtUxraysEB0djQkTJmD27NnIz89H69atsWTJkiJHtJVGnz598NNPPyEyMhLPnz+HlZUV/Pz8MH/+fHTv3l2mbtWqVXHs2DFMmjQJS5YsQU5ODgICArB+/Xo0atSo3GIiKg8SocqecUSkMIlEgrCwMCxfvlzdoRARaTU2khIREZFOYXJDREREOoXJDREREekUdigm0hDs/kZEVD5454aIiIh0CpMbIiIi0il61yyVn5+PJ0+ewMrKSmY6eCIiItJcQgikpqbCycmpxBmx9S65efLkCVxcXNQdBhEREZXCo0ePUKNGjWLr6F1yU7C426NHj2Btba3maIiIiEgRKSkpcHFxUWiRVr1LbgqaoqytrZncEBERaRlFupSwQzERERHpFCY3REREpFOY3BAREZFOYXJDREREOoXJDREREekUtSY3kZGR8PHxkY5cCggIwL59+4qsv337djRp0gS2trawsLBA48aNsW7dugqMmIiIiDSdWoeC16hRA/PmzYOnpyeEEFi7di169OiBCxcuoH79+nL1K1eujKlTp6Ju3bowNjbGnj17MGjQIDg6OqJTp05qOAMiIiLSNBKhYUsRV65cGQsWLMCQIUMUqv/OO++ga9eumDVrlkL1U1JSYGNjg+TkZM5zQ0REpCWUuX5rTJ+bvLw8bNq0Cenp6QgICCixvhAChw4dQmxsLAIDA4usl5WVhZSUFJkHERER6S61z1B85coVBAQEIDMzE5aWltixYwe8vb2LrJ+cnAxnZ2dkZWXB0NAQK1asQIcOHYqsHxERgRkzZqgidCIiItJAam+Wys7ORlxcHJKTk7F161b8+OOPiImJKTLByc/Px71795CWloZDhw5h1qxZ2LlzJ1q3bl1o/aysLGRlZUmfF6xNwWYpItVLzshGYlo2UjJzYG1mBHsLY9iYG6s7LCLSQso0S6k9uXlb+/bt4eHhge+//16h+kOHDsWjR48QFRWlUH32uSFtos3JwZOkV/hy22X8dTtRWhboaY95vXzgZGumxsiISBspc/1We7PU2/Lz82XutJR3fSJtoc3JQXJGtlzsAHD0diImb7uMZf18tSZJIyLto9bkZsqUKejcuTNq1qyJ1NRUbNy4EdHR0dK7MCEhIXB2dkZERASA1/1nmjRpAg8PD2RlZWHv3r1Yt24dIiMj1XkaROVO25ODxLRsudgLHL2diMS0bI2On4i0m1qTm4SEBISEhODp06ewsbGBj48PoqKipB2E4+LiYGDwvwFd6enpGDVqFP755x+YmZmhbt26WL9+Pfr06aOuUyBSCW1PDlIyc4rdnlrCdiKislBrcvPTTz8Vuz06Olrm+ezZszF79mwVRkSkGbQ9ObA2NSp2u1UJ24mIykJj5rkhov/R9uTA3tIYgZ72hW4L9LSHvaXm3nUiIu3H5IZIA2l7cmBjbox5vXzkziHQ0x7ze/lodJMaEWk/jRsKrmocCk7a4knSK0zedhlH3xotNb+XD6pr+GipAgVD2VMzc2BlagR7S+0Zyk5EmkWrh4IT0WtOtmZY1s9Xq5MDG3PtipeIdAOTGyINxuSAiEh57HNDREREOoXJDREREekUJjdERESkU5jcEBERkU5hckNEREQ6hckNERER6RQmN0RERKRTmNwQERGRTmFyQ0RERDqFyQ0RERHpFCY3REREpFOY3BAREZFOYXJDREREOoXJDREREekUJjdERESkU5jcEBERkU5hckNEREQ6hckNERER6RQmN0RERKRTmNwQERGRTmFyQ0RERDqFyQ0RERHpFCY3REREpFOY3BAREZFOYXJDREREOkWtyU1kZCR8fHxgbW0Na2trBAQEYN++fUXW/+GHH9CqVSvY2dnBzs4O7du3x+nTpyswYiIiItJ0ak1uatSogXnz5uHcuXM4e/Ys2rZtix49euDatWuF1o+Ojka/fv1w5MgRnDx5Ei4uLujYsSMeP35cwZETERGRppIIIYS6g3hT5cqVsWDBAgwZMqTEunl5ebCzs8Py5csREhKi0PFTUlJgY2OD5ORkWFtblzVcIiIiqgDKXL8rVVBMJcrLy8OWLVuQnp6OgIAAhfbJyMhATk4OKleurOLoiIiISFuoPbm5cuUKAgICkJmZCUtLS+zYsQPe3t4K7fvll1/CyckJ7du3L7JOVlYWsrKypM9TUlLKHDMRERFpLrWPlvLy8sLFixdx6tQpjBw5EgMHDsT169dL3G/evHnYtGkTduzYAVNT0yLrRUREwMbGRvpwcXEpz/CJiIhIw2hcn5v27dvDw8MD33//fZF1Fi5ciNmzZ+PgwYNo0qRJsccr7M6Ni4sL+9wQERFpEa3sc1MgPz9fJhl527fffos5c+YgKiqqxMQGAExMTGBiYlKeIRIREZEGU2tyM2XKFHTu3Bk1a9ZEamoqNm7ciOjoaERFRQEAQkJC4OzsjIiICADA/PnzMW3aNGzcuBFubm6Ij48HAFhaWsLS0lJt50FERESaQ63JTUJCAkJCQvD06VPY2NjAx8cHUVFR6NChAwAgLi4OBgb/6xYUGRmJ7Oxs9O7dW+Y44eHhmD59ekWGTkRERBpK4/rcqBrnuSEiItI+yly/1T5aioiIiKg8MbkhIiIincLkhoiIiHQKkxsiIiLSKUxuiIiISKcwuSEiIiKdonEzFBMREZF2Ss7IRmJaNlIyc2BtZgR7C2PYmBtXeBxMboiIiKjMniS9wpfbLuOv24nSskBPe8zr5QMnW7MKjYXNUkRERFQmyRnZcokNABy9nYjJ2y4jOSO7QuNhckNERERlkpiWLZfYFDh6OxGJaUxuiIiISIukZOYUuz21hO3ljckNERERlYm1qVGx261K2F7emNwQERFRmdhbGiPQ077QbYGe9rC3rNgRU0xuiIiIqExszI0xr5ePXIIT6GmP+b18Knw4OIeCExERUZk52ZphWT9fJKZlIzUzB1amRrC35Dw3REREpMVszNWTzLyNzVJERESkU5jcEBERkU5hckNEREQ6hckNERER6RQmN0RERKRTOFqKSI8lZ2QjMS0bKZk5sDYzgr2FZox0ICIqCyY3RHrqSdIruVV8Az3tMa+XD5xszdQYGRFR2bBZikgPJWdkyyU2wOvVeydvu4zkjIpdwZeIqDwxuSHSQ4lp2XKJTYGjtxORmMbkhoi0F5MbIj2UkplT7PbUErYTEWkyJjdEesja1KjY7VYlbCci0mRMboj0kL2lsdzqvQUCPe1hb8kRU0SkvThaikgP2ZgbY14vH0zedhlH3xotNb+XD4eDa4DChukD4NB9IgUwuSHSU062ZljWzxeJadlIzcyBlakR7C15sdQEhQ3Tb+Vpj7A2tTF4zRlkZOcB4NB9oqJIhBBC3UFUpJSUFNjY2CA5ORnW1tbqDoeISEZyRjZG/3qh0NFsLWpXgW9NOyw/fEdaFuhpj2X9fJmUks5T5vqt1j43kZGR8PHxgbW1NaytrREQEIB9+/YVWf/atWvo1asX3NzcIJFIsHTp0ooLloioAhQ3TP/4nefwdbGVKePQfSJ5ak1uatSogXnz5uHcuXM4e/Ys2rZtix49euDatWuF1s/IyECtWrUwb948VKtWrYKjJSJSvZKG6Wfl5suVceg+kSy19rnp1q2bzPM5c+YgMjISf//9N+rXry9X39/fH/7+/gCAyZMnV0iMREQVqaRh+iaV5P8n5dB9IlkaMxQ8Ly8PmzZtQnp6OgICAtQdDhGRWhQ3TL9F7Sq48ChJpoxD94nkqT25uXLlCiwtLWFiYoJPP/0UO3bsgLe3d7kdPysrCykpKTIPIiJNVTBMv9VbCU6r2vYY3cYTPx+7Ly3j0H2iwql9KLiXlxcuXryI5ORkbN26FQMHDkRMTEy5JTgRERGYMWNGuRyLiGQVNhcLL7Rl52RrhoUfNsLdhDQkvcqBSSUDXHmcjNMPnmNZP18AQM3K5nC0MuH7TVQIjRsK3r59e3h4eOD7778vtp6bmxvGjx+P8ePHF1svKysLWVlZ0ucpKSlwcXHhUHCiMipsLhbOu1K+niS9KnKixep8j0nPKDMUXO13bt6Wn58vk4yUlYmJCUxMTMrteET0+o7N24kN8HpY8uRtlznvSjnhRItEpaN0chMUFIQhQ4bgww8/hJlZ2f5zmDJlCjp37oyaNWsiNTUVGzduRHR0NKKiogAAISEhcHZ2RkREBAAgOzsb169fl/78+PFjXLx4EZaWlqhdu3aZYiEixRU3F0vBvCu8AJcPG3MmM0TKUrpDsa+vLyZNmoRq1aph2LBh+Pvvv0v94gkJCQgJCYGXlxfatWuHM2fOICoqCh06dAAAxMXF4enTp9L6T548ga+vL3x9ffH06VMsXLgQvr6+GDp0aKljICLllTQXC+ddISJ1KlWfm9zcXOzevRtr167Fvn37ULt2bQwePBiffPIJqlatqoo4yw2XXyAqu7sJaWi3OKbI7YcmBsHD0bICIyIiXafy5RcqVaqEDz74ALt27cI///yD/v3745tvvoGLiwuCg4Nx+PDhUgVORNqhuLlYOO8KEalbmea5OX36NMLDw7Fo0SI4OjpiypQpsLe3x/vvv49JkyaVV4xEpGEK5mJ5O8HhvCtEpAmUbpZKSEjAunXrsHr1aty+fRvdunXD0KFD0alTJ0gkEgDAsWPH8N577yEtLU0lQZcFm6WIyk/BPDccyUOaiPMw6RaVDgWvUaMGPDw8MHjwYISGhsLBwUGujo+Pj3QNKCLSXRzJQ5qK8zDpN6Xv3Pz1119o1aqVquJROd65ISLSbckZ2Rj964VCpysI9LTnPExaSqUdisPDw5GUlFToi7Zt21bZwxEREZUrReZhIt2mdHITExOD7Gz5X4zMzEz89ddf5RIUERFRaXEeJlK4z83ly5cBAEIIXL9+HfHx8dJteXl52L9/P5ydncs/QiKiErDjKL3J2tSo2O1WJWwn7adwctO4cWNIJBJIJJJCm5/MzMywbNmycg2OCOCFi4rHjqP0toJ5mI4W0eeG8zDpPoU7FD98+BBCCNSqVQunT5+WGSVlbGwMR0dHGBoaqizQ8sIOxeqlbKLCCxcVhx1HqShcUV33qGQouKurK4DXq3YTlYayiQpXnqaScAFPKgpXVNdvCiU3u3fvRufOnWFkZITdu3cXW7d79+7lEhhpt7fv0FiaVFI6UeGFi0rCjqNUHM7DpL8USm6Cg4MRHx8PR0dHBAcHF1lPIpEgLy+vvGIjLVXYHZqNQ5spnajwwkUlYcdRIiqMQkPB8/Pz4ejoKP25qAcTGyqqKSnplfKJCi9cVBIu4ElEhSnTwplEbyuqKcmkUvG/aoUlKrxw6Y7kjGzcTUjDhbiXuPssDckZ5TOJGhfwJKLCKL221NixY1G7dm2MHTtWpnz58uW4c+cOli5dWl6xkRYqqinpwqMktKhdBcfvPJfbVlSiUnDhKmrEAy9c2kHVI97YcZSI3qb02lLOzs7YvXs3/Pz8ZMrPnz+P7t27459//inXAMsbh4Kr1t2ENLRbHCNXbm5siP/088XaEw/kLnIlDc3kytPaS5eHanP+JaKKpdJVwZ8/fw4bGxu5cmtrayQmFt5hlPRHUZNnZWTnYfPpOCz8sBHSMnOVSlQ44kF76eqIN86/RKTZlO5zU7t2bezfv1+ufN++fahVq1a5BEXaq7g+EDN7NEBVa1N4OFqicU07eDhaauWFjRSniyPeSpp/qbz6ExFR6Sl952bixIkYPXo0nj17Jl2G4dChQ1i0aBH72xAA9oGg/9HFEW+6ejeKSJcondwMHjwYWVlZmDNnDmbNmgUAcHNzQ2RkJEJCQso9QNJObEoiQDfX+NHFu1FvY38i0nZKJzcAMHLkSIwcORLPnj2DmZkZLC0tyzsuItIBujjiTRfvRr2J/YlIF5QquSnw5uKZRESF0bVmSl28G1WA67mRrlAouXnnnXdw6NAh2NnZwdfXFxKJpMi658+fL7fgiEg36FIzpS7ejSrA/kSkKxRKbnr06AETExMAKHZtKSIifaBrd6MK6EN/ItIPCiU34eHhhf5MRKSvdOluVAFd709E+qPUfW7Onj2LGzduAAC8vb3lZiwmqmgc4UFUNrrcn4j0i9LJzT///IN+/frh+PHjsLW1BQAkJSWhefPm2LRpE2rUqFHeMRKViCM8iMpOl/sTkX5Rem2p9957D0lJSVi7di28vLwAALGxsRg0aBCsra0Lnb1Yk3BtKd2jy+sXEakD13MjTaTStaViYmJw4sQJaWIDAF5eXli2bBlatWqlfLREZcQRHkTlSxf7E5F+UXptKRcXF+TkyPeYz8vLg5OTU7kERaQMjvAgIqI3KZ3cLFiwAGPGjMHZs2elZWfPnsW4ceOwcOFCpY4VGRkJHx8fWFtbw9raGgEBAdi3b1+x+2zZsgV169aFqakpGjZsiL179yp7CqRjOMKDiIjepFCzlJ2dnczEfenp6WjWrBkqVXq9e25uLipVqoTBgwcrNQ9OjRo1MG/ePHh6ekIIgbVr16JHjx64cOEC6tevL1f/xIkT6NevHyIiIvD+++9j48aNCA4Oxvnz59GgQQOFX5d0C0d4EBHRmxTqULx27VqFDzhw4MAyBVS5cmUsWLAAQ4YMkdvWp08fpKenY8+ePdKyd999F40bN8bKlSsVOj47FOumJ0mvihzhUZ2jpYiItF65dygua8KiiLy8PGzZsgXp6ekICAgotM7JkycxceJEmbJOnTph586dRR43KysLWVlZ0ucpKSnlEi9pFl2dMZaIiJRXqkn88vLysHPnTukkfvXr10f37t1haGio9LGuXLmCgIAAZGZmwtLSEjt27IC3t3ehdePj41G1alWZsqpVqyI+Pr7I40dERGDGjBlKx0XahyM8iIgIKEWH4jt37qBevXoICQnB9u3bsX37dgwYMAD169fH3bt3lQ7Ay8sLFy9exKlTpzBy5EgMHDgQ169fV/o4RZkyZQqSk5Olj0ePHpXbsYmIiEjzKJ3cjB07Fh4eHnj06BHOnz+P8+fPIy4uDu7u7hg7dqzSARgbG6N27drw8/NDREQEGjVqhO+++67QutWqVcO///4rU/bvv/+iWrVqRR7fxMREOhqr4EFERES6S+nkJiYmBt9++y0qV64sLatSpQrmzZuHmJiYMgeUn58v00fmTQEBATh06JBM2YEDB4rso0NERET6R+k+NyYmJkhNTZUrT0tLg7Gxcv0dpkyZgs6dO6NmzZpITU3Fxo0bER0djaioKABASEgInJ2dERERAQAYN24cgoKCsGjRInTt2hWbNm3C2bNnsWrVKmVPg4iIiHSU0ndu3n//fQwfPhynTp2CEAJCCPz999/49NNP0b17d6WOlZCQgJCQEHh5eaFdu3Y4c+YMoqKi0KFDBwBAXFwcnj59Kq3fvHlzbNy4EatWrUKjRo2wdetW7Ny5k3PcEBERkZTSC2cmJSVh4MCB+P3332Fk9Hrm19zcXHTv3h1r1qyBjY2NSgItL5znhoiISPuodOFMW1tb7Nq1C7dv38bNmzcBAPXq1UPt2rVLFy0RERFROSrVPDcA4OnpCU9Pz/KMhYiIiKjMlE5u8vLysGbNGhw6dAgJCQnIz8+X2X748OFyC46IiIhIWUonN+PGjcOaNWvQtWtXNGjQQGZBTSIiIiJ1Uzq52bRpE3777Td06dJFFfEQERERlYnSQ8ELZhQmIiIi0kRKJzefffYZvvvuOyg5gpyoQiVnZONuQhouxL3E3WdpSM7IVndIRERUQRRqlvrggw9knh8+fBj79u1D/fr1pXPdFNi+fXv5RUdUCk+SXuHLbZfx1+1EaVmgpz3m9fKBk62ZGiMjIqKKoFBy8/bEfD179lRJMERllZyRLZfYAMDR24mYvO0ylvXzhY25csuEEBGRdlEouVm9erWq4yAqF4lp2XKJTYGjtxORmJbN5IaISMeVehK/hIQExMbGAgC8vLzg6OhYbkERlVZKZk6x21NL2E5ERNpP6Q7FKSkp+OSTT+Ds7IygoCAEBQXB2dkZAwYMQHJysipiJFKYtalRsdutSthORETaT+nkZtiwYTh16hT27NmDpKQkJCUlYc+ePTh79ixGjBihihiJFGZvaYxAT/tCtwV62sPekk1SRES6TulVwS0sLBAVFYWWLVvKlP/111947733kJ6eXq4BljeuCq77niS9wuRtl3H0rdFS83v5oDpHSxERaSWVrgpepUoVudFTwOsRVXZ2dsoejqjcOdmaYVk/XySmZSM1MwdWpkawtzRmR2IiIj2hdLPU119/jYkTJyI+Pl5aFh8fj88//xzffPNNuQZHVFo25sbwcLRE45p28HC0ZGJDRKRHlG6W8vX1xZ07d5CVlYWaNWsCAOLi4mBiYgJPT0+ZuufPny+/SMsJm6WIiIi0j0qbpYKDg0sbF1GZJGdkIzEtGymZObA2M4K9BZuaiIhIntJ3brQd79xoJy6pQBWBCTSR5lLpnZsC586dw40bNwAA9evXh6+vb2kPRVQsLqlAFYEJNJHuUDq5SUhIQN++fREdHQ1bW1sAQFJSEtq0aYNNmzbBwcGhvGMkPcclFUjVmEAT6RalR0uNGTMGqampuHbtGl68eIEXL17g6tWrSElJwdixY1URI+k5LqlAqqZIAk1E2kPpOzf79+/HwYMHUa9ePWmZt7c3/vvf/6Jjx47lGhwRwCUVSPWYQBPpFqXv3OTn58PISP5iYmRkhPz8/HIJiuhNXFKBVI0JNJFuUTq5adu2LcaNG4cnT55Iyx4/fowJEyagXbt25RocEfB6Qr55vXzkEpyCJRXYF4LKSp8T6OSMbNxNSMOFuJe4+ywNyRlsgiPtp/RQ8EePHqF79+64du0aXFxcpGUNGjTA7t27UaNGDZUEWl44FFx7FQzT5ZIKpAr6uCYZR4iRNlHm+l2qeW6EEDh48CBu3rwJAKhXrx7at29fumgrGJMbIiqKPiXQyRnZGP3rhUI7Ugd62nOEGGkclc1zk5OTAzMzM1y8eBEdOnRAhw4dyhQoEWkefZ7IzsZcf86VUyyQLlMquTEyMkLNmjWRl5enqniISI3YTKE/OEKMdJnSHYqnTp2Kr776Ci9evFBFPESkJiVNZMeOprqFI8RIlymd3CxfvhxHjx6Fk5MTvLy88M4778g8lBEREQF/f39YWVnB0dERwcHBiI2NLXafnJwczJw5Ex4eHjA1NUWjRo2wf/9+ZU+DiN7Ciez0iz6PECPdp9ZVwWNiYhAWFgZ/f3/k5ubiq6++QseOHXH9+nVYWFgUus/XX3+N9evX44cffkDdunURFRWFnj174sSJE1zfiqgM2EyhXwqmWChqhBj725A206hVwZ89ewZHR0fExMQgMDCw0DpOTk6YOnUqwsLCpGW9evWCmZkZ1q9fX+JrcLQUUeHuJqSh3eKYIrcfmhgED0fLCoyIKoI+jRAj7VYhq4KrQnJyMgCgcuXKRdbJysqCqampTJmZmRmOHTum0tiIdF1BM8XRIoYGs5lCN+nTCDHSHwrdubGzs4NEIlHogKXtaJyfn4/u3bsjKSmp2ESlf//+uHTpEnbu3AkPDw8cOnQIPXr0QF5eHrKysuTqZ2VlyZSnpKTAxcWFd26ICqGPE9kRkXYo9zs3S5culf78/PlzzJ49G506dUJAQAAA4OTJk4iKisI333xT6qDDwsJw9erVEu/AfPfddxg2bBjq1q0LiUQCDw8PDBo0CD///HOh9SMiIjBjxoxSx0WkT5xszbCsny+bKYhIqynd56ZXr15o06YNRo8eLVO+fPlyHDx4EDt37lQ6iNGjR2PXrl04evQo3N3dFdonMzMTz58/h5OTEyZPnow9e/bg2rVrcvV454aIiEj7qXT5BUtLS1y8eBG1a9eWKb9z5w4aN26MtLQ0hY8lhMCYMWOwY8cOREdHw9PTU5lQALweGl6vXj189NFHmDt3bon1dalDsT7PJEtERPpFpR2Kq1Spgl27duGzzz6TKd+1axeqVKmi1LHCwsKwceNG7Nq1C1ZWVoiPjwcA2NjYwMzsdft+SEgInJ2dERERAQA4deoUHj9+jMaNG+Px48eYPn068vPz8cUXXyh7KlqNM8kSEREVTunkZsaMGRg6dCiio6PRrFkzAK8Tjv379+OHH35Q6liRkZEAgNatW8uUr169GqGhoQCAuLg4GBj8b67BzMxMfP3117h37x4sLS3RpUsXrFu3Dra2tsqeitYqaSZZLnhHRET6rFTz3Jw6dQr/+c9/cOPGDQCvVwUfO3asNNnRZLrQLMX5SIiISN+ofJ6bZs2aYcOGDaUKjsqOM8kSEakO+zNqP6WTm6CgIAwZMgQffvihtF8MVSwueEdEpBrsz6gblF4409fXF5MmTUK1atUwbNgw/P3336qIi4rBBe+IiMpfSf0ZkzO4eKy2UDq5Wbp0KZ48eYLVq1cjISEBgYGB8Pb2xsKFC/Hvv/+qIkZ6S8GCd28nOFzwjoio9BLTsuUSmwJHbyciMY3JjbYo88KZCQkJWLVqFebMmYO8vDx06dIFY8eORdu2bcsrxnKlCx2KC3DBOyKi8nMh7iV6rjhR5Pado5qjcU27CoyI3lRhC2eePn0aq1evxqZNm+Do6IjQ0FA8fvwY77//PkaNGoWFCxeW5fBUAi54R0RUftifUXcondwkJCRg3bp1WL16NW7fvo1u3brh119/RadOnaSLa4aGhuK9995jcvMG9r4nItJsBf0ZjxbSNMX+jNpF6eSmRo0a8PDwwODBgxEaGgoHBwe5Oj4+PvD39y+XAHWBPvW+ZxJHRNqqoD/j5G2XZRIc9mfUPkr3ufnrr7/QqlUrVcWjchXd5yY5Ixujf71QaCe1QE97nZpNWJ+SOCLSXezPqJmUuX4rPVpKmxMbddCX3vccQklEusLG3BgejpZoXNMOHo6WTGy0kMLNUr6+vtI+NcU5f/58mQLSNfoym7AiSRz/QBARUUVQOLkJDg6W/iyEQEREBD799FNUrlxZFXHpDH3pfa8vSRwREWk+hZOb8PBwmeeLFi3CuHHjUKtWrXIPSpfoS+97fUniiIhI8ynd54aUoy+zCXNJCCIi0hRlmsSPFONka4Zl/Xx1uvc9h1ASEZGmYHJTQfRhNmF9SOKIiEjzKZzc/Oc//5F5npubizVr1sDeXrYpYuzYseUTGWklbUziOPEgEZFuUXgSP3d395IPJpHg3r17ZQ5KlXRp4UwqO048SESkHVSycOb9+/fLHBiRJilp4kFdmj2aiEifcLQU6S19mT2aiEjfMLkhvcWJB4mIdBOTG9JbnHiQiEg3MbkhvcWJBwuXnJGNuwlpuBD3EnefpXHRUyLSOpznRkNwOHLF48SD8jh6jIh0gUJDwVNSUhQ+oKYPr1bVUPCyJCe8oKhXwWen7xMPJmdkY/SvFwrtZB3oac/RY0SkVuU+FNzW1hYSiUShF8/Ly1Ooni4pS3KiacOR9fEOkjZOPKgKiowe4/tERNpAoeTmyJEj0p8fPHiAyZMnIzQ0FAEBAQCAkydPYu3atYiIiFBNlBqsrMmJJl1QeAdJv3H0GBHpCoWSm6CgIOnPM2fOxOLFi9GvXz9pWffu3dGwYUOsWrUKAwcOLP8oNVhZkxNNuaBo2h0kqngcPUZEukLp0VInT55EkyZN5MqbNGmC06dPl0tQ2qSsyYmmXFA4oR2pcvQYR2ARUUVSOrlxcXHBDz/8IFf+448/wsXFpVyC0iZlTU40ZTiyptxBIvUpGD329u9jWUePPUl6hdG/XkC7xTHoueIE2i2KwZhfL+BJ0qvyCFtlmJARaS+lh4IvWbIEvXr1wr59+9CsWTMAwOnTp3H79m1s27at3APUdAXJydEiRpiUlJxoynBkTbmDROrlZGuGZf18y230mLY2d7L/GZF2U/rOTZcuXXDr1i1069YNL168wIsXL9CtWzfcunULXbp0UepYERER8Pf3h5WVFRwdHREcHIzY2NgS91u6dCm8vLxgZmYGFxcXTJgwAZmZmcqeSrko6r/dDvUcEfFBQySmZZf4n1/BBeXQxCDsHNUchyYGYVk/X1SvwD+imnIHidTPxtwYHo6WaFzTDh6OlmVKPrSxubOkhIx3cIg0X6km8XNxccHcuXPL/OIxMTEICwuDv78/cnNz8dVXX6Fjx464fv06LCwsCt1n48aNmDx5Mn7++Wc0b94ct27dQmhoKCQSCRYvXlzmmErj7f92rc2MYGxogMnbryj8n5+6hyNryh0k0i3a2NypSSMYiah0SpXc/PXXX/j+++9x7949bNmyBc7Ozli3bh3c3d3RsmVLhY+zf/9+medr1qyBo6Mjzp07h8DAwEL3OXHiBFq0aIH+/fsDANzc3NCvXz+cOnWqNKdSbt5MToqaDE3Tb8WXd5MEkTY2d2pjQkZEspRultq2bRs6deoEMzMznD9/HllZWQCA5OTkMt/NSU5OBgBUrly5yDrNmzfHuXPnpCOz7t27h7179xbZJJaVlYWUlBSZh6pp4634AuXZJEGkjc2d2piQEZEspZOb2bNnY+XKlfjhhx9gZPS/L3mLFi1w/vz5UgeSn5+P8ePHo0WLFmjQoEGR9fr374+ZM2eiZcuWMDIygoeHB1q3bo2vvvqq0PoRERGwsbGRPipiRBf/8yN6TVUjsFRJGxMyIpKldLNUbGxsoU1GNjY2SEpKKnUgYWFhuHr1Ko4dO1ZsvejoaMydOxcrVqxAs2bNcOfOHYwbNw6zZs3CN998I1d/ypQpmDhxovR5SkqKyhMc/udH9D/a1tzJ/mdUlmVo9HEJG02kdHJTrVo13LlzB25ubjLlx44dQ61atUoVxOjRo7Fnzx4cPXoUNWrUKLbuN998g08++QRDhw4FADRs2BDp6ekYPnw4pk6dCgMD2ZtRJiYmMDExKVVcpVXW4eFEukbdHeaVpW0JGZWfskwDwCkENIfSzVLDhg3DuHHjcOrUKUgkEjx58gQbNmzApEmTMHLkSKWOJYTA6NGjsWPHDhw+fBju7u4l7pORkSGXwBgaGkqPpwm08VY8Ecli/zP9U5ZpADiFgGZR+s7N5MmTkZ+fj3bt2iEjIwOBgYEwMTHBpEmTMGbMGKWOFRYWho0bN2LXrl2wsrJCfHw8gNdNXGZmr7PckJAQODs7Sxfl7NatGxYvXgxfX19ps9Q333yDbt26SZMcTcD//IiItEtZpgHgFAKaRenkRiKRYOrUqfj8889x584dpKWlwdvbG5aWlkq/eGRkJACgdevWMuWrV69GaGgoACAuLk7mTs3XX38NiUSCr7/+Go8fP4aDgwO6deuGOXPmKP36qqZtt+KJiPRZWQaDcCCJZlE6uRk8eDC+++47WFlZwdvbW1qenp6OMWPG4Oeff1b4WIo0I0VHR8s8r1SpEsLDwxEeHq7w6xAREZWkLINBOJBEsyjd52bt2rV49Up+wbtXr17hl19+KZegiIiIKlpZpgHgFAKaReHkJiUlBcnJyRBCIDU1VWZSvJcvX2Lv3r1wdHRUZaxEREQqU5bBIBxIolkUbpaytbWFRCKBRCJBnTp15LZLJBLMmDGjXIMj7cB5HYhIV5RlMAgHkmgOhZObI0eOQAiBtm3bYtu2bTJLJBgbG8PV1RVOTk4qCZI0F+d1ICJdU5bBIBxIohkkQsnJYR4+fIiaNWtCIpGoKiaVSklJgY2NDZKTk2Ftba3ucLRaUQuEAq8THE1dIJSIiLSPMtdvpTsUHz58GFu3bpUr37JlC9auXavs4UiLafMCoUREpLuUTm4iIiJgby/fI9zR0bHMq4KTduG8DlQgOSMbdxPScCHuJe4+S+NsrESkVkrPcxMXF1foMgmurq6Ii4srl6BIO3BeBwLY74qINI/Sd24cHR1x+fJlufJLly6hSpUq5RIUaQfO60AVtZ4O7wwRkTKUvnPTr18/jB07FlZWVggMDAQAxMTEYNy4cejbt2+5B0iaq2Beh8nbLsusgM55HfRHRaynwztDRKQspZObWbNm4cGDB2jXrh0qVXq9e35+PkJCQtjnRg9xXgf9pup+VyXdGeKIPCIqjNLJjbGxMTZv3oxZs2bh0qVLMDMzQ8OGDeHq6qqK+EgLcF4HzVKRkyqqut8VV1omotJQOrkpUKdOnUJnKiYi9anoJpyCfldHi5jrqKz9rjgij4hKQ6HkZuLEiZg1axYsLCwwceLEYusuXry4XAIjIuWoowlH1f2uOCKPiEpDoeTmwoULyMnJkf5cFG2dtZhIF6irCUeV/a5UfWeIiHSTQsnNkSNHCv2ZiDSHOptwVNXviiPyiKg0St3nhog0i6424XBEHhEpS6Hk5oMPPlD4gNu3by91MKSZKnL0DZWeLjfhcEQeESlDoeTGxsZG+rMQAjt27ICNjQ2aNGkCADh37hySkpKUSoJIO3ACNe3BJhwiotckQgihzA5ffvklXrx4gZUrV8LQ0BAAkJeXh1GjRsHa2hoLFixQSaDlRZkl0/VdckY2Rv96odBOqoGe9pxATUMV3GljEw4R6RJlrt9KJzcODg44duwYvLy8ZMpjY2PRvHlzPH/+XPmIKxCTG8XdTUhDu8UxRW4/NDEIHo6WFRgRERHpK2Wu30ovnJmbm4ubN2/Kld+8eRP5+fnKHo40GCdQIyIibaT0aKlBgwZhyJAhuHv3Lpo2bQoAOHXqFObNm4dBgwaVe4CkPro6+oaIiHSb0snNwoULUa1aNSxatAhPnz4FAFSvXh2ff/45Pvvss3IPkNRHl0ffEBGR7lK6z82bUlJSAECr+q6wz41yniS9KnL0TXUdHi3F4e9ERJpFmet3qSbxy83NRXR0NO7evYv+/fsDAJ48eQJra2tYWrKDqS7RxwnUOPydiEi7KX3n5uHDh3jvvfcQFxeHrKws3Lp1C7Vq1cK4ceOQlZWFlStXqirWcsE7N1QcDn8nItJMKh0tNW7cODRp0gQvX76Emdn//ovt2bMnDh06pHy0RBpEkcUniYhIsyndLPXXX3/hxIkTMDaW/e/Vzc0Njx8/LrfAiNSBw9+JiLSf0ndu8vPzkZeXJ1f+zz//wMrKqlyCIlIXDn8nItJ+Sic3HTt2xNKlS6XPJRIJ0tLSEB4eji5dupRnbEQVrmD4e2HUPfw9OSMbdxPScCHuJe4+S0NyBpvIiIgKo3Rys3DhQhw/fhze3t7IzMxE//79pU1S8+fPV+pYERER8Pf3h5WVFRwdHREcHIzY2Nhi92ndujUkEonco2vXrsqeCmmJiryoFyw++XaCo+7FJ58kvcLoXy+g3eIY9FxxAu0WxWDMrxfwJOmVWuIhItJkpZrnJjc3F5s3b8alS5eQlpaGd955Bx9//LFMB2NFvPfee+jbty/8/f2Rm5uLr776ClevXsX169dhYWFR6D4vXrxAdvb/Lm7Pnz9Ho0aN8OOPPyI0NLTE1+RoKe2irmHZmrT4JEdwERGpcOHMnJwc1K1bF3v27EG9evXKHOjbnj17BkdHR8TExCAwMFChfZYuXYpp06bh6dOnRSZEb2Jyoz14UX+NC5gSEalwEj8jIyNkZmaWKbjiJCcnAwAqV66s8D4//fQT+vbtW2Rik5WVhaysLOnzglmVSfMpMixbH5IbjuAiIlKO0n1uwsLCMH/+fOTm5pZrIPn5+Rg/fjxatGiBBg0aKLTP6dOncfXqVQwdOrTIOhEREbCxsZE+XFxcyitkUjFe1F/jCC4iIuUoPc/NmTNncOjQIfz5559o2LCh3B2T7du3lyqQsLAwXL16FceOHVN4n59++gkNGzaUrk5emClTpmDixInS5ykpKUxwtAQv6q9xAVMiIuUondzY2tqiV69e5RrE6NGjsWfPHhw9ehQ1atRQaJ/09HRs2rQJM2fOLLaeiYkJTExMyiNMqmC8qL9WMIKrqAVM9aFpjohIGWVaFbyshBAYM2YMduzYgejoaHh6eiq875o1a/Dpp5/i8ePHqFKlisL7sUOxdtHXVckLo0kjuIiIKppKRkvl5+djwYIF2L17N7Kzs9GuXTuEh4crPfz7TaNGjcLGjRuxa9cueHl5ScttbGykxw0JCYGzszMiIiJk9m3VqhWcnZ2xadMmpV6TyY324UWdiIhUMlpqzpw5mD59Otq3bw8zMzN89913SEhIwM8//1zqQCMjIwG8npjvTatXr5bOWRMXFwcDA9l+z7GxsTh27Bj+/PPPUr82aQ8bcyYzRESkOIXv3Hh6emLSpEkYMWIEAODgwYPo2rUrXr16JZd8aDLeuSEiItI+yly/Fc5K4uLiZNaOat++PSQSCZ48eVL6SImIiIjKmcLJTW5uLkxNTWXKjIyMkJOjH3ONEBERkXZQuM+NEAKhoaEyw6ozMzPx6aefysx1U9p5boiIiIjKg8LJzcCBA+XKBgwYUK7BEBEREZWVwsnN6tWrVRkHlaBgOHRKZg6szYxgb8ERRERERIVReoZiqnhPkl7hy22XZRaRDPS0x7xePnDSs4nsiIiISqI9Y7j1VHJGtlxiA7xeFXvytstIzshWU2RERESaicmNhktMy5ZLbAocvZ2IxDQmN0RERG9icqPhUjKLH2qfWsJ2IiIifcPkRsNZmxoVu92qhO1ERET6hsmNhrO3NEagp32h2wI97WFvyRFTREREb2Jyo+FszI0xr5ePXIIT6GmP+b18OByciIjoLRwKrgWcbM2wrJ8vEtOykZqZAytTI9hbcp4bIiKiwjC50RI25kxmiIiIFMFmKSIiItIpTG6IiIhIp7BZSktwbSkiIiLFMLnRAlxbioiISHFsltJwXFuKiIhIOUxuNBzXliIiIlIOkxsNx7WliIiIlMPkRsNxbSkiIiLlMLnRcFxbioiISDlMbjQc15YiIiJSDoeCawGuLUVERKQ4JjdagmtLERERKYbNUkRERKRTmNwQERGRTmFyQ0RERDqFfW5UiItdEhERVTy13rmJiIiAv78/rKys4OjoiODgYMTGxpa4X1JSEsLCwlC9enWYmJigTp062Lt3bwVErLgnSa8w+tcLaLc4Bj1XnEC7RTEY8+sFPEl6pe7QiIiIdJpak5uYmBiEhYXh77//xoEDB5CTk4OOHTsiPT29yH2ys7PRoUMHPHjwAFu3bkVsbCx++OEHODs7V2DkxeNil0REROqj1map/fv3yzxfs2YNHB0dce7cOQQGBha6z88//4wXL17gxIkTMDJ6vfSAm5ubqkNViiKLXbJ5ioiISDU0qkNxcnIyAKBy5cpF1tm9ezcCAgIQFhaGqlWrokGDBpg7dy7y8vIqKswScbFLIiIi9dGYDsX5+fkYP348WrRogQYNGhRZ7969ezh8+DA+/vhj7N27F3fu3MGoUaOQk5OD8PBwufpZWVnIysqSPk9JSVFJ/G/iYpdERETqozF3bsLCwnD16lVs2rSp2Hr5+flwdHTEqlWr4Ofnhz59+mDq1KlYuXJlofUjIiJgY2Mjfbi4uKgifBlc7JKIiEh9NCK5GT16NPbs2YMjR46gRo0axdatXr066tSpA0NDQ2lZvXr1EB8fj+xs+Y66U6ZMQXJysvTx6NGjco//bVzskoiISH3U2iwlhMCYMWOwY8cOREdHw93dvcR9WrRogY0bNyI/Px8GBq9zs1u3bqF69eowNpZPGkxMTGBiYlLusZeEi10SERGph1rv3ISFhWH9+vXYuHEjrKysEB8fj/j4eLx69b+5YEJCQjBlyhTp85EjR+LFixcYN24cbt26hT/++ANz585FWFiYOk6hWDbmxvBwtETjmnbwcLRkYkNERFQB1HrnJjIyEgDQunVrmfLVq1cjNDQUABAXFye9QwMALi4uiIqKwoQJE+Dj4wNnZ2eMGzcOX375ZUWFTURERBpMIoQQ6g6iIqWkpMDGxgbJycmwtrZWdzhERESkAGWu3xrRoZiIiIiovDC5ISIiIp3C5IaIiIh0CpMbIiIi0ilMboiIiEinMLkhIiIincLkhoiIiHQKkxsiIiLSKUxuiIiISKcwuSEiIiKdwuSGiIiIdAqTGyIiItIpTG6IiIhIpzC5ISIiIp3C5IaIiIh0CpMbIiIi0ilMboiIiEinMLkhIiIincLkhoiIiHQKkxsiIiLSKUxuiIiISKcwuSEiIiKdwuSGiIiIdAqTGyIiItIpTG6IiIhIpzC5ISIiIp3C5IaIiIh0CpMbIiIi0ilMboiIiEinMLkhIiIincLkhoiIiHSKWpObiIgI+Pv7w8rKCo6OjggODkZsbGyx+6xZswYSiUTmYWpqWkERExERkaZTa3ITExODsLAw/P333zhw4ABycnLQsWNHpKenF7uftbU1nj59Kn08fPiwgiImIiIiTVdJnS++f/9+medr1qyBo6Mjzp07h8DAwCL3k0gkqFatmqrDIyIiIi2kUX1ukpOTAQCVK1cutl5aWhpcXV3h4uKCHj164Nq1a0XWzcrKQkpKisyDiIiIdJfGJDf5+fkYP348WrRogQYNGhRZz8vLCz///DN27dqF9evXIz8/H82bN8c///xTaP2IiAjY2NhIHy4uLqo6BVKz5Ixs3E1Iw4W4l7j7LA3JGdnqDomIiNRAIoQQ6g4CAEaOHIl9+/bh2LFjqFGjhsL75eTkoF69eujXrx9mzZoltz0rKwtZWVnS5ykpKXBxcUFycjKsra3LJXZSvydJr/Dltsv463aitCzQ0x7zevnAydZMjZEREVF5SElJgY2NjULXb424czN69Gjs2bMHR44cUSqxAQAjIyP4+vrizp07hW43MTGBtbW1zIN0S3JGtlxiAwBHbydi8rbLvINDRKRn1JrcCCEwevRo7NixA4cPH4a7u7vSx8jLy8OVK1dQvXp1FURI2iAxLVsusSlw9HYiEtOY3BAR6RO1jpYKCwvDxo0bsWvXLlhZWSE+Ph4AYGNjAzOz100JISEhcHZ2RkREBABg5syZePfdd1G7dm0kJSVhwYIFePjwIYYOHaq281BEckY2EtOykZKZA2szI9hbGMPG3FjdYemElMycYrenlrCdiIh0i1qTm8jISABA69atZcpXr16N0NBQAEBcXBwMDP53g+nly5cYNmwY4uPjYWdnBz8/P5w4cQLe3t4VFbbS2B9EtaxNjYrdblXCdiIi0i0a06G4oijTIak8JGdkY/SvFwptNgn0tMeyfr68g1NGyRnZGPPrBRzle0xEpLO0rkOxLmN/ENWzMTfGvF4+CPS0lykP9LTH/F4+TGyIiPSMWpul9AH7g1QMJ1szLOvni8S0bKRm5sDK1Aj2luzXRESkj5jcqBj7g1QcG3MmM0RExGYplbO3NJZrLikQ6GkPe0tejImIiMoTkxsVY38QIiKiisVmqQrA/iBEREQVh8lNBWF/ECIioorBZikiIiLSKUxuiIiISKcwuSEiIiKdwuSGiIiIdAqTGyIiItIpTG6IiIhIpzC5ISIiIp3C5IaIiIh0CpMbIiIi0ilMboiIiEin6N3yC0IIAEBKSoqaIyEiIiJFFVy3C67jxdG75CY1NRUA4OLiouZIiIiISFmpqamwsbEpto5EKJIC6ZD8/Hw8efIEVlZWkEgk6g6H/l9KSgpcXFzw6NEjWFtbqzscKgQ/I+3Az0nz8TMqHSEEUlNT4eTkBAOD4nvV6N2dGwMDA9SoUUPdYVARrK2t+WXXcPyMtAM/J83Hz0h5Jd2xKcAOxURERKRTmNwQERGRTmFyQxrBxMQE4eHhMDExUXcoVAR+RtqBn5Pm42ekenrXoZiIiIh0G+/cEBERkU5hckNEREQ6hckNERER6RQmN6RyERER8Pf3h5WVFRwdHREcHIzY2NgS90tKSkJYWBiqV68OExMT1KlTB3v37q2AiPVPaT+jpUuXwsvLC2ZmZnBxccGECROQmZlZARHrp8jISPj4+EjnRwkICMC+ffuK3WfLli2oW7cuTE1N0bBhQ36HVEzZz+iHH35Aq1atYGdnBzs7O7Rv3x6nT5+uwIh1E5MbUrmYmBiEhYXh77//xoEDB5CTk4OOHTsiPT29yH2ys7PRoUMHPHjwAFu3bkVsbCx++OEHODs7V2Dk+qM0n9HGjRsxefJkhIeH48aNG/jpp5+wefNmfPXVVxUYuX6pUaMG5s2bh3PnzuHs2bNo27YtevTogWvXrhVa/8SJE+jXrx+GDBmCCxcuIDg4GMHBwbh69WoFR64/lP2MoqOj0a9fPxw5cgQnT56Ei4sLOnbsiMePH1dw5DpGEFWwhIQEAUDExMQUWScyMlLUqlVLZGdnV2BkVECRzygsLEy0bdtWpmzixImiRYsWqg6P3mBnZyd+/PHHQrd99NFHomvXrjJlzZo1EyNGjKiI0Oj/FfcZvS03N1dYWVmJtWvXqjgq3cY7N1ThkpOTAQCVK1cuss7u3bsREBCAsLAwVK1aFQ0aNMDcuXORl5dXUWHqNUU+o+bNm+PcuXPSW+j37t3D3r170aVLlwqJUd/l5eVh06ZNSE9PR0BAQKF1Tp48ifbt28uUderUCSdPnqyIEPWeIp/R2zIyMpCTk1Psd49KpndrS5F65efnY/z48WjRogUaNGhQZL179+7h8OHD+Pjjj7F3717cuXMHo0aNQk5ODsLDwyswYv2j6GfUv39/JCYmomXLlhBCIDc3F59++imbpVTsypUrCAgIQGZmJiwtLbFjxw54e3sXWjc+Ph5Vq1aVKatatSri4+MrIlS9pcxn9LYvv/wSTk5OckkpKYd3bqhChYWF4erVq9i0aVOx9fLz8+Ho6IhVq1bBz88Pffr0wdSpU7Fy5coKilR/KfoZRUdHY+7cuVixYgXOnz+P7du3448//sCsWbMqKFL95OXlhYsXL+LUqVMYOXIkBg4ciOvXr6s7LHpDaT+jefPmYdOmTdixYwdMTU0rIFIdpu52MdIfYWFhokaNGuLevXsl1g0MDBTt2rWTKdu7d68AILKyslQVot5T5jNq2bKlmDRpkkzZunXrhJmZmcjLy1NViPSWdu3aieHDhxe6zcXFRSxZskSmbNq0acLHx6cCIqMCxX1GBRYsWCBsbGzEmTNnKigq3cY7N6RyQgiMHj0aO3bswOHDh+Hu7l7iPi1atMCdO3eQn58vLbt16xaqV68OY2NjVYarl0rzGWVkZMDAQPZPiKGhofR4VDHy8/ORlZVV6LaAgAAcOnRIpuzAgQMK9/+g8lHcZwQA3377LWbNmoX9+/ejSZMmFRiZDlNzckV6YOTIkcLGxkZER0eLp0+fSh8ZGRnSOp988omYPHmy9HlcXJywsrISo0ePFrGxsWLPnj3C0dFRzJ49Wx2noPNK8xmFh4cLKysr8euvv4p79+6JP//8U3h4eIiPPvpIHaegFyZPnixiYmLE/fv3xeXLl8XkyZOFRCIRf/75pxBC/jM6fvy4qFSpkli4cKG4ceOGCA8PF0ZGRuLKlSvqOgWdp+xnNG/ePGFsbCy2bt0q891LTU1V1ynoBCY3pHIACn2sXr1aWicoKEgMHDhQZr8TJ06IZs2aCRMTE1GrVi0xZ84ckZubW7HB64nSfEY5OTli+vTpwsPDQ5iamgoXFxcxatQo8fLlywqPX18MHjxYuLq6CmNjY+Hg4CDatWsnvWgKUfj36LfffhN16tQRxsbGon79+uKPP/6o4Kj1i7Kfkaura6HfvfDw8IoPXodwVXAiIiLSKexzQ0RERDqFyQ0RERHpFCY3REREpFOY3BAREZFOYXJDREREOoXJDREREekUJjdERESkU5jcEBERkU5hckNEGi86OhoSiQRJSUkqf63p06ejcePGZTqGIvGuWbMGtra2Ch/Tzc0NS5cuLVNcRPqCyQ2RFpNIJMU+pk+fXmGxtG7dGuPHj5crV/Yiri/69OmDW7duKVz/zJkzGD58uPS5RCLBzp07VRAZkfarpO4AiKj0nj59Kv158+bNmDZtGmJjY6VllpaW0p+FEMjLy0OlSrr3tc/Ly4NEIpFbpVyTmZmZwczMTOH6Dg4OKoyGSLdoz18CIpJTrVo16cPGxgYSiUT6/ObNm7CyssK+ffvg5+cHExMTHDt2DKGhoQgODpY5zvjx49G6dWvp8/z8fERERMDd3R1mZmZo1KgRtm7dWuZ4Hzx4AAMDA5w9e1amfOnSpXB1dUV+fj4AYO/evahTpw7MzMzQpk0bPHjwQKZ+wd2g3bt3w9vbGyYmJoiLi8PLly8REhICOzs7mJubo3Pnzrh9+7bcfjt37oSnpydMTU3RqVMnPHr0SC7WdevWwc3NDTY2Nujbty9SU1Ol27KysjB27Fg4OjrC1NQULVu2xJkzZ+SOcfz4cfj4+MDU1BTvvvsurl69KhfLm37//Xf4+/vD1NQU9vb26Nmzp3Tbm81Sbm5uAICePXtCIpHAzc1N4feWSB8wuSHScZMnT8a8efNw48YN+Pj4KLRPREQEfvnlF6xcuRLXrl3DhAkTMGDAAMTExJQpFjc3N7Rv3x6rV6+WKV+9ejVCQ0NhYGCAR48e4YMPPkC3bt1w8eJFDB06FJMnT5Y7VkZGBubPn48ff/wR165dg6OjI0JDQ3H27Fns3r0bJ0+ehBACXbp0QU5Ojsx+c+bMwS+//ILjx48jKSkJffv2lTn23bt3sXPnTuzZswd79uxBTEwM5s2bJ93+xRdfYNu2bVi7di3Onz+P2rVro1OnTnjx4oXMcT7//HMsWrQIZ86cgYODA7p16yYTy5v++OMP9OzZE126dMGFCxdw6NAhNG3atNC6BYnU6tWr8fTpU5w5c0ah95ZIb6h3UXIiKi+rV68WNjY20udHjhwRAMTOnTtl6g0cOFD06NFDpmzcuHEiKChICCFEZmamMDc3FydOnJCpM2TIENGvX78iXz8oKEgYGRkJCwsLmYeJiYlMXJs3bxZ2dnYiMzNTCCHEuXPnhEQiEffv3xdCCDFlyhTh7e0tc+wvv/xSABAvX76UnisAcfHiRWmdW7duCQDi+PHj0rLExERhZmYmfvvtN5n9/v77b2mdGzduCADi1KlTQgghwsPDhbm5uUhJSZHW+fzzz0WzZs2EEEKkpaUJIyMjsWHDBun27Oxs4eTkJL799lshxP/e+02bNknrPH/+XJiZmYnNmzdLY3nzfQkICBAff/xxke+vq6urWLJkifQ5ALFjxw6ZOiW9t0T6gqk8kY5r0qSJUvXv3LmDjIwMdOjQAZaWltLHL7/8grt37xa778cff4yLFy/KPGbOnClTJzg4GIaGhtixYweA180zbdq0kTa13LhxA82aNZPZJyAgQO61jI2NZe5E3bhxA5UqVZLZt0qVKvDy8sKNGzekZZUqVYK/v7/0ed26dWFraytTx83NDVZWVtLn1atXR0JCAoDXd3VycnLQokUL6XYjIyM0bdpU5hhvx125cmW5WN508eJFtGvXrtBtiirpvSXSF7rXs5CIZFhYWMg8NzAwgBBCpuzNppK0tDQAr5tJnJ2dZeqZmJgU+1o2NjaoXbu2TJmjo6PMc2NjY4SEhGD16tX44IMPsHHjRnz33XeKncwbzMzMIJFIlN5PEUZGRjLPJRKJyvusKNO5uCjl9d4SaTveuSHSMw4ODjKjrIDXdw0KvNlBt3bt2jIPFxeXcolh6NChOHjwIFasWIHc3Fx88MEH0m316tXD6dOnZer//fffJR6zXr16yM3NxalTp6Rlz58/R2xsLLy9vaVlubm5Mp1uY2NjkZSUhHr16ikUu4eHB4yNjXH8+HFpWU5ODs6cOSPzOm/H/fLlS9y6davI1/Hx8cGhQ4cUigF4nYDl5eXJlRf33hLpCyY3RHqmbdu2OHv2LH755Rfcvn0b4eHhMqN4rKysMGnSJEyYMAFr167F3bt3cf78eSxbtgxr164tlxjq1auHd999F19++SX69esnc9fi008/xe3bt/H5558jNjYWGzduxJo1a0o8pqenJ3r06IFhw4bh2LFjuHTpEgYMGABnZ2f06NFDWs/IyAhjxozBqVOncO7cOYSGhuLdd98tsvPu2ywsLDBy5Eh8/vnn2L9/P65fv45hw4YhIyMDQ4YMkak7c+ZMHDp0CFevXkVoaCjs7e3lRqoVCA8Px6+//orw8HDcuHEDV65cwfz584uMw83NDYcOHUJ8fDxevnwpLS/uvSXSF0xuiPRMp06d8M033+CLL76Av78/UlNTERISIlNn1qxZ+OabbxAREYF69erhvffewx9//AF3d/dyi2PIkCHIzs7G4MGDZcpr1qyJbdu2YefOnWjUqBFWrlyJuXPnKnTM1atXw8/PD++//z4CAgIghMDevXtlmpnMzc3x5Zdfon///mjRogUsLS2xefNmpWKfN28eevXqhU8++QTvvPMO7ty5g6ioKNjZ2cnVGzduHPz8/BAfH4/ff/8dxsbGhR6zdevW2LJlC3bv3o3GjRujbdu2cnew3rRo0SIcOHAALi4u8PX1ldlW1HtLpC8k4u3GdyKiCjBr1ixs2bIFly9frrDXXLNmDcaPH18hyziokzreWyJNwjs3RFSh0tLScPXqVSxfvhxjxoxRdzg6he8t0WtMboioQo0ePRp+fn5o3bo1m03KGd9botfYLEVEREQ6hXduiIiISKcwuSEiIiKdwuSGiIiIdAqTGyIiItIpTG6IiIhIpzC5ISIiIp3C5IaIiIh0CpMbIiIi0ilMboiIiEin/B8RnKKTu9K9kQAAAABJRU5ErkJggg==",
411
+ "text/plain": [
412
+ "<Figure size 640x480 with 1 Axes>"
413
+ ]
414
+ },
415
+ "metadata": {},
416
+ "output_type": "display_data"
417
+ }
418
+ ],
419
+ "source": [
420
+ "sns.scatterplot(x=y_test[:, 0], y=y_pred[:, 0])\n",
421
+ "plt.title(f\"Scatter plot of predicted vs. true Hydrophobicity\\nSpearman's rho: {spearmanr(y_pred, y_test)[0]:.2f}\")\n",
422
+ "plt.xlabel(\"True Hydrophobicity\")\n",
423
+ "plt.ylabel(\"Predicted Hydrophobicity\")\n",
424
+ "plt.show()"
425
+ ]
426
+ },
427
+ {
428
+ "cell_type": "markdown",
429
+ "id": "6f346b98",
430
+ "metadata": {},
431
+ "source": [
432
+ "## Cross-validation"
433
+ ]
434
+ },
435
+ {
436
+ "cell_type": "code",
437
+ "execution_count": null,
438
+ "id": "6f395093",
439
+ "metadata": {},
440
+ "outputs": [],
441
+ "source": [
442
+ "# TODO same as above but using hierarchical_cluster_IgG_isotype_stratified_fold"
443
+ ]
444
+ }
445
+ ],
446
+ "metadata": {
447
+ "kernelspec": {
448
+ "display_name": "mlbase",
449
+ "language": "python",
450
+ "name": "python3"
451
+ },
452
+ "language_info": {
453
+ "codemirror_mode": {
454
+ "name": "ipython",
455
+ "version": 3
456
+ },
457
+ "file_extension": ".py",
458
+ "mimetype": "text/x-python",
459
+ "name": "python",
460
+ "nbconvert_exporter": "python",
461
+ "pygments_lexer": "ipython3",
462
+ "version": "3.11.9"
463
+ }
464
+ },
465
+ "nbformat": 4,
466
+ "nbformat_minor": 5
467
+ }