{ "cells": [ { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "#! pip install tensorflow\n", "#! pip install scikit-learn\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns \n" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "train_df = pd.read_csv(\"train.csv\")" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 poznan.wuoz.gov.pl\n", "1 vill.okawa.kochi.jp\n", "2 nationalfinance.co.om\n", "3 town.ozora.hokkaido.jp\n", "4 open24.ie-news.irish/online/Login\n", " ... \n", "6995051 ddht.co.kr\n", "6995052 www.upstartepoxy.com\n", "6995053 employeesalaryschedule70.000webhostapp.com/adb...\n", "6995054 dekalbtool.com\n", "6995055 helpinganimals.com\n", "Name: URL_clean, Length: 6995056, dtype: object" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 대괄호 [ ] 제거\n", "train_df['URL_clean'] = train_df['URL'].str.replace(r'[\\[\\]]', '', regex=True)\n", "train_df[\"URL_clean\"]" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | ID | \n", "URL | \n", "label | \n", "URL_clean | \n", "
|---|---|---|---|---|
| 0 | \n", "TRAIN_0000000 | \n", "poznan[.]wuoz[.]gov[.]pl | \n", "0 | \n", "poznan.wuoz.gov.pl | \n", "
| 1 | \n", "TRAIN_0000001 | \n", "vill[.]okawa[.]kochi[.]jp | \n", "0 | \n", "vill.okawa.kochi.jp | \n", "
| 2 | \n", "TRAIN_0000002 | \n", "nationalfinance[.]co[.]om | \n", "0 | \n", "nationalfinance.co.om | \n", "
| 3 | \n", "TRAIN_0000003 | \n", "town[.]ozora[.]hokkaido[.]jp | \n", "0 | \n", "town.ozora.hokkaido.jp | \n", "
| 4 | \n", "TRAIN_0000004 | \n", "open24[.]ie-news[.]irish/online/Login | \n", "1 | \n", "open24.ie-news.irish/online/Login | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 6995051 | \n", "TRAIN_6995051 | \n", "ddht[.]co[.]kr | \n", "0 | \n", "ddht.co.kr | \n", "
| 6995052 | \n", "TRAIN_6995052 | \n", "www[.]upstartepoxy[.]com | \n", "0 | \n", "www.upstartepoxy.com | \n", "
| 6995053 | \n", "TRAIN_6995053 | \n", "employeesalaryschedule70[.]000webhostapp[.]com... | \n", "1 | \n", "employeesalaryschedule70.000webhostapp.com/adb... | \n", "
| 6995054 | \n", "TRAIN_6995054 | \n", "dekalbtool[.]com | \n", "0 | \n", "dekalbtool.com | \n", "
| 6995055 | \n", "TRAIN_6995055 | \n", "helpinganimals[.]com | \n", "0 | \n", "helpinganimals.com | \n", "
6995056 rows × 4 columns
\n", "| \n", " | ID | \n", "URL | \n", "label | \n", "URL_clean | \n", "digit_count | \n", "dash_count | \n", "underscore_count | \n", "percent_count | \n", "equal_count | \n", "question_count | \n", "... | \n", "count_of_double_slash | \n", "has_www | \n", "suspicious_word_count | \n", "path_depth | \n", "has_long_digit_sequence | \n", "has_multiple_dash | \n", "has_https | \n", "count_of_exclamation | \n", "count_of_dot | \n", "ends_with_common_extension | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "TRAIN_0000000 | \n", "poznan[.]wuoz[.]gov[.]pl | \n", "0 | \n", "poznan.wuoz.gov.pl | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "0 | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "3 | \n", "False | \n", "
| 1 | \n", "TRAIN_0000001 | \n", "vill[.]okawa[.]kochi[.]jp | \n", "0 | \n", "vill.okawa.kochi.jp | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "0 | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "3 | \n", "False | \n", "
| 2 | \n", "TRAIN_0000002 | \n", "nationalfinance[.]co[.]om | \n", "0 | \n", "nationalfinance.co.om | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "0 | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "2 | \n", "False | \n", "
| 3 | \n", "TRAIN_0000003 | \n", "town[.]ozora[.]hokkaido[.]jp | \n", "0 | \n", "town.ozora.hokkaido.jp | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "0 | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "3 | \n", "False | \n", "
| 4 | \n", "TRAIN_0000004 | \n", "open24[.]ie-news[.]irish/online/Login | \n", "1 | \n", "open24.ie-news.irish/online/Login | \n", "2 | \n", "1 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "0 | \n", "False | \n", "1 | \n", "0 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "2 | \n", "False | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 6995051 | \n", "TRAIN_6995051 | \n", "ddht[.]co[.]kr | \n", "0 | \n", "ddht.co.kr | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "0 | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "2 | \n", "False | \n", "
| 6995052 | \n", "TRAIN_6995052 | \n", "www[.]upstartepoxy[.]com | \n", "0 | \n", "www.upstartepoxy.com | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "0 | \n", "True | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "2 | \n", "False | \n", "
| 6995053 | \n", "TRAIN_6995053 | \n", "employeesalaryschedule70[.]000webhostapp[.]com... | \n", "1 | \n", "employeesalaryschedule70.000webhostapp.com/adb... | \n", "5 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "0 | \n", "False | \n", "0 | \n", "0 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "2 | \n", "False | \n", "
| 6995054 | \n", "TRAIN_6995054 | \n", "dekalbtool[.]com | \n", "0 | \n", "dekalbtool.com | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "0 | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "1 | \n", "False | \n", "
| 6995055 | \n", "TRAIN_6995055 | \n", "helpinganimals[.]com | \n", "0 | \n", "helpinganimals.com | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "0 | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "1 | \n", "False | \n", "
6995056 rows × 23 columns
\n", "| \n", " | ID | \n", "URL | \n", "label | \n", "URL_clean | \n", "digit_count | \n", "dash_count | \n", "underscore_count | \n", "percent_count | \n", "equal_count | \n", "question_count | \n", "... | \n", "has_www | \n", "suspicious_word_count | \n", "path_depth | \n", "has_long_digit_sequence | \n", "has_multiple_dash | \n", "has_https | \n", "count_of_exclamation | \n", "count_of_dot | \n", "ends_with_common_extension | \n", "url_entropy | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "TRAIN_0000000 | \n", "poznan[.]wuoz[.]gov[.]pl | \n", "0 | \n", "poznan.wuoz.gov.pl | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "3 | \n", "False | \n", "3.308271 | \n", "
| 1 | \n", "TRAIN_0000001 | \n", "vill[.]okawa[.]kochi[.]jp | \n", "0 | \n", "vill.okawa.kochi.jp | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "3 | \n", "False | \n", "3.471354 | \n", "
| 2 | \n", "TRAIN_0000002 | \n", "nationalfinance[.]co[.]om | \n", "0 | \n", "nationalfinance.co.om | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "2 | \n", "False | \n", "3.272804 | \n", "
| 3 | \n", "TRAIN_0000003 | \n", "town[.]ozora[.]hokkaido[.]jp | \n", "0 | \n", "town.ozora.hokkaido.jp | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "3 | \n", "False | \n", "3.533771 | \n", "
| 4 | \n", "TRAIN_0000004 | \n", "open24[.]ie-news[.]irish/online/Login | \n", "1 | \n", "open24.ie-news.irish/online/Login | \n", "2 | \n", "1 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "False | \n", "1 | \n", "0 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "2 | \n", "False | \n", "3.772450 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 6995051 | \n", "TRAIN_6995051 | \n", "ddht[.]co[.]kr | \n", "0 | \n", "ddht.co.kr | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "2 | \n", "False | \n", "2.921928 | \n", "
| 6995052 | \n", "TRAIN_6995052 | \n", "www[.]upstartepoxy[.]com | \n", "0 | \n", "www.upstartepoxy.com | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "True | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "2 | \n", "False | \n", "3.684184 | \n", "
| 6995053 | \n", "TRAIN_6995053 | \n", "employeesalaryschedule70[.]000webhostapp[.]com... | \n", "1 | \n", "employeesalaryschedule70.000webhostapp.com/adb... | \n", "5 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "False | \n", "0 | \n", "0 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "2 | \n", "False | \n", "4.130881 | \n", "
| 6995054 | \n", "TRAIN_6995054 | \n", "dekalbtool[.]com | \n", "0 | \n", "dekalbtool.com | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "1 | \n", "False | \n", "3.324863 | \n", "
| 6995055 | \n", "TRAIN_6995055 | \n", "helpinganimals[.]com | \n", "0 | \n", "helpinganimals.com | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "0 | \n", "... | \n", "False | \n", "0 | \n", "-2 | \n", "False | \n", "False | \n", "False | \n", "0 | \n", "1 | \n", "False | \n", "3.614369 | \n", "
6995056 rows × 24 columns
\n", "Model: \"sequential_2\"\n",
"\n"
],
"text/plain": [
"\u001b[1mModel: \"sequential_2\"\u001b[0m\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃ Layer (type) ┃ Output Shape ┃ Param # ┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ dense_6 (Dense) │ (None, 64) │ 1,344 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_7 (Dense) │ (None, 32) │ 2,080 │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_8 (Dense) │ (None, 1) │ 33 │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n",
"\n"
],
"text/plain": [
"┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓\n",
"┃\u001b[1m \u001b[0m\u001b[1mLayer (type) \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1mOutput Shape \u001b[0m\u001b[1m \u001b[0m┃\u001b[1m \u001b[0m\u001b[1m Param #\u001b[0m\u001b[1m \u001b[0m┃\n",
"┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩\n",
"│ dense_6 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m64\u001b[0m) │ \u001b[38;5;34m1,344\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_7 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m32\u001b[0m) │ \u001b[38;5;34m2,080\u001b[0m │\n",
"├─────────────────────────────────┼────────────────────────┼───────────────┤\n",
"│ dense_8 (\u001b[38;5;33mDense\u001b[0m) │ (\u001b[38;5;45mNone\u001b[0m, \u001b[38;5;34m1\u001b[0m) │ \u001b[38;5;34m33\u001b[0m │\n",
"└─────────────────────────────────┴────────────────────────┴───────────────┘\n"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"Total params: 3,457 (13.50 KB)\n", "\n" ], "text/plain": [ "\u001b[1m Total params: \u001b[0m\u001b[38;5;34m3,457\u001b[0m (13.50 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Trainable params: 3,457 (13.50 KB)\n", "\n" ], "text/plain": [ "\u001b[1m Trainable params: \u001b[0m\u001b[38;5;34m3,457\u001b[0m (13.50 KB)\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "
Non-trainable params: 0 (0.00 B)\n", "\n" ], "text/plain": [ "\u001b[1m Non-trainable params: \u001b[0m\u001b[38;5;34m0\u001b[0m (0.00 B)\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense\n", "\n", "# 모델 구성 \n", "model = Sequential()\n", "model.add(Dense(64, input_dim=X_train_scaled.shape[1], activation='relu')) # 첫번째 은닉층 노드 64개 input_dim=X_train.shape[1]: 입력피처 개수 설정 \n", "model.add(Dense(32, activation='relu')) # 이진분류 두번쨰 은닉층 \n", "model.add(Dense(1, activation='sigmoid'))\n", "\n", "# 모델 컴파일\n", "from tensorflow.keras.optimizers import Adam\n", "\n", "optimizer = Adam(learning_rate=0.001)\n", "model.compile(optimizer=optimizer, loss='binary_crossentropy', metrics=['accuracy'])\n", "\n", "model.summary()\n" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [], "source": [ "# EarlyStopping 콜백을 사용하여 검증 손실이 개선되지 않으면 학습을 멈추도록 설정\n", "from tensorflow.keras.callbacks import EarlyStopping\n", "early_stopping = EarlyStopping(monitor='val_loss', patience=5)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "After undersampling: Counter({0: 1251917, 1: 1251917})\n" ] } ], "source": [ "from imblearn.under_sampling import RandomUnderSampler\n", "\n", "# 언더샘플링 적용\n", "rus = RandomUnderSampler(random_state=42)\n", "\n", "# X_train과 y_train을 언더샘플링하여 균형 맞추기\n", "X_train_under, y_train_under = rus.fit_resample(X_train, y_train)\n", "\n", "# 언더샘플링 후 클래스 분포 확인\n", "print(\"After undersampling:\", Counter(y_train_under))" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhgAAAGYCAYAAAAA3JtVAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjEsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvc2/+5QAAAAlwSFlzAAAPYQAAD2EBqD+naQAAPGVJREFUeJzt3Qm8TWXf//GfecpQmSUqc4SIR8NdbjLkkaYnaSChiQZjaSBNKER1pJTUXcZuURGVuCspGSokkVnGBmOOaf1f3+v/7P3sve19nHOsc84+Z3/er9dy7LXX3ntda/yt6/pda+XyPM8zAAAAH+X288sAAACEAAMAAPiOAAMAAPiOAAMAAPiOAAMAAPiOAAMAAPiOAAMAAPiOAAMAAPiOAAMAAPiOACOOVK5c2W6//XbL7p544gnLlStXpvzWFVdc4YaA+fPnu99+7733MuX3tb603jLbhg0bXDnHjx9viUbl1jbmt6uuusq6deuWrs/u2LHDbrjhBjvzzDPd/I0cOdJyush9L5FpP9R6136Zmcvnp59+srx589qKFSssHhFgZIJff/3V7rrrLjv33HOtYMGCVqxYMbvkkkts1KhR9vfff1t22HECg+a/fPny1rJlS3vxxRdt3759vvzOb7/95k4a33//vcWbeJ63eDRr1qwMCQAy0oIFC+yTTz6xhx56KF2f79mzp82ZM8f69+9v//rXv6xVq1bZcjkge6lVq5a1adPGBgwYYHFJzyJBxvnoo4+8QoUKeSVKlPDuv/9+77XXXvNefvll76abbvLy5cvndevWLThtpUqVvE6dOnnx5M0339Szarwnn3zS+9e//uWNGzfOe/bZZ70WLVp4uXLlcvP8ww8/hH3myJEj3t9//52m3/nuu+/c7+j30iI5OdkNAfPmzXPfM3Xq1DR9T3rn7fDhw96hQ4e8zHb8+HG3jI8ePerFm+7du7vllVFUbm1jfmrXrp3bptOrTJky3i233JKpyyGrXX755W7A/x0n169fH/PYlFFmzZrlfnvt2rVevMmb1QFOTrZ+/Xq76aabrFKlSvb5559buXLlgu91797d1q5dazNnzrTsoHXr1tawYcPga12pqUz//d//bVdffbWtWrXKChUq5N5TlZ2GjHTw4EErXLiw5c+f37JSvnz5suR3A7VJ2d3Ro0ft+PHjaVqPfpd7586dbj8cM2bMKX1HiRIlLKPp2ZSHDh0K7ms5hbaBw4cP54htOiB/Jh2bmjdvbqeffrq99dZb9uSTT1o8oYkkAz333HO2f/9+e+ONN8KCi4AqVarYAw88EPPzf/zxh/Xp08fq1Kljp512mmta0Yn+hx9+OGHal156yc4//3x30tXGpmBgwoQJwffVlPHggw+6fIECBQpY6dKl7corr7SlS5emu3z//Oc/7fHHH7eNGzfaO++8k2IOxqeffmqXXnqpOwirLNWrV7dHHnkkmDdx0UUXuf937tw52BwTyC9QO2bt2rVtyZIl9o9//MOVMfDZWO2cx44dc9OULVvWihQp4oKgzZs3pyrnJfQ7TzZv0XIwDhw4YL1797aKFSu6Za2yDhs2zJ0cQul7evToYdOnT3fl07Rah7Nnz05XDobmRct269atds0117j/lypVym1DWh4p6dSpk5UsWdKOHDlywnstWrRwZUgNzUNSUlKwfIEhdJ61LJSjcN5557kyqx1ZJxdV8zZo0MCKFy/u1tlll11m8+bNO2kORmB7U8Cu39c2pu/Q+lIgejIKLhTo6ECd1v0v0ISodatyB8qb0nIInFC1DLS+dVItU6aMa0b9888/w+ZB25aCeDW/aJ9WYPHqq6/GLEtqtunQXKUpU6bYM888Y2eddZabj2bNmrnlGOm1115z60u/36hRI/vyyy+j/n5ycrINHDjQHdu0brUP9OvXz42Ptu2/++67bhlo2sB2P2nSJLcdFC1a1C1zLX81J6dlvUSWcdCgQVahQgX3ncqV2bNnj5snHRN1LNT3aHtJaT61D2gZad6++OKLmOvAr2WelJTkmtVDl3m0450ucjRuxowZFm+owchAH374odtALr744nR9ft26de7k8z//8z92zjnnuEQyHVwuv/xyd1BWLoSMHTvW7r//frfjKGDRFc6PP/5o3377rd18881umrvvvtslPmpnUbvd77//bl999ZWrebjwwgvTXcbbbrvNncjVfh0rQW7lypXuIHnBBRe4CFsHE+1QaveWmjVruvE6wdx5553uxCKhy03zq4OIaoRuvfVWd0BOiXZg7cxqU9fVpQ7mOoEojyItV3+pmbdQOtEomNGJsUuXLlavXj13cujbt6878b/wwgth02sdTJs2ze6991538FNey/XXX2+bNm1yCYNppUBC+TGNGzd2J/LPPvvMhg8f7k4O99xzT4rr8e2333bzqnUVsH37dldTpZNGaugkqZwVBZTKRYjmzTffdNuolqe2hTPOOMP27t1rr7/+unXo0MFtRwqIFZirLIsWLXLL8WRuvPFGt58MHjzYBc76Pp08hg4dmuLnvv76a7esVdOY1v1PAa/KqeWngL1jx47us1reKS0HLScFJzqpad9VbefLL79sy5Ytc/tFaM3Y6tWr3XLRZ7RsUhvspcaQIUMsd+7c7oStk64uim655RZ37AjQetBva5vXCVnLRdu41psCiNCgSeO1TWvdat9Zvny52+Z/+eUXtyxDabvSyVbHJAW3Co60vFRWnXQD603HKC2TwMVYao+LAdoetM8//PDD7rijizEtX5VbAZ0C1G+++catD31fZD7Df/7zH5s8ebJbT9peR48e7XJstF3qwiAjlvkrr7zilouON8rvUXCuiwZdPCowiaSgRwGG9iMFXHEjq9tocqo9e/a4djG17aZWZA6G2vaPHTsWNo3a+AoUKOByIgL0G+eff36K3128eHHXJpzetkXlIaT03fXr1w++HjhwYFjb8wsvvOBe79q1K115Dmrn1Xtjxow5aTtwIAejQoUK3t69e4Pjp0yZ4saPGjXqpDkvkd+Z0rzp8/qegOnTp7tpn3766bDpbrjhBpezEtpOquny588fNk75LBr/0ksveSnRdhA5T5qXQL5MKK2bBg0apPh92s7OOussr3379mHjR4wY4eZ73bp1XmrFyj0IzHOxYsW8nTt3hr2nXJLI9uo///zT5TbccccdYeP1HdrGIre3yOmuvfZa78wzzzzp/F566aVRl09q97/APEXuX7GWw5dffunGv/vuu2HjZ8+efcJ4bVsap/dSI7XbdGA/qVmzZthy1/6h8cuXLw/mGJUuXdqrV69e2HTKJdN0od+pHK3cuXO78oXSfqtpFyxYEByn15p25cqVYdM+8MADbvtIKbcoteslUMbatWu7cgR06NDBbdOtW7cO+44mTZqE7cuB+dSwePHi4LiNGzd6BQsWdNtXSjkYl6dzmes9bbcXXXRRWK7R+PHjT1jmARMmTHDvffvtt148oYkkgyiSFF2VppeiZUW6gStTXcUHmhdCmzZUJbxlyxb77rvvYn6XplGErKsqv2meUupNEmibVoStq5z0Lgtd7aWWriRDl71qd9RMpcz+jKTvz5Mnj7vaCaUmEx2v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6r4fj2WdNm2aXXnllVaqVCl3fNb9mebMmRM2zRNPPHHCOtUxLEdSLxJkL61atfLq1q3rffPNN96XX37pValSxevQoUPM6ZcvX+5dd9113gcffOCtXbvWmzt3rle1alXv+uuvD5tOm8Obb77pbdu2LTj8/fffXmaZNGmSlz9/fm/cuHHeypUrvW7dunklSpTwduzYEXX6BQsWeHny5PGee+4576effvIee+wxL1++fK68AUOGDPGKFy/uTZ8+3fvhhx+8q6++2jvnnHMytVx+lPXmm2/2kpKSvGXLlnmrVq3ybr/9dleuLVu2BKfp1KmT2zZC198ff/zhZadyavsrVqxYWBm2b98eNk1OWae///57WDlXrFjhtmctg3hep7NmzfIeffRRb9q0ae6Y8f7776c4/bp167zChQt7vXr1cvvpSy+95Mo5e/bsdC+7eC3rAw884A0dOtRbtGiR98svv3j9+/d3x6SlS5cGpxk4cKB3/vnnh63TXbt2eTkRAUY2ox1UG/p3330XHPfxxx97uXLl8rZu3Zrq75kyZYrboY8cORIcl5odKCM1atTI6969e/D1sWPHvPLly3uDBw+OOv2NN97otWnTJmxc48aNvbvuusv9//jx417ZsmW9559/Pvj+X3/95RUoUMCbOHGil5XSWtZIR48e9YoWLeq99dZbYSejdu3aefEkreXUyVXBQyw5eZ2+8MILbp3u378/rtdpqNQcM/r16+dOqKHat2/vtWzZ0rdllxnSe3ysVauWN2jQoLAAQxeIiYAmkmxGj6tXs4jufBqgKmLdjOzbb79N9feoeURVeHnzht9rrXv37u4ZMbqr6rhx41L1SF4/HD582JYsWeLKEqAy6bXKHI3Gh04vLVu2DE6/fv16d/O20Gl0D31Vv8b6zngta6SDBw/akSNH7IwzzjihKrp06dKuOeyee+6x33//3bJbOdXcV6lSJffAqHbt2tnKlSuD7+XkdfrGG2/YTTfdZEWKFInbdZoeJ9tP/Vh28er48ePuwWCR+6ma9NTscu6557rmbt1QMiciwMhmdHDVwSaUggRtwLEeWR9p9+7d9tRTT9mdd94ZNv7JJ5+0KVOmuGe7XH/99XbvvffaSy+95Ov8pzRPx44dC97BNUCvY5VL41OaPvA3Ld8Zr2WN9NBDD7kDVOhBWW3zb7/9tntWz9ChQ+0///mPtW7d2v1WdimnTqIKbGfMmGHvvPOOO0Dr7r1btmzJ0etU+QYrVqywrl27ho2Pt3WaHrH2Uz119O+///Zlf4hXw4YNcwHzjTfeGBynYFg5KLpj9SuvvOKCZuVXKRDJabL8VuH4/x5++GF3AEnJqlWrTvl3tFMriaxWrVou2SjU448/Hvx//fr13TNhnn/+eZcQivgxZMgQl3yrK9vQBEhd/QYo4fWCCy6w8847z03XrFkzyw6UFBf64EIFFzVr1rRXX33VBcU5lWovtM5UcxgqJ6zTRDVhwgQbNGiQC5ZDLwoVIAZofSrgUI2dLu6UsJ+TUIMRJ3r37u0CiJQGVafpsfQ7d+4M++zRo0ddT5FYj6wPUISsK6KiRYva+++/b/ny5Utxem34unJMTk62jKZmmTx58tiOHTvCxut1rHJpfErTB/6m5TszQ3rKGnpFpADjk08+cQenlGh70W+tXbvWsls5A7SNKtgNlCEnrlMF8goYU3Nyyep1mh6x9lM10aoXkB/bSbzR+uzatasLGiKbhyKpybtatWrZap2mFgFGnFC3JnVVSmnQ4+11dffXX3+5NsuAzz//3FUlKyBIqeaiRYsW7js++OCDE7r+RfP999+7LpGZ8dAezVeDBg1cVXCAyqTXoVe0oTQ+dHpR805g+nPOOccdoEKn0XJQrkqs78wM6SmrPPfcc+4qXlWroTk4sSg4VHu9unNmp3KGUtX58uXLg2XIaes00NVaQfytt94a9+s0PU62n/qxncSTiRMnuqeBT5w4MazLcSxqQvn111+z1TpNtazOMkXaqdta/fr1vW+//db76quvXJfT0G6q6rpYvXp1977s2bPH9a6oU6eO66Ya2j1KvRFEXVjHjh3runiuWbPGGz16tOtaNmDAgEwrl7qqqTfA+PHjXW+ZO++803VVC3RTvO2227yHH344rJtq3rx5vWHDhrmum8rOjtZNVd8xY8YM78cff3QZ+fHSpTEtZVU51OvnvffeC1t/+/btc+/rb58+fbyFCxd669ev9z777DPvwgsvdNvGoUOHsk05lW0/Z84c79dff/WWLFni3XTTTV7BggVd18Wctk4DLr30UterIlK8rlPNl7pLa9ApZMSIEe7/GzdudO+rjCprZDfVvn37uv1U3a2jdVNNadlll7K+++677pikMm4L2U/V0ymgd+/e3vz589061TGsefPmXsmSJb2dO3d6OQ0BRjak/vMKKE477TR3z4DOnTsHTzSiDVc7w7x589xr/dXraIOmDXR1rVevnvvOIkWKuG5UY8aMcd3FMpP6yJ999tnuZKqua7rXR8Dll1/uuu1FdretVq2am15d4WbOnHlCt8bHH3/cK1OmjDuANWvWzFu9erUXD9JS1kqVKkVdfwqq5ODBg16LFi28UqVKuSBL0+teAll9gE5rOR988MHgtFpnV111Vdg9BHLSOpWff/7ZrcdPPvnkhO+K13Ua63gSKJv+qqyRn9HxRcvl3HPPDbvXR2qWXXYpq/6f0vSiYLJcuXKunBUqVHCvdeGXE/G4dgAA4DtyMAAAgO8IMAAAgO8IMAAAgO8IMAAAgO8IMAAAgO8IMAAAgO8IMAAAgO8IMAAAgO8IMABkuly5ctn06dOzejYAZCACDAC+2759u913333u6Z96WF7FihWtbdu2Jzz0CkDOlTerZwBAzrJhwwa75JJL3GOon3/+eatTp44dOXLE5syZY927d7eff/45q2cRQCagBgOAr+69917XBLJo0SK7/vrrrVq1anb++edbr1697Jtvvon6mYceeshNV7hwYVfr8fjjj7ugJOCHH36wpk2bWtGiRa1YsWLu8d6LFy92723cuNHVjpx++ulWpEgR91uzZs3KtPICiI4aDAC++eOPP2z27Nn2zDPPuJN9JNVqRKPAYfz48Va+fHlbvny5devWzY3r16+fe/+WW26x+vXr2yuvvGJ58uSx77//3vLly+feU63I4cOH7YsvvnC/+dNPP9lpp52WwSUFcDIEGAB8s3btWtMDmmvUqJGmzz322GPB/1euXNn69OljkyZNCgYYmzZtsr59+wa/t2rVqsHp9Z5qStQUI6oBAZD1aCIB4BsFF+kxefJkl7dRtmxZV/uggEOBQ4CaV7p27WrNmze3IUOG2K+//hp87/7777enn37afX7gwIH2448/+lIWAKeGAAOAb1SzoPyLtCRyLly40DWBXHXVVfbRRx/ZsmXL7NFHH3XNHgFPPPGErVy50tq0aWOff/651apVy95//333ngKPdevW2W233eaaVxo2bGgvvfRShpQPQOrl8tJ7yQEAUbRu3dqd6FevXn1CHsZff/3l8jAUhChAuOaaa2z48OE2evTosFoJBQ3vvfeemz6aDh062IEDB+yDDz444b3+/fvbzJkzqckAshg1GAB8lZSUZMeOHbNGjRrZv//9b1uzZo2tWrXKXnzxRWvSpEnUWg81hyjnQkGGpgvUTsjff/9tPXr0sPnz57seIwsWLLDvvvvOatas6d5/8MEHXRfY9evX29KlS23evHnB9wBkHZI8AfhKSZY60asnSe/evW3btm1WqlQp17VUvUAiXX311dazZ08XRCQnJ7tmEHVTVbOIqNfI77//bh07drQdO3ZYyZIl7brrrrNBgwa59xXMqCfJli1bXBfWVq1a2QsvvJDp5QYQjiYSAADgO5pIAACA7wgwAACA7wgwAACA7wgwAACA7wgwAACA7wgwAACA7wgwAACA7wgwAACA7wgwAACA7wgwAACA7wgwAACA+e3/AfxoNeKDLAnHAAAAAElFTkSuQmCC", "text/plain": [ "