{"id":355,"date":"2026-07-17T02:27:01","date_gmt":"2026-07-17T00:27:01","guid":{"rendered":"https:\/\/tour3patagonia.com\/?page_id=355"},"modified":"2026-07-17T22:54:41","modified_gmt":"2026-07-17T20:54:41","slug":"cotizador-privados-especial","status":"publish","type":"page","link":"https:\/\/tour3patagonia.com\/en\/cotizador-privados-especial\/","title":{"rendered":""},"content":{"rendered":"    <div class=\"t3pvm-wrap\">\n        <div class=\"t3pvm-hero\">\n            <span>COTIZACI\u00d3N PERSONALIZADA<\/span>\n            <h1>Cotice su viaje a medida<\/h1>\n            <p>\n                Ingrese sus trayectos, fechas y preferencias. Le mostraremos\n                un valor aproximado y nuestro equipo revisar\u00e1 cada detalle\n                antes de enviar la cotizaci\u00f3n definitiva.\n            <\/p>\n        <\/div>\n\n        \n        \n                <form\n            method=\"post\"\n            action=\"https:\/\/tour3patagonia.com\/wp-admin\/admin-post.php\"\n            id=\"t3pvm-form\"\n        >\n            <input type=\"hidden\" name=\"action\" value=\"t3p_vm_enviar\">\n            <input type=\"hidden\" name=\"itinerario_json\" id=\"t3pvm-itinerario-json\">\n            <input\n                type=\"text\"\n                name=\"t3p_vm_sitio_web\"\n                class=\"t3pvm-honeypot\"\n                tabindex=\"-1\"\n                autocomplete=\"off\"\n            >\n            <input type=\"hidden\" id=\"t3p_vm_nonce\" name=\"t3p_vm_nonce\" value=\"e426922123\" \/><input type=\"hidden\" name=\"_wp_http_referer\" value=\"\/en\/wp-json\/wp\/v2\/pages\/355\" \/>\n            <datalist id=\"t3pvm-lugares\">\n                                    <option\n                        value=\"28 de Noviembre\"\n                    ><\/option>\n                                    <option\n                        value=\"Aeropuerto Presidente Carlos Ib\u00e1\u00f1ez\"\n                    ><\/option>\n                                    <option\n                        value=\"Bah\u00eda Azul\"\n                    ><\/option>\n                                    <option\n                        value=\"Bah\u00eda Felipe\"\n                    ><\/option>\n                                    <option\n                        value=\"Cabeza del Mar\"\n                    ><\/option>\n                                    <option\n                        value=\"Cameron\"\n                    ><\/option>\n                                    <option\n                        value=\"Centro de Bienvenida Torres del Paine\"\n                    ><\/option>\n                                    <option\n                        value=\"Cerro Castillo\"\n                    ><\/option>\n                                    <option\n                        value=\"Cerro Sombrero\"\n                    ><\/option>\n                                    <option\n                        value=\"club andino\"\n                    ><\/option>\n                                    <option\n                        value=\"Cueva del Milod\u00f3n\"\n                    ><\/option>\n                                    <option\n                        value=\"El Calafate\"\n                    ><\/option>\n                                    <option\n                        value=\"El Chalt\u00e9n\"\n                    ><\/option>\n                                    <option\n                        value=\"faro san isidro\"\n                    ><\/option>\n                                    <option\n                        value=\"Fuerte Bulnes\"\n                    ><\/option>\n                                    <option\n                        value=\"G\u00fcer Aike\"\n                    ><\/option>\n                                    <option\n                        value=\"Hotel Explora\"\n                    ><\/option>\n                                    <option\n                        value=\"Hotel Lago Grey\"\n                    ><\/option>\n                                    <option\n                        value=\"Hotel Las Torres\"\n                    ><\/option>\n                                    <option\n                        value=\"isla riesco\"\n                    ><\/option>\n                                    <option\n                        value=\"km 50\"\n                    ><\/option>\n                                    <option\n                        value=\"lago grey\"\n                    ><\/option>\n                                    <option\n                        value=\"Lago Peho\u00e9\"\n                    ><\/option>\n                                    <option\n                        value=\"Laguna Amarga\"\n                    ><\/option>\n                                    <option\n                        value=\"Laguna Azul\"\n                    ><\/option>\n                                    <option\n                        value=\"Monte Aymond\"\n                    ><\/option>\n                                    <option\n                        value=\"Morro Chico\"\n                    ><\/option>\n                                    <option\n                        value=\"pali aike\"\n                    ><\/option>\n                                    <option\n                        value=\"Parque Chabunco\"\n                    ><\/option>\n                                    <option\n                        value=\"pinguino rey\"\n                    ><\/option>\n                                    <option\n                        value=\"Porter\u00eda Sarmiento\"\n                    ><\/option>\n                                    <option\n                        value=\"Porter\u00eda Serrano\"\n                    ><\/option>\n                                    <option\n                        value=\"Porvenir\"\n                    ><\/option>\n                                    <option\n                        value=\"Posesi\u00f3n\"\n                    ><\/option>\n                                    <option\n                        value=\"Pudeto\"\n                    ><\/option>\n                                    <option\n                        value=\"Puerto del Hambre\"\n                    ><\/option>\n                                    <option\n                        value=\"Puerto Natales\"\n                    ><\/option>\n                                    <option\n                        value=\"Punta Arenas\"\n                    ><\/option>\n                                    <option\n                        value=\"Punta Delgada\"\n                    ><\/option>\n                                    <option\n                        value=\"Punta Dungeness\"\n                    ><\/option>\n                                    <option\n                        value=\"reserva forestal\"\n                    ><\/option>\n                                    <option\n                        value=\"R\u00edo Gallegos\"\n                    ><\/option>\n                                    <option\n                        value=\"R\u00edo Rubens\"\n                    ><\/option>\n                                    <option\n                        value=\"R\u00edo San Juan\"\n                    ><\/option>\n                                    <option\n                        value=\"R\u00edo Serrano\"\n                    ><\/option>\n                                    <option\n                        value=\"R\u00edo Turbio\"\n                    ><\/option>\n                                    <option\n                        value=\"R\u00edo Verde\"\n                    ><\/option>\n                                    <option\n                        value=\"Russfin\"\n                    ><\/option>\n                                    <option\n                        value=\"Salto Grande\"\n                    ><\/option>\n                                    <option\n                        value=\"San Gregorio\"\n                    ><\/option>\n                                    <option\n                        value=\"San Sebasti\u00e1n\"\n                    ><\/option>\n                                    <option\n                        value=\"Seno Otway\"\n                    ><\/option>\n                                    <option\n                        value=\"Seno Skyring\"\n                    ><\/option>\n                                    <option\n                        value=\"torres del paine\"\n                    ><\/option>\n                                    <option\n                        value=\"Tres Morros\"\n                    ><\/option>\n                                    <option\n                        value=\"Tres Pasos\"\n                    ><\/option>\n                                    <option\n                        value=\"Ushuaia\"\n                    ><\/option>\n                                    <option\n                        value=\"Villa Tehuelches\"\n                    ><\/option>\n                            <\/datalist>\n\n            <div class=\"t3pvm-layout\">\n                <section class=\"t3pvm-columna t3pvm-datos\">\n                    <div class=\"t3pvm-panel\">\n                        <div class=\"t3pvm-panel-titulo\">\n                            <span>1<\/span>\n                            <div>\n                                <h2>Datos del viaje<\/h2>\n                                <p>Cu\u00e9ntenos qui\u00e9n viaja y cu\u00e1ndo.<\/p>\n                            <\/div>\n                        <\/div>\n\n                        <div class=\"t3pvm-grid\">\n                            <label class=\"completo\">\n                                <span>Nombre o empresa *<\/span>\n                                <input type=\"text\" name=\"nombre\" required>\n                            <\/label>\n\n                            <label>\n                                <span>WhatsApp \/ Tel\u00e9fono *<\/span>\n                                <input type=\"text\" name=\"telefono\" required>\n                            <\/label>\n\n                            <label class=\"completo t3pvm-email-cliente\">\n                                <span>Correo electr\u00f3nico *<\/span>\n                                <input type=\"email\" name=\"email\" autocomplete=\"email\" required>\n                            <\/label>\n\n                            <label>\n                                <span>Fecha de inicio *<\/span>\n                                <input\n                                    type=\"date\"\n                                    name=\"fecha_inicio\"\n                                    id=\"t3pvm-fecha-inicio\"\n                                    min=\"2026-07-30\"\n                                    value=\"2026-07-30\"\n                                    required\n                                >\n                            <\/label>\n\n                            <label>\n                                <span>Fecha de t\u00e9rmino *<\/span>\n                                <input\n                                    type=\"date\"\n                                    name=\"fecha_termino\"\n                                    id=\"t3pvm-fecha-termino\"\n                                    min=\"2026-07-30\"\n                                    value=\"2026-07-30\"\n                                    required\n                                >\n                            <\/label>\n\n                            <label>\n                                <span>Hora de inicio<\/span>\n                                <input type=\"time\" name=\"hora_inicio\">\n                                <small>Opcional<\/small>\n                            <\/label>\n\n                            <label>\n                                <span>Hora de t\u00e9rmino<\/span>\n                                <input type=\"time\" name=\"hora_termino\">\n                                <small>Opcional<\/small>\n                            <\/label>\n\n                            <label class=\"completo\">\n                                <span>\u00bfD\u00f3nde comienza el servicio? *<\/span>\n                                <input\n                                    type=\"text\"\n                                    name=\"punto_inicio\"\n                                    id=\"t3pvm-punto-inicio\"\n                                    list=\"t3pvm-lugares\"\n                                    autocomplete=\"off\"\n                                    placeholder=\"Ej.: Hotel en Punta Arenas\"\n                                    required\n                                >\n                            <\/label>\n\n                            <label class=\"completo\">\n                                <span>\u00bfD\u00f3nde finalizar\u00e1 el servicio? *<\/span>\n                                <input\n                                    type=\"text\"\n                                    name=\"punto_termino\"\n                                    id=\"t3pvm-punto-termino\"\n                                    list=\"t3pvm-lugares\"\n                                    autocomplete=\"off\"\n                                    placeholder=\"Ej.: Punta Arenas, Puerto Natales o El Calafate\"\n                                    required\n                                >\n                                <small>Necesitamos este dato para revisar el retorno del veh\u00edculo y la jornada del chofer.<\/small>\n                            <\/label>\n\n                            <label>\n                                <span>Pasajeros *<\/span>\n                                <input\n                                    type=\"number\"\n                                    name=\"pasajeros\"\n                                    id=\"t3pvm-pasajeros\"\n                                    min=\"1\"\n                                    step=\"1\"\n                                    value=\"1\"\n                                    required\n                                >\n                            <\/label>\n                        <\/div>\n\n                        <div class=\"t3pvm-separador\">\n                            <h3>Servicios y preferencias<\/h3>\n                        <\/div>\n\n                        <div class=\"t3pvm-opciones\">\n                            <label>\n                                <input\n                                    type=\"checkbox\"\n                                    name=\"requiere_guia\"\n                                    id=\"t3pvm-requiere-guia\"\n                                    value=\"1\"\n                                >\n                                <span>Requiere gu\u00eda<\/span>\n                            <\/label>\n\n                            <label\n                                class=\"t3pvm-dias-guia\"\n                                id=\"t3pvm-dias-guia-wrap\"\n                                hidden\n                            >\n                                <span>D\u00edas con gu\u00eda<\/span>\n                                <input\n                                    type=\"number\"\n                                    name=\"dias_guia\"\n                                    id=\"t3pvm-dias-guia\"\n                                    min=\"0\"\n                                    step=\"1\"\n                                    value=\"0\"\n                                >\n                            <\/label>\n\n                            <div class=\"t3pvm-combustible-selector\">\n                                <strong>\u00bfQui\u00e9n suministrar\u00e1 el combustible durante el viaje?<\/strong>\n\n                                <label>\n                                    <input\n                                        type=\"radio\"\n                                        name=\"suministro_combustible\"\n                                        id=\"t3pvm-combustible-cliente\"\n                                        value=\"cliente\"\n                                        checked\n                                    >\n                                    <span>\n                                        El cliente suministrar\u00e1 el combustible durante el viaje.\n                                        <small>Opci\u00f3n predeterminada. El combustible no se suma a la cotizaci\u00f3n.<\/small>\n                                    <\/span>\n                                <\/label>\n\n                                <label>\n                                    <input\n                                        type=\"radio\"\n                                        name=\"suministro_combustible\"\n                                        id=\"t3pvm-combustible-gaba\"\n                                        value=\"gaba\"\n                                    >\n                                    <span>\n                                        Turismo Gaba suministrar\u00e1 el combustible.\n                                        <small>El combustible se calcular\u00e1 y se incluir\u00e1 en la cotizaci\u00f3n.<\/small>\n                                    <\/span>\n                                <\/label>\n                            <\/div>\n\n                            <label class=\"t3pvm-local-selector\">\n                                <input\n                                    type=\"checkbox\"\n                                    name=\"servicio_solo_punta_arenas\"\n                                    id=\"t3pvm-solo-punta-arenas\"\n                                    value=\"1\"\n                                >\n                                <span>El servicio se realizar\u00e1 \u00fanicamente dentro de Punta Arenas<\/span>\n                            <\/label>\n\n                            <div class=\"t3pvm-combustible-selector\" id=\"t3pvm-alimentacion-selector\">\n                                <strong>\u00bfQui\u00e9n proporcionar\u00e1 la alimentaci\u00f3n del chofer durante el viaje?<\/strong>\n                                <label>\n                                    <input type=\"radio\" name=\"suministro_alimentacion_chofer\" id=\"t3pvm-alimentacion-cliente\" value=\"cliente\" checked>\n                                    <span>El cliente proporcionar\u00e1 la alimentaci\u00f3n del chofer.<small>No se sumar\u00e1 este gasto a la cotizaci\u00f3n.<\/small><\/span>\n                                <\/label>\n                                <label>\n                                    <input type=\"radio\" name=\"suministro_alimentacion_chofer\" id=\"t3pvm-alimentacion-gaba\" value=\"gaba\">\n                                    <span>Turismo Gaba proporcionar\u00e1 la alimentaci\u00f3n del chofer.<small>Se incluir\u00e1 internamente en la cotizaci\u00f3n, sin mostrar su valor por separado.<\/small><\/span>\n                                <\/label>\n                                <p class=\"t3pvm-no-aplica\" id=\"t3pvm-alimentacion-no-aplica\" hidden>No aplica para servicios realizados \u00fanicamente dentro de Punta Arenas.<\/p>\n                            <\/div>\n\n                            <div class=\"t3pvm-combustible-selector\" id=\"t3pvm-hospedaje-selector\">\n                                <strong>\u00bfQui\u00e9n proporcionar\u00e1 el alojamiento del chofer cuando sea necesario?<\/strong>\n                                <label>\n                                    <input type=\"radio\" name=\"suministro_hospedaje_chofer\" id=\"t3pvm-hospedaje-cliente\" value=\"cliente\" checked>\n                                    <span>El cliente proporcionar\u00e1 el alojamiento del chofer.<small>No se sumar\u00e1 este gasto a la cotizaci\u00f3n.<\/small><\/span>\n                                <\/label>\n                                <label>\n                                    <input type=\"radio\" name=\"suministro_hospedaje_chofer\" id=\"t3pvm-hospedaje-gaba\" value=\"gaba\">\n                                    <span>Turismo Gaba proporcionar\u00e1 el alojamiento del chofer.<small>Se incluir\u00e1 internamente en la cotizaci\u00f3n, sin mostrar su valor por separado.<\/small><\/span>\n                                <\/label>\n                                <p class=\"t3pvm-no-aplica\" id=\"t3pvm-hospedaje-no-aplica\" hidden>No aplica para servicios realizados \u00fanicamente dentro de Punta Arenas.<\/p>\n                            <\/div>\n\n                            <label>\n                                <input\n                                    type=\"checkbox\"\n                                    name=\"incluye_argentina\"\n                                    id=\"t3pvm-argentina\"\n                                    value=\"1\"\n                                >\n                                <span>El viaje incluye Argentina<\/span>\n                            <\/label>\n\n                            <label>\n                                <input\n                                    type=\"checkbox\"\n                                    name=\"mascota\"\n                                    value=\"1\"\n                                >\n                                <span>Viaja con mascota<\/span>\n                            <\/label>\n                        <\/div>\n\n                        <label class=\"t3pvm-observaciones\">\n                            <span>Observaciones<\/span>\n                            <textarea\n                                name=\"observaciones\"\n                                rows=\"4\"\n                                placeholder=\"Equipaje, necesidades especiales, vuelos, ferris u otra informaci\u00f3n \u00fatil.\"\n                            ><\/textarea>\n                        <\/label>\n                    <\/div>\n                <\/section>\n\n                <section class=\"t3pvm-columna t3pvm-itinerario\">\n                    <div class=\"t3pvm-panel\">\n                        <div class=\"t3pvm-panel-titulo t3pvm-recorrido-cabecera\">\n                            <span>2<\/span>\n                            <div>\n                                <h2 id=\"t3pvm-recorrido-titulo\">\u00bfQu\u00e9 lugares desea visitar?<\/h2>\n                                <p id=\"t3pvm-recorrido-texto\">\n                                    Agregue las ciudades, atractivos o lugares que desea conocer.\n                                    No necesita separarlos por fechas ni indicar kil\u00f3metros.\n                                <\/p>\n                            <\/div>\n                        <\/div>\n\n                        <div id=\"t3pvm-modo-lugares\">\n                            <button\n                                type=\"button\"\n                                id=\"t3pvm-agregar-lugar\"\n                                class=\"t3pvm-agregar-recorrido\"\n                            >\n                                + Agregar lugar\n                            <\/button>\n                            <div id=\"t3pvm-lugares-lista\"><\/div>\n                        <\/div>\n\n                        <div id=\"t3pvm-modo-tramos\" hidden>\n                            <div class=\"t3pvm-leyenda-trayectos\" aria-label=\"Ayuda para organizar los trayectos\">\n                                <p><strong class=\"t3pvm-leyenda-mas\">+<\/strong> Agrega un trayecto desde y hasta el lugar que desee.<\/p>\n                                <p><strong class=\"t3pvm-leyenda-x\">\u00d7<\/strong> Elimina el trayecto agregado.<\/p>\n                                <p><strong class=\"t3pvm-leyenda-arrastre\">\u2195<\/strong> Para trasladar un trayecto entre d\u00edas, p\u00ednchelo y arr\u00e1strelo al d\u00eda que necesite.<\/p>\n                            <\/div>\n                            <div id=\"t3pvm-dias\"><\/div>\n                        <\/div>\n                    <\/div>\n                <\/section>\n\n                <aside class=\"t3pvm-resumen\">\n                    <div class=\"t3pvm-resumen-card\">\n                        <span class=\"t3pvm-kicker\">ESTIMACI\u00d3N EN TIEMPO REAL<\/span>\n                        <h2>Valor aproximado<\/h2>\n\n                        <dl>\n                            <div>\n                                <dt>D\u00edas<\/dt>\n                                <dd id=\"t3pvm-res-dias\">1<\/dd>\n                            <\/div>\n                            <div>\n                                <dt>Pasajeros<\/dt>\n                                <dd id=\"t3pvm-res-pasajeros\">1<\/dd>\n                            <\/div>\n                            <div>\n                                <dt>Veh\u00edculo estimado<\/dt>\n                                <dd id=\"t3pvm-res-vehiculo\">\u2014<\/dd>\n                            <\/div>\n                            <div>\n                                <dt>T\u00e9rmino del servicio<\/dt>\n                                <dd id=\"t3pvm-res-termino\">Pendiente<\/dd>\n                            <\/div>\n                            <div id=\"t3pvm-fila-km\">\n                                <dt>Km conocidos<\/dt>\n                                <dd id=\"t3pvm-res-km\">0 km<\/dd>\n                            <\/div>\n                            <div id=\"t3pvm-fila-tiempo\">\n                                <dt>Tiempo de conducci\u00f3n<\/dt>\n                                <dd id=\"t3pvm-res-tiempo\">0 min<\/dd>\n                            <\/div>\n                            <div id=\"t3pvm-fila-jornada\">\n                                <dt>Jornadas por revisar<\/dt>\n                                <dd id=\"t3pvm-res-jornada\">0<\/dd>\n                            <\/div>\n                            <div id=\"t3pvm-fila-faltantes\">\n                                <dt>Tramos por revisar<\/dt>\n                                <dd id=\"t3pvm-res-faltantes\">0<\/dd>\n                            <\/div>\n                            <div>\n                                <dt>Combustible<\/dt>\n                                <dd id=\"t3pvm-res-combustible\">A cargo del cliente<\/dd>\n                            <\/div>\n                            <div>\n                                <dt>Alimentaci\u00f3n del chofer<\/dt>\n                                <dd id=\"t3pvm-res-alimentacion\">A cargo del cliente<\/dd>\n                            <\/div>\n                            <div>\n                                <dt>Alojamiento del chofer<\/dt>\n                                <dd id=\"t3pvm-res-hospedaje\">A cargo del cliente<\/dd>\n                            <\/div>\n                            <div class=\"total\">\n                                <dt>Estimaci\u00f3n<\/dt>\n                                <dd id=\"t3pvm-res-total\">$0<\/dd>\n                            <\/div>\n                        <\/dl>\n\n                        <div\n                            id=\"t3pvm-confianza\"\n                            class=\"t3pvm-confianza baja\"\n                        >\n                            Agregue sus trayectos para obtener una estimaci\u00f3n.\n                        <\/div>\n\n                        <div id=\"t3pvm-aviso-revision\" class=\"t3pvm-aviso-revision\" hidden>\n                            <strong>Estimaci\u00f3n sujeta a revisi\u00f3n.<\/strong>\n                            Hay uno o m\u00e1s trayectos sin kil\u00f3metros registrados. El valor final podr\u00eda aumentar una vez revisados todos los trayectos.\n                        <\/div>\n\n                        <div id=\"t3pvm-aviso-jornada\" class=\"t3pvm-aviso-revision\" hidden>\n                            <strong>Jornada de conducci\u00f3n por revisar.<\/strong>\n                            Uno o m\u00e1s d\u00edas superan la jornada configurada del chofer considerando solamente el tiempo estimado de conducci\u00f3n. Nuestro equipo revisar\u00e1 pausas, visitas, descansos y posibles ajustes al itinerario.\n                        <\/div>\n\n                        <div id=\"t3pvm-aviso-operativo\" class=\"t3pvm-aviso-revision\" hidden>\n                            <strong>Revisi\u00f3n operativa necesaria.<\/strong>\n                            Cuando el servicio finaliza fuera de Punta Arenas, el valor es preliminar. Turismo Gaba debe revisar el retorno del veh\u00edculo, la jornada y los gastos del chofer, por lo que el total podr\u00eda ajustarse.\n                        <\/div>\n\n                        <p class=\"t3pvm-advertencia\">\n                            Mientras m\u00e1s detallados sean los trayectos, m\u00e1s certera ser\u00e1 la estimaci\u00f3n y menor la posibilidad de ajustes en el valor final.\n                        <\/p>\n\n                        <button\n                            type=\"submit\"\n                            class=\"t3pvm-enviar\"\n                        >\n                            Enviar solicitud\n                        <\/button>\n                    <\/div>\n                <\/aside>\n            <\/div>\n        <\/form>\n            <\/div>\n\n    <script>\n\n(function () {\n    'use strict';\n\n    const rutas = [{\"id\":63,\"origen_id\":21,\"destino_id\":22,\"origen\":\"Bah\u00eda Azul\",\"origen_normalizado\":\"bahia azul\",\"destino\":\"Cerro Sombrero\",\"destino_normalizado\":\"cerro sombrero\",\"kilometros\":58,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":79,\"origen_id\":21,\"destino_id\":23,\"origen\":\"Bah\u00eda Azul\",\"origen_normalizado\":\"bahia azul\",\"destino\":\"Porvenir\",\"destino_normalizado\":\"porvenir\",\"kilometros\":131,\"bidireccional\":true,\"actualizado_en\":\"2026-07-22 00:17:19\"},{\"id\":77,\"origen_id\":45,\"destino_id\":49,\"origen\":\"Cameron\",\"origen_normalizado\":\"cameron\",\"destino\":\"torres del paine\",\"destino_normalizado\":\"torres del paine\",\"kilometros\":582,\"bidireccional\":true,\"actualizado_en\":\"2026-07-22 00:02:08\"},{\"id\":80,\"origen_id\":45,\"destino_id\":58,\"origen\":\"Cameron\",\"origen_normalizado\":\"cameron\",\"destino\":\"Ushuaia\",\"destino_normalizado\":\"ushuaia\",\"kilometros\":390,\"bidireccional\":true,\"actualizado_en\":\"2026-07-22 00:18:59\"},{\"id\":45,\"origen_id\":30,\"destino_id\":36,\"origen\":\"Cerro Castillo\",\"origen_normalizado\":\"cerro castillo\",\"destino\":\"Centro de Bienvenida Torres del Paine\",\"destino_normalizado\":\"centro de bienvenida torres del paine\",\"kilometros\":77,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":50,\"origen_id\":30,\"destino_id\":41,\"origen\":\"Cerro Castillo\",\"origen_normalizado\":\"cerro castillo\",\"destino\":\"Hotel Lago Grey\",\"destino_normalizado\":\"hotel lago grey\",\"kilometros\":101,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":48,\"origen_id\":30,\"destino_id\":39,\"origen\":\"Cerro Castillo\",\"origen_normalizado\":\"cerro castillo\",\"destino\":\"Lago Peho\u00e9\",\"destino_normalizado\":\"lago pehoe\",\"kilometros\":99,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":44,\"origen_id\":30,\"destino_id\":35,\"origen\":\"Cerro Castillo\",\"origen_normalizado\":\"cerro castillo\",\"destino\":\"Laguna Amarga\",\"destino_normalizado\":\"laguna amarga\",\"kilometros\":70,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":46,\"origen_id\":30,\"destino_id\":37,\"origen\":\"Cerro Castillo\",\"origen_normalizado\":\"cerro castillo\",\"destino\":\"Pudeto\",\"destino_normalizado\":\"pudeto\",\"kilometros\":95,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":49,\"origen_id\":30,\"destino_id\":40,\"origen\":\"Cerro Castillo\",\"origen_normalizado\":\"cerro castillo\",\"destino\":\"R\u00edo Serrano\",\"destino_normalizado\":\"rio serrano\",\"kilometros\":84,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":47,\"origen_id\":30,\"destino_id\":38,\"origen\":\"Cerro Castillo\",\"origen_normalizado\":\"cerro castillo\",\"destino\":\"Salto Grande\",\"destino_normalizado\":\"salto grande\",\"kilometros\":97,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":65,\"origen_id\":22,\"destino_id\":23,\"origen\":\"Cerro Sombrero\",\"origen_normalizado\":\"cerro sombrero\",\"destino\":\"Porvenir\",\"destino_normalizado\":\"porvenir\",\"kilometros\":121,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":64,\"origen_id\":22,\"destino_id\":24,\"origen\":\"Cerro Sombrero\",\"origen_normalizado\":\"cerro sombrero\",\"destino\":\"San Sebasti\u00e1n\",\"destino_normalizado\":\"san sebastian\",\"kilometros\":170,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":75,\"origen_id\":26,\"destino_id\":27,\"origen\":\"El Calafate\",\"origen_normalizado\":\"el calafate\",\"destino\":\"El Chalt\u00e9n\",\"destino_normalizado\":\"el chalten\",\"kilometros\":215,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":51,\"origen_id\":35,\"destino_id\":36,\"origen\":\"Laguna Amarga\",\"origen_normalizado\":\"laguna amarga\",\"destino\":\"Centro de Bienvenida Torres del Paine\",\"destino_normalizado\":\"centro de bienvenida torres del paine\",\"kilometros\":7,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":57,\"origen_id\":35,\"destino_id\":41,\"origen\":\"Laguna Amarga\",\"origen_normalizado\":\"laguna amarga\",\"destino\":\"Hotel Lago Grey\",\"destino_normalizado\":\"hotel lago grey\",\"kilometros\":75,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":52,\"origen_id\":35,\"destino_id\":43,\"origen\":\"Laguna Amarga\",\"origen_normalizado\":\"laguna amarga\",\"destino\":\"Hotel Las Torres\",\"destino_normalizado\":\"hotel las torres\",\"kilometros\":7,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":55,\"origen_id\":35,\"destino_id\":39,\"origen\":\"Laguna Amarga\",\"origen_normalizado\":\"laguna amarga\",\"destino\":\"Lago Peho\u00e9\",\"destino_normalizado\":\"lago pehoe\",\"kilometros\":43,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":53,\"origen_id\":35,\"destino_id\":37,\"origen\":\"Laguna Amarga\",\"origen_normalizado\":\"laguna amarga\",\"destino\":\"Pudeto\",\"destino_normalizado\":\"pudeto\",\"kilometros\":39,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":56,\"origen_id\":35,\"destino_id\":40,\"origen\":\"Laguna Amarga\",\"origen_normalizado\":\"laguna amarga\",\"destino\":\"R\u00edo Serrano\",\"destino_normalizado\":\"rio serrano\",\"kilometros\":58,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":54,\"origen_id\":35,\"destino_id\":38,\"origen\":\"Laguna Amarga\",\"origen_normalizado\":\"laguna amarga\",\"destino\":\"Salto Grande\",\"destino_normalizado\":\"salto grande\",\"kilometros\":41,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":66,\"origen_id\":23,\"destino_id\":44,\"origen\":\"Porvenir\",\"origen_normalizado\":\"porvenir\",\"destino\":\"Bah\u00eda Felipe\",\"destino_normalizado\":\"bahia felipe\",\"kilometros\":75,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":67,\"origen_id\":23,\"destino_id\":45,\"origen\":\"Porvenir\",\"origen_normalizado\":\"porvenir\",\"destino\":\"Cameron\",\"destino_normalizado\":\"cameron\",\"kilometros\":151,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":68,\"origen_id\":23,\"destino_id\":46,\"origen\":\"Porvenir\",\"origen_normalizado\":\"porvenir\",\"destino\":\"Russfin\",\"destino_normalizado\":\"russfin\",\"kilometros\":188,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":69,\"origen_id\":23,\"destino_id\":24,\"origen\":\"Porvenir\",\"origen_normalizado\":\"porvenir\",\"destino\":\"San Sebasti\u00e1n\",\"destino_normalizado\":\"san sebastian\",\"kilometros\":295,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":61,\"origen_id\":37,\"destino_id\":41,\"origen\":\"Pudeto\",\"origen_normalizado\":\"pudeto\",\"destino\":\"Hotel Lago Grey\",\"destino_normalizado\":\"hotel lago grey\",\"kilometros\":36,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":59,\"origen_id\":37,\"destino_id\":39,\"origen\":\"Pudeto\",\"origen_normalizado\":\"pudeto\",\"destino\":\"Lago Peho\u00e9\",\"destino_normalizado\":\"lago pehoe\",\"kilometros\":4,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":60,\"origen_id\":37,\"destino_id\":40,\"origen\":\"Pudeto\",\"origen_normalizado\":\"pudeto\",\"destino\":\"R\u00edo Serrano\",\"destino_normalizado\":\"rio serrano\",\"kilometros\":19,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":58,\"origen_id\":37,\"destino_id\":38,\"origen\":\"Pudeto\",\"origen_normalizado\":\"pudeto\",\"destino\":\"Salto Grande\",\"destino_normalizado\":\"salto grande\",\"kilometros\":2,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":36,\"origen_id\":18,\"destino_id\":36,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Centro de Bienvenida Torres del Paine\",\"destino_normalizado\":\"centro de bienvenida torres del paine\",\"kilometros\":136,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":30,\"origen_id\":18,\"destino_id\":30,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Cerro Castillo\",\"destino_normalizado\":\"cerro castillo\",\"kilometros\":57,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":27,\"origen_id\":18,\"destino_id\":28,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Cueva del Milod\u00f3n\",\"destino_normalizado\":\"cueva del milodon\",\"kilometros\":24,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":42,\"origen_id\":18,\"destino_id\":42,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Hotel Explora\",\"destino_normalizado\":\"hotel explora\",\"kilometros\":150,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":41,\"origen_id\":18,\"destino_id\":41,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Hotel Lago Grey\",\"destino_normalizado\":\"hotel lago grey\",\"kilometros\":160,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":43,\"origen_id\":18,\"destino_id\":43,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Hotel Las Torres\",\"destino_normalizado\":\"hotel las torres\",\"kilometros\":145,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":39,\"origen_id\":18,\"destino_id\":39,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Lago Peho\u00e9\",\"destino_normalizado\":\"lago pehoe\",\"kilometros\":158,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":35,\"origen_id\":18,\"destino_id\":35,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Laguna Amarga\",\"destino_normalizado\":\"laguna amarga\",\"kilometros\":129,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":34,\"origen_id\":18,\"destino_id\":34,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Laguna Azul\",\"destino_normalizado\":\"laguna azul\",\"kilometros\":120,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":31,\"origen_id\":18,\"destino_id\":31,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Morro Chico\",\"destino_normalizado\":\"morro chico\",\"kilometros\":101,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":33,\"origen_id\":18,\"destino_id\":33,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Porter\u00eda Sarmiento\",\"destino_normalizado\":\"porteria sarmiento\",\"kilometros\":112,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":32,\"origen_id\":18,\"destino_id\":32,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Porter\u00eda Serrano\",\"destino_normalizado\":\"porteria serrano\",\"kilometros\":80,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":37,\"origen_id\":18,\"destino_id\":37,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Pudeto\",\"destino_normalizado\":\"pudeto\",\"kilometros\":154,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":40,\"origen_id\":18,\"destino_id\":40,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"R\u00edo Serrano\",\"destino_normalizado\":\"rio serrano\",\"kilometros\":143,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":29,\"origen_id\":18,\"destino_id\":25,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"R\u00edo Turbio\",\"destino_normalizado\":\"rio turbio\",\"kilometros\":48,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":38,\"origen_id\":18,\"destino_id\":38,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Salto Grande\",\"destino_normalizado\":\"salto grande\",\"kilometros\":156,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":28,\"origen_id\":18,\"destino_id\":29,\"origen\":\"Puerto Natales\",\"origen_normalizado\":\"puerto natales\",\"destino\":\"Tres Pasos\",\"destino_normalizado\":\"tres pasos\",\"kilometros\":36,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":1,\"origen_id\":1,\"destino_id\":2,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Aeropuerto Presidente Carlos Ib\u00e1\u00f1ez\",\"destino_normalizado\":\"aeropuerto presidente carlos ibanez\",\"kilometros\":21,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":20,\"origen_id\":1,\"destino_id\":21,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Bah\u00eda Azul\",\"destino_normalizado\":\"bahia azul\",\"kilometros\":340,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":4,\"origen_id\":1,\"destino_id\":5,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Cabeza del Mar\",\"destino_normalizado\":\"cabeza del mar\",\"kilometros\":47,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":76,\"origen_id\":1,\"destino_id\":45,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Cameron\",\"destino_normalizado\":\"cameron\",\"kilometros\":338,\"bidireccional\":true,\"actualizado_en\":\"2026-07-21 23:59:32\"},{\"id\":21,\"origen_id\":1,\"destino_id\":22,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Cerro Sombrero\",\"destino_normalizado\":\"cerro sombrero\",\"kilometros\":365,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":25,\"origen_id\":1,\"destino_id\":26,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"El Calafate\",\"destino_normalizado\":\"el calafate\",\"kilometros\":520,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":26,\"origen_id\":1,\"destino_id\":27,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"El Chalt\u00e9n\",\"destino_normalizado\":\"el chalten\",\"kilometros\":735,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":7,\"origen_id\":1,\"destino_id\":8,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Fuerte Bulnes\",\"destino_normalizado\":\"fuerte bulnes\",\"kilometros\":60,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":15,\"origen_id\":1,\"destino_id\":16,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Monte Aymond\",\"destino_normalizado\":\"monte aymond\",\"kilometros\":192,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":2,\"origen_id\":1,\"destino_id\":3,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Parque Chabunco\",\"destino_normalizado\":\"parque chabunco\",\"kilometros\":21,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":22,\"origen_id\":1,\"destino_id\":23,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Porvenir\",\"destino_normalizado\":\"porvenir\",\"kilometros\":365,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":16,\"origen_id\":1,\"destino_id\":17,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Posesi\u00f3n\",\"destino_normalizado\":\"posesion\",\"kilometros\":219,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":6,\"origen_id\":1,\"destino_id\":7,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Puerto del Hambre\",\"destino_normalizado\":\"puerto del hambre\",\"kilometros\":58,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":17,\"origen_id\":1,\"destino_id\":18,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Puerto Natales\",\"destino_normalizado\":\"puerto natales\",\"kilometros\":247,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":13,\"origen_id\":1,\"destino_id\":14,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Punta Delgada\",\"destino_normalizado\":\"punta delgada\",\"kilometros\":170,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":19,\"origen_id\":1,\"destino_id\":20,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Punta Dungeness\",\"destino_normalizado\":\"punta dungeness\",\"kilometros\":279,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":18,\"origen_id\":1,\"destino_id\":19,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"R\u00edo Gallegos\",\"destino_normalizado\":\"rio gallegos\",\"kilometros\":252,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":14,\"origen_id\":1,\"destino_id\":15,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"R\u00edo Rubens\",\"destino_normalizado\":\"rio rubens\",\"kilometros\":184,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":8,\"origen_id\":1,\"destino_id\":9,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"R\u00edo San Juan\",\"destino_normalizado\":\"rio san juan\",\"kilometros\":60,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":24,\"origen_id\":1,\"destino_id\":25,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"R\u00edo Turbio\",\"destino_normalizado\":\"rio turbio\",\"kilometros\":295,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":9,\"origen_id\":1,\"destino_id\":10,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"R\u00edo Verde\",\"destino_normalizado\":\"rio verde\",\"kilometros\":86,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":11,\"origen_id\":1,\"destino_id\":12,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"San Gregorio\",\"destino_normalizado\":\"san gregorio\",\"kilometros\":124,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":23,\"origen_id\":1,\"destino_id\":24,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"San Sebasti\u00e1n\",\"destino_normalizado\":\"san sebastian\",\"kilometros\":470,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":5,\"origen_id\":1,\"destino_id\":6,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Seno Otway\",\"destino_normalizado\":\"seno otway\",\"kilometros\":53,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":12,\"origen_id\":1,\"destino_id\":13,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Seno Skyring\",\"destino_normalizado\":\"seno skyring\",\"kilometros\":127,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":78,\"origen_id\":1,\"destino_id\":49,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"torres del paine\",\"destino_normalizado\":\"torres del paine\",\"kilometros\":318,\"bidireccional\":true,\"actualizado_en\":\"2026-07-22 00:03:15\"},{\"id\":3,\"origen_id\":1,\"destino_id\":4,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Tres Morros\",\"destino_normalizado\":\"tres morros\",\"kilometros\":41,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":10,\"origen_id\":1,\"destino_id\":11,\"origen\":\"Punta Arenas\",\"origen_normalizado\":\"punta arenas\",\"destino\":\"Villa Tehuelches\",\"destino_normalizado\":\"villa tehuelches\",\"kilometros\":100,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":71,\"origen_id\":19,\"destino_id\":26,\"origen\":\"R\u00edo Gallegos\",\"origen_normalizado\":\"rio gallegos\",\"destino\":\"El Calafate\",\"destino_normalizado\":\"el calafate\",\"kilometros\":315,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":70,\"origen_id\":19,\"destino_id\":47,\"origen\":\"R\u00edo Gallegos\",\"origen_normalizado\":\"rio gallegos\",\"destino\":\"G\u00fcer Aike\",\"destino_normalizado\":\"guer aike\",\"kilometros\":30,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":72,\"origen_id\":19,\"destino_id\":25,\"origen\":\"R\u00edo Gallegos\",\"origen_normalizado\":\"rio gallegos\",\"destino\":\"R\u00edo Turbio\",\"destino_normalizado\":\"rio turbio\",\"kilometros\":285,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":62,\"origen_id\":40,\"destino_id\":41,\"origen\":\"R\u00edo Serrano\",\"origen_normalizado\":\"rio serrano\",\"destino\":\"Hotel Lago Grey\",\"destino_normalizado\":\"hotel lago grey\",\"kilometros\":17,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":73,\"origen_id\":25,\"destino_id\":48,\"origen\":\"R\u00edo Turbio\",\"origen_normalizado\":\"rio turbio\",\"destino\":\"28 de Noviembre\",\"destino_normalizado\":\"28 de noviembre\",\"kilometros\":7,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"},{\"id\":74,\"origen_id\":25,\"destino_id\":26,\"origen\":\"R\u00edo Turbio\",\"origen_normalizado\":\"rio turbio\",\"destino\":\"El Calafate\",\"destino_normalizado\":\"el calafate\",\"kilometros\":270,\"bidireccional\":true,\"actualizado_en\":\"2026-07-15 20:34:18\"}];\n    const vehiculos = [{\"id\":7,\"nombre\":\"Sed\u00e1n\",\"capacidad\":3,\"valor_diario\":50000,\"valor_medio_dia\":40000,\"rendimiento_km_litro\":13,\"orden\":1,\"actualizado_en\":\"2026-07-25 20:00:12\"},{\"id\":6,\"nombre\":\"suv\",\"capacidad\":3,\"valor_diario\":65000,\"valor_medio_dia\":50000,\"rendimiento_km_litro\":13,\"orden\":2,\"actualizado_en\":\"2026-07-25 20:00:40\"},{\"id\":8,\"nombre\":\"Minib\u00fas\",\"capacidad\":6,\"valor_diario\":80000,\"valor_medio_dia\":60000,\"rendimiento_km_litro\":13,\"orden\":3,\"actualizado_en\":\"2026-07-25 19:58:13\"},{\"id\":1,\"nombre\":\"van\",\"capacidad\":11,\"valor_diario\":200000,\"valor_medio_dia\":150000,\"rendimiento_km_litro\":10,\"orden\":4,\"actualizado_en\":\"2026-07-25 19:55:05\"},{\"id\":9,\"nombre\":\"Bus\",\"capacidad\":22,\"valor_diario\":450000,\"valor_medio_dia\":350000,\"rendimiento_km_litro\":6,\"orden\":5,\"actualizado_en\":\"2026-07-25 19:58:58\"}];\n    const config = {\"chofer_dia\":100000,\"alimentacion_dia\":40000,\"hospedaje_dia\":70000,\"guia_dia\":60000,\"argentina\":180000,\"combustible_litro\":1500,\"margen\":20,\"moneda\":\"CLP\",\"jornada_chofer_horas\":8};\n    const form = document.getElementById('t3pvm-form');\n    const CLAVE_BORRADOR = 't3p_viaje_medida_borrador_v1';\n    const solicitudExitosa = false;\n    const ajaxUrl = \"https:\\\/\\\/tour3patagonia.com\\\/wp-admin\\\/admin-ajax.php\";\n    let envioAutorizado = false;\n\n    if (solicitudExitosa) {\n        try {\n            window.localStorage.removeItem(CLAVE_BORRADOR);\n        } catch (error) {\n            \/* El env\u00edo ya fue exitoso; no interrumpimos la confirmaci\u00f3n. *\/\n        }\n    }\n\n    if (!form || form.dataset.iniciado === '1') return;\n    form.dataset.iniciado = '1';\n\n    \/*\n     * Desactivamos los avisos silenciosos del navegador para mostrar\n     * siempre mensajes claros y controlados por el cotizador.\n     *\/\n    form.noValidate = true;\n\n    const fechaInicio = document.getElementById('t3pvm-fecha-inicio');\n    const fechaTermino = document.getElementById('t3pvm-fecha-termino');\n    const horaInicio = form.querySelector('[name=\"hora_inicio\"]');\n    const horaTermino = form.querySelector('[name=\"hora_termino\"]');\n    const pasajeros = document.getElementById('t3pvm-pasajeros');\n    const puntoInicio = document.getElementById('t3pvm-punto-inicio');\n    const puntoTermino = document.getElementById('t3pvm-punto-termino');\n    const itinerarioJson = document.getElementById('t3pvm-itinerario-json');\n    const requiereGuia = document.getElementById('t3pvm-requiere-guia');\n    const diasGuiaWrap = document.getElementById('t3pvm-dias-guia-wrap');\n    const diasGuia = document.getElementById('t3pvm-dias-guia');\n    const combustibleCliente = document.getElementById('t3pvm-combustible-cliente');\n    const combustibleGaba = document.getElementById('t3pvm-combustible-gaba');\n    const soloPuntaArenas = document.getElementById('t3pvm-solo-punta-arenas');\n    const alimentacionCliente = document.getElementById('t3pvm-alimentacion-cliente');\n    const alimentacionGaba = document.getElementById('t3pvm-alimentacion-gaba');\n    const hospedajeCliente = document.getElementById('t3pvm-hospedaje-cliente');\n    const hospedajeGaba = document.getElementById('t3pvm-hospedaje-gaba');\n    const modoLugares = document.getElementById('t3pvm-modo-lugares');\n    const modoTramos = document.getElementById('t3pvm-modo-tramos');\n    const listaLugares = document.getElementById('t3pvm-lugares-lista');\n    const contenedorDias = document.getElementById('t3pvm-dias');\n    const tituloRecorrido = document.getElementById('t3pvm-recorrido-titulo');\n    const textoRecorrido = document.getElementById('t3pvm-recorrido-texto');\n    const mensajeErrorServidor = document.getElementById('t3pvm-mensaje-error');\n\n    let lugares = [''];\n    let dias = [];\n    let arrastre = null;\n    let temporizadorBorrador = null;\n    let restaurandoBorrador = false;\n\n    function almacenamientoDisponible() {\n        try {\n            const prueba = '__t3pvm_storage__';\n            window.localStorage.setItem(prueba, '1');\n            window.localStorage.removeItem(prueba);\n            return true;\n        } catch (error) {\n            return false;\n        }\n    }\n\n    function camposBorrador() {\n        const valores = {};\n\n        Array.from(form.elements).forEach(function (campo) {\n            if (!campo.name) return;\n            if (['action', 't3p_vm_nonce', 't3p_vm_sitio_web', 'itinerario_json'].includes(campo.name)) return;\n\n            if (campo.type === 'checkbox' || campo.type === 'radio') {\n                valores[campo.name + '::' + campo.value] = campo.checked;\n            } else {\n                valores[campo.name] = campo.value;\n            }\n        });\n\n        return valores;\n    }\n\n    function capturarEstadoBorrador() {\n        if (usaCombustibleGaba()) {\n            capturarDias();\n        } else {\n            capturarLugares();\n        }\n\n        return {\n            version: 1,\n            guardadoEn: new Date().toISOString(),\n            campos: camposBorrador(),\n            lugares: lugares.slice(),\n            dias: JSON.parse(JSON.stringify(dias))\n        };\n    }\n\n    function guardarBorradorAhora() {\n        if (restaurandoBorrador || !almacenamientoDisponible()) return;\n\n        try {\n            window.localStorage.setItem(\n                CLAVE_BORRADOR,\n                JSON.stringify(capturarEstadoBorrador())\n            );\n        } catch (error) {\n            \/* No bloqueamos el uso del cotizador si el navegador no permite guardar. *\/\n        }\n    }\n\n    function programarGuardadoBorrador() {\n        if (restaurandoBorrador) return;\n\n        window.clearTimeout(temporizadorBorrador);\n        temporizadorBorrador = window.setTimeout(guardarBorradorAhora, 350);\n    }\n\n    function aplicarCamposBorrador(valores) {\n        Array.from(form.elements).forEach(function (campo) {\n            if (!campo.name) return;\n            if (['action', 't3p_vm_nonce', 't3p_vm_sitio_web', 'itinerario_json'].includes(campo.name)) return;\n\n            if (campo.type === 'checkbox' || campo.type === 'radio') {\n                const clave = campo.name + '::' + campo.value;\n                if (Object.prototype.hasOwnProperty.call(valores, clave)) {\n                    campo.checked = Boolean(valores[clave]);\n                }\n            } else if (Object.prototype.hasOwnProperty.call(valores, campo.name)) {\n                campo.value = String(valores[campo.name] ?? '');\n            }\n        });\n    }\n\n    function leerBorrador() {\n        if (!almacenamientoDisponible()) return null;\n\n        try {\n            const texto = window.localStorage.getItem(CLAVE_BORRADOR);\n            if (!texto) return null;\n\n            const borrador = JSON.parse(texto);\n            return borrador && typeof borrador === 'object' ? borrador : null;\n        } catch (error) {\n            return null;\n        }\n    }\n\n    function restaurarBorradorDisponible() {\n        const borrador = leerBorrador();\n        if (!borrador || !borrador.campos) return false;\n\n        const parametros = new URLSearchParams(window.location.search);\n        const vieneDeError = parametros.has('t3p_vm_error');\n        const aceptar = vieneDeError || window.confirm(\n            'Encontramos una solicitud sin enviar. \u00bfDesea recuperar los datos ingresados?'\n        );\n\n        if (!aceptar) {\n            try {\n                window.localStorage.removeItem(CLAVE_BORRADOR);\n            } catch (error) {\n                \/* Sin acci\u00f3n adicional. *\/\n            }\n            return false;\n        }\n\n        restaurandoBorrador = true;\n\n        aplicarCamposBorrador(borrador.campos);\n\n        if (Array.isArray(borrador.lugares) && borrador.lugares.length) {\n            lugares = borrador.lugares.map(function (lugar) {\n                return String(lugar || '');\n            });\n        }\n\n        if (Array.isArray(borrador.dias) && borrador.dias.length) {\n            dias = borrador.dias.map(function (dia) {\n                return {\n                    fecha: String(dia.fecha || ''),\n                    tramos: Array.isArray(dia.tramos)\n                        ? dia.tramos.map(function (tramo) {\n                            return {\n                                origen: String(tramo.origen || ''),\n                                destino: String(tramo.destino || '')\n                            };\n                        })\n                        : []\n                };\n            });\n        }\n\n        restaurandoBorrador = false;\n        return true;\n    }\n\n    function normalizar(texto) {\n        return String(texto || '').normalize('NFD')\n            .replace(\/[\\u0300-\\u036f]\/g, '').trim().toLowerCase()\n            .replace(\/\\s+\/g, ' ');\n    }\n\n    const mapaRutas = new Map();\n\n    function normalizarSuperficie(superficie) {\n        const permitidas = [\n            'pavimentado',\n            'ripio',\n            'ripio_irregular',\n            'camino_4x4'\n        ];\n        const clave = String(superficie || '').trim().toLowerCase();\n        return permitidas.includes(clave) ? clave : 'pavimentado';\n    }\n\n    function nombreSuperficie(superficie) {\n        const nombres = {\n            pavimentado: 'Pavimentado',\n            ripio: 'Ripio',\n            ripio_irregular: 'Ripio irregular',\n            camino_4x4: 'Camino 4x4'\n        };\n        return nombres[normalizarSuperficie(superficie)] || 'Pavimentado';\n    }\n\n    rutas.forEach(function (ruta) {\n        const o = normalizar(ruta.origen_normalizado || ruta.origen);\n        const d = normalizar(ruta.destino_normalizado || ruta.destino);\n        const km = Number(ruta.kilometros || 0);\n        if (!o || !d || km <= 0) return;\n\n        const superficie = normalizarSuperficie(ruta.superficie);\n        const velocidad = Math.max(\n            1,\n            Number(ruta.velocidad_recomendada || 90)\n        );\n        const minutos = Math.max(\n            1,\n            Math.round(\n                Number(\n                    ruta.tiempo_estimado_minutos\n                    || ((km \/ velocidad) * 60)\n                )\n            )\n        );\n\n        const detalle = {\n            kilometros: km,\n            superficie: superficie,\n            superficie_nombre: nombreSuperficie(superficie),\n            velocidad_recomendada: velocidad,\n            tiempo_estimado_minutos: minutos\n        };\n\n        mapaRutas.set(o + '|||' + d, detalle);\n        if (ruta.bidireccional) {\n            mapaRutas.set(d + '|||' + o, detalle);\n        }\n    });\n\n    function buscarRuta(origen, destino) {\n        const clave = normalizar(origen) + '|||' + normalizar(destino);\n        return mapaRutas.has(clave)\n            ? Object.assign({}, mapaRutas.get(clave))\n            : null;\n    }\n\n    function buscarKm(origen, destino) {\n        const ruta = buscarRuta(origen, destino);\n        return ruta ? Number(ruta.kilometros) : null;\n    }\n\n    function tiempoTexto(minutos) {\n        minutos = Math.max(0, Math.round(Number(minutos || 0)));\n        const horas = Math.floor(minutos \/ 60);\n        const resto = minutos % 60;\n\n        if (horas > 0 && resto > 0) {\n            return horas + ' h ' + resto + ' min';\n        }\n\n        if (horas > 0) {\n            return horas + ' h';\n        }\n\n        return resto + ' min';\n    }\n\n    function fechaLocal(fecha) {\n        const p = String(fecha || '').split('-').map(Number);\n        return p.length === 3 && p[0] ? new Date(p[0], p[1] - 1, p[2], 12) : null;\n    }\n\n    function fechaHoraLocal(fecha, hora) {\n        const partesFecha = String(fecha || '').split('-').map(Number);\n        const partesHora = String(hora || '').split(':').map(Number);\n\n        if (\n            partesFecha.length !== 3 ||\n            partesHora.length < 2 ||\n            !partesFecha[0] ||\n            partesFecha[1] < 1 || partesFecha[1] > 12 ||\n            partesFecha[2] < 1 || partesFecha[2] > 31 ||\n            partesHora[0] < 0 || partesHora[0] > 23 ||\n            partesHora[1] < 0 || partesHora[1] > 59\n        ) {\n            return null;\n        }\n\n        const resultado = new Date(\n            partesFecha[0],\n            partesFecha[1] - 1,\n            partesFecha[2],\n            partesHora[0],\n            partesHora[1],\n            0,\n            0\n        );\n\n        return Number.isNaN(resultado.getTime()) ? null : resultado;\n    }\n\n    function fechaHoraTexto(fecha) {\n        return fecha.toLocaleString('es-CL', {\n            day: '2-digit',\n            month: '2-digit',\n            year: 'numeric',\n            hour: '2-digit',\n            minute: '2-digit',\n            hour12: false\n        });\n    }\n\n    function primeraHoraDisponible() {\n        return new Date(Date.now() + (24 * 60 * 60 * 1000));\n    }\n\n    function fechaHoyLocal() {\n        const hoy = new Date();\n        hoy.setHours(12, 0, 0, 0);\n        return hoy;\n    }\n\n    function fechaMananaLocal() {\n        const manana = fechaHoyLocal();\n        manana.setDate(manana.getDate() + 1);\n        return manana;\n    }\n\n    function esFechaManana(fecha) {\n        const seleccionada = fechaLocal(fecha);\n        const manana = fechaMananaLocal();\n\n        return Boolean(\n            seleccionada &&\n            seleccionada.getFullYear() === manana.getFullYear() &&\n            seleccionada.getMonth() === manana.getMonth() &&\n            seleccionada.getDate() === manana.getDate()\n        );\n    }\n\n    function fechaEsPosteriorAManana(fecha) {\n        const seleccionada = fechaLocal(fecha);\n        const manana = fechaMananaLocal();\n\n        return Boolean(seleccionada && seleccionada > manana);\n    }\n\n    function sumarDias(fecha, cantidad) {\n        const d = fechaLocal(fecha);\n        if (!d) return '';\n        d.setDate(d.getDate() + cantidad);\n        return d.getFullYear() + '-' + String(d.getMonth() + 1).padStart(2, '0') + '-' + String(d.getDate()).padStart(2, '0');\n    }\n\n    function fechaTexto(fecha) {\n        const d = fechaLocal(fecha);\n        return d ? d.toLocaleDateString('es-CL') : '';\n    }\n\n    function cantidadDias() {\n        const inicio = fechaLocal(fechaInicio.value);\n        const termino = fechaLocal(fechaTermino.value);\n        if (!inicio || !termino || termino < inicio) return 1;\n        return Math.floor((termino - inicio) \/ 86400000) + 1;\n    }\n\n    function escapar(texto) {\n        return String(texto || '').replace(\/&\/g, '&amp;').replace(\/<\/g, '&lt;')\n            .replace(\/>\/g, '&gt;').replace(\/\"\/g, '&quot;').replace(\/'\/g, '&#039;');\n    }\n\n    function usaCombustibleGaba() {\n        return combustibleGaba.checked;\n    }\n\n    function actualizarGastosChofer() {\n        const local = soloPuntaArenas.checked;\n        document.getElementById('t3pvm-alimentacion-no-aplica').hidden = !local;\n        document.getElementById('t3pvm-hospedaje-no-aplica').hidden = !local;\n        [alimentacionCliente, alimentacionGaba, hospedajeCliente, hospedajeGaba].forEach(function (campo) {\n            campo.disabled = local;\n        });\n        if (local) {\n            alimentacionCliente.checked = true;\n            hospedajeCliente.checked = true;\n        }\n    }\n\n    function asegurarDias() {\n        const cantidad = cantidadDias();\n        const nuevos = [];\n\n        for (let i = 0; i < cantidad; i++) {\n            const existente = dias[i] || {};\n            let tramos = Array.isArray(existente.tramos) && existente.tramos.length\n                ? existente.tramos\n                : [{\n                    origen: i === 0 ? (puntoInicio.value || '') : '',\n                    destino: ''\n                }];\n\n            \/*\n             * El primer trayecto del primer d\u00eda siempre comienza en el\n             * lugar informado por el cliente en la columna 1.\n             *\/\n            if (i === 0) {\n                if (!tramos.length) {\n                    tramos = [{origen: puntoInicio.value || '', destino: ''}];\n                } else {\n                    tramos[0].origen = puntoInicio.value || '';\n                }\n            }\n\n            nuevos.push({\n                fecha: sumarDias(fechaInicio.value, i),\n                tramos: tramos\n            });\n        }\n\n        dias = nuevos;\n        diasGuia.max = String(cantidad);\n\n        if (\n            requiereGuia.checked &&\n            Number(diasGuia.value || 0) === 0\n        ) {\n            diasGuia.value = String(cantidad);\n        }\n    }\n\n    function capturarLugares() {\n        lugares = Array.from(listaLugares.querySelectorAll('.t3pvm-lugar-input'))\n            .map(function (input) { return input.value.trim(); });\n    }\n\n    function capturarDias() {\n        const tarjetas = contenedorDias.querySelectorAll('.t3pvm-dia');\n\n        \/*\n         * Si todav\u00eda no se han dibujado los d\u00edas, conservamos el estado\n         * recuperado desde localStorage. Antes esta funci\u00f3n reemplazaba\n         * los trayectos restaurados por arreglos vac\u00edos durante la carga.\n         *\/\n        if (!tarjetas.length) {\n            return;\n        }\n\n        const nuevos = dias.map(function (d) {\n            return {fecha: d.fecha, tramos: []};\n        });\n\n        tarjetas.forEach(function (card) {\n            const di = Number(card.dataset.dia);\n\n            if (!nuevos[di]) {\n                nuevos[di] = {\n                    fecha: card.dataset.fecha || '',\n                    tramos: []\n                };\n            }\n\n            card.querySelectorAll('.t3pvm-tramo').forEach(function (fila) {\n                nuevos[di].tramos.push({\n                    origen: fila.querySelector('.t3pvm-origen').value,\n                    destino: fila.querySelector('.t3pvm-destino').value\n                });\n            });\n        });\n\n        dias = nuevos;\n    }\n\n    function renderLugares() {\n        listaLugares.innerHTML = lugares.map(function (lugar, i) {\n            return '<div class=\"t3pvm-lugar-fila\">'\n                + '<span class=\"t3pvm-lugar-numero\">' + (i + 1) + '<\/span>'\n                + '<input class=\"t3pvm-lugar-input\" list=\"t3pvm-lugares\" autocomplete=\"off\" '\n                + 'value=\"' + escapar(lugar) + '\" placeholder=\"Ej.: Torres del Paine\">'\n                + '<button type=\"button\" class=\"t3pvm-eliminar-lugar\" data-indice=\"' + i + '\" title=\"Eliminar lugar\">\u00d7<\/button>'\n                + '<\/div>';\n        }).join('');\n        actualizarResumen();\n    }\n\n    function resumenDia(dia) {\n        let kilometros = 0;\n        let minutos = 0;\n        let faltantes = 0;\n        const superficies = {};\n\n        (dia.tramos || []).forEach(function (tramo) {\n            if (!tramo.origen || !tramo.destino) return;\n\n            const ruta = buscarRuta(tramo.origen, tramo.destino);\n\n            if (!ruta) {\n                faltantes++;\n                return;\n            }\n\n            const km = Number(ruta.kilometros || 0);\n            const superficie = ruta.superficie_nombre || 'Sin informar';\n\n            kilometros += km;\n            minutos += Number(ruta.tiempo_estimado_minutos || 0);\n            superficies[superficie] = Number(superficies[superficie] || 0) + km;\n        });\n\n        const detalleSuperficies = Object.keys(superficies)\n            .map(function (nombre) {\n                return escapar(nombre)\n                    + ': '\n                    + Math.round(superficies[nombre]).toLocaleString('es-CL')\n                    + ' km';\n            })\n            .join(' \u00b7 ');\n\n        return {\n            kilometros: kilometros,\n            minutos: minutos,\n            faltantes: faltantes,\n            superficies: detalleSuperficies || 'Sin trayectos calculados'\n        };\n    }\n\n    function renderDias() {\n        contenedorDias.innerHTML = '';\n        let numero = 0;\n\n        dias.forEach(function (dia, di) {\n            const card = document.createElement('article');\n            card.className = 't3pvm-dia';\n            card.dataset.dia = String(di);\n\n            const filas = dia.tramos.map(function (tramo, ti) {\n                numero++;\n\n                const esInicioServicio = di === 0 && ti === 0;\n                const ruta = buscarRuta(tramo.origen, tramo.destino);\n\n                const estado = tramo.origen && tramo.destino\n                    ? (\n                        ruta !== null\n                            ? '<div class=\"t3pvm-ruta-detalle\">'\n                                + '<span><b>Distancia:<\/b> '\n                                + Math.round(ruta.kilometros).toLocaleString('es-CL')\n                                + ' km<\/span>'\n                                + '<span><b>Superficie:<\/b> '\n                                + escapar(ruta.superficie_nombre)\n                                + '<\/span>'\n                                + '<span><b>Conducci\u00f3n:<\/b> '\n                                + tiempoTexto(ruta.tiempo_estimado_minutos)\n                                + '<\/span>'\n                                + '<\/div>'\n                            : '<div class=\"t3pvm-ruta-detalle t3pvm-ruta-detalle-pendiente\">'\n                                + '<span><b>Trayecto por revisar:<\/b> todav\u00eda no existe una distancia registrada.<\/span>'\n                                + '<\/div>'\n                    )\n                    : '<div class=\"t3pvm-ruta-detalle t3pvm-ruta-detalle-vacio\">'\n                        + '<span>Complete el origen y destino para calcular distancia, superficie y tiempo.<\/span>'\n                        + '<\/div>';\n\n                const atributoArrastre = esInicioServicio\n                    ? 'draggable=\"false\"'\n                    : 'draggable=\"true\"';\n\n                const claseInicio = esInicioServicio\n                    ? ' t3pvm-tramo-inicio'\n                    : '';\n\n                const origenBloqueado = esInicioServicio\n                    ? ' readonly aria-readonly=\"true\"'\n                    : '';\n\n                const distintivoInicio = esInicioServicio\n                    ? '<span class=\"t3pvm-inicio-servicio\">Inicio del servicio<\/span>'\n                    : '';\n\n                const botonEliminar = esInicioServicio\n                    ? '<span class=\"t3pvm-inicio-fijo\" title=\"Este inicio proviene de la columna 1\">\u25cf<\/span>'\n                    : '<button type=\"button\" class=\"t3pvm-eliminar-recorrido\" data-accion=\"eliminar\" title=\"Eliminar trayecto\">\u00d7<\/button>';\n\n                return '<div class=\"t3pvm-tramo' + claseInicio + '\" data-tramo=\"' + ti + '\" '\n                    + atributoArrastre\n                    + ' title=\"'\n                    + (\n                        esInicioServicio\n                            ? 'El servicio comienza en el lugar indicado en la columna 1'\n                            : 'Pinche y arrastre este trayecto para moverlo a otro d\u00eda'\n                    )\n                    + '\">'\n                    + '<div class=\"t3pvm-tramo-numero\">' + numero + '<\/div>'\n                    + '<label><span class=\"screen-reader-text\">Desde ' + distintivoInicio + '<\/span>'\n                    + '<input class=\"t3pvm-origen\" list=\"t3pvm-lugares\" autocomplete=\"off\" '\n                    + 'value=\"' + escapar(tramo.origen) + '\"'\n                    + origenBloqueado\n                    + ' placeholder=\"Ej.: Punta Arenas\"><\/label>'\n                    + '<div class=\"t3pvm-flecha\">\u2192<\/div>'\n                    + '<label><span class=\"screen-reader-text\">Hasta<\/span><input class=\"t3pvm-destino\" list=\"t3pvm-lugares\" autocomplete=\"off\" value=\"' + escapar(tramo.destino) + '\" placeholder=\"Ej.: Puerto Natales\"><\/label>'\n                    + botonEliminar\n                    + '<div class=\"t3pvm-ruta-estado\">' + estado + '<\/div>'\n                    + '<\/div>';\n            }).join('');\n\n            const resumen = resumenDia(dia);\n            const textoFaltantes = resumen.faltantes > 0\n                ? '<span class=\"t3pvm-dia-pendiente\">'\n                    + resumen.faltantes\n                    + ' trayecto(s) por revisar<\/span>'\n                : '';\n\n            card.innerHTML = '<div class=\"t3pvm-dia-cabecera-simple\">'\n                + '<span class=\"t3pvm-dia-numero\">D\u00eda ' + (di + 1) + '<\/span>'\n                + '<strong>' + escapar(fechaTexto(dia.fecha)) + '<\/strong>'\n                + '<button type=\"button\" class=\"t3pvm-agregar-trayecto-dia\" data-accion=\"agregar-dia\" title=\"Agregar un trayecto a este d\u00eda\" aria-label=\"Agregar un trayecto al d\u00eda ' + (di + 1) + '\">+<\/button>'\n                + '<small>Arrastre aqu\u00ed un trayecto para moverlo a este d\u00eda<\/small>'\n                + '<\/div>'\n                + '<div class=\"t3pvm-dia-lista\">'\n                + (\n                    filas\n                        ? '<div class=\"t3pvm-tramos-cabecera\">'\n                            + '<span><\/span>'\n                            + '<strong>Desde<\/strong>'\n                            + '<span><\/span>'\n                            + '<strong>Hasta<\/strong>'\n                            + '<span><\/span>'\n                            + '<\/div>'\n                            + '<div class=\"t3pvm-tramos\">' + filas + '<\/div>'\n                        : '<div class=\"t3pvm-dia-vacio\">Sin trayectos asignados a este d\u00eda.<\/div>'\n                )\n                + '<\/div>'\n                + '<div class=\"t3pvm-dia-resumen\">'\n                + '<div><span>Kil\u00f3metros<\/span><strong>'\n                + Math.round(resumen.kilometros).toLocaleString('es-CL')\n                + ' km<\/strong><\/div>'\n                + '<div><span>Superficie<\/span><strong>'\n                + resumen.superficies\n                + '<\/strong><\/div>'\n                + '<div><span>Tiempo<\/span><strong>'\n                + tiempoTexto(resumen.minutos)\n                + '<\/strong><\/div>'\n                + textoFaltantes\n                + '<\/div>';\n\n            contenedorDias.appendChild(card);\n        });\n\n        actualizarResumen();\n    }\n\n    function cambiarModo() {\n        const gaba = usaCombustibleGaba();\n        modoLugares.hidden = gaba;\n        modoTramos.hidden = !gaba;\n        document.getElementById('t3pvm-fila-km').hidden = !gaba;\n        document.getElementById('t3pvm-fila-tiempo').hidden = !gaba;\n        document.getElementById('t3pvm-fila-jornada').hidden = !gaba;\n        document.getElementById('t3pvm-fila-faltantes').hidden = !gaba;\n        if (gaba) {\n            tituloRecorrido.textContent = 'Detalle del trayecto';\n            textoRecorrido.textContent = 'Agregue los trayectos y ord\u00e9nelos por d\u00eda. Cada d\u00eda puede tener m\u00e1s de un trayecto y las distancias se calcular\u00e1n autom\u00e1ticamente, en caso de no existir km del trayecto ellos seran informados posteriormente.';\n            asegurarDias();\n            renderDias();\n        } else {\n            tituloRecorrido.textContent = '\u00bfQu\u00e9 lugares desea visitar?';\n            textoRecorrido.textContent = 'Agregue las ciudades, atractivos o lugares que desea conocer. No necesita separarlos por fechas ni indicar kil\u00f3metros.';\n            if (!lugares.length) lugares = [''];\n            renderLugares();\n        }\n    }\n\n    function elegirVehiculo(cantidad) {\n        return vehiculos.slice().sort(function (a, b) {\n            return Number(a.capacidad || 0) - Number(b.capacidad || 0) || Number(a.valor_diario || 0) - Number(b.valor_diario || 0);\n        }).find(function (v) { return Number(v.capacidad || 0) >= cantidad; }) || null;\n    }\n\n    function dinero(valor) {\n        return '$' + Math.round(Number(valor || 0)).toLocaleString('es-CL');\n    }\n\n    function actualizarResumen() {\n        const gaba = usaCombustibleGaba();\n        if (gaba) capturarDias(); else capturarLugares();\n        const totalDias = cantidadDias();\n        const pax = Math.max(1, Number(pasajeros.value || 1));\n        const vehiculo = elegirVehiculo(pax);\n        let kmTotal = 0;\n        let tiempoTotal = 0;\n        let faltantes = 0;\n        let tramosInformados = 0;\n        let diasJornadaExcedida = 0;\n        const jornadaMaximaMinutos = Math.max(\n            60,\n            Number(config.jornada_chofer_horas || 8) * 60\n        );\n\n        if (gaba) {\n            dias.forEach(function (dia) {\n                let tiempoDia = 0;\n\n                dia.tramos.forEach(function (tramo) {\n                    if (!tramo.origen || !tramo.destino) return;\n                    tramosInformados++;\n\n                    const ruta = buscarRuta(tramo.origen, tramo.destino);\n\n                    if (ruta === null) {\n                        faltantes++;\n                        return;\n                    }\n\n                    kmTotal += Number(ruta.kilometros || 0);\n                    tiempoTotal += Number(ruta.tiempo_estimado_minutos || 0);\n                    tiempoDia += Number(ruta.tiempo_estimado_minutos || 0);\n                });\n\n                if (tiempoDia > jornadaMaximaMinutos) {\n                    diasJornadaExcedida++;\n                }\n            });\n        }\n        const valorVehiculo = vehiculo ? Number(vehiculo.valor_diario || 0) * totalDias : 0;\n        const valorChofer = Number(config.chofer_dia || 0) * totalDias;\n        const guiaDias = requiereGuia.checked ? Math.min(totalDias, Math.max(0, Number(diasGuia.value || totalDias))) : 0;\n        const valorGuia = Number(config.guia_dia || 0) * guiaDias;\n        const rendimiento = vehiculo ? Number(vehiculo.rendimiento_km_litro || 0) : 0;\n        const litros = gaba && rendimiento > 0 ? kmTotal \/ rendimiento : 0;\n        const valorCombustible = gaba ? litros * Number(config.combustible_litro || 0) : 0;\n        const local = soloPuntaArenas.checked;\n        const incluyeAlimentacion = !local && alimentacionGaba.checked;\n        const incluyeHospedaje = !local && hospedajeGaba.checked;\n        const valorAlimentacion = incluyeAlimentacion ? Number(config.alimentacion_dia || 0) * totalDias : 0;\n        const valorHospedaje = incluyeHospedaje ? Number(config.hospedaje_dia || 0) * Math.max(0, totalDias - 1) : 0;\n        const valorArgentina = document.getElementById('t3pvm-argentina').checked ? Number(config.argentina || 0) : 0;\n        const costo = valorVehiculo + valorChofer + valorGuia + valorCombustible + valorAlimentacion + valorHospedaje + valorArgentina;\n        const total = costo + costo * (Number(config.margen || 0) \/ 100);\n        document.getElementById('t3pvm-res-dias').textContent = String(totalDias);\n        document.getElementById('t3pvm-res-pasajeros').textContent = String(pax);\n        document.getElementById('t3pvm-res-vehiculo').textContent = vehiculo ? vehiculo.nombre + ' (' + vehiculo.capacidad + ' pax)' : 'Sin veh\u00edculo disponible';\n        const terminoTexto = puntoTermino.value.trim();\n        const terminaFueraPuntaArenas = terminoTexto !== '' && normalizar(terminoTexto) !== 'punta arenas';\n        document.getElementById('t3pvm-res-termino').textContent = terminoTexto || 'Pendiente';\n        document.getElementById('t3pvm-aviso-operativo').hidden = !terminaFueraPuntaArenas;\n        document.getElementById('t3pvm-res-km').textContent = Math.round(kmTotal).toLocaleString('es-CL') + ' km';\n        document.getElementById('t3pvm-res-tiempo').textContent = tiempoTexto(tiempoTotal);\n        document.getElementById('t3pvm-res-jornada').textContent = String(diasJornadaExcedida);\n        document.getElementById('t3pvm-res-faltantes').textContent = String(faltantes);\n        document.getElementById('t3pvm-res-combustible').textContent = gaba ? 'Incluido por Turismo Gaba' : 'A cargo del cliente';\n        document.getElementById('t3pvm-res-alimentacion').textContent = local ? 'No aplica' : (incluyeAlimentacion ? 'Incluida por Turismo Gaba' : 'A cargo del cliente');\n        document.getElementById('t3pvm-res-hospedaje').textContent = local ? 'No aplica' : (incluyeHospedaje ? 'Incluido por Turismo Gaba' : 'A cargo del cliente');\n        document.getElementById('t3pvm-aviso-revision').hidden = !(gaba && faltantes > 0);\n        document.getElementById('t3pvm-aviso-jornada').hidden = !(gaba && diasJornadaExcedida > 0);\n        document.getElementById('t3pvm-res-total').textContent = dinero(total) + ' ' + (config.moneda || 'CLP');\n        const confianza = document.getElementById('t3pvm-confianza');\n        const lugaresValidos = lugares.filter(function (l) { return l.trim(); }).length;\n        if (!gaba) {\n            confianza.className = lugaresValidos ? 't3pvm-confianza alta' : 't3pvm-confianza baja';\n            confianza.textContent = lugaresValidos ? 'Lugares registrados. Nuestro equipo organizar\u00e1 la propuesta de viaje.' : 'Agregue al menos un lugar que desea visitar.';\n        } else if (tramosInformados > 0 && faltantes === 0) {\n            confianza.className = 't3pvm-confianza alta';\n            confianza.textContent = 'Estimaci\u00f3n alta: todos los trayectos tienen distancia registrada.';\n        } else if (tramosInformados > 0 && faltantes <= 1) {\n            confianza.className = 't3pvm-confianza media';\n            confianza.textContent = 'Estimaci\u00f3n media: hay un trayecto que nuestro equipo debe revisar.';\n        } else {\n            confianza.className = 't3pvm-confianza baja';\n            confianza.textContent = 'Agregue al menos un trayecto completo para calcular el combustible.';\n        }\n        const diasConDetalle = dias.map(function (dia) {\n            return {\n                fecha: dia.fecha,\n                tramos: dia.tramos.map(function (tramo) {\n                    const ruta = buscarRuta(tramo.origen, tramo.destino);\n\n                    return {\n                        origen: tramo.origen,\n                        destino: tramo.destino,\n                        kilometros: ruta ? ruta.kilometros : 0,\n                        superficie: ruta ? ruta.superficie : '',\n                        superficie_nombre: ruta ? ruta.superficie_nombre : '',\n                        velocidad_recomendada: ruta ? ruta.velocidad_recomendada : 0,\n                        tiempo_estimado_minutos: ruta ? ruta.tiempo_estimado_minutos : 0,\n                        distancia_registrada: Boolean(ruta)\n                    };\n                })\n            };\n        });\n\n        itinerarioJson.value = JSON.stringify(\n            gaba\n                ? {modo: 'tramos', dias: diasConDetalle}\n                : {\n                    modo: 'lugares',\n                    lugares: lugares.filter(function (l) {\n                        return l.trim();\n                    })\n                }\n        );\n    }\n\n    soloPuntaArenas.addEventListener('change', function () {\n        actualizarGastosChofer();\n        actualizarResumen();\n    });\n    [alimentacionCliente, alimentacionGaba, hospedajeCliente, hospedajeGaba].forEach(function (campo) {\n        campo.addEventListener('change', actualizarResumen);\n    });\n\n    document.getElementById('t3pvm-agregar-lugar').addEventListener('click', function () {\n        capturarLugares(); lugares.push(''); renderLugares();\n    });\n    listaLugares.addEventListener('click', function (e) {\n        const b = e.target.closest('.t3pvm-eliminar-lugar');\n        if (!b) return;\n        capturarLugares(); lugares.splice(Number(b.dataset.indice), 1);\n        if (!lugares.length) lugares = ['']; renderLugares();\n    });\n    listaLugares.addEventListener('input', actualizarResumen);\n\n    \/*\n     * Mientras el usuario escribe, mantenemos actualizado el resumen\n     * sin volver a dibujar las filas para no perder el foco.\n     *\n     * Al confirmar o abandonar un campo de origen\/destino, capturamos\n     * el valor y redibujamos los d\u00edas. As\u00ed la distancia, superficie,\n     * tiempo o el aviso \"Trayecto por revisar\" aparecen de inmediato,\n     * sin esperar a que se agregue otro trayecto.\n     *\/\n    contenedorDias.addEventListener('input', function () {\n        actualizarResumen();\n    });\n\n    contenedorDias.addEventListener('change', function (e) {\n        if (e.target.matches('.t3pvm-origen, .t3pvm-destino')) {\n            capturarDias();\n            renderDias();\n            programarGuardadoBorrador();\n            return;\n        }\n\n        actualizarResumen();\n    });\n\n    \/*\n     * Algunos navegadores no disparan \"change\" inmediatamente al\n     * elegir una opci\u00f3n del datalist. focusout garantiza el c\u00e1lculo\n     * en cuanto el usuario sale del campo.\n     *\/\n    contenedorDias.addEventListener('focusout', function (e) {\n        if (!e.target.matches('.t3pvm-origen, .t3pvm-destino')) return;\n\n        capturarDias();\n        renderDias();\n        programarGuardadoBorrador();\n    });\n    contenedorDias.addEventListener('click', function (e) {\n        const agregar = e.target.closest('button[data-accion=\"agregar-dia\"]');\n        if (agregar) {\n            capturarDias();\n            const card = agregar.closest('.t3pvm-dia');\n            const di = Number(card.dataset.dia);\n            const tramos = dias[di].tramos;\n            const ultimo = tramos.length ? tramos[tramos.length - 1] : null;\n            tramos.push({\n                origen: ultimo && ultimo.destino ? ultimo.destino : (di === 0 ? puntoInicio.value : ''),\n                destino: ''\n            });\n            renderDias();\n            return;\n        }\n\n        const eliminar = e.target.closest('button[data-accion=\"eliminar\"]');\n        if (!eliminar) return;\n        capturarDias();\n        const card = eliminar.closest('.t3pvm-dia');\n        const fila = eliminar.closest('.t3pvm-tramo');\n        const indiceDia = Number(card.dataset.dia);\n        const indiceTramo = Number(fila.dataset.tramo);\n\n        if (indiceDia === 0 && indiceTramo === 0) {\n            return;\n        }\n\n        dias[indiceDia].tramos.splice(indiceTramo, 1);\n        renderDias();\n    });\n    contenedorDias.addEventListener('dragstart', function (e) {\n        const fila = e.target.closest('.t3pvm-tramo');\n        if (!fila || fila.classList.contains('t3pvm-tramo-inicio')) {\n            e.preventDefault();\n            return;\n        }\n\n        capturarDias();\n        const card = fila.closest('.t3pvm-dia');\n        arrastre = {\n            dia: Number(card.dataset.dia),\n            tramo: Number(fila.dataset.tramo)\n        };\n        fila.classList.add('t3pvm-arrastrando');\n    });\n    contenedorDias.addEventListener('dragend', function (e) {\n        const fila = e.target.closest('.t3pvm-tramo'); if (fila) fila.classList.remove('t3pvm-arrastrando');\n        contenedorDias.querySelectorAll('.t3pvm-dia').forEach(function (c) { c.classList.remove('t3pvm-dia-destino'); }); arrastre = null;\n    });\n    contenedorDias.addEventListener('dragover', function (e) {\n        const card = e.target.closest('.t3pvm-dia'); if (!card || !arrastre) return; e.preventDefault();\n        contenedorDias.querySelectorAll('.t3pvm-dia').forEach(function (c) { c.classList.remove('t3pvm-dia-destino'); }); card.classList.add('t3pvm-dia-destino');\n    });\n    contenedorDias.addEventListener('drop', function (e) {\n        const card = e.target.closest('.t3pvm-dia'); if (!card || !arrastre) return; e.preventDefault();\n        const recorrido = dias[arrastre.dia].tramos.splice(arrastre.tramo, 1)[0];\n        dias[Number(card.dataset.dia)].tramos.push(recorrido); arrastre = null; renderDias();\n    });\n\n    function fechasCambiaron() {\n        if (fechaTermino.value < fechaInicio.value) fechaTermino.value = fechaInicio.value;\n        fechaTermino.min = fechaInicio.value; if (usaCombustibleGaba()) capturarDias(); asegurarDias();\n        usaCombustibleGaba() ? renderDias() : actualizarResumen();\n    }\n    fechaInicio.addEventListener('change', fechasCambiaron);\n    fechaTermino.addEventListener('change', fechasCambiaron);\n    function sincronizarInicioServicio() {\n        asegurarDias();\n\n        if (dias[0] && dias[0].tramos[0]) {\n            dias[0].tramos[0].origen = puntoInicio.value.trim();\n        }\n\n        if (usaCombustibleGaba()) {\n            renderDias();\n        } else {\n            actualizarResumen();\n        }\n    }\n\n    puntoInicio.addEventListener('input', sincronizarInicioServicio);\n    puntoInicio.addEventListener('change', sincronizarInicioServicio);\n    puntoTermino.addEventListener('input', actualizarResumen);\n    puntoTermino.addEventListener('change', actualizarResumen);\n    requiereGuia.addEventListener('change', function () {\n        diasGuiaWrap.hidden = !requiereGuia.checked;\n        if (requiereGuia.checked && Number(diasGuia.value || 0) === 0) diasGuia.value = String(cantidadDias());\n        actualizarResumen();\n    });\n    combustibleCliente.addEventListener('change', cambiarModo);\n    combustibleGaba.addEventListener('change', cambiarModo);\n    form.addEventListener('input', function (e) {\n        if (!e.target.closest('#t3pvm-dias') && !e.target.closest('#t3pvm-lugares-lista')) {\n            actualizarResumen();\n        }\n        programarGuardadoBorrador();\n    });\n\n    form.addEventListener('change', function (e) {\n        if (!e.target.closest('#t3pvm-dias') && !e.target.closest('#t3pvm-lugares-lista')) {\n            actualizarResumen();\n        }\n        programarGuardadoBorrador();\n    });\n\n    function limpiarMarcaError() {\n        form.querySelectorAll('.t3pvm-campo-error').forEach(function (elemento) {\n            elemento.classList.remove('t3pvm-campo-error');\n        });\n    }\n\n    function marcarCampoError(campo) {\n        limpiarMarcaError();\n        if (!campo) return;\n\n        const contenedor = campo.closest('label, .t3pvm-lugar-fila, .t3pvm-tramo, .t3pvm-panel');\n        (contenedor || campo).classList.add('t3pvm-campo-error');\n    }\n\n    function campoSegunError(clave) {\n        const mapa = {\n            nombre: '[name=\"nombre\"]',\n            telefono: '[name=\"telefono\"]',\n            email: '[name=\"email\"]',\n            fecha_inicio: '[name=\"fecha_inicio\"]',\n            fecha_hora_inicio: '[name=\"fecha_inicio\"]',\n            anticipacion_24: '[name=\"fecha_inicio\"]',\n            hora_inicio: '[name=\"hora_inicio\"]',\n            fecha_termino: '[name=\"fecha_termino\"]',\n            punto_inicio: '[name=\"punto_inicio\"]',\n            punto_termino: '[name=\"punto_termino\"]',\n            pasajeros: '[name=\"pasajeros\"]',\n            lugares: '.t3pvm-lugar-input',\n            trayecto: '.t3pvm-origen'\n        };\n\n        return mapa[clave] ? form.querySelector(mapa[clave]) : null;\n    }\n\n    function enfocarErrorServidor() {\n        if (!mensajeErrorServidor) return;\n\n        const clave = mensajeErrorServidor.dataset.campoError || '';\n        const campo = campoSegunError(clave);\n        marcarCampoError(campo);\n\n        window.setTimeout(function () {\n            const destino = campo || mensajeErrorServidor;\n            destino.scrollIntoView({behavior: 'smooth', block: 'center'});\n            if (campo && typeof campo.focus === 'function') campo.focus({preventScroll: true});\n        }, 180);\n    }\n\n    function mensajeCampoInvalido(campo) {\n        const mensajes = {\n            nombre: 'Debe ingresar el nombre del cliente o de la empresa.',\n            telefono: 'Debe ingresar un tel\u00e9fono o WhatsApp de contacto.',\n            email: 'El correo electr\u00f3nico ingresado no es v\u00e1lido.',\n            fecha_inicio: 'Debe ingresar una fecha de inicio v\u00e1lida.',\n            hora_inicio: 'Debe indicar la hora de inicio del servicio.',\n            fecha_termino: 'Debe ingresar una fecha de t\u00e9rmino v\u00e1lida.',\n            punto_inicio: 'Debe indicar d\u00f3nde comenzar\u00e1 el servicio.',\n            punto_termino: 'Debe indicar d\u00f3nde finalizar\u00e1 el servicio.',\n            pasajeros: 'Debe ingresar una cantidad v\u00e1lida de pasajeros.'\n        };\n        return mensajes[campo && campo.name] || 'Revise el campo marcado antes de enviar la solicitud.';\n    }\n\n    function detenerEnvio(e, mensaje, campo) {\n        e.preventDefault();\n        guardarBorradorAhora();\n        marcarCampoError(campo);\n        window.alert(mensaje);\n\n        if (campo && typeof campo.focus === 'function') {\n            campo.focus();\n\n            if (typeof campo.scrollIntoView === 'function') {\n                campo.scrollIntoView({behavior: 'smooth', block: 'center'});\n            }\n        }\n    }\n\n    async function refrescarNonceAntesDeEnviar() {\n        const nonceCampo = form.querySelector('[name=\"t3p_vm_nonce\"]');\n\n        if (!nonceCampo || !ajaxUrl) {\n            throw new Error('No fue posible localizar la validaci\u00f3n de seguridad.');\n        }\n\n        const datos = new URLSearchParams();\n        datos.set('action', 't3p_vm_refrescar_nonce');\n\n        const respuesta = await window.fetch(ajaxUrl, {\n            method: 'POST',\n            credentials: 'same-origin',\n            cache: 'no-store',\n            headers: {\n                'Content-Type': 'application\/x-www-form-urlencoded; charset=UTF-8'\n            },\n            body: datos.toString()\n        });\n\n        if (!respuesta.ok) {\n            throw new Error('No fue posible actualizar la validaci\u00f3n de seguridad.');\n        }\n\n        const resultado = await respuesta.json();\n\n        if (\n            !resultado ||\n            !resultado.success ||\n            !resultado.data ||\n            !resultado.data.nonce\n        ) {\n            throw new Error('La respuesta de seguridad no fue v\u00e1lida.');\n        }\n\n        nonceCampo.value = String(resultado.data.nonce);\n    }\n\n    form.addEventListener('submit', function (e) {\n        actualizarResumen();\n        guardarBorradorAhora();\n\n        \/*\n         * El segundo env\u00edo se realiza despu\u00e9s de obtener un nonce nuevo.\n         * Se usa submit() nativo para no ejecutar nuevamente este listener.\n         *\/\n        if (envioAutorizado) {\n            return;\n        }\n\n        \/*\n         * Validaci\u00f3n completa antes de abandonar la p\u00e1gina.\n         * Si falta un dato, no se env\u00eda ni se recarga el formulario.\n         *\/\n        if (!form.checkValidity()) {\n            const primerInvalido = form.querySelector(':invalid');\n            detenerEnvio(\n                e,\n                mensajeCampoInvalido(primerInvalido),\n                primerInvalido\n            );\n            return;\n        }\n\n        const inicio = fechaLocal(fechaInicio.value);\n        const termino = fechaLocal(fechaTermino.value);\n        const minimoPermitido = primeraHoraDisponible();\n\n        \/*\n         * La fecha de inicio siempre es obligatoria.\n         * La hora solo se exige cuando el servicio comienza ma\u00f1ana,\n         * porque en ese caso debemos comprobar las 24 horas exactas.\n         *\/\n        if (esFechaManana(fechaInicio.value)) {\n            if (!horaInicio || !horaInicio.value) {\n                detenerEnvio(\n                    e,\n                    'Como el servicio comienza ma\u00f1ana, debe indicar la hora de inicio para comprobar las 24 horas de anticipaci\u00f3n.',\n                    horaInicio || fechaInicio\n                );\n                return;\n            }\n\n            const inicioConHora = fechaHoraLocal(\n                fechaInicio.value,\n                horaInicio.value\n            );\n\n            if (!inicioConHora) {\n                detenerEnvio(\n                    e,\n                    'Debe ingresar una hora de inicio v\u00e1lida.',\n                    horaInicio || fechaInicio\n                );\n                return;\n            }\n\n            if (inicioConHora < minimoPermitido) {\n                detenerEnvio(\n                    e,\n                    'No es posible enviar la solicitud. Para servicios que comienzan ma\u00f1ana deben cumplirse 24 horas exactas de anticipaci\u00f3n. La primera fecha y hora disponible es ' + fechaHoraTexto(minimoPermitido) + '.',\n                    fechaInicio\n                );\n                return;\n            }\n        } else if (\n            !fechaEsPosteriorAManana(fechaInicio.value) &&\n            inicio\n        ) {\n            detenerEnvio(\n                e,\n                'La fecha de inicio debe ser desde ma\u00f1ana en adelante.',\n                fechaInicio\n            );\n            return;\n        }\n\n        if (!inicio || !termino || termino < inicio) {\n            detenerEnvio(\n                e,\n                'La fecha de t\u00e9rmino no puede ser anterior a la fecha de inicio.',\n                fechaTermino\n            );\n            return;\n        }\n\n        const cantidadPasajeros = Math.max(1, Number(pasajeros.value || 1));\n        if (!elegirVehiculo(cantidadPasajeros)) {\n            detenerEnvio(\n                e,\n                'No existe un veh\u00edculo configurado con capacidad para ' + cantidadPasajeros + ' pasajeros. La solicitud no fue enviada.',\n                pasajeros\n            );\n            return;\n        }\n\n        if (!puntoInicio.value.trim()) {\n            detenerEnvio(\n                e,\n                'Debe indicar d\u00f3nde comenzar\u00e1 el servicio.',\n                puntoInicio\n            );\n            return;\n        }\n\n        if (!puntoTermino.value.trim()) {\n            detenerEnvio(\n                e,\n                'Debe indicar d\u00f3nde finalizar\u00e1 el servicio.',\n                puntoTermino\n            );\n            return;\n        }\n\n        if (usaCombustibleGaba()) {\n            capturarDias();\n\n            const completo = dias.some(function (dia) {\n                return dia.tramos.some(function (tramo) {\n                    return tramo.origen.trim() && tramo.destino.trim();\n                });\n            });\n\n            if (!completo) {\n                const primerOrigen = contenedorDias.querySelector('.t3pvm-origen');\n\n                detenerEnvio(\n                    e,\n                    'Debe ingresar al menos un trayecto completo para calcular el combustible.',\n                    primerOrigen\n                );\n                return;\n            }\n        } else {\n            capturarLugares();\n\n            const valido = lugares.some(function (lugar) {\n                return lugar.trim();\n            });\n\n            if (!valido) {\n                const primerLugar = listaLugares.querySelector('.t3pvm-lugar-input');\n\n                detenerEnvio(\n                    e,\n                    'Debe agregar al menos un lugar que desea visitar.',\n                    primerLugar\n                );\n                return;\n            }\n        }\n\n        \/*\n         * El borrador se conserva durante el env\u00edo.\n         * Solo se elimina al cargar la confirmaci\u00f3n exitosa.\n         *\/\n        guardarBorradorAhora();\n\n        \/*\n         * Evitamos enviar el nonce posiblemente almacenado en una p\u00e1gina\n         * en cach\u00e9. Antes de abandonar el formulario solicitamos uno nuevo.\n         *\/\n        e.preventDefault();\n\n        const botonEnvio = form.querySelector('[type=\"submit\"]');\n        const textoOriginal = botonEnvio ? botonEnvio.textContent : '';\n\n        if (botonEnvio) {\n            botonEnvio.disabled = true;\n            botonEnvio.textContent = 'Enviando...';\n        }\n\n        refrescarNonceAntesDeEnviar()\n            .then(function () {\n                guardarBorradorAhora();\n                envioAutorizado = true;\n                HTMLFormElement.prototype.submit.call(form);\n            })\n            .catch(function () {\n                envioAutorizado = false;\n                guardarBorradorAhora();\n\n                if (botonEnvio) {\n                    botonEnvio.disabled = false;\n                    botonEnvio.textContent = textoOriginal;\n                }\n\n                window.alert(\n                    'No pudimos actualizar la validaci\u00f3n de seguridad. '\n                    + 'Sus datos y trayectos siguen guardados. '\n                    + 'Revise su conexi\u00f3n e intente enviar nuevamente.'\n                );\n            });\n    });\n\n    const borradorRestaurado = restaurarBorradorDisponible();\n\n    \/*\n     * Primero respetamos el modo restaurado y dibujamos su contenido.\n     * Antes se llamaba renderLugares() antes de renderDias(); esa llamada\n     * ejecutaba actualizarResumen() y pod\u00eda borrar los trayectos recuperados.\n     *\/\n    asegurarDias();\n    actualizarGastosChofer();\n    cambiarModo();\n\n    if (!usaCombustibleGaba()) {\n        renderLugares();\n    }\n\n    if (borradorRestaurado) {\n        actualizarResumen();\n        guardarBorradorAhora();\n    }\n\n    const parametrosError = new URLSearchParams(window.location.search);\n    if (parametrosError.get('t3p_vm_error') === 'anticipacion_24') {\n        const fechaMinima = parametrosError.get('t3p_vm_min_fecha') || '';\n        const horaMinima = parametrosError.get('t3p_vm_min_hora') || '';\n        const minimoServidor = fechaHoraLocal(fechaMinima, horaMinima);\n        const textoMinimo = minimoServidor\n            ? fechaHoraTexto(minimoServidor)\n            : '24 horas despu\u00e9s del momento actual';\n\n        window.alert(\n            'No es posible enviar la solicitud. Los servicios privados deben solicitarse con al menos 24 horas de anticipaci\u00f3n. La primera fecha y hora disponible es ' + textoMinimo + '.'\n        );\n    }\n\n    enfocarErrorServidor();\n    window.addEventListener('beforeunload', guardarBorradorAhora);\n})();\n<\/script><style>\n\n.t3pvm-wrap {\n    --t3pvm-azul: #10223d;\n    --t3pvm-azul-claro: #eaf3fb;\n    --t3pvm-dorado: #c9973e;\n    --t3pvm-borde: #d8e1eb;\n    --t3pvm-texto: #172033;\n    width: min(1540px, calc(100% - 28px));\n    margin: 28px auto 50px;\n    color: var(--t3pvm-texto);\n    font-family: inherit;\n}\n\n.t3pvm-hero {\n    margin-bottom: 18px;\n    padding: 22px 26px;\n    border-radius: 18px;\n    background: linear-gradient(135deg, #10223d, #203a5d);\n    color: #fff;\n}\n\n.t3pvm-hero > span {\n    color: #f1bd62;\n    font-size: 11px;\n    font-weight: 900;\n    letter-spacing: .12em;\n}\n\n.t3pvm-hero h1 {\n    margin: 5px 0 7px !important;\n    color: #fff !important;\n    font-size: clamp(27px, 3vw, 39px) !important;\n}\n\n.t3pvm-hero p {\n    max-width: 900px;\n    margin: 0;\n    color: #e4edf6;\n    line-height: 1.55;\n}\n\n\n.t3pvm-confirmacion {\n    overflow: hidden;\n    border: 1px solid var(--t3pvm-borde);\n    border-radius: 22px;\n    background: #fff;\n    box-shadow: 0 18px 50px rgba(15, 34, 61, .12);\n}\n\n.t3pvm-confirmacion-cabecera {\n    padding: 34px 28px 30px;\n    text-align: center;\n    background: linear-gradient(135deg, #10223d, #203a5d);\n    color: #fff;\n}\n\n.t3pvm-confirmacion-logo {\n    display: block;\n    width: auto;\n    max-width: min(250px, 75%);\n    max-height: 105px;\n    margin: 0 auto 18px;\n    object-fit: contain;\n}\n\n.t3pvm-confirmacion-marca {\n    margin-bottom: 18px;\n    color: #fff;\n    font-size: 22px;\n    font-weight: 900;\n}\n\n.t3pvm-confirmacion-icono {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: 64px;\n    height: 64px;\n    margin: 0 auto 13px;\n    border: 3px solid rgba(255,255,255,.78);\n    border-radius: 50%;\n    background: rgba(255,255,255,.12);\n    font-size: 34px;\n    font-weight: 900;\n}\n\n.t3pvm-confirmacion-cabecera > span {\n    color: #f1bd62;\n    font-size: 11px;\n    font-weight: 900;\n    letter-spacing: .13em;\n}\n\n.t3pvm-confirmacion-cabecera h1 {\n    margin: 7px 0 5px !important;\n    color: #fff !important;\n    font-size: clamp(27px, 4vw, 43px) !important;\n}\n\n.t3pvm-confirmacion-bajada {\n    margin: 0;\n    color: #e4edf6;\n    font-size: 17px;\n}\n\n.t3pvm-confirmacion-cuerpo {\n    max-width: 1080px;\n    margin: 0 auto;\n    padding: 28px;\n}\n\n.t3pvm-folio-destacado {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 5px;\n    margin: 0 auto 26px;\n    padding: 18px;\n    border: 1px solid #ecd5a9;\n    border-radius: 14px;\n    background: #fffaf1;\n    text-align: center;\n}\n\n.t3pvm-folio-destacado small {\n    color: #7a5a22;\n    font-weight: 800;\n    text-transform: uppercase;\n    letter-spacing: .08em;\n}\n\n.t3pvm-folio-destacado strong {\n    color: var(--t3pvm-azul);\n    font-size: clamp(22px, 4vw, 32px);\n    letter-spacing: .04em;\n}\n\n.t3pvm-folio-destacado span {\n    color: #64748b;\n    font-size: 13px;\n}\n\n.t3pvm-confirmacion-texto {\n    max-width: 900px;\n    margin: 0 auto 25px;\n    font-size: 16px;\n    line-height: 1.7;\n    text-align: center;\n}\n\n.t3pvm-confirmacion-resumen,\n.t3pvm-confirmacion-pasos {\n    margin: 24px 0;\n    padding: 22px;\n    border: 1px solid #dbe5ef;\n    border-radius: 15px;\n    background: #f8fafc;\n}\n\n.t3pvm-confirmacion-resumen h2,\n.t3pvm-confirmacion-pasos h2 {\n    margin: 0 0 16px !important;\n    color: var(--t3pvm-azul) !important;\n    text-align: center;\n    font-size: 22px !important;\n}\n\n.t3pvm-confirmacion-resumen dl {\n    display: grid;\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n    gap: 12px;\n    margin: 0;\n}\n\n.t3pvm-confirmacion-resumen dl > div {\n    padding: 13px;\n    border: 1px solid #e0e7ef;\n    border-radius: 10px;\n    background: #fff;\n}\n\n.t3pvm-confirmacion-resumen dt {\n    margin-bottom: 4px;\n    color: #64748b;\n    font-size: 11px;\n    font-weight: 900;\n    text-transform: uppercase;\n}\n\n.t3pvm-confirmacion-resumen dd {\n    margin: 0;\n    color: var(--t3pvm-azul);\n    font-weight: 800;\n}\n\n.t3pvm-pasos-grid {\n    display: grid;\n    grid-template-columns: repeat(4, minmax(0, 1fr));\n    gap: 13px;\n}\n\n.t3pvm-pasos-grid article {\n    padding: 16px;\n    border-radius: 12px;\n    background: #fff;\n    box-shadow: 0 6px 18px rgba(15,34,61,.06);\n}\n\n.t3pvm-pasos-grid article > span {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 31px;\n    height: 31px;\n    border-radius: 50%;\n    background: var(--t3pvm-azul);\n    color: #fff;\n    font-weight: 900;\n}\n\n.t3pvm-pasos-grid h3 {\n    margin: 10px 0 6px !important;\n    color: var(--t3pvm-azul) !important;\n    font-size: 15px !important;\n}\n\n.t3pvm-pasos-grid p {\n    margin: 0;\n    color: #526174;\n    font-size: 12px;\n    line-height: 1.5;\n}\n\n.t3pvm-confirmacion-importante {\n    margin: 24px 0;\n    padding: 15px 17px;\n    border-left: 5px solid #c9973e;\n    border-radius: 9px;\n    background: #fff8e9;\n    line-height: 1.55;\n}\n\n.t3pvm-confirmacion blockquote {\n    margin: 25px auto;\n    padding: 22px;\n    border: 0;\n    border-radius: 14px;\n    background: #10223d;\n    color: #fff;\n    font-size: 18px;\n    font-style: italic;\n    line-height: 1.55;\n    text-align: center;\n}\n\n.t3pvm-confirmacion-contacto {\n    display: grid;\n    grid-template-columns: repeat(5, minmax(0, 1fr));\n    gap: 11px;\n    margin: 26px 0;\n}\n\n.t3pvm-confirmacion-contacto > div {\n    display: flex;\n    gap: 9px;\n    align-items: flex-start;\n    padding: 14px;\n    border: 1px solid #dce5ee;\n    border-radius: 11px;\n    background: #fff;\n}\n\n.t3pvm-confirmacion-contacto > div > span {\n    font-size: 19px;\n}\n\n.t3pvm-confirmacion-contacto p {\n    min-width: 0;\n    margin: 0;\n    font-size: 12px;\n    line-height: 1.45;\n    overflow-wrap: anywhere;\n}\n\n.t3pvm-confirmacion-contacto strong {\n    display: block;\n    margin-bottom: 3px;\n    color: var(--t3pvm-azul);\n}\n\n.t3pvm-confirmacion-contacto a {\n    color: #1e5a8a;\n    text-decoration: none;\n}\n\n.t3pvm-confirmacion-acciones {\n    display: flex;\n    justify-content: center;\n    gap: 12px;\n    flex-wrap: wrap;\n    margin: 27px 0 22px;\n}\n\n.t3pvm-btn-secundario,\n.t3pvm-btn-whatsapp,\n.t3pvm-btn-imprimir {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    min-height: 48px;\n    padding: 0 22px;\n    border-radius: 10px;\n    font-weight: 900;\n    text-decoration: none !important;\n}\n\n.t3pvm-btn-secundario {\n    border: 1px solid #b8c5d3;\n    background: #fff;\n    color: var(--t3pvm-azul);\n}\n\n.t3pvm-btn-imprimir {\n    border: 1px solid var(--t3pvm-azul);\n    background: var(--t3pvm-azul);\n    color: #fff;\n    cursor: pointer;\n}\n\n.t3pvm-btn-whatsapp {\n    border: 1px solid #1fa855;\n    background: #25d366;\n    color: #073d20;\n}\n\n.t3pvm-confirmacion-pie {\n    display: flex;\n    flex-direction: column;\n    align-items: center;\n    gap: 4px;\n    padding-top: 19px;\n    border-top: 1px solid #e2e8f0;\n    text-align: center;\n}\n\n.t3pvm-confirmacion-pie strong {\n    color: var(--t3pvm-azul);\n    font-size: 18px;\n}\n\n.t3pvm-confirmacion-pie span {\n    color: #64748b;\n    font-size: 13px;\n}\n\n.t3pvm-confirmacion-pie a {\n    color: #1e5a8a;\n    font-weight: 800;\n    text-decoration: none;\n}\n\n.t3pvm-layout {\n    display: grid;\n    grid-template-columns:\n        minmax(310px, .85fr)\n        minmax(520px, 1.45fr)\n        minmax(285px, .72fr);\n    gap: 17px;\n    align-items: start;\n}\n\n.t3pvm-columna,\n.t3pvm-resumen {\n    min-width: 0;\n}\n\n.t3pvm-panel {\n    padding: 19px;\n    border: 1px solid var(--t3pvm-borde);\n    border-radius: 17px;\n    background: #fff;\n    box-shadow: 0 10px 30px rgba(15, 34, 61, .07);\n}\n\n.t3pvm-panel-titulo {\n    display: flex;\n    gap: 11px;\n    align-items: flex-start;\n    margin-bottom: 17px;\n}\n\n.t3pvm-panel-titulo > span {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    flex: 0 0 30px;\n    width: 30px;\n    height: 30px;\n    border-radius: 50%;\n    background: var(--t3pvm-azul);\n    color: #fff;\n    font-weight: 900;\n}\n\n.t3pvm-panel-titulo h2 {\n    margin: 0 0 3px !important;\n    color: var(--t3pvm-azul) !important;\n    font-size: 21px !important;\n}\n\n.t3pvm-panel-titulo p {\n    margin: 0;\n    color: #64748b;\n    font-size: 13px;\n    line-height: 1.4;\n}\n\n.t3pvm-grid {\n    display: grid;\n    grid-template-columns: repeat(2, minmax(0, 1fr));\n    gap: 12px;\n}\n\n.t3pvm-grid label,\n.t3pvm-observaciones,\n.t3pvm-hospedaje label,\n.t3pvm-tramo label {\n    display: flex;\n    flex-direction: column;\n    gap: 5px;\n}\n\n.t3pvm-grid label > span,\n.t3pvm-observaciones > span,\n.t3pvm-hospedaje label > span,\n.t3pvm-tramo label > span {\n    font-size: 12px;\n    font-weight: 800;\n}\n\n.t3pvm-grid .completo {\n    grid-column: 1 \/ -1;\n}\n\n.t3pvm-grid input,\n.t3pvm-grid select,\n.t3pvm-observaciones textarea,\n.t3pvm-hospedaje input,\n.t3pvm-tramo input,\n.t3pvm-dia-titulo {\n    width: 100%;\n    min-height: 40px;\n    border: 1px solid #cbd5e1;\n    border-radius: 8px;\n    background: #fff;\n    color: #172033;\n    box-sizing: border-box;\n}\n\n.t3pvm-grid small {\n    color: #64748b;\n    font-size: 10px;\n}\n\n\n.t3pvm-email-cliente input {\n    width: 100%;\n    min-width: 0;\n    box-sizing: border-box;\n}\n\n.t3pvm-comprobante-grid dd,\n.t3pvm-confirmacion-contacto a {\n    overflow-wrap: anywhere;\n    word-break: break-word;\n}\n\n.t3pvm-campo-error input,\n.t3pvm-campo-error select,\n.t3pvm-campo-error textarea,\ninput.t3pvm-campo-error {\n    border-color: #b42318 !important;\n    box-shadow: 0 0 0 3px rgba(180, 35, 24, .14) !important;\n    background: #fff7f6 !important;\n}\n\n.t3pvm-campo-error > span:first-child,\n.t3pvm-campo-error .t3pvm-lugar-numero {\n    color: #b42318 !important;\n    font-weight: 900;\n}\n\n.t3pvm-separador {\n    margin: 18px 0 10px;\n    padding-top: 14px;\n    border-top: 1px solid #e2e8f0;\n}\n\n.t3pvm-separador h3 {\n    margin: 0 !important;\n    font-size: 15px !important;\n}\n\n.t3pvm-opciones {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 8px 10px;\n}\n\n.t3pvm-opciones > label {\n    display: flex;\n    align-items: center;\n    gap: 7px;\n    min-height: 35px;\n    font-size: 12px;\n    font-weight: 700;\n}\n\n.t3pvm-opciones input[type=\"checkbox\"] {\n    flex: 0 0 auto;\n}\n\n.t3pvm-opciones .t3pvm-dias-guia {\n    align-items: stretch;\n    flex-direction: column;\n}\n\n.t3pvm-dias-guia input {\n    width: 100%;\n    min-height: 35px;\n}\n\n.t3pvm-observaciones {\n    margin-top: 14px;\n}\n\n.t3pvm-dia {\n    margin-bottom: 13px;\n    padding: 13px;\n    border: 1px solid #d7e1eb;\n    border-radius: 13px;\n    background: #f8fafc;\n}\n\n.t3pvm-dia-cabecera {\n    display: grid;\n    grid-template-columns: auto minmax(200px, 1fr);\n    gap: 12px;\n    align-items: center;\n    margin-bottom: 10px;\n}\n\n.t3pvm-dia-cabecera > div {\n    display: grid;\n    min-width: 110px;\n}\n\n.t3pvm-dia-numero {\n    color: var(--t3pvm-dorado);\n    font-size: 11px;\n    font-weight: 900;\n    letter-spacing: .07em;\n    text-transform: uppercase;\n}\n\n.t3pvm-dia-cabecera strong {\n    font-size: 13px;\n}\n\n.t3pvm-tramos {\n    display: grid;\n    gap: 7px;\n}\n\n.t3pvm-tramo {\n    display: grid;\n    grid-template-columns:\n        28px\n        minmax(115px, 1fr)\n        24px\n        minmax(115px, 1fr)\n        auto;\n    gap: 7px;\n    align-items: center;\n    padding: 9px 0 10px;\n    border: 0;\n    border-bottom: 1px solid #e5e7eb;\n    border-radius: 0;\n    background: transparent;\n}\n\n.t3pvm-tramo:last-child {\n    border-bottom: 0;\n}\n\n.t3pvm-tramo-numero {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: 27px;\n    height: 27px;\n    margin-bottom: 6px;\n    border-radius: 50%;\n    background: #eaf1f8;\n    font-size: 11px;\n    font-weight: 900;\n}\n\n.t3pvm-flecha {\n    padding-bottom: 11px;\n    text-align: center;\n    font-weight: 900;\n}\n\n.t3pvm-ruta-estado {\n    grid-column: 2 \/ -1;\n    min-width: 0;\n    padding: 0;\n    text-align: left;\n}\n\n.t3pvm-ruta-detalle {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 7px 18px;\n    width: 100%;\n    margin-top: 2px;\n    padding: 6px 0 0;\n    border: 0;\n    border-radius: 0;\n    background: transparent;\n    color: #334155;\n    font-size: 11px;\n    line-height: 1.4;\n}\n\n.t3pvm-ruta-detalle span {\n    display: inline-flex;\n    align-items: center;\n    min-width: 0;\n}\n\n.t3pvm-ruta-detalle b {\n    margin-right: 4px;\n    color: #172033;\n}\n\n.t3pvm-ruta-detalle-pendiente {\n    color: #9a3412;\n}\n\n.t3pvm-ruta-detalle-pendiente b {\n    color: #9a3412;\n}\n\n.t3pvm-ruta-detalle-vacio {\n    color: #64748b;\n    font-style: italic;\n}\n\n.t3pvm-tramo-acciones {\n    display: flex;\n    gap: 3px;\n    padding-bottom: 5px;\n}\n\n.t3pvm-tramo-acciones button {\n    width: 27px;\n    height: 27px;\n    padding: 0;\n    border: 1px solid #cbd5e1;\n    border-radius: 6px;\n    background: #f8fafc;\n    cursor: pointer;\n}\n\n.t3pvm-agregar-tramo {\n    margin-top: 8px;\n    padding: 7px 10px;\n    border: 1px solid #183657;\n    border-radius: 7px;\n    background: #fff;\n    color: #183657;\n    font-size: 11px;\n    font-weight: 800;\n    cursor: pointer;\n}\n\n.t3pvm-hospedaje {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 8px 10px;\n    margin-top: 11px;\n    padding: 10px;\n    border-radius: 9px;\n    background: #edf4fa;\n}\n\n.t3pvm-hospedaje-titulo {\n    grid-column: 1 \/ -1;\n    color: #173b61;\n    font-size: 12px;\n    font-weight: 900;\n}\n\n.t3pvm-hotel-check {\n    grid-column: 1 \/ -1;\n    display: flex !important;\n    align-items: center;\n    flex-direction: row !important;\n    font-size: 11px;\n}\n\n.t3pvm-resumen {\n    position: sticky;\n    top: 28px;\n}\n\n.t3pvm-resumen-card {\n    overflow: hidden;\n    border-radius: 18px;\n    background: var(--t3pvm-azul);\n    color: #fff;\n    box-shadow: 0 16px 38px rgba(15, 34, 61, .24);\n}\n\n.t3pvm-resumen-card {\n    padding: 19px;\n}\n\n.t3pvm-kicker {\n    color: #f1bd62;\n    font-size: 10px;\n    font-weight: 900;\n    letter-spacing: .09em;\n}\n\n.t3pvm-resumen-card h2 {\n    margin: 6px 0 15px !important;\n    color: #fff !important;\n    font-size: 23px !important;\n}\n\n.t3pvm-resumen-card dl {\n    margin: 0;\n}\n\n.t3pvm-resumen-card dl > div {\n    display: flex;\n    justify-content: space-between;\n    gap: 12px;\n    padding: 9px 0;\n    border-bottom: 1px solid rgba(255, 255, 255, .13);\n}\n\n.t3pvm-resumen-card dt {\n    color: #cbd5e1;\n    font-size: 12px;\n}\n\n.t3pvm-resumen-card dd {\n    margin: 0;\n    font-size: 12px;\n    font-weight: 900;\n    text-align: right;\n}\n\n.t3pvm-resumen-card dl > div.total {\n    margin-top: 4px;\n    border: 0;\n}\n\n.t3pvm-resumen-card dl > div.total dt,\n.t3pvm-resumen-card dl > div.total dd {\n    color: #fff;\n    font-size: 18px;\n}\n\n.t3pvm-confianza {\n    margin-top: 12px;\n    padding: 10px;\n    border-radius: 9px;\n    font-size: 11px;\n    font-weight: 800;\n    line-height: 1.35;\n}\n\n.t3pvm-confianza.alta {\n    background: #dcfce7;\n    color: #166534;\n}\n\n.t3pvm-confianza.media {\n    background: #fff3cd;\n    color: #7a5600;\n}\n\n.t3pvm-confianza.baja {\n    background: #fee2e2;\n    color: #991b1b;\n}\n\n.t3pvm-advertencia {\n    color: #cbd5e1;\n    font-size: 10px;\n    line-height: 1.45;\n}\n\n.t3pvm-enviar {\n    width: 100%;\n    margin-top: 5px;\n    padding: 12px 14px;\n    border: 0;\n    border-radius: 9px;\n    background: var(--t3pvm-dorado);\n    color: #fff;\n    font-weight: 900;\n    cursor: pointer;\n}\n\n.t3pvm-mensaje,\n.t3pvm-aviso-error {\n    margin-bottom: 16px;\n    padding: 14px 16px;\n    border-radius: 10px;\n}\n\n.t3pvm-mensaje.exito {\n    border: 1px solid #86d19a;\n    background: #ecfdf3;\n    color: #166534;\n}\n\n.t3pvm-mensaje.error,\n.t3pvm-aviso-error {\n    border: 1px solid #f0a5a5;\n    background: #fff1f1;\n    color: #9b1c1c;\n}\n\n.t3pvm-honeypot {\n    position: absolute !important;\n    left: -99999px !important;\n    opacity: 0 !important;\n}\n\n\n\/* Columna 2 simplificada v1.2 *\/\n.t3pvm-recorrido-cabecera {\n    margin-bottom: 10px;\n}\n\n.t3pvm-agregar-recorrido {\n    width: 100%;\n    margin-bottom: 12px;\n    padding: 10px 14px;\n    border: 1px solid #183657;\n    border-radius: 8px;\n    background: #183657;\n    color: #fff;\n    font-size: 13px;\n    font-weight: 900;\n    cursor: pointer;\n}\n\n\n.t3pvm-leyenda-trayectos {\n    margin-bottom: 12px;\n    padding: 10px 12px;\n    border: 1px solid #cbd9e8;\n    border-radius: 8px;\n    background: #f8fbff;\n    color: #334155;\n}\n\n.t3pvm-leyenda-trayectos p {\n    display: flex;\n    align-items: center;\n    gap: 9px;\n    margin: 4px 0;\n    font-size: 11px;\n    line-height: 1.35;\n}\n\n.t3pvm-leyenda-trayectos strong {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    flex: 0 0 22px;\n    width: 22px;\n    height: 22px;\n    border-radius: 50%;\n    font-size: 16px;\n    line-height: 1;\n}\n\n.t3pvm-leyenda-mas { background: #183657; color: #fff; }\n.t3pvm-leyenda-x { background: #fff1f1; color: #dc2626; }\n.t3pvm-leyenda-arrastre { background: #eef2f7; color: #475569; }\n\n.t3pvm-dia-contenido {\n    display: grid;\n    grid-template-columns: 36px minmax(0, 1fr);\n    gap: 8px;\n    align-items: start;\n}\n\n.t3pvm-agregar-trayecto-dia {\n    width: 34px;\n    height: 34px;\n    padding: 0;\n    border: 1px solid #183657;\n    border-radius: 50%;\n    background: #183657;\n    color: #fff;\n    font-size: 22px;\n    font-weight: 800;\n    line-height: 1;\n    cursor: pointer;\n}\n\n.t3pvm-agregar-trayecto-dia:hover {\n    filter: brightness(1.08);\n}\n\n.t3pvm-dia-lista { min-width: 0; }\n\n.t3pvm-dia {\n    margin-bottom: 9px;\n    padding: 10px;\n    transition: border-color .15s ease, background .15s ease;\n}\n\n.t3pvm-dia-destino {\n    border-color: #c9973e !important;\n    background: #fff8e8 !important;\n}\n\n.t3pvm-dia-cabecera-simple {\n    display: flex;\n    align-items: baseline;\n    gap: 8px;\n    margin-bottom: 7px;\n}\n\n.t3pvm-dia-cabecera-simple strong {\n    font-size: 12px;\n}\n\n.t3pvm-dia-cabecera-simple small {\n    margin-left: auto;\n    color: #7c8998;\n    font-size: 9px;\n}\n\n.t3pvm-dia-vacio {\n    padding: 8px 10px;\n    border: 1px dashed #cbd5e1;\n    border-radius: 7px;\n    color: #64748b;\n    font-size: 11px;\n    text-align: center;\n}\n\n.t3pvm-tramo {\n    grid-template-columns:\n        27px\n        minmax(135px, 1fr)\n        22px\n        minmax(135px, 1fr)\n        minmax(68px, auto)\n        29px;\n    gap: 6px;\n    padding: 7px;\n}\n\n\n.t3pvm-arrastrando {\n    opacity: .45;\n}\n\n.t3pvm-eliminar-recorrido {\n    width: 28px;\n    height: 28px;\n    margin-bottom: 6px;\n    padding: 0;\n    border: 1px solid #fecaca;\n    border-radius: 6px;\n    background: #fff;\n    color: #dc2626;\n    font-size: 17px;\n    cursor: pointer;\n}\n\n.t3pvm-dia-titulo,\n.t3pvm-hospedaje,\n.t3pvm-agregar-tramo,\n.t3pvm-tramo-acciones,\n.t3pvm-campo-dia,\n.t3pvm-tramo-dia {\n    display: none !important;\n}\n\n\n.t3pvm-tramos-cabecera {\n    display: grid;\n    grid-template-columns:\n        28px\n        minmax(115px, 1fr)\n        24px\n        minmax(115px, 1fr)\n        auto;\n    gap: 7px;\n    align-items: center;\n    padding: 4px 0 2px;\n    color: #172033;\n    font-size: 11px;\n    text-transform: uppercase;\n}\n\n.t3pvm-tramos-cabecera strong {\n    font-weight: 800;\n}\n\n.t3pvm-tramos {\n    padding: 0 12px 4px;\n}\n\n.t3pvm-tramo label {\n    margin: 0;\n}\n\n.t3pvm-tramo input {\n    width: 100%;\n}\n\n.t3pvm-dia-resumen {\n    display: grid;\n    grid-template-columns: minmax(140px, .8fr) minmax(220px, 1.5fr) minmax(150px, .9fr);\n    gap: 10px;\n    padding: 12px 14px;\n    border-top: 1px solid #dce3ec;\n    background: #f8fafc;\n}\n\n.t3pvm-dia-resumen > div {\n    min-width: 0;\n}\n\n.t3pvm-dia-resumen span {\n    display: block;\n    margin-bottom: 3px;\n    color: #64748b;\n    font-size: 11px;\n    font-weight: 700;\n    letter-spacing: .02em;\n    text-transform: uppercase;\n}\n\n.t3pvm-dia-resumen strong {\n    display: block;\n    color: #172033;\n    font-size: 13px;\n    line-height: 1.35;\n}\n\n.t3pvm-dia-resumen .t3pvm-dia-pendiente {\n    grid-column: 1 \/ -1;\n    margin: 0;\n    padding: 7px 9px;\n    border-radius: 6px;\n    background: #fff7ed;\n    color: #9a3412;\n    font-size: 12px;\n    text-transform: none;\n}\n\n.t3pvm-tramo-inicio {\n    cursor: default;\n}\n\n.t3pvm-tramo-inicio .t3pvm-origen[readonly] {\n    background: #f8fafc;\n    color: #1e3a5f;\n    font-weight: 700;\n    cursor: default;\n}\n\n.t3pvm-inicio-servicio {\n    display: inline-flex;\n    margin-left: 5px;\n    padding: 2px 6px;\n    border-radius: 999px;\n    background: #dbeafe;\n    color: #1d4ed8;\n    font-size: 9px;\n    font-weight: 800;\n    letter-spacing: .02em;\n    text-transform: uppercase;\n}\n\n.t3pvm-inicio-fijo {\n    display: grid;\n    place-items: center;\n    width: 30px;\n    height: 30px;\n    color: #2563eb;\n    font-size: 11px;\n}\n\n@media (max-width: 850px) {\n    .t3pvm-dia-resumen {\n        grid-template-columns: 1fr;\n    }\n\n    .t3pvm-ruta-detalle {\n        display: grid;\n        grid-template-columns: 1fr;\n        gap: 4px;\n    }\n\n\n    .t3pvm-tramo {\n        grid-template-columns: 27px 1fr;\n    }\n\n    .t3pvm-tramo label,\n    .t3pvm-ruta-estado,\n    .t3pvm-eliminar-recorrido {\n        grid-column: 2;\n    }\n\n    .t3pvm-eliminar-recorrido {\n        justify-self: start;\n    }\n\n    .t3pvm-dia-contenido {\n        grid-template-columns: 34px minmax(0, 1fr);\n    }\n\n    .t3pvm-dia-cabecera-simple {\n        flex-wrap: wrap;\n    }\n\n    .t3pvm-dia-cabecera-simple small {\n        width: 100%;\n        margin-left: 0;\n    }\n}\n\n\n\/* Ajustes v1.3: fechas y recorridos *\/\n.t3pvm-grid {\n    grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);\n}\n\n.t3pvm-grid label {\n    min-width: 0;\n}\n\n.t3pvm-grid input[type=\"date\"],\n.t3pvm-grid input[type=\"time\"] {\n    width: 100%;\n    min-width: 0;\n    max-width: 100%;\n    padding-left: 10px;\n    padding-right: 7px;\n    font-size: 13px;\n    box-sizing: border-box;\n}\n\n.t3pvm-grid input[type=\"date\"]::-webkit-calendar-picker-indicator,\n.t3pvm-grid input[type=\"time\"]::-webkit-calendar-picker-indicator {\n    margin: 0;\n    padding: 0;\n    transform: scale(.9);\n}\n\n.t3pvm-campo-dia,\n.t3pvm-tramo-dia {\n    display: none !important;\n}\n\n.t3pvm-tramo {\n    grid-template-columns:\n        28px\n        27px\n        minmax(0, 1fr)\n        22px\n        minmax(0, 1fr)\n        minmax(66px, auto)\n        29px;\n}\n\n.t3pvm-tramo label {\n    min-width: 0;\n}\n\n.t3pvm-tramo input {\n    min-width: 0;\n    max-width: 100%;\n}\n\n@media (max-width: 1280px) {\n    .t3pvm-layout {\n        grid-template-columns:\n            minmax(300px, .9fr)\n            minmax(500px, 1.45fr)\n            minmax(270px, .72fr);\n    }\n}\n\n@media (max-width: 1200px) {\n    .t3pvm-layout {\n        grid-template-columns:\n            minmax(290px, .9fr)\n            minmax(470px, 1.4fr);\n    }\n\n    .t3pvm-resumen {\n        grid-column: 1 \/ -1;\n        position: static;\n    }\n}\n\n@media (max-width: 850px) {\n    .t3pvm-layout {\n        grid-template-columns: 1fr;\n    }\n\n    .t3pvm-resumen {\n        grid-column: auto;\n    }\n\n    .t3pvm-tramo {\n        grid-template-columns: 28px 1fr;\n    }\n\n    .t3pvm-flecha {\n        display: none;\n    }\n\n    .t3pvm-ruta-estado,\n    .t3pvm-tramo-acciones {\n        grid-column: 2;\n        justify-content: flex-start;\n        text-align: left;\n    }\n}\n\n@media (max-width: 560px) {\n    .t3pvm-wrap {\n        width: min(100% - 16px, 1540px);\n        margin-top: 12px;\n    }\n\n    .t3pvm-hero,\n    .t3pvm-panel {\n        border-radius: 12px;\n    }\n\n    .t3pvm-grid,\n    .t3pvm-opciones,\n    .t3pvm-hospedaje,\n    .t3pvm-dia-cabecera {\n        grid-template-columns: 1fr;\n    }\n\n    .t3pvm-hospedaje-titulo,\n    .t3pvm-hotel-check {\n        grid-column: auto;\n    }\n}\n\n\n\/* Selector de combustible y modo simple de lugares v1.4 *\/\n.t3pvm-combustible-selector {\n    grid-column: 1 \/ -1;\n    display: grid;\n    gap: 8px;\n    margin: 4px 0 6px;\n    padding: 12px;\n    border: 1px solid #cbd5e1;\n    border-radius: 10px;\n    background: #f8fafc;\n}\n\n.t3pvm-combustible-selector > strong {\n    color: var(--t3pvm-azul);\n    font-size: 13px;\n}\n\n.t3pvm-combustible-selector label {\n    align-items: flex-start !important;\n    min-height: 0 !important;\n    padding: 9px;\n    border: 1px solid #dbe4ee;\n    border-radius: 8px;\n    background: #fff;\n}\n\n.t3pvm-combustible-selector label span {\n    display: grid;\n    gap: 3px;\n    line-height: 1.3;\n}\n\n.t3pvm-combustible-selector label small {\n    color: #64748b;\n    font-size: 10px;\n    font-weight: 500;\n}\n\n.t3pvm-lugar-fila {\n    display: grid;\n    grid-template-columns: 32px minmax(0, 1fr) 32px;\n    gap: 9px;\n    align-items: center;\n    margin-bottom: 9px;\n    padding: 9px;\n    border: 1px solid #dce5ee;\n    border-radius: 10px;\n    background: #f8fafc;\n}\n\n.t3pvm-lugar-numero {\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    width: 28px;\n    height: 28px;\n    border-radius: 50%;\n    background: #eaf1f8;\n    font-size: 11px;\n    font-weight: 900;\n}\n\n.t3pvm-lugar-input {\n    width: 100%;\n    min-height: 42px;\n    border: 1px solid #cbd5e1;\n    border-radius: 8px;\n    background: #fff;\n    box-sizing: border-box;\n}\n\n.t3pvm-eliminar-lugar {\n    width: 30px;\n    height: 30px;\n    padding: 0;\n    border: 1px solid #efb4b4;\n    border-radius: 7px;\n    background: #fff5f5;\n    color: #a61b1b;\n    font-size: 18px;\n    cursor: pointer;\n}\n\n.t3pvm-no-aplica {\n    margin: 8px 0 0;\n    padding: 10px 12px;\n    border-radius: 8px;\n    background: #eef6ff;\n    color: #1e3a5f;\n    font-weight: 700;\n}\n\n.t3pvm-aviso-revision {\n    margin: 14px 0;\n    padding: 12px 14px;\n    border: 1px solid #f0b35a;\n    border-radius: 9px;\n    background: #fff7e8;\n    color: #7c4a03;\n    line-height: 1.45;\n}\n\n\n@media (max-width: 1050px) {\n    .t3pvm-pasos-grid {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n    }\n\n    .t3pvm-confirmacion-contacto {\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n    }\n}\n\n@media (max-width: 680px) {\n    .t3pvm-confirmacion-cuerpo,\n    .t3pvm-confirmacion-cabecera {\n        padding: 22px 16px;\n    }\n\n    .t3pvm-confirmacion-resumen dl,\n    .t3pvm-pasos-grid,\n    .t3pvm-confirmacion-contacto {\n        grid-template-columns: 1fr;\n    }\n\n    .t3pvm-btn-secundario,\n    .t3pvm-btn-whatsapp,\n    .t3pvm-btn-imprimir {\n        width: 100%;\n    }\n}\n\n\/* Ajustes v1.6.3: bot\u00f3n + compacto y campos Desde\/Hasta m\u00e1s amplios *\/\n.t3pvm-leyenda-trayectos strong {\n    border-radius: 6px;\n    background: #fff;\n}\n\n.t3pvm-leyenda-mas {\n    border: 1px solid #22c55e;\n    color: #16a34a;\n}\n\n.t3pvm-leyenda-x {\n    border: 1px solid #fecaca;\n    color: #dc2626;\n}\n\n.t3pvm-leyenda-arrastre {\n    border: 1px solid #d7e1eb;\n    color: #475569;\n}\n\n.t3pvm-dia-cabecera-simple {\n    align-items: center;\n}\n\n.t3pvm-dia-cabecera-simple .t3pvm-agregar-trayecto-dia {\n    margin-left: auto;\n}\n\n.t3pvm-dia-cabecera-simple small {\n    margin-left: 8px;\n}\n\n.t3pvm-agregar-trayecto-dia {\n    flex: 0 0 28px;\n    width: 28px;\n    height: 28px;\n    border: 1px solid #22c55e;\n    border-radius: 6px;\n    background: #fff;\n    color: #16a34a;\n    font-size: 18px;\n    font-weight: 800;\n    line-height: 1;\n}\n\n.t3pvm-agregar-trayecto-dia:hover {\n    background: #f0fdf4;\n    filter: none;\n}\n\n.t3pvm-dia-contenido {\n    display: block;\n}\n\n.t3pvm-tramo {\n    grid-template-columns:\n        28px\n        minmax(150px, 1fr)\n        22px\n        minmax(150px, 1fr)\n        minmax(66px, auto)\n        29px;\n}\n\n.t3pvm-tramo input::placeholder {\n    color: #7c8998;\n    opacity: 1;\n}\n\n@media (max-width: 850px) {\n    .t3pvm-dia-cabecera-simple .t3pvm-agregar-trayecto-dia {\n        margin-left: auto;\n    }\n\n    .t3pvm-dia-cabecera-simple small {\n        width: 100%;\n        margin-left: 0;\n    }\n\n    .t3pvm-tramo {\n        grid-template-columns: 28px minmax(0, 1fr);\n    }\n}\n\n\n\/* Versi\u00f3n 1.6.4: comprobante imprimible y ajuste del bot\u00f3n eliminar *\/\n.t3pvm-comprobante-impresion {\n    display: none;\n}\n\n.t3pvm-eliminar-recorrido {\n    width: 29px;\n    min-width: 29px;\n    max-width: 29px;\n    height: 29px;\n    padding: 0;\n    box-sizing: border-box;\n    justify-self: end;\n}\n\n.t3pvm-tramo {\n    width: 100%;\n    min-width: 0;\n    box-sizing: border-box;\n    overflow: hidden;\n}\n\n.t3pvm-tramo label,\n.t3pvm-tramo input,\n.t3pvm-ruta-estado {\n    min-width: 0;\n}\n\n@media (max-width: 850px) {\n    .t3pvm-tramo {\n        grid-template-columns: 28px minmax(0, 1fr) 29px;\n        align-items: end;\n    }\n\n    .t3pvm-tramo label,\n    .t3pvm-ruta-estado {\n        grid-column: 2;\n    }\n\n    .t3pvm-tramo-numero {\n        grid-column: 1;\n        grid-row: 1;\n    }\n\n    .t3pvm-flecha {\n        grid-column: 2;\n        padding: 0;\n    }\n\n    .t3pvm-eliminar-recorrido {\n        grid-column: 3;\n        grid-row: 1;\n        justify-self: end;\n    }\n}\n\n@media print {\n    @page {\n        size: A4 portrait;\n        margin: 12mm;\n    }\n\n    body * {\n        visibility: hidden !important;\n    }\n\n    .t3pvm-confirmacion,\n    .t3pvm-confirmacion * ,\n    .t3pvm-comprobante-impresion,\n    .t3pvm-comprobante-impresion * {\n        visibility: visible !important;\n    }\n\n    .t3pvm-confirmacion {\n        position: absolute;\n        inset: 0;\n        width: 100%;\n        max-width: none;\n        border: 0;\n        box-shadow: none;\n        background: #fff;\n    }\n\n    .t3pvm-confirmacion-cabecera,\n    .t3pvm-folio-destacado,\n    .t3pvm-confirmacion-texto,\n    .t3pvm-confirmacion-resumen,\n    .t3pvm-confirmacion-pasos,\n    .t3pvm-confirmacion-importante,\n    .t3pvm-confirmacion-contacto,\n    .t3pvm-confirmacion-acciones,\n    .t3pvm-confirmacion-pie,\n    .t3pvm-confirmacion blockquote,\n    .t3pvm-hero {\n        display: none !important;\n    }\n\n    .t3pvm-confirmacion-cuerpo {\n        padding: 0;\n    }\n\n    .t3pvm-comprobante-impresion {\n        display: block !important;\n        color: #111827;\n        font-family: Arial, Helvetica, sans-serif;\n        font-size: 10.5pt;\n        line-height: 1.38;\n    }\n\n    .t3pvm-comprobante-cabecera {\n        display: grid;\n        grid-template-columns: 150px 1fr;\n        gap: 20px;\n        align-items: center;\n        padding-bottom: 12px;\n        border-bottom: 2px solid #0f2947;\n    }\n\n    .t3pvm-comprobante-cabecera img {\n        display: block;\n        max-width: 140px;\n        max-height: 70px;\n        object-fit: contain;\n    }\n\n    .t3pvm-comprobante-cabecera h2 {\n        margin: 0 0 5px;\n        color: #0f2947;\n        font-size: 20pt;\n    }\n\n    .t3pvm-comprobante-cabecera p {\n        margin: 2px 0;\n    }\n\n    .t3pvm-comprobante-seccion,\n    .t3pvm-comprobante-advertencias,\n    .t3pvm-comprobante-pasos {\n        margin-top: 13px;\n        break-inside: avoid;\n    }\n\n    .t3pvm-comprobante-seccion h3,\n    .t3pvm-comprobante-advertencias h3,\n    .t3pvm-comprobante-pasos h3 {\n        margin: 0 0 7px;\n        padding-bottom: 4px;\n        border-bottom: 1px solid #cbd5e1;\n        color: #0f2947;\n        font-size: 12pt;\n    }\n\n    .t3pvm-comprobante-grid {\n        display: grid;\n        grid-template-columns: repeat(2, minmax(0, 1fr));\n        gap: 7px 16px;\n        margin: 0;\n    }\n\n    .t3pvm-comprobante-grid div {\n        break-inside: avoid;\n    }\n\n    .t3pvm-comprobante-grid dt {\n        color: #475569;\n        font-size: 8.5pt;\n        font-weight: 700;\n    }\n\n    .t3pvm-comprobante-grid dd {\n        margin: 1px 0 0;\n        font-weight: 700;\n    }\n\n    .t3pvm-comprobante-lista,\n    .t3pvm-comprobante-advertencias ul,\n    .t3pvm-comprobante-pasos ol,\n    .t3pvm-comprobante-dia ol {\n        margin: 5px 0 0 20px;\n        padding: 0;\n    }\n\n    .t3pvm-comprobante-lista li,\n    .t3pvm-comprobante-advertencias li,\n    .t3pvm-comprobante-pasos li,\n    .t3pvm-comprobante-dia li {\n        margin-bottom: 4px;\n    }\n\n    .t3pvm-comprobante-dia {\n        margin: 7px 0;\n        padding: 8px 10px;\n        border: 1px solid #dbe4ee;\n        border-radius: 5px;\n        break-inside: avoid;\n    }\n\n    .t3pvm-comprobante-advertencias {\n        padding: 10px 12px;\n        border: 1px solid #e7a83e;\n        background: #fff8e8;\n    }\n\n    .t3pvm-comprobante-pie {\n        display: grid;\n        gap: 2px;\n        margin-top: 16px;\n        padding-top: 9px;\n        border-top: 1px solid #94a3b8;\n        text-align: center;\n        font-size: 8.5pt;\n    }\n}\n\n\n\/* Versi\u00f3n 1.6.5: mantener la X visible dentro del trayecto *\/\n.t3p-trayecto-ajuste,\n.t3pvm-dia-lista,\n.t3pvm-tramos {\n    width: 100%;\n    min-width: 0;\n    box-sizing: border-box;\n}\n\n.t3pvm-tramo {\n    width: 100%;\n    max-width: 100%;\n    min-width: 0;\n    box-sizing: border-box;\n    overflow: visible;\n}\n\n.t3pvm-eliminar-recorrido {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 29px;\n    min-width: 29px;\n    max-width: 29px;\n    height: 29px;\n    margin: 0;\n    padding: 0;\n    box-sizing: border-box;\n    justify-self: end;\n    align-self: end;\n}\n\n@media (max-width: 850px) {\n    .t3pvm-tramo {\n        grid-template-columns:\n            28px\n            minmax(0, 1fr)\n            18px\n            minmax(0, 1fr)\n            29px;\n        column-gap: 6px;\n        row-gap: 5px;\n        align-items: end;\n    }\n\n    .t3pvm-tramo-numero {\n        grid-column: 1;\n        grid-row: 1;\n    }\n\n    .t3pvm-tramo label:first-of-type {\n        grid-column: 2;\n        grid-row: 1;\n    }\n\n    .t3pvm-flecha {\n        grid-column: 3;\n        grid-row: 1;\n        align-self: end;\n        padding-bottom: 9px;\n    }\n\n    .t3pvm-tramo label:nth-of-type(2) {\n        grid-column: 4;\n        grid-row: 1;\n    }\n\n    .t3pvm-eliminar-recorrido {\n        grid-column: 5;\n        grid-row: 1;\n        justify-self: end;\n        align-self: end;\n        margin-bottom: 6px;\n    }\n\n    .t3pvm-ruta-estado {\n        grid-column: 2 \/ 6;\n        grid-row: 2;\n    }\n}\n\n@media (max-width: 420px) {\n    .t3pvm-tramo {\n        grid-template-columns:\n            26px\n            minmax(0, 1fr)\n            14px\n            minmax(0, 1fr)\n            28px;\n        column-gap: 4px;\n        padding: 6px;\n    }\n\n    .t3pvm-eliminar-recorrido {\n        width: 28px;\n        min-width: 28px;\n        max-width: 28px;\n        height: 28px;\n    }\n}\n\n<\/style>    \n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-355","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/tour3patagonia.com\/en\/wp-json\/wp\/v2\/pages\/355","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tour3patagonia.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/tour3patagonia.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/tour3patagonia.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tour3patagonia.com\/en\/wp-json\/wp\/v2\/comments?post=355"}],"version-history":[{"count":2,"href":"https:\/\/tour3patagonia.com\/en\/wp-json\/wp\/v2\/pages\/355\/revisions"}],"predecessor-version":[{"id":357,"href":"https:\/\/tour3patagonia.com\/en\/wp-json\/wp\/v2\/pages\/355\/revisions\/357"}],"wp:attachment":[{"href":"https:\/\/tour3patagonia.com\/en\/wp-json\/wp\/v2\/media?parent=355"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}