{"id":1687,"date":"2026-09-29T17:36:21","date_gmt":"2026-09-29T17:36:21","guid":{"rendered":"https:\/\/accf.unitru.edu.pe\/?p=1687"},"modified":"2026-11-09T15:45:16","modified_gmt":"2026-11-09T20:45:16","slug":"sisd2-2","status":"publish","type":"post","link":"https:\/\/accf.unitru.edu.pe\/index.php\/validate\/sisd2-2","title":{"rendered":""},"content":{"rendered":"\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Registro de asistencia \u2013 II Seminario Internacional de Sistemas Din\u00e1micos<\/title>\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\">\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&amp;display=swap\" rel=\"stylesheet\">\n\n<style>\n\/* =====================================================================\n   1) CABECERA DEL SEMINARIO (banner + men\u00fa) \u2014 blindada contra la plantilla\n   ===================================================================== *\/\nheader.sisd-cab { --navy:#082b52; --blue:#135da8; --gold:#e3b341; --ink:#172b43;\n  font-family: system-ui, -apple-system, \"Segoe UI\", Roboto, Arial, sans-serif !important;\n  color:#fff !important; line-height:1.5 !important; display:block !important; width:100%;\n  margin:0 !important; padding:0 !important; text-align:left !important;\n  border-radius:0 !important; min-height:0 !important; position:static !important; overflow:visible !important; }\nheader.sisd-cab *, header.sisd-cab *::before, header.sisd-cab *::after { box-sizing:border-box; }\n\nheader.sisd-cab .sisd-top { background:#051d38 !important; color:#dceaf8 !important;\n  font-size:.85rem !important; padding:.5rem 1rem !important; text-align:center !important; margin:0 !important;\n  display:flex !important; flex-wrap:wrap; justify-content:center; align-items:center; gap:.35rem 1rem; }\n\n\/* Resoluci\u00f3n Rectoral *\/\nheader.sisd-cab .sisd-top .sisd-res { display:inline-flex !important; align-items:center; gap:.4rem;\n  color:#ffdc7a !important; -webkit-text-fill-color:#ffdc7a !important; font-weight:700 !important; letter-spacing:.03em;\n  border:1px solid rgba(227,179,65,.55) !important; background:rgba(227,179,65,.12) !important;\n  padding:.12rem .75rem !important; border-radius:999px !important; white-space:nowrap; margin:0 !important; }\nheader.sisd-cab .sisd-top .sisd-res i { color:inherit !important; }\n\nheader.sisd-cab .sisd-banner { background:linear-gradient(110deg,#06203d 0%,#082b52 50%,#125599 100%) !important;\n  position:relative; overflow:hidden; border-bottom:4px solid var(--gold) !important; }\nheader.sisd-cab .sisd-banner::after { content:\"\"; position:absolute; width:440px; height:440px;\n  right:-90px; top:-170px; border:1px solid rgba(255,255,255,.12); border-radius:50%;\n  box-shadow:0 0 0 36px rgba(255,255,255,.03),0 0 0 72px rgba(255,255,255,.02); pointer-events:none; }\nheader.sisd-cab .sisd-hero { position:relative; z-index:1; width:min(1240px,94%); margin:auto;\n  display:grid; grid-template-columns:1.5fr 1fr; align-items:center; gap:2rem; padding:1.8rem 0; }\n\nheader.sisd-cab .sisd-eyebrow { color:#ffdc7a !important; text-transform:uppercase; letter-spacing:.12em;\n  font-size:.78rem !important; font-weight:800 !important; margin:0 !important; }\nheader.sisd-cab h1.sisd-titulo { font-size:clamp(1.7rem,3.2vw,2.7rem) !important; line-height:1.12 !important;\n  margin:.3rem 0 0 !important; padding:0 !important; letter-spacing:-.02em; font-weight:800 !important;\n  color:#fff !important; background:none !important; border:0 !important; text-shadow:none !important;\n  font-family:inherit !important; text-transform:none !important; }\n\nheader.sisd-cab .sisd-pills { display:flex; flex-direction:column; align-items:flex-start; gap:.5rem; justify-self:end; }\nheader.sisd-cab .sisd-pills .sisd-pill { display:inline-block !important;\n  color:#fff !important; -webkit-text-fill-color:#fff !important;\n  border:1px solid rgba(255,255,255,.35) !important; background:rgba(255,255,255,.12) !important;\n  padding:.25rem .8rem !important; border-radius:999px !important; font-weight:600 !important;\n  font-size:.82rem !important; line-height:1.5 !important; white-space:nowrap; margin:0 !important; }\n\nheader.sisd-cab nav.sisd-nav { display:flex !important; flex-wrap:wrap; justify-content:center; align-items:center;\n  gap:6px 14px; background:#10264d !important; padding:14px 20px !important; margin:0 !important;\n  border:0 !important; border-radius:0 !important; min-height:0 !important; }\nheader.sisd-cab nav.sisd-nav a { display:flex !important; align-items:center; gap:7px;\n  font-size:12.5px !important; font-weight:700 !important; letter-spacing:.05em;\n  color:#eaf4ff !important; padding:8px 16px !important; white-space:nowrap;\n  text-decoration:none !important; border-radius:999px; background:transparent;\n  transition:background-color .25s ease,color .25s ease; }\nheader.sisd-cab nav.sisd-nav a i { color:inherit !important; }\nheader.sisd-cab nav.sisd-nav a:hover, header.sisd-cab nav.sisd-nav a:focus-visible {\n  background:var(--blue) !important; color:#fff !important; outline:none; }\nheader.sisd-cab nav.sisd-nav a:active { background:var(--gold) !important; color:var(--ink) !important; transform:scale(.96); }\nheader.sisd-cab nav.sisd-nav a[aria-current=\"page\"], header.sisd-cab nav.sisd-nav a.seleccionado {\n  background:var(--gold) !important; color:var(--ink) !important; }\n\n@media (max-width:900px) {\n  header.sisd-cab .sisd-hero { grid-template-columns:1fr; gap:1rem; }\n  header.sisd-cab .sisd-pills { flex-direction:row; flex-wrap:wrap; justify-self:start; }\n}\n@media (max-width:680px) {\n  header.sisd-cab .sisd-pills .sisd-pill { white-space:normal; }\n  header.sisd-cab nav.sisd-nav { gap:4px 6px; padding:10px 8px !important; }\n  header.sisd-cab nav.sisd-nav a { font-size:11px !important; padding:7px 11px !important; letter-spacing:.03em; }\n}\n\n\/* =====================================================================\n   2) REGISTRO DE ASISTENCIA\n   ===================================================================== *\/\n:root{--bg:#f1f5f9;--tx:#1e293b;--mut:#64748b;--bd:#e2e8f0;--card:rgba(255,255,255,.88);--in:#fff;--sky:#0284c7;--sky2:#0369a1;--ind:#4f46e5;--chip:#f1f5f9}\n\/* Modo claro fijo: en WordPress el modo oscuro del sistema dejaba textos negros o grises sobre fondo oscuro.\n   Se fuerzan los colores con !important para que la plantilla tampoco los cambie. *\/\n.wrap{color-scheme:light;--card:#ffffff}\n.wrap .glass-card{background:#ffffff!important;color:#1e293b!important}\n.wrap .glass-card h2,.wrap .ch h2{color:#1e293b!important;font-family:inherit!important;background:none!important;text-shadow:none!important}\n.wrap .sub,.wrap .dia,.wrap .demo{color:#475569!important}\n.wrap #det{color:#1e293b!important}\n.wrap details summary{color:#0369a1!important}\n.wrap .pct{color:#0284c7!important}\n.wrap .tipos label.tipo{color:#1e293b!important;background:#ffffff!important}\n.wrap .tipos input:checked + label.tipo{background:#f1f5f9!important}\n.wrap .b{color:#475569!important;background:#f1f5f9!important}\n.wrap .b.ok{color:#ffffff!important;background:linear-gradient(135deg,#0284c7,#4f46e5)!important}\n.wrap .b.cur{color:#0284c7!important;background:#ffffff!important}\n.wrap .badge{color:#ffffff!important}\n.wrap .msg.ok{color:#075985!important}.wrap .msg.err{color:#9f1239!important}\n.wrap .asis-hero small{color:#7dd3fc!important}\n.wrap .asis-hero h2.asis-tit{color:#f8fafc!important}\n.wrap .asis-hero p{color:#cbd5e1!important}\n.wrap .ico,.wrap .ico i{color:#ffffff!important}\n.wrap .cert-card .ico.gold,.wrap .cert-card .ico.gold i{color:#172b43!important}\n.wrap .cert-prev a.abrir{color:#172b43!important}\n*{box-sizing:border-box}\nbody{margin:0;padding:0;font-family:'Plus Jakarta Sans',system-ui,Segoe UI,Arial,sans-serif;background:var(--bg);color:var(--tx)}\n.wrap{max-width:640px;margin:0 auto;padding:18px 10px 30px}\n.logo-bar{background:#fff;border-radius:18px 18px 0 0;padding:10px 16px;text-align:center;border:1px solid var(--bd);border-bottom:0}\n.logo-bar img{height:68px;width:auto;max-width:100%}\n@media(max-width:520px){.logo-bar img{height:52px}}\n.gradient-bg{background:linear-gradient(135deg,#0f172a 0%,#1e1b4b 50%,#0f172a 100%)}\n.asis-hero{position:relative;overflow:hidden;color:#f8fafc;text-align:center;padding:34px 16px 54px;border-radius:0 0 18px 18px;min-height:210px;display:flex;flex-direction:column;justify-content:center}\n#lorenz{position:absolute;inset:0;width:100%;height:100%}\n.asis-hero>div{position:relative;z-index:1}\n.asis-hero small{letter-spacing:.18em;font-size:.75rem;color:#7dd3fc;font-weight:700}\n.asis-hero h2.asis-tit{margin:6px 0 8px;font-size:1.4rem;line-height:1.25;font-weight:800;color:#f8fafc;text-shadow:0 2px 10px rgba(0,0,0,.6)}\n.asis-hero p{margin:0;font-size:.92rem;color:#cbd5e1}\nmain{position:relative;z-index:20;margin-top:-32px;padding:0 6px}\n.glass-card{background:var(--card);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border:1px solid var(--bd);border-radius:18px;padding:18px;margin-bottom:16px;box-shadow:0 12px 24px -8px rgba(15,23,42,.18);transition:all .3s cubic-bezier(.4,0,.2,1)}\n.card-hover:hover{transform:translateY(-3px);box-shadow:0 20px 25px -5px rgba(0,0,0,.12)}\n.ch{display:flex;align-items:center;gap:12px}\n.ico{width:40px;height:40px;border-radius:12px;background:var(--sky);color:#fff;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:0 4px 10px rgba(2,132,199,.3)}\n.ico.in{background:var(--ind)}\n.ch h2{margin:0;font-size:1.05rem;font-weight:700;line-height:1.2}\n.sub{font-size:.8rem;color:var(--mut)}\n.badge{display:inline-block;background:linear-gradient(90deg,var(--sky),var(--ind));color:#fff;border-radius:999px;padding:6px 20px;font-size:1.1rem;font-weight:700;margin-top:12px}\n.now{text-align:center}.now .ch{justify-content:center}\n.dia{font-size:.85rem;color:var(--mut);margin-top:8px}\n.glass-card label{display:block!important;margin:14px 0 6px!important;font-weight:600!important;font-size:.85rem!important;color:var(--tx)!important;font-family:inherit!important;text-transform:none!important}\n.glass-card input,.glass-card select{display:block!important;width:100%!important;max-width:100%!important;float:none!important;margin:0!important;height:auto!important;padding:11px 12px!important;font-family:inherit!important;font-size:.95rem!important;color:var(--tx)!important;background:var(--in)!important;border:1px solid var(--bd)!important;border-radius:12px!important;box-shadow:0 1px 2px rgba(0,0,0,.04)!important}\n.glass-card input:focus,.glass-card select:focus{outline:2px solid var(--sky)!important;border-color:transparent!important}\n.glass-card button{display:block!important;width:100%!important;float:none!important;margin:12px 0 0!important;padding:12px 18px!important;font-family:inherit!important;font-size:.95rem!important;font-weight:700!important;text-transform:none!important;letter-spacing:0!important;border-radius:12px!important;cursor:pointer;background:var(--sky2)!important;color:#fff!important;border:1.5px solid var(--sky2)!important}\n.glass-card button.sec{background:transparent!important;color:var(--sky2)!important}\n.glass-card button:disabled{opacity:.45!important;cursor:not-allowed!important}\n.msg{margin-top:12px;padding:10px 12px;border-radius:12px;font-size:.9rem}\n.msg.ok{background:#e0f2fe;color:#075985}.msg.err{background:#ffe4e6;color:#9f1239}\n.pct{font-size:2.5rem;font-weight:800;text-align:center;color:var(--sky)}\n.bar{height:14px;background:var(--chip);border:1px solid var(--bd);border-radius:999px;overflow:hidden;margin:10px 0}\n.bar i{display:block;height:100%;width:0;background:linear-gradient(90deg,var(--sky),var(--ind));transition:width .8s}\n.grid{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;margin-top:12px}\n.b{border:1px solid var(--bd);background:var(--chip);border-radius:12px;padding:9px 2px;text-align:center;font-size:.8rem;color:var(--mut);font-weight:600}\n.b.ok{background:linear-gradient(135deg,var(--sky),var(--ind));border-color:transparent;color:#fff}\n.b.cur{border:2px solid var(--sky);color:var(--sky)}\ndetails summary{cursor:pointer;font-weight:700;color:var(--sky2);list-style:none;display:flex;align-items:center;gap:10px}\ndetails summary::-webkit-details-marker{display:none}\n.demo{font-size:.78rem;color:var(--mut);text-align:center}\n@media (prefers-reduced-motion:reduce){ header.sisd-cab *, .glass-card{transition:none !important;} }\n\n\/* =====================================================================\n   3) CONSULTA DE CERTIFICADOS\n   ===================================================================== *\/\n.cert-card{margin-bottom:22px;border-top:4px solid #e3b341}\n.cert-card .ico.gold{background:#e3b341;color:#172b43;box-shadow:0 4px 10px rgba(227,179,65,.35)}\n.tipos{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;margin-top:6px}\n.tipos input{position:absolute!important;opacity:0!important;width:1px!important;height:1px!important;pointer-events:none}\n.tipos label.tipo{margin:0!important;display:flex!important;flex-direction:column;align-items:center;gap:6px;padding:12px 6px!important;border:1.5px solid var(--bd);border-radius:12px;background:var(--in);cursor:pointer;text-align:center;font-size:.82rem!important;transition:border-color .2s,background .2s}\n.tipos label.tipo i{font-size:1.15rem;color:var(--sky)}\n.tipos input:checked + label.tipo{border-color:var(--sky);background:var(--chip);box-shadow:0 0 0 2px var(--sky) inset}\n.tipos input:focus-visible + label.tipo{outline:2px solid var(--sky);outline-offset:2px}\n.cert-prev{margin-top:14px}\n.cert-prev iframe{display:block;width:100%;height:440px;border:1px solid var(--bd);border-radius:12px;background:#fff}\n.cert-prev a.abrir{display:flex;align-items:center;justify-content:center;gap:8px;margin-top:10px;padding:12px 18px;border-radius:12px;background:#e3b341;color:#172b43;font-weight:700;text-decoration:none}\n.cert-prev a.abrir:hover{filter:brightness(1.05)}\n@media(max-width:520px){.cert-prev iframe{height:320px}.tipos label.tipo{font-size:.75rem!important}}\n<\/style>\n\n<!-- ===================== CABECERA DEL SEMINARIO ===================== -->\n<header class=\"sisd-cab\">\n  <div class=\"sisd-top\">\n    <span>Universidad Nacional de Trujillo \u00b7 Facultad de Ciencias F\u00edsicas y Matem\u00e1ticas \u00b7 Departamento de Matem\u00e1ticas<\/span>\n    <span class=\"sisd-res\"><i class=\"fa-solid fa-file-lines\"><\/i> Resoluci\u00f3n Rectoral: 1806-2026-UNT<\/span>\n  <\/div>\n\n  <div class=\"sisd-banner\">\n    <div class=\"sisd-hero\">\n      <div>\n        <div class=\"sisd-eyebrow\">Encuentro acad\u00e9mico internacional \u00b7 Modalidad virtual<\/div>\n        <h1 class=\"sisd-titulo\">II Seminario Internacional de Sistemas Din\u00e1micos<\/h1>\n      <\/div>\n      <div class=\"sisd-pills\">\n        <span class=\"sisd-pill\" style=\"color:#fff\">\ud83d\udcc5 09 al 12 de noviembre de 2026<\/span>\n        <span class=\"sisd-pill\" style=\"color:#fff\">\ud83d\udcbb Transmisi\u00f3n Online (Zoom \/ V\u00eda Web)<\/span>\n        <span class=\"sisd-pill\" style=\"color:#fff\">\ud83d\udd52 Zona Horaria: Per\u00fa (UTC-5)<\/span>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <nav class=\"sisd-nav\" aria-label=\"Navegaci\u00f3n principal\">\n    <a href=\"https:\/\/accf.unitru.edu.pe\/index.php\/eventos-academicos\/sisd2\"><i class=\"fa-solid fa-house\"><\/i> INICIO PRESENTACI\u00d3N<\/a>\n    <a href=\"https:\/\/accf.unitru.edu.pe\/index.php\/sisd2-2\/ejes-tematicos\"><i class=\"fa-solid fa-list\"><\/i> EJES TEM\u00c1TICOS<\/a>\n    <a href=\"https:\/\/accf.unitru.edu.pe\/index.php\/sisd2-2\/programa\"><i class=\"fa-solid fa-calendar-days\"><\/i> PROGRAMA<\/a>\n    <a href=\"https:\/\/accf.unitru.edu.pe\/index.php\/sisd2-2\/expositores-3\"><i class=\"fa-solid fa-users\"><\/i> CONFERENCISTAS<\/a>\n    <a href=\"https:\/\/accf.unitru.edu.pe\/index.php\/sisd2-2\/conferencias\"><i class=\"fa-solid fa-video\"><\/i> CONFERENCIAS<\/a>\n    <a href=\"https:\/\/accf.unitru.edu.pe\/index.php\/sisd2-2\/comite-organizador\"><i class=\"fa-solid fa-sitemap\"><\/i> COMIT\u00c9 ORGANIZADOR<\/a>\n    <a href=\"https:\/\/accf.unitru.edu.pe\/index.php\/sisd2-2\/afiche\"><i class=\"fa-solid fa-image\"><\/i> AFICHE<\/a>\n    <a href=\"https:\/\/accf.unitru.edu.pe\/index.php\/sisd2-2\/registro\"><i class=\"fa-solid fa-pen\"><\/i> INSCRIPCI\u00d3N<\/a>\n    <a href=\"https:\/\/accf.unitru.edu.pe\/index.php\/sisd2-2\/contacto\"><i class=\"fa-solid fa-envelope\"><\/i> CONTACTO<\/a>\n    <a href=\"https:\/\/accf.unitru.edu.pe\/index.php\/validate\/sisd2-2\"><i class=\"fa-solid fa-certificate\"><\/i> CERTIFICACI\u00d3N<\/a>\n  <\/nav>\n<\/header>\n\n<div class=\"wrap\">\n<!-- ===================== CONSULTA DE CERTIFICADOS ===================== -->\n<section class=\"glass-card cert-card\" id=\"certificados\" aria-labelledby=\"certTit\">\n  <div class=\"ch\"><div class=\"ico gold\"><i class=\"fa-solid fa-award\"><\/i><\/div><div><h2 id=\"certTit\">Descarga tu certificado<\/h2><div class=\"sub\">PR\u00d3XIMAMENTE<!--Ingresa tu documento y el tipo de certificado--><\/div><\/div><\/div>\n\n  <label for=\"cdoc\">Tipo de documento<\/label>\n  <select id=\"cdoc\" onchange=\"cambiarCDoc()\">\n    <option value=\"DNI\">DNI (Per\u00fa)<\/option>\n    <option value=\"PAS\">Pasaporte u otro documento<\/option>\n  <\/select>\n\n  <label for=\"cnum\" id=\"lblCnum\">N.\u00ba de DNI<\/label>\n  <input id=\"cnum\" inputmode=\"numeric\" maxlength=\"8\" placeholder=\"8 d\u00edgitos\" autocomplete=\"off\" onkeydown=\"if(event.key==='Enter')buscarCert()\">\n\n  <label>Tipo de certificado<\/label>\n  <div class=\"tipos\" role=\"radiogroup\">\n    <input type=\"radio\" name=\"ctipo\" id=\"t-asi\" value=\"asistente\" checked=\"\"><label class=\"tipo\" for=\"t-asi\"><i class=\"fa-solid fa-user-graduate\"><\/i>Asistente<\/label>\n    <input type=\"radio\" name=\"ctipo\" id=\"t-org\" value=\"organizador\"><label class=\"tipo\" for=\"t-org\"><i class=\"fa-solid fa-people-group\"><\/i>Organizador<\/label>\n    <input type=\"radio\" name=\"ctipo\" id=\"t-exp\" value=\"expositor\"><label class=\"tipo\" for=\"t-exp\"><i class=\"fa-solid fa-chalkboard-user\"><\/i>Expositor<\/label>\n  <\/div>\n\n  <button onclick=\"buscarCert()\"><i class=\"fa-solid fa-magnifying-glass\"><\/i> Buscar mi certificado<\/button>\n  <div id=\"cmsg\"><\/div>\n  <div class=\"cert-prev\" id=\"cprev\" hidden=\"\"><\/div>\n<\/section>\n\n<!-- ===================== REGISTRO DE ASISTENCIA ===================== -->\n<!-- LOGO: reemplaza PEGA_AQUI_EL_LOGO por el valor completo de src de tu c\u00f3digo original\n     (todo el texto que empieza con data:image\/jpeg;base64,\/9j\/4AAQ... hasta las comillas de cierre) -->\n<div class=\"logo-bar\"><img decoding=\"async\" src=\"PEGA_AQUI_EL_LOGO\" alt=\"Universidad Nacional de Trujillo (UNT)\" onerror=\"this.parentNode.style.display='none'\"><\/div>\n<section class=\"asis-hero gradient-bg\">\n  <canvas id=\"lorenz\"><\/canvas>\n  <div>\n    <small>REGISTRO DE ASISTENCIA<\/small>\n    <h2 class=\"asis-tit\">II SEMINARIO INTERNACIONAL<br>DE SISTEMAS DIN\u00c1MICOS<\/h2>\n    <p>Marca tu asistencia en el bloque actual y revisa tu porcentaje<\/p>\n  <\/div>\n<\/section>\n<main>\n  <div class=\"glass-card now card-hover\">\n    <div class=\"ch\"><div class=\"ico\"><i class=\"fa-solid fa-clock\"><\/i><\/div><div><h2>Bloque actual<\/h2><\/div><\/div>\n    <span class=\"badge\" id=\"bloqueTxt\">\u2026<\/span>\n    <div id=\"diaTxt\" class=\"dia\"><\/div>\n  <\/div>\n\n  <div class=\"glass-card\">\n    <div class=\"ch\"><div class=\"ico in\"><i class=\"fa-solid fa-user-check\"><\/i><\/div><div><h2>Tus datos<\/h2><div class=\"sub\">Completa para registrar o consultar<\/div><\/div><\/div>\n    <label>Apellidos<\/label><input id=\"ap\" placeholder=\"Ej. P\u00e9rez Rojas\" autocomplete=\"off\">\n    <label>Nombres<\/label><input id=\"no\" placeholder=\"Ej. Ana Mar\u00eda\" autocomplete=\"off\">\n    <label>Tipo de documento<\/label>\n    <select id=\"tdoc\" onchange=\"cambiarDoc()\">\n      <option value=\"DNI\">DNI (Per\u00fa)<\/option>\n      <option value=\"CPF\">CPF (Brasil)<\/option>\n      <option value=\"OTRO\">Pasaporte u otro documento<\/option>\n    <\/select>\n    <label id=\"lblDoc\">N.\u00ba de DNI<\/label><input id=\"dni\" inputmode=\"numeric\" maxlength=\"8\" placeholder=\"8 d\u00edgitos\" autocomplete=\"off\">\n    <button id=\"btnReg\" onclick=\"registrar()\"><i class=\"fa-solid fa-check\"><\/i> Registrar asistencia<\/button>\n    <button class=\"sec\" onclick=\"consultar()\"><i class=\"fa-solid fa-magnifying-glass\"><\/i> Solo consultar mi porcentaje de asistencia<\/button>\n    <div id=\"msg\"><\/div>\n  <\/div>\n\n  <div class=\"glass-card\" id=\"res\" hidden=\"\">\n    <div class=\"ch\"><div class=\"ico\"><i class=\"fa-solid fa-chart-simple\"><\/i><\/div><div><h2>Tu asistencia<\/h2><\/div><\/div>\n    <div class=\"pct\" id=\"pct\">0%<\/div>\n    <div class=\"bar\"><i id=\"barra\"><\/i><\/div>\n    <div style=\"text-align:center;font-size:.9rem\" id=\"det\"><\/div>\n    <div class=\"grid\" id=\"grid\"><\/div>\n    <div class=\"dia\">Relleno: asististe \u00b7 Borde: bloque actual<\/div>\n  <\/div>\n\n  <div class=\"glass-card\">\n    <details>\n      <summary><span class=\"ico in\"><i class=\"fa-solid fa-lock\"><\/i><\/span> Panel de administrador<\/summary>\n      <div id=\"lock\">\n        <label>PIN<\/label><input id=\"pin\" type=\"password\" autocomplete=\"new-password\" placeholder=\"Ingresa el PIN para ver las opciones\" onkeydown=\"if(event.key==='Enter')entrar()\">\n        <button onclick=\"entrar()\">Ingresar<\/button>\n        <div id=\"msg3\"><\/div>\n      <\/div>\n      <div id=\"opts\" hidden=\"\">\n        <label>Bloque actual<\/label><select id=\"selB\"><\/select>\n        <div id=\"fechas\"><\/div>\n        <button onclick=\"guardarCfg()\">Guardar cambios<\/button>\n        <button class=\"sec\" onclick=\"salir()\">Cerrar panel<\/button>\n        <div id=\"msg2\"><\/div>\n      <\/div>\n    <\/details>\n  <\/div>\n  <p class=\"demo\" id=\"demo\"><\/p>\n<\/main>\n<\/div>\n\n<script>\n\/* ---- Men\u00fa: resalta la p\u00e1gina actual ---- *\/\n(function () {\n  var links = document.querySelectorAll('header.sisd-cab nav.sisd-nav a');\n  var limpiar = function (u) { return u.split('?')[0].split('#')[0].replace(\/\\\/$\/, ''); };\n  var current = limpiar(window.location.href);\n  links.forEach(function (link) {\n    if (limpiar(link.href) === current) link.setAttribute('aria-current', 'page');\n    link.addEventListener('click', function () {\n      links.forEach(function (l) { l.classList.remove('seleccionado'); l.removeAttribute('aria-current'); });\n      this.classList.add('seleccionado');\n    });\n  });\n})();\n\n\/* Pega aqu\u00ed la URL de tu aplicaci\u00f3n web de Google Apps Script (termina en \/exec).\n   Si la dejas vac\u00eda, la p\u00e1gina funciona en modo de prueba (datos solo en este navegador). *\/\nconst API_URL = 'https:\/\/script.google.com\/macros\/s\/AKfycbwxL-f3avVvOX9KYjoSmpitJaGbW40FXLKj4mJPFv2tVbI3CbaCJ4MnoW4ulq4USMFs5Q\/exec';\n\nconst TOTAL = 10;\nconst DIAS = [['Lunes',[1,2]],['Martes',[3,4,5]],['Mi\u00e9rcoles',[6,7,8]],['Jueves',[9,10]]];\nlet cfg = {bloque:1, fechas:['09 de noviembre','10 de noviembre','11 de noviembre','12 de noviembre']};\n\nasync function srv(a, d={}){\n  if(API_URL){\n    const r = (a==='config'||a==='pct')\n      ? await fetch(API_URL+'?'+new URLSearchParams({action:a,...d}))\n      : await fetch(API_URL,{method:'POST',body:JSON.stringify({action:a,...d})});\n    const t = await r.text();\n    try{ return JSON.parse(t); }catch(e){ throw new Error('respuesta no v\u00e1lida'); }\n  }\n  const L = k => JSON.parse(localStorage.getItem(k)||'null');\n  const att = L('att')||[], c = L('cfg')||cfg;\n  const mine = dni => att.filter(x=>x.dni===dni).map(x=>x.bloque);\n  if(a==='config') return {ok:1,cfg:c};\n  if(a==='pct') return {ok:1,bloques:mine(d.dni)};\n  if(a==='register'){\n    if(!c.bloque) return {ok:0,msg:'El registro de asistencia est\u00e1 cerrado en este momento.'};\n    if(mine(d.dni).includes(d.bloque)) return {ok:0,msg:'Ya registraste tu asistencia en este bloque.',bloques:mine(d.dni)};\n    att.push(d); localStorage.setItem('att',JSON.stringify(att));\n    return {ok:1,bloques:mine(d.dni)};\n  }\n  if(a==='auth') return String(d.pin).trim()==='4228' ? {ok:1} : {ok:0,msg:'PIN incorrecto. En modo de prueba el PIN es 4228.'};\n  if(a==='setcfg'){\n    if(String(d.pin).trim()!=='4228') return {ok:0,msg:'PIN incorrecto. En modo de prueba el PIN es 4228.'};\n    localStorage.setItem('cfg',JSON.stringify(d.cfg)); return {ok:1};\n  }\n}\n\nconst $ = id => document.getElementById(id);\nconst diaDe = b => DIAS.findIndex(x=>x[1].includes(b));\nfunction msg(el,t,ok){ $(el).innerHTML = t?`<div class=\"msg ${ok?'ok':'err'}\">${t}<\/div>`:''; }\n\nfunction pintarBloque(){\n  const i = diaDe(cfg.bloque), cerrado = !cfg.bloque || i<0;\n  $('btnReg').disabled = cerrado;\n  if(cerrado){\n    $('bloqueTxt').textContent = 'Registro cerrado';\n    $('diaTxt').textContent = 'No se puede marcar asistencia en este momento';\n    return;\n  }\n  $('bloqueTxt').textContent = 'Bloque '+cfg.bloque;\n  $('diaTxt').textContent = DIAS[i][0]+' '+cfg.fechas[i];\n}\n\nfunction pintarPanel(){\n  $('selB').innerHTML = `<option value=\"0\" ${!cfg.bloque?'selected':''}>Sin registro (cerrado)<\/option>` + Array.from({length:TOTAL},(_,i)=>`<option value=\"${i+1}\" ${i+1==cfg.bloque?'selected':''}>Bloque ${i+1} (${DIAS[diaDe(i+1)][0]})<\/option>`).join('');\n  $('fechas').innerHTML = DIAS.map((d,i)=>`<label>${d[0]} (bloques ${d[1].join(', ')})<\/label><input class=\"fx\" value=\"${cfg.fechas[i]}\">`).join('');\n}\n\nfunction pintarResultado(bloques){\n  const set = [...new Set(bloques)], n = set.length, p = Math.round(n\/TOTAL*100);\n  $('res').hidden = false;\n  $('pct').textContent = p+'%';\n  $('barra').style.width = p+'%';\n  $('det').textContent = `Has asistido a ${n} de ${TOTAL} bloques`;\n  $('grid').innerHTML = Array.from({length:TOTAL},(_,i)=>{\n    const b=i+1, c = set.includes(b)?'ok':(b==cfg.bloque?'cur':'');\n    return `<div class=\"b ${c}\">Bloque ${b}<\/div>`;\n  }).join('');\n}\n\nconst DOCS = {\n  DNI:{lbl:'N.\u00ba de DNI', ph:'8 d\u00edgitos', max:8, mode:'numeric', re:\/^\\d{8}$\/, err:'El DNI debe tener 8 d\u00edgitos.'},\n  CPF:{lbl:'N.\u00ba de CPF', ph:'11 d\u00edgitos', max:14, mode:'numeric', re:\/^\\d{11}$\/, err:'El CPF debe tener 11 d\u00edgitos.'},\n  OTRO:{lbl:'N.\u00ba de documento', ph:'5 a 20 letras o n\u00fameros', max:20, mode:'text', re:\/^[A-Z0-9]{5,20}$\/, err:'El documento debe tener entre 5 y 20 letras o n\u00fameros.'}\n};\nfunction cambiarDoc(){\n  const d = DOCS[$('tdoc').value], el = $('dni');\n  $('lblDoc').textContent = d.lbl; el.placeholder = d.ph; el.maxLength = d.max; el.inputMode = d.mode; el.value = ''; msg('msg','');\n}\n\nfunction leer(conNombre){\n  const tipo = $('tdoc').value, d = DOCS[tipo];\n  const dni = $('dni').value.replace(\/[\\s.\\-\\\/]\/g,'').toUpperCase();\n  const ap = $('ap').value.trim(), no = $('no').value.trim();\n  if(!d.re.test(dni)){ msg('msg',d.err); return null; }\n  if(conNombre && (!ap || !no)){ msg('msg','Completa apellidos y nombres.'); return null; }\n  return {dni,ap,no,tipo};\n}\n\nasync function registrar(){\n  if(!cfg.bloque){ msg('msg','El registro de asistencia est\u00e1 cerrado en este momento.'); return; }\n  const f = leer(true); if(!f) return;\n  try{\n    const r = await srv('register',{dni:f.dni,tipo:f.tipo,apellidos:f.ap,nombres:f.no,bloque:cfg.bloque,dia:DIAS[diaDe(cfg.bloque)][0]+' '+cfg.fechas[diaDe(cfg.bloque)],fecha:new Date().toLocaleString('es-PE')});\n    if(!r.ok){ msg('msg',r.msg||'No se pudo registrar.'); if(r.bloques) pintarResultado(r.bloques); return; }\n    msg('msg','\u00a1Asistencia registrada en el Bloque '+cfg.bloque+'!',true);\n    pintarResultado(r.bloques);\n  }catch(e){ msg('msg','Error de conexi\u00f3n. Intenta de nuevo.'); }\n}\n\nasync function consultar(){\n  const f = leer(false); if(!f) return;\n  try{ const r = await srv('pct',{dni:f.dni}); msg('msg',''); pintarResultado(r.bloques||[]); }\n  catch(e){ msg('msg','Error de conexi\u00f3n. Intenta de nuevo.'); }\n}\n\nlet PINOK = '';\nasync function entrar(){\n  const pin = $('pin').value.trim();\n  if(!pin) return msg('msg3','Ingresa el PIN.');\n  try{\n    const r = await srv('auth',{pin});\n    if(!r.ok) return msg('msg3', \/Acci.n no v.lida\/.test(r.msg||'') ? 'El script de Google a\u00fan tiene la versi\u00f3n anterior. Pega el nuevo Code.gs y crea una Nueva versi\u00f3n de la implementaci\u00f3n.' : (r.msg||'PIN incorrecto.'));\n    PINOK = pin; msg('msg3',''); $('lock').hidden = true; $('opts').hidden = false; pintarPanel();\n  }catch(e){ msg('msg3','No se pudo comunicar con Google Sheets. Revisa la implementaci\u00f3n del script y vuelve a intentar.'); }\n}\nfunction salir(){ PINOK=''; $('pin').value=''; $('opts').hidden = true; $('lock').hidden = false; msg('msg2',''); }\n\nasync function guardarCfg(){\n  const nuevo = {bloque:+$('selB').value, fechas:[...document.querySelectorAll('.fx')].map(x=>x.value.trim())};\n  try{\n    const r = await srv('setcfg',{pin:PINOK,cfg:nuevo});\n    if(!r.ok) return msg('msg2',r.msg||'No se pudo guardar.');\n    cfg = nuevo; pintarBloque(); msg('msg2','Guardado. Los estudiantes ya ven el Bloque '+cfg.bloque+'.',true);\n  }catch(e){ msg('msg2','No se pudo comunicar con Google Sheets. Revisa que la implementaci\u00f3n est\u00e9 con acceso para \"Cualquier usuario\", que la URL termine en \/exec y que hayas autorizado el script.'); }\n}\n\n\/* =====================================================================\n   CERTIFICADOS \u2014 completa esta tabla con los enlaces de Google Drive.\n   Formato:  'N\u00daMERO DE DOCUMENTO' : 'enlace de Drive o ID del archivo'\n   - El enlace puede ser el de \"Compartir\" (https:\/\/drive.google.com\/file\/d\/XXXX\/view?usp=sharing)\n     o solo el ID (XXXX).\n   - En Drive, cada archivo debe estar compartido como \"Cualquier persona con el enlace\".\n   - Pasaportes: escr\u00edbelos en MAY\u00daSCULAS y sin espacios ni guiones.\n   ===================================================================== *\/\nconst CERTIFICADOS = {\n  asistente: {\n    '12345678': 'https:\/\/drive.google.com\/file\/d\/ID_DEL_ARCHIVO_DE_EJEMPLO\/view?usp=sharing',\n  },\n  organizador: {\n  },\n  expositor: {\n  }\n};\n\nconst CDOCS = {\n  DNI:{lbl:'N.\u00ba de DNI', ph:'8 d\u00edgitos', max:8, mode:'numeric', re:\/^\\d{8}$\/, err:'El DNI debe tener 8 d\u00edgitos.'},\n  PAS:{lbl:'N.\u00ba de pasaporte o documento', ph:'5 a 20 letras o n\u00fameros', max:20, mode:'text', re:\/^[A-Z0-9]{5,20}$\/, err:'El documento debe tener entre 5 y 20 letras o n\u00fameros.'}\n};\nfunction cambiarCDoc(){\n  const d = CDOCS[$('cdoc').value], el = $('cnum');\n  $('lblCnum').textContent = d.lbl; el.placeholder = d.ph; el.maxLength = d.max; el.inputMode = d.mode;\n  el.value = ''; msg('cmsg',''); $('cprev').hidden = true;\n}\nfunction idDrive(v){\n  v = String(v||'').trim();\n  const m = v.match(\/\\\/d\\\/([\\w-]{10,})\/) || v.match(\/[?&]id=([\\w-]{10,})\/);\n  return m ? m[1] : (\/^[\\w-]{10,}$\/.test(v) ? v : '');\n}\nconst NOMBRE_TIPO = {asistente:'asistente', organizador:'organizador', expositor:'expositor'};\nfunction buscarCert(){\n  const d = CDOCS[$('cdoc').value];\n  const num = $('cnum').value.replace(\/[\\s.\\-\\\/]\/g,'').toUpperCase();\n  const tipo = (document.querySelector('input[name=\"ctipo\"]:checked')||{}).value;\n  $('cprev').hidden = true;\n  if(!d.re.test(num)) return msg('cmsg', d.err);\n  const id = idDrive((CERTIFICADOS[tipo]||{})[num]);\n  if(!id) return msg('cmsg', 'No encontramos un certificado de <b>'+NOMBRE_TIPO[tipo]+'<\/b> para el documento <b>'+num+'<\/b>. Verifica el n\u00famero y el tipo de certificado, o escribe a la secci\u00f3n Contacto.');\n  msg('cmsg', 'Certificado de '+NOMBRE_TIPO[tipo]+' encontrado.', true);\n  const ver = 'https:\/\/drive.google.com\/file\/d\/'+id+'\/view';\n  $('cprev').innerHTML =\n    '<iframe src=\"https:\/\/drive.google.com\/file\/d\/'+id+'\/preview\" title=\"Vista previa del certificado\" loading=\"lazy\" allow=\"autoplay\"><\/iframe>'+\n    '<a class=\"abrir\" href=\"'+ver+'\" target=\"_blank\" rel=\"noopener\"><i class=\"fa-solid fa-up-right-from-square\"><\/i> Abrir en Google Drive<\/a>';\n  $('cprev').hidden = false;\n}\n\n\/* ---- Atractor de Lorenz (\u03c3=10, \u03c1=28, \u03b2=8\/3) ---- *\/\n(function(){\n  const cv = $('lorenz'), ctx = cv.getContext('2d');\n  const S=10, R=28, B=8\/3, DT=0.006, N=1400;\n  const reduce = matchMedia('(prefers-reduced-motion: reduce)').matches;\n  const tr = [{p:[1,1,1],pts:[],col:'248,250,252'},{p:[1.001,1,1],pts:[],col:'56,189,248'}];\n  let W=0,H=0,ang=0;\n  function resize(){const d=devicePixelRatio||1,r=cv.getBoundingClientRect();W=r.width;H=r.height;cv.width=W*d;cv.height=H*d;ctx.setTransform(d,0,0,d,0,0);}\n  function step(t){const [x,y,z]=t.p;t.p=[x+S*(y-x)*DT,y+(x*(R-z)-y)*DT,z+(x*y-B*z)*DT];t.pts.push(t.p);if(t.pts.length>N)t.pts.shift();}\n  function proj(p){const s=Math.min(W\/52,H\/40),c=Math.cos(ang),n=Math.sin(ang);return [W\/2+(p[0]*c+p[1]*n)*s,H*0.52-(p[2]-25)*s];}\n  function draw(){\n    ctx.clearRect(0,0,W,H);ctx.lineWidth=1.4;ctx.lineCap='round';\n    for(const t of tr){const L=t.pts.length;if(L<2)continue;let a=proj(t.pts[0]);\n      for(let i=1;i<L;i++){const b=proj(t.pts[i]);ctx.strokeStyle=`rgba(${t.col},${(i\/L)*0.75})`;ctx.beginPath();ctx.moveTo(a[0],a[1]);ctx.lineTo(b[0],b[1]);ctx.stroke();a=b;}}\n  }\n  function loop(){for(let k=0;k<4;k++)tr.forEach(step);ang+=0.0035;draw();requestAnimationFrame(loop);}\n  addEventListener('resize',resize);resize();\n  if(reduce){for(let k=0;k<N;k++)tr.forEach(step);draw();}else loop();\n})();\n\n(async()=>{\n  try{ const r = await srv('config'); if(r.ok && r.cfg) cfg = r.cfg; }catch(e){}\n  pintarBloque(); pintarPanel();\n  if(!API_URL) $('demo').textContent = 'Modo de prueba: a\u00fan no est\u00e1 vinculado a Google Sheets (PIN de prueba: 4228).';\n})();\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Registro de asistencia \u2013 II Seminario Internacional de Sistemas Din\u00e1micos<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1687","post","type-post","status-publish","format-standard","hentry","category-validate"],"_links":{"self":[{"href":"https:\/\/accf.unitru.edu.pe\/index.php\/wp-json\/wp\/v2\/posts\/1687","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/accf.unitru.edu.pe\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/accf.unitru.edu.pe\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/accf.unitru.edu.pe\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/accf.unitru.edu.pe\/index.php\/wp-json\/wp\/v2\/comments?post=1687"}],"version-history":[{"count":33,"href":"https:\/\/accf.unitru.edu.pe\/index.php\/wp-json\/wp\/v2\/posts\/1687\/revisions"}],"predecessor-version":[{"id":2066,"href":"https:\/\/accf.unitru.edu.pe\/index.php\/wp-json\/wp\/v2\/posts\/1687\/revisions\/2066"}],"wp:attachment":[{"href":"https:\/\/accf.unitru.edu.pe\/index.php\/wp-json\/wp\/v2\/media?parent=1687"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/accf.unitru.edu.pe\/index.php\/wp-json\/wp\/v2\/categories?post=1687"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/accf.unitru.edu.pe\/index.php\/wp-json\/wp\/v2\/tags?post=1687"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}