{"id":1891,"date":"2026-05-24T11:52:28","date_gmt":"2026-05-24T09:52:28","guid":{"rendered":"https:\/\/www.teresitatango.se\/?page_id=1891"},"modified":"2026-08-16T21:59:11","modified_gmt":"2026-08-16T19:59:11","slug":"skane-calendar","status":"publish","type":"page","link":"https:\/\/www.teresitatango.se\/en\/skane-calendar\/","title":{"rendered":"Tango in Sk\u00e5ne"},"content":{"rendered":"<!-- ===== SK\u00c5NE CALENDAR: FACTUAL EVENT INDEX v1 ===== -->\n\n<section id=\"tt-region\" class=\"tt-region-page\" data-default-area=\"skane\" aria-label=\"Sk\u00e5ne event calendar\">\n<script>\n(function(){\n  if (window.__SKANE_CALENDAR_PREINIT_GUARD__) return;\n  window.__SKANE_CALENDAR_PREINIT_GUARD__ = true;\n\n\/*\n  Pre-init guard:\n  - clears old saved filter state\n  - blocks disabled legacy external calendar sources before the existing app starts\n  - keeps permitted TangoSweden Sk\u00e5ne fetching available\n*\/\n\n  try {\n    localStorage.removeItem('ttRegionFilters');\n  } catch (e) {}\n\n  var blockedSourcePatterns = [\n    \/tangodk\/i,\n    \/tango\\.dk\/i,\n    \/brownbearsw\\.com\/i,\n    \/brownbear\/i,\n    \/\\\/wp-json\\\/teresita\\\/v1\\\/tangodk\/i\n  ];\n\n  function isBlockedCalendarSource(url) {\n    url = String(url || '');\n    return blockedSourcePatterns.some(function(rx){ return rx.test(url); });\n  }\n\n  if (typeof window.fetch === 'function') {\n    var nativeFetch = window.fetch.bind(window);\n\n    window.fetch = function(input, init) {\n      var url = '';\n\n      try {\n        url = typeof input === 'string' ? input : (input && input.url) || '';\n      } catch (e) {}\n\n      if (isBlockedCalendarSource(url)) {\n        console.warn('[Sk\u00e5ne Calendar] Blocked unpermitted calendar source:', url);\n\n        return Promise.resolve(\n          new Response(JSON.stringify([]), {\n            status: 200,\n            headers: { 'Content-Type': 'application\/json' }\n          })\n        );\n      }\n\n      return nativeFetch(input, init);\n    };\n  }\n})();\n<\/script>\n\n\n  <style>\n    #tt-region,#tt-region *{box-sizing:border-box;}\n    #tt-region{\n      --tt-red:#bb0d3f;\n      --tt-red-dark:#8e0a30;\n      --tt-ink:#171216;\n      --tt-muted:#5f5660;\n      --tt-soft:#f7f2f4;\n      --tt-soft-2:#f1ecef;\n      --tt-line:#ead8df;\n      --tt-card:#fff;\n      --tt-dark:#170811;\n      --tt-shadow:0 18px 48px rgba(23,18,22,.10);\n      --tt-shadow-soft:0 10px 28px rgba(23,18,22,.08);\n      font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;\n      color:var(--tt-ink);\n      background:var(--tt-soft);\n      line-height:1.55;\n      overflow:hidden;\n    }\n    #tt-region a{color:var(--tt-red);}\n    #tt-region .tt-wrap{width:min(1180px,calc(100% - 32px));margin:0 auto;}\n    #tt-region .tt-narrow{width:min(900px,calc(100% - 32px));margin:0 auto;}\n    #tt-region .tt-section{padding:74px 0;}\n    #tt-region .tt-section-tight{padding:48px 0;}\n    #tt-region .tt-eyebrow{display:inline-flex;align-items:center;gap:8px;padding:7px 12px;border-radius:999px;background:#fff;border:1px solid rgba(187,13,63,.18);color:var(--tt-red);font-size:12px;font-weight:900;text-transform:uppercase;letter-spacing:.055em;}\n    #tt-region .tt-h1,#tt-region .tt-h2,#tt-region .tt-h3{margin:0;line-height:1.1;letter-spacing:-.025em;}\n    #tt-region .tt-h1{font-size:clamp(42px,7vw,82px);color:#fff;text-shadow:0 6px 30px rgba(0,0,0,.50);}\n    #tt-region .tt-h2{font-size:clamp(30px,4.1vw,50px);color:var(--tt-red);text-align:center;}\n    #tt-region .tt-h3{font-size:22px;color:var(--tt-red);}\n    #tt-region .tt-sub{max-width:780px;margin:14px auto 0;text-align:center;color:var(--tt-muted);font-size:17px;}\n    #tt-region .tt-btn-row{display:flex;gap:12px;flex-wrap:wrap;align-items:center;justify-content:center;margin-top:26px;}\n    #tt-region .tt-btn{display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:11px 18px;border-radius:999px;border:2px solid var(--tt-red);font-weight:900;text-decoration:none;line-height:1.15;transition:transform .15s ease,box-shadow .15s ease,background .15s ease;cursor:pointer;}\n    #tt-region .tt-btn:hover{transform:translateY(-1px);box-shadow:0 10px 24px rgba(187,13,63,.18);}\n    #tt-region .tt-btn-primary{background:var(--tt-red);color:#fff!important;}\n    #tt-region .tt-btn-secondary{background:#fff;color:var(--tt-red)!important;}\n    #tt-region .tt-mini-note{color:var(--tt-muted);font-size:13px;}\n\n    \/* Hero *\/\n    #tt-region .tt-hero{position:relative;min-height:610px;display:flex;align-items:center;justify-content:center;padding:84px 0 72px;background-image:linear-gradient(180deg, rgba(0,0,0,.10), rgba(0,0,0,.28)),url(\"https:\/\/www.teresitatango.se\/wp-content\/uploads\/2026\/05\/ryggbild-e1779220776845.jpg\");background-size:cover;background-position:center 56%;}\n    #tt-region .tt-hero::after{content:\"\";position:absolute;inset:auto 0 0;height:160px;background:linear-gradient(180deg,rgba(247,242,244,0),var(--tt-soft));pointer-events:none;}\n    #tt-region .tt-hero-card{position:relative;z-index:1;width:min(980px,calc(100% - 32px));margin:0 auto;padding:34px 28px 32px;border-radius:28px;text-align:center;background:rgba(0,0,0,.12);border:1px solid rgba(255,255,255,.22);box-shadow:0 24px 90px rgba(0,0,0,.26);backdrop-filter:blur(1px);}\n    #tt-region .tt-hero-kicker{margin-bottom:12px;color:#fff;font-size:13px;font-weight:900;text-transform:uppercase;letter-spacing:.08em;text-shadow:0 3px 16px rgba(0,0,0,.55);}\n    #tt-region .tt-hero-lead{max-width:850px;margin:18px auto 0;color:#fff;font-size:clamp(18px,2.2vw,24px);line-height:1.45;text-shadow:0 4px 20px rgba(0,0,0,.62);text-wrap:balance;}\n    #tt-region .tt-hero-small{max-width:780px;margin:16px auto 0;color:rgba(255,255,255,.94);font-size:15.5px;text-shadow:0 3px 18px rgba(0,0,0,.62);}\n\n    \/* App navigation *\/\n    #tt-region .tt-app-nav{position:sticky;top:0;z-index:30;background:rgba(255,255,255,.92);border-bottom:1px solid var(--tt-line);backdrop-filter:blur(10px);}\n    #tt-region .tt-app-nav-inner{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;align-items:center;overflow-x:visible;padding:12px 16px;scrollbar-width:none;}\n    #tt-region .tt-app-nav-inner::-webkit-scrollbar{display:none;}\n    #tt-region .tt-nav-pill{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;padding:8px 13px;border-radius:999px;background:#fff;border:1px solid var(--tt-line);color:var(--tt-ink);font-weight:850;font-size:13px;text-decoration:none;}\n    #tt-region .tt-nav-pill:hover{border-color:rgba(187,13,63,.40);color:var(--tt-red);}\n\n    \/* Calendar *\/\n    #tt-region .tt-calendar-section{background:#fff;}\n    #tt-region .tt-calendar-shell{margin-top:30px;display:grid;grid-template-columns:320px 1fr;gap:22px;align-items:start;}\n    #tt-region .tt-filter-panel{position:sticky;top:58px;background:var(--tt-soft);border:1px solid var(--tt-line);border-radius:24px;padding:18px;box-shadow:var(--tt-shadow-soft);}\n    #tt-region .tt-filter-head{display:flex;align-items:center;justify-content:space-between;gap:12px;}\n    #tt-region .tt-filter-title{margin:0 0 10px;color:var(--tt-red);font-size:17px;font-weight:950;}\n    #tt-region .tt-filter-head .tt-filter-title{margin:0;}\n    #tt-region .tt-filter-toggle{display:none;border:1px solid var(--tt-line);background:#fff;color:var(--tt-red);border-radius:999px;min-height:38px;padding:8px 12px;font-size:13px;font-weight:950;cursor:pointer;line-height:1;white-space:nowrap;}\n    #tt-region .tt-filter-summary{display:none;margin:10px 0 0;padding:10px 12px;border-radius:14px;background:#fff;border:1px solid var(--tt-line);color:var(--tt-muted);font-size:13px;line-height:1.45;max-width:100%;overflow-wrap:anywhere;}\n    #tt-region .tt-filter-summary strong{color:var(--tt-red);}\n    #tt-region .tt-filter-body{display:block;}\n    #tt-region .tt-input,#tt-region .tt-select{width:100%;min-height:44px;border:1px solid var(--tt-line);border-radius:14px;background:#fff;color:var(--tt-ink);padding:10px 12px;font-size:15px;outline:none;}\n    #tt-region .tt-input:focus,#tt-region .tt-select:focus{border-color:rgba(187,13,63,.48);box-shadow:0 0 0 4px rgba(187,13,63,.08);}\n    #tt-region .tt-filter-group{margin-top:14px;}\n    #tt-region .tt-filter-label{display:block;margin-bottom:7px;color:var(--tt-muted);font-size:12px;font-weight:900;text-transform:uppercase;letter-spacing:.04em;}\n    #tt-region .tt-filter-inline-caption{margin:-2px 0 9px;color:var(--tt-muted);font-size:12.5px;line-height:1.35;}\n    #tt-region .tt-chip-list{display:flex;gap:8px;flex-wrap:wrap;}\n    #tt-region .tt-chip{border:1px solid var(--tt-line);background:#fff;color:var(--tt-ink);border-radius:999px;padding:8px 11px;font-size:13px;font-weight:850;cursor:pointer;}\n    #tt-region .tt-chip.is-active{background:var(--tt-red);border-color:var(--tt-red);color:#fff;}\n    #tt-region .tt-chip.is-country-hidden{display:none!important;}\n    #tt-region .tt-filter-divider{height:1px;background:var(--tt-line);margin:15px 0 4px;}\n    #tt-region .tt-weekend-shortcut{width:100%;min-height:42px;margin:14px 0 0;border:2px solid var(--tt-red);border-radius:999px;background:var(--tt-red);color:#fff;font-size:14px;font-weight:950;cursor:pointer;box-shadow:0 10px 24px rgba(187,13,63,.14);}\n    #tt-region .tt-weekend-shortcut:hover{transform:translateY(-1px);box-shadow:0 14px 30px rgba(187,13,63,.20);}\n\n    #tt-region .tt-mini-calendar{margin-top:14px;padding:12px;border-radius:18px;background:#fff;border:1px solid var(--tt-line);box-shadow:0 8px 20px rgba(23,18,22,.04);}\n    #tt-region .tt-mini-calendar-head{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:9px;}\n    #tt-region .tt-mini-calendar-title{color:var(--tt-red);font-size:14px;font-weight:950;line-height:1.1;text-align:center;}\n    #tt-region .tt-mini-calendar-nav{width:32px;height:32px;border-radius:999px;border:1px solid var(--tt-line);background:#fff;color:var(--tt-red);font-size:17px;font-weight:950;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;}\n    #tt-region .tt-mini-calendar-nav:hover{border-color:rgba(187,13,63,.40);background:#fff7fa;}\n    #tt-region .tt-mini-calendar-weekdays,#tt-region .tt-mini-calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:4px;}\n    #tt-region .tt-mini-calendar-weekdays span{color:var(--tt-muted);font-size:10px;font-weight:950;text-align:center;text-transform:uppercase;letter-spacing:.04em;}\n    #tt-region .tt-mini-day{position:relative;min-height:34px;border:1px solid transparent;background:#fff;border-radius:10px;color:var(--tt-ink);font-size:12px;font-weight:850;cursor:pointer;display:flex;align-items:center;justify-content:center;}\n    #tt-region .tt-mini-day:hover{border-color:rgba(187,13,63,.35);background:#fff7fa;}\n    #tt-region .tt-mini-day.is-outside{color:#b8aeb4;background:#fbf8f9;}\n    #tt-region .tt-mini-day.is-past{color:#c7bdc3;cursor:default;}\n    #tt-region .tt-mini-day.is-past:hover{border-color:transparent;background:#fff;}\n    #tt-region .tt-mini-day.has-events{border-color:rgba(187,13,63,.24);background:#fff8fb;color:var(--tt-red);font-weight:950;}\n    #tt-region .tt-mini-day.has-events::after{content:attr(data-count);position:absolute;right:3px;bottom:2px;min-width:12px;height:12px;border-radius:999px;background:var(--tt-red);color:#fff;font-size:8px;font-weight:950;line-height:12px;text-align:center;}\n    #tt-region .tt-mini-day.is-today{box-shadow:inset 0 0 0 2px rgba(187,13,63,.30);}\n    #tt-region .tt-mini-day.is-selected{background:var(--tt-red);border-color:var(--tt-red);color:#fff;box-shadow:0 8px 18px rgba(187,13,63,.18);}\n    #tt-region .tt-mini-day.is-selected::after{background:#fff;color:var(--tt-red);}\n    #tt-region .tt-mini-calendar-foot{margin-top:9px;color:var(--tt-muted);font-size:11.5px;line-height:1.3;}\n    #tt-region .tt-filter-details{margin-top:14px;border:1px solid var(--tt-line);border-radius:18px;background:#fff;box-shadow:0 8px 20px rgba(23,18,22,.04);overflow:hidden;}\n    #tt-region .tt-filter-details summary{display:flex;align-items:center;justify-content:space-between;gap:12px;cursor:pointer;list-style:none;padding:13px 14px;color:var(--tt-red);font-weight:950;}\n    #tt-region .tt-filter-details summary::-webkit-details-marker{display:none;}\n    #tt-region .tt-filter-details summary::after{content:\"\u2304\";display:inline-flex;align-items:center;justify-content:center;width:25px;height:25px;border-radius:999px;background:#f8eef2;color:var(--tt-red);font-weight:950;transition:transform .16s ease;}\n    #tt-region .tt-filter-details[open] summary::after{transform:rotate(180deg);}\n    #tt-region .tt-filter-details summary span{display:block;font-size:14px;line-height:1.15;}\n    #tt-region .tt-filter-details summary small{display:block;margin-top:2px;color:var(--tt-muted);font-weight:750;font-size:12px;line-height:1.2;}\n    #tt-region .tt-filter-details-body{padding:0 14px 14px;}\n    #tt-region .tt-date-select-grid{display:grid;grid-template-columns:1fr;gap:10px;margin-top:12px;}\n    #tt-region .tt-clear-date{width:100%;min-height:38px;margin-top:10px;border:1px solid var(--tt-line);border-radius:999px;background:#fff;color:var(--tt-red);font-weight:950;cursor:pointer;}\n    #tt-region .tt-clear-date:hover{border-color:rgba(187,13,63,.38);box-shadow:0 8px 18px rgba(23,18,22,.06);}\n    #tt-region .tt-filter-reset{width:100%;min-height:42px;margin-top:14px;border:2px solid var(--tt-red);border-radius:999px;background:#fff;color:var(--tt-red);font-weight:950;cursor:pointer;}\n    #tt-region .tt-filter-reset:hover{background:#fff5f8;box-shadow:0 10px 24px rgba(187,13,63,.10);}\n    #tt-region .tt-source-card{margin-top:14px;padding:13px;border-radius:16px;background:#fff;border:1px solid var(--tt-line);font-size:13px;color:var(--tt-muted);}\n    #tt-region .tt-trust-note{margin-top:10px;padding-top:10px;border-top:1px solid var(--tt-line);color:var(--tt-muted);font-size:12.5px;line-height:1.35;}\n    #tt-region .tt-trust-note strong{color:var(--tt-red);}\n\n    #tt-region .tt-calendar-main{min-width:0;}\n    #tt-region .tt-calendar-toolbar{display:flex;justify-content:space-between;gap:16px;align-items:center;margin-bottom:14px;padding:2px 0;}\n    #tt-region .tt-calendar-count{font-weight:950;color:var(--tt-red);font-size:17px;line-height:1.2;}\n    #tt-region .tt-updated{font-size:13px;color:var(--tt-muted);text-align:left;line-height:1.35;margin-top:4px;}\n    #tt-region .tt-view-toggle{display:grid;grid-template-columns:1fr 1fr;gap:10px;min-width:260px;align-items:center;justify-content:end;}\n    #tt-region .tt-view-btn{min-height:48px;border:2px solid var(--tt-line);background:#fff;border-radius:999px;padding:12px 16px;color:var(--tt-ink);font-size:15px;font-weight:950;cursor:pointer;box-shadow:0 8px 20px rgba(23,18,22,.07);transition:background .15s ease,color .15s ease,border-color .15s ease,transform .15s ease,box-shadow .15s ease;white-space:nowrap;}\n    #tt-region .tt-view-btn:hover{transform:translateY(-1px);border-color:rgba(187,13,63,.38);box-shadow:0 12px 26px rgba(23,18,22,.10);}\n    #tt-region .tt-view-btn.is-active{background:var(--tt-red);border-color:var(--tt-red);color:#fff;box-shadow:0 12px 28px rgba(187,13,63,.22);}\n    #tt-region .tt-active-filter-bar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:0 0 12px;min-height:0;position:relative;padding:2px 0 12px;}\n    #tt-region .tt-active-pill{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--tt-line);background:#fff;border-radius:999px;padding:7px 10px;color:var(--tt-muted);font-size:12.5px;font-weight:850;box-shadow:0 5px 16px rgba(23,18,22,.04);}\n    #tt-region .tt-active-pill strong{color:var(--tt-red);font-weight:950;}\n\n    \/* Event list *\/\n    #tt-region .tt-event-buttons{display:none!important;}\n    #tt-region .tt-event-card[data-href]{cursor:default;}\n    #tt-region .tt-event-list{display:grid;gap:14px;}\n    #tt-region .tt-event-month-divider{display:flex;align-items:center;gap:12px;margin:4px 0 -2px;color:var(--tt-red);font-weight:950;text-transform:uppercase;letter-spacing:.04em;font-size:12px;}\n    #tt-region .tt-event-month-divider::after{content:\"\";height:1px;background:var(--tt-line);flex:1;}\n    #tt-region .tt-event-card{position:relative;overflow:hidden;display:grid;grid-template-columns:82px 1fr;gap:16px;align-items:stretch;background:linear-gradient(180deg,#fff,#fffafd);border:1px solid var(--tt-line);border-radius:24px;padding:14px;box-shadow:var(--tt-shadow-soft);transition:transform .15s ease,box-shadow .15s ease,border-color .15s ease;}\n    #tt-region .tt-event-card::before{content:\"\";position:absolute;inset:0 auto 0 0;width:4px;background:linear-gradient(180deg,rgba(187,13,63,.18),rgba(187,13,63,.52));opacity:.72;}\n    #tt-region .tt-event-card:hover{transform:translateY(-1px);border-color:rgba(187,13,63,.34);box-shadow:0 16px 36px rgba(23,18,22,.10);}\n    #tt-region .tt-event-card[data-href]{cursor:pointer;}\n    #tt-region .tt-event-card[data-href]:focus{outline:3px solid rgba(187,13,63,.25);outline-offset:3px;}\n    #tt-region .tt-event-date{position:relative;overflow:hidden;border-radius:16px;background:linear-gradient(180deg,#fff,#f8eef2);border:1px solid var(--tt-line);text-align:center;padding:9px 6px;display:flex;flex-direction:column;justify-content:center;min-height:86px;}\n    #tt-region .tt-event-date .dow{font-size:12px;font-weight:950;color:var(--tt-red);text-transform:uppercase;letter-spacing:.04em;}\n    #tt-region .tt-event-date strong{font-size:31px;line-height:1;color:var(--tt-ink);}\n    #tt-region .tt-event-date .mon{font-size:12px;color:var(--tt-muted);font-weight:850;text-transform:uppercase;}\n    #tt-region .tt-event-date .rel{margin-top:5px;font-size:10.5px;font-weight:950;color:var(--tt-red);text-transform:uppercase;letter-spacing:.045em;line-height:1.1;}\n    #tt-region .tt-event-body{min-width:0;}\n    #tt-region .tt-event-meta{display:flex;flex-wrap:wrap;gap:7px;align-items:center;margin-bottom:6px;}\n    #tt-region .tt-badge{display:inline-flex;align-items:center;min-height:22px;border-radius:999px;background:#f8eef2;color:var(--tt-red);font-size:11.5px;font-weight:900;padding:3px 8px;}\n    #tt-region .tt-badge-city{background:#fff;border:1px solid var(--tt-line);color:var(--tt-ink);}\n    #tt-region .tt-event-title{margin:2px 0 5px;color:var(--tt-ink);font-size:20px;letter-spacing:-.02em;line-height:1.22;}\n    #tt-region .tt-event-info{display:grid;gap:4px;color:var(--tt-muted);font-size:14px;}\n    #tt-region .tt-event-info span{line-height:1.45;}\n    #tt-region .tt-event-info span:first-child strong,#tt-region .tt-event-info span:nth-child(2) strong{color:var(--tt-ink);}\n    #tt-region .tt-event-buttons{display:flex;gap:8px;flex-wrap:wrap;margin-top:13px;}\n    #tt-region .tt-small-btn{display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--tt-line);background:#fff;border-radius:999px;padding:7px 10px;color:var(--tt-red)!important;text-decoration:none;font-size:12px;font-weight:900;cursor:pointer;}\n    #tt-region .tt-small-btn:hover{border-color:rgba(187,13,63,.38);}\n    #tt-region .tt-event-buttons .tt-small-btn:first-child{background:var(--tt-red);border-color:var(--tt-red);color:#fff!important;box-shadow:0 8px 20px rgba(187,13,63,.16);}\n    #tt-region .tt-event-buttons .tt-small-btn:first-child:hover{box-shadow:0 12px 28px rgba(187,13,63,.22);transform:translateY(-1px);}\n    #tt-region .tt-empty{padding:22px;border-radius:20px;background:var(--tt-soft);border:1px dashed rgba(187,13,63,.32);color:var(--tt-muted);text-align:center;}\n    #tt-region .tt-show-more{margin-top:16px;text-align:center;}\n\n\n    \/* v12 adaptive list planner: day\/week grouping without adding another view *\/\n    #tt-region .tt-list-planner-intro{\n      display:grid;\n      grid-template-columns:1fr auto;\n      gap:12px;\n      align-items:center;\n      padding:14px 16px;\n      border-radius:22px;\n      border:1px solid rgba(187,13,63,.18);\n      background:radial-gradient(circle at top left,rgba(187,13,63,.08),transparent 32%),linear-gradient(180deg,#fff,#fff9fb);\n      box-shadow:0 12px 30px rgba(23,18,22,.06);\n      color:var(--tt-muted);\n      font-size:13px;\n    }\n    #tt-region .tt-list-planner-intro strong{display:block;color:var(--tt-red);font-size:15px;line-height:1.2;margin-bottom:2px;}\n    #tt-region .tt-list-planner-intro span{display:block;line-height:1.35;}\n    #tt-region .tt-list-planner-count{display:inline-flex;align-items:center;justify-content:center;min-width:42px;height:42px;border-radius:999px;background:var(--tt-red);color:#fff;font-size:13px;font-weight:950;box-shadow:0 10px 22px rgba(187,13,63,.20);}\n    #tt-region .tt-event-group-divider{display:flex;align-items:center;gap:12px;margin:8px 0 -2px;color:var(--tt-red);font-weight:950;letter-spacing:.01em;}\n    #tt-region .tt-event-group-divider::after{content:\"\";height:1px;background:var(--tt-line);flex:1;}\n    #tt-region .tt-event-group-divider span{display:inline-flex;flex-direction:column;gap:1px;padding:6px 10px;border-radius:999px;background:#fff8fb;border:1px solid rgba(187,13,63,.16);box-shadow:0 5px 14px rgba(23,18,22,.04);}\n    #tt-region .tt-event-group-divider strong{font-size:13px;line-height:1.15;color:var(--tt-red);}\n    #tt-region .tt-event-group-divider small{font-size:11px;line-height:1.15;color:var(--tt-muted);font-weight:850;letter-spacing:0;text-transform:none;}\n    #tt-region .tt-event-group-divider-week span{border-radius:16px;}\n    #tt-region .tt-event-group-divider-month{text-transform:uppercase;letter-spacing:.04em;}\n    @media (max-width:680px){\n      #tt-region .tt-list-planner-intro{grid-template-columns:1fr;padding:13px 14px;border-radius:20px;}\n      #tt-region .tt-list-planner-count{width:max-content;height:auto;min-height:32px;padding:7px 11px;border-radius:999px;}\n      #tt-region .tt-event-group-divider span{border-radius:15px;}\n    }\n\n    \/* Map *\/\n    #tt-region .tt-map-panel{display:none;margin-top:0;background:#fff;border:1px solid var(--tt-line);border-radius:24px;box-shadow:var(--tt-shadow-soft);overflow:hidden;}\n    #tt-region .tt-map-panel.is-visible{display:block;}\n    #tt-region .tt-map-grid{display:grid;grid-template-columns:330px 1fr;min-height:660px;}\n    #tt-region .tt-map-list{border-right:1px solid var(--tt-line);background:#fff;max-height:660px;overflow:auto;padding:14px;}\n    #tt-region .tt-map-card{width:100%;text-align:left;border:1px solid var(--tt-line);background:#fff;border-radius:16px;padding:12px;margin-bottom:10px;cursor:pointer;transition:border-color .15s ease, box-shadow .15s ease, transform .15s ease;}\n    #tt-region .tt-map-card:hover,#tt-region .tt-map-card.is-active{border-color:rgba(187,13,63,.42);box-shadow:0 10px 24px rgba(23,18,22,.08);transform:translateY(-1px);}\n    #tt-region .tt-map-card strong{display:block;color:var(--tt-red);font-size:15px;margin-bottom:4px;}\n    #tt-region .tt-map-card span{display:block;color:var(--tt-muted);font-size:13px;line-height:1.35;}\n    #tt-region .tt-map-card small{display:block;margin-top:5px;color:var(--tt-red);font-weight:850;}\n    #tt-region .tt-map-card.is-approx{border-style:dashed;background:linear-gradient(180deg,#fff,#fff8fb);}\n    #tt-region .tt-map-card small.tt-map-approx-label{color:#8e0a30;}\n    #tt-region .tt-map-frame-wrap{background:#faf7f8;min-height:660px;display:flex;flex-direction:column;}\n    #tt-region .tt-map-caption{padding:12px 14px;border-top:1px solid var(--tt-line);background:#fff;color:var(--tt-muted);font-size:13px;}\n    #tt-region .tt-leaflet-map{width:100%;min-height:620px;flex:1;background:#f5f1f3;}\n    #tt-region .tt-map-tools{display:flex;gap:8px;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid var(--tt-line);background:#fff;}\n    #tt-region .tt-map-tools strong{color:var(--tt-red);font-size:14px;}\n    #tt-region .tt-map-tools span{color:var(--tt-muted);font-size:12px;}\n    #tt-region .leaflet-container{font-family:system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",sans-serif;}\n    #tt-region .tt-map-popup-title{font-weight:900;color:var(--tt-red);margin-bottom:4px;}\n    #tt-region .tt-map-popup-meta{font-size:12px;color:#5f5660;line-height:1.35;}\n    #tt-region .tt-map-popup-link{display:inline-block;margin-top:6px;color:var(--tt-red);font-weight:900;text-decoration:none;}\n    #tt-region .tt-calendar-section.is-map-mode .tt-calendar-shell{grid-template-columns:300px 1fr;}\n    #tt-region .tt-calendar-section.is-map-mode .tt-map-grid{grid-template-columns:310px 1fr;min-height:720px;}\n    #tt-region .tt-calendar-section.is-map-mode .tt-map-list{max-height:720px;}\n    #tt-region .tt-calendar-section.is-map-mode .tt-map-frame-wrap{min-height:720px;}\n    #tt-region .tt-calendar-section.is-map-mode .tt-leaflet-map{min-height:680px;}\n\n\n    \/* Explainers *\/\n    #tt-region .tt-cards-4{display:grid;grid-template-columns:repeat(4,1fr);gap:16px;margin-top:28px;}\n    #tt-region .tt-info-card{background:#fff;border:1px solid var(--tt-line);border-radius:20px;padding:20px;box-shadow:var(--tt-shadow-soft);}\n    #tt-region .tt-info-card h3{margin:0 0 8px;color:var(--tt-red);font-size:20px;}\n    #tt-region .tt-info-card p{margin:0;color:var(--tt-muted);font-size:15px;}\n    #tt-region .tt-info-card .tt-icon{width:30px;height:30px;border-radius:999px;background:var(--tt-red);color:#fff;display:inline-flex;align-items:center;justify-content:center;font-weight:950;margin-bottom:12px;}\n\n    \/* Organizations *\/\n    #tt-region .tt-actors-section{background:var(--tt-soft-2);}\n    #tt-region .tt-actor-controls{display:flex;gap:8px;justify-content:center;flex-wrap:wrap;margin:24px 0 28px;}\n    #tt-region .tt-actor-heading{margin:38px 0 14px;color:var(--tt-ink);font-size:24px;text-align:left;}\n    #tt-region .tt-actor-subheading{margin:0 0 18px;color:var(--tt-muted);font-size:15px;}\n    #tt-region .tt-actor-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:18px;}\n    #tt-region .tt-actor-card{display:flex;flex-direction:column;background:#fff;border:1px solid var(--tt-line);border-radius:24px;padding:20px;box-shadow:var(--tt-shadow-soft);min-height:100%;position:relative;overflow:hidden;}\n    #tt-region .tt-actor-card.is-featured{border:2px solid rgba(187,13,63,.40);box-shadow:0 20px 54px rgba(187,13,63,.13);background:linear-gradient(180deg,#fff,#fff9fb);}\n    #tt-region .tt-actor-top{display:flex;justify-content:space-between;gap:12px;align-items:start;margin-bottom:12px;}\n    #tt-region .tt-actor-top h3{margin:0;color:var(--tt-red);font-size:22px;line-height:1.15;}\n    #tt-region .tt-actor-city{display:inline-flex;white-space:nowrap;border-radius:999px;padding:5px 9px;background:#f7eef2;color:var(--tt-red);font-size:12px;font-weight:900;}\n    #tt-region .tt-tags{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0 14px;}\n    #tt-region .tt-tag{border:1px solid var(--tt-line);background:#faf7f8;border-radius:999px;padding:4px 8px;color:#3b3137;font-size:12px;font-weight:800;}\n    #tt-region .tt-fee-highlight{margin:0 0 14px;padding:10px 12px;border-radius:15px;background:#f7eef2;border:1px solid rgba(187,13,63,.18);color:#3b3137;font-size:14px;}\n    #tt-region .tt-fee-highlight strong{color:var(--tt-red);}\n    #tt-region .tt-field-list{display:grid;gap:10px;margin:0 0 16px;}\n    #tt-region .tt-field{display:grid;gap:2px;}\n    #tt-region .tt-field strong{font-size:12px;color:var(--tt-red);text-transform:uppercase;letter-spacing:.04em;}\n    #tt-region .tt-field span{font-size:14px;color:var(--tt-muted);}\n    #tt-region .tt-actor-card .tt-btn-row{margin-top:auto;justify-content:flex-start;}\n\n    \/* Sources *\/\n    #tt-region .tt-facebook-section{background:var(--tt-soft);}\n    #tt-region .tt-link-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin-top:28px;}\n    #tt-region .tt-link-card{display:block;background:#fff;border:1px solid var(--tt-line);border-radius:18px;padding:16px;text-decoration:none;box-shadow:var(--tt-shadow-soft);}\n    #tt-region .tt-link-card strong{display:block;color:var(--tt-red);font-size:17px;margin-bottom:4px;}\n    #tt-region .tt-link-card span{display:block;color:var(--tt-muted);font-size:14px;}\n    #tt-region .tt-submit-event{margin-top:18px;padding:14px;border-radius:18px;background:#fff;border:1px solid var(--tt-line);}\n    #tt-region .tt-submit-event strong{display:block;color:var(--tt-red);margin-bottom:5px;}\n    #tt-region .tt-submit-event p{margin:0 0 10px;color:var(--tt-muted);font-size:13px;}\n\n    \/* Price *\/\n    #tt-region .tt-price-section{background:#fff;}\n    #tt-region .tt-compact-price{display:grid;grid-template-columns:1fr auto;gap:18px;align-items:center;margin-top:28px;padding:22px;border-radius:24px;background:#fff;border:1px solid var(--tt-line);box-shadow:var(--tt-shadow-soft);}\n    #tt-region .tt-price-bullets{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-top:14px;}\n    #tt-region .tt-price-pill{padding:12px;border-radius:16px;background:#faf7f8;border:1px solid var(--tt-line);font-size:14px;color:var(--tt-muted);}\n    #tt-region .tt-price-pill strong{display:block;color:var(--tt-red);font-size:15px;margin-bottom:2px;}\n    #tt-region .tt-price-spotlight{min-width:220px;padding:18px;border-radius:22px;background:linear-gradient(135deg,#2b0715,#170811);color:#fff;text-align:center;}\n    #tt-region .tt-price-spotlight .price{display:block;color:#fff;font-size:38px;font-weight:950;letter-spacing:-.04em;line-height:1;margin-bottom:5px;}\n    #tt-region .tt-price-spotlight span:not(.price){display:block;color:rgba(255,255,255,.78);font-size:13px;line-height:1.35;}\n\n    \/* Teresita CTA *\/\n    #tt-region .tt-teresita-section{background:var(--tt-soft);}\n    #tt-region .tt-teresita-card{background:#fff;border:1px solid var(--tt-line);border-radius:28px;box-shadow:var(--tt-shadow);display:grid;grid-template-columns:1fr 1fr;gap:0;overflow:hidden;margin-top:28px;}\n    #tt-region .tt-teresita-copy{padding:34px;}\n    #tt-region .tt-teresita-copy ul{margin:18px 0 0;padding:0;list-style:none;display:grid;gap:10px;}\n    #tt-region .tt-teresita-copy li{padding-left:26px;position:relative;color:var(--tt-muted);}\n    #tt-region .tt-teresita-copy li::before{content:\"\u2713\";position:absolute;left:0;top:0;color:var(--tt-red);font-weight:950;}\n    #tt-region .tt-teresita-panel{background:linear-gradient(135deg,#2b0715,#170811);color:#fff;padding:34px;display:flex;flex-direction:column;justify-content:center;}\n    #tt-region .tt-teresita-panel h3{margin:0 0 12px;color:#fff;font-size:28px;}\n    #tt-region .tt-teresita-panel p{margin:0;color:rgba(255,255,255,.82);}\n    #tt-region .tt-teresita-panel .tt-btn-row{justify-content:flex-start;}\n\n    \/* Accordion *\/\n    #tt-region details{background:#fff;border:1px solid var(--tt-line);border-radius:16px;padding:0 16px;box-shadow:var(--tt-shadow-soft);}\n    #tt-region details+details{margin-top:10px;}\n    #tt-region summary{cursor:pointer;padding:14px 0;font-weight:900;color:var(--tt-red);}\n    #tt-region details p{margin:0 0 14px;color:var(--tt-muted);}\n\n    @media (min-width:981px){\n      #tt-region .tt-filter-panel{max-height:calc(100vh - 82px);overflow:auto;}\n      #tt-region .tt-calendar-main{padding-top:2px;}\n    }\n    @media (max-width:980px){\n      #tt-region .tt-calendar-shell,#tt-region .tt-teresita-card{grid-template-columns:1fr;}\n      #tt-region .tt-filter-panel{position:relative;top:auto;}\n      #tt-region .tt-cards-4,#tt-region .tt-actor-grid,#tt-region .tt-link-grid{grid-template-columns:repeat(2,1fr);}\n      #tt-region .tt-compact-price{grid-template-columns:1fr;}\n      #tt-region .tt-price-bullets{grid-template-columns:repeat(2,1fr);}\n      #tt-region .tt-view-toggle{min-width:0;}\n    }\n    @media (max-width:640px){\n      #tt-region .tt-app-nav-inner{flex-wrap:nowrap;justify-content:flex-start;overflow-x:auto;padding:10px 16px;}\n    }\n    @media (max-width:680px){\n      #tt-region .tt-wrap,#tt-region .tt-narrow{width:min(100% - 22px,1160px);}\n      #tt-region .tt-section{padding:54px 0;}\n      #tt-region .tt-hero{min-height:560px;padding:58px 0 48px;background-position:center 54%;}\n      #tt-region .tt-hero-card{padding:26px 18px;border-radius:22px;}\n      #tt-region .tt-filter-toggle{display:inline-flex;align-items:center;justify-content:center;}\n      #tt-region .tt-filter-toggle{min-height:48px;padding:12px 16px;font-size:15px;box-shadow:0 8px 18px rgba(187,13,63,.10);}\n\n      #tt-region .tt-filter-summary{display:block;}\n      #tt-region .tt-filter-panel.is-collapsed .tt-filter-body{display:none;}\n      #tt-region .tt-calendar-shell,#tt-region .tt-calendar-main,#tt-region .tt-filter-panel,#tt-region .tt-filter-body,#tt-region .tt-filter-group{width:100%!important;max-width:100%!important;min-width:0!important;overflow-x:hidden!important;}\n      #tt-region .tt-filter-panel .tt-chip-list{display:flex!important;flex-wrap:wrap!important;overflow:visible!important;gap:8px!important;max-width:100%!important;}\n      #tt-region .tt-filter-panel .tt-chip{flex:0 1 auto!important;max-width:100%!important;white-space:normal!important;line-height:1.2!important;text-align:center!important;}\n      #tt-region .tt-calendar-toolbar{display:grid;gap:10px;}\n      #tt-region .tt-view-toggle{width:100%;grid-template-columns:1fr 1fr;justify-content:center;margin:4px auto 0;}\n      #tt-region .tt-view-btn{min-height:52px;font-size:16px;text-align:center;}\n      #tt-region .tt-event-card{grid-template-columns:1fr;border-radius:22px;padding:12px;}\n      #tt-region .tt-event-card::before{width:3px;}\n      #tt-region .tt-event-date{min-height:auto;display:grid;grid-template-columns:auto auto auto auto;gap:8px;justify-content:start;align-items:center;text-align:left;padding:10px 12px;}\n      #tt-region .tt-event-date strong{font-size:24px;}\n      #tt-region .tt-event-date .rel{margin-top:0;margin-left:4px;align-self:center;}\n      #tt-region .tt-event-title{font-size:18px;}\n      #tt-region .tt-event-buttons .tt-small-btn{min-height:38px;}\n      #tt-region .tt-event-buttons .tt-small-btn:first-child{flex:1 1 100%;}\n      #tt-region .tt-map-grid{grid-template-columns:1fr;}\n      #tt-region .tt-map-list{max-height:320px;border-right:0;border-bottom:1px solid var(--tt-line);}\n      #tt-region .tt-leaflet-map{min-height:390px;}\n      #tt-region .tt-calendar-section.is-map-mode .tt-calendar-shell{grid-template-columns:1fr;}\n      #tt-region .tt-calendar-section.is-map-mode .tt-map-grid{grid-template-columns:1fr;min-height:auto;}\n      #tt-region .tt-calendar-section.is-map-mode .tt-map-list{max-height:320px;}\n      #tt-region .tt-calendar-section.is-map-mode .tt-leaflet-map{min-height:390px;}\n      #tt-region .tt-cards-4,#tt-region .tt-actor-grid,#tt-region .tt-link-grid,#tt-region .tt-price-bullets{grid-template-columns:1fr;}\n      #tt-region .tt-teresita-copy,#tt-region .tt-teresita-panel{padding:24px 20px;}\n      #tt-region .tt-price-spotlight{text-align:left;}\n      #tt-region .tt-btn{width:100%;}\n      #tt-region .tt-btn-row{width:100%;}\n    }\n\n\n    \/* v10 filter redesign: planner-first, clean hierarchy *\/\n    #tt-region .tt-calendar-shell{grid-template-columns:minmax(330px,360px) 1fr;gap:26px;}\n    #tt-region .tt-filter-panel{padding:0;background:#fff;border-radius:30px;overflow:hidden;border-color:rgba(187,13,63,.20);box-shadow:0 24px 60px rgba(23,18,22,.10);}\n    #tt-region .tt-filter-head{padding:20px 20px 14px;background:linear-gradient(180deg,#fff8fb,#fff);border-bottom:1px solid var(--tt-line);align-items:flex-start;}\n    #tt-region .tt-filter-title{font-size:20px;line-height:1.1;letter-spacing:-.02em;margin:0;color:var(--tt-red);}\n    #tt-region .tt-filter-head-sub{margin:5px 0 0;color:var(--tt-muted);font-size:13px;line-height:1.35;}\n    #tt-region .tt-filter-top{padding:16px 20px 0;background:#fff;}\n    #tt-region .tt-filter-body{padding:16px 20px 20px;display:grid;gap:16px;background:#fff;}\n    #tt-region .tt-filter-section{padding:16px;border-radius:22px;background:linear-gradient(180deg,#fff,#fffafd);border:1px solid var(--tt-line);box-shadow:0 8px 24px rgba(23,18,22,.045);}\n    #tt-region .tt-filter-section-primary{background:radial-gradient(circle at top left,rgba(187,13,63,.09),transparent 34%),linear-gradient(180deg,#fff,#fff8fb);border-color:rgba(187,13,63,.22);}\n    #tt-region .tt-filter-section-head{display:flex;gap:10px;align-items:flex-start;margin-bottom:13px;}\n    #tt-region .tt-filter-section-head strong{display:block;color:var(--tt-ink);font-size:15px;line-height:1.2;}\n    #tt-region .tt-filter-section-head small{display:block;margin-top:2px;color:var(--tt-muted);font-size:12px;line-height:1.25;font-weight:650;}\n    #tt-region .tt-filter-step{flex:0 0 auto;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:999px;background:var(--tt-red);color:#fff;font-size:12px;font-weight:950;box-shadow:0 8px 18px rgba(187,13,63,.20);}\n    #tt-region .tt-filter-label{font-size:11px;margin-bottom:7px;color:#6d6069;}\n    #tt-region .tt-filter-group{margin-top:12px;}\n    #tt-region .tt-filter-section .tt-filter-group:first-of-type{margin-top:0;}\n    #tt-region .tt-chip-list{gap:8px;}\n    #tt-region .tt-chip{min-height:35px;padding:8px 12px;border-color:#ead8df;background:#fff;box-shadow:0 4px 12px rgba(23,18,22,.035);}\n    #tt-region .tt-chip:hover{border-color:rgba(187,13,63,.38);background:#fff8fb;}\n    #tt-region .tt-chip.is-active{box-shadow:0 10px 22px rgba(187,13,63,.18);}\n    #tt-region .tt-quick-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:10px;}\n    #tt-region .tt-quick-grid .tt-chip{width:100%;justify-content:center;border-radius:15px;min-height:42px;line-height:1.1;}\n    #tt-region .tt-city-grid .tt-chip{min-width:0;}\n    #tt-region .tt-weekend-shortcut{margin:0;min-height:46px;border-radius:16px;font-size:15px;letter-spacing:-.01em;}\n    #tt-region .tt-mini-calendar{margin-top:14px;padding:14px;border-radius:22px;background:#fff;border-color:rgba(187,13,63,.18);box-shadow:0 12px 30px rgba(23,18,22,.07);}\n    #tt-region .tt-mini-calendar-head{margin-bottom:12px;align-items:center;}\n    #tt-region .tt-mini-calendar-title{font-size:15px;letter-spacing:-.01em;}\n    #tt-region .tt-mini-calendar-subtitle{margin:7px auto 0;display:block;padding:0;border:0;border-radius:0;background:transparent;box-shadow:none;color:var(--tt-red);font-size:12px;font-weight:950;text-align:center;line-height:1.15;letter-spacing:.01em;}\n    #tt-region .tt-mini-calendar-nav{width:34px;height:34px;font-size:18px;box-shadow:0 6px 15px rgba(23,18,22,.06);}\n    #tt-region .tt-mini-calendar-weekdays{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px;margin:0 0 7px;align-items:center;}\n    #tt-region .tt-mini-calendar-weekdays span{display:flex;align-items:center;justify-content:center;height:18px;color:#7a6e76;font-size:9.5px;font-weight:950;text-align:center;text-transform:uppercase;letter-spacing:.04em;}\n    #tt-region .tt-mini-calendar-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:6px;align-items:stretch;}\n    #tt-region .tt-mini-day{width:100%;min-width:0;min-height:0;aspect-ratio:1\/1;border-radius:13px;font-size:12px;padding:0;line-height:1;display:flex;align-items:center;justify-content:center;box-shadow:inset 0 0 0 1px rgba(234,216,223,.95);}\n    #tt-region .tt-mini-day.is-outside{opacity:.46;background:#faf7f8;box-shadow:none;}\n    #tt-region .tt-mini-day.is-past{opacity:.42;background:#f8f5f6;box-shadow:none;}\n    #tt-region .tt-mini-day.has-events{background:#fff3f7;box-shadow:inset 0 0 0 1px rgba(187,13,63,.30);}\n    #tt-region .tt-mini-day.has-events::after{right:3px;bottom:3px;min-width:14px;height:14px;line-height:14px;font-size:8px;}\n    #tt-region .tt-mini-day.is-selected{background:var(--tt-red);color:#fff;box-shadow:0 12px 22px rgba(187,13,63,.24);}\n    #tt-region .tt-mini-calendar-foot{display:none;}\n    #tt-region .tt-mini-calendar-legend{display:flex;align-items:center;gap:6px;margin-top:10px;color:var(--tt-muted);font-size:11.5px;line-height:1.25;}\n    #tt-region .tt-legend-dot{width:8px;height:8px;border-radius:999px;background:var(--tt-red);display:inline-block;}\n    #tt-region .tt-filter-details{margin-top:0;border-radius:20px;box-shadow:0 6px 20px rgba(23,18,22,.04);}\n    #tt-region .tt-filter-details summary{padding:14px 15px;}\n    #tt-region .tt-filter-details-body{padding:0 15px 15px;}\n    #tt-region .tt-date-select-grid{gap:12px;}\n    #tt-region .tt-filter-reset{margin-top:0;}\n    #tt-region .tt-source-card{margin-top:0;border-radius:20px;background:#fffafc;}\n    #tt-region .tt-filter-summary{border-radius:18px;background:#fffafd;}\n\n    @media (min-width:981px){\n      #tt-region .tt-filter-panel{max-height:calc(100vh - 80px);overflow:auto;}\n    }\n    @media (max-width:980px){\n      #tt-region .tt-calendar-shell{grid-template-columns:1fr;}\n      #tt-region .tt-filter-panel{position:relative;top:auto;}\n    }\n    @media (max-width:680px){\n      #tt-region .tt-filter-panel{border-radius:24px;}\n      #tt-region .tt-filter-head{padding:16px;}\n      #tt-region .tt-filter-top{padding:14px 16px 0;}\n      #tt-region .tt-filter-body{padding:14px 16px 16px;}\n      #tt-region .tt-filter-section{padding:14px;border-radius:20px;}\n      #tt-region .tt-quick-grid{grid-template-columns:1fr 1fr;}\n      #tt-region .tt-mini-calendar-grid,#tt-region .tt-mini-calendar-weekdays{gap:5px;}\n      #tt-region .tt-mini-day{border-radius:11px;font-size:11.5px;}\n    }\n\n  \n    \/* v11 UX polish: lighter filter panel, fewer visible choices, clearer planner flow *\/\n    #tt-region .tt-calendar-shell{grid-template-columns:minmax(300px,340px) 1fr;gap:24px;}\n    #tt-region .tt-filter-panel{padding:0;border-radius:28px;background:#fff;border:1px solid rgba(187,13,63,.18);box-shadow:0 20px 54px rgba(23,18,22,.09);overflow:hidden;}\n    #tt-region .tt-filter-head{padding:18px 18px 12px;background:linear-gradient(180deg,#fff8fb,#fff);border-bottom:1px solid var(--tt-line);}\n    #tt-region .tt-filter-title{margin:0;color:var(--tt-red);font-size:20px;line-height:1.1;letter-spacing:-.02em;}\n    #tt-region .tt-filter-head-sub{margin:5px 0 0;color:var(--tt-muted);font-size:13px;line-height:1.35;}\n    #tt-region .tt-filter-top{padding:14px 18px 0;background:#fff;}\n    #tt-region .tt-filter-body{padding:14px 18px 18px;display:grid;gap:12px;background:#fff;}\n    #tt-region .tt-filter-section{padding:13px;border-radius:20px;background:#fff;border:1px solid var(--tt-line);box-shadow:0 8px 22px rgba(23,18,22,.04);}\n    #tt-region .tt-filter-section-primary{background:radial-gradient(circle at top left,rgba(187,13,63,.075),transparent 32%),linear-gradient(180deg,#fff,#fffafd);border-color:rgba(187,13,63,.20);}\n    #tt-region .tt-filter-section-head{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;margin-bottom:10px;}\n    #tt-region .tt-filter-section-head strong{display:block;color:var(--tt-ink);font-size:14px;line-height:1.15;}\n    #tt-region .tt-filter-section-head small{display:block;margin-top:2px;color:var(--tt-muted);font-size:11.5px;line-height:1.25;font-weight:650;}\n    #tt-region .tt-filter-step{display:none;}\n    #tt-region .tt-filter-label{font-size:10.5px;margin-bottom:6px;color:#74666f;letter-spacing:.055em;}\n    #tt-region .tt-chip-list{gap:7px;}\n    #tt-region .tt-chip{min-height:33px;padding:7px 10px;font-size:12.5px;border-color:#ead8df;background:#fff;box-shadow:0 4px 12px rgba(23,18,22,.03);}\n    #tt-region .tt-chip:hover{border-color:rgba(187,13,63,.38);background:#fff8fb;}\n    #tt-region .tt-chip.is-active{box-shadow:0 8px 18px rgba(187,13,63,.15);}\n    #tt-region .tt-quick-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px;margin-top:10px;}\n    #tt-region .tt-quick-grid .tt-chip{width:100%;justify-content:center;border-radius:14px;min-height:39px;text-align:center;}\n    #tt-region .tt-mini-calendar{margin-top:11px;padding:12px;border-radius:18px;background:#fff;border-color:rgba(187,13,63,.16);box-shadow:0 8px 20px rgba(23,18,22,.045);}\n    #tt-region .tt-mini-calendar-head{display:grid;grid-template-columns:34px 1fr 34px;align-items:center;gap:8px;margin-bottom:10px;}\n    #tt-region .tt-mini-calendar-title{font-size:14px;text-align:center;}\n    #tt-region .tt-mini-calendar-subtitle{font-size:11.5px;padding:0;}\n    #tt-region .tt-mini-calendar-nav{width:34px;height:34px;box-shadow:0 5px 14px rgba(23,18,22,.045);}\n    #tt-region .tt-mini-calendar-weekdays,#tt-region .tt-mini-calendar-grid{grid-template-columns:repeat(7,minmax(0,1fr));gap:5px;}\n    #tt-region .tt-mini-calendar-weekdays{margin-bottom:6px;}\n    #tt-region .tt-mini-calendar-weekdays span{height:16px;font-size:9px;}\n    #tt-region .tt-mini-day{width:100%;aspect-ratio:1\/1;min-height:0;border-radius:10px;font-size:11.5px;padding:0;}\n    #tt-region .tt-mini-day.has-events::after{right:3px;bottom:3px;min-width:13px;height:13px;line-height:13px;font-size:7.5px;}\n    #tt-region .tt-mini-calendar-legend{margin-top:9px;font-size:11px;}\n    #tt-region .tt-filter-group{margin-top:11px;}\n    #tt-region .tt-filter-section .tt-filter-group:first-of-type{margin-top:0;}\n    #tt-region .tt-city-grid .tt-chip{min-width:0;}\n    #tt-region .tt-filter-details{margin-top:0;border-radius:18px;box-shadow:none;}\n    #tt-region .tt-filter-details summary{padding:12px 13px;}\n    #tt-region .tt-filter-details summary span{font-size:13.5px;}\n    #tt-region .tt-filter-details summary small{font-size:11.5px;}\n    #tt-region .tt-filter-details-body{padding:0 13px 13px;}\n    #tt-region .tt-date-select-grid{gap:10px;}\n    #tt-region .tt-clear-date{margin-top:10px;}\n    #tt-region .tt-filter-reset{margin-top:0;}\n    #tt-region .tt-source-card{margin-top:0;border-radius:16px;background:#fffafc;font-size:12px;}\n    #tt-region .tt-trust-note{font-size:11.5px;}\n    #tt-region .tt-active-filter-bar{padding-bottom:10px;}\n    #tt-region .tt-active-pill{font-size:12px;padding:6px 9px;}\n    #tt-region .tt-month-rail{border-radius:20px;padding:12px;}\n    #tt-region .tt-event-card{border-radius:22px;}\n    @media (min-width:981px){\n      #tt-region .tt-filter-panel{max-height:calc(100vh - 82px);overflow:auto;}\n    }\n    @media (max-width:980px){\n      #tt-region .tt-calendar-shell{grid-template-columns:1fr;}\n    }\n    @media (max-width:680px){\n      #tt-region .tt-filter-panel{border-radius:22px;}\n      #tt-region .tt-filter-head{padding:16px;}\n      #tt-region .tt-filter-top{padding:13px 16px 0;}\n      #tt-region .tt-filter-body{padding:13px 16px 16px;}\n      #tt-region .tt-filter-section{padding:12px;border-radius:17px;}\n      #tt-region .tt-mini-calendar-weekdays,#tt-region .tt-mini-calendar-grid{gap:4px;}\n      #tt-region .tt-mini-day{border-radius:9px;font-size:11px;}\n    }\n\n  \n\n\n    \/* v14 UX: week numbers select week; month title selects month *\/\n    #tt-region .tt-calendar-pick-mode{display:none!important;}\n    #tt-region .tt-mini-calendar-title-button{\n      display:inline-flex;\n      align-items:center;\n      justify-content:center;\n      min-height:30px;\n      padding:3px 12px;\n      border:1px solid transparent;\n      border-radius:999px;\n      background:transparent;\n      color:var(--tt-red);\n      font:inherit;\n      cursor:pointer;\n    }\n    #tt-region .tt-mini-calendar-title-button:hover,\n    #tt-region .tt-mini-calendar-title-button.is-selected-month-title{\n      background:#fff3f7;\n      border-color:rgba(187,13,63,.24);\n      box-shadow:0 7px 18px rgba(23,18,22,.06);\n    }\n    #tt-region .tt-mini-calendar-title-button .tt-mini-calendar-title{font-size:14px;text-align:center;}\n    #tt-region .tt-mini-calendar-weekdays,\n    #tt-region .tt-mini-calendar-grid{\n      grid-template-columns:30px repeat(7,minmax(0,1fr));\n      gap:6px;\n    }\n    #tt-region .tt-mini-calendar-weekdays .tt-mini-week-label{\n      color:var(--tt-muted);\n      opacity:.72;\n      font-size:9px;\n      letter-spacing:.02em;\n      text-transform:none;\n    }\n    #tt-region .tt-mini-week-btn{\n      position:relative;\n      width:24px;\n      height:24px;\n      min-width:24px;\n      min-height:24px;\n      margin:auto;\n      border:1px solid rgba(187,13,63,.22);\n      border-radius:999px;\n      background:#fff;\n      color:var(--tt-red);\n      font-size:10px;\n      line-height:1;\n      font-weight:950;\n      cursor:pointer;\n      display:flex;\n      align-items:center;\n      justify-content:center;\n      box-shadow:0 3px 10px rgba(23,18,22,.045);\n    }\n    #tt-region .tt-mini-week-btn:hover{\n      border-color:rgba(187,13,63,.48);\n      background:#fff3f7;\n      transform:translateY(-1px);\n    }\n    #tt-region .tt-mini-week-btn.is-selected-week{\n      background:var(--tt-red);\n      border-color:var(--tt-red);\n      color:#fff;\n      box-shadow:0 9px 18px rgba(187,13,63,.22);\n    }\n    #tt-region .tt-mini-week-btn.is-past{\n      opacity:.36;\n      cursor:default;\n      background:#f8f5f6;\n      color:#9b8d95;\n      box-shadow:none;\n      transform:none;\n    }\n    #tt-region .tt-mini-week-btn.has-events::after{display:none;}\n    #tt-region .tt-mini-week-btn.is-selected-week.has-events::after{display:none;}\n    #tt-region .tt-mini-calendar-footer{\n      display:flex;\n      align-items:center;\n      justify-content:space-between;\n      gap:10px;\n      margin-top:10px;\n    }\n    #tt-region .tt-mini-calendar-footer .tt-mini-calendar-legend{margin-top:0;}\n    #tt-region .tt-mini-clear-date{\n      flex:0 0 auto;\n      min-height:28px;\n      border:1px solid var(--tt-line);\n      border-radius:999px;\n      background:#fff;\n      color:var(--tt-red);\n      font-size:11px;\n      font-weight:950;\n      padding:4px 10px;\n      cursor:pointer;\n    }\n    #tt-region .tt-mini-clear-date:hover{border-color:rgba(187,13,63,.38);background:#fff8fb;}\n    #tt-region .tt-mini-calendar-actions{display:none!important;}\n    @media (max-width:680px){\n      #tt-region .tt-mini-calendar-weekdays,\n      #tt-region .tt-mini-calendar-grid{grid-template-columns:28px repeat(7,minmax(0,1fr));gap:5px;}\n      #tt-region .tt-mini-week-btn{width:22px;height:22px;min-width:22px;min-height:22px;font-size:9.5px;}\n      #tt-region .tt-mini-calendar-footer{align-items:flex-start;}\n    }\n\n\n    \/* v16 refinement: cleaner planner surface *\/\n    #tt-region .tt-month-rail{display:none!important;}\n    #tt-region .tt-list-planner-intro{display:none!important;}\n    #tt-region .tt-mini-day{\n      border-radius:7px!important;\n      aspect-ratio:1\/1!important;\n    }\n    #tt-region .tt-mini-day.has-events,\n    #tt-region .tt-mini-day.is-selected,\n    #tt-region .tt-mini-day.is-selected.is-selected-week,\n    #tt-region .tt-mini-day.is-selected.is-selected-month{\n      border-radius:7px!important;\n    }\n    #tt-region .tt-mini-week-btn{\n      width:22px!important;\n      height:22px!important;\n      min-width:22px!important;\n      min-height:22px!important;\n      border-radius:50%!important;\n      font-size:9.5px!important;\n      background:#fff!important;\n    }\n    #tt-region .tt-mini-week-btn.is-selected-week{\n      background:var(--tt-red)!important;\n      color:#fff!important;\n    }\n    #tt-region .tt-mini-calendar-weekdays,\n    #tt-region .tt-mini-calendar-grid{\n      grid-template-columns:26px repeat(7,minmax(0,1fr))!important;\n    }\n    #tt-region .tt-mini-calendar-title-button{\n      background:#fff7fa!important;\n      border-color:rgba(187,13,63,.22)!important;\n      box-shadow:0 6px 16px rgba(23,18,22,.055)!important;\n    }\n    #tt-region .tt-mini-calendar-title-button:hover,\n    #tt-region .tt-mini-calendar-title-button.is-selected-month-title{\n      background:var(--tt-red)!important;\n      border-color:var(--tt-red)!important;\n      color:#fff!important;\n      box-shadow:0 10px 22px rgba(187,13,63,.18)!important;\n    }\n    #tt-region .tt-mini-calendar-title-button:hover .tt-mini-calendar-title,\n    #tt-region .tt-mini-calendar-title-button.is-selected-month-title .tt-mini-calendar-title{color:#fff!important;}\n    #tt-region .tt-mini-calendar-weekdays .tt-mini-week-label{font-size:0!important;}\n    #tt-region .tt-mini-calendar-weekdays .tt-mini-week-label::after{\n      content:\"#\";\n      font-size:9px;\n      color:var(--tt-muted);\n      opacity:.7;\n    }\n\n\n\n    \/* v18 refinement: center the clickable month title in the mini calendar *\/\n    #tt-region .tt-mini-calendar-head > div{\n      min-width:0;\n      text-align:center;\n    }\n    #tt-region .tt-mini-calendar-title-button{\n      display:inline-flex!important;\n      margin:0 auto!important;\n      justify-self:center!important;\n      align-self:center!important;\n    }\n\n\n    \/* v19 refinement: make week selectors true small circles *\/\n    #tt-region .tt-mini-calendar-weekdays,\n    #tt-region .tt-mini-calendar-grid{\n      grid-template-columns:22px repeat(7,minmax(0,1fr))!important;\n      column-gap:6px!important;\n      row-gap:5px!important;\n      align-items:center!important;\n    }\n    #tt-region .tt-mini-week-btn{\n      inline-size:18px!important;\n      block-size:18px!important;\n      width:18px!important;\n      height:18px!important;\n      min-width:18px!important;\n      min-height:18px!important;\n      max-width:18px!important;\n      max-height:18px!important;\n      aspect-ratio:1\/1!important;\n      padding:0!important;\n      margin:auto!important;\n      border-radius:50%!important;\n      display:inline-flex!important;\n      align-items:center!important;\n      justify-content:center!important;\n      justify-self:center!important;\n      align-self:center!important;\n      border:1px solid rgba(187,13,63,.26)!important;\n      background:#fff!important;\n      color:var(--tt-red)!important;\n      font-size:8.25px!important;\n      font-weight:950!important;\n      line-height:1!important;\n      letter-spacing:-.02em!important;\n      box-shadow:0 2px 7px rgba(23,18,22,.035)!important;\n      transform:none!important;\n      overflow:hidden!important;\n    }\n    #tt-region .tt-mini-week-btn:hover{\n      background:#fff3f7!important;\n      border-color:rgba(187,13,63,.50)!important;\n      box-shadow:0 5px 12px rgba(187,13,63,.10)!important;\n      transform:translateY(-1px)!important;\n    }\n    #tt-region .tt-mini-week-btn.is-selected-week{\n      background:var(--tt-red)!important;\n      border-color:var(--tt-red)!important;\n      color:#fff!important;\n      box-shadow:0 7px 14px rgba(187,13,63,.22)!important;\n    }\n    #tt-region .tt-mini-week-btn.is-past{\n      opacity:.38!important;\n      background:#f8f5f6!important;\n      color:#9b8d95!important;\n      border-color:rgba(234,216,223,.85)!important;\n      box-shadow:none!important;\n      transform:none!important;\n    }\n    #tt-region .tt-mini-calendar-weekdays .tt-mini-week-label{\n      width:18px!important;\n      height:18px!important;\n      min-width:18px!important;\n      margin:auto!important;\n      display:flex!important;\n      align-items:center!important;\n      justify-content:center!important;\n    }\n    #tt-region .tt-mini-calendar-weekdays .tt-mini-week-label::after{\n      font-size:8px!important;\n    }\n    @media (max-width:680px){\n      #tt-region .tt-mini-calendar-weekdays,\n      #tt-region .tt-mini-calendar-grid{\n        grid-template-columns:20px repeat(7,minmax(0,1fr))!important;\n        column-gap:5px!important;\n        row-gap:5px!important;\n      }\n      #tt-region .tt-mini-week-btn{\n        inline-size:17px!important;\n        block-size:17px!important;\n        width:17px!important;\n        height:17px!important;\n        min-width:17px!important;\n        min-height:17px!important;\n        max-width:17px!important;\n        max-height:17px!important;\n        font-size:7.75px!important;\n      }\n    }\n\n\n    \/* v37 expandable event details: cleaner control, readable source panel, mobile-safe expansion *\/\n    #tt-region .tt-event-details-toggle-wrap{margin-top:12px;display:flex;align-items:center;justify-content:flex-start;}\n    #tt-region .tt-details-toggle{display:inline-flex;align-items:center;justify-content:center;gap:8px;min-height:38px;padding:9px 15px;border-radius:999px;border:1px solid rgba(187,13,63,.24);background:#fff;color:var(--tt-red);font-size:12.5px;font-weight:950;line-height:1;cursor:pointer;box-shadow:0 5px 14px rgba(23,18,22,.045);transition:background .15s ease,border-color .15s ease,box-shadow .15s ease,transform .15s ease;}\n    #tt-region .tt-details-toggle:hover{background:#fff7fa;border-color:rgba(187,13,63,.46);box-shadow:0 8px 20px rgba(187,13,63,.10);transform:translateY(-1px);}\n    #tt-region .tt-details-toggle .tt-details-label{display:inline-block;line-height:1;}\n    #tt-region .tt-details-toggle .tt-details-chevron{display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;line-height:1;transition:transform .16s ease;font-size:11px;}\n    #tt-region .tt-details-toggle[aria-expanded=\"true\"] .tt-details-chevron{transform:rotate(180deg);}\n    #tt-region .tt-event-details-panel{display:none;margin-top:11px;border-radius:18px;border:1px solid rgba(187,13,63,.18);background:linear-gradient(180deg,#fff,#fffafd);box-shadow:inset 0 1px 0 rgba(255,255,255,.8);overflow:hidden;}\n    #tt-region .tt-event-details-panel.is-visible{display:block;}\n    #tt-region .tt-event-details-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:11px 14px;border-bottom:1px solid rgba(187,13,63,.12);background:#fff8fb;}\n    #tt-region .tt-event-details-header strong{display:block;color:var(--tt-red);font-size:12.5px;line-height:1.2;}\n    #tt-region .tt-event-details-header span{display:block;color:var(--tt-muted);font-size:11.5px;line-height:1.25;text-align:right;}\n    #tt-region .tt-event-details-scroll{max-height:260px;overflow:auto;padding:14px 15px;color:var(--tt-muted);font-size:14px;line-height:1.65;white-space:pre-wrap;overflow-wrap:anywhere;scrollbar-width:thin;}\n    #tt-region .tt-event-details-scroll:focus{outline:3px solid rgba(187,13,63,.16);outline-offset:-3px;}\n    #tt-region .tt-details-collapse{width:100%;min-height:38px;border:0;border-top:1px solid rgba(187,13,63,.12);background:#fff;color:var(--tt-red);font-size:12px;font-weight:950;cursor:pointer;}\n    #tt-region .tt-details-collapse:hover{background:#fff7fa;}\n    #tt-region .tt-event-card.is-expanded{border-color:rgba(187,13,63,.34);}\n    @media (max-width:680px){#tt-region .tt-event-details-toggle-wrap{margin-top:10px;}#tt-region .tt-details-toggle{width:100%;min-height:42px;}#tt-region .tt-event-details-scroll{max-height:230px;font-size:13px;padding:12px;line-height:1.62;}#tt-region .tt-event-details-header{display:block;}#tt-region .tt-event-details-header span{text-align:left;margin-top:3px;}}\n\n\n  \n\n    \/* v39 simple-first calendar mode *\/\n    #tt-region .tt-view-toggle-3{grid-template-columns:repeat(3,minmax(0,1fr));min-width:420px;}\n    #tt-region .tt-view-toggle-3 .tt-view-btn{padding-left:14px;padding-right:14px;}\n    #tt-region .tt-simple-browser{margin:4px 0 18px;padding:16px;border:1px solid rgba(187,13,63,.18);border-radius:24px;background:linear-gradient(180deg,#fff,#fff9fb);box-shadow:0 12px 30px rgba(23,18,22,.06);}\n    #tt-region .tt-simple-browser-main{display:grid;grid-template-columns:1fr auto 1fr;gap:10px;align-items:center;}\n    #tt-region .tt-simple-month-current{display:inline-flex;align-items:center;justify-content:center;min-height:42px;padding:9px 18px;border-radius:999px;background:var(--tt-red);color:#fff;font-weight:950;box-shadow:0 10px 24px rgba(187,13,63,.18);white-space:nowrap;}\n    #tt-region .tt-simple-month-nav{min-height:42px;border:1px solid var(--tt-line);border-radius:999px;background:#fff;color:var(--tt-red);font-size:13px;font-weight:950;cursor:pointer;padding:9px 14px;box-shadow:0 5px 14px rgba(23,18,22,.04);}\n    #tt-region .tt-simple-month-nav:hover{border-color:rgba(187,13,63,.38);background:#fff8fb;}\n    #tt-region .tt-simple-month-nav:first-child{justify-self:start;}\n    #tt-region .tt-simple-month-nav:last-child{justify-self:end;}\n    #tt-region .tt-simple-browser-note{margin-top:11px;color:var(--tt-muted);font-size:13.5px;line-height:1.45;text-align:center;}\n    #tt-region .tt-simple-reset{display:block;margin:12px auto 0;min-height:36px;border:1px solid var(--tt-line);border-radius:999px;background:#fff;color:var(--tt-red);font-size:12.5px;font-weight:950;cursor:pointer;padding:7px 13px;}\n    #tt-region .tt-simple-reset:hover{border-color:rgba(187,13,63,.38);background:#fff8fb;}\n    #tt-region .tt-calendar-section.is-simple-mode .tt-calendar-shell{grid-template-columns:1fr;}\n    #tt-region .tt-calendar-section.is-simple-mode .tt-filter-panel{display:none!important;}\n    #tt-region .tt-calendar-section.is-simple-mode .tt-calendar-main{max-width:980px;margin:0 auto;width:100%;}\n    #tt-region .tt-calendar-section.is-simple-mode .tt-calendar-toolbar{align-items:start;}\n    #tt-region .tt-calendar-section.is-simple-mode .tt-active-filter-bar{margin-bottom:10px;}\n    #tt-region .tt-calendar-section:not(.is-simple-mode) .tt-simple-browser{display:none!important;}\n    #tt-region .tt-filter-reset{font-size:15px;}\n    @media (max-width:980px){\n      #tt-region .tt-view-toggle-3{min-width:0;width:100%;grid-template-columns:1fr;}\n      #tt-region .tt-calendar-toolbar{grid-template-columns:1fr;}\n    }\n    @media (max-width:680px){\n      #tt-region .tt-simple-browser{border-radius:20px;padding:13px;}\n      #tt-region .tt-simple-browser-main{grid-template-columns:1fr;}\n      #tt-region .tt-simple-month-current{order:-1;width:100%;}\n      #tt-region .tt-simple-month-nav{width:100%;justify-self:stretch!important;}\n      #tt-region .tt-simple-browser-note{text-align:left;}\n    }\n\n\n    \/* v42 senior-friendly simple month agenda *\/\n    #tt-region .tt-calendar-section.is-simple-mode .tt-calendar-main{max-width:1080px;}\n    #tt-region .tt-calendar-section.is-simple-mode .tt-calendar-count{font-size:22px;line-height:1.2;}\n    #tt-region .tt-calendar-section.is-simple-mode .tt-updated{font-size:14px;}\n    #tt-region .tt-calendar-section.is-simple-mode .tt-active-filter-bar{display:none!important;}\n    #tt-region .tt-area-page-nav{margin:18px 0 16px;padding:18px;border:1px solid rgba(187,13,63,.18);border-radius:24px;background:linear-gradient(180deg,#fff,#fff9fb);box-shadow:0 12px 30px rgba(23,18,22,.055);}\n    #tt-region .tt-area-page-copy{display:grid;gap:4px;margin-bottom:13px;color:var(--tt-muted);font-size:16px;line-height:1.45;}\n    #tt-region .tt-area-page-copy strong{display:block;color:var(--tt-ink);font-size:18px;}\n    #tt-region .tt-area-page-links{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;}\n    #tt-region .tt-area-page-links a{display:flex;align-items:center;justify-content:center;min-height:50px;padding:11px 12px;border-radius:16px;border:2px solid var(--tt-line);background:#fff;color:var(--tt-ink);font-size:15px;font-weight:950;text-decoration:none;text-align:center;line-height:1.15;box-shadow:0 6px 16px rgba(23,18,22,.045);}\n    #tt-region .tt-area-page-links a:hover{border-color:rgba(187,13,63,.38);color:var(--tt-red);background:#fff8fb;}\n    #tt-region .tt-area-page-links a.is-active{background:var(--tt-red);border-color:var(--tt-red);color:#fff;box-shadow:0 12px 28px rgba(187,13,63,.18);}\n    #tt-region .tt-simple-browser{margin:12px 0 0;border-radius:24px 24px 0 0;border-bottom:0;padding:18px 18px 16px;}\n    #tt-region .tt-simple-browser-main{grid-template-columns:minmax(170px,1fr) auto minmax(170px,1fr);}\n    #tt-region .tt-simple-month-current{min-height:50px;font-size:20px;padding:10px 24px;}\n    #tt-region .tt-simple-month-nav{min-height:52px;font-size:16px;padding:12px 18px;border-width:2px;}\n    #tt-region .tt-simple-browser-note{font-size:16px;line-height:1.55;max-width:780px;margin:14px auto 0;color:#4f4650;}\n    #tt-region .tt-simple-reset{min-height:44px;font-size:15px;padding:10px 16px;margin-top:14px;border-width:2px;}\n    #tt-region .tt-calendar-section.is-simple-mode .tt-event-list{background:linear-gradient(180deg,#fff9fb,#fff);border:1px solid rgba(187,13,63,.18);border-top:0;border-radius:0 0 24px 24px;padding:12px 18px 22px;box-shadow:0 16px 40px rgba(23,18,22,.07);gap:0;}\n    #tt-region .tt-senior-agenda{display:grid;gap:18px;}\n    #tt-region .tt-senior-day-section{display:grid;gap:10px;}\n    #tt-region .tt-senior-day-heading{display:flex;align-items:center;gap:10px;margin:10px 0 2px;padding:0;color:var(--tt-red);font-size:21px;line-height:1.2;}\n    #tt-region .tt-senior-day-heading::after{content:\"\";height:1px;background:var(--tt-line);flex:1;}\n    #tt-region .tt-senior-day-heading span{display:inline-flex;align-items:center;padding:8px 13px;border-radius:16px;background:#fff;border:1px solid rgba(187,13,63,.18);box-shadow:0 6px 14px rgba(23,18,22,.04);}\n    #tt-region .tt-senior-day-heading small{order:3;white-space:nowrap;color:var(--tt-muted);font-size:14px;font-weight:850;}\n    #tt-region .tt-senior-event-row{display:grid;grid-template-columns:132px 1fr;gap:18px;align-items:start;padding:18px 20px;border-radius:20px;background:#fff;box-shadow:0 8px 22px rgba(23,18,22,.055);}\n    #tt-region .tt-senior-event-row::before{width:5px;}\n    #tt-region .tt-senior-event-time{display:flex;align-items:center;justify-content:center;min-height:54px;padding:10px;border-radius:16px;background:#fff3f7;border:1px solid rgba(187,13,63,.18);color:var(--tt-red);font-size:17px;font-weight:950;text-align:center;line-height:1.15;}\n    #tt-region .tt-senior-event-main{min-width:0;}\n    #tt-region .tt-senior-event-meta{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:7px;}\n    #tt-region .tt-senior-event-meta span{display:inline-flex;align-items:center;min-height:25px;padding:4px 9px;border-radius:999px;background:#f8eef2;color:var(--tt-red);font-size:12px;font-weight:950;}\n    #tt-region .tt-senior-event-meta span:first-child{background:#fff;border:1px solid var(--tt-line);color:var(--tt-ink);}\n    #tt-region .tt-senior-event-title{margin:0 0 7px;color:var(--tt-ink);font-size:22px;line-height:1.22;letter-spacing:-.015em;}\n    #tt-region .tt-senior-event-info{color:var(--tt-muted);font-size:16px;line-height:1.45;margin-top:3px;}\n    #tt-region .tt-senior-event-info strong{color:var(--tt-ink);}\n    #tt-region .tt-senior-event-row .tt-event-details-toggle-wrap{margin-top:13px;}\n    #tt-region .tt-senior-event-row .tt-details-toggle{min-height:44px;font-size:14px;padding:10px 16px;border-width:2px;}\n    #tt-region .tt-senior-event-row .tt-event-details-scroll{max-height:260px;font-size:15.5px;line-height:1.7;color:#514851;}\n    #tt-region .tt-senior-empty{padding:24px;border-radius:20px;background:#fff;border:1px dashed rgba(187,13,63,.28);color:var(--tt-muted);font-size:17px;line-height:1.5;text-align:center;}\n    #tt-region .tt-senior-empty strong{color:var(--tt-red);font-size:20px;}\n    #tt-region .tt-senior-empty-actions{margin-top:14px;}\n    @media (max-width:980px){#tt-region .tt-area-page-links{grid-template-columns:repeat(2,minmax(0,1fr));}#tt-region .tt-simple-browser-main{grid-template-columns:1fr;}#tt-region .tt-simple-month-current{order:-1;width:100%;}#tt-region .tt-simple-month-nav{width:100%;}}\n    @media (max-width:680px){#tt-region .tt-calendar-section.is-simple-mode .tt-calendar-count{font-size:20px;}#tt-region .tt-area-page-nav{padding:15px;border-radius:20px;}#tt-region .tt-area-page-links{grid-template-columns:1fr;}#tt-region .tt-area-page-links a{min-height:54px;font-size:16px;}#tt-region .tt-simple-browser{padding:15px;border-radius:20px 20px 0 0;}#tt-region .tt-simple-browser-note{font-size:15px;text-align:left;}#tt-region .tt-calendar-section.is-simple-mode .tt-event-list{padding:10px 12px 18px;border-radius:0 0 20px 20px;}#tt-region .tt-senior-event-row{grid-template-columns:1fr;padding:15px;border-radius:18px;}#tt-region .tt-senior-event-time{justify-content:flex-start;width:100%;min-height:46px;}#tt-region .tt-senior-day-heading{font-size:17px;align-items:flex-start;flex-wrap:wrap;}#tt-region .tt-senior-day-heading::after{display:none;}#tt-region .tt-senior-day-heading span{width:100%;}#tt-region .tt-senior-day-heading small{order:2;}#tt-region .tt-senior-event-title{font-size:19px;}#tt-region .tt-senior-event-info{font-size:15px;}#tt-region .tt-senior-event-row .tt-details-toggle{width:100%;font-size:14px;}}\n\n\n\n    \/* v43 senior view: real Outlook-style month grid, not a list *\/\n    #tt-region .tt-calendar-section.is-simple-mode .tt-event-list{\n      display:block!important;\n      padding:0!important;\n      border:0!important;\n      background:transparent!important;\n      box-shadow:none!important;\n    }\n    #tt-region .tt-outlook-calendar{\n      margin-top:0;\n      border:1px solid rgba(187,13,63,.20);\n      border-radius:0 0 24px 24px;\n      background:#fff;\n      box-shadow:0 18px 46px rgba(23,18,22,.08);\n      overflow:hidden;\n    }\n    #tt-region .tt-outlook-calendar-head{\n      display:flex;\n      align-items:center;\n      justify-content:space-between;\n      gap:14px;\n      padding:16px 18px;\n      border-bottom:1px solid var(--tt-line);\n      background:linear-gradient(180deg,#fff8fb,#fff);\n      color:var(--tt-muted);\n      font-size:15px;\n    }\n    #tt-region .tt-outlook-calendar-head strong{\n      color:var(--tt-red);\n      font-size:22px;\n      line-height:1.15;\n    }\n    #tt-region .tt-outlook-weekdays{\n      display:grid;\n      grid-template-columns:repeat(7,minmax(0,1fr));\n      border-bottom:1px solid var(--tt-line);\n      background:#fff;\n    }\n    #tt-region .tt-outlook-weekdays span{\n      padding:12px 8px;\n      text-align:center;\n      color:var(--tt-red);\n      font-weight:950;\n      font-size:13px;\n      border-right:1px solid var(--tt-line);\n    }\n    #tt-region .tt-outlook-weekdays span:last-child{border-right:0;}\n    #tt-region .tt-outlook-grid{\n      display:grid;\n      grid-template-columns:repeat(7,minmax(0,1fr));\n      align-items:stretch;\n      background:var(--tt-line);\n      gap:1px;\n    }\n    #tt-region .tt-outlook-day{\n      min-height:190px;\n      background:#fff;\n      padding:10px;\n      display:flex;\n      flex-direction:column;\n      gap:8px;\n      min-width:0;\n    }\n    #tt-region .tt-outlook-day.is-outside-month{\n      background:#fbf8f9;\n      color:#9b8d95;\n    }\n    #tt-region .tt-outlook-day.is-today{\n      box-shadow:inset 0 0 0 3px rgba(187,13,63,.18);\n      background:#fff8fb;\n    }\n    #tt-region .tt-outlook-day-number{\n      display:flex;\n      justify-content:space-between;\n      align-items:center;\n      gap:8px;\n      min-height:26px;\n      color:var(--tt-ink);\n      font-weight:950;\n    }\n    #tt-region .tt-outlook-day-number span{\n      display:inline-flex;\n      align-items:center;\n      justify-content:center;\n      width:30px;\n      height:30px;\n      border-radius:999px;\n      background:#fff;\n      border:1px solid var(--tt-line);\n      color:var(--tt-red);\n      font-size:15px;\n    }\n    #tt-region .tt-outlook-day.is-today .tt-outlook-day-number span{\n      background:var(--tt-red);\n      color:#fff;\n      border-color:var(--tt-red);\n    }\n    #tt-region .tt-outlook-day-number strong{\n      color:var(--tt-red);\n      font-size:11px;\n      text-transform:uppercase;\n      letter-spacing:.04em;\n    }\n    #tt-region .tt-outlook-day-events{\n      display:grid;\n      gap:8px;\n      max-height:360px;\n      overflow:auto;\n      padding-right:2px;\n    }\n    #tt-region .tt-outlook-no-events{\n      margin:auto;\n      color:#a69aa2;\n      font-size:13px;\n      text-align:center;\n    }\n    #tt-region .tt-outlook-event{\n      border:1px solid rgba(187,13,63,.18);\n      border-left:4px solid rgba(187,13,63,.42);\n      border-radius:14px;\n      padding:9px;\n      background:linear-gradient(180deg,#fff,#fffafd);\n      box-shadow:0 6px 16px rgba(23,18,22,.045);\n      display:block;\n      transform:none!important;\n    }\n    #tt-region .tt-outlook-event::before{display:none!important;}\n    #tt-region .tt-outlook-event-top{\n      display:flex;\n      flex-wrap:wrap;\n      gap:5px;\n      align-items:center;\n      margin-bottom:5px;\n    }\n    #tt-region .tt-outlook-event-time,\n    #tt-region .tt-outlook-event-source{\n      display:inline-flex;\n      align-items:center;\n      min-height:22px;\n      padding:3px 7px;\n      border-radius:999px;\n      background:#f8eef2;\n      color:var(--tt-red);\n      font-size:11.5px;\n      font-weight:950;\n      line-height:1.1;\n    }\n    #tt-region .tt-outlook-event-source{\n      background:#fff;\n      border:1px solid var(--tt-line);\n      color:var(--tt-ink);\n    }\n    #tt-region .tt-outlook-event-title{\n      margin:0 0 5px;\n      font-size:15px;\n      line-height:1.25;\n      letter-spacing:-.01em;\n      color:var(--tt-ink);\n    }\n    #tt-region .tt-outlook-event-line{\n      color:var(--tt-muted);\n      font-size:12.5px;\n      line-height:1.35;\n      overflow-wrap:anywhere;\n    }\n    #tt-region .tt-outlook-event-line strong{color:var(--tt-ink);}\n    #tt-region .tt-outlook-details-toggle{\n      min-height:32px!important;\n      padding:7px 10px!important;\n      font-size:12px!important;\n      margin-top:8px!important;\n    }\n    #tt-region .tt-outlook-details-panel{\n      margin-top:8px!important;\n      border-radius:12px!important;\n    }\n    #tt-region .tt-outlook-details-panel .tt-event-details-scroll{\n      max-height:210px!important;\n      font-size:13px!important;\n      line-height:1.45!important;\n    }\n    @media (max-width:980px){\n      #tt-region .tt-outlook-weekdays{display:none;}\n      #tt-region .tt-outlook-grid{display:block;background:#fff;}\n      #tt-region .tt-outlook-day{\n        min-height:auto;\n        border-bottom:1px solid var(--tt-line);\n        padding:14px;\n      }\n      #tt-region .tt-outlook-day.is-outside-month{display:none;}\n      #tt-region .tt-outlook-day:not(.has-events){display:none;}\n      #tt-region .tt-outlook-day-events{max-height:none;overflow:visible;}\n      #tt-region .tt-outlook-event-title{font-size:18px;}\n      #tt-region .tt-outlook-event-line{font-size:15px;}\n      #tt-region .tt-outlook-event-time,#tt-region .tt-outlook-event-source{font-size:13px;min-height:26px;}\n      #tt-region .tt-outlook-details-toggle{width:100%;font-size:14px!important;}\n    }\n\n\n\n    \/* v44 senior-first classic month board *\/\n    #tt-region .tt-calendar-section.is-simple-mode .tt-calendar-main{max-width:1240px;}\n    #tt-region .tt-calendar-section.is-simple-mode .tt-calendar-toolbar{align-items:end;}\n    #tt-region .tt-calendar-section.is-simple-mode .tt-view-toggle{min-width:520px;}\n    #tt-region .tt-calendar-section.is-simple-mode .tt-view-btn{min-height:58px;font-size:17px;}\n    #tt-region .tt-area-page-nav{border-width:2px;}\n    #tt-region .tt-area-page-links a{min-height:58px;font-size:17px;border-radius:18px;}\n    #tt-region .tt-simple-browser{border-width:2px;border-bottom:0;}\n    #tt-region .tt-simple-month-current{font-size:22px;}\n    #tt-region .tt-simple-browser-note{font-size:17px;max-width:860px;}\n    #tt-region .tt-simple-reset{display:none!important;}\n    #tt-region .tt-outlook-calendar{border-width:2px;border-color:rgba(187,13,63,.24);}\n    #tt-region .tt-outlook-calendar-head{padding:15px 18px;background:#fff8fb;border-bottom:2px solid rgba(187,13,63,.18);}\n    #tt-region .tt-outlook-calendar-head strong{font-size:24px;}\n    #tt-region .tt-outlook-calendar-head span{font-size:16px;color:#4f4650;font-weight:800;}\n    #tt-region .tt-outlook-weekdays{background:#fff;}\n    #tt-region .tt-outlook-weekdays span{padding:11px 6px;color:#170811;font-size:15px;background:#fff2f6;border-right:1px solid rgba(187,13,63,.18);}\n    #tt-region .tt-outlook-grid{background:rgba(187,13,63,.16);gap:1px;}\n    #tt-region .tt-outlook-day{min-height:178px;background:#fffdf4;padding:7px;gap:6px;}\n    #tt-region .tt-outlook-day.is-outside-month{background:#f2f0f1;color:#9b8d95;}\n    #tt-region .tt-outlook-day.is-today{background:#fff5f8;box-shadow:inset 0 0 0 3px rgba(187,13,63,.30);}\n    #tt-region .tt-outlook-day-number{min-height:22px;justify-content:flex-end;}\n    #tt-region .tt-outlook-day-number span{width:auto;height:auto;min-width:0;border:0;background:transparent;color:#534a52;font-size:13px;font-weight:950;padding:0;}\n    #tt-region .tt-outlook-day.is-today .tt-outlook-day-number span{background:var(--tt-red);color:#fff;border-radius:999px;padding:3px 8px;}\n    #tt-region .tt-outlook-day-number strong{display:none;}\n    #tt-region .tt-outlook-no-events{display:none;}\n    #tt-region .tt-outlook-day-events{gap:4px;max-height:410px;padding-right:1px;}\n    #tt-region .tt-outlook-event{width:100%;display:grid;gap:2px;text-align:left;border:0;border-radius:7px;padding:6px 7px;background:#78081f;color:#fff;box-shadow:none;cursor:pointer;font-family:inherit;line-height:1.15;}\n    #tt-region .tt-outlook-event:hover,#tt-region .tt-outlook-event:focus{background:#a30b36;outline:3px solid rgba(187,13,63,.22);outline-offset:2px;}\n    #tt-region .tt-outlook-event.is-selected{background:var(--tt-red);box-shadow:0 0 0 3px rgba(187,13,63,.18);}\n    #tt-region .tt-outlook-event::before{display:none!important;}\n    #tt-region .tt-outlook-event-time{display:block;background:transparent;color:#fff;font-size:11px;font-weight:950;line-height:1.05;padding:0;min-height:0;border-radius:0;}\n    #tt-region .tt-outlook-event-title{display:block;margin:0;color:#fff;font-size:13px;font-weight:950;line-height:1.15;letter-spacing:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}\n    #tt-region .tt-outlook-event-place{display:block;color:rgba(255,255,255,.86);font-size:11px;font-weight:750;line-height:1.15;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}\n    #tt-region .tt-outlook-detail-panel{padding:16px 18px;border-bottom:2px solid rgba(187,13,63,.18);background:linear-gradient(180deg,#fff,#fff8fb);}\n    #tt-region .tt-outlook-detail-panel[hidden]{display:none!important;}\n    #tt-region .tt-outlook-detail-inner{position:relative;border:2px solid rgba(187,13,63,.22);border-radius:20px;background:#fff;padding:18px;box-shadow:0 16px 34px rgba(23,18,22,.08);}\n    #tt-region .tt-outlook-detail-kicker{color:var(--tt-red);font-size:13px;font-weight:950;text-transform:uppercase;letter-spacing:.04em;margin-bottom:6px;}\n    #tt-region .tt-outlook-detail-inner h3{margin:0 72px 8px 0;color:var(--tt-ink);font-size:24px;line-height:1.2;letter-spacing:-.015em;}\n    #tt-region .tt-outlook-detail-meta{color:#4f4650;font-size:16px;line-height:1.45;margin-bottom:8px;font-weight:750;}\n    #tt-region .tt-outlook-detail-fields{display:flex;flex-wrap:wrap;gap:8px 14px;margin:8px 0 12px;color:var(--tt-muted);font-size:15px;}\n    #tt-region .tt-outlook-detail-fields strong{color:var(--tt-ink);}\n    #tt-region .tt-outlook-detail-scroll{max-height:270px;overflow:auto;padding:14px 16px;border:1px solid var(--tt-line);border-radius:16px;background:#fffafd;color:#4f4650;font-size:16px;line-height:1.65;white-space:pre-wrap;}\n    #tt-region .tt-outlook-detail-close{position:absolute;right:16px;top:16px;min-height:42px;padding:8px 14px;border:2px solid var(--tt-line);border-radius:999px;background:#fff;color:var(--tt-red);font-size:15px;font-weight:950;cursor:pointer;}\n    #tt-region .tt-outlook-detail-close:hover,#tt-region .tt-outlook-detail-close:focus{border-color:var(--tt-red);outline:3px solid rgba(187,13,63,.16);}\n    @media (max-width:1180px){\n      #tt-region .tt-outlook-day{min-height:160px;padding:6px;}\n      #tt-region .tt-outlook-event-title{font-size:12.5px;}\n      #tt-region .tt-outlook-event-place{font-size:10.5px;}\n    }\n    @media (max-width:980px){\n      #tt-region .tt-calendar-section.is-simple-mode .tt-view-toggle{min-width:0;width:100%;}\n      #tt-region .tt-outlook-calendar-head{display:block;}\n      #tt-region .tt-outlook-calendar-head span{display:block;margin-top:4px;}\n      #tt-region .tt-outlook-grid{display:block;background:#fff;}\n      #tt-region .tt-outlook-day{min-height:auto;border-bottom:1px solid var(--tt-line);background:#fffdf4;padding:12px;}\n      #tt-region .tt-outlook-day.is-outside-month{display:none;}\n      #tt-region .tt-outlook-day:not(.has-events){display:none;}\n      #tt-region .tt-outlook-day-events{max-height:none;overflow:visible;}\n      #tt-region .tt-outlook-day-number{justify-content:flex-start;margin-bottom:6px;}\n      #tt-region .tt-outlook-day-number span{font-size:17px;color:var(--tt-red);}\n      #tt-region .tt-outlook-event{padding:10px 12px;border-radius:10px;}\n      #tt-region .tt-outlook-event-time{font-size:14px;}\n      #tt-region .tt-outlook-event-title{font-size:17px;-webkit-line-clamp:2;}\n      #tt-region .tt-outlook-event-place{font-size:14px;}\n    }\n    @media (max-width:680px){\n      #tt-region .tt-outlook-detail-inner{padding:15px;border-radius:18px;}\n      #tt-region .tt-outlook-detail-inner h3{font-size:20px;margin-right:0;padding-right:76px;}\n      #tt-region .tt-outlook-detail-meta,#tt-region .tt-outlook-detail-scroll{font-size:15px;}\n      #tt-region .tt-outlook-detail-scroll{max-height:310px;}\n    }\n\n  \n\n    \/* v45 mobile: keep the same classic month board on phones *\/\n    @media (max-width:980px){\n      #tt-region .tt-outlook-calendar{\n        overflow-x:auto!important;\n        overflow-y:hidden!important;\n        -webkit-overflow-scrolling:touch!important;\n        border-radius:0 0 20px 20px!important;\n      }\n      #tt-region .tt-outlook-calendar-head,\n      #tt-region .tt-outlook-detail-panel,\n      #tt-region .tt-outlook-weekdays,\n      #tt-region .tt-outlook-grid{\n        min-width:840px!important;\n      }\n      #tt-region .tt-outlook-calendar-head{\n        display:flex!important;\n        align-items:center!important;\n        justify-content:space-between!important;\n        gap:12px!important;\n        padding:12px 14px!important;\n      }\n      #tt-region .tt-outlook-calendar-head strong{\n        font-size:20px!important;\n      }\n      #tt-region .tt-outlook-calendar-head span{\n        display:block!important;\n        margin-top:0!important;\n        font-size:13px!important;\n      }\n      #tt-region .tt-outlook-weekdays{\n        display:grid!important;\n        grid-template-columns:repeat(7,minmax(0,1fr))!important;\n      }\n      #tt-region .tt-outlook-weekdays span{\n        padding:8px 4px!important;\n        font-size:12px!important;\n      }\n      #tt-region .tt-outlook-grid{\n        display:grid!important;\n        grid-template-columns:repeat(7,minmax(0,1fr))!important;\n        background:rgba(187,13,63,.16)!important;\n        gap:1px!important;\n      }\n      #tt-region .tt-outlook-day{\n        display:flex!important;\n        min-height:132px!important;\n        background:#fffdf4!important;\n        border-bottom:0!important;\n        padding:5px!important;\n        gap:4px!important;\n      }\n      #tt-region .tt-outlook-day.is-outside-month{\n        display:flex!important;\n        background:#f2f0f1!important;\n        color:#9b8d95!important;\n      }\n      #tt-region .tt-outlook-day:not(.has-events){\n        display:flex!important;\n      }\n      #tt-region .tt-outlook-day.is-today{\n        background:#fff5f8!important;\n        box-shadow:inset 0 0 0 2px rgba(187,13,63,.30)!important;\n      }\n      #tt-region .tt-outlook-day-number{\n        justify-content:flex-end!important;\n        margin-bottom:0!important;\n        min-height:18px!important;\n      }\n      #tt-region .tt-outlook-day-number span{\n        font-size:11px!important;\n        color:#534a52!important;\n        line-height:1!important;\n      }\n      #tt-region .tt-outlook-day.is-today .tt-outlook-day-number span{\n        background:var(--tt-red)!important;\n        color:#fff!important;\n        border-radius:999px!important;\n        padding:2px 6px!important;\n      }\n      #tt-region .tt-outlook-day-events{\n        display:grid!important;\n        gap:3px!important;\n        max-height:106px!important;\n        overflow:auto!important;\n        padding-right:1px!important;\n      }\n      #tt-region .tt-outlook-no-events{\n        display:none!important;\n      }\n      #tt-region .tt-outlook-event{\n        padding:5px 6px!important;\n        border-radius:6px!important;\n        min-height:0!important;\n      }\n      #tt-region .tt-outlook-event-time{\n        font-size:9.5px!important;\n        line-height:1.05!important;\n      }\n      #tt-region .tt-outlook-event-title{\n        font-size:11px!important;\n        line-height:1.12!important;\n        -webkit-line-clamp:2!important;\n      }\n      #tt-region .tt-outlook-event-place{\n        font-size:9.5px!important;\n        line-height:1.1!important;\n      }\n      #tt-region .tt-outlook-detail-inner{\n        padding:14px!important;\n        border-radius:16px!important;\n      }\n      #tt-region .tt-outlook-detail-inner h3{\n        font-size:20px!important;\n        margin-right:92px!important;\n        padding-right:0!important;\n      }\n      #tt-region .tt-outlook-detail-meta,\n      #tt-region .tt-outlook-detail-scroll{\n        font-size:14px!important;\n      }\n      #tt-region .tt-outlook-detail-scroll{\n        max-height:260px!important;\n      }\n      #tt-region .tt-outlook-detail-close{\n        min-height:38px!important;\n        padding:7px 12px!important;\n        font-size:14px!important;\n      }\n    }\n    @media (max-width:520px){\n      #tt-region .tt-outlook-calendar-head,\n      #tt-region .tt-outlook-detail-panel,\n      #tt-region .tt-outlook-weekdays,\n      #tt-region .tt-outlook-grid{\n        min-width:780px!important;\n      }\n      #tt-region .tt-outlook-day{min-height:124px!important;}\n      #tt-region .tt-outlook-day-events{max-height:98px!important;}\n    }\n\n\n    \/* v46 senior mobile simplification: remove status\/area blocks and make mobile grid fit the screen *\/\n    #tt-region .tt-area-page-nav,\n    #tt-region .tt-calendar-toolbar > div:first-child{\n      display:none!important;\n    }\n    #tt-region .tt-calendar-toolbar{\n      justify-content:center!important;\n    }\n    #tt-region .tt-calendar-section.is-simple-mode .tt-active-filter-bar{\n      display:none!important;\n    }\n\n    @media (max-width:680px){\n      #tt-region .tt-wrap{width:100%!important;padding-left:8px!important;padding-right:8px!important;}\n      #tt-region .tt-section{padding:36px 0!important;}\n      #tt-region .tt-h2{font-size:clamp(28px,8vw,38px)!important;line-height:1.08!important;}\n      #tt-region .tt-sub{font-size:14px!important;margin-top:9px!important;padding:0 6px!important;}\n\n      \/* The three view buttons are the only mode switch on mobile. *\/\n      #tt-region .tt-calendar-toolbar{\n        position:sticky!important;\n        top:0!important;\n        z-index:60!important;\n        display:block!important;\n        margin:0 -8px 10px!important;\n        padding:8px 8px 9px!important;\n        background:rgba(255,255,255,.97)!important;\n        border-bottom:1px solid var(--tt-line)!important;\n        box-shadow:0 8px 22px rgba(23,18,22,.08)!important;\n      }\n      #tt-region .tt-view-toggle,\n      #tt-region .tt-view-toggle-3{\n        display:grid!important;\n        grid-template-columns:repeat(3,minmax(0,1fr))!important;\n        gap:6px!important;\n        width:100%!important;\n        min-width:0!important;\n        max-width:none!important;\n      }\n      #tt-region .tt-view-btn{\n        width:100%!important;\n        min-width:0!important;\n        min-height:44px!important;\n        padding:8px 5px!important;\n        border-radius:999px!important;\n        font-size:13px!important;\n        line-height:1.05!important;\n        white-space:normal!important;\n        text-align:center!important;\n      }\n\n      \/* Keep the full Monday-Sunday board on phones, but fit it to screen width. *\/\n      #tt-region .tt-simple-browser{margin-top:8px!important;border-radius:18px!important;}\n      #tt-region .tt-simple-browser-main{display:grid!important;grid-template-columns:1fr auto 1fr!important;gap:5px!important;align-items:center!important;}\n      #tt-region .tt-simple-month-nav{min-height:38px!important;padding:7px 8px!important;font-size:12px!important;white-space:normal!important;}\n      #tt-region .tt-simple-month-current{font-size:16px!important;padding:9px 13px!important;}\n      #tt-region .tt-simple-browser-note{font-size:12.5px!important;line-height:1.35!important;padding:0 4px!important;}\n\n      #tt-region .tt-outlook-calendar{\n        width:100%!important;\n        max-width:100%!important;\n        overflow-x:visible!important;\n        overflow-y:visible!important;\n        border-radius:16px!important;\n      }\n      #tt-region .tt-outlook-calendar-head,\n      #tt-region .tt-outlook-detail-panel,\n      #tt-region .tt-outlook-weekdays,\n      #tt-region .tt-outlook-grid{\n        min-width:0!important;\n        width:100%!important;\n        max-width:100%!important;\n      }\n      #tt-region .tt-outlook-calendar-head{\n        padding:8px 9px!important;\n        gap:6px!important;\n      }\n      #tt-region .tt-outlook-calendar-head strong{font-size:16px!important;}\n      #tt-region .tt-outlook-calendar-head span{font-size:10.5px!important;}\n      #tt-region .tt-outlook-weekdays{\n        display:grid!important;\n        grid-template-columns:repeat(7,minmax(0,1fr))!important;\n      }\n      #tt-region .tt-outlook-weekdays span{\n        padding:5px 1px!important;\n        font-size:9px!important;\n        letter-spacing:0!important;\n        line-height:1!important;\n      }\n      #tt-region .tt-outlook-grid{\n        display:grid!important;\n        grid-template-columns:repeat(7,minmax(0,1fr))!important;\n        gap:1px!important;\n      }\n      #tt-region .tt-outlook-day{\n        display:flex!important;\n        min-height:78px!important;\n        padding:2px!important;\n        gap:2px!important;\n        border-bottom:0!important;\n      }\n      #tt-region .tt-outlook-day-number{\n        min-height:10px!important;\n        margin-bottom:0!important;\n      }\n      #tt-region .tt-outlook-day-number span{\n        font-size:8.5px!important;\n        line-height:1!important;\n      }\n      #tt-region .tt-outlook-day.is-today .tt-outlook-day-number span{\n        padding:1px 4px!important;\n      }\n      #tt-region .tt-outlook-day-events{\n        gap:2px!important;\n        max-height:62px!important;\n        overflow:hidden!important;\n        padding-right:0!important;\n      }\n      #tt-region .tt-outlook-event{\n        padding:2px 3px!important;\n        border-radius:4px!important;\n        gap:1px!important;\n      }\n      #tt-region .tt-outlook-event-time{\n        font-size:7.5px!important;\n        line-height:1!important;\n      }\n      #tt-region .tt-outlook-event-title{\n        font-size:8.5px!important;\n        line-height:1.05!important;\n        -webkit-line-clamp:1!important;\n      }\n      #tt-region .tt-outlook-event-place{\n        font-size:7.5px!important;\n        line-height:1!important;\n      }\n      #tt-region .tt-outlook-detail-panel{padding:10px!important;}\n      #tt-region .tt-outlook-detail-inner{padding:12px!important;border-radius:15px!important;}\n      #tt-region .tt-outlook-detail-inner h3{font-size:18px!important;margin-right:0!important;padding-right:68px!important;}\n      #tt-region .tt-outlook-detail-close{right:10px!important;top:10px!important;min-height:34px!important;padding:6px 10px!important;font-size:12.5px!important;}\n      #tt-region .tt-outlook-detail-meta,\n      #tt-region .tt-outlook-detail-fields,\n      #tt-region .tt-outlook-detail-scroll{font-size:13px!important;}\n      #tt-region .tt-outlook-detail-scroll{max-height:260px!important;line-height:1.55!important;}\n    }\n\n    @media (max-width:390px){\n      #tt-region .tt-outlook-day{min-height:70px!important;}\n      #tt-region .tt-outlook-day-events{max-height:55px!important;}\n      #tt-region .tt-outlook-event-time{font-size:7px!important;}\n      #tt-region .tt-outlook-event-title{font-size:8px!important;}\n      #tt-region .tt-outlook-event-place{display:none!important;}\n      #tt-region .tt-view-btn{font-size:12px!important;}\n    }\n\n    \/* v47 cleanup: no hero search and no empty-state notice in the classic month board *\/\n    #tt-region .tt-outlook-no-events,\n    #tt-region .tt-senior-empty{display:none!important;}\n\n\n    \/* v48 persistent mobile view switcher: placed outside the content\/filter grid *\/\n    #tt-region .tt-calendar-section > .tt-wrap > .tt-calendar-toolbar{\n      margin:22px auto 20px;\n      max-width:760px;\n      justify-content:center!important;\n    }\n    #tt-region .tt-calendar-main > .tt-calendar-toolbar{display:none!important;}\n    @media (max-width:680px){\n      #tt-region .tt-calendar-section > .tt-wrap > .tt-calendar-toolbar{\n        position:sticky!important;\n        top:0!important;\n        z-index:90!important;\n        display:block!important;\n        max-width:none!important;\n        margin:12px -8px 10px!important;\n        padding:8px 8px 9px!important;\n        background:rgba(255,255,255,.97)!important;\n        border-top:1px solid rgba(187,13,63,.10)!important;\n        border-bottom:1px solid var(--tt-line)!important;\n        box-shadow:0 8px 22px rgba(23,18,22,.08)!important;\n      }\n      #tt-region .tt-calendar-section > .tt-wrap > .tt-calendar-toolbar .tt-view-toggle,\n      #tt-region .tt-calendar-section > .tt-wrap > .tt-calendar-toolbar .tt-view-toggle-3{\n        display:grid!important;\n        grid-template-columns:repeat(3,minmax(0,1fr))!important;\n        gap:6px!important;\n        width:100%!important;\n        min-width:0!important;\n        max-width:none!important;\n      }\n      #tt-region .tt-calendar-shell{margin-top:0!important;}\n    }\n\n\n\n    \/* v49: mobile month navigation - keep Previous month and Next month identical *\/\n    @media (max-width:680px){\n      #tt-region .tt-simple-browser-main{\n        grid-template-columns:minmax(0,1fr) 78px 78px!important;\n        gap:6px!important;\n        align-items:center!important;\n      }\n      #tt-region #tt-simple-prev-month,\n      #tt-region #tt-simple-next-month{\n        width:78px!important;\n        min-width:78px!important;\n        max-width:78px!important;\n        height:78px!important;\n        min-height:78px!important;\n        max-height:78px!important;\n        aspect-ratio:1\/1!important;\n        padding:0 8px!important;\n        border-radius:999px!important;\n        display:inline-flex!important;\n        align-items:center!important;\n        justify-content:center!important;\n        justify-self:center!important;\n        text-align:center!important;\n        line-height:1.08!important;\n        font-size:13px!important;\n        white-space:normal!important;\n        box-sizing:border-box!important;\n      }\n      #tt-region .tt-simple-month-current{\n        width:auto!important;\n        min-width:0!important;\n        justify-self:stretch!important;\n        text-align:center!important;\n      }\n    }\n    @media (max-width:380px){\n      #tt-region .tt-simple-browser-main{\n        grid-template-columns:minmax(0,1fr) 68px 68px!important;\n        gap:5px!important;\n      }\n      #tt-region #tt-simple-prev-month,\n      #tt-region #tt-simple-next-month{\n        width:68px!important;\n        min-width:68px!important;\n        max-width:68px!important;\n        height:68px!important;\n        min-height:68px!important;\n        max-height:68px!important;\n        font-size:11.5px!important;\n        padding:0 6px!important;\n      }\n      #tt-region .tt-simple-month-current{font-size:14px!important;padding-left:9px!important;padding-right:9px!important;}\n    }\n\n\n\n    \/* v54: More choices keeps the same month calendar, with filters above it instead of a separate list *\/\n    #tt-region .tt-calendar-section.is-filter-mode .tt-calendar-shell{\n      display:block!important;\n      margin-top:18px!important;\n    }\n    #tt-region .tt-calendar-section.is-filter-mode .tt-filter-panel{\n      position:relative!important;\n      top:auto!important;\n      max-width:1080px!important;\n      margin:0 auto 18px!important;\n      max-height:none!important;\n      overflow:visible!important;\n    }\n    #tt-region .tt-calendar-section.is-filter-mode .tt-calendar-main{\n      max-width:1240px!important;\n      margin:0 auto!important;\n      width:100%!important;\n    }\n    #tt-region .tt-calendar-section.is-filter-mode .tt-simple-browser{\n      display:block!important;\n      margin-top:10px!important;\n    }\n    #tt-region .tt-calendar-section.is-filter-mode .tt-event-list{\n      display:block!important;\n      padding:0!important;\n      border:0!important;\n      background:transparent!important;\n      box-shadow:none!important;\n    }\n    #tt-region .tt-calendar-section.is-filter-mode .tt-area-page-nav{\n      display:none!important;\n    }\n    #tt-region .tt-calendar-section.is-filter-mode .tt-active-filter-bar{\n      margin:0 0 12px!important;\n    }\n    #tt-region .tt-calendar-section.is-filter-mode .tt-show-more{\n      display:none!important;\n    }\n    #tt-region .tt-calendar-section.is-filter-mode .tt-filter-body{\n      display:grid;\n      grid-template-columns:1fr 1fr;\n      gap:14px;\n      padding:16px!important;\n    }\n    #tt-region .tt-calendar-section.is-filter-mode .tt-filter-section-primary,\n    #tt-region .tt-calendar-section.is-filter-mode .tt-filter-section,\n    #tt-region .tt-calendar-section.is-filter-mode .tt-filter-details,\n    #tt-region .tt-calendar-section.is-filter-mode .tt-source-card,\n    #tt-region .tt-calendar-section.is-filter-mode .tt-filter-reset{\n      margin:0!important;\n    }\n    #tt-region .tt-calendar-section.is-filter-mode .tt-filter-top{\n      padding:16px 16px 0!important;\n    }\n    #tt-region .tt-calendar-section.is-filter-mode .tt-source-card{\n      grid-column:1\/-1;\n    }\n    #tt-region .tt-calendar-section.is-filter-mode .tt-filter-reset{\n      grid-column:1\/-1;\n    }\n    @media (max-width:820px){\n      #tt-region .tt-calendar-section.is-filter-mode .tt-filter-body{\n        grid-template-columns:1fr;\n      }\n    }\n    @media (max-width:680px){\n      #tt-region .tt-calendar-section.is-filter-mode .tt-calendar-shell{\n        margin-top:0!important;\n      }\n      #tt-region .tt-calendar-section.is-filter-mode .tt-filter-panel{\n        margin:0 0 12px!important;\n        border-radius:18px!important;\n      }\n      #tt-region .tt-calendar-section.is-filter-mode .tt-filter-body{\n        display:grid!important;\n        grid-template-columns:1fr!important;\n        gap:10px!important;\n        padding:12px!important;\n      }\n      #tt-region .tt-calendar-section.is-filter-mode .tt-filter-top{\n        padding:12px 12px 0!important;\n      }\n      #tt-region .tt-calendar-section.is-filter-mode .tt-simple-browser{\n        margin-top:8px!important;\n      }\n    }\n\n\n    \/* v55: simplified More choices panel after removing date\/month\/week and start-time filters *\/\n    #tt-region .tt-calendar-section.is-filter-mode .tt-filter-body{align-items:stretch;}\n    #tt-region .tt-calendar-section.is-filter-mode .tt-filter-section[aria-label=\"Choose place\"]{min-height:auto;}\n\n\n    \/* v58: More choices display toggle, map date picker, mobile close robustness *\/\n    #tt-region .tt-more-display-toggle{display:none;align-items:center;justify-content:center;gap:10px;flex-wrap:wrap;margin:0 0 14px;padding:12px;border-radius:22px;background:#fff;border:1px solid rgba(187,13,63,.18);box-shadow:0 10px 26px rgba(23,18,22,.06);}\n    #tt-region .tt-calendar-section.is-filter-mode .tt-more-display-toggle{display:flex;}\n    #tt-region .tt-more-display-toggle span{font-weight:950;color:var(--tt-muted);font-size:13px;text-transform:uppercase;letter-spacing:.04em;}\n    #tt-region .tt-more-display-btn{min-height:40px;border:1px solid var(--tt-line);background:#fff;color:var(--tt-ink);border-radius:999px;padding:9px 14px;font-size:14px;font-weight:950;cursor:pointer;}\n    #tt-region .tt-more-display-btn.is-active{background:var(--tt-red);border-color:var(--tt-red);color:#fff;box-shadow:0 10px 22px rgba(187,13,63,.18);}\n    #tt-region .tt-calendar-section.is-more-list-mode .tt-simple-browser{display:none!important;}\n    #tt-region .tt-map-mini-calendar-block{display:none;margin-top:14px;padding:13px;border-radius:20px;background:#fff;border:1px solid var(--tt-line);box-shadow:0 8px 20px rgba(23,18,22,.045);}\n    #tt-region .tt-calendar-section.is-map-mode .tt-map-mini-calendar-block{display:block;}\n    #tt-region .tt-map-mini-title{margin:0 0 4px;color:var(--tt-red);font-size:15px;font-weight:950;}\n    #tt-region .tt-map-mini-help{margin:0 0 10px;color:var(--tt-muted);font-size:12.5px;line-height:1.35;}\n    .tt-mobile-day-close,.tt-mobile-day-inline-close{position:relative;z-index:5;pointer-events:auto;}\n    .tt-mobile-day-detail-actions{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:10px;}\n    .tt-mobile-day-inline-close{border:1px solid var(--tt-line);background:#fff;color:var(--tt-red);border-radius:999px;padding:9px 13px;font-weight:950;cursor:pointer;}\n    @media (max-width:680px){#tt-region .tt-more-display-toggle{position:relative;z-index:1;margin-top:0;}#tt-region .tt-more-display-btn{flex:1 1 120px;min-height:46px;}}\n\n\n\n    \/* v59: cleaner mobile \"Show as\" layout + contained scrollable upcoming list\n       v60: longer list window + text cleanup + Show as only in More choices *\/\n    #tt-region .tt-calendar-section.is-more-list-mode .tt-event-list{\n      max-height:min(1180px, 74vh)!important;\n      overflow-y:auto!important;\n      overflow-x:hidden!important;\n      overscroll-behavior:contain!important;\n      -webkit-overflow-scrolling:touch!important;\n      padding:14px!important;\n      border:1px solid rgba(187,13,63,.18)!important;\n      border-radius:24px!important;\n      background:linear-gradient(180deg,#fff9fb,#fff)!important;\n      box-shadow:0 16px 40px rgba(23,18,22,.07)!important;\n      scrollbar-gutter:stable!important;\n    }\n    #tt-region .tt-calendar-section.is-more-list-mode .tt-event-list::-webkit-scrollbar{width:10px;}\n    #tt-region .tt-calendar-section.is-more-list-mode .tt-event-list::-webkit-scrollbar-track{background:#fff4f7;border-radius:999px;}\n    #tt-region .tt-calendar-section.is-more-list-mode .tt-event-list::-webkit-scrollbar-thumb{background:rgba(187,13,63,.45);border-radius:999px;border:2px solid #fff4f7;}\n    #tt-region .tt-calendar-section.is-more-list-mode .tt-event-list .tt-day-group:first-child{margin-top:0!important;}\n\n    @media (max-width:680px){\n      #tt-region .tt-more-display-toggle{\n        display:grid!important;\n        grid-template-columns:1fr 1fr!important;\n        align-items:stretch!important;\n        gap:10px!important;\n        padding:15px!important;\n      }\n      #tt-region .tt-more-display-toggle span{\n        grid-column:1\/-1!important;\n        display:block!important;\n        width:100%!important;\n        text-align:center!important;\n        margin:0 0 2px!important;\n        font-size:13px!important;\n        letter-spacing:.06em!important;\n      }\n      #tt-region .tt-more-display-btn{\n        width:100%!important;\n        min-width:0!important;\n        max-width:none!important;\n        min-height:54px!important;\n        height:54px!important;\n        display:flex!important;\n        align-items:center!important;\n        justify-content:center!important;\n        text-align:center!important;\n        border-radius:999px!important;\n        padding:10px 12px!important;\n        line-height:1.1!important;\n        white-space:normal!important;\n      }\n      #tt-region .tt-calendar-section.is-more-list-mode .tt-event-list{\n        max-height:calc(100dvh - 230px)!important;\n        min-height:360px!important;\n        padding:10px!important;\n        border-radius:20px!important;\n      }\n    }\n\n\n    \/* v60: keep Show as only in More choices, never in Month calendar or Map *\/\n    #tt-region .tt-calendar-section.is-simple-mode .tt-more-display-toggle,\n    #tt-region .tt-calendar-section.is-map-mode .tt-more-display-toggle{\n      display:none!important;\n    }\n\n    \/* v60: longer contained upcoming list window when More choices -> Upcoming list is selected *\/\n    #tt-region .tt-calendar-section.is-more-list-mode .tt-event-list{\n      max-height:min(1280px, 140vh)!important;\n      min-height:720px!important;\n    }\n    @media (max-width:680px){\n      #tt-region .tt-calendar-section.is-more-list-mode .tt-event-list{\n        height:min(1180px, 140dvh)!important;\n        max-height:min(1180px, 140dvh)!important;\n        min-height:720px!important;\n      }\n    }\n\n\n\n    \/* ===== v62: remove UI animations\/transitions for faster senior\/mobile interaction ===== *\/\n    #tt-region,\n    #tt-region *{\n      animation:none!important;\n      transition:none!important;\n      scroll-behavior:auto!important;\n      -webkit-tap-highlight-color:transparent;\n    }\n    #tt-region button,\n    #tt-region a,\n    #tt-region input,\n    #tt-region select,\n    #tt-region summary{\n      transition:none!important;\n      animation:none!important;\n      -webkit-tap-highlight-color:transparent;\n      touch-action:manipulation;\n    }\n    #tt-region .tt-btn:hover,\n    #tt-region .tt-chip:hover,\n    #tt-region .tt-view-btn:hover,\n    #tt-region .tt-more-display-btn:hover,\n    #tt-region .tt-weekend-shortcut:hover,\n    #tt-region .tt-event-card:hover,\n    #tt-region .tt-map-card:hover,\n    #tt-region .tt-small-btn:hover,\n    #tt-region .tt-outlook-event:hover,\n    #tt-region .tt-details-toggle:hover,\n    #tt-region .tt-simple-month-nav:hover{\n      transform:none!important;\n    }\n    #tt-region .tt-chip:active,\n    #tt-region .tt-view-btn:active,\n    #tt-region .tt-more-display-btn:active,\n    #tt-region .tt-btn:active,\n    #tt-region .tt-simple-month-nav:active,\n    #tt-region .tt-outlook-event:active{\n      transform:none!important;\n      filter:none!important;\n    }\n\n    \/* ===== v62: clearer separation between calendar and organizer directory ===== *\/\n    #tt-region .tt-section-break{\n      width:min(1180px,calc(100% - 32px));\n      margin:34px auto 0;\n      border-top:4px solid var(--tt-red);\n      position:relative;\n      text-align:center;\n      opacity:.98;\n    }\n    #tt-region .tt-section-break span{\n      display:inline-flex;\n      align-items:center;\n      justify-content:center;\n      min-height:42px;\n      margin-top:-23px;\n      padding:9px 18px;\n      border:2px solid var(--tt-line);\n      border-radius:999px;\n      background:#fff;\n      color:var(--tt-red);\n      font-size:14px;\n      font-weight:950;\n      letter-spacing:.04em;\n      text-transform:uppercase;\n      box-shadow:0 10px 26px rgba(23,18,22,.08);\n    }\n    #tt-region .tt-actors-section{\n      margin-top:20px!important;\n      padding-top:56px!important;\n      background:linear-gradient(180deg,#fff 0%, var(--tt-soft) 100%);\n      border-top:0!important;\n    }\n    @media (max-width:680px){\n      #tt-region .tt-section-break{\n        width:calc(100% - 28px);\n        margin-top:26px;\n        border-top-width:5px;\n      }\n      #tt-region .tt-section-break span{\n        min-height:46px;\n        padding:10px 16px;\n        font-size:13px;\n      }\n      #tt-region .tt-actors-section{\n        margin-top:18px!important;\n        padding-top:46px!important;\n      }\n    }\n\n\n    \/* ===== v63: hard-disable mobile white\/tap flash and keep selected buttons red ===== *\/\n    #tt-region,\n    #tt-region *{\n      -webkit-tap-highlight-color:rgba(0,0,0,0)!important;\n      -webkit-touch-callout:none;\n    }\n\n    #tt-region button,\n    #tt-region a,\n    #tt-region summary,\n    #tt-region input,\n    #tt-region select{\n      transition-property:none!important;\n      transition-duration:0s!important;\n      animation:none!important;\n    }\n\n    #tt-region button:active,\n    #tt-region button:focus,\n    #tt-region button:focus-visible,\n    #tt-region a:active,\n    #tt-region a:focus,\n    #tt-region a:focus-visible,\n    #tt-region summary:active,\n    #tt-region summary:focus,\n    #tt-region summary:focus-visible{\n      transition:none!important;\n      animation:none!important;\n      transform:none!important;\n      filter:none!important;\n      outline:none!important;\n    }\n\n    #tt-region .tt-chip,\n    #tt-region .tt-view-btn,\n    #tt-region .tt-more-display-btn,\n    #tt-region .tt-filter-toggle,\n    #tt-region .tt-simple-month-nav,\n    #tt-region .tt-mini-calendar-nav,\n    #tt-region .tt-mini-day,\n    #tt-region .tt-mini-week-btn,\n    #tt-region .tt-details-toggle,\n    #tt-region .tt-outlook-event{\n      transition:none!important;\n      animation:none!important;\n      -webkit-tap-highlight-color:rgba(0,0,0,0)!important;\n    }\n\n    #tt-region .tt-chip.is-active,\n    #tt-region .tt-chip.is-active:hover,\n    #tt-region .tt-chip.is-active:active,\n    #tt-region .tt-chip.is-active:focus,\n    #tt-region .tt-view-btn.is-active,\n    #tt-region .tt-view-btn.is-active:hover,\n    #tt-region .tt-view-btn.is-active:active,\n    #tt-region .tt-view-btn.is-active:focus,\n    #tt-region .tt-more-display-btn.is-active,\n    #tt-region .tt-more-display-btn.is-active:hover,\n    #tt-region .tt-more-display-btn.is-active:active,\n    #tt-region .tt-more-display-btn.is-active:focus{\n      background:var(--tt-red)!important;\n      color:#fff!important;\n      border-color:var(--tt-red)!important;\n      box-shadow:0 10px 26px rgba(187,13,63,.18)!important;\n      transform:none!important;\n      filter:none!important;\n    }\n\n    #tt-region .tt-chip:not(.is-active):active,\n    #tt-region .tt-chip:not(.is-active):focus,\n    #tt-region .tt-view-btn:not(.is-active):active,\n    #tt-region .tt-view-btn:not(.is-active):focus,\n    #tt-region .tt-more-display-btn:not(.is-active):active,\n    #tt-region .tt-more-display-btn:not(.is-active):focus{\n      background:#fff!important;\n      color:var(--tt-ink)!important;\n      border-color:var(--tt-line)!important;\n      transform:none!important;\n      filter:none!important;\n      box-shadow:0 8px 20px rgba(23,18,22,.07)!important;\n    }\n<\/style>\n\n<header class=\"tt-hero\" id=\"top\">\n  <div class=\"tt-hero-card\">\n    <div class=\"tt-hero-kicker\">Event index \u00b7 Sk\u00e5ne \u00b7 factual listings<\/div>\n    <h1 class=\"tt-h1\">Sk\u00e5ne Calendar<\/h1>\n    <p class=\"tt-hero-lead\">A practical event calendar for Sk\u00e5ne, built as a factual index with clear links to the original sources.<\/p>\n    <p class=\"tt-hero-small\">Event index. Always check the original source or organiser before travelling.<\/p>\n  <\/div>\n<\/header>\n\n<nav class=\"tt-app-nav\" aria-label=\"Page navigation\">\n  <div class=\"tt-wrap tt-app-nav-inner\">\n    <a class=\"tt-nav-pill\" href=\"#tt-calendar\">Calendar<\/a>\n    <a class=\"tt-nav-pill\" href=\"#tt-index-info\">About this index<\/a>\n  <\/div>\n<\/nav>\n\n  <section class=\"tt-section tt-calendar-section\" id=\"tt-calendar\">\n    <div class=\"tt-wrap\">\n<span class=\"tt-eyebrow\">Event index<\/span>\n<h2 class=\"tt-h2\">Sk\u00e5ne Calendar<\/h2>\n<p class=\"tt-sub\">Public events in Sk\u00e5ne shown as factual listing information only.<\/p>\n\n<div id=\"tt-index-info\" class=\"tt-legal-note\">\n  <p><strong>Event index.<\/strong> Event information is collected from permitted\/public sources and shown as factual listing information only. This page is not the organiser of listed events unless explicitly stated. Always check the original source or organiser before travelling.<\/p>\n  <p><strong>Sk\u00e5ne event data:<\/strong> From uploaded events at TangoSweden.se, used with permission.<\/p>\n<\/div>\n\n      <!-- v48: persistent view switcher lives above the filter\/content layout, so it never moves below filters on mobile. -->\n      <div class=\"tt-calendar-toolbar\">\n        <div>\n<div class=\"tt-calendar-count\" id=\"tt-event-count\">Loading calendar&#8230;<\/div>\n<div class=\"tt-updated\" id=\"tt-event-updated\">Sk\u00e5ne event data:  From uploaded events at TangoSweden.se, used with permission.<\/div>\n        <\/div>\n        <div class=\"tt-view-toggle tt-view-toggle-3\" aria-label=\"Choose calendar view\">\n      <button class=\"tt-view-btn is-active\" type=\"button\" data-view=\"list\" data-mode=\"simple\">Month calendar<\/button>\n      <button class=\"tt-view-btn\" type=\"button\" data-view=\"list\" data-mode=\"filters\">More choices<\/button>\n      <button class=\"tt-view-btn\" type=\"button\" data-view=\"map\" data-mode=\"map\">Map<\/button>\n        <\/div>\n      <\/div>\n\n      <div class=\"tt-calendar-shell\">\n        <aside class=\"tt-filter-panel\" aria-label=\"Calendar filters\">\n          <div class=\"tt-filter-head\">\n            <div>\n              <h3 class=\"tt-filter-title\">More choices<\/h3>\n<p class=\"tt-filter-head-sub\">Choose city, format or search term.<\/p>\n            <\/div>\n            <button id=\"tt-filter-toggle\" class=\"tt-filter-toggle\" type=\"button\" aria-controls=\"tt-filter-body\" aria-expanded=\"true\">Hide filters<\/button>\n          <\/div>\n\n          <div class=\"tt-filter-top\">\n            <label class=\"tt-filter-label\" for=\"tt-event-search\">Search<\/label>\n            <input id=\"tt-event-search\" class=\"tt-input\" type=\"search\" placeholder=\"Organizer, venue, city...\">\n            <div id=\"tt-filter-summary\" class=\"tt-filter-summary\" aria-live=\"polite\"><\/div>\n          <\/div>\n\n          <section class=\"tt-map-mini-calendar-block\" aria-label=\"Choose date for map view\">\n            <h4 class=\"tt-map-mini-title\">Choose date<\/h4>\n            <p class=\"tt-map-mini-help\">Tap a day, week number or month to narrow the map.<\/p>\n            <div class=\"tt-mini-calendar\">\n              <div class=\"tt-mini-calendar-head\">\n                <button id=\"tt-mini-prev\" class=\"tt-mini-calendar-nav\" type=\"button\" aria-label=\"Previous month\">\u2039<\/button>\n                <button id=\"tt-mini-title-btn\" class=\"tt-mini-calendar-title-button\" type=\"button\">\n                  <span id=\"tt-mini-title\" class=\"tt-mini-calendar-title\">Month<\/span>\n                <\/button>\n                <button id=\"tt-mini-next\" class=\"tt-mini-calendar-nav\" type=\"button\" aria-label=\"Next month\">\u203a<\/button>\n              <\/div>\n              <div id=\"tt-mini-calendar-help\" class=\"tt-mini-calendar-subtitle\">Tap day\/week\/month to filter<\/div>\n              <div class=\"tt-mini-calendar-weekdays\" aria-hidden=\"true\">\n                <span class=\"tt-mini-week-label\">#<\/span><span>Mon<\/span><span>Tue<\/span><span>Wed<\/span><span>Thu<\/span><span>Fri<\/span><span>Sat<\/span><span>Sun<\/span>\n              <\/div>\n              <div id=\"tt-mini-calendar-grid\" class=\"tt-mini-calendar-grid\"><\/div>\n              <div class=\"tt-mini-calendar-footer\">\n                <div class=\"tt-mini-calendar-legend\"><span><\/span> Number = events that day<\/div>\n                <button id=\"tt-clear-date\" class=\"tt-clear-date\" type=\"button\">Clear date<\/button>\n              <\/div>\n            <\/div>\n          <\/section>\n\n          <div id=\"tt-filter-body\" class=\"tt-filter-body\">\n\n\n\n         <section class=\"tt-filter-section\" aria-label=\"Choose place\">\n  <div class=\"tt-filter-section-head\">\n    <div>\n      <strong>Where?<\/strong>\n      <small>Choose a city or show all Sk\u00e5ne events.<\/small>\n    <\/div>\n  <\/div>\n\n  <div class=\"tt-filter-group tt-filter-group-primary\" style=\"display:none!important;\" aria-hidden=\"true\">\n    <span class=\"tt-filter-label\">Country<\/span>\n    <div class=\"tt-chip-list\" id=\"tt-country-filters\" aria-label=\"Country filter\">\n      <button class=\"tt-chip is-active\" type=\"button\" data-country=\"se\">Sweden<\/button>\n    <\/div>\n  <\/div>\n\n  <div class=\"tt-filter-group\">\n    <span class=\"tt-filter-label\">City \/ region<\/span>\n    <div class=\"tt-chip-list tt-city-grid\" id=\"tt-region-filters\">\n      <button class=\"tt-chip\" type=\"button\" data-region=\"all\">All events<\/button>\n      <button class=\"tt-chip is-active\" type=\"button\" data-region=\"skane\">Sk\u00e5ne<\/button>\n      <button class=\"tt-chip\" type=\"button\" data-region=\"local\">Lund\/Malm\u00f6<\/button>\n      <button class=\"tt-chip\" type=\"button\" data-region=\"lund\">Lund<\/button>\n      <button class=\"tt-chip\" type=\"button\" data-region=\"malmo\">Malm\u00f6<\/button>\n      <button class=\"tt-chip\" type=\"button\" data-region=\"helsingborg\">Helsingborg<\/button>\n      <button class=\"tt-chip\" type=\"button\" data-region=\"ystad\">Ystad<\/button>\n    <\/div>\n  <\/div>\n<\/section>\n\n            <details class=\"tt-filter-details\" open>\n              <summary><span>Format<\/span><small>Milonga, practica, course or festival<\/small><\/summary>\n              <div class=\"tt-filter-details-body\">\n                <div class=\"tt-chip-list\" id=\"tt-type-filters\">\n                  <button class=\"tt-chip is-active\" type=\"button\" data-type=\"all\">All formats<\/button>\n                  <button class=\"tt-chip\" type=\"button\" data-type=\"milonga\">Milonga\/social dance<\/button>\n                  <button class=\"tt-chip\" type=\"button\" data-type=\"practica\">Practica<\/button>\n                  <button class=\"tt-chip\" type=\"button\" data-type=\"course\">Course\/workshop<\/button>\n                  <button class=\"tt-chip\" type=\"button\" data-type=\"festival\">Festival\/event<\/button>\n                <\/div>\n              <\/div>\n            <\/details>\n\n\n\n<div class=\"tt-source-card\">\n  <strong>Source:<\/strong> Sk\u00e5ne event data from TangoSweden.se, used with permission.\n  <div class=\"tt-trust-note\"><strong>Before travelling:<\/strong> verify time, venue, registration and final details with the original source or organiser.<\/div>\n<\/div>\n\n\n        <\/aside>\n\n        <main class=\"tt-calendar-main\">\n          <div class=\"tt-active-filter-bar\" id=\"tt-active-filter-bar\" aria-live=\"polite\"><\/div>\n\n          <div class=\"tt-more-display-toggle\" id=\"tt-more-display-toggle\" aria-label=\"Choose how filtered events are shown\">\n            <span>Show as<\/span>\n            <button class=\"tt-more-display-btn is-active\" type=\"button\" data-more-display=\"calendar\">Calendar<\/button>\n            <button class=\"tt-more-display-btn\" type=\"button\" data-more-display=\"list\">Upcoming list<\/button>\n          <\/div>\n\n        \n\n          <section class=\"tt-simple-browser\" id=\"tt-simple-browser\" aria-label=\"Simple month calendar\">\n            <div class=\"tt-simple-browser-main\">\n              <button class=\"tt-simple-month-nav\" id=\"tt-simple-prev-month\" type=\"button\" aria-label=\"Previous month\">\u2039 Previous month<\/button>\n              <div class=\"tt-simple-month-current\" id=\"tt-simple-month-label\">Month<\/div>\n              <button class=\"tt-simple-month-nav\" id=\"tt-simple-next-month\" type=\"button\" aria-label=\"Next month\">Next month \u203a<\/button>\n            <\/div>\n            <div class=\"tt-simple-browser-note\">\n              \n            <\/div>\n          <\/section>\n\n          <div class=\"tt-event-list\" id=\"tt-event-list\" aria-live=\"polite\">\n            <div class=\"tt-empty\">The calendar is loading&#8230;<\/div>\n          <\/div>\n\n          <div class=\"tt-map-panel\" id=\"tt-map-panel\" aria-live=\"polite\">\n            <div class=\"tt-map-grid\">\n              <div class=\"tt-map-list\" id=\"tt-map-list\"><\/div>\n              <div class=\"tt-map-frame-wrap\">\n                <div class=\"tt-map-tools\">\n                  <strong>Map overview<\/strong>\n                  <span>Exact venue pins are shown when known. If the venue is missing, the map may use an approximate city-level pin.<\/span>\n                <\/div>\n                <div id=\"tt-leaflet-map\" class=\"tt-leaflet-map\" role=\"img\" aria-label=\"Map of matching tango events\"><\/div>\n                <div class=\"tt-map-caption\" id=\"tt-map-caption\">The map view shows matching events with exact venue pins when possible and city-level pins when needed.<\/div>\n              <\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"tt-show-more\" id=\"tt-show-more-wrap\" style=\"display:none;\">\n            <button type=\"button\" class=\"tt-btn tt-btn-secondary\" id=\"tt-show-more\">Show more<\/button>\n          <\/div>\n        <\/main>\n      <\/div>\n    <\/div>\n  <\/section>\n\n\n\n<style>\n  \/* v51: keep full times on mobile, but force them onto one row. *\/\n  #tt-region .tt-outlook-event-time{display:block!important;white-space:nowrap!important;overflow:hidden!important;text-overflow:clip!important;line-height:1.05!important;}\n  #tt-region .tt-time-full{display:block!important;white-space:nowrap!important;}\n  #tt-region .tt-time-mobile{display:none!important;}\n  @media (max-width:680px){\n    #tt-region .tt-outlook-event-time{font-size:7px!important;letter-spacing:-.18px!important;white-space:nowrap!important;}\n    #tt-region .tt-time-full{display:block!important;white-space:nowrap!important;}\n    #tt-region .tt-time-mobile{display:none!important;}\n  }\n<\/style>\n\n  \n<style>\n  \/* v52: shorter intro; top calendar links removed; Copenhagen no longer includes Roskilde\/K\u00f8ge. *\/\n  #tt-region .tt-sub{max-width:660px!important;}\n  #tt-region .tt-simple-browser-note{max-width:620px!important;}\n<\/style>\n\n\n\n<style>\n  \/* v56: desktop format always visible, working mobile filter toggle, and mobile date\/details overlay *\/\n  @media (min-width:681px){\n    #tt-region .tt-filter-details[open] > summary{pointer-events:none;cursor:default;}\n    #tt-region .tt-filter-details[open] > summary::after{display:none!important;}\n  }\n  #tt-region .tt-filter-panel.is-collapsed #tt-filter-body{display:none!important;}\n  #tt-region .tt-filter-panel.is-collapsed .tt-filter-top{display:none!important;}\n\n  #tt-region .tt-outlook-calendar{position:relative!important;}\n  @media (min-width:681px){\n    #tt-region .tt-outlook-detail-panel{\n      position:absolute!important;\n      z-index:35!important;\n      inset:18px!important;\n      border:0!important;\n      border-radius:22px!important;\n      padding:18px!important;\n      background:rgba(255,255,255,.94)!important;\n      box-shadow:0 22px 70px rgba(23,18,22,.18)!important;\n      backdrop-filter:blur(8px)!important;\n      display:flex!important;\n      align-items:flex-start!important;\n      justify-content:center!important;\n    }\n    #tt-region .tt-outlook-detail-panel[hidden]{display:none!important;}\n    #tt-region .tt-outlook-detail-inner{\n      width:min(760px,100%)!important;\n      max-height:calc(100% - 10px)!important;\n      margin:0 auto!important;\n      overflow:hidden!important;\n    }\n    #tt-region .tt-outlook-detail-scroll{\n      max-height:min(420px,calc(100vh - 320px))!important;\n    }\n  }\n\n  @media (max-width:680px){\n    #tt-region .tt-outlook-day.has-events{cursor:pointer;}\n    #tt-region .tt-outlook-event{position:relative;}\n  }\n\n  .tt-mobile-day-modal{\n    position:fixed;\n    inset:0;\n    z-index:99999;\n    display:none;\n    align-items:flex-end;\n    justify-content:center;\n    padding:14px;\n    background:rgba(23,18,22,.42);\n  }\n  .tt-mobile-day-modal.is-visible{display:flex;}\n  .tt-mobile-day-dialog{\n    width:min(560px,100%);\n    max-height:86vh;\n    overflow:hidden;\n    border:2px solid rgba(187,13,63,.24);\n    border-radius:24px 24px 18px 18px;\n    background:#fff;\n    box-shadow:0 28px 80px rgba(23,18,22,.26);\n    position:relative;\n    padding:18px;\n  }\n  .tt-mobile-day-close{\n    position:absolute;\n    right:14px;\n    top:14px;\n    min-height:40px;\n    padding:8px 14px;\n    border:2px solid rgba(187,13,63,.18);\n    border-radius:999px;\n    background:#fff;\n    color:#bb0d3f;\n    font-weight:950;\n    cursor:pointer;\n  }\n  .tt-mobile-day-content{max-height:calc(86vh - 36px);overflow:auto;padding-right:2px;}\n  .tt-mobile-day-kicker{color:#bb0d3f;font-size:12px;font-weight:950;text-transform:uppercase;letter-spacing:.05em;margin:4px 92px 4px 0;}\n  .tt-mobile-day-content h3{margin:0 92px 8px 0;color:#171216;font-size:24px;line-height:1.12;letter-spacing:-.02em;}\n  .tt-mobile-day-help{margin:0 0 14px;color:#5b535a;font-size:15px;line-height:1.35;}\n  .tt-mobile-day-list{display:grid;gap:10px;}\n  .tt-mobile-day-event{\n    width:100%;\n    display:grid;\n    grid-template-columns:96px 1fr;\n    gap:12px;\n    align-items:center;\n    text-align:left;\n    border:2px solid rgba(187,13,63,.16);\n    border-radius:18px;\n    background:#fffdfb;\n    padding:12px;\n    font-family:inherit;\n    cursor:pointer;\n  }\n  .tt-mobile-day-event.is-selected{border-color:#bb0d3f;box-shadow:0 0 0 3px rgba(187,13,63,.10);}\n  .tt-mobile-day-event-time{display:flex;align-items:center;justify-content:center;min-height:44px;border-radius:14px;background:#fff2f6;color:#bb0d3f;font-weight:950;font-size:14px;white-space:nowrap;}\n  .tt-mobile-day-event-main strong{display:block;color:#171216;font-size:17px;line-height:1.18;margin-bottom:4px;}\n  .tt-mobile-day-event-main small{display:block;color:#5b535a;font-size:13.5px;line-height:1.25;}\n  .tt-mobile-day-back{min-height:40px;margin:0 0 12px;padding:8px 13px;border:2px solid rgba(187,13,63,.18);border-radius:999px;background:#fff;color:#bb0d3f;font-weight:950;cursor:pointer;}\n  .tt-mobile-day-detail-meta{color:#5b535a;font-size:15px;line-height:1.4;margin-bottom:8px;font-weight:750;}\n  .tt-mobile-day-detail-fields{display:flex;flex-wrap:wrap;gap:6px 12px;margin:8px 0 12px;color:#5b535a;font-size:14px;}\n  .tt-mobile-day-detail-fields strong{color:#171216;}\n  .tt-mobile-day-detail-scroll{max-height:46vh;overflow:auto;padding:13px;border:1px solid rgba(187,13,63,.18);border-radius:16px;background:#fffafd;color:#4f4650;font-size:14px;line-height:1.6;white-space:pre-wrap;}\n  .tt-mobile-day-empty{padding:18px;border:1px dashed rgba(187,13,63,.25);border-radius:16px;color:#5b535a;text-align:center;}\n  @media (max-width:390px){\n    .tt-mobile-day-dialog{padding:14px;border-radius:20px 20px 16px 16px;}\n    .tt-mobile-day-content h3{font-size:21px;}\n    .tt-mobile-day-event{grid-template-columns:82px 1fr;gap:9px;padding:10px;}\n    .tt-mobile-day-event-time{font-size:12.5px;}\n    .tt-mobile-day-event-main strong{font-size:15.5px;}\n  }\n<\/style>\n\n  \n\n<style>\n  \/* v57: centered popups, mobile scroll lock, cleaner month browser note, stable More choices mode *\/\n  #tt-region .tt-simple-browser-note{display:none!important;}\n\n  @media (min-width:681px){\n    #tt-region .tt-outlook-detail-panel{\n      display:flex!important;\n      align-items:center!important;\n      justify-content:center!important;\n      inset:0!important;\n      padding:24px!important;\n      background:rgba(255,255,255,.82)!important;\n    }\n    #tt-region .tt-outlook-detail-panel[hidden]{display:none!important;}\n    #tt-region .tt-outlook-detail-inner{\n      width:min(760px,calc(100% - 32px))!important;\n      max-height:min(78vh,680px)!important;\n      margin:auto!important;\n      display:flex!important;\n      flex-direction:column!important;\n    }\n    #tt-region .tt-outlook-detail-scroll{\n      max-height:min(50vh,430px)!important;\n      overflow:auto!important;\n    }\n  }\n\n  html.tt-mobile-modal-open,\n  body.tt-mobile-modal-open{\n    overflow:hidden!important;\n    touch-action:none!important;\n  }\n\n  @media (max-width:680px){\n    .tt-mobile-day-modal{\n      align-items:center!important;\n      justify-content:center!important;\n      padding:14px!important;\n      overflow:hidden!important;\n    }\n    .tt-mobile-day-dialog{\n      width:min(560px,calc(100vw - 28px))!important;\n      max-height:min(86vh,720px)!important;\n      border-radius:22px!important;\n      display:flex!important;\n      flex-direction:column!important;\n      overflow:hidden!important;\n    }\n    .tt-mobile-day-content{\n      flex:1 1 auto!important;\n      min-height:0!important;\n      max-height:none!important;\n      overflow:auto!important;\n      -webkit-overflow-scrolling:touch!important;\n      padding-right:4px!important;\n    }\n    .tt-mobile-day-detail-scroll{\n      max-height:42vh!important;\n      overflow:auto!important;\n      -webkit-overflow-scrolling:touch!important;\n    }\n  }\n<\/style>\n\n<style>\n  \/* Sk\u00e5ne Calendar neutral\/compliance layer *\/\n\n  #tt-region {\n    --tt-red: #7f1d1d;\n    --tt-red-dark: #5f1717;\n    --tt-soft: #f7f4f1;\n    --tt-soft-2: #f1ece7;\n    --tt-line: #e7d8d0;\n  }\n\n  #tt-region,\n  #tt-region * {\n    animation: none !important;\n    transition: none !important;\n    scroll-behavior: auto !important;\n    -webkit-tap-highlight-color: transparent !important;\n  }\n\n  #tt-region .tt-hero {\n    min-height: 380px !important;\n    padding: 70px 0 58px !important;\n    background-image:\n      linear-gradient(135deg, rgba(54, 38, 28, .96), rgba(96, 67, 48, .90)) !important;\n    background-size: cover !important;\n    background-position: center !important;\n  }\n\n  #tt-region .tt-hero::after {\n    height: 90px !important;\n  }\n\n  #tt-region .tt-hero-card {\n    background: rgba(255,255,255,.08) !important;\n    border: 1px solid rgba(255,255,255,.24) !important;\n    box-shadow: 0 22px 70px rgba(0,0,0,.22) !important;\n  }\n\n  #tt-region .tt-legal-note {\n    max-width: 900px;\n    margin: 22px auto 0;\n    padding: 16px 18px;\n    border: 1px solid var(--tt-line);\n    border-left: 5px solid var(--tt-red);\n    border-radius: 18px;\n    background: #fff;\n    color: var(--tt-muted);\n    font-size: 14px;\n    line-height: 1.55;\n    box-shadow: 0 8px 22px rgba(23,18,22,.05);\n  }\n\n  #tt-region .tt-legal-note p {\n    margin: 0;\n  }\n\n  #tt-region .tt-legal-note p + p {\n    margin-top: 8px;\n  }\n\n  #tt-region .tt-legal-note strong {\n    color: var(--tt-ink);\n  }\n\n  \/* Hide legacy unpermitted geography controls if the encoded script tries to revive them. *\/\n  #tt-region [data-country=\"both\"],\n  #tt-region [data-country=\"dk\"],\n  #tt-region [data-region=\"skane-copenhagen\"],\n  #tt-region [data-region=\"copenhagen\"],\n  #tt-region [data-region=\"denmark\"] {\n    display: none !important;\n  }\n\n  \/* Do not render copied long-form source details. *\/\n  #tt-region .tt-event-details-toggle-wrap,\n  #tt-region .tt-details-toggle,\n  #tt-region .tt-event-details-panel,\n  #tt-region .tt-event-details-scroll,\n  #tt-region .tt-outlook-detail-scroll,\n  #tt-region .tt-mobile-day-detail-scroll {\n    display: none !important;\n  }\n\n  \/* Hide old non-neutral content for this first batch. We delete it cleanly in Batch 2. *\/\n  #tt-region #tt-actors,\n  #tt-region #tt-facebook,\n  #tt-region #tt-beginner,\n  #tt-region #tt-price,\n  #tt-region #tt-teresita,\n  #tt-region #tt-terms,\n  #tt-region .tt-section-break,\n  #tt-region .tt-actors-section,\n  #tt-region .tt-facebook-section,\n  #tt-region .tt-price-section,\n  #tt-region .tt-teresita-section {\n    display: none !important;\n  }\n\n  #tt-region .tt-chip.is-active,\n  #tt-region .tt-view-btn.is-active,\n  #tt-region .tt-more-display-btn.is-active {\n    background: var(--tt-red) !important;\n    border-color: var(--tt-red) !important;\n    color: #fff !important;\n  }\n<\/style>\n\n<style>\n  \/* Native month-calendar multi-day bars.\n     Multi-day events render like Google Calendar: one compact bar over the normal day cells. *\/\n\n  #tt-region .tt-outlook-grid {\n    position: relative !important;\n    --tt-outlook-row-height: 178px;\n    grid-auto-rows: var(--tt-outlook-row-height) !important;\n  }\n\n  #tt-region .tt-outlook-day {\n    position: relative !important;\n    z-index: 1;\n  }\n\n  #tt-region .tt-outlook-day-number {\n    position: relative !important;\n    z-index: 12 !important;\n  }\n\n  #tt-region .tt-outlook-day.has-multiday-span .tt-outlook-day-events {\n    margin-top: 28px !important;\n  }\n\n  #tt-region .tt-multiday-span-bar {\n    position: absolute !important;\n    z-index: 8 !important;\n    display: flex !important;\n    align-items: center !important;\n    min-width: 0 !important;\n    height: 22px !important;\n    min-height: 22px !important;\n    max-height: 22px !important;\n    border: 0 !important;\n    border-radius: 6px !important;\n    background: #78081f !important;\n    color: #fff !important;\n    box-shadow: none !important;\n    padding: 3px 8px !important;\n    overflow: hidden !important;\n    line-height: 1 !important;\n  }\n\n  #tt-region .tt-multiday-span-bar:hover,\n  #tt-region .tt-multiday-span-bar:focus {\n    background: #a30b36 !important;\n    outline: 3px solid rgba(187,13,63,.22);\n    outline-offset: 2px;\n  }\n\n  #tt-region .tt-multiday-span-bar .tt-outlook-event-time,\n  #tt-region .tt-multiday-span-bar .tt-outlook-event-place {\n    display: none !important;\n  }\n\n  #tt-region .tt-multiday-span-bar .tt-outlook-event-title {\n    display: block !important;\n    min-width: 0 !important;\n    margin: 0 !important;\n    color: #fff !important;\n    font-size: 13px !important;\n    font-weight: 950 !important;\n    line-height: 1.05 !important;\n    white-space: nowrap !important;\n    overflow: hidden !important;\n    text-overflow: ellipsis !important;\n  }\n\n  #tt-region .tt-multiday-mobile-instance {\n    display: none !important;\n  }\n\n  @media (max-width:1180px){\n    #tt-region .tt-outlook-grid { --tt-outlook-row-height:160px; }\n  }\n\n  @media (max-width:980px){\n    #tt-region .tt-outlook-grid { --tt-outlook-row-height:132px; }\n  }\n\n  @media (max-width:680px){\n    #tt-region .tt-multiday-span-bar {\n      height: 15px !important;\n      min-height: 15px !important;\n      max-height: 15px !important;\n      border-radius: 3px !important;\n      padding: 1px 4px !important;\n    }\n\n    #tt-region .tt-multiday-span-bar .tt-outlook-event-title {\n      font-size: 7.5px !important;\n      line-height: 1 !important;\n    }\n\n    #tt-region .tt-outlook-day.has-multiday-span .tt-outlook-day-events {\n      margin-top: 18px !important;\n    }\n  }\n\n  @media (max-width:520px){\n    #tt-region .tt-outlook-grid { --tt-outlook-row-height:124px; }\n  }\n<\/style>\n\n  <link rel=\"stylesheet\" href=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.css\">\n  <script src=\"https:\/\/unpkg.com\/leaflet@1.9.4\/dist\/leaflet.js\"><\/script>\n\n  \n<script>\n(function(){\n  function showError(message){\n    var l=document.getElementById('tt-event-list');\n    var c=document.getElementById('tt-event-count');\n    if(c)c.textContent='Calendar script error';\n    if(l)l.innerHTML='<div class=\"tt-empty\"><strong>The calendar script failed to start.<\/strong><br>'+String(message||'Unknown script error')+'<\/div>';\n  }\n  try{\n    var encoded=[\n      'CnZhciBfX2Fzc2lnbiA9ICh0aGlzICYmIHRoaXMuX19hc3NpZ24pIHx8IGZ1bmN0aW9uICgpIHsKICAgIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgICAgIHMgPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkKICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdDsKICAgIH07CiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKfTsKdmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7CiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0KICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0KICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9CiAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH0KICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7CiAgICB9KTsKfTsKdmFyIF9fZ2VuZXJhdG9yID0gKHRoaXMgJiYgdGhpcy5fX2dlbmVyYXRvcikgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIGJvZHkpIHsKICAgIHZhciBfID0geyBsYWJlbDogMCwgc2VudDogZnVuY3Rpb24oKSB7IGlmICh0WzBdICYgMSkgdGhyb3cgdFsxXTsgcmV0dXJuIHRbMV07IH0sIHRyeXM6IFtdLCBvcHM6IFtdIH0sIGYsIHksIHQsIGcgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgSXRlcmF0b3IgPT09ICJmdW5jdGlvbiIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTsKICAgIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnWyJ0aHJvdyJdID0gdmVyYigxKSwgZ1sicmV0dXJuIl0gPSB2ZXJiKDIpLCB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnOwogICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9CiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7CiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoIkdlbmVyYXRvciBpcyBhbHJlYWR5',\n      'IGV4ZWN1dGluZy4iKTsKICAgICAgICB3aGlsZSAoZyAmJiAoZyA9IDAsIG9wWzBdICYmIChfID0gMCkpLCBfKSB0cnkgewogICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5WyJyZXR1cm4iXSA6IG9wWzBdID8geVsidGhyb3ciXSB8fCAoKHQgPSB5WyJyZXR1cm4iXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7CiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTsKICAgICAgICAgICAgc3dpdGNoIChvcFswXSkgewogICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9OwogICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlOwogICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH0KICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfQogICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfQogICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH0KICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTsKICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9CiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA\/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07CiAgICB9Cn07CihmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiByZWFkeShmbikgewogICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpCiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmbik7CiAgICAgICAgZWxzZQogICAgICAgICAgICBmbigpOwogICAgfQogICAgcmVhZHkoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3VuaGFuZGxlZHJlamVjdGlvbicsIGZ1bmN0aW9uIChldikgewogICAg',\n      'ICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGVyZXNpdGEgcGxhbm5lciB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCBldi5yZWFzb24pOwogICAgICAgICAgICAgICAgdmFyIGMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHQtZXZlbnQtY291bnQnKTsKICAgICAgICAgICAgICAgIHZhciBsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R0LWV2ZW50LWxpc3QnKTsKICAgICAgICAgICAgICAgIGlmIChjICYmIGMudGV4dENvbnRlbnQuaW5kZXhPZignTG9hZGluZycpICE9PSAtMSkKICAgICAgICAgICAgICAgICAgICBjLnRleHRDb250ZW50ID0gJ0NhbGVuZGFyIGxvYWRpbmcgZXJyb3InOwogICAgICAgICAgICAgICAgaWYgKGwgJiYgbC50ZXh0Q29udGVudC5pbmRleE9mKCdsb2FkaW5nJykgIT09IC0xKQogICAgICAgICAgICAgICAgICAgIGwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InR0LWVtcHR5Ij48c3Ryb25nPlRoZSBjYWxlbmRhciBjb3VsZCBub3QgYmUgbG9hZGVkLjwvc3Ryb25nPjxicj5UaGUgYnJvd3NlciBzdG9wcGVkIHRoZSBldmVudCBzY3JpcHQuIE9wZW4gRGV2VG9vbHMgXHUyMTkyIENvbnNvbGUgYW5kIHNlbmQgdGhlIGZpcnN0IHJlZCBlcnJvciBtZXNzYWdlLjwvZGl2Pic7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgQVBJX1VSTF8xID0gJ2h0dHBzOi8vdGFuZ29zd2VkZW4uc2UvYXBwL3NsaW00L3B1YmxpYy9nZXRFdmVudHM\/Y2FsZW5kYXJOYW1lPVNrJUMzJUE1bmUnOwogICAgICAgICAgICB2YXIgVFNfQ0FMRU5EQVJfVVJMXzEgPSAnaHR0cHM6Ly90YW5nb3N3ZWRlbi5zZS9jYWxlbmRhci9zayVDMyVBNW5lJzsKICAgICAgICAgICAgdmFyIERLX0FQSV9VUkxfMSA9ICcvd3AtanNvbi90ZXJlc2l0YS92MS90YW5nb2RrP2RheXM9MzY1JzsKICAgICAgICAgICAgdmFyIERLX0NBTEVOREFSX1VSTF8xID0gJ2h0dHBzOi8vd3d3LmJyb3duYmVhcnN3LmNvbS9jYWwvdGFuZ29ka19taWxfa2JoJzsKICAgICAgICAgICAgdmFyIERLX0NBTEVOREFSX05BTUVfMSA9ICd0YW5nb2RrX21pbF9rYmgnOwogICAgICAgICAgICB2YXIgU1VHR0VTVF9FVkVOVF9VUkxfMSA9ICcva29udGFrdC8nOwogICAgICAgICAgICB2YXIgcmVnaW9uUm9vdF8xID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R0LXJlZ2lvbicpOwogICAgICAgICAgICB2YXIgREVGQVVMVF9BUkVBX1BSRVNFVF8xID0gKHJlZ2lvblJvb3RfMSAmJiByZWdpb25Sb290XzEuZ2V0QXR0cmlidXRlKCdkYXRhLWRlZmF1bHQtYXJlYScpKSB8fCAnbHVuZC1tYWxtbyc7CiAgICAgICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRBcmVhRm9yUGFnZSgpIHsKICAgICAgICAgICAgICAgIGlmIChERUZBVUxUX0FSRUFfUFJFU0VUXzEgPT09ICdza2FuZS1jb3BlbmhhZ2VuJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjb3VudHJ5OiAnYm90aCcsIHJlZ2lvbjogJ3NrYW5lLWNvcGVuaGFnZW4nLCBsYWJlbDogJ1NrXHUwMGU1bmUgKyBDb3BlbmhhZ2VuJyB9OwogICAgICAgICAgICAgICAgaWYgKERFRkFVTFRfQVJFQV9QUkVTRVRfMSA9PT0gJ3NrYW5lJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjb3VudHJ5OiAnc2UnLCByZWdpb246ICdza2FuZScsIGxhYmVsOiAnU2tcdTAwZTVu',\n      'ZScgfTsKICAgICAgICAgICAgICAgIGlmIChERUZBVUxUX0FSRUFfUFJFU0VUXzEgPT09ICdkZW5tYXJrJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjb3VudHJ5OiAnZGsnLCByZWdpb246ICdhbGwnLCBsYWJlbDogJ0NvcGVuaGFnZW4gLyBEZW5tYXJrJyB9OwogICAgICAgICAgICAgICAgaWYgKERFRkFVTFRfQVJFQV9QUkVTRVRfMSA9PT0gJ2FsbCcpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgY291bnRyeTogJ2JvdGgnLCByZWdpb246ICdhbGwnLCBsYWJlbDogJ0V2ZXJ5dGhpbmcnIH07CiAgICAgICAgICAgICAgICByZXR1cm4geyBjb3VudHJ5OiAnYm90aCcsIHJlZ2lvbjogJ3NrYW5lLWNvcGVuaGFnZW4nLCBsYWJlbDogJ1NrXHUwMGU1bmUgKyBDb3BlbmhhZ2VuJyB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkZWZhdWx0QXJlYV8xID0gZGVmYXVsdEFyZWFGb3JQYWdlKCk7CiAgICAgICAgICAgIHZhciBzYXZlZCA9IChmdW5jdGlvbiAoKSB7IHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHRSZWdpb25GaWx0ZXJzJykgfHwgJ3t9Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICAgICAgfSB9KSgpOwogICAgICAgICAgICB2YXIgaW5pdGlhbE1vbnRoS2V5XzEgPSAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGQuZ2V0RnVsbFllYXIoKSArICctJyArIFN0cmluZyhkLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgICAgICB9KSgpOwogICAgICAgICAgICBpZiAoIXNhdmVkIHx8IHNhdmVkLnNpbXBsZVZlcnNpb24gIT09ICd2NjMtc2thbmUtY29wZW5oYWdlbicpCiAgICAgICAgICAgICAgICBzYXZlZCA9IHt9OwogICAgICAgICAgICB2YXIgc3RhdGVfMSA9IHsgY291bnRyeTogc2F2ZWQuY291bnRyeSB8fCBkZWZhdWx0QXJlYV8xLmNvdW50cnksIHJlZ2lvbjogc2F2ZWQucmVnaW9uIHx8IGRlZmF1bHRBcmVhXzEucmVnaW9uLCB0eXBlOiBzYXZlZC50eXBlIHx8ICdhbGwnLCB0aW1lOiBzYXZlZC50aW1lIHx8ICd1cGNvbWluZycsIHN0YXJ0VGltZTogc2F2ZWQuc3RhcnRUaW1lIHx8ICdhbnknLCBzZWxlY3RlZE1vbnRoOiBzYXZlZC5zZWxlY3RlZE1vbnRoIHx8IGluaXRpYWxNb250aEtleV8xLCBzZWxlY3RlZFdlZWs6IHNhdmVkLnNlbGVjdGVkV2VlayB8fCAnYW55Jywgc2VsZWN0ZWREYXk6IHNhdmVkLnNlbGVjdGVkRGF5IHx8ICdhbnknLCBjYWxlbmRhclBpY2tNb2RlOiBzYXZlZC5jYWxlbmRhclBpY2tNb2RlIHx8ICdkYXknLCBzZWFyY2g6IHNhdmVkLnNlYXJjaCB8fCAnJywgbGltaXQ6IE51bWJlcihzYXZlZC5saW1pdCkgfHwgOTk5LCB2aWV3OiBzYXZlZC52aWV3IHx8ICdsaXN0JywgdWlNb2RlOiBzYXZlZC51aU1vZGUgfHwgJ3NpbXBsZScsIG1vcmVDaG9pY2VzRGlzcGxheTogc2F2ZWQubW9yZUNob2ljZXNEaXNwbGF5IHx8ICdjYWxlbmRhcicsIGFsbEV2ZW50czogW10sIHZpc2libGVFdmVudHM6IFtdIH07CiAgICAgICAgICAgIHZhciBtaW5pQ2FsZW5kYXJDdXJzb3JfMSA9IG5l',\n      'dyBEYXRlKCk7CiAgICAgICAgICAgIGlmIChzdGF0ZV8xLnNlbGVjdGVkRGF5ICYmIHN0YXRlXzEuc2VsZWN0ZWREYXkgIT09ICdhbnknKSB7CiAgICAgICAgICAgICAgICB2YXIgbSA9IFN0cmluZyhzdGF0ZV8xLnNlbGVjdGVkRGF5KS5tYXRjaCgvXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pJC8pOwogICAgICAgICAgICAgICAgaWYgKG0pCiAgICAgICAgICAgICAgICAgICAgbWluaUNhbGVuZGFyQ3Vyc29yXzEgPSBuZXcgRGF0ZShOdW1iZXIobVsxXSksIE51bWJlcihtWzJdKSAtIDEsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlXzEuc2VsZWN0ZWRNb250aCAmJiBzdGF0ZV8xLnNlbGVjdGVkTW9udGggIT09ICdhbnknKSB7CiAgICAgICAgICAgICAgICB2YXIgbSA9IFN0cmluZyhzdGF0ZV8xLnNlbGVjdGVkTW9udGgpLm1hdGNoKC9eKFxkezR9KS0oXGR7Mn0pJC8pOwogICAgICAgICAgICAgICAgaWYgKG0pCiAgICAgICAgICAgICAgICAgICAgbWluaUNhbGVuZGFyQ3Vyc29yXzEgPSBuZXcgRGF0ZShOdW1iZXIobVsxXSksIE51bWJlcihtWzJdKSAtIDEsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGF0ZV8xLnNlbGVjdGVkRGF5ICE9PSAnYW55JykgewogICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZE1vbnRoID0gJ2FueSc7CiAgICAgICAgICAgICAgICBzdGF0ZV8xLnNlbGVjdGVkV2VlayA9ICdhbnknOwogICAgICAgICAgICAgICAgc3RhdGVfMS50aW1lID0gJ3VwY29taW5nJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdGVfMS5zZWxlY3RlZFdlZWsgIT09ICdhbnknKQogICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZE1vbnRoID0gJ2FueSc7CiAgICAgICAgICAgIHZhciAkXzEgPSBmdW5jdGlvbiAoaWQpIHsgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTsgfTsKICAgICAgICAgICAgdmFyIGxpc3RFbF8xID0gJF8xKCd0dC1ldmVudC1saXN0Jyk7CiAgICAgICAgICAgIHZhciBjb3VudEVsXzEgPSAkXzEoJ3R0LWV2ZW50LWNvdW50Jyk7CiAgICAgICAgICAgIHZhciB1cGRhdGVkRWxfMSA9ICRfMSgndHQtZXZlbnQtdXBkYXRlZCcpOwogICAgICAgICAgICB2YXIgc2VhcmNoRWxfMSA9ICRfMSgndHQtZXZlbnQtc2VhcmNoJyk7CiAgICAgICAgICAgIHZhciBoZXJvU2VhcmNoRWxfMSA9ICRfMSgndHQtaGVyby1zZWFyY2gtaW5wdXQnKTsKICAgICAgICAgICAgdmFyIGxpbWl0RWxfMSA9ICRfMSgndHQtbGltaXQtc2VsZWN0Jyk7CiAgICAgICAgICAgIHZhciBtb250aEVsXzEgPSAkXzEoJ3R0LW1vbnRoLXNlbGVjdCcpOwogICAgICAgICAgICB2YXIgd2Vla0VsXzEgPSAkXzEoJ3R0LXdlZWstc2VsZWN0Jyk7CiAgICAgICAgICAgIHZhciBzdGFydFRpbWVFbF8xID0gJF8xKCd0dC1zdGFydC10aW1lLXNlbGVjdCcpOwogICAgICAgICAgICB2YXIgYWN0aXZlRmlsdGVyQmFyXzEgPSAkXzEoJ3R0LWFjdGl2ZS1maWx0ZXItYmFyJyk7CiAgICAgICAgICAgIHZhciBtb250aFJhaWxfMSA9ICRfMSgndHQtbW9udGgtcmFpbCcpOwogICAgICAgICAgICB2YXIgc2ltcGxlQnJvd3Nlcl8xID0gJF8xKCd0dC1zaW1wbGUtYnJvd3NlcicpOwogICAgICAgICAgICB2YXIgc2ltcGxlTW9udGhMYWJlbF8x',\n      'ID0gJF8xKCd0dC1zaW1wbGUtbW9udGgtbGFiZWwnKTsKICAgICAgICAgICAgdmFyIHNpbXBsZVByZXZNb250aF8xID0gJF8xKCd0dC1zaW1wbGUtcHJldi1tb250aCcpOwogICAgICAgICAgICB2YXIgc2ltcGxlTmV4dE1vbnRoXzEgPSAkXzEoJ3R0LXNpbXBsZS1uZXh0LW1vbnRoJyk7CiAgICAgICAgICAgIHZhciBzaW1wbGVTaG93RXZlcnl0aGluZ18xID0gJF8xKCd0dC1zaW1wbGUtc2hvdy1ldmVyeXRoaW5nJyk7CiAgICAgICAgICAgIHZhciBjbGVhckRhdGVCdG4gPSAkXzEoJ3R0LWNsZWFyLWRhdGUnKTsKICAgICAgICAgICAgdmFyIHJlc2V0RmlsdGVyc0J0biA9ICRfMSgndHQtcmVzZXQtZmlsdGVycycpOwogICAgICAgICAgICB2YXIgZGF0ZVBsYW5uZXJfMSA9ICRfMSgndHQtZGF0ZS1wbGFubmVyJyk7CiAgICAgICAgICAgIHZhciBtYXBQYW5lbF8xID0gJF8xKCd0dC1tYXAtcGFuZWwnKTsKICAgICAgICAgICAgdmFyIG1hcExpc3RfMSA9ICRfMSgndHQtbWFwLWxpc3QnKTsKICAgICAgICAgICAgdmFyIG1hcENhcHRpb25fMSA9ICRfMSgndHQtbWFwLWNhcHRpb24nKTsKICAgICAgICAgICAgdmFyIGNhbGVuZGFyU2VjdGlvbl8xID0gJF8xKCd0dC1jYWxlbmRhcicpOwogICAgICAgICAgICB2YXIgbGVhZmxldE1hcEVsXzEgPSAkXzEoJ3R0LWxlYWZsZXQtbWFwJyk7CiAgICAgICAgICAgIHZhciB3ZWVrZW5kU2hvcnRjdXQgPSAkXzEoJ3R0LXdlZWtlbmQtc2hvcnRjdXQnKTsKICAgICAgICAgICAgdmFyIGZpbHRlclBhbmVsXzEgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjdHQtcmVnaW9uIC50dC1maWx0ZXItcGFuZWwnKTsKICAgICAgICAgICAgdmFyIGZpbHRlclRvZ2dsZV8xID0gJF8xKCd0dC1maWx0ZXItdG9nZ2xlJyk7CiAgICAgICAgICAgIHZhciBmaWx0ZXJTdW1tYXJ5XzEgPSAkXzEoJ3R0LWZpbHRlci1zdW1tYXJ5Jyk7CiAgICAgICAgICAgIHZhciBtb3JlRGlzcGxheVRvZ2dsZV8xID0gJF8xKCd0dC1tb3JlLWRpc3BsYXktdG9nZ2xlJyk7CiAgICAgICAgICAgIHZhciBtb3JlRGlzcGxheUJ1dHRvbnNfMSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN0dC1tb3JlLWRpc3BsYXktdG9nZ2xlIFtkYXRhLW1vcmUtZGlzcGxheV0nKTsKICAgICAgICAgICAgdmFyIG1pbmlDYWxlbmRhckdyaWQgPSAkXzEoJ3R0LW1pbmktY2FsZW5kYXItZ3JpZCcpOwogICAgICAgICAgICB2YXIgbWluaUNhbGVuZGFyVGl0bGUgPSAkXzEoJ3R0LW1pbmktdGl0bGUnKTsKICAgICAgICAgICAgdmFyIG1pbmlUaXRsZUJ0biA9ICRfMSgndHQtbWluaS10aXRsZS1idG4nKTsKICAgICAgICAgICAgdmFyIG1pbmlQcmV2ID0gJF8xKCd0dC1taW5pLXByZXYnKTsKICAgICAgICAgICAgdmFyIG1pbmlOZXh0ID0gJF8xKCd0dC1taW5pLW5leHQnKTsKICAgICAgICAgICAgdmFyIG1pbmlTZWxlY3RNb250aCA9ICRfMSgndHQtbWluaS1zZWxlY3QtbW9udGgnKTsKICAgICAgICAgICAgdmFyIGNhbGVuZGFyTW9kZUJ0bnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjdHQtY2FsZW5kYXItcGljay1tb2RlIC50dC1jYWxlbmRhci1tb2RlJyk7CiAgICAgICAgICAgIHZhciBtaW5pQ2FsZW5kYXJIZWxwID0gJF8xKCd0dC1taW5pLWNhbGVuZGFyLWhlbHAnKTsKICAgICAgICAgICAgdmFyIGxlYWZs',\n      'ZXRNYXBfMSA9IG51bGw7CiAgICAgICAgICAgIHZhciBsZWFmbGV0TWFya2Vyc18xID0gW107CiAgICAgICAgICAgIHZhciBDSVRZX0NFTlRFUlNfMSA9IHsKICAgICAgICAgICAgICAgIGx1bmQ6IHsgbmFtZTogJ0x1bmQnLCBsYXQ6IDU1LjcwNDcsIGxuZzogMTMuMTkxMCwgem9vbTogMTMgfSwKICAgICAgICAgICAgICAgIG1hbG1vOiB7IG5hbWU6ICdNYWxtXHhmNicsIGxhdDogNTUuNjA1MCwgbG5nOiAxMy4wMDM4LCB6b29tOiAxMiB9LAogICAgICAgICAgICAgICAgaGVsc2luZ2Jvcmc6IHsgbmFtZTogJ0hlbHNpbmdib3JnJywgbGF0OiA1Ni4wNDY1LCBsbmc6IDEyLjY5NDUsIHpvb206IDEyIH0sCiAgICAgICAgICAgICAgICB5c3RhZDogeyBuYW1lOiAnWXN0YWQnLCBsYXQ6IDU1LjQyOTUsIGxuZzogMTMuODIwNiwgem9vbTogMTMgfSwKICAgICAgICAgICAgICAgIGNvcGVuaGFnZW46IHsgbmFtZTogJ0NvcGVuaGFnZW4nLCBsYXQ6IDU1LjY3NjEsIGxuZzogMTIuNTY4Mywgem9vbTogMTIgfSwKICAgICAgICAgICAgICAgIGZyZWRlcmlrc2Jlcmc6IHsgbmFtZTogJ0ZyZWRlcmlrc2JlcmcnLCBsYXQ6IDU1LjY3ODAsIGxuZzogMTIuNTMyNiwgem9vbTogMTIgfSwKICAgICAgICAgICAgICAgIGdsYWRzYXhlOiB7IG5hbWU6ICdHbGFkc2F4ZScsIGxhdDogNTUuNzMzMywgbG5nOiAxMi40ODMzLCB6b29tOiAxMiB9LAogICAgICAgICAgICAgICAgcm9za2lsZGU6IHsgbmFtZTogJ1Jvc2tpbGRlJywgbGF0OiA1NS42NDE1LCBsbmc6IDEyLjA4MDMsIHpvb206IDEyIH0sCiAgICAgICAgICAgICAgICBrb2dlOiB7IG5hbWU6ICdLXHUwMGY4Z2UnLCBsYXQ6IDU1LjQ1ODAsIGxuZzogMTIuMTgyMSwgem9vbTogMTIgfSwKICAgICAgICAgICAgICAgIGhlbHNpbmdvcjogeyBuYW1lOiAnSGVsc2luZ1x1MDBmOHInLCBsYXQ6IDU2LjAzNjEsIGxuZzogMTIuNjEzNiwgem9vbTogMTIgfSwKICAgICAgICAgICAgICAgIG9kZW5zZTogeyBuYW1lOiAnT2RlbnNlJywgbGF0OiA1NS40MDM4LCBsbmc6IDEwLjQwMjQsIHpvb206IDEyIH0sCiAgICAgICAgICAgICAgICBhYXJodXM6IHsgbmFtZTogJ0Fhcmh1cycsIGxhdDogNTYuMTYyOSwgbG5nOiAxMC4yMDM5LCB6b29tOiAxMiB9LAogICAgICAgICAgICAgICAgYWFsYm9yZzogeyBuYW1lOiAnQWFsYm9yZycsIGxhdDogNTcuMDQ4OCwgbG5nOiA5LjkyMTcsIHpvb206IDEyIH0sCiAgICAgICAgICAgICAgICBrb2xkaW5nOiB7IG5hbWU6ICdLb2xkaW5nJywgbGF0OiA1NS40OTA0LCBsbmc6IDkuNDcyMiwgem9vbTogMTIgfSwKICAgICAgICAgICAgICAgIHNpbGtlYm9yZzogeyBuYW1lOiAnU2lsa2Vib3JnJywgbGF0OiA1Ni4xNjk3LCBsbmc6IDkuNTQ1MSwgem9vbTogMTIgfSwKICAgICAgICAgICAgICAgIGZhbm86IHsgbmFtZTogJ0Zhblx1MDBmOCcsIGxhdDogNTUuNDE0MCwgbG5nOiA4LjQxMDAsIHpvb206IDExIH0sCiAgICAgICAgICAgICAgICBib3JuaG9sbTogeyBuYW1lOiAnQm9ybmhvbG0nLCBsYXQ6IDU1LjE2MDQsIGxuZzogMTQuODY2OSwgem9vbTogMTAgfSwKICAgICAgICAgICAgICAgIGRlbm1hcms6IHsgbmFtZTogJ0Rlbm1hcmsnLCBsYXQ6IDU1Ljk1LCBsbmc6IDExLjk1LCB6b29tOiA3IH0sCiAgICAgICAgICAgICAgICBvcmVzdW5kOiB7IG5h',\n      'bWU6ICdPcmVzdW5kJywgbGF0OiA1NS43NywgbG5nOiAxMi42Mywgem9vbTogOSB9LAogICAgICAgICAgICAgICAgc2thbmU6IHsgbmFtZTogJ1NrXHhlNW5lJywgbGF0OiA1NS44MiwgbG5nOiAxMy41NSwgem9vbTogOSB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBWRU5VRV9DT09SRFNfMSA9IFsKICAgICAgICAgICAgICAgIHsgbWF0Y2g6IFsndWFyZGF2XHhlNGdlbiAxMzEnLCAndWFyZGF2YWdlbiAxMzEnLCAndWFyZGF2XHhlNGdlbiAxMzFhJywgJ3VhcmRhdmFnZW4gMTMxYScsICd2aXRhIGh1c2V0J10sIGxhdDogNTUuNzE0NTg4ODUzNzc1MiwgbG5nOiAxMy4yMzAxNzAzMjg2MTg4NTQsIGxhYmVsOiAnVml0YSBIdXNldCAvIFVhcmRhdlx4ZTRnZW4gMTMxQScgfSwKICAgICAgICAgICAgICAgIHsgbWF0Y2g6IFsnaGFsbGFuZHMgbmF0aW9uJywgJ3Rob21hbmRlcnMgdlx4ZTRnIDEnLCAndGhvbWFuZGVycyB2YWcgMSddLCBsYXQ6IDU1LjcwODYsIGxuZzogMTMuMTk2MiwgbGFiZWw6ICdIYWxsYW5kcyBOYXRpb24nIH0sCiAgICAgICAgICAgICAgICB7IG1hdGNoOiBbJ3RvcnBnYXRhbiAyMScsICd0b3JnYXRhbiAyMScsICd0b3JnZ2F0YW4gMjEnLCAndW5nZG9tZW5zIGh1cycsICdzYWwgMTEnLCAnc2FsIDEyJ10sIGxhdDogNTUuNTk2ODc0LCBsbmc6IDEzLjAwNjk1NCwgbGFiZWw6ICdVbmdkb21lbnMgaHVzIC8gVG9ycGdhdGFuIDIxJyB9LAogICAgICAgICAgICAgICAgeyBtYXRjaDogWydub3JyYSBza29sZ2F0YW4gMTAnLCAnbm9ycmEgc2tvbGdhdGFuIDEwIGInLCAnbm9ycmEgc2tvbGdhdGFuIDEwYiddLCBsYXQ6IDU1LjU5Njg3NCwgbG5nOiAxMy4wMDY5NTQsIGxhYmVsOiAnVW5nZG9tZW5zIGh1cyAvIE5vcnJhIFNrb2xnYXRhbiAxMCBCJyB9LAogICAgICAgICAgICAgICAgeyBtYXRjaDogWydmcmVkcmlrc2JlcmdzZ2F0YW4gNycsICd0YW5nb2tvbXBhbmlldCBzdHVkaW8nXSwgbGF0OiA1NS41OTY4LCBsbmc6IDEzLjAwOTEsIGxhYmVsOiAnVGFuZ29rb21wYW5pZXQgU3R1ZGlvJyB9LAogICAgICAgICAgICAgICAgeyBtYXRjaDogWydtb3Jpc2thJywgJ2ZvbGtldHMgcGFyayddLCBsYXQ6IDU1LjU5MzIsIGxuZzogMTMuMDEzNSwgbGFiZWw6ICdGb2xrZXRzIFBhcmsgLyBNb3Jpc2thJyB9LAogICAgICAgICAgICAgICAgeyBtYXRjaDogWydiYWJlbCddLCBsYXQ6IDU1LjU5MjAsIGxuZzogMTMuMDEyMiwgbGFiZWw6ICdCYWJlbCBNYWxtXHhmNicgfSwKICAgICAgICAgICAgICAgIHsgbWF0Y2g6IFsnbWVqZXJpZXQnXSwgbGF0OiA1NS43MDA1LCBsbmc6IDEzLjE4NzYsIGxhYmVsOiAnTWVqZXJpZXQgTHVuZCcgfSwKICAgICAgICAgICAgICAgIHsgbWF0Y2g6IFsnZGFuc2VrYXBlbGxldCcsICdiaXNwZWJqZXJnIHRvcnYnXSwgbGF0OiA1NS43MDg2LCBsbmc6IDEyLjUzMzcsIGxhYmVsOiAnRGFuc2VrYXBlbGxldCBLXHhmOGJlbmhhdm4nIH0sCiAgICAgICAgICAgICAgICB7IG1hdGNoOiBbJ29zcmFtaHVzZXQnLCAndmFsaGFsc2dhZGUnXSwgbGF0OiA1NS43MDM1LCBsbmc6IDEyLjU0NjAsIGxhYmVsOiAnT3NyYW1odXNldCBLXHhmOGJlbmhhdm4nIH0sCiAgICAgICAgICAgICAgICB7IG1hdGNoOiBbJ3RhbmdvcGF2aWxsb25lbiddLCBsYXQ6IDU1LjY3NjEsIGxuZzog',\n      'MTIuNTY4MywgbGFiZWw6ICdUYW5nb3BhdmlsbG9uZW4gS1x4ZjhiZW5oYXZuJyB9LAogICAgICAgICAgICAgICAgeyBtYXRjaDogWydsYSBib2NhIHRhbmdvc2Fsb24nLCAnbGEgYm9jYSddLCBsYXQ6IDU1LjY3NjEsIGxuZzogMTIuNTY4MywgbGFiZWw6ICdMYSBCb2NhIFRhbmdvc2Fsb24gS1x4ZjhiZW5oYXZuJyB9LAogICAgICAgICAgICAgICAgeyBtYXRjaDogWydmcmVkZXJpa3NiZXJnJ10sIGxhdDogNTUuNjc4MCwgbG5nOiAxMi41MzI2LCBsYWJlbDogJ0ZyZWRlcmlrc2JlcmcnIH0sCiAgICAgICAgICAgICAgICB7IG1hdGNoOiBbJ2dsYWRzYXhlJ10sIGxhdDogNTUuNzMzMywgbG5nOiAxMi40ODMzLCBsYWJlbDogJ0dsYWRzYXhlJyB9LAogICAgICAgICAgICAgICAgeyBtYXRjaDogWydrb2dlJywgJ2tceGY4Z2UnXSwgbGF0OiA1NS40NTgwLCBsbmc6IDEyLjE4MjEsIGxhYmVsOiAnS1x4ZjhnZScgfSwKICAgICAgICAgICAgICAgIHsgbWF0Y2g6IFsncm9za2lsZGUnXSwgbGF0OiA1NS42NDE1LCBsbmc6IDEyLjA4MDMsIGxhYmVsOiAnUm9za2lsZGUnIH0sCiAgICAgICAgICAgICAgICB7IG1hdGNoOiBbJ2hlbHNpbmdvcicsICdoZWxzaW5nXHhmOHInXSwgbGF0OiA1Ni4wMzYxLCBsbmc6IDEyLjYxMzYsIGxhYmVsOiAnSGVsc2luZ1x4ZjhyJyB9CiAgICAgICAgICAgIF07CiAgICAgICAgICAgIGZ1bmN0aW9uIGVzY2FwZUh0bWwodmFsdWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcodmFsdWUgfHwgJycpLnJlcGxhY2UoL1smPD4nIl0vZywgZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyAnJic6ICcmYW1wOycsICc8JzogJyZsdDsnLCAnPic6ICcmZ3Q7JywgIiciOiAnJiMzOTsnLCAnIic6ICcmcXVvdDsnIH1bY107CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBzdHJpcEh0bWwodmFsdWUpIHsKICAgICAgICAgICAgICAgIHZhciB0bXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgIHRtcC5pbm5lckhUTUwgPSBTdHJpbmcodmFsdWUgfHwgJycpOwogICAgICAgICAgICAgICAgcmV0dXJuICh0bXAudGV4dENvbnRlbnQgfHwgdG1wLmlubmVyVGV4dCB8fCAnJykucmVwbGFjZSgvXHMrL2csICcgJykudHJpbSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBhcnNlRGF0ZSh2YWx1ZSkgewogICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIHZhciBzID0gU3RyaW5nKHZhbHVlKS50cmltKCkucmVwbGFjZSgnICcsICdUJyk7CiAgICAgICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKHMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGlzTmFOKGQuZ2V0VGltZSgpKSA\/IG51bGwgOiBkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBhZDIobikgeyByZXR1cm4gU3RyaW5nKG4pLnBhZFN0YXJ0KDIsICcwJyk7IH0KICAgICAgICAgICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYXRpb25UZXh0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKHZhbHVlIHx8ICcnKS50b0xvd2VyQ2FzZSgpCiAgICAgICAgICAgICAgICAg',\n      'ICAgLm5vcm1hbGl6ZSgnTkZEJykucmVwbGFjZSgvW1x1MDMwMC1cdTAzNmZdL2csICcnKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9ceGU1L2csICdhJykucmVwbGFjZSgvXHhlNC9nLCAnYScpLnJlcGxhY2UoL1x4ZjYvZywgJ28nKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9ceGU2L2csICdhZScpLnJlcGxhY2UoL1x4ZjgvZywgJ28nKS5yZXBsYWNlKC9ceGZjL2csICd1JykKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXHhlOS9nLCAnZScpLnJlcGxhY2UoL1x4ZTgvZywgJ2UnKS5yZXBsYWNlKC9ceGUxL2csICdhJykucmVwbGFjZSgvXHhlMC9nLCAnYScpCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1teYS16MC05XHNALl8vLV0vZywgJyAnKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9ccysvZywgJyAnKQogICAgICAgICAgICAgICAgICAgIC50cmltKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gbm9ybWFsaXplQ2l0eShjaXR5KSB7CiAgICAgICAgICAgICAgICB2YXIgYyA9IFN0cmluZyhjaXR5IHx8ICcnKS50cmltKCk7CiAgICAgICAgICAgICAgICBpZiAoIWMpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdVbmtub3duIGxvY2F0aW9uJzsKICAgICAgICAgICAgICAgIHZhciBuID0gbm9ybWFsaXplTG9jYXRpb25UZXh0KGMpOwogICAgICAgICAgICAgICAgaWYgKG4gPT09ICdtYWxtbycgfHwgbiA9PT0gJ21hbG1vZScpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdNYWxtXHhmNic7CiAgICAgICAgICAgICAgICBpZiAobiA9PT0gJ2tvYmVuaGF2bicgfHwgbiA9PT0gJ2NvcGVuaGFnZW4nIHx8IG4gPT09ICdrYmgnKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnQ29wZW5oYWdlbic7CiAgICAgICAgICAgICAgICBpZiAobiA9PT0gJ2hlbHNpbmdvcicpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdIZWxzaW5nXHhmOHInOwogICAgICAgICAgICAgICAgaWYgKG4gPT09ICdrb2dlJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0tceGY4Z2UnOwogICAgICAgICAgICAgICAgaWYgKG4gPT09ICdmYW5vJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0Zhblx4ZjgnOwogICAgICAgICAgICAgICAgcmV0dXJuIGM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaW5mZXJDaXR5RnJvbUxvY2F0aW9uKGNpdHksIGxvY2F0aW9uLCB0aXRsZSwgZGVzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIHZhciBoYXkgPSBub3JtYWxpemVMb2NhdGlvblRleHQoW2xvY2F0aW9uLCB0aXRsZSwgZGVzY3JpcHRpb25dLmpvaW4oJyAnKSk7CiAgICAgICAgICAgICAgICBpZiAoaGF5LmluY2x1ZGVzKCd1YXJkYXZhZ2VuIDEzMScpIHx8IGhheS5pbmNsdWRlcygndWFyZGF2YWdlbiAxMzFhJykgfHwgaGF5LmluY2x1ZGVzKCd2aXRhIGh1c2V0JykgfHwgaGF5LmluY2x1ZGVzKCcyMjQgNzEgbHVuZCcpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnTHVuZCc7CiAgICAgICAgICAgICAgICBpZiAoaGF5LmluY2x1ZGVzKCdoYWxsYW5kcyBuYXRpb24nKSB8fCBoYXkuaW5jbHVkZXMoJ3Rob21hbmRlcnMgdmFnIDEnKSB8fCBoYXkuaW5jbHVkZXMoJ21lamVyaWV0JykpCiAgICAgICAgICAg',\n      'ICAgICAgICAgcmV0dXJuICdMdW5kJzsKICAgICAgICAgICAgICAgIGlmIChoYXkuaW5jbHVkZXMoJ3RvcnBnYXRhbiAyMScpIHx8IGhheS5pbmNsdWRlcygnbm9ycmEgc2tvbGdhdGFuIDEwJykgfHwgaGF5LmluY2x1ZGVzKCd1bmdkb21lbnMgaHVzJykpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdNYWxtXHhmNic7CiAgICAgICAgICAgICAgICBpZiAoaGF5LmluY2x1ZGVzKCdmcmVkcmlrc2JlcmdzZ2F0YW4gNycpIHx8IGhheS5pbmNsdWRlcygndGFuZ29rb21wYW5pZXQgc3R1ZGlvJykpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdNYWxtXHhmNic7CiAgICAgICAgICAgICAgICBpZiAoaGF5LmluY2x1ZGVzKCd0cmFmZnB1bmt0IHRhZ2Fib3JnJykgfHwgaGF5LmluY2x1ZGVzKCd0YWdhYm9yZycpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnSGVsc2luZ2JvcmcnOwogICAgICAgICAgICAgICAgaWYgKC9cYmx1bmRcYi8udGVzdChoYXkpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnTHVuZCc7CiAgICAgICAgICAgICAgICBpZiAoL1xibWFsbW9cYnxcYm1hbG1vZVxiLy50ZXN0KGhheSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdNYWxtXHhmNic7CiAgICAgICAgICAgICAgICBpZiAoL1xiaGVsc2luZ2JvcmdcYi8udGVzdChoYXkpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnSGVsc2luZ2JvcmcnOwogICAgICAgICAgICAgICAgaWYgKC9cYnlzdGFkXGIvLnRlc3QoaGF5KSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1lzdGFkJzsKICAgICAgICAgICAgICAgIGlmICgvXGJyb3NraWxkZVxiLy50ZXN0KGhheSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdSb3NraWxkZSc7CiAgICAgICAgICAgICAgICBpZiAoL1xia29iZW5oYXZuXGJ8XGJjb3BlbmhhZ2VuXGJ8XGJrYmhcYi8udGVzdChoYXkpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnQ29wZW5oYWdlbic7CiAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplQ2l0eShjaXR5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBpbmZlck9yZ2FuaXplcihlKSB7CiAgICAgICAgICAgICAgICB2YXIgcmF3VGl0bGUgPSBTdHJpbmcoZS50aXRsZSB8fCAnJyk7CiAgICAgICAgICAgICAgICB2YXIgcmF3RGVzY3JpcHRpb24gPSBTdHJpbmcoZS5kZXNjcmlwdGlvbiB8fCBlLmRlc2NyaXB0aW9uVGV4dCB8fCAnJyk7CiAgICAgICAgICAgICAgICB2YXIgcmF3RW1haWwgPSBTdHJpbmcoZS5lbWFpbCB8fCAnJyk7CiAgICAgICAgICAgICAgICB2YXIgcmF3TG9jYXRpb24gPSBTdHJpbmcoZS5sb2NhdGlvbiB8fCAnJyk7CiAgICAgICAgICAgICAgICB2YXIgdHh0ID0gW3Jhd1RpdGxlLCByYXdEZXNjcmlwdGlvbiwgcmF3RW1haWwsIHJhd0xvY2F0aW9uXS5qb2luKCcgJykudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgIHZhciBub3JtID0gbm9ybWFsaXplTG9jYXRpb25UZXh0KFtyYXdUaXRsZSwgcmF3RGVzY3JpcHRpb24sIHJhd0VtYWlsLCByYXdMb2NhdGlvbl0uam9pbignICcpKTsKICAgICAgICAgICAgICAgIHZhciB0aXRsZU5vcm0gPSBub3JtYWxpemVMb2NhdGlvblRleHQocmF3VGl0bGUpOwogICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uTm9ybSA9',\n      'IG5vcm1hbGl6ZUxvY2F0aW9uVGV4dChyYXdMb2NhdGlvbik7CiAgICAgICAgICAgICAgICBpZiAodGl0bGVOb3JtLmluY2x1ZGVzKCdsYSBjYXNhIGJsYW5jYScpIHx8IGxvY2F0aW9uTm9ybS5pbmNsdWRlcygndWFyZGF2YWdlbiAxMzEnKSB8fCBsb2NhdGlvbk5vcm0uaW5jbHVkZXMoJ3ZpdGEgaHVzZXQnKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0xhIENhc2EgQmxhbmNhJzsKICAgICAgICAgICAgICAgIGlmICh0eHQuaW5jbHVkZXMoJ3RlcmVzaXRhJykpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdUZXJlc2l0YSBUYW5nbyc7CiAgICAgICAgICAgICAgICBpZiAodHh0LmluY2x1ZGVzKCdjYW1hcmluJykpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdDYW1hcmluJzsKICAgICAgICAgICAgICAgIGlmICh0eHQuaW5jbHVkZXMoJ2hvbWVybycpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnSG9tZXJvJzsKICAgICAgICAgICAgICAgIGlmICh0eHQuaW5jbHVkZXMoJ2JydWpvJykpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdUYW5nbyBCcnVqbyc7CiAgICAgICAgICAgICAgICBpZiAodHh0LmluY2x1ZGVzKCdiYWlyZXMnKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0tsdWJiIEJhaXJlcyc7CiAgICAgICAgICAgICAgICBpZiAodHh0LmluY2x1ZGVzKCdmb3J0dW5hJykpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdUYW5nbyBGb3J0dW5hJzsKICAgICAgICAgICAgICAgIGlmICh0eHQuaW5jbHVkZXMoJ2FtYXRhbmdvJykgfHwgdHh0LmluY2x1ZGVzKCdtYW5zbHVuZGEnKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0FtYXRhbmdvJzsKICAgICAgICAgICAgICAgIGlmICgvXGJsYVxzKnRccyptaWxvbmdhXGIvLnRlc3Qobm9ybSkgfHwgbm9ybS5pbmNsdWRlcygnbGF0bWlsb25nYScpIHx8IHR4dC5pbmNsdWRlcygnbWFyY2VsYScpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnTGEgVCBNaWxvbmdhJzsKICAgICAgICAgICAgICAgIGlmICh0eHQuaW5jbHVkZXMoJ3N0cmVldCB0YW5nbycpIHx8IHR4dC5pbmNsdWRlcygnc3RyZWV0dGFuZ28nKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1N0cmVldCBUYW5nbyc7CiAgICAgICAgICAgICAgICBpZiAodHh0LmluY2x1ZGVzKCd0YW5nb3JhbWEnKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1RhbmdvcmFtYSc7CiAgICAgICAgICAgICAgICBpZiAodHh0LmluY2x1ZGVzKCd5c3RhZCcpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnVGFuZ28gWXN0YWQnOwogICAgICAgICAgICAgICAgaWYgKHR4dC5pbmNsdWRlcygnYXJyaWJhJykpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdBcnJpYmEgVGFuZ28nOwogICAgICAgICAgICAgICAgaWYgKHR4dC5pbmNsdWRlcygndGFuZ29rb21wYW5pZXQnKSB8fCB0eHQuaW5jbHVkZXMoJ2lkYSBjYXJuZXJ1cCcpIHx8IHR4dC5pbmNsdWRlcygnY3Jpc3RpYW4gbGVpdGUnKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1Rhbmdva29tcGFuaWV0JzsKICAgICAgICAgICAgICAgIHJldHVybiBlLm9yZ2FuaXplciB8fCAoZS5lbWFpbCA\/IFN0cmluZyhlLmVtYWlsKS5zcGxpdCgnQCcpWzBdIDogJ09yZ2FuaXplcicpOwog',\n      'ICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGluZmVyVHlwZShlKSB7CiAgICAgICAgICAgICAgICB2YXIgdHh0ID0gW2UudGl0bGUsIGUuZGVzY3JpcHRpb24sIGUuZGVzY3JpcHRpb25UZXh0LCBlLmNhdGVnb3JpZXNdLmpvaW4oJyAnKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgdmFyIGhhc01pbG9uZ2EgPSAvbWlsb25nYXxzb2NpYWwgZGFuY2V8c29jaWFsZGFuc3xwcmFjdGlsb25nYS8udGVzdCh0eHQpOwogICAgICAgICAgICAgICAgdmFyIGhhc0NsYXNzID0gL2NsYXNzfGNsYXNzZXN8bGVzc29ufGNvdXJzZXx3b3Jrc2hvcHx0ZW1hfHRlYWNoZXJ8bFx4ZTRyYXJlfGxhcmFyZS8udGVzdCh0eHQpOwogICAgICAgICAgICAgICAgdmFyIGhhc1ByYWN0aWNhID0gL3ByYWN0aWNhfHByYWt0aWthLy50ZXN0KHR4dCk7CiAgICAgICAgICAgICAgICB2YXIgaGFzRmVzdGl2YWwgPSAvZmVzdGl2YWx8bWFyYXRob258aGVsZ3x3ZWVrZW5kfGVuY3VlbnRyby8udGVzdCh0eHQpOwogICAgICAgICAgICAgICAgaWYgKGhhc0Zlc3RpdmFsKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiAnRmVzdGl2YWwvd2Vla2VuZCcsIGtleTogJ2Zlc3RpdmFsJyB9OwogICAgICAgICAgICAgICAgaWYgKGhhc01pbG9uZ2EgJiYgaGFzQ2xhc3MpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6ICdNaWxvbmdhICsgY2xhc3MnLCBrZXk6ICdtaWxvbmdhJyB9OwogICAgICAgICAgICAgICAgaWYgKGhhc1ByYWN0aWNhKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiAnUHJhY3RpY2EnLCBrZXk6ICdwcmFjdGljYScgfTsKICAgICAgICAgICAgICAgIGlmIChoYXNNaWxvbmdhKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGxhYmVsOiAnTWlsb25nYScsIGtleTogJ21pbG9uZ2EnIH07CiAgICAgICAgICAgICAgICBpZiAoaGFzQ2xhc3MpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6ICdDb3Vyc2Uvd29ya3Nob3AnLCBrZXk6ICdjb3Vyc2UnIH07CiAgICAgICAgICAgICAgICByZXR1cm4geyBsYWJlbDogJ0V2ZW50Jywga2V5OiAnZXZlbnQnIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gbm9ybWFsaXplRXZlbnQocmF3KSB7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBwYXJzZURhdGUocmF3LnN0YXJ0RGF0ZVRpbWUgfHwgcmF3LnN0YXJ0X2RhdGV0aW1lIHx8IHJhdy5zdGFydCB8fCByYXcuZGF0ZSk7CiAgICAgICAgICAgICAgICB2YXIgZW5kID0gcGFyc2VEYXRlKHJhdy5lbmREYXRlVGltZSB8fCByYXcuZW5kX2RhdGV0aW1lIHx8IHJhdy5lbmQpIHx8IHN0YXJ0OwogICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBpbmZlclR5cGUocmF3KTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgaWQ6IHJhdy5ldmVudElkRXh0ZW5kZWQgfHwgcmF3Lm9jY3VycmVuY2VJZCB8fCByYXcuaWQgfHwgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiksCiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHJhdy50aXRsZSB8fCByYXcubmFtZSB8fCAnVW5uYW1lZCBldmVudCcsCiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LAogICAgICAgICAgICAgICAg',\n      'ICAgIGVuZDogZW5kLAogICAgICAgICAgICAgICAgICAgIGFsbERheTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgdGltZU1pc3Npbmc6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgIGNvdW50cnk6ICdTRScsCiAgICAgICAgICAgICAgICAgICAgY2l0eTogaW5mZXJDaXR5RnJvbUxvY2F0aW9uKHJhdy5jaXR5LCByYXcubG9jYXRpb24sIHJhdy50aXRsZSwgcmF3LmRlc2NyaXB0aW9uKSwKICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbjogcmF3LmxvY2F0aW9uIHx8IHJhdy52ZW51ZSB8fCByYXcuYWRkcmVzcyB8fCAnJywKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblRleHQ6IHN0cmlwSHRtbChyYXcuZGVzY3JpcHRpb24gfHwgcmF3LmRldGFpbHMgfHwgJycpLAogICAgICAgICAgICAgICAgICAgIG9yZ2FuaXplcjogaW5mZXJPcmdhbml6ZXIocmF3KSwKICAgICAgICAgICAgICAgICAgICB0eXBlTGFiZWw6IHR5cGUubGFiZWwsCiAgICAgICAgICAgICAgICAgICAgdHlwZUtleTogdHlwZS5rZXksCiAgICAgICAgICAgICAgICAgICAgbGluazogcmF3LmZhY2Vib29rRXZlbnRMaW5rIHx8IHJhdy5ldmVudFVybCB8fCByYXcudXJsIHx8IFRTX0NBTEVOREFSX1VSTF8xLAogICAgICAgICAgICAgICAgICAgIHNvdXJjZUtleTogJ3Rhbmdvc3dlZGVuJywKICAgICAgICAgICAgICAgICAgICBzb3VyY2VMYWJlbDogJ1Rhbmdvc3dlZGVuLnNlJywKICAgICAgICAgICAgICAgICAgICByYXc6IHJhdwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBpbmZlckJyb3duQmVhckNpdHkocmF3KSB7CiAgICAgICAgICAgICAgICB2YXIgaGF5ID0gbm9ybWFsaXplTG9jYXRpb25UZXh0KFtyYXcuY2l0eSwgcmF3LmxvY2F0aW9uLCByYXcudGV4dCwgcmF3LnRpdGxlLCByYXcuc3VtbWFyeSwgcmF3LmRldGFpbHMsIHJhdy5kZXNjcmlwdGlvbiwgcmF3LmNhdGVnb3JpZXNdLmpvaW4oJyAnKSk7CiAgICAgICAgICAgICAgICBpZiAoaGF5LmluY2x1ZGVzKCdtYWxtbycpIHx8IGhheS5pbmNsdWRlcygnbWFsbW9lJykgfHwgaGF5LmluY2x1ZGVzKCd0b3JwZ2F0YW4nKSB8fCBoYXkuaW5jbHVkZXMoJ25vcnJhIHNrb2xnYXRhbicpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnTWFsbVx4ZjYnOwogICAgICAgICAgICAgICAgaWYgKGhheS5pbmNsdWRlcygnbHVuZCcpIHx8IGhheS5pbmNsdWRlcygndWFyZGF2YWdlbicpIHx8IGhheS5pbmNsdWRlcygndml0YSBodXNldCcpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnTHVuZCc7CiAgICAgICAgICAgICAgICBpZiAoaGF5LmluY2x1ZGVzKCdoZWxzaW5nYm9yZycpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnSGVsc2luZ2JvcmcnOwogICAgICAgICAgICAgICAgaWYgKGhheS5pbmNsdWRlcygneXN0YWQnKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1lzdGFkJzsKICAgICAgICAgICAgICAgIGlmIChoYXkuaW5jbHVkZXMoJ2tvYmVuaGF2bicpIHx8IGhheS5pbmNsdWRlcygnY29wZW5oYWdlbicpIHx8IGhheS5pbmNsdWRlcygna2JoJykgfHwgaGF5LmluY2x1ZGVzKCdkYW5zZWthcGVsbGV0JykgfHwgaGF5LmluY2x1ZGVzKCdvc3JhbWh1c2V0JykgfHwgaGF5LmluY2x1ZGVzKCd0',\n      'YW5nb3BhdmlsbG9uZW4nKSB8fCBoYXkuaW5jbHVkZXMoJ2xhIGJvY2EnKSB8fCBoYXkuaW5jbHVkZXMoJ2ZyZWRlcmlrc2JlcmcnKSB8fCBoYXkuaW5jbHVkZXMoJ25vcnJlYnJvJykgfHwgaGF5LmluY2x1ZGVzKCdvc3RlcmJybycpIHx8IGhheS5pbmNsdWRlcygndmVzdGVyYnJvJykgfHwgaGF5LmluY2x1ZGVzKCd2YWxieScpIHx8IGhheS5pbmNsdWRlcygnYW1hZ2VyJykgfHwgaGF5LmluY2x1ZGVzKCdnbGFkc2F4ZScpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnQ29wZW5oYWdlbic7CiAgICAgICAgICAgICAgICBpZiAoaGF5LmluY2x1ZGVzKCdrb2dlJykgfHwgaGF5LmluY2x1ZGVzKCdrb2VnZScpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnS1x4ZjhnZSc7CiAgICAgICAgICAgICAgICBpZiAoaGF5LmluY2x1ZGVzKCdyb3NraWxkZScpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnUm9za2lsZGUnOwogICAgICAgICAgICAgICAgaWYgKGhheS5pbmNsdWRlcygnaGVsc2luZ29yJykpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdIZWxzaW5nXHhmOHInOwogICAgICAgICAgICAgICAgaWYgKGhheS5pbmNsdWRlcygnb2RlbnNlJykpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdPZGVuc2UnOwogICAgICAgICAgICAgICAgaWYgKGhheS5pbmNsdWRlcygnYWFyaHVzJykgfHwgaGF5LmluY2x1ZGVzKCdhcmh1cycpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnQWFyaHVzJzsKICAgICAgICAgICAgICAgIGlmIChoYXkuaW5jbHVkZXMoJ2Zhbm8nKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0Zhblx4ZjgnOwogICAgICAgICAgICAgICAgaWYgKGhheS5pbmNsdWRlcygnYWFsYm9yZycpIHx8IGhheS5pbmNsdWRlcygnYWxib3JnJykpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdBYWxib3JnJzsKICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVDaXR5KHJhdy5jaXR5IHx8ICdEZW5tYXJrJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaXNTd2VkaXNoRHVwbGljYXRlRnJvbUJyb3duQmVhcihlKSB7CiAgICAgICAgICAgICAgICB2YXIgaGF5ID0gbm9ybWFsaXplTG9jYXRpb25UZXh0KFtlLmNpdHksIGUubG9jYXRpb24sIGUudGl0bGUsIGUuZGVzY3JpcHRpb25UZXh0LCBlLm9yZ2FuaXplcl0uam9pbignICcpKTsKICAgICAgICAgICAgICAgIHJldHVybiBoYXkuaW5jbHVkZXMoJ21hbG1vJykgfHwgaGF5LmluY2x1ZGVzKCdtYWxtb2UnKSB8fCBoYXkuaW5jbHVkZXMoJ2x1bmQnKSB8fCBoYXkuaW5jbHVkZXMoJ2hlbHNpbmdib3JnJykgfHwgaGF5LmluY2x1ZGVzKCd5c3RhZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHRvQnJvd25CZWFyRGF0ZVBhcmFtKHJhdywgc3RhcnQpIHsKICAgICAgICAgICAgICAgIHZhciByYXdEYXRlID0gcmF3ICYmIChyYXcuZGF0ZSB8fCByYXcuc3RhcnQgfHwgcmF3LnN0YXJ0RGF0ZVRpbWUgfHwgcmF3LnN0YXJ0X2RhdGUgfHwgcmF3LnN0YXJ0RGF0ZSB8fCByYXcuc3RhcnRfZGF0ZXRpbWUpOwogICAgICAgICAgICAgICAgaWYgKHJhd0RhdGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcyA9IFN0cmluZyhyYXdEYXRlKS50cmltKCkucmVwbGFjZSgnICcs',\n      'ICdUJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBzLm1hdGNoKC9eKFxkezR9KS0oXGR7Mn0pLShcZHsyfSkoPzpUKFxkezEsMn0pOihcZHsyfSkoPzo6KFxkezJ9KSk\/KT8vKTsKICAgICAgICAgICAgICAgICAgICBpZiAobSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgeWVhciA9IG1bMV07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb250aCA9IG1bMl07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXkgPSBtWzNdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaG91ciA9IG1bNF0gPyBwYWQyKG1bNF0pIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1pbnV0ZSA9IG1bNV0gPyBwYWQyKG1bNV0pIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlY29uZCA9IG1bNl0gPyBwYWQyKG1bNl0pIDogJzAwJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaG91ciB8fCAhbWludXRlKSAmJiBzdGFydCBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHN0YXJ0LmdldFRpbWUoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBwYWQyKHN0YXJ0LmdldEhvdXJzKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlID0gcGFkMihzdGFydC5nZXRNaW51dGVzKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kID0gJzAwJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhvdXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gJzAwJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtaW51dGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGUgPSAnMDAnOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiIuY29uY2F0KHllYXIsICItIikuY29uY2F0KG1vbnRoLCAiLSIpLmNvbmNhdChkYXksICJUIikuY29uY2F0KGhvdXIsICI6IikuY29uY2F0KG1pbnV0ZSwgIjoiKS5jb25jYXQoc2Vjb25kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTihzdGFydC5nZXRUaW1lKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIiLmNvbmNhdChzdGFydC5nZXRGdWxsWWVhcigpLCAiLSIpLmNvbmNhdChwYWQyKHN0YXJ0LmdldE1vbnRoKCkgKyAxKSwgIi0iKS5jb25jYXQocGFkMihzdGFydC5nZXREYXRlKCkpLCAiVCIpLmNvbmNhdChwYWQyKHN0YXJ0LmdldEhvdXJzKCkpLCAiOiIpLmNvbmNhdChwYWQyKHN0YXJ0LmdldE1pbnV0ZXMoKSksICI6MDAiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBicm93bkJlYXJNb250aFVybChzdGFydCkgewogICAgICAgICAgICAgICAgdmFyIGQgPSBzdGFydCBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHN0YXJ0LmdldFRpbWUoKSkgPyBzdGFydCA6IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICB2YXIgbW9udGhEYXRlID0gIiIuY29uY2F0KGQuZ2V0RnVsbFllYXIoKSwgIi0iKS5jb25jYXQocGFkMihkLmdldE1v',\n      'bnRoKCkgKyAxKSwgIi0wMSIpOwogICAgICAgICAgICAgICAgcmV0dXJuICIiLmNvbmNhdChES19DQUxFTkRBUl9VUkxfMSwgIj9PcD1TaG93SXQmQ2FsZW5kYXJOYW1lPSIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoREtfQ0FMRU5EQVJfTkFNRV8xKSwgIiZEYXRlPSIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQobW9udGhEYXRlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYnJvd25CZWFyRXZlbnRVcmwocmF3LCBzdGFydCkgewogICAgICAgICAgICAgICAgdmFyIGlkID0gcmF3ICYmIHJhdy5pZCA\/IFN0cmluZyhyYXcuaWQpLnRyaW0oKSA6ICcnOwogICAgICAgICAgICAgICAgdmFyIGRhdGVQYXJhbSA9IHRvQnJvd25CZWFyRGF0ZVBhcmFtKHJhdywgc3RhcnQpOwogICAgICAgICAgICAgICAgaWYgKGlkICYmIGRhdGVQYXJhbSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAiIi5jb25jYXQoREtfQ0FMRU5EQVJfVVJMXzEsICI\/T3A9UG9wdXBXaW5kb3cmQ2FsZW5kYXJOYW1lPSIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoREtfQ0FMRU5EQVJfTkFNRV8xKSwgIiZEYXRlPSIpLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoZGF0ZVBhcmFtKSwgIiZJRD0iKS5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KGlkKSwgIiZTb3VyY2U9Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gYnJvd25CZWFyTW9udGhVcmwoc3RhcnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUJyb3duQmVhckV2ZW50KHJhdykgewogICAgICAgICAgICAgICAgdmFyIHJhd1RpdGxlID0gc3RyaXBIdG1sKHJhdy50ZXh0IHx8IHJhdy50aXRsZSB8fCByYXcuc3VtbWFyeSB8fCByYXcubmFtZSB8fCAnVGFuZ28gZXZlbnQnKTsKICAgICAgICAgICAgICAgIHZhciByYXdEZXRhaWxzID0gc3RyaXBIdG1sKHJhdy5kZXRhaWxzIHx8IHJhdy5kZXNjcmlwdGlvbiB8fCByYXcubm90ZXMgfHwgcmF3LnN0YXR1cyB8fCAnJyk7CiAgICAgICAgICAgICAgICB2YXIgcmF3TG9jYXRpb24gPSBzdHJpcEh0bWwocmF3LmxvY2F0aW9uIHx8IHJhdy53aGVyZSB8fCAnJyk7CiAgICAgICAgICAgICAgICB2YXIgcmF3RGF0ZSA9IHJhdy5kYXRlIHx8IHJhdy5zdGFydF9kYXRlIHx8IHJhdy5zdGFydERhdGUgfHwgcmF3LnN0YXJ0IHx8IHJhdy5zdGFydERhdGVUaW1lIHx8IHJhdy5zdGFydF9kYXRldGltZTsKICAgICAgICAgICAgICAgIHZhciByYXdEYXRlSGFzVGltZSA9IC9cZHsxLDJ9WzouXVxkezJ9Ly50ZXN0KFN0cmluZyhyYXdEYXRlIHx8ICcnKSk7CiAgICAgICAgICAgICAgICB2YXIgZXhwbGljaXRBbGxEYXkgPSByYXcuaXNfYWxsX2RheSA9PT0gMSB8fCByYXcuaXNfYWxsX2RheSA9PT0gJzEnIHx8IHJhdy5pc19hbGxfZGF5ID09PSB0cnVlOwogICAgICAgICAgICAgICAgdmFyIGFsbERheSA9IGV4cGxpY2l0QWxsRGF5IHx8ICghcmF3LnRpbWUgJiYgIXJhd0RhdGVIYXNUaW1lKTsKICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IHBhcnNlRGF0ZShyYXdEYXRlKTsKICAgICAgICAgICAgICAgIGlmICghc3RhcnQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICBpZiAoIWFsbERheSAmJiBy',\n      'YXcudGltZSAmJiAhcmF3RGF0ZUhhc1RpbWUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbSA9IFN0cmluZyhyYXcudGltZSkubWF0Y2goLyhcZHsxLDJ9KVs6Ll0oXGR7Mn0pLyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG0pCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LnNldEhvdXJzKE51bWJlcihtWzFdKSwgTnVtYmVyKG1bMl0pLCAwLCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBlbmQgPSBwYXJzZURhdGUocmF3LmVuZF9kYXRlIHx8IHJhdy5lbmREYXRlIHx8IHJhdy5lbmQgfHwgcmF3LmVuZERhdGVUaW1lIHx8IHJhdy5lbmRfZGF0ZXRpbWUpOwogICAgICAgICAgICAgICAgaWYgKCFlbmQpIHsKICAgICAgICAgICAgICAgICAgICBlbmQgPSBhbGxEYXkgPyBuZXcgRGF0ZShzdGFydC5nZXRUaW1lKCkgKyAyNCAqIDYwICogNjAgKiAxMDAwKSA6IHN0YXJ0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHR5cGUgPSBpbmZlclR5cGUoeyB0aXRsZTogcmF3VGl0bGUsIGRlc2NyaXB0aW9uOiBbcmF3RGV0YWlscywgcmF3LmNhdGVnb3JpZXNdLmpvaW4oJyAnKSB9KTsKICAgICAgICAgICAgICAgIHZhciBjaXR5ID0gaW5mZXJCcm93bkJlYXJDaXR5KHJhdyk7CiAgICAgICAgICAgICAgICB2YXIgcmF3SWQgPSByYXcuaWQgfHwgcmF3LmV2ZW50X2lkIHx8IHJhdy51aWQgfHwgW3Jhd1RpdGxlLCByYXdEYXRlLCByYXcuZW5kX2RhdGVdLmpvaW4oJy0nKTsKICAgICAgICAgICAgICAgIHZhciBldmVudCA9IHsKICAgICAgICAgICAgICAgICAgICBpZDogJ2RrLScgKyBTdHJpbmcocmF3SWQpLnJlcGxhY2UoL1teYS16MC05QC4tXS9naSwgJycpLAogICAgICAgICAgICAgICAgICAgIHRpdGxlOiByYXdUaXRsZSwKICAgICAgICAgICAgICAgICAgICBzdGFydDogc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgZW5kOiBlbmQsCiAgICAgICAgICAgICAgICAgICAgYWxsRGF5OiBhbGxEYXksCiAgICAgICAgICAgICAgICAgICAgdGltZU1pc3Npbmc6IGFsbERheSB8fCAoIXJhdy50aW1lICYmICFyYXdEYXRlSGFzVGltZSAmJiBzdGFydC5nZXRIb3VycygpID09PSAwICYmIHN0YXJ0LmdldE1pbnV0ZXMoKSA9PT0gMCksCiAgICAgICAgICAgICAgICAgICAgY2l0eTogY2l0eSwKICAgICAgICAgICAgICAgICAgICBjb3VudHJ5OiAnREsnLAogICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uOiByYXdMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvblRleHQ6IHJhd0RldGFpbHMsCiAgICAgICAgICAgICAgICAgICAgb3JnYW5pemVyOiBpbmZlck9yZ2FuaXplcih7IHRpdGxlOiByYXdUaXRsZSwgZGVzY3JpcHRpb246IHJhd0RldGFpbHMsIGVtYWlsOiAnJywgbG9jYXRpb246IHJhd0xvY2F0aW9uIH0pLAogICAgICAgICAgICAgICAgICAgIHR5cGVMYWJlbDogdHlwZS5sYWJlbCwKICAgICAgICAgICAgICAgICAgICB0eXBlS2V5OiB0eXBlLmtleSwKICAgICAgICAgICAgICAgICAgICBsaW5rOiBicm93bkJlYXJFdmVudFVybChyYXcsIHN0YXJ0KSwKICAgICAgICAgICAgICAgICAgICBzb3VyY2VLZXk6ICd0YW5nb2RrJywKICAgICAgICAgICAgICAgICAgICBzb3VyY2VMYWJlbDogJ1RhbmdvLmRrJywKICAgICAgICAgICAg',\n      'ICAgICAgICByYXc6IHJhdwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChpc1N3ZWRpc2hEdXBsaWNhdGVGcm9tQnJvd25CZWFyKGV2ZW50KSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybiBldmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBpc0RhbmlzaEV2ZW50KGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBlICYmIChlLnNvdXJjZUtleSA9PT0gJ3RhbmdvZGsnIHx8IGUuc291cmNlTGFiZWwgPT09ICdUYW5nby5kaycgfHwgZS5jb3VudHJ5ID09PSAnREsnIHx8IFN0cmluZyhlLmlkIHx8ICcnKS5zdGFydHNXaXRoKCdkay0nKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZXZlbnRDb3VudHJ5KGUpIHsgcmV0dXJuIGlzRGFuaXNoRXZlbnQoZSkgPyAnZGsnIDogJ3NlJzsgfQogICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXREYXRlUGFydHMoZGF0ZSkgewogICAgICAgICAgICAgICAgdmFyIGxvYyA9ICdlbi1HQic7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGRvdzogZGF0ZS50b0xvY2FsZURhdGVTdHJpbmcobG9jLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSkucmVwbGFjZSgnLicsICcnKSwKICAgICAgICAgICAgICAgICAgICBkYXk6IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKGxvYywgeyBkYXk6ICcyLWRpZ2l0JyB9KSwKICAgICAgICAgICAgICAgICAgICBtb246IGRhdGUudG9Mb2NhbGVEYXRlU3RyaW5nKGxvYywgeyBtb250aDogJ3Nob3J0JyB9KS5yZXBsYWNlKCcuJywgJycpCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdFRpbWUoc3RhcnQsIGVuZCkgewogICAgICAgICAgICAgICAgaWYgKCFzdGFydCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB2YXIgb3B0cyA9IHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9OwogICAgICAgICAgICAgICAgdmFyIGEgPSBzdGFydC50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLUdCJywgb3B0cyk7CiAgICAgICAgICAgICAgICB2YXIgYiA9IGVuZCAmJiBlbmQuZ2V0VGltZSgpICE9PSBzdGFydC5nZXRUaW1lKCkgPyBlbmQudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1HQicsIG9wdHMpIDogJyc7CiAgICAgICAgICAgICAgICByZXR1cm4gYiA\/IGEgKyAnLScgKyBiIDogYTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRFdmVudFRpbWUoZSkgewogICAgICAgICAgICAgICAgaWYgKCFlIHx8ICFlLnN0YXJ0KQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgIGlmIChlLmFsbERheSB8fCBlLnRpbWVNaXNzaW5nKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnVGltZSBub3Qgc3BlY2lmaWVkJzsKICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXRUaW1lKGUuc3RhcnQsIGUuZW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRDb21wYWN0Q2xvY2tUaW1lKGRhdGUpIHsKICAgICAgICAgICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAg',\n      'ICAgICAgICB2YXIgaG91ciA9IFN0cmluZyhkYXRlLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgICAgICAgICB2YXIgbWluID0gU3RyaW5nKGRhdGUuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgICAgICAgICAgcmV0dXJuIG1pbiA9PT0gJzAwJyA\/IFN0cmluZyhkYXRlLmdldEhvdXJzKCkpIDogaG91ciArICc6JyArIG1pbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBmb3JtYXRFdmVudFRpbWVDb21wYWN0KGUpIHsKICAgICAgICAgICAgICAgIGlmICghZSB8fCAhZS5zdGFydCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICBpZiAoZS5hbGxEYXkgfHwgZS50aW1lTWlzc2luZykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1RpbWUgbm90IHNwZWNpZmllZCc7CiAgICAgICAgICAgICAgICB2YXIgYSA9IGZvcm1hdENvbXBhY3RDbG9ja1RpbWUoZS5zdGFydCk7CiAgICAgICAgICAgICAgICB2YXIgYiA9IGUuZW5kICYmIGUuZW5kLmdldFRpbWUoKSAhPT0gZS5zdGFydC5nZXRUaW1lKCkgPyBmb3JtYXRDb21wYWN0Q2xvY2tUaW1lKGUuZW5kKSA6ICcnOwogICAgICAgICAgICAgICAgcmV0dXJuIGIgPyBhICsgJy0nICsgYiA6IGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZXZlbnRUaW1lQmFkZ2UoZSkgewogICAgICAgICAgICAgICAgdmFyIHQgPSBmb3JtYXRFdmVudFRpbWUoZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdCA\/ICI8c3BhbiBjbGFzcz1cInR0LWJhZGdlXCI+Ii5jb25jYXQoZXNjYXBlSHRtbCh0KSwgIjwvc3Bhbj4iKSA6ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGZvcm1hdEV2ZW50RGF0ZUxpbmUoZSkgewogICAgICAgICAgICAgICAgaWYgKCFlIHx8ICFlLnN0YXJ0KQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgIHZhciBkYXRlID0gZS5zdGFydC50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUdCJywgeyB3ZWVrZGF5OiAnc2hvcnQnLCBkYXk6ICdudW1lcmljJywgbW9udGg6ICdzaG9ydCcgfSk7CiAgICAgICAgICAgICAgICB2YXIgY2xlYW5lZERhdGUgPSBkYXRlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgZGF0ZS5zbGljZSgxKTsKICAgICAgICAgICAgICAgIHZhciB0aW1lID0gZm9ybWF0RXZlbnRUaW1lKGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRpbWUgPyBjbGVhbmVkRGF0ZSArICcgLSAnICsgdGltZSA6IGNsZWFuZWREYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIG1hcFVybChsb2NhdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuICdodHRwczovL3d3dy5nb29nbGUuY29tL21hcHMvc2VhcmNoLz9hcGk9MSZxdWVyeT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KGxvY2F0aW9uIHx8ICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjaXR5Q2VudGVyQ29vcmRzRm9yRXZlbnQoZSkgewogICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgdmFyIGhheSA9IG5vcm1hbGl6ZUxvY2F0aW9uVGV4dChbZS5jaXR5LCBlLmxvY2F0aW9uLCBlLnRpdGxl',\n      'LCBlLmRlc2NyaXB0aW9uVGV4dCwgZS5vcmdhbml6ZXJdLmpvaW4oJyAnKSk7CiAgICAgICAgICAgICAgICB2YXIgY2l0eU1hcCA9IFsKICAgICAgICAgICAgICAgICAgICBbJ2hlbHNpbmdib3JnJywgJ2hlbHNpbmdib3JnJ10sCiAgICAgICAgICAgICAgICAgICAgWydsdW5kJywgJ2x1bmQnXSwKICAgICAgICAgICAgICAgICAgICBbJ21hbG1vJywgJ21hbG1vJ10sCiAgICAgICAgICAgICAgICAgICAgWydtYWxtb2UnLCAnbWFsbW8nXSwKICAgICAgICAgICAgICAgICAgICBbJ3lzdGFkJywgJ3lzdGFkJ10sCiAgICAgICAgICAgICAgICAgICAgWydjb3BlbmhhZ2VuJywgJ2NvcGVuaGFnZW4nXSwKICAgICAgICAgICAgICAgICAgICBbJ2tvYmVuaGF2bicsICdjb3BlbmhhZ2VuJ10sCiAgICAgICAgICAgICAgICAgICAgWydrYmgnLCAnY29wZW5oYWdlbiddLAogICAgICAgICAgICAgICAgICAgIFsnZnJlZGVyaWtzYmVyZycsICdmcmVkZXJpa3NiZXJnJ10sCiAgICAgICAgICAgICAgICAgICAgWydnbGFkc2F4ZScsICdnbGFkc2F4ZSddLAogICAgICAgICAgICAgICAgICAgIFsncm9za2lsZGUnLCAncm9za2lsZGUnXSwKICAgICAgICAgICAgICAgICAgICBbJ2tvZ2UnLCAna29nZSddLAogICAgICAgICAgICAgICAgICAgIFsna29lZ2UnLCAna29nZSddLAogICAgICAgICAgICAgICAgICAgIFsnaGVsc2luZ29yJywgJ2hlbHNpbmdvciddLAogICAgICAgICAgICAgICAgICAgIFsnb2RlbnNlJywgJ29kZW5zZSddLAogICAgICAgICAgICAgICAgICAgIFsnYWFyaHVzJywgJ2Fhcmh1cyddLAogICAgICAgICAgICAgICAgICAgIFsnYXJodXMnLCAnYWFyaHVzJ10sCiAgICAgICAgICAgICAgICAgICAgWydhYWxib3JnJywgJ2FhbGJvcmcnXSwKICAgICAgICAgICAgICAgICAgICBbJ2tvbGRpbmcnLCAna29sZGluZyddLAogICAgICAgICAgICAgICAgICAgIFsnc2lsa2Vib3JnJywgJ3NpbGtlYm9yZyddLAogICAgICAgICAgICAgICAgICAgIFsnZmFubycsICdmYW5vJ10sCiAgICAgICAgICAgICAgICAgICAgWydib3JuaG9sbScsICdib3JuaG9sbSddCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaXR5TWFwLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhheS5pbmNsdWRlcyhjaXR5TWFwW2ldWzBdKSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2VudGVyID0gQ0lUWV9DRU5URVJTXzFbY2l0eU1hcFtpXVsxXV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZW50ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBsYXQ6IGNlbnRlci5sYXQsIGxuZzogY2VudGVyLmxuZywgbGFiZWw6IGNlbnRlci5uYW1lICsgJyBjaXR5IGFyZWEnLCBhcHByb3hpbWF0ZTogdHJ1ZSB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBjaXR5ID0gbm9ybWFsaXplTG9jYXRpb25UZXh0KGUuY2l0eSB8fCAnJyk7CiAgICAgICAgICAgICAgICBpZiAoaXNEZW5tYXJrQ2l0eShjaXR5KSAmJiBDSVRZX0NFTlRFUlNfMS5kZW5tYXJrKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGxhdDogQ0lUWV9DRU5URVJTXzEuZGVubWFyay5sYXQsIGxuZzog',\n      'Q0lUWV9DRU5URVJTXzEuZGVubWFyay5sbmcsIGxhYmVsOiAnRGVubWFyayBjaXR5IGFyZWEnLCBhcHByb3hpbWF0ZTogdHJ1ZSB9OwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gY29vcmRzRm9yRXZlbnQoZSkgewogICAgICAgICAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2YsIF9nLCBfaCwgX2o7CiAgICAgICAgICAgICAgICBpZiAoIWUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB2YXIgcmF3ID0gZS5yYXcgfHwge307CiAgICAgICAgICAgICAgICB2YXIgcmF3TGF0ID0gKF9kID0gKF9jID0gKF9iID0gKF9hID0gcmF3LmxhdCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA\/IF9hIDogcmF3LmxhdGl0dWRlKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiByYXcuTGF0aXR1ZGUpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IHJhdy55KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiByYXcuWTsKICAgICAgICAgICAgICAgIHZhciByYXdMbmcgPSAoX2ogPSAoX2ggPSAoX2cgPSAoX2YgPSAoX2UgPSByYXcubG5nKSAhPT0gbnVsbCAmJiBfZSAhPT0gdm9pZCAwID8gX2UgOiByYXcubG9uKSAhPT0gbnVsbCAmJiBfZiAhPT0gdm9pZCAwID8gX2YgOiByYXcubG9uZ2l0dWRlKSAhPT0gbnVsbCAmJiBfZyAhPT0gdm9pZCAwID8gX2cgOiByYXcuTG9uZ2l0dWRlKSAhPT0gbnVsbCAmJiBfaCAhPT0gdm9pZCAwID8gX2ggOiByYXcueCkgIT09IG51bGwgJiYgX2ogIT09IHZvaWQgMCA\/IF9qIDogcmF3Llg7CiAgICAgICAgICAgICAgICB2YXIgbGF0ID0gTnVtYmVyKHJhd0xhdCk7CiAgICAgICAgICAgICAgICB2YXIgbG5nID0gTnVtYmVyKHJhd0xuZyk7CiAgICAgICAgICAgICAgICBpZiAoTnVtYmVyLmlzRmluaXRlKGxhdCkgJiYgTnVtYmVyLmlzRmluaXRlKGxuZykgJiYgTWF0aC5hYnMobGF0KSA8PSA5MCAmJiBNYXRoLmFicyhsbmcpIDw9IDE4MCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGxhdDogbGF0LCBsbmc6IGxuZywgbGFiZWw6IGUubG9jYXRpb24gfHwgZS5jaXR5IHx8ICdLbm93biBsb2NhdGlvbicsIGFwcHJveGltYXRlOiBmYWxzZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGhheSA9IG5vcm1hbGl6ZUxvY2F0aW9uVGV4dChbZS5sb2NhdGlvbiwgZS5jaXR5LCBlLnRpdGxlLCBlLmRlc2NyaXB0aW9uVGV4dCwgZS5vcmdhbml6ZXJdLmpvaW4oJyAnKSk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIFZFTlVFX0NPT1JEU18yID0gVkVOVUVfQ09PUkRTXzE7IF9pIDwgVkVOVUVfQ09PUkRTXzIubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHYgPSBWRU5VRV9DT09SRFNfMltfaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHYubWF0Y2guc29tZShmdW5jdGlvbiAobSkgeyByZXR1cm4gaGF5LmluY2x1ZGVzKG5vcm1hbGl6ZUxvY2F0aW9uVGV4dChtKSk7IH0pKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19hc3NpZ24oX19hc3NpZ24oe30sIHYpLCB7IGFwcHJveGltYXRlOiBmYWxzZSB9KTsKICAgICAgICAgICAgICAgIH0KICAg',\n      'ICAgICAgICAgICAgIHJldHVybiBjaXR5Q2VudGVyQ29vcmRzRm9yRXZlbnQoZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZW5zdXJlTGVhZmxldE1hcCgpIHsKICAgICAgICAgICAgICAgIGlmICghbGVhZmxldE1hcEVsXzEgfHwgIXdpbmRvdy5MKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgaWYgKCFsZWFmbGV0TWFwXzEpIHsKICAgICAgICAgICAgICAgICAgICBsZWFmbGV0TWFwXzEgPSBMLm1hcChsZWFmbGV0TWFwRWxfMSwgeyBzY3JvbGxXaGVlbFpvb206IGZhbHNlIH0pOwogICAgICAgICAgICAgICAgICAgIEwudGlsZUxheWVyKCdodHRwczovL3tzfS50aWxlLm9wZW5zdHJlZXRtYXAub3JnL3t6fS97eH0ve3l9LnBuZycsIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF4Wm9vbTogMTksCiAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0aW9uOiAnJmNvcHk7IE9wZW5TdHJlZXRNYXAnCiAgICAgICAgICAgICAgICAgICAgfSkuYWRkVG8obGVhZmxldE1hcF8xKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gbGVhZmxldE1hcF8xLmludmFsaWRhdGVTaXplKCk7IH0sIDgwKTsKICAgICAgICAgICAgICAgIHJldHVybiBsZWFmbGV0TWFwXzE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gY2xlYXJMZWFmbGV0TWFya2VycygpIHsKICAgICAgICAgICAgICAgIGlmICghbGVhZmxldE1hcF8xKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIGxlYWZsZXRNYXJrZXJzXzEuZm9yRWFjaChmdW5jdGlvbiAobSkgeyByZXR1cm4gbGVhZmxldE1hcF8xLnJlbW92ZUxheWVyKG0pOyB9KTsKICAgICAgICAgICAgICAgIGxlYWZsZXRNYXJrZXJzXzEgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBzYXZlRmlsdGVycygpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3R0UmVnaW9uRmlsdGVycycsIEpTT04uc3RyaW5naWZ5KHsKICAgICAgICAgICAgICAgICAgICAgICAgY291bnRyeTogc3RhdGVfMS5jb3VudHJ5LAogICAgICAgICAgICAgICAgICAgICAgICByZWdpb246IHN0YXRlXzEucmVnaW9uLAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzdGF0ZV8xLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU6IHN0YXRlXzEudGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiBzdGF0ZV8xLnN0YXJ0VGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNb250aDogc3RhdGVfMS5zZWxlY3RlZE1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFdlZWs6IHN0YXRlXzEuc2VsZWN0ZWRXZWVrLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERheTogc3RhdGVfMS5zZWxlY3RlZERheSwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJQaWNrTW9kZTogc3RhdGVfMS5jYWxlbmRhclBpY2tNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IHN0YXRlXzEuc2VhcmNoLAogICAgICAgICAgICAgICAgICAgICAgICBs',\n      'aW1pdDogc3RhdGVfMS5saW1pdCwKICAgICAgICAgICAgICAgICAgICAgICAgdmlldzogc3RhdGVfMS52aWV3LAogICAgICAgICAgICAgICAgICAgICAgICB1aU1vZGU6IHN0YXRlXzEudWlNb2RlLAogICAgICAgICAgICAgICAgICAgICAgICBtb3JlQ2hvaWNlc0Rpc3BsYXk6IHN0YXRlXzEubW9yZUNob2ljZXNEaXNwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVWZXJzaW9uOiAndjYzLXNrYW5lLWNvcGVuaGFnZW4nCiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGlzTG9jYWwoY2l0eSkgewogICAgICAgICAgICAgICAgdmFyIGMgPSBub3JtYWxpemVMb2NhdGlvblRleHQoY2l0eSB8fCAnJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gYy5pbmNsdWRlcygnbHVuZCcpIHx8IGMuaW5jbHVkZXMoJ21hbG1vJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaXNDb3BlbmhhZ2VuQXJlYShjaXR5KSB7CiAgICAgICAgICAgICAgICB2YXIgYyA9IG5vcm1hbGl6ZUxvY2F0aW9uVGV4dChjaXR5IHx8ICcnKTsKICAgICAgICAgICAgICAgIHJldHVybiBjLmluY2x1ZGVzKCdrb3BlbmhhbW4nKSB8fCBjLmluY2x1ZGVzKCdrb2Jlbmhhdm4nKSB8fCBjLmluY2x1ZGVzKCdjb3BlbmhhZ2VuJykgfHwgYy5pbmNsdWRlcygnZnJlZGVyaWtzYmVyZycpIHx8IGMuaW5jbHVkZXMoJ2dsYWRzYXhlJykgfHwgYy5pbmNsdWRlcygnaGVsc2luZ29yJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaXNEZW5tYXJrQ2l0eShjaXR5KSB7CiAgICAgICAgICAgICAgICB2YXIgYyA9IG5vcm1hbGl6ZUxvY2F0aW9uVGV4dChjaXR5IHx8ICcnKTsKICAgICAgICAgICAgICAgIHJldHVybiBpc0NvcGVuaGFnZW5BcmVhKGNpdHkpIHx8IGMuaW5jbHVkZXMoJ2Rhbm1hcmsnKSB8fCBjLmluY2x1ZGVzKCdkZW5tYXJrJykgfHwgYy5pbmNsdWRlcygnb2RlbnNlJykgfHwgYy5pbmNsdWRlcygnYWFyaHVzJykgfHwgYy5pbmNsdWRlcygnYXJodXMnKSB8fCBjLmluY2x1ZGVzKCdzaWxrZWJvcmcnKSB8fCBjLmluY2x1ZGVzKCdrb2xkaW5nJykgfHwgYy5pbmNsdWRlcygnZmFubycpIHx8IGMuaW5jbHVkZXMoJ2Jvcm5ob2xtJykgfHwgYy5pbmNsdWRlcygnYWFsYm9yZycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGlzUmVnaW9uKGNpdHksIHJlZ2lvbikgewogICAgICAgICAgICAgICAgdmFyIGMgPSBub3JtYWxpemVMb2NhdGlvblRleHQoY2l0eSB8fCAnJyk7CiAgICAgICAgICAgICAgICBpZiAocmVnaW9uID09PSAnYWxsJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmIChyZWdpb24gPT09ICdza2FuZS1jb3BlbmhhZ2VuJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmIChyZWdpb24gPT09ICdsb2NhbCcpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzTG9jYWwoY2l0eSk7CiAgICAgICAgICAgICAgICBpZiAocmVnaW9uID09PSAnbHVuZCcpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuaW5jbHVkZXMoJ2x1bmQn',\n      'KTsKICAgICAgICAgICAgICAgIGlmIChyZWdpb24gPT09ICdtYWxtbycpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGMuaW5jbHVkZXMoJ21hbG1vJyk7CiAgICAgICAgICAgICAgICBpZiAocmVnaW9uID09PSAnaGVsc2luZ2JvcmcnKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjLmluY2x1ZGVzKCdoZWxzaW5nYm9yZycpOwogICAgICAgICAgICAgICAgaWYgKHJlZ2lvbiA9PT0gJ3lzdGFkJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5pbmNsdWRlcygneXN0YWQnKTsKICAgICAgICAgICAgICAgIGlmIChyZWdpb24gPT09ICdjb3BlbmhhZ2VuJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNDb3BlbmhhZ2VuQXJlYShjaXR5KTsKICAgICAgICAgICAgICAgIGlmIChyZWdpb24gPT09ICdkZW5tYXJrJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNEZW5tYXJrQ2l0eShjaXR5KTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGlzQ291bnRyeUV2ZW50KGUsIGNvdW50cnkpIHsKICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5ID09PSAnYm90aCcpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRDb3VudHJ5KGUpID09PSBjb3VudHJ5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGlzUmVnaW9uRXZlbnQoZSwgcmVnaW9uKSB7CiAgICAgICAgICAgICAgICBpZiAocmVnaW9uID09PSAnYWxsJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmIChyZWdpb24gPT09ICdza2FuZS1jb3BlbmhhZ2VuJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRDb3VudHJ5KGUpID09PSAnc2UnIHx8IGlzQ29wZW5oYWdlbkFyZWEoZS5jaXR5KTsKICAgICAgICAgICAgICAgIGlmIChyZWdpb24gPT09ICdza2FuZScpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50Q291bnRyeShlKSA9PT0gJ3NlJzsKICAgICAgICAgICAgICAgIGlmIChyZWdpb24gPT09ICdkZW5tYXJrJykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRDb3VudHJ5KGUpID09PSAnZGsnOwogICAgICAgICAgICAgICAgcmV0dXJuIGlzUmVnaW9uKGUuY2l0eSwgcmVnaW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBpbk5leHREYXlzKGRhdGUsIGRheXMpIHsKICAgICAgICAgICAgICAgIGlmICghZGF0ZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgIHZhciB1bnRpbCA9IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyBkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCk7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0ZSA+PSBub3cgJiYgZGF0ZSA8PSB1bnRpbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiB1cGNvbWluZ1dlZWtlbmRSYW5nZSgpIHsKICAgICAgICAgICAgICAgIHZhciB0b2RheSA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSh0b2RheS5nZXRGdWxsWWVhcigpLCB0b2RheS5nZXRNb250',\n      'aCgpLCB0b2RheS5nZXREYXRlKCkpOwogICAgICAgICAgICAgICAgdmFyIGRheSA9IHN0YXJ0LmdldERheSgpOwogICAgICAgICAgICAgICAgdmFyIGRheXNVbnRpbEZyaWRheTsKICAgICAgICAgICAgICAgIGlmIChkYXkgPT09IDUgfHwgZGF5ID09PSA2IHx8IGRheSA9PT0gMCkKICAgICAgICAgICAgICAgICAgICBkYXlzVW50aWxGcmlkYXkgPSBkYXkgPT09IDAgPyAtMiA6IDUgLSBkYXk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgZGF5c1VudGlsRnJpZGF5ID0gKDUgLSBkYXkgKyA3KSAlIDc7CiAgICAgICAgICAgICAgICB2YXIgZnJpZGF5ID0gbmV3IERhdGUoc3RhcnQpOwogICAgICAgICAgICAgICAgZnJpZGF5LnNldERhdGUoc3RhcnQuZ2V0RGF0ZSgpICsgZGF5c1VudGlsRnJpZGF5KTsKICAgICAgICAgICAgICAgIGZyaWRheS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICAgICAgICAgIHZhciBtb25kYXkgPSBuZXcgRGF0ZShmcmlkYXkpOwogICAgICAgICAgICAgICAgbW9uZGF5LnNldERhdGUoZnJpZGF5LmdldERhdGUoKSArIDMpOwogICAgICAgICAgICAgICAgbW9uZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IGZyaWRheSwgZW5kOiBtb25kYXkgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBpc1VwY29taW5nV2Vla2VuZChkYXRlKSB7CiAgICAgICAgICAgICAgICBpZiAoIWRhdGUpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgdmFyIHIgPSB1cGNvbWluZ1dlZWtlbmRSYW5nZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUgPj0gci5zdGFydCAmJiBkYXRlIDwgci5lbmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZXZlbnRNb250aEtleShkYXRlKSB7CiAgICAgICAgICAgICAgICBpZiAoIShkYXRlIGluc3RhbmNlb2YgRGF0ZSkgfHwgaXNOYU4oZGF0ZS5nZXRUaW1lKCkpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCkgKyAnLScgKyBwYWQyKGRhdGUuZ2V0TW9udGgoKSArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGV2ZW50RGF5S2V5KGRhdGUpIHsKICAgICAgICAgICAgICAgIGlmICghKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSB8fCBpc05hTihkYXRlLmdldFRpbWUoKSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKSArICctJyArIHBhZDIoZGF0ZS5nZXRNb250aCgpICsgMSkgKyAnLScgKyBwYWQyKGRhdGUuZ2V0RGF0ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBkYXlMYWJlbChrZXkpIHsKICAgICAgICAgICAgICAgIHZhciBtID0gU3RyaW5nKGtleSB8fCAnJykubWF0Y2goL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KSQvKTsKICAgICAgICAgICAgICAgIGlmICghbSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1NlbGVjdGVkIGRheSc7CiAgICAgICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKE51bWJlcihtWzFdKSwgTnVtYmVyKG1bMl0pIC0gMSwgTnVtYmVy',\n      'KG1bM10pKTsKICAgICAgICAgICAgICAgIHJldHVybiBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tR0InLCB7IHdlZWtkYXk6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIG1vbnRoTGFiZWwoa2V5KSB7CiAgICAgICAgICAgICAgICB2YXIgbSA9IFN0cmluZyhrZXkgfHwgJycpLm1hdGNoKC9eKFxkezR9KS0oXGR7Mn0pJC8pOwogICAgICAgICAgICAgICAgaWYgKCFtKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnVW5rbm93biBtb250aCc7CiAgICAgICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKE51bWJlcihtWzFdKSwgTnVtYmVyKG1bMl0pIC0gMSwgMSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZC50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUdCJywgeyBtb250aDogJ2xvbmcnLCB5ZWFyOiAnbnVtZXJpYycgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gc3RhcnRPZldlZWsoZGF0ZSkgewogICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgZGF0ZS5nZXREYXRlKCkpOwogICAgICAgICAgICAgICAgdmFyIGRheSA9IGQuZ2V0RGF5KCk7CiAgICAgICAgICAgICAgICB2YXIgZGlmZiA9IChkYXkgPT09IDAgPyAtNiA6IDEgLSBkYXkpOwogICAgICAgICAgICAgICAgZC5zZXREYXRlKGQuZ2V0RGF0ZSgpICsgZGlmZik7CiAgICAgICAgICAgICAgICBkLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZXZlbnRXZWVrS2V5KGRhdGUpIHsKICAgICAgICAgICAgICAgIGlmICghKGRhdGUgaW5zdGFuY2VvZiBEYXRlKSB8fCBpc05hTihkYXRlLmdldFRpbWUoKSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgdmFyIG1vbmRheSA9IHN0YXJ0T2ZXZWVrKGRhdGUpOwogICAgICAgICAgICAgICAgcmV0dXJuIG1vbmRheS5nZXRGdWxsWWVhcigpICsgJy0nICsgcGFkMihtb25kYXkuZ2V0TW9udGgoKSArIDEpICsgJy0nICsgcGFkMihtb25kYXkuZ2V0RGF0ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBpc29XZWVrTnVtYmVyKGRhdGUpIHsKICAgICAgICAgICAgICAgIHZhciBkID0gbmV3IERhdGUoRGF0ZS5VVEMoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKSk7CiAgICAgICAgICAgICAgICB2YXIgZGF5TnVtID0gZC5nZXRVVENEYXkoKSB8fCA3OwogICAgICAgICAgICAgICAgZC5zZXRVVENEYXRlKGQuZ2V0VVRDRGF0ZSgpICsgNCAtIGRheU51bSk7CiAgICAgICAgICAgICAgICB2YXIgeWVhclN0YXJ0ID0gbmV3IERhdGUoRGF0ZS5VVEMoZC5nZXRVVENGdWxsWWVhcigpLCAwLCAxKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKCgoKGQgLSB5ZWFyU3RhcnQpIC8gODY0MDAwMDApICsgMSkgLyA3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiB3ZWVrTGFiZWwoa2V5KSB7CiAgICAgICAgICAgICAgICB2YXIgbSA9IFN0cmluZyhrZXkg',\n      'fHwgJycpLm1hdGNoKC9eKFxkezR9KS0oXGR7Mn0pLShcZHsyfSkkLyk7CiAgICAgICAgICAgICAgICBpZiAoIW0pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdVbmtub3duIHdlZWsnOwogICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gbmV3IERhdGUoTnVtYmVyKG1bMV0pLCBOdW1iZXIobVsyXSkgLSAxLCBOdW1iZXIobVszXSkpOwogICAgICAgICAgICAgICAgdmFyIGVuZCA9IG5ldyBEYXRlKHN0YXJ0LmdldEZ1bGxZZWFyKCksIHN0YXJ0LmdldE1vbnRoKCksIHN0YXJ0LmdldERhdGUoKSArIDYpOwogICAgICAgICAgICAgICAgdmFyIGZtdCA9IHsgZGF5OiAnbnVtZXJpYycsIG1vbnRoOiAnc2hvcnQnIH07CiAgICAgICAgICAgICAgICB2YXIgc3RhcnRMYWJlbCA9IHN0YXJ0LnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tR0InLCBmbXQpOwogICAgICAgICAgICAgICAgdmFyIGVuZExhYmVsID0gZW5kLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tR0InLCBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZm10KSwgeyB5ZWFyOiAnbnVtZXJpYycgfSkpOwogICAgICAgICAgICAgICAgcmV0dXJuICdXZWVrICcgKyBpc29XZWVrTnVtYmVyKHN0YXJ0KSArICcgLSAnICsgc3RhcnRMYWJlbCArICctJyArIGVuZExhYmVsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGV2ZW50TWludXRlT2ZEYXkoZSkgewogICAgICAgICAgICAgICAgaWYgKCFlIHx8ICFlLnN0YXJ0IHx8IGUudGltZU1pc3NpbmcgfHwgZS5hbGxEYXkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICByZXR1cm4gZS5zdGFydC5nZXRIb3VycygpICogNjAgKyBlLnN0YXJ0LmdldE1pbnV0ZXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBtYXRjaGVzU3RhcnRUaW1lKGUsIHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09ICdhbnknKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgdmFyIG1pbnV0ZXMgPSBldmVudE1pbnV0ZU9mRGF5KGUpOwogICAgICAgICAgICAgICAgaWYgKG1pbnV0ZXMgPT09IG51bGwpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnYmVmb3JlMTgnKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBtaW51dGVzIDwgMTggKiA2MDsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJzE4dG8yMCcpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1pbnV0ZXMgPj0gMTggKiA2MCAmJiBtaW51dGVzIDwgMjAgKiA2MDsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gJ2FmdGVyMjAnKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBtaW51dGVzID49IDIwICogNjA7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBwb3B1bGF0ZU1vbnRoU2VsZWN0KCkgewogICAgICAgICAgICAgICAgaWYgKCFtb250aEVsXzEpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICB2YXIgY291bnRzID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgc3RhdGVfMS5h',\n      'bGxFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IGUgJiYgZS5zdGFydDsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5kID0gZSAmJiAoZS5lbmQgfHwgZS5zdGFydCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFydCB8fCAhZW5kIHx8IGVuZCA8IG5vdykKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBldmVudE1vbnRoS2V5KHN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWtleSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGNvdW50cy5zZXQoa2V5LCAoY291bnRzLmdldChrZXkpIHx8IDApICsgMSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBrZXlzID0gQXJyYXkuZnJvbShjb3VudHMua2V5cygpKS5zb3J0KCk7CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXMgPSBzdGF0ZV8xLnNlbGVjdGVkTW9udGggfHwgJ2FueSc7CiAgICAgICAgICAgICAgICBtb250aEVsXzEuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9ImFueSI+QWxsIHVwY29taW5nIG1vbnRoczwvb3B0aW9uPicgKyBrZXlzLm1hcChmdW5jdGlvbiAoa2V5KSB7IHJldHVybiAnPG9wdGlvbiB2YWx1ZT0iJyArIGVzY2FwZUh0bWwoa2V5KSArICciPicgKyBlc2NhcGVIdG1sKG1vbnRoTGFiZWwoa2V5KSkgKyAnICgnICsgY291bnRzLmdldChrZXkpICsgJyk8L29wdGlvbj4nOyB9KS5qb2luKCcnKTsKICAgICAgICAgICAgICAgIGlmIChwcmV2aW91cyAhPT0gJ2FueScgJiYgY291bnRzLmhhcyhwcmV2aW91cykpIHsKICAgICAgICAgICAgICAgICAgICBtb250aEVsXzEudmFsdWUgPSBwcmV2aW91czsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWRNb250aCA9ICdhbnknOwogICAgICAgICAgICAgICAgICAgIG1vbnRoRWxfMS52YWx1ZSA9ICdhbnknOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBvcHVsYXRlV2Vla1NlbGVjdCgpIHsKICAgICAgICAgICAgICAgIGlmICghd2Vla0VsXzEpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICB2YXIgY291bnRzID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgc3RhdGVfMS5hbGxFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IGUgJiYgZS5zdGFydDsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5kID0gZSAmJiAoZS5lbmQgfHwgZS5zdGFydCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFydCB8fCAhZW5kIHx8IGVuZCA8IG5vdykKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSBldmVudFdlZWtLZXkoc3RhcnQpOwogICAgICAgICAgICAgICAgICAgIGlmICgha2V5KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgY291bnRzLnNldChrZXksIChj',\n      'b3VudHMuZ2V0KGtleSkgfHwgMCkgKyAxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIGtleXMgPSBBcnJheS5mcm9tKGNvdW50cy5rZXlzKCkpLnNvcnQoKTsKICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IHN0YXRlXzEuc2VsZWN0ZWRXZWVrIHx8ICdhbnknOwogICAgICAgICAgICAgICAgd2Vla0VsXzEuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9ImFueSI+QWxsIHVwY29taW5nIHdlZWtzPC9vcHRpb24+JyArIGtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuICc8b3B0aW9uIHZhbHVlPSInICsgZXNjYXBlSHRtbChrZXkpICsgJyI+JyArIGVzY2FwZUh0bWwod2Vla0xhYmVsKGtleSkpICsgJyAoJyArIGNvdW50cy5nZXQoa2V5KSArICcpPC9vcHRpb24+JzsgfSkuam9pbignJyk7CiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXMgIT09ICdhbnknICYmIGNvdW50cy5oYXMocHJldmlvdXMpKSB7CiAgICAgICAgICAgICAgICAgICAgd2Vla0VsXzEudmFsdWUgPSBwcmV2aW91czsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWRXZWVrID0gJ2FueSc7CiAgICAgICAgICAgICAgICAgICAgd2Vla0VsXzEudmFsdWUgPSAnYW55JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBiYXNlRmlsdGVyZWRFdmVudHNGb3JEYXRlQ29udHJvbHMoKSB7CiAgICAgICAgICAgICAgICB2YXIgbm93ID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgIHZhciBldnMgPSBzdGF0ZV8xLmFsbEV2ZW50cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIChlLmVuZCB8fCBlLnN0YXJ0KSAmJiAoZS5lbmQgfHwgZS5zdGFydCkgPj0gbm93OyB9KTsKICAgICAgICAgICAgICAgIGV2cyA9IGV2cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGlzQ291bnRyeUV2ZW50KGUsIHN0YXRlXzEuY291bnRyeSk7IH0pOwogICAgICAgICAgICAgICAgZXZzID0gZXZzLmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gaXNSZWdpb25FdmVudChlLCBzdGF0ZV8xLnJlZ2lvbik7IH0pOwogICAgICAgICAgICAgICAgaWYgKHN0YXRlXzEudHlwZSAhPT0gJ2FsbCcpIHsKICAgICAgICAgICAgICAgICAgICBldnMgPSBldnMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLnR5cGVLZXkgPT09IHN0YXRlXzEudHlwZSB8fCAoc3RhdGVfMS50eXBlID09PSAnY291cnNlJyAmJiAvd29ya3Nob3B8Y291cnNlfGtsYXNzfGNsYXNzL2kudGVzdChlLnR5cGVMYWJlbCkpIHx8IChzdGF0ZV8xLnR5cGUgPT09ICdtaWxvbmdhJyAmJiAvbWlsb25nYXxzb2NpYWwvaS50ZXN0KGUudHlwZUxhYmVsKSk7IH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHEgPSBzdGF0ZV8xLnNlYXJjaC50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgIGlmIChxKSB7CiAgICAgICAgICAgICAgICAgICAgZXZzID0gZXZzLmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gW2UudGl0bGUsIGUuY2l0eSwgZS5sb2NhdGlvbiwgZS5vcmdhbml6ZXIsIGUudHlwZUxhYmVsLCBlLmRlc2NyaXB0aW9uVGV4dF0uam9pbignICcpLnRv',\n      'TG93ZXJDYXNlKCkuaW5jbHVkZXMocSk7IH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN0YXRlXzEuc3RhcnRUaW1lICYmIHN0YXRlXzEuc3RhcnRUaW1lICE9PSAnYW55JykKICAgICAgICAgICAgICAgICAgICBldnMgPSBldnMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBtYXRjaGVzU3RhcnRUaW1lKGUsIHN0YXRlXzEuc3RhcnRUaW1lKTsgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZXZzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbmRlck1vbnRoUmFpbCgpIHsKICAgICAgICAgICAgICAgIGlmICghbW9udGhSYWlsXzEpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgdmFyIGNvdW50cyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgIGJhc2VGaWx0ZXJlZEV2ZW50c0ZvckRhdGVDb250cm9scygpLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZXZlbnRNb250aEtleShlLnN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuc2V0KGtleSwgKGNvdW50cy5nZXQoa2V5KSB8fCAwKSArIDEpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIga2V5cyA9IEFycmF5LmZyb20oY291bnRzLmtleXMoKSkuc29ydCgpLnNsaWNlKDAsIDEyKTsKICAgICAgICAgICAgICAgIGlmICgha2V5cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBtb250aFJhaWxfMS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgICAgIG1vbnRoUmFpbF8xLmlubmVySFRNTCA9ICcnOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1vbnRoUmFpbF8xLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICAgICAgICAgIHZhciBwaWxscyA9IGtleXMubWFwKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgYWN0aXZlID0gc3RhdGVfMS5zZWxlY3RlZE1vbnRoID09PSBrZXkgPyAnIGlzLWFjdGl2ZScgOiAnJzsKICAgICAgICAgICAgICAgICAgICB2YXIgc2hvcnQgPSBtb250aExhYmVsKGtleSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICI8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInR0LW1vbnRoLXBpbGwiLmNvbmNhdChhY3RpdmUsICJcIiBkYXRhLW1vbnRoPVwiIikuY29uY2F0KGVzY2FwZUh0bWwoa2V5KSwgIlwiPiIpLmNvbmNhdChlc2NhcGVIdG1sKHNob3J0KSwgIiAtICIpLmNvbmNhdChjb3VudHMuZ2V0KGtleSksICI8L2J1dHRvbj4iKTsKICAgICAgICAgICAgICAgIH0pLmpvaW4oJycpOwogICAgICAgICAgICAgICAgbW9udGhSYWlsXzEuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9XCJ0dC1tb250aC1yYWlsLWhlYWRcIj48c3Ryb25nPkJyb3dzZSBieSBtb250aDwvc3Ryb25nPjxzcGFuPlVzZWZ1bCB3aGVuIHBsYW5uaW5nIGFoZWFkPC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9XCJ0dC1tb250aC1yYWlsLWlubmVyXCI+PGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0dC1tb250aC1waWxsICIuY29uY2F0KHN0YXRlXzEuc2VsZWN0ZWRNb250',\n      'aCA9PT0gJ2FueScgPyAnaXMtYWN0aXZlJyA6ICcnLCAiXCIgZGF0YS1tb250aD1cImFueVwiPkFsbCBtb250aHM8L2J1dHRvbj4iKS5jb25jYXQocGlsbHMsICI8L2Rpdj4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBzZXRNaW5pQ2FsZW5kYXJNb250aEZyb21Nb250aEtleShrZXkpIHsKICAgICAgICAgICAgICAgIHZhciBtID0gU3RyaW5nKGtleSB8fCAnJykubWF0Y2goL14oXGR7NH0pLShcZHsyfSkkLyk7CiAgICAgICAgICAgICAgICBpZiAobSkKICAgICAgICAgICAgICAgICAgICBtaW5pQ2FsZW5kYXJDdXJzb3JfMSA9IG5ldyBEYXRlKE51bWJlcihtWzFdKSwgTnVtYmVyKG1bMl0pIC0gMSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gc2V0TWluaUNhbGVuZGFyTW9udGhGcm9tRGF5S2V5KGtleSkgewogICAgICAgICAgICAgICAgdmFyIG0gPSBTdHJpbmcoa2V5IHx8ICcnKS5tYXRjaCgvXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pJC8pOwogICAgICAgICAgICAgICAgaWYgKG0pCiAgICAgICAgICAgICAgICAgICAgbWluaUNhbGVuZGFyQ3Vyc29yXzEgPSBuZXcgRGF0ZShOdW1iZXIobVsxXSksIE51bWJlcihtWzJdKSAtIDEsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHNldENhbGVuZGFyUGlja01vZGUobW9kZSkgewogICAgICAgICAgICAgICAgaWYgKG1pbmlDYWxlbmRhckhlbHApCiAgICAgICAgICAgICAgICAgICAgbWluaUNhbGVuZGFySGVscC50ZXh0Q29udGVudCA9ICdUYXAgZGF5L3dlZWsvbW9udGggdG8gZmlsdGVyJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBkYXRlRnJvbURheUtleShrZXkpIHsKICAgICAgICAgICAgICAgIHZhciBtID0gU3RyaW5nKGtleSB8fCAnJykubWF0Y2goL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KSQvKTsKICAgICAgICAgICAgICAgIGlmICghbSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShOdW1iZXIobVsxXSksIE51bWJlcihtWzJdKSAtIDEsIE51bWJlcihtWzNdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gc2VsZWN0RGF5RnJvbUNhbGVuZGFyKGRheUtleSkgewogICAgICAgICAgICAgICAgdmFyIGQgPSBkYXRlRnJvbURheUtleShkYXlLZXkpOwogICAgICAgICAgICAgICAgaWYgKCFkKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWREYXkgPSBldmVudERheUtleShkKTsKICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWRNb250aCA9ICdhbnknOwogICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZFdlZWsgPSAnYW55JzsKICAgICAgICAgICAgICAgIHN0YXRlXzEudGltZSA9ICd1cGNvbWluZyc7CiAgICAgICAgICAgICAgICBzZXRNaW5pQ2FsZW5kYXJNb250aEZyb21EYXlLZXkoc3RhdGVfMS5zZWxlY3RlZERheSk7CiAgICAgICAgICAgICAgICBpZiAobW9udGhFbF8xKQogICAgICAgICAgICAgICAgICAgIG1vbnRoRWxfMS52YWx1ZSA9ICdhbnknOwogICAgICAgICAgICAgICAgaWYgKHdlZWtFbF8xKQogICAgICAgICAgICAgICAgICAgIHdlZWtFbF8xLnZhbHVlID0gJ2FueSc7',\n      'CiAgICAgICAgICAgICAgICBzZXRJbml0aWFsQ2hpcCgnI3R0LXRpbWUtZmlsdGVycycsICd0aW1lJywgc3RhdGVfMS50aW1lKTsKICAgICAgICAgICAgICAgIHNhdmVGaWx0ZXJzKCk7CiAgICAgICAgICAgICAgICBhcHBseUZpbHRlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBzZWxlY3RXZWVrRnJvbUNhbGVuZGFyKHdlZWtLZXkpIHsKICAgICAgICAgICAgICAgIGlmICghd2Vla0tleSB8fCB3ZWVrS2V5ID09PSAnYW55JykKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICBzdGF0ZV8xLnNlbGVjdGVkV2VlayA9IHdlZWtLZXk7CiAgICAgICAgICAgICAgICBzdGF0ZV8xLnNlbGVjdGVkTW9udGggPSAnYW55JzsKICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWREYXkgPSAnYW55JzsKICAgICAgICAgICAgICAgIHN0YXRlXzEudGltZSA9ICd1cGNvbWluZyc7CiAgICAgICAgICAgICAgICBzZXRNaW5pQ2FsZW5kYXJNb250aEZyb21EYXlLZXkod2Vla0tleSk7CiAgICAgICAgICAgICAgICBpZiAobW9udGhFbF8xKQogICAgICAgICAgICAgICAgICAgIG1vbnRoRWxfMS52YWx1ZSA9ICdhbnknOwogICAgICAgICAgICAgICAgaWYgKHdlZWtFbF8xKQogICAgICAgICAgICAgICAgICAgIHdlZWtFbF8xLnZhbHVlID0gd2Vla0tleTsKICAgICAgICAgICAgICAgIHNldEluaXRpYWxDaGlwKCcjdHQtdGltZS1maWx0ZXJzJywgJ3RpbWUnLCBzdGF0ZV8xLnRpbWUpOwogICAgICAgICAgICAgICAgc2F2ZUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHNlbGVjdFZpc2libGVDYWxlbmRhck1vbnRoKCkgewogICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZE1vbnRoID0gZXZlbnRNb250aEtleShuZXcgRGF0ZShtaW5pQ2FsZW5kYXJDdXJzb3JfMS5nZXRGdWxsWWVhcigpLCBtaW5pQ2FsZW5kYXJDdXJzb3JfMS5nZXRNb250aCgpLCAxKSk7CiAgICAgICAgICAgICAgICBzdGF0ZV8xLnNlbGVjdGVkV2VlayA9ICdhbnknOwogICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZERheSA9ICdhbnknOwogICAgICAgICAgICAgICAgc3RhdGVfMS50aW1lID0gJ3VwY29taW5nJzsKICAgICAgICAgICAgICAgIGlmIChtb250aEVsXzEpCiAgICAgICAgICAgICAgICAgICAgbW9udGhFbF8xLnZhbHVlID0gc3RhdGVfMS5zZWxlY3RlZE1vbnRoOwogICAgICAgICAgICAgICAgaWYgKHdlZWtFbF8xKQogICAgICAgICAgICAgICAgICAgIHdlZWtFbF8xLnZhbHVlID0gJ2FueSc7CiAgICAgICAgICAgICAgICBzZXRJbml0aWFsQ2hpcCgnI3R0LXRpbWUtZmlsdGVycycsICd0aW1lJywgc3RhdGVfMS50aW1lKTsKICAgICAgICAgICAgICAgIHNhdmVGaWx0ZXJzKCk7CiAgICAgICAgICAgICAgICBhcHBseUZpbHRlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW5kZXJNaW5pQ2FsZW5kYXIoKSB7CiAgICAgICAgICAgICAgICBpZiAoIW1pbmlDYWxlbmRhckdyaWQgfHwgIW1pbmlDYWxlbmRhclRpdGxlKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIHZhciB5ZWFyID0gbWluaUNhbGVuZGFyQ3Vyc29yXzEu',\n      'Z2V0RnVsbFllYXIoKTsKICAgICAgICAgICAgICAgIHZhciBtb250aCA9IG1pbmlDYWxlbmRhckN1cnNvcl8xLmdldE1vbnRoKCk7CiAgICAgICAgICAgICAgICBtaW5pQ2FsZW5kYXJUaXRsZS50ZXh0Q29udGVudCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUdCJywgeyBtb250aDogJ2xvbmcnLCB5ZWFyOiAnbnVtZXJpYycgfSk7CiAgICAgICAgICAgICAgICBpZiAobWluaVRpdGxlQnRuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vbnRoS2V5ID0gZXZlbnRNb250aEtleShuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSkpOwogICAgICAgICAgICAgICAgICAgIG1pbmlUaXRsZUJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdpcy1zZWxlY3RlZC1tb250aC10aXRsZScsIHN0YXRlXzEuc2VsZWN0ZWRNb250aCA9PT0gbW9udGhLZXkpOwogICAgICAgICAgICAgICAgICAgIG1pbmlUaXRsZUJ0bi5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCAnU2hvdyBhbGwgZXZlbnRzIGluICcgKyBtaW5pQ2FsZW5kYXJUaXRsZS50ZXh0Q29udGVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY291bnRzID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgdmFyIHdlZWtDb3VudHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICBiYXNlRmlsdGVyZWRFdmVudHNGb3JEYXRlQ29udHJvbHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlLnN0YXJ0KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGV2ZW50RGF5S2V5KGUuc3RhcnQpOwogICAgICAgICAgICAgICAgICAgIHZhciB3ayA9IGV2ZW50V2Vla0tleShlLnN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICBjb3VudHMuc2V0KGtleSwgKGNvdW50cy5nZXQoa2V5KSB8fCAwKSArIDEpOwogICAgICAgICAgICAgICAgICAgIHdlZWtDb3VudHMuc2V0KHdrLCAod2Vla0NvdW50cy5nZXQod2spIHx8IDApICsgMSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxKTsKICAgICAgICAgICAgICAgIHZhciBvZmZzZXQgPSAoZmlyc3QuZ2V0RGF5KCkgKyA2KSAlIDc7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMSAtIG9mZnNldCk7CiAgICAgICAgICAgICAgICB2YXIgdG9kYXkgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgdG9kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICAgICB2YXIgY2VsbHMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IDY7IHJvdysrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vbmRheSA9IG5ldyBEYXRlKHN0YXJ0LmdldEZ1bGxZZWFyKCksIHN0YXJ0LmdldE1vbnRoKCksIHN0YXJ0LmdldERhdGUoKSArIHJvdyAqIDcpOwogICAgICAgICAgICAgICAgICAgIHZhciB3ZWVrS2V5ID0gZXZlbnRXZWVrS2V5KG1vbmRheSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdlZWtFbmQgPSBuZXcgRGF0ZShtb25kYXkuZ2V0RnVsbFllYXIoKSwgbW9uZGF5LmdldE1vbnRoKCksIG1v',\n      'bmRheS5nZXREYXRlKCkgKyA2KTsKICAgICAgICAgICAgICAgICAgICB2YXIgd2Vla1Bhc3QgPSB3ZWVrRW5kIDwgdG9kYXk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdlZWtDb3VudCA9IHdlZWtDb3VudHMuZ2V0KHdlZWtLZXkpIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdlZWtDbHMgPSBbJ3R0LW1pbmktd2Vlay1idG4nXTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS5zZWxlY3RlZFdlZWsgIT09ICdhbnknICYmIHN0YXRlXzEuc2VsZWN0ZWRXZWVrID09PSB3ZWVrS2V5KQogICAgICAgICAgICAgICAgICAgICAgICB3ZWVrQ2xzLnB1c2goJ2lzLXNlbGVjdGVkLXdlZWsnKTsKICAgICAgICAgICAgICAgICAgICBpZiAod2Vla1Bhc3QpCiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtDbHMucHVzaCgnaXMtcGFzdCcpOwogICAgICAgICAgICAgICAgICAgIGlmICh3ZWVrQ291bnQpCiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtDbHMucHVzaCgnaGFzLWV2ZW50cycpOwogICAgICAgICAgICAgICAgICAgIHZhciB3ZWVrQ291bnRBdHRyID0gd2Vla0NvdW50ID8gJyBkYXRhLWNvdW50PSInICsgKHdlZWtDb3VudCA+IDkgPyAnOSsnIDogd2Vla0NvdW50KSArICciJyA6ICcnOwogICAgICAgICAgICAgICAgICAgIHZhciB3ZWVrRGlzYWJsZWQgPSB3ZWVrUGFzdCA\/ICcgZGlzYWJsZWQgYXJpYS1kaXNhYmxlZD0idHJ1ZSInIDogJyc7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdlZWtBcmlhID0gJ1Nob3cgd2VlayAnICsgaXNvV2Vla051bWJlcihtb25kYXkpICsgKHdlZWtDb3VudCA\/ICcgLSAnICsgd2Vla0NvdW50ICsgJyBldmVudCcgKyAod2Vla0NvdW50ID09PSAxID8gJycgOiAncycpIDogJycpOwogICAgICAgICAgICAgICAgICAgIGNlbGxzLnB1c2goJzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iJyArIHdlZWtDbHMuam9pbignICcpICsgJyIgZGF0YS13ZWVrPSInICsgZXNjYXBlSHRtbCh3ZWVrS2V5KSArICciJyArIHdlZWtDb3VudEF0dHIgKyB3ZWVrRGlzYWJsZWQgKyAnIGFyaWEtbGFiZWw9IicgKyBlc2NhcGVIdG1sKHdlZWtBcmlhKSArICciPicgKyBpc29XZWVrTnVtYmVyKG1vbmRheSkgKyAnPC9idXR0b24+Jyk7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgNzsgY29sKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZShzdGFydC5nZXRGdWxsWWVhcigpLCBzdGFydC5nZXRNb250aCgpLCBzdGFydC5nZXREYXRlKCkgKyByb3cgKiA3ICsgY29sKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGtleSA9IGV2ZW50RGF5S2V5KGQpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBjb3VudHMuZ2V0KGtleSkgfHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzT3V0c2lkZSA9IGQuZ2V0TW9udGgoKSAhPT0gbW9udGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkMCA9IG5ldyBEYXRlKGQuZ2V0RnVsbFllYXIoKSwgZC5nZXRNb250aCgpLCBkLmdldERhdGUoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1Bhc3QgPSBkMCA8IHRvZGF5OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNUb2RheSA9IGQwLmdldFRpbWUo',\n      'KSA9PT0gdG9kYXkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNTZWxlY3RlZCA9IHN0YXRlXzEuc2VsZWN0ZWREYXkgPT09IGtleTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzU2VsZWN0ZWRXZWVrID0gc3RhdGVfMS5zZWxlY3RlZFdlZWsgIT09ICdhbnknICYmIGV2ZW50V2Vla0tleShkKSA9PT0gc3RhdGVfMS5zZWxlY3RlZFdlZWs7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1NlbGVjdGVkTW9udGggPSBzdGF0ZV8xLnNlbGVjdGVkTW9udGggIT09ICdhbnknICYmIGV2ZW50TW9udGhLZXkoZCkgPT09IHN0YXRlXzEuc2VsZWN0ZWRNb250aCAmJiAhaXNPdXRzaWRlOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2xzID0gWyd0dC1taW5pLWRheSddOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNPdXRzaWRlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLnB1c2goJ2lzLW91dHNpZGUnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGFzdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5wdXNoKCdpcy1wYXN0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5wdXNoKCdoYXMtZXZlbnRzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RvZGF5KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLnB1c2goJ2lzLXRvZGF5Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xzLnB1c2goJ2lzLXNlbGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkV2VlaykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNscy5wdXNoKCdpcy1zZWxlY3RlZC13ZWVrJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkTW9udGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMucHVzaCgnaXMtc2VsZWN0ZWQtbW9udGgnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvdW50QXR0ciA9IGNvdW50ID8gJyBkYXRhLWNvdW50PSInICsgKGNvdW50ID4gOSA\/ICc5KycgOiBjb3VudCkgKyAnIicgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpc2FibGVkID0gaXNQYXN0ID8gJyBkaXNhYmxlZCBhcmlhLWRpc2FibGVkPSJ0cnVlIicgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRheUFyaWEgPSBkYXlMYWJlbChrZXkpICsgKGNvdW50ID8gJyAtICcgKyBjb3VudCArICcgZXZlbnQnICsgKGNvdW50ID09PSAxID8gJycgOiAncycpIDogJycpOwogICAgICAgICAgICAgICAgICAgICAgICBjZWxscy5wdXNoKCc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IicgKyBjbHMuam9pbignICcpICsgJyIgZGF0YS1kYXk9IicgKyBlc2NhcGVIdG1sKGtleSkgKyAnIicgKyBjb3VudEF0dHIgKyBkaXNhYmxlZCArICcgYXJpYS1sYWJlbD0iJyArIGVzY2FwZUh0bWwoZGF5QXJpYSkgKyAnIj4nICsgZC5nZXREYXRlKCkgKyAnPC9idXR0b24+Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWlu',\n      'aUNhbGVuZGFyR3JpZC5pbm5lckhUTUwgPSBjZWxscy5qb2luKCcnKTsKICAgICAgICAgICAgICAgIHNldENhbGVuZGFyUGlja01vZGUoc3RhdGVfMS5jYWxlbmRhclBpY2tNb2RlIHx8ICdkYXknKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBsYWJlbEZvckNoaXAoc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgIHZhciBhY3RpdmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yICsgJyAudHQtY2hpcC5pcy1hY3RpdmUnKTsKICAgICAgICAgICAgICAgIHJldHVybiBhY3RpdmUgPyBhY3RpdmUudGV4dENvbnRlbnQudHJpbSgpIDogJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gc2VsZWN0ZWREYXRlTGFiZWwoKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS5zZWxlY3RlZERheSAmJiBzdGF0ZV8xLnNlbGVjdGVkRGF5ICE9PSAnYW55JykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF5TGFiZWwoc3RhdGVfMS5zZWxlY3RlZERheSk7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS5zZWxlY3RlZFdlZWsgJiYgc3RhdGVfMS5zZWxlY3RlZFdlZWsgIT09ICdhbnknKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB3ZWVrTGFiZWwoc3RhdGVfMS5zZWxlY3RlZFdlZWspOwogICAgICAgICAgICAgICAgaWYgKHN0YXRlXzEuc2VsZWN0ZWRNb250aCAmJiBzdGF0ZV8xLnNlbGVjdGVkTW9udGggIT09ICdhbnknKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBtb250aExhYmVsKHN0YXRlXzEuc2VsZWN0ZWRNb250aCk7CiAgICAgICAgICAgICAgICByZXR1cm4gbGFiZWxGb3JDaGlwKCcjdHQtdGltZS1maWx0ZXJzJykgfHwgJ0FsbCB1cGNvbWluZyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcmVzdWx0U3VtbWFyeSh0b3RhbCkgewogICAgICAgICAgICAgICAgaWYgKCF0b3RhbCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ05vIGV2ZW50cyBmb3VuZCc7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS51aU1vZGUgPT09ICdzaW1wbGUnKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyZWEgPSBkZWZhdWx0QXJlYV8xICYmIGRlZmF1bHRBcmVhXzEubGFiZWwgPyBkZWZhdWx0QXJlYV8xLmxhYmVsIDogJ3RoaXMgYXJlYSc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBsdXJhbGl6ZSh0b3RhbCwgJ2V2ZW50JywgJ2V2ZW50cycpICsgJyBpbiAnICsgYXJlYTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAnU2hvd2luZyAnICsgTWF0aC5taW4odG90YWwsIHN0YXRlXzEubGltaXQpICsgJyBvZiAnICsgdG90YWwgKyAnIGV2ZW50cyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcmVuZGVyQWN0aXZlRmlsdGVycygpIHsKICAgICAgICAgICAgICAgIGlmICghYWN0aXZlRmlsdGVyQmFyXzEpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgdmFyIGl0ZW1zID0gW107CiAgICAgICAgICAgICAgICB2YXIgY291bnRyeSA9IGxhYmVsRm9yQ2hpcCgnI3R0LWNvdW50cnktZmlsdGVycycpOwogICAgICAgICAgICAgICAgdmFyIHJlZ2lvbiA9IGxhYmVsRm9yQ2hpcCgnI3R0LXJlZ2lvbi1maWx0ZXJzJyk7CiAgICAgICAgICAg',\n      'ICAgICB2YXIgdHlwZSA9IGxhYmVsRm9yQ2hpcCgnI3R0LXR5cGUtZmlsdGVycycpOwogICAgICAgICAgICAgICAgdmFyIHRpbWUgPSBsYWJlbEZvckNoaXAoJyN0dC10aW1lLWZpbHRlcnMnKTsKICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5KQogICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goWydDb3VudHJ5JywgY291bnRyeV0pOwogICAgICAgICAgICAgICAgaWYgKHJlZ2lvbikKICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKFsnQ2l0eScsIHJlZ2lvbl0pOwogICAgICAgICAgICAgICAgaWYgKHR5cGUgJiYgdHlwZSAhPT0gJ0FsbCBmb3JtYXRzJykKICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKFsnVHlwZScsIHR5cGVdKTsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZV8xLnNlbGVjdGVkRGF5ICYmIHN0YXRlXzEuc2VsZWN0ZWREYXkgIT09ICdhbnknKQogICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goWydEYXknLCBkYXlMYWJlbChzdGF0ZV8xLnNlbGVjdGVkRGF5KV0pOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGVfMS5zZWxlY3RlZFdlZWsgJiYgc3RhdGVfMS5zZWxlY3RlZFdlZWsgIT09ICdhbnknKQogICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goWydXZWVrJywgd2Vla0xhYmVsKHN0YXRlXzEuc2VsZWN0ZWRXZWVrKV0pOwogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGVfMS5zZWxlY3RlZE1vbnRoICYmIHN0YXRlXzEuc2VsZWN0ZWRNb250aCAhPT0gJ2FueScpCiAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaChbJ01vbnRoJywgbW9udGhMYWJlbChzdGF0ZV8xLnNlbGVjdGVkTW9udGgpXSk7CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aW1lICYmIHRpbWUgIT09ICdBbGwgdXBjb21pbmcnKQogICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goWydXaGVuJywgdGltZV0pOwogICAgICAgICAgICAgICAgaWYgKHN0YXRlXzEuc3RhcnRUaW1lICYmIHN0YXRlXzEuc3RhcnRUaW1lICE9PSAnYW55JykgewogICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IHN0YXJ0VGltZUVsXzEgJiYgc3RhcnRUaW1lRWxfMS5zZWxlY3RlZE9wdGlvbnMgJiYgc3RhcnRUaW1lRWxfMS5zZWxlY3RlZE9wdGlvbnNbMF0gPyBzdGFydFRpbWVFbF8xLnNlbGVjdGVkT3B0aW9uc1swXS50ZXh0Q29udGVudC50cmltKCkgOiBzdGF0ZV8xLnN0YXJ0VGltZTsKICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKFsnU3RhcnQnLCBsYWJlbF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHN0YXRlXzEuc2VhcmNoLnRyaW0oKSkKICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKFsnU2VhcmNoJywgc3RhdGVfMS5zZWFyY2gudHJpbSgpXSk7CiAgICAgICAgICAgICAgICBhY3RpdmVGaWx0ZXJCYXJfMS5pbm5lckhUTUwgPSBpdGVtcy5tYXAoZnVuY3Rpb24gKF9hKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGsgPSBfYVswXSwgdiA9IF9hWzFdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAiPHNwYW4gY2xhc3M9XCJ0dC1hY3RpdmUtcGlsbFwiPjxzdHJvbmc+Ii5jb25jYXQoZXNjYXBlSHRtbChrKSwgIjo8L3N0cm9uZz4gIikuY29uY2F0KGVzY2FwZUh0bWwodiksICI8L3NwYW4+Iik7CiAgICAgICAgICAg',\n      'ICAgICB9KS5qb2luKCcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiB1cGRhdGVNb2JpbGVTdW1tYXJ5KCkgewogICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJTdW1tYXJ5XzEpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgdmFyIHBhcnRzID0gW107CiAgICAgICAgICAgICAgICB2YXIgY291bnRyeSA9IGxhYmVsRm9yQ2hpcCgnI3R0LWNvdW50cnktZmlsdGVycycpOwogICAgICAgICAgICAgICAgdmFyIHJlZ2lvbiA9IGxhYmVsRm9yQ2hpcCgnI3R0LXJlZ2lvbi1maWx0ZXJzJykgfHwgJ1NrXHhlNW5lICsgQ29wZW5oYWdlbic7CiAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IGxhYmVsRm9yQ2hpcCgnI3R0LXR5cGUtZmlsdGVycycpIHx8ICdBbGwgZm9ybWF0cyc7CiAgICAgICAgICAgICAgICB2YXIgdGltZSA9IHNlbGVjdGVkRGF0ZUxhYmVsKCk7CiAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBzdGFydFRpbWVFbF8xICYmIHN0YXJ0VGltZUVsXzEuc2VsZWN0ZWRPcHRpb25zICYmIHN0YXJ0VGltZUVsXzEuc2VsZWN0ZWRPcHRpb25zWzBdID8gc3RhcnRUaW1lRWxfMS5zZWxlY3RlZE9wdGlvbnNbMF0udGV4dENvbnRlbnQudHJpbSgpIDogJyc7CiAgICAgICAgICAgICAgICB2YXIgbGltaXQgPSBsaW1pdEVsXzEgJiYgbGltaXRFbF8xLnNlbGVjdGVkT3B0aW9ucyAmJiBsaW1pdEVsXzEuc2VsZWN0ZWRPcHRpb25zWzBdID8gbGltaXRFbF8xLnNlbGVjdGVkT3B0aW9uc1swXS50ZXh0Q29udGVudC50cmltKCkgOiAnJzsKICAgICAgICAgICAgICAgIHZhciBxID0gc2VhcmNoRWxfMSAmJiBzZWFyY2hFbF8xLnZhbHVlID8gc2VhcmNoRWxfMS52YWx1ZS50cmltKCkgOiAnJzsKICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5KQogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goY291bnRyeSk7CiAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHJlZ2lvbiwgdHlwZSwgdGltZSk7CiAgICAgICAgICAgICAgICBpZiAoc3RhcnQgJiYgc3RhcnQgIT09ICdBbnkgc3RhcnQgdGltZScpCiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaChzdGFydCk7CiAgICAgICAgICAgICAgICBpZiAobGltaXQpCiAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaChsaW1pdCk7CiAgICAgICAgICAgICAgICBmaWx0ZXJTdW1tYXJ5XzEuaW5uZXJIVE1MID0gJzxzdHJvbmc+QWN0aXZlIGZpbHRlcnM6PC9zdHJvbmc+ICcgKyBlc2NhcGVIdG1sKHBhcnRzLmpvaW4oJyAtICcpKSArIChxID8gJzxicj48c3Ryb25nPlNlYXJjaDo8L3N0cm9uZz4gJyArIGVzY2FwZUh0bWwocSkgOiAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gY2xlYXJEYXRlU2VsZWN0aW9uKCkgewogICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZE1vbnRoID0gJ2FueSc7CiAgICAgICAgICAgICAgICBzdGF0ZV8xLnNlbGVjdGVkV2VlayA9ICdhbnknOwogICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZERheSA9ICdhbnknOwogICAgICAgICAgICAgICAgc3RhdGVfMS50aW1lID0gJ3VwY29taW5nJzsKICAgICAgICAgICAgICAgIGlmIChtb250aEVsXzEpCiAgICAgICAgICAgICAgICAgICAgbW9udGhFbF8xLnZhbHVlID0gJ2FueSc7CiAgICAgICAg',\n      'ICAgICAgICBpZiAod2Vla0VsXzEpCiAgICAgICAgICAgICAgICAgICAgd2Vla0VsXzEudmFsdWUgPSAnYW55JzsKICAgICAgICAgICAgICAgIHNldEluaXRpYWxDaGlwKCcjdHQtdGltZS1maWx0ZXJzJywgJ3RpbWUnLCBzdGF0ZV8xLnRpbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGN1cnJlbnRDYWxlbmRhck1vbnRoS2V5KCkgewogICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGQuZ2V0RnVsbFllYXIoKSArICctJyArIHBhZDIoZC5nZXRNb250aCgpICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gc2V0TW9udGhBZ2VuZGEobW9udGhLZXksIHByZXNlcnZlTW9kZSkgewogICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZE1vbnRoID0gbW9udGhLZXkgfHwgY3VycmVudENhbGVuZGFyTW9udGhLZXkoKTsKICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWRXZWVrID0gJ2FueSc7CiAgICAgICAgICAgICAgICBzdGF0ZV8xLnNlbGVjdGVkRGF5ID0gJ2FueSc7CiAgICAgICAgICAgICAgICBzdGF0ZV8xLnRpbWUgPSAndXBjb21pbmcnOwogICAgICAgICAgICAgICAgc3RhdGVfMS5saW1pdCA9IDk5OTsKICAgICAgICAgICAgICAgIHN0YXRlXzEudmlldyA9IHN0YXRlXzEudWlNb2RlID09PSAnbWFwJyA\/ICdtYXAnIDogJ2xpc3QnOwogICAgICAgICAgICAgICAgaWYgKCFwcmVzZXJ2ZU1vZGUpCiAgICAgICAgICAgICAgICAgICAgc3RhdGVfMS51aU1vZGUgPSAnc2ltcGxlJzsKICAgICAgICAgICAgICAgIHNldE1pbmlDYWxlbmRhck1vbnRoRnJvbU1vbnRoS2V5KHN0YXRlXzEuc2VsZWN0ZWRNb250aCk7CiAgICAgICAgICAgICAgICBpZiAobW9udGhFbF8xKQogICAgICAgICAgICAgICAgICAgIG1vbnRoRWxfMS52YWx1ZSA9IHN0YXRlXzEuc2VsZWN0ZWRNb250aDsKICAgICAgICAgICAgICAgIGlmICh3ZWVrRWxfMSkKICAgICAgICAgICAgICAgICAgICB3ZWVrRWxfMS52YWx1ZSA9ICdhbnknOwogICAgICAgICAgICAgICAgaWYgKGxpbWl0RWxfMSkKICAgICAgICAgICAgICAgICAgICBsaW1pdEVsXzEudmFsdWUgPSAnOTk5JzsKICAgICAgICAgICAgICAgIHNldEluaXRpYWxDaGlwKCcjdHQtdGltZS1maWx0ZXJzJywgJ3RpbWUnLCBzdGF0ZV8xLnRpbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHNoaWZ0U2ltcGxlTW9udGgoZGVsdGEpIHsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBzdGF0ZV8xLnNlbGVjdGVkTW9udGggJiYgc3RhdGVfMS5zZWxlY3RlZE1vbnRoICE9PSAnYW55JyA\/IHN0YXRlXzEuc2VsZWN0ZWRNb250aCA6IGN1cnJlbnRDYWxlbmRhck1vbnRoS2V5KCk7CiAgICAgICAgICAgICAgICB2YXIgbSA9IFN0cmluZyhrZXkpLm1hdGNoKC9eKFxkezR9KS0oXGR7Mn0pJC8pOwogICAgICAgICAgICAgICAgdmFyIGQgPSBtID8gbmV3IERhdGUoTnVtYmVyKG1bMV0pLCBOdW1iZXIobVsyXSkgLSAxICsgZGVsdGEsIDEpIDogbmV3IERhdGUoKTsKICAgICAgICAgICAgICAgIHNldE1vbnRoQWdlbmRhKGV2ZW50TW9udGhLZXkoZCksIHRydWUpOwogICAgICAgICAgICAgICAgc2F2ZUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVy',\n      'cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHNob3dTaW1wbGVDYWxlbmRhcigpIHsKICAgICAgICAgICAgICAgIHN0YXRlXzEuY291bnRyeSA9IGRlZmF1bHRBcmVhXzEuY291bnRyeTsKICAgICAgICAgICAgICAgIHN0YXRlXzEucmVnaW9uID0gZGVmYXVsdEFyZWFfMS5yZWdpb247CiAgICAgICAgICAgICAgICBzdGF0ZV8xLnR5cGUgPSAnYWxsJzsKICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VhcmNoID0gJyc7CiAgICAgICAgICAgICAgICBzdGF0ZV8xLnN0YXJ0VGltZSA9ICdhbnknOwogICAgICAgICAgICAgICAgc2V0TW9udGhBZ2VuZGEoc3RhdGVfMS5zZWxlY3RlZE1vbnRoICYmIHN0YXRlXzEuc2VsZWN0ZWRNb250aCAhPT0gJ2FueScgPyBzdGF0ZV8xLnNlbGVjdGVkTW9udGggOiBjdXJyZW50Q2FsZW5kYXJNb250aEtleSgpKTsKICAgICAgICAgICAgICAgIGlmIChzZWFyY2hFbF8xKQogICAgICAgICAgICAgICAgICAgIHNlYXJjaEVsXzEudmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgIGlmIChoZXJvU2VhcmNoRWxfMSkKICAgICAgICAgICAgICAgICAgICBoZXJvU2VhcmNoRWxfMS52YWx1ZSA9ICcnOwogICAgICAgICAgICAgICAgaWYgKHN0YXJ0VGltZUVsXzEpCiAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lRWxfMS52YWx1ZSA9ICdhbnknOwogICAgICAgICAgICAgICAgc2V0SW5pdGlhbENoaXAoJyN0dC1jb3VudHJ5LWZpbHRlcnMnLCAnY291bnRyeScsIHN0YXRlXzEuY291bnRyeSk7CiAgICAgICAgICAgICAgICB1cGRhdGVSZWdpb25PcHRpb25zRm9yQ291bnRyeSgpOwogICAgICAgICAgICAgICAgc2V0SW5pdGlhbENoaXAoJyN0dC1yZWdpb24tZmlsdGVycycsICdyZWdpb24nLCBzdGF0ZV8xLnJlZ2lvbik7CiAgICAgICAgICAgICAgICBzZXRJbml0aWFsQ2hpcCgnI3R0LXR5cGUtZmlsdGVycycsICd0eXBlJywgc3RhdGVfMS50eXBlKTsKICAgICAgICAgICAgICAgIHNhdmVGaWx0ZXJzKCk7CiAgICAgICAgICAgICAgICBhcHBseUZpbHRlcnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiB1cGRhdGVWaWV3TW9kZUJ1dHRvbnMoKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudHQtdmlldy1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZGUgPSBiLmRhdGFzZXQubW9kZSB8fCAoYi5kYXRhc2V0LnZpZXcgPT09ICdtYXAnID8gJ21hcCcgOiAnZmlsdGVycycpOwogICAgICAgICAgICAgICAgICAgIGIuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYWN0aXZlJywgbW9kZSA9PT0gc3RhdGVfMS51aU1vZGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlTW9yZURpc3BsYXlCdXR0b25zKCkgewogICAgICAgICAgICAgICAgbW9yZURpc3BsYXlCdXR0b25zXzEuZm9yRWFjaChmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgICAgICAgIGIuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYWN0aXZlJywgKGIuZGF0YXNldC5tb3JlRGlzcGxheSB8fCAnY2FsZW5kYXInKSA9PT0gKHN0YXRlXzEubW9yZUNob2ljZXNEaXNwbGF5IHx8ICdjYWxlbmRhcicpKTsKICAgICAgICAgICAgICAgIH0pOwogICAg',\n      'ICAgICAgICAgICAgaWYgKGNhbGVuZGFyU2VjdGlvbl8xKQogICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyU2VjdGlvbl8xLmNsYXNzTGlzdC50b2dnbGUoJ2lzLW1vcmUtbGlzdC1tb2RlJywgc3RhdGVfMS51aU1vZGUgPT09ICdmaWx0ZXJzJyAmJiBzdGF0ZV8xLm1vcmVDaG9pY2VzRGlzcGxheSA9PT0gJ2xpc3QnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiB1cGRhdGVTaW1wbGVCcm93c2VyKCkgewogICAgICAgICAgICAgICAgdmFyIHNpbXBsZU1vZGUgPSBzdGF0ZV8xLnVpTW9kZSA9PT0gJ3NpbXBsZSc7CiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyTW9kZSA9IHN0YXRlXzEudWlNb2RlID09PSAnZmlsdGVycyc7CiAgICAgICAgICAgICAgICBpZiAoY2FsZW5kYXJTZWN0aW9uXzEpIHsKICAgICAgICAgICAgICAgICAgICBjYWxlbmRhclNlY3Rpb25fMS5jbGFzc0xpc3QudG9nZ2xlKCdpcy1zaW1wbGUtbW9kZScsIHNpbXBsZU1vZGUpOwogICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyU2VjdGlvbl8xLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWZpbHRlci1tb2RlJywgZmlsdGVyTW9kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc2ltcGxlQnJvd3Nlcl8xKQogICAgICAgICAgICAgICAgICAgIHNpbXBsZUJyb3dzZXJfMS5zdHlsZS5kaXNwbGF5ID0gKHNpbXBsZU1vZGUgfHwgZmlsdGVyTW9kZSkgPyAnJyA6ICdub25lJzsKICAgICAgICAgICAgICAgIGlmIChzaW1wbGVNb250aExhYmVsXzEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gc3RhdGVfMS5zZWxlY3RlZE1vbnRoICYmIHN0YXRlXzEuc2VsZWN0ZWRNb250aCAhPT0gJ2FueScgPyBzdGF0ZV8xLnNlbGVjdGVkTW9udGggOiBjdXJyZW50Q2FsZW5kYXJNb250aEtleSgpOwogICAgICAgICAgICAgICAgICAgIHNpbXBsZU1vbnRoTGFiZWxfMS50ZXh0Q29udGVudCA9IG1vbnRoTGFiZWwoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVwZGF0ZVZpZXdNb2RlQnV0dG9ucygpOwogICAgICAgICAgICAgICAgdXBkYXRlTW9yZURpc3BsYXlCdXR0b25zKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcmVzZXRBbGxGaWx0ZXJzKCkgewogICAgICAgICAgICAgICAgc2hvd1NpbXBsZUNhbGVuZGFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gbWFrZUljcyhlKSB7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBkdChkKSB7IHJldHVybiBkLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvWy06XS9nLCAnJykuc3BsaXQoJy4nKVswXSArICdaJzsgfQogICAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gZS5zdGFydCB8fCBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgdmFyIGVuZCA9IGUuZW5kIHx8IG5ldyBEYXRlKHN0YXJ0LmdldFRpbWUoKSArIDIgKiA2MCAqIDYwICogMTAwMCk7CiAgICAgICAgICAgICAgICB2YXIgYm9keSA9IFsKICAgICAgICAgICAgICAgICAgICAnQkVHSU46VkNBTEVOREFSJywgJ1ZFUlNJT046Mi4wJywgJ1BST0RJRDotLy9UZXJlc2l0YSBUYW5nby8vUmVnaW9uYWwgQ2FsZW5kYXIvL0VOJywgJ0JFR0lOOlZFVkVOVCcsCiAgICAgICAgICAgICAgICAgICAgJ1VJRDonICsgU3RyaW5nKGUuaWQp',\n      'LnJlcGxhY2UoL1teYS16MC05QC4tXS9naSwgJycpICsgJ0B0ZXJlc2l0YXRhbmdvLnNlJywKICAgICAgICAgICAgICAgICAgICAnRFRTVEFNUDonICsgZHQobmV3IERhdGUoKSksCiAgICAgICAgICAgICAgICAgICAgJ0RUU1RBUlQ6JyArIGR0KHN0YXJ0KSwKICAgICAgICAgICAgICAgICAgICAnRFRFTkQ6JyArIGR0KGVuZCksCiAgICAgICAgICAgICAgICAgICAgJ1NVTU1BUlk6JyArIFN0cmluZyhlLnRpdGxlIHx8ICcnKS5yZXBsYWNlKC9cbi9nLCAnICcpLAogICAgICAgICAgICAgICAgICAgICdMT0NBVElPTjonICsgU3RyaW5nKGUubG9jYXRpb24gfHwgJycpLnJlcGxhY2UoL1xuL2csICcgJyksCiAgICAgICAgICAgICAgICAgICAgJ1VSTDonICsgZS5saW5rLAogICAgICAgICAgICAgICAgICAgICdFTkQ6VkVWRU5UJywgJ0VORDpWQ0FMRU5EQVInCiAgICAgICAgICAgICAgICBdLmpvaW4oJ1xyXG4nKTsKICAgICAgICAgICAgICAgIHJldHVybiAnZGF0YTp0ZXh0L2NhbGVuZGFyO2NoYXJzZXQ9dXRmLTgsJyArIGVuY29kZVVSSUNvbXBvbmVudChib2R5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBkZWR1cGVFdmVudHMoZXZlbnRzKSB7CiAgICAgICAgICAgICAgICB2YXIgc2VlbiA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgICAgIHJldHVybiBldmVudHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlIHx8ICFlLnN0YXJ0KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRheSA9IGUuc3RhcnQudG9JU09TdHJpbmcoKS5zbGljZSgwLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhobW0gPSBlLnRpbWVNaXNzaW5nID8gJ25vdGltZScgOiBlLnN0YXJ0LnRvVGltZVN0cmluZygpLnNsaWNlKDAsIDUpOwogICAgICAgICAgICAgICAgICAgIHZhciBjaXR5ID0gbm9ybWFsaXplTG9jYXRpb25UZXh0KGUuY2l0eSB8fCAnJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG9yZyA9IG5vcm1hbGl6ZUxvY2F0aW9uVGV4dChlLm9yZ2FuaXplciB8fCAnJyk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gbm9ybWFsaXplTG9jYXRpb25UZXh0KGUudGl0bGUgfHwgJycpCiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9bXmEtejAtOV0rL2csICcgJykKICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xiKG1pbG9uZ2F8Y2xhc3Nlc3xjbGFzc3xsZXNzb258d29ya3Nob3B8d2l0aHxvcGVufHRkanxkanxtYWxtb3xtYWxtb2V8bHVuZHxrb2Jlbmhhdm58Y29wZW5oYWdlbnxwcmFrdGlrYXxwcmFjdGljYXxzb2NpYWx8ZGFuY2UpXGIvZywgJycpCiAgICAgICAgICAgICAgICAgICAgICAgIC50cmltKCkKICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDAsIDQ4KTsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gW2RheSwgaGhtbSwgY2l0eSwgb3JnIHx8IHRpdGxlXS5qb2luKCd8Jyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW4uaGFzKGtleSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBzZWVuLmFkZChrZXkpOwogICAgICAgICAgICAgICAgICAgIHJldHVy',\n      'biB0cnVlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZXh0cmFjdFByaWNlKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBleHRyYWN0Tm90ZXMoZSkgewogICAgICAgICAgICAgICAgdmFyIHRleHQgPSBTdHJpbmcoZS5kZXNjcmlwdGlvblRleHQgfHwgJycpLnJlcGxhY2UoL1xzKy9nLCAnICcpLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmICghdGV4dCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB2YXIgdXNlZnVsID0gW107CiAgICAgICAgICAgICAgICB2YXIgY2hlY2tzID0gWwogICAgICAgICAgICAgICAgICAgIFsnbGl2ZSBtdXNpYycsIC9saXZlIG11c2ljfGxpdmVtdXNpa3xvcmNoZXN0cmF8b3JrZXN0ZXIvaV0sCiAgICAgICAgICAgICAgICAgICAgWydjbGFzcyBiZWZvcmUnLCAvY2xhc3MgYmVmb3JlfGxlc3NvbiBiZWZvcmV8bGVrdGlvbiBpbm5hbnxpbnRyby9pXSwKICAgICAgICAgICAgICAgICAgICBbJ0RKJywgL1xiREpcYnxUREovaV0sCiAgICAgICAgICAgICAgICAgICAgWydyZWdpc3RyYXRpb24nLCAvcmVnaXN0cmF0aW9ufHJlcXVpcmVkfGFubVx4ZTRsYW58YW5tYWxhbnxzaWdudXB8Ym9vay9pXSwKICAgICAgICAgICAgICAgICAgICBbJ3BhcmtpbmcnLCAvcGFya2luZ3xwYXJrZXJpbmcvaV0sCiAgICAgICAgICAgICAgICAgICAgWydjYXNoL3BheW1lbnQnLCAvY2FzaHxrb250YW50fG1vYmlsZXBheXxzd2lzaC9pXQogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIGNoZWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChfYSkgewogICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IF9hWzBdLCByeCA9IF9hWzFdOwogICAgICAgICAgICAgICAgICAgIGlmIChyeC50ZXN0KHRleHQpKQogICAgICAgICAgICAgICAgICAgICAgICB1c2VmdWwucHVzaChsYWJlbCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh1c2VmdWwubGVuZ3RoKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VmdWwuam9pbignIC0gJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGV4dC5zbGljZSgwLCAxMjApICsgKHRleHQubGVuZ3RoID4gMTIwID8gJ1x1MjAyNicgOiAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYXBwbHlGaWx0ZXJzKCkgewogICAgICAgICAgICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICB2YXIgZXZzID0gc3RhdGVfMS5hbGxFdmVudHMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiAoZS5lbmQgfHwgZS5zdGFydCkgJiYgKGUuZW5kIHx8IGUuc3RhcnQpID49IG5vdzsgfSk7CiAgICAgICAgICAgICAgICBpZiAoZXZzLmxlbmd0aCA9PT0gMCkKICAgICAgICAgICAgICAgICAgICBldnMgPSBzdGF0ZV8xLmFsbEV2ZW50cy5zbGljZSgpOwogICAgICAgICAgICAgICAgZXZzID0gZXZzLmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gaXNDb3VudHJ5RXZlbnQoZSwgc3RhdGVfMS5jb3VudHJ5KTsgfSk7CiAgICAgICAgICAgICAgICBldnMgPSBldnMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBpc1JlZ2lv',\n      'bkV2ZW50KGUsIHN0YXRlXzEucmVnaW9uKTsgfSk7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS5zZWxlY3RlZERheSAmJiBzdGF0ZV8xLnNlbGVjdGVkRGF5ICE9PSAnYW55JykKICAgICAgICAgICAgICAgICAgICBldnMgPSBldnMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBldmVudERheUtleShlLnN0YXJ0KSA9PT0gc3RhdGVfMS5zZWxlY3RlZERheTsgfSk7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS5zZWxlY3RlZE1vbnRoICYmIHN0YXRlXzEuc2VsZWN0ZWRNb250aCAhPT0gJ2FueScpCiAgICAgICAgICAgICAgICAgICAgZXZzID0gZXZzLmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZXZlbnRNb250aEtleShlLnN0YXJ0KSA9PT0gc3RhdGVfMS5zZWxlY3RlZE1vbnRoOyB9KTsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZV8xLnNlbGVjdGVkV2VlayAmJiBzdGF0ZV8xLnNlbGVjdGVkV2VlayAhPT0gJ2FueScpCiAgICAgICAgICAgICAgICAgICAgZXZzID0gZXZzLmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZXZlbnRXZWVrS2V5KGUuc3RhcnQpID09PSBzdGF0ZV8xLnNlbGVjdGVkV2VlazsgfSk7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS50eXBlICE9PSAnYWxsJykgewogICAgICAgICAgICAgICAgICAgIGV2cyA9IGV2cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGUudHlwZUtleSA9PT0gc3RhdGVfMS50eXBlIHx8IChzdGF0ZV8xLnR5cGUgPT09ICdjb3Vyc2UnICYmIC93b3Jrc2hvcHxjb3Vyc2V8a2xhc3N8Y2xhc3MvaS50ZXN0KGUudHlwZUxhYmVsKSkgfHwgKHN0YXRlXzEudHlwZSA9PT0gJ21pbG9uZ2EnICYmIC9taWxvbmdhfHNvY2lhbC9pLnRlc3QoZS50eXBlTGFiZWwpKTsgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS50aW1lID09PSAnd2VlaycpCiAgICAgICAgICAgICAgICAgICAgZXZzID0gZXZzLmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gaW5OZXh0RGF5cyhlLnN0YXJ0LCA3KTsgfSk7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS50aW1lID09PSAnbW9udGgnKQogICAgICAgICAgICAgICAgICAgIGV2cyA9IGV2cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIGluTmV4dERheXMoZS5zdGFydCwgMzApOyB9KTsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZV8xLnRpbWUgPT09ICd3ZWVrZW5kJykKICAgICAgICAgICAgICAgICAgICBldnMgPSBldnMuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBpc1VwY29taW5nV2Vla2VuZChlLnN0YXJ0KTsgfSk7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS5zdGFydFRpbWUgJiYgc3RhdGVfMS5zdGFydFRpbWUgIT09ICdhbnknKQogICAgICAgICAgICAgICAgICAgIGV2cyA9IGV2cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG1hdGNoZXNTdGFydFRpbWUoZSwgc3RhdGVfMS5zdGFydFRpbWUpOyB9KTsKICAgICAgICAgICAgICAgIHZhciBxID0gc3RhdGVfMS5zZWFyY2gudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICBpZiAocSkgewogICAgICAgICAgICAgICAgICAgIGV2cyA9IGV2cy5maWx0ZXIoZnVuY3Rpb24gKGUpIHsgcmV0dXJuIFtlLnRpdGxlLCBlLmNpdHksIGUubG9jYXRp',\n      'b24sIGUub3JnYW5pemVyLCBlLnR5cGVMYWJlbCwgZS5kZXNjcmlwdGlvblRleHRdLmpvaW4oJyAnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpOyB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGV2cy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiAoYS5zdGFydCB8fCAwKSAtIChiLnN0YXJ0IHx8IDApOyB9KTsKICAgICAgICAgICAgICAgIHN0YXRlXzEudmlzaWJsZUV2ZW50cyA9IGV2czsKICAgICAgICAgICAgICAgIHJlbmRlck1vbnRoUmFpbCgpOwogICAgICAgICAgICAgICAgcmVuZGVyTWluaUNhbGVuZGFyKCk7CiAgICAgICAgICAgICAgICByZW5kZXJBY3RpdmVGaWx0ZXJzKCk7CiAgICAgICAgICAgICAgICB1cGRhdGVTaW1wbGVCcm93c2VyKCk7CiAgICAgICAgICAgICAgICB1cGRhdGVNb2JpbGVTdW1tYXJ5KCk7CiAgICAgICAgICAgICAgICBpZiAoZGF0ZVBsYW5uZXJfMSkKICAgICAgICAgICAgICAgICAgICBkYXRlUGxhbm5lcl8xLm9wZW4gPSAoc3RhdGVfMS5zZWxlY3RlZERheSAhPT0gJ2FueScgfHwgc3RhdGVfMS5zZWxlY3RlZE1vbnRoICE9PSAnYW55JyB8fCBzdGF0ZV8xLnNlbGVjdGVkV2VlayAhPT0gJ2FueScgfHwgc3RhdGVfMS50aW1lICE9PSAndXBjb21pbmcnIHx8IHN0YXRlXzEuc3RhcnRUaW1lICE9PSAnYW55Jyk7CiAgICAgICAgICAgICAgICB2YXIgY2FsZW5kYXJCb2FyZE1vZGUgPSBzdGF0ZV8xLnVpTW9kZSA9PT0gJ3NpbXBsZScgfHwgKHN0YXRlXzEudWlNb2RlID09PSAnZmlsdGVycycgJiYgc3RhdGVfMS5tb3JlQ2hvaWNlc0Rpc3BsYXkgIT09ICdsaXN0Jyk7CiAgICAgICAgICAgICAgICB2YXIgc2hvd25FdmVudHMgPSBjYWxlbmRhckJvYXJkTW9kZSA\/IGV2cyA6IGV2cy5zbGljZSgwLCBzdGF0ZV8xLmxpbWl0KTsKICAgICAgICAgICAgICAgIHJlbmRlckV2ZW50cyhzaG93bkV2ZW50cyk7CiAgICAgICAgICAgICAgICByZW5kZXJNYXAoc2hvd25FdmVudHMpOwogICAgICAgICAgICAgICAgaWYgKGxpc3RFbF8xKQogICAgICAgICAgICAgICAgICAgIGxpc3RFbF8xLnN0eWxlLmRpc3BsYXkgPSBzdGF0ZV8xLnZpZXcgPT09ICdsaXN0JyA\/ICcnIDogJ25vbmUnOwogICAgICAgICAgICAgICAgaWYgKG1hcFBhbmVsXzEpCiAgICAgICAgICAgICAgICAgICAgbWFwUGFuZWxfMS5jbGFzc0xpc3QudG9nZ2xlKCdpcy12aXNpYmxlJywgc3RhdGVfMS52aWV3ID09PSAnbWFwJyk7CiAgICAgICAgICAgICAgICBpZiAoY2FsZW5kYXJTZWN0aW9uXzEpCiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJTZWN0aW9uXzEuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtbWFwLW1vZGUnLCBzdGF0ZV8xLnZpZXcgPT09ICdtYXAnKTsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZV8xLnZpZXcgPT09ICdtYXAnKQogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBpZiAobGVhZmxldE1hcF8xKQogICAgICAgICAgICAgICAgICAgICAgICBsZWFmbGV0TWFwXzEuaW52YWxpZGF0ZVNpemUoKTsgfSwgMTIwKTsKICAgICAgICAgICAgICAgIGlmIChjb3VudEVsXzEpCiAgICAgICAgICAgICAgICAgICAgY291bnRFbF8xLnRleHRDb250ZW50ID0gcmVzdWx0U3VtbWFyeShldnMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIHZhciBzaG93',\n      'TW9yZVdyYXAgPSAkXzEoJ3R0LXNob3ctbW9yZS13cmFwJyk7CiAgICAgICAgICAgICAgICBpZiAoc2hvd01vcmVXcmFwKQogICAgICAgICAgICAgICAgICAgIHNob3dNb3JlV3JhcC5zdHlsZS5kaXNwbGF5ID0gKCFjYWxlbmRhckJvYXJkTW9kZSAmJiBldnMubGVuZ3RoID4gc3RhdGVfMS5saW1pdCkgPyAnYmxvY2snIDogJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbGF0aXZlRGF5TGFiZWwoZGF0ZSkgewogICAgICAgICAgICAgICAgaWYgKCFkYXRlIHx8ICEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpIHx8IGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB2YXIgdG9kYXkgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgdG9kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gbmV3IERhdGUoZGF0ZS5nZXRGdWxsWWVhcigpLCBkYXRlLmdldE1vbnRoKCksIGRhdGUuZ2V0RGF0ZSgpKTsKICAgICAgICAgICAgICAgIHZhciBkaWZmID0gTWF0aC5yb3VuZCgodGFyZ2V0IC0gdG9kYXkpIC8gODY0MDAwMDApOwogICAgICAgICAgICAgICAgaWYgKGRpZmYgPT09IDApCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdUb2RheSc7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA9PT0gMSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1RvbW9ycm93JzsKICAgICAgICAgICAgICAgIGlmIChkaWZmID4gMSAmJiBkaWZmIDw9IDYpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdJbiAnICsgZGlmZiArICcgZGF5cyc7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA9PT0gNykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0luIDEgd2Vlayc7CiAgICAgICAgICAgICAgICBpZiAoZGlmZiA+IDcgJiYgZGlmZiA8PSAzMSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0luICcgKyBNYXRoLnJvdW5kKGRpZmYgLyA3KSArICcgd2Vla3MnOwogICAgICAgICAgICAgICAgaWYgKGRpZmYgPCAwKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnUGFzdCc7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gcmVuZGVyRW1wdHlMaXN0KCkgewogICAgICAgICAgICAgICAgbGlzdEVsXzEuaW5uZXJIVE1MID0gIjxkaXYgY2xhc3M9XCJ0dC1lbXB0eVwiPjxzdHJvbmc+Tm8gZXZlbnRzIGZvdW5kIHdpdGggdGhlc2UgY2hvaWNlcy48L3N0cm9uZz48YnI+VHJ5IHNob3dpbmcgZXZlcnl0aGluZyBhZ2FpbiwgY2hhbmdpbmcgbW9udGgsIG9yIGNob29zaW5nIGEgd2lkZXIgcGxhY2UuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dC1idG4tcm93XCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ0dC1idG4gdHQtYnRuLXByaW1hcnlcIiBpZD1cInR0LWVtcHR5LXJlc2V0XCI+U2hvdyBldmVyeXRoaW5nIGFnYWluPC9idXR0b24+XG4gICAgICAgICAgPGEgY2xhc3M9XCJ0dC1idG4gdHQtYnRuLXNlY29uZGFyeVwiIGhyZWY9XCIiLmNvbmNhdChTVUdHRVNUX0VWRU5UX1VSTF8xLCAiXCI+U3VnZ2VzdCBldmVudDwvYT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rp',\n      'dj4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBwbGFubmVyR3JvdXBNb2RlKCkgewogICAgICAgICAgICAgICAgaWYgKHN0YXRlXzEuc2VsZWN0ZWREYXkgJiYgc3RhdGVfMS5zZWxlY3RlZERheSAhPT0gJ2FueScpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkYXknOwogICAgICAgICAgICAgICAgaWYgKHN0YXRlXzEuc2VsZWN0ZWRXZWVrICYmIHN0YXRlXzEuc2VsZWN0ZWRXZWVrICE9PSAnYW55JykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2RheSc7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS50aW1lID09PSAnd2VlaycgfHwgc3RhdGVfMS50aW1lID09PSAnd2Vla2VuZCcpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdkYXknOwogICAgICAgICAgICAgICAgaWYgKChzdGF0ZV8xLnNlbGVjdGVkTW9udGggJiYgc3RhdGVfMS5zZWxlY3RlZE1vbnRoICE9PSAnYW55JykgfHwgc3RhdGVfMS50aW1lID09PSAnbW9udGgnKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnd2Vlayc7CiAgICAgICAgICAgICAgICByZXR1cm4gJ21vbnRoJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBwbHVyYWxpemUoY291bnQsIHNpbmd1bGFyLCBwbHVyYWwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb3VudCArICcgJyArIChjb3VudCA9PT0gMSA\/IHNpbmd1bGFyIDogcGx1cmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBmcmllbmRseURheUxhYmVsKGtleSkgewogICAgICAgICAgICAgICAgdmFyIG0gPSBTdHJpbmcoa2V5IHx8ICcnKS5tYXRjaCgvXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pJC8pOwogICAgICAgICAgICAgICAgaWYgKCFtKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnU2VsZWN0ZWQgZGF5JzsKICAgICAgICAgICAgICAgIHZhciBkID0gbmV3IERhdGUoTnVtYmVyKG1bMV0pLCBOdW1iZXIobVsyXSkgLSAxLCBOdW1iZXIobVszXSkpOwogICAgICAgICAgICAgICAgdmFyIHJlbCA9IHJlbGF0aXZlRGF5TGFiZWwoZCk7CiAgICAgICAgICAgICAgICB2YXIgZG93ID0gZC50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUdCJywgeyB3ZWVrZGF5OiAnbG9uZycgfSk7CiAgICAgICAgICAgICAgICB2YXIgZGF0ZSA9IGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1HQicsIHsgZGF5OiAnbnVtZXJpYycsIG1vbnRoOiAnc2hvcnQnIH0pOwogICAgICAgICAgICAgICAgaWYgKHJlbCA9PT0gJ1RvZGF5JyB8fCByZWwgPT09ICdUb21vcnJvdycpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlbCArICcgLSAnICsgZG93ICsgJyAnICsgZGF0ZTsKICAgICAgICAgICAgICAgIHJldHVybiBkb3cgKyAnIC0gJyArIGRhdGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZ3JvdXBLZXlGb3JFdmVudChlLCBtb2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoIWUgfHwgIWUuc3RhcnQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdkYXknKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBldmVudERheUtleShlLnN0YXJ0KTsKICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnd2VlaycpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJu',\n      'IGV2ZW50V2Vla0tleShlLnN0YXJ0KTsKICAgICAgICAgICAgICAgIHJldHVybiBldmVudE1vbnRoS2V5KGUuc3RhcnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGdyb3VwTGFiZWxGb3JLZXkoa2V5LCBtb2RlKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2RheScpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyaWVuZGx5RGF5TGFiZWwoa2V5KTsKICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnd2VlaycpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdlZWtMYWJlbChrZXkpOwogICAgICAgICAgICAgICAgcmV0dXJuIG1vbnRoTGFiZWwoa2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjb3VudEV2ZW50c0Zvckdyb3VwKGV2ZW50cywga2V5LCBtb2RlKSB7CiAgICAgICAgICAgICAgICB2YXIgY291bnQgPSAwOwogICAgICAgICAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBLZXlGb3JFdmVudChlLCBtb2RlKSA9PT0ga2V5KQogICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gY291bnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gdW5pcXVlR3JvdXBDb3VudChldmVudHMsIG1vZGUpIHsKICAgICAgICAgICAgICAgIHZhciBzZWVuID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gZ3JvdXBLZXlGb3JFdmVudChlLCBtb2RlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoa2V5KQogICAgICAgICAgICAgICAgICAgICAgICBzZWVuLmFkZChrZXkpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5zaXplOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHBsYW5uZXJJbnRyb0h0bWwoZXZlbnRzLCBtb2RlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaHRtbFRvUmVhZGFibGVUZXh0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICB2YXIgcyA9IFN0cmluZyh2YWx1ZSB8fCAnJyk7CiAgICAgICAgICAgICAgICBpZiAoIXMpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgvPFxzKmJyXHMqXC8\/XHMqPi9naSwgJ1xuJykKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvPFxzKlwvXHMqKHB8ZGl2fGxpfHRyfGhbMS02XSlccyo+L2dpLCAnXG4nKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC88XHMqKHB8ZGl2fGxpfHRyfGhbMS02XSlbXj5dKj4vZ2ksICdcbicpCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxccypcL1xzKih0ZHx0aClccyo+L2dpLCAnICcpCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzxccyoodGR8dGgpW14+XSo+L2dpLCAnICcpOwogICAgICAgICAgICAgICAgdmFyIHRtcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgdG1wLmlubmVySFRNTCA9IHM7CiAgICAgICAgICAg',\n      'ICAgICBzID0gdG1wLnRleHRDb250ZW50IHx8IHRtcC5pbm5lclRleHQgfHwgczsKICAgICAgICAgICAgICAgIHMgPSBzLnJlcGxhY2UoL1x1MDBhMC9nLCAnICcpCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1sgXHRdKy9nLCAnICcpCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xzKlxuXHMqL2csICdcbicpCiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xuezMsfS9nLCAnXG5cbicpCiAgICAgICAgICAgICAgICAgICAgLnRyaW0oKTsKICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHNvdXJjZURldGFpbHNUZXh0KGUpIHsKICAgICAgICAgICAgICAgIHZhciByYXcgPSBlICYmIGUucmF3ID8gZS5yYXcgOiB7fTsKICAgICAgICAgICAgICAgIHZhciBjYW5kaWRhdGVzID0gW107CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBwdXNoKHYpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdCA9IGh0bWxUb1JlYWRhYmxlVGV4dCh2KTsKICAgICAgICAgICAgICAgICAgICBpZiAodCAmJiBjYW5kaWRhdGVzLmluZGV4T2YodCkgPT09IC0xKQogICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2godCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdXNoKHJhdy5kZXRhaWxzKTsKICAgICAgICAgICAgICAgIHB1c2gocmF3LmRlc2NyaXB0aW9uKTsKICAgICAgICAgICAgICAgIHB1c2gocmF3Lm5vdGVzKTsKICAgICAgICAgICAgICAgIHB1c2gocmF3LnN0YXR1cyk7CiAgICAgICAgICAgICAgICBwdXNoKHJhdy50ZXh0KTsKICAgICAgICAgICAgICAgIHB1c2gocmF3LnN1bW1hcnkpOwogICAgICAgICAgICAgICAgcHVzaChlICYmIGUuZGVzY3JpcHRpb25UZXh0KTsKICAgICAgICAgICAgICAgIHZhciBiZXN0ID0gJyc7CiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLmZvckVhY2goZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodC5sZW5ndGggPiBiZXN0Lmxlbmd0aCkKICAgICAgICAgICAgICAgICAgICAgICAgYmVzdCA9IHQ7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICghYmVzdCkKICAgICAgICAgICAgICAgICAgICBiZXN0ID0gJ05vIGV4dHJhIHNvdXJjZSBkZXRhaWxzIHdlcmUgcHJvdmlkZWQgZm9yIHRoaXMgZXZlbnQuJzsKICAgICAgICAgICAgICAgIHJldHVybiBiZXN0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGV2ZW50RGV0YWlsc0lkKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiAndHQtZGV0YWlscy0nICsgU3RyaW5nKGUuaWQgfHwgTWF0aC5yYW5kb20oKSkucmVwbGFjZSgvW15hLXpBLVowLTlfLV0vZywgJy0nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW5kZXJTZW5pb3JFdmVudFJvdyhlKSB7CiAgICAgICAgICAgICAgICB2YXIgdGltZSA9IGZvcm1hdEV2ZW50VGltZShlKSB8fCAnVGltZSBub3Qgc3BlY2lmaWVkJzsKICAgICAgICAgICAgICAgIHZhciBsb2NUZXh0ID0gZS5sb2NhdGlvbiA\/IGUubG9jYXRpb24gOiAnTG9jYXRpb24gbm90IHNwZWNpZmllZCc7CiAgICAgICAgICAgICAgICB2YXIgZGV0YWlscyA9IHNvdXJjZURldGFpbHNUZXh0KGUpOwogICAgICAg',\n      'ICAgICAgICAgdmFyIGRldGFpbHNJZCA9IGV2ZW50RGV0YWlsc0lkKGUpOwogICAgICAgICAgICAgICAgdmFyIGRldGFpbHNIdG1sID0gZGV0YWlscyA\/ICc8ZGl2IGNsYXNzPSJ0dC1ldmVudC1kZXRhaWxzLXRvZ2dsZS13cmFwIj48YnV0dG9uIGNsYXNzPSJ0dC1kZXRhaWxzLXRvZ2dsZSIgdHlwZT0iYnV0dG9uIiBhcmlhLWV4cGFuZGVkPSJmYWxzZSIgYXJpYS1jb250cm9scz0iJyArIGVzY2FwZUh0bWwoZGV0YWlsc0lkKSArICciPjxzcGFuIGNsYXNzPSJ0dC1kZXRhaWxzLWxhYmVsIj5TaG93IGZ1bGwgZGV0YWlsczwvc3Bhbj48c3BhbiBjbGFzcz0idHQtZGV0YWlscy1jaGV2cm9uIiBhcmlhLWhpZGRlbj0idHJ1ZSI+JiM4OTY0Ozwvc3Bhbj48L2J1dHRvbj48L2Rpdj48ZGl2IGNsYXNzPSJ0dC1ldmVudC1kZXRhaWxzLXBhbmVsIiBpZD0iJyArIGVzY2FwZUh0bWwoZGV0YWlsc0lkKSArICciIGFyaWEtaGlkZGVuPSJ0cnVlIj48ZGl2IGNsYXNzPSJ0dC1ldmVudC1kZXRhaWxzLWhlYWRlciI+PHN0cm9uZz5Tb3VyY2UgZGV0YWlsczwvc3Ryb25nPjxzcGFuPkZldGNoZWQgZnJvbSAnICsgZXNjYXBlSHRtbChlLnNvdXJjZUxhYmVsIHx8ICdzb3VyY2UgY2FsZW5kYXInKSArICc8L3NwYW4+PC9kaXY+PGRpdiBjbGFzcz0idHQtZXZlbnQtZGV0YWlscy1zY3JvbGwiIHRhYmluZGV4PSIwIj4nICsgZXNjYXBlSHRtbChkZXRhaWxzKSArICc8L2Rpdj48YnV0dG9uIGNsYXNzPSJ0dC1kZXRhaWxzLWNvbGxhcHNlIiB0eXBlPSJidXR0b24iPkhpZGUgZGV0YWlsczwvYnV0dG9uPjwvZGl2PicgOiAnJzsKICAgICAgICAgICAgICAgIHJldHVybiAnPGFydGljbGUgY2xhc3M9InR0LWV2ZW50LWNhcmQgdHQtc2VuaW9yLWV2ZW50LXJvdyIgZGF0YS1ldmVudC1pZD0iJyArIGVzY2FwZUh0bWwoZS5pZCkgKyAnIj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idHQtc2VuaW9yLWV2ZW50LXRpbWUiPicgKyBlc2NhcGVIdG1sKHRpbWUpICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ0dC1zZW5pb3ItZXZlbnQtbWFpbiI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InR0LXNlbmlvci1ldmVudC1tZXRhIj48c3Bhbj4nICsgZXNjYXBlSHRtbChlLmNpdHkpICsgJzwvc3Bhbj48c3Bhbj4nICsgZXNjYXBlSHRtbChlLnR5cGVMYWJlbCkgKyAnPC9zcGFuPjxzcGFuPicgKyBlc2NhcGVIdG1sKGUuc291cmNlTGFiZWwgfHwgJycpICsgJzwvc3Bhbj48L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPGgzIGNsYXNzPSJ0dC1zZW5pb3ItZXZlbnQtdGl0bGUiPicgKyBlc2NhcGVIdG1sKGUudGl0bGUpICsgJzwvaDM+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InR0LXNlbmlvci1ldmVudC1pbmZvIj48c3Ryb25nPk9yZ2FuaXplcjo8L3N0cm9uZz4gJyArIGVzY2FwZUh0bWwoZS5vcmdhbml6ZXIgfHwgJ09yZ2FuaXplcicpICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ0dC1zZW5pb3ItZXZlbnQtaW5mbyI+PHN0cm9uZz5Mb2NhdGlvbjo8L3N0cm9uZz4gJyArIGVzY2FwZUh0bWwobG9jVGV4dCkgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgZGV0YWlsc0h0bWwgKwogICAg',\n      'ICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9hcnRpY2xlPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gb3V0bG9va01vbnRoUmFuZ2UobW9udGhLZXkpIHsKICAgICAgICAgICAgICAgIHZhciBtID0gU3RyaW5nKG1vbnRoS2V5IHx8ICcnKS5tYXRjaCgvXihcZHs0fSktKFxkezJ9KSQvKTsKICAgICAgICAgICAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgdmFyIHllYXIgPSBtID8gTnVtYmVyKG1bMV0pIDogbm93LmdldEZ1bGxZZWFyKCk7CiAgICAgICAgICAgICAgICB2YXIgbW9udGggPSBtID8gTnVtYmVyKG1bMl0pIC0gMSA6IG5vdy5nZXRNb250aCgpOwogICAgICAgICAgICAgICAgdmFyIGZpcnN0ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIDEpOwogICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IChmaXJzdC5nZXREYXkoKSArIDYpICUgNzsKICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IG5ldyBEYXRlKHllYXIsIG1vbnRoLCAxIC0gb2Zmc2V0KTsKICAgICAgICAgICAgICAgIHZhciBsYXN0ID0gbmV3IERhdGUoeWVhciwgbW9udGggKyAxLCAwKTsKICAgICAgICAgICAgICAgIHZhciBlbmRPZmZzZXQgPSA2IC0gKChsYXN0LmdldERheSgpICsgNikgJSA3KTsKICAgICAgICAgICAgICAgIHZhciBlbmQgPSBuZXcgRGF0ZSh5ZWFyLCBtb250aCArIDEsIGVuZE9mZnNldCk7CiAgICAgICAgICAgICAgICByZXR1cm4geyB5ZWFyOiB5ZWFyLCBtb250aDogbW9udGgsIHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQsIGtleTogU3RyaW5nKHllYXIpICsgJy0nICsgcGFkMihtb250aCArIDEpIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gdGl0bGVPdmVycmlkZShlLCBub3JtYWxpemVkVGl0bGUpIHsKICAgICAgICAgICAgICAgIHZhciBvcmcgPSBub3JtYWxpemVMb2NhdGlvblRleHQoZS5vcmdhbml6ZXIgfHwgJycpOwogICAgICAgICAgICAgICAgdmFyIHRpdGxlID0gbm9ybWFsaXplZFRpdGxlIHx8IG5vcm1hbGl6ZUxvY2F0aW9uVGV4dChlLnRpdGxlIHx8ICcnKTsKICAgICAgICAgICAgICAgIGlmIChvcmcuaW5kZXhPZignY2FtYXJpbicpICE9PSAtMSB8fCB0aXRsZS5pbmRleE9mKCdjYW1hcmluJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlLmluZGV4T2YoJ3NvbW1hcmF2c2x1dG5pbmcnKSAhPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnQ2FtYXJpbnMgc29tbWFyYXZzbHV0bmluZyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRpdGxlLmluZGV4T2YoJ2ZyZWRhZ3NtaWxvbmdhJykgIT09IC0xKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0NhbWFyaW5zIEZyZWRhZ3NtaWxvbmdhJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvcmcuaW5kZXhPZignbGEgdCcpICE9PSAtMSB8fCB0aXRsZS5pbmRleE9mKCdsYSB0IG1pbG9uZ2EnKSAhPT0gLTEgfHwgdGl0bGUuaW5kZXhPZignbGF0IG1pbG9uZ2EnKSAhPT0gLTEpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdMYSBUIG1pbG9uZ2EgKyBjbGFzc2VzJzsKICAgICAgICAgICAgICAgIGlmICh0aXRsZS5pbmRleE9mKCdob21lcm8gbWls',\n      'b25nYScpICE9PSAtMSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0hPTUVSTyBNSUxPTkdBJzsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjbGVhbkRpc3BsYXlUaXRsZShlKSB7CiAgICAgICAgICAgICAgICB2YXIgcmF3ID0gU3RyaW5nKChlICYmIGUudGl0bGUpIHx8ICdUYW5nbyBldmVudCcpLnJlcGxhY2UoL1xzKy9nLCAnICcpLnRyaW0oKTsKICAgICAgICAgICAgICAgIHZhciBub3JtYWxpemVkID0gbm9ybWFsaXplTG9jYXRpb25UZXh0KHJhdyk7CiAgICAgICAgICAgICAgICB2YXIgb3ZlcnJpZGUgPSB0aXRsZU92ZXJyaWRlKGUgfHwge30sIG5vcm1hbGl6ZWQpOwogICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBvdmVycmlkZTsKICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IHJhdzsKICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZSgvXGJcZHsxLDJ9WzouXVxkezJ9XHMqWy1cdTIwMTNdXHMqXGR7MSwyfVs6Ll1cZHsyfVxiL2csICcnKTsKICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZSgvXGJcZHsxLDJ9XHMqKGphbnxmZWJ8bWFyfGFwcnxtYXl8anVufGp1bHxhdWd8c2VwfG9jdHxub3Z8ZGVjfG1hanxqdW5pfGp1bGkpXGIvaWcsICcnKTsKICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZSgvXGIoXGR7MSwyfVxzKik\/KGphbnVhcml8ZmVicnVhcml8bWFyc3xhcHJpbHxtYWp8anVuaXxqdWxpfGF1Z3VzdGl8c2VwdGVtYmVyfG9rdG9iZXJ8bm92ZW1iZXJ8ZGVjZW1iZXIpXGIvaWcsICcnKTsKICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZSgvXHMrWy1cdTIwMTNdXHMrXGR7MSwyfVxzKltBLVphLXpdezMsfVxzK1stXHUyMDEzXS4qJC9pLCAnJyk7CiAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UoL1xzK1stXHUyMDEzXVxzK0RKXGIuKiQvaSwgJycpOwogICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKC9ccytbLVx1MjAxM11ccytUREpcYi4qJC9pLCAnJyk7CiAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UoL1xzK21lZFxzK2xldmFuZGVccyttdXNpa1xiLiokL2ksICcnKTsKICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZSgvXHMrd2l0aFxzK2xpdmVccyttdXNpY1xiLiokL2ksICcnKTsKICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUucmVwbGFjZSgvXHMrb2NoXHMrVERKXGIuKiQvaSwgJycpOwogICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKC9ccysmXHMrVERKXGIuKiQvaSwgJycpOwogICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKC9ccytcfFxzKy4qJC9pLCAnJyk7CiAgICAgICAgICAgICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2UoL1xzezIsfS9nLCAnICcpLnJlcGxhY2UoL1tcc1wtXHUyMDEzOnxdKyQvZywgJycpLnRyaW0oKTsKICAgICAgICAgICAgICAgIGlmICghdGl0bGUpCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSByYXc7CiAgICAgICAgICAgICAgICB2YXIgbWF4ID0gNDA7CiAgICAgICAgICAgICAgICBpZiAodGl0bGUubGVuZ3RoID4gbWF4',\n      'KQogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gdGl0bGUuc2xpY2UoMCwgbWF4IC0gMSkucmVwbGFjZSgvXHMrXFMqJC8sICcnKSArICdcdTIwMjYnOwogICAgICAgICAgICAgICAgcmV0dXJuIHRpdGxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGNvbXBhY3RFdmVudFBsYWNlKGUpIHsKICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbiA9IFN0cmluZygoZSAmJiBlLmxvY2F0aW9uKSB8fCAnJykucmVwbGFjZSgvXHMrL2csICcgJykudHJpbSgpOwogICAgICAgICAgICAgICAgdmFyIGNpdHkgPSBTdHJpbmcoKGUgJiYgZS5jaXR5KSB8fCAnJykucmVwbGFjZSgvXHMrL2csICcgJykudHJpbSgpOwogICAgICAgICAgICAgICAgdmFyIHBsYWNlID0gbG9jYXRpb24gJiYgIS9sb2NhdGlvbiBub3Qgc3BlY2lmaWVkL2kudGVzdChsb2NhdGlvbikgPyBsb2NhdGlvbiA6IGNpdHk7CiAgICAgICAgICAgICAgICBpZiAoIXBsYWNlKQogICAgICAgICAgICAgICAgICAgIHBsYWNlID0gY2l0eSB8fCAnJzsKICAgICAgICAgICAgICAgIHBsYWNlID0gcGxhY2UucmVwbGFjZSgvXkxvY2F0aW9uOlxzKi9pLCAnJykudHJpbSgpOwogICAgICAgICAgICAgICAgaWYgKGNpdHkgJiYgcGxhY2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKGNpdHkudG9Mb3dlckNhc2UoKSkgPT09IC0xICYmIHBsYWNlLmxlbmd0aCA8IDI4KQogICAgICAgICAgICAgICAgICAgIHBsYWNlID0gcGxhY2UgKyAnLCAnICsgY2l0eTsKICAgICAgICAgICAgICAgIGlmIChwbGFjZS5sZW5ndGggPiAzNCkKICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IHBsYWNlLnNsaWNlKDAsIDMzKS5yZXBsYWNlKC9ccytcUyokLywgJycpICsgJ1x1MjAyNic7CiAgICAgICAgICAgICAgICByZXR1cm4gcGxhY2UgfHwgJ1BsYWNlIG5vdCBzcGVjaWZpZWQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlbmRlck91dGxvb2tFdmVudEl0ZW0oZSkgewogICAgICAgICAgICAgICAgdmFyIHRpbWUgPSBmb3JtYXRFdmVudFRpbWUoZSkgfHwgJyc7CiAgICAgICAgICAgICAgICB2YXIgY29tcGFjdFRpbWUgPSBmb3JtYXRFdmVudFRpbWVDb21wYWN0KGUpIHx8IHRpbWU7CiAgICAgICAgICAgICAgICB2YXIgdGl0bGUgPSBjbGVhbkRpc3BsYXlUaXRsZShlKTsKICAgICAgICAgICAgICAgIHZhciBwbGFjZSA9IGNvbXBhY3RFdmVudFBsYWNlKGUpOwogICAgICAgICAgICAgICAgdmFyIGFyaWEgPSBbdGltZSwgdGl0bGUsIHBsYWNlLCAnQ2xpY2sgdG8gcmVhZCBkZXRhaWxzJ10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAtICcpOwogICAgICAgICAgICAgICAgcmV0dXJuICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InR0LW91dGxvb2stZXZlbnQiIGRhdGEtZXZlbnQtaWQ9IicgKyBlc2NhcGVIdG1sKGUuaWQpICsgJyIgYXJpYS1sYWJlbD0iJyArIGVzY2FwZUh0bWwoYXJpYSkgKyAnIj4nICsKICAgICAgICAgICAgICAgICAgICAodGltZSA\/ICc8c3BhbiBjbGFzcz0idHQtb3V0bG9vay1ldmVudC10aW1lIHR0LXRpbWUtZnVsbCI+JyArIGVzY2FwZUh0bWwodGltZSkgKyAnPC9zcGFuPjxzcGFuIGNsYXNzPSJ0dC1vdXRsb29rLWV2ZW50LXRpbWUgdHQtdGltZS1tb2JpbGUiPicgKyBlc2NhcGVIdG1sKGNvbXBhY3RUaW1lKSAr',\n      'ICc8L3NwYW4+JyA6ICcnKSArCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJ0dC1vdXRsb29rLWV2ZW50LXRpdGxlIj4nICsgZXNjYXBlSHRtbCh0aXRsZSkgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0idHQtb3V0bG9vay1ldmVudC1wbGFjZSI+JyArIGVzY2FwZUh0bWwocGxhY2UpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW5kZXJTZW5pb3JBZ2VuZGEoZXZlbnRzKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxpc3RFbF8xKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIHZhciBtb250aEtleSA9IHN0YXRlXzEuc2VsZWN0ZWRNb250aCAmJiBzdGF0ZV8xLnNlbGVjdGVkTW9udGggIT09ICdhbnknID8gc3RhdGVfMS5zZWxlY3RlZE1vbnRoIDogY3VycmVudENhbGVuZGFyTW9udGhLZXkoKTsKICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IG91dGxvb2tNb250aFJhbmdlKG1vbnRoS2V5KTsKICAgICAgICAgICAgICAgIHZhciB0b2RheSA9IG5ldyBEYXRlKCk7CiAgICAgICAgICAgICAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTsKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsb2NhbFN0YXJ0T2ZEYXkodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBkLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbG9jYWxBZGREYXlzKHZhbHVlLCBkYXlzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgZC5zZXREYXRlKGQuZ2V0RGF0ZSgpICsgZGF5cyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsb2NhbERheUluZGV4KHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKGxvY2FsU3RhcnRPZkRheSh2YWx1ZSkuZ2V0VGltZSgpIC0gbG9jYWxTdGFydE9mRGF5KHJhbmdlLnN0YXJ0KS5nZXRUaW1lKCkpIC8gODY0MDAwMDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gY2xpcHBlZFN0YXJ0KHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGQgPSBsb2NhbFN0YXJ0T2ZEYXkodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHZhciByID0gbG9jYWxTdGFydE9mRGF5KHJhbmdlLnN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCA8IHIgPyByIDogZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNsaXBwZWRFbmQodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZCA9IGxvY2FsU3RhcnRPZkRheSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHIgPSBsb2NhbFN0YXJ0T2ZEYXkocmFuZ2UuZW5kKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZCA+IHIgPyByIDogZDsKICAgICAgICAgICAgICAg',\n      'IH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGlzUmVhbE11bHRpRGF5RXZlbnQoZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCAhZS5zdGFydCB8fCAhZS5lbmQpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnREYXkgPSBsb2NhbFN0YXJ0T2ZEYXkoZS5zdGFydCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVuZERheSA9IGxvY2FsU3RhcnRPZkRheShlLmVuZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZERheSA8PSBzdGFydERheSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHZhciBkdXJhdGlvbkhvdXJzID0gKGUuZW5kLmdldFRpbWUoKSAtIGUuc3RhcnQuZ2V0VGltZSgpKSAvIDM2MDAwMDA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGR1cmF0aW9uSG91cnMgPj0gMTg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBldmVudFRvdWNoZXNWaXNpYmxlUmFuZ2UoZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghZSB8fCAhZS5zdGFydCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHZhciBzID0gbG9jYWxTdGFydE9mRGF5KGUuc3RhcnQpOwogICAgICAgICAgICAgICAgICAgIHZhciBlbmRWYWx1ZSA9IGUuZW5kIHx8IGUuc3RhcnQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVuID0gbG9jYWxTdGFydE9mRGF5KGVuZFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW4gPj0gbG9jYWxTdGFydE9mRGF5KHJhbmdlLnN0YXJ0KSAmJiBzIDw9IGxvY2FsU3RhcnRPZkRheShyYW5nZS5lbmQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYWRkRXZlbnRUb01hcChtYXAsIGtleSwgZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghbWFwLmhhcyhrZXkpKQogICAgICAgICAgICAgICAgICAgICAgICBtYXAuc2V0KGtleSwgW10pOwogICAgICAgICAgICAgICAgICAgIG1hcC5nZXQoa2V5KS5wdXNoKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gbXVsdGlEYXlQbGFjZShlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhY3RFdmVudFBsYWNlKGUpIHx8IChlLmNpdHkgfHwgJ0xvY2F0aW9uIG5vdCBzcGVjaWZpZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHJlbmRlck91dGxvb2tNdWx0aURheU1vYmlsZUl0ZW0oZSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IGNsZWFuRGlzcGxheVRpdGxlKGUpOwogICAgICAgICAgICAgICAgICAgIHZhciBwbGFjZSA9IG11bHRpRGF5UGxhY2UoZSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyaWEgPSBbdGl0bGUsIHBsYWNlLCAnQ2xpY2sgdG8gcmVhZCBkZXRhaWxzJ10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAtICcpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ0dC1vdXRsb29rLWV2ZW50IHR0LW11bHRpZGF5LW1vYmlsZS1pbnN0YW5jZSIgZGF0YS1ldmVudC1pZD0iJyArIGVzY2FwZUh0',\n      'bWwoZS5pZCkgKyAnIiBhcmlhLWxhYmVsPSInICsgZXNjYXBlSHRtbChhcmlhKSArICciPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InR0LW91dGxvb2stZXZlbnQtdGl0bGUiPicgKyBlc2NhcGVIdG1sKHRpdGxlKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0idHQtb3V0bG9vay1ldmVudC1wbGFjZSI+JyArIGVzY2FwZUh0bWwocGxhY2UpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzwvYnV0dG9uPic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiByZW5kZXJPdXRsb29rTXVsdGlEYXlTcGFuKHNlZykgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gc2VnLmV2ZW50OwogICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IGNsZWFuRGlzcGxheVRpdGxlKGUpOwogICAgICAgICAgICAgICAgICAgIHZhciBwbGFjZSA9IG11bHRpRGF5UGxhY2UoZSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGFyaWEgPSBbdGl0bGUsIHBsYWNlLCAnQ2xpY2sgdG8gcmVhZCBkZXRhaWxzJ10uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAtICcpOwogICAgICAgICAgICAgICAgICAgIHZhciBtYXJnaW5Ub3AgPSAzMCArIHNlZy5sYW5lICogMjQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxlZnRQY3QgPSAoKHNlZy5jb2xTdGFydCAtIDEpIC8gNykgKiAxMDA7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoUGN0ID0gKHNlZy5zcGFuIC8gNykgKiAxMDA7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0eWxlID0gJ2xlZnQ6Y2FsYygnICsgbGVmdFBjdC50b0ZpeGVkKDYpICsgJyUgKyAycHgpOycgKwogICAgICAgICAgICAgICAgICAgICAgICAnd2lkdGg6Y2FsYygnICsgd2lkdGhQY3QudG9GaXhlZCg2KSArICclIC0gNHB4KTsnICsKICAgICAgICAgICAgICAgICAgICAgICAgJ3RvcDpjYWxjKCgnICsgKHNlZy5yb3cgLSAxKSArICcgKiB2YXIoLS10dC1vdXRsb29rLXJvdy1oZWlnaHQpKSArICcgKyBtYXJnaW5Ub3AgKyAncHgpOyc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InR0LW91dGxvb2stZXZlbnQgdHQtbXVsdGlkYXktc3Bhbi1iYXIiIGRhdGEtZXZlbnQtaWQ9IicgKyBlc2NhcGVIdG1sKGUuaWQpICsgJyIgc3R5bGU9IicgKyBlc2NhcGVIdG1sKHN0eWxlKSArICciIGFyaWEtbGFiZWw9IicgKyBlc2NhcGVIdG1sKGFyaWEpICsgJyI+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0idHQtb3V0bG9vay1ldmVudC10aXRsZSI+JyArIGVzY2FwZUh0bWwodGl0bGUpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPSJ0dC1vdXRsb29rLWV2ZW50LXBsYWNlIj4nICsgZXNjYXBlSHRtbChwbGFjZSkgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNvdmVyZWREYXlLZXlzKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIga2V5cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBzdGFydCA9IGNsaXBwZWRTdGFydChl',\n      'LnN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgZW5kID0gY2xpcHBlZEVuZChlLmVuZCB8fCBlLnN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgY3Vyc29yID0gbmV3IERhdGUoc3RhcnQpOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IgPD0gZW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMucHVzaChldmVudERheUtleShjdXJzb3IpKTsKICAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yID0gbG9jYWxBZGREYXlzKGN1cnNvciwgMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBrZXlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGRNdWx0aURheVNlZ21lbnRzKG11bHRpRGF5RXZlbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNlZ21lbnRzID0gW107CiAgICAgICAgICAgICAgICAgICAgbXVsdGlEYXlFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWV2ZW50VG91Y2hlc1Zpc2libGVSYW5nZShlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cnNvciA9IGNsaXBwZWRTdGFydChlLnN0YXJ0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVuZCA9IGNsaXBwZWRFbmQoZS5lbmQgfHwgZS5zdGFydCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdXJzb3IgPD0gZW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaWR4ID0gbG9jYWxEYXlJbmRleChjdXJzb3IpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA8IDAgfHwgaWR4ID4gNDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93ID0gTWF0aC5mbG9vcihpZHggLyA3KSArIDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29sU3RhcnQgPSAoaWR4ICUgNykgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRheXNMZWZ0SW5XZWVrID0gOCAtIGNvbFN0YXJ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbWFpbmluZ0RheXMgPSBNYXRoLnJvdW5kKChlbmQuZ2V0VGltZSgpIC0gY3Vyc29yLmdldFRpbWUoKSkgLyA4NjQwMDAwMCkgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNwYW4gPSBNYXRoLm1heCgxLCBNYXRoLm1pbihkYXlzTGVmdEluV2VlaywgcmVtYWluaW5nRGF5cykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudHMucHVzaCh7IGV2ZW50OiBlLCByb3c6IHJvdywgY29sU3RhcnQ6IGNvbFN0YXJ0LCBjb2xFbmQ6IGNvbFN0YXJ0ICsgc3BhbiAtIDEsIHNwYW46IHNwYW4sIGxhbmU6IDAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3IgPSBsb2NhbEFkZERheXMoY3Vyc29yLCBzcGFuKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHZhciBieVJvdyA9IHt9OwogICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzLmZvckVhY2goZnVuY3Rp',\n      'b24gKHNlZykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5ID0gU3RyaW5nKHNlZy5yb3cpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJ5Um93W2tleV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBieVJvd1trZXldID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGJ5Um93W2tleV0ucHVzaChzZWcpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGJ5Um93KS5mb3JFYWNoKGZ1bmN0aW9uIChyb3dLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmVzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGJ5Um93W3Jvd0tleV0uc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYS5jb2xTdGFydCAtIGIuY29sU3RhcnQgfHwgYS5jb2xFbmQgLSBiLmNvbEVuZDsgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJ5Um93W3Jvd0tleV0uZm9yRWFjaChmdW5jdGlvbiAoc2VnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAobGFuZXNbbGFuZV0gJiYgbGFuZXNbbGFuZV0gPj0gc2VnLmNvbFN0YXJ0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmUrKzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZy5sYW5lID0gbGFuZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmVzW2xhbmVdID0gc2VnLmNvbEVuZDsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlZ21lbnRzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBldmVudHNCeURheSA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgIHZhciBtdWx0aURheUV2ZW50cyA9IFtdOwoKICAgICAgICAgICAgICAgIGV2ZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFlIHx8ICFlLnN0YXJ0KQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVhbE11bHRpRGF5RXZlbnQoZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlEYXlFdmVudHMucHVzaChlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRFdmVudFRvTWFwKGV2ZW50c0J5RGF5LCBldmVudERheUtleShlLnN0YXJ0KSwgZSk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBldmVudHNCeURheS5mb3JFYWNoKGZ1bmN0aW9uIChsaXN0KSB7IHJldHVybiBsaXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIChhLnN0YXJ0IHx8IDApIC0gKGIuc3RhcnQgfHwgMCk7IH0pOyB9KTsKCiAgICAgICAgICAgICAgICB2YXIgbXVsdGlEYXlTZWdtZW50cyA9IGJ1aWxkTXVsdGlEYXlTZWdtZW50cyhtdWx0aURheUV2ZW50cyk7CiAgICAgICAgICAgICAgICB2YXIgbXVsdGlEYXlEYXlLZXlzID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgbXVsdGlEYXlFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkgewogICAg',\n      'ICAgICAgICAgICAgICAgIGNvdmVyZWREYXlLZXlzKGUpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gbXVsdGlEYXlEYXlLZXlzLmFkZChrZXkpOyB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdmFyIG1vbnRoTmFtZSA9IG5ldyBEYXRlKHJhbmdlLnllYXIsIHJhbmdlLm1vbnRoLCAxKS50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUdCJywgeyBtb250aDogJ2xvbmcnLCB5ZWFyOiAnbnVtZXJpYycgfSk7CiAgICAgICAgICAgICAgICB2YXIgcGFydHMgPSBbXTsKICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goJzxkaXYgY2xhc3M9InR0LW91dGxvb2stY2FsZW5kYXIiIGFyaWEtbGFiZWw9Ik1vbnRoIGNhbGVuZGFyIGdyaWQiPicpOwogICAgICAgICAgICAgICAgcGFydHMucHVzaCgnPGRpdiBjbGFzcz0idHQtb3V0bG9vay1jYWxlbmRhci1oZWFkIj48c3Ryb25nPicgKyBlc2NhcGVIdG1sKG1vbnRoTmFtZSkgKyAnPC9zdHJvbmc+PHNwYW4+Q2xpY2sgYW4gZXZlbnQgdG8gcmVhZCBkZXRhaWxzPC9zcGFuPjwvZGl2PicpOwogICAgICAgICAgICAgICAgcGFydHMucHVzaCgnPGRpdiBpZD0idHQtb3V0bG9vay1kZXRhaWwtcGFuZWwiIGNsYXNzPSJ0dC1vdXRsb29rLWRldGFpbC1wYW5lbCIgaGlkZGVuPjwvZGl2PicpOwogICAgICAgICAgICAgICAgcGFydHMucHVzaCgnPGRpdiBjbGFzcz0idHQtb3V0bG9vay13ZWVrZGF5cyIgYXJpYS1oaWRkZW49InRydWUiPjxzcGFuPk1vbmRheTwvc3Bhbj48c3Bhbj5UdWVzZGF5PC9zcGFuPjxzcGFuPldlZG5lc2RheTwvc3Bhbj48c3Bhbj5UaHVyc2RheTwvc3Bhbj48c3Bhbj5GcmlkYXk8L3NwYW4+PHNwYW4+U2F0dXJkYXk8L3NwYW4+PHNwYW4+U3VuZGF5PC9zcGFuPjwvZGl2PicpOwogICAgICAgICAgICAgICAgcGFydHMucHVzaCgnPGRpdiBjbGFzcz0idHQtb3V0bG9vay1ncmlkIj4nKTsKCiAgICAgICAgICAgICAgICB2YXIgZCA9IG5ldyBEYXRlKHJhbmdlLnN0YXJ0LmdldEZ1bGxZZWFyKCksIHJhbmdlLnN0YXJ0LmdldE1vbnRoKCksIHJhbmdlLnN0YXJ0LmdldERhdGUoKSk7CiAgICAgICAgICAgICAgICB3aGlsZSAoZCA8PSByYW5nZS5lbmQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF5S2V5ID0gZXZlbnREYXlLZXkoZCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRheUV2ZW50cyA9IGV2ZW50c0J5RGF5LmdldChkYXlLZXkpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciBoYXNNdWx0aURheVNwYW4gPSBtdWx0aURheURheUtleXMuaGFzKGRheUtleSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50Q291bnQgPSBkYXlFdmVudHMubGVuZ3RoICsgKGhhc011bHRpRGF5U3BhbiA\/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICB2YXIgaXNPdXRzaWRlID0gZC5nZXRNb250aCgpICE9PSByYW5nZS5tb250aDsKICAgICAgICAgICAgICAgICAgICB2YXIgaXNUb2RheSA9IGQuZ2V0VGltZSgpID09PSB0b2RheS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNscyA9IFsndHQtb3V0bG9vay1kYXknXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNPdXRzaWRlKQogICAgICAgICAgICAgICAgICAgICAgICBjbHMucHVzaCgnaXMtb3V0c2lkZS1tb250aCcpOwogICAgICAgICAg',\n      'ICAgICAgICAgIGlmIChpc1RvZGF5KQogICAgICAgICAgICAgICAgICAgICAgICBjbHMucHVzaCgnaXMtdG9kYXknKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRDb3VudCkKICAgICAgICAgICAgICAgICAgICAgICAgY2xzLnB1c2goJ2hhcy1ldmVudHMnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzTXVsdGlEYXlTcGFuKQogICAgICAgICAgICAgICAgICAgICAgICBjbHMucHVzaCgnaGFzLW11bHRpZGF5LXNwYW4nKTsKICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tR0InLCB7IHdlZWtkYXk6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JyB9KTsKICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKCc8c2VjdGlvbiBjbGFzcz0iJyArIGNscy5qb2luKCcgJykgKyAnIiBkYXRhLWRheS1rZXk9IicgKyBlc2NhcGVIdG1sKGRheUtleSkgKyAnIiBkYXRhLWV2ZW50LWNvdW50PSInICsgZXZlbnRDb3VudCArICciIGFyaWEtbGFiZWw9IicgKyBlc2NhcGVIdG1sKGxhYmVsICsgJyAtICcgKyBwbHVyYWxpemUoZXZlbnRDb3VudCwgJ2V2ZW50JywgJ2V2ZW50cycpKSArICciPicpOwogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goJzxkaXYgY2xhc3M9InR0LW91dGxvb2stZGF5LW51bWJlciI+PHNwYW4+JyArIGVzY2FwZUh0bWwoU3RyaW5nKGQuZ2V0RGF0ZSgpKSkgKyAnPC9zcGFuPicgKyAoaXNUb2RheSA\/ICc8c3Ryb25nPlRvZGF5PC9zdHJvbmc+JyA6ICcnKSArICc8L2Rpdj4nKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKCc8ZGl2IGNsYXNzPSJ0dC1vdXRsb29rLWRheS1ldmVudHMiPicpOwogICAgICAgICAgICAgICAgICAgICAgICBkYXlFdmVudHMuZm9yRWFjaChmdW5jdGlvbiAoZSkgeyBwYXJ0cy5wdXNoKHJlbmRlck91dGxvb2tFdmVudEl0ZW0oZSkpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgcGFydHMucHVzaCgnPC9kaXY+Jyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goJzwvc2VjdGlvbj4nKTsKICAgICAgICAgICAgICAgICAgICBkLnNldERhdGUoZC5nZXREYXRlKCkgKyAxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtdWx0aURheVNlZ21lbnRzLmZvckVhY2goZnVuY3Rpb24gKHNlZykgeyBwYXJ0cy5wdXNoKHJlbmRlck91dGxvb2tNdWx0aURheVNwYW4oc2VnKSk7IH0pOwoKICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goJzwvZGl2PicpOwogICAgICAgICAgICAgICAgcGFydHMucHVzaCgnPC9kaXY+Jyk7CiAgICAgICAgICAgICAgICBsaXN0RWxfMS5pbm5lckhUTUwgPSBwYXJ0cy5qb2luKCcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW5kZXJFdmVudENhcmQoZSkgewogICAgICAgICAgICAgICAgdmFyIHAgPSBmb3JtYXREYXRlUGFydHMoZS5zdGFydCB8fCBuZXcgRGF0ZSgpKTsKICAgICAgICAgICAgICAgIHZhciByZWwgPSByZWxhdGl2ZURheUxhYmVsKGUuc3RhcnQgfHwgbmV3IERhdGUoKSk7CiAgICAgICAgICAgICAgICB2YXIgbG9jID0gZS5sb2NhdGlvbiA\/IGVzY2Fw',\n      'ZUh0bWwoZS5sb2NhdGlvbikgOiAnTG9jYXRpb24gbm90IHNwZWNpZmllZCc7CiAgICAgICAgICAgICAgICB2YXIgY2FyZEhyZWZBdHRycyA9ICcnOwogICAgICAgICAgICAgICAgdmFyIGRldGFpbHMgPSBzb3VyY2VEZXRhaWxzVGV4dChlKTsKICAgICAgICAgICAgICAgIHZhciBkZXRhaWxzSWQgPSBldmVudERldGFpbHNJZChlKTsKICAgICAgICAgICAgICAgIHZhciBkZXRhaWxzSHRtbCA9IGRldGFpbHMgPyAnPGRpdiBjbGFzcz0idHQtZXZlbnQtZGV0YWlscy10b2dnbGUtd3JhcCI+PGJ1dHRvbiBjbGFzcz0idHQtZGV0YWlscy10b2dnbGUiIHR5cGU9ImJ1dHRvbiIgYXJpYS1leHBhbmRlZD0iZmFsc2UiIGFyaWEtY29udHJvbHM9IicgKyBlc2NhcGVIdG1sKGRldGFpbHNJZCkgKyAnIj48c3BhbiBjbGFzcz0idHQtZGV0YWlscy1sYWJlbCI+U2hvdyBmdWxsIGRldGFpbHM8L3NwYW4+PHNwYW4gY2xhc3M9InR0LWRldGFpbHMtY2hldnJvbiIgYXJpYS1oaWRkZW49InRydWUiPiYjODk2NDs8L3NwYW4+PC9idXR0b24+PC9kaXY+PGRpdiBjbGFzcz0idHQtZXZlbnQtZGV0YWlscy1wYW5lbCIgaWQ9IicgKyBlc2NhcGVIdG1sKGRldGFpbHNJZCkgKyAnIiBhcmlhLWhpZGRlbj0idHJ1ZSI+PGRpdiBjbGFzcz0idHQtZXZlbnQtZGV0YWlscy1oZWFkZXIiPjxzdHJvbmc+U291cmNlIGRldGFpbHM8L3N0cm9uZz48c3Bhbj5GZXRjaGVkIGZyb20gJyArIGVzY2FwZUh0bWwoZS5zb3VyY2VMYWJlbCB8fCAnc291cmNlIGNhbGVuZGFyJykgKyAnPC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9InR0LWV2ZW50LWRldGFpbHMtc2Nyb2xsIiB0YWJpbmRleD0iMCI+JyArIGVzY2FwZUh0bWwoZGV0YWlscykgKyAnPC9kaXY+PGJ1dHRvbiBjbGFzcz0idHQtZGV0YWlscy1jb2xsYXBzZSIgdHlwZT0iYnV0dG9uIj5IaWRlIGRldGFpbHM8L2J1dHRvbj48L2Rpdj4nIDogJyc7CiAgICAgICAgICAgICAgICByZXR1cm4gJzxhcnRpY2xlIGNsYXNzPSJ0dC1ldmVudC1jYXJkIiBkYXRhLWV2ZW50LWlkPSInICsgZXNjYXBlSHRtbChlLmlkKSArICciJyArIGNhcmRIcmVmQXR0cnMgKyAnPicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ0dC1ldmVudC1kYXRlIj48c3BhbiBjbGFzcz0iZG93Ij4nICsgZXNjYXBlSHRtbChwLmRvdykgKyAnPC9zcGFuPjxzdHJvbmc+JyArIGVzY2FwZUh0bWwocC5kYXkpICsgJzwvc3Ryb25nPjxzcGFuIGNsYXNzPSJtb24iPicgKyBlc2NhcGVIdG1sKHAubW9uKSArICc8L3NwYW4+JyArIChyZWwgPyAnPHNwYW4gY2xhc3M9InJlbCI+JyArIGVzY2FwZUh0bWwocmVsKSArICc8L3NwYW4+JyA6ICcnKSArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idHQtZXZlbnQtYm9keSI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InR0LWV2ZW50LW1ldGEiPjxzcGFuIGNsYXNzPSJ0dC1iYWRnZSI+JyArIGVzY2FwZUh0bWwoZS50eXBlTGFiZWwpICsgJzwvc3Bhbj48c3BhbiBjbGFzcz0idHQtYmFkZ2UgdHQtYmFkZ2UtY2l0eSI+JyArIGVzY2FwZUh0bWwoZS5jaXR5KSArICc8L3NwYW4+JyArIGV2ZW50VGltZUJhZGdlKGUpICsgKGUuc291cmNlTGFiZWwgPyAnPHNwYW4gY2xhc3M9InR0LWJhZGdlIHR0LWJhZGdlLWNpdHkiPicgKyBlc2Nh',\n      'cGVIdG1sKGUuc291cmNlTGFiZWwpICsgJzwvc3Bhbj4nIDogJycpICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8aDMgY2xhc3M9InR0LWV2ZW50LXRpdGxlIj4nICsgZXNjYXBlSHRtbChlLnRpdGxlKSArICc8L2gzPicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ0dC1ldmVudC1pbmZvIj48c3Bhbj48c3Ryb25nPk9yZ2FuaXplcjo8L3N0cm9uZz4gJyArIGVzY2FwZUh0bWwoZS5vcmdhbml6ZXIpICsgJzwvc3Bhbj48c3Bhbj48c3Ryb25nPkxvY2F0aW9uOjwvc3Ryb25nPiAnICsgbG9jICsgJzwvc3Bhbj48L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICBkZXRhaWxzSHRtbCArCiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8L2FydGljbGU+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW5kZXJFdmVudHMoZXZlbnRzKSB7CiAgICAgICAgICAgICAgICBpZiAoIWxpc3RFbF8xKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZV8xLnVpTW9kZSA9PT0gJ3NpbXBsZScgfHwgKHN0YXRlXzEudWlNb2RlID09PSAnZmlsdGVycycgJiYgc3RhdGVfMS5tb3JlQ2hvaWNlc0Rpc3BsYXkgIT09ICdsaXN0JykpIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJTZW5pb3JBZ2VuZGEoZXZlbnRzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWV2ZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICByZW5kZXJFbXB0eUxpc3QoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IHBsYW5uZXJHcm91cE1vZGUoKTsKICAgICAgICAgICAgICAgIHZhciBsYXN0R3JvdXAgPSAnJzsKICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IFtdOwogICAgICAgICAgICAgICAgdmFyIGludHJvID0gcGxhbm5lckludHJvSHRtbChldmVudHMsIG1vZGUpOwogICAgICAgICAgICAgICAgaWYgKGludHJvKQogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goaW50cm8pOwogICAgICAgICAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZ3JvdXBLZXkgPSBncm91cEtleUZvckV2ZW50KGUsIG1vZGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChncm91cEtleSAmJiBncm91cEtleSAhPT0gbGFzdEdyb3VwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjb3VudCA9IGNvdW50RXZlbnRzRm9yR3JvdXAoZXZlbnRzLCBncm91cEtleSwgbW9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IGdyb3VwTGFiZWxGb3JLZXkoZ3JvdXBLZXksIG1vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWV0YSA9IHBsdXJhbGl6ZShjb3VudCwgJ2V2ZW50JywgJ2V2ZW50cycpOwogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKCc8ZGl2IGNsYXNzPSJ0dC1ldmVudC1ncm91cC1kaXZpZGVyIHR0LWV2ZW50LWdyb3VwLWRpdmlkZXItJyArIGVzY2FwZUh0bWwobW9kZSkgKyAnIj48c3Bhbj48c3Ryb25nPicgKyBl',\n      'c2NhcGVIdG1sKGxhYmVsKSArICc8L3N0cm9uZz48c21hbGw+JyArIGVzY2FwZUh0bWwobWV0YSkgKyAnPC9zbWFsbD48L3NwYW4+PC9kaXY+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHcm91cCA9IGdyb3VwS2V5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHJlbmRlckV2ZW50Q2FyZChlKSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGxpc3RFbF8xLmlubmVySFRNTCA9IHBhcnRzLmpvaW4oJycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHNldEV2ZW50RGV0YWlsc1N0YXRlKGNhcmQsIG9wZW4pIHsKICAgICAgICAgICAgICAgIGlmICghY2FyZCkKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB2YXIgYnRuID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcudHQtZGV0YWlscy10b2dnbGUnKTsKICAgICAgICAgICAgICAgIHZhciBwYW5lbCA9IGNhcmQucXVlcnlTZWxlY3RvcignLnR0LWV2ZW50LWRldGFpbHMtcGFuZWwnKTsKICAgICAgICAgICAgICAgIGlmICghYnRuIHx8ICFwYW5lbCkKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICBidG4uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgb3BlbiA\/ICd0cnVlJyA6ICdmYWxzZScpOwogICAgICAgICAgICAgICAgYnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz0idHQtZGV0YWlscy1sYWJlbCI+JyArIChvcGVuID8gJ0hpZGUgZGV0YWlscycgOiAnU2hvdyBmdWxsIGRldGFpbHMnKSArICc8L3NwYW4+PHNwYW4gY2xhc3M9InR0LWRldGFpbHMtY2hldnJvbiIgYXJpYS1oaWRkZW49InRydWUiPiYjODk2NDs8L3NwYW4+JzsKICAgICAgICAgICAgICAgIHBhbmVsLmNsYXNzTGlzdC50b2dnbGUoJ2lzLXZpc2libGUnLCBvcGVuKTsKICAgICAgICAgICAgICAgIHBhbmVsLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBvcGVuID8gJ2ZhbHNlJyA6ICd0cnVlJyk7CiAgICAgICAgICAgICAgICBjYXJkLmNsYXNzTGlzdC50b2dnbGUoJ2lzLWV4cGFuZGVkJywgb3Blbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZmluZEV2ZW50QnlJZChpZCkgewogICAgICAgICAgICAgICAgdmFyIGtleSA9IFN0cmluZyhpZCB8fCAnJyk7CiAgICAgICAgICAgICAgICB2YXIgYWxsID0gKHN0YXRlXzEudmlzaWJsZUV2ZW50cyB8fCBbXSkuY29uY2F0KHN0YXRlXzEuYWxsRXZlbnRzIHx8IFtdKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFN0cmluZyhhbGxbaV0uaWQpID09PSBrZXkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxbaV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjbG9zZU91dGxvb2tEZXRhaWxzKCkgewogICAgICAgICAgICAgICAgdmFyIHBhbmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R0LW91dGxvb2stZGV0YWlsLXBhbmVsJyk7CiAgICAgICAgICAgICAgICBpZiAoIXBhbmVsKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsK',\n      'ICAgICAgICAgICAgICAgIHBhbmVsLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICBwYW5lbC5pbm5lckhUTUwgPSAnJzsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN0dC1yZWdpb24gLnR0LW91dGxvb2stZXZlbnQuaXMtc2VsZWN0ZWQnKS5mb3JFYWNoKGZ1bmN0aW9uIChlbCkgeyByZXR1cm4gZWwuY2xhc3NMaXN0LnJlbW92ZSgnaXMtc2VsZWN0ZWQnKTsgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gb3Blbk91dGxvb2tEZXRhaWxzKGUsIGNsaWNrZWRCdXR0b24pIHsKICAgICAgICAgICAgICAgIHZhciBwYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0dC1vdXRsb29rLWRldGFpbC1wYW5lbCcpOwogICAgICAgICAgICAgICAgaWYgKCFwYW5lbCB8fCAhZSkKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjdHQtcmVnaW9uIC50dC1vdXRsb29rLWV2ZW50LmlzLXNlbGVjdGVkJykuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsgcmV0dXJuIGVsLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLXNlbGVjdGVkJyk7IH0pOwogICAgICAgICAgICAgICAgaWYgKGNsaWNrZWRCdXR0b24pCiAgICAgICAgICAgICAgICAgICAgY2xpY2tlZEJ1dHRvbi5jbGFzc0xpc3QuYWRkKCdpcy1zZWxlY3RlZCcpOwogICAgICAgICAgICAgICAgdmFyIGRldGFpbHMgPSBzb3VyY2VEZXRhaWxzVGV4dChlKTsKICAgICAgICAgICAgICAgIHZhciByYXdUaXRsZSA9IFN0cmluZyhlLnRpdGxlIHx8IGNsZWFuRGlzcGxheVRpdGxlKGUpKTsKICAgICAgICAgICAgICAgIHZhciB0aW1lTGluZSA9IGZvcm1hdEV2ZW50RGF0ZUxpbmUoZSk7CiAgICAgICAgICAgICAgICB2YXIgcGxhY2UgPSBTdHJpbmcoZS5sb2NhdGlvbiB8fCBjb21wYWN0RXZlbnRQbGFjZShlKSB8fCAnUGxhY2Ugbm90IHNwZWNpZmllZCcpOwogICAgICAgICAgICAgICAgdmFyIG1ldGEgPSBbXTsKICAgICAgICAgICAgICAgIGlmICh0aW1lTGluZSkKICAgICAgICAgICAgICAgICAgICBtZXRhLnB1c2godGltZUxpbmUpOwogICAgICAgICAgICAgICAgaWYgKGUuY2l0eSkKICAgICAgICAgICAgICAgICAgICBtZXRhLnB1c2goZS5jaXR5KTsKICAgICAgICAgICAgICAgIGlmIChwbGFjZSkKICAgICAgICAgICAgICAgICAgICBtZXRhLnB1c2gocGxhY2UpOwogICAgICAgICAgICAgICAgdmFyIGh0bWwgPSAnJyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InR0LW91dGxvb2stZGV0YWlsLWlubmVyIj4nICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiBjbGFzcz0idHQtb3V0bG9vay1kZXRhaWwtY2xvc2UiIHR5cGU9ImJ1dHRvbiIgYXJpYS1sYWJlbD0iQ2xvc2UgZGV0YWlscyI+Q2xvc2U8L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idHQtb3V0bG9vay1kZXRhaWwta2lja2VyIj5FdmVudCBkZXRhaWxzPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxoMz4nICsgZXNjYXBlSHRtbChyYXdUaXRsZSkgKyAnPC9oMz4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idHQtb3V0bG9vay1kZXRhaWwtbWV0YSI+JyArIGVzY2FwZUh0bWwobWV0YS5q',\n      'b2luKCcgLSAnKSkgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InR0LW91dGxvb2stZGV0YWlsLWZpZWxkcyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxzcGFuPjxzdHJvbmc+T3JnYW5pemVyOjwvc3Ryb25nPiAnICsgZXNjYXBlSHRtbChlLm9yZ2FuaXplciB8fCAnT3JnYW5pemVyJykgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICc8c3Bhbj48c3Ryb25nPlNvdXJjZTo8L3N0cm9uZz4gJyArIGVzY2FwZUh0bWwoZS5zb3VyY2VMYWJlbCB8fCAnU291cmNlIGNhbGVuZGFyJykgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idHQtb3V0bG9vay1kZXRhaWwtc2Nyb2xsIiB0YWJpbmRleD0iMCI+JyArIGVzY2FwZUh0bWwoZGV0YWlscyB8fCAnTm8gZXh0cmEgc291cmNlIGRldGFpbHMgd2VyZSBwcm92aWRlZCBmb3IgdGhpcyBldmVudC4nKSArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JzsKICAgICAgICAgICAgICAgIHBhbmVsLmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgICAgICBwYW5lbC5oaWRkZW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICghaXNNb2JpbGVDYWxlbmRhcigpKSBwYW5lbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBpc01vYmlsZUNhbGVuZGFyKCkgewogICAgICAgICAgICAgICAgcmV0dXJuICEhKHdpbmRvdy5tYXRjaE1lZGlhICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA2ODBweCknKS5tYXRjaGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBtb2JpbGVEYXlMYWJlbChkYXlLZXkpIHsKICAgICAgICAgICAgICAgIHZhciBwYXJ0cyA9IFN0cmluZyhkYXlLZXkgfHwgJycpLnNwbGl0KCctJykubWFwKE51bWJlcik7CiAgICAgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoICE9PSAzIHx8ICFwYXJ0c1swXSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1NlbGVjdGVkIGRheSc7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUocGFydHNbMF0sIHBhcnRzWzFdIC0gMSwgcGFydHNbMl0pLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tR0InLCB7IHdlZWtkYXk6ICdsb25nJywgZGF5OiAnbnVtZXJpYycsIG1vbnRoOiAnbG9uZycgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZXZlbnRzRm9yRGF5S2V5KGRheUtleSkgewogICAgICAgICAgICAgICAgcmV0dXJuIChzdGF0ZV8xLnZpc2libGVFdmVudHMgfHwgW10pLmZpbHRlcihmdW5jdGlvbiAoZSkgeyByZXR1cm4gZSAmJiBlLnN0YXJ0ICYmIGV2ZW50RGF5S2V5KGUuc3RhcnQpID09PSBkYXlLZXk7IH0pLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIChhLnN0YXJ0IHx8IDApIC0gKGIuc3RhcnQgfHwgMCk7IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGVuc3VyZU1vYmlsZURheU1vZGFsKCkgewogICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R0LW1vYmlsZS1kYXkt',\n      'bW9kYWwnKTsKICAgICAgICAgICAgICAgIGlmIChleGlzdGluZykKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CiAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgIG1vZGFsLmlkID0gJ3R0LW1vYmlsZS1kYXktbW9kYWwnOwogICAgICAgICAgICAgICAgbW9kYWwuY2xhc3NOYW1lID0gJ3R0LW1vYmlsZS1kYXktbW9kYWwnOwogICAgICAgICAgICAgICAgbW9kYWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgICAgICAgICAgICBtb2RhbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0idHQtbW9iaWxlLWRheS1kaWFsb2ciIHJvbGU9ImRpYWxvZyIgYXJpYS1tb2RhbD0idHJ1ZSIgYXJpYS1sYWJlbD0iRXZlbnRzIGZvciBzZWxlY3RlZCBkYXkiPjxidXR0b24gY2xhc3M9InR0LW1vYmlsZS1kYXktY2xvc2UiIHR5cGU9ImJ1dHRvbiIgZGF0YS1tb2JpbGUtZGF5LWNsb3NlPSIxIiBhcmlhLWxhYmVsPSJDbG9zZSI+Q2xvc2U8L2J1dHRvbj48ZGl2IGNsYXNzPSJ0dC1tb2JpbGUtZGF5LWNvbnRlbnQiPjwvZGl2PjwvZGl2Pic7CiAgICAgICAgICAgICAgICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChldikgewogICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBldi50YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldCAmJiB0YXJnZXQuY2xvc2VzdCAmJiB0YXJnZXQuY2xvc2VzdCgnW2RhdGEtbW9iaWxlLWRheS1jbG9zZV0nKSkgewogICAgICAgICAgICAgICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZU1vYmlsZURheVBhbmVsKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1vZGFsKTsKICAgICAgICAgICAgICAgIHJldHVybiBtb2RhbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjbG9zZU1vYmlsZURheVBhbmVsKCkgewogICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R0LW1vYmlsZS1kYXktbW9kYWwnKTsKICAgICAgICAgICAgICAgIGlmICghbW9kYWwpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnaXMtdmlzaWJsZScpOwogICAgICAgICAgICAgICAgbW9kYWwuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgndHQtbW9iaWxlLW1vZGFsLW9wZW4nKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgndHQtbW9iaWxlLW1vZGFsLW9wZW4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBvcGVuTW9iaWxlRGF5UGFuZWwoZGF5S2V5LCBoaWdobGlnaHRJZCkgewogICAgICAgICAgICAgICAgdmFyIG1vZGFsID0gZW5zdXJlTW9iaWxlRGF5TW9kYWwoKTsKICAgICAgICAgICAgICAgIHZhciBjb250ZW50ID0gbW9kYWwucXVlcnlTZWxl',\n      'Y3RvcignLnR0LW1vYmlsZS1kYXktY29udGVudCcpOwogICAgICAgICAgICAgICAgdmFyIGV2ZW50cyA9IGV2ZW50c0ZvckRheUtleShkYXlLZXkpOwogICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gbW9iaWxlRGF5TGFiZWwoZGF5S2V5KTsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gJzxkaXYgY2xhc3M9InR0LW1vYmlsZS1kYXkta2lja2VyIj5TZWxlY3RlZCBkYXRlPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxoMz4nICsgZXNjYXBlSHRtbChsYWJlbCkgKyAnPC9oMz4nICsKICAgICAgICAgICAgICAgICAgICAnPHAgY2xhc3M9InR0LW1vYmlsZS1kYXktaGVscCI+VGFwIGFuIGV2ZW50IHRvIHJlYWQgZnVsbCBkZXRhaWxzLjwvcD4nOwogICAgICAgICAgICAgICAgaWYgKCFldmVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz0idHQtbW9iaWxlLWRheS1lbXB0eSI+Tm8gZXZlbnRzIGFyZSBzaG93biBmb3IgdGhpcyBkYXRlLjwvZGl2Pic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBodG1sICs9ICc8ZGl2IGNsYXNzPSJ0dC1tb2JpbGUtZGF5LWxpc3QiPic7CiAgICAgICAgICAgICAgICAgICAgZXZlbnRzLmZvckVhY2goZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpbWUgPSBmb3JtYXRFdmVudFRpbWUoZSkgfHwgJ1RpbWUgbm90IHNwZWNpZmllZCc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZSA9IGNsZWFuRGlzcGxheVRpdGxlKGUpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcGxhY2UgPSBjb21wYWN0RXZlbnRQbGFjZShlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkID0gaGlnaGxpZ2h0SWQgJiYgU3RyaW5nKGUuaWQpID09PSBTdHJpbmcoaGlnaGxpZ2h0SWQpID8gJyBpcy1zZWxlY3RlZCcgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCArPSAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJ0dC1tb2JpbGUtZGF5LWV2ZW50JyArIHNlbGVjdGVkICsgJyIgZGF0YS1ldmVudC1pZD0iJyArIGVzY2FwZUh0bWwoZS5pZCkgKyAnIiBkYXRhLWRheS1rZXk9IicgKyBlc2NhcGVIdG1sKGRheUtleSkgKyAnIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0idHQtbW9iaWxlLWRheS1ldmVudC10aW1lIj4nICsgZXNjYXBlSHRtbCh0aW1lKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9InR0LW1vYmlsZS1kYXktZXZlbnQtbWFpbiI+PHN0cm9uZz4nICsgZXNjYXBlSHRtbCh0aXRsZSkgKyAnPC9zdHJvbmc+PHNtYWxsPicgKyBlc2NhcGVIdG1sKHBsYWNlKSArICc8L3NtYWxsPjwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L2J1dHRvbj4nOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoY29udGVudCkKICAgICAgICAgICAgICAgICAgICBjb250ZW50LmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgICAgICBtb2RhbC5j',\n      'bGFzc0xpc3QuYWRkKCdpcy12aXNpYmxlJyk7CiAgICAgICAgICAgICAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndHQtbW9iaWxlLW1vZGFsLW9wZW4nKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgndHQtbW9iaWxlLW1vZGFsLW9wZW4nKTsKICAgICAgICAgICAgICAgIHZhciBmaXJzdCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoaGlnaGxpZ2h0SWQgPyAnLnR0LW1vYmlsZS1kYXktZXZlbnQuaXMtc2VsZWN0ZWQnIDogJy50dC1tb2JpbGUtZGF5LWV2ZW50Jyk7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Quc2Nyb2xsSW50b1ZpZXcpCiAgICAgICAgICAgICAgICAgICAgZmlyc3Quc2Nyb2xsSW50b1ZpZXcoeyBibG9jazogJ25lYXJlc3QnIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIG9wZW5Nb2JpbGVFdmVudERldGFpbEluRGF5KGUsIGRheUtleSkgewogICAgICAgICAgICAgICAgaWYgKCFlKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9IGVuc3VyZU1vYmlsZURheU1vZGFsKCk7CiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJy50dC1tb2JpbGUtZGF5LWNvbnRlbnQnKTsKICAgICAgICAgICAgICAgIHZhciBkZXRhaWxzID0gc291cmNlRGV0YWlsc1RleHQoZSk7CiAgICAgICAgICAgICAgICB2YXIgdGltZUxpbmUgPSBmb3JtYXRFdmVudERhdGVMaW5lKGUpOwogICAgICAgICAgICAgICAgdmFyIHBsYWNlID0gU3RyaW5nKGUubG9jYXRpb24gfHwgY29tcGFjdEV2ZW50UGxhY2UoZSkgfHwgJ1BsYWNlIG5vdCBzcGVjaWZpZWQnKTsKICAgICAgICAgICAgICAgIHZhciBodG1sID0gJzxkaXYgY2xhc3M9InR0LW1vYmlsZS1kYXktZGV0YWlsLWFjdGlvbnMiPjxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0idHQtbW9iaWxlLWRheS1iYWNrIiBkYXRhLW1vYmlsZS1kYXktYmFjaz0iJyArIGVzY2FwZUh0bWwoZGF5S2V5IHx8ICcnKSArICciPiYjODI0OTsgQmFjayB0byB0aGlzIGRhdGU8L2J1dHRvbj48YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9InR0LW1vYmlsZS1kYXktaW5saW5lLWNsb3NlIiBkYXRhLW1vYmlsZS1kYXktY2xvc2U9IjEiPkNsb3NlPC9idXR0b24+PC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InR0LW1vYmlsZS1kYXkta2lja2VyIj5FdmVudCBkZXRhaWxzPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzxoMz4nICsgZXNjYXBlSHRtbChTdHJpbmcoZS50aXRsZSB8fCBjbGVhbkRpc3BsYXlUaXRsZShlKSkpICsgJzwvaDM+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9InR0LW1vYmlsZS1kYXktZGV0YWlsLW1ldGEiPicgKyBlc2NhcGVIdG1sKFt0aW1lTGluZSwgZS5jaXR5LCBwbGFjZV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJyAtICcpKSArICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0idHQtbW9iaWxlLWRheS1kZXRhaWwtZmllbGRzIj48c3Bhbj48c3Ryb25nPk9yZ2FuaXpl',\n      'cjo8L3N0cm9uZz4gJyArIGVzY2FwZUh0bWwoZS5vcmdhbml6ZXIgfHwgJ09yZ2FuaXplcicpICsgJzwvc3Bhbj48c3Bhbj48c3Ryb25nPlNvdXJjZTo8L3N0cm9uZz4gJyArIGVzY2FwZUh0bWwoZS5zb3VyY2VMYWJlbCB8fCAnU291cmNlIGNhbGVuZGFyJykgKyAnPC9zcGFuPjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJ0dC1tb2JpbGUtZGF5LWRldGFpbC1zY3JvbGwiIHRhYmluZGV4PSIwIj4nICsgZXNjYXBlSHRtbChkZXRhaWxzIHx8ICdObyBleHRyYSBzb3VyY2UgZGV0YWlscyB3ZXJlIHByb3ZpZGVkIGZvciB0aGlzIGV2ZW50LicpICsgJzwvZGl2Pic7CiAgICAgICAgICAgICAgICBpZiAoY29udGVudCkKICAgICAgICAgICAgICAgICAgICBjb250ZW50LmlubmVySFRNTCA9IGh0bWw7CiAgICAgICAgICAgICAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdpcy12aXNpYmxlJyk7CiAgICAgICAgICAgICAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgndHQtbW9iaWxlLW1vZGFsLW9wZW4nKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgndHQtbW9iaWxlLW1vZGFsLW9wZW4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChldikgewogICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGV2LnRhcmdldDsKICAgICAgICAgICAgICAgIHZhciBtb2RhbCA9IHRhcmdldCAmJiB0YXJnZXQuY2xvc2VzdCA\/IHRhcmdldC5jbG9zZXN0KCcjdHQtbW9iaWxlLWRheS1tb2RhbCcpIDogbnVsbDsKICAgICAgICAgICAgICAgIGlmICghbW9kYWwpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgdmFyIGNsb3NlID0gdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLW1vYmlsZS1kYXktY2xvc2VdJyk7CiAgICAgICAgICAgICAgICBpZiAoY2xvc2UgfHwgdGFyZ2V0ID09PSBtb2RhbCkgewogICAgICAgICAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgY2xvc2VNb2JpbGVEYXlQYW5lbCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBiYWNrID0gdGFyZ2V0LmNsb3Nlc3QoJ1tkYXRhLW1vYmlsZS1kYXktYmFja10nKTsKICAgICAgICAgICAgICAgIGlmIChiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBvcGVuTW9iaWxlRGF5UGFuZWwoYmFjay5nZXRBdHRyaWJ1dGUoJ2RhdGEtbW9iaWxlLWRheS1iYWNrJykgfHwgJycpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBldmVudEJ0biA9IHRhcmdldC5jbG9zZXN0KCcudHQtbW9iaWxlLWRheS1ldmVudCcpOwogICAgICAgICAgICAgICAgaWYgKGV2ZW50QnRuKSB7CiAgICAgICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBvcGVuTW9iaWxlRXZlbnRE',\n      'ZXRhaWxJbkRheShmaW5kRXZlbnRCeUlkKGV2ZW50QnRuLmRhdGFzZXQuZXZlbnRJZCB8fCAnJyksIGV2ZW50QnRuLmRhdGFzZXQuZGF5S2V5IHx8ICcnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAobGlzdEVsXzEpIHsKICAgICAgICAgICAgICAgIGxpc3RFbF8xLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGV2LnRhcmdldDsKICAgICAgICAgICAgICAgICAgICB2YXIgY2xvc2VEZXRhaWxzID0gdGFyZ2V0ICYmIHRhcmdldC5jbG9zZXN0ID8gdGFyZ2V0LmNsb3Nlc3QoJyN0dC1yZWdpb24gLnR0LW91dGxvb2stZGV0YWlsLWNsb3NlJykgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChjbG9zZURldGFpbHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRsb29rRGV0YWlscygpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBvdXRsb29rRXZlbnQgPSB0YXJnZXQgJiYgdGFyZ2V0LmNsb3Nlc3QgPyB0YXJnZXQuY2xvc2VzdCgnI3R0LXJlZ2lvbiAudHQtb3V0bG9vay1ldmVudCcpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAob3V0bG9va0V2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb3VuZCA9IGZpbmRFdmVudEJ5SWQob3V0bG9va0V2ZW50LmRhdGFzZXQuZXZlbnRJZCB8fCAnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc01vYmlsZUNhbGVuZGFyKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXlDZWxsID0gb3V0bG9va0V2ZW50LmNsb3Nlc3QgPyBvdXRsb29rRXZlbnQuY2xvc2VzdCgnLnR0LW91dGxvb2stZGF5JykgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbk1vYmlsZURheVBhbmVsKChkYXlDZWxsICYmIGRheUNlbGwuZGF0YXNldC5kYXlLZXkpIHx8IChmb3VuZCAmJiBmb3VuZC5zdGFydCA\/IGV2ZW50RGF5S2V5KGZvdW5kLnN0YXJ0KSA6ICcnKSwgZm91bmQgPyBTdHJpbmcoZm91bmQuaWQpIDogJycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Blbk91dGxvb2tEZXRhaWxzKGZvdW5kLCBvdXRsb29rRXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vYmlsZURheUNlbGwgPSB0YXJnZXQgJiYgdGFyZ2V0LmNsb3Nlc3QgPyB0YXJnZXQuY2xvc2VzdCgnI3R0LXJlZ2lvbiAudHQtb3V0bG9vay1kYXkuaGFzLWV2ZW50cycpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAobW9iaWxlRGF5Q2VsbCAmJiBpc01vYmlsZUNhbGVuZGFyKCkpIHsKICAgICAgICAgICAgICAg',\n      'ICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgb3Blbk1vYmlsZURheVBhbmVsKG1vYmlsZURheUNlbGwuZGF0YXNldC5kYXlLZXkgfHwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBjbGlja2VkID0gdGFyZ2V0ICYmIHRhcmdldC5jbG9zZXN0ID8gdGFyZ2V0LmNsb3Nlc3QoJyN0dC1yZWdpb24gLnR0LWRldGFpbHMtdG9nZ2xlLCAjdHQtcmVnaW9uIC50dC1kZXRhaWxzLWNvbGxhcHNlJykgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICghY2xpY2tlZCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhcmQgPSBjbGlja2VkLmNsb3Nlc3QgPyBjbGlja2VkLmNsb3Nlc3QoJy50dC1ldmVudC1jYXJkJykgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmICghY2FyZCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHZhciB0b2dnbGUgPSBjYXJkLnF1ZXJ5U2VsZWN0b3IoJy50dC1kZXRhaWxzLXRvZ2dsZScpOwogICAgICAgICAgICAgICAgICAgIHZhciBpc09wZW4gPSB0b2dnbGUgJiYgdG9nZ2xlLmdldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpID09PSAndHJ1ZSc7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRPcGVuID0gY2xpY2tlZC5jbGFzc0xpc3QuY29udGFpbnMoJ3R0LWRldGFpbHMtY29sbGFwc2UnKSA\/IGZhbHNlIDogIWlzT3BlbjsKICAgICAgICAgICAgICAgICAgICBpZiAobmV4dE9wZW4gJiYgd2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDY4MHB4KScpLm1hdGNoZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdEVsXzEucXVlcnlTZWxlY3RvckFsbCgnLnR0LWV2ZW50LWNhcmQuaXMtZXhwYW5kZWQnKS5mb3JFYWNoKGZ1bmN0aW9uIChvcGVuQ2FyZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wZW5DYXJkICE9PSBjYXJkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEV2ZW50RGV0YWlsc1N0YXRlKG9wZW5DYXJkLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzZXRFdmVudERldGFpbHNTdGF0ZShjYXJkLCBuZXh0T3Blbik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiByZW5kZXJNYXAoZXZlbnRzKSB7CiAgICAgICAgICAgICAgICBpZiAoIW1hcExpc3RfMSB8fCAhbWFwQ2FwdGlvbl8xKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIHZhciBtYXBwZWQgPSBldmVudHMubWFwKGZ1bmN0aW9uIChlKSB7IHJldHVybiAoeyBldmVudDogZSwgY29vcmRzOiBjb29yZHNGb3JFdmVudChlKSB9KTsgfSkuZmlsdGVyKGZ1bmN0aW9uICh4KSB7IHJldHVybiB4LmNvb3JkczsgfSk7CiAgICAgICAgICAg',\n      'ICAgICBpZiAoIW1hcHBlZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBtYXBMaXN0XzEuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9InR0LWVtcHR5Ij5ObyB2ZW51ZSBvciBjaXR5IGxvY2F0aW9ucyB0byBzaG93IGZvciB0aGUgY3VycmVudCBmaWx0ZXIuIFRoZSBldmVudHMgYXJlIHN0aWxsIHZpc2libGUgaW4gdGhlIG1vbnRoIGNhbGVuZGFyLjwvZGl2Pic7CiAgICAgICAgICAgICAgICAgICAgbWFwQ2FwdGlvbl8xLnRleHRDb250ZW50ID0gJ05vIHJlbGlhYmxlIG1hcCBwaW5zIGZvciB0aGUgc2VsZWN0ZWQgZmlsdGVycy4gVXNlIHRoZSBtb250aCBjYWxlbmRhciBmb3IgdGhlc2UgZXZlbnRzLic7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1fMSA9IGVuc3VyZUxlYWZsZXRNYXAoKTsKICAgICAgICAgICAgICAgICAgICBpZiAobV8xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyTGVhZmxldE1hcmtlcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGMgPSBDSVRZX0NFTlRFUlNfMS5vcmVzdW5kOwogICAgICAgICAgICAgICAgICAgICAgICBtXzEuc2V0VmlldyhbYy5sYXQsIGMubG5nXSwgYy56b29tKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG1vZGUgPSBwbGFubmVyR3JvdXBNb2RlKCk7CiAgICAgICAgICAgICAgICB2YXIgbWFwRXZlbnRzID0gbWFwcGVkLm1hcChmdW5jdGlvbiAoaXRlbSkgeyByZXR1cm4gaXRlbS5ldmVudDsgfSk7CiAgICAgICAgICAgICAgICB2YXIgbGFzdEdyb3VwID0gJyc7CiAgICAgICAgICAgICAgICB2YXIgY2FyZEluZGV4ID0gMDsKICAgICAgICAgICAgICAgIHZhciBtYXBQYXJ0cyA9IFtdOwogICAgICAgICAgICAgICAgbWFwcGVkLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZSA9IGl0ZW0uZXZlbnQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwS2V5ID0gZ3JvdXBLZXlGb3JFdmVudChlLCBtb2RlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBLZXkgJiYgZ3JvdXBLZXkgIT09IGxhc3RHcm91cCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY291bnQgPSBjb3VudEV2ZW50c0Zvckdyb3VwKG1hcEV2ZW50cywgZ3JvdXBLZXksIG1vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBncm91cExhYmVsRm9yS2V5KGdyb3VwS2V5LCBtb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgbWFwUGFydHMucHVzaCgnPGRpdiBjbGFzcz0idHQtbWFwLWdyb3VwLWRpdmlkZXIgdHQtbWFwLWdyb3VwLWRpdmlkZXItJyArIGVzY2FwZUh0bWwobW9kZSkgKyAnIj48c3Bhbj48c3Ryb25nPicgKyBlc2NhcGVIdG1sKGxhYmVsKSArICc8L3N0cm9uZz48c21hbGw+JyArIGVzY2FwZUh0bWwocGx1cmFsaXplKGNvdW50LCAnbWFwcGVkIGV2ZW50JywgJ21hcHBlZCBldmVudHMnKSkgKyAnPC9zbWFsbD48L3NwYW4+PC9kaXY+Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RHcm91cCA9IGdyb3VwS2V5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtYXBQYXJ0cy5wdXNoKCc8YnV0dG9uIHR5cGU9',\n      'ImJ1dHRvbiIgY2xhc3M9InR0LW1hcC1jYXJkICcgKyAoY2FyZEluZGV4ID09PSAwID8gJ2lzLWFjdGl2ZScgOiAnJykgKyAoaXRlbS5jb29yZHMuYXBwcm94aW1hdGUgPyAnIGlzLWFwcHJveCcgOiAnJykgKyAnIiBkYXRhLWV2ZW50LWlkPSInICsgZXNjYXBlSHRtbChlLmlkKSArICciPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPHN0cm9uZz4nICsgZXNjYXBlSHRtbChlLnRpdGxlKSArICc8L3N0cm9uZz4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuPicgKyBlc2NhcGVIdG1sKGZvcm1hdEV2ZW50RGF0ZUxpbmUoZSkpICsgJyAtICcgKyBlc2NhcGVIdG1sKGUuY2l0eSkgKyAnIC0gJyArIGVzY2FwZUh0bWwoZS50eXBlTGFiZWwpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuPicgKyBlc2NhcGVIdG1sKGUubG9jYXRpb24gfHwgaXRlbS5jb29yZHMubGFiZWwgfHwgJ0xvY2F0aW9uIG5vdCBzcGVjaWZpZWQnKSArICc8L3NwYW4+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8c21hbGwgY2xhc3M9IicgKyAoaXRlbS5jb29yZHMuYXBwcm94aW1hdGUgPyAndHQtbWFwLWFwcHJveC1sYWJlbCcgOiAnJykgKyAnIj4nICsgKGl0ZW0uY29vcmRzLmFwcHJveGltYXRlID8gJ0FwcHJveGltYXRlIGNpdHkgcGluJyA6ICdFeGFjdC9rbm93biB2ZW51ZSBwaW4nKSArICc8L3NtYWxsPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPC9idXR0b24+Jyk7CiAgICAgICAgICAgICAgICAgICAgY2FyZEluZGV4Kys7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcExpc3RfMS5pbm5lckhUTUwgPSBtYXBQYXJ0cy5qb2luKCcnKTsKICAgICAgICAgICAgICAgIHZhciBtID0gZW5zdXJlTGVhZmxldE1hcCgpOwogICAgICAgICAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgICAgICAgICAgbWFwQ2FwdGlvbl8xLnRleHRDb250ZW50ID0gJ1RoZSBtYXAgbGlicmFyeSBjb3VsZCBub3QgYmUgbG9hZGVkLiBVc2UgdGhlIG1hcCBsaW5rcyBpbiBsaXN0IHZpZXcuJzsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbGVhckxlYWZsZXRNYXJrZXJzKCk7CiAgICAgICAgICAgICAgICB2YXIgYm91bmRzID0gW107CiAgICAgICAgICAgICAgICBtYXBwZWQuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSkgewogICAgICAgICAgICAgICAgICAgIHZhciBlID0gaXRlbS5ldmVudDsKICAgICAgICAgICAgICAgICAgICB2YXIgYyA9IGl0ZW0uY29vcmRzOwogICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBjLmFwcHJveGltYXRlCiAgICAgICAgICAgICAgICAgICAgICAgID8gTC5jaXJjbGVNYXJrZXIoW2MubGF0LCBjLmxuZ10sIHsgcmFkaXVzOiA5LCB3ZWlnaHQ6IDIsIGNvbG9yOiAnI2JiMGQzZicsIGZpbGxDb2xvcjogJyNiYjBkM2YnLCBmaWxsT3BhY2l0eTogMC4xOCwgZGFzaEFycmF5OiAnNCAzJyB9KS5hZGRUbyhtKQogICAgICAgICAgICAgICAgICAgICAgICA6IEwubWFya2VyKFtjLmxhdCwgYy5sbmddKS5hZGRUbyhtKTsKICAgICAgICAgICAgICAgICAgICBtYXJrZXIuYmluZFBvcHVwKCc8ZGl2IGNsYXNzPSJ0dC1tYXAtcG9wdXAtdGl0bGUiPicgKyBlc2NhcGVI',\n      'dG1sKGUudGl0bGUpICsgJzwvZGl2PjxkaXYgY2xhc3M9InR0LW1hcC1wb3B1cC1tZXRhIj4nICsgZXNjYXBlSHRtbChmb3JtYXRFdmVudERhdGVMaW5lKGUpKSArICcgLSAnICsgZXNjYXBlSHRtbChlLmNpdHkpICsgJzxicj4nICsgZXNjYXBlSHRtbChlLmxvY2F0aW9uIHx8IGMubGFiZWwgfHwgJycpICsgKGMuYXBwcm94aW1hdGUgPyAnPGJyPjxlbT5BcHByb3hpbWF0ZSBjaXR5IGFyZWEgLSB2ZXJpZnkgdmVudWUgaW4gZGV0YWlscy48L2VtPicgOiAnJykgKyAnPC9kaXY+Jyk7CiAgICAgICAgICAgICAgICAgICAgbWFya2VyLmV2ZW50SWQgPSBlLmlkOwogICAgICAgICAgICAgICAgICAgIGxlYWZsZXRNYXJrZXJzXzEucHVzaChtYXJrZXIpOwogICAgICAgICAgICAgICAgICAgIGJvdW5kcy5wdXNoKFtjLmxhdCwgYy5sbmddKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKGJvdW5kcy5sZW5ndGggPiAxKQogICAgICAgICAgICAgICAgICAgIG0uZml0Qm91bmRzKGJvdW5kcywgeyBwYWRkaW5nOiBbNDIsIDQyXSwgbWF4Wm9vbTogMTMgfSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgbS5zZXRWaWV3KGJvdW5kc1swXSwgMTMpOwogICAgICAgICAgICAgICAgdmFyIGFwcHJveGltYXRlQ291bnQgPSBtYXBwZWQuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7IHJldHVybiBpdGVtLmNvb3JkcyAmJiBpdGVtLmNvb3Jkcy5hcHByb3hpbWF0ZTsgfSkubGVuZ3RoOwogICAgICAgICAgICAgICAgbWFwQ2FwdGlvbl8xLnRleHRDb250ZW50ID0gbWFwcGVkLmxlbmd0aCArICcgbWFwIHBpbicgKyAobWFwcGVkLmxlbmd0aCA9PT0gMSA\/ICcnIDogJ3MnKSArICcgc2hvd24uICcgKyAoYXBwcm94aW1hdGVDb3VudCA\/IGFwcHJveGltYXRlQ291bnQgKyAnIHVzZSBhcHByb3hpbWF0ZSBjaXR5LWxldmVsIHBsYWNlbWVudC4gVmVyaWZ5IHRoZSBleGFjdCB2ZW51ZSBpbiB0aGUgZXZlbnQgZGV0YWlscy4nIDogJ0FsbCBzaG93biBwaW5zIGFyZSBleGFjdCBvciBrbm93biB2ZW51ZXMuJyk7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIG0uaW52YWxpZGF0ZVNpemUoKTsgfSwgMTIwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBmZXRjaFRhbmdvU3dlZGVuRXZlbnRzKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXMsIGRhdGEsIHJvd3M7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9fZ2VuZXJhdG9yKHRoaXMsIGZ1bmN0aW9uIChfYSkgewogICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9hLmxhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBbNCAvKnlpZWxkKi8sIGZldGNoKEFQSV9VUkxfMSwgeyBjYWNoZTogJ25vLXN0b3JlJyB9KV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gX2Euc2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzLm9rKQogICAgICAgICAgICAgICAgICAgICAgICAg',\n      'ICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rhbmdvc3dlZGVuLnNlIEhUVFAgJyArIHJlcy5zdGF0dXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbNCAvKnlpZWxkKi8sIHJlcy5qc29uKCldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBfYS5zZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93cyA9IEFycmF5LmlzQXJyYXkoZGF0YSkgPyBkYXRhIDogKGRhdGEucmVzdWx0IHx8IGRhdGEuZXZlbnRzIHx8IGRhdGEuaXRlbXMgfHwgW10pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovLCByb3dzLm1hcChub3JtYWxpemVFdmVudCkuZmlsdGVyKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlICYmIGUuc3RhcnQ7IH0pXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gZmV0Y2hCcm93bkJlYXJFdmVudHMoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlcywgZGF0YSwgcm93czsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX19nZW5lcmF0b3IodGhpcywgZnVuY3Rpb24gKF9hKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoX2EubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMDogcmV0dXJuIFs0IC8qeWllbGQqLywgZmV0Y2goREtfQVBJX1VSTF8xLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBfYS5zZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXMub2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGFuZ28uZGsgSFRUUCAnICsgcmVzLnN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFs0IC8qeWllbGQqLywgcmVzLmpzb24oKV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IF9hLnNlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dzID0gQXJyYXkuaXNBcnJheShkYXRhKSA\/IGRhdGEgOiAoZGF0YS5yZXN1bHQgfHwgZGF0YS5ldmVudHMgfHwgZGF0YS5pdGVtcyB8fCBbXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi8sIHJvd3MubWFwKG5vcm1hbGl6ZUJyb3duQmVhckV2ZW50KS5maWx0ZXIoQm9vbGVhbildOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBsb2FkRXZlbnRzKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRl',\n      'cih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHRzLCBldmVudHMsIHNvdXJjZXMsIHdhcm5pbmdzOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBfX2dlbmVyYXRvcih0aGlzLCBmdW5jdGlvbiAoX2EpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChfYS5sYWJlbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiByZXR1cm4gWzQgLyp5aWVsZCovLCBQcm9taXNlLmFsbFNldHRsZWQoW2ZldGNoVGFuZ29Td2VkZW5FdmVudHMoKSwgZmV0Y2hCcm93bkJlYXJFdmVudHMoKV0pXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gX2Euc2VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRzWzBdLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLnB1c2guYXBwbHkoZXZlbnRzLCByZXN1bHRzWzBdLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKCdUYW5nb3N3ZWRlbi5zZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goJ1Rhbmdvc3dlZGVuLnNlIGNvdWxkIG5vdCBiZSBsb2FkZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0c1sxXS5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy5wdXNoLmFwcGx5KGV2ZW50cywgcmVzdWx0c1sxXS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaCgnVGFuZ28uZGsnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5wdXNoKCdEZW5tYXJrIGNvdWxkIG5vdCBiZSBsb2FkZWQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV8xLmFsbEV2ZW50cyA9IGRlZHVwZUV2ZW50cyhldmVudHMpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIGEuc3RhcnQgLSBiLnN0YXJ0OyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wdWxhdGVNb250aFNlbGVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3B1bGF0ZVdlZWtTZWxlY3QoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYg',\n      'KHVwZGF0ZWRFbF8xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEVsXzEudGV4dENvbnRlbnQgPSAnVXBkYXRlZDogJyArIG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCdlbi1HQicsIHsgaG91cjogJzItZGlnaXQnLCBtaW51dGU6ICcyLWRpZ2l0JyB9KSArICcgLSBTb3VyY2VzOiAnICsgc291cmNlcy5qb2luKCcgKyAnKSArICh3YXJuaW5ncy5sZW5ndGggPyAnIC0gJyArIHdhcm5pbmdzLmpvaW4oJyAtICcpIDogJycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBseUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFsyIC8qcmV0dXJuKi9dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRFbF8xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudEVsXzEudGV4dENvbnRlbnQgPSAnVGhlIGNhbGVuZGFyIGNvdWxkIG5vdCBiZSBsb2FkZWQnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVkRWxfMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZEVsXzEudGV4dENvbnRlbnQgPSAnU291cmNlczogVGFuZ29zd2VkZW4uc2UgKyBUYW5nby5kayc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RFbF8xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0RWxfMS5pbm5lckhUTUwgPSAiPGRpdiBjbGFzcz1cInR0LWVtcHR5XCI+PHN0cm9uZz5UaGUgY2FsZW5kYXIgY291bGQgbm90IGJlIGxvYWRlZCByaWdodCBub3cuPC9zdHJvbmc+PGJyPk9wZW4gVGFuZ29zd2VkZW4uc2Ugb3IgVGFuZ28uZGsgZGlyZWN0bHksIG9yIHRyeSBhZ2FpbiBpbiBhIG1vbWVudC48ZGl2IGNsYXNzPVwidHQtYnRuLXJvd1wiPjxhIGNsYXNzPVwidHQtYnRuIHR0LWJ0bi1wcmltYXJ5XCIgaHJlZj1cIiIuY29uY2F0KFRTX0NBTEVOREFSX1VSTF8xLCAiXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXJcIj5PcGVuIFRhbmdvc3dlZGVuLnNlPC9hPjxhIGNsYXNzPVwidHQtYnRuIHR0LWJ0bi1zZWNvbmRhcnlcIiBocmVmPVwiIikuY29uY2F0KERLX0NBTEVOREFSX1VSTF8xLCAiXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXJcIj5PcGVuIFRhbmdvLmRrPC9hPjwvZGl2PjwvZGl2PiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbMiAvKnJldHVybiovXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gYWxsb3dlZFJlZ2lvbnNGb3JDb3VudHJ5KGNvdW50cnkpIHsKICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5ID09PSAnc2UnKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBbJ2FsbCcsICdza2FuZScsICdsb2NhbCcsICdsdW5kJywgJ21hbG1vJywgJ2hlbHNpbmdib3JnJywgJ3lzdGFkJ107CiAgICAgICAgICAgICAgICBpZiAoY291bnRyeSA9PT0gJ2RrJykKICAgICAgICAgICAgICAg',\n      'ICAgICByZXR1cm4gWydhbGwnLCAnY29wZW5oYWdlbicsICdkZW5tYXJrJ107CiAgICAgICAgICAgICAgICByZXR1cm4gWydhbGwnLCAnc2thbmUtY29wZW5oYWdlbicsICdza2FuZScsICdsb2NhbCcsICdsdW5kJywgJ21hbG1vJywgJ2hlbHNpbmdib3JnJywgJ3lzdGFkJywgJ2NvcGVuaGFnZW4nLCAnZGVubWFyayddOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGRlZmF1bHRSZWdpb25Gb3JDb3VudHJ5KGNvdW50cnkpIHsKICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5ID09PSAnZGsnKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnYWxsJzsKICAgICAgICAgICAgICAgIGlmIChjb3VudHJ5ID09PSAnc2UnKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAnYWxsJzsKICAgICAgICAgICAgICAgIHJldHVybiAnc2thbmUtY29wZW5oYWdlbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gdXBkYXRlUmVnaW9uT3B0aW9uc0ZvckNvdW50cnkoKSB7CiAgICAgICAgICAgICAgICB2YXIgYWxsb3dlZCA9IGFsbG93ZWRSZWdpb25zRm9yQ291bnRyeShzdGF0ZV8xLmNvdW50cnkpOwogICAgICAgICAgICAgICAgdmFyIHJlZ2lvbkJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjdHQtcmVnaW9uLWZpbHRlcnMgLnR0LWNoaXAnKTsKICAgICAgICAgICAgICAgIHZhciBhY3RpdmVTdGlsbEFsbG93ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHJlZ2lvbkJ1dHRvbnMuZm9yRWFjaChmdW5jdGlvbiAoYnRuKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZ2lvbiA9IGJ0bi5kYXRhc2V0LnJlZ2lvbiB8fCAnJzsKICAgICAgICAgICAgICAgICAgICB2YXIgaXNBbGxvd2VkID0gYWxsb3dlZC5pbmNsdWRlcyhyZWdpb24pOwogICAgICAgICAgICAgICAgICAgIGJ0bi5jbGFzc0xpc3QudG9nZ2xlKCdpcy1jb3VudHJ5LWhpZGRlbicsICFpc0FsbG93ZWQpOwogICAgICAgICAgICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9ICFpc0FsbG93ZWQ7CiAgICAgICAgICAgICAgICAgICAgYnRuLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBpc0FsbG93ZWQgPyAnZmFsc2UnIDogJ3RydWUnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNBbGxvd2VkICYmIHJlZ2lvbiA9PT0gc3RhdGVfMS5yZWdpb24pCiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVN0aWxsQWxsb3dlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICghYWN0aXZlU3RpbGxBbGxvd2VkKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGVfMS5yZWdpb24gPSBkZWZhdWx0UmVnaW9uRm9yQ291bnRyeShzdGF0ZV8xLmNvdW50cnkpOwogICAgICAgICAgICAgICAgICAgIHNldEluaXRpYWxDaGlwKCcjdHQtcmVnaW9uLWZpbHRlcnMnLCAncmVnaW9uJywgc3RhdGVfMS5yZWdpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHNldEluaXRpYWxDaGlwKHNlbGVjdG9yLCBhdHRyLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgdmFyIGJ1dHRvbnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yICsgJyAudHQtY2hpcCcpOwogICAgICAgICAgICAgICAgdmFyIGZvdW5kID0gZmFs',\n      'c2U7CiAgICAgICAgICAgICAgICBidXR0b25zLmZvckVhY2goZnVuY3Rpb24gKGIpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaXMgPSBiLmRhdGFzZXRbYXR0cl0gPT09IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGIuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtYWN0aXZlJywgaXMpOwogICAgICAgICAgICAgICAgICAgIGlmIChpcykKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kICYmIGJ1dHRvbnNbMF0pCiAgICAgICAgICAgICAgICAgICAgYnV0dG9uc1swXS5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBiaW5kQ2hpcEdyb3VwKHNlbGVjdG9yLCBrZXksIGRhdGFOYW1lKSB7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yICsgJyAudHQtY2hpcCcpLmZvckVhY2goZnVuY3Rpb24gKGJ0bikgewogICAgICAgICAgICAgICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvciArICcgLnR0LWNoaXAnKS5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7IHJldHVybiBiLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpOyB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpOwogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV8xW2tleV0gPSBidG4uZGF0YXNldFtkYXRhTmFtZV0gfHwgc3RhdGVfMVtrZXldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAnY291bnRyeScpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVSZWdpb25PcHRpb25zRm9yQ291bnRyeSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ID09PSAndGltZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWRNb250aCA9ICdhbnknOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZFdlZWsgPSAnYW55JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWREYXkgPSAnYW55JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb250aEVsXzEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhFbF8xLnZhbHVlID0gJ2FueSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2Vla0VsXzEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla0VsXzEudmFsdWUgPSAnYW55JzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzYXZlRmlsdGVycygpOwogICAgICAgICAgICAgICAgICAgICAgICBhcHBseUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJpbmRDaGlwR3JvdXAoJyN0dC1jb3VudHJ5LWZpbHRlcnMnLCAnY291bnRyeScsICdjb3VudHJ5Jyk7CiAgICAgICAgICAgIGJpbmRDaGlwR3JvdXAoJyN0dC1y',\n      'ZWdpb24tZmlsdGVycycsICdyZWdpb24nLCAncmVnaW9uJyk7CiAgICAgICAgICAgIGJpbmRDaGlwR3JvdXAoJyN0dC10eXBlLWZpbHRlcnMnLCAndHlwZScsICd0eXBlJyk7CiAgICAgICAgICAgIGJpbmRDaGlwR3JvdXAoJyN0dC10aW1lLWZpbHRlcnMnLCAndGltZScsICd0aW1lJyk7CiAgICAgICAgICAgIGlmIChzZWFyY2hFbF8xKSB7CiAgICAgICAgICAgICAgICBzZWFyY2hFbF8xLnZhbHVlID0gc3RhdGVfMS5zZWFyY2g7CiAgICAgICAgICAgICAgICBzZWFyY2hFbF8xLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VhcmNoID0gc2VhcmNoRWxfMS52YWx1ZSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICBpZiAoaGVyb1NlYXJjaEVsXzEpCiAgICAgICAgICAgICAgICAgICAgICAgIGhlcm9TZWFyY2hFbF8xLnZhbHVlID0gc3RhdGVfMS5zZWFyY2g7CiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgICAgICBhcHBseUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChoZXJvU2VhcmNoRWxfMSkgewogICAgICAgICAgICAgICAgaGVyb1NlYXJjaEVsXzEudmFsdWUgPSBzdGF0ZV8xLnNlYXJjaDsKICAgICAgICAgICAgICAgIGhlcm9TZWFyY2hFbF8xLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VhcmNoID0gaGVyb1NlYXJjaEVsXzEudmFsdWUgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaEVsXzEpCiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaEVsXzEudmFsdWUgPSBzdGF0ZV8xLnNlYXJjaDsKICAgICAgICAgICAgICAgICAgICBzYXZlRmlsdGVycygpOwogICAgICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVycygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxpbWl0RWxfMSkgewogICAgICAgICAgICAgICAgbGltaXRFbF8xLnZhbHVlID0gU3RyaW5nKHN0YXRlXzEubGltaXQpOwogICAgICAgICAgICAgICAgbGltaXRFbF8xLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZV8xLmxpbWl0ID0gTnVtYmVyKGxpbWl0RWxfMS52YWx1ZSkgfHwgMTA7CiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgICAgICBhcHBseUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdGFydFRpbWVFbF8xKSB7CiAgICAgICAgICAgICAgICBzdGFydFRpbWVFbF8xLnZhbHVlID0gc3RhdGVfMS5zdGFydFRpbWUgfHwgJ2FueSc7CiAgICAgICAgICAgICAgICBzdGFydFRpbWVFbF8xLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZV8xLnN0YXJ0VGltZSA9IHN0YXJ0VGltZUVsXzEudmFsdWUgfHwgJ2FueSc7CiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgICAgICBhcHBseUZpbHRlcnMoKTsKICAgICAgICAg',\n      'ICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtb250aEVsXzEpIHsKICAgICAgICAgICAgICAgIG1vbnRoRWxfMS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZE1vbnRoID0gbW9udGhFbF8xLnZhbHVlIHx8ICdhbnknOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZV8xLnNlbGVjdGVkTW9udGggIT09ICdhbnknKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWRXZWVrID0gJ2FueSc7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWREYXkgPSAnYW55JzsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWluaUNhbGVuZGFyTW9udGhGcm9tTW9udGhLZXkoc3RhdGVfMS5zZWxlY3RlZE1vbnRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdlZWtFbF8xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla0VsXzEudmFsdWUgPSAnYW55JzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlXzEudGltZSAhPT0gJ3VwY29taW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfMS50aW1lID0gJ3VwY29taW5nJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEluaXRpYWxDaGlwKCcjdHQtdGltZS1maWx0ZXJzJywgJ3RpbWUnLCBzdGF0ZV8xLnRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHNhdmVGaWx0ZXJzKCk7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlGaWx0ZXJzKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAod2Vla0VsXzEpIHsKICAgICAgICAgICAgICAgIHdlZWtFbF8xLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZV8xLnNlbGVjdGVkV2VlayA9IHdlZWtFbF8xLnZhbHVlIHx8ICdhbnknOwogICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZV8xLnNlbGVjdGVkV2VlayAhPT0gJ2FueScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZE1vbnRoID0gJ2FueSc7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWREYXkgPSAnYW55JzsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWluaUNhbGVuZGFyTW9udGhGcm9tRGF5S2V5KHN0YXRlXzEuc2VsZWN0ZWRXZWVrKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vbnRoRWxfMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoRWxfMS52YWx1ZSA9ICdhbnknOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS50aW1lICE9PSAndXBjb21pbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZV8xLnRpbWUgPSAndXBjb21pbmcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0SW5pdGlhbENoaXAoJyN0dC10aW1lLWZpbHRlcnMnLCAndGltZScsIHN0YXRlXzEudGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2F2',\n      'ZUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgICAgICBhcHBseUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzaG93TW9yZSA9ICRfMSgndHQtc2hvdy1tb3JlJyk7CiAgICAgICAgICAgIGlmIChzaG93TW9yZSkgewogICAgICAgICAgICAgICAgc2hvd01vcmUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGVfMS5saW1pdCArPSAxMDsKICAgICAgICAgICAgICAgICAgICBpZiAobGltaXRFbF8xICYmIFsnMTAnLCAnMjAnLCAnOTk5J10uaW5jbHVkZXMoU3RyaW5nKHN0YXRlXzEubGltaXQpKSkKICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRFbF8xLnZhbHVlID0gU3RyaW5nKHN0YXRlXzEubGltaXQpOwogICAgICAgICAgICAgICAgICAgIHNhdmVGaWx0ZXJzKCk7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlGaWx0ZXJzKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2xlYXJEYXRlQnRuKSB7CiAgICAgICAgICAgICAgICBjbGVhckRhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7IGNsZWFyRGF0ZVNlbGVjdGlvbigpOyBzYXZlRmlsdGVycygpOyBhcHBseUZpbHRlcnMoKTsgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlc2V0RmlsdGVyc0J0bikgewogICAgICAgICAgICAgICAgcmVzZXRGaWx0ZXJzQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVzZXRBbGxGaWx0ZXJzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAod2Vla2VuZFNob3J0Y3V0KSB7CiAgICAgICAgICAgICAgICB3ZWVrZW5kU2hvcnRjdXQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGVfMS50aW1lID0gJ3dlZWtlbmQnOwogICAgICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWRNb250aCA9ICdhbnknOwogICAgICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWRXZWVrID0gJ2FueSc7CiAgICAgICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZERheSA9ICdhbnknOwogICAgICAgICAgICAgICAgICAgIGlmIChtb250aEVsXzEpCiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoRWxfMS52YWx1ZSA9ICdhbnknOwogICAgICAgICAgICAgICAgICAgIGlmICh3ZWVrRWxfMSkKICAgICAgICAgICAgICAgICAgICAgICAgd2Vla0VsXzEudmFsdWUgPSAnYW55JzsKICAgICAgICAgICAgICAgICAgICBzZXRJbml0aWFsQ2hpcCgnI3R0LXRpbWUtZmlsdGVycycsICd0aW1lJywgc3RhdGVfMS50aW1lKTsKICAgICAgICAgICAgICAgICAgICBzYXZlRmlsdGVycygpOwogICAgICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVycygpOwogICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndHQtY2FsZW5kYXInKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pOwogICAgICAgICAgICAgICAgfSk7',\n      'CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1pbmlUaXRsZUJ0bikgewogICAgICAgICAgICAgICAgbWluaVRpdGxlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdFZpc2libGVDYWxlbmRhck1vbnRoKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobWluaVNlbGVjdE1vbnRoKSB7CiAgICAgICAgICAgICAgICBtaW5pU2VsZWN0TW9udGguYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0VmlzaWJsZUNhbGVuZGFyTW9udGgoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldENhbGVuZGFyUGlja01vZGUoc3RhdGVfMS5jYWxlbmRhclBpY2tNb2RlIHx8ICdkYXknKTsKICAgICAgICAgICAgaWYgKG1pbmlQcmV2KSB7CiAgICAgICAgICAgICAgICBtaW5pUHJldi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBtaW5pQ2FsZW5kYXJDdXJzb3JfMSA9IG5ldyBEYXRlKG1pbmlDYWxlbmRhckN1cnNvcl8xLmdldEZ1bGxZZWFyKCksIG1pbmlDYWxlbmRhckN1cnNvcl8xLmdldE1vbnRoKCkgLSAxLCAxKTsKICAgICAgICAgICAgICAgICAgICByZW5kZXJNaW5pQ2FsZW5kYXIoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtaW5pTmV4dCkgewogICAgICAgICAgICAgICAgbWluaU5leHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgbWluaUNhbGVuZGFyQ3Vyc29yXzEgPSBuZXcgRGF0ZShtaW5pQ2FsZW5kYXJDdXJzb3JfMS5nZXRGdWxsWWVhcigpLCBtaW5pQ2FsZW5kYXJDdXJzb3JfMS5nZXRNb250aCgpICsgMSwgMSk7CiAgICAgICAgICAgICAgICAgICAgcmVuZGVyTWluaUNhbGVuZGFyKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgbW9udGhCdG4gPSBlLnRhcmdldC5jbG9zZXN0KCcjdHQtbW9udGgtcmFpbCAudHQtbW9udGgtcGlsbCcpOwogICAgICAgICAgICAgICAgaWYgKG1vbnRoQnRuKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGVfMS5zZWxlY3RlZE1vbnRoID0gbW9udGhCdG4uZGF0YXNldC5tb250aCB8fCAnYW55JzsKICAgICAgICAgICAgICAgICAgICBzdGF0ZV8xLnNlbGVjdGVkV2VlayA9ICdhbnknOwogICAgICAgICAgICAgICAgICAgIHN0YXRlXzEuc2VsZWN0ZWREYXkgPSAnYW55JzsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGVfMS5zZWxlY3RlZE1vbnRoICE9PSAnYW55JykKICAgICAgICAgICAgICAgICAgICAgICAgc2V0TWluaUNhbGVuZGFyTW9udGhGcm9tTW9udGhLZXkoc3RhdGVfMS5zZWxlY3RlZE1vbnRoKTsKICAgICAgICAgICAgICAgICAgICBzdGF0ZV8xLnRpbWUgPSAndXBjb21pbmcnOwogICAgICAgICAgICAgICAgICAgIGlmIChtb250aEVsXzEpCiAgICAgICAgICAgICAgICAgICAgICAg',\n      'IG1vbnRoRWxfMS52YWx1ZSA9IHN0YXRlXzEuc2VsZWN0ZWRNb250aDsKICAgICAgICAgICAgICAgICAgICBpZiAod2Vla0VsXzEpCiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtFbF8xLnZhbHVlID0gJ2FueSc7CiAgICAgICAgICAgICAgICAgICAgc2V0SW5pdGlhbENoaXAoJyN0dC10aW1lLWZpbHRlcnMnLCAndGltZScsIHN0YXRlXzEudGltZSk7CiAgICAgICAgICAgICAgICAgICAgc2F2ZUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgICAgICBhcHBseUZpbHRlcnMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBtaW5pV2VlayA9IGUudGFyZ2V0LmNsb3Nlc3QoJyN0dC1taW5pLWNhbGVuZGFyLWdyaWQgLnR0LW1pbmktd2Vlay1idG4nKTsKICAgICAgICAgICAgICAgIGlmIChtaW5pV2VlayAmJiAhbWluaVdlZWsuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RXZWVrRnJvbUNhbGVuZGFyKG1pbmlXZWVrLmRhdGFzZXQud2VlayB8fCAnYW55Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgbWluaURheSA9IGUudGFyZ2V0LmNsb3Nlc3QoJyN0dC1taW5pLWNhbGVuZGFyLWdyaWQgLnR0LW1pbmktZGF5Jyk7CiAgICAgICAgICAgICAgICBpZiAobWluaURheSAmJiAhbWluaURheS5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdERheUZyb21DYWxlbmRhcihtaW5pRGF5LmRhdGFzZXQuZGF5IHx8ICdhbnknKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBlbXB0eVJlc2V0ID0gZS50YXJnZXQuY2xvc2VzdCgnI3R0LWVtcHR5LXJlc2V0Jyk7CiAgICAgICAgICAgICAgICBpZiAoZW1wdHlSZXNldCkKICAgICAgICAgICAgICAgICAgICByZXNldEFsbEZpbHRlcnMoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChzaW1wbGVQcmV2TW9udGhfMSkgewogICAgICAgICAgICAgICAgc2ltcGxlUHJldk1vbnRoXzEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7IHNoaWZ0U2ltcGxlTW9udGgoLTEpOyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2ltcGxlTmV4dE1vbnRoXzEpIHsKICAgICAgICAgICAgICAgIHNpbXBsZU5leHRNb250aF8xLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgeyBzaGlmdFNpbXBsZU1vbnRoKDEpOyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2ltcGxlU2hvd0V2ZXJ5dGhpbmdfMSkgewogICAgICAgICAgICAgICAgc2ltcGxlU2hvd0V2ZXJ5dGhpbmdfMS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsgc2hvd1NpbXBsZUNhbGVuZGFyKCk7IH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1vcmVEaXNwbGF5QnV0dG9uc18xLmZvckVhY2goZnVuY3Rpb24gKGJ0bikgewogICAgICAgICAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlXzEubW9yZUNob2ljZXNEaXNwbGF5ID0gYnRuLmRhdGFzZXQubW9yZURpc3BsYXkgfHwgJ2NhbGVuZGFyJzsKICAgICAgICAgICAgICAgICAgICBzYXZlRmlsdGVycygpOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZU1v',\n      'cmVEaXNwbGF5QnV0dG9ucygpOwogICAgICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVycygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudHQtdmlldy1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uIChidG4pIHsKICAgICAgICAgICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbW9kZSA9IGJ0bi5kYXRhc2V0Lm1vZGUgfHwgKGJ0bi5kYXRhc2V0LnZpZXcgPT09ICdtYXAnID8gJ21hcCcgOiAnZmlsdGVycycpOwogICAgICAgICAgICAgICAgICAgIHN0YXRlXzEudWlNb2RlID0gbW9kZTsKICAgICAgICAgICAgICAgICAgICBzdGF0ZV8xLnZpZXcgPSBidG4uZGF0YXNldC52aWV3IHx8IChtb2RlID09PSAnbWFwJyA\/ICdtYXAnIDogJ2xpc3QnKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3NpbXBsZScpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1NpbXBsZUNhbGVuZGFyKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKChtb2RlID09PSAnZmlsdGVycycgfHwgbW9kZSA9PT0gJ21hcCcpICYmIGZpbHRlclBhbmVsXzEgJiYgZmlsdGVyVG9nZ2xlXzEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGZpbHRlclBhbmVsXzEuZGF0YXNldC51c2VyVG9nZ2xlZEZpbHRlcjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5tYXRjaE1lZGlhICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA2ODBweCknKS5tYXRjaGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0Q29sbGFwc2VkKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRDb2xsYXBzZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBzYXZlRmlsdGVycygpOwogICAgICAgICAgICAgICAgICAgIGFwcGx5RmlsdGVycygpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICB2YXIgbWFwQnRuID0gZS50YXJnZXQuY2xvc2VzdCgnLnR0LW1hcC1jYXJkJyk7CiAgICAgICAgICAgICAgICBpZiAoIW1hcEJ0biB8fCAhbGVhZmxldE1hcF8xKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50dC1tYXAtY2FyZCcpLmZvckVhY2goZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGIuY2xhc3NMaXN0LnJlbW92ZSgnaXMtYWN0aXZlJyk7IH0pOwogICAgICAgICAgICAgICAgbWFwQnRuLmNsYXNzTGlzdC5hZGQoJ2lzLWFjdGl2ZScpOwogICAgICAgICAgICAgICAgdmFyIGlkID0gbWFwQnRuLmRhdGFzZXQuZXZlbnRJZCB8fCAnJzsKICAgICAgICAgICAgICAgIHZhciBtYXJrZXIgPSBsZWFmbGV0TWFya2Vyc18xLmZpbmQoZnVuY3Rpb24gKG0pIHsgcmV0dXJuIG0uZXZlbnRJZCA9',\n      'PT0gaWQ7IH0pOwogICAgICAgICAgICAgICAgaWYgKG1hcmtlcikgewogICAgICAgICAgICAgICAgICAgIGxlYWZsZXRNYXBfMS5zZXRWaWV3KG1hcmtlci5nZXRMYXRMbmcoKSwgTWF0aC5taW4oMTMsIGxlYWZsZXRNYXBfMS5nZXRab29tKCkgPCAxMSA\/IDEyIDogbGVhZmxldE1hcF8xLmdldFpvb20oKSkpOwogICAgICAgICAgICAgICAgICAgIG1hcmtlci5vcGVuUG9wdXAoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8qIFJlbW92ZWQgb2Jzb2xldGUgY29weSBhbmQgZGlyZWN0IGV2ZW50LWNhcmQgZXh0ZXJuYWwtbGluayBoYW5kbGVycy4gKi8KICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3R0LWFjdG9yLWNvbnRyb2xzIC50dC1jaGlwJykuZm9yRWFjaChmdW5jdGlvbiAoYnRuKSB7CiAgICAgICAgICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGYgPSBidG4uZGF0YXNldC5hY3RvckZpbHRlciB8fCAnYWxsJzsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjdHQtYWN0b3ItY29udHJvbHMgLnR0LWNoaXAnKS5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7IHJldHVybiBiLmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWFjdGl2ZScpOyB9KTsKICAgICAgICAgICAgICAgICAgICBidG4uY2xhc3NMaXN0LmFkZCgnaXMtYWN0aXZlJyk7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI3R0LWFjdG9yLWdyaWQtc2Nob29scyAudHQtYWN0b3ItY2FyZCwgI3R0LWFjdG9yLWdyaWQtc29jaWFsIC50dC1hY3Rvci1jYXJkJykuZm9yRWFjaChmdW5jdGlvbiAoY2FyZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaGF5ID0gY2FyZC5kYXRhc2V0LmFjdG9yIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBjYXJkLnN0eWxlLmRpc3BsYXkgPSAoZiA9PT0gJ2FsbCcgfHwgaGF5LmluY2x1ZGVzKGYpKSA\/ICcnIDogJ25vbmUnOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmdW5jdGlvbiBzZXRDb2xsYXBzZWQoY29sbGFwc2VkKSB7CiAgICAgICAgICAgICAgICBpZiAoIWZpbHRlclBhbmVsXzEgfHwgIWZpbHRlclRvZ2dsZV8xKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIGZpbHRlclBhbmVsXzEuY2xhc3NMaXN0LnRvZ2dsZSgnaXMtY29sbGFwc2VkJywgY29sbGFwc2VkKTsKICAgICAgICAgICAgICAgIGZpbHRlclRvZ2dsZV8xLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIFN0cmluZyghY29sbGFwc2VkKSk7CiAgICAgICAgICAgICAgICBmaWx0ZXJUb2dnbGVfMS50ZXh0Q29udGVudCA9IGNvbGxhcHNlZCA\/ICdTaG93IGZpbHRlcnMnIDogJ0hpZGUgZmlsdGVycyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG1xXzEgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogNjgwcHgpJyk7CiAgICAgICAgICAgIGZ1bmN0aW9uIGFwcGx5UmVzcG9uc2l2ZUZpbHRlckRlZmF1bHQoKSB7CiAgICAgICAgICAgICAgICBpZiAobXFfMS5tYXRj',\n      'aGVzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJQYW5lbF8xLmRhdGFzZXQudXNlclRvZ2dsZWRGaWx0ZXIpCiAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbGxhcHNlZCh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICBzZXRDb2xsYXBzZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgdXBkYXRlTW9iaWxlU3VtbWFyeSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmaWx0ZXJUb2dnbGVfMSkgewogICAgICAgICAgICAgICAgZmlsdGVyVG9nZ2xlXzEuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGFuZWxfMS5kYXRhc2V0LnVzZXJUb2dnbGVkRmlsdGVyID0gJzEnOwogICAgICAgICAgICAgICAgICAgIHNldENvbGxhcHNlZCghZmlsdGVyUGFuZWxfMS5jbGFzc0xpc3QuY29udGFpbnMoJ2lzLWNvbGxhcHNlZCcpKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtcV8xLmFkZEV2ZW50TGlzdGVuZXIpCiAgICAgICAgICAgICAgICBtcV8xLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFwcGx5UmVzcG9uc2l2ZUZpbHRlckRlZmF1bHQpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBtcV8xLmFkZExpc3RlbmVyKGFwcGx5UmVzcG9uc2l2ZUZpbHRlckRlZmF1bHQpOwogICAgICAgICAgICBzZXRJbml0aWFsQ2hpcCgnI3R0LWNvdW50cnktZmlsdGVycycsICdjb3VudHJ5Jywgc3RhdGVfMS5jb3VudHJ5KTsKICAgICAgICAgICAgc2V0SW5pdGlhbENoaXAoJyN0dC1yZWdpb24tZmlsdGVycycsICdyZWdpb24nLCBzdGF0ZV8xLnJlZ2lvbik7CiAgICAgICAgICAgIHVwZGF0ZVJlZ2lvbk9wdGlvbnNGb3JDb3VudHJ5KCk7CiAgICAgICAgICAgIHNldEluaXRpYWxDaGlwKCcjdHQtdHlwZS1maWx0ZXJzJywgJ3R5cGUnLCBzdGF0ZV8xLnR5cGUpOwogICAgICAgICAgICBzZXRJbml0aWFsQ2hpcCgnI3R0LXRpbWUtZmlsdGVycycsICd0aW1lJywgc3RhdGVfMS50aW1lKTsKICAgICAgICAgICAgYXBwbHlSZXNwb25zaXZlRmlsdGVyRGVmYXVsdCgpOwogICAgICAgICAgICB1cGRhdGVWaWV3TW9kZUJ1dHRvbnMoKTsKICAgICAgICAgICAgdXBkYXRlU2ltcGxlQnJvd3NlcigpOwogICAgICAgICAgICBsb2FkRXZlbnRzKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGVyZXNpdGEgcGxhbm5lciBzdGFydCBlcnJvcicsIGVycik7CiAgICAgICAgICAgIHZhciBjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R0LWV2ZW50LWNvdW50Jyk7CiAgICAgICAgICAgIHZhciBsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R0LWV2ZW50LWxpc3QnKTsKICAgICAgICAgICAgaWYgKGMpCiAgICAgICAgICAgICAgICBjLnRleHRDb250ZW50ID0gJ0NhbGVuZGFyIHNjcmlwdCBlcnJvcic7CiAgICAgICAgICAgIGlmIChsKQogICAgICAgICAgICAgICAgbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz0idHQtZW1wdHkiPjxzdHJvbmc+VGhlIGNhbGVuZGFyIHNjcmlwdCBmYWlsZWQgdG8gc3RhcnQuPC9zdHJvbmc+PGJyPk9w',\n      'ZW4gRGV2VG9vbHMgXHUyMTkyIENvbnNvbGUgYW5kIHNlbmQgdGhlIGZpcnN0IHJlZCBlcnJvciBtZXNzYWdlLjwvZGl2Pic7CiAgICAgICAgfQogICAgfSk7Cn0pKCk7Cgo='\n    ].join('');\n    var code=atob(encoded);\n    var s=document.createElement('script');\n    s.type='text\/javascript';\n    s.text=code;\n    (document.head||document.documentElement).appendChild(s);\n  }catch(e){\n    showError(e && e.message ? e.message : e);\n    if(window.console && console.error) console.error('Calendar loader failed', e);\n  }\n})();\n<\/script>\n\n<script>\n(function(){\n  if (window.__SKANE_CALENDAR_RENDER_SANITIZER__) return;\n  window.__SKANE_CALENDAR_RENDER_SANITIZER__ = true;\n\n  \/*\n    Post-render sanitizer:\n    - removes copied description\/detail panels after render\n    - removes blocked source links\n    - keeps factual event cards and source attribution\n  *\/\n\n  var blockedUrlPatterns = [\n    \/tangodk\/i,\n    \/tango\\.dk\/i,\n    \/brownbearsw\\.com\/i,\n    \/brownbear\/i,\n    \/teresitatango\\.se\/i\n  ];\n\n  var blockedVisibleTextPatterns = [\n    \/Tango\\.dk\/gi,\n    \/Brown Bear\/gi,\n    \/Copenhagen\/gi,\n    \/Denmark\/gi,\n    \/Sk\u00e5ne \\+ Copenhagen\/gi,\n    \/Teresita Tango\/gi,\n    \/Teresita\/gi,\n    \/official calendar\/gi,\n    \/complete calendar\/gi\n  ];\n\n  function isBlockedUrl(url) {\n    url = String(url || '');\n    return blockedUrlPatterns.some(function(rx){ return rx.test(url); });\n  }\n\n  function cleanTextNodes(root) {\n    if (!root) return;\n\n    var walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n    var node;\n\n    while ((node = walker.nextNode())) {\n      var text = node.nodeValue || '';\n      blockedVisibleTextPatterns.forEach(function(rx){\n        text = text.replace(rx, '');\n      });\n      node.nodeValue = text;\n    }\n  }\n\n  function removeLongDetails(root) {\n    [\n      '.tt-event-details-toggle-wrap',\n      '.tt-details-toggle',\n      '.tt-event-details-panel',\n      '.tt-event-details-scroll',\n      '.tt-outlook-detail-scroll',\n      '.tt-mobile-day-detail-scroll'\n    ].forEach(function(selector){\n      root.querySelectorAll(selector).forEach(function(el){\n        el.remove();\n      });\n    });\n  }\n\n  function removeBlockedLinks(root) {\n    root.querySelectorAll('a[href]').forEach(function(a){\n      var href = a.getAttribute('href') || '';\n\n      if (isBlockedUrl(href)) {\n        a.removeAttribute('href');\n        a.removeAttribute('target');\n        a.removeAttribute('rel');\n        a.style.display = 'none';\n      }\n    });\n  }\n\n  function forceSourceStatus() {\n    var updated = document.getElementById('tt-event-updated');\n    if (updated) {\n      updated.textContent = 'Sk\u00e5ne event data: TangoSweden.se, used with permission.';\n    }\n  }\n\n  function sanitize() {\n    var root = document.getElementById('tt-region');\n    if (!root) return;\n\n    removeLongDetails(root);\n    removeBlockedLinks(root);\n    cleanTextNodes(root);\n    forceSourceStatus();\n  }\n\n  function scheduleSanitize() {\n    clearTimeout(scheduleSanitize._timer);\n    scheduleSanitize._timer = setTimeout(sanitize, 80);\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', sanitize);\n  } else {\n    sanitize();\n  }\n\n  window.addEventListener('load', sanitize);\n\n  var root = document.getElementById('tt-region');\n  if (root && 'MutationObserver' in window) {\n    new MutationObserver(scheduleSanitize).observe(root, {\n      childList: true,\n      subtree: true\n    });\n  }\n})();\n<\/script>\n\n\n<\/section>\n\n","protected":false},"excerpt":{"rendered":"<p>Event index \u00b7 Sk\u00e5ne \u00b7 factual listings Sk\u00e5ne Calendar A practical event calendar for Sk\u00e5ne, built as a factual index with clear links to the original sources. Event index. Always [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-1891","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>Tango in Sk\u00e5ne - Teresita Tango<\/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:\/\/www.teresitatango.se\/en\/skane-calendar\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tango in Sk\u00e5ne - Teresita Tango\" \/>\n<meta property=\"og:description\" content=\"Event index \u00b7 Sk\u00e5ne \u00b7 factual listings Sk\u00e5ne Calendar A practical event calendar for Sk\u00e5ne, built as a factual index with clear links to the original sources. Event index. Always [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.teresitatango.se\/en\/skane-calendar\/\" \/>\n<meta property=\"og:site_name\" content=\"Teresita Tango\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-16T19:59:11+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.teresitatango.se\\\/skane-calendar\\\/\",\"url\":\"https:\\\/\\\/www.teresitatango.se\\\/skane-calendar\\\/\",\"name\":\"Tango in Sk\u00e5ne - Teresita Tango\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.teresitatango.se\\\/#website\"},\"datePublished\":\"2026-05-24T09:52:28+00:00\",\"dateModified\":\"2026-08-16T19:59:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.teresitatango.se\\\/skane-calendar\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.teresitatango.se\\\/skane-calendar\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.teresitatango.se\\\/skane-calendar\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.teresitatango.se\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tango in Sk\u00e5ne\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.teresitatango.se\\\/#website\",\"url\":\"https:\\\/\\\/www.teresitatango.se\\\/\",\"name\":\"Teresita Tango\",\"description\":\"Argentinsk Tango i Lund. L\u00e4r dig att dansa!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.teresitatango.se\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.teresitatango.se\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.teresitatango.se\\\/#organization\",\"name\":\"Teresita Tango\",\"url\":\"https:\\\/\\\/www.teresitatango.se\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.teresitatango.se\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.teresitatango.se\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/cropped-Teresita-Cirkel-e1753994203268.png\",\"contentUrl\":\"https:\\\/\\\/www.teresitatango.se\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/cropped-Teresita-Cirkel-e1753994203268.png\",\"width\":200,\"height\":200,\"caption\":\"Teresita Tango\"},\"image\":{\"@id\":\"https:\\\/\\\/www.teresitatango.se\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tango in Sk\u00e5ne - Teresita Tango","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:\/\/www.teresitatango.se\/en\/skane-calendar\/","og_locale":"en_US","og_type":"article","og_title":"Tango in Sk\u00e5ne - Teresita Tango","og_description":"Event index \u00b7 Sk\u00e5ne \u00b7 factual listings Sk\u00e5ne Calendar A practical event calendar for Sk\u00e5ne, built as a factual index with clear links to the original sources. Event index. Always [&hellip;]","og_url":"https:\/\/www.teresitatango.se\/en\/skane-calendar\/","og_site_name":"Teresita Tango","article_modified_time":"2026-08-16T19:59:11+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.teresitatango.se\/skane-calendar\/","url":"https:\/\/www.teresitatango.se\/skane-calendar\/","name":"Tango in Sk\u00e5ne - Teresita Tango","isPartOf":{"@id":"https:\/\/www.teresitatango.se\/#website"},"datePublished":"2026-05-24T09:52:28+00:00","dateModified":"2026-08-16T19:59:11+00:00","breadcrumb":{"@id":"https:\/\/www.teresitatango.se\/skane-calendar\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.teresitatango.se\/skane-calendar\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.teresitatango.se\/skane-calendar\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.teresitatango.se\/"},{"@type":"ListItem","position":2,"name":"Tango in Sk\u00e5ne"}]},{"@type":"WebSite","@id":"https:\/\/www.teresitatango.se\/#website","url":"https:\/\/www.teresitatango.se\/","name":"Teresita Tango","description":"Argentinsk Tango i Lund. L\u00e4r dig att dansa!","publisher":{"@id":"https:\/\/www.teresitatango.se\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.teresitatango.se\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.teresitatango.se\/#organization","name":"Teresita Tango","url":"https:\/\/www.teresitatango.se\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.teresitatango.se\/#\/schema\/logo\/image\/","url":"https:\/\/www.teresitatango.se\/wp-content\/uploads\/2025\/07\/cropped-Teresita-Cirkel-e1753994203268.png","contentUrl":"https:\/\/www.teresitatango.se\/wp-content\/uploads\/2025\/07\/cropped-Teresita-Cirkel-e1753994203268.png","width":200,"height":200,"caption":"Teresita Tango"},"image":{"@id":"https:\/\/www.teresitatango.se\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.teresitatango.se\/en\/wp-json\/wp\/v2\/pages\/1891","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.teresitatango.se\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.teresitatango.se\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.teresitatango.se\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.teresitatango.se\/en\/wp-json\/wp\/v2\/comments?post=1891"}],"version-history":[{"count":23,"href":"https:\/\/www.teresitatango.se\/en\/wp-json\/wp\/v2\/pages\/1891\/revisions"}],"predecessor-version":[{"id":2057,"href":"https:\/\/www.teresitatango.se\/en\/wp-json\/wp\/v2\/pages\/1891\/revisions\/2057"}],"wp:attachment":[{"href":"https:\/\/www.teresitatango.se\/en\/wp-json\/wp\/v2\/media?parent=1891"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}