{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python","pygments_lexer":"ipython3"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":12722030,"sourceType":"datasetVersion","datasetId":8040994,"isSourceIdPinned":false}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":5,"nbformat":4,"cells":[{"id":"bf7066e9-ded1-40c4-8f44-b721610660be","cell_type":"markdown","source":"# Modelo A (Transfer Learning) — MobileNetV2 · 2025-08-11\n","metadata":{}},{"id":"73d02207-2b34-4f11-a708-ef1e064e7d40","cell_type":"code","source":"# 1) Imports y setup\nimport os, random, math, gc, cv2, numpy as np, pandas as pd\nfrom glob import glob\nfrom collections import Counter\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers as L\nfrom sklearn.model_selection import StratifiedKFold\nfrom sklearn.metrics import classification_report, confusion_matrix, accuracy_score\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport kagglehub\n\nSEED = 42\nrandom.seed(SEED); np.random.seed(SEED); tf.random.set_seed(SEED)\n\nprint(tf.__version__)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T20:02:48.429524Z","iopub.execute_input":"2025-08-11T20:02:48.430166Z","iopub.status.idle":"2025-08-11T20:02:48.446868Z","shell.execute_reply.started":"2025-08-11T20:02:48.430139Z","shell.execute_reply":"2025-08-11T20:02:48.44617Z"},"jupyter":{"source_hidden":true}},"outputs":[{"name":"stdout","text":"2.18.0\n","output_type":"stream"}],"execution_count":7},{"id":"2228798a-12c4-4c55-ab9c-23567a788289","cell_type":"code","source":"# 2) Cargar dataset desde KaggleHub\npath = kagglehub.dataset_download(\"rodrigoscm/fotos-modelo-rscm\")\nprint(\"Dataset path:\", path)\n\nDATA_DIR = os.path.join(path, \"Fotos Grupo\")\nclasses = sorted([d for d in os.listdir(DATA_DIR) if os.path.isdir(os.path.join(DATA_DIR,d))])\nprint(\"Clases:\", classes)\nassert len(classes) == 10, \"Se esperan 10 clases (10 personas).\"\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T20:02:48.448672Z","iopub.execute_input":"2025-08-11T20:02:48.449038Z","iopub.status.idle":"2025-08-11T20:02:49.340106Z","shell.execute_reply.started":"2025-08-11T20:02:48.449008Z","shell.execute_reply":"2025-08-11T20:02:49.33941Z"}},"outputs":[{"name":"stdout","text":"Dataset path: /kaggle/input/fotos-modelo-rscm\nClases: ['Amaury', 'Arnold', 'DiegoFlores', 'DiegoVillarreal', 'Edgar', 'Gustavo', 'Humberto', 'Javi', 'Julio', 'Rodrigo']\n","output_type":"stream"}],"execution_count":8},{"id":"521930c1-6dae-45a4-b8fa-be0c7e8246c5","cell_type":"code","source":"# 3) Utilidades: cargar imágenes y etiquetas\nIMG_SIZE = (224, 224)\ndef load_data(data_dir):\n    X, y = [], []\n    for label in os.listdir(data_dir):\n        p = os.path.join(data_dir, label)\n        if not os.path.isdir(p): continue\n        for img_name in os.listdir(p):\n            f = os.path.join(p, img_name)\n            img = cv2.imread(f)\n            if img is None: \n                continue\n            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n            img = cv2.resize(img, IMG_SIZE)\n            X.append(img)\n            y.append(label)\n    X = np.array(X, dtype=np.uint8)\n    y = np.array(y)\n    return X, y\n\nX, y = load_data(DATA_DIR)\nprint(\"X shape:\", X.shape, \"y shape:\", y.shape)\nprint(\"Recuento por clase:\", Counter(y))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T20:02:49.340958Z","iopub.execute_input":"2025-08-11T20:02:49.341251Z","iopub.status.idle":"2025-08-11T20:03:21.024845Z","shell.execute_reply.started":"2025-08-11T20:02:49.341224Z","shell.execute_reply":"2025-08-11T20:03:21.024075Z"}},"outputs":[{"name":"stdout","text":"X shape: (325, 224, 224, 3) y shape: (325,)\nRecuento por clase: Counter({'Edgar': 38, 'DiegoFlores': 34, 'DiegoVillarreal': 33, 'Amaury': 33, 'Javi': 32, 'Arnold': 32, 'Julio': 32, 'Gustavo': 32, 'Rodrigo': 30, 'Humberto': 29})\n","output_type":"stream"}],"execution_count":9},{"id":"06f5f5db-c659-403a-b569-13e8afd248e7","cell_type":"code","source":"# 4) Preprocesamiento y data augmentation (solo capas Keras, sin tf.*)\nfrom tensorflow import keras\nfrom tensorflow.keras import layers as L\n\ndef build_augmenter():\n    return keras.Sequential([\n        L.RandomFlip(\"horizontal\"),\n        L.RandomRotation(0.08),\n        L.RandomZoom(0.10),\n        L.RandomContrast(0.10),\n    ], name=\"augment\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T20:03:21.026678Z","iopub.execute_input":"2025-08-11T20:03:21.026873Z","iopub.status.idle":"2025-08-11T20:03:21.031059Z","shell.execute_reply.started":"2025-08-11T20:03:21.026858Z","shell.execute_reply":"2025-08-11T20:03:21.030359Z"}},"outputs":[],"execution_count":10},{"id":"1418c572-ee3c-4ac4-932c-5ed8d6a9f7e0","cell_type":"code","source":"# 5) Modelo MobileNetV2 (transfer learning) — solo capas Keras\nfrom tensorflow import keras\nfrom tensorflow.keras import layers as L\n\ndef build_model(num_classes):\n    base = keras.applications.MobileNetV2(\n        input_shape=IMG_SIZE + (3,), include_top=False, weights=\"imagenet\"\n    )\n    base.trainable = False  # etapa 1: congelado\n    \n    inputs = L.Input(shape=IMG_SIZE + (3,))\n    # Escalar a [0,1]\n    x = L.Rescaling(1./255.0)(inputs)\n    x = build_augmenter()(x)\n    # Escalar a [-1,1] (equivalente a preprocess_input de MobileNetV2)\n    x = L.Rescaling(2.0, offset=-1.0)(x)\n    \n    x = base(x, training=False)\n    x = L.GlobalAveragePooling2D()(x)\n    x = L.Dropout(0.25)(x)\n    outputs = L.Dense(num_classes, activation=\"softmax\")(x)\n    model = keras.Model(inputs, outputs)\n    model.compile(optimizer=keras.optimizers.Adam(learning_rate=3e-4),\n                  loss=\"sparse_categorical_crossentropy\",\n                  metrics=[\"accuracy\"])\n    return model, base\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T20:03:21.031909Z","iopub.execute_input":"2025-08-11T20:03:21.032161Z","iopub.status.idle":"2025-08-11T20:03:21.049051Z","shell.execute_reply.started":"2025-08-11T20:03:21.03214Z","shell.execute_reply":"2025-08-11T20:03:21.048361Z"}},"outputs":[],"execution_count":11},{"id":"d0776b32-084c-4172-9291-600a1850bc82","cell_type":"code","source":"# 6) Entrenamiento con StratifiedKFold (5 folds)\nskf = StratifiedKFold(n_splits=5, shuffle=True, random_state=SEED)\ny_enc = np.array([classes.index(c) for c in y])\n\nhistories = []\noof_preds = np.zeros((len(y_enc), len(classes)), dtype=np.float32)\noof_true = y_enc.copy()\n\nfor fold, (tr, va) in enumerate(skf.split(X, y_enc), 1):\n    print(f\"\\n===== Fold {fold} =====\")\n    X_tr, X_va = X[tr], X[va]\n    y_tr, y_va = y_enc[tr], y_enc[va]\n    \n    model, base = build_model(num_classes=len(classes))\n    \n    callbacks = [\n        keras.callbacks.EarlyStopping(patience=8, restore_best_weights=True, monitor=\"val_accuracy\"),\n        keras.callbacks.ReduceLROnPlateau(patience=4, factor=0.5, verbose=1, monitor=\"val_loss\"),\n    ]\n    \n    ds_tr = tf.data.Dataset.from_tensor_slices((X_tr, y_tr)).shuffle(1024, seed=SEED).batch(32).prefetch(tf.data.AUTOTUNE)\n    ds_va = tf.data.Dataset.from_tensor_slices((X_va, y_va)).batch(32).prefetch(tf.data.AUTOTUNE)\n\n    hist = model.fit(ds_tr, validation_data=ds_va, epochs=40, callbacks=callbacks, verbose=2)\n    histories.append(hist.history)\n    \n    # Descongelar top del backbone (fine-tune ligera)\n    base.trainable = True\n    for layer in base.layers[:-30]:\n        layer.trainable = False\n    model.compile(optimizer=keras.optimizers.Adam(1e-4),\n                  loss=\"sparse_categorical_crossentropy\", metrics=[\"accuracy\"])\n    hist2 = model.fit(ds_tr, validation_data=ds_va, epochs=15, callbacks=callbacks, verbose=2)\n    \n    # OOF preds\n    oof_preds[va] = model.predict(ds_va, verbose=0)\n    \n    # Guardar modelo por fold\n    model.save(f\"modelA_fold{fold}.keras\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T20:03:21.049557Z","iopub.execute_input":"2025-08-11T20:03:21.049714Z","iopub.status.idle":"2025-08-11T20:07:02.204019Z","shell.execute_reply.started":"2025-08-11T20:03:21.0497Z","shell.execute_reply":"2025-08-11T20:07:02.203253Z"}},"outputs":[{"name":"stdout","text":"\n===== Fold 1 =====\nEpoch 1/40\n","output_type":"stream"},{"name":"stderr","text":"I0000 00:00:1754942612.409881      99 cuda_dnn.cc:529] Loaded cuDNN version 90300\n","output_type":"stream"},{"name":"stdout","text":"9/9 - 13s - 1s/step - accuracy: 0.0808 - loss: 3.0529 - val_accuracy: 0.0923 - val_loss: 2.4386 - learning_rate: 3.0000e-04\nEpoch 2/40\n9/9 - 0s - 54ms/step - accuracy: 0.1000 - loss: 2.5096 - val_accuracy: 0.2308 - val_loss: 2.0766 - learning_rate: 3.0000e-04\nEpoch 3/40\n9/9 - 0s - 53ms/step - accuracy: 0.2115 - loss: 2.1398 - val_accuracy: 0.4154 - val_loss: 1.7927 - learning_rate: 3.0000e-04\nEpoch 4/40\n9/9 - 0s - 52ms/step - accuracy: 0.3692 - loss: 1.8117 - val_accuracy: 0.5846 - val_loss: 1.5311 - learning_rate: 3.0000e-04\nEpoch 5/40\n9/9 - 0s - 53ms/step - accuracy: 0.5192 - loss: 1.5148 - val_accuracy: 0.7231 - val_loss: 1.3114 - learning_rate: 3.0000e-04\nEpoch 6/40\n9/9 - 0s - 53ms/step - accuracy: 0.6231 - loss: 1.3012 - val_accuracy: 0.7538 - val_loss: 1.1231 - learning_rate: 3.0000e-04\nEpoch 7/40\n9/9 - 0s - 53ms/step - accuracy: 0.7308 - loss: 1.1707 - val_accuracy: 0.8769 - val_loss: 0.9543 - learning_rate: 3.0000e-04\nEpoch 8/40\n9/9 - 0s - 53ms/step - accuracy: 0.8577 - loss: 0.9154 - val_accuracy: 0.9538 - val_loss: 0.8195 - learning_rate: 3.0000e-04\nEpoch 9/40\n9/9 - 0s - 52ms/step - accuracy: 0.8462 - loss: 0.8108 - val_accuracy: 0.9692 - val_loss: 0.7037 - learning_rate: 3.0000e-04\nEpoch 10/40\n9/9 - 0s - 44ms/step - accuracy: 0.9154 - loss: 0.7192 - val_accuracy: 0.9692 - val_loss: 0.6134 - learning_rate: 3.0000e-04\nEpoch 11/40\n9/9 - 0s - 52ms/step - accuracy: 0.9231 - loss: 0.6144 - val_accuracy: 1.0000 - val_loss: 0.5362 - learning_rate: 3.0000e-04\nEpoch 12/40\n9/9 - 0s - 44ms/step - accuracy: 0.9538 - loss: 0.5020 - val_accuracy: 1.0000 - val_loss: 0.4818 - learning_rate: 3.0000e-04\nEpoch 13/40\n9/9 - 0s - 44ms/step - accuracy: 0.9538 - loss: 0.4514 - val_accuracy: 1.0000 - val_loss: 0.4386 - learning_rate: 3.0000e-04\nEpoch 14/40\n9/9 - 0s - 44ms/step - accuracy: 0.9846 - loss: 0.4089 - val_accuracy: 1.0000 - val_loss: 0.3954 - learning_rate: 3.0000e-04\nEpoch 15/40\n9/9 - 0s - 43ms/step - accuracy: 0.9885 - loss: 0.3540 - val_accuracy: 1.0000 - val_loss: 0.3523 - learning_rate: 3.0000e-04\nEpoch 16/40\n9/9 - 0s - 43ms/step - accuracy: 0.9808 - loss: 0.3516 - val_accuracy: 1.0000 - val_loss: 0.3178 - learning_rate: 3.0000e-04\nEpoch 17/40\n9/9 - 0s - 45ms/step - accuracy: 0.9846 - loss: 0.3179 - val_accuracy: 1.0000 - val_loss: 0.2943 - learning_rate: 3.0000e-04\nEpoch 18/40\n9/9 - 0s - 45ms/step - accuracy: 0.9885 - loss: 0.2678 - val_accuracy: 1.0000 - val_loss: 0.2742 - learning_rate: 3.0000e-04\nEpoch 19/40\n9/9 - 0s - 43ms/step - accuracy: 0.9885 - loss: 0.2363 - val_accuracy: 1.0000 - val_loss: 0.2555 - learning_rate: 3.0000e-04\nEpoch 1/15\n9/9 - 16s - 2s/step - accuracy: 0.9231 - loss: 0.5275 - val_accuracy: 1.0000 - val_loss: 0.1774 - learning_rate: 1.0000e-04\nEpoch 2/15\n9/9 - 0s - 55ms/step - accuracy: 0.9962 - loss: 0.0745 - val_accuracy: 1.0000 - val_loss: 0.0899 - learning_rate: 1.0000e-04\nEpoch 3/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0238 - val_accuracy: 1.0000 - val_loss: 0.0695 - learning_rate: 1.0000e-04\nEpoch 4/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0122 - val_accuracy: 1.0000 - val_loss: 0.0612 - learning_rate: 1.0000e-04\nEpoch 5/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0089 - val_accuracy: 1.0000 - val_loss: 0.0555 - learning_rate: 1.0000e-04\nEpoch 6/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0110 - val_accuracy: 1.0000 - val_loss: 0.0493 - learning_rate: 1.0000e-04\nEpoch 7/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0061 - val_accuracy: 1.0000 - val_loss: 0.0467 - learning_rate: 1.0000e-04\nEpoch 8/15\n9/9 - 1s - 56ms/step - accuracy: 1.0000 - loss: 0.0048 - val_accuracy: 1.0000 - val_loss: 0.0435 - learning_rate: 1.0000e-04\nEpoch 9/15\n9/9 - 1s - 58ms/step - accuracy: 1.0000 - loss: 0.0025 - val_accuracy: 1.0000 - val_loss: 0.0415 - learning_rate: 1.0000e-04\n\n===== Fold 2 =====\nEpoch 1/40\n9/9 - 10s - 1s/step - accuracy: 0.1000 - loss: 2.6650 - val_accuracy: 0.0769 - val_loss: 2.3113 - learning_rate: 3.0000e-04\nEpoch 2/40\n9/9 - 0s - 52ms/step - accuracy: 0.2615 - loss: 2.0474 - val_accuracy: 0.2308 - val_loss: 2.0996 - learning_rate: 3.0000e-04\nEpoch 3/40\n9/9 - 0s - 52ms/step - accuracy: 0.3923 - loss: 1.8429 - val_accuracy: 0.3385 - val_loss: 1.8065 - learning_rate: 3.0000e-04\nEpoch 4/40\n9/9 - 0s - 52ms/step - accuracy: 0.5423 - loss: 1.5171 - val_accuracy: 0.4615 - val_loss: 1.5459 - learning_rate: 3.0000e-04\nEpoch 5/40\n9/9 - 0s - 52ms/step - accuracy: 0.6538 - loss: 1.2434 - val_accuracy: 0.5538 - val_loss: 1.3408 - learning_rate: 3.0000e-04\nEpoch 6/40\n9/9 - 0s - 53ms/step - accuracy: 0.7808 - loss: 1.0713 - val_accuracy: 0.6462 - val_loss: 1.1463 - learning_rate: 3.0000e-04\nEpoch 7/40\n9/9 - 0s - 53ms/step - accuracy: 0.8538 - loss: 0.9188 - val_accuracy: 0.8000 - val_loss: 0.9889 - learning_rate: 3.0000e-04\nEpoch 8/40\n9/9 - 0s - 52ms/step - accuracy: 0.9154 - loss: 0.7252 - val_accuracy: 0.8462 - val_loss: 0.8600 - learning_rate: 3.0000e-04\nEpoch 9/40\n9/9 - 0s - 53ms/step - accuracy: 0.9385 - loss: 0.6476 - val_accuracy: 0.9077 - val_loss: 0.7733 - learning_rate: 3.0000e-04\nEpoch 10/40\n9/9 - 0s - 53ms/step - accuracy: 0.9423 - loss: 0.5278 - val_accuracy: 0.9231 - val_loss: 0.6960 - learning_rate: 3.0000e-04\nEpoch 11/40\n9/9 - 0s - 45ms/step - accuracy: 0.9615 - loss: 0.4843 - val_accuracy: 0.9231 - val_loss: 0.6230 - learning_rate: 3.0000e-04\nEpoch 12/40\n9/9 - 0s - 52ms/step - accuracy: 0.9500 - loss: 0.4328 - val_accuracy: 0.9385 - val_loss: 0.5611 - learning_rate: 3.0000e-04\nEpoch 13/40\n9/9 - 0s - 44ms/step - accuracy: 0.9769 - loss: 0.3536 - val_accuracy: 0.9385 - val_loss: 0.5175 - learning_rate: 3.0000e-04\nEpoch 14/40\n9/9 - 0s - 43ms/step - accuracy: 0.9846 - loss: 0.3534 - val_accuracy: 0.9385 - val_loss: 0.4677 - learning_rate: 3.0000e-04\nEpoch 15/40\n9/9 - 0s - 43ms/step - accuracy: 0.9962 - loss: 0.2988 - val_accuracy: 0.9385 - val_loss: 0.4252 - learning_rate: 3.0000e-04\nEpoch 16/40\n9/9 - 0s - 52ms/step - accuracy: 0.9885 - loss: 0.2697 - val_accuracy: 0.9692 - val_loss: 0.3908 - learning_rate: 3.0000e-04\nEpoch 17/40\n9/9 - 0s - 44ms/step - accuracy: 1.0000 - loss: 0.2445 - val_accuracy: 0.9692 - val_loss: 0.3662 - learning_rate: 3.0000e-04\nEpoch 18/40\n9/9 - 0s - 44ms/step - accuracy: 0.9923 - loss: 0.2465 - val_accuracy: 0.9538 - val_loss: 0.3481 - learning_rate: 3.0000e-04\nEpoch 19/40\n9/9 - 0s - 43ms/step - accuracy: 1.0000 - loss: 0.2055 - val_accuracy: 0.9692 - val_loss: 0.3278 - learning_rate: 3.0000e-04\nEpoch 20/40\n9/9 - 0s - 52ms/step - accuracy: 1.0000 - loss: 0.1792 - val_accuracy: 0.9846 - val_loss: 0.3095 - learning_rate: 3.0000e-04\nEpoch 21/40\n9/9 - 0s - 44ms/step - accuracy: 0.9923 - loss: 0.1732 - val_accuracy: 0.9846 - val_loss: 0.2926 - learning_rate: 3.0000e-04\nEpoch 22/40\n9/9 - 0s - 43ms/step - accuracy: 0.9962 - loss: 0.1782 - val_accuracy: 0.9846 - val_loss: 0.2817 - learning_rate: 3.0000e-04\nEpoch 23/40\n9/9 - 0s - 44ms/step - accuracy: 0.9885 - loss: 0.1700 - val_accuracy: 0.9846 - val_loss: 0.2691 - learning_rate: 3.0000e-04\nEpoch 24/40\n9/9 - 0s - 44ms/step - accuracy: 1.0000 - loss: 0.1340 - val_accuracy: 0.9846 - val_loss: 0.2584 - learning_rate: 3.0000e-04\nEpoch 25/40\n9/9 - 0s - 44ms/step - accuracy: 1.0000 - loss: 0.1295 - val_accuracy: 0.9846 - val_loss: 0.2485 - learning_rate: 3.0000e-04\nEpoch 26/40\n9/9 - 0s - 44ms/step - accuracy: 0.9962 - loss: 0.1367 - val_accuracy: 0.9846 - val_loss: 0.2303 - learning_rate: 3.0000e-04\nEpoch 27/40\n9/9 - 0s - 52ms/step - accuracy: 0.9962 - loss: 0.1334 - val_accuracy: 1.0000 - val_loss: 0.2138 - learning_rate: 3.0000e-04\nEpoch 28/40\n9/9 - 0s - 44ms/step - accuracy: 1.0000 - loss: 0.1087 - val_accuracy: 1.0000 - val_loss: 0.2066 - learning_rate: 3.0000e-04\nEpoch 29/40\n9/9 - 0s - 44ms/step - accuracy: 1.0000 - loss: 0.0999 - val_accuracy: 1.0000 - val_loss: 0.1968 - learning_rate: 3.0000e-04\nEpoch 30/40\n9/9 - 0s - 43ms/step - accuracy: 1.0000 - loss: 0.0988 - val_accuracy: 1.0000 - val_loss: 0.1944 - learning_rate: 3.0000e-04\nEpoch 31/40\n9/9 - 0s - 44ms/step - accuracy: 1.0000 - loss: 0.0915 - val_accuracy: 1.0000 - val_loss: 0.1928 - learning_rate: 3.0000e-04\nEpoch 32/40\n9/9 - 0s - 43ms/step - accuracy: 1.0000 - loss: 0.0915 - val_accuracy: 1.0000 - val_loss: 0.1842 - learning_rate: 3.0000e-04\nEpoch 33/40\n9/9 - 0s - 43ms/step - accuracy: 1.0000 - loss: 0.0887 - val_accuracy: 0.9846 - val_loss: 0.1781 - learning_rate: 3.0000e-04\nEpoch 34/40\n9/9 - 0s - 43ms/step - accuracy: 0.9962 - loss: 0.0860 - val_accuracy: 1.0000 - val_loss: 0.1703 - learning_rate: 3.0000e-04\nEpoch 35/40\n9/9 - 0s - 45ms/step - accuracy: 1.0000 - loss: 0.0819 - val_accuracy: 1.0000 - val_loss: 0.1618 - learning_rate: 3.0000e-04\nEpoch 1/15\n9/9 - 16s - 2s/step - accuracy: 0.9731 - loss: 0.2559 - val_accuracy: 1.0000 - val_loss: 0.0704 - learning_rate: 1.0000e-04\nEpoch 2/15\n9/9 - 0s - 55ms/step - accuracy: 0.9962 - loss: 0.0340 - val_accuracy: 1.0000 - val_loss: 0.0484 - learning_rate: 1.0000e-04\nEpoch 3/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0145 - val_accuracy: 1.0000 - val_loss: 0.0520 - learning_rate: 1.0000e-04\nEpoch 4/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0056 - val_accuracy: 1.0000 - val_loss: 0.0496 - learning_rate: 1.0000e-04\nEpoch 5/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0064 - val_accuracy: 1.0000 - val_loss: 0.0456 - learning_rate: 1.0000e-04\nEpoch 6/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0064 - val_accuracy: 1.0000 - val_loss: 0.0347 - learning_rate: 1.0000e-04\nEpoch 7/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0041 - val_accuracy: 1.0000 - val_loss: 0.0306 - learning_rate: 1.0000e-04\nEpoch 8/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0044 - val_accuracy: 1.0000 - val_loss: 0.0282 - learning_rate: 1.0000e-04\nEpoch 9/15\n9/9 - 0s - 56ms/step - accuracy: 1.0000 - loss: 0.0027 - val_accuracy: 1.0000 - val_loss: 0.0262 - learning_rate: 1.0000e-04\n\n===== Fold 3 =====\nEpoch 1/40\n9/9 - 10s - 1s/step - accuracy: 0.1462 - loss: 2.4299 - val_accuracy: 0.2615 - val_loss: 1.8753 - learning_rate: 3.0000e-04\nEpoch 2/40\n9/9 - 0s - 55ms/step - accuracy: 0.2423 - loss: 1.9994 - val_accuracy: 0.5538 - val_loss: 1.5991 - learning_rate: 3.0000e-04\nEpoch 3/40\n9/9 - 0s - 54ms/step - accuracy: 0.5038 - loss: 1.6526 - val_accuracy: 0.6615 - val_loss: 1.3693 - learning_rate: 3.0000e-04\nEpoch 4/40\n9/9 - 0s - 52ms/step - accuracy: 0.5500 - loss: 1.4254 - val_accuracy: 0.7692 - val_loss: 1.1537 - learning_rate: 3.0000e-04\nEpoch 5/40\n9/9 - 0s - 52ms/step - accuracy: 0.7423 - loss: 1.1134 - val_accuracy: 0.8308 - val_loss: 0.9827 - learning_rate: 3.0000e-04\nEpoch 6/40\n9/9 - 0s - 51ms/step - accuracy: 0.8115 - loss: 0.9381 - val_accuracy: 0.8923 - val_loss: 0.8456 - learning_rate: 3.0000e-04\nEpoch 7/40\n9/9 - 0s - 53ms/step - accuracy: 0.8808 - loss: 0.8212 - val_accuracy: 0.9385 - val_loss: 0.7275 - learning_rate: 3.0000e-04\nEpoch 8/40\n9/9 - 0s - 52ms/step - accuracy: 0.9038 - loss: 0.7040 - val_accuracy: 0.9538 - val_loss: 0.6346 - learning_rate: 3.0000e-04\nEpoch 9/40\n9/9 - 0s - 44ms/step - accuracy: 0.9346 - loss: 0.5745 - val_accuracy: 0.9538 - val_loss: 0.5632 - learning_rate: 3.0000e-04\nEpoch 10/40\n9/9 - 0s - 51ms/step - accuracy: 0.9231 - loss: 0.5325 - val_accuracy: 0.9692 - val_loss: 0.5044 - learning_rate: 3.0000e-04\nEpoch 11/40\n9/9 - 0s - 44ms/step - accuracy: 0.9538 - loss: 0.4458 - val_accuracy: 0.9692 - val_loss: 0.4529 - learning_rate: 3.0000e-04\nEpoch 12/40\n9/9 - 0s - 43ms/step - accuracy: 0.9769 - loss: 0.4031 - val_accuracy: 0.9692 - val_loss: 0.4136 - learning_rate: 3.0000e-04\nEpoch 13/40\n9/9 - 0s - 44ms/step - accuracy: 0.9731 - loss: 0.3807 - val_accuracy: 0.9538 - val_loss: 0.3844 - learning_rate: 3.0000e-04\nEpoch 14/40\n9/9 - 0s - 45ms/step - accuracy: 0.9885 - loss: 0.3320 - val_accuracy: 0.9692 - val_loss: 0.3550 - learning_rate: 3.0000e-04\nEpoch 15/40\n9/9 - 0s - 44ms/step - accuracy: 0.9846 - loss: 0.2768 - val_accuracy: 0.9692 - val_loss: 0.3243 - learning_rate: 3.0000e-04\nEpoch 16/40\n9/9 - 0s - 44ms/step - accuracy: 0.9923 - loss: 0.2748 - val_accuracy: 0.9692 - val_loss: 0.3009 - learning_rate: 3.0000e-04\nEpoch 17/40\n9/9 - 0s - 44ms/step - accuracy: 0.9808 - loss: 0.2520 - val_accuracy: 0.9692 - val_loss: 0.2803 - learning_rate: 3.0000e-04\nEpoch 18/40\n9/9 - 0s - 44ms/step - accuracy: 0.9885 - loss: 0.2013 - val_accuracy: 0.9692 - val_loss: 0.2636 - learning_rate: 3.0000e-04\nEpoch 1/15\n9/9 - 16s - 2s/step - accuracy: 0.9077 - loss: 0.5374 - val_accuracy: 0.9846 - val_loss: 0.1958 - learning_rate: 1.0000e-04\nEpoch 2/15\n9/9 - 1s - 64ms/step - accuracy: 1.0000 - loss: 0.0659 - val_accuracy: 1.0000 - val_loss: 0.1247 - learning_rate: 1.0000e-04\nEpoch 3/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0342 - val_accuracy: 1.0000 - val_loss: 0.0973 - learning_rate: 1.0000e-04\nEpoch 4/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0184 - val_accuracy: 0.9846 - val_loss: 0.0914 - learning_rate: 1.0000e-04\nEpoch 5/15\n9/9 - 0s - 56ms/step - accuracy: 1.0000 - loss: 0.0095 - val_accuracy: 0.9846 - val_loss: 0.0911 - learning_rate: 1.0000e-04\nEpoch 6/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0068 - val_accuracy: 0.9846 - val_loss: 0.0863 - learning_rate: 1.0000e-04\nEpoch 7/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0105 - val_accuracy: 0.9846 - val_loss: 0.0794 - learning_rate: 1.0000e-04\nEpoch 8/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0051 - val_accuracy: 0.9846 - val_loss: 0.0754 - learning_rate: 1.0000e-04\nEpoch 9/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0054 - val_accuracy: 0.9846 - val_loss: 0.0709 - learning_rate: 1.0000e-04\nEpoch 10/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0029 - val_accuracy: 0.9846 - val_loss: 0.0635 - learning_rate: 1.0000e-04\n\n===== Fold 4 =====\nEpoch 1/40\n9/9 - 10s - 1s/step - accuracy: 0.0692 - loss: 2.9665 - val_accuracy: 0.0308 - val_loss: 2.4190 - learning_rate: 3.0000e-04\nEpoch 2/40\n9/9 - 0s - 53ms/step - accuracy: 0.2115 - loss: 2.3465 - val_accuracy: 0.1077 - val_loss: 2.1036 - learning_rate: 3.0000e-04\nEpoch 3/40\n9/9 - 0s - 52ms/step - accuracy: 0.2769 - loss: 2.0346 - val_accuracy: 0.2923 - val_loss: 1.7928 - learning_rate: 3.0000e-04\nEpoch 4/40\n9/9 - 0s - 52ms/step - accuracy: 0.4231 - loss: 1.7140 - val_accuracy: 0.5692 - val_loss: 1.5077 - learning_rate: 3.0000e-04\nEpoch 5/40\n9/9 - 0s - 51ms/step - accuracy: 0.5462 - loss: 1.4615 - val_accuracy: 0.7538 - val_loss: 1.2778 - learning_rate: 3.0000e-04\nEpoch 6/40\n9/9 - 0s - 51ms/step - accuracy: 0.7154 - loss: 1.1879 - val_accuracy: 0.9077 - val_loss: 1.0702 - learning_rate: 3.0000e-04\nEpoch 7/40\n9/9 - 0s - 53ms/step - accuracy: 0.7923 - loss: 1.0228 - val_accuracy: 0.9538 - val_loss: 0.9082 - learning_rate: 3.0000e-04\nEpoch 8/40\n9/9 - 0s - 53ms/step - accuracy: 0.8692 - loss: 0.8155 - val_accuracy: 0.9846 - val_loss: 0.7840 - learning_rate: 3.0000e-04\nEpoch 9/40\n9/9 - 0s - 52ms/step - accuracy: 0.8846 - loss: 0.8016 - val_accuracy: 1.0000 - val_loss: 0.6751 - learning_rate: 3.0000e-04\nEpoch 10/40\n9/9 - 0s - 44ms/step - accuracy: 0.9423 - loss: 0.6326 - val_accuracy: 1.0000 - val_loss: 0.6006 - learning_rate: 3.0000e-04\nEpoch 11/40\n9/9 - 0s - 43ms/step - accuracy: 0.9577 - loss: 0.5304 - val_accuracy: 1.0000 - val_loss: 0.5353 - learning_rate: 3.0000e-04\nEpoch 12/40\n9/9 - 0s - 44ms/step - accuracy: 0.9654 - loss: 0.4609 - val_accuracy: 1.0000 - val_loss: 0.4777 - learning_rate: 3.0000e-04\nEpoch 13/40\n9/9 - 0s - 43ms/step - accuracy: 0.9615 - loss: 0.4335 - val_accuracy: 1.0000 - val_loss: 0.4287 - learning_rate: 3.0000e-04\nEpoch 14/40\n9/9 - 0s - 43ms/step - accuracy: 0.9846 - loss: 0.3756 - val_accuracy: 1.0000 - val_loss: 0.3815 - learning_rate: 3.0000e-04\nEpoch 15/40\n9/9 - 0s - 43ms/step - accuracy: 0.9808 - loss: 0.3188 - val_accuracy: 1.0000 - val_loss: 0.3393 - learning_rate: 3.0000e-04\nEpoch 16/40\n9/9 - 0s - 43ms/step - accuracy: 0.9923 - loss: 0.3073 - val_accuracy: 1.0000 - val_loss: 0.3042 - learning_rate: 3.0000e-04\nEpoch 17/40\n9/9 - 0s - 43ms/step - accuracy: 0.9962 - loss: 0.2874 - val_accuracy: 1.0000 - val_loss: 0.2785 - learning_rate: 3.0000e-04\nEpoch 1/15\n9/9 - 16s - 2s/step - accuracy: 0.8731 - loss: 0.6585 - val_accuracy: 1.0000 - val_loss: 0.2040 - learning_rate: 1.0000e-04\nEpoch 2/15\n9/9 - 0s - 55ms/step - accuracy: 0.9962 - loss: 0.0982 - val_accuracy: 1.0000 - val_loss: 0.0959 - learning_rate: 1.0000e-04\nEpoch 3/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0225 - val_accuracy: 1.0000 - val_loss: 0.0676 - learning_rate: 1.0000e-04\nEpoch 4/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0193 - val_accuracy: 1.0000 - val_loss: 0.0544 - learning_rate: 1.0000e-04\nEpoch 5/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0116 - val_accuracy: 1.0000 - val_loss: 0.0499 - learning_rate: 1.0000e-04\nEpoch 6/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0079 - val_accuracy: 1.0000 - val_loss: 0.0462 - learning_rate: 1.0000e-04\nEpoch 7/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0059 - val_accuracy: 1.0000 - val_loss: 0.0448 - learning_rate: 1.0000e-04\nEpoch 8/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0057 - val_accuracy: 1.0000 - val_loss: 0.0420 - learning_rate: 1.0000e-04\nEpoch 9/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0046 - val_accuracy: 1.0000 - val_loss: 0.0386 - learning_rate: 1.0000e-04\n\n===== Fold 5 =====\nEpoch 1/40\n9/9 - 10s - 1s/step - accuracy: 0.1962 - loss: 2.4692 - val_accuracy: 0.2462 - val_loss: 2.0732 - learning_rate: 3.0000e-04\nEpoch 2/40\n9/9 - 0s - 53ms/step - accuracy: 0.2654 - loss: 2.0441 - val_accuracy: 0.4462 - val_loss: 1.7887 - learning_rate: 3.0000e-04\nEpoch 3/40\n9/9 - 0s - 52ms/step - accuracy: 0.5115 - loss: 1.6713 - val_accuracy: 0.5846 - val_loss: 1.5263 - learning_rate: 3.0000e-04\nEpoch 4/40\n9/9 - 0s - 53ms/step - accuracy: 0.6077 - loss: 1.3901 - val_accuracy: 0.6615 - val_loss: 1.2910 - learning_rate: 3.0000e-04\nEpoch 5/40\n9/9 - 0s - 54ms/step - accuracy: 0.7154 - loss: 1.1568 - val_accuracy: 0.7846 - val_loss: 1.0850 - learning_rate: 3.0000e-04\nEpoch 6/40\n9/9 - 0s - 53ms/step - accuracy: 0.8346 - loss: 0.9710 - val_accuracy: 0.9385 - val_loss: 0.9173 - learning_rate: 3.0000e-04\nEpoch 7/40\n9/9 - 0s - 53ms/step - accuracy: 0.8923 - loss: 0.8119 - val_accuracy: 1.0000 - val_loss: 0.7742 - learning_rate: 3.0000e-04\nEpoch 8/40\n9/9 - 0s - 44ms/step - accuracy: 0.9423 - loss: 0.6462 - val_accuracy: 0.9846 - val_loss: 0.6768 - learning_rate: 3.0000e-04\nEpoch 9/40\n9/9 - 0s - 44ms/step - accuracy: 0.9577 - loss: 0.5673 - val_accuracy: 1.0000 - val_loss: 0.5956 - learning_rate: 3.0000e-04\nEpoch 10/40\n9/9 - 0s - 44ms/step - accuracy: 0.9538 - loss: 0.5151 - val_accuracy: 0.9846 - val_loss: 0.5417 - learning_rate: 3.0000e-04\nEpoch 11/40\n9/9 - 0s - 44ms/step - accuracy: 0.9692 - loss: 0.4231 - val_accuracy: 1.0000 - val_loss: 0.4724 - learning_rate: 3.0000e-04\nEpoch 12/40\n9/9 - 0s - 44ms/step - accuracy: 0.9769 - loss: 0.3727 - val_accuracy: 1.0000 - val_loss: 0.4201 - learning_rate: 3.0000e-04\nEpoch 13/40\n9/9 - 0s - 43ms/step - accuracy: 0.9923 - loss: 0.3459 - val_accuracy: 1.0000 - val_loss: 0.3817 - learning_rate: 3.0000e-04\nEpoch 14/40\n9/9 - 0s - 44ms/step - accuracy: 1.0000 - loss: 0.2729 - val_accuracy: 1.0000 - val_loss: 0.3467 - learning_rate: 3.0000e-04\nEpoch 15/40\n9/9 - 0s - 43ms/step - accuracy: 0.9885 - loss: 0.2604 - val_accuracy: 1.0000 - val_loss: 0.3154 - learning_rate: 3.0000e-04\nEpoch 1/15\n9/9 - 17s - 2s/step - accuracy: 0.8808 - loss: 0.6441 - val_accuracy: 1.0000 - val_loss: 0.2552 - learning_rate: 1.0000e-04\nEpoch 2/15\n9/9 - 0s - 55ms/step - accuracy: 0.9923 - loss: 0.0934 - val_accuracy: 0.9692 - val_loss: 0.1321 - learning_rate: 1.0000e-04\nEpoch 3/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0227 - val_accuracy: 0.9692 - val_loss: 0.1012 - learning_rate: 1.0000e-04\nEpoch 4/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0241 - val_accuracy: 0.9692 - val_loss: 0.0909 - learning_rate: 1.0000e-04\nEpoch 5/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0085 - val_accuracy: 0.9692 - val_loss: 0.0791 - learning_rate: 1.0000e-04\nEpoch 6/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0114 - val_accuracy: 1.0000 - val_loss: 0.0704 - learning_rate: 1.0000e-04\nEpoch 7/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0075 - val_accuracy: 1.0000 - val_loss: 0.0645 - learning_rate: 1.0000e-04\nEpoch 8/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0069 - val_accuracy: 1.0000 - val_loss: 0.0606 - learning_rate: 1.0000e-04\nEpoch 9/15\n9/9 - 0s - 55ms/step - accuracy: 1.0000 - loss: 0.0046 - val_accuracy: 1.0000 - val_loss: 0.0550 - learning_rate: 1.0000e-04\n","output_type":"stream"}],"execution_count":12},{"id":"4f7c615c-4ba2-46bc-9638-6eb247136157","cell_type":"code","source":"# 7) Métricas OOF y matriz de confusión\noof_labels = oof_preds.argmax(axis=1)\nacc = accuracy_score(oof_true, oof_labels)\nprint(\"OOF Accuracy:\", acc)\n\nprint(\"\\nClassification report:\")\nprint(classification_report(oof_true, oof_labels, target_names=classes))\n\ncm = confusion_matrix(oof_true, oof_labels, labels=list(range(len(classes))))\nplt.figure(figsize=(8,6))\nimport seaborn as sns\nsns.heatmap(cm, annot=True, fmt=\"d\", xticklabels=classes, yticklabels=classes)\nplt.title(f\"Modelo A — Matriz de confusión (OOF) · Acc={acc:.3f}\")\nplt.xlabel(\"Predicción\"); plt.ylabel(\"Real\")\nplt.tight_layout()\nplt.show()\n\n# Guardar predictor final (entrenado en todo el set)\nmodel_final, base_final = build_model(num_classes=len(classes))\nds_all = tf.data.Dataset.from_tensor_slices((X, y_enc)).shuffle(2048, seed=SEED).batch(32).prefetch(tf.data.AUTOTUNE)\nmodel_final.fit(ds_all, epochs=20, verbose=2)\nmodel_final.save(\"modeloA_final.keras\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T20:07:02.204889Z","iopub.execute_input":"2025-08-11T20:07:02.205077Z","iopub.status.idle":"2025-08-11T20:07:19.436994Z","shell.execute_reply.started":"2025-08-11T20:07:02.205061Z","shell.execute_reply":"2025-08-11T20:07:19.436396Z"}},"outputs":[{"name":"stdout","text":"OOF Accuracy: 1.0\n\nClassification report:\n                 precision    recall  f1-score   support\n\n         Amaury       1.00      1.00      1.00        33\n         Arnold       1.00      1.00      1.00        32\n    DiegoFlores       1.00      1.00      1.00        34\nDiegoVillarreal       1.00      1.00      1.00        33\n          Edgar       1.00      1.00      1.00        38\n        Gustavo       1.00      1.00      1.00        32\n       Humberto       1.00      1.00      1.00        29\n           Javi       1.00      1.00      1.00        32\n          Julio       1.00      1.00      1.00        32\n        Rodrigo       1.00      1.00      1.00        30\n\n       accuracy                           1.00       325\n      macro avg       1.00      1.00      1.00       325\n   weighted avg       1.00      1.00      1.00       325\n\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<Figure size 800x600 with 2 Axes>","image/png":"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OnXqKNZde3p64unTp9i+fTtSU1NhZGQEuVye718urKysctybgrp8+TJq1qwJPT3lOcs6depg9erV+Pfff1G1alVcvnwZAFCrVi2leiVLlkTp0qUV51Vpk0hBk9P1REXhw4+CV6xYIVhYWAipqamCIAhCt27dhGbNmgmCIORYyrJ7924BgPDTTz8ptffVV18JEolEuHv3riAIghAVFSUAEIYPH65Ur3fv3jmWsgwaNEhwdnYW4uPjler27NlTsLKyUsSV21KW6tWrCw4ODsKrV68UZVeuXBH09PSEfv36ffJ9SE9PF2xtbYUffvhBKcZq1ap98trClL2URRDev7ctWrQQBEEQsrKyBCcnJ2HmzJmK9+PDpSxpaWlCVlaWUlv3798XpFKpMGvWLEXZxz7SbtKkiQBA+O2333I916RJkzzj3rp1qwBAqa/cLFmyRAAgbN26VVGWkpIiuLm5KS1lkcvlgru7u9CmTRtBLpcr6qampgrlypUTWrVq9dF+1q1bJwAQFi1alONcdnv5/ZkWhPfLsIyMjJTKrly5IgAQli9frijLXpLz36Useb1//fv3F8qUKaN4PWbMGMHS0lLIzMzMM7f/LvtJT08XHBwchCpVqgjv3r1T1Nu3b58AQJg2bZpSf7ndpxo1agg+Pj559pmtdOnSQteuXZXK3r59KwAQOnbs+NFrO3ToIAAQEhMTC3SNIPzv76/cjv969uyZAED45ZdfPplXdHS08PDhw0/WEwRBWLBggWBiYqKI6d9//xUACLt27VKq17hxY8HCwiJHux/+PPfr10/Q09PLdWlOdr3sP+/5OfJaClaQpSxmZmbCwIEDc5T//fffAgDh4MGDgiAIwvz58wUAwqNHj3LUrV27tlCvXj2V2yTKxqUsVKx0794d7969w759+5CUlIR9+/bluYxl//790NfXx+jRo5XKv/vuOwiCgAMHDijqAchR77+z34IgYMeOHWjfvj0EQUB8fLziaNOmDRISEvJ8Uv/58+eIioqCv78/bGxsFOXe3t5o1aqVIoaPOXDgAF69eoVevXopynr16oUrV658dAeJotS7d2+cPHkSL168wPHjx/HixYs8749UKlXMQmVlZeHVq1cwNzeHh4eHSjseSKVSDBgwQKU4b968iYEDB6Jjx46YOnXqR+vu378fzs7O+OqrrxRlpqamGDJkiFK9qKgo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xElbc3mdnIapW88gPikV5sZGqOhcAisHtkZ991KIjHmOa4/fL/loP3+H0nV/T/oKpWwK55NhddLW+1JQml5jPmPGDMycOVOpzMPDA7du3VJrPxJBrHP5BADw8/ODm5sbVqxYoelQFAyMSmk6BCIi0lFJoaM0HYLaWPRYrukQ1CYz/alG+69dsrHa24x8djrfdWfMmIHt27fj6NGjijIDAwPY2dl95CrVccZcpN68eYPw8HCcPHkSQ4cO1XQ4RERERMWagYEBnJycCrePQm2dCmzgwIGIjIzEd999h44dO2o6HCIiIiKNEcMCjzt37qBkyZIwNjZG/fr1ERgYmOtW05+DA3OR2rVrl6ZDICIiIhKFwlhjntt3teS26QUA1K1bF8HBwfDw8MDz588xc+ZMNGrUCNevX4eFhfqeSRD/Y8dERERERGqW23e1BAYG5lq3bdu26NatG7y9vdGmTRvs378fb9++xdatW9UaE2fMiYiIiEjUCmMpS0BAAMaPH69UlttseW6sra1RsWJF3L17V60xccaciIiIiIodqVQKS0tLpSO/A/Pk5GTExMTA2dlZrTFxYE5EREREoiaHoPZDFRMmTMCpU6fw4MEDnD17Fp07d4a+vj569eql1jy5lIWIiIiIRE3Q8BcMPXnyBL169cKrV69gb2+Phg0bIiIiAvb29mrthwNzIiIiIqKP2LJlS5H0w4E5EREREYmaXAT7mBcFrjEnIiIiIhIBzpgTERERkahpeo15UeHAnIiIiIhEjUtZiIiIiIioyHDGnIiIiIhEjUtZiIiIiIhEoLgsZeHAnIiIiETDosdyTYegNokrums6BNIyHJgTERERkagVl6UsfPiTiIiIiEgEOGNORERERKLGNeZERERERCLApSxERERERFRkOGNORERERKImCHJNh1AkOGNORERERCQCnDEnIiIiIlGTF5M15hyYExEREZGoCcVkVxYuZSEiIiIiEgHOmBMRERGRqHEpCxERERGRCHApCxERERERFRkOzEXo5MmTkEgkePv27Ufr+fv7o1OnTkUSExEREZGmyAVB7YcYcWD+mfz9/SGRSCCRSGBoaIhy5cph0qRJSEtLK/S+ly5diuDg4ELvp6gNG9ofd/+NQHJiDM6G7UXtWtU1HVKB6VIugG7lw1zEibmIE3PRrK1RD9F9wxk0XH4YDZcfRr+Qswi7H6c4L8vMQuDR62j66xE0WHYI3+25iFcpMg1GTAXFgbka+Pn54fnz57h37x4WL16M33//HdOnTy+0/rKysiCXy2FlZQVra+tC60cTunXrgAXzp2P2T4tQu64frly9if1/b4a9va2mQ1OZLuUC6FY+zEWcmIs4MRfNc7QwxqhGHtjc1xeb+zRAHVdbjNt9ETHxSQCABSejcfpeHOa1r4G1PerhZbIM3+25pOGo1UsohP+JEQfmaiCVSuHk5AQXFxd06tQJLVu2xJEjRwAAMpkMo0ePhoODA4yNjdGwYUNERkYqXb9//35UrFgRJiYmaNasGR48eKB0Pjg4GNbW1tizZw8qVaoEqVSKR48e5VjKkpSUhD59+sDMzAzOzs5YvHgxmjZtirFjxyrqvHnzBv369UOJEiVgamqKtm3b4s6dO4X11qhs3JjBWBsUgg0btyI6+g6Gj5iC1NR3GODfU9OhqUyXcgF0Kx/mIk7MRZyYi+Y1qeCIRuUdUKaEGcrYmGNkQw+YGhng6vO3SJJlYPe1xxjf1At1XO1QydEKM9t448qzN7j67I2mQ1cbQRDUfogRB+Zqdv36dZw9exZGRkYAgEmTJmHHjh3YsGEDLl26BDc3N7Rp0wavX78GADx+/BhdunRB+/btERUVhW+++QZTpkzJ0W5qaip++eUXrF27Fjdu3ICDg0OOOuPHj0d4eDj27NmDI0eO4MyZM7h0Sfk3Zn9/f1y4cAF79uzBuXPnIAgCvvjiC2RkZBTCu6EaQ0ND1KzpjWPHzyjKBEHAseNhqFfPR4ORqU6XcgF0Kx/mIk7MRZyYi/hkyQUcvPUM7zKy4F3SGtGxCciUC6jnaqeoU87WHE4Wxrj6/K3mAqUC4XaJarBv3z6Ym5sjMzMTMpkMenp6WLFiBVJSUrBq1SoEBwejbdu2AIA1a9bgyJEjCAoKwsSJE7Fq1SpUqFABCxcuBAB4eHjg2rVr+OWXX5T6yMjIwMqVK1GtWrVcY0hKSsKGDRsQEhKCFi1aAADWr1+PkiVLKurcuXMHe/bsQXh4OBo0aAAA2Lx5M1xcXLB7925069ZN7e+NKuzsbGBgYIC42Hil8ri4l/D0qKChqApGl3IBdCsf5iJOzEWcmIt43HmZiP5/nkN6phwmRvpY2KEmKtha4N+4RBjq68HC2FCpvq2ZVKfWmXMfc8q3Zs2aYdWqVUhJScHixYthYGCArl274urVq8jIyICvr6+irqGhIerUqYPo6GgAQHR0NOrWravUXv369XP0YWRkBG9v7zxjuHfvHjIyMlCnTh1FmZWVFTw8PBSvo6OjYWBgoNSfra0tPDw8FPH8l0wmg0ym/AdbEARIJJI8YyEiIiL1Kmtjji1fN0RyeiaO/vsc0w5exdoedT99IWkVLmVRAzMzM7i5uaFatWpYt24dzp8/j6CgILX2YWJiopHBcGBgIKysrJQOQZ5UKH3Fx79GZmYmHBztlModHOzxIvZlofRZWHQpF0C38mEu4sRcxIm5iIehvh5cS5ihkqMVRjfyREV7C/x56QFszaTIyJIjKU15SeqrFBlszaQailb9uMacCkRPTw/ff/89pk6digoVKsDIyAjh4eGK8xkZGYiMjESlSpUAAF5eXvjnn3+U2oiIiFC53/Lly8PQ0FDpwdKEhAT8+++/itdeXl7IzMzE+fPnFWWvXr3C7du3FfH8V0BAABISEpQOiZ6FyvHlR0ZGBi5duormzRoqyiQSCZo3a4iIiIuF0mdh0aVcAN3Kh7mIE3MRJ+YiXoIApGfJ4eVoBQM9Cc4/+t8SnQevk/EiKQ3eztaaC1DNiss+5lzKUgi6deumWD8+bNgwTJw4ETY2NnB1dcW8efOQmpqKQYMGAQCGDh2KhQsXYuLEifjmm29w8eLFAu1NbmFhgf79+yv6cnBwwPTp06Gnp6eYaXd3d0fHjh0xePBg/P7777CwsMCUKVNQqlQpdOzYMdd2pVIppFLl37gLc+Z+8dI1WB+0GBcvXUVk5GWMHjUYZmYmCN4QWmh9FhZdygXQrXyYizgxF3FiLpq37Mwt+JZzgLOFMVLSM3Hg1jNcePwKK7vWhoXUEJ2qumDhyWhYGRvBTGqAX47dgLezNbxLltB06KQiDswLgYGBAUaOHIl58+bh/v37kMvl+Prrr5GUlIRatWrh0KFDKFHi/R8WV1dX7NixA+PGjcPy5ctRp04dzJkzBwMHDlS530WLFmHo0KFo164dLC0tMWnSJDx+/BjGxsaKOuvXr8eYMWPQrl07pKeno3Hjxti/fz8MDQ0/0nLR2bZtD+ztbDBj2gQ4OdnjypUb+LJdX8TFxX/6YpHRpVwA3cqHuYgTcxEn5qJ5r1PT8eOBK4hPkcHcyADu9hZY2bU26pW1BwBMaOoFPQAT9l5CeqYcDcraIaBlFc0GrWZiXXqibhKhuGRaDKWkpKBUqVJYuHChYoZeHQyMSqmtLSIiIl2VuKK7pkNQG9MhizXav5W5+nfOSUiOUXubn4sz5jrk8uXLuHXrFurUqYOEhATMmjULAPJcpkJERERE4sGBuY5ZsGABbt++DSMjI/j4+ODMmTOws7P79IVEREREIlVcFnhwYK5DatSogYsXte/JciIiIiLiwJyIiIiIRE6s2xuqGwfmRERERCRqAorHwJxfMEREREREJAKcMSciIiIiUSsuS1k4Y05EREREJAKcMSciIiIiUeN2iUREREREIsCHP4mIiIiIqMhwYE5EREREoiYIgtqPgvj1119RtmxZGBsbo27duvjnn3/UmicH5kREREQkamIYmIeGhmL8+PGYPn06Ll26hGrVqqFNmzaIi4tTW54cmBMRERERfcKiRYswePBgDBgwAJUqVcJvv/0GU1NTrFu3Tm19cGBORERERKImFMKhivT0dFy8eBEtW7ZUlOnp6aFly5Y4d+5cwRP7D+7KQkRERETFjkwmg0wmUyqTSqWQSqU56sbHx/9fe3ceV2P6/w/8dU51WrRKRWRpESWFJgZZsiSjKGONVjP2msxkG+uMpTG2MZZElDW+tk/MjFCjFD4VKUtpl2XCSJKUzun+/dHP+ThatOk+9+n9fDw8Hs59H6fXadH7vu73dV0QiUTQ09OTOK6np4e0tLSmC8UQIoVKS0uZlStXMqWlpWxHaTR6L9KJ3ot0ovcivWTp/dB7IQzDMCtXrqwykL5y5cpqn/v48WMGAHP16lWJ4/7+/oyNjU2TZeIxTAtZsZ1wSlFRETQ0NPDq1Suoq6uzHadR6L1IJ3ov0onei/SSpfdD74UA9Rsxf/fuHVRUVHDixAmMGzdOfNzd3R2FhYX4z3/+0ySZqMecEEIIIYS0OIqKilBXV5f4U11RDgACgQB9+vRBZGSk+FhFRQUiIyPx5ZdfNlkm6jEnhBBCCCHkExYsWAB3d3dYW1vDxsYGW7duxZs3b+Dp6dlkH4MKc0IIIYQQQj5h0qRJeP78OVasWIH8/HxYWVnh/PnzVSaENgYV5kQqKSoqYuXKlTXeUuISei/Sid6LdKL3Ir1k6f3QeyENNW/ePMybN++zvT5N/iSEEEIIIUQK0ORPQgghhBBCpAAV5oQQQgghhEgBKswJIYQQQgiRAlSYE0IIIaRFePToER49esR2DEJqRKuyEEIIIQTbtm3Dt99+CyUlJWzbtq3W5/r4+DRTqsarqKjAmjVrsGnTJhQXFwMA1NTU8P333+PHH38En09jlER60KosRCoMHjwY3t7emDBhApSVldmOU28uLi51fu6pU6c+Y5LPr6ioCFFRUTA1NUX37t3ZjtNilZeXo1u3bjh37pxMfB0KCwsRHByM1NRUAIC5uTm8vLygoaHBcrKWo0uXLkhMTIS2tja6dOlS4/N4PB6ys7ObMVnjLFmyBMHBwVi9ejUGDBgAAIiNjcWqVavwzTffYO3atSwnJOR/qDAnUuG7777DkSNHUFZWhokTJ8Lb2xv9+vVjO1adfbjrF8MwOH36NDQ0NGBtbQ0AuHHjBgoLC+Hi4oL9+/ezFbNBJk6ciEGDBmHevHl4+/YtLC0tkZubC4ZhEBYWhvHjx7MdsVayfNHUvn17XLp0ifOFeWJiIuzt7aGsrAwbGxsAQEJCAt6+fYsLFy6gd+/eLCesv+joaGzcuFF8oWFmZgZ/f3/Y2tqynKzl0dfXR2BgIJycnCSO/+c//8GcOXPw+PFjlpI1jkgkwpkzZyQuZp2cnCAnJ8dyMtIYVJgTqSEUChEeHo7Q0FD89ddfMDY2hpeXF6ZPn96ku2p9bosWLUJBQQECAwPF/0GKRCLMmTMH6urq+PXXX1lOWD9t27ZFREQELC0tceTIEaxcuRLJyckIDQ1FUFAQkpKS2I5Yq/pslcy1i6Z169YhPT0de/fuhbw8dzsTbW1tYWxsjD179ojfh1AoxIwZM5CdnY2YmBiWE9bPoUOH4OnpCRcXF/EIbVxcHE6fPo2QkBBMnTqV5YSfFhsbi4EDB7Ido0koKSkhJSUFXbt2lTh+//59WFlZ4e3btywla7jMzEx89dVXePToEUxNTQFUvh8DAwP88ccfMDIyYjkhaSgqzIlUevbsGYKCgrB27VqIRCKMHj0aPj4+sLOzYzvaJ+no6CA2Nlb8n+V79+/fR//+/fHixQuWkjWMsrIy0tPTYWBgADc3N+jr6yMgIAB5eXkwMzMT92yS5ufs7IzIyEioqqrCwsICrVq1kjjPlTsAysrKSEpKQrdu3SSO37t3D9bW1igpKWEpWcN0794d3377Lfz8/CSOb968GXv27BGPcEozgUCA9u3bY8qUKXB1dYW5uTnbkRqsb9++6Nu3b5W++fnz5yMhIQHXr19nKVnDjR49GgzD4PDhw2jdujUA4MWLF5g2bRr4fD7++OMPlhOShuLuEAuRWfHx8di/fz/CwsKgq6sLDw8PPH78GGPGjMGcOXOwceNGtiPWSigUIi0trUphnpaWhoqKCpZSNZyBgQGuXbuG1q1b4/z58wgLCwMAvHz5EkpKSiyna9k0NTWlvpWoLtTV1ZGXl1elMH/48CHU1NRYStVw2dnZcHR0rHLcyckJS5cuZSFR/T158gRhYWE4evQoAgIC0LNnT7i6umLKlCno0KED2/HqZcOGDfjqq69w6dIlfPnllwCAa9eu4eHDh/jzzz9ZTtcw0dHRuH79urgoBwBtbW0EBASI79IQbqLCnEiFZ8+e4eDBg9i/fz8yMjLg6OiIo0ePwt7eHjweDwDg4eGBUaNGSX1h7unpCW9vb2RlZYn7Zf/73/8iICCgXm0V0uK7776Dq6srVFVV0bFjRwwZMgQAEBMTAwsLC3bDNcCJEydw/Phx5OXl4d27dxLnbt68yVKqhuFa601NJk2aBG9vb2zcuBH9+/cHUNn64e/vjylTprCcrv4MDAwQGRkJY2NjieOXLl2CgYEBS6nqp02bNpg3bx7mzZuHnJwcHDlyBKGhoViyZAkGDRqEqKgotiPW2eDBg5Geno4dO3YgLS0NQOXckzlz5kBfX5/ldA2jqKiI169fVzleXFwMgUDAQiLSZBhCpICCggLTrVs3ZsOGDcyzZ8+qfc6rV6+YIUOGNHOy+hOJRMwvv/zC6OvrMzwej+HxeIy+vj7zyy+/MEKhkO14DZKQkMCcOnWKef36tfjYuXPnmNjYWBZT1d9vv/3GqKqqMvPmzWMEAgEzc+ZMZvjw4YyGhgazdOlStuO1WGVlZYyPjw8jEAgYPp/P8Pl8RlFRkfnuu++Y0tJStuPV286dOxmBQMDMmjWLOXDgAHPgwAFm5syZjKKiIhMYGMh2vAYRCoXM2bNnGSsrK4bP57Mdp8WbPn06Y25uzly/fp2pqKhgKioqmGvXrjE9evRg3N3d2Y5HGoF6zAnrGIZBbGwsrK2tOblUYm2KiooAVN6q57p3794hJycHRkZGnJ1o2K1bN6xcuRJTpkyBmpoakpOTYWhoiBUrVqCgoADbt29nO2K9ydIdgJKSEmRlZQEAjIyMoKKiwnKihjt9+jQ2bdok7ifv3r07/P39MXbsWJaT1U9cXBwOHz6MEydOoLS0FGPHjoWrqytGjRrFdrRapaSkoEePHuDz+UhJSan1uT179mymVE2nsLAQ7u7uOHv2LBQUFABUtlE6OTkhJCSElhnlMCrMCesqKiqgpKSEu3fvwsTEhO045CMlJSWYP38+QkNDAQDp6ekwNDTE/Pnz0b59eyxevJjlhHWnoqKC1NRUdOrUCbq6urh48SIsLS2RkZGBfv36cW5i7rZt2/Djjz/Cw8MDQUFB8PT0RFZWFhISEjB37lzOrM986NAhuLi4cLoQlzVLlixBWFgYnjx5ghEjRsDV1RVjx47lzNeIz+cjPz8furq64PP54PF4qK7c4fF4EIlELCRsGhkZGeL2nO7du1dpnyLcw81hLyJT+Hw+TExM8OLFC84W5r169RL3wn8K10YxlyxZguTkZFy+fFlilGz48OFYtWoVpwrztm3boqCgAJ06dULHjh1x/fp1WFpaIicnp9pf2tJu586dCAoKwpQpUxASEoKFCxdK3AHgCj8/P8yaNQtOTk6YNm0a7O3tOb0Ws6GhIRISEqCtrS1xvLCwEL179+bE5jwxMTHw9/fHxIkT0aZNG7bj1FtOTg50dHTEf5dVJiYmnP29SapHhTmRCgEBAfD398euXbvQo0cPtuPU27hx49iO8NmcOXMGx44dQ79+/SQuPszNzcVtB1xhZ2eH8PBw9OrVC56envDz88OJEyeQmJhYr42IpEVeXp54sqSysrJ4Mtj06dPRr18/zrTm/PPPPzh//jyOHj2KiRMnQkVFBRMmTICrq6v4/XFJbm5utaOwZWVlnNnMJi4uju0IjdKpU6dq/y4rFixYUO1xHo8HJSUlGBsbY+zYsRKrthBuoMKcSAU3NzeUlJTA0tISAoGgSq+5tI/+rVy5ku0In83z58+hq6tb5fibN2/qfJdAWgQFBYmXrJw7dy60tbVx9epVODk5YebMmSynqz9ZuQMgLy+PMWPGYMyYMSgpKcHp06dx5MgRDB06FB06dODMBWB4eLj47xERERJ9viKRCJGRkejcuTMLyRru3r171c5f+HgXTWnz4dfiU6T9vVQnKSkJN2/ehEgkEi/Nm56eDjk5OXTr1g07d+7E999/j9jYWJiZmbGcltQHFeZEKmzdupXtCE3uxo0bElsl9+rVi+VEDWNtbY0//vgD8+fPBwBxMb53717xmsBcwefzwefzxY8nT56MyZMns5iocWTtDgBQOQ/A3t4eL1++xIMHDzixGc97H945c3d3lzinoKCAzp07Y9OmTc2cqmGys7Ph7OyM27dvS/Rnv//5l/a+7LrexeRqj/n70fD9+/eLFxd49eoVZsyYgYEDB+Kbb77B1KlT4efnh4iICJbTknphbT0YQmTU06dPmaFDhzI8Ho/R0tJitLS0GB6Px9jZ2dW4FKQ0u3LlCqOqqsrMmjWLUVJSYnx9fZkRI0YwrVq1YhITE9mOV28xMTGMq6sr069fP+bRo0cMwzDMgQMHmCtXrrCcrP5EIhFTXl4ufnz06FFm/vz5zLZt25iysjIWk9XfmzdvmEOHDjEODg6MQCBgjIyMmGXLljGpqalsR6u3zp07M//++y/bMRplzJgxzNixY5nnz58zqqqqzL1795grV64wNjY2TExMDNvxWjx9fX3m7t27VY7fuXOH0dfXZxiGYW7cuMFoa2s3dzTSSPxPl+6EfH55eXm1/uGS+fPn4/Xr17h79y4KCgpQUFCAO3fuoKioCD4+PmzHq7eBAwciOTkZQqEQFhYWuHDhAnR1dXHt2jX06dOH7Xj1cvLkSdjb24u3gC8rKwNQOdK0bt06ltPVH5/Pl1i6cvLkydi2bRvmz5/PqU1GJk+eDF1dXfj5+cHQ0BCXL19GZmYmfv755yq7gUq78vJyGBoaSn373adcu3YNP/30E9q0aSO+0zRw4ECsX7+ek/+PyZpXr17h2bNnVY4/f/5cvEyvpqZmlRYkIv2olYVIhc6dO9far8ylW43nz5/HpUuX0L17d/ExMzMz7NixAyNHjmQxWf2Vl5dj5syZWL58Ofbs2cN2nEZbs2YNAgMD4ebmhrCwMPHxAQMGYM2aNSwma5ia1md+PwGsY8eOUFRUbOZU9ScnJ4fjx49zfjUWoLJl5VPrZnOBSCSCmpoagMpdQJ88eQJTU1N06tQJ9+/fZzld/fz000+1nl+xYkUzJWk6Y8eOhZeXFzZt2oQvvvgCAJCQkIAffvhB3MYTHx+Prl27spiSNAQV5kQqJCUlSTwuLy9HUlISNm/ezJm1mN+rqKgQb/jwIQUFBfHEQ65QUFDAyZMnsXz5crajNIn79+9j0KBBVY5raGigsLCw+QM1kpWVlcQFLcMwEo8VFBQwadIk7N69G0pKSmxErJPDhw+zHaFJTZs2DcHBwQgICGA7SoP16NEDycnJ6NKlC/r27YsNGzZAIBAgKCgIhoaGbMerl9OnT0s8Li8vR05ODuTl5WFkZMTJwnz37t3w8/PD5MmTIRQKAVROonZ3d8eWLVsAVG6otnfvXjZjkgagwpxIBUtLyyrHrK2toa+vj19//ZVTE9ns7Ozg6+uLo0ePQl9fHwDw+PFj+Pn5YdiwYSynq79x48bhzJkz8PPzYztKo7Vt2xaZmZlVVsaIjY3lXLEBVBYcixYtgr+/P2xsbABUjpJt2rQJK1euhFAoxOLFi7Fs2TJs3LiR5bS1e/PmDaKjo6tdAYRrrRNCoRD79u3DpUuX0KdPH7Rq1Uri/ObNm1lKVnfLli3DmzdvAACrV6+Go6MjbG1toa2tLXG3iQs+HvgBKndl9vDwgLOzMwuJGk9VVRV79uzBli1bxOviGxoaQlVVVfwcKysrltKRxqCdP4lUy8zMhKWlpfgXBBc8fPgQTk5OuHv3LgwMDMTHevTogfDwcHTo0IHlhPWzZs0abNq0CcOGDau2yOBS0bR+/XocOnQI+/btw4gRI/Dnn3/iwYMH8PPzw/Lly8Urz3CFjY0Nfv75Z9jb20scj4iIwPLlyxEfH48zZ87g+++/l+olB5OSkjB69GiUlJTgzZs3aN26Nf7991+oqKhAV1eXExvyfGjo0KE1nuPxeIiKimrGNE2noKAAWlpanFsmtSa3b9+Go6MjcnNz2Y5CiBgV5kQqvJ+s8h7DMPjnn3+watUqpKWl4datW+wEayCGYXDp0iWJrZKHDx/OcqqG6dKlS43neDwep4omhmGwbt06rF+/HiUlJQAARUVF/PDDD/j5559ZTld/7yexfjxBMi0tDb169cLbt2+Rm5sLMzMz8fuVRkOGDEHXrl0RGBgIDQ0NJCcnQ0FBAdOmTYOvry+n7phxXV0+1/Ly8mjbti1GjBgBR0fHZkj1ecTGxsLR0REvX75kO0qduLi4ICQkBOrq6p/8Op06daqZUpGmRq0sRCpoampWGYVhGAYGBgacu20KVBasI0aMwIgRI9iO0miysp21SCRCXFwc5s6dC39/f2RmZqK4uBhmZmYSt3+5pFu3bggICEBQUJB4FZby8nIEBASIi/XHjx9DT0+PzZifdOvWLezevRt8Ph9ycnIoKyuDoaEhNmzYAHd3d84W5pmZmcjKysKgQYOgrKxcZQ6ANPpwU6SaVFRUICMjA3v37sUPP/zwycmVbNu2bZvE4/cDPwcPHoSDgwNLqepPQ0ND/P1Tl68T4SYaMSdSITo6WuIxn8+Hjo4OjI2NJZaD44rIyEhERkbi2bNnVSZ87tu3j6VUjcd8tMkI1ygpKSE1NbXWuwBc8n7XUj6fj549ewKovD0vEolw7tw59OvXDwcPHkR+fj78/f1ZTlszHR0dXL16FSYmJujatSt+//132NvbIy0tDX369OFUKxsAvHjxAhMnTsTff/8NHo+HjIwMGBoawsvLC1paWpzZZOhTzp07hzlz5kj9krYf/7y///1iZ2eHJUuWiFef4QqGYfDw4UPo6OhU2SWbcB/3Kh4ikwYPHsx2hCazevVq/PTTT7C2tka7du04W8R+6MCBA/j111+RkZEBAOjatSv8/f0xffp0lpPVT48ePZCdnS0zhXn//v2Rk5ODw4cPIz09HQAwYcIETJ06VVxscOFr1KtXLyQkJMDExASDBw/GihUr8O+//+LgwYPo0aMH2/Hqzc/PDwoKCsjLy5NYNnXSpElYsGCBzBTmAwcOhLW1NdsxPklW7vq9xzAMjI2NcffuXZiYmLAdhzQxGjEnUuXevXvVrsrg5OTEUqL6a9euHTZs2MCJgqguNm/ejOXLl2PevHkYMGAAgMrezB07dmDNmjWcWq3l/PnzWLJkCX7++edqJ7K+39qaNK/ExES8fv0aQ4cOxbNnz+Dm5iYeQQ8ODubc6hJt27ZFREQELC0toaamhuTkZBgaGiI7Oxs9e/ZEcXEx2xFbBFnulzc3N0dwcDD69evHdhTSxKgwJ1IhOzsbzs7OuH37Nng8XpWWCS5tMKStrY34+HgYGRmxHaVJdOnSBatXr4abm5vE8dDQUKxatYpTo1F8/v82O65u/W8ufJ+Fh4fX+blcuqCVJWpqarh58yZMTEwkCvPExETY29vjxYsXbEdsETw9PT/5nIqKCjx79gzR0dGc6Jd/7+zZs9iwYQN27drFybtKpGZUmBOp4OjoCDk5OezduxddunRBfHw8Xrx4ge+//x4bN26Era0t2xHrbNGiRVBVVZWZTXmUlJRw584dGBsbSxzPyMiAhYUFSktLWUpWfx/PZfgYF1qqPry4ACBxIfvhMYA7F7R2dnY4deoUNDU1JY4XFRVh3LhxnFtecPTo0ejTpw9+/vlnqKmpISUlBZ06dcLkyZNRUVGBEydOsB2RfIQr/fLvaWlpoaSkBEKhEAKBoEqveUFBAUvJSGNRjzmRCteuXUNUVBTatGkDPp8PPp+PgQMHYv369fDx8al2gwhpVVpaiqCgIFy6dAk9e/assgsoFzYX+ZCxsTGOHz+OpUuXShw/duwYp/oby8vL8dNPPyEwMJBTuT/24WTiS5cuYdGiRVi3bh2+/PJLAJU/S8uWLcO6devYilhvly9frtK+BlT+LF25coWFRI2zYcMGDBs2DImJiXj37h0WLlyIu3fvoqCgAHFxcWzHI9XgSr/8e1u3bmU7AvlMqDAnUkEkEoknq7Vp0wZPnjyBqakpOnXqhPv377Ocrn5SUlLEPbF37tyROMfFiaCrV6/GpEmTEBMTI+4xj4uLQ2RkJI4fP85yurpTUFBASkoK2zGa1HfffYfAwEAMHDhQfMze3h4qKir49ttvkZqaymK6T/vw63Hv3j3k5+eLH4tEIpw/fx7t27dnI1qj9OjRA+np6di+fTvU1NRQXFwMFxcXzJ07F+3atWM7HqmGpqYmp9b+dnd3ZzsC+UyoMCdSoUePHkhOTkaXLl3Qt29fbNiwAQKBAEFBQZzaKl0kEmH16tWwsLCAlpYW23GaxPjx4/Hf//4XW7ZswZkzZwBUbpgUHx+PXr16sRuunqZNm4bg4GAEBASwHaVJZGVlVWn/ACrXOObCboZWVlbg8Xjg8Xiws7Orcl5ZWRm///47C8kaT0NDAz/++CPbMYgM+XgjvtrQRHbuoh5zIhUiIiLw5s0buLi4IDMzE2PGjEF6ejq0tbVx7Nixan9pSytZWytblsyfPx8HDhyAiYlJtauycK3NaNCgQVBSUsLBgwfFmwg9ffoUbm5uKC0t/WRPPdsePHgAhmFgaGiI+Ph46OjoiM8JBALo6upCTk6OxYQN9/LlSwQHB4vvWpiZmcHT0xOtW7dmORnhKj6fX+e7rlyZX0KqosKcSK2CggJoaWlxrv3D2toav/zyC4YNG8Z2lAaT1ZGZoUOH1niOx+NxbpJhZmYmnJ2dkZ6eDgMDAwDAw4cPYWJigtOnT3O6l57LYmJi4OjoCA0NDXHf8o0bN1BYWIizZ89i0KBBLCckXPThhXZubi4WL14MDw8PifkloaGhWL9+PbW6cBgV5oQ0MVlYK7suIzNcWmJQljEMg0uXLolHZrt3747hw4dz6oI2NDQUbdq0wVdffQUAWLhwIYKCgmBmZoajR4+iU6dOLCesHwsLC3z55ZfYtWuXeMRfJBJhzpw5uHr1Km7fvs1yQsJ1w4YNw4wZMzBlyhSJ40eOHEFQUBAuX77MTjDSaFSYE6lQWlqK33//HX///Xe129jfvHmTpWT1JwtrZdenBYILSwzKmtGjR+Po0aPQ0NAAAAQEBGDWrFnifvMXL17A1tYW9+7dYzFl3ZmammLXrl2ws7PDtWvXMGzYMGzduhXnzp2DvLw8pyblAZW98bdu3YKpqanE8fv378PKygpv375lKRmRFSoqKkhOTq5yVyw9PR1WVlYoKSlhKRlpLJr8SaSCt7c3Lly4gK+//ho2NjacGu372N9//13jOa6MlMlysZ2YmIjjx49Xu8MsVwrAiIgIlJWViR+vW7cOEydOFBfmQqGQU6sZPXz4ULxO/pkzZ/D111/j22+/xYABAzBkyBB2wzVA7969kZqaWqUwT01NhaWlJUupiCwxMDDAnj17sGHDBonje/fuFbe1EW6iwpxIhXPnzuHPP/8UL8fHZR8Xta9fv8bRo0exd+9e3LhxA/PmzWMpWf24ublhx44d4mUsk5OTYWZmVmVddi4JCwuDm5sb7O3tceHCBYwcORLp6el4+vQpnJ2d2Y5XZx/f6OT6jU9VVVW8ePECHTt2xIULF7BgwQIAlROpuTK6/OHSjz4+PvD19UVmZqZ4y/Tr169jx44dMrMiEGHXli1bMH78ePz111/o27cvACA+Ph4ZGRk4efIky+lIY1ArC5EKZmZmCAsLQ8+ePdmO0mRiYmIQHByMkydPQl9fHy4uLhg/fjy++OILtqPViZycHP755x/o6uoCqOyNv3XrFqeWr/xYz549MXPmTMydO1e8VXqXLl0wc+ZMtGvXDqtXr2Y7Yp3w+Xzk5+eLvzYfbvsOVK7Moq+vz4m2KQBwdXVFWloaevXqhaNHjyIvLw/a2toIDw/H0qVLq+wHII3ez8v41K9UrrSzEen36NEj7Ny5E2lpaQAq55fMmjWLRsw5jkbMiVTYtGkTFi1ahMDAQM5N9PpQfn4+QkJCEBwcjKKiIkycOBFlZWU4c+YMzMzM2I5XL7I2KgtUrvv9foKhQCDAmzdvwOPx4OfnBzs7O84U5u/X/v74GFft2LEDy5Ytw8OHD3Hy5Eloa2sDqFzJ5OPJbdIqJyeH7QikhenQoQOndvgldUOFOZEK1tbWKC0thaGhIVRUVKq0SxQUFLCUrO4cHR0RExODr776Clu3bsWoUaMgJyeHwMBAtqOR/09LSwuvX78GALRv3x537tyBhYUFCgsLOTVZimEYeHh4QFFREUDl5OlZs2aJVwD6sP+cCzQ1NbF9+/Yqx7lyoQSA0wMKhJsKCwsl1so3NzeHl5eXeFI44SYqzIlUmDJlCh4/fox169ZBT0+Pk6N/f/31F3x8fDB79myZWT/6w23SGYZBWloaiouLJZ7DpfajQYMG4eLFi7CwsMCECRPg6+uLqKgoXLx4kVPrzn+8RvG0adOqPMfNza254jRaTExMree5uO73kydPEBsbW+0qUz4+PiylIrIiMTER9vb2UFZWho2NDYDKDdLWrl2LCxcuoHfv3iwnJA1FPeZEKqioqODatWucXrHg+vXrCA4OxrFjx9C9e3dMnz4dkydPRrt27cQTJ7mktp7Z98e51i9bUFCA0tJS6Ovro6KiAhs2bMDVq1dhYmKCZcuWQUtLi+2ILdKHS4y+9+HFOZe+xwAgJCQEM2fOhEAggLa2tsR74fF4yM7OZjEdkQW2trYwNjbGnj17IC9fOcYqFAoxY8YMZGdnf/Jil0gvKsyJVOjduzd27twpXsGAy968eYNjx45h3759iI+Ph0gkwubNm+Hl5SVe4YQLHjx4UKfn0S180livXr2SeFxeXo6kpCQsX74ca9eu5dTdDKByKbtZs2ZhyZIl1V50ENJYysrKSEpKQrdu3SSO37t3D9bW1pxqzSOSqDAnUuHChQtYvXo11q5dCwsLiyo95lzYLbM69+/fR3BwMA4ePIjCwkKMGDEC4eHhbMdqUYqKiur8XK5+n8mq6OhoLFiwADdu3GA7Sr1oa2sjPj4eRkZGbEchMkpPTw8HDx7EyJEjJY5HRETAzc0NT58+ZSkZaSwqzIlUeD+q9HFvORfbJaojEolw9uxZ7Nu3j5OF+ceTjMzMzODt7c2JSUbvW3JqIyvfZ7ImLS0N1tbWVeY1SLuFCxeidevWWLx4MdtRiIzy8fHB6dOnsXHjRvTv3x8AEBcXhx9++AHjx4/Hb7/9xnJC0lBUmBOpUNsW8Ldv3+bMpjyyqLpJRgkJCXj79i0nJhnV9r31MVne8VSafbg5D1B5ofTPP/8gICAAQqEQsbGxLCVrGJFIhDFjxuDt27fV3gHcvHkzS8mIrHj37h38/f0RGBgIoVAIhmEgEAgwZ84crF27FsrKymxHJA1EhTmRSh/vlkkjmeyhSUbkc6tponG/fv2wb9++Kn200m7NmjVYsWIFTE1Nq6wyxePxEBUVxWI6IktKSkqQlZUFADAyMsKuXbvw66+/ilfTItxDhTmRKlzfLVMWcX2S0cejsbXh0tKPsuTjicZ8Ph86OjpQUlJiKVHjaGlpYcuWLfDw8GA7CpExZWVlWLVqFS5evAhFRUX4+/tj3Lhx2L9/P5YtWwY5OTnMnTsXixYtYjsqaSBax5ywTpZ2y5RF6urqyMvLq1KYP3z4kBOrzFhZWdFW6VLq7du3iIyMxJgxYwAAS5YskdgcSV5eHj/99BPnCnRFRUUMGDCA7RhEBq1YsQK7d+/G8OHDcfXqVUyYMAGenp64fv06Nm3ahAkTJkBOTo7tmKQRqDAnrKLdMqXfpEmT4O3tXWWSkb+/Pye2S6et0qVXaGgo/vjjD3Fhvn37dpibm4v7Y9PS0tCuXTv4+fmxGbPefH198fvvv2Pbtm1sRyEy5v/+7/9w4MABODk54c6dO+jZsyeEQiGSk5M5uTEfqYpaWQir5OXlq90tU0FBgZOb8siijycZAZVfn9mzZyMgIEC8LTwh9WVra4uFCxfC0dERAKCmpobk5GQYGhoCAA4dOoQdO3bg2rVrbMasN2dnZ0RFRUFbWxvm5uZVJn+eOnWKpWSE6wQCAXJyctC+fXsAla2G8fHxsLCwYDkZaSo0Yk5YFRsbi+DgYPTp00dit0wiPQQCAX777TesX79eYpKRiooKy8nqJjw8HA4ODlBQUPjkUpVOTk7NlIoAQGZmpkRBoaSkJLEhj42NDebOnctGtEbR1NSEi4sL2zGIDBKJRBAIBOLH8vLyUFVVZTERaWo0Yk6kgqzslkmkD5/PR35+PnR1dWvdhZF6zJufsrIybt26BVNT02rPp6WlwcrKCqWlpc2cjBDpxOfz4eDgIL5TefbsWdjZ2aFVq1YSz6O7MtxFhTmROrRbpnRxdnautneRx+NBSUkJxsbGmDp1ao3FFSE1MTExQUBAAMaPH1/t+ePHj2Pp0qXIzMxs5mSESCdPT886PW///v2fOQn5XKgwJ1KL67tlygoPDw+cOXMGmpqa6NOnDwDg5s2bKCwsxMiRI5GcnIzc3FxERkZK7UoUX3/9NWbMmAF7e3uaICVFfH19cenSJdy4caPKyitv376FtbU1hg8fzrldDLt06VLr91l2dnYzpiGEcAkV5oSQWi1evBhFRUXYvn27uBWkoqICvr6+UFNTw9q1azFr1izcvXtXandoHDZsGC5fvgx9fX14enrCw8NDPMGQsOfp06ewsrKCQCDAvHnz0LVrVwCVd822b98OoVCIpKQk6OnpsZy0fj6+kCgvL0dSUhLOnz8Pf39/LF68mKVkhBBpR4U5IaRWOjo6iIuLExdN76Wnp6N///74999/cfv2bdja2qKwsJCdkHXw4MED7N+/HwcOHMCDBw8wePBgzJgxA+PHj6eVZViUk5OD2bNn4+LFi+K15nk8HkaMGIGdO3fK1AXUjh07kJiYSG0GhJAaUWFOCKmVlpYWQkNDq6xYEh4eDnd3d7x8+RIZGRmwsbHBy5cvWUpZP1FRUdi3bx9Onz4NRUVFTJkyBV5eXuJWHdL8CgoKxL3kxsbGaN26NcuJml52djasrKxQVFTEdhRCiJSi5RIJIbWaPn06vL29sXTpUnzxxRcAgISEBKxbtw5ubm4AgOjoaJibm7MZs17s7OxgZ2eH169f48iRI1i6dCl2794tXqedNL/WrVvDxsaG7Rif1YkTJ2TygoMQ0nSoMCeE1GrLli3Q09PDhg0b8PTpUwCAnp4e/Pz8sGjRIgDAyJEjMWrUKDZj1ltOTg5CQkIQEhKCV69eYfjw4WxHIjKiV69eEpM/GYZBfn4+nj9/jp07d7KYjBAi7aiVhRBSZ+9vwaurq7OcpGFKS0tx4sQJ7Nu3DzExMTAwMICnpyc8PT1hYGDAdjwiI1atWiVRmPP5fOjo6GDIkCHo1q0bi8kIIdKOCnNCyCcJhUJcvnwZWVlZmDp1KtTU1PDkyROoq6tzYte5+Ph47Nu3D8eOHUNpaSmcnZ3h5eWFYcOG0fKJpMnUtXecqxe2hJDPjwpzQkitHjx4gFGjRiEvLw9lZWVIT0+HoaEhfH19UVZWhsDAQLYjfhKfz4elpSW8vb3h6uoKLS0ttiMRGcTn82u90GMYhnaYJYTUinrMCSG18vX1hbW1NZKTk6GtrS0+7uzsjG+++YbFZHWXmJiI3r17sx2DyLi///5b/HeGYTB69Gjs3bsX7du3ZzEVIYRLaMScEFIrbW1tXL16FaamplBTU0NycjIMDQ2Rm5sLMzMzlJSUsB2xXgoLCxEcHIzU1FQAgLm5Oby8vKChocFyMiJrPvx5IYSQuuCzHYAQIt0qKiqqvfX+6NEjqKmpsZCo4RITE2FkZIQtW7agoKAABQUF2Lx5M4yMjHDz5k224xFCCGnhaMScEFKrSZMmQUNDA0FBQVBTU0NKSgp0dHQwduxYdOzYkVO7GNra2sLY2Bh79uyBvHxlJ59QKMSMGTOQnZ2NmJgYlhMSWUIj5oSQ+qLCnBBSq0ePHsHe3h4MwyAjIwPW1tbIyMhAmzZtEBMTA11dXbYj1pmysjKSkpKqLFl37949WFtbc64th0i39xeyXbp0YTsKIYQjaPInIaRWHTp0QHJyMsLCwpCSkoLi4mLx6ibKyspsx6sXdXV15OXlVSnMHz58yLm2HCJ9XFxcJB6XlpZi1qxZaNWqlcTxU6dONWcsQgiHUGFOCPkkeXl5TJs2je0YjTZp0iR4e3tj48aN6N+/PwAgLi4O/v7+mDJlCsvpCNd9PIFYFn5mCCHNi1pZCCFVhIeHw8HBAQoKCggPD6/1uU5OTs2UqvHevXsHf39/BAYGQigUAgAUFBQwe/ZsBAQEQFFRkeWEhBBCWjIqzAkhVfD5fOTn50NXVxd8fs2LN3F1s5SSkhJkZWUBAIyMjKCiosJyIkIIIYQKc0IIIYQQQqQC9ZgTQmpUUVGBkJAQnDp1Crm5ueDxeDA0NMT48eMxffr0Wrcfl0bOzs7VZubxeFBSUoKxsTGmTp0KU1NTFtIRQghp6WiDIUJItRiGgZOTE2bMmIHHjx/DwsIC5ubmyM3NhYeHB5ydndmOWG8aGhqIiorCzZs3wePxwOPxkJSUhKioKAiFQhw7dgyWlpaIi4tjOyohhJAWiEbMCSHVCgkJQUxMDCIjIzF06FCJc1FRURg3bhwOHDgANzc3lhLWX9u2bTF16lRs375d3DtfUVEBX19fqKmpISwsDLNmzcKiRYsQGxvLclpCCCEtDfWYE0KqNXLkSNjZ2WHx4sXVnl+3bh2io6MRERHRzMkaTkdHB3FxcejatavE8fT0dPTv3x///vsvbt++DVtbWxQWFrITkhBCSItFrSyEkGqlpKRg1KhRNZ53cHBAcnJyMyZqPKFQiLS0tCrH09LSxKvLKCkpca53nhBCiGygVhZCSLUKCgqgp6dX43k9PT28fPmyGRM13vTp0+Ht7Y2lS5fiiy++AAAkJCRg3bp14pac6OhomJubsxmTEEJIC0WtLISQasnJySE/Px86OjrVnn/69Cn09fU5tY65SCRCQEAAtm/fjqdPnwKovMCYP38+Fi1aBDk5OeTl5YHP56NDhw4spyWEENLSUGFOCKkWn8+Hg4NDjbthlpWV4fz585wqzD9UVFQEAFBXV2c5CSGEEFKJWlkIIdVyd3f/5HO4tCLLe0KhEJcvX0ZWVhamTp0KAHjy5AnU1dWhqqrKcjpCCCEtGY2YE0JajAcPHmDUqFHIy8tDWVkZ0tPTYWhoCF9fX5SVlSEwMJDtiIQQQlowWpWFENJi+Pr6wtraGi9fvoSysrL4uLOzMyIjI1lMRgghhFArCyGkBbly5QquXr0KgUAgcbxz5854/PgxS6kIIYSQSjRiTghpMSoqKqqdrPro0SOoqamxkIgQQgj5HyrMCSEtxsiRI7F161bxYx6Ph+LiYqxcuRKjR49mLxghhBACmvxJCGlBHj16BHt7ezAMg4yMDFhbWyMjIwNt2rRBTEwMdHV12Y5ICCGkBaPCnBDSogiFQoSFhSElJQXFxcXo3bs3XF1dJSaDEkIIIWygwpwQQgghhBApQKuyEEJkWnh4OBwcHKCgoIDw8PBan+vk5NRMqQghhJCqaMScECLT+Hw+8vPzoaurCz6/5vnuPB6v2hVbCCGEkOZChTkhhBBCCCFSgFpZCCEtQkVFBUJCQnDq1Cnk5uaCx+PB0NAQ48ePx/Tp08Hj8diOSAghpIWjEXNCiMxjGAaOjo74888/YWlpiW7duoFhGKSmpuL27dtwcnLCmTNn2I5JCCGkhaMRc0KIzAsJCUFMTAwiIyMxdOhQiXNRUVEYN24cDhw4ADc3N5YSEkIIITRiTghpAUaOHAk7OzssXry42vPr1q1DdHQ0IiIimjkZIYQQ8j81L1FACCEyIiUlBaNGjarxvIODA5KTk5sxESGEEFIVFeaEEJlXUFAAPT29Gs/r6enh5cuXzZiIEEIIqYoKc0KIzBOJRJCXr3lKjZycHIRCYTMmIoQQQqqiyZ+EEJnHMAw8PDygqKhY7fmysrJmTkQIIYRURYU5IUTmubu7f/I5tCILIYQQttGqLIQQQgghhEgB6jEnhBBCCCFEClBhTgghhBBCiBSgwpwQQgghhBApQIU5IYQQ1pWWlmLt2rXIzMxkOwohhLCGCnNCCCFiHh4eGDdunPjxkCFD8N13332W1/6Qj48PMjMzYWxs3CQfixBCuIiWSySEEA7w8PBAaGgoAEBBQQEdO3aEm5sbli5dWuvmSY116tQpKCgoNMlr/fbbb6huIbDDhw8jNzcXf/zxR5N8HEII4SoqzAkhhCNGjRqF/fv3o6ysDH/++Sfmzp0LBQUFLFmyROJ57969g0AgaJKP2bp16yZ5HQDQ0NCo9rirqytcXV2b7OMQQghXUSsLIYRwhKKiItq2bYtOnTph9uzZGD58OMLDw8UtImvXroW+vj5MTU0BAA8fPsTEiROhqamJ1q1bY+zYscjNzRW/nkgkwoIFC6CpqQltbW0sXLiwyoj2x60sZWVlWLRoEQwMDKCoqAhjY2MEBweLz9+9exdjxoyBuro61NTUYGtri6ysLABVW1nKysrg4+MDXV1dKCkpYeDAgUhISBCfv3z5Mng8HiIjI2FtbQ0VFRX0798f9+/fb8LPKiGESA8qzAkhhKOUlZXx7t07AEBkZCTu37+Pixcv4ty5cygvL4e9vT3U1NRw5coVxMXFQVVVFaNGjRL/m02bNiEkJAT79u1DbGwsCgoKcPr06Vo/ppubG44ePYpt27YhNTUVu3fvhqqqKgDg8ePHGDRoEBQVFREVFYUbN27Ay8sLQqGw2tdauHAhTp48idDQUNy8eRPGxsawt7dHQUGBxPN+/PFHbNq0CYmJiZCXl4eXl1djP3WEECKVqJWFEEI4hmEYREZGIiIiAvPnz8fz58/RqlUr7N27V9zCcujQIVRUVGDv3r3g8XgAgP3790NTUxOXL1/GyJEjsXXrVixZsgQuLi4AgMDAQERERNT4cdPT03H8+HFcvHgRw4cPBwAYGhqKz+/YsQMaGhoICwsT96V37dq12td68+YNdu3ahZCQEDg4OAAA9uzZg4sXLyI4OBj+/v7i565duxaDBw8GACxevBhfffUVSktLoaSk1KDPHyGESCsaMSeEEI44d+4cVFVVoaSkBAcHB0yaNAmrVq0CAFhYWEj0lScnJyMzMxNqampQVVWFqqoqWrdujdLSUmRlZeHVq1f4559/0LdvX/G/kZeXh7W1dY0f/9atW5CTkxMXydWdt7W1rdNk0aysLJSXl2PAgAHiYwoKCrCxsUFqaqrEc3v27Cn+e7t27QAAz549++THIIQQrqERc0II4YihQ4di165dEAgE0NfXl1iNpVWrVhLPLS4uRp8+fXD48OEqr6Ojo9Ogj6+srNyo8w31YaH/fvS/oqLis3wsQghhE42YE0IIR7Rq1QrGxsbo2LHjJ5dI7N27NzIyMqCrqwtjY2OJPxoaGtDQ0EC7du3w3//+V/xvhEIhbty4UeNrWlhYoKKiAtHR0dWe79mzJ65cuYLy8vJPvhcjIyMIBALExcWJj5WXlyMhIQFmZmaf/PeEECKLqDAnhBAZ5OrqijZt2mDs2LG4cuUKcnJycPnyZfj4+ODRo0cAAF9fXwQEBODMmTNIS0vDnDlzUFhYWONrdu7cGe7u7vDy8sKZM2fEr3n8+HEAwLx581BUVITJkycjMTERGRkZOHjwYLWrqLRq1QqzZ8+Gv78/zp8/j3v37uGbb75BSUkJvL29P8vnhBBCpB0V5oQQIoNUVFQQExODjh07wsXFBd27d4e3tzdKS0uhrq4OAPj+++8xffp0uLu748svv4SamhqcnZ1rfd1du3bh66+/xpw5c9CtWzd88803ePPmDQBAW1sbUVFRKC4uxuDBg9GnTx/s2bOnxp7zgIAAjB8/HtOnT0fv3r2RmZmJiIgIaGlpNe0ngxBCOILHVLcNGyGEEEIIIaRZ0Yg5IYQQQgghUoAKc0IIIYQQQqQAFeaEEEIIIYRIASrMCSGEEEIIkQJUmBNCCCGEECIFqDAnhBBCCCFEClBhTgghhBBCiBSgwpwQQgghhBApQIU5IYQQQgghUoAKc0IIIYQQQqQAFeaEEEIIIYRIASrMCSGEEEIIkQL/D4C6QZHVrb+ZAAAAAElFTkSuQmCC\n"},"metadata":{}},{"name":"stdout","text":"Epoch 1/20\n11/11 - 8s - 737ms/step - accuracy: 0.2031 - loss: 2.3233\nEpoch 2/20\n11/11 - 0s - 36ms/step - accuracy: 0.4000 - loss: 1.8154\nEpoch 3/20\n11/11 - 0s - 35ms/step - accuracy: 0.5569 - loss: 1.5038\nEpoch 4/20\n11/11 - 0s - 35ms/step - accuracy: 0.7200 - loss: 1.1541\nEpoch 5/20\n11/11 - 0s - 35ms/step - accuracy: 0.8062 - loss: 0.9180\nEpoch 6/20\n11/11 - 0s - 36ms/step - accuracy: 0.8554 - loss: 0.7588\nEpoch 7/20\n11/11 - 0s - 35ms/step - accuracy: 0.9262 - loss: 0.6060\nEpoch 8/20\n11/11 - 0s - 35ms/step - accuracy: 0.9385 - loss: 0.5369\nEpoch 9/20\n11/11 - 0s - 36ms/step - accuracy: 0.9538 - loss: 0.4265\nEpoch 10/20\n11/11 - 0s - 36ms/step - accuracy: 0.9569 - loss: 0.3950\nEpoch 11/20\n11/11 - 0s - 36ms/step - accuracy: 0.9631 - loss: 0.3398\nEpoch 12/20\n11/11 - 0s - 35ms/step - accuracy: 0.9846 - loss: 0.3027\nEpoch 13/20\n11/11 - 0s - 35ms/step - accuracy: 0.9815 - loss: 0.2515\nEpoch 14/20\n11/11 - 0s - 35ms/step - accuracy: 0.9877 - loss: 0.2371\nEpoch 15/20\n11/11 - 0s - 35ms/step - accuracy: 0.9877 - loss: 0.2116\nEpoch 16/20\n11/11 - 0s - 35ms/step - accuracy: 1.0000 - loss: 0.1763\nEpoch 17/20\n11/11 - 0s - 35ms/step - accuracy: 0.9938 - loss: 0.1663\nEpoch 18/20\n11/11 - 0s - 35ms/step - accuracy: 0.9877 - loss: 0.1551\nEpoch 19/20\n11/11 - 0s - 35ms/step - accuracy: 0.9938 - loss: 0.1514\nEpoch 20/20\n11/11 - 0s - 35ms/step - accuracy: 0.9969 - loss: 0.1257\n","output_type":"stream"}],"execution_count":13},{"id":"aaf25e49-afac-4347-b9eb-ef59b8ee55d0","cell_type":"code","source":"import os, json, glob, zipfile, cv2, numpy as np, pandas as pd\nfrom tensorflow import keras\n\n# === Configura aquí según la competencia ===\nCANDIDATES = [\n    \"/kaggle/input/facial-recognition-7th-gen/test\",\n    \"/kaggle/input/facial-recognition-7th-gen/Test\",\n    \"/kaggle/input/facial-recognition-7thgen/test\",\n    \"/kaggle/input/test\",\n]\n\nTEST_DIR = None\nfor c in CANDIDATES:\n    if os.path.isdir(c):\n        TEST_DIR = c\n        break\n\nif TEST_DIR is None:\n    for base in glob.glob(\"/kaggle/input/*\"):\n        t = os.path.join(base, \"test\")\n        if os.path.isdir(t):\n            TEST_DIR = t\n            break\n\n# Columnas esperadas por la competencia\nSUBMIT_COL_ID = \"id\"       # Cambia si tu comp. pide otro nombre (e.g., \"filename\")\nSUBMIT_COL_LABEL = \"label\" # Cambia si pide \"target\", \"class\", etc.\n\nMODEL_PATH = \"modeloA_final.keras\"\n\n# === Cargar modelo y clases ===\nmodel = keras.models.load_model(MODEL_PATH)\n\ndef preprocess_224(img):\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    img = cv2.resize(img, (224,224))\n    x = img.astype(\"float32\")/255.0\n    x = (x*2.0) - 1.0  # [-1,1]\n    return np.expand_dims(x, 0)\n\ndef predict_path(p):\n    img = cv2.imread(p)\n    x = preprocess_224(img)\n    prob = model.predict(x, verbose=0)[0]\n    idx = int(np.argmax(prob))\n    return classes[idx], float(prob[idx])\n\n# === Lista de imágenes de test ===\ntest_files = []\nif TEST_DIR and os.path.isdir(TEST_DIR):\n    exts = (\".jpg\",\".jpeg\",\".png\",\".bmp\",\".webp\")\n    for r,_,fs in os.walk(TEST_DIR):\n        for f in fs:\n            if f.lower().endswith(exts):\n                test_files.append(os.path.join(r,f))\n\nif len(test_files) == 0:\n    print(\"No se encontró TEST_DIR; usando imágenes del dataset como demo.\")\n    for cl in classes:\n        pdir = os.path.join(DATA_DIR, cl)\n        imgs = [os.path.join(pdir, x) for x in os.listdir(pdir) if x.lower().endswith((\".jpg\",\".jpeg\",\".png\",\".bmp\",\".webp\"))]\n        if imgs:\n            test_files.append(imgs[0])\n    test_files = test_files[:10]\n\ntest_files = sorted(test_files)[:10]\nprint(\"Total test files:\", len(test_files))\n\n# === Inferencia y guardado CSV ===\nrows = []\nfor p in test_files:\n    pred_label, conf = predict_path(p)\n    rid = os.path.basename(p)\n    rows.append({SUBMIT_COL_ID: rid, SUBMIT_COL_LABEL: pred_label})\n\nsub_df = pd.DataFrame(rows)\nsub_df.to_csv(\"submission.csv\", index=False)\nprint(\"Guardado submission.csv\")\n\n# Guardar clases y empaquetar\nwith open(\"classes.json\", \"w\") as f:\n    json.dump(classes, f)\n\nwith zipfile.ZipFile(\"submission_bundle.zip\", \"w\", zipfile.ZIP_DEFLATED) as z:\n    z.write(\"submission.csv\")\n    if os.path.isfile(MODEL_PATH):\n        z.write(MODEL_PATH)\n    z.write(\"classes.json\")\n\nprint(\"Empaquetado submission_bundle.zip listo para subir\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T20:14:18.278027Z","iopub.execute_input":"2025-08-11T20:14:18.278407Z","iopub.status.idle":"2025-08-11T20:14:22.782754Z","shell.execute_reply.started":"2025-08-11T20:14:18.278381Z","shell.execute_reply":"2025-08-11T20:14:22.781935Z"}},"outputs":[{"name":"stdout","text":"No se encontró TEST_DIR; usando imágenes del dataset como demo.\nTotal test files: 10\nGuardado submission.csv\nEmpaquetado submission_bundle.zip listo para subir\n","output_type":"stream"}],"execution_count":19},{"id":"81b166fd-34c7-44b2-ac6b-ff247c77fa3a","cell_type":"code","source":"# 8) Función de inferencia para una imagen suelta (para pruebas rápidas)\ndef predict_image(model_path, img_path):\n    model = keras.models.load_model(model_path)\n    img = cv2.imread(img_path)\n    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)\n    img = cv2.resize(img, (224,224))\n    x = np.expand_dims(img, axis=0).astype(\"float32\")/255.0\n    x = keras.applications.mobilenet_v2.preprocess_input(x*255.0)\n    prob = model.predict(x, verbose=0)[0]\n    idx = prob.argmax()\n    return classes[idx], float(prob[idx])\n\n# Ejemplo (descomentar y ajustar ruta):\n# print(predict_image(\"modeloA_final.keras\", os.path.join(DATA_DIR, classes[0], os.listdir(os.path.join(DATA_DIR, classes[0]))[0])))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-11T20:08:22.168201Z","iopub.execute_input":"2025-08-11T20:08:22.168782Z","iopub.status.idle":"2025-08-11T20:08:22.173592Z","shell.execute_reply.started":"2025-08-11T20:08:22.168757Z","shell.execute_reply":"2025-08-11T20:08:22.172824Z"}},"outputs":[],"execution_count":16}]}