{"id":2399,"date":"2026-06-26T15:22:37","date_gmt":"2026-06-26T15:22:37","guid":{"rendered":"https:\/\/exposecurity.net\/?page_id=2399"},"modified":"2026-10-08T19:17:34","modified_gmt":"2026-10-08T17:17:34","slug":"planos-del-recinto","status":"publish","type":"page","link":"https:\/\/exposecurity.net\/en\/planos-del-recinto\/","title":{"rendered":"Site plans"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"2399\" class=\"elementor elementor-2399\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5aaf7a1 e-con-full e-flex e-con e-parent\" data-id=\"5aaf7a1\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-811c13e elementor-widget elementor-widget-html\" data-id=\"811c13e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"es\">\r\n<head>\r\n<meta charset=\"utf-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n<title>EXPOSECURITY \u00b7 Zona 1 \u00b7 Plano horizontal afinado<\/title>\r\n<style>\r\n:root{\r\n  --expo-green:#5d7f2b;\r\n  --expo-green-dark:#405b1c;\r\n  --expo-bg:#f4f5f7;\r\n  --expo-card:#ffffff;\r\n  --expo-text:#111111;\r\n  --expo-muted:#666666;\r\n  --expo-line:#e7e7e7;\r\n  --expo-shadow:0 16px 38px rgba(0,0,0,.10);\r\n}\r\n*{box-sizing:border-box}\r\nhtml,body{max-width:100%;overflow-x:hidden}\r\nbody{margin:0;background:#fff;color:var(--expo-text);font-family:Arial,Helvetica,sans-serif}\r\n.expo-hz{\r\n  width:100% !important;\r\n  max-width:100% !important;\r\n  margin:0 auto;\r\n  padding:22px 0 42px;\r\n  overflow:hidden;\r\n}\r\n.expo-hz-inner{\r\n  width:min(100%, 1680px);\r\n  max-width:100%;\r\n  margin:0 auto;\r\n  padding:0 12px;\r\n}\r\n.expo-hz-header{\r\n  text-align:center;\r\n  margin-bottom:18px;\r\n}\r\n.expo-hz-header span{\r\n  display:inline-block;\r\n  font-size:13px;\r\n  font-weight:900;\r\n  letter-spacing:1.2px;\r\n  color:var(--expo-green);\r\n  text-transform:uppercase;\r\n  margin-bottom:8px;\r\n}\r\n.expo-hz-header h2{\r\n  margin:0;\r\n  font-size:clamp(28px, 4vw, 46px);\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n.expo-hz-header p{\r\n  max-width:920px;\r\n  margin:12px auto 0;\r\n  color:var(--expo-muted);\r\n  line-height:1.6;\r\n  font-size:15px;\r\n}\r\n\r\n\r\n.expo-top-toggle-wrap{\r\n  width:100%;\r\n  margin-bottom:10px;\r\n}\r\n.expo-top-toggle{\r\n  width:100%;\r\n  min-height:48px;\r\n  border:1px solid rgba(93,127,43,.28);\r\n  border-radius:14px;\r\n  background:#f5f8f0;\r\n  color:var(--expo-green-dark);\r\n  padding:10px 15px;\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:12px;\r\n  cursor:pointer;\r\n  font-family:inherit;\r\n  font-size:13px;\r\n  font-weight:900;\r\n  text-align:left;\r\n}\r\n.expo-top-toggle:hover{background:#eef5e5;border-color:var(--expo-green)}\r\n.expo-top-toggle-copy{min-width:0;display:flex;align-items:center;gap:8px;flex-wrap:wrap}\r\n.expo-top-toggle-name{font-weight:900;color:#111}\r\n.expo-top-toggle-stand{font-size:11px;color:#666;font-weight:800}\r\n.expo-top-toggle-arrow{font-size:20px;line-height:1;transition:transform .2s ease;flex:0 0 auto}\r\n.expo-top-toggle[aria-expanded=\"true\"] .expo-top-toggle-arrow{transform:rotate(180deg)}\r\n.expo-top-card.expo-top-collapsed{display:none}\r\n\r\n.expo-top-card{\r\n  display:grid;\r\n  grid-template-columns:minmax(165px, 250px) minmax(0, 1fr) minmax(110px, 150px);\r\n  gap:18px;\r\n  align-items:center;\r\n  width:100%;\r\n  max-width:100%;\r\n  background:var(--expo-card);\r\n  border:1px solid rgba(0,0,0,.08);\r\n  border-radius:22px;\r\n  box-shadow:var(--expo-shadow);\r\n  padding:20px;\r\n  margin-bottom:18px;\r\n  position:relative;\r\n  overflow:hidden;\r\n}\r\n.expo-top-card::before{\r\n  content:\"\";\r\n  position:absolute;\r\n  left:0; top:0; bottom:0;\r\n  width:7px;\r\n  background:var(--expo-green);\r\n}\r\n.expo-top-logo-wrap{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:10px;\r\n  align-items:center;\r\n  min-width:0;\r\n}\r\n.expo-top-logo-frame{\r\n  width:100%;\r\n  max-width:100%;\r\n  height:126px;\r\n  border:1px solid var(--expo-line);\r\n  border-radius:18px;\r\n  background:#fff;\r\n  box-shadow:0 8px 22px rgba(0,0,0,.06);\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  padding:16px;\r\n}\r\n.expo-top-logo-frame img{max-width:100%;max-height:100%;object-fit:contain}\r\n.expo-assigned-pill{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  min-height:30px;\r\n  border-radius:999px;\r\n  background:#f1f6e9;\r\n  color:var(--expo-green-dark);\r\n  font-size:11px;\r\n  font-weight:900;\r\n  letter-spacing:.4px;\r\n  text-transform:uppercase;\r\n  padding:0 12px;\r\n}\r\n.expo-top-main{min-width:0;max-width:100%}\r\n.expo-top-eyebrow{\r\n  font-size:12px;\r\n  font-weight:900;\r\n  letter-spacing:1px;\r\n  color:var(--expo-green);\r\n  text-transform:uppercase;\r\n}\r\n.expo-top-label{\r\n  margin-top:7px;\r\n  font-size:12px;\r\n  font-weight:800;\r\n  color:#777;\r\n  text-transform:uppercase;\r\n}\r\n.expo-top-title{\r\n  margin:6px 0 0;\r\n  font-size:clamp(26px, 2.8vw, 42px);\r\n  font-weight:950;\r\n  line-height:1.04;\r\n  text-transform:uppercase;\r\n  letter-spacing:-.8px;\r\n  word-break:break-word;\r\n}\r\n.expo-top-intro{\r\n  margin:12px 0 0;\r\n  color:#565656;\r\n  font-size:14px;\r\n  line-height:1.55;\r\n  font-weight:600;\r\n  max-width:100%;\r\n}\r\n.expo-top-meta{\r\n  display:grid;\r\n  grid-template-columns:repeat(3, minmax(0,1fr));\r\n  gap:10px;\r\n  margin-top:16px;\r\n}\r\n.expo-meta-item{\r\n  min-width:0;\r\n  border:1px solid var(--expo-line);\r\n  background:#fafafa;\r\n  border-radius:12px;\r\n  padding:11px 12px;\r\n}\r\n.expo-meta-item span{\r\n  display:block;\r\n  margin-bottom:4px;\r\n  color:#767676;\r\n  font-size:10px;\r\n  font-weight:800;\r\n  letter-spacing:.35px;\r\n  text-transform:uppercase;\r\n}\r\n.expo-meta-item strong{\r\n  display:block;\r\n  font-size:13px;\r\n  font-weight:900;\r\n  line-height:1.3;\r\n  word-break:break-word;\r\n}\r\n.expo-top-actions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:8px;\r\n  margin-top:16px;\r\n}\r\n.expo-btn{\r\n  min-height:40px;\r\n  border-radius:10px;\r\n  padding:0 14px;\r\n  border:1px solid transparent;\r\n  font-size:12px;\r\n  font-weight:900;\r\n  cursor:pointer;\r\n  font-family:inherit;\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  gap:7px;\r\n  text-decoration:none;\r\n  transition:transform .18s ease, background .18s ease, border-color .18s ease;\r\n}\r\n.expo-btn:hover{transform:translateY(-1px)}\r\n.expo-btn-primary{background:var(--expo-green);border-color:var(--expo-green);color:#fff}\r\n.expo-btn-primary:hover{background:var(--expo-green-dark);border-color:var(--expo-green-dark)}\r\n.expo-btn-dark{background:#111;border-color:#111;color:#fff}\r\n.expo-btn-dark:hover{background:#2a2a2a}\r\n.expo-btn-light{background:#fff;border-color:#d9d9d9;color:#222}\r\n.expo-btn-light:hover{background:#f7f9f3;border-color:var(--expo-green)}\r\n.expo-top-stand{\r\n  min-height:150px;\r\n  min-width:0;\r\n  max-width:100%;\r\n  display:flex;\r\n  flex-direction:column;\r\n  align-items:center;\r\n  justify-content:center;\r\n  background:#111;\r\n  color:#fff;\r\n  border-radius:20px;\r\n  box-shadow:0 14px 28px rgba(0,0,0,.15);\r\n  text-align:center;\r\n  padding:14px 10px;\r\n}\r\n.expo-top-stand span{font-size:12px;letter-spacing:2px;font-weight:900;color:#b8c9a0}\r\n.expo-top-stand strong{\r\n  display:block;\r\n  margin-top:10px;\r\n  font-size:clamp(32px,3vw,50px);\r\n  line-height:1;\r\n  font-weight:950;\r\n  letter-spacing:-1.2px;\r\n}\r\n.expo-top-stand small{\r\n  margin-top:12px;\r\n  display:inline-block;\r\n  background:var(--expo-green);\r\n  color:#fff;\r\n  border-radius:999px;\r\n  padding:6px 10px;\r\n  font-size:10px;\r\n  font-weight:900;\r\n  letter-spacing:.7px;\r\n}\r\n\r\n.expo-map-panel{\r\n  background:var(--expo-bg);\r\n  border-radius:22px;\r\n  box-shadow:var(--expo-shadow);\r\n  padding:14px;\r\n  margin-bottom:18px;\r\n}\r\n.expo-map-toolbar{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  gap:12px;\r\n  align-items:center;\r\n  background:#fff;\r\n  border:1px solid rgba(0,0,0,.06);\r\n  border-radius:14px;\r\n  padding:10px 12px;\r\n  margin-bottom:10px;\r\n}\r\n.expo-toolbar-copy strong{display:block;font-size:13px;font-weight:900}\r\n.expo-toolbar-copy span{display:block;margin-top:3px;color:#666;font-size:12px;font-weight:600}\r\n.expo-toolbar-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\r\n.expo-zoom{display:inline-flex;gap:6px;align-items:center}\r\n.expo-zoom button{\r\n  height:38px;border-radius:10px;border:1px solid #d9d9d9;background:#fff;color:#111;\r\n  font-size:22px;font-weight:900;cursor:pointer;min-width:38px\r\n}\r\n.expo-zoom .expo-zoom-level{min-width:68px;padding:0 10px;font-size:12px}\r\n.expo-zoom button:hover{background:#f3f7ed;border-color:var(--expo-green)}\r\n.expo-map-scroll{\r\n  width:100%;\r\n  overflow:auto;\r\n  border-radius:16px;\r\n  background:#fff;\r\n  scrollbar-width:thin;\r\n  scrollbar-color:var(--expo-green) #ececec;\r\n  max-height:85vh;\r\n}\r\n.expo-map-scroll::-webkit-scrollbar{height:10px}\r\n.expo-map-scroll::-webkit-scrollbar-track{background:#ececec}\r\n.expo-map-scroll::-webkit-scrollbar-thumb{background:var(--expo-green);border-radius:999px}\r\n.expo-map-stage{position:relative;width:100%;min-width:0;margin:0 auto;transform-origin:top left}\r\n.expo-map-canvas{position:relative;width:100%}\r\n.expo-main-map{display:block;width:100%;height:auto;user-select:none;-webkit-user-drag:none}\r\n.expo-overlay,.expo-markers,.expo-callouts,.expo-connectors{position:absolute;inset:0}\r\n.expo-overlay,.expo-connectors{pointer-events:none}\r\n.expo-markers,.expo-callouts{pointer-events:none}\r\n.expo-connectors{z-index:8;width:100%;height:100%;overflow:visible}\r\n.expo-connectors path{\r\n  fill:none;stroke:var(--expo-green);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;\r\n  filter:drop-shadow(0 2px 2px rgba(0,0,0,.15));vector-effect:non-scaling-stroke;opacity:0;transition:opacity .18s ease\r\n}\r\n.expo-connectors path.visible{opacity:1}\r\n.expo-stand-highlight{\r\n  position:absolute;border:2px solid var(--expo-green);background:rgba(93,127,43,.08);\r\n  box-shadow:inset 0 0 0 1px rgba(255,255,255,.78), 0 0 10px rgba(93,127,43,.38);\r\n  border-radius:4px;z-index:7;pointer-events:none;animation:pulse 1.35s ease-in-out infinite\r\n}\r\n@keyframes pulse{0%,100%{opacity:.76}50%{opacity:1}}\r\n.expo-marker{\r\n  position:absolute;width:14px;height:14px;transform:translate(-50%,-50%);z-index:11;cursor:pointer;\r\n  border:2px solid #fff;border-radius:50%;background:var(--expo-green);box-shadow:0 2px 7px rgba(0,0,0,.42);pointer-events:auto;padding:0\r\n}\r\n.expo-marker::before{\r\n  content:\"\";position:absolute;inset:50% auto auto 50%;width:40px;height:40px;transform:translate(-50%,-50%);\r\n  border-radius:50%;background:transparent\r\n}\r\n.expo-marker::after{\r\n  content:\"\";position:absolute;inset:50% auto auto 50%;width:3px;height:3px;transform:translate(-50%,-50%);\r\n  border-radius:50%;background:#fff\r\n}\r\n.expo-marker:hover,.expo-marker:focus-visible,.expo-marker.active{\r\n  background:var(--expo-green-dark);transform:translate(-50%,-50%) scale(1.18);\r\n  box-shadow:0 0 0 4px rgba(93,127,43,.18), 0 3px 10px rgba(0,0,0,.42)\r\n}\r\n.expo-callout{\r\n  position:absolute;width:176px;min-height:60px;transform:translate(-50%,-50%) scale(.96);z-index:12;\r\n  display:grid;grid-template-columns:60px 1fr;gap:9px;align-items:center;padding:8px;border:2px solid var(--expo-green);\r\n  border-radius:12px;background:rgba(255,255,255,.98);box-shadow:0 9px 24px rgba(0,0,0,.24);\r\n  opacity:0;visibility:hidden;pointer-events:none;transition:opacity .18s ease, transform .18s ease, visibility .18s ease\r\n}\r\n.expo-callout.visible{opacity:1;visibility:visible;transform:translate(-50%,-50%) scale(1);pointer-events:auto}\r\n.expo-callout img{width:60px;height:42px;object-fit:contain;border-radius:8px;border:1px solid #ececec;background:#fff;padding:4px}\r\n.expo-callout-info{min-width:0}\r\n.expo-callout-info strong{display:block;font-size:12px;line-height:1.15;font-weight:900}\r\n.expo-callout-info span{\r\n  display:inline-block;margin-top:5px;border-radius:7px;background:var(--expo-green);color:#fff;\r\n  padding:4px 7px;font-size:10px;font-weight:900\r\n}\r\n.expo-map-note{\r\n  margin-top:10px;background:#f7f9f3;border-left:4px solid var(--expo-green);border-radius:10px;padding:12px 16px\r\n}\r\n.expo-map-note p{margin:0;font-size:14px;color:#444;line-height:1.5;font-weight:600}\r\n\r\n.expo-list-panel{\r\n  background:#fff;border-radius:22px;box-shadow:var(--expo-shadow);border:1px solid rgba(0,0,0,.06);padding:22px\r\n}\r\n.expo-list-head{\r\n  display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px 18px;align-items:end;margin-bottom:10px\r\n}\r\n.expo-list-head h3{margin:0;font-size:clamp(24px,2.2vw,34px);font-weight:900;text-transform:uppercase}\r\n.expo-list-head p{margin:5px 0 0;color:#666;font-size:14px;line-height:1.45}\r\n.expo-total{\r\n  align-self:center;display:inline-flex;align-items:center;justify-content:center;min-height:38px;border-radius:999px;\r\n  background:#f1f6e9;color:var(--expo-green-dark);font-weight:900;font-size:13px;padding:0 14px;white-space:nowrap\r\n}\r\n.expo-list-toggle-row{display:flex;align-items:center;gap:12px;justify-content:space-between;margin-top:12px}\r\n.expo-list-toggle{\r\n  min-height:42px;padding:0 14px;border-radius:12px;border:1px solid rgba(93,127,43,.28);background:#f5f8f0;\r\n  color:var(--expo-green-dark);font-size:13px;font-weight:900;cursor:pointer;display:inline-flex;align-items:center;gap:8px\r\n}\r\n.expo-list-toggle:hover{background:#eef5e5;border-color:var(--expo-green)}\r\n.expo-list-toggle-arrow{font-size:17px;line-height:1;transition:transform .2s ease}\r\n.expo-list-panel.open .expo-list-toggle-arrow{transform:rotate(180deg)}\r\n.expo-list-content{display:none;margin-top:16px}\r\n.expo-list-panel.open .expo-list-content{display:block}\r\n.expo-search{margin-bottom:16px}\r\n.expo-search input{\r\n  width:100%;min-height:48px;border:1px solid #ddd;border-radius:12px;padding:12px 14px;font-size:15px;color:#111;outline:none\r\n}\r\n.expo-search input:focus{border-color:var(--expo-green);box-shadow:0 0 0 3px rgba(93,127,43,.14)}\r\n.expo-cards{display:grid;grid-template-columns:repeat(4, minmax(0,1fr));gap:10px}\r\n.expo-card{\r\n  display:grid;grid-template-columns:58px minmax(0,1fr) auto;gap:10px;align-items:center;min-height:74px;padding:9px;\r\n  border-radius:13px;border:1px solid #e6e6e6;background:#fafafa;cursor:pointer;\r\n  transition:transform .18s ease, border-color .18s ease, background .18s ease, box-shadow .18s ease\r\n}\r\n.expo-card:hover,.expo-card.active{\r\n  background:#f1f6e9;border-color:var(--expo-green);transform:translateY(-1px);box-shadow:0 8px 20px rgba(0,0,0,.08)\r\n}\r\n.expo-card img{width:58px;height:44px;object-fit:contain;background:#fff;border-radius:9px;padding:4px;border:1px solid #eee}\r\n.expo-card-info{min-width:0}\r\n.expo-card-info strong{display:block;font-size:12.5px;line-height:1.17;font-weight:900}\r\n.expo-card-info span{display:block;margin-top:3px;font-size:10.5px;color:#666}\r\n.expo-badge{min-width:44px;text-align:center;border-radius:8px;background:#111;color:#fff;font-size:10.5px;font-weight:900;padding:6px 7px}\r\n.expo-empty{border:1px dashed #ddd;background:#fafafa;border-radius:12px;padding:18px;text-align:center;color:#777;font-size:14px}\r\n\r\n.expo-map-panel.plan-only{\r\n  position:fixed !important;inset:0 !important;z-index:2147483000 !important;width:100vw !important;height:100dvh !important;\r\n  max-width:none !important;margin:0 !important;padding:8px !important;border-radius:0 !important;background:#111 !important;\r\n  display:flex !important;flex-direction:column !important\r\n}\r\n.expo-map-panel.plan-only .expo-map-toolbar{margin:0 0 8px}\r\n.expo-map-panel.plan-only .expo-map-scroll{flex:1 1 auto;max-height:none !important;overflow:auto}\r\n.expo-map-panel.plan-only .expo-map-note,.expo-map-panel.plan-only .expo-btn-open-plan{display:none !important}\r\n.expo-btn-close-plan{display:none}\r\n.expo-map-panel.plan-only .expo-btn-close-plan{display:inline-flex !important}\r\nbody.expo-lock{overflow:hidden}\r\n\r\n@media (max-width:1280px){.expo-cards{grid-template-columns:repeat(3, minmax(0,1fr))}}\r\n@media (max-width:900px){\r\n  .expo-hz-inner{padding:0 10px}\r\n  .expo-top-card{grid-template-columns:155px minmax(0,1fr);gap:16px}\r\n  .expo-top-stand{grid-column:1 \/ -1;min-height:96px;flex-direction:row;justify-content:flex-start;gap:14px}\r\n  .expo-top-stand strong{margin:0;font-size:40px}\r\n  .expo-top-stand small{margin:0 0 0 auto}\r\n  .expo-top-meta{grid-template-columns:1fr 1fr}\r\n  .expo-meta-item:last-child{grid-column:1 \/ -1}\r\n  .expo-cards{grid-template-columns:repeat(2, minmax(0,1fr))}\r\n}\r\n@media (max-width:600px){\r\n  .expo-hz{padding:18px 0 34px}\r\n  .expo-hz-header{margin-bottom:16px}\r\n  .expo-hz-header p{font-size:14px}\r\n  .expo-top-card{grid-template-columns:1fr;gap:15px;padding:16px;border-radius:18px}\r\n  .expo-top-logo-wrap{max-width:290px;margin:0 auto}\r\n  .expo-top-logo-frame{height:116px}\r\n  .expo-top-title{font-size:30px}\r\n  .expo-top-intro{font-size:12.5px}\r\n  .expo-top-actions{display:grid;grid-template-columns:1fr 1fr}\r\n  .expo-btn{width:100%;font-size:10.5px;min-height:42px;padding:0 9px}\r\n  .expo-top-stand{grid-column:auto;min-height:92px;padding:15px 16px;border-radius:15px}\r\n  .expo-top-stand strong{font-size:34px}\r\n  .expo-map-panel{padding:8px;border-radius:16px}\r\n  .expo-map-toolbar{display:grid;grid-template-columns:1fr;gap:8px;padding:9px}\r\n  .expo-toolbar-actions{width:100%;justify-content:space-between}\r\n  .expo-zoom button{height:34px;min-width:34px;font-size:20px}\r\n  .expo-zoom .expo-zoom-level{min-width:58px;font-size:11px}\r\n  .expo-map-scroll{max-height:68svh}\r\n  .expo-marker{width:12px;height:12px;border-width:1.5px}\r\n  .expo-marker::before{width:44px;height:44px}\r\n  .expo-callout{width:150px;grid-template-columns:54px 1fr}\r\n  .expo-callout img{width:54px;height:38px}\r\n  .expo-list-panel{padding:14px;border-radius:16px}\r\n  .expo-list-head{display:block}\r\n  .expo-total{margin-top:8px}\r\n  .expo-list-toggle-row{display:block}\r\n  .expo-list-toggle{margin-top:8px;width:100%;justify-content:center}\r\n  .expo-cards{grid-template-columns:1fr;gap:7px}\r\n  .expo-card{min-height:64px;grid-template-columns:54px minmax(0,1fr) auto;padding:8px}\r\n  .expo-card img{width:54px;height:40px}\r\n}\r\n@media (prefers-reduced-motion: reduce){*{animation:none !important;transition:none !important;scroll-behavior:auto !important}}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n<section class=\"expo-hz\" id=\"expoHzRoot\">\r\n  <div class=\"expo-hz-inner\">\r\n    <div class=\"expo-hz-header\">\r\n      <span>Caja M\u00e1gica<\/span>\r\n      <h2>Ubicaci\u00f3n de expositores \u00b7 Zona 1<\/h2>\r\n      <p>Plano horizontal interactivo. Pulsa un expositor o un punto del plano para ver su ubicaci\u00f3n, su stand y localizarlo de forma r\u00e1pida dentro del recinto.<\/p>\r\n    <\/div>\r\n\r\n    <div class=\"expo-top-toggle-wrap\">\r\n      <button type=\"button\" class=\"expo-top-toggle\" id=\"expoTopToggle\" aria-expanded=\"false\" aria-controls=\"expoTopCard\">\r\n        <span class=\"expo-top-toggle-copy\">\r\n          <span id=\"expoTopToggleText\">Ver ficha del expositor<\/span>\r\n          <span class=\"expo-top-toggle-name\" id=\"expoTopToggleName\"><\/span>\r\n          <span class=\"expo-top-toggle-stand\" id=\"expoTopToggleStand\"><\/span>\r\n        <\/span>\r\n        <span class=\"expo-top-toggle-arrow\">\u2304<\/span>\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <section class=\"expo-top-card expo-top-collapsed\" id=\"expoTopCard\">\r\n      <div class=\"expo-top-logo-wrap\">\r\n        <div class=\"expo-top-logo-frame\">\r\n          <img decoding=\"async\" id=\"expoTopLogo\" src=\"\" alt=\"Logo del expositor\">\r\n        <\/div>\r\n        <span class=\"expo-assigned-pill\">Ubicaci\u00f3n de expositor<\/span>\r\n      <\/div>\r\n\r\n      <div class=\"expo-top-main\">\r\n        <div class=\"expo-top-eyebrow\">Zona 1<\/div>\r\n        <div class=\"expo-top-label\">Ficha del expositor<\/div>\r\n        <h1 class=\"expo-top-title\" id=\"expoTopTitle\">Seleccione un expositor<\/h1>\r\n        <p class=\"expo-top-intro\" id=\"expoTopIntro\">Puede localizar un expositor desde el plano o desde el desplegable inferior. Cuando seleccione uno, aqu\u00ed ver\u00e1 su informaci\u00f3n y su stand asignado.<\/p>\r\n\r\n        <div class=\"expo-top-meta\">\r\n          <div class=\"expo-meta-item\">\r\n            <span>Zona<\/span>\r\n            <strong>Zona 1<\/strong>\r\n          <\/div>\r\n          <div class=\"expo-meta-item\">\r\n            <span>Stand asignado<\/span>\r\n            <strong id=\"expoTopStandMeta\">\u2014<\/strong>\r\n          <\/div>\r\n          <div class=\"expo-meta-item\">\r\n            <span>Recinto<\/span>\r\n            <strong>Caja M\u00e1gica \u00b7 Madrid<\/strong>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"expo-top-actions\">\r\n          <button type=\"button\" class=\"expo-btn expo-btn-primary\" id=\"expoLocateBtn\">Localizar este stand<\/button>\r\n          <button type=\"button\" class=\"expo-btn expo-btn-dark\" id=\"expoOpenPlanBtnTop\">Ver plano ampliado<\/button>\r\n          <button type=\"button\" class=\"expo-btn expo-btn-light\" id=\"expoShareBtn\">Compartir ubicaci\u00f3n<\/button>\r\n          <a class=\"expo-btn expo-btn-light\" href=\"#\" id=\"expoGeneralPlanLink\">Ver plano general<\/a>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"expo-top-stand\">\r\n        <span>STAND<\/span>\r\n        <strong id=\"expoTopStandBig\">\u2014<\/strong>\r\n        <small>ZONA 1<\/small>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <section class=\"expo-map-panel\" id=\"expoMapPanel\">\r\n      <div class=\"expo-map-toolbar\">\r\n        <div class=\"expo-toolbar-copy\">\r\n          <strong>Plano del recinto<\/strong>\r\n          <span>Desliza el plano, usa el zoom o pulsa sobre un punto para ver el expositor.<\/span>\r\n        <\/div>\r\n\r\n        <div class=\"expo-toolbar-actions\">\r\n          <button type=\"button\" class=\"expo-btn expo-btn-primary expo-btn-open-plan\" id=\"expoPlanOnlyOpen\">Ver solo plano<\/button>\r\n          <button type=\"button\" class=\"expo-btn expo-btn-light expo-btn-close-plan\" id=\"expoPlanOnlyClose\">Cerrar<\/button>\r\n\r\n          <div class=\"expo-zoom\">\r\n            <button type=\"button\" id=\"expoZoomOut\" aria-label=\"Alejar plano\">\u2212<\/button>\r\n            <button type=\"button\" class=\"expo-zoom-level\" id=\"expoZoomReset\" aria-label=\"Restablecer zoom\">100%<\/button>\r\n            <button type=\"button\" id=\"expoZoomIn\" aria-label=\"Acercar plano\">+<\/button>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"expo-map-scroll\" id=\"expoMapScroll\">\r\n        <div class=\"expo-map-stage\" id=\"expoMapStage\">\r\n          <svg class=\"expo-connectors\" id=\"expoConnectorSvg\" aria-hidden=\"true\">\r\n            <path id=\"expoConnectorPath\" d=\"\"><\/path>\r\n          <\/svg>\r\n\r\n          <div class=\"expo-callouts\" id=\"expoCallouts\"><\/div>\r\n\r\n          <div class=\"expo-map-canvas\" id=\"expoMapCanvas\">\r\n            <img decoding=\"async\"\r\n              src=\"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/Z1-5.0-scaled.png\"\r\n              class=\"expo-main-map\"\r\n              id=\"expoMapImage\"\r\n            >\r\n            <div class=\"expo-overlay\" id=\"expoOverlay\"><\/div>\r\n            <div class=\"expo-markers\" id=\"expoMarkers\"><\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"expo-map-note\">\r\n        <p>\u2022 En el plano figuran expositores con participaci\u00f3n ya confirmada, as\u00ed como otros en proceso de confirmaci\u00f3n.<\/p>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <section class=\"expo-list-panel\" id=\"expoListPanel\">\r\n      <div class=\"expo-list-head\">\r\n        <div>\r\n          <h3>Expositores<\/h3>\r\n          <p>Busque un expositor y pulse sobre su ficha para ver su ubicaci\u00f3n y destacar su stand en el plano.<\/p>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"expo-list-toggle-row\">\r\n        <span>Listado de expositores<\/span>\r\n        <button type=\"button\" class=\"expo-list-toggle\" id=\"expoListToggle\" aria-expanded=\"false\">\r\n          <span class=\"expo-list-toggle-text\" id=\"expoListToggleText\">Ver expositores<\/span>\r\n          <span class=\"expo-list-toggle-arrow\">\u2304<\/span>\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <div class=\"expo-list-content\" id=\"expoListContent\">\r\n        <div class=\"expo-search\">\r\n          <input type=\"text\" id=\"expoSearch\" placeholder=\"Buscar expositor o stand...\" autocomplete=\"off\">\r\n        <\/div>\r\n\r\n        <div class=\"expo-cards\" id=\"expoList\"><\/div>\r\n      <\/div>\r\n    <\/section>\r\n  <\/div>\r\n<\/section>\r\n\r\n<script>\r\n(function(){\r\n  const REF_W = 2048;\r\n  const REF_H = 535;\r\n\r\n  function rectPx(x1, y1, x2, y2, options = {}) {\r\n    const w = x2 - x1;\r\n    const h = y2 - y1;\r\n    const markerX = typeof options.markerX === \"number\" ? options.markerX : (x1 + w \/ 2);\r\n    const markerY = typeof options.markerY === \"number\" ? options.markerY : (y1 + h \/ 2);\r\n\r\n    return {\r\n      x: (x1 \/ REF_W) * 100,\r\n      y: (y1 \/ REF_H) * 100,\r\n      w: (w \/ REF_W) * 100,\r\n      h: (h \/ REF_H) * 100,\r\n      markerX: (markerX \/ REF_W) * 100,\r\n      markerY: (markerY \/ REF_H) * 100,\r\n      marker: options.marker !== false\r\n    };\r\n  }\r\n\r\n  \/* ============================================================\r\n     COORDENADAS \u00b7 ZONA 1 \u00b7 Z1-scaled.jpg \u00b7 2048 \u00d7 535 px\r\n     Ajustadas al plano facilitado el 18\/09\/2026.\r\n     ============================================================ *\/\r\n  const standPositions = {\r\n    \/* Per\u00edmetro superior *\/\r\n    \"A01\": rectPx(84, 54, 137, 96),\r\n    \"A01 \": rectPx(24, 54, 137, 296),\r\n    \"A05\": rectPx(434, 54, 544, 96),\r\n    \"A06\": rectPx(642, 54, 752, 96),\r\n    \"A07\": rectPx(850, 54, 960, 96),\r\n    \"A08\": rectPx(1056, 54, 1168, 96),\r\n    \"A09\": rectPx(1265, 54, 1377, 96),\r\n    \"A10\": rectPx(1476, 54, 1584, 96),\r\n    \"A12\": rectPx(1788, 54, 1858, 96),\r\n    \"A13\": rectPx(1858, 54, 1955, 96),\r\n    \"A11\": rectPx(1889, 54, 1584, 96),\r\n\r\n    \/* Bloque central superior *\/\r\n    \"A02\": rectPx(169, 135, 233, 020),\r\n    \"A33\": rectPx(144, 135, 233, 223),\r\n    \"A32\": rectPx(233, 135, 320, 223),\r\n    \"A30\": rectPx(405, 135, 493, 179),\r\n    \"A29\": rectPx(493, 135, 580, 223),\r\n    \"A28\": rectPx(621, 135, 709, 223),\r\n    \"A27\": rectPx(709, 155, 838, 223),\r\n    \"A24\": rectPx(881, 135, 969, 223),\r\n    \"A23\": rectPx(969, 135, 1055, 179),\r\n    \"A22\": rectPx(1055, 135, 1141, 179),\r\n    \"A21\": rectPx(1141, 135, 1229, 179),\r\n    \"A19\": rectPx(1315, 135, 1402, 223),\r\n    \"A18\": rectPx(1443, 135, 1531, 223),\r\n    \"A15\": rectPx(1661, 135, 1747, 223),\r\n    \"A17\": rectPx(2601, 135, 547, 183),\r\n    \"A14\": rectPx(1747, 135, 1834, 223),\r\n    \"A20\": rectPx(1145, 135, 1402, 223),\r\n    \"A16\": rectPx(1531, 135, 1747, 223),\r\n    \"B25\": rectPx(2441, 135, 747, 263),\r\n    \"B23\": rectPx(2601, 135, 547, 263),\r\n    \"A31\": rectPx(325, 135, 403, 219),\r\n    \"A16\": rectPx(2731, 135, 547, 183),\r\n    \"B25\": rectPx(2731, 135, 547, 265),\r\n    \r\n\r\n    \/* Substands dentro del bloque central *\/\r\n    \"B04\": rectPx(318, 179, 362, 223),\r\n    \"B05\": rectPx(362, 179, 406, 223),\r\n    \"B06\": rectPx(406, 179, 449, 223),\r\n    \"B07\": rectPx(449, 179, 493, 223),\r\n    \"B14\": rectPx(969, 179, 1055, 223),\r\n    \"B16\": rectPx(1055, 179, 1141, 223),\r\n    \"B20\": rectPx(1185, 179, 1229, 223),\r\n    \"B12\": rectPx(975, 279, 991, 310),\r\n    \"B17\": rectPx(1145, 279, 991, 310),\r\n    \"A25\": rectPx(1229, 179, 493, 183),\r\n\r\n    \/* Fila inferior \/ per\u00edmetro *\/\r\n    \"B01\": rectPx(36, 430, 125, 199),\r\n    \"B02\": rectPx(171, 270, 248, 321),\r\n    \"B22\": rectPx(2318, 270, 248, 321),\r\n    \"B18\": rectPx(2078, 270, 248, 135),\r\n    \"B03\": rectPx(294, 270, 361, 321),\r\n    \"B09\": rectPx(705, 270, 751, 321),\r\n    \"B11\": rectPx(796, 270, 841, 321),\r\n    \"B19\": rectPx(1200, 270, 1250, 321),\r\n    \"B24\": rectPx(1534, 270, 1610, 321),\r\n    \"B26 \": rectPx(3210, 270, 134, 321),\r\n    \"B28\": rectPx(1912, 288, 1958, 344),\r\n    \"B29\": rectPx(1911, 420, 1958, 474),\r\n    \"B30\": rectPx(57, 420, 125, 474),\r\n    \"B08\": rectPx(651, 270, 248, 321),\r\n    \"B10\": rectPx(859, 370, 691, 221),\r\n    \"B26\": rectPx(2870, 270, 534, 321),\r\n   \r\n  };\r\n\r\n  \/* ============================================================\r\n     EXPOSITORES \u00b7 BLOQUE F\u00c1CIL DE EDITAR\r\n     ------------------------------------------------------------\r\n     PARA CAMBIAR UN EXPOSITOR SOLO MODIFICA SU L\u00cdNEA:\r\n\r\n     expositor(\"NOMBRE\", \"STAND QUE SE MUESTRA\", [\"UBICACION EN PLANO\"], \"URL DEL LOGO\"),\r\n\r\n     EJEMPLOS:\r\n     - Un solo stand:\r\n       expositor(\"EMPRESA\", \"B05\", [\"B05\"], \"https:\/\/...logo.jpg\"),\r\n\r\n     - Dos stands:\r\n       expositor(\"EMPRESA\", \"B27 \u00b7 B28\", [\"B27\",\"B28\"], \"https:\/\/...logo.jpg\"),\r\n\r\n     - Si cambias una empresa de lugar, cambia SOLO el stand visible\r\n       y la ubicaci\u00f3n entre corchetes.\r\n     ============================================================ *\/\r\n\r\n  function expositor(nombre, standVisible, ubicaciones, logoUrl){\r\n    return {\r\n      name: nombre,\r\n      stand: standVisible,\r\n      stands: ubicaciones,\r\n      logo: logoUrl\r\n    };\r\n  }\r\n\r\n\r\n  const exhibitors = [\r\n    \/\/ NOMBRE | STAND VISIBLE | UBICACI\u00d3N EN EL PLANO | LOGO\r\n    expositor(\"Reservado\", \"B29\", [\"B29\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/Reservado-scaled.png\"),\r\n     expositor(\"H50 Digital - UFP Industries\", \"B28\", [\"B28\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/UFP-Industries-H50-Digital-1.jpg\"),\r\n    expositor(\"Reservado \", \"B25\", [\"B25\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/Reservado-scaled.png\"),\r\n    expositor(\"5.11\", \"A01\", [\"A01\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/5.11.jpg\"),\r\n    expositor(\"5.11\", \"A01\", [\"A01 \"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/5.11.jpg\"),\r\n    expositor(\"SEA\", \"A25\", [\"A25\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/SEA-Gmbh.jpg\"),\r\n     expositor(\"Asociaci\u00f3n Profesional de Detectives Privados de Espa\u00f1a.\", \"B17\", [\"B17\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/apdpe.jpg\"),\r\n    expositor(\"ACRE\", \"A11\", [\"A11\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/acre.jpg\"),\r\n    expositor(\"Teyde\", \"A31\", [\"A31\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/07\/Teyde.jpg\"),\r\n     expositor(\"Audio-Bus\", \"B23\", [\"B23\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/Audio-Bus.jpg\"),\r\n     expositor(\"JI CERRAJEROS \", \"B10\", [\"B10\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/APERTURAS-EN-INTERVENCION.jpg\"),\r\n    expositor(\"LEATHERMAN\", \"A16\", [\"A16\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/LEATHERMAN.jpg\"),\r\n    expositor(\"Aicor UAS\", \"A22\", [\"A22\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/Aicor-UAS.jpg\"),\r\n    expositor(\"Martinez Albainox\", \"B12\", [\"B12\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/Martinez-Albainox.jpg\"),\r\n    expositor(\"AJPNE \/ C1B3R Prote\", \"B30\", [\"B30\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/AJPNE-C1B3RProtec-1.jpg\"),\r\n    expositor(\"Reservado   \", \"B24\", [\"B24\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/Reservado-scaled.png\"),\r\n    expositor(\"Magnum\", \"A20\", [\"A20\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/Magnum.jpg\"),\r\n    expositor(\"Astron International\", \"A02\", [\"A02\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/08\/Astron-International.jpg\"),\r\n    expositor(\"SoftGuard\", \"B08\", [\"B08\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/SoftGuard.jpg\"),\r\n    expositor(\"NWFORM\", \"B22\", [\"B22\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/NWFORM.jpg\"),\r\n    expositor(\"BONOWI\", \"B18\", [\"B18\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/Bonowi.jpg\"),\r\n    expositor(\"BORCHERS\", \"A33\", [\"A33\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/borchest.jpg\"),\r\n    expositor(\"TCH-SPAIN\", \"A32\", [\"A32\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/TCH-SPAIN.jpg\"),\r\n    expositor(\"FES \", \"B07\", [\"B07\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/07\/FES.jpg\"),\r\n    expositor(\"Sala de reuniones (FES)\", \"A30\", [\"A30\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/07\/FES.jpg\"),\r\n    expositor(\"F E S\", \"B06\", [\"B06\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/07\/FES.jpg\"),\r\n    expositor(\"FES\", \"B03\", [\"B03\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/07\/FES.jpg\"),\r\n    expositor(\"ALAS\", \"B01\", [\"B01\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/07\/ALAS.jpg\"),\r\n    expositor(\"Technical Uniforms\", \"A27\", [\"A27\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/Technical-uniforms.jpg\"),\r\n    expositor(\"Reservado  \", \"A28\", [\"A28\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/Reservado-scaled.png\"),\r\n    expositor(\"BARRAGUN\", \"A29\", [\"A29\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/barragun.jpg\"),\r\n    expositor(\"Alianza por la Seguridad Ciudadana\", \"A05\", [\"A05\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/ASC.jpg\"),\r\n\r\n    expositor(\"FacetBox\", \"B09\", [\"B09\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/Facebox.jpg\"),\r\n    expositor(\"VIVEST IB\u00c9RICA\", \"B11\", [\"B11\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/VIVEST.jpg\"),\r\n    expositor(\"Delhaze\", \"A24\", [\"A24\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/07\/DELHAZE-Ltd.jpg\"),\r\n    expositor(\"SUP\", \"A08\", [\"A08\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/SUP.jpg\"),\r\n    expositor(\"JUPOL\", \"A06\", [\"A06\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/Jupol.jpg\"),\r\n    expositor(\"Guardia Civil\", \"A14\", [\"A14\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/Guardia-Civil.jpg\"),\r\n    expositor(\"El Cald\u00e9n\", \"A18\", [\"A18\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/EL-CALDEN.jpg\"),\r\n    expositor(\"Satara\", \"A15\", [\"A15\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/satara.jpg\"),\r\n    expositor(\"UNIJEPOL\", \"A07\", [\"A07\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/unijepol.jpg\"),\r\n    expositor(\"Sasegur\", \"A10\", [\"A10\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/Sasegur.jpg\"),\r\n    expositor(\"IPA\", \"A09\", [\"A09\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/IPA.jpg\"),\r\n    expositor(\"OMIL\", \"A23\", [\"A23\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/OMIL.jpg\"),\r\n    expositor(\"LENOX\", \"B14\", [\"B14\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/Lenox.jpg\"),\r\n\r\n    expositor(\"PLAESA\", \"B16\", [\"B16\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/PLAESA.jpg\"),\r\n    expositor(\"OSSTAN\", \"A21\", [\"A21\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/OSSTAN.jpg\"),\r\n    expositor(\"ROAL\", \"A19\", [\"A19\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/Roal.jpg\"),\r\n    expositor(\"LEDLENSER\", \"B20\", [\"B20\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/ledlenser.jpg\"),\r\n    expositor(\"ANEEL\", \"B19\", [\"B19\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/Aneel-Escudos-y-Bordados.jpg\"),\r\n    expositor(\"DEPOL\", \"B26\", [\"B26\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/DEPOL.jpg\"),\r\n    expositor(\"GEOPOL\", \"B26\", [\"B26 \"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/GEOPOL.jpg\"),\r\n    expositor(\"Polic\u00eda Nacional\", \"A12 \u00b7 A13\", [\"A12\",\"A13\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/Policia-Nacional-200.jpg\")\r\n  ];\r\n\r\n  const root = document.getElementById(\"expoHzRoot\");\r\n  const topCard = document.getElementById(\"expoTopCard\");\r\n  const topToggle = document.getElementById(\"expoTopToggle\");\r\n  const topToggleText = document.getElementById(\"expoTopToggleText\");\r\n  const topToggleName = document.getElementById(\"expoTopToggleName\");\r\n  const topToggleStand = document.getElementById(\"expoTopToggleStand\");\r\n  const topLogo = document.getElementById(\"expoTopLogo\");\r\n  const topTitle = document.getElementById(\"expoTopTitle\");\r\n  const topIntro = document.getElementById(\"expoTopIntro\");\r\n  const topStandMeta = document.getElementById(\"expoTopStandMeta\");\r\n  const topStandBig = document.getElementById(\"expoTopStandBig\");\r\n  const locateBtn = document.getElementById(\"expoLocateBtn\");\r\n  const openPlanBtnTop = document.getElementById(\"expoOpenPlanBtnTop\");\r\n  const shareBtn = document.getElementById(\"expoShareBtn\");\r\n  const generalPlanLink = document.getElementById(\"expoGeneralPlanLink\");\r\n\r\n  const mapPanel = document.getElementById(\"expoMapPanel\");\r\n  const mapScroll = document.getElementById(\"expoMapScroll\");\r\n  const mapStage = document.getElementById(\"expoMapStage\");\r\n  const mapImage = document.getElementById(\"expoMapImage\");\r\n  const overlay = document.getElementById(\"expoOverlay\");\r\n  const markers = document.getElementById(\"expoMarkers\");\r\n  const callouts = document.getElementById(\"expoCallouts\");\r\n  const connectorSvg = document.getElementById(\"expoConnectorSvg\");\r\n  const connectorPath = document.getElementById(\"expoConnectorPath\");\r\n\r\n  const search = document.getElementById(\"expoSearch\");\r\n  const list = document.getElementById(\"expoList\")\r\n  const listPanel = document.getElementById(\"expoListPanel\");\r\n  const listToggle = document.getElementById(\"expoListToggle\");\r\n  const listToggleText = document.getElementById(\"expoListToggleText\");\r\n\r\n  const zoomOut = document.getElementById(\"expoZoomOut\");\r\n  const zoomIn = document.getElementById(\"expoZoomIn\");\r\n  const zoomReset = document.getElementById(\"expoZoomReset\");\r\n  const planOnlyOpen = document.getElementById(\"expoPlanOnlyOpen\");\r\n  const planOnlyClose = document.getElementById(\"expoPlanOnlyClose\");\r\n  \r\n  generalPlanLink.href = window.location.origin + window.location.pathname;\r\n\r\n  let activeName = null;\r\n  let pinnedName = null;\r\n  let currentItem = null;\r\n  let planOnlyMode = false;\r\n\r\n  const MIN_ZOOM = 0.45;\r\n  const MAX_ZOOM = 4;\r\n  const STEP_ZOOM = 0.10;\r\n  const MOBILE_BREAKPOINT = 600;\r\n  const MOBILE_DEFAULT_ZOOM = 2.10;\r\n  const DESKTOP_DEFAULT_ZOOM = 1.00;\r\n  const PLAN_ONLY_MOBILE_ZOOM = 2.10;\r\n  const PLAN_ONLY_DESKTOP_ZOOM = 1.00;\r\n  let zoom = 1;\r\n\r\n  function isMobile(){ return window.innerWidth <= MOBILE_BREAKPOINT; }\r\n  function getDefaultZoom(){ return isMobile() ? MOBILE_DEFAULT_ZOOM : DESKTOP_DEFAULT_ZOOM; }\r\n  function getPlanOnlyZoom(){ return isMobile() ? PLAN_ONLY_MOBILE_ZOOM : PLAN_ONLY_DESKTOP_ZOOM; }\r\n  function clampZoom(v){ return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, v)); }\r\n  function updateZoomControls(){\r\n    const pct = Math.round(zoom * 100);\r\n    zoomReset.textContent = pct + \"%\";\r\n    zoomOut.disabled = zoom <= MIN_ZOOM + .001;\r\n    zoomIn.disabled = zoom >= MAX_ZOOM - .001;\r\n  }\r\n  function applyZoom(nextZoom, focalPoint){\r\n    const newZoom = clampZoom(nextZoom);\r\n    if (Math.abs(newZoom - zoom) < .001) return;\r\n\r\n    const oldWidth = mapStage.offsetWidth || 1;\r\n    const oldHeight = mapStage.offsetHeight || 1;\r\n    const focusX = focalPoint && typeof focalPoint.x === \"number\" ? focalPoint.x : mapScroll.clientWidth \/ 2;\r\n    const focusY = focalPoint && typeof focalPoint.y === \"number\" ? focalPoint.y : mapScroll.clientHeight \/ 2;\r\n    const ratioX = (mapScroll.scrollLeft + focusX) \/ oldWidth;\r\n    const ratioY = (mapScroll.scrollTop + focusY) \/ oldHeight;\r\n\r\n    zoom = newZoom;\r\n    mapStage.style.width = zoom === 1 ? \"100%\" : (zoom * 100) + \"%\";\r\n    mapStage.style.marginLeft = zoom <= 1 ? \"auto\" : \"0\";\r\n    mapStage.style.marginRight = zoom <= 1 ? \"auto\" : \"0\";\r\n    updateZoomControls();\r\n\r\n    requestAnimationFrame(function(){\r\n      const newWidth = mapStage.offsetWidth || 1;\r\n      const newHeight = mapStage.offsetHeight || 1;\r\n      mapScroll.scrollLeft = Math.max(0, (ratioX * newWidth) - focusX);\r\n      mapScroll.scrollTop = Math.max(0, (ratioY * newHeight) - focusY);\r\n      if (activeName) requestAnimationFrame(drawConnector);\r\n    });\r\n  }\r\n  function resetZoom(target = getDefaultZoom()){\r\n    zoom = clampZoom(target);\r\n    mapStage.style.width = zoom === 1 ? \"100%\" : (zoom * 100) + \"%\";\r\n    mapStage.style.marginLeft = zoom <= 1 ? \"auto\" : \"0\";\r\n    mapStage.style.marginRight = zoom <= 1 ? \"auto\" : \"0\";\r\n    updateZoomControls();\r\n    requestAnimationFrame(function(){\r\n      mapScroll.scrollTop = 0;\r\n      mapScroll.scrollLeft = 0;\r\n      if (activeName) drawConnector();\r\n    });\r\n  }\r\n\r\n  function createFallbackLogo(name){\r\n    const safe = String(name || \"EXPOSITOR\").replace(\/[&<>\"']\/g,\"\").slice(0,24);\r\n    const svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"220\" height=\"120\" viewBox=\"0 0 220 120\">\r\n      <rect width=\"220\" height=\"120\" rx=\"14\" fill=\"#ffffff\"\/>\r\n      <rect x=\"2\" y=\"2\" width=\"216\" height=\"116\" rx=\"12\" fill=\"none\" stroke=\"#d8d8d8\" stroke-width=\"4\"\/>\r\n      <text x=\"110\" y=\"66\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\" font-size=\"18\" font-weight=\"700\" fill=\"#222\">${safe}<\/text>\r\n    <\/svg>`;\r\n    return \"data:image\/svg+xml;charset=UTF-8,\" + encodeURIComponent(svg);\r\n  }\r\n  function getLogo(item){ return item && item.logo ? item.logo : createFallbackLogo(item ? item.name : \"EXPOSITOR\"); }\r\n  function addFallback(img, name){\r\n    if (!img) return;\r\n    img.addEventListener(\"error\", function(){\r\n      if (this.dataset.fallbackApplied === \"1\") return;\r\n      this.dataset.fallbackApplied = \"1\";\r\n      this.src = createFallbackLogo(name);\r\n    });\r\n  }\r\n\r\n  function normalizeId(value){\r\n    return String(value || \"\")\r\n      .trim().toLowerCase().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\")\r\n      .replace(\/[^a-z0-9]+\/g, \"-\").replace(\/^-+|-+$\/g, \"\");\r\n  }\r\n  function exhibitorId(item){ return normalizeId(item.id || item.name || \"\"); }\r\n  function requestedId(){\r\n    try{\r\n      const hashRaw = String(window.location.hash || \"\").replace(\/^#\/, \"\");\r\n      if(hashRaw){\r\n        const params = new URLSearchParams(hashRaw);\r\n        const id = params.get(\"expositor\");\r\n        if(id) return normalizeId(id);\r\n        if(!hashRaw.includes(\"=\")) return normalizeId(hashRaw);\r\n      }\r\n      const params = new URLSearchParams(window.location.search);\r\n      return normalizeId(params.get(\"expositor\") || \"\");\r\n    }catch(e){ return \"\"; }\r\n  }\r\n  function updateUrl(item){\r\n    try{\r\n      const url = new URL(window.location.href);\r\n      url.searchParams.delete(\"expositor\");\r\n      url.hash = \"expositor=\" + encodeURIComponent(exhibitorId(item));\r\n      window.history.replaceState({}, \"\", url.toString());\r\n    }catch(e){}\r\n  }\r\n\r\n  function getStandRects(id){\r\n    const v = standPositions[id];\r\n    if(!v) return [];\r\n    return Array.isArray(v) ? v : [v];\r\n  }\r\n  function getAllRects(item){\r\n    return (item.stands || []).flatMap(function(standId){\r\n      return getStandRects(standId).map(function(pos){\r\n        return Object.assign({}, pos, { standId: standId });\r\n      });\r\n    });\r\n  }\r\n  function getMarkerPositions(item){\r\n    const out = [];\r\n    (item.stands || []).forEach(function(standId){\r\n      const rect = getStandRects(standId).find(function(r){ return r.marker !== false; });\r\n      if(rect){\r\n        out.push({ standId: standId, markerX: rect.markerX, markerY: rect.markerY });\r\n      }\r\n    });\r\n    return out;\r\n  }\r\n  function getAverageMarker(item){\r\n    const pts = getMarkerPositions(item);\r\n    if(!pts.length) return {x:50,y:50};\r\n    return {\r\n      x: pts.reduce((s,p) => s + p.markerX, 0) \/ pts.length,\r\n      y: pts.reduce((s,p) => s + p.markerY, 0) \/ pts.length\r\n    };\r\n  }\r\n  function clampPct(value, min, max){ return Math.max(min, Math.min(max, value)); }\r\n  function getCalloutPosition(item){\r\n    const avg = getAverageMarker(item);\r\n    let x = avg.x;\r\n    let y = avg.y - 8;\r\n    if (avg.x < 13) x = avg.x + 8;\r\n    if (avg.x > 87) x = avg.x - 8;\r\n    if (avg.y < 14) y = avg.y + 8;\r\n    return {\r\n      x: clampPct(x, 10, 90),\r\n      y: clampPct(y, 9, 90)\r\n    };\r\n  }\r\n\r\n  function setTopCardOpen(open){\r\n    topCard.classList.toggle(\"expo-top-collapsed\", !open);\r\n    topToggle.setAttribute(\"aria-expanded\", String(open));\r\n    topToggleText.textContent = open ? \"Ocultar ficha del expositor\" : \"Ver ficha del expositor\";\r\n  }\r\n\r\n  function setListOpen(open){\r\n    listPanel.classList.toggle(\"open\", open);\r\n    listToggle.setAttribute(\"aria-expanded\", String(open));\r\n    listToggleText.textContent = open ? \"Ocultar expositores\" : \"Ver expositores\";\r\n  }\r\n\r\n  function renderList(filter = \"\"){\r\n    list.innerHTML = \"\";\r\n    const f = filter.trim().toLowerCase();\r\n    const filtered = exhibitors.filter(function(item){\r\n      return [item.name, item.stand].concat(item.stands || []).join(\" \").toLowerCase().includes(f);\r\n    });\r\n\r\n    if(!filtered.length){\r\n      list.innerHTML = '<div class=\"expo-empty\">No se encontraron expositores.<\/div>';\r\n      return;\r\n    }\r\n\r\n    filtered.forEach(function(item){\r\n      const card = document.createElement(\"div\");\r\n      card.className = \"expo-card\";\r\n      card.dataset.name = item.name;\r\n      card.setAttribute(\"tabindex\",\"0\");\r\n      card.setAttribute(\"role\",\"button\");\r\n      card.setAttribute(\"aria-label\", item.name + \", stand \" + item.stand);\r\n      card.innerHTML = `\r\n        <img decoding=\"async\" src=\"${getLogo(item)}\" alt=\"${item.name}\">\r\n        <div class=\"expo-card-info\">\r\n          <strong>${item.name}<\/strong>\r\n          <span>Stand ${item.stand}<\/span>\r\n        <\/div>\r\n        <div class=\"expo-badge\">${item.stand}<\/div>\r\n      `;\r\n      addFallback(card.querySelector(\"img\"), item.name);\r\n      card.addEventListener(\"mouseenter\", function(){ showExhibitor(item.name, false); });\r\n      card.addEventListener(\"focus\", function(){ showExhibitor(item.name, false); });\r\n      card.addEventListener(\"click\", function(e){\r\n        e.preventDefault();\r\n        openExhibitor(item, true);\r\n      });\r\n      card.addEventListener(\"keydown\", function(e){\r\n        if(e.key === \"Enter\" || e.key === \" \"){\r\n          e.preventDefault();\r\n          openExhibitor(item, true);\r\n        }\r\n      });\r\n      list.appendChild(card);\r\n    });\r\n\r\n    updateActiveClasses();\r\n  }\r\n\r\n  function renderMapElements(){\r\n    markers.innerHTML = \"\";\r\n    callouts.innerHTML = \"\";\r\n\r\n    exhibitors.forEach(function(item){\r\n      const markerPositions = getMarkerPositions(item);\r\n\r\n      markerPositions.forEach(function(p){\r\n        const marker = document.createElement(\"button\");\r\n        marker.type = \"button\";\r\n        marker.className = \"expo-marker\";\r\n        marker.dataset.name = item.name;\r\n        marker.dataset.stand = p.standId;\r\n        marker.style.left = p.markerX + \"%\";\r\n        marker.style.top = p.markerY + \"%\";\r\n        marker.setAttribute(\"aria-label\", item.name + \" - Stand \" + p.standId);\r\n        marker.setAttribute(\"title\", item.name + \" - Stand \" + p.standId);\r\n        marker.addEventListener(\"mouseenter\", function(){ showExhibitor(item.name, false); });\r\n        marker.addEventListener(\"focus\", function(){ showExhibitor(item.name, false); });\r\n        marker.addEventListener(\"click\", function(e){\r\n          e.preventDefault();\r\n          e.stopPropagation();\r\n          openExhibitor(item, true);\r\n        });\r\n        markers.appendChild(marker);\r\n      });\r\n\r\n      const c = document.createElement(\"div\");\r\n      const pos = getCalloutPosition(item);\r\n      c.className = \"expo-callout\";\r\n      c.dataset.name = item.name;\r\n      c.style.left = pos.x + \"%\";\r\n      c.style.top = pos.y + \"%\";\r\n      c.setAttribute(\"tabindex\", \"0\");\r\n      c.setAttribute(\"role\", \"button\");\r\n      c.setAttribute(\"aria-label\", \"Ver ubicaci\u00f3n de \" + item.name + \", stand \" + item.stand);\r\n      c.innerHTML = `\r\n        <img decoding=\"async\" src=\"${getLogo(item)}\" alt=\"${item.name}\">\r\n        <div class=\"expo-callout-info\">\r\n          <strong>${item.name}<\/strong>\r\n          <span>Stand ${item.stand}<\/span>\r\n        <\/div>\r\n      `;\r\n      addFallback(c.querySelector(\"img\"), item.name);\r\n      c.addEventListener(\"mouseenter\", function(){ showExhibitor(item.name, false); });\r\n      c.addEventListener(\"click\", function(e){\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n        openExhibitor(item, true);\r\n      });\r\n      c.addEventListener(\"keydown\", function(e){\r\n        if(e.key === \"Enter\" || e.key === \" \"){\r\n          e.preventDefault();\r\n          openExhibitor(item, true);\r\n        }\r\n      });\r\n      callouts.appendChild(c);\r\n    });\r\n  }\r\n\r\n  function updateActiveClasses(){\r\n    document.querySelectorAll(\".expo-card\").forEach(function(el){\r\n      el.classList.toggle(\"active\", el.dataset.name === activeName);\r\n    });\r\n    document.querySelectorAll(\".expo-marker\").forEach(function(el){\r\n      el.classList.toggle(\"active\", el.dataset.name === activeName);\r\n    });\r\n    document.querySelectorAll(\".expo-callout\").forEach(function(el){\r\n      el.classList.toggle(\"visible\", el.dataset.name === activeName);\r\n    });\r\n  }\r\n\r\n  function renderHighlight(item){\r\n    overlay.innerHTML = \"\";\r\n    getAllRects(item).forEach(function(pos){\r\n      const h = document.createElement(\"div\");\r\n      h.className = \"expo-stand-highlight\";\r\n      h.style.left = pos.x + \"%\";\r\n      h.style.top = pos.y + \"%\";\r\n      h.style.width = pos.w + \"%\";\r\n      h.style.height = pos.h + \"%\";\r\n      overlay.appendChild(h);\r\n    });\r\n  }\r\n\r\n  function getConnectorEnd(calloutRect, stageRect, startX, startY){\r\n    const centerX = calloutRect.left - stageRect.left + calloutRect.width \/ 2;\r\n    const centerY = calloutRect.top - stageRect.top + calloutRect.height \/ 2;\r\n    const dx = startX - centerX;\r\n    const dy = startY - centerY;\r\n    let endX = centerX;\r\n    let endY = centerY;\r\n\r\n    if (Math.abs(dx \/ calloutRect.width) > Math.abs(dy \/ calloutRect.height)) {\r\n      endX = dx < 0 ? calloutRect.left - stageRect.left : calloutRect.right - stageRect.left;\r\n    } else {\r\n      endY = dy < 0 ? calloutRect.top - stageRect.top : calloutRect.bottom - stageRect.top;\r\n    }\r\n    return { endX, endY };\r\n  }\r\n\r\n  function drawConnector(){\r\n    connectorPath.classList.remove(\"visible\");\r\n    connectorPath.setAttribute(\"d\", \"\");\r\n    if(!activeName) return;\r\n\r\n    const itemMarkers = Array.from(markers.children).filter(el => el.dataset.name === activeName);\r\n    const callout = Array.from(callouts.children).find(el => el.dataset.name === activeName);\r\n    if(!itemMarkers.length || !callout) return;\r\n\r\n    const stageRect = mapStage.getBoundingClientRect();\r\n    const calloutRect = callout.getBoundingClientRect();\r\n    const paths = [];\r\n\r\n    itemMarkers.forEach(function(marker){\r\n      const mRect = marker.getBoundingClientRect();\r\n      const startX = mRect.left - stageRect.left + mRect.width \/ 2;\r\n      const startY = mRect.top - stageRect.top + mRect.height \/ 2;\r\n      const end = getConnectorEnd(calloutRect, stageRect, startX, startY);\r\n      const midY = startY + (end.endY - startY) * 0.52;\r\n      paths.push([\r\n        \"M\", startX.toFixed(2), startY.toFixed(2),\r\n        \"L\", startX.toFixed(2), midY.toFixed(2),\r\n        \"L\", end.endX.toFixed(2), midY.toFixed(2),\r\n        \"L\", end.endX.toFixed(2), end.endY.toFixed(2)\r\n      ].join(\" \"));\r\n    });\r\n\r\n    connectorSvg.setAttribute(\"viewBox\", `0 0 ${mapStage.clientWidth} ${mapStage.clientHeight}`);\r\n    connectorPath.setAttribute(\"d\", paths.join(\" \"));\r\n    requestAnimationFrame(function(){ connectorPath.classList.add(\"visible\"); });\r\n  }\r\n\r\n  function updateTopCard(item){\r\n    currentItem = item;\r\n    topTitle.textContent = item ? item.name : \"Seleccione un expositor\";\r\n    topIntro.textContent = item\r\n      ? \"Esta es la ubicaci\u00f3n asignada a este expositor. En el plano encontrar\u00e1 su stand destacado para localizarlo de forma r\u00e1pida y sencilla dentro del recinto.\"\r\n      : \"Puede localizar un expositor desde el plano o desde el desplegable inferior. Cuando seleccione uno, aqu\u00ed ver\u00e1 su informaci\u00f3n y su stand asignado.\";\r\n    topStandMeta.textContent = item ? item.stand : \"\u2014\";\r\n    topStandBig.textContent = item ? item.stand : \"\u2014\";\r\n    topToggleName.textContent = item ? item.name : \"\";\r\n    topToggleStand.textContent = item ? \"\u00b7 Stand \" + item.stand : \"\";\r\n    topLogo.dataset.fallbackApplied = \"0\";\r\n    topLogo.src = item ? getLogo(item) : createFallbackLogo(\"EXPOSITOR\");\r\n    topLogo.alt = item ? \"Logo de \" + item.name : \"Logo del expositor\";\r\n    addFallback(topLogo, item ? item.name : \"EXPOSITOR\");\r\n  }\r\n\r\n  function showExhibitor(name, shouldPin){\r\n    const item = exhibitors.find(e => e.name === name);\r\n    if(!item) return;\r\n    activeName = name;\r\n    if(shouldPin) pinnedName = name;\r\n    renderHighlight(item);\r\n    updateActiveClasses();\r\n    requestAnimationFrame(drawConnector);\r\n  }\r\n\r\n  function clearSelection(){\r\n    activeName = null;\r\n    pinnedName = null;\r\n    overlay.innerHTML = \"\";\r\n    connectorPath.classList.remove(\"visible\");\r\n    connectorPath.setAttribute(\"d\", \"\");\r\n    updateActiveClasses();\r\n  }\r\n\r\n  function focusOnExhibitor(item, keepZoom = false){\r\n    if(!item) return;\r\n    const avg = getAverageMarker(item);\r\n    if(!keepZoom){\r\n      const targetZoom = isMobile() ? 2.10 : 1.08;\r\n      if(Math.abs(zoom - targetZoom) > .001){\r\n        zoom = clampZoom(targetZoom);\r\n        mapStage.style.width = zoom === 1 ? \"100%\" : (zoom * 100) + \"%\";\r\n        mapStage.style.marginLeft = zoom <= 1 ? \"auto\" : \"0\";\r\n        mapStage.style.marginRight = zoom <= 1 ? \"auto\" : \"0\";\r\n        updateZoomControls();\r\n      }\r\n    }\r\n    requestAnimationFrame(function(){\r\n      const x = (avg.x \/ 100) * mapStage.offsetWidth;\r\n      const y = (avg.y \/ 100) * mapStage.offsetHeight;\r\n      mapScroll.scrollTo({\r\n        left: Math.max(0, x - mapScroll.clientWidth \/ 2),\r\n        top: Math.max(0, y - mapScroll.clientHeight \/ 2),\r\n        behavior: \"smooth\"\r\n      });\r\n      requestAnimationFrame(drawConnector);\r\n    });\r\n  }\r\n\r\n  function openExhibitor(item, updateHash){\r\n    updateTopCard(item);\r\n    setTopCardOpen(true);\r\n    showExhibitor(item.name, true);\r\n    setListOpen(true);\r\n    if(updateHash) updateUrl(item);\r\n    focusOnExhibitor(item);\r\n    topCard.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n  }\r\n\r\n  function shareCurrent(){\r\n    if(!currentItem) return;\r\n    const shareData = {\r\n      title: \"Ubicaci\u00f3n de \" + currentItem.name + \" \u00b7 Zona 1\",\r\n      text: currentItem.name + \" \u00b7 Stand \" + currentItem.stand + \" \u00b7 Zona 1\",\r\n      url: window.location.href\r\n    };\r\n    if(navigator.share){ navigator.share(shareData).catch(function(){}); return; }\r\n    if(navigator.clipboard && window.isSecureContext){ navigator.clipboard.writeText(window.location.href).then(function(){}); }\r\n  }\r\n\r\n  function openPlanOnly(){\r\n    if(planOnlyMode) return;\r\n    planOnlyMode = true;\r\n    mapPanel.classList.add(\"plan-only\");\r\n    document.body.classList.add(\"expo-lock\");\r\n    resetZoom(getPlanOnlyZoom());\r\n    setTimeout(function(){\r\n      if(activeName) drawConnector();\r\n      planOnlyClose.focus({preventScroll:true});\r\n    }, 40);\r\n  }\r\n  function closePlanOnly(){\r\n    if(!planOnlyMode) return;\r\n    planOnlyMode = false;\r\n    mapPanel.classList.remove(\"plan-only\");\r\n    document.body.classList.remove(\"expo-lock\");\r\n    resetZoom(getDefaultZoom());\r\n    setTimeout(function(){\r\n      if(activeName) drawConnector();\r\n      planOnlyOpen.focus({preventScroll:true});\r\n    }, 40);\r\n  }\r\n\r\n  let pinchStartDist = 0;\r\n  let pinchStartZoom = 1;\r\n  function touchDistance(t1, t2){\r\n    const dx = t2.clientX - t1.clientX;\r\n    const dy = t2.clientY - t1.clientY;\r\n    return Math.hypot(dx, dy);\r\n  }\r\n  function touchMid(t1, t2){\r\n    const rect = mapScroll.getBoundingClientRect();\r\n    return { x: ((t1.clientX + t2.clientX) \/ 2) - rect.left, y: ((t1.clientY + t2.clientY) \/ 2) - rect.top };\r\n  }\r\n\r\n  zoomOut.addEventListener(\"click\", () => applyZoom(zoom - STEP_ZOOM));\r\n  zoomIn.addEventListener(\"click\", () => applyZoom(zoom + STEP_ZOOM));\r\n  zoomReset.addEventListener(\"click\", () => resetZoom());\r\n  planOnlyOpen.addEventListener(\"click\", openPlanOnly);\r\n  planOnlyClose.addEventListener(\"click\", closePlanOnly);\r\n  openPlanBtnTop.addEventListener(\"click\", function(){\r\n    openPlanOnly();\r\n    if(currentItem) setTimeout(function(){ focusOnExhibitor(currentItem, true); }, 100);\r\n  });\r\n  locateBtn.addEventListener(\"click\", function(){\r\n    if(currentItem){\r\n      showExhibitor(currentItem.name, true);\r\n      focusOnExhibitor(currentItem);\r\n      mapPanel.scrollIntoView({behavior:\"smooth\", block:\"start\"});\r\n    }\r\n  });\r\n  shareBtn.addEventListener(\"click\", shareCurrent);\r\n  topToggle.addEventListener(\"click\", function(){\r\n    setTopCardOpen(topCard.classList.contains(\"expo-top-collapsed\"));\r\n  });\r\n\r\n  listToggle.addEventListener(\"click\", function(){\r\n    const open = !listPanel.classList.contains(\"open\");\r\n    setListOpen(open);\r\n  });\r\n\r\n  search.addEventListener(\"input\", function(){\r\n    if(!listPanel.classList.contains(\"open\")) setListOpen(true);\r\n    renderList(this.value);\r\n    if(!this.value.trim() && pinnedName){ showExhibitor(pinnedName, true); }\r\n    else if(this.value.trim() && activeName && !Array.from(list.children).some(el => el.dataset && el.dataset.name === activeName)){ clearSelection(); }\r\n  });\r\n\r\n  mapStage.addEventListener(\"mouseleave\", function(){ if(pinnedName){ showExhibitor(pinnedName, false); } });\r\n  mapStage.addEventListener(\"click\", function(e){\r\n    if(!e.target.closest(\".expo-marker\") && !e.target.closest(\".expo-callout\")){\r\n      clearSelection();\r\n    }\r\n  });\r\n  document.addEventListener(\"click\", function(e){ if(!root.contains(e.target) && !planOnlyMode) clearSelection(); });\r\n  document.addEventListener(\"keydown\", function(e){ if(e.key === \"Escape\" && planOnlyMode){ e.preventDefault(); closePlanOnly(); } });\r\n\r\n  mapScroll.addEventListener(\"touchstart\", function(e){\r\n    if(e.touches.length !== 2) return;\r\n    pinchStartDist = touchDistance(e.touches[0], e.touches[1]);\r\n    pinchStartZoom = zoom;\r\n  }, {passive:true});\r\n\r\n  mapScroll.addEventListener(\"touchmove\", function(e){\r\n    if(e.touches.length !== 2 || !pinchStartDist) return;\r\n    e.preventDefault();\r\n    const dist = touchDistance(e.touches[0], e.touches[1]);\r\n    const scale = dist \/ pinchStartDist;\r\n    applyZoom(pinchStartZoom * scale, touchMid(e.touches[0], e.touches[1]));\r\n  }, {passive:false});\r\n\r\n  mapScroll.addEventListener(\"touchend\", function(e){\r\n    if(e.touches.length < 2){ pinchStartDist = 0; pinchStartZoom = zoom; }\r\n  }, {passive:true});\r\n\r\n  window.addEventListener(\"resize\", function(){\r\n    if(!planOnlyMode) resetZoom(getDefaultZoom());\r\n    if(activeName) requestAnimationFrame(drawConnector);\r\n  });\r\n\r\n  window.addEventListener(\"hashchange\", function(){\r\n    const rid = requestedId();\r\n    if(!rid) return;\r\n    const item = exhibitors.find(ex => exhibitorId(ex) === rid);\r\n    if(item) openExhibitor(item, false);\r\n  });\r\n\r\n  mapImage.addEventListener(\"load\", function(){ if(activeName) requestAnimationFrame(drawConnector); });\r\n\r\n  renderList();\r\n  renderMapElements();\r\n  updateTopCard(null);\r\n  setTopCardOpen(false);\r\n  setListOpen(false);\r\n  resetZoom(getDefaultZoom());\r\n\r\n  const rid = requestedId();\r\n  if(rid){\r\n    const item = exhibitors.find(ex => exhibitorId(ex) === rid);\r\n    if(item){\r\n      openExhibitor(item, false);\r\n    }\r\n  }\r\n})();\r\n<\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-41d8173 e-con e-atomic-element e-flexbox-base e-default-div e-a61de63 \" data-id=\"41d8173\" data-element_type=\"e-flexbox\" data-e-type=\"e-flexbox\" data-interaction-id=\"41d8173\" data-e-type=\"e-flexbox\" data-id=\"41d8173\">\n    \t\t<div class=\"elementor-element elementor-element-d8dd3b2 elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"d8dd3b2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- EXPOSECURITY\u00ae \u00b7 ZONA 2 \u00b7 BLOQUE AISLADO -->\r\n<style>\r\n\r\n:root{\r\n  --expo-z2h-green:#5d7f2b;\r\n  --expo-z2h-green-dark:#405b1c;\r\n  --expo-z2h-bg:#f4f5f7;\r\n  --expo-z2h-card:#ffffff;\r\n  --expo-z2h-text:#111111;\r\n  --expo-z2h-muted:#666666;\r\n  --expo-z2h-line:#e7e7e7;\r\n  --expo-z2h-shadow:0 16px 38px rgba(0,0,0,.10);\r\n}\r\n.expo-z2h-hz,.expo-z2h-hz *{box-sizing:border-box}\r\nbody{margin:0;background:#fff;color:var(--expo-z2h-text);font-family:Arial,Helvetica,sans-serif}\r\n.expo-z2h-hz{\r\n  width:100% !important;\r\n  max-width:100% !important;\r\n  margin:0 auto;\r\n  padding:22px 0 42px;\r\n  overflow:hidden;\r\n}\r\n.expo-z2h-hz-inner{\r\n  width:min(100%, 1680px);\r\n  max-width:100%;\r\n  margin:0 auto;\r\n  padding:0 12px;\r\n}\r\n.expo-z2h-hz-header{\r\n  text-align:center;\r\n  margin-bottom:18px;\r\n}\r\n.expo-z2h-hz-header span{\r\n  display:inline-block;\r\n  font-size:13px;\r\n  font-weight:900;\r\n  letter-spacing:1.2px;\r\n  color:var(--expo-z2h-green);\r\n  text-transform:uppercase;\r\n  margin-bottom:8px;\r\n}\r\n.expo-z2h-hz-header h2{\r\n  margin:0;\r\n  font-size:clamp(28px, 4vw, 46px);\r\n  font-weight:900;\r\n  text-transform:uppercase;\r\n}\r\n.expo-z2h-hz-header p{\r\n  max-width:920px;\r\n  margin:12px auto 0;\r\n  color:var(--expo-z2h-muted);\r\n  line-height:1.6;\r\n  font-size:15px;\r\n}\r\n\r\n\r\n.expo-z2h-top-toggle-wrap{\r\n  width:100%;\r\n  margin-bottom:10px;\r\n}\r\n.expo-z2h-top-toggle{\r\n  width:100%;\r\n  min-height:48px;\r\n  border:1px solid rgba(93,127,43,.28);\r\n  border-radius:14px;\r\n  background:#f5f8f0;\r\n  color:var(--expo-z2h-green-dark);\r\n  padding:10px 15px;\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:space-between;\r\n  gap:12px;\r\n  cursor:pointer;\r\n  font-family:inherit;\r\n  font-size:13px;\r\n  font-weight:900;\r\n  text-align:left;\r\n}\r\n.expo-z2h-top-toggle:hover{background:#eef5e5;border-color:var(--expo-z2h-green)}\r\n.expo-z2h-top-toggle-copy{min-width:0;display:flex;align-items:center;gap:8px;flex-wrap:wrap}\r\n.expo-z2h-top-toggle-name{font-weight:900;color:#111}\r\n.expo-z2h-top-toggle-stand{font-size:11px;color:#666;font-weight:800}\r\n.expo-z2h-top-toggle-arrow{font-size:20px;line-height:1;transition:transform .2s ease;flex:0 0 auto}\r\n.expo-z2h-top-toggle[aria-expanded=\"true\"] .expo-z2h-top-toggle-arrow{transform:rotate(180deg)}\r\n.expo-z2h-top-card.expo-z2h-top-collapsed{display:none}\r\n\r\n.expo-z2h-top-card{\r\n  display:grid;\r\n  grid-template-columns:minmax(165px, 250px) minmax(0, 1fr) minmax(110px, 150px);\r\n  gap:18px;\r\n  align-items:center;\r\n  width:100%;\r\n  max-width:100%;\r\n  background:var(--expo-z2h-card);\r\n  border:1px solid rgba(0,0,0,.08);\r\n  border-radius:22px;\r\n  box-shadow:var(--expo-z2h-shadow);\r\n  padding:20px;\r\n  margin-bottom:18px;\r\n  position:relative;\r\n  overflow:hidden;\r\n}\r\n.expo-z2h-top-card::before{\r\n  content:\"\";\r\n  position:absolute;\r\n  left:0; top:0; bottom:0;\r\n  width:7px;\r\n  background:var(--expo-z2h-green);\r\n}\r\n.expo-z2h-top-logo-wrap{\r\n  display:flex;\r\n  flex-direction:column;\r\n  gap:10px;\r\n  align-items:center;\r\n  min-width:0;\r\n}\r\n.expo-z2h-top-logo-frame{\r\n  width:100%;\r\n  max-width:100%;\r\n  height:126px;\r\n  border:1px solid var(--expo-z2h-line);\r\n  border-radius:18px;\r\n  background:#fff;\r\n  box-shadow:0 8px 22px rgba(0,0,0,.06);\r\n  display:flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  padding:16px;\r\n}\r\n.expo-z2h-top-logo-frame img{max-width:100%;max-height:100%;object-fit:contain}\r\n.expo-z2h-assigned-pill{\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  min-height:30px;\r\n  border-radius:999px;\r\n  background:#f1f6e9;\r\n  color:var(--expo-z2h-green-dark);\r\n  font-size:11px;\r\n  font-weight:900;\r\n  letter-spacing:.4px;\r\n  text-transform:uppercase;\r\n  padding:0 12px;\r\n}\r\n.expo-z2h-top-main{min-width:0;max-width:100%}\r\n.expo-z2h-top-eyebrow{\r\n  font-size:12px;\r\n  font-weight:900;\r\n  letter-spacing:1px;\r\n  color:var(--expo-z2h-green);\r\n  text-transform:uppercase;\r\n}\r\n.expo-z2h-top-label{\r\n  margin-top:7px;\r\n  font-size:12px;\r\n  font-weight:800;\r\n  color:#777;\r\n  text-transform:uppercase;\r\n}\r\n.expo-z2h-top-title{\r\n  margin:6px 0 0;\r\n  font-size:clamp(26px, 2.8vw, 42px);\r\n  font-weight:950;\r\n  line-height:1.04;\r\n  text-transform:uppercase;\r\n  letter-spacing:-.8px;\r\n  word-break:break-word;\r\n}\r\n.expo-z2h-top-intro{\r\n  margin:12px 0 0;\r\n  color:#565656;\r\n  font-size:14px;\r\n  line-height:1.55;\r\n  font-weight:600;\r\n  max-width:100%;\r\n}\r\n.expo-z2h-top-meta{\r\n  display:grid;\r\n  grid-template-columns:repeat(3, minmax(0,1fr));\r\n  gap:10px;\r\n  margin-top:16px;\r\n}\r\n.expo-z2h-meta-item{\r\n  min-width:0;\r\n  border:1px solid var(--expo-z2h-line);\r\n  background:#fafafa;\r\n  border-radius:12px;\r\n  padding:11px 12px;\r\n}\r\n.expo-z2h-meta-item span{\r\n  display:block;\r\n  margin-bottom:4px;\r\n  color:#767676;\r\n  font-size:10px;\r\n  font-weight:800;\r\n  letter-spacing:.35px;\r\n  text-transform:uppercase;\r\n}\r\n.expo-z2h-meta-item strong{\r\n  display:block;\r\n  font-size:13px;\r\n  font-weight:900;\r\n  line-height:1.3;\r\n  word-break:break-word;\r\n}\r\n.expo-z2h-top-actions{\r\n  display:flex;\r\n  flex-wrap:wrap;\r\n  gap:8px;\r\n  margin-top:16px;\r\n}\r\n.expo-z2h-btn{\r\n  min-height:40px;\r\n  border-radius:10px;\r\n  padding:0 14px;\r\n  border:1px solid transparent;\r\n  font-size:12px;\r\n  font-weight:900;\r\n  cursor:pointer;\r\n  font-family:inherit;\r\n  display:inline-flex;\r\n  align-items:center;\r\n  justify-content:center;\r\n  gap:7px;\r\n  text-decoration:none;\r\n  transition:transform .18s ease, background .18s ease, border-color .18s ease;\r\n}\r\n.expo-z2h-btn:hover{transform:translateY(-1px)}\r\n.expo-z2h-btn-primary{background:var(--expo-z2h-green);border-color:var(--expo-z2h-green);color:#fff}\r\n.expo-z2h-btn-primary:hover{background:var(--expo-z2h-green-dark);border-color:var(--expo-z2h-green-dark)}\r\n.expo-z2h-btn-dark{background:#111;border-color:#111;color:#fff}\r\n.expo-z2h-btn-dark:hover{background:#2a2a2a}\r\n.expo-z2h-btn-light{background:#fff;border-color:#d9d9d9;color:#222}\r\n.expo-z2h-btn-light:hover{background:#f7f9f3;border-color:var(--expo-z2h-green)}\r\n.expo-z2h-top-stand{\r\n  min-height:150px;\r\n  min-width:0;\r\n  max-width:100%;\r\n  display:flex;\r\n  flex-direction:column;\r\n  align-items:center;\r\n  justify-content:center;\r\n  background:#111;\r\n  color:#fff;\r\n  border-radius:20px;\r\n  box-shadow:0 14px 28px rgba(0,0,0,.15);\r\n  text-align:center;\r\n  padding:14px 10px;\r\n}\r\n.expo-z2h-top-stand span{font-size:12px;letter-spacing:2px;font-weight:900;color:#b8c9a0}\r\n.expo-z2h-top-stand strong{\r\n  display:block;\r\n  margin-top:10px;\r\n  font-size:clamp(32px,3vw,50px);\r\n  line-height:1;\r\n  font-weight:950;\r\n  letter-spacing:-1.2px;\r\n}\r\n.expo-z2h-top-stand small{\r\n  margin-top:12px;\r\n  display:inline-block;\r\n  background:var(--expo-z2h-green);\r\n  color:#fff;\r\n  border-radius:999px;\r\n  padding:6px 10px;\r\n  font-size:10px;\r\n  font-weight:900;\r\n  letter-spacing:.7px;\r\n}\r\n\r\n.expo-z2h-map-panel{\r\n  background:var(--expo-z2h-bg);\r\n  border-radius:22px;\r\n  box-shadow:var(--expo-z2h-shadow);\r\n  padding:14px;\r\n  margin-bottom:18px;\r\n}\r\n.expo-z2h-map-toolbar{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  gap:12px;\r\n  align-items:center;\r\n  background:#fff;\r\n  border:1px solid rgba(0,0,0,.06);\r\n  border-radius:14px;\r\n  padding:10px 12px;\r\n  margin-bottom:10px;\r\n}\r\n.expo-z2h-toolbar-copy strong{display:block;font-size:13px;font-weight:900}\r\n.expo-z2h-toolbar-copy span{display:block;margin-top:3px;color:#666;font-size:12px;font-weight:600}\r\n.expo-z2h-toolbar-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}\r\n.expo-z2h-zoom{display:inline-flex;gap:6px;align-items:center}\r\n.expo-z2h-zoom button{\r\n  height:38px;border-radius:10px;border:1px solid #d9d9d9;background:#fff;color:#111;\r\n  font-size:22px;font-weight:900;cursor:pointer;min-width:38px\r\n}\r\n.expo-z2h-zoom .expo-z2h-zoom-level{min-width:68px;padding:0 10px;font-size:12px}\r\n.expo-z2h-zoom button:hover{background:#f3f7ed;border-color:var(--expo-z2h-green)}\r\n.expo-z2h-map-scroll{\r\n  width:100%;\r\n  overflow:auto;\r\n  border-radius:16px;\r\n  background:#fff;\r\n  scrollbar-width:none;\r\n  -ms-overflow-style:none;\r\n  max-height:85vh;\r\n}\r\n.expo-z2h-map-scroll::-webkit-scrollbar{\r\n  width:0;\r\n  height:0;\r\n  display:none;\r\n}\r\n.expo-z2h-map-stage{position:relative;width:100%;min-width:0;margin:0 auto;transform-origin:top left}\r\n.expo-z2h-map-canvas{position:relative;width:100%}\r\n.expo-z2h-main-map{display:block;width:100%;height:auto;user-select:none;-webkit-user-drag:none}\r\n.expo-z2h-overlay,.expo-z2h-markers,.expo-z2h-callouts,.expo-z2h-connectors{position:absolute;inset:0}\r\n.expo-z2h-overlay,.expo-z2h-connectors{pointer-events:none}\r\n.expo-z2h-markers,.expo-z2h-callouts{pointer-events:none}\r\n.expo-z2h-connectors{z-index:8;width:100%;height:100%;overflow:visible}\r\n.expo-z2h-connectors path{\r\n  fill:none;stroke:var(--expo-z2h-green);stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;\r\n  filter:drop-shadow(0 2px 2px rgba(0,0,0,.15));vector-effect:non-scaling-stroke;opacity:0;transition:opacity .18s ease\r\n}\r\n.expo-z2h-connectors path.visible{opacity:1}\r\n.expo-z2h-stand-highlight{\r\n  position:absolute;border:2px solid var(--expo-z2h-green);background:rgba(93,127,43,.08);\r\n  box-shadow:inset 0 0 0 1px rgba(255,255,255,.78), 0 0 10px rgba(93,127,43,.38);\r\n  border-radius:4px;z-index:7;pointer-events:none;animation:pulse 1.35s ease-in-out infinite\r\n}\r\n@keyframes pulse{0%,100%{opacity:.76}50%{opacity:1}}\r\n.expo-z2h-marker{\r\n  position:absolute;width:14px;height:14px;transform:translate(-50%,-50%);z-index:11;cursor:pointer;\r\n  border:2px solid #fff;border-radius:50%;background:var(--expo-z2h-green);box-shadow:0 2px 7px rgba(0,0,0,.42);pointer-events:auto;padding:0\r\n}\r\n.expo-z2h-marker::before{\r\n  content:\"\";position:absolute;inset:50% auto auto 50%;width:40px;height:40px;transform:translate(-50%,-50%);\r\n  border-radius:50%;background:transparent\r\n}\r\n.expo-z2h-marker::after{\r\n  content:\"\";position:absolute;inset:50% auto auto 50%;width:3px;height:3px;transform:translate(-50%,-50%);\r\n  border-radius:50%;background:#fff\r\n}\r\n.expo-z2h-marker:hover,.expo-z2h-marker:focus-visible,.expo-z2h-marker.active{\r\n  background:var(--expo-z2h-green-dark);transform:translate(-50%,-50%) scale(1.18);\r\n  box-shadow:0 0 0 4px rgba(93,127,43,.18), 0 3px 10px rgba(0,0,0,.42)\r\n}\r\n.expo-z2h-callout{\r\n  position:absolute;width:176px;min-height:60px;transform:translate(-50%,-50%) scale(.96);z-index:12;\r\n  display:grid;grid-template-columns:60px 1fr;gap:9px;align-items:center;padding:8px;border:2px solid var(--expo-z2h-green);\r\n  border-radius:12px;background:rgba(255,255,255,.98);box-shadow:0 9px 24px rgba(0,0,0,.24);\r\n  opacity:0;visibility:hidden;pointer-events:none;transition:opacity .18s ease, transform .18s ease, visibility .18s ease\r\n}\r\n.expo-z2h-callout.visible{opacity:1;visibility:visible;transform:translate(-50%,-50%) scale(1);pointer-events:auto}\r\n.expo-z2h-callout img{width:60px;height:42px;object-fit:contain;border-radius:8px;border:1px solid #ececec;background:#fff;padding:4px}\r\n.expo-z2h-callout-info{min-width:0}\r\n.expo-z2h-callout-info strong{display:block;font-size:12px;line-height:1.15;font-weight:900}\r\n.expo-z2h-callout-info span{\r\n  display:inline-block;margin-top:5px;border-radius:7px;background:var(--expo-z2h-green);color:#fff;\r\n  padding:4px 7px;font-size:10px;font-weight:900\r\n}\r\n.expo-z2h-map-note{\r\n  margin-top:10px;background:#f7f9f3;border-left:4px solid var(--expo-z2h-green);border-radius:10px;padding:12px 16px\r\n}\r\n.expo-z2h-map-note p{margin:0;font-size:14px;color:#444;line-height:1.5;font-weight:600}\r\n\r\n.expo-z2h-list-panel{\r\n  background:#fff;border-radius:22px;box-shadow:var(--expo-z2h-shadow);border:1px solid rgba(0,0,0,.06);padding:22px\r\n}\r\n.expo-z2h-list-head{\r\n  display:grid;grid-template-columns:minmax(0,1fr) auto;gap:12px 18px;align-items:end;margin-bottom:10px\r\n}\r\n.expo-z2h-list-head h3{margin:0;font-size:clamp(24px,2.2vw,34px);font-weight:900;text-transform:uppercase}\r\n.expo-z2h-list-head p{margin:5px 0 0;color:#666;font-size:14px;line-height:1.45}\r\n.expo-z2h-total{\r\n  align-self:center;display:inline-flex;align-items:center;justify-content:center;min-height:38px;border-radius:999px;\r\n  background:#f1f6e9;color:var(--expo-z2h-green-dark);font-weight:900;font-size:13px;padding:0 14px;white-space:nowrap\r\n}\r\n.expo-z2h-list-toggle-row{display:flex;align-items:center;gap:12px;justify-content:space-between;margin-top:12px}\r\n.expo-z2h-list-toggle{\r\n  min-height:42px;padding:0 14px;border-radius:12px;border:1px solid rgba(93,127,43,.28);background:#f5f8f0;\r\n  color:var(--expo-z2h-green-dark);font-size:13px;font-weight:900;cursor:pointer;display:inline-flex;align-items:center;gap:8px\r\n}\r\n.expo-z2h-list-toggle:hover{background:#eef5e5;border-color:var(--expo-z2h-green)}\r\n.expo-z2h-list-toggle-arrow{font-size:17px;line-height:1;transition:transform .2s ease}\r\n.expo-z2h-list-panel.open .expo-z2h-list-toggle-arrow{transform:rotate(180deg)}\r\n.expo-z2h-list-content{display:none;margin-top:16px}\r\n.expo-z2h-list-panel.open .expo-z2h-list-content{display:block}\r\n.expo-z2h-search{margin-bottom:16px}\r\n.expo-z2h-search input{\r\n  width:100%;min-height:48px;border:1px solid #ddd;border-radius:12px;padding:12px 14px;font-size:15px;color:#111;outline:none\r\n}\r\n.expo-z2h-search input:focus{border-color:var(--expo-z2h-green);box-shadow:0 0 0 3px rgba(93,127,43,.14)}\r\n.expo-z2h-cards{display:grid;grid-template-columns:repeat(4, minmax(0,1fr));gap:10px}\r\n.expo-z2h-card{\r\n  display:grid;grid-template-columns:58px minmax(0,1fr) auto;gap:10px;align-items:center;min-height:74px;padding:9px;\r\n  border-radius:13px;border:1px solid #e6e6e6;background:#fafafa;cursor:pointer;\r\n  transition:transform .18s ease, border-color .18s ease, background .18s ease, box-shadow .18s ease\r\n}\r\n.expo-z2h-card:hover,.expo-z2h-card.active{\r\n  background:#f1f6e9;border-color:var(--expo-z2h-green);transform:translateY(-1px);box-shadow:0 8px 20px rgba(0,0,0,.08)\r\n}\r\n.expo-z2h-card img{width:58px;height:44px;object-fit:contain;background:#fff;border-radius:9px;padding:4px;border:1px solid #eee}\r\n.expo-z2h-card-info{min-width:0}\r\n.expo-z2h-card-info strong{display:block;font-size:12.5px;line-height:1.17;font-weight:900}\r\n.expo-z2h-card-info span{display:block;margin-top:3px;font-size:10.5px;color:#666}\r\n.expo-z2h-badge{min-width:44px;text-align:center;border-radius:8px;background:#111;color:#fff;font-size:10.5px;font-weight:900;padding:6px 7px}\r\n.expo-z2h-empty{border:1px dashed #ddd;background:#fafafa;border-radius:12px;padding:18px;text-align:center;color:#777;font-size:14px}\r\n\r\n.expo-z2h-map-panel.plan-only{\r\n  position:fixed !important;inset:0 !important;z-index:2147483000 !important;width:100vw !important;height:100dvh !important;\r\n  max-width:none !important;margin:0 !important;padding:8px !important;border-radius:0 !important;background:#111 !important;\r\n  display:flex !important;flex-direction:column !important\r\n}\r\n.expo-z2h-map-panel.plan-only .expo-z2h-map-toolbar{margin:0 0 8px}\r\n.expo-z2h-map-panel.plan-only .expo-z2h-map-scroll{flex:1 1 auto;max-height:none !important;overflow:auto}\r\n.expo-z2h-map-panel.plan-only .expo-z2h-map-note,.expo-z2h-map-panel.plan-only .expo-z2h-btn-open-plan{display:none !important}\r\n.expo-z2h-btn-close-plan{display:none}\r\n.expo-z2h-map-panel.plan-only .expo-z2h-btn-close-plan{display:inline-flex !important}\r\nbody.expo-z2h-lock{overflow:hidden}\r\n\r\n@media (max-width:1280px){.expo-z2h-cards{grid-template-columns:repeat(3, minmax(0,1fr))}}\r\n@media (max-width:900px){\r\n  .expo-z2h-hz-inner{padding:0 10px}\r\n  .expo-z2h-top-card{grid-template-columns:155px minmax(0,1fr);gap:16px}\r\n  .expo-z2h-top-stand{grid-column:1 \/ -1;min-height:96px;flex-direction:row;justify-content:flex-start;gap:14px}\r\n  .expo-z2h-top-stand strong{margin:0;font-size:40px}\r\n  .expo-z2h-top-stand small{margin:0 0 0 auto}\r\n  .expo-z2h-top-meta{grid-template-columns:1fr 1fr}\r\n  .expo-z2h-meta-item:last-child{grid-column:1 \/ -1}\r\n  .expo-z2h-cards{grid-template-columns:repeat(2, minmax(0,1fr))}\r\n}\r\n@media (max-width:600px){\r\n  .expo-z2h-hz{padding:18px 0 34px}\r\n  .expo-z2h-hz-header{margin-bottom:16px}\r\n  .expo-z2h-hz-header p{font-size:14px}\r\n  .expo-z2h-top-card{grid-template-columns:1fr;gap:15px;padding:16px;border-radius:18px}\r\n  .expo-z2h-top-logo-wrap{max-width:290px;margin:0 auto}\r\n  .expo-z2h-top-logo-frame{height:116px}\r\n  .expo-z2h-top-title{font-size:30px}\r\n  .expo-z2h-top-intro{font-size:12.5px}\r\n  .expo-z2h-top-actions{display:grid;grid-template-columns:1fr 1fr}\r\n  .expo-z2h-btn{width:100%;font-size:10.5px;min-height:42px;padding:0 9px}\r\n  .expo-z2h-top-stand{grid-column:auto;min-height:92px;padding:15px 16px;border-radius:15px}\r\n  .expo-z2h-top-stand strong{font-size:34px}\r\n  .expo-z2h-map-panel{padding:8px;border-radius:16px}\r\n  .expo-z2h-map-toolbar{display:grid;grid-template-columns:1fr;gap:8px;padding:9px}\r\n  .expo-z2h-toolbar-actions{width:100%;justify-content:space-between}\r\n  .expo-z2h-zoom button{height:34px;min-width:34px;font-size:20px}\r\n  .expo-z2h-zoom .expo-z2h-zoom-level{min-width:58px;font-size:11px}\r\n  .expo-z2h-map-scroll{max-height:68svh}\r\n  .expo-z2h-marker{width:12px;height:12px;border-width:1.5px}\r\n  .expo-z2h-marker::before{width:44px;height:44px}\r\n  .expo-z2h-callout{width:150px;grid-template-columns:54px 1fr}\r\n  .expo-z2h-callout img{width:54px;height:38px}\r\n  .expo-z2h-list-panel{padding:14px;border-radius:16px}\r\n  .expo-z2h-list-head{display:block}\r\n  .expo-z2h-total{margin-top:8px}\r\n  .expo-z2h-list-toggle-row{display:block}\r\n  .expo-z2h-list-toggle{margin-top:8px;width:100%;justify-content:center}\r\n  .expo-z2h-cards{grid-template-columns:1fr;gap:7px}\r\n  .expo-z2h-card{min-height:64px;grid-template-columns:54px minmax(0,1fr) auto;padding:8px}\r\n  .expo-z2h-card img{width:54px;height:40px}\r\n}\r\n@media (prefers-reduced-motion: reduce){.expo-z2h-hz *{animation:none !important;transition:none !important;scroll-behavior:auto !important}}\r\n\r\n\r\n\/* ===== AISLAMIENTO \/ CENTRADO ZONA 2 ===== *\/\r\n.expo-z2h-hz{\r\n  font-family:Arial,Helvetica,sans-serif;\r\n  color:#111;\r\n  position:relative !important;\r\n  width:min(1680px, calc(100vw - 32px)) !important;\r\n  max-width:1680px !important;\r\n  margin-left:auto !important;\r\n  margin-right:auto !important;\r\n  transform:none !important;\r\n}\r\n.expo-z2h-hz-inner{\r\n  width:100% !important;\r\n  max-width:1680px !important;\r\n  margin-left:auto !important;\r\n  margin-right:auto !important;\r\n}\r\n.expo-z2h-map-panel,\r\n.expo-z2h-list-panel,\r\n.expo-z2h-top-toggle-wrap,\r\n.expo-z2h-top-card{\r\n  width:100% !important;\r\n  margin-left:auto !important;\r\n  margin-right:auto !important;\r\n}\r\n.expo-z2h-main-map{\r\n  width:100% !important;\r\n  height:auto !important;\r\n}\r\n@media (max-width:600px){\r\n  .expo-z2h-hz-inner{\r\n    width:100% !important;\r\n    padding-left:8px !important;\r\n    padding-right:8px !important;\r\n  }\r\n}\r\n\r\n\r\n\/* ===== AJUSTE FINAL: PLANO ENCAJADO SIN BARRAS ===== *\/\r\n.expo-z2h-map-scroll{\r\n  overflow:auto !important;\r\n  scrollbar-width:none !important;\r\n  -ms-overflow-style:none !important;\r\n}\r\n.expo-z2h-map-scroll::-webkit-scrollbar{\r\n  width:0 !important;\r\n  height:0 !important;\r\n  display:none !important;\r\n}\r\n.expo-z2h-map-stage{\r\n  margin-left:auto !important;\r\n  margin-right:auto !important;\r\n}\r\n@media (min-width:601px){\r\n  .expo-z2h-map-stage{\r\n    width:100%;\r\n  }\r\n}\r\n\r\n<\/style>\r\n\r\n<section class=\"expo-z2h-hz\" id=\"expoZ2HHzRoot\">\r\n  <div class=\"expo-z2h-hz-inner\">\r\n    <div class=\"expo-z2h-hz-header\">\r\n      <span>Caja M\u00e1gica<\/span>\r\n      <h2>Ubicaci\u00f3n de expositores \u00b7 Zona 2<\/h2>\r\n      <p>Plano horizontal interactivo. Pulsa un expositor o un punto del plano para ver su ubicaci\u00f3n, su stand y localizarlo de forma r\u00e1pida dentro del recinto.<\/p>\r\n    <\/div>\r\n\r\n    <div class=\"expo-z2h-top-toggle-wrap\">\r\n      <button type=\"button\" class=\"expo-z2h-top-toggle\" id=\"expoZ2HTopToggle\" aria-expanded=\"false\" aria-controls=\"expoZ2HTopCard\">\r\n        <span class=\"expo-z2h-top-toggle-copy\">\r\n          <span id=\"expoZ2HTopToggleText\">Ver ficha del expositor<\/span>\r\n          <span class=\"expo-z2h-top-toggle-name\" id=\"expoZ2HTopToggleName\"><\/span>\r\n          <span class=\"expo-z2h-top-toggle-stand\" id=\"expoZ2HTopToggleStand\"><\/span>\r\n        <\/span>\r\n        <span class=\"expo-z2h-top-toggle-arrow\">\u2304<\/span>\r\n      <\/button>\r\n    <\/div>\r\n\r\n    <section class=\"expo-z2h-top-card expo-z2h-top-collapsed\" id=\"expoZ2HTopCard\">\r\n      <div class=\"expo-z2h-top-logo-wrap\">\r\n        <div class=\"expo-z2h-top-logo-frame\">\r\n          <img decoding=\"async\" id=\"expoZ2HTopLogo\" src=\"\" alt=\"Logo del expositor\">\r\n        <\/div>\r\n        <span class=\"expo-z2h-assigned-pill\">Ubicaci\u00f3n de expositor<\/span>\r\n      <\/div>\r\n\r\n      <div class=\"expo-z2h-top-main\">\r\n        <div class=\"expo-z2h-top-eyebrow\">Zona 2<\/div>\r\n        <div class=\"expo-z2h-top-label\">Ficha del expositor<\/div>\r\n        <h1 class=\"expo-z2h-top-title\" id=\"expoZ2HTopTitle\">Seleccione un expositor<\/h1>\r\n        <p class=\"expo-z2h-top-intro\" id=\"expoZ2HTopIntro\">Puede localizar un expositor desde el plano o desde el desplegable inferior. Cuando seleccione uno, aqu\u00ed ver\u00e1 su informaci\u00f3n y su stand asignado.<\/p>\r\n\r\n        <div class=\"expo-z2h-top-meta\">\r\n          <div class=\"expo-z2h-meta-item\">\r\n            <span>Zona<\/span>\r\n            <strong>Zona 2<\/strong>\r\n          <\/div>\r\n          <div class=\"expo-z2h-meta-item\">\r\n            <span>Stand asignado<\/span>\r\n            <strong id=\"expoZ2HTopStandMeta\">\u2014<\/strong>\r\n          <\/div>\r\n          <div class=\"expo-z2h-meta-item\">\r\n            <span>Recinto<\/span>\r\n            <strong>Caja M\u00e1gica \u00b7 Madrid<\/strong>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"expo-z2h-top-actions\">\r\n          <button type=\"button\" class=\"expo-z2h-btn expo-z2h-btn-primary\" id=\"expoZ2HLocateBtn\">Localizar este stand<\/button>\r\n          <button type=\"button\" class=\"expo-z2h-btn expo-z2h-btn-dark\" id=\"expoZ2HOpenPlanBtnTop\">Ver plano ampliado<\/button>\r\n          <button type=\"button\" class=\"expo-z2h-btn expo-z2h-btn-light\" id=\"expoZ2HShareBtn\">Compartir ubicaci\u00f3n<\/button>\r\n          <a class=\"expo-z2h-btn expo-z2h-btn-light\" href=\"#\" id=\"expoZ2HGeneralPlanLink\">Ver plano general<\/a>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"expo-z2h-top-stand\">\r\n        <span>STAND<\/span>\r\n        <strong id=\"expoZ2HTopStandBig\">\u2014<\/strong>\r\n        <small>ZONA 2<\/small>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <section class=\"expo-z2h-map-panel\" id=\"expoZ2HMapPanel\">\r\n      <div class=\"expo-z2h-map-toolbar\">\r\n        <div class=\"expo-z2h-toolbar-copy\">\r\n          <strong>Plano del recinto<\/strong>\r\n          <span>Desliza el plano, usa el zoom o pulsa sobre un punto para ver el expositor.<\/span>\r\n        <\/div>\r\n\r\n        <div class=\"expo-z2h-toolbar-actions\">\r\n          <button type=\"button\" class=\"expo-z2h-btn expo-z2h-btn-primary expo-z2h-btn-open-plan\" id=\"expoZ2HPlanOnlyOpen\">Ver solo plano<\/button>\r\n          <button type=\"button\" class=\"expo-z2h-btn expo-z2h-btn-light expo-z2h-btn-close-plan\" id=\"expoZ2HPlanOnlyClose\">Cerrar<\/button>\r\n\r\n          <div class=\"expo-z2h-zoom\">\r\n            <button type=\"button\" id=\"expoZ2HZoomOut\" aria-label=\"Alejar plano\">\u2212<\/button>\r\n            <button type=\"button\" class=\"expo-z2h-zoom-level\" id=\"expoZ2HZoomReset\" aria-label=\"Restablecer zoom\">100%<\/button>\r\n            <button type=\"button\" id=\"expoZ2HZoomIn\" aria-label=\"Acercar plano\">+<\/button>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"expo-z2h-map-scroll\" id=\"expoZ2HMapScroll\">\r\n        <div class=\"expo-z2h-map-stage\" id=\"expoZ2HMapStage\">\r\n          <svg class=\"expo-z2h-connectors\" id=\"expoZ2HConnectorSvg\" aria-hidden=\"true\">\r\n            <path id=\"expoZ2HConnectorPath\" d=\"\"><\/path>\r\n          <\/svg>\r\n\r\n          <div class=\"expo-z2h-callouts\" id=\"expoZ2HCallouts\"><\/div>\r\n\r\n          <div class=\"expo-z2h-map-canvas\" id=\"expoZ2HMapCanvas\">\r\n            <img decoding=\"async\"\r\n              src=\"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/Z2-2.0-scaled.png\"\r\n              alt=\"Plano horizontal de Zona 2\"\r\n              class=\"expo-z2h-main-map\"\r\n              id=\"expoZ2HMapImage\"\r\n            >\r\n            <div class=\"expo-z2h-overlay\" id=\"expoZ2HOverlay\"><\/div>\r\n            <div class=\"expo-z2h-markers\" id=\"expoZ2HMarkers\"><\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"expo-z2h-map-note\">\r\n        <p>\u2022 En el plano se muestran los expositores ubicados en esta zona para facilitar su localizaci\u00f3n dentro del recinto.<\/p>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <section class=\"expo-z2h-list-panel\" id=\"expoZ2HListPanel\">\r\n      <div class=\"expo-z2h-list-head\">\r\n        <div>\r\n          <h3>Expositores<\/h3>\r\n          <p>Busque un expositor y pulse sobre su ficha para ver su ubicaci\u00f3n y destacar su stand en el plano.<\/p>\r\n        <\/div>\r\n      \r\n      <\/div>\r\n\r\n      <div class=\"expo-z2h-list-toggle-row\">\r\n        <span>Listado de expositores<\/span>\r\n        <button type=\"button\" class=\"expo-z2h-list-toggle\" id=\"expoZ2HListToggle\" aria-expanded=\"false\">\r\n          <span class=\"expo-z2h-list-toggle-text\" id=\"expoZ2HListToggleText\">Ver expositores<\/span>\r\n          <span class=\"expo-z2h-list-toggle-arrow\">\u2304<\/span>\r\n        <\/button>\r\n      <\/div>\r\n\r\n      <div class=\"expo-z2h-list-content\" id=\"expoZ2HListContent\">\r\n        <div class=\"expo-z2h-search\">\r\n          <input type=\"text\" id=\"expoZ2HSearch\" placeholder=\"Buscar expositor o stand...\" autocomplete=\"off\">\r\n        <\/div>\r\n\r\n        <div class=\"expo-z2h-cards\" id=\"expoZ2HList\"><\/div>\r\n      <\/div>\r\n    <\/section>\r\n  <\/div>\r\n<\/section>\r\n\r\n<script>\r\n(function(){\r\n  \/* Centra este bloque respecto a la ventana, aunque Elementor lo inserte en una columna lateral. *\/\r\n  const z2Root = document.getElementById(\"expoZ2HHzRoot\");\r\n  function centerZ2Block(){\r\n    if(!z2Root) return;\r\n    if(window.innerWidth <= 600){\r\n      z2Root.style.left = \"0px\";\r\n      z2Root.style.width = \"100%\";\r\n      return;\r\n    }\r\n    const targetWidth = Math.min(1680, Math.max(320, window.innerWidth - 32));\r\n    z2Root.style.width = targetWidth + \"px\";\r\n    z2Root.style.left = \"0px\";\r\n    requestAnimationFrame(function(){\r\n      const rect = z2Root.getBoundingClientRect();\r\n      const targetLeft = Math.max(16, (window.innerWidth - targetWidth) \/ 2);\r\n      z2Root.style.left = (targetLeft - rect.left) + \"px\";\r\n    });\r\n  }\r\n  centerZ2Block();\r\n  window.addEventListener(\"resize\", centerZ2Block);\r\n\r\n  const REF_W = 2048;\r\n  const REF_H = 1068;\r\n\r\n  function rectPx(x1, y1, x2, y2, options = {}) {\r\n    const w = x2 - x1;\r\n    const h = y2 - y1;\r\n    const markerX = typeof options.markerX === \"number\" ? options.markerX : (x1 + w \/ 2);\r\n    const markerY = typeof options.markerY === \"number\" ? options.markerY : (y1 + h \/ 2);\r\n\r\n    return {\r\n      x: (x1 \/ REF_W) * 100,\r\n      y: (y1 \/ REF_H) * 100,\r\n      w: (w \/ REF_W) * 100,\r\n      h: (h \/ REF_H) * 100,\r\n      markerX: (markerX \/ REF_W) * 100,\r\n      markerY: (markerY \/ REF_H) * 100,\r\n      marker: options.marker !== false\r\n    };\r\n  }\r\n\r\n  const standPositions = {\r\n    \/* ZONA 2 \u00b7 Z2-scaled.jpg \u00b7 referencia exacta 2048 \u00d7 1068 *\/\r\n\r\n    \/* Fila central izquierda *\/\r\n    \"C02\": rectPx(131, 589, 232, 676),\r\n    \"C03\": rectPx(290, 589, 377, 676),\r\n    \"C04\": rectPx(378, 589, 478, 676),\r\n    \"C06\": rectPx(600, 589, 690, 676),\r\n    \"C06 \": rectPx(679, 589, 750, 676),\r\n\r\n    \/* Centro del plano *\/\r\n    \"C07\": rectPx(809, 589, 984, 626),\r\n    \"C08\": rectPx(1061, 589, 1175, 613),\r\n    \"C09\": rectPx(1175, 589, 1338, 714),\r\n\r\n    \/* Lateral derecho central *\/\r\n    \"C12\": rectPx(1500, 589, 1576, 676),\r\n    \"C14\": rectPx(2377, 589, 1355, 1276),\r\n    \"C15\": rectPx(1856, 989, 1727, 876),\r\n    \"C24\": rectPx(1803, 601, 1955, 664),\r\n    \"C23\": rectPx(2703, 601, 1055, 364),\r\n    \"C22\": rectPx(2703, 501, 1055, 104),\r\n    \"C17\": rectPx(2253, 501, 1055, 104),\r\n    \"C16\": rectPx(2253, 501, 1045, 494),\r\n    \"C18\": rectPx(2299, 101,  925, 54),\r\n    \"C19\": rectPx(2269, 101, 1105, 54),\r\n    \"CONF.\": rectPx(2269, 101, 1250, 554),\r\n    \"REST.\": rectPx(2369, 101, 410, 754),\r\n\r\n    \/* Fila inferior *\/\r\n    \"C01\": rectPx(88, 753, 568, 969),\r\n    \"PRENSA\": rectPx(718, 483, 568, 69),\r\n    \"SALA2\": rectPx(718, 753, 568, 69),\r\n    \"SALA1\": rectPx(718, 753, 568, 289),\r\n    \"C05\": rectPx(569, 753, 783, 969),\r\n    \"C10\": rectPx(1261, 793, 1374, 969),\r\n    \"C11\": rectPx(1396, 755, 1547, 969),\r\n    \"C13\": rectPx(1587, 755, 1738, 969),\r\n    \"C16\": rectPx(2260, 755, 1611, 969)\r\n  };\r\n\r\n  \/* ============================================================\r\n     EXPOSITORES \u00b7 BLOQUE F\u00c1CIL DE EDITAR\r\n     ------------------------------------------------------------\r\n     PARA CAMBIAR UN EXPOSITOR SOLO MODIFICA SU L\u00cdNEA:\r\n\r\n     expositor(\"NOMBRE\", \"STAND QUE SE MUESTRA\", [\"UBICACION EN PLANO\"], \"URL DEL LOGO\"),\r\n\r\n     EJEMPLOS:\r\n     - Un solo stand:\r\n       expositor(\"EMPRESA\", \"B05\", [\"B05\"], \"https:\/\/...logo.jpg\"),\r\n\r\n     - Dos stands:\r\n       expositor(\"EMPRESA\", \"B27 \u00b7 B28\", [\"B27\",\"B28\"], \"https:\/\/...logo.jpg\"),\r\n\r\n     - Si cambias una empresa de lugar, cambia SOLO el stand visible\r\n       y la ubicaci\u00f3n entre corchetes.\r\n     ============================================================ *\/\r\n\r\n  function expositor(nombre, standVisible, ubicaciones, logoUrl){\r\n    return {\r\n      name: nombre,\r\n      stand: standVisible,\r\n      stands: ubicaciones,\r\n      logo: logoUrl\r\n    };\r\n  }\r\n\r\n  const exhibitors = [\r\n    \/\/ NOMBRE | STAND VISIBLE | UBICACI\u00d3N EN EL PLANO | LOGO\r\n    expositor(\"Conferencias\", \"CONF.\", [\"CONF.\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/2e598049-85eb-4d8a-b3cf-76f16a37e1af.png\"),\r\nexpositor(\"Restaurante\", \"REST.\", [\"REST.\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/Sin-titulo-1.png\"),\r\nexpositor(\"SALA DE PRENSA\", \"SALA PRENSA\", [\"PRENSA\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/Imagen-de-ChatGPT-30-sept-2026-18_24_27.png\"),\r\nexpositor(\"SALA DE PONENCIAS Y EXPOSICI\u00d3N \", \"SALA1\", [\"SALA1\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-18-sept-2026-16_43_49.png\"),\r\n    expositor(\"SALA DE PONENCIAS Y EXPOSICI\u00d3N\", \"SALA2\", [\"SALA2\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/ChatGPT-Image-18-sept-2026-16_43_49.png\"),\r\n    expositor(\"Reservado\", \"C16\", [\"C16\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/Ekipol.jpg\"),\r\n    expositor(\"EULEN\", \"C13\", [\"C13\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/07\/Eulen-Seguridad-1.jpg\"),\r\n    expositor(\"CISS\", \"C09\", [\"C09\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/07\/Ciss.jpg\"),\r\n    expositor(\"G.T.V.\", \"C10\", [\"C10\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/GTV.jpg\"),\r\n\r\n    expositor(\"IONIQ SEGURIDAD\", \"C15\", [\"C15\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/IONIQ-SEGURIDAD.jpg\"),\r\n    expositor(\"NUUK\", \"C14\", [\"C14\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/NUUK.jpg\"),\r\n    expositor(\"BOLL\u00c9\", \"C12\", [\"C12\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/BOLLE.jpg\"),\r\n    expositor(\"ILUNION\", \"C11\", [\"C11\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/Ilunium.jpg\"),\r\n    expositor(\"GALER\u00cdA DE EXPOSECURITY\u00ae\", \"C08\", [\"C08\"], \"\"),\r\n    expositor(\"FABRICAMOS TU PARCHE\", \"C07\", [\"C07\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/07\/FABRICAMOS-TU-PARCHE.jpg\"),\r\n    expositor(\"POLIC\u00cdA MUNICIPAL\", \"C05\", [\"C05\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/POLICIA-MINICIPAL.jpg\"),\r\n    expositor(\"VEBLINTER\", \"C01\", [\"C01\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/VEBLINTER.jpg\"),\r\n    expositor(\"GEOPOL\", \"C06\", [\"C06\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/GEOPOL.jpg\"),\r\n    expositor(\"CorporePOL\", \"C06\", [\"C06 \"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/CorporePOL.jpg\"),\r\n    expositor(\"SELINAC\", \"C04\", [\"C04\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/10\/SELINAC.jpg\"),\r\n    expositor(\"IMPULSO\", \"C03\", [\"C03\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/09\/IMPULSO.jpg\"),\r\n    expositor(\"Aduana\", \"C02\", [\"C02\"], \"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/06\/Aduana.jpg\")\r\n  ];\r\n\r\n  const root = document.getElementById(\"expoZ2HHzRoot\");\r\n  const topCard = document.getElementById(\"expoZ2HTopCard\");\r\n  const topToggle = document.getElementById(\"expoZ2HTopToggle\");\r\n  const topToggleText = document.getElementById(\"expoZ2HTopToggleText\");\r\n  const topToggleName = document.getElementById(\"expoZ2HTopToggleName\");\r\n  const topToggleStand = document.getElementById(\"expoZ2HTopToggleStand\");\r\n  const topLogo = document.getElementById(\"expoZ2HTopLogo\");\r\n  const topTitle = document.getElementById(\"expoZ2HTopTitle\");\r\n  const topIntro = document.getElementById(\"expoZ2HTopIntro\");\r\n  const topStandMeta = document.getElementById(\"expoZ2HTopStandMeta\");\r\n  const topStandBig = document.getElementById(\"expoZ2HTopStandBig\");\r\n  const locateBtn = document.getElementById(\"expoZ2HLocateBtn\");\r\n  const openPlanBtnTop = document.getElementById(\"expoZ2HOpenPlanBtnTop\");\r\n  const shareBtn = document.getElementById(\"expoZ2HShareBtn\");\r\n  const generalPlanLink = document.getElementById(\"expoZ2HGeneralPlanLink\");\r\n\r\n  const mapPanel = document.getElementById(\"expoZ2HMapPanel\");\r\n  const mapScroll = document.getElementById(\"expoZ2HMapScroll\");\r\n  const mapStage = document.getElementById(\"expoZ2HMapStage\");\r\n  const mapImage = document.getElementById(\"expoZ2HMapImage\");\r\n  const overlay = document.getElementById(\"expoZ2HOverlay\");\r\n  const markers = document.getElementById(\"expoZ2HMarkers\");\r\n  const callouts = document.getElementById(\"expoZ2HCallouts\");\r\n  const connectorSvg = document.getElementById(\"expoZ2HConnectorSvg\");\r\n  const connectorPath = document.getElementById(\"expoZ2HConnectorPath\");\r\n\r\n  const search = document.getElementById(\"expoZ2HSearch\");\r\n  const list = document.getElementById(\"expoZ2HList\")\r\n  const listPanel = document.getElementById(\"expoZ2HListPanel\");\r\n  const listToggle = document.getElementById(\"expoZ2HListToggle\");\r\n  const listToggleText = document.getElementById(\"expoZ2HListToggleText\");\r\n\r\n  const zoomOut = document.getElementById(\"expoZ2HZoomOut\");\r\n  const zoomIn = document.getElementById(\"expoZ2HZoomIn\");\r\n  const zoomReset = document.getElementById(\"expoZ2HZoomReset\");\r\n  const planOnlyOpen = document.getElementById(\"expoZ2HPlanOnlyOpen\");\r\n  const planOnlyClose = document.getElementById(\"expoZ2HPlanOnlyClose\");\r\n  generalPlanLink.href = window.location.origin + window.location.pathname;\r\n\r\n  let activeName = null;\r\n  let pinnedName = null;\r\n  let currentItem = null;\r\n  let planOnlyMode = false;\r\n\r\n  const MIN_ZOOM = 0.45;\r\n  const MAX_ZOOM = 4;\r\n  const STEP_ZOOM = 0.10;\r\n  const MOBILE_BREAKPOINT = 600;\r\n  const MOBILE_DEFAULT_ZOOM = 2.10;\r\n  const DESKTOP_DEFAULT_ZOOM = 1.00;\r\n  const PLAN_ONLY_MOBILE_ZOOM = 2.10;\r\n  const PLAN_ONLY_DESKTOP_ZOOM = 1.00;\r\n  let zoom = 1;\r\n\r\n  function isMobile(){ return window.innerWidth <= MOBILE_BREAKPOINT; }\r\n  function getDefaultZoom(){ return isMobile() ? MOBILE_DEFAULT_ZOOM : DESKTOP_DEFAULT_ZOOM; }\r\n  function getPlanOnlyZoom(){ return isMobile() ? PLAN_ONLY_MOBILE_ZOOM : PLAN_ONLY_DESKTOP_ZOOM; }\r\n  function clampZoom(v){ return Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, v)); }\r\n  function updateZoomControls(){\r\n    const pct = Math.round(zoom * 100);\r\n    zoomReset.textContent = pct + \"%\";\r\n    zoomOut.disabled = zoom <= MIN_ZOOM + .001;\r\n    zoomIn.disabled = zoom >= MAX_ZOOM - .001;\r\n  }\r\n  function applyZoom(nextZoom, focalPoint){\r\n    const newZoom = clampZoom(nextZoom);\r\n    if (Math.abs(newZoom - zoom) < .001) return;\r\n\r\n    const oldWidth = mapStage.offsetWidth || 1;\r\n    const oldHeight = mapStage.offsetHeight || 1;\r\n    const focusX = focalPoint && typeof focalPoint.x === \"number\" ? focalPoint.x : mapScroll.clientWidth \/ 2;\r\n    const focusY = focalPoint && typeof focalPoint.y === \"number\" ? focalPoint.y : mapScroll.clientHeight \/ 2;\r\n    const ratioX = (mapScroll.scrollLeft + focusX) \/ oldWidth;\r\n    const ratioY = (mapScroll.scrollTop + focusY) \/ oldHeight;\r\n\r\n    zoom = newZoom;\r\n    mapStage.style.width = zoom === 1 ? \"100%\" : (zoom * 100) + \"%\";\r\n    mapStage.style.marginLeft = zoom <= 1 ? \"auto\" : \"0\";\r\n    mapStage.style.marginRight = zoom <= 1 ? \"auto\" : \"0\";\r\n    updateZoomControls();\r\n\r\n    requestAnimationFrame(function(){\r\n      const newWidth = mapStage.offsetWidth || 1;\r\n      const newHeight = mapStage.offsetHeight || 1;\r\n      mapScroll.scrollLeft = Math.max(0, (ratioX * newWidth) - focusX);\r\n      mapScroll.scrollTop = Math.max(0, (ratioY * newHeight) - focusY);\r\n      if (activeName) requestAnimationFrame(drawConnector);\r\n    });\r\n  }\r\n  function resetZoom(target = getDefaultZoom()){\r\n    zoom = clampZoom(target);\r\n    mapStage.style.width = zoom === 1 ? \"100%\" : (zoom * 100) + \"%\";\r\n    mapStage.style.marginLeft = zoom <= 1 ? \"auto\" : \"0\";\r\n    mapStage.style.marginRight = zoom <= 1 ? \"auto\" : \"0\";\r\n    updateZoomControls();\r\n    requestAnimationFrame(function(){\r\n      mapScroll.scrollTop = 0;\r\n      mapScroll.scrollLeft = 0;\r\n      if (activeName) drawConnector();\r\n    });\r\n  }\r\n\r\n  function createFallbackLogo(name){\r\n    const safe = String(name || \"EXPOSITOR\").replace(\/[&<>\"']\/g,\"\").slice(0,24);\r\n    const svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"220\" height=\"120\" viewBox=\"0 0 220 120\">\r\n      <rect width=\"220\" height=\"120\" rx=\"14\" fill=\"#ffffff\"\/>\r\n      <rect x=\"2\" y=\"2\" width=\"216\" height=\"116\" rx=\"12\" fill=\"none\" stroke=\"#d8d8d8\" stroke-width=\"4\"\/>\r\n      <text x=\"110\" y=\"66\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\" font-size=\"18\" font-weight=\"700\" fill=\"#222\">${safe}<\/text>\r\n    <\/svg>`;\r\n    return \"data:image\/svg+xml;charset=UTF-8,\" + encodeURIComponent(svg);\r\n  }\r\n  function getLogo(item){ return item && item.logo ? item.logo : createFallbackLogo(item ? item.name : \"EXPOSITOR\"); }\r\n  function addFallback(img, name){\r\n    if (!img) return;\r\n    img.addEventListener(\"error\", function(){\r\n      if (this.dataset.fallbackApplied === \"1\") return;\r\n      this.dataset.fallbackApplied = \"1\";\r\n      this.src = createFallbackLogo(name);\r\n    });\r\n  }\r\n\r\n  function normalizeId(value){\r\n    return String(value || \"\")\r\n      .trim().toLowerCase().normalize(\"NFD\").replace(\/[\\u0300-\\u036f]\/g, \"\")\r\n      .replace(\/[^a-z0-9]+\/g, \"-\").replace(\/^-+|-+$\/g, \"\");\r\n  }\r\n  function exhibitorId(item){ return normalizeId(item.id || item.name || \"\"); }\r\n  function requestedId(){\r\n    try{\r\n      const hashRaw = String(window.location.hash || \"\").replace(\/^#\/, \"\");\r\n      if(hashRaw){\r\n        const params = new URLSearchParams(hashRaw);\r\n        const id = params.get(\"expositor\");\r\n        if(id) return normalizeId(id);\r\n        if(!hashRaw.includes(\"=\")) return normalizeId(hashRaw);\r\n      }\r\n      const params = new URLSearchParams(window.location.search);\r\n      return normalizeId(params.get(\"expositor\") || \"\");\r\n    }catch(e){ return \"\"; }\r\n  }\r\n  function updateUrl(item){\r\n    try{\r\n      const url = new URL(window.location.href);\r\n      url.searchParams.delete(\"expositor\");\r\n      url.hash = \"expositor=\" + encodeURIComponent(exhibitorId(item));\r\n      window.history.replaceState({}, \"\", url.toString());\r\n    }catch(e){}\r\n  }\r\n\r\n  function getStandRects(id){\r\n    const v = standPositions[id];\r\n    if(!v) return [];\r\n    return Array.isArray(v) ? v : [v];\r\n  }\r\n  function getAllRects(item){\r\n    return (item.stands || []).flatMap(function(standId){\r\n      return getStandRects(standId).map(function(pos){\r\n        return Object.assign({}, pos, { standId: standId });\r\n      });\r\n    });\r\n  }\r\n  function getMarkerPositions(item){\r\n    const out = [];\r\n    (item.stands || []).forEach(function(standId){\r\n      const rect = getStandRects(standId).find(function(r){ return r.marker !== false; });\r\n      if(rect){\r\n        out.push({ standId: standId, markerX: rect.markerX, markerY: rect.markerY });\r\n      }\r\n    });\r\n    return out;\r\n  }\r\n  function getAverageMarker(item){\r\n    const pts = getMarkerPositions(item);\r\n    if(!pts.length) return {x:50,y:50};\r\n    return {\r\n      x: pts.reduce((s,p) => s + p.markerX, 0) \/ pts.length,\r\n      y: pts.reduce((s,p) => s + p.markerY, 0) \/ pts.length\r\n    };\r\n  }\r\n  function clampPct(value, min, max){ return Math.max(min, Math.min(max, value)); }\r\n  function getCalloutPosition(item){\r\n    const avg = getAverageMarker(item);\r\n    let x = avg.x;\r\n    let y = avg.y - 8;\r\n    if (avg.x < 13) x = avg.x + 8;\r\n    if (avg.x > 87) x = avg.x - 8;\r\n    if (avg.y < 14) y = avg.y + 8;\r\n    return {\r\n      x: clampPct(x, 10, 90),\r\n      y: clampPct(y, 9, 90)\r\n    };\r\n  }\r\n\r\n  function setTopCardOpen(open){\r\n    topCard.classList.toggle(\"expo-z2h-top-collapsed\", !open);\r\n    topToggle.setAttribute(\"aria-expanded\", String(open));\r\n    topToggleText.textContent = open ? \"Ocultar ficha del expositor\" : \"Ver ficha del expositor\";\r\n  }\r\n\r\n  function setListOpen(open){\r\n    listPanel.classList.toggle(\"open\", open);\r\n    listToggle.setAttribute(\"aria-expanded\", String(open));\r\n    listToggleText.textContent = open ? \"Ocultar expositores\" : \"Ver expositores\";\r\n  }\r\n\r\n  function renderList(filter = \"\"){\r\n    list.innerHTML = \"\";\r\n    const f = filter.trim().toLowerCase();\r\n    const filtered = exhibitors.filter(function(item){\r\n      return [item.name, item.stand].concat(item.stands || []).join(\" \").toLowerCase().includes(f);\r\n    });\r\n\r\n    if(!filtered.length){\r\n      list.innerHTML = '<div class=\"expo-z2h-empty\">No se encontraron expositores.<\/div>';\r\n      return;\r\n    }\r\n\r\n    filtered.forEach(function(item){\r\n      const card = document.createElement(\"div\");\r\n      card.className = \"expo-z2h-card\";\r\n      card.dataset.name = item.name;\r\n      card.setAttribute(\"tabindex\",\"0\");\r\n      card.setAttribute(\"role\",\"button\");\r\n      card.setAttribute(\"aria-label\", item.name + \", stand \" + item.stand);\r\n      card.innerHTML = `\r\n        <img decoding=\"async\" src=\"${getLogo(item)}\" alt=\"${item.name}\">\r\n        <div class=\"expo-z2h-card-info\">\r\n          <strong>${item.name}<\/strong>\r\n          <span>Stand ${item.stand}<\/span>\r\n        <\/div>\r\n        <div class=\"expo-z2h-badge\">${item.stand}<\/div>\r\n      `;\r\n      addFallback(card.querySelector(\"img\"), item.name);\r\n      card.addEventListener(\"mouseenter\", function(){ showExhibitor(item.name, false); });\r\n      card.addEventListener(\"focus\", function(){ showExhibitor(item.name, false); });\r\n      card.addEventListener(\"click\", function(e){\r\n        e.preventDefault();\r\n        openExhibitor(item, true);\r\n      });\r\n      card.addEventListener(\"keydown\", function(e){\r\n        if(e.key === \"Enter\" || e.key === \" \"){\r\n          e.preventDefault();\r\n          openExhibitor(item, true);\r\n        }\r\n      });\r\n      list.appendChild(card);\r\n    });\r\n\r\n    updateActiveClasses();\r\n  }\r\n\r\n  function renderMapElements(){\r\n    markers.innerHTML = \"\";\r\n    callouts.innerHTML = \"\";\r\n\r\n    exhibitors.forEach(function(item){\r\n      const markerPositions = getMarkerPositions(item);\r\n\r\n      markerPositions.forEach(function(p){\r\n        const marker = document.createElement(\"button\");\r\n        marker.type = \"button\";\r\n        marker.className = \"expo-z2h-marker\";\r\n        marker.dataset.name = item.name;\r\n        marker.dataset.stand = p.standId;\r\n        marker.style.left = p.markerX + \"%\";\r\n        marker.style.top = p.markerY + \"%\";\r\n        marker.setAttribute(\"aria-label\", item.name + \" - Stand \" + p.standId);\r\n        marker.setAttribute(\"title\", item.name + \" - Stand \" + p.standId);\r\n        marker.addEventListener(\"mouseenter\", function(){ showExhibitor(item.name, false); });\r\n        marker.addEventListener(\"focus\", function(){ showExhibitor(item.name, false); });\r\n        marker.addEventListener(\"click\", function(e){\r\n          e.preventDefault();\r\n          e.stopPropagation();\r\n          openExhibitor(item, true);\r\n        });\r\n        markers.appendChild(marker);\r\n      });\r\n\r\n      const c = document.createElement(\"div\");\r\n      const pos = getCalloutPosition(item);\r\n      c.className = \"expo-z2h-callout\";\r\n      c.dataset.name = item.name;\r\n      c.style.left = pos.x + \"%\";\r\n      c.style.top = pos.y + \"%\";\r\n      c.setAttribute(\"tabindex\", \"0\");\r\n      c.setAttribute(\"role\", \"button\");\r\n      c.setAttribute(\"aria-label\", \"Ver ubicaci\u00f3n de \" + item.name + \", stand \" + item.stand);\r\n      c.innerHTML = `\r\n        <img decoding=\"async\" src=\"${getLogo(item)}\" alt=\"${item.name}\">\r\n        <div class=\"expo-z2h-callout-info\">\r\n          <strong>${item.name}<\/strong>\r\n          <span>Stand ${item.stand}<\/span>\r\n        <\/div>\r\n      `;\r\n      addFallback(c.querySelector(\"img\"), item.name);\r\n      c.addEventListener(\"mouseenter\", function(){ showExhibitor(item.name, false); });\r\n      c.addEventListener(\"click\", function(e){\r\n        e.preventDefault();\r\n        e.stopPropagation();\r\n        openExhibitor(item, true);\r\n      });\r\n      c.addEventListener(\"keydown\", function(e){\r\n        if(e.key === \"Enter\" || e.key === \" \"){\r\n          e.preventDefault();\r\n          openExhibitor(item, true);\r\n        }\r\n      });\r\n      callouts.appendChild(c);\r\n    });\r\n  }\r\n\r\n  function updateActiveClasses(){\r\n    document.querySelectorAll(\".expo-z2h-card\").forEach(function(el){\r\n      el.classList.toggle(\"active\", el.dataset.name === activeName);\r\n    });\r\n    document.querySelectorAll(\".expo-z2h-marker\").forEach(function(el){\r\n      el.classList.toggle(\"active\", el.dataset.name === activeName);\r\n    });\r\n    document.querySelectorAll(\".expo-z2h-callout\").forEach(function(el){\r\n      el.classList.toggle(\"visible\", el.dataset.name === activeName);\r\n    });\r\n  }\r\n\r\n  function renderHighlight(item){\r\n    overlay.innerHTML = \"\";\r\n    getAllRects(item).forEach(function(pos){\r\n      const h = document.createElement(\"div\");\r\n      h.className = \"expo-z2h-stand-highlight\";\r\n      h.style.left = pos.x + \"%\";\r\n      h.style.top = pos.y + \"%\";\r\n      h.style.width = pos.w + \"%\";\r\n      h.style.height = pos.h + \"%\";\r\n      overlay.appendChild(h);\r\n    });\r\n  }\r\n\r\n  function getConnectorEnd(calloutRect, stageRect, startX, startY){\r\n    const centerX = calloutRect.left - stageRect.left + calloutRect.width \/ 2;\r\n    const centerY = calloutRect.top - stageRect.top + calloutRect.height \/ 2;\r\n    const dx = startX - centerX;\r\n    const dy = startY - centerY;\r\n    let endX = centerX;\r\n    let endY = centerY;\r\n\r\n    if (Math.abs(dx \/ calloutRect.width) > Math.abs(dy \/ calloutRect.height)) {\r\n      endX = dx < 0 ? calloutRect.left - stageRect.left : calloutRect.right - stageRect.left;\r\n    } else {\r\n      endY = dy < 0 ? calloutRect.top - stageRect.top : calloutRect.bottom - stageRect.top;\r\n    }\r\n    return { endX, endY };\r\n  }\r\n\r\n  function drawConnector(){\r\n    connectorPath.classList.remove(\"visible\");\r\n    connectorPath.setAttribute(\"d\", \"\");\r\n    if(!activeName) return;\r\n\r\n    const itemMarkers = Array.from(markers.children).filter(el => el.dataset.name === activeName);\r\n    const callout = Array.from(callouts.children).find(el => el.dataset.name === activeName);\r\n    if(!itemMarkers.length || !callout) return;\r\n\r\n    const stageRect = mapStage.getBoundingClientRect();\r\n    const calloutRect = callout.getBoundingClientRect();\r\n    const paths = [];\r\n\r\n    itemMarkers.forEach(function(marker){\r\n      const mRect = marker.getBoundingClientRect();\r\n      const startX = mRect.left - stageRect.left + mRect.width \/ 2;\r\n      const startY = mRect.top - stageRect.top + mRect.height \/ 2;\r\n      const end = getConnectorEnd(calloutRect, stageRect, startX, startY);\r\n      const midY = startY + (end.endY - startY) * 0.52;\r\n      paths.push([\r\n        \"M\", startX.toFixed(2), startY.toFixed(2),\r\n        \"L\", startX.toFixed(2), midY.toFixed(2),\r\n        \"L\", end.endX.toFixed(2), midY.toFixed(2),\r\n        \"L\", end.endX.toFixed(2), end.endY.toFixed(2)\r\n      ].join(\" \"));\r\n    });\r\n\r\n    connectorSvg.setAttribute(\"viewBox\", `0 0 ${mapStage.clientWidth} ${mapStage.clientHeight}`);\r\n    connectorPath.setAttribute(\"d\", paths.join(\" \"));\r\n    requestAnimationFrame(function(){ connectorPath.classList.add(\"visible\"); });\r\n  }\r\n\r\n  function updateTopCard(item){\r\n    currentItem = item;\r\n    topTitle.textContent = item ? item.name : \"Seleccione un expositor\";\r\n    topIntro.textContent = item\r\n      ? \"Esta es la ubicaci\u00f3n asignada a este expositor. En el plano encontrar\u00e1 su stand destacado para localizarlo de forma r\u00e1pida y sencilla dentro del recinto.\"\r\n      : \"Puede localizar un expositor desde el plano o desde el desplegable inferior. Cuando seleccione uno, aqu\u00ed ver\u00e1 su informaci\u00f3n y su stand asignado.\";\r\n    topStandMeta.textContent = item ? item.stand : \"\u2014\";\r\n    topStandBig.textContent = item ? item.stand : \"\u2014\";\r\n    topToggleName.textContent = item ? item.name : \"\";\r\n    topToggleStand.textContent = item ? \"\u00b7 Stand \" + item.stand : \"\";\r\n    topLogo.dataset.fallbackApplied = \"0\";\r\n    topLogo.src = item ? getLogo(item) : createFallbackLogo(\"EXPOSITOR\");\r\n    topLogo.alt = item ? \"Logo de \" + item.name : \"Logo del expositor\";\r\n    addFallback(topLogo, item ? item.name : \"EXPOSITOR\");\r\n  }\r\n\r\n  function showExhibitor(name, shouldPin){\r\n    const item = exhibitors.find(e => e.name === name);\r\n    if(!item) return;\r\n    activeName = name;\r\n    if(shouldPin) pinnedName = name;\r\n    renderHighlight(item);\r\n    updateActiveClasses();\r\n    requestAnimationFrame(drawConnector);\r\n  }\r\n\r\n  function clearSelection(){\r\n    activeName = null;\r\n    pinnedName = null;\r\n    currentItem = null;\r\n    overlay.innerHTML = \"\";\r\n    connectorPath.classList.remove(\"visible\");\r\n    connectorPath.setAttribute(\"d\", \"\");\r\n    updateTopCard(null);\r\n    setTopCardOpen(false);\r\n    updateActiveClasses();\r\n    try{\r\n      const url = new URL(window.location.href);\r\n      url.hash = \"\";\r\n      url.searchParams.delete(\"expositor\");\r\n      window.history.replaceState({}, \"\", url.toString());\r\n    }catch(e){}\r\n  }\r\n\r\n  function focusOnExhibitor(item, keepZoom = false){\r\n    if(!item) return;\r\n    const avg = getAverageMarker(item);\r\n    if(!keepZoom){\r\n      const targetZoom = isMobile() ? 2.10 : 1.00;\r\n      if(Math.abs(zoom - targetZoom) > .001){\r\n        zoom = clampZoom(targetZoom);\r\n        mapStage.style.width = zoom === 1 ? \"100%\" : (zoom * 100) + \"%\";\r\n        mapStage.style.marginLeft = zoom <= 1 ? \"auto\" : \"0\";\r\n        mapStage.style.marginRight = zoom <= 1 ? \"auto\" : \"0\";\r\n        updateZoomControls();\r\n      }\r\n    }\r\n    requestAnimationFrame(function(){\r\n      const x = (avg.x \/ 100) * mapStage.offsetWidth;\r\n      const y = (avg.y \/ 100) * mapStage.offsetHeight;\r\n      mapScroll.scrollTo({\r\n        left: Math.max(0, x - mapScroll.clientWidth \/ 2),\r\n        top: Math.max(0, y - mapScroll.clientHeight \/ 2),\r\n        behavior: \"smooth\"\r\n      });\r\n      requestAnimationFrame(drawConnector);\r\n    });\r\n  }\r\n\r\n  function openExhibitor(item, updateHash){\r\n    updateTopCard(item);\r\n    setTopCardOpen(true);\r\n    showExhibitor(item.name, true);\r\n    setListOpen(true);\r\n    if(updateHash) updateUrl(item);\r\n    focusOnExhibitor(item);\r\n    topCard.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\r\n  }\r\n\r\n  function shareCurrent(){\r\n    if(!currentItem) return;\r\n    const shareData = {\r\n      title: \"Ubicaci\u00f3n de \" + currentItem.name + \" \u00b7 Zona 2\",\r\n      text: currentItem.name + \" \u00b7 Stand \" + currentItem.stand + \" \u00b7 Zona 2\",\r\n      url: window.location.href\r\n    };\r\n    if(navigator.share){ navigator.share(shareData).catch(function(){}); return; }\r\n    if(navigator.clipboard && window.isSecureContext){ navigator.clipboard.writeText(window.location.href).then(function(){}); }\r\n  }\r\n\r\n  function openPlanOnly(){\r\n    if(planOnlyMode) return;\r\n    planOnlyMode = true;\r\n    mapPanel.classList.add(\"plan-only\");\r\n    document.body.classList.add(\"expo-z2h-lock\");\r\n    resetZoom(getPlanOnlyZoom());\r\n    setTimeout(function(){\r\n      if(activeName) drawConnector();\r\n      planOnlyClose.focus({preventScroll:true});\r\n    }, 40);\r\n  }\r\n  function closePlanOnly(){\r\n    if(!planOnlyMode) return;\r\n    planOnlyMode = false;\r\n    mapPanel.classList.remove(\"plan-only\");\r\n    document.body.classList.remove(\"expo-z2h-lock\");\r\n    resetZoom(getDefaultZoom());\r\n    setTimeout(function(){\r\n      if(activeName) drawConnector();\r\n      planOnlyOpen.focus({preventScroll:true});\r\n    }, 40);\r\n  }\r\n\r\n  let pinchStartDist = 0;\r\n  let pinchStartZoom = 1;\r\n  function touchDistance(t1, t2){\r\n    const dx = t2.clientX - t1.clientX;\r\n    const dy = t2.clientY - t1.clientY;\r\n    return Math.hypot(dx, dy);\r\n  }\r\n  function touchMid(t1, t2){\r\n    const rect = mapScroll.getBoundingClientRect();\r\n    return { x: ((t1.clientX + t2.clientX) \/ 2) - rect.left, y: ((t1.clientY + t2.clientY) \/ 2) - rect.top };\r\n  }\r\n\r\n  zoomOut.addEventListener(\"click\", () => applyZoom(zoom - STEP_ZOOM));\r\n  zoomIn.addEventListener(\"click\", () => applyZoom(zoom + STEP_ZOOM));\r\n  zoomReset.addEventListener(\"click\", () => resetZoom());\r\n  planOnlyOpen.addEventListener(\"click\", openPlanOnly);\r\n  planOnlyClose.addEventListener(\"click\", closePlanOnly);\r\n  openPlanBtnTop.addEventListener(\"click\", function(){\r\n    openPlanOnly();\r\n    if(currentItem) setTimeout(function(){ focusOnExhibitor(currentItem, true); }, 100);\r\n  });\r\n  locateBtn.addEventListener(\"click\", function(){\r\n    if(currentItem){\r\n      showExhibitor(currentItem.name, true);\r\n      focusOnExhibitor(currentItem);\r\n      mapPanel.scrollIntoView({behavior:\"smooth\", block:\"start\"});\r\n    }\r\n  });\r\n  shareBtn.addEventListener(\"click\", shareCurrent);\r\n  topToggle.addEventListener(\"click\", function(){\r\n    setTopCardOpen(topCard.classList.contains(\"expo-z2h-top-collapsed\"));\r\n  });\r\n\r\n  listToggle.addEventListener(\"click\", function(){\r\n    const open = !listPanel.classList.contains(\"open\");\r\n    setListOpen(open);\r\n  });\r\n\r\n  search.addEventListener(\"input\", function(){\r\n    if(!listPanel.classList.contains(\"open\")) setListOpen(true);\r\n    renderList(this.value);\r\n    if(!this.value.trim() && pinnedName){ showExhibitor(pinnedName, true); }\r\n    else if(this.value.trim() && activeName && !Array.from(list.children).some(el => el.dataset && el.dataset.name === activeName)){ clearSelection(); }\r\n  });\r\n\r\n  mapStage.addEventListener(\"mouseleave\", function(){ if(pinnedName){ showExhibitor(pinnedName, false); } });\r\n  mapStage.addEventListener(\"click\", function(e){\r\n    if(!e.target.closest(\".expo-z2h-marker\") && !e.target.closest(\".expo-z2h-callout\")){\r\n      clearSelection();\r\n    }\r\n  });\r\n  document.addEventListener(\"click\", function(e){ if(!root.contains(e.target) && !planOnlyMode) clearSelection(); });\r\n  document.addEventListener(\"keydown\", function(e){ if(e.key === \"Escape\" && planOnlyMode){ e.preventDefault(); closePlanOnly(); } });\r\n\r\n  mapScroll.addEventListener(\"touchstart\", function(e){\r\n    if(e.touches.length !== 2) return;\r\n    pinchStartDist = touchDistance(e.touches[0], e.touches[1]);\r\n    pinchStartZoom = zoom;\r\n  }, {passive:true});\r\n\r\n  mapScroll.addEventListener(\"touchmove\", function(e){\r\n    if(e.touches.length !== 2 || !pinchStartDist) return;\r\n    e.preventDefault();\r\n    const dist = touchDistance(e.touches[0], e.touches[1]);\r\n    const scale = dist \/ pinchStartDist;\r\n    applyZoom(pinchStartZoom * scale, touchMid(e.touches[0], e.touches[1]));\r\n  }, {passive:false});\r\n\r\n  mapScroll.addEventListener(\"touchend\", function(e){\r\n    if(e.touches.length < 2){ pinchStartDist = 0; pinchStartZoom = zoom; }\r\n  }, {passive:true});\r\n\r\n  window.addEventListener(\"resize\", function(){\r\n    if(!planOnlyMode) resetZoom(getDefaultZoom());\r\n    if(activeName) requestAnimationFrame(drawConnector);\r\n  });\r\n\r\n  window.addEventListener(\"hashchange\", function(){\r\n    const rid = requestedId();\r\n    if(!rid) return;\r\n    const item = exhibitors.find(ex => exhibitorId(ex) === rid);\r\n    if(item) openExhibitor(item, false);\r\n  });\r\n\r\n  mapImage.addEventListener(\"load\", function(){ if(activeName) requestAnimationFrame(drawConnector); });\r\n\r\n  renderList();\r\n  renderMapElements();\r\n  updateTopCard(null);\r\n  setTopCardOpen(false);\r\n  setListOpen(false);\r\n  resetZoom(getDefaultZoom());\r\n\r\n  const rid = requestedId();\r\n  if(rid){\r\n    const item = exhibitors.find(ex => exhibitorId(ex) === rid);\r\n    if(item){\r\n      openExhibitor(item, false);\r\n    }\r\n  }\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\n<\/div>\n\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>EXPOSECURITY \u00b7 Zona 1 \u00b7 Plano horizontal afinado Caja M\u00e1gica Ubicaci\u00f3n de expositores \u00b7 Zona 1 Plano horizontal interactivo. Pulsa un expositor o un punto del plano para ver su ubicaci\u00f3n, su stand y localizarlo de forma r\u00e1pida dentro del recinto. Ver ficha del expositor \u2304 Ubicaci\u00f3n de expositor Zona 1 Ficha del expositor Seleccione [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2399","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Planos del recinto - EXPOSECURITY<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/exposecurity.net\/en\/planos-del-recinto\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Planos del recinto - EXPOSECURITY\" \/>\n<meta property=\"og:description\" content=\"EXPOSECURITY \u00b7 Zona 1 \u00b7 Plano horizontal afinado Caja M\u00e1gica Ubicaci\u00f3n de expositores \u00b7 Zona 1 Plano horizontal interactivo. Pulsa un expositor o un punto del plano para ver su ubicaci\u00f3n, su stand y localizarlo de forma r\u00e1pida dentro del recinto. Ver ficha del expositor \u2304 Ubicaci\u00f3n de expositor Zona 1 Ficha del expositor Seleccione [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/exposecurity.net\/en\/planos-del-recinto\/\" \/>\n<meta property=\"og:site_name\" content=\"EXPOSECURITY\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-08T17:17:34+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"36 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/exposecurity.net\\\/planos-del-recinto\\\/\",\"url\":\"https:\\\/\\\/exposecurity.net\\\/planos-del-recinto\\\/\",\"name\":\"Planos del recinto - EXPOSECURITY\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/exposecurity.net\\\/#website\"},\"datePublished\":\"2026-06-26T15:22:37+00:00\",\"dateModified\":\"2026-10-08T17:17:34+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/exposecurity.net\\\/planos-del-recinto\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/exposecurity.net\\\/planos-del-recinto\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/exposecurity.net\\\/planos-del-recinto\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/exposecurity.net\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Planos del recinto\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/exposecurity.net\\\/#website\",\"url\":\"https:\\\/\\\/exposecurity.net\\\/\",\"name\":\"EXPOSECURITY\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/exposecurity.net\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/exposecurity.net\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/exposecurity.net\\\/#organization\",\"name\":\"EXPOSECURITY\",\"url\":\"https:\\\/\\\/exposecurity.net\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/exposecurity.net\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/exposecurity.net\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/Presentacion-ExpoSecurity00.png\",\"contentUrl\":\"https:\\\/\\\/exposecurity.net\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/Presentacion-ExpoSecurity00.png\",\"width\":1473,\"height\":164,\"caption\":\"EXPOSECURITY\"},\"image\":{\"@id\":\"https:\\\/\\\/exposecurity.net\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Site plans - EXPOSECURITY","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/exposecurity.net\/en\/planos-del-recinto\/","og_locale":"en_GB","og_type":"article","og_title":"Planos del recinto - EXPOSECURITY","og_description":"EXPOSECURITY \u00b7 Zona 1 \u00b7 Plano horizontal afinado Caja M\u00e1gica Ubicaci\u00f3n de expositores \u00b7 Zona 1 Plano horizontal interactivo. Pulsa un expositor o un punto del plano para ver su ubicaci\u00f3n, su stand y localizarlo de forma r\u00e1pida dentro del recinto. Ver ficha del expositor \u2304 Ubicaci\u00f3n de expositor Zona 1 Ficha del expositor Seleccione [&hellip;]","og_url":"https:\/\/exposecurity.net\/en\/planos-del-recinto\/","og_site_name":"EXPOSECURITY","article_modified_time":"2026-10-08T17:17:34+00:00","twitter_card":"summary_large_image","twitter_misc":{"Estimated reading time":"36 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/exposecurity.net\/planos-del-recinto\/","url":"https:\/\/exposecurity.net\/planos-del-recinto\/","name":"Site plans - EXPOSECURITY","isPartOf":{"@id":"https:\/\/exposecurity.net\/#website"},"datePublished":"2026-06-26T15:22:37+00:00","dateModified":"2026-10-08T17:17:34+00:00","breadcrumb":{"@id":"https:\/\/exposecurity.net\/planos-del-recinto\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/exposecurity.net\/planos-del-recinto\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/exposecurity.net\/planos-del-recinto\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/exposecurity.net\/"},{"@type":"ListItem","position":2,"name":"Planos del recinto"}]},{"@type":"WebSite","@id":"https:\/\/exposecurity.net\/#website","url":"https:\/\/exposecurity.net\/","name":"EXPOSECURITY","description":"","publisher":{"@id":"https:\/\/exposecurity.net\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/exposecurity.net\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/exposecurity.net\/#organization","name":"EXPOSECURITY","url":"https:\/\/exposecurity.net\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/exposecurity.net\/#\/schema\/logo\/image\/","url":"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/03\/Presentacion-ExpoSecurity00.png","contentUrl":"https:\/\/exposecurity.net\/wp-content\/uploads\/2026\/03\/Presentacion-ExpoSecurity00.png","width":1473,"height":164,"caption":"EXPOSECURITY"},"image":{"@id":"https:\/\/exposecurity.net\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/exposecurity.net\/en\/wp-json\/wp\/v2\/pages\/2399","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/exposecurity.net\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/exposecurity.net\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/exposecurity.net\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/exposecurity.net\/en\/wp-json\/wp\/v2\/comments?post=2399"}],"version-history":[{"count":977,"href":"https:\/\/exposecurity.net\/en\/wp-json\/wp\/v2\/pages\/2399\/revisions"}],"predecessor-version":[{"id":4556,"href":"https:\/\/exposecurity.net\/en\/wp-json\/wp\/v2\/pages\/2399\/revisions\/4556"}],"wp:attachment":[{"href":"https:\/\/exposecurity.net\/en\/wp-json\/wp\/v2\/media?parent=2399"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}