{"id":1119,"date":"2026-08-21T04:31:48","date_gmt":"2026-08-21T04:31:48","guid":{"rendered":"https:\/\/ocelote.ai\/?page_id=1119"},"modified":"2026-08-21T04:32:12","modified_gmt":"2026-08-21T04:32:12","slug":"aitana-pre-registro","status":"publish","type":"page","link":"https:\/\/ocelote.ai\/en\/aitana-ia\/aitana-pre-registro\/","title":{"rendered":"AITANA Pre-registro"},"content":{"rendered":"\n<div class=\"wp-block-cover alignfull\" style=\"min-height:520px;aspect-ratio:unset;\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"415\" class=\"wp-block-cover__image-background wp-image-554 size-large\" alt=\"\" src=\"https:\/\/preprod.ocelote.ai\/wp-content\/uploads\/2026\/06\/Banner-Comedor-Comunitario-c-Logo-1024x415.png\" data-object-fit=\"cover\" srcset=\"https:\/\/ocelote.ai\/wp-content\/uploads\/2026\/06\/Banner-Comedor-Comunitario-c-Logo-1024x415.png 1024w, https:\/\/ocelote.ai\/wp-content\/uploads\/2026\/06\/Banner-Comedor-Comunitario-c-Logo-300x121.png 300w, https:\/\/ocelote.ai\/wp-content\/uploads\/2026\/06\/Banner-Comedor-Comunitario-c-Logo-768x311.png 768w, https:\/\/ocelote.ai\/wp-content\/uploads\/2026\/06\/Banner-Comedor-Comunitario-c-Logo-1536x622.png 1536w, https:\/\/ocelote.ai\/wp-content\/uploads\/2026\/06\/Banner-Comedor-Comunitario-c-Logo-18x7.png 18w, https:\/\/ocelote.ai\/wp-content\/uploads\/2026\/06\/Banner-Comedor-Comunitario-c-Logo.png 1640w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><span aria-hidden=\"true\" class=\"wp-block-cover__background has-black-background-color has-background-dim-40 has-background-dim\"><\/span><div class=\"wp-block-cover__inner-container has-global-padding is-layout-constrained wp-block-cover-is-layout-constrained\">\n<h2 class=\"wp-block-heading has-text-align-right has-xx-large-font-size\"><br><br>Preregistro en <br>AITANA<\/h2>\n<\/div><\/div>\n\n\n\n<style>\r\n    :root {\r\n        --aitana-primary: #1F2937;\r\n        --aitana-secondary: #03A022; \/* Verde solicitado *\/\r\n        --aitana-secondary-hover: #02851c;\r\n        --aitana-bg: #F3F4F6;\r\n        --aitana-text: #374151;\r\n        --aitana-border: #D1D5DB;\r\n        --aitana-error: #DC2626;\r\n        --font-main: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\r\n    }\r\n\r\n    .aitana-container, .aitana-wrapper {\r\n        font-family: var(--font-main) !important;\r\n        color: var(--aitana-text);\r\n        width: 100% !important;\r\n        max-width: 900px !important;\r\n        margin: 40px 15px !important;\r\n        background: #FFFFFF;\r\n        border-radius: 12px;\r\n        box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\r\n        overflow: hidden;\r\n        box-sizing: border-box;\r\n    }\r\n\r\n    .aitana-container *, .aitana-wrapper * {\r\n        font-family: var(--font-main) !important;\r\n    }\r\n\r\n    .wp-breakout {\r\n        width: 100vw !important;\r\n        max-width: 100vw !important;\r\n        margin-left: calc(-50vw + 50%) !important;\r\n        margin-right: calc(-50vw + 50%) !important;\r\n        display: flex !important;\r\n        justify-content: center !important;\r\n        align-items: flex-start !important;\r\n        background: transparent !important;\r\n    }\r\n\r\n    \/* HEADER GLOBAL *\/\r\n    .header-ui, .aitana-header {\r\n        background: #FFFFFF;\r\n        padding: 25px 30px;\r\n        display: flex;\r\n        flex-direction: row;\r\n        justify-content: space-between;\r\n        align-items: center;\r\n        border-bottom: 1px solid var(--aitana-border);\r\n        gap: 20px;\r\n    }\r\n    .header-title h1 {\r\n        margin: 0;\r\n        font-size: 1.6rem;\r\n        font-weight: 800;\r\n        line-height: 1.2;\r\n        color: var(--aitana-secondary);\r\n    }\r\n    .header-title h2 {\r\n        margin: 0;\r\n        font-size: 1.4rem;\r\n        font-weight: 800;\r\n        line-height: 1.2;\r\n        color: var(--aitana-secondary);\r\n    }\r\n    .header-user-info, .user-info-box {\r\n        background: transparent;\r\n        color: var(--aitana-secondary);\r\n        padding: 0;\r\n        border: none;\r\n        font-size: 0.95rem;\r\n        font-weight: normal;\r\n        text-align: right;\r\n        max-width: 400px;\r\n    }\r\n    .header-user-info small, .user-info-box small {\r\n        display: block;\r\n        margin-top: 5px;\r\n        color: #6B7280;\r\n        font-size: 0.75rem;\r\n        line-height: 1.3;\r\n    }\r\n    @media (max-width: 768px) {\r\n        .header-ui, .aitana-header {\r\n            flex-direction: column;\r\n            text-align: center;\r\n        }\r\n        .header-user-info, .user-info-box {\r\n            text-align: center;\r\n        }\r\n    }\r\n\r\n    .form-card, .aitana-body {\r\n        padding: 30px;\r\n        background: #FFFFFF;\r\n    }\r\n\r\n    \/* DEBUG PANEL *\/\r\n    .debug-box {\r\n        margin-top: 25px;\r\n        background: #1e1e1e;\r\n        border: 1px solid #333;\r\n        border-radius: 10px;\r\n        padding: 15px;\r\n        text-align: left;\r\n        display: block;\r\n    }\r\n    .debug-title {\r\n        font-size: 11px;\r\n        font-weight: bold;\r\n        color: #aaa;\r\n        margin-bottom: 8px;\r\n        text-transform: uppercase;\r\n        font-family: monospace;\r\n    }\r\n    .debug-content {\r\n        font-size: 12px;\r\n        color: #00FF41;\r\n        font-family: monospace;\r\n        white-space: pre-wrap;\r\n        word-break: break-all;\r\n        max-height: 250px;\r\n        overflow-y: auto;\r\n    }\r\n\r\n    \/* WIZARD STEPS *\/\r\n    .step {\r\n        display: none;\r\n        animation: fadeIn 0.4s ease-out;\r\n    }\r\n    .step.active {\r\n        display: block;\r\n    }\r\n\r\n    @keyframes fadeIn {\r\n        from { opacity: 0; transform: translateY(10px); }\r\n        to { opacity: 1; transform: translateY(0); }\r\n    }\r\n\r\n    \/* TYPOGRAPHY & LAYOUT *\/\r\n    .intro-text, .welcome-text {\r\n        font-size: 0.9rem;\r\n        line-height: 1.5;\r\n        margin-bottom: 25px;\r\n        color: #4B5563;\r\n        text-align: justify;\r\n    }\r\n    .intro-text p, .welcome-text p {\r\n        margin-bottom: 12px;\r\n    }\r\n    .important-notice {\r\n        background: #FFFBEB;\r\n        border-left: 4px solid #F59E0B;\r\n        padding: 15px;\r\n        margin-bottom: 25px;\r\n        border-radius: 4px;\r\n        font-size: 0.95rem;\r\n    }\r\n    .role-notice {\r\n        background: #F0FDF4;\r\n        border-left: 4px solid var(--aitana-secondary);\r\n        padding: 15px;\r\n        margin-top: 15px;\r\n        border-radius: 4px;\r\n        font-size: 0.95rem;\r\n        color: #065F46;\r\n    }\r\n\r\n    \/* FORMS *\/\r\n    .form-group {\r\n        margin-bottom: 20px;\r\n        position: relative;\r\n    }\r\n    .form-group label {\r\n        display: block;\r\n        font-weight: 500;\r\n        margin-bottom: 8px;\r\n        font-size: 0.95rem;\r\n    }\r\n    .required {\r\n        color: var(--aitana-error);\r\n    }\r\n    .form-control {\r\n        width: 100%;\r\n        padding: 12px;\r\n        border: 1px solid var(--aitana-border);\r\n        border-radius: 6px;\r\n        font-family: inherit;\r\n        font-size: 1rem;\r\n        transition: all 0.2s;\r\n        box-sizing: border-box;\r\n    }\r\n    .form-control:focus {\r\n        outline: none;\r\n        border-color: var(--aitana-secondary);\r\n        box-shadow: 0 0 0 3px rgba(5, 150, 105, 0.1);\r\n    }\r\n    .form-control.is-invalid {\r\n        border-color: var(--aitana-error);\r\n        background-color: #FEF2F2;\r\n    }\r\n\r\n    \/* TOOLTIP ROJO *\/\r\n    .error-tooltip {\r\n        display: none;\r\n        position: absolute;\r\n        bottom: 100%;\r\n        left: 0;\r\n        background: var(--aitana-error);\r\n        color: white;\r\n        padding: 6px 12px;\r\n        border-radius: 4px;\r\n        font-size: 0.8rem;\r\n        margin-bottom: 5px;\r\n        white-space: nowrap;\r\n        z-index: 10;\r\n        box-shadow: 0 2px 4px rgba(0,0,0,0.2);\r\n    }\r\n    .error-tooltip::after {\r\n        content: '';\r\n        position: absolute;\r\n        top: 100%;\r\n        left: 15px;\r\n        border-width: 5px;\r\n        border-style: solid;\r\n        border-color: var(--aitana-error) transparent transparent transparent;\r\n    }\r\n    .form-group.show-error:hover .error-tooltip,\r\n    .form-group.show-error:focus-within .error-tooltip {\r\n        display: block;\r\n        animation: fadeIn 0.2s ease-out;\r\n    }\r\n\r\n    \/* OVERRIDES PARA CHECKBOXES LEGALES (Evitar herencia de WP) *\/\r\n    #legalSection {\r\n        max-width: 100% !important;\r\n        width: 100% !important;\r\n    }\r\n    #legalSection .flex-check {\r\n        display: flex !important;\r\n        flex-direction: row !important;\r\n        align-items: center !important;\r\n        justify-content: center !important;\r\n        width: 100% !important;\r\n        max-width: 100% !important;\r\n        margin-bottom: 5px !important;\r\n    }\r\n    #legalSection label {\r\n        font-size: 0.8rem !important;\r\n        margin: 0 !important;\r\n        line-height: 1 !important;\r\n        white-space: nowrap !important; \/* Fuerza a una sola l\u00ednea *\/\r\n        max-width: 100% !important;\r\n        display: inline-block !important;\r\n    }\r\n    @media (max-width: 500px) {\r\n        #legalSection label {\r\n            white-space: normal !important; \/* Permitir salto en m\u00f3viles muy peque\u00f1os *\/\r\n            text-align: left !important;\r\n        }\r\n    }\r\n\r\n    \/* PROGRESS BAR *\/\r\n    .progress-container {\r\n        display: none; \/* hidden step 1 if desired, but we will show it always *\/\r\n        width: 100%;\r\n        margin: 10px 0 30px;\r\n    }\r\n    .progress-track {\r\n        display: flex;\r\n        justify-content: space-between;\r\n        align-items: center;\r\n        position: relative;\r\n        max-width: 500px;\r\n        margin: 0 auto;\r\n    }\r\n    .progress-track::before {\r\n        content: '';\r\n        position: absolute;\r\n        top: 50%;\r\n        left: 0;\r\n        right: 0;\r\n        height: 3px;\r\n        background: #E5E7EB;\r\n        z-index: 1;\r\n        transform: translateY(-50%);\r\n    }\r\n    .progress-node {\r\n        width: 24px;\r\n        height: 24px;\r\n        border-radius: 50%;\r\n        background: #E5E7EB;\r\n        z-index: 2;\r\n        position: relative;\r\n        transition: background 0.3s;\r\n    }\r\n    .progress-node.completed {\r\n        background: var(--aitana-primary); \/* Azul para nosotros, pero en Ocelote es #2563EB? usaremos azul standard: #3B82F6 *\/\r\n        background: #3B82F6;\r\n    }\r\n    .progress-node.active {\r\n        background: var(--aitana-secondary); \/* Verde actual *\/\r\n        box-shadow: 0 0 0 4px rgba(5, 150, 105, 0.2);\r\n    }\r\n    .progress-title {\r\n        color: var(--aitana-secondary);\r\n        font-size: 1.1rem;\r\n        font-weight: bold;\r\n        text-align: center;\r\n        margin-top: 15px;\r\n    }\r\n\r\n    \/* ANIMACIONES DE VAG\u00d3N *\/\r\n    .step-content {\r\n        display: none;\r\n        animation-duration: 0.4s;\r\n        animation-fill-mode: both;\r\n        animation-timing-function: ease-in-out;\r\n    }\r\n    .step-content.active {\r\n        display: block;\r\n    }\r\n    @keyframes slideInRight {\r\n        from { transform: translateX(50px); opacity: 0; }\r\n        to { transform: translateX(0); opacity: 1; }\r\n    }\r\n    @keyframes slideInLeft {\r\n        from { transform: translateX(-50px); opacity: 0; }\r\n        to { transform: translateX(0); opacity: 1; }\r\n    }\r\n    .slide-in-forward { animation-name: slideInRight; }\r\n    .slide-in-backward { animation-name: slideInLeft; }\r\n\r\n    \/* GRID & SPLIT SCREEN *\/\r\n    .grid-2 {\r\n        display: grid;\r\n        grid-template-columns: 1fr 1fr;\r\n        gap: 20px;\r\n    }\r\n    .split-screen {\r\n        display: grid;\r\n        grid-template-columns: 1fr 1fr;\r\n        gap: 30px;\r\n        align-items: stretch;\r\n    }\r\n    @media (max-width: 768px) {\r\n        .split-screen, .grid-2 {\r\n            grid-template-columns: 1fr;\r\n        }\r\n        .user-info-box {\r\n            text-align: left;\r\n        }\r\n    }\r\n\r\n    \/* MAPS *\/\r\n    .map-container {\r\n        background: #E5E7EB;\r\n        border-radius: 8px;\r\n        overflow: hidden;\r\n        min-height: 300px;\r\n        height: 100%;\r\n        position: relative;\r\n    }\r\n    .map-container iframe {\r\n        width: 100%;\r\n        height: 100%;\r\n        border: 0;\r\n        position: absolute;\r\n        top: 0;\r\n        left: 0;\r\n        transition: opacity 0.5s ease-in-out;\r\n    }\r\n\r\n    \/* BUTTONS *\/\r\n    .btn-container {\r\n        display: flex;\r\n        justify-content: space-between;\r\n        margin-top: 30px;\r\n        padding-top: 20px;\r\n        border-top: 1px solid var(--aitana-border);\r\n    }\r\n    .btn-container.right {\r\n        justify-content: flex-end;\r\n    }\r\n    .btn {\r\n        padding: 12px 24px;\r\n        border-radius: 6px;\r\n        font-weight: 600;\r\n        font-size: 1rem;\r\n        cursor: pointer;\r\n        transition: all 0.2s;\r\n        border: none;\r\n        font-family: inherit;\r\n    }\r\n    .btn-primary {\r\n        background: var(--aitana-secondary);\r\n        color: white;\r\n    }\r\n    .btn-primary:hover {\r\n        background: var(--aitana-secondary-hover);\r\n    }\r\n    .btn-secondary {\r\n        background: white;\r\n        border: 1px solid var(--aitana-border);\r\n        color: var(--aitana-text);\r\n    }\r\n    .btn-secondary:hover {\r\n        background: var(--aitana-bg);\r\n    }\r\n    .btn:disabled {\r\n        opacity: 0.5;\r\n        cursor: not-allowed;\r\n    }\r\n\r\n    \/* SUMMARY *\/\r\n    .summary-box {\r\n        background: #F9FAFB;\r\n        padding: 25px 30px;\r\n        border-radius: 8px;\r\n        border: 1px solid var(--aitana-border);\r\n        margin-bottom: 25px;\r\n    }\r\n    .summary-item {\r\n        display: grid;\r\n        grid-template-columns: 1fr 1fr;\r\n        column-gap: 20px;\r\n        align-items: center;\r\n        padding: 10px 0;\r\n        border-bottom: 1px solid #E5E7EB;\r\n    }\r\n    .summary-item:last-child {\r\n        border-bottom: none;\r\n    }\r\n    .summary-label {\r\n        text-align: right;\r\n        font-weight: 600;\r\n        color: #4B5563;\r\n        font-size: 0.95rem;\r\n    }\r\n    .summary-value {\r\n        text-align: left;\r\n        font-weight: 700;\r\n        color: var(--aitana-secondary); \/* Verde Ocelote *\/\r\n        font-size: 1rem;\r\n        word-break: break-word;\r\n    }\r\n    .summary-divider {\r\n        height: 1px;\r\n        background: #D1D5DB;\r\n        margin: 12px 0;\r\n    }\r\n\r\n    \/* NOTA \u00c1MBAR L\u00cdNEA IZQUIERDA *\/\r\n    .important-notice-left, .important-notice-right {\r\n        background: #FFFBEB;\r\n        border-left: 4px solid #F59E0B;\r\n        border-right: none;\r\n        padding: 16px 20px;\r\n        margin: 25px 0;\r\n        border-radius: 4px;\r\n        font-size: 0.95rem;\r\n        color: #92400E;\r\n        line-height: 1.5;\r\n        text-align: left;\r\n    }\r\n\r\n    \/* CHECKBOX DIN\u00c1MICO (\u00c1MBAR -> VERDE AL SELECCIONAR) *\/\r\n    .dynamic-check-card {\r\n        background: #FFFBEB;\r\n        border: 1px solid #FEF3C7;\r\n        border-left: 4px solid #F59E0B;\r\n        border-radius: 6px;\r\n        padding: 14px 18px;\r\n        margin: 10px 0;\r\n        transition: all 0.25s ease;\r\n        cursor: pointer;\r\n        text-align: left;\r\n        width: 100%;\r\n        box-sizing: border-box;\r\n    }\r\n    .dynamic-check-card label {\r\n        font-size: 0.90rem;\r\n        color: #92400E;\r\n        line-height: 1.45;\r\n        cursor: pointer;\r\n        margin: 0;\r\n        font-weight: 500;\r\n        transition: color 0.25s ease;\r\n        user-select: none;\r\n    }\r\n    .dynamic-check-card a {\r\n        color: #B45309;\r\n        font-weight: 700;\r\n        text-decoration: underline;\r\n        transition: color 0.25s ease;\r\n    }\r\n    .dynamic-check-card input[type=\"checkbox\"] {\r\n        transform: scale(1.25);\r\n        margin-top: 2px;\r\n        flex-shrink: 0;\r\n        cursor: pointer;\r\n        accent-color: #007A3D;\r\n    }\r\n\r\n    \/* ESTADO SELECCIONADO (VERDE OCELOTE) *\/\r\n    .dynamic-check-card.is-checked,\r\n    .dynamic-check-card:has(input:checked) {\r\n        background: #F0FDF4;\r\n        border-color: #BBF7D0;\r\n        border-left: 4px solid #16A34A;\r\n    }\r\n    .dynamic-check-card.is-checked label,\r\n    .dynamic-check-card:has(input:checked) label {\r\n        color: #166534;\r\n    }\r\n    .dynamic-check-card.is-checked a,\r\n    .dynamic-check-card:has(input:checked) a {\r\n        color: #15803D;\r\n    }\r\n\r\n    \/* LOADING OVERLAY *\/\r\n    .loading-overlay {\r\n        position: fixed;\r\n        top: 0; left: 0; width: 100%; height: 100%;\r\n        background: rgba(255,255,255,0.9);\r\n        display: none;\r\n        justify-content: center;\r\n        align-items: center;\r\n        flex-direction: column;\r\n        z-index: 9999;\r\n    }\r\n    .spinner {\r\n        width: 50px; height: 50px;\r\n        border: 5px solid #f3f3f3;\r\n        border-top: 5px solid var(--aitana-secondary);\r\n        border-radius: 50%;\r\n        animation: spin 1s linear infinite;\r\n    }\r\n    @keyframes spin { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }\r\n\r\n<\/style>\r\n\r\n<div class=\"wp-breakout\">\r\n    <div class=\"aitana-container\">\r\n        <!-- Header (Logo \/ Info Usuario) -->\r\n        <div class=\"header-ui\" id=\"headerUI\" style=\"display:none;\">\r\n            <div class=\"header-title\">\r\n                <h1 style=\"color: var(--aitana-secondary); margin:0; font-size:1.6rem; font-weight:800; line-height: 1.2;\">Pre-registro en AITANA<\/h1>\r\n                <h2 style=\"color: var(--aitana-secondary); margin:0; font-size:1.4rem; font-weight:800; line-height: 1.2;\">by Ocelote Labs<\/h2>\r\n            <\/div>\r\n            <div class=\"header-user-info\">\r\n                <div style=\"font-weight:normal; font-size:0.95rem; color:var(--aitana-secondary);\">Usuario: <span id=\"hdrUserNombre\" style=\"font-weight:normal;\"><\/span><\/div>\r\n                <div style=\"font-weight:normal; font-size:0.9rem; color:var(--aitana-secondary); margin-top:2px;\">Correo Autenticado: <span id=\"hdrUserEmail\" style=\"font-weight:normal;\"><\/span><\/div>\r\n                <div style=\"font-size:0.8rem; margin-top:5px; color:#9CA3AF;\">\r\n                    Recopilamos autom\u00e1ticamente datos por seguridad y alineados a nuestros \r\n                    <a href=\"https:\/\/ocelote.ai\/terminos-y-condiciones\/\" target=\"_blank\" style=\"color: var(--aitana-primary); text-decoration: none;\">T\u00e9rminos y Condiciones<\/a> y nuestro \r\n                    <a href=\"https:\/\/ocelote.ai\/aviso-de-privacidad\/\" target=\"_blank\" style=\"color: var(--aitana-primary); text-decoration: none;\">Aviso de Privacidad<\/a>.\r\n                <\/div>\r\n            <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"form-card\">\r\n            \r\n            <!-- BARRA DE PROGRESO -->\r\n            <div class=\"progress-container\" id=\"progressContainer\" style=\"display:block;\">\r\n                <div class=\"progress-track\">\r\n                    <div class=\"progress-node active\" id=\"node1\"><\/div>\r\n                    <div class=\"progress-node\" id=\"node2\"><\/div>\r\n                    <div class=\"progress-node\" id=\"node3\"><\/div>\r\n                    <div class=\"progress-node\" id=\"node4\"><\/div>\r\n                    <div class=\"progress-node\" id=\"node5\"><\/div>\r\n                <\/div>\r\n                <div class=\"progress-title\" id=\"progressTitle\">Bienvenida, T\u00e9rminos y Condiciones<\/div>\r\n            <\/div>\r\n\r\n            <!-- PASO 1: Aceptaci\u00f3n y Google Login -->\r\n            <div id=\"step1\" class=\"step-content active slide-in-forward\">\r\n                <div class=\"intro-text\" style=\"text-align: center; margin-bottom: 30px;\">\r\n                    <p>Bienvenido(a). Por motivos de seguridad, por favor verifica que eres humano antes de continuar.<\/p>\r\n                <\/div>\r\n                \r\n                <!-- Cloudflare Turnstile -->\r\n                <div style=\"margin: 20px auto; min-height: 65px; display: flex; justify-content: center;\">\r\n                    <script src=\"https:\/\/challenges.cloudflare.com\/turnstile\/v0\/api.js\" async defer><\/script>\r\n                    <div class=\"cf-turnstile\" data-sitekey=\"0x4AAAAAAEPTBAlDd7ZmydTK\" data-callback=\"onTurnstileSuccess\"><\/div>\r\n                <\/div>\r\n\r\n                <div id=\"legalSection\" style=\"display:none; padding: 20px 15px; background: var(--aitana-bg); border-radius: 8px; width: 100%; box-sizing: border-box;\">\r\n                    <div style=\"display: flex; flex-direction: column; align-items: center; width: 100%; max-width: 540px; margin: 0 auto;\">\r\n                        \r\n                        <div class=\"dynamic-check-card\" id=\"cardPrivacidad\">\r\n                            <div style=\"display: flex; flex-direction: row; align-items: flex-start; gap: 12px;\">\r\n                                <input type=\"checkbox\" id=\"chkPrivacidad\">\r\n                                <label for=\"chkPrivacidad\">\r\n                                    He le\u00eddo y acepto el <a href=\"https:\/\/ocelote.ai\/aviso-de-privacidad\/\" target=\"_blank\">Aviso de Privacidad<\/a> de Ocelote Labs.\r\n                                <\/label>\r\n                            <\/div>\r\n                        <\/div>\r\n\r\n                        <div class=\"dynamic-check-card\" id=\"cardTyc\">\r\n                            <div style=\"display: flex; flex-direction: row; align-items: flex-start; gap: 12px;\">\r\n                                <input type=\"checkbox\" id=\"chkTyc\">\r\n                                <label for=\"chkTyc\">\r\n                                    He le\u00eddo y acepto los <a href=\"https:\/\/ocelote.ai\/terminos-y-condiciones\/\" target=\"_blank\">T\u00e9rminos y Condiciones<\/a> de Ocelote Labs.\r\n                                <\/label>\r\n                            <\/div>\r\n                        <\/div>\r\n\r\n                        <div style=\"margin-top: 15px; width: 100%; display: flex; justify-content: center;\" id=\"googleButtonContainer\">\r\n                            <div id=\"googleSignInWrapper\" style=\"pointer-events: none; opacity: 0.5; width: 100%; max-width: 320px; display: flex; justify-content: center; align-items: center; padding: 5px 0;\">\r\n                                <div id=\"btnGoogleJs\" style=\"width: 100%; display: flex; justify-content: center;\"><\/div>\r\n                            <\/div>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- PASO 2: VALIDACION RFC -->\r\n            <div id=\"step2\" class=\"step-content\">\r\n                <div class=\"welcome-text\">\r\n                    <div class=\"important-notice\">\r\n                        <strong>Importante:<\/strong> El pre-registro es el primero de 2 pasos para el alta. Es muy necesario que leas toda la informaci\u00f3n que se te vaya presentando.\r\n                    <\/div>\r\n                    \r\n                    <p class=\"intro-text\">\r\n                        Bienvenido(a) a <strong>AITANA<\/strong> (<strong>A<\/strong>viso de <strong>ITA<\/strong>cate en la <strong>N<\/strong>ube para <strong>A<\/strong>sistencia), una soluci\u00f3n de <a href=\"http:\/\/ocelote.ai\/\" target=\"_blank\" style=\"color: var(--aitana-primary); text-decoration: none; font-weight: bold;\">Ocelote Labs<\/a> para <strong>automatizar el prop\u00f3sito social<\/strong>. Est\u00e1s por ingresar a un flujo que sigue evolucionando gracias a tu gran coraz\u00f3n.\r\n                    <\/p>\r\n                    <p class=\"intro-text\">\r\n                        Aunque nuestro ecosistema es <strong>impulsado por IA<\/strong> de \u00faltima generaci\u00f3n, tu pre-registro inicial requerir\u00e1 una <strong>Validaci\u00f3n Normativa de la Entidad<\/strong> por parte de un humano para garantizar la seguridad de nuestro circuito, as\u00ed como la precisi\u00f3n de los datos proporcionados.\r\n                    <\/p>\r\n                    <p>La tecnolog\u00eda se encargar\u00e1 del resto para que tus futuras interacciones con nuestra plataforma <strong>fluyan de manera conversacional y sin fricciones, a trav\u00e9s de aplicaciones de chat y nuestra p\u00e1gina web<\/strong>.<\/p>\r\n                <\/div>\r\n                <div class=\"form-group\" style=\"max-width: 400px;\">\r\n                    <label>Indica el RFC de la entidad (nodo) que quieres dar de alta: <span class=\"required\">*<\/span><\/label>\r\n                    <div class=\"error-tooltip\" id=\"tt-rfc\">Recuerda que un RFC de persona moral v\u00e1lido tiene 3 iniciales, 6 d\u00edgitos de fecha (AAMMDD), y 3 caracteres de homoclave.<\/div>\r\n                    <input type=\"text\" id=\"rfc\" class=\"form-control\" placeholder=\"Ej. OLA211026XXX\" maxlength=\"12\" style=\"text-transform: uppercase;\">\r\n                <\/div>\r\n                <div class=\"btn-container right\">\r\n                    <button type=\"button\" class=\"btn btn-primary\" id=\"btnValidarRfc\">Validar RFC<\/button>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- PASO 3: DATOS DE NODO -->\r\n            <div id=\"step3\" class=\"step-content\">\r\n                <div class=\"intro-text\">\r\n                    Revisa por favor la informaci\u00f3n del Comercio \/ Donataria Autorizada antes de compartirla, ya que algunos campos son de captura libre. Mientras m\u00e1s limpios sean los valores insertados, mejor los interpretar\u00e1 AITANA.\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n                    <label>\u00bfQu\u00e9 funci\u00f3n desempe\u00f1ar\u00e1 tu entidad (El nodo) dentro del circuito? <span class=\"required\">*<\/span><\/label>\r\n                    <div class=\"error-tooltip\" id=\"tt-tipo\">Por favor selecciona una funci\u00f3n.<\/div>\r\n                    <div>\r\n                        <label style=\"display:inline-block; margin-right: 15px; font-weight:normal;\">\r\n                            <input type=\"radio\" name=\"tipo_nodo\" value=\"C\" checked> Comercio (Donante)\r\n                        <\/label>\r\n                        <label style=\"display:inline-block; font-weight:normal;\">\r\n                            <input type=\"radio\" name=\"tipo_nodo\" value=\"D\"> Donataria Autorizada\r\n                        <\/label>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"form-group\">\r\n                    <label>Raz\u00f3n Social (tal como aparece en la Constancia de Situaci\u00f3n Fiscal) <span class=\"required\">*<\/span><\/label>\r\n                    <div class=\"error-tooltip\" id=\"tt-razon\">Ingresa una raz\u00f3n social v\u00e1lida.<\/div>\r\n                    <input type=\"text\" id=\"razon_social\" class=\"form-control\">\r\n                <\/div>\r\n\r\n                <div class=\"split-screen\" style=\"margin-top: 30px;\">\r\n                    <div>\r\n                        <h3 style=\"margin-top:0; font-size:1.1rem; margin-bottom:15px;\">Ubicaci\u00f3n F\u00edsica del Nodo<\/h3>\r\n                        <div class=\"form-group\">\r\n                            <label>C\u00f3digo Postal <span class=\"required\">*<\/span><\/label>\r\n                            <div class=\"error-tooltip\" id=\"tt-cp\">Ingresa un CP v\u00e1lido.<\/div>\r\n                            <input type=\"text\" id=\"cp\" class=\"form-control\" maxlength=\"5\" placeholder=\"Ej. 11000\">\r\n                        <\/div>\r\n                        \r\n                        <div class=\"grid-2\">\r\n                            <div class=\"form-group\">\r\n                                <label>Estado<\/label>\r\n                                <input type=\"text\" id=\"estado\" class=\"form-control\" readonly style=\"background:#F9FAFB;\">\r\n                            <\/div>\r\n                            <div class=\"form-group\">\r\n                                <label>Alcald\u00eda \/ Municipio<\/label>\r\n                                <input type=\"text\" id=\"alcaldia\" class=\"form-control\" readonly style=\"background:#F9FAFB;\">\r\n                            <\/div>\r\n                        <\/div>\r\n\r\n                        <div class=\"form-group\">\r\n                            <label>Colonia <span class=\"required\">*<\/span><\/label>\r\n                            <div class=\"error-tooltip\" id=\"tt-colonia\">Selecciona una colonia.<\/div>\r\n                            <select id=\"colonia\" class=\"form-control\">\r\n                                <option value=\"\">Primero ingresa un CP<\/option>\r\n                            <\/select>\r\n                        <\/div>\r\n\r\n                        <div class=\"grid-2\" style=\"grid-template-columns: 2fr 1fr 1fr;\">\r\n                            <div class=\"form-group\">\r\n                                <label>Calle <span class=\"required\">*<\/span><\/label>\r\n                                <div class=\"error-tooltip\" id=\"tt-calle\">Requerido.<\/div>\r\n                                <input type=\"text\" id=\"calle\" class=\"form-control\">\r\n                            <\/div>\r\n                            <div class=\"form-group\">\r\n                                <label>N\u00fam. Ext <span class=\"required\">*<\/span><\/label>\r\n                                <div class=\"error-tooltip\" id=\"tt-numext\">Requerido.<\/div>\r\n                                <input type=\"text\" id=\"num_ext\" class=\"form-control\">\r\n                            <\/div>\r\n                            <div class=\"form-group\">\r\n                                <label>N\u00fam. Int<\/label>\r\n                                <input type=\"text\" id=\"num_int\" class=\"form-control\">\r\n                            <\/div>\r\n                        <\/div>\r\n                        \r\n                        <div style=\"text-align: right;\">\r\n                            <button type=\"button\" class=\"btn btn-secondary\" id=\"btnValidarDomicilio\" style=\"padding: 8px 15px; font-size: 0.9rem;\">Validar Domicilio<\/button>\r\n                        <\/div>\r\n                    <\/div>\r\n                    \r\n                    <div class=\"map-container\">\r\n                        <iframe id=\"mapFrame\" src=\"https:\/\/www.google.com\/maps?q=Mexico&#038;t=m&#038;z=5&#038;output=embed\" allowfullscreen><\/iframe>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"btn-container\">\r\n                    <button type=\"button\" class=\"btn btn-secondary\" onclick=\"goToStep(2)\">Volver<\/button>\r\n                    <button type=\"button\" class=\"btn btn-primary\" id=\"btnNextTo4\" disabled>Siguiente<\/button>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- PASO 4: DATOS DE CONTACTO -->\r\n            <div id=\"step4\" class=\"step-content\">\r\n                <h3 style=\"margin-top:0; margin-bottom:20px;\">Datos del Contacto Principal<\/h3>\r\n                \r\n                <div class=\"grid-2\">\r\n                    <div class=\"form-group\">\r\n                        <label>Nombre(s) <span class=\"required\">*<\/span><\/label>\r\n                        <div class=\"error-tooltip\" id=\"tt-nombre\">M\u00ednimo 2 caracteres.<\/div>\r\n                        <input type=\"text\" id=\"nombre\" class=\"form-control\">\r\n                    <\/div>\r\n                    <div class=\"form-group\">\r\n                        <label>Apellido Paterno <span class=\"required\">*<\/span><\/label>\r\n                        <div class=\"error-tooltip\" id=\"tt-apellidop\">M\u00ednimo 2 caracteres.<\/div>\r\n                        <input type=\"text\" id=\"apellido_p\" class=\"form-control\">\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"grid-2\">\r\n                    <div class=\"form-group\">\r\n                        <label>Apellido Materno<\/label>\r\n                        <input type=\"text\" id=\"apellido_m\" class=\"form-control\">\r\n                    <\/div>\r\n                    <div class=\"form-group\">\r\n                        <label>Correo Electr\u00f3nico Institucional <span class=\"required\">*<\/span><\/label>\r\n                        <div class=\"error-tooltip\" id=\"tt-email\">Formato de correo inv\u00e1lido o ya registrado.<\/div>\r\n                        <input type=\"email\" id=\"email\" class=\"form-control\">\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"grid-2\">\r\n                    <div class=\"form-group\">\r\n                        <label>Tel\u00e9fono M\u00f3vil (a 10 d\u00edgitos) <span class=\"required\">*<\/span><\/label>\r\n                        <div class=\"error-tooltip\" id=\"tt-telefono\">Ingresa un n\u00famero v\u00e1lido o que no tengas ya registrado con Ocelote Labs y que tenga instalado Telegram o WhatsApp.<\/div>\r\n                        <input type=\"text\" id=\"telefono\" class=\"form-control\" maxlength=\"10\">\r\n                    <\/div>\r\n                    <div class=\"form-group\">\r\n                        <label>Puesto \/ Rol <span class=\"required\">*<\/span><\/label>\r\n                        <div class=\"error-tooltip\" id=\"tt-rol\">Selecciona tu rol.<\/div>\r\n                        <div>\r\n                            <label style=\"display:block; margin-bottom:10px; font-weight:normal;\">\r\n                                <input type=\"radio\" name=\"rol\" value=\"Due\u00f1o \/ Director General\" checked> Due\u00f1o \/ Director General\r\n                            <\/label>\r\n                            <label style=\"display:block; font-weight:normal;\">\r\n                                <input type=\"radio\" name=\"rol\" value=\"Gerente \/ Operativo\"> Gerente (Colaborador) \/ Responsable de Alianzas \/ Operativo\r\n                            <\/label>\r\n                        <\/div>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <!-- CHECKBOX DE CAPACIDAD Y VERACIDAD -->\r\n                <div class=\"dynamic-check-card\" id=\"cardCapacidad\" style=\"margin: 20px 0 25px 0;\">\r\n                    <div style=\"display: flex; flex-direction: row; align-items: flex-start; gap: 12px;\">\r\n                        <input type=\"checkbox\" id=\"chkCapacidadLegal\">\r\n                        <label for=\"chkCapacidadLegal\">\r\n                            Declaro bajo protesta de decir verdad que act\u00fao con plena capacidad jur\u00eddica y facultades suficientes (por derecho de propiedad, relaci\u00f3n laboral, estatutaria o representaci\u00f3n leg\u00edtima) para proporcionar la informaci\u00f3n de la entidad y representarla en este pre-registro.\r\n                        <\/label>\r\n                    <\/div>\r\n                <\/div>\r\n\r\n                <div class=\"role-notice\">\r\n                    Actualmente, el pre-registro est\u00e1 enfocado a responsables de entidades. Si tu rol es operador en cualquier capacidad (ej: transportista o voluntario), no te preocupes. El circuito est\u00e1 dise\u00f1ado para abarcar toda la cadena de valor de las donaciones, incluyendo el que t\u00fa aportas, as\u00ed que por favor mantente atento a tu alta por medio del contacto principal de tu nodo.\r\n                <\/div>\r\n\r\n                <div class=\"btn-container\">\r\n                    <button type=\"button\" class=\"btn btn-secondary\" onclick=\"goToStep(3)\">Volver<\/button>\r\n                    <button type=\"button\" class=\"btn btn-primary\" id=\"btnNextTo5\" disabled>Siguiente<\/button>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- PASO 5: CONFIRMACI\u00d3N -->\r\n            <div id=\"step5\" class=\"step-content\">\r\n                <h3 style=\"margin-top:0; margin-bottom:20px;\">Confirma tu Informaci\u00f3n<\/h3>\r\n                \r\n                <div class=\"summary-box\" id=\"resumenDatos\">\r\n                    <!-- Se llena con JS -->\r\n                <\/div>\r\n\r\n                <div class=\"important-notice-left\">\r\n                    Tras enviar tu solicitud, te contactaremos por correo electr\u00f3nico para correr el proceso de <strong>Validaci\u00f3n Normativa de la Entidad<\/strong>, que una vez concluido, habilitar\u00e1 tu alta.\r\n                <\/div>\r\n\r\n                <div class=\"btn-container\">\r\n                    <button type=\"button\" class=\"btn btn-secondary\" onclick=\"goToStep(4)\">Volver<\/button>\r\n                    <button type=\"button\" class=\"btn btn-primary\" id=\"btnSubmitFinal\" disabled>Enviar Solicitud<\/button>\r\n                <\/div>\r\n            <\/div>\r\n\r\n            <!-- PASO 6: SUCCESS SCREEN -->\r\n            <div id=\"step6\" class=\"step-content\" style=\"text-align:center; padding: 40px 0;\">\r\n                <div style=\"font-size:4rem; margin-bottom:20px;\">\u2714\ufe0f<\/div>\r\n                <h2 style=\"margin-bottom:15px;\">\u00a1Pre-registro Enviado!<\/h2>\r\n                <p style=\"font-size:1.1rem; color:#4B5563; margin-bottom: 15px;\">Tu informaci\u00f3n ha sido enviada exitosamente y se encuentra en revisi\u00f3n.<\/p>\r\n                <p style=\"font-size:1rem; color:#4B5563; margin-bottom: 30px;\">Fue un gusto atenderte. Mantente atento a tu correo para correr la <strong>Validaci\u00f3n Normativa de la Entidad<\/strong>.<\/p>\r\n                \r\n                <button type=\"button\" class=\"btn btn-primary\" onclick=\"window.location.reload()\">Capturar Nuevo Pre-registro<\/button>\r\n            <\/div>\r\n\r\n        <\/div>\r\n\r\n        <!-- DEBUG BOX -->\r\n        <div style=\"padding: 0 30px 30px 30px;\" id=\"aitana-debug-container\">\r\n            <div class=\"debug-box\" id=\"aitana-debug-panel\">\r\n                <div class=\"debug-title\">PANEL DE DEPURACI\u00d3N EN VIVO (AITANA REGISTRO)<\/div>\r\n                <div id=\"debug-raw\" class=\"debug-content\">Sistema listo. Los logs de depuraci\u00f3n aparecer\u00e1n aqu\u00ed.<\/div>\r\n            <\/div>\r\n        <\/div>\r\n    <\/div>\r\n<\/div>\r\n\r\n<!-- LOADING OVERLAY -->\r\n<div class=\"loading-overlay\" id=\"loadingOverlay\">\r\n    <div class=\"spinner\"><\/div>\r\n    <p style=\"margin-top:15px; font-weight:bold;\" id=\"loadingText\">Procesando&#8230;<\/p>\r\n<\/div>\r\n\r\n<!-- SCRIPTS -->\r\n<script src=\"https:\/\/accounts.google.com\/gsi\/client\" async defer><\/script>\r\n<script>\r\n    const MODO_DEBUG = 0; \/\/ 1: Encendido, 0: Apagado\r\n\r\n    \/\/ Control din\u00e1mico e inmediato de visibilidad del panel de depuraci\u00f3n\r\n    function aplicarVisibilidadDebug() {\r\n        const debugContainer = document.getElementById('aitana-debug-container');\r\n        if (debugContainer) {\r\n            debugContainer.style.display = (typeof MODO_DEBUG !== 'undefined' && MODO_DEBUG === 1) ? 'block' : 'none';\r\n        }\r\n    }\r\n    aplicarVisibilidadDebug();\r\n    document.addEventListener('DOMContentLoaded', aplicarVisibilidadDebug);\r\n\r\n    function logDebug(msg) {\r\n        if (typeof MODO_DEBUG !== 'undefined' && MODO_DEBUG === 1) {\r\n            const d = new Date();\r\n            const time = d.toLocaleTimeString() + '.' + d.getMilliseconds();\r\n            const debugDiv = document.getElementById('debug-raw');\r\n            if (debugDiv) {\r\n                if (debugDiv.innerText.includes(\"Sistema listo\")) {\r\n                    debugDiv.innerHTML = `[${time}] ${msg}`;\r\n                } else {\r\n                    debugDiv.innerHTML += `\\n[${time}] ${msg}`;\r\n                }\r\n                debugDiv.scrollTop = debugDiv.scrollHeight;\r\n            }\r\n            console.log(`[DEBUG] ${msg}`);\r\n        }\r\n    }\r\n\r\n    let backendUrl = \"https:\/\/ocelote.ai\/aitana\/procesar_alta.php\"; \/\/ Fallback inicial\r\n\r\n    \/\/ Cargar la configuraci\u00f3n remota\r\n    async function cargarConfiguracionAitana() {\r\n        try {\r\n            logDebug(\"Iniciando fetch din\u00e1mico a config_aitana.php...\");\r\n            const res = await fetch(\"config_aitana.php?v=\" + new Date().getTime());\r\n            logDebug(`Respuesta HTTP config_aitana.php: ${res.status}`);\r\n            if (!res.ok) throw new Error(\"HTTP \" + res.status);\r\n            const conf = await res.json();\r\n            if (conf.URL_PROCESAR_ALTA) {\r\n                backendUrl = conf.URL_PROCESAR_ALTA;\r\n                logDebug(`Configuraci\u00f3n AITANA cargada con \u00e9xito. backendUrl: ${backendUrl}`);\r\n            } else {\r\n                logDebug(`URL_PROCESAR_ALTA no definida en config. Manteniendo fallback: ${backendUrl}`);\r\n            }\r\n        } catch (e) {\r\n            logDebug(`Fallo al cargar config_aitana.php (${e.message}). Usando fallback: ${backendUrl}`);\r\n        }\r\n    }\r\n    \r\n    \/\/ Ejecutar inmediatamente\r\n    cargarConfiguracionAitana();\r\n\r\n    let currentStep = 1;\r\n    let urlMapsGenerada = \"\";\r\n    let isMapValidated = false;\r\n\r\n    \/\/ Secciones para la barra de progreso\r\n    const progressSections = [\r\n        \"Bienvenida, Aviso y T\u00e9rminos\",\r\n        \"Datos del Nodo\",\r\n        \"Datos del Contacto Principal\",\r\n        \"Revisi\u00f3n de Datos\",\r\n        \"Confirmaci\u00f3n de Env\u00edo\"\r\n    ];\r\n\r\n    \/\/ Mapeo de Steps t\u00e9cnicos (6) a Nodos de la barra (5)\r\n    function updateProgress(stepNumber) {\r\n        let nodeIndex = 1;\r\n        if(stepNumber === 1) nodeIndex = 1;\r\n        else if(stepNumber === 2 || stepNumber === 3) nodeIndex = 2;\r\n        else if(stepNumber === 4) nodeIndex = 3;\r\n        else if(stepNumber === 5) nodeIndex = 4;\r\n        else if(stepNumber === 6) nodeIndex = 5;\r\n\r\n        \/\/ Si es el paso 6 (\u00e9xito final), la barra se puede ocultar\r\n        if(stepNumber === 6) {\r\n            document.getElementById('progressContainer').style.display = 'none';\r\n            return;\r\n        }\r\n\r\n        document.getElementById('progressTitle').innerText = progressSections[nodeIndex - 1];\r\n\r\n        for(let i = 1; i <= 5; i++) {\r\n            const node = document.getElementById('node' + i);\r\n            if (!node) continue;\r\n            node.className = 'progress-node'; \/\/ Reset\r\n            if (i < nodeIndex) {\r\n                node.classList.add('completed');\r\n            } else if (i === nodeIndex) {\r\n                node.classList.add('active');\r\n            }\r\n        }\r\n    }\r\n\r\n    function goToStep(stepNumber) {\r\n        logDebug(`Cambiando de Paso ${currentStep} a Paso ${stepNumber}`);\r\n        const currentEl = document.getElementById('step' + currentStep);\r\n        const nextEl = document.getElementById('step' + stepNumber);\r\n        \r\n        if (!nextEl) {\r\n            logDebug(`Error: No se encontr\u00f3 el elemento #step${stepNumber}`);\r\n            return;\r\n        }\r\n\r\n        \/\/ Determinar direcci\u00f3n de animaci\u00f3n\r\n        const direction = stepNumber > currentStep ? 'slide-in-forward' : 'slide-in-backward';\r\n        \r\n        \/\/ Ocultar actual\r\n        if (currentEl) currentEl.classList.remove('active', 'slide-in-forward', 'slide-in-backward');\r\n        \r\n        \/\/ Mostrar nuevo\r\n        currentStep = stepNumber;\r\n        nextEl.classList.add('active', direction);\r\n        \r\n        updateProgress(stepNumber);\r\n        \r\n        const headerUI = document.getElementById('headerUI');\r\n        if (headerUI) {\r\n            if(stepNumber >= 2) {\r\n                headerUI.style.display = 'flex';\r\n            } else {\r\n                headerUI.style.display = 'none';\r\n            }\r\n        }\r\n\r\n        \/\/ Scroll autom\u00e1tico al tope de la vista al cambiar de p\u00e1gina\r\n        window.scrollTo({ top: 0, behavior: 'smooth' });\r\n        const wrapper = document.querySelector('.aitana-container') || document.querySelector('.wp-breakout');\r\n        if (wrapper) {\r\n            wrapper.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n        }\r\n\r\n        \/\/ Si entramos al Paso 4 (Contacto), ejecutar validaci\u00f3n as\u00edncrona inmediata del correo precargado\r\n        if (stepNumber === 4) {\r\n            const currentEmail = document.getElementById('email').value.trim();\r\n            if (currentEmail) {\r\n                logDebug(`Paso 4 activo: Verificando duplicados para correo precargado: ${currentEmail}`);\r\n                validarDuplicadoAsync('email', currentEmail);\r\n            }\r\n            validarFormulario();\r\n        }\r\n    }\r\n\r\n    function showLoading(text) {\r\n        document.getElementById('loadingText').textContent = text;\r\n        document.getElementById('loadingOverlay').style.display = 'flex';\r\n    }\r\n    function hideLoading() {\r\n        document.getElementById('loadingOverlay').style.display = 'none';\r\n    }\r\n    function showError(inputId, tooltipId) {\r\n        const input = document.getElementById(inputId);\r\n        if (!input) return;\r\n        const group = input.closest('.form-group');\r\n        if (group) group.classList.add('show-error');\r\n        input.classList.add('is-invalid');\r\n    }\r\n    function clearError(inputId) {\r\n        const input = document.getElementById(inputId);\r\n        if (!input) return;\r\n        const group = input.closest('.form-group');\r\n        if (group) group.classList.remove('show-error');\r\n        input.classList.remove('is-invalid');\r\n    }\r\n    function clearAllErrors(stepId) {\r\n        const stepEl = document.getElementById(stepId);\r\n        if (!stepEl) return;\r\n        stepEl.querySelectorAll('.form-group').forEach(el => {\r\n            el.classList.remove('show-error');\r\n            const input = el.querySelector('.form-control');\r\n            if(input) input.classList.remove('is-invalid');\r\n        });\r\n    }\r\n\r\n    \/\/ Validaciones al vuelo\r\n    document.querySelectorAll('.form-control').forEach(input => {\r\n        \/\/ Quitar error al escribir\r\n        input.addEventListener('input', () => clearError(input.id));\r\n        \r\n        \/\/ Validar individualmente al brincar de campo (perder el foco)\r\n        input.addEventListener('blur', () => {\r\n            let isValid = true;\r\n            const val = input.value.trim();\r\n            const id = input.id;\r\n            \r\n            if (id === 'rfc') {\r\n                isValid = \/^[A-Z\u00d1&]{3}\\d{6}[A-Z0-9]{3}$\/i.test(val);\r\n            } else if (id === 'razon_social') {\r\n                isValid = (val.length >= 10 && val.includes(' '));\r\n            } else if (id === 'cp') {\r\n                isValid = (val.length === 5);\r\n            } else if (id === 'nombre' || id === 'apellido_p') {\r\n                isValid = (val.length >= 2);\r\n            } else if (id === 'email') {\r\n                isValid = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/.test(val);\r\n                if (isValid) validarDuplicadoAsync('email', val);\r\n            } else if (id === 'telefono') {\r\n                isValid = \/^\\d{10}$\/.test(val);\r\n                if (isValid) validarDuplicadoAsync('telefono', val);\r\n            } else if (['colonia', 'calle', 'num_ext', 'alcaldia'].includes(id)) {\r\n                isValid = (val !== '');\r\n            } else {\r\n                return; \/\/ No es obligatorio o no tiene regla espec\u00edfica\r\n            }\r\n\r\n            if (!isValid) {\r\n                showError(id);\r\n            }\r\n            validarFormulario();\r\n        });\r\n    });\r\n\r\n    let asyncErrors = { email: false, telefono: false };\r\n\r\n    function validarDuplicadoAsync(campo, valor) {\r\n        logDebug(`Validando duplicado as\u00edncrono para ${campo}: ${valor}`);\r\n        fetch(`${backendUrl}?action=validar_duplicados&${campo}=${encodeURIComponent(valor)}`)\r\n        .then(res => res.json())\r\n        .then(data => {\r\n            logDebug(`Resultado duplicado ${campo}: ${JSON.stringify(data)}`);\r\n            if ((campo === 'email' && data.email_existe) || (campo === 'telefono' && data.telefono_existe)) {\r\n                asyncErrors[campo] = true;\r\n                showError(campo);\r\n                validarFormulario();\r\n            } else {\r\n                asyncErrors[campo] = false;\r\n                clearError(campo);\r\n                validarFormulario();\r\n            }\r\n        })\r\n        .catch(err => {\r\n            logDebug(`Error al validar duplicado ${campo}: ${err.message}`);\r\n        });\r\n    }\r\n\r\n    function validarFormulario() {\r\n        \/\/ Step 3\r\n        const s3_razon = document.getElementById('razon_social').value.trim();\r\n        const s3_cp = document.getElementById('cp').value.trim();\r\n        const s3_colonia = document.getElementById('colonia').value;\r\n        const s3_calle = document.getElementById('calle').value.trim();\r\n        const s3_num = document.getElementById('num_ext').value.trim();\r\n        const step3Valid = s3_razon.length >= 10 && s3_cp.length === 5 && s3_colonia && s3_calle && s3_num && isMapValidated;\r\n        document.getElementById('btnNextTo4').disabled = !step3Valid;\r\n\r\n        \/\/ Step 4\r\n        const s4_nombre = document.getElementById('nombre').value.trim();\r\n        const s4_ap = document.getElementById('apellido_p').value.trim();\r\n        const s4_email = document.getElementById('email').value.trim();\r\n        const s4_tel = document.getElementById('telefono').value.trim();\r\n        const s4_chkCapacidad = document.getElementById('chkCapacidadLegal') ? document.getElementById('chkCapacidadLegal').checked : false;\r\n        const emailRegex = \/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$\/;\r\n        const step4Valid = s4_nombre.length >= 2 && s4_ap.length >= 2 && emailRegex.test(s4_email) && \/^\\d{10}$\/.test(s4_tel) && !asyncErrors.email && !asyncErrors.telefono && s4_chkCapacidad;\r\n        document.getElementById('btnNextTo5').disabled = !step4Valid;\r\n    }\r\n\r\n    function syncDynamicCards() {\r\n        document.querySelectorAll('.dynamic-check-card').forEach(card => {\r\n            const chk = card.querySelector('input[type=\"checkbox\"]');\r\n            if (chk) {\r\n                if (chk.checked) {\r\n                    card.classList.add('is-checked');\r\n                } else {\r\n                    card.classList.remove('is-checked');\r\n                }\r\n            }\r\n        });\r\n    }\r\n\r\n    \/\/ Permitir clic en toda la tarjeta para alternar el checkbox\r\n    document.querySelectorAll('.dynamic-check-card').forEach(card => {\r\n        card.addEventListener('click', (e) => {\r\n            if (e.target.tagName !== 'INPUT' && e.target.tagName !== 'A') {\r\n                const chk = card.querySelector('input[type=\"checkbox\"]');\r\n                if (chk) {\r\n                    chk.checked = !chk.checked;\r\n                    chk.dispatchEvent(new Event('change'));\r\n                }\r\n            }\r\n        });\r\n    });\r\n\r\n    if (document.getElementById('chkCapacidadLegal')) {\r\n        document.getElementById('chkCapacidadLegal').addEventListener('change', () => {\r\n            syncDynamicCards();\r\n            validarFormulario();\r\n        });\r\n    }\r\n\r\n    \/\/ ==========================================\r\n    \/\/ PASO 1: GATEKEEPER\r\n    \/\/ ==========================================\r\n    function initGoogleButton() {\r\n        logDebug(\"Inicializando bot\u00f3n de Google Sign-In...\");\r\n        if (typeof google !== 'undefined' && google.accounts) {\r\n            google.accounts.id.initialize({\r\n                client_id: \"182583256091-75rdhphuasppagr6o28s4fhnal5m4295.apps.googleusercontent.com\",\r\n                callback: handleGoogleLogin,\r\n                auto_prompt: false\r\n            });\r\n            \/\/ Ancho adaptativo al viewport m\u00f3vil y contenedor (entre 260px y 320px)\r\n            const availableWidth = Math.min(320, Math.max(260, (window.innerWidth - 60)));\r\n            google.accounts.id.renderButton(\r\n                document.getElementById(\"btnGoogleJs\"),\r\n                { theme: \"outline\", size: \"large\", type: \"standard\", text: \"signin_with\", shape: \"rectangular\", width: availableWidth.toString(), logo_alignment: \"left\" }\r\n            );\r\n            logDebug(\"Bot\u00f3n de Google renderizado exitosamente con ancho: \" + availableWidth + \"px.\");\r\n        } else {\r\n            setTimeout(initGoogleButton, 100);\r\n        }\r\n    }\r\n\r\n    window.onTurnstileSuccess = function(token) {\r\n        logDebug(\"Cloudflare Turnstile verificado con \u00e9xito.\");\r\n        const legalSec = document.getElementById('legalSection');\r\n        if (legalSec) legalSec.style.display = 'block';\r\n        window.turnstileToken = token;\r\n        initGoogleButton();\r\n    };\r\n\r\n    const chkPrivacidad = document.getElementById('chkPrivacidad');\r\n    const chkTyc = document.getElementById('chkTyc');\r\n    const googleWrapper = document.getElementById('googleSignInWrapper');\r\n\r\n    function toggleGoogleBtn() {\r\n        syncDynamicCards();\r\n        if (chkPrivacidad.checked && chkTyc.checked) {\r\n            googleWrapper.style.pointerEvents = 'auto';\r\n            googleWrapper.style.opacity = '1';\r\n            logDebug(\"T\u00e9rminos y Privacidad aceptados. Bot\u00f3n de Google habilitado.\");\r\n        } else {\r\n            googleWrapper.style.pointerEvents = 'none';\r\n            googleWrapper.style.opacity = '0.5';\r\n        }\r\n    }\r\n    chkPrivacidad.addEventListener('change', toggleGoogleBtn);\r\n    chkTyc.addEventListener('change', toggleGoogleBtn);\r\n\r\n    function handleGoogleLogin(response) {\r\n        logDebug(\"Google Auth Callback recibido.\");\r\n        const jsonPayload = decodeURIComponent(atob(response.credential.split('.')[1].replace(\/-\/g, '+').replace(\/_\/g, '\/')).split('').map(function(c) {\r\n            return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\r\n        }).join(''));\r\n        \r\n        const googleUser = JSON.parse(jsonPayload);\r\n        logDebug(`Usuario autenticado: ${googleUser.email} (${googleUser.name})`);\r\n\r\n        showLoading(\"Verificando identidad...\");\r\n        \r\n        const urlVeto = `${backendUrl}?action=validar_veto&email=` + encodeURIComponent(googleUser.email);\r\n        logDebug(`Consultando veto en backend: ${urlVeto}`);\r\n\r\n        fetch(urlVeto)\r\n        .then(async res => {\r\n            logDebug(`validar_veto HTTP Status: ${res.status}`);\r\n            if (!res.ok) {\r\n                const text = await res.text();\r\n                throw new Error(`HTTP ${res.status}: ${text.substring(0, 50)}...`);\r\n            }\r\n            return res.json();\r\n        })\r\n        .then(data => {\r\n            hideLoading();\r\n            logDebug(`Respuesta validar_veto: ${JSON.stringify(data)}`);\r\n            if(data.vetado) {\r\n                alert(\"Acceso denegado: El contacto se encuentra inactivo. Comun\u00edcate con soporte.\");\r\n                return;\r\n            }\r\n            \r\n            \/\/ Llenar UI Superior Global\r\n            const hdrNombre = document.getElementById('hdrUserNombre');\r\n            const hdrEmail = document.getElementById('hdrUserEmail');\r\n            const headerUI = document.getElementById('headerUI');\r\n            \r\n            const fullName = googleUser.name || `${googleUser.given_name || ''} ${googleUser.family_name || ''}`.trim();\r\n            if (hdrNombre) hdrNombre.textContent = fullName;\r\n            if (hdrEmail) hdrEmail.textContent = googleUser.email;\r\n            if (headerUI) headerUI.style.display = 'flex';\r\n            \r\n            \/\/ Pre-llenar datos para el contacto final\r\n            window.googleData = googleUser;\r\n            document.getElementById('nombre').value = googleUser.given_name || '';\r\n            document.getElementById('apellido_p').value = googleUser.family_name || '';\r\n            document.getElementById('email').value = googleUser.email;\r\n            validarDuplicadoAsync('email', googleUser.email);\r\n            \r\n            goToStep(2);\r\n        })\r\n        .catch(err => {\r\n            hideLoading();\r\n            logDebug(`Error al verificar veto: ${err.message}`);\r\n            alert(\"Error del servidor al verificar identidad: \" + err.message);\r\n            console.error(err);\r\n        });\r\n    }\r\n\r\n    \/\/ ==========================================\r\n    \/\/ PASO 2: RFC\r\n    \/\/ ==========================================\r\n    document.getElementById('btnValidarRfc').addEventListener('click', () => {\r\n        clearAllErrors('step2');\r\n        const rfcInput = document.getElementById('rfc');\r\n        const rfc = rfcInput.value.trim().toUpperCase();\r\n        logDebug(`Click en Validar RFC: ${rfc}`);\r\n        \r\n        \/\/ Persona Moral estricto: 3 letras, 6 n\u00fameros, 3 alfanum\u00e9ricos\r\n        const rfcMoralRegex = \/^[A-Z\u00d1&]{3}\\d{6}[A-Z0-9]{3}$\/;\r\n        \r\n        if (!rfcMoralRegex.test(rfc)) {\r\n            logDebug(`RFC ${rfc} formato inv\u00e1lido para Persona Moral.`);\r\n            showError('rfc', 'tt-rfc');\r\n            return;\r\n        }\r\n\r\n        showLoading(\"Validando RFC...\");\r\n        logDebug(`Consultando existencia de RFC en backend: ${backendUrl}?action=validar_rfc&rfc=${rfc}`);\r\n        fetch(`${backendUrl}?action=validar_rfc&rfc=` + encodeURIComponent(rfc))\r\n        .then(async res => {\r\n            logDebug(`validar_rfc HTTP Status: ${res.status}`);\r\n            if (!res.ok) {\r\n                const text = await res.text();\r\n                throw new Error(`HTTP ${res.status}: ${text.substring(0, 50)}...`);\r\n            }\r\n            return res.json();\r\n        })\r\n        .then(data => {\r\n            hideLoading();\r\n            logDebug(`Respuesta validar_rfc: ${JSON.stringify(data)}`);\r\n            if (data.existe) {\r\n                alert(\"Este RFC ya est\u00e1 dado de alta. Por favor env\u00eda un correo a atencion.clientes@ocelote.ai para revisar tu caso.\");\r\n                showError('rfc', 'tt-rfc');\r\n            } else {\r\n                logDebug(`RFC verificado correctamente. Avanzando a Paso 3.`);\r\n                goToStep(3);\r\n            }\r\n        })\r\n        .catch(err => {\r\n            hideLoading();\r\n            logDebug(`Error en validar_rfc: ${err.message}`);\r\n            alert(\"Error de conexi\u00f3n al validar RFC: \" + err.message);\r\n        });\r\n    });\r\n\r\n    \/\/ ==========================================\r\n    \/\/ PASO 3: NODO\r\n    \/\/ ==========================================\r\n    document.getElementById('btnNextTo4').addEventListener('click', () => {\r\n        if (!document.getElementById('btnNextTo4').disabled) {\r\n            goToStep(4);\r\n        }\r\n    });\r\n\r\n    document.getElementById('btnValidarDomicilio').addEventListener('click', function() {\r\n        const calleInput = document.getElementById('calle');\r\n        const numExtInput = document.getElementById('num_ext');\r\n        const numIntInput = document.getElementById('num_int');\r\n        const coloniaInput = document.getElementById('colonia');\r\n        const cpInput = document.getElementById('cp');\r\n        const estadoInput = document.getElementById('estado');\r\n        const alcaldiaInput = document.getElementById('alcaldia');\r\n        const razonInput = document.getElementById('razon_social');\r\n        const btn = this;\r\n\r\n        if (!isMapValidated) {\r\n            \/\/ Validar Raz\u00f3n Social primero\r\n            const razonVal = razonInput.value.trim();\r\n            const razonValida = (razonVal.length >= 10 && razonVal.includes(' '));\r\n            \r\n            if (!razonValida) {\r\n                showError('razon_social', 'tt-razon');\r\n                logDebug(\"Validaci\u00f3n detenida: Raz\u00f3n Social vac\u00eda o incompleta (< 10 caracteres o sin espacio).\");\r\n                razonInput.scrollIntoView({ behavior: 'smooth', block: 'center' });\r\n                setTimeout(() => razonInput.focus(), 250);\r\n                return;\r\n            }\r\n\r\n            const calle = calleInput.value.trim();\r\n            const numExt = numExtInput.value.trim();\r\n            const colonia = coloniaInput.value;\r\n            const cp = cpInput.value.trim();\r\n            const estadoNombre = estadoInput.dataset.nombreEstado || estadoInput.value.trim();\r\n            const alcaldia = alcaldiaInput.value.trim();\r\n\r\n            logDebug(`Iniciando validaci\u00f3n de domicilio: Calle='${calle}', N\u00famExt='${numExt}', Col='${colonia}', CP='${cp}', Mpio='${alcaldia}', Edo='${estadoNombre}'`);\r\n\r\n            \/\/ Validar que no est\u00e9n vac\u00edos\r\n            if(!calle || !numExt || !cp || !colonia) {\r\n                if(!calle) showError('calle');\r\n                if(!numExt) showError('num_ext');\r\n                if(!cp) showError('cp');\r\n                if(!colonia) showError('colonia');\r\n                logDebug(\"Campos obligatorios de domicilio incompletos. Validaci\u00f3n detenida.\");\r\n                return;\r\n            }\r\n\r\n            showLoading(\"Validando existencia de la calle...\");\r\n            \r\n            \/\/ B\u00fasqueda estructurada estricta por calle, municipio, estado y CP en M\u00e9xico\r\n            const geocodeUrl = `https:\/\/nominatim.openstreetmap.org\/search?street=${encodeURIComponent(calle)}&county=${encodeURIComponent(alcaldia)}&state=${encodeURIComponent(estadoNombre)}&postalcode=${encodeURIComponent(cp)}&country=Mexico&format=json&addressdetails=1`;\r\n            logDebug(`Consultando Nominatim (estructurado con filtros geogr\u00e1ficos): ${geocodeUrl}`);\r\n            \r\n            fetch(geocodeUrl, {\r\n                headers: { 'Accept-Language': 'es' }\r\n            })\r\n            .then(res => {\r\n                logDebug(`Respuesta Nominatim HTTP: ${res.status}`);\r\n                return res.json();\r\n            })\r\n            .then(data => {\r\n                logDebug(`Resultados preliminares encontrados: ${data.length}`);\r\n                \r\n                \/\/ Si la b\u00fasqueda s\u00faper estricta no devuelve resultados, intentar buscar la calle en el estado\r\n                if (!data || data.length === 0) {\r\n                    const fallbackUrl = `https:\/\/nominatim.openstreetmap.org\/search?street=${encodeURIComponent(calle)}&state=${encodeURIComponent(estadoNombre)}&country=Mexico&format=json&addressdetails=1`;\r\n                    logDebug(`Intentando b\u00fasqueda secundaria en el estado: ${fallbackUrl}`);\r\n                    return fetch(fallbackUrl, { headers: { 'Accept-Language': 'es' } }).then(r => r.json());\r\n                }\r\n                return data;\r\n            })\r\n            .then(data => {\r\n                hideLoading();\r\n                logDebug(`Resultados recibidos de OpenStreetMap: ${JSON.stringify(data ? data.slice(0, 2) : [])}`);\r\n\r\n                let calleValida = false;\r\n                if (data && data.length > 0) {\r\n                    for (const item of data) {\r\n                        const addr = item.address || {};\r\n                        const roadName = addr.road || addr.pedestrian || addr.footway || addr.street || (item.class === 'highway' ? item.name : '');\r\n                        \r\n                        \/\/ Validar coincidencia geogr\u00e1fica estricta para evitar falsos positivos de otros estados\r\n                        const postcodeMatches = !addr.postcode || addr.postcode.substring(0, 2) === cp.substring(0, 2);\r\n                        const stateMatches = !addr.state || (estadoNombre && addr.state.toLowerCase().includes(estadoNombre.toLowerCase().substring(0, 4)));\r\n                        \r\n                        if (roadName && postcodeMatches && stateMatches) {\r\n                            \/\/ Limpiar prefijos gen\u00e9ricos para comparar y normalizar\r\n                            const prefixes = \/^(calle|avenida|av\\.?|cerrada|cda\\.?|calzada|czda\\.?|privada|pda\\.?|boulevard|blvd\\.?|andador|and\\.?|prolongaci\u00f3n|prol\\.?|retorno|ret\\.?|pasaje)\\s+\/i;\r\n                            const cleanOfficial = roadName.replace(prefixes, '').trim();\r\n                            const cleanUser = calle.replace(prefixes, '').trim();\r\n                            \r\n                            \/\/ Si el usuario ingres\u00f3 un nombre parcial (ej. \"Emiliano\" en lugar de \"Emiliano Zapata\")\r\n                            \/\/ Normalizamos el campo con la nomenclatura oficial completa\r\n                            if (cleanOfficial && cleanOfficial.toLowerCase() !== cleanUser.toLowerCase()) {\r\n                                logDebug(`Normalizando calle parcial '${calle}' -> '${cleanOfficial}'`);\r\n                                calleInput.value = cleanOfficial;\r\n                                updateMap();\r\n                            }\r\n\r\n                            calleValida = true;\r\n                            logDebug(`Calle confirmada en ${addr.state || estadoNombre} (CP ${addr.postcode || cp}): '${item.display_name}'`);\r\n                            break;\r\n                        } else {\r\n                            logDebug(`Descartado resultado falso positivo de otro estado\/regi\u00f3n: ${item.display_name} (CP ${addr.postcode || 'N\/A'}, Estado ${addr.state || 'N\/A'})`);\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (!calleValida) {\r\n                    isMapValidated = false;\r\n                    showError('calle');\r\n                    showError('num_ext');\r\n                    logDebug(`ERROR: La calle '${calle}' no fue localizada dentro de ${alcaldia || estadoNombre} (CP ${cp}).`);\r\n                    alert(`La calle \"${calle}\" no fue localizada en el \u00e1rea correspondiente al C\u00f3digo Postal ${cp} (${alcaldia}, ${estadoNombre}). Por favor revisa la ortograf\u00eda.`);\r\n                } else {\r\n                    isMapValidated = true;\r\n                    btn.textContent = \"Editar Domicilio\";\r\n                    btn.classList.remove('btn-secondary');\r\n                    btn.classList.add('btn-primary');\r\n\r\n                    \/\/ BLOQUEO TOTAL DE TODO EL DOMICILIO\r\n                    calleInput.readOnly = true;\r\n                    calleInput.style.background = '#F9FAFB';\r\n                    numExtInput.readOnly = true;\r\n                    numExtInput.style.background = '#F9FAFB';\r\n                    numIntInput.readOnly = true;\r\n                    numIntInput.style.background = '#F9FAFB';\r\n                    cpInput.readOnly = true;\r\n                    cpInput.style.background = '#F9FAFB';\r\n                    coloniaInput.disabled = true;\r\n                    coloniaInput.style.background = '#F9FAFB';\r\n                    \r\n                    logDebug(\"Todos los campos de domicilio han sido BLOQUEADOS contra edici\u00f3n.\");\r\n                    validarFormulario();\r\n                }\r\n            })\r\n            .catch(err => {\r\n                hideLoading();\r\n                logDebug(`Excepci\u00f3n al conectar con servicio de mapas: ${err.message}`);\r\n                alert(\"Error al intentar validar el domicilio. Verifica tu conexi\u00f3n a internet.\");\r\n            });\r\n\r\n        } else {\r\n            \/\/ MODO EDICI\u00d3N: DESBLOQUEAR TODO\r\n            isMapValidated = false;\r\n            btn.textContent = \"Validar Domicilio\";\r\n            btn.classList.remove('btn-primary');\r\n            btn.classList.add('btn-secondary');\r\n\r\n            calleInput.readOnly = false;\r\n            calleInput.style.background = '';\r\n            numExtInput.readOnly = false;\r\n            numExtInput.style.background = '';\r\n            numIntInput.readOnly = false;\r\n            numIntInput.style.background = '';\r\n            cpInput.readOnly = false;\r\n            cpInput.style.background = '';\r\n            coloniaInput.disabled = false;\r\n            coloniaInput.style.background = '';\r\n            \r\n            logDebug(\"Campos de domicilio DESBLOQUEADOS para edici\u00f3n.\");\r\n            validarFormulario();\r\n        }\r\n    });\r\n\r\n    \/\/ ==========================================\r\n    \/\/ L\u00d3GICA DE DOMICILIO Y MAPA\r\n    \/\/ ==========================================\r\n    let mapUpdateTimeout;\r\n\r\n    \/\/ Funci\u00f3n para transici\u00f3n suave del mapa\r\n    function setMapUrl(url) {\r\n        const mapFrame = document.getElementById('mapFrame');\r\n        if (mapFrame.src !== url) {\r\n            mapFrame.style.opacity = 0;\r\n            setTimeout(() => {\r\n                mapFrame.src = url;\r\n                mapFrame.onload = () => { mapFrame.style.opacity = 1; };\r\n            }, 400); \/\/ Dar tiempo al fadeOut antes de cambiar el src\r\n        }\r\n    }\r\n\r\n    function updateMap() {\r\n        clearTimeout(mapUpdateTimeout);\r\n        mapUpdateTimeout = setTimeout(() => {\r\n            const cp = document.getElementById('cp').value;\r\n            const estado = document.getElementById('estado').value;\r\n            const alcaldia = document.getElementById('alcaldia').value;\r\n            const colonia = document.getElementById('colonia').value;\r\n            const calle = document.getElementById('calle').value;\r\n            const numExt = document.getElementById('num_ext').value;\r\n\r\n            \/\/ Si el CP no est\u00e1 completo o es inv\u00e1lido, abortar la b\u00fasqueda local y alejar a M\u00e9xico\r\n            if (cp.length !== 5 || !estado || !alcaldia) {\r\n                setMapUrl(\"https:\/\/www.google.com\/maps?q=Mexico&t=m&z=5&output=embed&iwloc=near\");\r\n                return;\r\n            }\r\n\r\n            let query = [];\r\n            if (calle && numExt) query.push(`${calle} ${numExt}`);\r\n            else if (calle) query.push(calle);\r\n            \r\n            if (colonia && colonia !== 'Primero ingresa un CP v\u00e1lido') query.push(colonia);\r\n            if (alcaldia) query.push(alcaldia);\r\n            if (cp) query.push(cp);\r\n            if (estado) query.push(estado);\r\n\r\n            if (query.length > 0) {\r\n                const searchString = query.join(', ') + ', Mexico';\r\n                urlMapsGenerada = \"https:\/\/www.google.com\/maps\/search\/?api=1&query=\" + encodeURIComponent(searchString);\r\n                \/\/ Zoom 16 para acercamiento local\r\n                const embedUrl = \"https:\/\/www.google.com\/maps?q=\" + encodeURIComponent(searchString) + \"&t=m&z=16&output=embed&iwloc=near\";\r\n                setMapUrl(embedUrl);\r\n            }\r\n        }, 800);\r\n    }\r\n    \r\n    ['calle', 'num_ext', 'colonia', 'cp'].forEach(id => {\r\n        document.getElementById(id).addEventListener('input', updateMap);\r\n        if(id === 'colonia') document.getElementById(id).addEventListener('change', updateMap);\r\n    });\r\n\r\n    \/\/ Diccionario INEGI de Estados\r\n    const estadosINEGI = {\r\n        \"Aguascalientes\": \"AGS\",\r\n        \"Baja California\": \"BC\",\r\n        \"Baja California Sur\": \"BCS\",\r\n        \"Campeche\": \"CAMP\",\r\n        \"Coahuila\": \"COAH\",\r\n        \"Coahuila de Zaragoza\": \"COAH\",\r\n        \"Colima\": \"COL\",\r\n        \"Chiapas\": \"CHIS\",\r\n        \"Chihuahua\": \"CHIH\",\r\n        \"Ciudad de M\u00e9xico\": \"CDMX\",\r\n        \"Distrito Federal\": \"CDMX\",\r\n        \"Durango\": \"DGO\",\r\n        \"Guanajuato\": \"GTO\",\r\n        \"Guerrero\": \"GRO\",\r\n        \"Hidalgo\": \"HGO\",\r\n        \"Jalisco\": \"JAL\",\r\n        \"M\u00e9xico\": \"MEX\",\r\n        \"Estado de M\u00e9xico\": \"MEX\",\r\n        \"Michoac\u00e1n\": \"MICH\",\r\n        \"Michoac\u00e1n de Ocampo\": \"MICH\",\r\n        \"Morelos\": \"MOR\",\r\n        \"Nayarit\": \"NAY\",\r\n        \"Nuevo Le\u00f3n\": \"NL\",\r\n        \"Oaxaca\": \"OAX\",\r\n        \"Puebla\": \"PUE\",\r\n        \"Quer\u00e9taro\": \"QRO\",\r\n        \"Quintana Roo\": \"QROO\",\r\n        \"San Luis Potos\u00ed\": \"SLP\",\r\n        \"Sinaloa\": \"SIN\",\r\n        \"Sonora\": \"SON\",\r\n        \"Tabasco\": \"TAB\",\r\n        \"Tamaulipas\": \"TAMPS\",\r\n        \"Tlaxcala\": \"TLAX\",\r\n        \"Veracruz\": \"VER\",\r\n        \"Veracruz de Ignacio de la Llave\": \"VER\",\r\n        \"Yucat\u00e1n\": \"YUC\",\r\n        \"Zacatecas\": \"ZAC\"\r\n    };\r\n\r\n    document.getElementById('cp').addEventListener('input', function() {\r\n        this.value = this.value.replace(\/\\D\/g, '');\r\n    });\r\n\r\n    document.getElementById('telefono').addEventListener('input', function() {\r\n        this.value = this.value.replace(\/\\D\/g, '');\r\n    });\r\n\r\n    document.getElementById('cp').addEventListener('blur', function() {\r\n        const val = this.value;\r\n        if (val.length === 5) {\r\n            showLoading(\"Buscando CP...\");\r\n            logDebug(`Consultando SEPOMEX para CP: ${val}`);\r\n            fetch(`https:\/\/sepomex.kurenn.dev\/api\/v1\/zip_codes?zip_code=${val}`)\r\n            .then(response => {\r\n                if(!response.ok) throw new Error(\"Error de red\");\r\n                return response.json();\r\n            })\r\n            .then(data => {\r\n                hideLoading();\r\n                if(!data.zip_codes || data.zip_codes.length === 0) throw new Error(\"CP no encontrado\");\r\n\r\n                const primerRegistro = data.zip_codes[0];\r\n                const estadoDevuelto = primerRegistro.d_estado;\r\n                document.getElementById('estado').value = estadosINEGI[estadoDevuelto] || estadoDevuelto;\r\n                document.getElementById('estado').dataset.nombreEstado = estadoDevuelto;\r\n                \r\n                \/\/ Kurenn s\u00ed devuelve la Alcald\u00eda\/Municipio real (d_mnpio)\r\n                document.getElementById('alcaldia').value = primerRegistro.d_mnpio; \r\n                logDebug(`CP ${val} encontrado: Estado=${estadoDevuelto} (${estadosINEGI[estadoDevuelto] || estadoDevuelto}), Mpio=${primerRegistro.d_mnpio}`);\r\n                \r\n                const colSelect = document.getElementById('colonia');\r\n                colSelect.innerHTML = '';\r\n                \r\n                \/\/ Llenar el combo con las colonias (asentamientos)\r\n                data.zip_codes.forEach(place => {\r\n                    const opt = document.createElement('option');\r\n                    opt.value = place.d_asenta;\r\n                    opt.textContent = place.d_asenta;\r\n                    colSelect.appendChild(opt);\r\n                });\r\n                updateMap();\r\n            })\r\n            .catch(err => {\r\n                hideLoading();\r\n                document.getElementById('estado').value = '';\r\n                document.getElementById('alcaldia').value = '';\r\n                document.getElementById('colonia').innerHTML = '<option value=\"\">CP no encontrado o inv\u00e1lido<\/option>';\r\n            });\r\n        } else {\r\n            \/\/ Formato inv\u00e1lido o incompleto: No llamar API y limpiar campos dependientes\r\n            document.getElementById('estado').value = '';\r\n            document.getElementById('alcaldia').value = '';\r\n            document.getElementById('colonia').innerHTML = '<option value=\"\">Primero ingresa un CP v\u00e1lido<\/option>';\r\n            \/\/ Zoom out nacional (z=5)\r\n            setMapUrl(\"https:\/\/www.google.com\/maps?q=Mexico&t=m&z=5&output=embed&iwloc=near\");\r\n            urlMapsGenerada = \"\";\r\n        }\r\n    });\r\n\r\n    \/\/ ==========================================\r\n    \/\/ PASO 4: CONTACTO\r\n    \/\/ ==========================================\r\n    document.getElementById('btnNextTo5').addEventListener('click', () => {\r\n        if (!document.getElementById('btnNextTo5').disabled) {\r\n            generarResumen();\r\n            goToStep(5);\r\n        }\r\n    });\r\n\r\n    \/\/ ==========================================\r\n    \/\/ PASO 5: CONFIRMACI\u00d3N Y ENV\u00cdO\r\n    \/\/ ==========================================\r\n    function generarResumen() {\r\n        const box = document.getElementById('resumenDatos');\r\n        const tipoNodo = document.querySelector('input[name=\"tipo_nodo\"]:checked').value === 'C' ? 'Comercio (Donante)' : 'Donataria Autorizada';\r\n        const rol = document.querySelector('input[name=\"rol\"]:checked').value;\r\n        const apM = document.getElementById('apellido_m').value.trim();\r\n        const nombreCompleto = `${document.getElementById('nombre').value.trim()} ${document.getElementById('apellido_p').value.trim()} ${apM}`.trim();\r\n\r\n        box.innerHTML = `\r\n            <div class=\"summary-item\">\r\n                <div class=\"summary-label\">RFC:<\/div>\r\n                <div class=\"summary-value\">${document.getElementById('rfc').value.toUpperCase()}<\/div>\r\n            <\/div>\r\n            <div class=\"summary-item\">\r\n                <div class=\"summary-label\">Raz\u00f3n Social:<\/div>\r\n                <div class=\"summary-value\">${document.getElementById('razon_social').value}<\/div>\r\n            <\/div>\r\n            <div class=\"summary-item\">\r\n                <div class=\"summary-label\">Tipo de Nodo:<\/div>\r\n                <div class=\"summary-value\">${tipoNodo}<\/div>\r\n            <\/div>\r\n            <div class=\"summary-divider\"><\/div>\r\n            <div class=\"summary-item\">\r\n                <div class=\"summary-label\">Contacto Principal:<\/div>\r\n                <div class=\"summary-value\">${nombreCompleto}<\/div>\r\n            <\/div>\r\n            <div class=\"summary-item\">\r\n                <div class=\"summary-label\">Correo Electr\u00f3nico Institucional:<\/div>\r\n                <div class=\"summary-value\">${document.getElementById('email').value}<\/div>\r\n            <\/div>\r\n            <div class=\"summary-item\">\r\n                <div class=\"summary-label\">Celular:<\/div>\r\n                <div class=\"summary-value\">${document.getElementById('telefono').value}<\/div>\r\n            <\/div>\r\n            <div class=\"summary-item\">\r\n                <div class=\"summary-label\">Puesto \/ Rol:<\/div>\r\n                <div class=\"summary-value\">${rol}<\/div>\r\n            <\/div>\r\n            <div class=\"summary-item\">\r\n                <div class=\"summary-label\">Capacidad y Veracidad:<\/div>\r\n                <div class=\"summary-value\" style=\"font-size: 0.9rem; color: var(--aitana-secondary);\">Declarada bajo protesta de decir verdad<\/div>\r\n            <\/div>\r\n        `;\r\n        document.getElementById('btnSubmitFinal').disabled = false;\r\n    }\r\n\r\n    document.getElementById('btnSubmitFinal').addEventListener('click', () => {\r\n        showLoading(\"Enviando Solicitud...\");\r\n        logDebug(\"Iniciando env\u00edo final de alta de nodo a backend...\");\r\n\r\n        const payload = {\r\n            rfc: document.getElementById('rfc').value.trim().toUpperCase(),\r\n            tipo_nodo: document.querySelector('input[name=\"tipo_nodo\"]:checked').value,\r\n            razon_social: document.getElementById('razon_social').value.trim(),\r\n            url_maps_generada: urlMapsGenerada,\r\n            calle: document.getElementById('calle').value.trim(),\r\n            num_ext: document.getElementById('num_ext').value.trim(),\r\n            num_int: document.getElementById('num_int').value.trim(),\r\n            colonia: document.getElementById('colonia').value,\r\n            alcaldia: document.getElementById('alcaldia').value,\r\n            estado: document.getElementById('estado').value,\r\n            cp: document.getElementById('cp').value.trim(),\r\n            nombre: document.getElementById('nombre').value.trim(),\r\n            apellido_p: document.getElementById('apellido_p').value.trim(),\r\n            apellido_m: document.getElementById('apellido_m').value.trim(),\r\n            email: document.getElementById('email').value.trim(),\r\n            telefono: document.getElementById('telefono').value.trim(),\r\n            rol: document.querySelector('input[name=\"rol\"]:checked').value,\r\n            declaracion_capacidad: document.getElementById('chkCapacidadLegal') ? document.getElementById('chkCapacidadLegal').checked : false,\r\n            nombre_sesion_alta: window.googleData ? window.googleData.name : '',\r\n            correo_sesion_alta: window.googleData ? window.googleData.email : '',\r\n            google_sub: window.googleData ? (window.googleData.sub || '') : '',\r\n            google_email_verified: window.googleData ? (window.googleData.email_verified || false) : false,\r\n            turnstile_token: window.turnstileToken || '',\r\n            user_agent: navigator.userAgent || ''\r\n        };\r\n\r\n        logDebug(`Payload final a enviar: ${JSON.stringify(payload)}`);\r\n\r\n        fetch(`${backendUrl}?action=registrar_alta`, {\r\n            method: 'POST',\r\n            headers: { 'Content-Type': 'application\/json' },\r\n            body: JSON.stringify(payload)\r\n        })\r\n        .then(async res => {\r\n            logDebug(`registrar_alta HTTP Status: ${res.status}`);\r\n            if (!res.ok) {\r\n                const text = await res.text();\r\n                throw new Error(`HTTP ${res.status}: ${text.substring(0, 50)}`);\r\n            }\r\n            return res.json();\r\n        })\r\n        .then(data => {\r\n            hideLoading();\r\n            logDebug(`Respuesta registrar_alta: ${JSON.stringify(data)}`);\r\n            if (data.success) {\r\n                logDebug(\"Alta registrada exitosamente en Base de Datos.\");\r\n                goToStep(6); \/\/ Pantalla final sin retorno\r\n            } else {\r\n                logDebug(`Error devuelto por servidor: ${data.message}`);\r\n                alert(\"Error al guardar: \" + data.message);\r\n            }\r\n        })\r\n        .catch(err => {\r\n            hideLoading();\r\n            logDebug(`Error de conexi\u00f3n en registrar_alta: ${err.message}`);\r\n            alert(\"Error de conexi\u00f3n al enviar los datos: \" + err.message);\r\n        });\r\n    });\r\n\r\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Pre-registro en AITANA by Ocelote Labs Usuario: Correo Autenticado: Recopilamos autom\u00e1ticamente datos por seguridad y alineados a nuestros T\u00e9rminos y Condiciones y nuestro Aviso de Privacidad. Bienvenida, T\u00e9rminos y Condiciones Bienvenido(a). Por motivos de seguridad, por favor verifica que eres humano antes de continuar. He le\u00eddo y acepto el Aviso de Privacidad de Ocelote Labs. [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":549,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_themeisle_gutenberg_block_has_review":false,"footnotes":""},"class_list":["post-1119","page","type-page","status-publish","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Preregistro en AITANA Pre-registro en AITANA by Ocelote Labs Usuario: Correo Autenticado: Recopilamos autom\u00e1ticamente datos por seguridad y alineados a nuestros T\u00e9rminos y Condiciones y nuestro Aviso de Privacidad. Bienvenida, T\u00e9rminos y Condiciones Bienvenido(a). Por motivos de seguridad, por favor verifica que eres humano antes de continuar. He le\u00eddo y acepto el Aviso de Privacidad\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/ocelote.ai\/en\/aitana-ia\/aitana-pre-registro\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"OCELOTE LABS - Puente digital de impacto: TI con coraz\u00f3n y soluciones con prop\u00f3sito\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"AITANA Pre-registro - OCELOTE LABS\" \/>\n\t\t<meta property=\"og:description\" content=\"Preregistro en AITANA Pre-registro en AITANA by Ocelote Labs Usuario: Correo Autenticado: Recopilamos autom\u00e1ticamente datos por seguridad y alineados a nuestros T\u00e9rminos y Condiciones y nuestro Aviso de Privacidad. Bienvenida, T\u00e9rminos y Condiciones Bienvenido(a). Por motivos de seguridad, por favor verifica que eres humano antes de continuar. He le\u00eddo y acepto el Aviso de Privacidad\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/ocelote.ai\/en\/aitana-ia\/aitana-pre-registro\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-08-21T04:31:48+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-08-21T04:32:12+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"AITANA Pre-registro - OCELOTE LABS\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Preregistro en AITANA Pre-registro en AITANA by Ocelote Labs Usuario: Correo Autenticado: Recopilamos autom\u00e1ticamente datos por seguridad y alineados a nuestros T\u00e9rminos y Condiciones y nuestro Aviso de Privacidad. Bienvenida, T\u00e9rminos y Condiciones Bienvenido(a). Por motivos de seguridad, por favor verifica que eres humano antes de continuar. He le\u00eddo y acepto el Aviso de Privacidad\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/aitana-ia\\\/aitana-pre-registro\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/ocelote.ai\\\/en\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/aitana-ia\\\/#listItem\",\"name\":\"AITANA\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/aitana-ia\\\/#listItem\",\"position\":2,\"name\":\"AITANA\",\"item\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/aitana-ia\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/aitana-ia\\\/aitana-pre-registro\\\/#listItem\",\"name\":\"AITANA Pre-registro\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/aitana-ia\\\/aitana-pre-registro\\\/#listItem\",\"position\":3,\"name\":\"AITANA Pre-registro\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/aitana-ia\\\/#listItem\",\"name\":\"AITANA\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/#organization\",\"name\":\"OCELOTE LABS\",\"description\":\"Puente digital de impacto: TI con coraz\\u00f3n y soluciones con prop\\u00f3sito\",\"url\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/aitana-ia\\\/aitana-pre-registro\\\/#webpage\",\"url\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/aitana-ia\\\/aitana-pre-registro\\\/\",\"name\":\"AITANA Pre-registro - OCELOTE LABS\",\"description\":\"Preregistro en AITANA Pre-registro en AITANA by Ocelote Labs Usuario: Correo Autenticado: Recopilamos autom\\u00e1ticamente datos por seguridad y alineados a nuestros T\\u00e9rminos y Condiciones y nuestro Aviso de Privacidad. Bienvenida, T\\u00e9rminos y Condiciones Bienvenido(a). Por motivos de seguridad, por favor verifica que eres humano antes de continuar. He le\\u00eddo y acepto el Aviso de Privacidad\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/aitana-ia\\\/aitana-pre-registro\\\/#breadcrumblist\"},\"datePublished\":\"2026-08-21T04:31:48+00:00\",\"dateModified\":\"2026-08-21T04:32:12+00:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/\",\"name\":\"OCELOTE LABS\",\"description\":\"Puente digital de impacto: TI con coraz\\u00f3n y soluciones con prop\\u00f3sito\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/ocelote.ai\\\/en\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"AITANA Pre-registro - OCELOTE LABS","description":"Preregistro en AITANA Pre-registro en AITANA by Ocelote Labs Usuario: Correo Autenticado: Recopilamos autom\u00e1ticamente datos por seguridad y alineados a nuestros T\u00e9rminos y Condiciones y nuestro Aviso de Privacidad. Bienvenida, T\u00e9rminos y Condiciones Bienvenido(a). Por motivos de seguridad, por favor verifica que eres humano antes de continuar. He le\u00eddo y acepto el Aviso de Privacidad","canonical_url":"https:\/\/ocelote.ai\/en\/aitana-ia\/aitana-pre-registro\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BreadcrumbList","@id":"https:\/\/ocelote.ai\/en\/aitana-ia\/aitana-pre-registro\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/ocelote.ai\/en#listItem","position":1,"name":"Home","item":"https:\/\/ocelote.ai\/en","nextItem":{"@type":"ListItem","@id":"https:\/\/ocelote.ai\/en\/aitana-ia\/#listItem","name":"AITANA"}},{"@type":"ListItem","@id":"https:\/\/ocelote.ai\/en\/aitana-ia\/#listItem","position":2,"name":"AITANA","item":"https:\/\/ocelote.ai\/en\/aitana-ia\/","nextItem":{"@type":"ListItem","@id":"https:\/\/ocelote.ai\/en\/aitana-ia\/aitana-pre-registro\/#listItem","name":"AITANA Pre-registro"},"previousItem":{"@type":"ListItem","@id":"https:\/\/ocelote.ai\/en#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/ocelote.ai\/en\/aitana-ia\/aitana-pre-registro\/#listItem","position":3,"name":"AITANA Pre-registro","previousItem":{"@type":"ListItem","@id":"https:\/\/ocelote.ai\/en\/aitana-ia\/#listItem","name":"AITANA"}}]},{"@type":"Organization","@id":"https:\/\/ocelote.ai\/en\/#organization","name":"OCELOTE LABS","description":"Puente digital de impacto: TI con coraz\u00f3n y soluciones con prop\u00f3sito","url":"https:\/\/ocelote.ai\/en\/"},{"@type":"WebPage","@id":"https:\/\/ocelote.ai\/en\/aitana-ia\/aitana-pre-registro\/#webpage","url":"https:\/\/ocelote.ai\/en\/aitana-ia\/aitana-pre-registro\/","name":"AITANA Pre-registro - OCELOTE LABS","description":"Preregistro en AITANA Pre-registro en AITANA by Ocelote Labs Usuario: Correo Autenticado: Recopilamos autom\u00e1ticamente datos por seguridad y alineados a nuestros T\u00e9rminos y Condiciones y nuestro Aviso de Privacidad. Bienvenida, T\u00e9rminos y Condiciones Bienvenido(a). Por motivos de seguridad, por favor verifica que eres humano antes de continuar. He le\u00eddo y acepto el Aviso de Privacidad","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/ocelote.ai\/en\/#website"},"breadcrumb":{"@id":"https:\/\/ocelote.ai\/en\/aitana-ia\/aitana-pre-registro\/#breadcrumblist"},"datePublished":"2026-08-21T04:31:48+00:00","dateModified":"2026-08-21T04:32:12+00:00"},{"@type":"WebSite","@id":"https:\/\/ocelote.ai\/en\/#website","url":"https:\/\/ocelote.ai\/en\/","name":"OCELOTE LABS","description":"Puente digital de impacto: TI con coraz\u00f3n y soluciones con prop\u00f3sito","inLanguage":"en-US","publisher":{"@id":"https:\/\/ocelote.ai\/en\/#organization"}}]},"og:locale":"en_US","og:site_name":"OCELOTE LABS - Puente digital de impacto: TI con coraz\u00f3n y soluciones con prop\u00f3sito","og:type":"article","og:title":"AITANA Pre-registro - OCELOTE LABS","og:description":"Preregistro en AITANA Pre-registro en AITANA by Ocelote Labs Usuario: Correo Autenticado: Recopilamos autom\u00e1ticamente datos por seguridad y alineados a nuestros T\u00e9rminos y Condiciones y nuestro Aviso de Privacidad. Bienvenida, T\u00e9rminos y Condiciones Bienvenido(a). Por motivos de seguridad, por favor verifica que eres humano antes de continuar. He le\u00eddo y acepto el Aviso de Privacidad","og:url":"https:\/\/ocelote.ai\/en\/aitana-ia\/aitana-pre-registro\/","article:published_time":"2026-08-21T04:31:48+00:00","article:modified_time":"2026-08-21T04:32:12+00:00","twitter:card":"summary_large_image","twitter:title":"AITANA Pre-registro - OCELOTE LABS","twitter:description":"Preregistro en AITANA Pre-registro en AITANA by Ocelote Labs Usuario: Correo Autenticado: Recopilamos autom\u00e1ticamente datos por seguridad y alineados a nuestros T\u00e9rminos y Condiciones y nuestro Aviso de Privacidad. Bienvenida, T\u00e9rminos y Condiciones Bienvenido(a). Por motivos de seguridad, por favor verifica que eres humano antes de continuar. He le\u00eddo y acepto el Aviso de Privacidad"},"aioseo_meta_data":{"post_id":"1119","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_custom_url":null,"og_image_custom_fields":null,"og_image_url":null,"og_image_width":null,"og_image_height":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_image_url":null,"twitter_title":null,"twitter_description":null,"schema_type":"default","schema_type_options":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"WebPage","isEnabled":true},"graphs":[]},"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"limit_modified_date":false,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"breadcrumb_settings":null,"seo_analyzer_scan_date":null,"created":"2026-08-21 04:31:50","updated":"2026-08-21 05:27:23","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/ocelote.ai\/en\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/ocelote.ai\/en\/aitana-ia\/\" title=\"AITANA\">AITANA<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tAITANA Pre-registro\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/ocelote.ai\/en"},{"label":"AITANA","link":"https:\/\/ocelote.ai\/en\/aitana-ia\/"},{"label":"AITANA Pre-registro","link":"https:\/\/ocelote.ai\/en\/aitana-ia\/aitana-pre-registro\/"}],"_hostinger_reach_plugin_has_subscription_block":false,"_hostinger_reach_plugin_is_elementor":false,"_links":{"self":[{"href":"https:\/\/ocelote.ai\/en\/wp-json\/wp\/v2\/pages\/1119","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ocelote.ai\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ocelote.ai\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ocelote.ai\/en\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/ocelote.ai\/en\/wp-json\/wp\/v2\/comments?post=1119"}],"version-history":[{"count":1,"href":"https:\/\/ocelote.ai\/en\/wp-json\/wp\/v2\/pages\/1119\/revisions"}],"predecessor-version":[{"id":1120,"href":"https:\/\/ocelote.ai\/en\/wp-json\/wp\/v2\/pages\/1119\/revisions\/1120"}],"up":[{"embeddable":true,"href":"https:\/\/ocelote.ai\/en\/wp-json\/wp\/v2\/pages\/549"}],"wp:attachment":[{"href":"https:\/\/ocelote.ai\/en\/wp-json\/wp\/v2\/media?parent=1119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}