{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "b72b4993-2d04-4cde-b036-cf7be49fa69b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1025 entries, 0 to 1024\n",
      "Data columns (total 14 columns):\n",
      " #   Column    Non-Null Count  Dtype  \n",
      "---  ------    --------------  -----  \n",
      " 0   age       1025 non-null   int64  \n",
      " 1   sex       1025 non-null   int64  \n",
      " 2   cp        1025 non-null   int64  \n",
      " 3   trestbps  1025 non-null   int64  \n",
      " 4   chol      1025 non-null   int64  \n",
      " 5   fbs       1025 non-null   int64  \n",
      " 6   restecg   1025 non-null   int64  \n",
      " 7   thalach   1025 non-null   int64  \n",
      " 8   exang     1025 non-null   int64  \n",
      " 9   oldpeak   1025 non-null   float64\n",
      " 10  slope     1025 non-null   int64  \n",
      " 11  ca        1025 non-null   int64  \n",
      " 12  thal      1025 non-null   int64  \n",
      " 13  target    1025 non-null   int64  \n",
      "dtypes: float64(1), int64(13)\n",
      "memory usage: 112.2 KB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'head':    age  sex  cp  trestbps  chol  fbs  restecg  thalach  exang  oldpeak  slope  \\\n",
       " 0   52    1   0       125   212    0        1      168      0      1.0      2   \n",
       " 1   53    1   0       140   203    1        0      155      1      3.1      0   \n",
       " 2   70    1   0       145   174    0        1      125      1      2.6      0   \n",
       " 3   61    1   0       148   203    0        1      161      0      0.0      2   \n",
       " 4   62    0   0       138   294    1        1      106      0      1.9      1   \n",
       " \n",
       "    ca  thal  target  \n",
       " 0   2     3       0  \n",
       " 1   0     3       0  \n",
       " 2   0     3       0  \n",
       " 3   1     3       0  \n",
       " 4   3     2       0  ,\n",
       " 'info': None,\n",
       " 'summary':                age          sex           cp     trestbps        chol  \\\n",
       " count  1025.000000  1025.000000  1025.000000  1025.000000  1025.00000   \n",
       " mean     54.434146     0.695610     0.942439   131.611707   246.00000   \n",
       " std       9.072290     0.460373     1.029641    17.516718    51.59251   \n",
       " min      29.000000     0.000000     0.000000    94.000000   126.00000   \n",
       " 25%      48.000000     0.000000     0.000000   120.000000   211.00000   \n",
       " 50%      56.000000     1.000000     1.000000   130.000000   240.00000   \n",
       " 75%      61.000000     1.000000     2.000000   140.000000   275.00000   \n",
       " max      77.000000     1.000000     3.000000   200.000000   564.00000   \n",
       " \n",
       "                fbs      restecg      thalach        exang      oldpeak  \\\n",
       " count  1025.000000  1025.000000  1025.000000  1025.000000  1025.000000   \n",
       " mean      0.149268     0.529756   149.114146     0.336585     1.071512   \n",
       " std       0.356527     0.527878    23.005724     0.472772     1.175053   \n",
       " min       0.000000     0.000000    71.000000     0.000000     0.000000   \n",
       " 25%       0.000000     0.000000   132.000000     0.000000     0.000000   \n",
       " 50%       0.000000     1.000000   152.000000     0.000000     0.800000   \n",
       " 75%       0.000000     1.000000   166.000000     1.000000     1.800000   \n",
       " max       1.000000     2.000000   202.000000     1.000000     6.200000   \n",
       " \n",
       "              slope           ca         thal       target  \n",
       " count  1025.000000  1025.000000  1025.000000  1025.000000  \n",
       " mean      1.385366     0.754146     2.323902     0.513171  \n",
       " std       0.617755     1.030798     0.620660     0.500070  \n",
       " min       0.000000     0.000000     0.000000     0.000000  \n",
       " 25%       1.000000     0.000000     2.000000     0.000000  \n",
       " 50%       1.000000     0.000000     2.000000     1.000000  \n",
       " 75%       2.000000     1.000000     3.000000     1.000000  \n",
       " max       2.000000     4.000000     3.000000     1.000000  }"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "# Load the dataset\n",
    "file_path = 'heart.csv'\n",
    "data = pd.read_csv(file_path)\n",
    "\n",
    "# Display the first few rows and dataset info for inspection\n",
    "data_info = {\n",
    "    \"head\": data.head(),\n",
    "    \"info\": data.info(),\n",
    "    \"summary\": data.describe(include=\"all\")\n",
    "}\n",
    "\n",
    "data_info\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "4781323a-b5a7-4fbd-b93d-372d8b3f8368",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\HP\\anaconda3\\envs\\alaff\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:469: ConvergenceWarning: lbfgs failed to converge (status=1):\n",
      "STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.\n",
      "\n",
      "Increase the number of iterations (max_iter) or scale the data as shown in:\n",
      "    https://scikit-learn.org/stable/modules/preprocessing.html\n",
      "Please also refer to the documentation for alternative solver options:\n",
      "    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression\n",
      "  n_iter_i = _check_optimize_result(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best Parameters: {'C': 0.01, 'solver': 'liblinear'}\n",
      "Test Accuracy: 0.775974025974026\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "from sklearn.feature_selection import RFE\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "# Step 1: Load dataset\n",
    "data = pd.read_csv(\"heart.csv\")\n",
    "\n",
    "# Step 2: Define features (X) and target (y)\n",
    "X = data.drop(columns=['target'])\n",
    "y = data['target']\n",
    "\n",
    "# Step 3: Apply Recursive Feature Elimination (RFE) for feature selection\n",
    "model = LogisticRegression(max_iter=1000, random_state=42)\n",
    "rfe = RFE(estimator=model, n_features_to_select=5)  # Selecting top 5 features\n",
    "rfe.fit(X, y)\n",
    "selected_features = X.columns[rfe.support_]  # Get the selected feature names\n",
    "X_selected = X[selected_features]  # Define X_selected with the important features\n",
    "\n",
    "# Step 4: Scale the selected features\n",
    "scaler = StandardScaler()\n",
    "X_scaled = scaler.fit_transform(X_selected)\n",
    "\n",
    "# Step 5: Split the dataset into training and testing sets\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)\n",
    "\n",
    "# Step 6: Define hyperparameter grid for Logistic Regression\n",
    "param_grid = {\n",
    "    'C': [0.01, 0.1, 1, 10, 100],  # Regularization strength\n",
    "    'solver': ['liblinear', 'lbfgs'],  # Optimization solvers\n",
    "}\n",
    "\n",
    "# Step 7: Apply GridSearchCV for hyperparameter tuning\n",
    "grid_search = GridSearchCV(estimator=LogisticRegression(max_iter=2000, random_state=42),\n",
    "                           param_grid=param_grid,\n",
    "                           cv=5,  # 5-fold cross-validation\n",
    "                           scoring='accuracy',\n",
    "                           n_jobs=-1)\n",
    "grid_search.fit(X_train, y_train)\n",
    "\n",
    "# Step 8: Get the best parameters and evaluate the model\n",
    "best_params = grid_search.best_params_\n",
    "best_model = grid_search.best_estimator_\n",
    "test_accuracy = accuracy_score(y_test, best_model.predict(X_test))\n",
    "\n",
    "print(\"Best Parameters:\", best_params)\n",
    "print(\"Test Accuracy:\", test_accuracy)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "a1306a94-8738-4e60-8125-6ab8d33750ee",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best Parameters: {'C': 0.01, 'solver': 'liblinear'}\n",
      "Test Accuracy: 0.775974025974026\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "from sklearn.feature_selection import RFE\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "# Load dataset\n",
    "data = pd.read_csv(\"heart.csv\")\n",
    "\n",
    "# Define features (X) and target (y)\n",
    "X = data.drop(columns=['target'])\n",
    "y = data['target']\n",
    "\n",
    "# Apply Recursive Feature Elimination (RFE) for feature selection\n",
    "model = LogisticRegression(max_iter=2000, random_state=42)\n",
    "rfe = RFE(estimator=model, n_features_to_select=5)  # Selecting top 5 features\n",
    "rfe.fit(X, y)\n",
    "selected_features = X.columns[rfe.support_]  # Get the selected feature names\n",
    "X_selected = X[selected_features]  # Define X_selected with the important features\n",
    "\n",
    "# Scale the selected features\n",
    "scaler = StandardScaler()\n",
    "X_scaled = scaler.fit_transform(X_selected)\n",
    "\n",
    "# Split the dataset into training and testing sets\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)\n",
    "\n",
    "# Define hyperparameter grid for Logistic Regression with increased max_iter and alternative solvers\n",
    "param_grid = {\n",
    "    'C': [0.01, 0.1, 1, 10, 100],  # Regularization strength\n",
    "    'solver': ['liblinear', 'lbfgs', 'newton-cg', 'saga'],  # Alternative solvers\n",
    "}\n",
    "\n",
    "# Apply GridSearchCV\n",
    "grid_search = GridSearchCV(estimator=LogisticRegression(max_iter=5000, random_state=42),\n",
    "                           param_grid=param_grid,\n",
    "                           cv=5,  # 5-fold cross-validation\n",
    "                           scoring='accuracy',\n",
    "                           n_jobs=-1)\n",
    "grid_search.fit(X_train, y_train)\n",
    "\n",
    "# Get the best parameters and evaluate the model\n",
    "best_params = grid_search.best_params_\n",
    "best_model = grid_search.best_estimator_\n",
    "test_accuracy = accuracy_score(y_test, best_model.predict(X_test))\n",
    "\n",
    "print(\"Best Parameters:\", best_params)\n",
    "print(\"Test Accuracy:\", test_accuracy)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "7ec2bf3e-b407-4239-ad97-de334bafd6fa",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "from sklearn.preprocessing import StandardScaler, LabelEncoder\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.metrics import classification_report"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "3d907b25-7e84-40ca-b2fa-a81aa63c3fa1",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.read_csv('heart.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "2033cd46-984b-48fd-985f-e88984cfa651",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "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>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>cp</th>\n",
       "      <th>trestbps</th>\n",
       "      <th>chol</th>\n",
       "      <th>fbs</th>\n",
       "      <th>restecg</th>\n",
       "      <th>thalach</th>\n",
       "      <th>exang</th>\n",
       "      <th>oldpeak</th>\n",
       "      <th>slope</th>\n",
       "      <th>ca</th>\n",
       "      <th>thal</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>52</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>125</td>\n",
       "      <td>212</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>168</td>\n",
       "      <td>0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>53</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>140</td>\n",
       "      <td>203</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>155</td>\n",
       "      <td>1</td>\n",
       "      <td>3.1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>70</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>145</td>\n",
       "      <td>174</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>125</td>\n",
       "      <td>1</td>\n",
       "      <td>2.6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>61</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>148</td>\n",
       "      <td>203</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>161</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>62</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>138</td>\n",
       "      <td>294</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>106</td>\n",
       "      <td>0</td>\n",
       "      <td>1.9</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age  sex  cp  trestbps  chol  fbs  restecg  thalach  exang  oldpeak  slope  \\\n",
       "0   52    1   0       125   212    0        1      168      0      1.0      2   \n",
       "1   53    1   0       140   203    1        0      155      1      3.1      0   \n",
       "2   70    1   0       145   174    0        1      125      1      2.6      0   \n",
       "3   61    1   0       148   203    0        1      161      0      0.0      2   \n",
       "4   62    0   0       138   294    1        1      106      0      1.9      1   \n",
       "\n",
       "   ca  thal  target  \n",
       "0   2     3       0  \n",
       "1   0     3       0  \n",
       "2   0     3       0  \n",
       "3   1     3       0  \n",
       "4   3     2       0  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "4cdfd97d-95c6-42f2-9264-819644c8cdd1",
   "metadata": {},
   "outputs": [],
   "source": [
    "label_encoders = {}\n",
    "for column in data.select_dtypes(include=['object']).columns:\n",
    " le = LabelEncoder()\n",
    " data[column] = le.fit_transform(data[column])\n",
    " label_encoders[column] = le"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "4b56b98f-e263-46f7-b875-f545030d7ed0",
   "metadata": {},
   "outputs": [
    {
     "ename": "IndentationError",
     "evalue": "unexpected indent (1260727625.py, line 11)",
     "output_type": "error",
     "traceback": [
      "\u001b[1;36m  Cell \u001b[1;32mIn[20], line 11\u001b[1;36m\u001b[0m\n\u001b[1;33m    report = classification_report(y_true, y_pred)\u001b[0m\n\u001b[1;37m    ^\u001b[0m\n\u001b[1;31mIndentationError\u001b[0m\u001b[1;31m:\u001b[0m unexpected indent\n"
     ]
    }
   ],
   "source": [
    "def evaluate_model(model_name, y_true, y_pred):\n",
    "\n",
    " # Calculate metrics\n",
    " accuracy = accuracy_score(y_true, y_pred)\n",
    " precision = precision_score(y_true, y_pred, average='weighted')\n",
    " recall = recall_score(y_true, y_pred, average='weighted')\n",
    " f1 = f1_score(y_true, y_pred, average='weighted')\n",
    " cm = confusion_matrix(y_true, y_pred)\n",
    "\n",
    " # Create a report\n",
    "    report = classification_report(y_true, y_pred)\n",
    "\n",
    "\n",
    " # Output results\n",
    " metrics = {\n",
    " 'Model Name': model_name,\n",
    " 'Accuracy': accuracy,\n",
    " 'Precision': precision,\n",
    " 'Recall': recall,\n",
    " 'F1 Score': f1,\n",
    "\n",
    " 'Classification Report': report\n",
    " }\n",
    " # Plot Confusion Matrix\n",
    " plt.figure(figsize=(4, 4))\n",
    " sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False,\n",
    " xticklabels=np.unique(y_true), yticklabels=np.unique(y_true))\n",
    " plt.title(f'Confusion Matrix for {model_name}')\n",
    " plt.xlabel('Predicted Label')\n",
    " plt.ylabel('True Label')\n",
    " plt.show()\n",
    "\n",
    " return metrics\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "fbc95d96-7d9d-4efe-a46d-1fd1d281b666",
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'panda'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[1], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mpanda\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mpd\u001b[39;00m\n\u001b[0;32m      2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mnumpy\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mnp\u001b[39;00m\n",
      "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'panda'"
     ]
    }
   ],
   "source": [
    "import panda as pd\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "9da953f9-c080-449f-88b6-d8f3cab54def",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "b7584760-6032-4df3-93f3-1cc04ff8c98b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "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>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>cp</th>\n",
       "      <th>trestbps</th>\n",
       "      <th>chol</th>\n",
       "      <th>fbs</th>\n",
       "      <th>restecg</th>\n",
       "      <th>thalach</th>\n",
       "      <th>exang</th>\n",
       "      <th>oldpeak</th>\n",
       "      <th>slope</th>\n",
       "      <th>ca</th>\n",
       "      <th>thal</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>52</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>125</td>\n",
       "      <td>212</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>168</td>\n",
       "      <td>0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>53</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>140</td>\n",
       "      <td>203</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>155</td>\n",
       "      <td>1</td>\n",
       "      <td>3.1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>70</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>145</td>\n",
       "      <td>174</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>125</td>\n",
       "      <td>1</td>\n",
       "      <td>2.6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>61</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>148</td>\n",
       "      <td>203</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>161</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>62</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>138</td>\n",
       "      <td>294</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>106</td>\n",
       "      <td>0</td>\n",
       "      <td>1.9</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age  sex  cp  trestbps  chol  fbs  restecg  thalach  exang  oldpeak  slope  \\\n",
       "0   52    1   0       125   212    0        1      168      0      1.0      2   \n",
       "1   53    1   0       140   203    1        0      155      1      3.1      0   \n",
       "2   70    1   0       145   174    0        1      125      1      2.6      0   \n",
       "3   61    1   0       148   203    0        1      161      0      0.0      2   \n",
       "4   62    0   0       138   294    1        1      106      0      1.9      1   \n",
       "\n",
       "   ca  thal  target  \n",
       "0   2     3       0  \n",
       "1   0     3       0  \n",
       "2   0     3       0  \n",
       "3   1     3       0  \n",
       "4   3     2       0  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Load your dataset into a DataFrame\n",
    "df = pd.read_csv('heart.csv')\n",
    "# Preview the first 5 rows\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "5fec799c-466e-47ab-9698-1d274b965af1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "age           int64\n",
       "sex           int64\n",
       "cp            int64\n",
       "trestbps      int64\n",
       "chol          int64\n",
       "fbs           int64\n",
       "restecg       int64\n",
       "thalach       int64\n",
       "exang         int64\n",
       "oldpeak     float64\n",
       "slope         int64\n",
       "ca            int64\n",
       "thal          int64\n",
       "target        int64\n",
       "dtype: object"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.dtypes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "df62559a-001c-455f-8978-59fcf177defb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "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>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>cp</th>\n",
       "      <th>trestbps</th>\n",
       "      <th>chol</th>\n",
       "      <th>fbs</th>\n",
       "      <th>restecg</th>\n",
       "      <th>thalach</th>\n",
       "      <th>exang</th>\n",
       "      <th>oldpeak</th>\n",
       "      <th>slope</th>\n",
       "      <th>ca</th>\n",
       "      <th>thal</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>1025.000000</td>\n",
       "      <td>1025.000000</td>\n",
       "      <td>1025.000000</td>\n",
       "      <td>1025.000000</td>\n",
       "      <td>1025.00000</td>\n",
       "      <td>1025.000000</td>\n",
       "      <td>1025.000000</td>\n",
       "      <td>1025.000000</td>\n",
       "      <td>1025.000000</td>\n",
       "      <td>1025.000000</td>\n",
       "      <td>1025.000000</td>\n",
       "      <td>1025.000000</td>\n",
       "      <td>1025.000000</td>\n",
       "      <td>1025.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>54.434146</td>\n",
       "      <td>0.695610</td>\n",
       "      <td>0.942439</td>\n",
       "      <td>131.611707</td>\n",
       "      <td>246.00000</td>\n",
       "      <td>0.149268</td>\n",
       "      <td>0.529756</td>\n",
       "      <td>149.114146</td>\n",
       "      <td>0.336585</td>\n",
       "      <td>1.071512</td>\n",
       "      <td>1.385366</td>\n",
       "      <td>0.754146</td>\n",
       "      <td>2.323902</td>\n",
       "      <td>0.513171</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>9.072290</td>\n",
       "      <td>0.460373</td>\n",
       "      <td>1.029641</td>\n",
       "      <td>17.516718</td>\n",
       "      <td>51.59251</td>\n",
       "      <td>0.356527</td>\n",
       "      <td>0.527878</td>\n",
       "      <td>23.005724</td>\n",
       "      <td>0.472772</td>\n",
       "      <td>1.175053</td>\n",
       "      <td>0.617755</td>\n",
       "      <td>1.030798</td>\n",
       "      <td>0.620660</td>\n",
       "      <td>0.500070</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>94.000000</td>\n",
       "      <td>126.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>71.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>48.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>120.000000</td>\n",
       "      <td>211.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>132.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>56.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>130.000000</td>\n",
       "      <td>240.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>152.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.800000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>61.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>140.000000</td>\n",
       "      <td>275.00000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>166.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>1.800000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>77.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>200.000000</td>\n",
       "      <td>564.00000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>202.000000</td>\n",
       "      <td>1.000000</td>\n",
       "      <td>6.200000</td>\n",
       "      <td>2.000000</td>\n",
       "      <td>4.000000</td>\n",
       "      <td>3.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "               age          sex           cp     trestbps        chol  \\\n",
       "count  1025.000000  1025.000000  1025.000000  1025.000000  1025.00000   \n",
       "mean     54.434146     0.695610     0.942439   131.611707   246.00000   \n",
       "std       9.072290     0.460373     1.029641    17.516718    51.59251   \n",
       "min      29.000000     0.000000     0.000000    94.000000   126.00000   \n",
       "25%      48.000000     0.000000     0.000000   120.000000   211.00000   \n",
       "50%      56.000000     1.000000     1.000000   130.000000   240.00000   \n",
       "75%      61.000000     1.000000     2.000000   140.000000   275.00000   \n",
       "max      77.000000     1.000000     3.000000   200.000000   564.00000   \n",
       "\n",
       "               fbs      restecg      thalach        exang      oldpeak  \\\n",
       "count  1025.000000  1025.000000  1025.000000  1025.000000  1025.000000   \n",
       "mean      0.149268     0.529756   149.114146     0.336585     1.071512   \n",
       "std       0.356527     0.527878    23.005724     0.472772     1.175053   \n",
       "min       0.000000     0.000000    71.000000     0.000000     0.000000   \n",
       "25%       0.000000     0.000000   132.000000     0.000000     0.000000   \n",
       "50%       0.000000     1.000000   152.000000     0.000000     0.800000   \n",
       "75%       0.000000     1.000000   166.000000     1.000000     1.800000   \n",
       "max       1.000000     2.000000   202.000000     1.000000     6.200000   \n",
       "\n",
       "             slope           ca         thal       target  \n",
       "count  1025.000000  1025.000000  1025.000000  1025.000000  \n",
       "mean      1.385366     0.754146     2.323902     0.513171  \n",
       "std       0.617755     1.030798     0.620660     0.500070  \n",
       "min       0.000000     0.000000     0.000000     0.000000  \n",
       "25%       1.000000     0.000000     2.000000     0.000000  \n",
       "50%       1.000000     0.000000     2.000000     1.000000  \n",
       "75%       2.000000     1.000000     3.000000     1.000000  \n",
       "max       2.000000     4.000000     3.000000     1.000000  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "461bdb32-c82b-4d01-bf9e-b8c4c3c0ad0e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "age         0\n",
       "sex         0\n",
       "cp          0\n",
       "trestbps    0\n",
       "chol        0\n",
       "fbs         0\n",
       "restecg     0\n",
       "thalach     0\n",
       "exang       0\n",
       "oldpeak     0\n",
       "slope       0\n",
       "ca          0\n",
       "thal        0\n",
       "target      0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "52992e25-f4f5-4086-a33e-4044b40169d1",
   "metadata": {},
   "outputs": [],
   "source": [
    "missing_percentage = df.isnull().mean() * 100\n",
    "threshold = 30"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "946e5883-95ee-467d-8cb0-cf9220d8b64a",
   "metadata": {},
   "outputs": [],
   "source": [
    "columns_to_drop = missing_percentage[missing_percentage > threshold].index"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "ed45d97c-099e-48d6-bb3c-c1df1fe5e829",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = df.drop(columns=columns_to_drop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "86df4395-2419-477e-bb22-9d23689d8eb9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Columns dropped: []\n",
      "Remaining columns: Index(['age', 'sex', 'cp', 'trestbps', 'chol', 'fbs', 'restecg', 'thalach',\n",
      "       'exang', 'oldpeak', 'slope', 'ca', 'thal', 'target'],\n",
      "      dtype='object')\n"
     ]
    }
   ],
   "source": [
    "print(f\"Columns dropped: {list(columns_to_drop)}\")\n",
    "print(f\"Remaining columns: {df.columns}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "97054db4-7806-4891-b1eb-722d2ccd80e1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "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>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>cp</th>\n",
       "      <th>trestbps</th>\n",
       "      <th>chol</th>\n",
       "      <th>fbs</th>\n",
       "      <th>restecg</th>\n",
       "      <th>thalach</th>\n",
       "      <th>exang</th>\n",
       "      <th>oldpeak</th>\n",
       "      <th>slope</th>\n",
       "      <th>ca</th>\n",
       "      <th>thal</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>52</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>125</td>\n",
       "      <td>212</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>168</td>\n",
       "      <td>0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>53</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>140</td>\n",
       "      <td>203</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>155</td>\n",
       "      <td>1</td>\n",
       "      <td>3.1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>70</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>145</td>\n",
       "      <td>174</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>125</td>\n",
       "      <td>1</td>\n",
       "      <td>2.6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>61</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>148</td>\n",
       "      <td>203</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>161</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>62</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>138</td>\n",
       "      <td>294</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>106</td>\n",
       "      <td>0</td>\n",
       "      <td>1.9</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   age  sex  cp  trestbps  chol  fbs  restecg  thalach  exang  oldpeak  slope  \\\n",
       "0   52    1   0       125   212    0        1      168      0      1.0      2   \n",
       "1   53    1   0       140   203    1        0      155      1      3.1      0   \n",
       "2   70    1   0       145   174    0        1      125      1      2.6      0   \n",
       "3   61    1   0       148   203    0        1      161      0      0.0      2   \n",
       "4   62    0   0       138   294    1        1      106      0      1.9      1   \n",
       "\n",
       "   ca  thal  target  \n",
       "0   2     3       0  \n",
       "1   0     3       0  \n",
       "2   0     3       0  \n",
       "3   1     3       0  \n",
       "4   3     2       0  "
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.preprocessing import LabelEncoder\n",
    "label_encoder = LabelEncoder()\n",
    "for column in df.select_dtypes(include=['object']).columns:\n",
    " df[column] = label_encoder.fit_transform(df[column])\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "9b1a7545-5bdd-49e8-a8ea-76d2be5329cb",
   "metadata": {},
   "outputs": [],
   "source": [
    "for column in df.select_dtypes(include=['float64']).columns:\n",
    " mean_value = df[column].mean() # Get the mode (most frequent value)\n",
    " df[column] = df[column].fillna(mean_value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "a3084dfc-42c8-47a2-aff0-b360cf1a3b31",
   "metadata": {},
   "outputs": [],
   "source": [
    "for column in df.select_dtypes(include=['object']).columns:\n",
    " mode_value = df[column].mode()[0] # Get the mode (most frequent value)\n",
    " df[column] = df[column].fillna(mode_value)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "b3c308e2-3695-46f2-8366-64db6f9c32e0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "age         0\n",
       "sex         0\n",
       "cp          0\n",
       "trestbps    0\n",
       "chol        0\n",
       "fbs         0\n",
       "restecg     0\n",
       "thalach     0\n",
       "exang       0\n",
       "oldpeak     0\n",
       "slope       0\n",
       "ca          0\n",
       "thal        0\n",
       "target      0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "01fa86c1-b3ed-4838-92e0-8d6057635234",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "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>age</th>\n",
       "      <th>sex</th>\n",
       "      <th>cp</th>\n",
       "      <th>trestbps</th>\n",
       "      <th>chol</th>\n",
       "      <th>fbs</th>\n",
       "      <th>restecg</th>\n",
       "      <th>thalach</th>\n",
       "      <th>exang</th>\n",
       "      <th>oldpeak</th>\n",
       "      <th>slope</th>\n",
       "      <th>ca</th>\n",
       "      <th>thal</th>\n",
       "      <th>target</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>52</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>125</td>\n",
       "      <td>212</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>168</td>\n",
       "      <td>0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>53</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>140</td>\n",
       "      <td>203</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>155</td>\n",
       "      <td>1</td>\n",
       "      <td>3.1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>70</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>145</td>\n",
       "      <td>174</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>125</td>\n",
       "      <td>1</td>\n",
       "      <td>2.6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>61</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>148</td>\n",
       "      <td>203</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>161</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>62</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>138</td>\n",
       "      <td>294</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>106</td>\n",
       "      <td>0</td>\n",
       "      <td>1.9</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1020</th>\n",
       "      <td>59</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>140</td>\n",
       "      <td>221</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>164</td>\n",
       "      <td>1</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1021</th>\n",
       "      <td>60</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>125</td>\n",
       "      <td>258</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>141</td>\n",
       "      <td>1</td>\n",
       "      <td>2.8</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1022</th>\n",
       "      <td>47</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>110</td>\n",
       "      <td>275</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>118</td>\n",
       "      <td>1</td>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1023</th>\n",
       "      <td>50</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>110</td>\n",
       "      <td>254</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>159</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1024</th>\n",
       "      <td>54</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>120</td>\n",
       "      <td>188</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>113</td>\n",
       "      <td>0</td>\n",
       "      <td>1.4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>1025 rows × 14 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "      age  sex  cp  trestbps  chol  fbs  restecg  thalach  exang  oldpeak  \\\n",
       "0      52    1   0       125   212    0        1      168      0      1.0   \n",
       "1      53    1   0       140   203    1        0      155      1      3.1   \n",
       "2      70    1   0       145   174    0        1      125      1      2.6   \n",
       "3      61    1   0       148   203    0        1      161      0      0.0   \n",
       "4      62    0   0       138   294    1        1      106      0      1.9   \n",
       "...   ...  ...  ..       ...   ...  ...      ...      ...    ...      ...   \n",
       "1020   59    1   1       140   221    0        1      164      1      0.0   \n",
       "1021   60    1   0       125   258    0        0      141      1      2.8   \n",
       "1022   47    1   0       110   275    0        0      118      1      1.0   \n",
       "1023   50    0   0       110   254    0        0      159      0      0.0   \n",
       "1024   54    1   0       120   188    0        1      113      0      1.4   \n",
       "\n",
       "      slope  ca  thal  target  \n",
       "0         2   2     3       0  \n",
       "1         0   0     3       0  \n",
       "2         0   0     3       0  \n",
       "3         2   1     3       0  \n",
       "4         1   3     2       0  \n",
       "...     ...  ..   ...     ...  \n",
       "1020      2   0     2       1  \n",
       "1021      1   1     3       0  \n",
       "1022      1   1     2       0  \n",
       "1023      2   0     2       1  \n",
       "1024      1   1     3       0  \n",
       "\n",
       "[1025 rows x 14 columns]"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "d440f055-d367-4b0c-8465-0c5f62f9757a",
   "metadata": {},
   "outputs": [],
   "source": [
    "def replace_outliers_with_nan(column):\n",
    " Q1 = column.quantile(0.25)\n",
    " Q3 = column.quantile(0.75)\n",
    " IQR = Q3 - Q1\n",
    " lower_bound = Q1 - 1.5 * IQR\n",
    " upper_bound = Q3 + 1.5 * IQR\n",
    " # Replace outliers with NaN\n",
    " return column.where((column >= lower_bound) & (column <= upper_bound), np.nan)\n",
    "# Replace outliers with NaN for each feature\n",
    "for col in df.columns:\n",
    " df[col] = replace_outliers_with_nan(df[col])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "9ac258a9-1cee-499a-a875-653df7802ef5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sum of null values in each column:\n",
      "age         0\n",
      "sex         0\n",
      "cp          0\n",
      "trestbps    0\n",
      "chol        0\n",
      "fbs         0\n",
      "restecg     0\n",
      "thalach     0\n",
      "exang       0\n",
      "oldpeak     0\n",
      "slope       0\n",
      "ca          0\n",
      "thal        0\n",
      "target      0\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "# Load the dataset (update the file path as needed)\n",
    "data = pd.read_csv(\"heart.csv\")\n",
    "\n",
    "# Check for null values in each column\n",
    "null_counts = data.isnull().sum()\n",
    "print(\"Sum of null values in each column:\")\n",
    "print(null_counts)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "845cf151-b5ba-40ba-8e46-9285be0ac982",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sum of null values in each column:\n",
      "age         0\n",
      "sex         0\n",
      "cp          0\n",
      "trestbps    0\n",
      "chol        0\n",
      "fbs         0\n",
      "restecg     0\n",
      "thalach     0\n",
      "exang       0\n",
      "oldpeak     0\n",
      "slope       0\n",
      "ca          0\n",
      "thal        0\n",
      "target      0\n",
      "dtype: int64\n"
     ]
    }
   ],
   "source": [
    "null_counts = data.isnull().sum()\n",
    "print(\"Sum of null values in each column:\")\n",
    "print(null_counts)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "31fa08f5-dd4d-4e63-9ca1-abf216145009",
   "metadata": {},
   "outputs": [
    {
     "ename": "ModuleNotFoundError",
     "evalue": "No module named 'matplotlib'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mModuleNotFoundError\u001b[0m                       Traceback (most recent call last)",
      "Cell \u001b[1;32mIn[25], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mmatplotlib\u001b[39;00m\u001b[38;5;21;01m.\u001b[39;00m\u001b[38;5;21;01mpyplot\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01mplt\u001b[39;00m\n\u001b[0;32m      2\u001b[0m \u001b[38;5;28;01mimport\u001b[39;00m \u001b[38;5;21;01mseaborn\u001b[39;00m \u001b[38;5;28;01mas\u001b[39;00m \u001b[38;5;21;01msns\u001b[39;00m\n\u001b[0;32m      4\u001b[0m \u001b[38;5;66;03m# Generate the distribution plot for the 'age' column in the dataset\u001b[39;00m\n",
      "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'matplotlib'"
     ]
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "# Generate the distribution plot for the 'age' column in the dataset\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.histplot(data['age'], bins=15, kde=True, color='blue')\n",
    "plt.title('Age Distribution')\n",
    "plt.xlabel('Age')\n",
    "plt.ylabel('Frequency')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "ca26931b-960c-41ff-a254-12647774aa1c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Collecting matplotlib\n",
      "  Downloading matplotlib-3.10.0-cp312-cp312-win_amd64.whl.metadata (11 kB)\n",
      "Collecting seaborn\n",
      "  Downloading seaborn-0.13.2-py3-none-any.whl.metadata (5.4 kB)\n",
      "Collecting contourpy>=1.0.1 (from matplotlib)\n",
      "  Downloading contourpy-1.3.1-cp312-cp312-win_amd64.whl.metadata (5.4 kB)\n",
      "Collecting cycler>=0.10 (from matplotlib)\n",
      "  Downloading cycler-0.12.1-py3-none-any.whl.metadata (3.8 kB)\n",
      "Collecting fonttools>=4.22.0 (from matplotlib)\n",
      "  Downloading fonttools-4.55.3-cp312-cp312-win_amd64.whl.metadata (168 kB)\n",
      "Collecting kiwisolver>=1.3.1 (from matplotlib)\n",
      "  Downloading kiwisolver-1.4.7-cp312-cp312-win_amd64.whl.metadata (6.4 kB)\n",
      "Requirement already satisfied: numpy>=1.23 in c:\\users\\hp\\anaconda3\\envs\\alaff\\lib\\site-packages (from matplotlib) (2.1.2)\n",
      "Requirement already satisfied: packaging>=20.0 in c:\\users\\hp\\anaconda3\\envs\\alaff\\lib\\site-packages (from matplotlib) (24.1)\n",
      "Collecting pillow>=8 (from matplotlib)\n",
      "  Downloading pillow-11.0.0-cp312-cp312-win_amd64.whl.metadata (9.3 kB)\n",
      "Collecting pyparsing>=2.3.1 (from matplotlib)\n",
      "  Downloading pyparsing-3.2.0-py3-none-any.whl.metadata (5.0 kB)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in c:\\users\\hp\\anaconda3\\envs\\alaff\\lib\\site-packages (from matplotlib) (2.9.0.post0)\n",
      "Requirement already satisfied: pandas>=1.2 in c:\\users\\hp\\anaconda3\\envs\\alaff\\lib\\site-packages (from seaborn) (2.2.3)\n",
      "Requirement already satisfied: pytz>=2020.1 in c:\\users\\hp\\anaconda3\\envs\\alaff\\lib\\site-packages (from pandas>=1.2->seaborn) (2024.1)\n",
      "Requirement already satisfied: tzdata>=2022.7 in c:\\users\\hp\\anaconda3\\envs\\alaff\\lib\\site-packages (from pandas>=1.2->seaborn) (2024.2)\n",
      "Requirement already satisfied: six>=1.5 in c:\\users\\hp\\anaconda3\\envs\\alaff\\lib\\site-packages (from python-dateutil>=2.7->matplotlib) (1.16.0)\n",
      "Downloading matplotlib-3.10.0-cp312-cp312-win_amd64.whl (8.0 MB)\n",
      "   ---------------------------------------- 0.0/8.0 MB ? eta -:--:--\n",
      "   ---------------------------------------- 0.0/8.0 MB ? eta -:--:--\n",
      "   - -------------------------------------- 0.3/8.0 MB ? eta -:--:--\n",
      "   --- ------------------------------------ 0.8/8.0 MB 1.6 MB/s eta 0:00:05\n",
      "   ------ --------------------------------- 1.3/8.0 MB 1.9 MB/s eta 0:00:04\n",
      "   ------- -------------------------------- 1.6/8.0 MB 1.9 MB/s eta 0:00:04\n",
      "   --------- ------------------------------ 1.8/8.0 MB 1.7 MB/s eta 0:00:04\n",
      "   ------------- -------------------------- 2.6/8.0 MB 1.9 MB/s eta 0:00:03\n",
      "   -------------- ------------------------- 2.9/8.0 MB 2.0 MB/s eta 0:00:03\n",
      "   ------------------ --------------------- 3.7/8.0 MB 2.1 MB/s eta 0:00:03\n",
      "   -------------------- ------------------- 4.2/8.0 MB 2.1 MB/s eta 0:00:02\n",
      "   ----------------------- ---------------- 4.7/8.0 MB 2.1 MB/s eta 0:00:02\n",
      "   ------------------------ --------------- 5.0/8.0 MB 2.1 MB/s eta 0:00:02\n",
      "   -------------------------- ------------- 5.2/8.0 MB 2.0 MB/s eta 0:00:02\n",
      "   -------------------------- ------------- 5.2/8.0 MB 2.0 MB/s eta 0:00:02\n",
      "   --------------------------- ------------ 5.5/8.0 MB 1.8 MB/s eta 0:00:02\n",
      "   ------------------------------- -------- 6.3/8.0 MB 1.9 MB/s eta 0:00:01\n",
      "   --------------------------------- ------ 6.8/8.0 MB 1.9 MB/s eta 0:00:01\n",
      "   ------------------------------------ --- 7.3/8.0 MB 2.0 MB/s eta 0:00:01\n",
      "   ---------------------------------------  7.9/8.0 MB 2.0 MB/s eta 0:00:01\n",
      "   ---------------------------------------- 8.0/8.0 MB 2.0 MB/s eta 0:00:00\n",
      "Downloading seaborn-0.13.2-py3-none-any.whl (294 kB)\n",
      "Downloading contourpy-1.3.1-cp312-cp312-win_amd64.whl (220 kB)\n",
      "Downloading cycler-0.12.1-py3-none-any.whl (8.3 kB)\n",
      "Downloading fonttools-4.55.3-cp312-cp312-win_amd64.whl (2.2 MB)\n",
      "   ---------------------------------------- 0.0/2.2 MB ? eta -:--:--\n",
      "   ---- ----------------------------------- 0.3/2.2 MB ? eta -:--:--\n",
      "   -------------- ------------------------- 0.8/2.2 MB 4.2 MB/s eta 0:00:01\n",
      "   ------------------ --------------------- 1.0/2.2 MB 3.3 MB/s eta 0:00:01\n",
      "   ----------------------- ---------------- 1.3/2.2 MB 1.8 MB/s eta 0:00:01\n",
      "   --------------------------------- ------ 1.8/2.2 MB 1.9 MB/s eta 0:00:01\n",
      "   ------------------------------------- -- 2.1/2.2 MB 1.9 MB/s eta 0:00:01\n",
      "   ---------------------------------------- 2.2/2.2 MB 1.8 MB/s eta 0:00:00\n",
      "Downloading kiwisolver-1.4.7-cp312-cp312-win_amd64.whl (55 kB)\n",
      "Downloading pillow-11.0.0-cp312-cp312-win_amd64.whl (2.6 MB)\n",
      "   ---------------------------------------- 0.0/2.6 MB ? eta -:--:--\n",
      "   ---- ----------------------------------- 0.3/2.6 MB ? eta -:--:--\n",
      "   -------- ------------------------------- 0.5/2.6 MB 1.9 MB/s eta 0:00:02\n",
      "   -------- ------------------------------- 0.5/2.6 MB 1.9 MB/s eta 0:00:02\n",
      "   -------- ------------------------------- 0.5/2.6 MB 1.9 MB/s eta 0:00:02\n",
      "   ------------ --------------------------- 0.8/2.6 MB 588.4 kB/s eta 0:00:04\n",
      "   ------------ --------------------------- 0.8/2.6 MB 588.4 kB/s eta 0:00:04\n",
      "   ------------ --------------------------- 0.8/2.6 MB 588.4 kB/s eta 0:00:04\n",
      "   ---------------- ----------------------- 1.0/2.6 MB 558.9 kB/s eta 0:00:03\n",
      "   ---------------- ----------------------- 1.0/2.6 MB 558.9 kB/s eta 0:00:03\n",
      "   ------------------------ --------------- 1.6/2.6 MB 650.2 kB/s eta 0:00:02\n",
      "   ---------------------------- ----------- 1.8/2.6 MB 718.9 kB/s eta 0:00:02\n",
      "   -------------------------------- ------- 2.1/2.6 MB 798.9 kB/s eta 0:00:01\n",
      "   ------------------------------------ --- 2.4/2.6 MB 833.5 kB/s eta 0:00:01\n",
      "   ---------------------------------------- 2.6/2.6 MB 814.9 kB/s eta 0:00:00\n",
      "Downloading pyparsing-3.2.0-py3-none-any.whl (106 kB)\n",
      "Installing collected packages: pyparsing, pillow, kiwisolver, fonttools, cycler, contourpy, matplotlib, seaborn\n",
      "Successfully installed contourpy-1.3.1 cycler-0.12.1 fonttools-4.55.3 kiwisolver-1.4.7 matplotlib-3.10.0 pillow-11.0.0 pyparsing-3.2.0 seaborn-0.13.2\n",
      "Note: you may need to restart the kernel to use updated packages.\n"
     ]
    }
   ],
   "source": [
    "pip install matplotlib seaborn"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "b98016af-91a3-47fe-a73c-ea49b586c9e2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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rFngx9apU+eU+bT16tUDOO38XHfZuXMnAPXr1z/lvtjY2Lz7c4WEhFCxYsV8t5UtW/a8fgkQEe+lObci4lPmz5/Pvn37mDp1KlOnTj3l/smTJ9O5c+dzes6cnBwAHnvsMbp06XLax5zvMmPr16/H39//H8vnwIEDufbaa/niiy+YM2cOzz77LMOGDWP+/PnExcUV6HVCQ0PPK+ffnWmFheI8masoV5QQEe+jcisiPmXy5MlUqlSJt99++5T7pk+fzowZMxg3bhyhoaFUr16dBQsWcOzYsXxHb7dt25bv+2rVqgVAYGAgnTp1cnvmhIQEFi5cSJs2bc545DZX7dq1GTx4MIMHD2br1q00bdqUESNG8NFHHwFnLpuFkXvE+q/PuWXLFsCsfgDmCCnAoUOH8p3k9fejq+eSrXr16gBs3ryZK664It99mzdvzrtfROR0NC1BRHxGeno606dP55prruHGG2885fLwww9z9OjRvOW7unTpQlZWFu+9917ec+Tk5JxSjCtVqkT79u1555132Ldv3ymve+DAgUJnTklJ4bbbbiM7OztvFYHTOXbsGBkZGfluq127NmXKlCEzMzPvtrCwMA4dOlToPH+1d+9eZsyYkff1kSNH+PDDD2natClRUVF5GQAWLVqU97i0tDQmTZp0yvMVNFuLFi2oVKkS48aNy/dnmzVrFvHx8XTr1q2wfyQRKQF05FZEfMbMmTM5evQo//rXv057/8UXX5y3ocMtt9zC9ddfT6tWrRg8eDDbtm0jNjaWmTNnkpKSAuQ/0vj222/Trl07GjVqRN++falVqxZJSUksWbKE3bt3s2bNmrPm27JlCx999BGO43DkyJG8HcpSU1MZOXIkXbt2/cfv7dixIzfffDMXXnghAQEBzJgxg6SkJG699da8xzVv3pyxY8fywgsvUKdOHSpVqnTK0c+CqlevHn369GHZsmVUrlyZDz74gKSkJCZMmJD3mM6dOxMTE0OfPn14/PHH8ff354MPPqBixYokJCTke76CZgsMDGT48OHcfffdXH755dx22215S4HVqFGDRx99tFB/HhEpISyv1iAi4jbXXnutExIS4qSlpZ3xMXfddZcTGBjoJCcnO47jOAcOHHBuv/12p0yZMk5ERIRz1113OT/99JMDOFOnTs33vdu3b3fuvPNOJyoqygkMDHQuuOAC55prrnE+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D2AvSUlBfPih7TQiRU/lVkSkCCUlwZdfmrHWthUbAgIc4BUAXnoJsrLs5hEpaiq3IiJF6MMP4cQJs6h+o0a200jJ9S7lymWxYwdMnmw7i0jRUrkVESkijnNySoKO2opd6dxxRxJgjt6eOGE5jkgRUrkVESkiixbBli0QFga33GI7jZR0N96YTPnysHUrfPKJ7TQiRUflVkSkiIwbZ6579oQyZexmESlVKofBg834xRfNEnUivkjlVkSkCOzfD59/bsYPPGA3i0iufv3MknTx8Sf/+xTxNSq3IiJFYOJEc1Z6q1YQF2c7jYgRHg4DB5rxf/8LOTlW44gUCZVbERE3y8mBd94xYx21FU/Tv78puevXn1ymTsSXqNyKiLjZ99/Db79BRIROJBPPExlpCi7A88+bVT1EfInKrYiIm+WeSHbnnVCqlN0sIqczcCCULg2rV8N339lOI+JeKrciIm60dy/MnGnG999vN4vImZQvD337mvErr9jNIuJuKrciIm40frxZYqldO7joIttpRM5s4EDw94f582HFCttpRNxH5VZExE2ys+G998xYJ5KJp4uJgdtuM+NXX7WbRcSdVG5FRNxk1izYtct85Nujh+00Imf32GPmeto02LHDbhYRdylUuf3tt9/cnUNExOvlnkh2110QEmI1ikiBNGkCXbqY5etGjrSdRsQ9ClVu69SpQ4cOHfjoo4/IyMhwdyYREa+zcyd8+60Z33ef3Swi5+Lxx831+PGQnGw3i4g7FKrcrly5ksaNGzNo0CCioqK4//77+fXXX92dTUTEa7z3nlkvtGNHqFfPdhqRgrviCmjWDNLTYcwY22lEzl9AYb6padOmvPHGG4wYMYKZM2cyceJE2rVrR7169bjnnnu44447qFixoruzioiXSkhIINnDDglVqFCBmJgYtzxXZubJE8m0/Jd4G5fLHL297TZ4800zDg21nUqk8ApVbvO+OSCAG264gW7dujFmzBiGDBnCY489xlNPPcXNN9/M8OHDiY6OdldWEfFCCQkJxMY2ID39mO0o+YSGlmLTpni3FNxPPoH9++GCC+D6688/m0hxu/FGGDIEfv8dJk6EBx+0nUik8M6r3C5fvpwPPviAqVOnEhYWxmOPPUafPn3YvXs3//d//8d1112n6QoiJVxycjLp6cfo3v0jKlZsYDsOAAcOxDNjRi+Sk5PPu9w6Dowebcb9+kFgoBsCihSzgAAYNMhsyztihJk37u9vO5VI4RSq3I4cOZIJEyawefNmrr76aj788EOuvvpq/PzMFN6aNWsyceJEatSo4c6sInIWnvjxf3x8PAAVKzYgOrqZ5TTu9/PPZgH8kJCTOz6JeKN77oH//Ae2b4cZM8zRXBFvVKhyO3bsWO655x7uuuuuM047qFSpEuPHjz+vcCJScJ768X+u1NSjtiMUiTfeMNc9e0KFCnaziJyPsDDz6cN//2uO3qrcircqVLndunXrWR8TFBRE7969C/P0IlIInvjxP8DWrd+yYMGzPrls4K5dMH26GffvbzeLiDv06wcvvwy//ALLl0OLFrYTiZy7QpXbCRMmULp0aW666aZ8t0+bNo1jx46p1IpY5Gkf/ycnx9uOUGTGjDFb7rZvD40b204jcv4qV4abb4bJk83KCZMm2U4kcu4Ktc7tsGHDqHCaz98qVarESy+9dN6hREQ83dGjMHasGQ8caDWKiFs98oi5njrVrAIi4m0KVW4TEhKoWbPmKbdXr16dhISE8w4lIuLp3nsPDh+G+vXh2mttpxFxn9atoWVLOH785PrNIt6kUOW2UqVKrF279pTb16xZQ/ny5c87lIiIJ8vKgtdfN+PHHwe/Qv0kFfFcuUdvx441/72LeJNC/Ui+7bbb6N+/PwsWLCA7O5vs7Gzmz5/PgAEDuPXWW92dUUTEo0ydCrt3Q1QU9OplO42I+918M1SqBHv2wBdf2E4jcm4KVW7/+9//0rp1azp27EhoaCihoaF07tyZK664QnNuRcSnOQ688ooZDxgAwcF284gUheDgk1tJv/mm3Swi56pQ5TYoKIhPPvmETZs2MXnyZKZPn8727dv54IMPCAoKcndGERGPMWsWrF8PpUvDAw/YTiNSdB54wOxc9uOPsHq17TQiBXde2+/Wq1ePevXquSuLiIhHcxyzwD2Yo1qRkVbjiBSpKlWgRw/45BNz9Fb7Mom3KFS5zc7OZuLEicybN4/9+/eTk5OT7/758+e7JZyIiCf57juzuH1oKDz2mO00IkXvkUdMuZ0yxUzH0Tnj4g0KVW4HDBjAxIkT6datGw0bNsTlcrk7l4iIR3Ec+L//M+MHHjAnk4n4uksugbg4WLUK3n8f/v1v24lEzq5Q5Xbq1Kl8+umnXH311e7OIyLikebOhSVLICQEnnjCdhqR4uFymaO399xjduQbPNjMwxXxZIX6TzQoKIg6deq4O4uIeIisLNiyBfbtg+RkSEkxa7kGBZlyV6UKxMRA1armNl/nOPCf/5jxgw/qqK2ULLfeatZzTkiAr7+G66+3nUjknxWq3A4ePJg33niDt956S1MSRHzIvn2wYoVZDSAz88yP27rVXPv7Q8OG0KIFXHCBOcrji2bP1lFb8X7x8fGF/t5rrqnCpElRvPbaYWJitrstU4UKFYiJiXHb84lAIcvt4sWLWbBgAbNmzeKiiy4iMDAw3/3Tp093SzgRKR7p6fD997By5cnbIiOhdm2zkHvuSSTHj0NqKuzaBTt3wpEjsGaNuVSpAp06wWl25vZq2dknC22/fjpqK94nNXUf4KLXee04UhvYxk8/laF58+5AgluyhYaWYtOmeBVccatCldvIyEi6d+/u7iwiYsH69Wbt1mPHzNcXXQTNm0ONGmc+Etuypfmofs8eWL4cNmyAvXvhww+hbl3o3BkqVCi2P0KRmjjR/H9Utiw8/bTtNCLnLiPjEODQocNb1K3bptDP8803R9izJ5xmzX6hRYt9553rwIF4ZszoRXJyssqtuFWhyu2ECRPcnUNEipnjwPz5sHix+bpiRbjmGjOXtiBcLjPntmpVuPJKWLTIFN2tW+G336B9e3OmtTdLS4NnnzXjZ581BVfEW5UtW4fo6GaF/v6LL4bPP4etW6Pp1i0av0JtAyVS9Ap9zuOJEyf44Ycf2L59O7fffjtlypRh7969hIeHU7p0aXdmFBE3y8oy+8Vv3Gi+btfOlFF//8I9X1gYXHUVtGoFc+aYgjtvHmzaBBdeWMZdsYvdiBFmHnKtWvDQQ7bTiNgVGwulSsHRo+bveP36thOJnF6hyu3OnTvp2rUrCQkJZGZmcuWVV1KmTBmGDx9OZmYm48aNc3dOEXGTrCyYPNnMmfX3h2uvhSZN3PPc5cvDbbeZObizZ5tpC0lJVwE3u+cFitHu3WbReoBhwyA42G4eEdsCAszPiiVLzPx8lVvxVIX6UGHAgAG0aNGCgwcPEhoamnd79+7dmTdvntvCZWdn8+yzz1KzZk1CQ0OpXbs2//3vf3EcJ+8xjuMwdOhQoqOjCQ0NpVOnTmzNPZVbRPLJyYHPPjPFNjgY7rjDfcU2l8sFTZuaJbNq1IATJwKBT1izJpbsbPe+VlHq399MS7jkErjpJttpRDxD8+bmeutWOHzYbhaRMylUuf3xxx955plnCPrbApc1atRgz549bgkGMHz4cMaOHctbb71FfHw8w4cP55VXXuHNN9/Me8wrr7zC6NGjGTduHEuXLiUsLIwuXbqQkZHhthwivsBxYOZMs35tQIA5wlq9etG9XkSEKc/16q0HYPv26kyaZFZb8HRffgkzZpj/n955x3eXOBM5V+XLm58bjmN2LRPxRIUqtzk5OWSf5hDM7t27KVPGffPrfv75Z6677jq6detGjRo1uPHGG+ncuTO//vorYI7ajho1imeeeYbrrruOxo0b8+GHH7J3716++OILt+UQ8QULFpjpAi4X3Hhj0RbbXH5+0LDhGuAaAgOz2LUL3nsPEhOL/rUL6+hRePhhM378cbOOr4iclHv0dtUq82mQiKcpVLnt3Lkzo0aNyvva5XKRmprKc88959YteS+55BLmzZvHli1bAFizZg2LFy/mqquuAmDHjh0kJibSqVOnvO+JiIigdevWLFmy5IzPm5mZyZEjR/JdRHzZ1q3w449mfO21NubKfUP79r9QvrxZG/eDD06ezOZpnn3WzLetVevkSgkiclKDBhAaav4ub3fffg4iblOocjtixAh++uknLrzwQjIyMrj99tvzpiQMHz7cbeGefPJJbr31VmJjYwkMDCQuLo6BAwfSs2dPABL/PPxTuXLlfN9XuXLlvPtOZ9iwYURERORdqlWr5rbMIp7m8GHzETuYncTi4uzkKFPmGH36mI0hsrJg2jT44Qfz8aanmDsXRo8247FjzT/gIpJfQAA0bmzGK1bYzSJyOoUqt1WrVmXNmjU89dRTPProo8TFxfHyyy+zatUqKlWq5LZwn376KZMnT2bKlCmsXLmSSZMm8dprrzFp0qTzet4hQ4Zw+PDhvMuuXbvclFjEs2RnmxPI0tMhOhq6dLGbJzQUbr/drJcJsHChKbnHj9vNBZCUZOYIOw7cf7/ZiEJETi93asKWLWYqj4gnKfQ6twEBAee5ld/ZPf7443lHbwEaNWrEzp07GTZsGL179ybqz30wk5KSiI6Ozvu+pKQkmjZtesbnDQ4OJljr+kgJsHCh+Yg9JMSc8R9Q6L/x7uPnZ0p2pUrw9dcQHw8pKXDrrWbLXxtycuDOO03BbdgQXn/dTg4Rb1GxotnwJSHBzL297DLbiUROKtQ/dR9++OE/3n/nnXcWKszfHTt2DL+/bYHi7+9Pzp8z2GvWrElUVBTz5s3LK7NHjhxh6dKlPPjgg27JIOKtEhPhp5/M+JprPG93rbg4c+b1p5+aUvnee3DLLQXfIc2dhg+H774zR5Y/+UTTEUQKolkzU25XroRLL9WqIuI5ClVuBwwYkO/rrKwsjh07RlBQEKVKlXJbub322mt58cUXiYmJ4aKLLmLVqlWMHDmSe+65BzAnsg0cOJAXXniBunXrUrNmTZ599lmqVKnC9ddf75YMIt4oJ8cs+5WTY07+uOgi24lOLyYG+vaFqVNNGZ80Cbp1M/9oFpePP4annjLj0aPhwguL77VFvNmFF8KsWWZe/44d5iRMEU9QqHJ78ODBU27bunUrDz74II8//vh5h8r15ptv8uyzz/LQQw+xf/9+qlSpwv3338/QoUPzHvPEE0+QlpbGfffdx6FDh2jXrh2zZ88mJCTEbTlEvM2SJWbb2JAQcOMCJkUiIgLuvtusLbtxI3z1Fezfb+a8FvXe9b/+Wob+/c24f3/o06doX0/ElwQGmmk8K1aYZQZVbsVTuO2fjrp16/Lyyy+fclT3fJQpU4ZRo0axc+dO0tPT2b59Oy+88EK+zSNcLhfPP/88iYmJZGRk8P3331OvXj23ZRDxNkeOBPHDD2bcpQuULm01ToEEBZm1d9u3N18vXQoffVTUJ6o047HHapGVZeYjv/66PlYVOVe5p7ds3AiZmVajiORx6+klAQEB7N27151PKSLn6JdfqnLiBNSs6f6tdYuSywWXX25ONJsxw3zMOXasWZe3QQP3vlZCQjjwA2lp/jRvfpRHH93G6tX21ySLj4+3HUHknFxwgZk7/8cfpuDaWmpQ5K8KVW5nzpyZ72vHcdi3bx9vvfUWbdu2dUswESmM9vz+eyQuF3Tt6p1HIhs0MGdiT59uplZ8+ik0agRXXgnu2ABxxQqYM6cW5oOreaxYcQOXXOJZG7mkpmptJfEOLpc5ejtvHqxerXIrnqFQ5fbvJ2u5XC4qVqzIFVdcwYgRI9yRS0TOkdkRexRgNmtw45LTxa5CBTP/9YcfYPFiWLcONm820xZatQJ//3N/ztRUmDMH1q8HU2wncvnl6dSvv8Ct2c/H1q3fsmDBs2RkZNiOIlJgjRvD/Plm5YSUFChXznYiKekKVW5ztJm0iMf58svyQHWCgk7Qvr0HLGh7nvz9oWNHiI01Z2Tv2WOW61qyxBTc5s0LtmTX8eNmHc4FC8ycQJcLYmPXEB9/N+XLzyY6uhiXZjiL5GRNSxDvEx5uTibbvt2cWNahg+1EUtJ5/7+AIsLRozB2bBUAmjffR6lSvrOl9AUXmKO4q1ebo0NHj5qPQBctMv+g1q4N1aubKQshIWb5s0OHIDkZNm0y8wBzd0CrUsUsNfbHH+vR9FYR92na9GS5bd/eO6dEie8oVLkdNGhQgR87cuTIwryEiJyD0aMhJSUQ2MJFF6UCvlNuwfxDGRdn5t6uX2+O3u7fb6YqbN6c/3FgttD9q7JloU0bc7TXz8+c/CIi7lO/PgQHmzVvf//dnNAqYkuhyu2qVatYtWoVWVlZ1K9fH4AtW7bg7+9Ps7+svu7Sr24iRe7QIXjttdyvnsPPz31rTXuagABzhKhJE7Ppw7Zt5mhRYqKZcpBbagMDTaGtWtU8tlo1HUkSKUqBgWazmJUrzdFblVuxqVDl9tprr6VMmTJMmjSJsn/u6Xnw4EHuvvtuLr30UgYPHuzWkCJyZiNHmoJbu3Y627d/Avhuuc3lckF0tLlceqm5LTsbjh0z94WFqcyKFLemTU253bgRrrrKHMkVsaFQmziMGDGCYcOG5RVbgLJly/LCCy9otQSRYpScDKNGmfH99+8D7K/Vaou/v5l3W7q0iq2IDVWrmjVvs7JMwRWxpVDl9siRIxw4cOCU2w8cOMDRot1SSET+4tVXzQlWcXHQocMh23FEpARzuU5uHLNmjd0sUrIVqtx2796du+++m+nTp7N79252797N559/Tp8+fbjhhhvcnVFETuOPP+Ctt8z4+efNiVIiIjblltudO+HgQbtZpOQq1D+H48aN46qrruL222+nevXqVK9endtvv52uXbsyZswYd2cUkdN4800zxzQuzixvJSJiW+6at2CW7xOxoVDltlSpUowZM4Y//vgjb+WElJQUxowZQ1hYmLszisjfpKaacgvw5JOaYyoinqNpU3O9bt2py/KJFIfz+iBz37597Nu3j7p16xIWFoaj/4pFisX775ttLuvUgR49bKcRETmpfn2zNNjBg7B7t+00UhIVqtz+8ccfdOzYkXr16nH11Vezb98+APr06aNlwESK2PHjkLsoyRNPmFUCREQ8RVAQNGhgxmvX2s0iJVOhyu2jjz5KYGAgCQkJlCpVKu/2W265hdmzZ7stnIicavJkczQkOhruvNN2GhGRUzVubK43bDBrUIsUp0Jt4vDdd98xZ84cqlatmu/2unXrsnPnTrcEE5FTOc7J3cgGDtQi6SLimWrWNJuppKWZXQTr1bOdSEqSQh25TUtLy3fENldKSgrB+tdWpMjMnWsWRy9dGu6/33YaEZHT8/ODhg3NWFMTpLgVqtxeeumlfPjhh3lfu1wucnJyeOWVV+jQoYPbwolIfrm7kd1zD0REWI0iIvKPcqcmbN4MmZl2s0jJUqhpCa+88godO3Zk+fLlHD9+nCeeeIINGzaQkpLCTz/95O6MIgJs2gSzZpllvx55xHYaEZF/Fh1ttuP94w+Ijz+5RJhIUSvUkduGDRuyZcsW2rVrx3XXXUdaWho33HADq1atonbt2u7OKCLA6NHm+tprzRJgIiKezOU6efR23Tq7WaRkOecjt1lZWXTt2pVx48bx9NNPF0UmEfmblBSYNMmMH33UbhYRkYJq1AgWLIAdO+DoUShTxnYiKQnO+chtYGAgazU7XKRYvf++2Wq3SRO4/HLbaURECqZsWahWzaz0sn697TRSUhRqWkKvXr0YP368u7OIyGlkZ8PYsWbcv7+22hUR79KokbnWcTEpLoU6oezEiRN88MEHfP/99zRv3pywsLB8948cOdIt4UQEZs+G3383R0BuvdV2GhGRc3PRRebnWGIiHDgAFSvaTiS+7pzK7W+//UaNGjVYv349zZo1A2DLli35HuPSYSURt8o9anv33XCa5aVFRDxaqVLmJNgtW8zR244dbScSX3dO5bZu3brs27ePBQsWAGa73dGjR1O5cuUiCSdS0u3YAd9+a8YPPGA3i4hIYTVqZMrt+vVwxRWaXiVF65zm3DqOk+/rWbNmkZaW5tZAInLSO++YEzGuvBLq1rWdRkSkcOrXh6AgOHQIEhJspxFfV6gTynL9veyKiPtkZkLueZsPPWQ3i4jI+QgMhAYNzFirJkhRO6dy63K5TplTqzm2IkXjs88gORmqVoVrrrGdRkTk/OSumrBhg1kFRqSonNOcW8dxuOuuuwgODgYgIyODBx544JTVEqZPn+6+hCIl1Lvvmuu+fSGgUOuaiIh4jpo1ISwM0tLgt9+gdGnbicRXndM/mb179873da9evdwaRkSMzZth0SLw84N77rGdRkTk/Pn5mWXBfv3VTE24+GLbicRXnVO5nTBhQlHlEJG/eP99c3311WZagoiIL2jY0JTb+Hho0ULTGqVonNcJZSLifsePw6RJZty3r90sIiLuVLUqREZCVhbs3BlpO474KJVbEQ/z5ZdmF58qVcyRWxERX+FymaO3ANu2lbUbRnyWyq2Ih3nvPXN99906kUxEfE/uqgm7doUDkTajiI9SuRXxIL//DnPnmnGfPlajiIgUiUqVzCUnxw/oYTuO+CCVWxEPkjvXtlMns2yOiIgvyj16C7fZjCE+SuVWxEPk5Jwst3fdZTWKiEiRyp13Cx04cCDQZhTxQSq3Ih5i8WLYsQPKlIHu3W2nEREpOpGRULlyKuDHd9/pxDJxL5VbEQ+Re9T25puhVCm7WUREilqdOikAzJmjcivupXIr4gHS0mDaNDP+20aAIiI+qVatQ8AJNmwIY+tW22nEl6jciniAGTPg6FGoVQvatbOdRkSk6IWGngC+B+Djj+1mEd+iciviAXKnJPTubRY5FxEpGaaY/50CjmM5ivgMlVsRy3btgnnzzPjOO+1mEREpXl8QHJzD5s2werXtLOIrVG5FLPvf/8wRi/btoUYN22lERIrTUdq1OwyYo7ci7qByK2KR4+SfkiAiUtJ07WpWTZg61az3LXK+PL7c7tmzh169elG+fHlCQ0Np1KgRy5cvz7vfcRyGDh1KdHQ0oaGhdOrUia067VK8xC+/wJYtEBYGN95oO42ISPFr2/YI4eGwe7dZ71vkfHl0uT148CBt27YlMDCQWbNmsXHjRkaMGEHZsifXxHvllVcYPXo048aNY+nSpYSFhdGlSxcyMjIsJhcpmNyjtj16QOnSdrOIiNgQHOzQo4cZa2qCuINHl9vhw4dTrVo1JkyYQKtWrahZsyadO3emdu3agDlqO2rUKJ555hmuu+46GjduzIcffsjevXv54osv7IYXOYuMDPMxHGhKgoiUbLffbq6nTYPjx+1mEe/n0eV25syZtGjRgptuuolKlSoRFxfHe++9l3f/jh07SExMpFOnTnm3RURE0Lp1a5YsWXLG583MzOTIkSP5LiLF7csv4fBhiIkxJ5OJiJRUHTpA5cqQkgJz59pOI97Oo8vtb7/9xtixY6lbty5z5szhwQcfpH///kz687PcxMREACpXrpzv+ypXrpx33+kMGzaMiIiIvEu1atWK7g8hcga5UxLuvBP8PPpvoohI0fL3h1tuMWNNTZDz5dH/pObk5NCsWTNeeukl4uLiuO++++jbty/jxo07r+cdMmQIhw8fzrvs2rXLTYlFCmbfPpgzx4y1tq2IyMmpCV9+abYkFyksjy630dHRXHjhhflua9CgAQkJCQBERUUBkJSUlO8xSUlJefedTnBwMOHh4fkuIsXpo4/Mkjdt20LdurbTiIjY16qV2YI8LQ2++sp2GvFmHl1u27Zty+bNm/PdtmXLFqpXrw5AzZo1iYqKYl7u9k7AkSNHWLp0KW3atCnWrCIFpbVtRURO5XLBbbeZsaYmyPnw6HL76KOP8ssvv/DSSy+xbds2pkyZwrvvvku/fv0AcLlcDBw4kBdeeIGZM2eybt067rzzTqpUqcL1119vN7zIGaxcCRs2QEgI3Hyz7TQiIp4jd2rC7Nnm5DKRwvDoctuyZUtmzJjBxx9/TMOGDfnvf//LqFGj6NmzZ95jnnjiCR555BHuu+8+WrZsSWpqKrNnzyYkJMRicpEzmzjRXHfvDhERVqOIiHiUCy+Exo0hKws+/9x2GvFWAbYDnM0111zDNddcc8b7XS4Xzz//PM8//3wxphIpnMzMkx+3aUqCiMipbr8d1q41Pyv79rWdRryRRx+5FfE133xjPmqrUgX+sjyziIj86dZbzfXChbBnj90s4p08/sitiKdKSEggOTn5nL5n9OhaQCRXXpnImjV73ZonPj7erc8nImJD9epmJZmffoJPPoFBg2wnEm+jcitSCAkJCcTGNiA9/dg5fFdFwByGmDSpA5MmbSqSbKmpR4vkeUVEisvtt5tyO2WKyq2cO5VbkUJITk4mPf0Y3bt/RMWKDQr0PevWVWTJkkAqVkyje/fJbs+0deu3LFjwLBkZGW5/bhGR4nTTTdC/P6xYAVu2QL16thOJN1G5FTkPFSs2IDq6WYEeO3OmuW7ZMqzA33MukpM1LUFEfEPFinDllWZJsI8/huees51IvIlOKBMpBomJ5uLvDw0b2k4jIuL5cte8nTLFbH4jUlAqtyLFYM0ac12/PoSG2s0iIuINrr/ebHazZQusWmU7jXgTlVuRIpadDevWmXGTJnaziIh4izJl4NprzVjb8cq5ULkVKWLbtkFaGoSFQe3attOIiHiP3KkJU6dCTo7dLOI9VG5FiljulIRGjcycWxERKZirrjLblO/ZAz/+aDuNeAuVW5EidOyYmS8G0LSp1SgiIl4nOBh69DBjTU2QglK5FSlC69ebObdRUVC5su00IiLeJ3dqwrRpcPy43SziHVRuRYpQ7pQEnUgmIlI47dubAwQHD8J339lOI95A5VakiBw4AHv3gp+fmW8rIiLnzt8fbrnFjDU1QQpC5VakiKxeba7r1jUrJYiISOHkTk348kuz+ozIP1G5FSkCOTla21ZExF1atjRLKR47dnIrc5EzUbkVKQK//QZHj5rdyOrVs51GRMS7uVxw221mrKkJcjYqtyJFIHdKgta2FRFxj9ypCbNnwx9/2M0ink3lVsTN0tNh0yYz1tq2IiLu0aCB+Zl64gR8/rntNOLJVG5F3GzdupNr20ZH204jIuI7NDVBCkLlVsTNcqck6KitiIh73XqruV60CHbvtptFPJfKrYgbJSXBvn1a21ZEpCjExMCll4LjwCef2E4jnkrlVsSNVq0y17GxUKqU3SwiIr5IUxPkbFRuRdwkO/vk2raakiAiUjRuugkCAmDlSti82XYa8UQqtyJusmWLWWC8dGmz2LiIiLhfhQrQubMZf/yx3SzimVRuRdwk90SyJk3MnFsRESkaf52a4Dh2s4jn0T/BIm5w9Chs3WrGcXF2s4iI+LrrrjM7QG7dCitW2E4jnkblVsQN1q41Rw+qVYPy5W2nERHxbWXKwL/+ZcaamiB/p3Ircp4c5+QqCTqRTESkeOROTZg61ZzQK5JL5VbkPO3ebfY5DwyEiy6ynUZEpGTo2hUiI2HvXrOpg0gulVuR85R7ItmFF0JwsNUoIiIlRnAw3HijGWtqgvyVyq3IecjK8mP9ejPWlAQRkeKVOzXhs88gM9NuFvEcKrci52H79rIcPw5ly0L16rbTiIiULJdfDtHRcPAgzJljO414CpVbkfMQH18BgObNweWyHEZEpITx94dbbzVjTU2QXCq3IoUWx4EDYfj7a0qCiIgtuVMTvvzSrDkuonIrUmj3A9CgAYSFWY4iIlJCtWgB9epBerqZeyuicitSCKmpfkBPwExJEBERO1wu6N3bjCdNsptFPIPKrUghzJ5dDihNZGSGTiQTEbHsjjtMyV24EHbssJ1GbFO5FTlHjgOff25OJGvQ4IBOJBMRsaxaNbjiCjP+3//sZhH7VG5FztGvv8KWLaWAdOrWTbEdR0REODk14cMPzUEIKblUbkXO0bhxuaNPCQnRhuYiIp7ghhugdGnYvh1++sl2GrFJ5VbkHBw8CJ98kvvVuH96qIiIFKOwMLjpJjOeONFqFLFM5VbkHPzvf2a5mTp10oFfbMcREZG/yJ2a8OmncOyY3Sxij8qtSAE5zskpCT16HLAbRkRETnHppVCjhtnM4YsvbKcRW1RuRQpo8WKIj4dSpeCqq3QimYiIp/HzgzvvNGOteVtyqdyKFFDuUdvbb4cyZXLshhERkdPKLbfffw979tjNInao3IoUwL59MG2aGT/wgN0sIiJyZrVrm+kJOTnw0Ue204gNXlVuX375ZVwuFwMHDsy7LSMjg379+lG+fHlKly5Njx49SEpKshdSfNK4cZCVBW3bartdERFP99fteLXmbcnjNeV22bJlvPPOOzRu3Djf7Y8++ihfffUV06ZNY+HChezdu5cbbrjBUkrxRZmZJ6ck9O9vN4uIiJzdTTdBaKg5T2LZMttppLh5RblNTU2lZ8+evPfee5QtWzbv9sOHDzN+/HhGjhzJFVdcQfPmzZkwYQI///wzv/yiZZrEPT75BPbvh6pVoXt322lERORswsNP/rzWiWUlj1eU2379+tGtWzc6deqU7/YVK1aQlZWV7/bY2FhiYmJYsmTJGZ8vMzOTI0eO5LuInI7jwOjRZvzQQxAYaDePiIgUzF13mespU8z65FJyeHy5nTp1KitXrmTYsGGn3JeYmEhQUBCRkZH5bq9cuTKJiYlnfM5hw4YRERGRd6lWrZq7Y4uP+PlnWLECQkKgb1/baUREpKA6doTq1eHQIZg+3XYaKU4eXW537drFgAEDmDx5MiEhIW573iFDhnD48OG8y65du9z23OJbXn/dXN9+O1SoYDeLiIgUnJ8f9Oljxu+/bzeLFC+PLrcrVqxg//79NGvWjICAAAICAli4cCGjR48mICCAypUrc/z4cQ4dOpTv+5KSkoiKijrj8wYHBxMeHp7vIvJ327ef/G3/0UftZhERkXN3112m5P7wA2zdajuNFBePLrcdO3Zk3bp1rF69Ou/SokULevbsmTcODAxk3rx5ed+zefNmEhISaNOmjcXk4gtef93Mub3qKmjY0HYaERE5V9WqQdeuZvzBB3azSPEJsB3gn5QpU4aGf2sVYWFhlC9fPu/2Pn36MGjQIMqVK0d4eDiPPPIIbdq04eKLL7YRWXxEcvLJH4SPPWY3i4iIFN6998K338LEifD88zoxuCTw6HJbEK+//jp+fn706NGDzMxMunTpwpgxY2zHEi83dqw5u7ZZM+jQwXYaEREprGuugUqVIDHRlNzrrrOdSIqa15XbH374Id/XISEhvP3227z99tt2AonPSU+HN98048ceA5fLbh4RESm8wEAz9/aVV8yJZSq3vs+j59yK2DBpEhw4ADExZpcbERHxbrmrJnz7LezZYzeLFD2VW5G/yMqC4cPNePBgCPC6zzZEROTv6tWDyy6DnBwz91Z8m8qtyF98/DH8/jtUrGhOQhAREd+Q+zN9/HhTcsV3qdyK/CknB3I3whs0CEqVsptHRETcp0cPiIiAHTtgwQLbaaQoqdyK/Gn6dNi0CSIj4aGHbKcRERF3KlUKevY0Y+1Y5ttUbkUwmzW89JIZ9+8P2rRORMT35E5NmD4d/vjDbhYpOiq3IsDXX8OqVRAWZsqtiIj4nrg4s3758eNmZRzxTToXXEq8nBwYOtSMH34Yype3m0dEpCSJj48v1te76qryrFxZnTfeyOCyyzbi97fDfBUqVCAmJqZYM4l7qdxKiTdjBqxeDWXKwOOP204jIlIypKbuA1z06tWrmF85DNhDQkIELVv+G/g+372hoaXYtCleBdeLqdxKiZadDc89Z8YDB+qorYhIccnIOAQ4dOjwFnXrtinW1/7pp0w2bIAaNabRufNvebcfOBDPjBm9SE5OVrn1Yiq3UqJ9+ils2GBWSBg0yHYaEZGSp2zZOkRHNyvW17z8cvOzf+fOSEqVakZERLG+vBQxnVAmJdaJE/Cf/5jx4MGm4IqIiO+rWBFq1DAr5axYYTuNuJvKrZRYH3wAW7aYqQgDBthOIyIixallS3O9cqWZoia+Q+VWSqTU1JNzbYcONSeTiYhIyVG/PpQuDWlpUMwLNkgRU7mVEmnkSEhMhFq14IEHbKcREZHi5u8PzZub8fLldrOIe6ncSomTlASvvGLGw4ZBUJDdPCIiYkezZuBywc6dsH+/7TTiLiq3UuL83/+Zj6FatoSbbrKdRkREbAkPh9hYM162zG4WcR+VWylR1q2Dd98141deMb+xi4hIyZV7YtnatXD8uGqRL9C7KCWG45hVEbKz4YYboH1724lERMS2GjXMqjnHj8O2beVsxxE3ULmVEuPzz2HBAggJgREjbKcRERFP4HKdPHq7YUNFu2HELVRupUQ4dsxs1ADwxBPmN3URERGAJk0gMBAOHgwFrrAdR86Tyq2UCK+8AgkJUK0a/PvfttOIiIgnCQmBpk1zv9Je7N5O5VZ83pYt8PLLZjxiBJQqZTePiIh4nosvBnCAbuzYEWI5jZwPlVvxaY5jNmnIzISuXeHGG20nEhERT1SuHNSocRiAKVM099abqdyKT/vf/8xJZKGhMGaMlv4SEZEza9QoCYBvvilPcrLlMFJoKrfis5KTYdCfU6eeew5q1rSbR0REPFtUVBqwnMxMP8aNs51GCkvlVnzWo4/CH39Ao0YnS66IiMiZmE/3RgLw1ltmSpt4H5Vb8UkzZ8JHH4Gfn9mRLDDQdiIREfEO06hU6ThJSfDxx7azSGGo3IrPSUmB++8348ceyz0DVkREpCBOcOutBwAYOdKcmCzeReVWfE7//pCYCA0awP/9n+00IiLibbp3TyYsDNatg3nzbKeRc6VyKz5lxgyYPNlMR5g40SzMLSIici7Cw7O55x4zHjnSbhY5dyq34jP27IF77zXjJ56AVq3s5hEREe81YIA5wWzWLNi40XYaORcqt+ITcnKgd28z37Z5c01HEBGR81O7Nlx3nRm//rrdLHJuVG7FJ4wcaeZFlSplpiUEBdlOJCIi3u6xx8z1hx+aTwfFO6jcitdbvhyeesqMR42C+vWtxhERER/Rti20awfHj2vurTdRuRWvdugQ3HwzZGXBDTecnHMrIiLiDrkHT955x2wMJJ5P5Va8luPAPffAjh1ma93x43N3lxEREXGPrl2haVNISzO7lonnU7kVr/XGG2bpr6AgmDYNIiNtJxIREV/jcsGTT5rx6NGQmmo3j5ydyq14pR9/hMcfN+ORI80KCSIiIkXhxhuhTh2zIs8779hOI2ejciteJyEBevSAEyfg1lvhoYdsJxIREV/m73/y6O2rr8KxY3bzyD9TuRWvcuwYXH89HDgAcXGaZysiIsXjjjugRg1ISoJ337WdRv6Jyq14DceBPn1g1SqoWBG++MKsaysiIlLUgoJOrpwwfDikp9vNI2emcite49VXYepUCAiAzz6DmBjbiUREpCTp3dv825OYCO+9ZzuNnInKrXiFWbPyn6162WV284iISMnz16O3L78MGRl288jpqdyKx9uyBW67zUxLuO8+eOAB24lERKSkuvtuqFYN9u2DceNsp5HTUbkVj/bHH3DttXD4sNkG8c03dQKZiIjYExQEzzxjxi+9pHVvPZHKrXisjAyzMsKWLWaO02efmR8qIiIiNt19t1n39sABs6GQeBaVW/FIOTlma93FiyEiAr79FqKibKcSERGBwEB4/nkzfvVVs7mDeI4A2wH+ybBhw5g+fTqbNm0iNDSUSy65hOHDh1O/fv28x2RkZDB48GCmTp1KZmYmXbp0YcyYMVSuXNlicu+UkJBAcnKy7RgAjBkTzccfR+Pv7zBmzH4uukjvp4iIeI5bboFhw2DdOlNwhw2znUhyeXS5XbhwIf369aNly5acOHGCp556is6dO7Nx40bCwsIAePTRR/nmm2+YNm0aERERPPzww9xwww389NNPltN7l4SEBGJjG5Ce7gnbrtwNfABAdvbd3HvvNNq1iydGa3+JiIiH8PODF1+Ef/3LTE145BGoUsV2KgEPL7ezZ8/O9/XEiROpVKkSK1as4LLLLuPw4cOMHz+eKVOmcMUVVwAwYcIEGjRowC+//MLFF1982ufNzMwkMzMz7+sjR44U3R/CSyQnJ5Oefozu3T+iYsUG1nLs3l2GWbPq4DjQrNk+qle/khkzJpGcnKxyKyIiHuWaa+CSS+Dnn2HoUHj/fduJBDy83P7d4cOHAShXrhwAK1asICsri06dOuU9JjY2lpiYGJYsWXLGcjts2DD+7//+r+gDe6GKFRsQHd3MymsnJcG8eWbJr0aN4JproklMtFe0RURE/onLBa+9ZgruBx9A//7QuLHtVOI1J5Tl5OQwcOBA2rZtS8OGDQFITEwkKCiIyMjIfI+tXLkyiYmJZ3yuIUOGcPjw4bzLrl27ijK6FMChQzB5MmRmQvXq5mMeLfklIiKerk0buOkmc2Dm8cdtpxHwonLbr18/1q9fz9SpU8/7uYKDgwkPD893EXuOHTPF9uhRqFjRTNIP8KrPFEREpCR7+WWzVOV338HfZlSKBV5Rbh9++GG+/vprFixYQNWqVfNuj4qK4vjx4xw6dCjf45OSkojSulFeISsLPv4YkpMhPBx69oTQUNupRERECq5WLXNCGcBjj8GJE3bzlHQeXW4dx+Hhhx9mxowZzJ8/n5o1a+a7v3nz5gQGBjJv3ry82zZv3kxCQgJt2rQp7rhyjnJyzMYMu3dDSAj06mXWtBUREfE2Tz8N5crBhg0wdqztNCWbR3/4269fP6ZMmcKXX35JmTJl8ubRRkREEBoaSkREBH369GHQoEGUK1eO8PBwHnnkEdq0aXPGk8nEMzgOfP212X0sIABuu81MSTiT+Pj44gtXAJ6WR0RE7Cpb1mzH+8AD8OyzcPPNoCX37fDocjv2z1992rdvn+/2CRMmcNdddwHw+uuv4+fnR48ePfJt4iCebcECWLXKnDTWo4fZXvd0UlP3AS569epVrPkKKjX1qO0IIiLiIe69F959F1auhCFDzAoKUvw8utw6jnPWx4SEhPD222/z9ttvF0MicYdly+DHH824WzeIjT3zYzMyDgEOHTq8Rd26njPVZOvWb1mw4FkyMjJsRxEREQ/h7w9vv21WUJgwAe67D/RBcvHz6HIrvic+Hr791owvvxyaNy/Y95UtW8fa+runk5ysaQkiInKqiy+Gu+825fahh+DXX7UCUHHz6BPKxLfs3Amff27GzZqZcisiIuJrXn7ZzMFdtQpef912mpJH5VaKRWKiWfIrO9tMQ+jWTZs0iIiIb6pUCUaMMOOhQ2HbNrt5ShqVWylyKSnw0Udm97GYGLjhBvDTf3kiIuLD7roLrrgCMjLg/vvNKkFSPFQxpEgdPQr/+x+kpZklUW67DQIDbacSEREpWi6XWTkhJATmzzdzcKV4qNxKkUlPN0dsDx0yc4969TJ/yUVEREqC2rXh+efNeOBA+P13m2lKDpVbKRLHj5s5tvv3Q+nScMcd5lpERKQkefRRszTY0aPQu7c590SKlsqtuF12NkybBrt2ndxWt2xZ26lERESKX0CAmZ4XFgaLFsHIkbYT+T6VW3Erx4EvvjBnhgYGwu23a/tBEREp2WrXhlGjzPjpp2H1aptpfJ/KrbiN48CsWbB+vVkN4eaboVo126lERETs69MH/vUvyMoy/z4eOWI7ke9SuRW3WbjQbK0LcP31UKeO1TgiIiIew+WC8eOhalXYuhXuvVfLgxUVlVtxi19+MeUW4OqroVEju3lEREQ8TYUK8OmnZh7utGnw1lu2E/kmlVs5b8uXw5w5Zty+PbRsaTWOiIiIx2rTBl57zYwHD4affrKbxxep3Mp5WbMGvvnGjNu2hcsus5tHRETE0/XvDzfdZObfdu8OO3bYTuRbVG6l0DZsgC+/NONWraBjRzOnSERERM7M5TI7lsXFwYEDcM01cPiw7VS+Q+VWCmXzZpg+3UyGj4uDrl1VbEVERAoqLAy++gqqVIGNG+HWW82RXDl/KrdyzrZtMxPhc3LMiWPXXKNiKyIicq4uuABmzoTQUJg9G+66y/zbKudH5VbOybZt8MknZheyBg3Mkl9++q9IRESkUJo3NweMAgJgyhTo109LhJ2vANsBxHts2gSffWaKbb160KOHiq2IiPie+Pj4Yn296Gj473/L8tRTNRg3zkVaWhIDBuzJ96lohQoViImJKdZc3krlVgpkwwYzxzYnxxyx7dED/P1tpxIREXGf1NR9gItevXpZStAHeJ///a8y//vfJ8BAwBzGDQ0txaZN8Sq4BaByK2e1di188YX5mKRRI01FEBER35SRcQhw6NDhLerWbWMlw8aNCSxeXA3oT716Pbnssp388Uc8M2b0Ijk5WeW2AFRu5R+tXGnO5gSzKsI116jYioiIbytbtg7R0c2svHZ0NFSsaA4qbdlSHperPJdcon94z4XKrZzR0qXm7E2AFi3MtrpaFUFERKRoNW4MQUHmPJfNm+HAgfpAdduxvIbKrZzCceD77+Hnn83XF18MnTur2IqIiBSX2FizNNjUqZCSEgos4/PP1wArLSc7yVNPclO5lXyys13MmAHr1pmvr7gC2rVTsRURESluVatC374wadJhDh6syEsvXcFLLw0D/gOcsJzOc09yU7mVvyjPt9/WYd8+M6/22muhaVPbmUREREquiAi49NJZzJyZhllN4WkqVRpI+/a/ExmZaS3XgQOee5Kbyq0AsG1bCLCMffvKEBQEN90EderYTiUiIiIBAdnAvbRq1Zy1a5uyf38Yn39+Ee3amU9XA9Tm8tHpd8Jnn8Hdd9cHalKmTCb33qtiKyIi4mmqVk3igQfMv9HZ2bBwIYwbZzZZ0q5mJ6nclmDHj8OAAeYo7bFj/sACunffRMWKtpOJiIjI6UREwO23w403QunS8Mcf8MknMGEC7NxpO51nULktobZtg0svhdGjzde9eycCVxISkm01l4iIiPwzlwsuugj69Ts5LWHXLpg40ZTczZtL9pFczdIoYRwH3nkHBg+GY8egbFmYNAkuuGAvkyap2IqIiHiLkBDo2BFatYIffoDVqyEhwVzKl4fmzaFJEyhVynbS4qVyW4L89hs89BDMmWO+7tDB/IZXvbrZiUxERES8T5kyZoWj9u3hl19g+XIzXeG772DePKhfHy68EOrWNZtD+DqV2xIgMxNeew1eeAEyMsxvei+/DI88oq10RUREfEWZMnDllXDZZWa9+hUrIDERNm40l8BAU3B9veiq3PowxzErITz1lJljC2ZThjFjzG9xIiIi4nuCg6FFCzMtITER1q835fbQoZNFNyAAatSAWrWgdm2oWNF3NmxSufVBjgNz58Izz8CyZea2ypVh5Ei47Tbf+Y9XREREzszlguhoc+nUyRTdDRtMuT140Bz4yj34VaaMKbm1akHNmmYlBm+lcutDsrNhxgwYNuzkHNqwMHj8cRg0yPyHKyIiIiXPX4tux45w4ABs324uO3fC0aPmhLTVq83jK1QwR3ZzL2Fh1qKfM5VbH7B3L4wfD++9Z5YCAXNm5H33wZNPmqO2IiIiImCKbqVK5tKmDWRlmRUWtm+HHTvMEd7kZHNZvtx8T8WK+cuuJ1O59VIHD5qjtFOnmjMhc3LM7eXLm3XvHnnE/NYlIiIi8k8CA82UhNq1zdfp6eZo7u+/m0tSkjnSe+DAyemO5crFAqNYsaI0zZpZCn4GKreWJCQkkJycXODHOw789lsIP/8czo8/RrB6dWmys09Onm3aNJUbbzzAFVccIjjYyVvnrqDi4+PPJb6IiIj4qNBQiI01FzDr4u/caY7q/v67KbkpKaWAAfz4YxJ9+9pMeyqVWwsSEhKIjW1Aevqxf3hUGSAOaA60AS4HKv3tMeuBj4GprF79W948mfORmnr0/J9EREREfEapUtCggbkApKXB6tW/8f33s7nssk6AZ81/VLm1IDk5mfT0Y3Tv/hEVKjQgNTWIQ4dCOHgwhOTkUhw4UIrDh4OB/Msa+PvnEB2dSkzMYWJiDhMefhzo8efl/Gzd+i0LFjxLRkbGeT+XiIiI+K6wMKhV6xDQj2bNVtiOcwqV22L2++8wfnwU8D9+/LE7hw+XIivr9I8ND4cqVcylenW44AI//P3DgXCgmltzJSdrWoKIiIh4P5XbYrZnD4wZUwXoRe6UWz8/cyJYhQoQFWXKbHS0dy27ISIiIuIJVG6L2YUXQrduf/DNN6/SuXNf6tatTdmy4O9vO5mIiIiI9/OzHaCkKVsWnn9+JzCcGjUOU6GCiq2IiIiIu6jcioiIiIjPULkVEREREZ/hM+X27bffpkaNGoSEhNC6dWt+/fVX25FEREREpJj5RLn95JNPGDRoEM899xwrV66kSZMmdOnShf3799uOJiIiIiLFyCfK7ciRI+nbty933303F154IePGjaNUqVJ88MEHtqOJiIiISDHy+qXAjh8/zooVKxgyZEjebX5+fnTq1IklS5ac9nsyMzPJzMzM+/rw4cMAHDlypGjD/ik1NRWAvXtXcPx4arG85tkcOBD/5/U6du4MtZzmJOUqOE/MBJ6ZyxMzgWfm8sRMoFznwhMzgWfm8sRM4Jm5kpM3A6bTFFd/yn0dx3H++YGOl9uzZ48DOD///HO+2x9//HGnVatWp/2e5557zgF00UUXXXTRRRdddPGyy65du/6xG3r9kdvCGDJkCIMGDcr7Oicnh5SUFMqXL4/L5bKY7PSOHDlCtWrV2LVrF+Hh4bbjiBvoPfU9ek99k95X36P31Hs5jsPRo0epUqXKPz7O68tthQoV8Pf3JykpKd/tSUlJREVFnfZ7goODCQ4OzndbZGRkUUV0m/DwcP1F9DF6T32P3lPfpPfV9+g99U4RERFnfYzXn1AWFBRE8+bNmTdvXt5tOTk5zJs3jzZt2lhMJiIiIiLFzeuP3AIMGjSI3r1706JFC1q1asWoUaNIS0vj7rvvth1NRERERIqRT5TbW265hQMHDjB06FASExNp2rQps2fPpnLlyrajuUVwcDDPPffcKVMpxHvpPfU9ek99k95X36P31Pe5HOds6ymIiIiIiHgHr59zKyIiIiKSS+VWRERERHyGyq2IiIiI+AyVWxERERHxGSq3HmLs2LE0btw4b1HpNm3aMGvWrLz7MzIy6NevH+XLl6d06dL06NHjlI0rxLO9/PLLuFwuBg4cmHeb3lfv85///AeXy5XvEhsbm3e/3lPvtGfPHnr16kX58uUJDQ2lUaNGLF++PO9+x3EYOnQo0dHRhIaG0qlTJ7Zu3WoxsZxNjRo1Tvm76nK56NevH6C/q75M5dZDVK1alZdffpkVK1awfPlyrrjiCq677jo2bNgAwKOPPspXX33FtGnTWLhwIXv37uWGG26wnFoKatmyZbzzzjs0btw43+16X73TRRddxL59+/IuixcvzrtP76n3OXjwIG3btiUwMJBZs2axceNGRowYQdmyZfMe88orrzB69GjGjRvH0qVLCQsLo0uXLmRkZFhMLv9k2bJl+f6ezp07F4CbbroJ0N9Vn+aIxypbtqzz/vvvO4cOHXICAwOdadOm5d0XHx/vAM6SJUssJpSCOHr0qFO3bl1n7ty5zuWXX+4MGDDAcRxH76uXeu6555wmTZqc9j69p97p3//+t9OuXbsz3p+Tk+NERUU5r776at5thw4dcoKDg52PP/64OCKKGwwYMMCpXbu2k5OTo7+rPk5Hbj1QdnY2U6dOJS0tjTZt2rBixQqysrLo1KlT3mNiY2OJiYlhyZIlFpNKQfTr149u3brle/8Ava9ebOvWrVSpUoVatWrRs2dPEhISAL2n3mrmzJm0aNGCm266iUqVKhEXF8d7772Xd/+OHTtITEzM975GRETQunVrva9e4vjx43z00Ufcc889uFwu/V31cSq3HmTdunWULl2a4OBgHnjgAWbMmMGFF15IYmIiQUFBREZG5nt85cqVSUxMtBNWCmTq1KmsXLmSYcOGnXKf3lfv1Lp1ayZOnMjs2bMZO3YsO3bs4NJLL+Xo0aN6T73Ub7/9xtixY6lbty5z5szhwQcfpH///kyaNAkg7737+66Xel+9xxdffMGhQ4e46667AP389XU+sf2ur6hfvz6rV6/m8OHDfPbZZ/Tu3ZuFCxfajiWFtGvXLgYMGMDcuXMJCQmxHUfc5KqrrsobN27cmNatW1O9enU+/fRTQkNDLSaTwsrJyaFFixa89NJLAMTFxbF+/XrGjRtH7969LacTdxg/fjxXXXUVVapUsR1FioGO3HqQoKAg6tSpQ/PmzRk2bBhNmjThjTfeICoqiuPHj3Po0KF8j09KSiIqKspOWDmrFStWsH//fpo1a0ZAQAABAQEsXLiQ0aNHExAQQOXKlfW++oDIyEjq1avHtm3b9HfVS0VHR3PhhRfmu61BgwZ5001y37u/n0mv99U77Ny5k++//55777037zb9XfVtKrceLCcnh8zMTJo3b05gYCDz5s3Lu2/z5s0kJCTQpk0biwnln3Ts2JF169axevXqvEuLFi3o2bNn3ljvq/dLTU1l+/btREdH6++ql2rbti2bN2/Od9uWLVuoXr06ADVr1iQqKirf+3rkyBGWLl2q99ULTJgwgUqVKtGtW7e82/R31cfZPqNNjCeffNJZuHChs2PHDmft2rXOk08+6bhcLue7775zHMdxHnjgAScmJsaZP3++s3z5cqdNmzZOmzZtLKeWc/XX1RIcR++rNxo8eLDzww8/ODt27HB++uknp1OnTk6FChWc/fv3O46j99Qb/frrr05AQIDz4osvOlu3bnUmT57slCpVyvnoo4/yHvPyyy87kZGRzpdffumsXbvWue6665yaNWs66enpFpPL2WRnZzsxMTHOv//971Pu099V36Vy6yHuuecep3r16k5QUJBTsWJFp2PHjnnF1nEcJz093XnooYecsmXLOqVKlXK6d+/u7Nu3z2JiKYy/l1u9r97nlltucaKjo52goCDnggsucG655RZn27ZteffrPfVOX331ldOwYUMnODjYiY2Ndd5999189+fk5DjPPvusU7lyZSc4ONjp2LGjs3nzZktppaDmzJnjAKd9r/R31Xe5HMdxbB89FhERERFxB825FRERERGfoXIrIiIiIj5D5VZEREREfIbKrYiIiIj4DJVbEREREfEZKrciIiIi4jNUbkVERETEZ6jcioiIiIjPULkVEREREZ+hcisi4kWWLFmCv78/3bp1sx1FRMQjaftdEREvcu+991K6dGnGjx/P5s2bqVKliu1IIiIeRUduRUS8RGpqKp988gkPPvgg3bp1Y+LEifnunzlzJnXr1iUkJIQOHTowadIkXC4Xhw4dynvM4sWLufTSSwkNDaVatWr079+ftLS04v2DiIgUIZVbEREv8emnnxIbG0v9+vXp1asXH3zwAbkfvu3YsYMbb7yR66+/njVr1nD//ffz9NNP5/v+7du307VrV3r06MHatWv55JNPWLx4MQ8//LCNP46ISJHQtAQRES/Rtm1bbr75ZgYMGMCJEyeIjo5m2rRptG/fnieffJJvvvmGdevW5T3+mWee4cUXX+TgwYNERkZy77334u/vzzvvvJP3mMWLF3P55ZeTlpZGSEiIjT+WiIhb6citiIgX2Lx5M7/++iu33XYbAAEBAdxyyy2MHz8+7/6WLVvm+55WrVrl+3rNmjVMnDiR0qVL5126dOlCTk4OO3bsKJ4/iIhIEQuwHUBERM5u/PjxnDhxIt8JZI7jEBwczFtvvVWg50hNTeX++++nf//+p9wXExPjtqwiIjap3IqIeLgTJ07w4YcfMmLECDp37pzvvuuvv56PP/6Y+vXr8+233+a7b9myZfm+btasGRs3bqROnTpFnllExBbNuRUR8XBffPEFt9xyC/v37yciIiLfff/+97+ZP38+n376KfXr1+fRRx+lT58+rF69msGDB7N7924OHTpEREQEa9eu5eKLL+aee+7h3nvvJSwsjI0bNzJ37twCH/0VEfF0mnMrIuLhxo8fT6dOnU4ptgA9evRg+fLlHD16lM8++4zp06fTuHFjxo4dm7daQnBwMACNGzdm4cKFbNmyhUsvvZS4uDiGDh2qtXJFxKfoyK2IiI968cUXGTduHLt27bIdRUSk2GjOrYiIjxgzZgwtW7akfPny/PTTT7z66qtaw1ZEShyVWxERH7F161ZeeOEFUlJSiImJYfDgwQwZMsR2LBGRYqVpCSIiIiLiM3RCmYiIiIj4DJVbEREREfEZKrciIiIi4jNUbkVERETEZ6jcioiIiIjPULkVEREREZ+hcisiIiIiPkPlVkRERER8xv8D2N2vwgh0dOYAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 800x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "# Generate the distribution plot for the 'age' column in the dataset\n",
    "plt.figure(figsize=(8, 6))\n",
    "sns.histplot(data['age'], bins=15, kde=True, color='blue')\n",
    "plt.title('Age Distribution')\n",
    "plt.xlabel('Age')\n",
    "plt.ylabel('Frequency')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1fe97be8-c0fc-44ef-b0a7-5d4e2086bfa8",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
