Files
dashcaddy/status/dist/features.js
T
Hermes 3a0f595a17 [grade=B urn:ump:dbxmyhvr7cpkeu3mbfdevrco7utsok743udjsj7atih6qk4frdiq] fix(DC-168): calendar widget CSRF writes, error path, modal UX (audit batch 2)
Audit 2026-10-27 fixes (46-finding sweep, AUDIT-2026-10-27.md):
- P0-2: all 6 calendar API calls via secureFetch — raw fetch sent no
  X-CSRF-Token so every mutation (save/toggle/delete/test) was rejected
  403 [DC-100]; GETs gain the standard 15s timeout
- P0-6: refresh() catch called nonexistent errorHandler.log() — the
  error path itself threw; now logError(context, error)
- P0-7: modal sizing off inline min-width:560px onto .cal-modal-content
  with 768px override (inline style beat the mobile media query)
- refresh coalescing via _pendingForce (forced refreshes were dropped
  mid-flight); single fetch sequence on modal open; toggle/delete get
  resp.ok + try/catch + toast + disabled-during-flight
- modal on class-based .show: click-outside, Escape, focus move/return
  on all three dismissal paths (judge polish applied)
- chip honors Enter/Space (role=button); poll skips hidden tabs
- --cal-chip-when/--cal-when/--cal-dot re-scoped to :root (were scoped
  to elements that are never ancestors of .cal-dot — DC-168 WCAG dot
  colors never rendered)
- calendar-cache eventKey no longer throws RangeError on invalid start

Bundles rebuilt (sw dashcaddy-shell-7fc13e7762). status suite 68/68.
Judge B (polish items applied pre-commit): urn:ump:dbxmyhvr7cpkeu3mbfdevrco7utsok743udjsj7atih6qk4frdiq
2026-10-27 23:58:55 -07:00

2320 lines
1.3 MiB
Plaintext

(function(){injectModal("logo-modal",`<div id="logo-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 400px; max-width: 520px;">
<h3>Dashboard Settings</h3>
<p style="font-size: 0.85rem; color: var(--muted); margin: 0 0 16px;">
Customize your dashboard's appearance and system preferences.
</p>
<div class="mb-16">
<label for="dashboard-title" class="form-label-bold">Dashboard Title:</label>
<input type="text" id="dashboard-title" placeholder="DashCaddy" maxlength="50" style="width: 100%; padding: 10px 12px; border: 1px solid var(--border); border-radius: 4px; background: var(--card-bg); color: var(--fg); font-size: 1rem;" />
<p class="tiny-hint">Shown in browser tab and header (max 50 characters)</p>
</div>
<hr class="hr-divider" />
<div class="mb-16">
<label class="form-label-bold">Logo:</label>
<p class="tiny-hint" style="margin-top: 2px;">Separate logos for dark and light themes, or use the same for both.</p>
</div>
<div style="display: flex; gap: 12px; margin-bottom: 12px;">
<div style="flex: 1; text-align: center; padding: 16px 10px; border-radius: 8px; background: #1a1a2e; border: 1px solid rgba(255,255,255,.1);">
<img id="logo-preview-dark" src="/assets/dashcaddy-logo-dark.png" alt="Dark theme logo" style="max-height: 60px; max-width: 100%;" />
<p style="font-size: 0.65rem; color: #9aa6bf; margin-top: 6px;">Dark themes</p>
</div>
<div style="flex: 1; text-align: center; padding: 16px 10px; border-radius: 8px; background: #f0f0f0; border: 1px solid rgba(0,0,0,.1);">
<img id="logo-preview-light" src="/assets/dashcaddy-logo-light.png" alt="Light theme logo" style="max-height: 60px; max-width: 100%;" />
<p style="font-size: 0.65rem; color: #5f6b7a; margin-top: 6px;">Light themes</p>
</div>
</div>
<p id="logo-status" style="font-size: 0.75rem; color: var(--muted); margin-bottom: 12px; text-align: center;">Using default logos</p>
<div class="mb-16">
<label style="display: flex; align-items: center; gap: 8px; font-size: 0.82rem; cursor: pointer; user-select: none;">
<input type="checkbox" id="logo-same-both" /> Use same logo for both
</label>
</div>
<div id="logo-dual-uploads" class="mb-16" style="display: flex; gap: 12px;">
<div style="flex: 1;">
<label for="logo-upload-dark" style="display: block; margin-bottom: 6px; font-size: 0.8rem;">Dark theme logo:</label>
<input type="file" id="logo-upload-dark" accept="image/*" class="input-card-alt" style="font-size: 0.75rem;" />
</div>
<div style="flex: 1;">
<label for="logo-upload-light" style="display: block; margin-bottom: 6px; font-size: 0.8rem;">Light theme logo:</label>
<input type="file" id="logo-upload-light" accept="image/*" class="input-card-alt" style="font-size: 0.75rem;" />
</div>
</div>
<div id="logo-single-upload" class="mb-16" style="display: none;">
<label for="logo-upload-single" style="display: block; margin-bottom: 6px; font-size: 0.8rem;">Upload logo:</label>
<input type="file" id="logo-upload-single" accept="image/*" class="input-card-alt" />
<p class="tiny-hint">This logo will be used on all themes</p>
</div>
<div class="mb-16">
<label style="display: block; margin-bottom: 8px;">Logo Position:</label>
<div id="logo-position-btns" class="flex-row-gap">
<button type="button" data-pos="left" class="logo-pos-btn btn-option">Left</button>
<button type="button" data-pos="center" class="logo-pos-btn btn-option">Center</button>
<button type="button" data-pos="right" class="logo-pos-btn btn-option">Right</button>
</div>
</div>
<hr class="hr-divider" />
<div class="mb-16">
<label class="form-label-bold">Favicon (Browser Tab Icon):</label>
<div id="favicon-preview-container" style="display: flex; align-items: center; gap: 12px; margin-bottom: 8px; padding: 12px; border-radius: 6px; background: var(--card-bg);">
<img id="favicon-preview" src="/assets/dashcaddy-favicon.ico" alt="Current favicon" style="width: 32px; height: 32px; image-rendering: pixelated;" onerror="this.src='data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 32 32%22><rect fill=%22%23667%22 width=%2232%22 height=%2232%22 rx=%224%22/></svg>'" />
<span id="favicon-status" class="text-tiny-muted">Using DashCaddy favicon</span>
</div>
<input type="file" id="favicon-upload" accept="image/png,image/svg+xml" class="input-card-alt" />
<p class="tiny-hint">Upload PNG or SVG - automatically converted to ICO</p>
</div>
<hr class="hr-divider" />
<div class="mb-16">
<label for="settings-timezone" class="form-label-bold">Timezone:</label>
<select id="settings-timezone" style="width: 100%; padding: 10px 12px; border: 1px solid var(--border); border-radius: 4px; background: var(--card-bg); color: var(--fg); font-size: 1rem;">
<!-- Populated by JS with IANA timezones -->
</select>
<p class="tiny-hint">Used by all deployed containers. Changes apply to new deployments.</p>
</div>
<div class="weather-modal-buttons">
<button id="logo-reset" style="background: color-mix(in srgb, #ef4444 20%, transparent); border-color: #ef4444; color: #ef4444;">Reset to Default</button>
<button id="logo-cancel">Cancel</button>
<button id="logo-save" class="btn-accent">Save</button>
</div>
</div>
</div>`);const x=document.getElementById("logo-modal"),b=document.getElementById("logo-preview-dark"),j=document.getElementById("logo-preview-light"),g=document.getElementById("logo-status"),N=document.getElementById("logo-same-both"),A=document.getElementById("logo-dual-uploads"),D=document.getElementById("logo-single-upload"),R=document.getElementById("logo-upload-dark"),f=document.getElementById("logo-upload-light"),C=document.getElementById("logo-upload-single"),E=document.querySelector("#brand .brand-logo-dark"),M=document.querySelector("#brand .brand-logo-light"),w=document.querySelector(".top-row"),z=document.getElementById("dashboard-title"),S=DC.NAME;let T=null,P=null,v=null,B="left",H=S;N?.addEventListener("change",()=>{N.checked?(A.style.display="none",D.style.display="",T=null,P=null):(A.style.display="flex",D.style.display="none",v=null)});function O(n,e){if(!n||!n.type.startsWith("image/")){showNotification("Please select an image file","warning");return}const r=new FileReader;r.onload=s=>e(s.target.result),r.readAsDataURL(n)}R?.addEventListener("change",n=>{O(n.target.files[0],e=>{T=e,b.src=e,g.textContent="New dark logo ready to save"})}),f?.addEventListener("change",n=>{O(n.target.files[0],e=>{P=e,j.src=e,g.textContent="New light logo ready to save"})}),C?.addEventListener("change",n=>{O(n.target.files[0],e=>{v=e,b.src=e,j.src=e,g.textContent="New logo ready to save (both themes)"})});function u(n){w.setAttribute("data-logo-pos",n),document.querySelectorAll(".logo-pos-btn").forEach(e=>{e.style.background=e.dataset.pos===n?"var(--accent)":"var(--card-bg)",e.style.color=e.dataset.pos===n?"white":"var(--fg)"})}function m(n){H=n||S,document.title=H;const e=document.querySelector(".dashboard-title");e&&(e.textContent=H)}async function L(){try{const n=await fetch("/api/v1/logo");if(n.ok){const e=await n.json();e.customLogoDark&&(E.src=e.customLogoDark,b.src=e.customLogoDark),e.customLogoLight&&(M.src=e.customLogoLight,j.src=e.customLogoLight),!e.customLogoDark&&!e.customLogoLight&&e.customLogo&&(E.src=e.customLogo,M.src=e.customLogo,b.src=e.customLogo,j.src=e.customLogo),e.isDefault||(g.textContent="Using custom logo"),e.position&&(B=e.position,u(e.position)),e.dashboardTitle&&m(e.dashboardTitle)}}catch(n){console.warn("Could not load custom logo:",n.message)}}document.querySelectorAll(".logo-pos-btn").forEach(n=>{n.addEventListener("click",()=>{B=n.dataset.pos,u(B)})}),document.getElementById("brand")?.addEventListener("click",()=>{T=null,P=null,v=null,R&&(R.value=""),f&&(f.value=""),C&&(C.value=""),N&&(N.checked=!1),A.style.display="flex",D.style.display="none",b.src=E.src,j.src=M.src;const n=E.src.includes("custom-logo")||M.src.includes("custom-logo");g.textContent=n?"Using custom logo":"Using default logos",u(B),z.value=H,x.classList.add("show")}),document.getElementById("logo-save")?.addEventListener("click",async()=>{try{const n=z.value.trim()||S,e={position:B,dashboardTitle:n};N?.checked&&v?(e.dataDark=v,e.dataLight=v):(T&&(e.dataDark=T),P&&(e.dataLight=P));const r=await secureFetch("/api/v1/logo",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)});if(r.ok){const s=await r.json(),a="?t="+Date.now();s.pathDark&&(E.src=s.pathDark+a,b.src=s.pathDark+a),s.pathLight&&(M.src=s.pathLight+a,j.src=s.pathLight+a),u(B),m(n),x.classList.remove("show")}else{const s=await r.json();showNotification("Failed to save: "+s.error,"error")}}catch(n){showNotification("Error saving: "+n.message,"error")}}),document.getElementById("logo-reset")?.addEventListener("click",async()=>{if(confirm(`Reset all branding to DashCaddy defaults?
This will reset the logo, favicon, title, and position.`))try{if((await secureFetch("/api/v1/logo",{method:"DELETE"})).ok&&(E.src="/assets/dashcaddy-logo-dark.png",M.src="/assets/dashcaddy-logo-light.png",b.src="/assets/dashcaddy-logo-dark.png",j.src="/assets/dashcaddy-logo-light.png",g.textContent="Using default logos",T=null,P=null,v=null,z.value=S,m(S),B="left",u("left")),(await secureFetch("/api/v1/favicon",{method:"DELETE"})).ok){const r=document.querySelector('link[rel="icon"]'),s=document.getElementById("favicon-preview"),a=document.getElementById("favicon-status");r&&(r.href="/assets/dashcaddy-favicon.ico?t="+Date.now()),s&&(s.src="/assets/dashcaddy-favicon.ico?t="+Date.now()),a&&(a.textContent="Using DashCaddy favicon"),d=null}}catch(n){showNotification("Error resetting branding: "+n.message,"error")}}),wireModal(x,document.getElementById("logo-cancel"));const k=document.getElementById("favicon-preview"),I=document.getElementById("favicon-status"),i=document.getElementById("favicon-upload"),c=document.querySelector('link[rel="icon"]')||document.createElement("link");let d=null;document.querySelector('link[rel="icon"]')||(c.rel="icon",c.href="/assets/dashcaddy-favicon.ico",document.head.appendChild(c));async function y(){try{const n=await fetch("/api/v1/favicon");if(n.ok){const e=await n.json();e.customFavicon&&(c.href=e.customFavicon+"?t="+Date.now(),k.src=e.customFavicon+"?t="+Date.now(),I.textContent="Using custom favicon")}}catch(n){console.warn("Could not load custom favicon:",n.message)}}i?.addEventListener("change",n=>{const e=n.target.files[0];if(!e)return;if(!e.type.match(/^image\/(png|svg\+xml)$/)){showNotification("Please select a PNG or SVG file","warning"),i.value="";return}const r=new FileReader;r.onload=s=>{d=s.target.result,k.src=d,I.textContent="New favicon ready to save"},r.readAsDataURL(e)}),document.getElementById("logo-save")?.addEventListener("click",async()=>{if(d)try{const n=await secureFetch("/api/v1/favicon",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({data:d})});if(n.ok){const e=await n.json();c.href=e.path+"?t="+Date.now(),k.src=e.path+"?t="+Date.now(),I.textContent="Using custom favicon",d=null}else{const e=await n.json();showNotification("Failed to save favicon: "+e.error,"error")}}catch(n){showNotification("Error saving favicon: "+n.message,"error")}}),y(),L();const p=document.getElementById("settings-timezone");p&&(new MutationObserver(()=>{x.classList.contains("show")&&p.options.length===0&&(async()=>{let e;try{const r=await fetch("/api/v1/config");r.ok&&(e=(await r.json()).timezone)}catch{}window.populateTimezoneSelect(p,e)})()}).observe(x,{attributes:!0,attributeFilter:["class"]}),document.getElementById("logo-save")?.addEventListener("click",async()=>{const e=p.value;if(e)try{const r=await fetch("/api/v1/config");if(!r.ok)return;const s=await r.json();s.timezone=e,s.updatedAt=new Date().toISOString(),await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(s)})}catch(r){console.warn("Failed to save timezone:",r.message)}}))})(),window.populateTimezoneSelect=function(x,b){const j=Intl.supportedValuesOf("timeZone"),g=b||Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC";x.innerHTML="";for(const N of j){const A=document.createElement("option");A.value=N,A.textContent=N.replace(/_/g," "),N===g&&(A.selected=!0),x.appendChild(A)}},(function(){let x="homelab",b=null;async function j(){try{const m=await fetch("/api/v1/config");if(m.ok&&(b=await m.json(),b&&b.setupComplete))return document.getElementById("setup-wizard").style.display="none",!0}catch(m){console.warn("Could not fetch server config, checking localStorage fallback:",m.message)}return safeGet("dashcaddy-setup")?(document.getElementById("setup-wizard").style.display="none",!0):(document.getElementById("setup-wizard").style.display="flex",!1)}j();const g=document.getElementById("setup-timezone");g&&window.populateTimezoneSelect(g);function N(u){document.querySelectorAll(".setup-step").forEach(L=>{L.style.display="none"});const m=document.getElementById(u);m&&(m.style.display="block")}function A(){const u=document.getElementById("setup-summary-content");if(!u)return;let m='<div style="display: grid; gap: 20px;">';if(x==="homelab"){const k=document.getElementById("setup-tld")?.value?.trim()||".home",I=document.getElementById("setup-ca-name")?.value?.trim()||"",i=document.getElementById("setup-dns-ip")?.value?.trim()||"",c=document.getElementById("setup-dns-port")?.value?.trim()||DC.DEFAULTS.DNS_PORT;m+=`
<div>
<h3 style="margin: 0 0 12px; color: var(--accent);">Home Lab Configuration</h3>
<div style="display: grid; gap: 12px; font-size: 0.95rem;">
<div><strong>TLD:</strong> ${k}</div>
<div><strong>Certificate Authority:</strong> ${I}</div>
<div><strong>DNS Server:</strong> ${i}:${c}</div>
<div><strong>Example URLs:</strong> https://uptime${k}, https://nextcloud${k}</div>
</div>
</div>
`}else if(x==="simple"){const k=document.getElementById("setup-simple-ip")?.value?.trim()||"localhost";m+=`
<div>
<h3 style="margin: 0 0 12px; color: var(--accent);">Simple Setup</h3>
<div style="display: grid; gap: 12px; font-size: 0.95rem;">
<div><strong>Access Method:</strong> IP:Port only</div>
<div><strong>Default IP:</strong> ${k}</div>
<div><strong>SSL:</strong> None (HTTP only)</div>
<div><strong>Example URLs:</strong> http://${k}:8080, http://${k}:3000</div>
</div>
</div>
`}else if(x==="public"){const k=document.getElementById("setup-public-domain")?.value?.trim()||"",I=document.getElementById("setup-public-email")?.value?.trim()||"",i=document.querySelector('input[name="routing-mode"]:checked')?.value||"subdirectory",c=i==="subdirectory"?`https://${k}/sonarr, https://${k}/grafana`:`https://sonarr.${k}, https://grafana.${k}`;m+=`
<div>
<h3 style="margin: 0 0 12px; color: var(--accent);">Public Server</h3>
<div style="display: grid; gap: 12px; font-size: 0.95rem;">
<div><strong>Domain:</strong> ${k}</div>
<div><strong>SSL:</strong> Let's Encrypt</div>
<div><strong>Email:</strong> ${I}</div>
<div><strong>Routing:</strong> ${i==="subdirectory"?"Subdirectory (domain.com/app)":"Subdomain (app.domain.com)"}</div>
<div><strong>Example URLs:</strong> ${c}</div>
</div>
</div>
`}const L=document.getElementById("setup-timezone")?.value||Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC";m+=`
<div style="margin-top: 8px; padding-top: 12px; border-top: 1px solid var(--border);">
<div style="font-size: 0.95rem;"><strong>Timezone:</strong> ${L.replace(/_/g," ")}</div>
</div>
`,m+="</div>",u.innerHTML=m,N("setup-step-summary")}async function D(u){try{const m=await secureFetch("/api/v1/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(u)});return m.ok?(await m.json(),!0):(errorHandler.logError("[SetupWizard] Save Config",new Error(`Server returned ${m.status}`),{function:"saveConfigToServer"}),!1)}catch(m){return errorHandler.logError("[SetupWizard] Save Config",m,{function:"saveConfigToServer"}),!1}}async function R(){const u={setupComplete:!0,configurationType:x,timestamp:new Date().toISOString(),timezone:document.getElementById("setup-timezone")?.value||Intl.DateTimeFormat().resolvedOptions().timeZone||"UTC"};if(x==="homelab"){u.tld=document.getElementById("setup-tld")?.value?.trim()||".home",u.caName=document.getElementById("setup-ca-name")?.value?.trim()||"";const I=document.getElementById("setup-dns-provider")?.value||"technitium";u.dns={provider:I,ip:document.getElementById("setup-dns-ip")?.value?.trim()||"",port:document.getElementById("setup-dns-port")?.value?.trim()||DC.DEFAULTS.DNS_PORT,token:document.getElementById("setup-dns-token")?.value?.trim()||""},u.defaults={dnsType:"private",sslType:"internal",targetIP:"localhost"}}else x==="simple"?(u.defaultIP=document.getElementById("setup-simple-ip")?.value?.trim()||"localhost",u.defaults={dnsType:"none",sslType:"none",targetIP:u.defaultIP}):x==="public"&&(u.domain=document.getElementById("setup-public-domain")?.value?.trim()||"",u.email=document.getElementById("setup-public-email")?.value?.trim()||"",u.routingMode=document.querySelector('input[name="routing-mode"]:checked')?.value||"subdirectory",u.defaults={dnsType:u.routingMode==="subdirectory"?"none":"public",sslType:"letsencrypt",targetIP:"localhost"});const m=await D(u);safeSet("dashcaddy-config",JSON.stringify(u)),safeSet("dashcaddy-setup","completed"),document.getElementById("setup-wizard").style.display="none";const L=x==="homelab"?"Professional Home Lab":x==="simple"?"Simple Setup":"Public Server",k=m?"server (shared across all devices)":"locally (this browser only)";showNotification(`Setup Complete! Configured for: ${L}. Settings saved to: ${k}`,"success",5e3),setTimeout(()=>location.reload(),500)}const f=document.getElementById("setup-step-1-next");f&&(f.onclick=function(u){u.preventDefault();const m=document.querySelector('input[name="config-type"]:checked');m&&(x=m.value),N(x==="homelab"?"setup-step-homelab":x==="simple"?"setup-step-simple":x==="public"?"setup-step-public":"setup-step-homelab")});const C=document.getElementById("setup-skip");C&&(C.onclick=async function(u){u.preventDefault(),confirm("Skip setup? You can run it later from Settings.")&&(await D({setupComplete:!0,skipped:!0,timestamp:new Date().toISOString()}),safeSet("dashcaddy-setup","skipped"),document.getElementById("setup-wizard").style.display="none")});const E=document.getElementById("setup-tld");E&&(E.oninput=function(u){const m=u.target.value||".home",L=document.getElementById("tld-preview"),k=document.getElementById("tld-preview-2");L&&(L.textContent=m),k&&(k.textContent=m)});const M=document.getElementById("setup-homelab-back");M&&(M.onclick=function(u){u.preventDefault(),N("setup-step-1")});const w=document.getElementById("setup-homelab-next");w&&(w.onclick=function(u){u.preventDefault();const m=document.getElementById("setup-tld")?.value?.trim()||"",L=document.getElementById("setup-ca-name")?.value?.trim()||"",k=document.getElementById("setup-dns-ip")?.value?.trim()||"";if(!m||!m.startsWith(".")){showNotification("Please enter a valid TLD starting with a dot (e.g., .home)","warning");return}if(!L){showNotification("Please enter a Certificate Authority name","warning");return}if(!k){showNotification("Please enter your DNS server IP address","warning");return}A()});const z=document.getElementById("setup-simple-back");z&&(z.onclick=function(u){u.preventDefault(),N("setup-step-1")});const S=document.getElementById("setup-simple-next");S&&(S.onclick=function(u){u.preventDefault(),A()}),document.querySelectorAll('input[name="routing-mode"]').forEach(function(u){u.onchange=function(){var m=document.getElementById("dns-requirement-note");m&&(m.textContent=this.value==="subdirectory"?"Only one DNS record needed (for the main domain)":"You'll need to configure DNS manually for each subdomain")}});const T=document.getElementById("setup-public-back");T&&(T.onclick=function(u){u.preventDefault(),N("setup-step-1")});const P=document.getElementById("setup-public-next");P&&(P.onclick=function(u){u.preventDefault();const m=document.getElementById("setup-public-domain")?.value?.trim()||"",L=document.getElementById("setup-public-email")?.value?.trim()||"";if(!m){showNotification("Please enter your domain name","warning");return}if(!L||!L.includes("@")){showNotification("Please enter a valid email address","warning");return}A()});const v=document.getElementById("setup-summary-back");v&&(v.onclick=function(u){u.preventDefault(),x==="homelab"?N("setup-step-homelab"):x==="simple"?N("setup-step-simple"):x==="public"&&N("setup-step-public")});const B=document.getElementById("setup-summary-next");B&&(B.onclick=function(u){u.preventDefault(),N("setup-step-disk-safety")});const H=document.getElementById("setup-disk-safety-back");H&&(H.onclick=function(u){u.preventDefault(),N("setup-step-summary")});const O=document.getElementById("setup-disk-safety-finish");O&&(O.onclick=function(u){u.preventDefault(),R()}),window.getGlobalConfig=async function(){try{const m=await fetch("/api/v1/config");if(m.ok){const L=await m.json();if(L&&L.setupComplete)return L}}catch{console.warn("Could not fetch config from server")}const u=safeGet("dashcaddy-config");return u?JSON.parse(u):{setupComplete:!1,configurationType:"homelab",tld:".home",caName:"",defaults:{dnsType:"private",sslType:"internal",targetIP:"localhost"}}},window.resetSetupWizard=async function(){if(confirm("Reset DashCaddy configuration? This will show the setup wizard again.")){try{await secureFetch("/api/v1/config",{method:"DELETE"})}catch{console.warn("Could not delete server config")}safeRemove("dashcaddy-setup"),safeRemove("dashcaddy-config"),location.reload()}}})(),(function(){const x=new ErrorHandler;injectModal("app-selector-modal",`<div id="app-selector-modal" class="weather-modal">
<div class="app-selector-content">
<h2 style="margin: 0 0 24px; color: var(--fg); text-align: center;">Choose an App</h2>
<div id="app-selector-grid" class="app-selector-grid"></div>
<div style="text-align: center; margin-top: 24px;">
<button id="app-selector-cancel">Cancel</button>
</div>
</div>
</div>`),injectModal("app-deploy-modal",`<div id="app-deploy-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 600px; max-width: 700px;">
<h3 id="app-deploy-title">Deploy Application</h3>
<div style="display: grid; grid-template-columns: 1fr; gap: 16px; margin-top: 16px;">
<!-- Subdomain/Domain -->
<div>
<label for="deploy-subdomain" class="form-label-accent-sm">
\u{1F310} Subdomain or Domain
</label>
<input type="text" id="deploy-subdomain" placeholder="uptime"
style="width: 100%; padding: 10px; background: var(--card-bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.95rem;" />
<div class="form-hint-sm">
Your app will be available at: <span id="deploy-url-preview" style="color: var(--accent); font-weight: 500;">uptime.home</span>
</div>
<div id="subpath-compat-warning" style="display: none; padding: 8px 12px; border-radius: 6px; background: color-mix(in srgb, #ff9800 10%, var(--card-bg)); border: 1px solid color-mix(in srgb, #ff9800 30%, transparent); margin-top: 8px; font-size: 0.85rem;"></div>
</div>
<!-- DNS Configuration -->
<div>
<label class="form-label-accent">
\u{1F5C2}\uFE0F DNS Configuration
</label>
<div class="flex-col-gap">
<label class="radio-option">
<input type="radio" name="dns-type" value="private" checked style="margin-right: 10px;" />
<div>
<div class="fw-500">Private DNS (Technitium)</div>
<div class="text-hint">Use your local DNS server with custom TLD (.sami, .home, etc.)</div>
</div>
</label>
<label class="radio-option">
<input type="radio" name="dns-type" value="public" style="margin-right: 10px;" />
<div>
<div class="fw-500">Public DNS</div>
<div class="text-hint">Use a real domain (example.com) - requires DNS provider setup</div>
</div>
</label>
<label class="radio-option">
<input type="radio" name="dns-type" value="none" style="margin-right: 10px;" />
<div>
<div class="fw-500">No DNS (IP:Port only)</div>
<div class="text-hint">Access via IP address and port - no domain setup</div>
</div>
</label>
</div>
</div>
<!-- SSL Configuration -->
<div>
<label class="form-label-accent">
\u{1F512} SSL/TLS Certificate
</label>
<div class="flex-col-gap">
<label class="radio-option">
<input type="radio" name="ssl-type" value="internal" checked style="margin-right: 10px;" />
<div>
<div class="fw-500">Internal CA</div>
<div class="text-hint">Use Caddy's internal certificate authority (self-signed)</div>
</div>
</label>
<label class="radio-option">
<input type="radio" name="ssl-type" value="letsencrypt" style="margin-right: 10px;" />
<div>
<div class="fw-500">Let's Encrypt</div>
<div class="text-hint">Free public SSL certificate (requires public domain)</div>
</div>
</label>
<label class="radio-option">
<input type="radio" name="ssl-type" value="none" style="margin-right: 10px;" />
<div>
<div class="fw-500">No SSL (HTTP only)</div>
<div class="text-hint">\u26A0\uFE0F Not recommended - traffic will be unencrypted</div>
</div>
</label>
</div>
</div>
<!-- Media Library Path (shown for media apps) -->
<div id="media-path-section" style="display: none;">
<label class="form-label-accent">
\u{1F4C1} Media Library Location
</label>
<div style="display: flex; flex-direction: column; gap: 10px;">
<!-- Detected mounts from existing media servers -->
<div id="detected-mounts-container" style="display: none;">
<div style="font-size: 0.85rem; color: var(--success); margin-bottom: 6px;">
\u2713 Detected from existing media servers:
</div>
<div id="detected-mounts-list" style="display: flex; gap: 8px; flex-wrap: wrap;"></div>
</div>
<!-- Path input with browse button -->
<div class="flex-row-gap">
<input type="text" id="deploy-media-path" placeholder="/media/Movies, /media/TVShows"
class="input-flex" style="font-size: 0.95rem;" />
<button type="button" id="browse-media-btn" style="padding: 10px 16px; background: var(--accent); color: white; border: none; border-radius: 6px; cursor: pointer; font-weight: 500; white-space: nowrap;">
\u{1F4C2} Browse
</button>
</div>
<div id="media-path-description" class="text-hint">
Select folders from existing servers, browse, or type paths manually. Separate multiple with commas.
</div>
<!-- Selected paths display -->
<div id="selected-media-paths" style="display: none; flex-wrap: wrap; gap: 6px;"></div>
</div>
</div>
<!-- Plex Claim Token (shown only for Plex deployments) -->
<div id="plex-claim-section" style="display: none;">
<label class="form-label-accent">
\u{1F511} Plex Claim Token
</label>
<div class="flex-row-gap">
<input type="text" id="deploy-plex-claim" placeholder="claim-xxxxxxxxxxxxxxxxxxxx"
class="input-flex" style="font-size: 0.95rem;" />
<a href="https://plex.tv/claim" target="_blank" rel="noopener noreferrer"
style="padding: 10px 16px; background: #e5a00d; color: #000; border: none; border-radius: 6px; cursor: pointer; font-weight: 500; white-space: nowrap; text-decoration: none; display: flex; align-items: center;">
Get Token
</a>
</div>
<div style="font-size: 0.8rem; color: #e5a00d; margin-top: 4px;">
Token expires in 4 minutes! Get it right before clicking Deploy. Leave empty to configure Plex manually later.
</div>
</div>
<!-- Tailscale Security -->
<div id="tailscale-section">
<label class="form-label-accent">
\u{1F510} Tailscale Security
</label>
<div class="flex-col-gap">
<label class="radio-option">
<input type="checkbox" id="deploy-tailscale-only" style="margin-right: 10px; width: 18px; height: 18px;" />
<div>
<div class="fw-500">Tailscale-Only Access</div>
<div class="text-hint">Restrict this service to Tailscale users only (100.x.x.x IPs)</div>
</div>
</label>
<div id="tailscale-status" style="padding: 8px 12px; background: var(--card-bg); border-radius: 6px; font-size: 0.85rem;">
<span style="color: var(--muted);">Checking Tailscale status...</span>
</div>
</div>
</div>
<!-- Advanced Options (Collapsible) -->
<details>
<summary style="cursor: pointer; color: var(--accent); font-weight: 500; margin-bottom: 8px;">\u2699\uFE0F Advanced Options</summary>
<div style="margin-top: 12px; display: grid; gap: 12px;">
<div>
<label for="deploy-port" style="display: block; margin-bottom: 6px;">Custom Port (optional)</label>
<input type="number" id="deploy-port" placeholder="Leave empty for default"
class="form-input-card" />
</div>
<div>
<label for="deploy-ip" style="display: block; margin-bottom: 6px;">Target IP Address</label>
<input type="text" id="deploy-ip" value="localhost"
class="form-input-card" />
<div class="form-hint-sm">
Use 'localhost' for same-host containers, or specific IP for remote services
</div>
</div>
<div id="volume-mounts-section" style="display: none;">
<label class="form-label-accent-sm">\u{1F4C2} Volume Mounts</label>
<div style="font-size: 0.8rem; color: var(--muted); margin-bottom: 8px;">
Customize where container data is stored on the host. Media volumes are configured above.
</div>
<div id="volume-mounts-list" style="display: grid; gap: 8px;"></div>
</div>
<div style="margin-top: 12px;">
<label class="form-label-accent-sm">\u2699\uFE0F Resource Limits</label>
<div style="font-size: 0.8rem; color: var(--muted); margin-bottom: 8px;">
Optional CPU and memory constraints. Leave at 0 for unlimited.
</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;">
<div>
<label for="deploy-cpu-limit" style="display: block; font-size: 0.78rem; color: var(--muted); margin-bottom: 4px;">CPU Cores</label>
<input type="number" id="deploy-cpu-limit" value="0" min="0" max="64" step="0.25" class="form-input-card" style="width: 100%;" placeholder="0 = unlimited" />
</div>
<div>
<label for="deploy-memory-limit" style="display: block; font-size: 0.78rem; color: var(--muted); margin-bottom: 4px;">Memory (MB)</label>
<input type="number" id="deploy-memory-limit" value="0" min="0" max="131072" step="64" class="form-input-card" style="width: 100%;" placeholder="0 = unlimited" />
</div>
</div>
</div>
</div>
</details>
</div>
<div class="weather-modal-buttons" style="margin-top: 24px;">
<button id="app-deploy-cancel">Cancel</button>
<button id="app-deploy-confirm" class="btn-accent">
\u{1F680} Deploy
</button>
</div>
</div>
</div>`);const b="custom-apps";let j=null,g=null;const N=document.getElementById("app-selector-modal"),A=document.getElementById("app-selector-grid");async function D(){try{const c=await(await fetch("/api/v1/apps/templates")).json();if(c.success)return j=c.templates,g=c.categories,!0}catch(i){x.logError("[AppSelector] Fetch Templates",i,{function:"fetchApiTemplates"})}return!1}async function R(i){try{return await(await fetch(`/api/v1/apps/ports/${i}/check`)).json()}catch(c){return x.logError("[AppSelector] Check Port",c,{function:"checkPortAvailability"}),{available:!0}}}async function f(i){try{const d=await(await fetch(`/api/v1/apps/ports/${i}/suggest`)).json();if(d.success)return d.suggestedPort}catch(c){x.logError("[AppSelector] Get Suggested Port",c,{function:"getSuggestedPort"})}return i}async function C(){if(A.innerHTML='<div style="text-align: center; padding: 40px; color: var(--muted);">Loading app templates...</div>',!j&&!await D()){A.innerHTML='<div style="text-align: center; padding: 40px; color: var(--error);">Failed to load app templates. Please try again.</div>';return}A.innerHTML="";const i={};for(const[d,y]of Object.entries(j)){const p=y.category||"Other";i[p]||(i[p]=[]),i[p].push({id:d,...y})}const c=g?Object.keys(g):Object.keys(i).sort();for(const d of c){const y=i[d];if(!y||y.length===0)continue;y.sort((e,r)=>(r.popularity||0)-(e.popularity||0));const p=document.createElement("div");p.className="app-category-header";const n=g?.[d]||{};p.innerHTML=`${escapeHtml(n.icon||"")} ${escapeHtml(d)}`,n.color&&(p.style.borderBottomColor=n.color),A.appendChild(p),y.forEach(e=>{const r=document.createElement("div");r.className="app-option";const s=e.isDashboardWidget,a=s&&safeGet("widget-"+e.id+"-enabled")!=="false",t=s?`<div style="font-size: 0.65rem; padding: 2px 6px; border-radius: 4px; margin-top: 4px; background: ${a?"#2ecc7130":"#e74c3c30"}; color: ${a?"#2ecc71":"#e74c3c"}; font-weight: 600;">${a?"ON":"OFF"}</div>`:"",o=!s&&e.difficulty?`<div style="font-size: 0.65rem; padding: 2px 6px; border-radius: 4px; margin-top: 4px; background: ${e.difficulty==="Easy"?"#2ecc71":e.difficulty==="Intermediate"?"#f39c12":"#e74c3c"}20; color: ${e.difficulty==="Easy"?"#2ecc71":e.difficulty==="Intermediate"?"#f39c12":"#e74c3c"};">${escapeHtml(e.difficulty)}</div>`:"";r.innerHTML=`
<div class="app-option-icon">${escapeHtml(e.icon||"\u{1F4E6}")}</div>
<div class="app-option-name">${escapeHtml(e.name)}</div>
<div class="app-option-desc">${escapeHtml(e.description||"")}</div>
${t}${o}
`,s?r.onclick=()=>E(e,r):r.onclick=()=>M(e),A.appendChild(r)})}window.renderRecipeCards&&await window.renderRecipeCards(A)}function E(i,c){const d="widget-"+i.id+"-enabled",p=!(safeGet(d)!=="false");safeSet(d,String(p));const n=i.widgetSelector;if(n){const r=document.querySelector(n);r&&(r.style.display=p?"":"none")}const e=c.querySelector('div[style*="border-radius: 4px"]');e&&(e.textContent=p?"ON":"OFF",e.style.background=p?"#2ecc7130":"#e74c3c30",e.style.color=p?"#2ecc71":"#e74c3c"),showNotification(`${i.name} widget ${p?"enabled":"disabled"}`,"success",2e3)}async function M(i){const c=document.getElementById("app-deploy-modal"),d=document.getElementById("app-deploy-title"),y=document.getElementById("deploy-subdomain"),p=document.getElementById("deploy-url-preview"),n=document.getElementById("deploy-ip"),e=document.getElementById("deploy-port"),r=document.getElementById("deploy-tailscale-only"),s=document.getElementById("tailscale-status");try{const G=await(await secureFetch("/api/v1/apps/check-existing",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:i.id})})).json();if(G.success&&G.exists){const Y=G.container;confirm(`Found existing ${i.name} container:
Container: ${Y.name}
Status: ${Y.status}
Port: ${Y.primaryPort||"N/A"}
Would you like to use this existing container?
Click OK to configure DNS/Caddy for the existing container.
Click Cancel to deploy a new container.`)&&(i._useExisting=!0,i._existingContainer=Y)}}catch{}d.textContent=`Deploy ${i.name}`;const a=i.subdomain||i.id.replace(/-/g,"");y.value=a;const t=document.getElementById("subpath-compat-warning");if(t)if(SITE.routingMode==="subdirectory"){const W=i.subpathSupport||"strip";W==="none"?(t.style.display="block",t.innerHTML='<span style="color: #ff9800;">&#9888; <strong>'+i.name+"</strong> does not support subdirectory mode. It may not work correctly at a subpath.</span>"):W==="strip"?(t.style.display="block",t.innerHTML='<span style="color: var(--muted);">&#9432; '+i.name+" has unverified subdirectory support. It may require additional configuration.</span>"):t.style.display="none"}else t.style.display="none";const o=SITE.defaults.dnsType||(SITE.configurationType==="public"?"public":"private"),l=SITE.defaults.sslType||(SITE.configurationType==="public"?"letsencrypt":"internal"),h=document.querySelector(`input[name="dns-type"][value="${o}"]`),$=document.querySelector(`input[name="ssl-type"][value="${l}"]`);h?h.checked=!0:document.querySelector('input[name="dns-type"][value="private"]').checked=!0,$?$.checked=!0:document.querySelector('input[name="ssl-type"][value="internal"]').checked=!0,n.value=SITE.defaults.targetIP||"localhost",r.checked=!1;const U=document.querySelector("#app-deploy-modal .flex-col-gap")?.closest("div"),F=document.querySelector("#app-deploy-modal details"),_=F?.querySelector("div");if(F&&_&&(SITE.configurationType==="public"||SITE.configurationType==="homelab")){const W=document.querySelectorAll('#app-deploy-modal input[name="dns-type"]')[0]?.closest("div.flex-col-gap")?.parentElement,G=document.querySelectorAll('#app-deploy-modal input[name="ssl-type"]')[0]?.closest("div.flex-col-gap")?.parentElement;W&&!W.dataset.moved&&(_.appendChild(W),W.dataset.moved="1"),G&&!G.dataset.moved&&(_.appendChild(G),G.dataset.moved="1")}const J=document.getElementById("media-path-section"),q=document.getElementById("deploy-media-path"),K=document.getElementById("media-path-description");if(i.mediaMount){J.style.display="block",q.value="",q.placeholder="/media/Movies, /media/TVShows or click Browse";const W=document.getElementById("detected-mounts-container"),G=document.getElementById("detected-mounts-list");try{const X=await(await fetch("/api/v1/media/detected-mounts")).json();if(X.success&&X.mounts.length>0){W.style.display="block",G.innerHTML="";const ae=[...new Set(X.mounts.map(te=>te.hostPath))];q.value=ae.join(", "),X.mounts.forEach(te=>{const Q=document.createElement("button");Q.type="button";const de=ae.includes(te.hostPath);Q.style.cssText=`padding: 8px 14px; font-size: 0.85rem; background: color-mix(in srgb, var(--success) ${de?"40%":"15%"}, var(--card-bg)); border: 1px solid var(--success); border-radius: 6px; cursor: pointer; color: var(--fg);`,Q.innerHTML=`<span style="font-weight: 500;">${escapeHtml(te.folderName)}</span><br><span style="font-size: 0.7rem; color: var(--muted);">from ${escapeHtml(te.sourceImage)}</span>`,Q.title=`${te.hostPath} (from ${te.sourceContainer})`,Q.onclick=()=>{const le=q.value.split(",").map(ce=>ce.trim()).filter(ce=>ce),pe=le.indexOf(te.hostPath);pe>=0?(le.splice(pe,1),Q.style.background="color-mix(in srgb, var(--success) 15%, var(--card-bg))"):(le.push(te.hostPath),Q.style.background="color-mix(in srgb, var(--success) 40%, var(--card-bg))"),q.value=le.join(", ")},G.appendChild(Q)})}else W.style.display="none"}catch{W.style.display="none"}document.getElementById("browse-media-btn").onclick=()=>{openFolderBrowser(q)}}else J.style.display="none",q.value="",document.getElementById("detected-mounts-container").style.display="none";const Z=document.getElementById("plex-claim-section");Z&&(i.id==="plex"||i.claimToken?(Z.style.display="block",document.getElementById("deploy-plex-claim").value=""):Z.style.display="none");const ee=document.getElementById("volume-mounts-section"),ne=document.getElementById("volume-mounts-list");if(ne.innerHTML="",i.docker?.volumes?.length){const W=i.mediaMount?.containerPath,G=i.docker.volumes.filter(Y=>!Y.includes("{{MEDIA_PATH}}")&&!(W&&Y.endsWith(":"+W)));G.length>0?(ee.style.display="block",G.forEach((Y,X)=>{const[ae,te]=Y.split(":"),Q=document.createElement("div");Q.style.cssText="display: flex; gap: 6px; align-items: center;",Q.innerHTML=`
<input type="text" class="vol-host-path" data-container-path="${te}" value="${ae}"
style="flex: 1; padding: 8px; background: var(--card-bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem;" />
<span style="color: var(--muted); font-size: 0.85rem; white-space: nowrap;">\u2192 ${te}</span>
<button type="button" class="vol-browse-btn" style="padding: 8px 10px; background: var(--accent); color: white; border: none; border-radius: 6px; cursor: pointer; font-size: 0.8rem;">\u{1F4C2}</button>
`,ne.appendChild(Q),Q.querySelector(".vol-browse-btn").onclick=()=>{const de=Q.querySelector(".vol-host-path");openFolderBrowser(de)}})):ee.style.display="none"}else ee.style.display="none";const oe=i.defaultPort||8080;e.value="",e.placeholder=`Default: ${oe}`;let V=document.getElementById("deploy-port-status");V||(V=document.createElement("div"),V.id="deploy-port-status",V.style.cssText="font-size: 0.8rem; margin-top: 4px;",e.parentNode.appendChild(V));async function ie(){const W=e.value||oe;V.innerHTML='<span style="color: var(--muted);">Checking port...</span>';const G=await R(W);if(G.available)V.innerHTML=`<span style="color: #4caf50;">Port ${escapeHtml(String(W))} is available</span>`;else{const Y=await f(oe);V.innerHTML=`
<span style="color: #e74c3c;">Port ${escapeHtml(W)} in use by ${escapeHtml(G.conflict?.usedBy||"unknown")}</span>
`;const X=document.createElement("button");X.type="button",X.textContent=`Use ${Y}`,X.style.cssText="margin-left: 8px; padding: 2px 8px; font-size: 0.75rem; cursor: pointer;",X.onclick=()=>{document.getElementById("deploy-port").value=Y,V.innerHTML=`<span style="color: #4caf50;">Using suggested port ${escapeHtml(String(Y))}</span>`},V.appendChild(X)}}let re;e.oninput=function(){clearTimeout(re),re=setTimeout(ie,500)},ie();try{const G=await(await fetch("/api/v1/tailscale/status")).json();G.success&&G.installed&&G.connected?s.innerHTML=`
<span style="color: #4caf50;">Connected</span>
<span style="color: var(--muted); margin-left: 8px;">${G.self?.hostname} (${G.self?.ip})</span>
<span style="color: var(--muted); margin-left: 8px;">| ${G.deviceCount} devices</span>
`:G.installed?s.innerHTML='<span style="color: #ff9800;">Not connected</span>':(s.innerHTML='<span style="color: var(--muted);">Not available</span>',r.disabled=!0)}catch{s.innerHTML='<span style="color: var(--muted);">Could not check status</span>'}function se(){const W=y.value||"subdomain",G=document.querySelector('input[name="dns-type"]:checked').value,Y=document.querySelector('input[name="ssl-type"]:checked').value;let X="";if(SITE.routingMode==="subdirectory"&&SITE.domain)X=`https://${SITE.domain}/${W}`;else if(G==="private")X=`${Y==="none"?"http":"https"}://${buildDomain(W)}`;else if(G==="public"){const ae=Y==="none"?"http":"https",te=SITE.domain||W;X=SITE.domain?`${ae}://${W}.${SITE.domain}`:`${ae}://${W}`}else{const ae=e.value||i.defaultPort||DC.DEFAULTS.SERVICE_PORT;X=`http://${n.value}:${ae}`}p.textContent=X}y.oninput=se,n.oninput=se,e.oninput=se,document.querySelectorAll('input[name="dns-type"]').forEach(W=>{W.onchange=se}),document.querySelectorAll('input[name="ssl-type"]').forEach(W=>{W.onchange=se}),se(),N.classList.remove("show"),c.classList.add("show"),c.dataset.appTemplate=JSON.stringify(i)}async function w(i){const c=i.appTemplate,d=safeGetJSON(b,[]),y=c._useExisting&&c._existingContainer,p=d.find(n=>n.id===i.subdomain);if(!(p&&!y&&!confirm(`An app with subdomain "${i.subdomain}" already exists. Redeploy?`))){if(p){const n=d.indexOf(p);d.splice(n,1),safeSet(b,JSON.stringify(d))}if(y)i.port=c._existingContainer.primaryPort;else{const n=i.port||c.defaultPort||8080;showNotification(`Checking port ${n} availability...`,"info",0);const e=await R(n);if(!e.available){const r=await f(c.defaultPort||8080);if(confirm(`Port ${n} is already in use by ${e.conflict?.usedBy||"another container"}.
Would you like to use port ${r} instead?`))i.port=r;else{showNotification("Deployment cancelled - port conflict","error",5e3);return}}}showNotification(y?`Configuring ${c.name} with existing container...`:`Deploying ${c.name}...`,"info",0);try{const n={appId:c.id,config:{subdomain:i.subdomain,ip:i.ip,createDns:i.dnsType==="private",port:i.port||c.defaultPort||null,sslType:i.sslType,dnsType:i.dnsType,tailscaleOnly:i.tailscaleOnly||!1,mediaPath:i.mediaPath||null,plexClaimToken:i.plexClaimToken||null,customVolumes:i.customVolumes||null}};y&&(n.config.useExisting=!0,n.config.existingContainerId=c._existingContainer.id,n.config.existingPort=c._existingContainer.primaryPort,!i.port&&c._existingContainer.primaryPort&&(n.config.port=c._existingContainer.primaryPort));const e={app:c.id,port:i.port||c.defaultPort||null,subdomain:i.subdomain||"",media_path:i.mediaPath||"",env:i.plexClaimToken?{PLEX_CLAIM:i.plexClaimToken}:{}},s=await(await secureFetch("/api/v1/deploys/catalog/deploy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e)})).json();if(s.success){const a={id:i.subdomain,name:c.name,logo:`/assets/${c.id}.png`,containerId:null,url:s.url||`http://127.0.0.1:${e.port}`,ip:i.ip,appTemplate:c.id,tailscaleOnly:i.tailscaleOnly||!1};d.push(a),safeSet(b,JSON.stringify(d)),window.APPS&&!window.APPS.some(o=>o.id===c.id)&&(window.APPS.push(a),typeof window.buildGrid=="function"&&window.buildGrid(),typeof window.refreshAll=="function"&&setTimeout(()=>window.refreshAll(),500));let t=s.usedExisting?`${c.name} configured with existing container!
URL: ${s.url}`:`${c.name} deployed successfully!
URL: ${s.url}`;s.warning&&(t+=`
\u26A0 Warning: ${s.warning}`),showNotification(t,"success",8e3),delete c._useExisting,delete c._existingContainer,s.url&&s.url.startsWith("https://")&&z(s.url,c.name),s.setupInstructions&&s.setupInstructions.length>0&&setTimeout(()=>{const o=s.setupInstructions.join(`
`);showNotification(`Setup Instructions for ${c.name}: ${o}`,"info",1e4)},1e3)}else throw new Error(s.error||"Deployment failed")}catch(n){x.logError("[AppSelector] Deployment",n,{function:"deploy"}),showNotification(`Failed to deploy ${c.name}: ${n.message}`,"error",8e3)}}}async function z(i,c){showNotification(`\u23F3 Generating SSL certificate for ${c}...`,"warning",6e4);let d=0;const y=12,p=async()=>{d++;try{const n=await fetch(i,{method:"HEAD",mode:"no-cors"});return showNotification(`\u2705 ${c} is ready! SSL certificate generated.`,"success",5e3),!0}catch{return d<y?setTimeout(p,5e3):showNotification(`\u26A0\uFE0F ${c} deployed but SSL certificate may still be generating.
Try refreshing in a moment if you see a certificate error.`,"warning",1e4),!1}};setTimeout(p,3e3)}function S(){safeGetJSON(b,[]).forEach(c=>{window.APPS.some(d=>d.id===c.id)||window.APPS.push(c)})}document.getElementById("add-service-btn")?.addEventListener("click",()=>{C(),N.classList.add("show")}),window.openDeployConfigFor=async function(i){if(!j&&!await D())return!1;const c=String(i||"").toLowerCase(),d=Object.entries(j).find(([p])=>p.toLowerCase()===c);if(!d)return!1;const y={id:d[0],...d[1]};return y.isDashboardWidget?(await C(),N.classList.add("show"),"selector"):(await M(y),!0)},wireModal(N,document.getElementById("app-selector-cancel"));const T=document.getElementById("app-deploy-modal");document.getElementById("app-deploy-cancel")?.addEventListener("click",()=>{T.classList.remove("show")}),document.getElementById("app-deploy-confirm")?.addEventListener("click",()=>{const i=JSON.parse(T.dataset.appTemplate),c=document.getElementById("deploy-media-path").value.trim(),d=[];document.querySelectorAll("#volume-mounts-list .vol-host-path").forEach(p=>{d.push({hostPath:p.value.trim(),containerPath:p.dataset.containerPath})});const y={appTemplate:i,subdomain:document.getElementById("deploy-subdomain").value.trim(),dnsType:document.querySelector('input[name="dns-type"]:checked').value,sslType:document.querySelector('input[name="ssl-type"]:checked').value,ip:document.getElementById("deploy-ip").value.trim(),port:document.getElementById("deploy-port").value.trim(),tailscaleOnly:document.getElementById("deploy-tailscale-only").checked,mediaPath:c||null,plexClaimToken:document.getElementById("deploy-plex-claim")?.value.trim()||null,customVolumes:d.length>0?d:null,resources:{cpus:parseFloat(document.getElementById("deploy-cpu-limit").value)||0,memory:parseFloat(document.getElementById("deploy-memory-limit").value)||0}};if(!y.subdomain){showNotification("Please enter a subdomain or domain name","warning");return}if(i.mediaMount?.required&&!c){showNotification("Please enter a media library path for this application","warning");return}T.classList.remove("show"),w(y)}),wireModal(T);const P=document.getElementById("folder-browser-modal"),v=document.getElementById("folder-browser-path"),B=document.getElementById("folder-browser-list"),H=document.getElementById("folder-browser-selected"),O=document.getElementById("folder-browser-selected-list");let u="",m=[],L=null;window.openFolderBrowser=function(i){L=i,m=i.value.split(",").map(c=>c.trim()).filter(c=>c),u="",I(),k(""),P.classList.add("show")};async function k(i){v.textContent=i||"Select a drive...",B.innerHTML='<div style="padding: 20px; text-align: center; color: var(--muted);">Loading...</div>';try{const d=await(await fetch(`/api/v1/browse/directories?path=${encodeURIComponent(i)}`)).json();if(!d.success){B.innerHTML=`<div style="padding: 20px; text-align: center; color: var(--error);">Error: ${escapeHtml(d.error)}</div>`;return}u=d.path||"",v.textContent=u||"Select a drive...";let y="";d.parent&&d.parent!==d.path&&(y+=`<div class="folder-item" data-path="${escapeHtml(d.parent)}" style="padding: 12px 16px; border-bottom: 1px solid var(--border); cursor: pointer; display: flex; align-items: center; gap: 10px;">
<span style="font-size: 1.2rem;">\u2B06\uFE0F</span>
<span style="color: var(--muted);">.. Parent Directory</span>
</div>`),d.items.length===0&&!d.parent?y+='<div style="padding: 20px; text-align: center; color: var(--muted);">No browseable drives configured. Check your docker-compose.yml volume mounts.</div>':d.items.length===0?y+='<div style="padding: 20px; text-align: center; color: var(--muted);">No subfolders found</div>':d.items.forEach(p=>{const n=p.type==="drive"?"\u{1F4BE}":"\u{1F4C1}",e=m.includes(p.path),r=e?"background: color-mix(in srgb, var(--success) 20%, transparent);":"";y+=`<div class="folder-item" data-path="${escapeHtml(p.path)}" style="padding: 12px 16px; border-bottom: 1px solid var(--border); cursor: pointer; display: flex; align-items: center; gap: 10px; ${r}">
<span style="font-size: 1.2rem;">${n}</span>
<span style="flex: 1;">${escapeHtml(p.name)}</span>
${e?'<span style="color: var(--success);">\u2713</span>':""}
</div>`}),B.innerHTML=y,B.querySelectorAll(".folder-item").forEach(p=>{p.addEventListener("click",()=>{k(p.dataset.path)}),p.addEventListener("mouseenter",()=>{p.style.background="var(--card-bg)"}),p.addEventListener("mouseleave",()=>{const n=m.includes(p.dataset.path);p.style.background=n?"color-mix(in srgb, var(--success) 20%, transparent)":""})})}catch(c){B.innerHTML=`<div style="padding: 20px; text-align: center; color: var(--error);">Failed to load: ${escapeHtml(c.message)}</div>`}}function I(){if(m.length===0){H.style.display="none";return}H.style.display="block",O.innerHTML=m.map(i=>`
<span style="padding: 6px 12px; background: var(--card-bg); border: 1px solid var(--success); border-radius: 4px; display: flex; align-items: center; gap: 6px;">
${escapeHtml(i)}
<button type="button" onclick="removeSelectedFolder('${escapeHtml(i)}')" style="background: none; border: none; cursor: pointer; color: var(--error); font-size: 1rem; padding: 0;">\xD7</button>
</span>
`).join("")}window.removeSelectedFolder=function(i){m=m.filter(c=>c!==i),I(),k(u)},document.getElementById("folder-browser-select-current").addEventListener("click",()=>{u&&!m.includes(u)&&(m.push(u),I(),k(u))}),wireModal(P,document.getElementById("folder-browser-cancel")),document.getElementById("folder-browser-done").addEventListener("click",()=>{L&&(L.value=m.join(", ")),P.classList.remove("show")}),S()})(),(function(){injectModal("recipe-deploy-modal",`<div id="recipe-deploy-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 620px; max-width: 740px;">
<h3 id="recipe-deploy-title">Deploy Recipe</h3>
<!-- Step indicator -->
<div id="recipe-steps" style="display: flex; gap: 4px; margin: 16px 0 24px;">
<div class="recipe-step active" data-step="1"><span>1</span> Components</div>
<div class="recipe-step" data-step="2"><span>2</span> Configuration</div>
<div class="recipe-step" data-step="3"><span>3</span> Review</div>
<div class="recipe-step" data-step="4"><span>4</span> Progress</div>
</div>
<!-- Step 1: Component Selection -->
<div id="recipe-step-1" class="recipe-step-panel">
<label class="form-label-accent-sm">Select Components:</label>
<div id="recipe-component-list" style="display: grid; gap: 10px; margin-top: 8px;"></div>
</div>
<!-- Step 2: Shared Configuration -->
<div id="recipe-step-2" class="recipe-step-panel" style="display:none;">
<div style="display: grid; gap: 16px;">
<!-- Shared volumes -->
<div id="recipe-volumes-section" style="display:none;">
<label class="form-label-accent-sm">Shared Volumes:</label>
<div id="recipe-volume-list" style="display: grid; gap: 10px; margin-top: 8px;"></div>
</div>
<!-- Timezone -->
<div>
<label class="form-label-accent-sm">Timezone:</label>
<input type="text" id="recipe-timezone" value="UTC" placeholder="e.g. America/New_York"
style="width: 100%; padding: 8px 12px; background: var(--card-bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px;" />
</div>
<!-- Target IP -->
<div>
<label class="form-label-accent-sm">Target IP Address:</label>
<input type="text" id="recipe-ip" value="host.docker.internal" placeholder="localhost or IP"
style="width: 100%; padding: 8px 12px; background: var(--card-bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px;" />
<div class="form-hint-sm">IP where containers expose ports</div>
</div>
<!-- Tailscale -->
<label class="checkbox-label">
<input type="checkbox" id="recipe-tailscale" />
<span>Restrict to Tailscale network only</span>
</label>
</div>
</div>
<!-- Step 3: Review -->
<div id="recipe-step-3" class="recipe-step-panel" style="display:none;">
<div id="recipe-review-content" style="font-size: 0.9rem; line-height: 1.7;"></div>
</div>
<!-- Step 4: Progress -->
<div id="recipe-step-4" class="recipe-step-panel" style="display:none;">
<div id="recipe-progress-list" style="display: grid; gap: 8px;"></div>
<div id="recipe-deploy-result" style="margin-top: 16px; display:none;"></div>
</div>
<div class="weather-modal-buttons" style="margin-top: 20px;">
<button id="recipe-cancel">Cancel</button>
<button id="recipe-prev" class="btn-accent" style="display:none;">Back</button>
<button id="recipe-next" class="btn-accent-solid">Next</button>
</div>
</div>
</div>`);let x=null,b=null,j=null,g=1,N=!1;const A=document.getElementById("recipe-deploy-modal"),D=document.getElementById("recipe-cancel"),R=document.getElementById("recipe-prev"),f=document.getElementById("recipe-next");wireModal(A,D);async function C(){try{const u=await fetch("/api/v1/recipes/templates"),m=await u.json();if(m.success)return x=m.templates,b=m.categories,!0;if(u.status===403)return N=!1,!1}catch(u){console.warn("Failed to fetch recipe templates:",u.message)}return!1}async function E(){try{N=(await(await fetch("/api/v1/license/feature/recipes")).json()).available}catch{N=!1}return N}window.renderRecipeCards=async function(u){await E();let m;if(N&&x?m=x:m=M(),!m||m.length===0)return;const L=document.createElement("div");L.className="app-category-header",L.innerHTML="\u{1F9EA} Recipes",L.style.borderBottomColor="#8e44ad",u.appendChild(L);const k=Array.isArray(m)?m:Object.values(m);k.sort((I,i)=>(i.popularity||0)-(I.popularity||0));for(const I of k){const i=document.createElement("div");i.className="app-option",i.style.position="relative";const c=`<div style="font-size: 0.65rem; padding: 2px 6px; border-radius: 4px; margin-top: 4px; background: rgba(142,68,173,0.2); color: #a855f7;">${I.componentCount||I.components?.length||"?"} apps</div>`,d=N?"":'<div style="position: absolute; top: 6px; right: 6px; font-size: 0.65rem; padding: 2px 8px; border-radius: 10px; background: rgba(241,196,15,0.2); color: #f1c40f; font-weight: 600;">PREMIUM</div>';i.innerHTML=`
${d}
<div class="app-option-icon">${escapeHtml(I.icon||"\u{1F9EA}")}</div>
<div class="app-option-name">${escapeHtml(I.name)}</div>
<div class="app-option-desc">${escapeHtml(I.description||"")}</div>
${c}
`,i.onclick=()=>{if(!N){showNotification("Recipes require a DashCaddy Premium license. Click the License button to activate.","warning",5e3),window.openLicenseModal&&window.openLicenseModal();return}w(I)},u.appendChild(i)}};function M(){return[{id:"htpc-suite",name:"HTPC Suite",icon:"\u{1F3AC}",description:"Complete media automation: find, download, organize, and stream",componentCount:6,popularity:98},{id:"nextcloud-complete",name:"Nextcloud Complete",icon:"\u2601\uFE0F",description:"Full productivity suite: cloud storage, office editing, and collaboration",componentCount:4,popularity:90},{id:"smart-home",name:"Smart Home Hub",icon:"\u{1F3E0}",description:"Home automation: control, automate, and monitor IoT devices",componentCount:4,popularity:88},{id:"dev-environment",name:"Dev Environment",icon:"\u{1F4BB}",description:"Self-hosted development workflow: Git, CI/CD, IDE, and database",componentCount:4,popularity:82}]}function w(u){j=u,g=1;const m=document.getElementById("app-selector-modal");m&&m.classList.remove("show"),document.getElementById("recipe-deploy-title").textContent=`Deploy ${u.name}`,z(),S(),A.classList.add("show")}function z(){document.querySelectorAll("#recipe-steps .recipe-step").forEach(u=>{const m=parseInt(u.dataset.step);u.classList.toggle("active",m===g),u.classList.toggle("completed",m<g)});for(let u=1;u<=4;u++){const m=document.getElementById(`recipe-step-${u}`);m&&(m.style.display=u===g?"":"none")}R.style.display=g>1&&g<4?"":"none",g===4?(f.style.display="none",D.textContent="Close"):g===3?(f.textContent="\u{1F680} Deploy",f.style.display="",D.textContent="Cancel"):(f.textContent="Next",f.style.display="",D.textContent="Cancel")}function S(){const u=document.getElementById("recipe-component-list");u.innerHTML="";const m=j.components||[];for(const L of m){const k=document.createElement("div");k.style.cssText="display: flex; align-items: center; gap: 12px; padding: 12px; border-radius: 8px; background: var(--card-bg); border: 1px solid var(--border);";const I=L.required,i=L.internal;k.innerHTML=`
<input type="checkbox" ${I?"checked disabled":"checked"} data-component-id="${L.id}"
style="width: 18px; height: 18px; accent-color: var(--accent);" />
<div style="flex: 1;">
<div style="font-weight: 600; font-size: 0.9rem;">${escapeHtml(L.role||L.id)}</div>
<div style="font-size: 0.78rem; color: var(--muted);">
${L.templateRef?escapeHtml(L.templateRef):"Built-in"}
${I?'<span style="color: var(--accent); margin-left: 6px;">Required</span>':'<span style="color: var(--muted); margin-left: 6px;">Optional</span>'}
${i?'<span style="color: var(--muted); margin-left: 6px;">(Internal)</span>':""}
</div>
${L.note?`<div style="font-size: 0.75rem; color: var(--warn-fg); margin-top: 4px;">\u26A0 ${escapeHtml(L.note)}</div>`:""}
</div>
`,u.appendChild(k)}}function T(){const u=document.getElementById("recipe-volumes-section"),m=document.getElementById("recipe-volume-list"),L=j.sharedVolumes;if(L&&Object.keys(L).length>0){u.style.display="",m.innerHTML="";for(const[k,I]of Object.entries(L)){const i=document.createElement("div");i.style.cssText="display: grid; gap: 4px;",i.innerHTML=`
<label style="font-weight: 500; font-size: 0.85rem;">${escapeHtml(I.label||k)}</label>
<input type="text" data-volume-key="${k}" value="${escapeHtml(I.defaultPath||"")}"
placeholder="${escapeHtml(I.defaultPath||"/path")}"
style="width: 100%; padding: 8px 12px; background: var(--card-bg); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; font-family: monospace; font-size: 0.85rem;" />
<div class="form-hint-sm">${escapeHtml(I.description||"")}</div>
`,m.appendChild(i)}}else u.style.display="none"}function P(){const u=document.getElementById("recipe-review-content"),m=v(),L=document.querySelectorAll("#recipe-volume-list input[data-volume-key]"),k={};L.forEach(d=>{k[d.dataset.volumeKey]=d.value});const I=document.getElementById("recipe-timezone").value||"UTC",i=document.getElementById("recipe-ip").value||"host.docker.internal",c=document.getElementById("recipe-tailscale").checked;u.innerHTML=`
<div style="font-weight: 600; font-size: 1rem; margin-bottom: 12px;">${escapeHtml(j.name)}</div>
<div style="color: var(--muted); margin-bottom: 16px;">${escapeHtml(j.description||"")}</div>
<div style="margin-bottom: 12px;">
<strong>Components (${m.length}):</strong>
<div style="display: grid; gap: 4px; margin-top: 6px;">
${m.map(d=>`<div style="padding: 4px 0; font-size: 0.85rem;">
\u2022 <strong>${escapeHtml(d.role||d.id)}</strong> ${d.internal?'<span style="color:var(--muted)">(internal)</span>':""}
</div>`).join("")}
</div>
</div>
${Object.keys(k).length>0?`<div style="margin-bottom: 12px;">
<strong>Volumes:</strong>
${Object.entries(k).map(([d,y])=>`<div style="font-size: 0.85rem; font-family: monospace; color: var(--muted);">${d}: ${escapeHtml(y)}</div>`).join("")}
</div>`:""}
<div style="font-size: 0.85rem; color: var(--muted);">
Timezone: ${escapeHtml(I)} &bull; IP: ${escapeHtml(i)} ${c?"&bull; Tailscale only":""}
</div>
${j.network?`<div style="font-size: 0.85rem; color: var(--muted); margin-top: 4px;">Docker network: <code>${escapeHtml(j.network.name)}</code></div>`:""}
`}function v(){const u=document.querySelectorAll("#recipe-component-list input[data-component-id]"),m=new Set;u.forEach(k=>{k.checked&&m.add(k.dataset.componentId)});const L=j.components||[];return L.filter(k=>k.required).forEach(k=>m.add(k.id)),L.filter(k=>m.has(k.id))}async function B(){const u=document.getElementById("recipe-progress-list"),m=document.getElementById("recipe-deploy-result");m.style.display="none",u.innerHTML="";const L=v();for(const c of L){const d=document.createElement("div");d.id=`recipe-progress-${c.id}`,d.style.cssText="display: flex; align-items: center; gap: 10px; padding: 10px 12px; border-radius: 6px; background: var(--card-bg); border: 1px solid var(--border); font-size: 0.85rem;",d.innerHTML=`
<span class="recipe-progress-icon" style="font-size: 1.1rem;">\u23F3</span>
<span style="flex:1; font-weight: 500;">${escapeHtml(c.role||c.id)}</span>
<span class="recipe-progress-status" style="color: var(--muted);">Queued</span>
`,u.appendChild(d)}const k=document.querySelectorAll("#recipe-volume-list input[data-volume-key]"),I={};k.forEach(c=>{I[c.dataset.volumeKey]=c.value});const i={selectedComponents:L.map(c=>c.id),sharedConfig:{ip:document.getElementById("recipe-ip").value||"host.docker.internal",timezone:document.getElementById("recipe-timezone").value||"UTC",tailscaleOnly:document.getElementById("recipe-tailscale").checked,volumes:I},componentOverrides:{}};for(const c of L)H(c.id,"deploying","Deploying...");try{const d=await(await secureFetch("/api/v1/recipes/deploy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({recipeId:j.id,config:i})})).json();if(d.success){for(const y of d.deployed||[])H(y.id,"success",y.url?`Running \u2192 ${y.url}`:"Running");for(const y of d.errors||[])H(y.componentId,"error",y.error);m.style.display="",m.innerHTML=`
<div style="padding: 14px; border-radius: 8px; background: rgba(46,204,113,0.1); border: 1px solid rgba(46,204,113,0.3);">
<div style="font-weight: 600; color: var(--ok-fg); margin-bottom: 6px;">${escapeHtml(d.message||"Deployed!")}</div>
${d.setupInstructions?`<div style="font-size: 0.8rem; color: var(--muted); margin-top: 8px;">
<strong>Setup tips:</strong>
<ul style="margin: 4px 0 0 16px; padding: 0;">${d.setupInstructions.map(y=>`<li>${escapeHtml(y)}</li>`).join("")}</ul>
</div>`:""}
</div>
`,showNotification(`${j.name} recipe deployed successfully!`,"success",5e3),window.loadServices&&window.loadServices()}else m.style.display="",m.innerHTML=`<div style="padding: 14px; border-radius: 8px; background: rgba(231,76,60,0.1); border: 1px solid rgba(231,76,60,0.3); color: var(--bad-fg);">
<strong>Deployment failed:</strong> ${escapeHtml(d.error||"Unknown error")}
</div>`,showNotification(`Recipe deployment failed: ${d.error}`,"error",5e3)}catch(c){m.style.display="",m.innerHTML=`<div style="padding: 14px; border-radius: 8px; background: rgba(231,76,60,0.1); border: 1px solid rgba(231,76,60,0.3); color: var(--bad-fg);">
<strong>Network error:</strong> ${escapeHtml(c.message)}
</div>`}}function H(u,m,L){const k=document.getElementById(`recipe-progress-${u}`);if(!k)return;const I=k.querySelector(".recipe-progress-icon"),i=k.querySelector(".recipe-progress-status");m==="deploying"?(I.textContent="\u23F3",i.style.color="var(--accent)"):m==="success"?(I.textContent="\u2705",i.style.color="var(--ok-fg)"):m==="error"&&(I.textContent="\u274C",i.style.color="var(--bad-fg)"),i.textContent=L}f.addEventListener("click",()=>{if(g===3){g=4,z(),B();return}g<3&&(g++,z(),g===2&&T(),g===3&&P())}),R.addEventListener("click",()=>{g>1&&g<4&&(g--,z())}),window.groupRecipeCards=function(){const u=document.querySelectorAll(".service-card[data-recipe-id]");if(u.length===0)return;const m={};u.forEach(L=>{const k=L.dataset.recipeId;m[k]||(m[k]=[]),m[k].push(L)});for(const[L,k]of Object.entries(m))k.length<2||k.forEach((I,i)=>{if(I.style.borderLeft="3px solid rgba(142,68,173,0.5)",i===0){let c=I.querySelector(".recipe-group-label");c||(c=document.createElement("div"),c.className="recipe-group-label",c.style.cssText="position: absolute; top: -8px; left: 12px; font-size: 0.6rem; padding: 1px 8px; border-radius: 8px; background: rgba(142,68,173,0.3); color: #d4a5ff; font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px;",c.textContent=L.replace(/-/g," "),I.style.position="relative",I.appendChild(c))}})},window.manageRecipe=async function(u,m){const L=`/api/v1/recipes/${u}/${m}`,k=m==="remove"?"DELETE":"POST",I=m==="remove"?`/api/v1/recipes/${u}`:L;if(!(m==="remove"&&!confirm(`Remove the entire ${u} recipe? This will delete all containers and configuration.`)))try{const c=await(await secureFetch(I,{method:k})).json();c.success?(showNotification(`Recipe ${m}: ${c.results?.filter(d=>d.status!=="failed").length||0} components processed`,"success",4e3),window.loadServices&&window.loadServices()):showNotification(`Recipe ${m} failed: ${c.error}`,"error",5e3)}catch(i){showNotification(`Network error: ${i.message}`,"error",5e3)}};const O=document.createElement("style");O.textContent=`
.recipe-step {
flex: 1;
text-align: center;
padding: 8px 4px;
font-size: 0.78rem;
color: var(--muted);
border-bottom: 2px solid var(--border);
transition: all 0.2s;
}
.recipe-step span {
display: inline-flex;
align-items: center;
justify-content: center;
width: 20px;
height: 20px;
border-radius: 50%;
background: var(--border);
color: var(--muted);
font-size: 0.7rem;
font-weight: 700;
margin-right: 4px;
}
.recipe-step.active {
color: var(--accent);
border-bottom-color: var(--accent);
}
.recipe-step.active span {
background: var(--accent);
color: #fff;
}
.recipe-step.completed {
color: var(--ok-fg);
border-bottom-color: var(--ok-fg);
}
.recipe-step.completed span {
background: var(--ok-fg);
color: #fff;
}
.recipe-step-panel {
min-height: 180px;
}
`,document.head.appendChild(O),E()})(),(function(){document.getElementById("reload-caddy-top")?.addEventListener("click",async()=>{const x=document.getElementById("reload-caddy-top"),b=x.textContent;try{x.textContent="\u23F3 Reloading...",x.disabled=!0;const j=await secureFetch("/api/v1/caddy/reload",{method:"POST",headers:{"Content-Type":"application/json"}}),g=await j.json();if(j.ok&&g.success)x.textContent="\u2705 Reloaded!",setTimeout(()=>{x.textContent=b,x.disabled=!1},2e3);else throw new Error(g.error||"Reload failed")}catch(j){x.textContent="\u274C Failed",showNotification(`Failed to reload Caddy: ${j.message}`,"error"),setTimeout(()=>{x.textContent=b,x.disabled=!1},2e3)}})})(),(function(){injectModal("error-log-modal",`<div id="error-log-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 950px; max-width: 1150px;">
<h3>\u{1F4CB} Error Logs</h3>
<p class="modal-subtitle">
Errors and warnings from the DashCaddy API. Click a row to see the full stack trace.
</p>
<div style="display: flex; gap: 12px; margin-bottom: 12px; align-items: center; flex-wrap: wrap;">
<label class="text-muted-sm">Level:</label>
<select id="error-log-level" style="padding: 6px 10px; border-radius: 6px; border: 1px solid var(--border); background: var(--bg); color: var(--fg); font-size: 0.85rem;">
<option value="">All</option>
<option value="ERR">Errors</option>
<option value="WARN">Warnings</option>
<option value="INFO">Info</option>
<option value="DEBUG">Debug</option>
</select>
<label class="text-muted-sm">Context:</label>
<select id="error-log-context" style="padding: 6px 10px; border-radius: 6px; border: 1px solid var(--border); background: var(--bg); color: var(--fg); font-size: 0.85rem; max-width: 220px;">
<option value="">All</option>
</select>
<label class="text-muted-sm" style="margin-left: 8px;">Search:</label>
<input id="error-log-search" type="search" placeholder="message / stack / ip" style="padding: 5px 8px; border-radius: 6px; border: 1px solid var(--border); background: var(--bg); color: var(--fg); font-size: 0.82rem; min-width: 180px;">
<label class="text-muted-sm" style="margin-left: 8px;">Since:</label>
<input id="error-log-since" type="datetime-local" style="padding: 5px 8px; border-radius: 6px; border: 1px solid var(--border); background: var(--bg); color: var(--fg); font-size: 0.82rem;">
<label class="text-muted-sm">Until:</label>
<input id="error-log-until" type="datetime-local" style="padding: 5px 8px; border-radius: 6px; border: 1px solid var(--border); background: var(--bg); color: var(--fg); font-size: 0.82rem;">
<button id="error-log-refresh" class="btn-sm">\u{1F504} Refresh</button>
<span style="flex: 1;"></span>
<button id="error-log-clear" style="padding: 6px 12px; font-size: 0.8rem; color: var(--bad-fg); border-color: var(--bad-fg);">\u{1F5D1}\uFE0F Clear Log</button>
</div>
<div id="error-log-container" class="scroll-container">
<div class="panel-empty"><span class="brand-spinner"></span> Loading error logs...</div>
</div>
<div style="margin-top: 12px; text-align: center;">
<button id="error-log-load-more" style="display: none; padding: 6px 16px; font-size: 0.8rem;">Load More</button>
</div>
<div style="margin-top: 8px; font-size: 0.78rem; color: var(--muted); text-align: right;">
<span id="error-log-total"></span>
</div>
<div class="weather-modal-buttons modal-footer-bar">
<button id="error-log-close">Close</button>
</div>
</div>
</div>`);const x=document.getElementById("error-log-modal"),b=document.getElementById("view-error-logs"),j=document.getElementById("error-log-refresh"),g=document.getElementById("error-log-clear"),N=document.getElementById("error-log-close"),A=document.getElementById("error-log-level"),D=document.getElementById("error-log-context"),R=document.getElementById("error-log-search"),f=document.getElementById("error-log-since"),C=document.getElementById("error-log-until"),E=document.getElementById("error-log-container"),M=document.getElementById("error-log-load-more"),w=document.getElementById("error-log-total"),z=50;let S=0,T=null,P=0,v=[];function B(I){if(!I)return null;const i=new Date(I);return isNaN(i.getTime())?null:i.toISOString()}async function H(){try{const I=await fetch("/api/v1/error-logs/contexts");if(!I.ok)return;const i=await I.json();if(!i.success||!Array.isArray(i.contexts))return;v=i.contexts;const c=D.value;D.innerHTML='<option value="">All</option>';for(const d of i.contexts){const y=document.createElement("option");y.value=d.name,y.textContent=`${d.name} (${d.count})`,D.appendChild(y)}c&&i.contexts.some(d=>d.name===c)&&(D.value=c)}catch{}}function O(){const I=new URLSearchParams;I.set("limit",String(z)),I.set("offset",String(S)),A.value&&I.set("level",A.value),D.value&&I.set("context",D.value);const i=B(f.value),c=B(C.value);i&&I.set("since",i),c&&I.set("until",c);const d=(R.value||"").trim();return d&&I.set("search",d),I}async function u(I){try{I?(T&&T.abort(),T=new AbortController):(T&&T.abort(),T=new AbortController,S=0,P++,E.innerHTML='<div class="panel-empty"><span class="brand-spinner"></span> Loading...</div>');const i=P,c=O(),d=await fetch("/api/v1/error-logs?"+c.toString(),{signal:T.signal});if(!d.ok){E.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: HTTP ${d.status}</div>`,M.style.display="none",w.textContent="";return}const y=await d.json();if(!y.success){E.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(y.error||"unknown")}</div>`,M.style.display="none",w.textContent="";return}if(!I&&i!==P)return;const p=Array.isArray(y.logs)?y.logs:[];if(p.length===0&&!I){const e=y.filters&&(y.filters.level||y.filters.context||y.filters.search||y.filters.since||y.filters.until)?"No error log entries match your filters.":"\u2705 No errors logged! Everything is working smoothly.";E.innerHTML=`<div class="panel-empty"><span class="empty-icon">\u{1F4CB}</span>${escapeHtml(e)}</div>`,M.style.display="none",w.textContent=y.total?`${y.total} total`:"";return}let n="";I||(n='<table style="width: 100%; border-collapse: collapse; font-size: 0.82rem;">',n+='<tr style="border-bottom: 1px solid var(--border); color: var(--muted);">',n+='<th style="padding: 6px; text-align: left; width: 160px;">When</th>',n+='<th style="padding: 6px; text-align: left; width: 80px;">Level</th>',n+='<th style="padding: 6px; text-align: left; width: 140px;">Context</th>',n+='<th style="padding: 6px; text-align: left;">Message</th>',n+='<th style="padding: 6px; text-align: left; width: 110px;">IP</th>',n+="</tr>");for(const e of p){const r=(e.level||"?").toUpperCase(),s=r==="ERR"?"var(--bad-fg)":r==="WARN"?"var(--warn-fg, #f0c674)":"var(--muted)",a=e.timestamp?new Date(e.timestamp).toLocaleString():"\u2014",t=e.context||"\u2014",o=(e.error||"").split(`
`)[0],l=e.request&&e.request.ip||"";n+='<tr style="border-bottom: 1px solid var(--border); cursor: pointer;" class="error-log-row">',n+=`<td style="padding: 6px; color: var(--muted);" title="${escapeHtml(e.timestamp||"")}">${escapeHtml(a)}</td>`,n+=`<td style="padding: 6px;"><span style="color: ${s}; font-weight: 600;">${escapeHtml(r)}</span></td>`,n+=`<td style="padding: 6px; font-family: monospace; font-size: 0.78rem;">${escapeHtml(t)}</td>`,n+=`<td style="padding: 6px;">${escapeHtml(o)}</td>`,n+=`<td style="padding: 6px; font-family: monospace; font-size: 0.78rem;">${escapeHtml(l)}</td>`,n+="</tr>",e.detail&&(n+=`<tr class="error-log-detail" style="display: none;"><td colspan="5" style="padding: 6px 6px 10px; font-size: 0.78rem; color: var(--muted);"><pre style="margin: 0; white-space: pre-wrap; font-family: monospace; max-height: 320px; overflow: auto;">${escapeHtml(e.detail)}</pre></td></tr>`)}if(!I)n+="</table>",E.innerHTML=n;else{const e=E.querySelector("table");e&&e.insertAdjacentHTML("beforeend",n)}S+=p.length,M.style.display=y.hasMore?"":"none",w.textContent=`${y.total} total${y.hasMore?" (showing "+S+")":""}`,E.querySelectorAll(".error-log-row").forEach(e=>{e.dataset.wired||(e.dataset.wired="true",e.addEventListener("click",()=>{const r=e.nextElementSibling;r&&r.classList.contains("error-log-detail")&&(r.style.display=r.style.display==="none"?"":"none")}))})}catch(i){if(i&&i.name==="AbortError")return;E.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(i.message)}</div>`,w.textContent=""}}async function m(){if(confirm("Clear the entire error log? This cannot be undone."))try{const i=await(await secureFetch("/api/v1/error-logs",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:"CLEAR"})})).json();i.success?(await H(),u(!1),showNotification("\u2705 Error logs cleared","success",3e3)):showNotification("\u274C "+(i.error||"Clear failed"),"error",4e3)}catch(I){showNotification("\u274C "+I.message,"error",4e3)}}let L;function k(){A?.addEventListener("change",()=>u(!1)),D?.addEventListener("change",()=>u(!1)),R?.addEventListener("input",()=>{clearTimeout(L),L=setTimeout(()=>u(!1),250)});let I;[f,C].forEach(i=>{i?.addEventListener("change",()=>{clearTimeout(I),I=setTimeout(()=>u(!1),250)})}),j?.addEventListener("click",()=>u(!1)),M?.addEventListener("click",()=>u(!0)),g?.addEventListener("click",m),wireModal(x,N)}b?.addEventListener("click",async()=>{x?.classList.add("show"),await H(),u(!1)}),k()})(),(function(){injectModal("container-logs-modal",`<div id="container-logs-modal" class="weather-modal" style="z-index: 1001;">
<div class="weather-modal-content" style="min-width: 900px; max-width: 95vw; height: 80vh; display: flex; flex-direction: column;">
<div class="logs-header" style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 12px; border-bottom: 1px solid var(--border); margin-bottom: 12px;">
<div>
<h3 style="margin: 0;">\u{1F4DC} Container Logs</h3>
<p class="modal-subtitle" style="margin: 4px 0 0 0; font-size: 0.85rem; opacity: 0.7;">View and stream Docker container logs</p>
</div>
<div class="logs-controls" style="display: flex; gap: 8px; align-items: center;">
<select id="cl-container-select" style="padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg); min-width: 200px;">
<option value="">Select a container...</option>
</select>
<input type="text" id="cl-log-search" placeholder="Search logs..." style="padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg); width: 150px;" />
<select id="cl-log-tail" style="padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg);">
<option value="50">Last 50 lines</option>
<option value="100" selected>Last 100 lines</option>
<option value="500">Last 500 lines</option>
<option value="1000">Last 1000 lines</option>
<option value="all">All logs</option>
</select>
<button id="cl-refresh" class="btn-accent-solid" style="padding: 6px 14px; font-size: 0.85rem;">\u{1F504} Refresh</button>
<button id="cl-stream" class="btn-accent-solid" style="padding: 6px 14px; font-size: 0.85rem;">\u25B6 Stream</button>
<button id="cl-download" style="padding: 6px 14px; font-size: 0.85rem;">\u{1F4BE} Download</button>
<button id="cl-clear-search" style="padding: 6px 10px; font-size: 0.85rem;" title="Clear search">\u2715</button>
<button id="cl-close" class="close-btn" style="padding: 6px 10px;">\u2715</button>
</div>
</div>
<div id="cl-container-info" style="display: flex; gap: 16px; margin-bottom: 12px; padding: 8px 12px; background: var(--bg-secondary, var(--bg)); border-radius: 6px; font-size: 0.82rem;">
<span><strong>Image:</strong> <span id="cl-image">-</span></span>
<span><strong>Status:</strong> <span id="cl-status">-</span></span>
<span><strong>Created:</strong> <span id="cl-created">-</span></span>
</div>
<div id="cl-log-content" class="logs-content scroll-container" style="flex: 1; min-height: 0; background: #1a1a1a; border-radius: 6px; padding: 12px; font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: 0.78rem; overflow: auto;">
<div class="logs-loading" style="color: var(--muted); text-align: center; padding: 40px;">Select a container to view logs</div>
</div>
<div id="cl-stream-status" style="display: none; padding: 8px 12px; background: var(--ok-bg, #1a3a1a); color: var(--ok-fg, #4ade80); border-radius: 6px; margin-top: 8px; font-size: 0.82rem;">
<span id="cl-stream-indicator">\u{1F534}</span> <span id="cl-stream-text">Disconnected</span>
</div>
<div class="weather-modal-buttons modal-footer-bar" style="margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border);">
<div style="display: flex; gap: 8px; font-size: 0.78rem; color: var(--muted);">
<span id="cl-line-count">0 lines</span>
<span>|</span>
<span id="cl-filter-count">0 filtered</span>
</div>
<button id="cl-close-btn" class="btn-secondary">Close</button>
</div>
</div>
</div>`);const x=document.getElementById("container-logs-modal"),b=document.getElementById("cl-container-select"),j=document.getElementById("cl-log-content"),g=document.getElementById("cl-log-search"),N=document.getElementById("cl-log-tail"),A=document.getElementById("cl-refresh"),D=document.getElementById("cl-stream"),R=document.getElementById("cl-download"),f=document.getElementById("cl-clear-search"),C=document.getElementById("cl-close"),E=document.getElementById("cl-close-btn"),M=document.getElementById("cl-stream-status"),w=document.getElementById("cl-stream-indicator"),z=document.getElementById("cl-stream-text"),S=document.getElementById("cl-line-count"),T=document.getElementById("cl-filter-count"),P=document.getElementById("cl-image"),v=document.getElementById("cl-status"),B=document.getElementById("cl-created");let H=null,O=[],u=[],m=null,L=!1,k=null;function I(o){if(!o)return"-";const l=new Date(o);return isNaN(l.getTime())?o:l.toLocaleString()}function i(o){if(!o)return"";const l=document.createElement("div");return l.textContent=o,l.innerHTML}function c(o,l){const h=o.stream==="stderr"?"log-stderr":"log-stdout",$=o.stream==="stderr"?"\u26A0\uFE0F":"\u{1F4E4}";return`
<div class="log-entry ${h}" data-index="${l}" style="padding: 4px 8px; border-bottom: 1px solid #333; display: flex; gap: 8px;">
<span class="log-line-num" style="color: #666; min-width: 40px; text-align: right; user-select: none;">${l+1}</span>
<span class="log-stream-icon" style="color: ${o.stream==="stderr"?"#f59e0b":"#22c55e"};">${$}</span>
<span class="log-text" style="flex: 1; white-space: pre-wrap; word-break: break-all; color: #e5e5e5;">${i(o.text)}</span>
</div>
`}function d(o,l=""){if(!o||o.length===0){j.innerHTML='<div class="logs-loading" style="color: var(--muted); text-align: center; padding: 40px;">No logs available</div>',S.textContent="0 lines",T.textContent="0 filtered";return}if(O=o,u=l?o.filter(h=>h.text&&h.text.toLowerCase().includes(l.toLowerCase())):o,S.textContent=`${o.length} lines`,T.textContent=l?`${u.length} of ${o.length} shown`:`${o.length} shown`,u.length===0){j.innerHTML=`<div class="logs-loading" style="color: var(--muted); text-align: center; padding: 40px;">No logs match "${i(l)}"</div>`;return}j.innerHTML=u.map((h,$)=>c(h,$)).join(""),j.scrollTop=j.scrollHeight}async function y(){try{const l=(await getJSON("/api/v1/logs/containers")).containers||[],h=b.value;b.innerHTML='<option value="">Select a container...</option>',l.forEach($=>{const U=document.createElement("option");U.value=$.id,U.textContent=`${$.name} (${$.image.split(":")[0]}) - ${$.status}`,U.dataset.name=$.name,U.dataset.image=$.image,U.dataset.status=$.status,U.dataset.created=$.created,b.appendChild(U)}),h&&b.querySelector(`option[value="${h}"]`)&&(b.value=h,p(h))}catch(o){console.error("Failed to load containers:",o)}}function p(o){const l=b.querySelector(`option[value="${o}"]`);l&&(P.textContent=l.dataset.image||"-",v.textContent=l.dataset.status||"-",v.style.color=l.dataset.status==="running"?"var(--ok-fg, #4ade80)":"var(--bad-fg, #ef4444)",B.textContent=I(l.dataset.created))}async function n(){const o=b.value;if(!o){j.innerHTML='<div class="logs-loading" style="color: var(--muted); text-align: center; padding: 40px;">Select a container to view logs</div>';return}r(),H=o,p(o);const l=N.value,h=g.value.trim();j.innerHTML='<div class="logs-loading" style="color: var(--muted); text-align: center; padding: 40px;">Loading logs...</div>';try{const $=`/api/v1/logs/container/${o}${l!=="all"?`?tail=${l}`:""}`,U=await getJSON($);U.logs&&U.logs.length>0?d(U.logs,h):(j.innerHTML='<div class="logs-loading" style="color: var(--muted); text-align: center; padding: 40px;">No logs found for this container</div>',S.textContent="0 lines",T.textContent="0 filtered")}catch($){j.innerHTML=`<div class="logs-loading" style="color: var(--bad-fg, #ef4444); text-align: center; padding: 40px;">Error loading logs: ${i($.message)}</div>`}}function e(){const o=b.value;if(!o)return;r(),L=!0,D.textContent="\u23F9 Stop",M.style.display="flex",w.textContent="\u{1F7E2}",z.textContent="Connecting...";const l=`/api/v1/logs/stream/${o}`;m=new EventSource(l),m.onopen=()=>{w.textContent="\u{1F7E2}",z.textContent="Connected - streaming logs"},m.onmessage=h=>{try{const $=JSON.parse(h.data);if($.error){w.textContent="\u{1F534}",z.textContent=`Error: ${$.error}`;return}O.push($),u.push($),S.textContent=`${O.length} lines`,T.textContent=`${u.length} shown`;const U=g.value.trim();if(!U||$.text&&$.text.toLowerCase().includes(U.toLowerCase())){const F=document.createElement("div");F.innerHTML=c($,u.length-1);const _=F.firstElementChild;_.style.background="#1a3a1a",j.appendChild(_),j.scrollTop=j.scrollHeight}}catch($){console.error("Error parsing log:",$)}},m.onerror=()=>{w.textContent="\u{1F534}",z.textContent="Disconnected",L=!1,D.textContent="\u25B6 Stream"},x._eventSource=m}function r(){m&&(m.close(),m=null),x._eventSource&&(x._eventSource.close(),x._eventSource=null),L=!1,D.textContent="\u25B6 Stream",M.style.display="none"}function s(){if(!O||O.length===0){showNotification("No logs to download","error");return}const o=b.querySelector(`option[value="${H}"]`)?.dataset.name||H,l=new Date().toISOString().replace(/[:.]/g,"-"),h=`${o}-logs-${l}.txt`,$=O.map(J=>{const q=J.timestamp||"",K=J.stream==="stderr"?"[ERR]":"[OUT]";return`${q?q+" ":""}${K} ${J.text}`}).join(`
`),U=new Blob([$],{type:"text/plain"}),F=URL.createObjectURL(U),_=document.createElement("a");_.href=F,_.download=h,document.body.appendChild(_),_.click(),document.body.removeChild(_),URL.revokeObjectURL(F),showNotification(`Downloaded ${O.length} log lines`,"success")}b?.addEventListener("change",()=>{n()}),N?.addEventListener("change",()=>{n()}),A?.addEventListener("click",()=>{n()}),D?.addEventListener("click",()=>{L?r():e()}),R?.addEventListener("click",()=>{s()}),f?.addEventListener("click",()=>{g.value="",d(O,"")}),g?.addEventListener("input",()=>{clearTimeout(k),k=setTimeout(()=>{d(O,g.value.trim())},300)}),g?.addEventListener("keydown",o=>{o.key==="Escape"&&(g.value="",d(O,""))}),document.getElementById("view-container-logs")?.addEventListener("click",()=>{x.classList.add("show"),y()});function t(){r(),x.classList.remove("show")}C?.addEventListener("click",t),E?.addEventListener("click",t),document.addEventListener("keydown",o=>{o.key==="Escape"&&x.classList.contains("show")&&t()}),x.addEventListener("click",o=>{o.target===x&&t()}),window.openContainerLogsModal=function(o,l){x.classList.add("show"),y().then(()=>{const h=Array.from(b.options).find($=>$.value===o||$.dataset.name===l);h?(b.value=h.value,p(h.value),n()):o?(H=o,P.textContent=l||o,v.textContent="-",B.textContent="-",n()):j.innerHTML='<div class="logs-loading" style="color: var(--muted); text-align: center; padding: 40px;">Select a container to view logs</div>'})}})(),(function(){"use strict";const x=[{unit:"caddy",label:"Caddy (reverse proxy)"},{unit:"dashcaddy-api",label:"DashCaddy API (host systemd unit, not this container)"},{unit:"docker",label:"Docker daemon"},{unit:"ssh",label:"SSH server"},{unit:"systemd-journald",label:"systemd-journald"},{unit:"tailscaled",label:"Tailscale"},{unit:"networkd-dispatcher",label:"Networkd dispatcher"}];injectModal("journald-modal",`
<div id="journald-modal" class="weather-modal" style="z-index: 1002;">
<div class="weather-modal-content" style="min-width: 900px; max-width: 95vw; height: 80vh; display: flex; flex-direction: column;">
<div class="logs-header" style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 12px; border-bottom: 1px solid var(--border); margin-bottom: 12px;">
<div>
<h3 style="margin: 0;">\u{1F6F0}\uFE0F Host Logs (journald)</h3>
<p class="modal-subtitle" style="margin: 4px 0 0 0; font-size: 0.85rem; opacity: 0.7;">
Stream host service logs from <code>journalctl</code> (read-only mount). Docker container logs are still in the <em>Container Logs</em> modal.
</p>
</div>
<div class="logs-controls" style="display: flex; gap: 8px; align-items: center; flex-wrap: wrap; justify-content: flex-end;">
<select id="jd-unit-select" style="padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg); min-width: 220px;"></select>
<input type="text" id="jd-search" placeholder="Search logs..." style="padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg); width: 160px;" />
<input type="number" id="jd-tail" min="1" max="5000" value="200" title="Lines to load (historical view)" style="padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg); width: 90px;" />
<button id="jd-refresh" class="btn-accent-solid" style="padding: 6px 14px; font-size: 0.85rem;">\u{1F504} Load tail</button>
<button id="jd-stream" class="btn-accent-solid" style="padding: 6px 14px; font-size: 0.85rem;">\u25B6 Stream</button>
<button id="jd-clear-search" style="padding: 6px 10px; font-size: 0.85rem;" title="Clear search">\u2715</button>
<button id="jd-close" class="close-btn" style="padding: 6px 10px;">\u2715</button>
</div>
</div>
<div id="jd-meta" style="display: flex; gap: 16px; margin-bottom: 12px; padding: 8px 12px; background: var(--bg-secondary, var(--bg)); border-radius: 6px; font-size: 0.82rem; flex-wrap: wrap;">
<span><strong>Source:</strong> <span id="jd-source">journald</span></span>
<span><strong>Unit:</strong> <span id="jd-unit-display">-</span></span>
<span><strong>Stream:</strong> <span id="jd-stream-state">disconnected</span></span>
</div>
<div id="jd-content" class="logs-content scroll-container" style="flex: 1; min-height: 0; background: #1a1a1a; border-radius: 6px; padding: 12px; font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace; font-size: 0.78rem; overflow: auto;">
<div class="logs-loading" style="color: var(--muted); text-align: center; padding: 40px;">Select a unit and click <em>Load tail</em> or <em>Stream</em>.</div>
</div>
<div class="weather-modal-buttons modal-footer-bar" style="margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border);">
<div style="display: flex; gap: 8px; font-size: 0.78rem; color: var(--muted);">
<span id="jd-line-count">0 lines</span>
<span>|</span>
<span id="jd-filter-count">0 shown</span>
<span>|</span>
<span id="jd-overflow" style="display: none; color: var(--warn-fg, #fbbf24);">\u26A0 stream overflow \u2014 re-load with narrower window</span>
</div>
<button id="jd-close-btn" class="btn-secondary">Close</button>
</div>
</div>
</div>
`);const b=document.getElementById("journald-modal"),j=document.getElementById("jd-unit-select"),g=document.getElementById("jd-search"),N=document.getElementById("jd-tail"),A=document.getElementById("jd-refresh"),D=document.getElementById("jd-stream"),R=document.getElementById("jd-clear-search"),f=document.getElementById("jd-close"),C=document.getElementById("jd-close-btn"),E=document.getElementById("jd-content"),M=document.getElementById("jd-line-count"),w=document.getElementById("jd-filter-count"),z=document.getElementById("jd-overflow"),S=document.getElementById("jd-unit-display"),T=document.getElementById("jd-stream-state");let P=!1,v=[],B=!1,H=null,O=null;function u(p){const n=document.createElement("div");return n.textContent=String(p),n.innerHTML}function m(p){P=p,j.innerHTML="",x.forEach(n=>{const e=document.createElement("option");e.value=n.unit,e.textContent=n.label+" ("+n.unit+")",j.appendChild(e)}),j.disabled=!p,p?(A.disabled=!1,D.disabled=!1):(E.innerHTML='<div class="logs-loading" style="color: var(--muted); text-align: center; padding: 40px;">journald bind-mount not available in this container.<br/><small>Requires <code>/var/log/journal</code> + <code>/usr/bin/journalctl</code> mounted (start.sh).</small></div>',A.disabled=!0,D.disabled=!0)}async function L(){try{const p=await fetch("/api/v1/logs/journal/units");if(!p.ok){m(!1);return}const n=await p.json();m(!!n.available)}catch{m(!1)}}function k(){const p=(g.value||"").trim().toLowerCase(),n=p?v.filter(e=>(e.textContent||"").toLowerCase().includes(p)):v;if(n.length===0)E.innerHTML='<div class="logs-loading" style="color: var(--muted); text-align: center; padding: 40px;">No entries'+(p?` matching &quot;${u(p)}&quot;`:"")+"</div>";else{const e=n.map(s=>{const a=s.timestamp?u(s.timestamp):"\u2014",t=u(s.textContent);return`<div class="jd-line" style="padding: 1px 0; line-height: 1.4; color: #d4d4d4;"><span style="color: var(--muted); margin-right: 8px;">${a}</span>${t}</div>`}).join("");E.innerHTML=e,E.scrollHeight-E.scrollTop-E.clientHeight<80&&(E.scrollTop=E.scrollHeight)}M.textContent=`${v.length} entries`,w.textContent=p?`${n.length} of ${v.length} shown`:`${v.length} shown`}async function I(){if(!P)return;c();const p=j.value;if(!p)return;const n=Math.max(1,Math.min(5e3,Number(N.value)||200)),e=(g.value||"").trim();E.innerHTML='<div class="logs-loading" style="color: var(--muted); text-align: center; padding: 40px;">Loading\u2026</div>';try{const r=new URL("/api/v1/logs/journal",window.location.origin);r.searchParams.set("unit",p),r.searchParams.set("tail",String(n)),e&&r.searchParams.set("search",e);const s=await fetch(r.toString()),a=await s.json();if(!s.ok||!a.success){E.innerHTML='<div class="logs-loading" style="color: var(--bad-fg, #ef4444); text-align: center; padding: 40px;">Failed: '+u(a&&a.error||"HTTP "+s.status)+"</div>";return}S.textContent=p,v=(a.entries||[]).map(t=>({timestamp:t.timestamp,unit:t.unit,textContent:t.text||""})),z.style.display="none",k()}catch(r){E.innerHTML='<div class="logs-loading" style="color: var(--bad-fg, #ef4444); text-align: center; padding: 40px;">Error: '+u(r.message)+"</div>"}}function i(){if(!P)return;c();const p=j.value;if(!p)return;const n=(g.value||"").trim();S.textContent=p,D.textContent="\u23F8 Stop",D.classList.add("streaming"),T.textContent="streaming",T.style.color="var(--ok-fg, #4ade80)",v=[],k(),z.style.display="none";const e=new URL("/api/v1/logs/journal/stream",window.location.origin);e.searchParams.set("unit",p),n&&e.searchParams.set("search",n),H=new EventSource(e.toString()),H.onmessage=r=>{try{const s=JSON.parse(r.data);if(s.error){/stream (exceeded|line cap)/.test(s.error)&&(z.style.display="",c()),E.innerHTML+='<div class="jd-line" style="color: var(--bad-fg, #ef4444); padding: 4px 0;">\u26A0 '+u(s.error)+"</div>",E.scrollTop=E.scrollHeight;return}v.push({timestamp:s.timestamp,unit:s.unit||p,textContent:s.text||""}),v.length>5e3&&(v=v.slice(v.length-5e3),z.style.display=""),k()}catch{}},H.onerror=()=>{},B=!0}function c(){if(B=!1,H){try{H.close()}catch{}H=null}D.textContent="\u25B6 Stream",D.classList.remove("streaming"),T.textContent="disconnected",T.style.color="var(--muted)"}function d(){c(),b.classList.remove("show")}A.addEventListener("click",I),D.addEventListener("click",()=>B?c():i()),R.addEventListener("click",()=>{g.value="",k()}),g.addEventListener("input",()=>{clearTimeout(O),O=setTimeout(k,200)}),g.addEventListener("keydown",p=>{p.key==="Escape"&&(g.value="",k())}),f.addEventListener("click",d),C.addEventListener("click",d),b.addEventListener("click",p=>{p.target===b&&d()}),document.addEventListener("keydown",p=>{p.key==="Escape"&&b.classList.contains("show")&&d()}),j.addEventListener("change",()=>{v.length>0&&I()});function y(){b.classList.add("show"),L()}window.openJournaldModal=y,document.getElementById("view-journald-logs")?.addEventListener("click",y)})(),(function(){injectModal("snapshot-modal",`<div id="snapshot-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 700px; max-width: 850px;">
<h3>\u{1F4BE} Container Snapshots</h3>
<p class="modal-subtitle">
Create and manage Docker container checkpoints for instant state recovery.
</p>
<div id="snapshot-container-select-wrapper" style="margin-bottom: 16px;">
<label style="font-size: 0.85rem; color: var(--muted);">Select Container:</label>
<select id="snapshot-container-select" style="width: 100%; padding: 8px 12px; margin-top: 4px; background: var(--bg); border: 1px solid var(--border); border-radius: 6px; color: var(--fg); font-size: 0.9rem;">
<option value="">-- Select a container --</option>
</select>
</div>
<div id="snapshot-details" style="display: none; margin-bottom: 16px; padding: 12px; border: 1px solid var(--border); border-radius: 8px; background: var(--card-hover);">
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px; font-size: 0.85rem;">
<div><span style="color: var(--muted);">Image:</span> <span id="snapshot-image"></span></div>
<div><span style="color: var(--muted);">Status:</span> <span id="snapshot-status"></span></div>
<div><span style="color: var(--muted);">Created:</span> <span id="snapshot-created"></span></div>
<div><span style="color: var(--muted);">Container ID:</span> <span id="snapshot-id" style="font-family: monospace;"></span></div>
</div>
</div>
<div class="panel-tabs" style="margin-bottom: 12px;">
<button class="panel-tab active" data-panel="snapshot-create">Create Snapshot</button>
<button class="panel-tab" data-panel="snapshot-list">Manage Snapshots</button>
</div>
<div id="snapshot-create" class="panel-section active">
<div style="margin-bottom: 12px;">
<label style="font-size: 0.85rem; color: var(--muted);">Snapshot Name:</label>
<input type="text" id="snapshot-name" placeholder="e.g., before-update-2024"
style="width: 100%; padding: 8px 12px; margin-top: 4px; background: var(--bg); border: 1px solid var(--border); border-radius: 6px; color: var(--fg); font-size: 0.9rem; box-sizing: border-box;" />
</div>
<div style="margin-bottom: 12px;">
<label class="checkbox-label" style="font-size: 0.85rem;">
<input type="checkbox" id="snapshot-leave-running" checked />
Leave container running after checkpoint (resume without restart)
</label>
</div>
<button id="snapshot-create-btn" class="btn-accent-solid" style="width: 100%;">\u{1F4BE} Create Snapshot</button>
<div id="snapshot-create-status" style="margin-top: 12px; text-align: center; font-size: 0.85rem;"></div>
</div>
<div id="snapshot-list" class="panel-section" style="display: none;">
<div id="snapshot-list-container" class="scroll-container" style="max-height: 300px;">
<div class="panel-empty"><span class="empty-icon">\u{1F4BE}</span>Select a container to view its snapshots</div>
</div>
</div>
<div class="weather-modal-buttons modal-footer-bar">
<button id="snapshot-close">Close</button>
</div>
</div>
</div>`);const x=document.getElementById("snapshot-modal"),b=document.getElementById("snapshot-btn"),j=document.getElementById("snapshot-close"),g=document.getElementById("snapshot-container-select"),N=document.getElementById("snapshot-details"),A=document.getElementById("snapshot-create-btn"),D=document.getElementById("snapshot-create-status");let R=null;async function f(){try{const S=await(await fetch("/api/v1/containers")).json();if(!S.success||!S.containers)return;g.innerHTML='<option value="">-- Select a container --</option>';for(const T of S.containers){const P=document.createElement("option");P.value=T.id,P.textContent=`${T.name||T.id} (${T.image||"unknown"})`,P.dataset.name=T.name,P.dataset.image=T.image,P.dataset.status=T.status,P.dataset.created=T.created,g.appendChild(P)}}catch(z){console.error("Failed to load containers:",z)}}function C(z){if(!z||!z.value){N.style.display="none",R=null;return}R=z.value,document.getElementById("snapshot-image").textContent=z.dataset.image||"-",document.getElementById("snapshot-status").textContent=z.dataset.status||"-",document.getElementById("snapshot-created").textContent=z.dataset.created?new Date(z.dataset.created*1e3).toLocaleString():"-",document.getElementById("snapshot-id").textContent=z.value.substring(0,12),N.style.display=""}async function E(){if(!R){D.textContent="Please select a container first",D.style.color="var(--bad-fg)";return}const z=document.getElementById("snapshot-name").value.trim();if(!z){D.textContent="Please enter a snapshot name",D.style.color="var(--bad-fg)";return}const S=document.getElementById("snapshot-leave-running").checked;A.disabled=!0,A.textContent="Creating...",D.textContent="";try{const P=await(await fetch(`/api/v1/containers/${encodeURIComponent(R)}/checkpoint`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:z,leaveRunning:S})})).json();P.success?(D.textContent=`\u2713 Snapshot "${z}" created successfully`,D.style.color="var(--ok-fg)",document.getElementById("snapshot-name").value=""):(D.textContent=`\u2717 Failed: ${P.error||"Unknown error"}`,D.style.color="var(--bad-fg)")}catch(T){D.textContent=`\u2717 Error: ${T.message}`,D.style.color="var(--bad-fg)"}finally{A.disabled=!1,A.textContent="\u{1F4BE} Create Snapshot"}}function M(){x.classList.add("show"),f()}function w(){x.classList.remove("show"),N.style.display="none",R=null,g.selectedIndex=0}b?.addEventListener("click",M),j?.addEventListener("click",w),wireModal(x,j),g?.addEventListener("change",z=>{const S=g.options[g.selectedIndex];C(S)}),A?.addEventListener("click",E),x?.querySelectorAll(".panel-tab").forEach(z=>{z.addEventListener("click",()=>{x.querySelectorAll(".panel-tab").forEach(S=>S.classList.remove("active")),x.querySelectorAll(".panel-section").forEach(S=>S.classList.remove("active")),z.classList.add("active"),x.querySelector(`#${z.dataset.panel}`).classList.add("active")})})})(),(function(){injectModal("arr-setup-modal",`<div id="arr-setup-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 600px; max-width: 720px;">
<h3>\u{1F3AC} Smart Arr Connect</h3>
<p style="color: var(--muted); margin: 0 0 16px; font-size: 0.9rem;">
Auto-discover and connect your entire media stack.
</p>
<!-- Phase 1: Detection -->
<div id="smart-phase-detect">
<div style="text-align: center; padding: 20px;">
<span class="brand-spinner" style="margin-bottom: 12px; display: inline-block;"></span>
<div style="color: var(--muted); font-size: 0.9rem;">Scanning for services...</div>
</div>
<div id="smart-detect-results" style="display: none;"></div>
</div>
<!-- Phase 2: Credential Input (only for services needing keys) -->
<div id="smart-phase-credentials" style="display: none;">
<h4 class="heading-accent-section">Enter Missing API Keys</h4>
<div id="smart-credential-inputs"></div>
<!-- Connection Options -->
<div style="margin-top: 16px; padding: 12px; background: var(--card-base); border-radius: 8px; border: 1px solid var(--border);">
<h4 style="margin: 0 0 10px; font-size: 0.85rem; color: var(--accent);">Connection Options</h4>
<label class="option-label">
<input type="checkbox" id="smart-opt-seerr" checked class="checkbox-sm" />
Configure Seerr with Radarr + Sonarr
</label>
<label class="option-label">
<input type="checkbox" id="smart-opt-plex" checked class="checkbox-sm" />
Connect Plex to Seerr
</label>
<label class="option-label">
<input type="checkbox" id="smart-opt-prowlarr" checked class="checkbox-sm" />
Connect Prowlarr to Radarr + Sonarr
</label>
<label style="display: flex; align-items: center; gap: 8px; cursor: pointer; font-size: 0.85rem;">
<input type="checkbox" id="smart-opt-save" checked class="checkbox-sm" />
Save API keys for one-click reconnect
</label>
</div>
<button id="smart-connect-btn" style="width: 100%; margin-top: 16px; padding: 12px; background: linear-gradient(135deg, #e74c3c 0%, #9b59b6 100%); border: none; color: white; font-weight: 600; font-size: 1rem; border-radius: 8px; cursor: pointer;">
Smart Connect
</button>
</div>
<!-- Phase 3: Connection Progress -->
<div id="smart-phase-progress" style="display: none;">
<h4 class="heading-accent-section">Connecting Everything...</h4>
<div id="smart-progress-steps" style="display: flex; flex-direction: column; gap: 6px;"></div>
</div>
<!-- Phase 4: Results -->
<div id="smart-phase-results" style="display: none;">
<div id="smart-results-content"></div>
<div id="smart-plex-libraries" style="display: none; margin-top: 12px;"></div>
<div style="display: flex; gap: 8px; margin-top: 16px;">
<button id="smart-retry-btn" style="display: none; flex: 1; padding: 10px; background: #f39c12; border: none; color: white; font-weight: 500; border-radius: 8px; cursor: pointer;">
Retry Failed Steps
</button>
<a id="smart-open-seerr" href="#" target="_blank" rel="noopener noreferrer"
style="flex: 1; padding: 10px; background: var(--accent); color: white; border: none; border-radius: 8px; cursor: pointer; font-weight: 500; text-decoration: none; text-align: center;">
Open Seerr
</a>
</div>
</div>
<!-- Help Text -->
<div style="font-size: 0.75rem; color: var(--muted); margin-top: 12px; padding: 10px; background: color-mix(in srgb, var(--accent) 5%, transparent); border-radius: 6px;">
<strong>Where to find API keys:</strong><br>
Radarr/Sonarr/Prowlarr: Settings -> General -> Security -> API Key
</div>
<!-- Close Button -->
<div class="weather-modal-buttons modal-footer-bar">
<button id="arr-setup-cancel">Close</button>
</div>
</div>
</div>`);const x=document.getElementById("arr-setup-modal"),b=document.getElementById("arr-setup-btn"),j=document.getElementById("arr-setup-cancel"),g=document.getElementById("smart-connect-btn"),N=document.getElementById("smart-phase-detect"),A=document.getElementById("smart-phase-credentials"),D=document.getElementById("smart-phase-progress"),R=document.getElementById("smart-phase-results"),f=document.getElementById("smart-detect-results"),C=document.getElementById("smart-credential-inputs"),E=document.getElementById("smart-progress-steps"),M=document.getElementById("smart-results-content"),w=document.getElementById("smart-plex-libraries"),z=document.getElementById("smart-retry-btn");let S=null;const T={plex:"\u{1F3AC}",radarr:"\u{1F3AC}",sonarr:"\u{1F4FA}",prowlarr:"\u{1F50D}",seerr:"\u{1F4CB}"},P={plex:"Plex",radarr:"Radarr (Movies)",sonarr:"Sonarr (TV)",prowlarr:"Prowlarr (Indexers)",seerr:"Seerr"};function v(k){N.style.display=k==="detect"?"block":"none",A.style.display=k==="credentials"?"block":"none",D.style.display=k==="progress"?"block":"none",R.style.display=k==="results"?"block":"none"}function B(k){const I={connected:{bg:"var(--ok-fg)",icon:"&#10003;",text:"Connected"},needs_key:{bg:"#f39c12",icon:"&#128273;",text:"Needs API Key"},not_found:{bg:"var(--muted)",icon:"&mdash;",text:"Not Found"},error:{bg:"var(--bad-fg)",icon:"&#10007;",text:"Error"}},i=I[k]||I.not_found;return`<span style="display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 4px; font-size: 0.75rem; background: color-mix(in srgb, ${i.bg} 20%, transparent); color: ${i.bg};">${i.icon} ${i.text}</span>`}async function H(){v("detect"),f.style.display="none";try{if(S=await(await fetch("/api/v1/arr/smart-detect")).json(),!S.success){f.innerHTML=`<div style="padding: 12px; color: var(--bad-fg);">Detection failed: ${escapeHtml(S.error)}</div>`,f.style.display="block";return}let I='<div style="display: flex; flex-direction: column; gap: 8px;">';for(const[c,d]of Object.entries(S.services)){const y=T[c]||"\u{1F4E6}",p=P[c]||c,n=d.source?`<span style="font-size: 0.7rem; color: var(--muted); padding: 1px 6px; background: var(--card-bg); border-radius: 3px;">${escapeHtml(d.source)}</span>`:"",e=d.version?`<span style="font-size: 0.7rem; color: var(--muted);">v${escapeHtml(d.version)}</span>`:"",r=(d.hasApiKey||d.hasToken)&&d.status==="connected"?'<span style="font-size: 0.7rem; color: var(--ok-fg);">Key saved</span>':"";I+=`<div style="display: flex; align-items: center; gap: 10px; padding: 10px 12px; background: var(--card-base); border-radius: 8px; border: 1px solid var(--border);">
<span style="font-size: 1.1rem;">${y}</span>
<div style="flex: 1;">
<div style="font-weight: 500; font-size: 0.9rem;">${p}</div>
<div style="display: flex; gap: 6px; align-items: center; flex-wrap: wrap;">
${n} ${e} ${r}
</div>
</div>
${B(d.status)}
</div>`}I+="</div>";const i=S.summary;I+=`<div style="margin-top: 12px; padding: 10px; background: color-mix(in srgb, var(--accent) 8%, transparent); border-radius: 8px; font-size: 0.85rem;">
${escapeHtml(String(i.fullyConnected))}/${escapeHtml(String(i.totalDetected+(5-i.totalDetected)))} services detected &middot;
${escapeHtml(String(i.fullyConnected))} connected${i.needsApiKey>0?` &middot; <strong>${escapeHtml(String(i.needsApiKey))} needs API key</strong>`:""}
</div>`,f.innerHTML=I,f.style.display="block",O(S),setTimeout(()=>{v("credentials")},800)}catch(k){f.innerHTML=`<div style="padding: 12px; color: var(--bad-fg);">Error: ${escapeHtml(k.message)}</div>`,f.style.display="block"}}function O(k){let I="";const i=k.services,c=["radarr","sonarr","prowlarr"];for(const p of c){const n=i[p];if(!n||n.status==="not_found"&&!n.url)continue;const e=T[p],r=P[p],s=n.status==="connected";I+=`<div style="margin-bottom: 10px; padding: 12px; background: var(--card-base); border-radius: 8px; border: 1px solid ${s?"var(--ok-fg)":"var(--border)"};">
<div style="display: flex; align-items: center; gap: 8px; margin-bottom: 8px;">
<span style="font-size: 1.1rem;">${e}</span>
<span style="font-weight: 500;">${r}</span>
<span id="smart-${p}-status" style="margin-left: auto; font-size: 0.75rem;">
${s?'<span style="color: var(--ok-fg);">&#10003; Connected</span>':""}
</span>
</div>
<div style="display: grid; grid-template-columns: 2fr 1fr; gap: 8px;">
<div>
<label style="font-size: 0.75rem; color: var(--muted);">URL:</label>
<input type="text" id="smart-${p}-url" value="${escapeHtml(n.url||"")}" placeholder="https://seedbox.com/${p}/"
style="width: 100%; font-size: 0.85rem; padding: 6px 8px; background: var(--card-bg); color: var(--fg); border: 1px solid var(--border); border-radius: 4px;" />
</div>
<div>
<label style="font-size: 0.75rem; color: var(--muted);">API Key:</label>
<input type="password" id="smart-${p}-key" placeholder="${s?"(saved)":"Paste API key"}"
style="width: 100%; font-size: 0.85rem; padding: 6px 8px; background: var(--card-bg); color: var(--fg); border: 1px solid var(--border); border-radius: 4px;" />
</div>
</div>
<button onclick="smartTestConnection('${p}')" style="margin-top: 8px; padding: 4px 12px; font-size: 0.75rem; cursor: pointer;">Test</button>
</div>`}const d=i.plex;if(d){const p=d.status==="connected";I+=`<div style="padding: 10px 12px; background: var(--card-base); border-radius: 8px; border: 1px solid ${p?"var(--ok-fg)":"var(--border)"}; margin-bottom: 10px;">
<div style="display: flex; align-items: center; gap: 8px;">
<span style="font-size: 1.1rem;">\u{1F3AC}</span>
<span style="font-weight: 500;">Plex</span>
${B(d.status)}
<span style="margin-left: auto; font-size: 0.75rem; color: var(--muted);">${escapeHtml(d.source||"")}</span>
</div>
</div>`}const y=i.seerr;if(y){const p=y.status==="connected";let n="";if(y.configuredServices){const e=y.configuredServices;n=`<div style="font-size: 0.75rem; color: var(--muted); margin-top: 4px;">
Configured: ${e.radarr?"&#10003; Radarr":"&#10007; Radarr"} &middot;
${e.sonarr?"&#10003; Sonarr":"&#10007; Sonarr"} &middot;
${e.plex?"&#10003; Plex":"&#10007; Plex"}
</div>`}I+=`<div style="padding: 10px 12px; background: var(--card-base); border-radius: 8px; border: 1px solid ${p?"var(--ok-fg)":"var(--border)"};">
<div style="display: flex; align-items: center; gap: 8px;">
<span style="font-size: 1.1rem;">\u{1F4CB}</span>
<span style="font-weight: 500;">Seerr</span>
${B(y.status)}
</div>
${n}
</div>`}C.innerHTML=I}window.smartTestConnection=async function(k){const I=document.getElementById(`smart-${k}-url`),i=document.getElementById(`smart-${k}-key`),c=document.getElementById(`smart-${k}-status`),d=I?.value.trim(),y=i?.value.trim();if(!d||!y){c.innerHTML='<span style="color: var(--bad-fg);">Enter URL and API key</span>';return}c.innerHTML='<span class="brand-spinner"></span>';try{const n=await(await secureFetch("/api/v1/arr/test-connection",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:k,url:d,apiKey:y})})).json();n.success?c.innerHTML=`<span style="color: var(--ok-fg);">&#10003; ${escapeHtml(n.appName||"Connected")} v${escapeHtml(n.version||"")}</span>`:c.innerHTML=`<span style="color: var(--bad-fg);">&#10007; ${escapeHtml(n.error)}</span>`}catch(p){c.innerHTML=`<span style="color: var(--bad-fg);">&#10007; ${escapeHtml(p.message)}</span>`}};async function u(){v("progress"),E.innerHTML='<div style="text-align: center; padding: 20px;"><span class="brand-spinner"></span><div style="color: var(--muted); margin-top: 8px;">Connecting services...</div></div>';const k={};for(const i of["radarr","sonarr","prowlarr"]){const c=document.getElementById(`smart-${i}-url`)?.value.trim(),d=document.getElementById(`smart-${i}-key`)?.value.trim();d&&c?k[i]={apiKey:d,url:c}:d&&(k[i]={apiKey:d})}const I={services:Object.keys(k).length>0?k:void 0,configurePlex:document.getElementById("smart-opt-plex")?.checked,configureProwlarr:document.getElementById("smart-opt-prowlarr")?.checked,configureSeerr:document.getElementById("smart-opt-seerr")?.checked,saveCredentials:document.getElementById("smart-opt-save")?.checked};try{const c=await(await secureFetch("/api/v1/arr/smart-connect",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(I)})).json();let d="";for(const y of c.steps||[]){const p=y.status==="success"?'<span style="color: var(--ok-fg);">&#10003;</span>':'<span style="color: var(--bad-fg);">&#10007;</span>',n=y.status==="success"?"var(--muted)":"var(--bad-fg)";d+=`<div style="display: flex; align-items: center; gap: 8px; padding: 6px 10px; background: var(--card-base); border-radius: 6px; font-size: 0.85rem;">
${p}
<span>${escapeHtml(y.step)}</span>
<span style="margin-left: auto; font-size: 0.75rem; color: ${n};">${escapeHtml(y.details||"")}</span>
</div>`}E.innerHTML=d,setTimeout(()=>m(c),500)}catch(i){E.innerHTML=`<div style="padding: 12px; color: var(--bad-fg);">Connection error: ${escapeHtml(i.message)}</div>`}}function m(k){v("results");const I=k.summary||{},i=I.failed===0&&I.succeeded>0,c=i?"var(--ok-fg)":"#f39c12",d=i?"&#10003;":"&#9888;",y=i?"All Connected!":`${escapeHtml(String(I.succeeded))}/${escapeHtml(String(I.totalSteps))} Steps Succeeded`;let p=`<div style="text-align: center; padding: 16px; background: color-mix(in srgb, ${c} 12%, transparent); border-radius: 10px; border: 1px solid ${c}; margin-bottom: 12px;">
<div style="font-size: 1.5rem; color: ${c};">${d}</div>
<div style="font-size: 1.1rem; font-weight: 600; color: ${c};">${y}</div>
<div style="font-size: 0.85rem; color: var(--muted); margin-top: 4px;">${escapeHtml(String(I.succeeded))} succeeded, ${escapeHtml(String(I.failed))} failed</div>
</div>`;p+='<div style="display: flex; flex-direction: column; gap: 4px;">';for(const n of k.steps||[]){const e=n.status==="success"?'<span style="color: var(--ok-fg);">&#10003;</span>':'<span style="color: var(--bad-fg);">&#10007;</span>';p+=`<div style="display: flex; align-items: center; gap: 8px; padding: 4px 8px; font-size: 0.8rem;">
${e} ${escapeHtml(n.step)} <span style="margin-left: auto; color: var(--muted); font-size: 0.75rem;">${escapeHtml(n.details||"")}</span>
</div>`}p+="</div>",M.innerHTML=p,z.style.display=I.failed>0?"block":"none",k.steps?.some(n=>n.step.includes("Plex")&&n.status==="success")&&L()}async function L(){try{const I=await(await fetch("/api/v1/plex/libraries")).json();if(I.success&&I.libraries?.length>0){let i=`<div style="padding: 12px; background: var(--card-base); border-radius: 8px; border: 1px solid var(--border);">
<h4 style="margin: 0 0 8px; font-size: 0.85rem; color: var(--accent);">\u{1F3AC} ${escapeHtml(I.serverName)} Libraries</h4>
<div style="display: flex; flex-wrap: wrap; gap: 8px;">`;for(const c of I.libraries){const d=c.type==="movie"?"\u{1F3AC}":c.type==="show"?"\u{1F4FA}":"\u{1F3B5}";i+=`<div style="padding: 8px 12px; background: var(--card-bg); border-radius: 6px; font-size: 0.85rem;">
${d} <strong>${escapeHtml(c.title)}</strong>
<span style="color: var(--muted); font-size: 0.75rem;">${escapeHtml(String(c.count))} items</span>
</div>`}i+="</div></div>",w.innerHTML=i,w.style.display="block"}}catch{}}b?.addEventListener("click",()=>{x.classList.add("show"),w.style.display="none",H()}),wireModal(x,j),g?.addEventListener("click",u),z?.addEventListener("click",u)})(),(function(){const x=new ErrorHandler;injectModal("notifications-modal",`<div id="notifications-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 550px; max-width: 650px;">
<h3>\u{1F514} Notification Settings</h3>
<!-- Master Toggle -->
<div class="accent-info-box">
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer;">
<input type="checkbox" id="notifications-enabled" />
<div>
<span style="font-weight: 600; color: var(--accent);">Enable Notifications</span>
<div class="text-tiny-muted">Receive alerts when containers go up/down</div>
</div>
</label>
</div>
<!-- Providers Section -->
<h4 class="section-heading">Notification Providers</h4>
<!-- Discord -->
<div class="notification-provider provider-card">
<div class="provider-header">
<label class="checkbox-label">
<input type="checkbox" id="discord-enabled" />
<span class="fw-500">Discord</span>
</label>
<button id="discord-test" class="test-btn btn-xs">Test</button>
</div>
<div id="discord-config" style="display: none;">
<label class="field-label-sm">Webhook URL:</label>
<input type="text" id="discord-webhook" placeholder="https://discord.com/api/v1/webhooks/..." style="width: 100%;" />
</div>
</div>
<!-- Telegram -->
<div class="notification-provider provider-card">
<div class="provider-header">
<label class="checkbox-label">
<input type="checkbox" id="telegram-enabled" />
<span class="fw-500">Telegram</span>
</label>
<button id="telegram-test" class="test-btn btn-xs">Test</button>
</div>
<div id="telegram-config" style="display: none;">
<div class="grid-2col">
<div>
<label class="field-label-sm">Bot Token:</label>
<input type="text" id="telegram-bot-token" placeholder="123456:ABC..." />
</div>
<div>
<label class="field-label-sm">Chat ID:</label>
<input type="text" id="telegram-chat-id" placeholder="-1001234567890" />
</div>
</div>
</div>
</div>
<!-- ntfy.sh -->
<div class="notification-provider provider-card">
<div class="provider-header">
<label class="checkbox-label">
<input type="checkbox" id="ntfy-enabled" />
<span class="fw-500">ntfy.sh</span>
</label>
<button id="ntfy-test" class="test-btn btn-xs">Test</button>
</div>
<div id="ntfy-config" style="display: none;">
<div style="display: grid; grid-template-columns: 2fr 1fr; gap: 8px;">
<div>
<label class="field-label-sm">Server URL:</label>
<input type="text" id="ntfy-server" placeholder="https://ntfy.sh" value="https://ntfy.sh" />
</div>
<div>
<label class="field-label-sm">Topic:</label>
<input type="text" id="ntfy-topic" placeholder="dashcaddy-alerts" />
</div>
</div>
</div>
</div>
<!-- Email -->
<div class="notification-provider provider-card">
<div class="provider-header">
<label class="checkbox-label">
<input type="checkbox" id="email-enabled" />
<span class="fw-500">Email (SMTP)</span>
</label>
<button id="email-test" class="test-btn btn-xs">Test</button>
</div>
<div id="email-config" style="display: none;">
<div style="display: grid; grid-template-columns: 2fr 1fr; gap: 8px; margin-bottom: 8px;">
<div>
<label class="field-label-sm">SMTP Host:</label>
<input type="text" id="email-host" placeholder="smtp.gmail.com" />
</div>
<div>
<label class="field-label-sm">Port:</label>
<input type="number" id="email-port" value="587" placeholder="587" />
</div>
</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 8px;">
<div>
<label class="field-label-sm">Username:</label>
<input type="text" id="email-user" placeholder="user@gmail.com" />
</div>
<div>
<label class="field-label-sm">Password:</label>
<input type="password" id="email-pass" placeholder="app password" />
</div>
</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px;">
<div>
<label class="field-label-sm">From:</label>
<input type="text" id="email-from" placeholder="DashCaddy &lt;noreply@example.com&gt;" />
</div>
<div>
<label class="field-label-sm">To:</label>
<input type="text" id="email-to" placeholder="admin@example.com" />
</div>
</div>
<label style="display: flex; align-items: center; gap: 6px; margin-top: 8px; font-size: 0.8rem;">
<input type="checkbox" id="email-secure" /> Use TLS (port 465)
</label>
</div>
</div>
<!-- Health Check Settings -->
<h4 class="section-heading">Health Monitoring</h4>
<div style="padding: 12px; background: var(--card-base); border-radius: 8px; border: 1px solid var(--border);">
<label style="display: flex; align-items: center; gap: 10px; cursor: pointer; margin-bottom: 10px;">
<input type="checkbox" id="health-check-enabled" />
<div>
<span class="fw-500">Enable Health Monitoring</span>
<div class="text-tiny-muted">Periodically check container status</div>
</div>
</label>
<div id="health-check-config" style="display: flex; align-items: center; gap: 10px;">
<label class="field-label-sm">Check interval:</label>
<select id="health-check-interval" style="width: auto;">
<option value="1">1 minute</option>
<option value="5" selected>5 minutes</option>
<option value="15">15 minutes</option>
<option value="30">30 minutes</option>
<option value="60">1 hour</option>
</select>
<button id="health-check-now" style="padding: 4px 10px; font-size: 0.75rem; margin-left: auto;">Check Now</button>
</div>
<div id="health-check-status" style="font-size: 0.75rem; color: var(--muted); margin-top: 8px;">
Last check: Never
</div>
</div>
<!-- Event Types -->
<h4 class="section-heading">Events to Notify</h4>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 6px; padding: 12px; background: var(--card-base); border-radius: 8px; border: 1px solid var(--border);">
<label class="checkbox-label-sm">
<input type="checkbox" id="event-container-down" checked /> Container Down
</label>
<label class="checkbox-label-sm">
<input type="checkbox" id="event-container-up" checked /> Container Recovered
</label>
<label class="checkbox-label-sm">
<input type="checkbox" id="event-deploy-success" checked /> Deployment Success
</label>
<label class="checkbox-label-sm">
<input type="checkbox" id="event-deploy-failed" checked /> Deployment Failed
</label>
<label class="checkbox-label-sm">
<input type="checkbox" id="event-ssl-cert-expiry" checked /> SSL Expiry
</label>
<label class="checkbox-label-sm">
<input type="checkbox" id="event-dns-propagation" checked /> DNS Propagation
</label>
<label class="checkbox-label-sm">
<input type="checkbox" id="event-drift-detected" checked /> Config Drift
</label>
<label class="checkbox-label-sm">
<input type="checkbox" id="event-dependency-restart" checked /> Dependency Restarts
</label>
<label class="checkbox-label-sm">
<input type="checkbox" id="event-recipe-removed" checked /> Recipe Removed
</label>
<label class="checkbox-label-sm">
<input type="checkbox" id="event-workflow" checked /> Workflow Actions
</label>
<label class="checkbox-label-sm">
<input type="checkbox" id="event-backup-complete" checked /> Backup Complete
</label>
<label class="checkbox-label-sm">
<input type="checkbox" id="event-backup-failed" checked /> Backup Failed
</label>
<label class="checkbox-label-sm">
<input type="checkbox" id="event-update-available" checked /> Updates
</label>
<label class="checkbox-label-sm" style="grid-column: 1 / -1;">
<input type="checkbox" id="event-resource-alert" checked /> Resource Alerts
</label>
</div>
<!-- History -->
<h4 class="section-heading">Notification History</h4>
<div id="notification-history" style="max-height: 150px; overflow-y: auto; padding: 8px; background: var(--card-base); border-radius: 8px; border: 1px solid var(--border); font-size: 0.8rem;">
<div style="color: var(--muted); text-align: center; padding: 20px;">No notifications yet</div>
</div>
<div id="last-notification-sent" style="font-size: 0.75rem; color: var(--muted); text-align: center; margin-top: 6px;"></div>
<!-- Buttons -->
<div class="weather-modal-buttons modal-footer-bar">
<button id="notifications-send-test" class="btn-secondary" style="margin-right: auto;">Send Test</button>
<button id="notifications-cancel">Cancel</button>
<button id="notifications-save" class="btn-accent">Save Settings</button>
</div>
</div>
</div>`);const b=document.getElementById("notifications-modal"),j=document.getElementById("manage-notifications"),g=document.getElementById("notifications-save"),N=document.getElementById("notifications-cancel");["discord","telegram","ntfy","email"].forEach(w=>{const z=document.getElementById(`${w}-enabled`),S=document.getElementById(`${w}-config`);z?.addEventListener("change",()=>{S.style.display=z.checked?"block":"none"})});const A=document.getElementById("health-check-enabled"),D=document.getElementById("health-check-config");A?.addEventListener("change",()=>{D.style.opacity=A.checked?"1":"0.5"});async function R(){try{const z=await(await fetch("/api/v1/notifications/config")).json();if(z.success){const S=z.config;document.getElementById("notifications-enabled").checked=S.enabled,document.getElementById("discord-enabled").checked=S.providers?.discord?.enabled||!1,document.getElementById("telegram-enabled").checked=S.providers?.telegram?.enabled||!1,document.getElementById("ntfy-enabled").checked=S.providers?.ntfy?.enabled||!1,document.getElementById("email-enabled").checked=S.providers?.email?.enabled||!1,document.getElementById("discord-config").style.display=S.providers?.discord?.enabled?"block":"none",document.getElementById("telegram-config").style.display=S.providers?.telegram?.enabled?"block":"none",document.getElementById("ntfy-config").style.display=S.providers?.ntfy?.enabled?"block":"none",document.getElementById("email-config").style.display=S.providers?.email?.enabled?"block":"none",S.providers?.ntfy?.serverUrl&&(document.getElementById("ntfy-server").value=S.providers.ntfy.serverUrl),S.providers?.email?.host&&(document.getElementById("email-host").value=S.providers.email.host),S.providers?.email?.from&&(document.getElementById("email-from").value=S.providers.email.from),S.providers?.email?.to&&(document.getElementById("email-to").value=S.providers.email.to),S.providers?.email?.port&&(document.getElementById("email-port").value=S.providers.email.port),S.providers?.email?.secure!==void 0&&(document.getElementById("email-secure").checked=S.providers.email.secure===!0),S.providers?.email?.username&&(document.getElementById("email-user").value=S.providers.email.username);const T=document.getElementById("email-pass");S.providers?.email?.hasPassword?(T.value="",T.placeholder="saved \u2014 leave blank to keep"):T.placeholder="app password",document.getElementById("health-check-enabled").checked=S.healthCheck?.enabled||!1,S.healthCheck?.intervalMinutes&&(document.getElementById("health-check-interval").value=S.healthCheck.intervalMinutes),S.healthCheck?.lastCheck&&(document.getElementById("health-check-status").textContent=`Last check: ${new Date(S.healthCheck.lastCheck).toLocaleString()}`),document.getElementById("event-container-down").checked=S.events?.["container-down"]!==!1,document.getElementById("event-container-up").checked=S.events?.["container-up"]===!0,document.getElementById("event-deploy-success").checked=S.events?.["deploy-success"]!==!1,document.getElementById("event-deploy-failed").checked=S.events?.["deploy-failed"]!==!1,document.getElementById("event-ssl-cert-expiry").checked=S.events?.["ssl-cert-expiry"]!==!1,document.getElementById("event-dns-propagation").checked=S.events?.["dns-propagation"]!==!1,document.getElementById("event-drift-detected").checked=S.events?.["drift-detected"]!==!1,document.getElementById("event-dependency-restart").checked=S.events?.["dependency-restart"]!==!1,document.getElementById("event-recipe-removed").checked=S.events?.["recipe-removed"]!==!1,document.getElementById("event-workflow").checked=S.events?.workflow!==!1,document.getElementById("event-backup-complete").checked=S.events?.["backup-complete"]!==!1,document.getElementById("event-backup-failed").checked=S.events?.["backup-failed"]!==!1,document.getElementById("event-update-available").checked=S.events?.["update-available"]!==!1,document.getElementById("event-resource-alert").checked=S.events?.alert!==!1}}catch(w){x.logError("[Notifications] Load Config",w,{function:"loadConfig"})}}async function f(){try{const z=await(await fetch("/api/v1/notifications/history?limit=10")).json(),S=document.getElementById("notification-history");z.success&&z.history?.length>0?S.innerHTML=z.history.map(T=>{const P=new Date(T.timestamp).toLocaleString();return`
<div style="padding: 6px 8px; border-bottom: 1px solid var(--border); display: flex; gap: 8px; align-items: flex-start;">
<span style="color: ${{success:"var(--ok-fg)",error:"var(--bad-fg)",warning:"#f39c12",info:"var(--accent)"}[T.type]||"var(--muted)"}">${T.type==="success"?"\u2713":T.type==="error"?"\u2717":"\u2139"}</span>
<div style="flex: 1; min-width: 0;">
<div style="font-weight: 500; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">${escapeHtml(T.title)}</div>
<div style="font-size: 0.7rem; color: var(--muted);">${P}</div>
</div>
</div>
`}).join(""):S.innerHTML='<div style="color: var(--muted); text-align: center; padding: 20px;">No notifications yet</div>'}catch(w){x.logError("[Notifications] Load History",w,{function:"loadHistory"})}}async function C(){try{const w={enabled:document.getElementById("notifications-enabled").checked,providers:{discord:{enabled:document.getElementById("discord-enabled").checked,webhookUrl:document.getElementById("discord-webhook").value.trim()},telegram:{enabled:document.getElementById("telegram-enabled").checked,botToken:document.getElementById("telegram-bot-token").value.trim(),chatId:document.getElementById("telegram-chat-id").value.trim()},ntfy:{enabled:document.getElementById("ntfy-enabled").checked,serverUrl:document.getElementById("ntfy-server").value.trim()||"https://ntfy.sh",topic:document.getElementById("ntfy-topic").value.trim()},email:{enabled:document.getElementById("email-enabled").checked,host:document.getElementById("email-host").value.trim(),port:parseInt(document.getElementById("email-port").value)||587,secure:document.getElementById("email-secure").checked,username:document.getElementById("email-user").value.trim(),password:document.getElementById("email-pass").value.trim(),from:document.getElementById("email-from").value.trim(),to:document.getElementById("email-to").value.trim()}},events:{"container-down":document.getElementById("event-container-down").checked,"container-up":document.getElementById("event-container-up").checked,"deploy-success":document.getElementById("event-deploy-success").checked,"deploy-failed":document.getElementById("event-deploy-failed").checked,"ssl-cert-expiry":document.getElementById("event-ssl-cert-expiry").checked,"dns-propagation":document.getElementById("event-dns-propagation").checked,"drift-detected":document.getElementById("event-drift-detected").checked,"dependency-restart":document.getElementById("event-dependency-restart").checked,"recipe-removed":document.getElementById("event-recipe-removed").checked,workflow:document.getElementById("event-workflow").checked,"backup-complete":document.getElementById("event-backup-complete").checked,"backup-failed":document.getElementById("event-backup-failed").checked,"update-available":document.getElementById("event-update-available").checked,alert:document.getElementById("event-resource-alert").checked},healthCheck:{enabled:document.getElementById("health-check-enabled").checked,intervalMinutes:parseInt(document.getElementById("health-check-interval").value)||5}},S=await(await secureFetch("/api/v1/notifications/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(w)})).json();S.success?(showNotification("Notification settings saved","success",3e3),b.classList.remove("show")):showNotification(`Failed to save: ${S.error}`,"error",3e3)}catch(w){showNotification(`Error: ${w.message}`,"error",3e3)}}async function E(w){try{const S=await(await secureFetch("/api/v1/notifications/test",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:w})})).json();S.success?showNotification(`Test ${w} notification sent!`,"success",3e3):showNotification(`Test failed: ${S.error}`,"error",3e3)}catch(z){showNotification(`Error: ${z.message}`,"error",3e3)}}document.getElementById("discord-test")?.addEventListener("click",()=>E("discord")),document.getElementById("telegram-test")?.addEventListener("click",()=>E("telegram")),document.getElementById("ntfy-test")?.addEventListener("click",()=>E("ntfy")),document.getElementById("email-test")?.addEventListener("click",()=>E("email")),document.getElementById("health-check-now")?.addEventListener("click",async()=>{try{const z=await(await secureFetch("/api/v1/notifications/health-check",{method:"POST"})).json();z.success&&(document.getElementById("health-check-status").textContent=`Last check: ${new Date(z.lastCheck).toLocaleString()} (${z.containersMonitored} containers)`,showNotification("Health check completed","success",2e3))}catch(w){showNotification(`Error: ${w.message}`,"error",3e3)}}),j?.addEventListener("click",()=>{b.classList.add("show"),R(),f()}),g?.addEventListener("click",C),document.getElementById("notifications-send-test")?.addEventListener("click",async()=>{const w=document.getElementById("notifications-send-test"),z=w.textContent;w.textContent="Sending...",w.disabled=!0;try{const T=await(await secureFetch("/api/v1/notifications/send",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({event:"test",data:{message:"This is a test notification from DashCaddy."},type:"info"})})).json();T.success?(showNotification("Test notification sent!","success",3e3),M()):showNotification(`Test failed: ${T.results?.map(P=>`${P.provider}: ${P.error||"ok"}`).join(", ")}`,"error",5e3)}catch(S){showNotification(`Error: ${S.message}`,"error",3e3)}finally{w.textContent=z,w.disabled=!1}});async function M(){try{const z=await(await fetch("/api/v1/notifications/status")).json();if(z.success&&z.lastSent){const S=document.getElementById("last-notification-sent");S&&(S.textContent=`Last sent: ${new Date(z.lastSent).toLocaleString()}`)}}catch{}}wireModal(b,N)})(),(function(){document.addEventListener("click",x=>{const b=x.target.closest(".panel-tab");if(!b)return;const j=b.dataset.panel;if(!j)return;const g=b.closest(".panel-tabs"),N=g.closest(".weather-modal-content");g.querySelectorAll(".panel-tab").forEach(D=>D.classList.remove("active")),b.classList.add("active"),N.querySelectorAll(".panel-section").forEach(D=>D.classList.remove("active"));const A=N.querySelector("#"+j);A&&A.classList.add("active")})})(),(function(){var x=["dashcaddy_site_config","dashcaddy_onboarding","dashcaddy-encryption-key","dashcaddy-setup","dashcaddy-config","theme","user-themes","custom-theme","custom-apps","custom-services","toolbar-sections","weather-location","weather-zip","weather-geo","weather-unit","clock-style","clock-chimes","clock-chime-volume"];function b(){for(var e={},r=0;r<x.length;r++){var s=x[r],a=safeGet(s);a!=null&&(e[s]=a)}try{for(var t=0;t<localStorage.length;t++){var o=localStorage.key(t);/^widget-.+-enabled$/.test(o)&&(e[o]=localStorage.getItem(o))}}catch{}return e}function j(e){if(!e||typeof e!="object")return 0;var r=0;for(var s in e)e.hasOwnProperty(s)&&(safeSet(s,e[s]),r++);return r}function g(e){return e.version&&!e.files&&e.services}function N(e){var r={};e.customServices&&(r["custom-services"]=JSON.stringify(e.customServices)),e.customApps&&(r["custom-apps"]=JSON.stringify(e.customApps)),e.weatherZip&&(r["weather-zip"]=e.weatherZip),e.theme&&(r.theme=e.theme),e.userThemes&&Object.keys(e.userThemes).length&&(r["user-themes"]=JSON.stringify(e.userThemes)),j(r),e.services&&Array.isArray(e.services)&&secureFetch("/api/v1/services",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(e.services)}).catch(function(){}),e.userThemes&&Object.keys(e.userThemes).forEach(function(s){var a=e.userThemes[s],t={};(window.THEME_PROPS||[]).forEach(function(o){a[o]&&(t[o]=a[o])}),secureFetch("/api/v1/themes/"+s,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:a.name||s,colors:t})}).catch(function(){})})}injectModal("backup-modal",`<div id="backup-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 550px; max-width: 650px;">
<h3>\u{1F4BE} Backup & Restore</h3>
<p class="modal-subtitle">
Full backup of your entire DashCaddy setup \u2014 server config, credentials, themes, and browser preferences in one file.
</p>
<!-- Tab bar -->
<div class="panel-tabs">
<button class="panel-tab active" data-panel="backup-manual">Manual</button>
<button class="panel-tab" data-panel="backup-schedules-tab">Schedules</button>
<button class="panel-tab" data-panel="backup-disk-tab">Backups on Disk</button>
<button class="panel-tab" data-panel="backup-pointintime-tab">Point-in-Time</button>
<button class="panel-tab" data-panel="backup-history-tab">History</button>
</div>
<!-- Tab: Manual -->
<div id="backup-manual" class="panel-section active">
<!-- Export Section -->
<div style="margin-bottom: 20px; padding: 16px; background: linear-gradient(135deg, color-mix(in srgb, #27ae60 15%, transparent), color-mix(in srgb, #2ecc71 10%, transparent)); border-radius: 10px; border: 1px solid #27ae60;">
<h4 style="margin: 0 0 8px; color: #2ecc71; font-size: 0.95rem;">\u{1F4E4} Export Backup</h4>
<p style="font-size: 0.8rem; color: var(--muted); margin: 0 0 12px;">
Downloads everything \u2014 services, Caddyfile, credentials, encryption key, themes, and all browser preferences.
</p>
<button id="backup-export-btn" style="width: 100%; padding: 10px; background: linear-gradient(135deg, #27ae60 0%, #2ecc71 100%); border: none; color: white; font-weight: 600; border-radius: 8px; cursor: pointer;">
\u2B07\uFE0F Download Full Backup
</button>
</div>
<!-- Import Section -->
<div style="padding: 16px; background: linear-gradient(135deg, color-mix(in srgb, #3498db 15%, transparent), color-mix(in srgb, #2980b9 10%, transparent)); border-radius: 10px; border: 1px solid #3498db;">
<h4 style="margin: 0 0 8px; color: #3498db; font-size: 0.95rem;">\u{1F4E5} Restore Backup</h4>
<p style="font-size: 0.8rem; color: var(--muted); margin: 0 0 12px;">
Upload a backup file to restore your entire configuration \u2014 drag and drop ready.
</p>
<input type="file" id="backup-file-input" accept=".json" style="display: none;" />
<button id="backup-select-file" style="width: 100%; padding: 10px; background: linear-gradient(135deg, #3498db 0%, #2980b9 100%); border: none; color: white; font-weight: 600; border-radius: 8px; cursor: pointer;">
\u{1F4C1} Select Backup File
</button>
<div id="backup-file-name" style="display: none; margin-top: 8px; padding: 8px; background: var(--card-base); border-radius: 6px; font-size: 0.85rem;"></div>
</div>
<!-- Preview Section (shown after file selected) -->
<div id="backup-preview" style="display: none; margin-top: 16px; padding: 16px; background: var(--card-base); border-radius: 10px; border: 1px solid var(--border);">
<h4 style="margin: 0 0 12px; font-size: 0.9rem;">\u{1F4CB} Backup Contents</h4>
<div id="backup-preview-content" style="font-size: 0.85rem;"></div>
<div style="margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border);">
<label class="checkbox-label" style="font-size: 0.85rem;">
<input type="checkbox" id="backup-reload-caddy" checked />
Reload Caddy after restore
</label>
</div>
<button id="backup-do-restore-btn" style="width: 100%; margin-top: 12px; padding: 10px; background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%); border: none; color: white; font-weight: 600; border-radius: 8px; cursor: pointer;">
\u26A1 Restore Everything
</button>
</div>
<!-- Result Message -->
<div id="backup-result" style="display: none; margin-top: 16px; padding: 12px; border-radius: 8px;"></div>
</div>
<!-- Tab: Schedules (Premium) -->
<div id="backup-schedules-tab" class="panel-section">
<div id="backup-schedules-container">
<div class="panel-empty">
<span class="empty-icon">\u23F0</span>
<span class="brand-spinner"></span> Loading schedules...
</div>
</div>
</div>
<!-- Tab: Backups on Disk -->
<div id="backup-disk-tab" class="panel-section">
<div id="backup-disk-container">
<div class="panel-empty">
<span class="empty-icon">\u{1F4BE}</span>
<span class="brand-spinner"></span> Loading backup files...
</div>
</div>
</div>
<!-- Tab: Point-in-Time Restore -->
<div id="backup-pointintime-tab" class="panel-section">
<div id="pointintime-container">
<div class="panel-empty">
<span class="empty-icon">\u23EA</span>
<span class="brand-spinner"></span> Loading...
</div>
</div>
</div>
<!-- Tab: Backup History -->
<div id="backup-history-tab" class="panel-section">
<div id="backup-history-container" style="max-height: 400px; overflow-y: auto;">
<div class="panel-empty">
<span class="empty-icon">\u{1F4CB}</span>
<span class="brand-spinner"></span> Loading backup history...
</div>
</div>
</div>
<!-- Close Button -->
<div class="weather-modal-buttons modal-footer-bar">
<button id="backup-cancel">Close</button>
</div>
</div>
</div>`);var A=document.getElementById("backup-modal"),D=document.getElementById("backup-restore-btn"),R=document.getElementById("backup-cancel"),f=document.getElementById("backup-export-btn"),C=document.getElementById("backup-select-file"),E=document.getElementById("backup-file-input"),M=document.getElementById("backup-file-name"),w=document.getElementById("backup-preview"),z=document.getElementById("backup-preview-content"),S=document.getElementById("backup-do-restore-btn"),T=document.getElementById("backup-result"),P=document.getElementById("backup-schedules-container"),v=document.getElementById("backup-history-container"),B=document.getElementById("backup-disk-container"),H=document.getElementById("pointintime-container"),O=null;D?.addEventListener("click",function(){A.classList.add("show"),T&&(T.style.display="none"),w&&(w.style.display="none"),M&&(M.style.display="none"),O=null}),wireModal(A,R),f?.addEventListener("click",async function(){f.disabled=!0,f.innerHTML='<span class="brand-spinner"></span> Exporting...';try{var e=await fetch("/api/v1/backup/export"),r=await e.json();r.browserState=b();var s=new Blob([JSON.stringify(r,null,2)],{type:"application/json"}),a=URL.createObjectURL(s),t=document.createElement("a");t.href=a,t.download="dashcaddy-backup-"+new Date().toISOString().split("T")[0]+".json",document.body.appendChild(t),t.click(),document.body.removeChild(t),URL.revokeObjectURL(a);var o=Object.keys(r.browserState).length,l=r.themes?Object.keys(r.themes).length:0;T.innerHTML="\u2705 Full backup downloaded \u2014 server config + "+o+" browser settings"+(l?" + "+l+" themes":""),T.style.display="block",T.style.background="color-mix(in srgb, var(--ok-fg) 15%, transparent)",T.style.border="1px solid var(--ok-fg)"}catch(h){T.innerHTML="\u274C Export failed: "+escapeHtml(h.message),T.style.display="block",T.style.background="color-mix(in srgb, var(--bad-fg) 15%, transparent)",T.style.border="1px solid var(--bad-fg)"}f.disabled=!1,f.innerHTML="\u2B07\uFE0F Download Full Backup"}),C?.addEventListener("click",function(){E.click()}),E?.addEventListener("change",async function(e){var r=e.target.files[0];if(r){M.textContent="\u{1F4C4} "+r.name,M.style.display="block",T.style.display="none";try{var s=await r.text(),a=JSON.parse(s);if(g(a)){O=a;var t='<div style="margin-bottom: 8px; color: var(--muted); font-size: 0.8rem;">Legacy format (v'+escapeHtml(a.version)+")</div>";t+='<div style="display: flex; flex-wrap: wrap; gap: 6px;">',a.services?.length&&(t+='<span style="padding: 4px 8px; background: var(--base); border-radius: 4px; font-size: 0.8rem;">\u{1F4CB} '+a.services.length+" services</span>"),a.customApps?.length&&(t+='<span style="padding: 4px 8px; background: var(--base); border-radius: 4px; font-size: 0.8rem;">\u{1F4E6} '+a.customApps.length+" custom apps</span>"),a.theme&&(t+='<span style="padding: 4px 8px; background: var(--base); border-radius: 4px; font-size: 0.8rem;">\u{1F3A8} Theme: '+escapeHtml(a.theme)+"</span>"),a.userThemes&&(t+='<span style="padding: 4px 8px; background: var(--base); border-radius: 4px; font-size: 0.8rem;">\u{1F3A8} '+Object.keys(a.userThemes).length+" custom themes</span>"),t+="</div>",z.innerHTML=t,w.style.display="block";return}var o=await secureFetch("/api/v1/backup/preview",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)}),l=await o.json();if(l.success){O=a;var t='<div style="margin-bottom: 8px; color: var(--muted); font-size: 0.8rem;">Exported: '+new Date(a.exportedAt).toLocaleString()+" (v"+escapeHtml(a.version)+")</div>";t+='<div style="margin-bottom: 6px; font-size: 0.75rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px;">Server Config</div>',t+='<div style="display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 10px;">';for(var h in l.preview.files){var $=l.preview.files[h],U=$.action==="create"?"\u{1F195}":"\u{1F4DD}";t+='<span style="padding: 4px 8px; background: var(--base); border-radius: 4px; font-size: 0.8rem;">'+U+" "+escapeHtml($.description)+"</span>"}t+="</div>",l.preview.serviceCount&&(t+='<div style="font-size: 0.8rem; color: var(--accent); margin-bottom: 6px;">'+l.preview.serviceCount+" services</div>"),l.preview.themeCount&&(t+='<div style="font-size: 0.8rem; color: var(--accent); margin-bottom: 6px;">\u{1F3A8} '+l.preview.themeCount+" custom themes</div>"),l.preview.browserStateCount&&(t+='<div style="margin-top: 6px; font-size: 0.75rem; color: var(--muted); text-transform: uppercase; letter-spacing: 0.5px;">Browser Preferences</div>',t+='<div style="font-size: 0.8rem; color: var(--accent);">\u{1F5A5}\uFE0F '+l.preview.browserStateCount+" saved settings (theme, weather, clock, widgets, etc.)</div>"),z.innerHTML=t,w.style.display="block"}else T.innerHTML="\u26A0\uFE0F Invalid backup file: "+escapeHtml(l.error),T.style.display="block",T.style.background="color-mix(in srgb, #f39c12 15%, transparent)",T.style.border="1px solid #f39c12",w.style.display="none"}catch(F){T.innerHTML="\u274C Could not read file: "+escapeHtml(F.message),T.style.display="block",T.style.background="color-mix(in srgb, var(--bad-fg) 15%, transparent)",T.style.border="1px solid var(--bad-fg)",w.style.display="none"}}}),S?.addEventListener("click",async function(){if(O&&confirm("This will overwrite your current configuration and browser preferences. Continue?")){S.disabled=!0,S.innerHTML='<span class="brand-spinner"></span> Restoring...';try{if(g(O)){N(O),T.innerHTML="\u2705 Legacy backup restored \u2014 browser settings and services imported.",T.style.background="color-mix(in srgb, var(--ok-fg) 15%, transparent)",T.style.border="1px solid var(--ok-fg)",T.style.display="block",setTimeout(function(){location.reload()},2e3),S.disabled=!1,S.innerHTML="\u26A1 Restore Everything";return}var e=document.getElementById("backup-reload-caddy")?.checked??!0,r=await secureFetch("/api/v1/backup/restore",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({backup:O,options:{reloadCaddy:e}})}),s=await r.json(),a=0;if(O.browserState&&(a=j(O.browserState)),s.success){var t="\u2705 "+s.message;a>0&&(t+='<br><small style="color: var(--muted);">'+a+" browser settings restored</small>"),s.results.caddyReloaded&&(t+='<br><small style="color: var(--muted);">Caddy configuration reloaded</small>'),T.innerHTML=t,T.style.background="color-mix(in srgb, var(--ok-fg) 15%, transparent)",T.style.border="1px solid var(--ok-fg)",setTimeout(function(){location.reload()},2e3)}else T.innerHTML="\u26A0\uFE0F "+escapeHtml(s.message),a>0&&(T.innerHTML+='<br><small style="color: var(--muted);">'+a+" browser settings were restored</small>"),s.results?.errors?.length>0&&(T.innerHTML+="<br><small>"+s.results.errors.map(function(o){return escapeHtml(o.file)+": "+escapeHtml(o.error)}).join(", ")+"</small>"),T.style.background="color-mix(in srgb, #f39c12 15%, transparent)",T.style.border="1px solid #f39c12";T.style.display="block"}catch(o){T.innerHTML="\u274C Restore failed: "+escapeHtml(o.message),T.style.display="block",T.style.background="color-mix(in srgb, var(--bad-fg) 15%, transparent)",T.style.border="1px solid var(--bad-fg)"}S.disabled=!1,S.innerHTML="\u26A1 Restore Everything"}});async function u(){if(P){P.innerHTML='<div class="panel-empty"><span class="brand-spinner"></span> Loading...</div>';try{var e=await fetch("/api/v1/backups/schedule"),r=await e.json();if(r.premiumRequired){P.innerHTML=`<div class="panel-empty" style="padding: 24px; text-align: center;"><div style="font-size: 2rem; margin-bottom: 12px;">\u2B50</div><div style="font-weight: 600; margin-bottom: 8px;">Premium Feature</div><div style="font-size: 0.85rem; color: var(--muted);">Auto-backup scheduling requires a DashCaddy Premium subscription.</div><button onclick="showNotification('Upgrade to Premium to enable auto-backups!', 'info'); scrollToSection('license');" style="margin-top: 16px; padding: 8px 20px; background: linear-gradient(135deg, #f39c12, #e67e22); border: none; color: white; border-radius: 8px; cursor: pointer; font-weight: 600;">Upgrade to Premium</button></div>`;return}if(!r.success)throw new Error(r.error||"Failed to load schedules");var s=r.schedules||[];if(s.length===0){P.innerHTML='<div class="panel-empty"><span class="empty-icon">\u23F0</span><div>No backup schedules configured</div><div style="font-size: 0.8rem; color: var(--muted); margin-top: 4px;">Select apps below to enable auto-backup</div></div>';return}for(var a='<div style="display: flex; flex-direction: column; gap: 8px;">',t=0;t<s.length;t++){var o=s[t],l=o.nextRun?new Date(o.nextRun).toLocaleString():"Not scheduled",h=o.lastRun?new Date(o.lastRun).toLocaleString():"Never";a+='<div style="padding: 12px 14px; background: var(--card-base); border-radius: 8px; border: 1px solid var(--border);"><div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;"> <div style="font-weight: 600; font-size: 0.9rem;">'+escapeHtml(o.appId)+'</div> <label class="toggle-switch" style="display: flex; align-items: center; gap: 6px;"> <input type="checkbox" class="schedule-toggle" data-appid="'+escapeHtml(o.appId)+'"'+(o.enabled?" checked":"")+' /> <span style="font-size: 0.75rem; color: var(--muted);">'+(o.enabled?"ON":"OFF")+'</span> </label></div><div style="display: grid; grid-template-columns: 1fr 1fr; gap: 8px; font-size: 0.8rem; margin-bottom: 10px;"> <div><span style="color: var(--muted);">Schedule:</span> <select class="schedule-select" data-appid="'+escapeHtml(o.appId)+'" style="background: var(--base); border: 1px solid var(--border); border-radius: 4px; padding: 2px 6px;"> <option value="hourly"'+(o.schedule==="hourly"?" selected":"")+'>Hourly</option> <option value="daily"'+(o.schedule==="daily"?" selected":"")+'>Daily</option> <option value="weekly"'+(o.schedule==="weekly"?" selected":"")+'>Weekly</option> <option value="monthly"'+(o.schedule==="monthly"?" selected":"")+'>Monthly</option> </select></div> <div><span style="color: var(--muted);">Keep last:</span> <input type="number" class="retention-input" data-appid="'+escapeHtml(o.appId)+'" value="'+(o.retention?.keep||7)+'" min="1" max="100" style="width: 50px; background: var(--base); border: 1px solid var(--border); border-radius: 4px; padding: 2px 6px;" /></div></div><div style="font-size: 0.75rem; color: var(--muted); margin-bottom: 10px;"> <div>Next run: '+escapeHtml(l)+"</div> <div>Last run: "+escapeHtml(h)+'</div></div><div style="display: flex; gap: 6px;"> <button class="schedule-run-now" data-appid="'+escapeHtml(o.appId)+'" style="padding: 5px 12px; font-size: 0.8rem; background: color-mix(in srgb, var(--ok-fg) 20%, transparent); border: 1px solid var(--ok-fg); color: var(--ok-fg); border-radius: 6px; cursor: pointer;">\u25B6\uFE0F Run Now</button> <button class="schedule-delete" data-appid="'+escapeHtml(o.appId)+'" style="padding: 5px 12px; font-size: 0.8rem; background: transparent; border: 1px solid var(--bad-fg); color: var(--bad-fg); border-radius: 6px; cursor: pointer;">\u{1F5D1}\uFE0F Remove</button></div></div>'}a+="</div>",a+='<div style="margin-top: 16px; padding: 16px; background: color-mix(in srgb, var(--accent) 5%, transparent); border-radius: 10px; border: 1px dashed var(--border);"><h4 style="margin: 0 0 12px; font-size: 0.85rem; color: var(--muted);">\u2795 Add New Schedule</h4><div style="display: flex; gap: 8px; flex-wrap: wrap;"> <input type="text" id="new-schedule-appid" placeholder="App ID (e.g., plex, sonarr)" style="flex: 1; min-width: 150px; padding: 8px; border-radius: 6px; border: 1px solid var(--border); background: var(--base);" /> <select id="new-schedule-interval" style="padding: 8px; border-radius: 6px; border: 1px solid var(--border); background: var(--base);"> <option value="hourly">Hourly</option> <option value="daily" selected>Daily</option> <option value="weekly">Weekly</option> <option value="monthly">Monthly</option> <option value="6h">Every 6 hours</option> <option value="30m">Every 30 minutes</option> </select> <input type="number" id="new-schedule-retention" value="7" min="1" max="100" placeholder="Keep" style="width: 70px; padding: 8px; border-radius: 6px; border: 1px solid var(--border); background: var(--base);" /> <button id="add-schedule-btn" style="padding: 8px 16px; background: var(--accent); border: none; color: white; border-radius: 6px; cursor: pointer; font-weight: 500;">Add Schedule</button></div></div>',P.innerHTML=a,P.querySelectorAll(".schedule-toggle").forEach(function($){$.addEventListener("change",function(){m($.dataset.appid,{enabled:$.checked})})}),P.querySelectorAll(".schedule-select").forEach(function($){$.addEventListener("change",function(){m($.dataset.appid,{schedule:$.value})})}),P.querySelectorAll(".retention-input").forEach(function($){$.addEventListener("change",function(){m($.dataset.appid,{retention:{keep:parseInt($.value)||7}})})}),P.querySelectorAll(".schedule-run-now").forEach(function($){$.addEventListener("click",function(){L($.dataset.appid)})}),P.querySelectorAll(".schedule-delete").forEach(function($){$.addEventListener("click",function(){k($.dataset.appid)})}),document.getElementById("add-schedule-btn")?.addEventListener("click",I)}catch($){P.innerHTML='<div class="panel-empty" style="color: var(--bad-fg);">Failed to load: '+escapeHtml($.message)+"</div>"}}}async function m(e,r){try{var s=await secureFetch("/api/v1/backups/schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:e,...r})}),a=await s.json();a.success?showNotification("Schedule updated for "+e,"success"):(showNotification("Update failed: "+(a.error||"Unknown"),"error"),u())}catch(t){showNotification("Error: "+t.message,"error")}}async function L(e){try{var r=await secureFetch("/api/v1/backups/backup/"+encodeURIComponent(e),{method:"POST",headers:{"Content-Type":"application/json"}}),s=await r.json();s.success?showNotification("Backup started for "+e+"!","success"):showNotification("Backup failed: "+(s.error||"Unknown"),"error")}catch(a){showNotification("Error: "+a.message,"error")}}async function k(e){if(confirm("Remove backup schedule for "+e+"?"))try{var r=await secureFetch("/api/v1/backups/schedule/"+encodeURIComponent(e),{method:"DELETE"}),s=await r.json();s.success?(showNotification("Schedule removed for "+e,"success"),u()):showNotification("Delete failed: "+(s.error||"Unknown"),"error")}catch(a){showNotification("Error: "+a.message,"error")}}async function I(){var e=document.getElementById("new-schedule-appid")?.value?.trim(),r=document.getElementById("new-schedule-interval")?.value||"daily",s=parseInt(document.getElementById("new-schedule-retention")?.value)||7;if(!e){showNotification("Please enter an App ID","warning");return}try{var a=await secureFetch("/api/v1/backups/schedule",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({appId:e,schedule:r,retention:{keep:s},enabled:!0})}),t=await a.json();if(t.success){showNotification("Schedule created for "+e,"success"),u();var o=document.getElementById("new-schedule-appid");o&&(o.value="")}else showNotification("Failed: "+(t.error||"Unknown"),"error")}catch(l){showNotification("Error: "+l.message,"error")}}async function i(){if(B){B.innerHTML='<div class="panel-empty"><span class="brand-spinner"></span> Loading...</div>';try{var e=await fetch("/api/v1/backups/files"),r=await e.json();if(!r.success)throw new Error(r.error||"Failed to load");var s=r.files||[];if(s.length===0){B.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F4BE}</span><div>No backup files on disk</div><div style="font-size: 0.8rem; color: var(--muted); margin-top: 4px;">Run a backup to create backup files</div></div>';return}for(var a={},t=0;t<s.length;t++){var o=s[t],l=o.appId||"unknown";a[l]||(a[l]=[]),a[l].push(o)}var h='<div style="font-size: 0.75rem; color: var(--muted); margin-bottom: 12px;">'+s.length+" backup file(s) across "+Object.keys(a).length+" app(s)</div>";h+='<div style="display: flex; flex-direction: column; gap: 12px;">';for(var $=Object.keys(a).sort(),U=0;U<$.length;U++){var l=$[U],F=a[l];h+='<div style="background: var(--card-base); border-radius: 8px; border: 1px solid var(--border); overflow: hidden;"><div style="padding: 8px 12px; background: color-mix(in srgb, var(--accent) 8%, transparent); border-bottom: 1px solid var(--border); font-weight: 600; font-size: 0.85rem;">'+escapeHtml(l)+' <span style="font-weight: normal; color: var(--muted); font-size: 0.75rem;">('+F.length+" backup(s))</span></div>";for(var _=0;_<F.length;_++){var o=F[_],J=new Date(o.timestamp).toLocaleString();h+='<div style="padding: 10px 12px; border-bottom: 1px solid var(--border);"><div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 4px;"> <div style="font-weight: 500; font-size: 0.85rem;">'+escapeHtml(o.name)+'</div> <div style="font-size: 0.75rem; color: var(--muted);">'+o.sizeFormatted+'</div></div><div style="font-size: 0.75rem; color: var(--muted); margin-bottom: 8px;">'+J+'</div><div style="display: flex; gap: 6px;"> <button class="disk-compare-btn" data-appid="'+escapeHtml(l)+'" data-filename="'+escapeHtml(o.name)+'" style="padding: 3px 8px; font-size: 0.75rem; background: transparent; border: 1px solid var(--accent); color: var(--accent); border-radius: 5px; cursor: pointer;">Compare</button> <button class="disk-restore-btn" data-appid="'+escapeHtml(l)+'" data-filename="'+escapeHtml(o.name)+'" style="padding: 3px 8px; font-size: 0.75rem; background: linear-gradient(135deg, var(--ok-fg), #27ae60); border: none; color: white; border-radius: 5px; cursor: pointer; font-weight: 500;">Restore</button></div></div>'}h+="</div>"}h+="</div>",B.innerHTML=h,B.querySelectorAll(".disk-compare-btn").forEach(function(q){q.addEventListener("click",function(){p(q.dataset.appid,q.dataset.filename)})}),B.querySelectorAll(".disk-restore-btn").forEach(function(q){q.addEventListener("click",function(){n(q.dataset.appid,q.dataset.filename)})})}catch(q){B.innerHTML='<div class="panel-empty" style="color: var(--bad-fg);">Failed: '+escapeHtml(q.message)+"</div>"}}}async function c(){if(v){v.innerHTML='<div class="panel-empty"><span class="brand-spinner"></span> Loading...</div>';try{var e=await fetch("/api/v1/backups/history?limit=50"),r=await e.json();if(!r.success||!r.history?.length){v.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F4CB}</span> No backup history yet</div>';return}for(var s='<div style="display: flex; flex-direction: column; gap: 6px;">',a=0;a<r.history.length;a++){var t=r.history[a],o=t.size?(t.size/1024/1024).toFixed(2):"?";s+='<div style="padding: 10px 12px; background: var(--card-base); border-radius: 6px; border: 1px solid var(--border); font-size: 0.85rem;">',s+=' <div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 4px;">',s+=' <span style="font-weight: 500;">'+escapeHtml(t.name||"backup")+"</span>",s+=' <div style="display: flex; align-items: center; gap: 8px;">',s+=' <span class="status-badge '+(t.status==="success"?"success":"down")+'">'+escapeHtml(t.status)+"</span>",t.status==="success"&&(s+=' <button class="backup-restore-btn" data-backup-id="'+escapeHtml(t.id)+'" style="padding: 3px 8px; font-size: 0.75rem;">Restore</button>'),s+=" </div>",s+=" </div>",s+=' <div style="font-size: 0.75rem; color: var(--muted);">',s+=" "+new Date(t.timestamp).toLocaleString()+" | "+o+" MB | "+(t.duration?(t.duration/1e3).toFixed(1)+"s":"--"),t.encrypted&&(s+=" | \u{1F512}"),s+=" </div>",s+="</div>"}s+="</div>",v.innerHTML=s,v.querySelectorAll(".backup-restore-btn").forEach(function(l){l.addEventListener("click",function(){window.__restoreServerBackup(l.dataset.backupId)})})}catch(l){v.innerHTML='<div class="panel-empty" style="color: var(--bad-fg);">Failed: '+escapeHtml(l.message)+"</div>"}}}window.__restoreServerBackup=async function(e){if(confirm("Restore from this server backup? This will overwrite current configuration."))try{var r=await secureFetch("/api/v1/backups/restore/"+e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({restoreServices:!0,restoreConfig:!0})}),s=await r.json();s.success?(showNotification("Restore completed successfully!","success"),location.reload()):showNotification("Restore failed: "+(s.error||"Unknown error"),"error")}catch(a){showNotification("Restore error: "+a.message,"error")}},document.querySelector('[data-panel="backup-schedules-tab"]')?.addEventListener("click",u),document.querySelector('[data-panel="backup-disk-tab"]')?.addEventListener("click",i),document.querySelector('[data-panel="backup-pointintime-tab"]')?.addEventListener("click",d),document.querySelector('[data-panel="backup-history-tab"]')?.addEventListener("click",c);async function d(){if(H){try{var e=await fetch("/api/v1/license/status"),r=await e.json();if(r.tier!=="premium"){H.innerHTML=`<div class="panel-empty" style="padding: 24px; text-align: center;"><div style="font-size: 2rem; margin-bottom: 12px;">\u2B50</div><div style="font-weight: 600; margin-bottom: 8px;">Premium Feature</div><div style="font-size: 0.85rem; color: var(--muted);">Point-in-time restore requires DashCaddy Premium with auto-backup enabled.</div><button onclick="showNotification('Upgrade to Premium for point-in-time restore!', 'info'); scrollToSection('license');" style="margin-top: 16px; padding: 8px 20px; background: linear-gradient(135deg, #f39c12, #e67e22); border: none; color: white; border-radius: 8px; cursor: pointer; font-weight: 600;">Upgrade to Premium</button></div>`;return}}catch{}H.innerHTML='<div class="panel-empty"><span class="brand-spinner"></span> Loading...</div>';try{var s=await fetch("/api/v1/services"),a=await s.json(),t=a.services||[];if(t.length===0){H.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F4E6}</span> No apps deployed yet</div>';return}for(var o='<div style="padding: 8px 0 12px;"><div style="display: flex; gap: 8px; align-items: center; margin-bottom: 12px;"> <label style="font-size: 0.85rem; color: var(--muted); white-space: nowrap;">App:</label> <select id="pit-app-select" style="flex: 1; padding: 8px; border-radius: 6px; border: 1px solid var(--border); background: var(--base); max-width: 240px;">',l=0;l<t.length;l++)o+='<option value="'+escapeHtml(t[l].id||t[l].name||"")+'">'+escapeHtml(t[l].name||t[l].id||"")+"</option>";o+='</select> <button id="pit-load-btn" style="padding: 8px 16px; background: var(--accent); border: none; color: white; border-radius: 6px; cursor: pointer; font-weight: 500;">Load Backups</button></div><div id="pit-backups-list" style="max-height: 320px; overflow-y: auto;"></div></div>',H.innerHTML=o,document.getElementById("pit-load-btn")?.addEventListener("click",function(){var h=document.getElementById("pit-app-select")?.value;h&&y(h)})}catch(h){H.innerHTML='<div class="panel-empty" style="color: var(--bad-fg);">Failed: '+escapeHtml(h.message)+"</div>"}}}async function y(e){var r=document.getElementById("pit-backups-list");if(r){r.innerHTML='<div style="padding: 20px; text-align: center;"><span class="brand-spinner"></span> Loading backups...</div>';try{var s=await fetch("/api/v1/backups/files/"+encodeURIComponent(e)),a=await s.json();if(!a.success||!a.files||a.files.length===0){r.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F4BE}</span> No backup files for '+escapeHtml(e)+"</div>";return}for(var t='<div style="font-size: 0.75rem; color: var(--muted); margin-bottom: 8px;">'+a.files.length+' backup(s)</div><div style="display: flex; flex-direction: column; gap: 6px;">',o=0;o<a.files.length;o++){var l=a.files[o],h=new Date(l.timestamp).toLocaleString();t+='<div style="padding: 10px 12px; background: var(--card-base); border-radius: 8px; border: 1px solid var(--border);"><div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 4px;"> <div style="font-weight: 500; font-size: 0.85rem;">'+escapeHtml(l.name)+'</div> <div style="font-size: 0.75rem; color: var(--muted);">'+l.sizeFormatted+'</div></div><div style="font-size: 0.75rem; color: var(--muted); margin-bottom: 8px;">'+h+'</div><div style="display: flex; gap: 6px;"> <button class="pit-compare-btn" data-appid="'+escapeHtml(e)+'" data-filename="'+escapeHtml(l.name)+'" style="padding: 4px 10px; font-size: 0.75rem; background: transparent; border: 1px solid var(--accent); color: var(--accent); border-radius: 5px; cursor: pointer;">Compare</button> <button class="pit-restore-btn" data-appid="'+escapeHtml(e)+'" data-filename="'+escapeHtml(l.name)+'" style="padding: 4px 10px; font-size: 0.75rem; background: linear-gradient(135deg, var(--ok-fg), #27ae60); border: none; color: white; border-radius: 5px; cursor: pointer; font-weight: 500;">Restore</button></div></div>'}t+="</div>",r.innerHTML=t,r.querySelectorAll(".pit-compare-btn").forEach(function($){$.addEventListener("click",function(){p($.dataset.appid,$.dataset.filename)})}),r.querySelectorAll(".pit-restore-btn").forEach(function($){$.addEventListener("click",function(){n($.dataset.appid,$.dataset.filename)})})}catch($){r.innerHTML='<div class="panel-empty" style="color: var(--bad-fg);">Failed: '+escapeHtml($.message)+"</div>"}}}async function p(e,r){try{var s=await secureFetch("/api/v1/backups/compare/"+encodeURIComponent(r),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})}),a=await s.json();if(!a.success){showNotification("Compare failed: "+(a.error||"Unknown"),"error");return}var t=a.diff,o='<div style="position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0,0,0,0.5); z-index: 10000; display: flex; align-items: center; justify-content: center;" id="compare-overlay"><div style="background: var(--base); border-radius: 12px; max-width: 600px; width: 90%; max-height: 80vh; overflow: auto; padding: 20px; border: 1px solid var(--border);"><h4 style="margin: 0 0 16px;">\u{1F4CA} Compare: '+escapeHtml(r)+'</h4><div style="font-size: 0.8rem; color: var(--muted); margin-bottom: 16px;">Size: '+(t.sizeFormatted||"?")+" | Created: "+new Date(t.timestamp).toLocaleString()+"</div>";if(t.services){var l=t.services.hasChanges?"\u{1F534}":"\u{1F7E2}";o+='<div style="margin-bottom: 12px; padding: 10px; background: var(--card-base); border-radius: 6px; border: 1px solid var(--border);"><div style="font-weight: 600; font-size: 0.85rem; margin-bottom: 4px;">'+l+' Services (backup vs current)</div><div style="font-size: 0.8rem; color: var(--muted);">Backup: '+t.services.backupCount+" services | Current: "+t.services.currentCount+" services</div>",t.services.hasChanges&&(o+='<div style="margin-top: 6px; font-size: 0.8rem; color: #f39c12;">Services differ \u2014 restoring will replace current configuration</div>'),o+="</div>"}if(t.config){var h=t.config.hasChanges?"\u{1F534}":"\u{1F7E2}";o+='<div style="margin-bottom: 12px; padding: 10px; background: var(--card-base); border-radius: 6px; border: 1px solid var(--border);"><div style="font-weight: 600; font-size: 0.85rem; margin-bottom: 4px;">'+h+" Configuration</div>",t.config.hasChanges?o+='<div style="font-size: 0.8rem; color: #f39c12;">Configuration differs \u2014 restoring will replace current settings</div>':o+='<div style="font-size: 0.8rem; color: var(--ok-fg);">No changes</div>',o+="</div>"}o+='<button id="compare-close-btn" style="padding: 8px 20px; background: var(--accent); border: none; color: white; border-radius: 6px; cursor: pointer; font-weight: 500;">Close</button></div></div>',document.body.insertAdjacentHTML("beforeend",o),document.getElementById("compare-close-btn")?.addEventListener("click",function(){document.getElementById("compare-overlay")?.remove()}),document.getElementById("compare-overlay")?.addEventListener("click",function($){$.target===this&&this.remove()})}catch($){showNotification("Compare error: "+$.message,"error")}}async function n(e,r){if(confirm("Restore "+r+" for "+e+`?
This will replace current configuration, credentials, and data. Containers will be restarted.`))try{var s=await secureFetch("/api/v1/apps/"+encodeURIComponent(e)+"/revert/"+encodeURIComponent(r),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({restartContainers:!0})}),a=await s.json();a.success?(showNotification(e+" restored to "+r,"success"),setTimeout(function(){location.reload()},1500)):showNotification("Restore failed: "+(a.error||"Unknown"),"error")}catch(t){showNotification("Restore error: "+t.message,"error")}}})(),(function(){injectModal("stats-modal",`<div id="stats-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 750px; max-width: 950px;">
<h3>\u{1F4CA} Resource Monitor</h3>
<p class="modal-subtitle">
Real-time and historical CPU, memory, network, and disk usage for containers.
</p>
<!-- Tab bar -->
<div class="panel-tabs">
<button class="panel-tab active" data-panel="stats-live">Live Stats</button>
<button class="panel-tab" data-panel="stats-aggregated">24h Summary</button>
<button class="panel-tab" data-panel="stats-history">History</button>
<button class="panel-tab" data-panel="stats-alerts">Alerts</button>
</div>
<!-- Tab: Live Stats -->
<div id="stats-live" class="panel-section active">
<div id="stats-container" class="scroll-container">
<div style="text-align: center; padding: 40px; color: var(--muted);">
<span class="brand-spinner"></span> Loading container stats...
</div>
</div>
</div>
<!-- Tab: 24h Aggregated Summary -->
<div id="stats-aggregated" class="panel-section">
<div id="stats-aggregated-container" class="scroll-container">
<div class="panel-empty">
<span class="empty-icon">\u{1F4C8}</span>
Loading 24-hour aggregated metrics...
</div>
</div>
</div>
<!-- Tab: Long-term History -->
<div id="stats-history" class="panel-section">
<div style="display: flex; gap: 8px; align-items: center; margin-bottom: 12px; flex-wrap: wrap;">
<label style="font-size: 0.85rem; color: var(--muted);">Container:</label>
<select id="stats-history-container" style="padding: 4px 8px; background: var(--card-base); border: 1px solid var(--border); color: var(--fg); border-radius: 4px; font-size: 0.85rem; flex: 1; min-width: 180px;"></select>
<div id="stats-history-range-buttons" style="display: flex; gap: 4px;">
<button class="stats-range-btn active" data-range="1h">1h</button>
<button class="stats-range-btn" data-range="24h">24h</button>
<button class="stats-range-btn" data-range="7d">7d</button>
<button class="stats-range-btn" data-range="30d">30d</button>
<button class="stats-range-btn" data-range="1y">1y</button>
</div>
</div>
<div id="stats-history-container-area" class="scroll-container">
<div class="panel-empty">
<span class="empty-icon">\u{1F4CA}</span>
Choose a container and time range to view history.
</div>
</div>
</div>
<!-- Tab: Alert Configuration -->
<div id="stats-alerts" class="panel-section">
<div id="stats-alerts-container" class="scroll-container">
<div class="panel-empty">
<span class="empty-icon">\u{1F514}</span>
Loading alert configurations...
</div>
</div>
</div>
<!-- Auto-refresh toggle (bottom bar) -->
<div class="panel-bottom-bar">
<label class="checkbox-label" style="font-size: 0.85rem;">
<input type="checkbox" id="stats-auto-refresh" checked />
Auto-refresh every 5s
</label>
<button id="stats-refresh-btn" class="btn-sm">\u{1F504} Refresh Now</button>
<span id="stats-last-update" class="text-auto-right"></span>
</div>
<!-- Close Button -->
<div class="weather-modal-buttons modal-footer-bar">
<button id="stats-cancel">Close</button>
</div>
</div>
</div>`);const x=document.getElementById("stats-modal"),b=document.getElementById("container-stats-btn"),j=document.getElementById("stats-cancel"),g=document.getElementById("stats-refresh-btn"),N=document.getElementById("stats-auto-refresh"),A=document.getElementById("stats-container"),D=document.getElementById("stats-aggregated-container"),R=document.getElementById("stats-alerts-container"),f=document.getElementById("stats-last-update");let C=null,E=null;function M(d){if(d===0||!d)return"0 B";const y=1024,p=["B","KB","MB","GB"],n=Math.floor(Math.log(d)/Math.log(y));return parseFloat((d/Math.pow(y,n)).toFixed(1))+" "+p[n]}function w(d){return d<30?"#2ecc71":d<70?"#f39c12":"#e74c3c"}function z(d){return d<50?"#2ecc71":d<80?"#f39c12":"#e74c3c"}async function S(){try{let d=null,y=!1;try{const e=await(await fetch("/api/v1/monitoring/stats")).json();e.success&&e.stats&&(d=e.stats,y=!0,E=e.stats)}catch{}if(!y){const e=await(await fetch("/api/v1/stats/containers")).json();if(e.success&&e.stats){d={};for(const r of e.stats)d[r.name]={name:r.name,current:{cpu:r.cpu,memory:{percent:r.memory.percent,usage:r.memory.used,limit:r.memory.limit,usageMB:Math.round(r.memory.used/1048576),limitMB:Math.round(r.memory.limit/1048576)},network:{rxBytes:r.network.rx,txBytes:r.network.tx,rxMB:(r.network.rx/1048576).toFixed(1),txMB:(r.network.tx/1048576).toFixed(1)},disk:{readMB:0,writeMB:0}},status:r.status};E=d}}if(!d||Object.keys(d).length===0){A.innerHTML='<div style="text-align: center; padding: 40px; color: var(--muted);">No running containers found</div>';return}let p='<div style="display: flex; flex-direction: column; gap: 8px;">';for(const[n,e]of Object.entries(d)){const r=e.current||e,s=r.cpu?.percent||0,a=r.memory?.percent||0,t=w(s),o=z(a),l=r.memory?.usage||r.memory?.used||0,h=r.memory?.limit||0,$=r.network?.rxBytes||r.network?.rx||0,U=r.network?.txBytes||r.network?.tx||0,F=e.aggregated;p+=`
<div style="padding: 12px; background: var(--card-base); border-radius: 8px; border: 1px solid var(--border);">
<div style="display: flex; align-items: center; gap: 12px; margin-bottom: 10px;">
<span style="font-weight: 600; flex: 1;">${e.name||n}</span>
${F?`<span style="font-size: 0.65rem; color: var(--muted); padding: 2px 6px; background: color-mix(in srgb, var(--accent) 10%, transparent); border-radius: 4px;">avg ${F.cpu?.avg?.toFixed(0)||0}% cpu</span>`:""}
<span style="font-size: 0.75rem; color: var(--muted); background: var(--base); padding: 2px 8px; border-radius: 4px;">${e.status||"running"}</span>
</div>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 12px;">
<div>
<div style="font-size: 0.7rem; color: var(--muted); margin-bottom: 4px;">CPU</div>
<div style="display: flex; align-items: center; gap: 8px;">
<div style="flex: 1; height: 6px; background: var(--base); border-radius: 3px; overflow: hidden;">
<div style="height: 100%; width: ${Math.min(s,100)}%; background: ${t}; border-radius: 3px; transition: width 0.3s;"></div>
</div>
<span style="font-size: 0.8rem; font-weight: 500; color: ${t}; min-width: 45px; text-align: right;">${s.toFixed(1)}%</span>
</div>
</div>
<div>
<div style="font-size: 0.7rem; color: var(--muted); margin-bottom: 4px;">Memory</div>
<div style="display: flex; align-items: center; gap: 8px;">
<div style="flex: 1; height: 6px; background: var(--base); border-radius: 3px; overflow: hidden;">
<div style="height: 100%; width: ${Math.min(a,100)}%; background: ${o}; border-radius: 3px; transition: width 0.3s;"></div>
</div>
<span style="font-size: 0.8rem; font-weight: 500; color: ${o}; min-width: 45px; text-align: right;">${a.toFixed(1)}%</span>
</div>
<div style="font-size: 0.65rem; color: var(--muted); margin-top: 2px;">${M(l)} / ${M(h)}</div>
</div>
<div>
<div style="font-size: 0.7rem; color: var(--muted); margin-bottom: 4px;">Network</div>
<div style="font-size: 0.8rem;">
<span style="color: #3498db;">\u2193 ${M($)}</span>
<span style="color: var(--muted); margin: 0 4px;">/</span>
<span style="color: #e74c3c;">\u2191 ${M(U)}</span>
</div>
</div>
</div>
</div>`}p+="</div>",A.innerHTML=p,f.textContent="Updated: "+new Date().toLocaleTimeString()}catch(d){A.innerHTML=`<div style="text-align: center; padding: 40px; color: var(--bad-fg);">\u274C Failed to load stats: ${escapeHtml(d.message)}</div>`}}async function T(){if(!D)return;const d=E;if(!d||Object.keys(d).length===0){D.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F4C8}</span>No monitoring data available. Open the Live Stats tab first.</div>';return}let y='<div style="display: flex; flex-direction: column; gap: 12px;">';for(const[p,n]of Object.entries(d)){const e=n.aggregated;e&&(y+=`<div style="padding: 12px; background: var(--card-base); border-radius: 8px; border: 1px solid var(--border);">
<div style="font-weight: 600; margin-bottom: 10px;">${n.name||p}</div>
<div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px;">
<div class="stat-mini-card"><span class="stat-val">${e.cpu?.avg?.toFixed(1)||0}%</span><span class="stat-lbl">Avg CPU</span></div>
<div class="stat-mini-card"><span class="stat-val">${e.cpu?.max?.toFixed(1)||0}%</span><span class="stat-lbl">Max CPU</span></div>
<div class="stat-mini-card"><span class="stat-val">${e.memory?.avg?.toFixed(1)||0}%</span><span class="stat-lbl">Avg Mem</span></div>
<div class="stat-mini-card"><span class="stat-val">${e.memory?.max?.toFixed(1)||0}%</span><span class="stat-lbl">Max Mem</span></div>
</div>
${e.dataPoints?`<div style="font-size: 0.7rem; color: var(--muted); margin-top: 6px;">${e.dataPoints} data points over ${e.timeRange||24}h</div>`:""}
</div>`)}y+="</div>",D.innerHTML=y}async function P(){if(!R)return;R.innerHTML='<div class="panel-empty"><span class="brand-spinner"></span> Loading alerts...</div>';const d=E;if(!d||Object.keys(d).length===0){R.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F514}</span>No containers found. Open the Live Stats tab first.</div>';return}let y=!1;try{y=(await(await fetch("/api/v1/license/feature/resource-alerts")).json()).available}catch{y=!1}let p=[];try{const o=await(await fetch("/api/v1/monitoring/alerts?limit=50")).json();o.success&&(p=o.history||[])}catch{}let n={};try{const o=await(await fetch("/api/v1/monitoring/alerts/config")).json();o.success&&(n=o.configs||{})}catch{}const r=Object.entries(d).map(([t,o])=>{const l=n[t]||{cpuThreshold:80,memoryThreshold:90,diskIOThreshold:50,autoRestart:!1,enabled:!1};return`
<tr data-container="${t}">
<td style="font-weight: 600; padding: 8px;">${o.name||t}</td>
<td style="padding: 4px 8px;"><input type="number" class="alert-cpu" value="${l.cpuThreshold??80}" min="0" max="100" style="width: 60px; font-size: 0.8rem; padding: 2px 4px;" ${y?"":"disabled"} /></td>
<td style="padding: 4px 8px;"><input type="number" class="alert-mem" value="${l.memoryThreshold??90}" min="0" max="100" style="width: 60px; font-size: 0.8rem; padding: 2px 4px;" ${y?"":"disabled"} /></td>
<td style="padding: 4px 8px;"><input type="number" class="alert-disk" value="${l.diskIOThreshold??50}" min="0" max="1000" style="width: 70px; font-size: 0.8rem; padding: 2px 4px;" ${y?"":"disabled"} /></td>
<td style="padding: 4px 8px;"><input type="checkbox" class="alert-autorestart" ${l.autoRestart?"checked":""} ${y?"":"disabled"} /></td>
<td style="padding: 4px 8px;">
<button class="alert-test-btn btn-xs" data-container="${t}" data-name="${o.name||t}" style="padding: 2px 8px; font-size: 0.75rem; background: var(--card-base); border: 1px solid var(--border); border-radius: 4px; cursor: pointer;">Test</button>
</td>
</tr>
`}).join(""),s=p.map(t=>{const o=new Date(t.timestamp).toLocaleString(),l=t.notified?"\u2713":"\u2014";return`
<tr>
<td style="padding: 6px 8px; font-size: 0.8rem; color: var(--muted);">${o}</td>
<td style="padding: 6px 8px; font-weight: 500;">${t.containerName||t.containerId}</td>
<td style="padding: 6px 8px; text-transform: capitalize;">${t.metric||t.type}</td>
<td style="padding: 6px 8px;">${typeof t.value=="number"?t.value.toFixed(1):t.value}${t.metric==="disk"?" MB/s":"%"}</td>
<td style="padding: 6px 8px; text-align: center;">${l}</td>
<td style="padding: 6px 8px; font-size: 0.75rem; color: ${t.autoRestartTriggered?"#f39c12":"var(--muted)"};">${t.autoRestartTriggered?"\u21BB":""}</td>
</tr>
`}).join(""),a=y?`
<div style="margin-bottom: 20px;">
<div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px;">
<h4 style="margin: 0; font-size: 0.9rem;">\u2699\uFE0F Alert Configuration</h4>
<a href="#" id="go-to-notifications" style="font-size: 0.8rem; color: var(--accent); text-decoration: none;">Configure notifications \u2192</a>
</div>
<div style="overflow-x: auto;">
<table style="width: 100%; border-collapse: collapse; font-size: 0.85rem;">
<thead>
<tr style="border-bottom: 1px solid var(--border);">
<th style="text-align: left; padding: 6px 8px; color: var(--muted);">Container</th>
<th style="text-align: left; padding: 6px 8px; color: var(--muted);">CPU %</th>
<th style="text-align: left; padding: 6px 8px; color: var(--muted);">Mem %</th>
<th style="text-align: left; padding: 6px 8px; color: var(--muted);">Disk I/O MB/s</th>
<th style="text-align: center; padding: 6px 8px; color: var(--muted);">Auto-Restart</th>
<th style="padding: 6px 8px;"></th>
</tr>
</thead>
<tbody>${r}</tbody>
</table>
</div>
<div style="margin-top: 12px; display: flex; justify-content: flex-end;">
<button id="save-all-alerts" style="padding: 6px 16px; font-size: 0.85rem; background: var(--accent); color: var(--base); border: none; border-radius: 4px; cursor: pointer; font-weight: 600;">Save All</button>
</div>
</div>
`:`
<div style="margin-bottom: 20px; padding: 12px; background: rgba(241,196,15,0.1); border: 1px solid rgba(241,196,15,0.3); border-radius: 8px; text-align: center;">
<span style="color: #f1c40f; font-weight: 600; font-size: 0.85rem;">\u2B50 Premium Feature</span>
<p style="margin: 6px 0 0; font-size: 0.75rem; color: var(--muted);">Upgrade to configure resource alert thresholds per container.</p>
<button id="upgrade-for-alerts" style="margin-top: 8px; padding: 4px 12px; font-size: 0.75rem; background: #f1c40f; color: #000; border: none; border-radius: 4px; cursor: pointer; font-weight: 600;">Upgrade Now</button>
</div>
`;R.innerHTML=`
${a}
<div>
<h4 style="margin: 0 0 10px; font-size: 0.9rem;">\u{1F4CB} Recent Alerts</h4>
${s?`
<div style="overflow-x: auto;">
<table style="width: 100%; border-collapse: collapse; font-size: 0.8rem;">
<thead>
<tr style="border-bottom: 1px solid var(--border);">
<th style="text-align: left; padding: 6px 8px; color: var(--muted);">Time</th>
<th style="text-align: left; padding: 6px 8px; color: var(--muted);">Container</th>
<th style="text-align: left; padding: 6px 8px; color: var(--muted);">Metric</th>
<th style="text-align: left; padding: 6px 8px; color: var(--muted);">Value</th>
<th style="text-align: center; padding: 6px 8px; color: var(--muted);">\u2713?</th>
<th style="padding: 6px 8px;"></th>
</tr>
</thead>
<tbody>${s}</tbody>
</table>
</div>
`:'<div style="color: var(--muted); text-align: center; padding: 20px;">No alerts recorded yet.</div>'}
</div>
`,document.getElementById("save-all-alerts")?.addEventListener("click",async()=>{const t={};document.querySelectorAll("#stats-alerts-container tr[data-container]").forEach(o=>{const l=o.dataset.container;t[l]={cpuThreshold:parseInt(o.querySelector(".alert-cpu")?.value)||80,memoryThreshold:parseInt(o.querySelector(".alert-mem")?.value)||90,diskIOThreshold:parseInt(o.querySelector(".alert-disk")?.value)||50,autoRestart:!!o.querySelector(".alert-autorestart")?.checked,enabled:!0}});try{const l=await(await secureFetch("/api/v1/monitoring/alerts/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({configs:t})})).json(),h=document.getElementById("save-all-alerts");h.textContent=l.success?"\u2705 Saved":"\u274C Failed",setTimeout(()=>{h.textContent="Save All"},2e3)}catch{const l=document.getElementById("save-all-alerts");l.textContent="\u274C Error",setTimeout(()=>{l.textContent="Save All"},2e3)}}),document.getElementById("go-to-notifications")?.addEventListener("click",t=>{t.preventDefault(),x.classList.remove("show"),B(),document.getElementById("manage-notifications")?.click()}),document.querySelectorAll(".alert-test-btn").forEach(t=>{t.addEventListener("click",async()=>{const o=t.textContent;t.textContent="...";try{await secureFetch(`/api/v1/monitoring/alerts/${t.dataset.container}/test`,{method:"POST"}),t.textContent="\u2705",showNotification("Test alert sent for "+t.dataset.name,"success",3e3)}catch{t.textContent="\u274C"}setTimeout(()=>{t.textContent=o},2e3)})}),document.getElementById("upgrade-for-alerts")?.addEventListener("click",()=>{x.classList.remove("show"),B(),typeof openLicenseModal=="function"&&openLicenseModal()})}function v(){C&&clearInterval(C),N?.checked&&(C=setInterval(S,DC.POLL.STATS))}function B(){C&&(clearInterval(C),C=null)}b?.addEventListener("click",()=>{x.classList.add("show"),S(),v()}),j?.addEventListener("click",()=>{x.classList.remove("show"),B()}),x?.addEventListener("click",d=>{d.target===x&&(x.classList.remove("show"),B())}),g?.addEventListener("click",S),N?.addEventListener("change",()=>{N.checked?v():B()}),document.querySelector('[data-panel="stats-aggregated"]')?.addEventListener("click",T),document.querySelector('[data-panel="stats-alerts"]')?.addEventListener("click",P);const H=document.getElementById("stats-history-container"),O=document.getElementById("stats-history-container-area"),u=document.querySelectorAll(".stats-range-btn");let m="1h";function L(d){switch(d){case"1h":return 3600*1e3;case"24h":return 1440*60*1e3;case"7d":return 10080*60*1e3;case"30d":return 720*60*60*1e3;case"1y":return 365*24*60*60*1e3;default:return 3600*1e3}}function k(d){return d==="raw"?"live (10s samples)":d==="hourly"?"hourly average":d==="daily"?"daily average":d}function I(d,y,p,n,e){if(!d||d.length===0)return`<div style="text-align: center; color: var(--muted); padding: 20px;">No data for ${escapeHtml(n)}</div>`;const r=d.map(y).filter(J=>J!=null);if(r.length===0)return`<div style="text-align: center; color: var(--muted); padding: 20px;">No data for ${escapeHtml(n)}</div>`;const s=Math.max(...r,1),a=Math.min(...r,0),t=s-a||1,o=600,l=80,h=4,$=(o-h*2)/Math.max(r.length-1,1),U=r.map((J,q)=>{const K=h+q*$,Z=l-h-(J-a)/t*(l-h*2);return`${K.toFixed(1)},${Z.toFixed(1)}`}).join(" "),F=r[r.length-1],_=r.reduce((J,q)=>J+q,0)/r.length;return`
<div style="margin-bottom: 14px;">
<div style="display: flex; align-items: baseline; gap: 12px; margin-bottom: 4px;">
<span style="font-weight: 600; font-size: 0.9rem;">${escapeHtml(n)}</span>
<span style="font-size: 0.75rem; color: var(--muted);">last ${F.toFixed(1)}${e} \xB7 avg ${_.toFixed(1)}${e} \xB7 max ${s.toFixed(1)}${e}</span>
</div>
<svg viewBox="0 0 ${o} ${l}" preserveAspectRatio="none" style="width: 100%; height: ${l}px; background: var(--base); border-radius: 4px;">
<polyline fill="none" stroke="${p}" stroke-width="1.5" points="${U}" />
</svg>
</div>
`}function i(){if(!H)return;const d=E||{},y=H.value,p=Object.entries(d);if(p.length===0){H.innerHTML='<option value="">No containers</option>';return}H.innerHTML=p.map(([n,e])=>`<option value="${escapeHtml(n)}">${escapeHtml(e.name||n)}</option>`).join(""),y&&d[y]&&(H.value=y)}async function c(){if(!O||!H)return;const d=H.value;if(!d){O.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F4CA}</span>No container selected.</div>';return}const y=Date.now(),p=y-L(m);O.innerHTML='<div class="panel-empty"><span class="brand-spinner"></span> Loading history...</div>';try{const e=await(await fetch(`/api/v1/monitoring/history/${encodeURIComponent(d)}?startTime=${p}&endTime=${y}`)).json();if(!e.success)throw new Error(e.error||"Failed to load history");const r=e.samples||[],s=e.tier||"raw";if(r.length===0){O.innerHTML=`<div class="panel-empty"><span class="empty-icon">\u{1F4CA}</span>No data for the last ${m}. Tier: ${k(s)}.</div>`;return}const a=s==="raw",t=a?U=>U.cpu?.percent:U=>U.cpu?.avg,o=a?U=>U.memory?.percent:U=>U.memory?.avgPercent,l=a?U=>U.network?.rxMB||0:U=>U.network?.rxMB||0,h=a?U=>U.network?.txMB||0:U=>U.network?.txMB||0;let $=`
<div style="font-size: 0.75rem; color: var(--muted); margin-bottom: 8px;">
${r.length} samples \xB7 ${escapeHtml(k(s))} \xB7 ${new Date(p).toLocaleString()} \u2192 ${new Date(y).toLocaleString()}
</div>
`;$+=I(r,t,"#2ecc71","CPU","%"),$+=I(r,o,"#3498db","Memory","%"),$+=I(r,l,"#9b59b6","Network RX"," MB"),$+=I(r,h,"#e67e22","Network TX"," MB"),O.innerHTML=$}catch(n){O.innerHTML=`<div class="panel-empty"><span class="empty-icon">\u26A0\uFE0F</span>Failed to load history: ${escapeHtml(n.message)}</div>`}}u.forEach(d=>{d.addEventListener("click",()=>{u.forEach(y=>y.classList.remove("active")),d.classList.add("active"),m=d.dataset.range,c()})}),H?.addEventListener("change",c),document.querySelector('[data-panel="stats-history"]')?.addEventListener("click",()=>{i(),c()})})(),(function(){injectModal("health-modal",`<div id="health-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 800px; max-width: 1000px;">
<h3>\u{1F3E5} Health Check Dashboard</h3>
<p class="modal-subtitle">
Service uptime tracking, SLA monitoring, and incident management.
</p>
<div class="panel-tabs">
<button class="panel-tab active" data-panel="health-status">Status</button>
<button class="panel-tab" data-panel="health-incidents">Incidents</button>
<button class="panel-tab" data-panel="health-config">Configure</button>
</div>
<!-- Tab: Status -->
<div id="health-status" class="panel-section active">
<div id="health-status-container" class="scroll-container">
<div class="panel-empty"><span class="brand-spinner"></span> Loading health status...</div>
</div>
</div>
<!-- Tab: Incidents -->
<div id="health-incidents" class="panel-section">
<div id="health-incidents-container" class="scroll-container">
<div class="panel-empty"><span class="empty-icon">\u{1F6A8}</span> Loading incidents...</div>
</div>
</div>
<!-- Tab: Configure -->
<div id="health-config" class="panel-section">
<div id="health-config-container" class="scroll-container">
<div class="panel-empty"><span class="empty-icon">\u2699\uFE0F</span> Loading configuration...</div>
</div>
<!-- Global Settings: retention, polling intervals, max entries, disk-usage threshold -->
<div id="health-global-settings" style="margin-top: 16px; padding: 16px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--card-base);">
<h4 style="margin: 0 0 4px;">\u{1F30D} Global Settings</h4>
<p class="text-muted-sm" style="margin: 0 0 12px;">Applies to all health checks. Settings are stored locally in this browser.</p>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 12px;">
<div>
<label class="text-muted-sm">Health Check Polling Interval (seconds)</label>
<input type="number" id="health-setting-interval" value="60" min="5" max="3600" class="form-input" />
<div style="font-size: 0.72rem; color: var(--muted); margin-top: 2px;">How often each service's health endpoint is checked.</div>
</div>
<div>
<label class="text-muted-sm">Stats Polling Interval (seconds)</label>
<input type="number" id="health-setting-stats-interval" value="30" min="5" max="3600" class="form-input" />
<div style="font-size: 0.72rem; color: var(--muted); margin-top: 2px;">How often container statistics (CPU/memory) are sampled.</div>
</div>
<div>
<label class="text-muted-sm">Max Entries Per Service</label>
<input type="number" id="health-setting-max-entries" value="500" min="10" max="100000" class="form-input" />
<div style="font-size: 0.72rem; color: var(--muted); margin-top: 2px;">Cap on stored history records per service.</div>
</div>
<div>
<label class="text-muted-sm">Data Retention (days)</label>
<input type="number" id="health-setting-retention" value="30" min="1" max="3650" class="form-input" />
<div style="font-size: 0.72rem; color: var(--muted); margin-top: 2px;">Health history older than this is pruned.</div>
</div>
<div>
<label class="text-muted-sm">Disk-Usage Warning (%)</label>
<input type="number" id="health-setting-disk-threshold" value="80" min="50" max="99" class="form-input" />
<div style="font-size: 0.72rem; color: var(--muted); margin-top: 2px;">Warn when disk usage exceeds this level.</div>
</div>
</div>
<div style="margin-top: 12px; display: flex; gap: 8px; align-items: center;">
<button id="health-global-save" class="btn-accent-solid">Save Global Settings</button>
<button id="health-global-reset" class="btn-sm">Reset to Defaults</button>
<span id="health-global-status" style="font-size: 0.8rem; color: var(--muted);"></span>
</div>
</div>
<!-- Add/Edit Health Check Form -->
<div id="health-config-form" style="display: none; margin-top: 16px; padding: 16px; border: 1px solid var(--border); border-radius: var(--radius); background: var(--card-base);">
<h4 id="health-form-title" style="margin: 0 0 12px;">Add Health Check</h4>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 12px;">
<div>
<label class="text-muted-sm">Service ID</label>
<input type="text" id="health-form-id" placeholder="e.g. plex" class="form-input" />
</div>
<div>
<label class="text-muted-sm">Display Name</label>
<input type="text" id="health-form-name" placeholder="e.g. Plex Media Server" class="form-input" />
</div>
<div style="grid-column: span 2;">
<label class="text-muted-sm">URL</label>
<input type="text" id="health-form-url" placeholder="https://plex.home" class="form-input" />
</div>
<div>
<label class="text-muted-sm">Timeout (ms)</label>
<input type="number" id="health-form-timeout" value="10000" class="form-input" />
</div>
<div>
<label class="text-muted-sm">Expected Status Codes</label>
<input type="text" id="health-form-codes" value="200" placeholder="200, 301, 302" class="form-input" />
</div>
<div>
<label class="text-muted-sm">SLA Target (%)</label>
<input type="number" id="health-form-sla" value="99.9" step="0.1" class="form-input" />
</div>
<div>
<label class="text-muted-sm">Slow Response Threshold (ms)</label>
<input type="number" id="health-form-slow" value="5000" class="form-input" />
</div>
</div>
<div style="margin-top: 12px; display: flex; gap: 8px; justify-content: flex-end;">
<button id="health-form-cancel">Cancel</button>
<button id="health-form-save" class="btn-accent-solid">Save</button>
</div>
</div>
<div style="margin-top: 12px;">
<button id="health-add-btn" class="btn-accent-solid">+ Add Health Check</button>
</div>
</div>
<div class="panel-bottom-bar">
<button id="health-refresh-btn" class="btn-sm">\u{1F504} Refresh</button>
<span id="health-last-update" class="text-auto-right"></span>
</div>
<div class="weather-modal-buttons modal-footer-bar">
<button id="health-cancel">Close</button>
</div>
</div>
</div>`);const x=document.getElementById("health-modal"),b=document.getElementById("health-check-btn"),j=document.getElementById("health-cancel"),g=document.getElementById("health-refresh-btn"),N=document.getElementById("health-status-container"),A=document.getElementById("health-incidents-container"),D=document.getElementById("health-config-container"),R=document.getElementById("health-last-update"),f=document.getElementById("health-add-btn"),C=document.getElementById("health-config-form"),E=document.getElementById("health-form-title"),M=document.getElementById("health-form-cancel"),w=document.getElementById("health-form-save"),z="dashcaddy-health-settings",S={retentionDays:30,pollingInterval:60,statsPollingInterval:30,maxEntriesPerService:500,diskUsageThreshold:80},T=document.getElementById("health-global-save"),P=document.getElementById("health-global-reset"),v=document.getElementById("health-global-status"),B=document.getElementById("health-setting-retention"),H=document.getElementById("health-setting-interval"),O=document.getElementById("health-setting-stats-interval"),u=document.getElementById("health-setting-max-entries"),m=document.getElementById("health-setting-disk-threshold");function L(){try{const a=safeGet(z),t=a?JSON.parse(a):{};return Object.assign({},S,t)}catch{return Object.assign({},S)}}function k(){const a=L();B&&(B.value=a.retentionDays),H&&(H.value=a.pollingInterval),O&&(O.value=a.statsPollingInterval),u&&(u.value=a.maxEntriesPerService),m&&(m.value=a.diskUsageThreshold)}function I(){const a={retentionDays:Math.max(1,Math.min(3650,parseInt(B?.value)||S.retentionDays)),pollingInterval:Math.max(5,Math.min(3600,parseInt(H?.value)||S.pollingInterval)),statsPollingInterval:Math.max(5,Math.min(3600,parseInt(O?.value)||S.statsPollingInterval)),maxEntriesPerService:Math.max(10,Math.min(1e5,parseInt(u?.value)||S.maxEntriesPerService)),diskUsageThreshold:Math.max(50,Math.min(99,parseInt(m?.value)||S.diskUsageThreshold))};try{safeSet(z,JSON.stringify(a)),k(),v&&(v.textContent="Saved \u2713",v.style.color="var(--ok-fg)",setTimeout(()=>{v&&(v.textContent="")},2500)),typeof showNotification=="function"&&showNotification("Global health settings saved","success")}catch(t){v&&(v.textContent="Save failed",v.style.color="var(--bad-fg)"),typeof showNotification=="function"&&showNotification("Failed to save settings: "+t.message,"error")}}function i(){try{safeSet(z,JSON.stringify(S))}catch{}k(),v&&(v.textContent="Reset to defaults \u2713",v.style.color="var(--ok-fg)",setTimeout(()=>{v&&(v.textContent="")},2500))}k(),T?.addEventListener("click",I),P?.addEventListener("click",i);let c=null;function d(a){return a>=99.9?"var(--ok-fg)":a>=95?"#f39c12":"var(--bad-fg)"}function y(a){const t={critical:"var(--bad-fg)",high:"#ff6b6b",medium:"#f39c12",low:"var(--muted)"};return`<span style="padding: 2px 8px; border-radius: 4px; font-size: 0.75rem; background: ${t[a]||"var(--muted)"}20; color: ${t[a]||"var(--muted)"};">${a}</span>`}async function p(){try{const t=await(await fetch("/api/v1/health-checks/status")).json();if(!t.success||!t.status||Object.keys(t.status).length===0){N.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F3E5}</span>No health checks configured. Go to the Configure tab to add services.</div>';return}const o=Object.values(t.status);let l='<table style="width: 100%; border-collapse: collapse; font-size: 0.85rem;">';l+='<tr style="border-bottom: 1px solid var(--border); color: var(--muted); text-align: left;">',l+='<th style="padding: 8px;">Service</th><th style="padding: 8px;">Status</th>',l+='<th style="padding: 8px;">Uptime 24h</th><th style="padding: 8px;">Uptime 7d</th>',l+='<th style="padding: 8px;">Avg Response</th><th style="padding: 8px;">Last Check</th></tr>';for(const h of o){const $=h.status==="up",U=$?"var(--dot-ok)":"var(--dot-bad)",F=h.uptime?.["24h"]??"-",_=h.uptime?.["7d"]??"-",J=h.avgResponseTime!=null?Math.round(h.avgResponseTime)+"ms":"-",q=h.timestamp?timeAgo(h.timestamp):"-";l+=`<tr style="border-bottom: 1px solid var(--border); cursor: pointer;" data-health-id="${escapeHtml(h.serviceId)}">`,l+=`<td style="padding: 8px; font-weight: 500;">${escapeHtml(h.name||h.serviceId)}</td>`,l+=`<td style="padding: 8px;"><span style="display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: ${U}; margin-right: 6px;"></span>${$?"Up":"Down"}</td>`,l+=`<td style="padding: 8px; color: ${typeof F=="number"?d(F):"var(--muted)"};">${typeof F=="number"?F.toFixed(1)+"%":F}</td>`,l+=`<td style="padding: 8px; color: ${typeof _=="number"?d(_):"var(--muted)"};">${typeof _=="number"?_.toFixed(1)+"%":_}</td>`,l+=`<td style="padding: 8px;">${J}</td>`,l+=`<td style="padding: 8px; color: var(--muted);">${q}</td>`,l+="</tr>",l+=`<tr id="health-detail-${escapeHtml(h.serviceId)}" style="display: none;"><td colspan="6" style="padding: 12px; background: var(--bg); border-bottom: 1px solid var(--border);"><div class="panel-empty"><span class="brand-spinner"></span> Loading details...</div></td></tr>`}l+="</table>",N.innerHTML=l,R.textContent="Updated "+new Date().toLocaleTimeString(),N.querySelectorAll("tr[data-health-id]").forEach(h=>{h.addEventListener("click",async()=>{const $=h.dataset.healthId,U=document.getElementById("health-detail-"+$);if(U){if(U.style.display!=="none"){U.style.display="none";return}U.style.display="";try{const _=await(await fetch(`/api/v1/health-checks/${$}/stats?hours=24`)).json();if(_.success&&_.stats){const J=_.stats,q=J.responseTime||{};U.querySelector("td").innerHTML=`
<div style="display: grid; grid-template-columns: repeat(4, 1fr); gap: 12px; font-size: 0.82rem;">
<div><span style="color: var(--muted);">Total Checks</span><br><strong>${J.totalChecks||0}</strong></div>
<div><span style="color: var(--muted);">Uptime</span><br><strong style="color: ${d(J.uptime||0)};">${(J.uptime||0).toFixed(2)}%</strong></div>
<div><span style="color: var(--muted);">Avg Response</span><br><strong>${Math.round(q.avg||0)}ms</strong></div>
<div><span style="color: var(--muted);">P95 / P99</span><br><strong>${Math.round(q.p95||0)}ms / ${Math.round(q.p99||0)}ms</strong></div>
<div><span style="color: var(--muted);">Min Response</span><br><strong>${Math.round(q.min||0)}ms</strong></div>
<div><span style="color: var(--muted);">Max Response</span><br><strong>${Math.round(q.max||0)}ms</strong></div>
<div><span style="color: var(--muted);">Up Checks</span><br><strong style="color: var(--ok-fg);">${J.upChecks||0}</strong></div>
<div><span style="color: var(--muted);">Down Checks</span><br><strong style="color: var(--bad-fg);">${J.downChecks||0}</strong></div>
</div>`}else U.querySelector("td").innerHTML='<div class="panel-empty">No detailed stats available for this period.</div>'}catch(F){U.querySelector("td").innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(F.message)}</div>`}}})})}catch(a){N.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed to load health status: ${escapeHtml(a.message)}</div>`}}async function n(){try{const[a,t]=await Promise.all([fetch("/api/v1/health-checks/incidents"),fetch("/api/v1/health-checks/incidents/history?limit=50")]),o=await a.json(),l=await t.json();let h="";const $=o.success&&o.incidents?o.incidents:[];if($.length>0){h+='<div style="margin-bottom: 16px;"><h4 style="color: var(--bad-fg); margin: 0 0 8px;">Open Incidents ('+$.length+")</h4>";for(const F of $)h+=`<div style="padding: 10px 12px; margin-bottom: 8px; border: 1px solid var(--bad-fg)30; border-radius: 8px; background: var(--bad-bg);">
<div style="display: flex; justify-content: space-between; align-items: center;">
<span style="font-weight: 500;">${escapeHtml(F.serviceId)}</span>
<span>${y(F.severity)}</span>
</div>
<div style="font-size: 0.82rem; color: var(--muted); margin-top: 4px;">${escapeHtml(F.message)}</div>
<div style="font-size: 0.75rem; color: var(--muted); margin-top: 4px;">Started ${timeAgo(F.createdAt)} \xB7 ${F.occurrences||1} occurrence(s)</div>
</div>`;h+="</div>"}else h+='<div style="padding: 12px; margin-bottom: 16px; border: 1px solid var(--ok-fg)30; border-radius: 8px; background: var(--ok-bg); text-align: center; color: var(--ok-fg); font-size: 0.9rem;">All services operational \u2014 no open incidents</div>';const U=l.success&&l.history?l.history:[];if(U.length>0){h+='<h4 style="margin: 0 0 8px; color: var(--muted);">Incident History</h4>',h+='<table style="width: 100%; border-collapse: collapse; font-size: 0.82rem;">',h+='<tr style="border-bottom: 1px solid var(--border); color: var(--muted);"><th style="padding: 6px; text-align: left;">Service</th><th style="padding: 6px; text-align: left;">Type</th><th style="padding: 6px; text-align: left;">Severity</th><th style="padding: 6px; text-align: left;">Status</th><th style="padding: 6px; text-align: left;">Duration</th><th style="padding: 6px; text-align: left;">When</th></tr>';for(const F of U){const _=F.status==="resolved",J=_&&F.duration?F.duration<6e4?Math.round(F.duration/1e3)+"s":Math.round(F.duration/6e4)+"m":"-";h+='<tr style="border-bottom: 1px solid var(--border);">',h+=`<td style="padding: 6px;">${escapeHtml(F.serviceId)}</td>`,h+=`<td style="padding: 6px;">${escapeHtml(F.type)}</td>`,h+=`<td style="padding: 6px;">${y(F.severity)}</td>`,h+=`<td style="padding: 6px;"><span style="color: ${_?"var(--ok-fg)":"var(--bad-fg)"};">${F.status}</span></td>`,h+=`<td style="padding: 6px;">${J}</td>`,h+=`<td style="padding: 6px; color: var(--muted);">${timeAgo(F.createdAt)}</td>`,h+="</tr>"}h+="</table>"}A.innerHTML=h||'<div class="panel-empty"><span class="empty-icon">\u{1F6A8}</span>No incidents recorded yet.</div>'}catch(a){A.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(a.message)}</div>`}}async function e(){try{const t=await(await fetch("/api/v1/health-checks/status")).json(),o=t.success&&t.status?Object.values(t.status):[];if(o.length===0){D.innerHTML='<div class="panel-empty"><span class="empty-icon">\u2699\uFE0F</span>No health checks configured yet. Click "Add Health Check" below.</div>';return}let l='<table style="width: 100%; border-collapse: collapse; font-size: 0.85rem;">';l+='<tr style="border-bottom: 1px solid var(--border); color: var(--muted);"><th style="padding: 8px; text-align: left;">Service</th><th style="padding: 8px; text-align: left;">Status</th><th style="padding: 8px; text-align: left;">SLA Target</th><th style="padding: 8px; text-align: right;">Actions</th></tr>';for(const h of o){const $=h.status==="up";l+='<tr style="border-bottom: 1px solid var(--border);">',l+=`<td style="padding: 8px; font-weight: 500;">${escapeHtml(h.name||h.serviceId)}</td>`,l+=`<td style="padding: 8px; color: ${$?"var(--ok-fg)":"var(--bad-fg)"};">${$?"Up":"Down"}</td>`,l+=`<td style="padding: 8px;">${h.sla?.target?h.sla.target+"%":"-"}</td>`,l+='<td style="padding: 8px; text-align: right;">',l+=`<button onclick="document.dispatchEvent(new CustomEvent('health-edit', {detail:'${escapeHtml(h.serviceId)}'}))" style="padding: 4px 10px; font-size: 0.78rem; margin-right: 4px;">Edit</button>`,l+=`<button onclick="document.dispatchEvent(new CustomEvent('health-delete', {detail:'${escapeHtml(h.serviceId)}'}))" style="padding: 4px 10px; font-size: 0.78rem; color: var(--bad-fg); border-color: var(--bad-fg);">Delete</button>`,l+="</td></tr>"}l+="</table>",D.innerHTML=l}catch(a){D.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(a.message)}</div>`}}function r(a,t,o,l,h,$,U){c=a||null,E.textContent=a?"Edit Health Check":"Add Health Check",document.getElementById("health-form-id").value=a||"",document.getElementById("health-form-id").disabled=!!a,document.getElementById("health-form-name").value=t||"",document.getElementById("health-form-url").value=o||"",document.getElementById("health-form-timeout").value=l||1e4,document.getElementById("health-form-codes").value=h||"200",document.getElementById("health-form-sla").value=$||99.9,document.getElementById("health-form-slow").value=U||5e3,C.style.display="",f.style.display="none"}function s(){C.style.display="none",f.style.display="",c=null}f?.addEventListener("click",()=>r("","","",1e4,"200",99.9,5e3)),M?.addEventListener("click",s),w?.addEventListener("click",async()=>{const a=c||document.getElementById("health-form-id").value.trim();if(!a)return showNotification("Service ID is required","warning");const t=document.getElementById("health-form-url").value.trim();if(!t)return showNotification("URL is required","warning");const o=document.getElementById("health-form-codes").value.split(",").map(h=>parseInt(h.trim())).filter(Boolean),l={name:document.getElementById("health-form-name").value.trim()||a,url:t,timeout:parseInt(document.getElementById("health-form-timeout").value)||1e4,expectedStatusCodes:o.length?o:[200],sla:{target:parseFloat(document.getElementById("health-form-sla").value)||99.9},slowResponseThreshold:parseInt(document.getElementById("health-form-slow").value)||5e3};try{w.textContent="Saving...",w.disabled=!0;const $=await(await secureFetch(`/api/v1/health-checks/${encodeURIComponent(a)}/configure`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(l)})).json();if(!$.success)throw new Error($.error||"Save failed");s(),e(),p()}catch(h){showNotification("Error: "+h.message,"error")}finally{w.textContent="Save",w.disabled=!1}}),document.addEventListener("health-edit",async a=>{const t=a.detail;r(t,"","",1e4,"200",99.9,5e3)}),document.addEventListener("health-delete",async a=>{const t=a.detail;if(confirm(`Delete health check for "${t}"?`))try{const l=await(await secureFetch(`/api/v1/health-checks/${encodeURIComponent(t)}/configure`,{method:"DELETE"})).json();if(!l.success)throw new Error(l.error);e(),p()}catch(o){showNotification("Error: "+o.message,"error")}}),b?.addEventListener("click",()=>{x?.classList.add("show"),p()}),wireModal(x,j),g?.addEventListener("click",p),document.querySelector('[data-panel="health-incidents"]')?.addEventListener("click",n),document.querySelector('[data-panel="health-config"]')?.addEventListener("click",e)})(),(function(){injectModal("updates-modal",`<div id="updates-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 750px; max-width: 950px;">
<h3>\u2B06\uFE0F Update Management</h3>
<p class="modal-subtitle">
Check for container image updates, apply them, and manage rollbacks.
</p>
<div class="panel-tabs">
<button class="panel-tab active" data-panel="updates-available">Available</button>
<button class="panel-tab" data-panel="updates-history">History</button>
<button class="panel-tab" data-panel="updates-auto">Auto-Update</button>
<button class="panel-tab" data-panel="updates-dashcaddy" id="updates-dashcaddy-tab">DashCaddy</button>
</div>
<!-- Tab: Available Updates -->
<div id="updates-available" class="panel-section active">
<div style="margin-bottom: 12px; display: flex; gap: 8px; align-items: center;">
<button id="updates-check-btn" class="btn-accent-solid">\u{1F50D} Check for Updates</button>
<button id="updates-update-all-btn" style="display: none; padding: 6px 14px; font-size: 0.82rem; background: #f97316; color: #fff; border: 1px solid #f97316; border-radius: 6px; cursor: pointer;">\u2B06\uFE0F Update All</button>
<span id="updates-count-badge" style="display: none; padding: 4px 10px; border-radius: 12px; font-size: 0.78rem; font-weight: 600; background: var(--accent); color: var(--bg);"></span>
</div>
<div id="updates-available-container" style="max-height: 450px; overflow-y: auto;">
<div class="panel-empty"><span class="empty-icon">\u{1F4E6}</span> Click "Check for Updates" to scan containers.</div>
</div>
</div>
<!-- Tab: History -->
<div id="updates-history" class="panel-section">
<div id="updates-history-container" class="scroll-container">
<div class="panel-empty"><span class="brand-spinner"></span> Loading update history...</div>
</div>
</div>
<!-- Tab: Auto-Update -->
<div id="updates-auto" class="panel-section">
<div id="updates-auto-container" class="scroll-container">
<div class="panel-empty"><span class="empty-icon">\u{1F916}</span> Loading auto-update configuration...</div>
</div>
</div>
<!-- Tab: DashCaddy Self-Update -->
<div id="updates-dashcaddy" class="panel-section">
<div id="dashcaddy-version-info" style="display: flex; align-items: center; gap: 16px; margin-bottom: 16px; padding: 12px; border-radius: 8px; background: var(--bg);">
<div style="flex: 1;">
<div style="font-weight: 600; font-size: 1rem;">DashCaddy</div>
<div id="dashcaddy-current-version" style="color: var(--muted); font-size: 0.85rem;">Loading...</div>
</div>
<div id="dashcaddy-update-badge" style="display: none; padding: 4px 12px; border-radius: 12px; font-size: 0.78rem; font-weight: 600; background: var(--accent); color: var(--bg);">Update available</div>
</div>
<div id="dashcaddy-update-details" style="display: none; margin-bottom: 16px; padding: 12px; border-radius: 8px; border: 1px solid var(--border);">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 8px;">
<span style="font-weight: 600;">New version: <span id="dashcaddy-new-version"></span></span>
<button id="dashcaddy-apply-btn" class="btn-accent-solid" style="padding: 6px 16px; font-size: 0.85rem;">Update Now</button>
</div>
<div id="dashcaddy-changelog" style="font-size: 0.8rem; color: var(--muted); max-height: 120px; overflow-y: auto; white-space: pre-wrap; font-family: var(--font-mono); line-height: 1.5;"></div>
</div>
<div id="dashcaddy-status-bar" style="display: none; margin-bottom: 16px; padding: 10px 12px; border-radius: 8px; font-size: 0.85rem;"></div>
<div style="margin-bottom: 12px;">
<button id="dashcaddy-check-btn" style="padding: 6px 14px; font-size: 0.82rem;">Check for Updates</button>
<button id="dashcaddy-rollback-btn" style="padding: 6px 14px; font-size: 0.82rem; margin-left: 6px;">Rollback</button>
</div>
<div id="dashcaddy-history-container" style="max-height: 250px; overflow-y: auto;">
<div class="panel-empty"><span class="empty-icon">\u{1F4E6}</span>No self-update history.</div>
</div>
</div>
<div class="panel-bottom-bar">
<span id="updates-last-check" class="text-auto-right"></span>
</div>
<div class="weather-modal-buttons modal-footer-bar">
<button id="updates-cancel">Close</button>
</div>
</div>
</div>`);const x=document.getElementById("updates-modal"),b=document.getElementById("updates-btn"),j=document.getElementById("updates-cancel"),g=document.getElementById("updates-check-btn"),N=document.getElementById("updates-available-container"),A=document.getElementById("updates-history-container"),D=document.getElementById("updates-auto-container"),R=document.getElementById("updates-last-check");async function f(){try{const n=await(await fetch("/api/v1/updates/available")).json();if(!n.success)throw new Error(n.error);const e=n.updates||[];if(e.length===0){N.innerHTML='<div class="panel-empty"><span class="empty-icon">\u2705</span>All containers are up to date.</div>',R.textContent="",document.getElementById("updates-update-all-btn").style.display="none",document.getElementById("updates-count-badge").style.display="none",window._pendingUpdates=[];return}let r='<table style="width: 100%; border-collapse: collapse; font-size: 0.85rem;">';r+='<tr style="border-bottom: 1px solid var(--border); color: var(--muted);"><th style="padding: 8px; text-align: left;">Container</th><th style="padding: 8px; text-align: left;">Image</th><th style="padding: 8px; text-align: left;">Current</th><th style="padding: 8px; text-align: left;">Latest</th><th style="padding: 8px; text-align: right;">Actions</th></tr>';for(const t of e){const o=(()=>{const l=window.APPS||[];for(const h of l)if(h.containerId===t.containerId||h.name===t.containerName||h.id===t.containerName)return h.id;return t.containerName})();r+=`<tr data-app-id="${escapeHtml(o)}" style="border-bottom: 1px solid var(--border);">`,r+=`<td style="padding: 8px; font-weight: 500;">${escapeHtml(t.containerName)}</td>`,r+=`<td style="padding: 8px; color: var(--muted);">${escapeHtml(t.imageName)}</td>`,r+=`<td style="padding: 8px;"><code style="font-size: 0.78rem; background: var(--bg); padding: 2px 6px; border-radius: 4px;">${escapeHtml(t.currentDigest)}</code></td>`,r+=`<td style="padding: 8px;"><code style="font-size: 0.78rem; background: var(--ok-bg); color: var(--ok-fg); padding: 2px 6px; border-radius: 4px;">${escapeHtml(t.latestDigest)}</code></td>`,r+='<td style="padding: 8px; text-align: right;">',r+=`<button class="update-now-btn" data-id="${escapeHtml(t.containerId)}" data-name="${escapeHtml(t.containerName)}" style="padding: 4px 10px; font-size: 0.78rem; background: var(--accent); color: var(--bg); border-color: var(--accent); margin-right: 4px;">Update</button>`,r+=`<button class="rollback-btn" data-id="${escapeHtml(t.containerId)}" data-name="${escapeHtml(t.containerName)}" style="padding: 4px 10px; font-size: 0.78rem;">Rollback</button>`,r+="</td></tr>"}r+="</table>",N.innerHTML=r,R.textContent=e.length+" update(s) available";const s=document.getElementById("updates-count-badge"),a=document.getElementById("updates-update-all-btn");s&&(s.textContent=e.length+" pending",s.style.display=""),a&&e.length>0&&(a.style.display=""),window._pendingUpdates=e,N.querySelectorAll(".update-now-btn").forEach(t=>{t.addEventListener("click",async()=>{const o=t.dataset.id,l=t.dataset.name;if(confirm(`Update "${l}" to the latest version? The container will restart.`)){t.textContent="Updating...",t.disabled=!0;try{const $=await(await secureFetch(`/api/v1/updates/update/${encodeURIComponent(o)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoRollback:!0})})).json();if($.success)t.textContent="Done!",t.style.background="var(--ok-fg)",setTimeout(()=>f(),2e3);else throw new Error($.error||"Update failed")}catch(h){t.textContent="Failed",t.style.color="var(--bad-fg)",showNotification("Update error: "+h.message,"error"),setTimeout(()=>{t.textContent="Update",t.disabled=!1,t.style.color="",t.style.background=""},3e3)}}})}),N.querySelectorAll(".rollback-btn").forEach(t=>{t.addEventListener("click",async()=>{const o=t.dataset.id,l=t.dataset.name;if(confirm(`Rollback "${l}" to its previous version?`)){t.textContent="Rolling back...",t.disabled=!0;try{const $=await(await secureFetch(`/api/v1/updates/rollback/${encodeURIComponent(o)}`,{method:"POST"})).json();if($.success)t.textContent="Rolled back!",setTimeout(()=>f(),2e3);else throw new Error($.error||"Rollback failed")}catch(h){t.textContent="Failed",showNotification("Rollback error: "+h.message,"error"),setTimeout(()=>{t.textContent="Rollback",t.disabled=!1},3e3)}}})})}catch(p){N.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(p.message)}</div>`}}async function C(){const p=window._pendingUpdates||[];if(!p.length)return;const n=document.getElementById("updates-update-all-btn");if(!confirm(`Update all ${p.length} containers? Each will restart.`))return;n.textContent="\u23F3 Updating...",n.disabled=!0;let e=0,r=0;for(const s of p)try{(await(await secureFetch(`/api/v1/updates/update/${encodeURIComponent(s.containerId)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoRollback:!0})})).json()).success?e++:r++}catch{r++}n.textContent="\u2705 Done",showNotification(`Update all: ${e} succeeded, ${r} failed.`,e>0&&r===0?"success":"error"),setTimeout(()=>{n.textContent="\u2B06\uFE0F Update All",n.disabled=!1,f()},3e3)}document.getElementById("updates-update-all-btn")?.addEventListener("click",C);async function E(){g.textContent="\u{1F50D} Checking...",g.disabled=!0;try{const n=await(await secureFetch("/api/v1/updates/check",{method:"POST"})).json();if(!n.success)throw new Error(n.error);g.textContent="\u2705 Done!",await f()}catch(p){g.textContent="\u274C Failed",showNotification("Check error: "+p.message,"error")}setTimeout(()=>{g.textContent="\u{1F50D} Check for Updates",g.disabled=!1},3e3)}async function M(){try{A.innerHTML='<div class="panel-empty"><span class="brand-spinner"></span> Loading...</div>';const n=await(await fetch("/api/v1/updates/history?limit=50")).json(),e=n.success&&n.history?n.history:[];if(e.length===0){A.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F4CB}</span>No update history yet.</div>';return}let r='<table style="width: 100%; border-collapse: collapse; font-size: 0.82rem;">';r+='<tr style="border-bottom: 1px solid var(--border); color: var(--muted);"><th style="padding: 6px; text-align: left;">When</th><th style="padding: 6px; text-align: left;">Container</th><th style="padding: 6px; text-align: left;">Image</th><th style="padding: 6px; text-align: left;">Duration</th><th style="padding: 6px; text-align: left;">Status</th></tr>';for(const s of e){const a=s.status==="success",t=s.duration?s.duration<1e3?s.duration+"ms":Math.round(s.duration/1e3)+"s":"-";r+='<tr style="border-bottom: 1px solid var(--border);">',r+=`<td style="padding: 6px; color: var(--muted);">${timeAgo(s.timestamp)}</td>`,r+=`<td style="padding: 6px; font-weight: 500;">${escapeHtml(s.containerName)}</td>`,r+=`<td style="padding: 6px; color: var(--muted);">${escapeHtml(s.imageName)}</td>`,r+=`<td style="padding: 6px;">${t}</td>`,r+=`<td style="padding: 6px;"><span style="color: ${a?"var(--ok-fg)":"var(--bad-fg)"};">${a?"\u2713 success":"\u2717 failed"}</span></td>`,r+="</tr>",!a&&s.error&&(r+=`<tr><td colspan="5" style="padding: 4px 6px 8px; font-size: 0.78rem; color: var(--bad-fg);">${escapeHtml(s.error)}</td></tr>`)}r+="</table>",A.innerHTML=r}catch(p){A.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(p.message)}</div>`}}async function w(){try{D.innerHTML='<div class="panel-empty"><span class="brand-spinner"></span> Loading...</div>';const[p,n]=await Promise.all([fetch("/api/v1/stats/containers"),fetch("/api/v1/updates/auto-update")]),e=await p.json(),r=await n.json(),s=e.success&&e.stats?e.stats:[],a=r.success&&r.config?r.config:{};if(s.length===0){D.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F916}</span>No running containers found.</div>';return}let t='<div style="margin-bottom: 12px; font-size: 0.8rem; color: var(--muted);">Auto-updates run during maintenance window (default 2AM-4AM). Daily = every day, Weekly = Sundays, Monthly = 1st of month.</div>';t+='<table style="width: 100%; border-collapse: collapse; font-size: 0.85rem;">',t+='<tr style="border-bottom: 1px solid var(--border); color: var(--muted);"><th style="padding: 8px; text-align: left;">Container</th><th style="padding: 8px; text-align: left;">Schedule</th><th style="padding: 8px; text-align: left;">Window</th><th style="padding: 8px; text-align: left;">Rollback</th><th style="padding: 8px; text-align: left;">Last Run</th><th style="padding: 8px; text-align: right;">Actions</th></tr>';for(const o of s){const l=o.name||o.Names?.[0]?.replace(/^\//,"")||o.Id?.substring(0,12),h=o.containerId||o.Id,$=a[h]||{},U=$.enabled?$.schedule||"weekly":"",F=$.autoRollback!==!1,_=$.maintenanceWindow||"",J=$.lastAutoUpdate?timeAgo($.lastAutoUpdate):"Never";t+=`<tr style="border-bottom: 1px solid var(--border);" data-container-id="${escapeHtml(h)}">`,t+=`<td style="padding: 8px; font-weight: 500;">${escapeHtml(l)}</td>`,t+=`<td style="padding: 8px;">
<select class="auto-schedule" data-id="${escapeHtml(h)}" style="padding: 4px 8px; border-radius: 4px; border: 1px solid var(--border); background: var(--bg); color: var(--fg); font-size: 0.82rem;">
<option value=""${U?"":" selected"}>Disabled</option>
<option value="daily"${U==="daily"?" selected":""}>Daily</option>
<option value="weekly"${U==="weekly"?" selected":""}>Weekly</option>
<option value="monthly"${U==="monthly"?" selected":""}>Monthly</option>
</select></td>`,t+=`<td style="padding: 8px;"><input type="text" class="auto-window" data-id="${escapeHtml(h)}" value="${escapeHtml(_)}" placeholder="02:00-04:00" style="width: 90px; padding: 3px 6px; font-size: 0.78rem; border: 1px solid var(--border); border-radius: 4px; background: var(--bg); color: var(--fg);" /></td>`,t+=`<td style="padding: 8px;"><input type="checkbox" class="auto-rollback" data-id="${escapeHtml(h)}"${F?" checked":""} /></td>`,t+=`<td style="padding: 8px; font-size: 0.78rem; color: var(--muted);">${J}</td>`,t+=`<td style="padding: 8px; text-align: right;"><button class="save-auto-btn" data-id="${escapeHtml(h)}" data-name="${escapeHtml(l)}" style="padding: 4px 10px; font-size: 0.78rem;">Save</button></td>`,t+="</tr>"}t+="</table>",D.innerHTML=t,D.querySelectorAll(".save-auto-btn").forEach(o=>{o.addEventListener("click",async()=>{const l=o.dataset.id,h=o.closest("tr"),$=h.querySelector(".auto-schedule").value,U=h.querySelector(".auto-rollback").checked,F=h.querySelector(".auto-window").value.trim();o.textContent="Saving...",o.disabled=!0;try{const J=await(await secureFetch(`/api/v1/updates/auto-update/${encodeURIComponent(l)}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:!!$,schedule:$||"weekly",autoRollback:U,maintenanceWindow:F||void 0})})).json();if(J.success)o.textContent="\u2713 Saved";else throw new Error(J.error)}catch(_){o.textContent="\u2717 Error",showNotification("Save error: "+_.message,"error")}setTimeout(()=>{o.textContent="Save",o.disabled=!1},2e3)})})}catch(p){D.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(p.message)}</div>`}}const z=document.getElementById("dashcaddy-current-version"),S=document.getElementById("dashcaddy-update-badge"),T=document.getElementById("dashcaddy-update-details"),P=document.getElementById("dashcaddy-new-version"),v=document.getElementById("dashcaddy-changelog"),B=document.getElementById("dashcaddy-apply-btn"),H=document.getElementById("dashcaddy-check-btn"),O=document.getElementById("dashcaddy-rollback-btn"),u=document.getElementById("dashcaddy-status-bar"),m=document.getElementById("dashcaddy-history-container");let L=null;function k(p,n){u&&(u.style.display="block",u.style.background=n==="error"?"var(--bad-bg)":n==="success"?"var(--ok-bg)":"var(--bg)",u.style.color=n==="error"?"var(--bad-fg)":n==="success"?"var(--ok-fg)":"var(--fg)",u.textContent=p)}async function I(){try{const n=await(await fetch("/api/v1/system/version")).json();if(n.success){const e=n.commit&&n.commit!=="unknown"?n.commit:null;z.textContent="v"+n.version+(e?" ("+e.substring(0,7)+")":"")}}catch{z.textContent="Unable to fetch version"}}async function i(p){p||(H.textContent="Checking...",H.disabled=!0);try{const e=await(await fetch("/api/v1/system/update-check")).json();if(L=e,e.success&&e.available&&e.remote){S.style.display="",T.style.display="",P.textContent="v"+e.remote.version,v.textContent=e.remote.changelog||"No changelog available.";const r=document.getElementById("updates-btn");if(r&&!r.querySelector(".update-dot")){const a=document.createElement("span");a.className="update-dot",a.style.cssText="position:absolute;top:2px;right:2px;width:8px;height:8px;border-radius:50%;background:var(--accent);",r.style.position="relative",r.appendChild(a)}const s=document.getElementById("updates-dashcaddy-tab");if(s&&!s.querySelector(".update-dot")){const a=document.createElement("span");a.className="update-dot",a.style.cssText="display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--accent);margin-left:4px;vertical-align:middle;",s.appendChild(a)}}else S.style.display="none",T.style.display="none",await I(),p||k("You are running the latest version.","success");p||(H.textContent="Check for Updates",H.disabled=!1)}catch(n){p||(k("Failed to check: "+n.message,"error"),H.textContent="Check for Updates",H.disabled=!1)}}async function c(){if(!confirm("Apply DashCaddy update? The API container will restart."))return!1;B.textContent="Updating...",B.disabled=!0,k("Downloading and applying update...","info");try{const n=await(await secureFetch("/api/v1/system/update-apply",{method:"POST"})).json();if(n.success)return k("Update initiated: v"+(n.fromVersion||"?")+" \u2192 v"+(n.toVersion||"?")+". The container will restart shortly.","success"),B.textContent="Applied!",document.querySelectorAll(".update-dot").forEach(e=>e.remove()),!0;throw new Error(n.error||"Update failed")}catch(p){throw k("Update failed: "+p.message,"error"),B.textContent="Update Now",B.disabled=!1,p}}async function d(){try{const n=await(await fetch("/api/v1/system/update-history")).json(),e=n.success&&n.history?n.history:[];if(e.length===0){m.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F4E6}</span>No self-update history.</div>';return}let r='<table style="width: 100%; border-collapse: collapse; font-size: 0.82rem;">';r+='<tr style="border-bottom: 1px solid var(--border); color: var(--muted);"><th style="padding: 6px; text-align: left;">When</th><th style="padding: 6px; text-align: left;">Version</th><th style="padding: 6px; text-align: left;">From</th><th style="padding: 6px; text-align: left;">Status</th></tr>';for(const s of e){const a=s.status==="success"?"\u2713 success":s.status==="pending"?"\u23F3 pending":s.status==="partial"?"\u26A0 partial":"\u2717 "+s.status,t=s.status==="success"?"var(--ok-fg)":s.status==="pending"?"var(--muted)":"var(--bad-fg)";r+='<tr style="border-bottom: 1px solid var(--border);">',r+='<td style="padding: 6px; color: var(--muted);">'+timeAgo(s.timestamp)+"</td>",r+='<td style="padding: 6px; font-weight: 500;">v'+escapeHtml(s.version)+(s.rollback?" (rollback)":"")+"</td>",r+='<td style="padding: 6px; color: var(--muted);">v'+escapeHtml(s.fromVersion||"?")+"</td>",r+='<td style="padding: 6px;"><span style="color: '+t+';">'+a+"</span></td>",r+="</tr>",s.error&&(r+='<tr><td colspan="4" style="padding: 4px 6px 8px; font-size: 0.78rem; color: var(--bad-fg);">'+escapeHtml(s.error)+"</td></tr>"),s.note&&(r+='<tr><td colspan="4" style="padding: 4px 6px 8px; font-size: 0.78rem; color: var(--muted);">'+escapeHtml(s.note)+"</td></tr>")}r+="</table>",m.innerHTML=r}catch(p){m.innerHTML='<div class="panel-empty" style="color: var(--bad-fg);">Failed: '+escapeHtml(p.message)+"</div>"}}async function y(){try{const n=await(await fetch("/api/v1/system/rollback-versions")).json(),e=n.success&&n.versions?n.versions:[];if(e.length===0){showNotification("No rollback versions available.","info");return}const r=prompt(`Available rollback versions:
`+e.join(`
`)+`
Enter version to rollback to:`);if(!r)return;if(!e.includes(r)){showNotification("Invalid version: "+r,"error");return}if(!confirm("Rollback DashCaddy to v"+r+"? The container will restart."))return;k("Rolling back to v"+r+"...","info");const a=await(await secureFetch("/api/v1/system/rollback",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({version:r})})).json();if(a.success)k("Rollback to v"+r+" initiated. Container will restart.","success");else throw new Error(a.error||"Rollback failed")}catch(p){k("Rollback failed: "+p.message,"error")}}H?.addEventListener("click",()=>i(!1)),B?.addEventListener("click",()=>c().catch(()=>{})),O?.addEventListener("click",y),g?.addEventListener("click",E),b?.addEventListener("click",()=>{x?.classList.add("show"),f()}),wireModal(x,j),window.openUpdateModal=function(p){x?.classList.add("show"),f().then(()=>{if(!p)return;const n=N.querySelector(`[data-app-id="${p}"]`);n&&(n.scrollIntoView({behavior:"smooth",block:"center"}),n.style.background="rgba(249,115,22,0.15)",setTimeout(()=>{n.style.background=""},3e3))})},document.querySelector('[data-panel="updates-history"]')?.addEventListener("click",M),document.querySelector('[data-panel="updates-auto"]')?.addEventListener("click",w),document.querySelector('[data-panel="updates-dashcaddy"]')?.addEventListener("click",()=>{I(),d(),L||i(!0)}),window.dcApplyUpdate=c,window.dcCheckForUpdate=i,setTimeout(()=>i(!0),5e3)})(),(function(){injectModal("docker-resources-modal",`<div id="docker-resources-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 750px; max-width: 950px;">
<h3>\u{1F433} Docker Resources</h3>
<p class="modal-subtitle">Manage volumes, networks, and view disk usage.</p>
<div class="panel-tabs">
<button class="panel-tab active" data-panel="dr-volumes">Volumes</button>
<button class="panel-tab" data-panel="dr-networks">Networks</button>
<button class="panel-tab" data-panel="dr-disk">Disk Usage</button>
</div>
<!-- Volumes -->
<div id="dr-volumes" class="panel-section active">
<div style="display: flex; gap: 8px; margin-bottom: 12px;">
<input type="text" id="dr-vol-name" placeholder="Volume name" style="flex: 1; padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg);" />
<button id="dr-vol-create" class="btn-accent-solid" style="padding: 6px 14px; font-size: 0.82rem;">Create</button>
</div>
<div id="dr-vol-list" class="scroll-container" style="max-height: 400px;">
<div class="panel-empty"><span class="brand-spinner"></span> Loading...</div>
</div>
</div>
<!-- Networks -->
<div id="dr-networks" class="panel-section">
<div style="display: flex; gap: 8px; margin-bottom: 12px;">
<input type="text" id="dr-net-name" placeholder="Network name" style="flex: 1; padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg);" />
<select id="dr-net-driver" style="padding: 6px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg);">
<option value="bridge">bridge</option>
<option value="overlay">overlay</option>
<option value="host">host</option>
</select>
<button id="dr-net-create" class="btn-accent-solid" style="padding: 6px 14px; font-size: 0.82rem;">Create</button>
</div>
<div id="dr-net-list" class="scroll-container" style="max-height: 400px;">
<div class="panel-empty"><span class="brand-spinner"></span> Loading...</div>
</div>
</div>
<!-- Disk Usage -->
<div id="dr-disk" class="panel-section">
<div id="dr-disk-content">
<div class="panel-empty"><span class="brand-spinner"></span> Loading...</div>
</div>
</div>
<div class="weather-modal-buttons modal-footer-bar">
<button id="dr-close">Close</button>
</div>
</div>
</div>`);const x=document.getElementById("docker-resources-modal"),b=document.getElementById("docker-resources-btn"),j=document.getElementById("dr-close");function g(R){if(!R||R===0)return"0 B";const f=["B","KB","MB","GB","TB"],C=Math.floor(Math.log(Math.abs(R))/Math.log(1024));return(R/Math.pow(1024,C)).toFixed(1)+" "+f[C]}async function N(){const R=document.getElementById("dr-vol-list");try{const C=(await getJSON("/api/v1/docker/volumes")).volumes||[];if(C.length===0){R.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F4E6}</span>No volumes found.</div>';return}let E='<table style="width: 100%; border-collapse: collapse; font-size: 0.82rem;">';E+='<tr style="border-bottom: 1px solid var(--border); color: var(--muted);"><th style="padding: 6px; text-align: left;">Name</th><th style="padding: 6px;">Driver</th><th style="padding: 6px;">Scope</th><th style="padding: 6px; text-align: right;">Actions</th></tr>';for(const M of C){const w=M.name==="buildkit"||M.name.length===64;E+='<tr style="border-bottom: 1px solid var(--border);">',E+=`<td style="padding: 6px; font-weight: 500; max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;" title="${escapeHtml(M.name)}">${escapeHtml(M.name.length>40?M.name.substring(0,37)+"...":M.name)}</td>`,E+=`<td style="padding: 6px; text-align: center; color: var(--muted);">${escapeHtml(M.driver)}</td>`,E+=`<td style="padding: 6px; text-align: center; color: var(--muted);">${escapeHtml(M.scope)}</td>`,E+='<td style="padding: 6px; text-align: right;">',w||(E+=`<button class="dr-vol-del" data-name="${escapeHtml(M.name)}" style="padding: 3px 8px; font-size: 0.75rem; color: var(--bad-fg);">Delete</button>`),E+="</td></tr>"}E+="</table>",R.innerHTML=E,R.querySelectorAll(".dr-vol-del").forEach(M=>{M.addEventListener("click",async()=>{if(confirm(`Delete volume "${M.dataset.name}"? Data will be lost.`)){M.textContent="...",M.disabled=!0;try{await deleteAPI(`/api/v1/docker/volumes/${encodeURIComponent(M.dataset.name)}?force=true`),N()}catch(w){showNotification("Delete failed: "+w.message,"error"),M.textContent="Delete",M.disabled=!1}}})})}catch(f){R.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(f.message)}</div>`}}document.getElementById("dr-vol-create")?.addEventListener("click",async()=>{const R=document.getElementById("dr-vol-name"),f=R.value.trim();if(!f){showNotification("Enter a volume name","warning");return}try{await postJSON("/api/v1/docker/volumes",{name:f}),R.value="",showNotification(`Volume "${f}" created`,"success"),N()}catch(C){showNotification("Create failed: "+C.message,"error")}});async function A(){const R=document.getElementById("dr-net-list");try{const C=(await getJSON("/api/v1/docker/networks")).networks||[];if(C.length===0){R.innerHTML='<div class="panel-empty"><span class="empty-icon">\u{1F310}</span>No networks found.</div>';return}let E='<table style="width: 100%; border-collapse: collapse; font-size: 0.82rem;">';E+='<tr style="border-bottom: 1px solid var(--border); color: var(--muted);"><th style="padding: 6px; text-align: left;">Name</th><th style="padding: 6px;">Driver</th><th style="padding: 6px;">Scope</th><th style="padding: 6px;">Containers</th><th style="padding: 6px; text-align: right;">Actions</th></tr>';for(const M of C){const w=["bridge","host","none"].includes(M.name);E+='<tr style="border-bottom: 1px solid var(--border);">',E+=`<td style="padding: 6px; font-weight: 500;">${escapeHtml(M.name)}</td>`,E+=`<td style="padding: 6px; text-align: center; color: var(--muted);">${escapeHtml(M.driver)}</td>`,E+=`<td style="padding: 6px; text-align: center; color: var(--muted);">${escapeHtml(M.scope)}</td>`,E+=`<td style="padding: 6px; text-align: center;">${M.containers}</td>`,E+='<td style="padding: 6px; text-align: right;">',w||(E+=`<button class="dr-net-del" data-id="${escapeHtml(M.id)}" data-name="${escapeHtml(M.name)}" style="padding: 3px 8px; font-size: 0.75rem; color: var(--bad-fg);">Delete</button>`),E+="</td></tr>"}E+="</table>",R.innerHTML=E,R.querySelectorAll(".dr-net-del").forEach(M=>{M.addEventListener("click",async()=>{if(confirm(`Delete network "${M.dataset.name}"?`)){M.textContent="...",M.disabled=!0;try{await deleteAPI(`/api/v1/docker/networks/${encodeURIComponent(M.dataset.id)}`),A()}catch(w){showNotification("Delete failed: "+w.message,"error"),M.textContent="Delete",M.disabled=!1}}})})}catch(f){R.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(f.message)}</div>`}}document.getElementById("dr-net-create")?.addEventListener("click",async()=>{const R=document.getElementById("dr-net-name"),f=document.getElementById("dr-net-driver"),C=R.value.trim();if(!C){showNotification("Enter a network name","warning");return}try{await postJSON("/api/v1/docker/networks",{name:C,driver:f.value}),R.value="",showNotification(`Network "${C}" created`,"success"),A()}catch(E){showNotification("Create failed: "+E.message,"error")}});async function D(){const R=document.getElementById("dr-disk-content");try{const f=await getJSON("/api/v1/docker/disk-usage"),C=[{label:"Images",icon:"\u{1F4C0}",count:f.images.count,size:f.images.size,reclaimable:f.images.reclaimable},{label:"Containers",icon:"\u{1F4E6}",count:f.containers.count,size:f.containers.size,extra:`${f.containers.running} running`},{label:"Volumes",icon:"\u{1F4BE}",count:f.volumes.count,size:f.volumes.size,reclaimable:f.volumes.reclaimable},{label:"Build Cache",icon:"\u{1F527}",count:f.buildCache.count,size:f.buildCache.size,reclaimable:f.buildCache.reclaimable}];let E=`<div style="font-size: 1.1rem; font-weight: 600; margin-bottom: 16px;">Total: ${g(f.totalSize)}</div>`;E+='<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 12px;">';for(const M of C)E+='<div style="padding: 14px; background: var(--bg); border-radius: 8px; border: 1px solid var(--border);">',E+=`<div style="font-weight: 600; margin-bottom: 6px;">${M.icon} ${M.label} <span style="color: var(--muted); font-weight: 400; font-size: 0.82rem;">(${M.count})</span></div>`,E+=`<div style="font-size: 1.1rem; font-weight: 600; color: var(--accent);">${g(M.size)}</div>`,M.reclaimable>0&&(E+=`<div style="font-size: 0.78rem; color: var(--muted);">Reclaimable: ${g(M.reclaimable)}</div>`),M.extra&&(E+=`<div style="font-size: 0.78rem; color: var(--muted);">${M.extra}</div>`),E+="</div>";E+="</div>",R.innerHTML=E}catch(f){R.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(f.message)}</div>`}}b?.addEventListener("click",()=>{x?.classList.add("show"),N()}),wireModal(x,j),document.querySelector('[data-panel="dr-networks"]')?.addEventListener("click",A),document.querySelector('[data-panel="dr-disk"]')?.addEventListener("click",D)})(),(function(){injectModal("compose-import-modal",`<div id="compose-import-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 650px; max-width: 800px;">
<h3>\u{1F4E6} Import Docker Compose</h3>
<p class="modal-subtitle">Paste a docker-compose.yml to import and deploy services.</p>
<!-- Step 1: Paste YAML -->
<div id="compose-step-paste">
<div style="margin-bottom: 12px;">
<label class="form-label-accent-sm">Stack Name</label>
<input type="text" id="compose-stack-name" placeholder="my-stack" value="" style="width: 100%; padding: 8px 10px; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg);" />
</div>
<div style="margin-bottom: 12px;">
<label class="form-label-accent-sm">docker-compose.yml</label>
<textarea id="compose-yaml" rows="14" placeholder="version: '3'&#10;services:&#10; web:&#10; image: nginx:latest&#10; ports:&#10; - '8080:80'" style="width: 100%; padding: 10px; font-family: monospace; font-size: 0.82rem; border: 1px solid var(--border); border-radius: 6px; background: var(--bg); color: var(--fg); resize: vertical;"></textarea>
<div style="margin-top: 6px;">
<label style="display: inline-flex; align-items: center; gap: 6px; cursor: pointer; font-size: 0.82rem; color: var(--muted);">
<input type="file" id="compose-file-upload" accept=".yml,.yaml" style="display: none;" />
<span style="text-decoration: underline;">or upload a file</span>
</label>
</div>
</div>
<div class="weather-modal-buttons modal-footer-bar">
<button id="compose-parse-btn" class="btn-accent-solid" style="padding: 8px 20px;">Parse & Preview</button>
<button id="compose-cancel">Cancel</button>
</div>
</div>
<!-- Step 2: Preview -->
<div id="compose-step-preview" style="display: none;">
<div id="compose-preview-content"></div>
<div class="weather-modal-buttons modal-footer-bar" style="margin-top: 16px;">
<button id="compose-deploy-btn" class="btn-accent-solid" style="padding: 8px 20px;">Deploy All</button>
<button id="compose-back-btn">Back</button>
</div>
</div>
<!-- Step 3: Progress -->
<div id="compose-step-progress" style="display: none;">
<div id="compose-progress-content"></div>
</div>
</div>
</div>`);const x=document.getElementById("compose-import-modal"),b=document.getElementById("compose-import-btn"),j=document.getElementById("compose-cancel");wireModal(x,j);let g=null;function N(D){document.getElementById("compose-step-paste").style.display=D==="paste"?"":"none",document.getElementById("compose-step-preview").style.display=D==="preview"?"":"none",document.getElementById("compose-step-progress").style.display=D==="progress"?"":"none"}b?.addEventListener("click",()=>{N("paste"),g=null,document.getElementById("compose-yaml").value="",document.getElementById("compose-stack-name").value="",x?.classList.add("show")}),document.getElementById("compose-file-upload")?.addEventListener("change",D=>{const R=D.target.files[0];if(!R)return;const f=new FileReader;f.onload=()=>{document.getElementById("compose-yaml").value=f.result},f.readAsText(R)}),document.getElementById("compose-parse-btn")?.addEventListener("click",async()=>{const D=document.getElementById("compose-yaml").value.trim(),R=document.getElementById("compose-stack-name").value.trim()||"stack";if(!D){showNotification("Paste a docker-compose.yml","warning");return}const f=document.getElementById("compose-parse-btn"),C=f.textContent;f.textContent="Parsing...",f.disabled=!0;try{const E=await postJSON("/api/v1/apps/import-compose",{yaml:D,stackName:R});g=E,g.stackName=R,A(E),N("preview")}catch(E){showNotification("Parse failed: "+E.message,"error")}finally{f.textContent=C,f.disabled=!1}});function A(D){const R=document.getElementById("compose-preview-content");let f="";D.networks&&D.networks.length>0&&(f+=`<div style="margin-bottom: 12px; font-size: 0.82rem; color: var(--muted);">Networks: ${D.networks.map(C=>`<code>${escapeHtml(C)}</code>`).join(", ")}</div>`),D.volumes&&D.volumes.length>0&&(f+=`<div style="margin-bottom: 12px; font-size: 0.82rem; color: var(--muted);">Volumes: ${D.volumes.map(C=>`<code>${escapeHtml(C)}</code>`).join(", ")}</div>`),f+=`<div style="font-weight: 600; margin-bottom: 8px;">${D.services.length} service(s)</div>`,f+='<div class="scroll-container" style="max-height: 350px;">';for(const C of D.services){const E=C.skip?"var(--bad-fg)":"var(--border)";if(f+=`<div style="padding: 10px 14px; border: 1px solid ${E}; border-radius: 8px; margin-bottom: 8px; background: var(--bg);">`,f+=`<div style="font-weight: 600; font-size: 0.9rem;">${escapeHtml(C.name)}`,C.skip&&(f+=` <span style="color: var(--bad-fg); font-weight: 400; font-size: 0.78rem;">\u2014 skipped: ${escapeHtml(C.reason)}</span>`),f+="</div>",!C.skip&&(f+=`<div style="font-size: 0.8rem; color: var(--muted); margin-top: 4px;">Image: <code>${escapeHtml(C.image)}</code></div>`,C.ports?.length&&(f+=`<div style="font-size: 0.8rem; color: var(--muted);">Ports: ${C.ports.map(M=>`${M.host}:${M.container}`).join(", ")}</div>`),C.volumes?.length&&(f+=`<div style="font-size: 0.8rem; color: var(--muted);">Volumes: ${C.volumes.length}</div>`),Object.keys(C.environment||{}).length&&(f+=`<div style="font-size: 0.8rem; color: var(--muted);">Env vars: ${Object.keys(C.environment).length}</div>`),C.envFileWarning&&(f+=`<div style="font-size: 0.78rem; color: var(--bad-fg);">\u26A0 ${escapeHtml(C.envFileWarning)}</div>`),C.resources?.cpus||C.resources?.memory)){const M=[];C.resources.cpus&&M.push(`CPU: ${C.resources.cpus}`),C.resources.memory&&M.push(`Mem: ${C.resources.memory}MB`),f+=`<div style="font-size: 0.8rem; color: var(--muted);">Limits: ${M.join(", ")}</div>`}f+="</div>"}f+="</div>",R.innerHTML=f}document.getElementById("compose-back-btn")?.addEventListener("click",()=>N("paste")),document.getElementById("compose-deploy-btn")?.addEventListener("click",async()=>{if(!g)return;const D=document.getElementById("compose-deploy-btn");D.textContent="Deploying...",D.disabled=!0,N("progress");const R=document.getElementById("compose-progress-content");R.innerHTML='<div class="panel-empty"><span class="brand-spinner"></span> Deploying services...</div>';try{const f=await postJSON("/api/v1/apps/deploy-compose",{services:g.services,networks:g.networks,stackName:g.stackName});let C=`<div style="font-weight: 600; margin-bottom: 12px;">Stack "${escapeHtml(f.stackName)}" \u2014 Deployment Complete</div>`;C+='<div class="scroll-container" style="max-height: 350px;">';for(const E of f.results){const M=E.status==="deployed"||E.status==="created"?"\u2705":E.status==="exists"?"\u26A1":E.status==="skipped"?"\u23ED":"\u274C";C+='<div style="padding: 8px 12px; border-bottom: 1px solid var(--border); font-size: 0.85rem;">',C+=`${M} <strong>${escapeHtml(E.name)}</strong> (${E.type}) \u2014 ${escapeHtml(E.status)}`,E.error&&(C+=` <span style="color: var(--bad-fg);">${escapeHtml(E.error)}</span>`),E.subdomain&&(C+=` \u2192 <code>${escapeHtml(E.subdomain)}</code>`),E.reason&&(C+=` <span style="color: var(--muted);">(${escapeHtml(E.reason)})</span>`),C+="</div>"}C+="</div>",C+='<div class="weather-modal-buttons modal-footer-bar" style="margin-top: 16px;"><button id="compose-done-btn">Done</button></div>',R.innerHTML=C,document.getElementById("compose-done-btn")?.addEventListener("click",()=>{x?.classList.remove("show"),typeof window.loadServices=="function"&&window.loadServices().then(()=>{typeof window.buildGrid=="function"&&window.buildGrid()})}),showNotification(`Stack "${f.stackName}" deployed`,"success")}catch(f){R.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Deployment failed: ${escapeHtml(f.message)}</div>
<div class="weather-modal-buttons modal-footer-bar" style="margin-top: 16px;"><button id="compose-retry-btn">Back</button></div>`,document.getElementById("compose-retry-btn")?.addEventListener("click",()=>N("paste"))}finally{D.textContent="Deploy All",D.disabled=!1}})})(),(function(){injectModal("exec-modal",`<div id="exec-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 700px; max-width: 900px; padding-bottom: 0;">
<h3 id="exec-title">Terminal</h3>
<div id="exec-terminal" style="height: 420px; border-radius: 6px; overflow: hidden; background: #1e1e1e;"></div>
<div class="weather-modal-buttons modal-footer-bar" style="margin-top: 8px; padding-bottom: 12px;">
<button id="exec-close">Close</button>
</div>
</div>
</div>`);const x=document.getElementById("exec-modal"),b=document.getElementById("exec-terminal"),j=document.getElementById("exec-close");let g=null,N=null,A=null;function D(){if(N){try{N.close()}catch{}N=null}if(g){try{g.dispose()}catch{}g=null}A=null,b.innerHTML=""}function R(f,C){if(D(),document.getElementById("exec-title").textContent=`Terminal \u2014 ${C||f}`,x?.classList.add("show"),typeof Terminal>"u"){b.innerHTML='<div style="color: #f44; padding: 20px; font-family: monospace;">xterm.js not loaded</div>';return}g=new Terminal({cursorBlink:!0,fontSize:14,fontFamily:"'Cascadia Code', 'Fira Code', 'Consolas', monospace",theme:{background:"#1e1e1e",foreground:"#d4d4d4",cursor:"#aeafad",selectionBackground:"#264f78"},scrollback:5e3}),typeof FitAddon<"u"&&(A=new FitAddon.FitAddon,g.loadAddon(A)),g.open(b),A&&setTimeout(()=>A.fit(),50);const E=location.protocol==="https:"?"wss:":"ws:";N=new WebSocket(`${E}//${location.host}/ws/exec/${encodeURIComponent(f)}`),N.binaryType="arraybuffer",N.onopen=()=>{if(g.writeln("\x1B[32mConnecting...\x1B[0m"),A){const w=A.proposeDimensions();w&&N.send(JSON.stringify({type:"resize",cols:w.cols,rows:w.rows}))}},N.onmessage=w=>{if(typeof w.data=="string"){try{const z=JSON.parse(w.data);if(z.type==="connected"){g.writeln(`\x1B[32mConnected (${z.shell})\x1B[0m\r
`);return}if(z.type==="error"){g.writeln(`\x1B[31mError: ${z.message}\x1B[0m`);return}if(z.type==="exit"){g.writeln(`\r
\x1B[33mSession ended.\x1B[0m`);return}}catch{}g.write(w.data)}else g.write(new Uint8Array(w.data))},N.onclose=()=>{g&&g.writeln(`\r
\x1B[33mDisconnected.\x1B[0m`)},N.onerror=()=>{g&&g.writeln(`\r
\x1B[31mConnection error.\x1B[0m`)},g.onData(w=>{N&&N.readyState===WebSocket.OPEN&&N.send(w)}),g.onResize(({cols:w,rows:z})=>{N&&N.readyState===WebSocket.OPEN&&N.send(JSON.stringify({type:"resize",cols:w,rows:z}))});const M=()=>{A&&A.fit()};window.addEventListener("resize",M),x._resizeHandler=M}j?.addEventListener("click",()=>{D(),x._resizeHandler&&window.removeEventListener("resize",x._resizeHandler),x?.classList.remove("show")}),x?.addEventListener("click",f=>{f.target===x&&(D(),x._resizeHandler&&window.removeEventListener("resize",x._resizeHandler),x?.classList.remove("show"))}),window.openExecModal=R})(),(function(){injectModal("audit-modal",`<div id="audit-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 950px; max-width: 1150px;">
<h3>\u{1F4DC} Audit Log</h3>
<p class="modal-subtitle">
Track all actions performed through the API.
</p>
<div style="display: flex; gap: 12px; margin-bottom: 12px; align-items: center; flex-wrap: wrap;">
<label class="text-muted-sm">Category:</label>
<select id="audit-filter" style="padding: 6px 10px; border-radius: 6px; border: 1px solid var(--border); background: var(--bg); color: var(--fg); font-size: 0.85rem;">
<option value="">All</option>
<option value="service">Services</option>
<option value="container">Containers</option>
<option value="caddy">Caddy</option>
<option value="dns">DNS</option>
<option value="backup">Backups</option>
<option value="config">Config</option>
<option value="auth">Auth</option>
</select>
<label class="text-muted-sm">Result:</label>
<select id="audit-outcome-filter" style="padding: 6px 10px; border-radius: 6px; border: 1px solid var(--border); background: var(--bg); color: var(--fg); font-size: 0.85rem;">
<option value="">Any</option>
<option value="success">\u2713 Success</option>
<option value="failure">\u2717 Failure</option>
</select>
<label class="text-muted-sm" style="margin-left: 8px;">Since:</label>
<input id="audit-since" type="datetime-local" style="padding: 5px 8px; border-radius: 6px; border: 1px solid var(--border); background: var(--bg); color: var(--fg); font-size: 0.82rem;">
<label class="text-muted-sm">Until:</label>
<input id="audit-until" type="datetime-local" style="padding: 5px 8px; border-radius: 6px; border: 1px solid var(--border); background: var(--bg); color: var(--fg); font-size: 0.82rem;">
<button id="audit-refresh-btn" class="btn-sm">\u{1F504} Refresh</button>
<span style="flex: 1;"></span>
<button id="audit-clear-btn" style="padding: 6px 12px; font-size: 0.8rem; color: var(--bad-fg); border-color: var(--bad-fg);">\u{1F5D1}\uFE0F Clear Log</button>
</div>
<div id="audit-log-container" class="scroll-container">
<div class="panel-empty"><span class="brand-spinner"></span> Loading audit log...</div>
</div>
<div style="margin-top: 12px; text-align: center;">
<button id="audit-load-more" style="display: none; padding: 6px 16px; font-size: 0.8rem;">Load More</button>
</div>
<div class="weather-modal-buttons modal-footer-bar">
<button id="audit-cancel">Close</button>
</div>
</div>
</div>`);const x=document.getElementById("audit-modal"),b=document.getElementById("audit-log-btn"),j=document.getElementById("audit-cancel"),g=document.getElementById("audit-refresh-btn"),N=document.getElementById("audit-clear-btn"),A=document.getElementById("audit-filter"),D=document.getElementById("audit-outcome-filter"),R=document.getElementById("audit-since"),f=document.getElementById("audit-until"),C=document.getElementById("audit-log-container"),E=document.getElementById("audit-load-more");let M=0,w=null,z=0;const S=50;function T(H){if(!H)return null;const O=new Date(H);return isNaN(O.getTime())?null:O.toISOString()}async function P(H){try{H?(w&&w.abort(),w=new AbortController):(w&&w.abort(),w=new AbortController,M=0,z++,C.innerHTML='<div class="panel-empty"><span class="brand-spinner"></span> Loading...</div>');const O=z,u=new URLSearchParams;u.set("limit",String(S)),u.set("offset",String(M));const m=A.value,L=D.value,k=T(R.value),I=T(f.value);m&&u.set("action",m),L&&u.set("outcome",L),k&&u.set("since",k),I&&u.set("until",I);const i=await fetch("/api/v1/audit-logs?"+u.toString(),{signal:w.signal});if(!i.ok){C.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: HTTP ${i.status}</div>`,E.style.display="none";return}const c=await i.json();if(!c.success){C.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(c.error||"unknown")}</div>`,E.style.display="none";return}if(!H&&O!==z)return;const d=Array.isArray(c.entries)?c.entries:[];if(d.length===0&&!H){const p=c.filters&&(c.filters.action||c.filters.outcome||c.filters.since||c.filters.until)?"No entries match your filters.":"No audit log entries yet. Actions will be logged automatically.";C.innerHTML=`<div class="panel-empty"><span class="empty-icon">\u{1F4DC}</span>${escapeHtml(p)}</div>`,E.style.display="none";return}let y="";H||(y='<table style="width: 100%; border-collapse: collapse; font-size: 0.82rem;">',y+='<tr style="border-bottom: 1px solid var(--border); color: var(--muted);">',y+='<th style="padding: 6px; text-align: left;">When</th>',y+='<th style="padding: 6px; text-align: left;">Actor</th>',y+='<th style="padding: 6px; text-align: left;">IP</th>',y+='<th style="padding: 6px; text-align: left;">Action</th>',y+='<th style="padding: 6px; text-align: left;">Resource</th>',y+='<th style="padding: 6px; text-align: left;">Result</th>',y+="</tr>");for(const p of d){const n=p.outcome==="success",e=v(p);y+='<tr style="border-bottom: 1px solid var(--border); cursor: pointer;" class="audit-row">',y+=`<td style="padding: 6px; color: var(--muted);" title="${escapeHtml(p.timestamp||"")}">${timeAgo(p.timestamp)}</td>`,y+=`<td style="padding: 6px; font-size: 0.78rem;">${e}</td>`,y+=`<td style="padding: 6px; font-family: monospace; font-size: 0.78rem;">${escapeHtml(p.ip||"-")}</td>`,y+=`<td style="padding: 6px; font-weight: 500;">${escapeHtml(p.action||"-")}</td>`,y+=`<td style="padding: 6px;">${escapeHtml(p.resource||"-")}</td>`,y+=`<td style="padding: 6px;"><span style="color: ${n?"var(--ok-fg)":"var(--bad-fg)"};">${n?"\u2713":"\u2717"} ${escapeHtml(p.outcome||"")}</span></td>`,y+="</tr>",p.details&&Object.keys(p.details).length>0&&(y+=`<tr class="audit-detail" style="display: none;"><td colspan="6" style="padding: 6px 6px 10px; font-size: 0.78rem; color: var(--muted);"><pre style="margin: 0; white-space: pre-wrap; font-family: monospace;">${escapeHtml(JSON.stringify(p.details,null,2))}</pre></td></tr>`)}if(!H)y+="</table>",C.innerHTML=y;else{const p=C.querySelector("table");p&&p.insertAdjacentHTML("beforeend",y)}M+=d.length,E.style.display=c.hasMore?"":"none",C.querySelectorAll(".audit-row").forEach(p=>{p.dataset.wired||(p.dataset.wired="true",p.addEventListener("click",()=>{const n=p.nextElementSibling;n&&n.classList.contains("audit-detail")&&(n.style.display=n.style.display==="none"?"":"none")}))})}catch(O){if(O&&O.name==="AbortError")return;C.innerHTML=`<div class="panel-empty" style="color: var(--bad-fg);">Failed: ${escapeHtml(O.message)}</div>`}}function v(H){const O=H.details||{},u=O.userEmail,m=O.userId,L=O.userRole,k=O.viaProvider;if(u){const I=L?` <span style="color: var(--muted); font-size: 0.72rem;">[${escapeHtml(L)}${k?"/"+escapeHtml(k):""}]</span>`:"";return`${escapeHtml(u)}${I}`}return m?`<span style="font-family: monospace; color: var(--muted);">${escapeHtml(m)}</span>`:H.ip?'<span style="color: var(--muted);">anon</span>':'<span style="color: var(--muted);">system</span>'}b?.addEventListener("click",()=>{x?.classList.add("show"),P(!1)}),wireModal(x,j),g?.addEventListener("click",()=>P(!1)),A?.addEventListener("change",()=>P(!1)),D?.addEventListener("change",()=>P(!1));let B;[R,f].forEach(H=>{H?.addEventListener("change",()=>{clearTimeout(B),B=setTimeout(()=>P(!1),250)})}),E?.addEventListener("click",()=>P(!0)),N?.addEventListener("click",async()=>{if(confirm("Clear the entire audit log? This cannot be undone."))try{const O=await(await secureFetch("/api/v1/audit-logs",{method:"DELETE",headers:{"content-type":"application/json"},body:JSON.stringify({confirm:"CLEAR"})})).json();O.success?P(!1):showNotification("Error: "+(O.error||"Clear failed"),"error")}catch(H){showNotification("Error: "+H.message,"error")}})})(),(function(){injectModal("security-modal",`<div id="security-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 980px; max-width: 1280px;">
<h3>\u{1F6E1}\uFE0F Security Center</h3>
<p class="modal-subtitle">
Live events from API, Caddy, fail2ban & shared_bans. Live-tail via SSE.
</p>
<div class="sec-tabs" style="display:flex;gap:8px;margin-bottom:14px;border-bottom:1px solid var(--border);">
<button class="sec-tab active" data-tab="overview">Overview</button>
<button class="sec-tab" data-tab="events">Events</button>
<button class="sec-tab" data-tab="hosts">Hosts</button>
</div>
<!-- OVERVIEW TAB -->
<div class="sec-panel" data-panel="overview">
<div class="sec-stats" id="sec-stats" style="display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;margin-bottom:18px;">
<div class="sec-stat" data-key="total">\u2014 events</div>
<div class="sec-stat" data-key="warn">\u2014 warnings</div>
<div class="sec-stat" data-key="error">\u2014 errors</div>
<div class="sec-stat" data-key="denied">\u2014 denied</div>
<div class="sec-stat" data-key="hosts">\u2014 hosts</div>
</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:14px;">
<div>
<h4 style="margin:8px 0 6px;">Top Actors (24h)</h4>
<div id="sec-top-actors" class="scroll-container" style="max-height:240px;">\u2014</div>
</div>
<div>
<h4 style="margin:8px 0 6px;">Top Targets (24h)</h4>
<div id="sec-top-targets" class="scroll-container" style="max-height:240px;">\u2014</div>
</div>
</div>
</div>
<!-- EVENTS TAB -->
<div class="sec-panel" data-panel="events" style="display:none;">
<div style="display:flex;gap:8px;margin-bottom:12px;align-items:center;flex-wrap:wrap;">
<select id="sec-filter-source" class="sec-filter">
<option value="">All sources</option>
<option value="api">API</option>
<option value="caddy">Caddy</option>
<option value="fail2ban">fail2ban</option>
<option value="shared-bans">shared_bans</option>
<option value="agent">Agent</option>
</select>
<select id="sec-filter-severity" class="sec-filter">
<option value="">All severities</option>
<option value="critical">critical</option>
<option value="error">error</option>
<option value="warn">warn</option>
<option value="notice">notice</option>
<option value="info">info</option>
</select>
<select id="sec-filter-host" class="sec-filter">
<option value="">All hosts</option>
</select>
<input id="sec-filter-actor" class="sec-filter" placeholder="actor (IP or user)" style="padding:6px 10px;">
<button id="sec-refresh-btn" class="btn-sm">\u{1F504} Refresh</button>
<label style="margin-left:auto;display:flex;align-items:center;gap:6px;">
<input type="checkbox" id="sec-live-tail" checked>
<span>Live tail</span>
</label>
</div>
<div id="sec-events-container" class="scroll-container" style="max-height:480px;">Loading\u2026</div>
</div>
<!-- HOSTS TAB -->
<div class="sec-panel" data-panel="hosts" style="display:none;">
<div style="display:flex;gap:8px;margin-bottom:12px;">
<button id="sec-host-register-btn" class="btn-sm">\u2795 Register Host</button>
<button id="sec-hosts-refresh" class="btn-sm">\u{1F504} Refresh</button>
</div>
<div id="sec-hosts-container" class="scroll-container" style="max-height:480px;">Loading\u2026</div>
</div>
<div class="weather-modal-buttons modal-footer-bar">
<button id="sec-cancel">Close</button>
</div>
</div>
</div>`);const x=document.getElementById("security-modal"),b=document.getElementById("security-center-btn"),j=document.getElementById("sec-cancel"),g=x.querySelectorAll(".sec-tab"),N=x.querySelectorAll(".sec-panel");let A=[],D=[],R=null;g.forEach(i=>{i.addEventListener("click",()=>{g.forEach(c=>c.classList.toggle("active",c===i)),N.forEach(c=>c.style.display=c.dataset.panel===i.dataset.tab?"":"none"),i.dataset.tab==="overview"&&M(),i.dataset.tab==="events"&&B(),i.dataset.tab==="hosts"&&m()})}),b&&b.addEventListener("click",()=>{x.classList.add("show"),M(),C()}),j.addEventListener("click",f),x.addEventListener("click",i=>{i.target===x&&f()});function f(){x.classList.remove("show"),E()}function C(){if(E(),!!document.getElementById("sec-live-tail").checked&&!(typeof EventSource>"u"))try{R=new EventSource("/api/v1/security/events/stream"),R.addEventListener("init",i=>{try{A=JSON.parse(i.data).events||[],H()}catch{}}),R.addEventListener("security",i=>{try{const c=JSON.parse(i.data);A.unshift(c),A.length>500&&(A.length=500);const d=x.querySelector(".sec-tab.active")?.dataset?.tab;d==="events"?H():d==="overview"&&M()}catch{}}),R.onerror=()=>{}}catch(i){console.warn("[security] SSE failed:",i.message)}}function E(){if(R){try{R.close()}catch{}R=null}}document.getElementById("sec-live-tail").addEventListener("change",()=>{x.classList.contains("show")&&C()});async function M(){try{const i=new Date(Date.now()-864e5).toISOString(),[c,d,y]=await Promise.all([fetch(`/api/v1/security/events/stats?since=${encodeURIComponent(i)}`),fetch("/api/v1/security/hosts"),fetch(`/api/v1/security/events?limit=1&since=${encodeURIComponent(i)}`)]),p=(await c.json()).data||{},n=(await d.json()).data?.hosts||[],e=(await y.json()).data?.total||0;document.querySelector('#sec-stats [data-key="total"]').textContent=`${e} events (24h)`,document.querySelector('#sec-stats [data-key="warn"]').textContent=`${p.by_severity?.warn||0} warnings`,document.querySelector('#sec-stats [data-key="error"]').textContent=`${p.by_severity?.error||0} errors`,document.querySelector('#sec-stats [data-key="denied"]').textContent=`${p.by_outcome?.denied||0} denied`,document.querySelector('#sec-stats [data-key="hosts"]').textContent=`${n.length} hosts`,w("sec-top-actors",p.top_actors||[]),w("sec-top-targets",p.top_targets||[])}catch(i){console.warn("[security] refreshOverview failed:",i.message)}}function w(i,c){const d=document.getElementById(i);if(!c.length){d.innerHTML='<div class="panel-empty">No data</div>';return}d.innerHTML='<table style="width:100%;font-size:0.85rem;">'+c.map(y=>`<tr><td style="padding:3px 0;word-break:break-all;">${k(String(y.key))}</td><td style="text-align:right;color:var(--muted);">${y.count}</td></tr>`).join("")+"</table>"}const z=document.getElementById("sec-filter-source"),S=document.getElementById("sec-filter-severity"),T=document.getElementById("sec-filter-host"),P=document.getElementById("sec-filter-actor"),v=document.getElementById("sec-refresh-btn");[z,S,T].forEach(i=>i.addEventListener("change",B)),P.addEventListener("input",I(B,250)),v.addEventListener("click",B);async function B(){try{const i=new URLSearchParams;i.set("limit","200"),z.value&&i.set("source_type",z.value),S.value&&i.set("severity",S.value),T.value&&i.set("source_host",T.value),P.value&&i.set("actor_prefix",P.value),A=(await(await fetch(`/api/v1/security/events?${i}`)).json()).data.events||[],H(),(!T.options.length||T.options.length===1)&&await u()}catch(i){document.getElementById("sec-events-container").innerHTML='<div class="panel-empty">Load failed: '+k(i.message)+"</div>"}}function H(){const i=document.getElementById("sec-events-container");if(!A.length){i.innerHTML='<div class="panel-empty">No events</div>';return}i.innerHTML=A.slice(0,200).map(O).join("")}function O(i){const c=i.severity||"info",d={critical:"#c0392b",error:"#e74c3c",warn:"#f39c12",notice:"#3498db",info:"#7f8c8d"}[c]||"#7f8c8d",y=i.ts?new Date(i.ts).toLocaleTimeString():"",p=i.source_type||"",n=i.actor||"\u2014",e=i.target||"",r=i.action||"",s=i.outcome||"";return`<div class="sec-event-row" style="display:grid;grid-template-columns:84px 80px 1fr 1fr 100px 90px;gap:8px;padding:5px 8px;border-bottom:1px solid var(--border);font-size:0.82rem;align-items:center;">
<span style="color:${d};font-weight:600;">${k(c)}</span>
<span style="color:var(--muted);font-size:0.75rem;">${k(p)}</span>
<span title="${k(n)}" style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">${k(n)}</span>
<span title="${k(e)}" style="overflow:hidden;text-overflow:ellipsis;white-space:nowrap;">${k(r)} ${k(e)}</span>
<span style="color:var(--muted);font-size:0.75rem;">${k(s)}</span>
<span style="color:var(--muted);font-size:0.75rem;text-align:right;">${k(y)}</span>
</div>`}async function u(){try{const c=(await(await fetch("/api/v1/security/hosts")).json()).data?.hosts||[],d=T.value;T.innerHTML='<option value="">All hosts</option>'+c.map(y=>`<option value="${k(y.id)}">${k(y.label||y.id)}</option>`).join(""),d&&(T.value=d)}catch{}}document.getElementById("sec-host-register-btn").addEventListener("click",L),document.getElementById("sec-hosts-refresh").addEventListener("click",m);async function m(){try{const c=(await(await fetch("/api/v1/security/hosts")).json()).data?.hosts||[];D=c;const d=document.getElementById("sec-hosts-container");if(!c.length){d.innerHTML='<div class="panel-empty">No hosts registered. Click \u2795 Register Host to add one.</div>';return}d.innerHTML=c.map(y=>{const p=y.enabled?y.last_seen_at?Date.now()-Date.parse(y.last_seen_at)>18e5?"\u{1F7E1} stale":"\u{1F7E2} online":"\u26AA registered":"\u{1F534} disabled";return`<div style="padding:10px 12px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center;">
<div>
<strong>${k(y.label||y.id)}</strong>
<span style="color:var(--muted);margin-left:8px;font-size:0.8rem;">${k(y.type)}</span>
<div style="color:var(--muted);font-size:0.78rem;margin-top:2px;">
id: ${k(y.id)} \xB7
registered ${new Date(y.registered_at).toLocaleDateString()} \xB7
last seen ${y.last_seen_at?new Date(y.last_seen_at).toLocaleString():"never"}
</div>
</div>
<div>
<span style="font-size:0.85rem;margin-right:12px;">${p}</span>
${y.id==="self"?"":`<button class="btn-sm sec-host-del" data-id="${k(y.id)}" style="color:var(--bad-fg);">Remove</button>`}
</div>
</div>`}).join(""),d.querySelectorAll(".sec-host-del").forEach(y=>{y.addEventListener("click",async()=>{confirm(`Remove host ${y.dataset.id}? Events already received will remain in the store.`)&&(await fetch(`/api/v1/security/hosts/${encodeURIComponent(y.dataset.id)}`,{method:"DELETE"}),m())})})}catch(i){document.getElementById("sec-hosts-container").innerHTML='<div class="panel-empty">Load failed: '+k(i.message)+"</div>"}}async function L(){const i=prompt("Host id (lowercase, no spaces):");if(!i)return;const c=prompt("Display label:",i)||i,d=prompt('Type ("dashcaddy", "service", or "agent"):',"agent")||"agent";try{const y=await fetch("/api/v1/security/hosts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:i,label:c,type:d})}),p=await y.json();if(!y.ok){alert("Failed: "+(p?.error?.message||y.statusText));return}alert(`\u2705 Host registered!
id: ${p.data.host.id}
label: ${p.data.host.label}
type: ${p.data.host.type}
\u{1F511} API KEY (save this NOW \u2014 won't be shown again):
${p.data.api_key}
Send this key as: Authorization: Bearer <api_key>
To endpoint: POST /api/v1/security/events/ingest or /events/batch`),m()}catch(y){alert("Failed: "+y.message)}}function k(i){return String(i).replace(/[&<>"']/g,c=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[c])}function I(i,c){let d;return function(){clearTimeout(d),d=setTimeout(()=>i.apply(this,arguments),c)}}})(),window.__dc133_buildRepoOptions=function(x,b){var j=b||function(g){return String(g).replace(/[&<>"']/g,function(N){return{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[N]})};return'<option value="">\u2014 choose a repo \u2014</option>'+(x||[]).map(function(g){return'<option value="'+j(g.url)+'" data-id="'+j(g.id)+'">'+j(g.full_name)+(g.description?" \u2014 "+j(g.description):"")+"</option>"}).join("")},window.__dc133_requestToken=function(x,b){if(x)return"";var j=String(b||"").trim();return j||void 0},(function(){injectModal("deploys-modal",`<div id="deploys-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 860px; max-width: 1200px;">
<h3>\u{1F69A} Deploys</h3>
<p class="modal-subtitle">
Source deploys via shipdeck: build \u2192 package \u2192 systemd release \u2192 Caddy gate \u2192 DNS \u2192 verify.
</p>
<div class="sec-tabs" style="display:flex;gap:8px;margin-bottom:14px;border-bottom:1px solid var(--border);">
<button class="dep-tab active" data-tab="services">Services</button>
<button class="dep-tab" data-tab="deploy">Deploy</button>
<button class="dep-tab" data-tab="journal">Journal</button><button class="dep-tab" data-tab="install">Install</button>
</div>
<!-- SERVICES TAB -->
<div class="dep-panel" data-panel="services">
<div id="dep-services" class="scroll-container" style="max-height:320px;">Loading\u2026</div>
<div style="margin-top:10px;display:flex;gap:8px;align-items:center;">
<input id="dep-status-name" placeholder="service name" style="width:220px;" />
<button class="btn" id="dep-status-btn">Check status</button>
</div>
</div>
<!-- DEPLOY TAB -->
<div class="dep-panel" data-panel="deploy" style="display:none;">
<div style="display:flex;gap:8px;align-items:center;margin-bottom:10px;">
<select id="dep-repo-select" style="min-width:280px;"><option>Loading\u2026</option></select>
<button class="btn btn-primary" id="dep-deploy-btn">Deploy</button>
</div>
<p class="modal-subtitle">Deploys are serialized fleet-side; a run takes ~30-60s. Output streams below when it finishes.</p>
</div>
<!-- JOURNAL TAB -->
<div class="dep-panel" data-panel="journal" style="display:none;">
<div style="display:flex;gap:8px;align-items:center;margin-bottom:10px;">
<input id="dep-journal-name" placeholder="service (empty = all)" style="width:220px;" />
<button class="btn" id="dep-journal-btn">Refresh</button>
</div>
<div id="dep-journal" class="scroll-container" style="max-height:320px;">Loading\u2026</div>
</div>
<!-- INSTALL TAB (DC-131) -->
<div class="dep-panel" data-panel="install" style="display:none;">
<div style="display:grid;gap:10px;max-width:640px;">
<div style="display:grid;gap:4px;">
<span class="modal-subtitle" style="margin:0;">Gitea server (any instance)</span>
<div style="display:flex;gap:8px;">
<input id="dep-gh-gitea-host" placeholder="git.dashcaddy.net (default)" style="flex:1;" autocomplete="off" spellcheck="false" />
<input id="dep-gh-gitea-token" type="password" placeholder="token (private repos)" style="flex:1;" autocomplete="off" spellcheck="false" />
</div>
<label style="display:flex;gap:6px;align-items:center;font-size:12px;">
<input id="dep-gh-anonymous" type="checkbox" />
Anonymous \u2014 ignore the saved fleet token for this request
</label>
</div>
<label style="display:grid;gap:4px;">
<span class="modal-subtitle" style="margin:0;">Pick a repo</span>
<select id="dep-gh-gitea" style="min-width:280px;"><option value="">Loading\u2026</option></select>
</label>
<label style="display:grid;gap:4px;">
<span class="modal-subtitle" style="margin:0;">\u2026or paste any repo URL (GitHub, Gitea, or any https git host)</span>
<input id="dep-gh-url" placeholder="https://host/owner/repo" style="width:100%;" />
</label>
<label style="display:grid;gap:4px;">
<span class="modal-subtitle" style="margin:0;">Name (used as subdomain; card title falls back to repo name)</span>
<input id="dep-gh-service" placeholder="my-app" style="width:220px;" />
</label>
<label style="display:grid;gap:4px;">
<span class="modal-subtitle" style="margin:0;">Optional launch args (space-separated simple tokens, e.g. -text hi)</span>
<input id="dep-gh-args" placeholder="-text hello" style="width:100%;" />
</label>
<p class="modal-subtitle" style="margin:0;">
Go repos with a main package install automatically: build, systemd release,
Caddy gate (tailnet-only), DNS, verify, dashboard card. Takes ~30-60s.
</p>
<div><button class="btn btn-primary" id="dep-gh-btn">Install</button></div>
</div>
</div>
<!-- OUTPUT -->
<pre id="dep-output" class="scroll-container" style="display:none;max-height:260px;margin-top:12px;background:var(--bg-2,#111);padding:10px;border-radius:8px;white-space:pre-wrap;"></pre>
<div style="display:flex;justify-content:flex-end;gap:8px;margin-top:14px;">
<button class="btn" id="dep-close">Close</button>
</div>
</div>
</div>`);const x=P=>document.getElementById(P);let b=null,j=!1;function g(P){return window.escapeHtml?window.escapeHtml(String(P)):String(P).replace(/[&<>"']/g,v=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[v])}async function N(P,v){const B=await fetch("/dashcaddy-api/api/v1/deploys"+P,Object.assign({credentials:"include"},v||{}));let H=null;try{H=await B.json()}catch{H={success:!1,error:"non-JSON response"}}return{status:B.status,body:H}}function A(P){const v=x("dep-output");v.style.display="block",v.textContent=P||"(no output)",v.scrollTop=v.scrollHeight}async function D(){const P=x("dep-services"),{body:v}=await N("/services");if(!v.success){P.innerHTML="<em>"+g(v.error||"unavailable")+"</em>";return}const B=v.services||[];if(!B.length){P.innerHTML="<em>No shipdeck deployments on record yet.</em>";return}P.innerHTML='<table class="table" style="width:100%;"><thead><tr><th>Service</th><th>Last action</th><th>When</th><th>Release</th><th></th></tr></thead><tbody>'+B.map(H=>"<tr><td><strong>"+g(H.name)+"</strong></td><td>"+g(H.last_action)+"</td><td>"+g(H.last_time)+"</td><td>"+g(H.last_epoch)+'</td><td><button class="btn btn-sm dep-rollback" data-service="'+g(H.name)+'">Rollback</button> <button class="btn btn-sm dep-status" data-service="'+g(H.name)+'">Status</button></td></tr>').join("")+"</tbody></table>"}async function R(){const P=x("dep-repo-select"),{body:v}=await N("/repos");if(!v.success){P.innerHTML="<option>"+g(v.error||"unavailable")+"</option>";return}const B=v.repos||[];P.innerHTML=B.length?B.map(H=>'<option value="'+g(H.dir)+'">'+g(H.name)+"</option>").join(""):'<option value="">(no repos with a Shipdeckfile found)</option>'}async function f(P){const v=x("dep-journal"),B=P?"?service="+encodeURIComponent(P):"",{body:H}=await N("/journal"+B),O=H.rows||[];if(!O.length){v.innerHTML="<em>No journal rows.</em>";return}v.innerHTML='<table class="table" style="width:100%;"><thead><tr><th>Time</th><th>Service</th><th>Action</th><th>Release</th><th>Duration</th></tr></thead><tbody>'+O.map(u=>"<tr><td>"+g(u.time)+"</td><td>"+g(u.service)+"</td><td>"+g(u.action)+"</td><td>"+g(u.epoch)+"</td><td>"+g(u.duration||"\u2014")+"</td></tr>").join("")+"</tbody></table>"}async function C(){const P=document.getElementById("dep-gh-gitea"),v=document.getElementById("dep-gh-gitea-host"),B=document.getElementById("dep-gh-gitea-token"),H=document.getElementById("dep-gh-anonymous"),O={};if(v&&v.value.trim()&&(O.gitea_url="https://"+v.value.trim().replace(/^https?:\/*/,"")),H&&H.checked)O.token="";else{const u=window.__dc133_requestToken(!1,B&&B.value);u!==void 0&&(O.token=u)}try{const{status:u,body:m}=await N("/gitea-repos",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(O)});if(!m.success||!(m.repos||[]).length){P.innerHTML='<option value="">'+g(m.error||"no repos found")+"</option>";return}P.innerHTML=window.__dc133_buildRepoOptions(m.repos,g)}catch{P.innerHTML='<option value="">unavailable</option>'}}async function E(){const P=document.getElementById("dep-gh-btn"),v=document.getElementById("dep-gh-url").value.trim(),B=(document.getElementById("dep-gh-service").value.trim()||"").toLowerCase(),H=document.getElementById("dep-gh-args").value.trim();if(!v||!B){A("Repo URL and name are required.");return}const O=H?H.split(/\s+/):[];M(!0,P,"Install"),A("Installing "+v+`
Cloning, building, gating and DNS-ing... (~30-60s)`);try{const u=!!(document.getElementById("dep-gh-anonymous")||{}).checked,m=(document.getElementById("dep-gh-gitea-token")||{value:""}).value,L=window.__dc133_requestToken(u,m),{status:k,body:I}=await N("/install",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({repo_url:v,service:B,args:O,token:L})});if(!I.success){A((I.output?I.output+`
`:"")+"FAIL "+(I.error||"HTTP "+k)),M(!1,P,"Install");return}const i=I.service||{};if(!(window.APPS||[]).some(d=>d.id===i.id)){const d={id:i.id,name:i.name||i.id,url:i.url,logo:i.logo,tailscaleOnly:!0,isCustom:!0};try{await fetch("/dashcaddy-api/api/v1/services",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify(d)}),window.APPS.push(d),typeof window.renderApps=="function"&&window.renderApps(),typeof window.renderGrid=="function"&&window.renderGrid()}catch{}}A("INSTALLED "+(i.name||i.id)+" in "+(i.deploy_seconds||"?")+`s
Card: `+(i.url||"")+`
`+(I.output||"").slice(-800)),D()}catch(u){A("install error: "+u.message)}M(!1,P,"Install")}function M(P,v,B){v&&(v.disabled=P,B&&(v.textContent=P?"Working\u2026":B))}async function w(){const P=x("dep-deploy-btn"),v=x("dep-repo-select").value;if(v){M(!0,P,"Deploy"),A("Deploying "+v+`
This can take ~30-60s\u2026`);try{const{body:B}=await N("/deploy",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({dir:v})});A((B.output||B.error||"")+(B.success?`
\u2705 SUCCESS`:`
\u274C FAILED`)),D()}catch(B){A("deploy error: "+B.message)}M(!1,P,"Deploy")}}async function z(P,v){if(confirm("Roll back "+P+" to the previous release?")){M(!0,v,"Rollback"),A("Rolling back "+P+"\u2026");try{const{body:B}=await N("/rollback",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({service:P})});A((B.output||B.error||"")+(B.success?`
\u2705 ROLLED BACK`:`
\u274C FAILED`)),D()}catch(B){A("rollback error: "+B.message)}M(!1,v,"Rollback")}}async function S(P,v){M(!0,v,"Status");try{const{body:B}=await N("/status?service="+encodeURIComponent(P));A(B.output||B.error||"(no output)")}catch(B){A("status error: "+B.message)}M(!1,v,"Status")}function T(){b=document.getElementById("deploys-btn"),b&&(b.addEventListener("click",async()=>{x("deploys-modal").classList.add("open"),j||(j=!0,D(),R(),f(""),C())}),x("dep-close").addEventListener("click",()=>{x("deploys-modal").classList.remove("open")}),document.querySelectorAll(".dep-tab").forEach(P=>{P.addEventListener("click",()=>{document.querySelectorAll(".dep-tab").forEach(v=>v.classList.remove("active")),P.classList.add("active"),document.querySelectorAll("#deploys-modal .dep-panel").forEach(v=>{v.style.display=v.dataset.panel===P.dataset.tab?"block":"none"})})}),x("dep-deploy-btn").addEventListener("click",w),x("dep-gh-btn").addEventListener("click",E),["dep-gh-gitea-host","dep-gh-gitea-token"].forEach(P=>{const v=document.getElementById(P);v&&v.addEventListener("change",()=>C())}),document.getElementById("dep-gh-gitea").addEventListener("change",P=>{const v=P.target.value;if(v){document.getElementById("dep-gh-url").value=v;const B=P.target.selectedOptions[0],H=B&&B.dataset?B.dataset.id:"",O=document.getElementById("dep-gh-service");H&&!O.value&&(O.value=H)}}),x("dep-journal-btn").addEventListener("click",()=>f(x("dep-journal-name").value.trim())),x("dep-status-btn").addEventListener("click",()=>{const P=x("dep-status-name").value.trim();P&&S(P)}),x("dep-services").addEventListener("click",P=>{const v=P.target.closest(".dep-rollback");if(v)return z(v.dataset.service,v);const B=P.target.closest(".dep-status");if(B)return S(B.dataset.service,B)}))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",T):T()})(),(function(){const x=new ErrorHandler;injectModal("weather-modal",`<div id="weather-modal" class="weather-modal"><div class="weather-modal-content"><h3>Weather Settings</h3>
<label for="weather-location-input">Location:</label>
<input type="text" id="weather-location-input" placeholder="City name or ZIP (e.g., Hamburg, 90210)" maxlength="100">
<div style="font-size: 0.78rem; color: var(--muted); margin-top: 4px;">Enter a city name, postal code, or &ldquo;City, Country&rdquo;</div>
<div style="margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--border);">
<label style="display: block; margin-bottom: 8px; font-weight: 600; color: var(--fg);">Units</label>
<div style="display: flex; gap: 8px;">
<label class="weather-unit-option"><input type="radio" name="weather-unit-radio" value="imperial"><span class="weather-unit-card">&deg;F / mph</span></label>
<label class="weather-unit-option"><input type="radio" name="weather-unit-radio" value="metric"><span class="weather-unit-card">&deg;C / km/h</span></label>
</div>
</div>
<div class="weather-modal-buttons"><button id="weather-cancel">Cancel</button><button id="weather-save">Save</button></div></div></div>`);const b="weather-location",j="weather-zip",g="weather-geo",N="weather-unit";!safeGet(b)&&safeGet(j)&&safeSet(b,safeGet(j));function A(){return safeGet(N)||"imperial"}function D(){return{icon:document.querySelector(".weather-icon"),temp:document.querySelector(".weather-temp"),condition:document.querySelector(".weather-condition"),location:document.querySelector(".weather-location"),wind:document.querySelector(".weather-wind")}}const R={0:"Clear sky",1:"Mainly clear",2:"Partly cloudy",3:"Overcast",45:"Fog",48:"Rime fog",51:"Light drizzle",53:"Drizzle",55:"Dense drizzle",56:"Freezing drizzle",57:"Dense freezing drizzle",61:"Light rain",63:"Moderate rain",65:"Heavy rain",66:"Light freezing rain",67:"Heavy freezing rain",71:"Light snow",73:"Moderate snow",75:"Heavy snow",77:"Snow grains",80:"Light showers",81:"Moderate showers",82:"Violent showers",85:"Light snow showers",86:"Heavy snow showers",95:"Thunderstorm",96:"Thunderstorm with hail",99:"Severe thunderstorm"},f={0:"\u2600\uFE0F",1:"\u{1F324}\uFE0F",2:"\u26C5",3:"\u2601\uFE0F",45:"\u{1F32B}\uFE0F",48:"\u{1F32B}\uFE0F",51:"\u{1F326}\uFE0F",53:"\u{1F326}\uFE0F",55:"\u{1F326}\uFE0F",56:"\u{1F328}\uFE0F",57:"\u{1F328}\uFE0F",61:"\u{1F326}\uFE0F",63:"\u{1F327}\uFE0F",65:"\u{1F327}\uFE0F",66:"\u{1F328}\uFE0F",67:"\u{1F328}\uFE0F",71:"\u{1F328}\uFE0F",73:"\u2744\uFE0F",75:"\u2744\uFE0F",77:"\u2744\uFE0F",80:"\u{1F326}\uFE0F",81:"\u{1F327}\uFE0F",82:"\u{1F327}\uFE0F",85:"\u{1F328}\uFE0F",86:"\u2744\uFE0F",95:"\u26C8\uFE0F",96:"\u26C8\uFE0F",99:"\u26C8\uFE0F"},C=["N","NNE","NE","ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"];function E(v){return C[Math.round(v/22.5)%16]}async function M(v){const B=safeGet(g);if(B)try{const L=JSON.parse(B);if(L.query===v)return L}catch{}const H=await fetch(`https://geocoding-api.open-meteo.com/v1/search?name=${encodeURIComponent(v)}&count=1&language=en&format=json`);if(!H.ok)throw new Error("Geocoding failed");const O=await H.json();if(!O.results||!O.results.length)throw new Error("Location not found");const u=O.results[0],m={query:v,lat:u.latitude,lon:u.longitude,city:u.name,state:u.admin1||"",country:u.country||"",countryCode:u.country_code||""};return safeSet(g,JSON.stringify(m)),m}function w(v){return v.countryCode==="US"&&v.state?`${v.city}, ${v.state}`:v.country?`${v.city}, ${v.country}`:v.city}async function z(v){try{const B=await M(v),H=A(),O=H==="metric"?"celsius":"fahrenheit",u=H==="metric"?"kmh":"mph",m=`https://api.open-meteo.com/v1/forecast?latitude=${B.lat}&longitude=${B.lon}&current=temperature_2m,weather_code,wind_speed_10m,wind_direction_10m&temperature_unit=${O}&wind_speed_unit=${u}`,L=await fetch(m);if(!L.ok)throw new Error("Weather fetch failed");const I=(await L.json()).current,i=I.weather_code;return{temp:Math.round(I.temperature_2m),condition:R[i]||"Unknown",icon:f[i]||"\u{1F324}\uFE0F",locationStr:w(B),windSpeed:Math.round(I.wind_speed_10m),windDir:E(I.wind_direction_10m),unit:H}}catch(B){return console.warn("Weather fetch failed:",B),null}}async function S(){const v=D();if(!v.icon||!v.temp||!v.condition||!v.location||!v.wind){console.warn("Weather widget elements not found");return}const B=safeGet(b);if(!B){v.location.textContent="Set Location",v.temp.textContent="--\xB0",v.condition.textContent="Click \u2699\uFE0F to configure",v.wind.textContent="--",v.icon.innerHTML='<span class="weather-emoji">\u{1F324}\uFE0F</span>';return}try{const H=await z(B);if(H){const O=H.unit==="metric"?"\xB0C":"\xB0F",u=H.unit==="metric"?"km/h":"mph";v.location.textContent=H.locationStr,v.temp.textContent=`${H.temp}${O}`,v.condition.textContent=H.condition,v.wind.textContent=`Wind: ${H.windSpeed} ${u} ${H.windDir}`,v.icon.innerHTML=`<span class="weather-emoji">${escapeHtml(H.icon)}</span>`}}catch(H){x.logError("[Weather] Update Error",H,{function:"updateWeather"}),v.location.textContent="Weather Error",v.temp.textContent="Error",v.condition.textContent="Failed to load",v.wind.textContent="--"}}const T=document.getElementById("weather-modal"),P=document.getElementById("weather-location-input");document.getElementById("weather-settings")?.addEventListener("click",()=>{P.value=safeGet(b)||"";const v=A(),B=T.querySelector(`input[name="weather-unit-radio"][value="${v}"]`);B&&(B.checked=!0),T.classList.add("show"),P.focus()}),document.getElementById("weather-cancel")?.addEventListener("click",()=>{T.classList.remove("show")}),document.getElementById("weather-save")?.addEventListener("click",()=>{const v=P.value.trim();if(v){safeGet(b)!==v&&safeSet(g,""),safeSet(b,v);const H=T.querySelector('input[name="weather-unit-radio"]:checked'),O=H?H.value:"imperial",u=A();safeSet(N,O),u!==O&&safeSet(g,""),T.classList.remove("show"),S()}else showNotification("Please enter a location (e.g., Hamburg, London, 90210)","warning")}),wireModal(T),document.addEventListener("keydown",v=>{v.key==="Escape"&&T.classList.contains("show")&&T.classList.remove("show")}),S(),setInterval(S,DC.POLL.WEATHER)})(),(function(){const x=document.getElementById("clock-widget"),b=document.getElementById("clock-render");if(!x||!b)return;const j=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],g=["January","February","March","April","May","June","July","August","September","October","November","December"],N=["XII","I","II","III","IV","V","VI","VII","VIII","IX","X","XI"];let A=safeGet("clock-style")||"default",D=-1,R=!1,f="",C="",E=null,M=null;function w(n){if(R||safeGet("clock-chimes")!=="true")return;R=!0;const e=parseInt(safeGet("clock-chime-volume")||"50",10)/100;let r=0;function s(){if(r>=n){R=!1;return}const a=new Audio("/assets/sounds/church-bell.mp3");a.volume=e,a.play().catch(()=>{}),r++,r<n?setTimeout(s,2500):setTimeout(()=>{R=!1},2500)}s()}function z(n){return j[n.getDay()]+", "+g[n.getMonth()]+" "+n.getDate()+", "+n.getFullYear()}function S(){C="",E=null}function T(){return C!=="digital"&&(b.innerHTML='<div class="clock-time"><span class="clock-main"></span><span class="clock-seconds"></span><span class="clock-ampm"></span></div><div class="clock-date"></div>',E={main:b.querySelector(".clock-main"),seconds:b.querySelector(".clock-seconds"),ampm:b.querySelector(".clock-ampm"),date:b.querySelector(".clock-date")},C="digital"),E}function P(n){const e=n.getHours(),r=n.getMinutes(),s=n.getSeconds(),a=e>=12?"PM":"AM",t=e%12||12,o=T();o.main.textContent=`${t}:${String(r).padStart(2,"0")}`,o.seconds.textContent=`:${String(s).padStart(2,"0")}`,o.ampm.textContent=a,o.date.textContent=z(n)}function v(n,e){const r=n.getHours(),s=n.getMinutes(),a=n.getSeconds(),t=r>=12?"PM":"AM",o=r%12||12,l=T();l.main.textContent=`${String(o).padStart(2,"0")}:${String(s).padStart(2,"0")}`,l.seconds.textContent=`:${String(a).padStart(2,"0")}`,l.ampm.textContent=t,l.date.textContent=z(n)}function B(n){const e=n.getHours(),r=n.getMinutes(),s=n.getSeconds(),a=e>=12?"PM":"AM",t=e%12||12,o=String(t).padStart(2," ")+String(r).padStart(2,"0")+String(s).padStart(2,"0");let l='<div class="flip-clock-row">';if(l+=H(o[0],0),l+=H(o[1],1),l+='<span class="flip-colon">:</span>',l+=H(o[2],2),l+=H(o[3],3),l+='<span class="flip-colon">:</span>',l+=H(o[4],4),l+=H(o[5],5),l+=`<span class="flip-ampm">${a}</span>`,l+="</div>",l+=`<div class="clock-date">${z(n)}</div>`,b.innerHTML=l,C="flip",f){for(let h=0;h<6;h++)if(o[h]!==f[h]){const $=b.querySelector(`.flip-card[data-idx="${h}"]`);$&&$.classList.add("flipping")}}f=o}function H(n,e){const r=n===" "?"":n;return`<div class="flip-card" data-idx="${e}"><div class="flip-top">${r}</div><div class="flip-bottom">${r}</div></div>`}function O(n){const e=n.getHours(),r=n.getMinutes(),s=n.getSeconds(),a=e%12||12,t=e>=12?"PM":"AM",o=[Math.floor(a/10),a%10,Math.floor(r/10),r%10,Math.floor(s/10),s%10];let l='<div class="binary-clock">';l+='<div class="binary-labels"><span>H</span><span>H</span><span>M</span><span>M</span><span>S</span><span>S</span></div>';for(let h=3;h>=0;h--){l+='<div class="binary-row">';for(let $=0;$<6;$++){const U=o[$]>>h&1;l+=`<div class="binary-dot ${U?"on":""}"></div>`}l+="</div>"}l+='<div class="binary-values">';for(let h=0;h<6;h++)l+=`<span>${o[h]}</span>`;l+="</div>",l+=`<div class="binary-ampm">${t}</div>`,l+="</div>",l+=`<div class="clock-date">${z(n)}</div>`,b.innerHTML=l,C="binary"}function u(n,e){const r=n.getHours(),s=n.getMinutes(),a=n.getSeconds(),t=120,o=t/2,l=t/2,h=a/60*360-90,$=(s+a/60)/60*360-90,U=(r%12+s/60)/12*360-90;let F="";for(let K=1;K<=12;K++){const Z=K/12*2*Math.PI-Math.PI/2,ee=47,ne=o+ee*Math.cos(Z),oe=l+ee*Math.sin(Z),V=e?N[K%12]:K;F+=`<text x="${ne}" y="${oe}" text-anchor="middle" dominant-baseline="central" fill="var(--fg)" font-size="${e?"7":"9"}" font-weight="600" font-family="'Sami Grotesk',sans-serif">${V}</text>`}let _="";for(let K=0;K<60;K++){const Z=K/60*2*Math.PI-Math.PI/2,ee=56,ne=K%5===0?52:54,oe=o+ne*Math.cos(Z),V=l+ne*Math.sin(Z),ie=o+ee*Math.cos(Z),re=l+ee*Math.sin(Z),se=K%5===0?1.5:.5;_+=`<line x1="${oe}" y1="${V}" x2="${ie}" y2="${re}" stroke="var(--muted)" stroke-width="${se}" stroke-linecap="round"/>`}const J=`<svg class="analog-clock-svg" viewBox="0 0 ${t} ${t}" width="${t}" height="${t}">
<circle cx="${o}" cy="${l}" r="58" fill="none" stroke="var(--border)" stroke-width="2"/>
${_}
${F}
<line x1="${o}" y1="${l}" x2="${o+28*Math.cos(U*Math.PI/180)}" y2="${l+28*Math.sin(U*Math.PI/180)}" stroke="var(--fg)" stroke-width="3" stroke-linecap="round"/>
<line x1="${o}" y1="${l}" x2="${o+38*Math.cos($*Math.PI/180)}" y2="${l+38*Math.sin($*Math.PI/180)}" stroke="var(--fg)" stroke-width="2" stroke-linecap="round"/>
<line x1="${o}" y1="${l}" x2="${o+42*Math.cos(h*Math.PI/180)}" y2="${l+42*Math.sin(h*Math.PI/180)}" stroke="#e74c3c" stroke-width="1" stroke-linecap="round"/>
<circle cx="${o}" cy="${l}" r="3" fill="var(--fg)"/>
</svg>`,q=n.getHours()>=12?"PM":"AM";b.innerHTML=`<div class="analog-clock-wrap">${J}<div class="analog-info"><span class="analog-digital">${n.getHours()%12||12}:${String(s).padStart(2,"0")} ${q}</span><span class="analog-date-sm">${z(n)}</span></div></div>`,C="analog"}function m(){const n=new Date,e=n.getHours()%12||12,r=n.getMinutes(),s=n.getSeconds(),a="clock-widget"+(A!=="default"?" "+A:"");switch(x.className!==a&&(x.className=a),A){case"lcd":v(n);break;case"lcd-blue":v(n);break;case"lcd-amber":v(n);break;case"lcd-retro":v(n);break;case"lcd-taxi":v(n);break;case"flip":B(n);break;case"binary":O(n);break;case"analog":u(n,!1);break;case"roman":u(n,!0);break;default:P(n)}r===0&&s===0&&e!==D&&(D=e,w(e)),r!==0&&(D=-1)}function L(){clearTimeout(M);const n=document.hidden?6e4:1e3,e=n-Date.now()%n+25;M=setTimeout(()=>{m(),L()},e)}document.addEventListener("visibilitychange",()=>{f="",S(),m(),L()}),m(),L();const k=[{id:"default",label:"Default",icon:"\u{1F550}"},{id:"lcd",label:"LCD Green",icon:"\u{1F49A}"},{id:"lcd-blue",label:"LCD Blue",icon:"\u{1F499}"},{id:"lcd-amber",label:"LCD Amber",icon:"\u{1F7E0}"},{id:"lcd-retro",label:"LCD Retro",icon:"\u{1F7E9}"},{id:"lcd-taxi",label:"LCD Taxi",icon:"\u{1F7E1}"},{id:"flip",label:"Flip Clock",icon:"\u{1F4DF}"},{id:"binary",label:"Binary",icon:"\u{1F4BB}"},{id:"analog",label:"Analog",icon:"\u23F0"},{id:"roman",label:"Roman",icon:"\u{1F3DB}\uFE0F"}];let I='<div class="clock-style-grid">';k.forEach(n=>{I+=`<label class="clock-style-option">
<input type="radio" name="clock-style-radio" value="${n.id}">
<span class="clock-style-card"><span class="clock-style-icon">${n.icon}</span><span class="clock-style-label">${n.label}</span></span>
</label>`}),I+="</div>",injectModal("clock-settings-modal",`<div id="clock-settings-modal" class="weather-modal">
<div class="weather-modal-content" style="max-width: 420px;">
<h3>Clock Settings</h3>
<div style="margin-bottom: 16px;">
<label style="display: block; margin-bottom: 8px; font-weight: 600; color: var(--fg);">Style</label>
${I}
</div>
<div style="margin-bottom: 16px; padding-top: 12px; border-top: 1px solid var(--border);">
<label style="display: flex; align-items: center; gap: 8px; cursor: pointer; font-weight: 600; color: var(--fg);">
<input type="checkbox" id="clock-chimes-toggle"> Hourly church bell chimes
</label>
<div style="font-size: 0.78rem; color: var(--muted); margin-top: 4px; margin-left: 24px;">
Strikes the number of the hour (e.g., 3 bells at 3:00)
</div>
</div>
<div style="margin-bottom: 16px;" id="clock-volume-section">
<label style="display: block; margin-bottom: 6px; font-weight: 600; color: var(--fg);">Volume</label>
<div style="display: flex; align-items: center; gap: 10px;">
<span style="font-size: 0.85rem;">\u{1F508}</span>
<input type="range" id="clock-chime-volume" min="0" max="100" value="50" style="flex: 1; accent-color: var(--ok-fg);">
<span style="font-size: 0.85rem;">\u{1F50A}</span>
<button id="clock-chime-test" style="padding: 4px 10px; font-size: 0.78rem; border-radius: 4px; cursor: pointer;">Test</button>
</div>
</div>
<div class="weather-modal-buttons">
<button id="clock-settings-cancel">Cancel</button>
<button id="clock-settings-save">Save</button>
</div>
</div>
</div>`);const i=document.getElementById("clock-settings-modal"),c=document.getElementById("clock-chimes-toggle"),d=document.getElementById("clock-chime-volume"),y=document.getElementById("clock-volume-section");function p(){const n=safeGet("clock-style")||"default",e=i.querySelector(`input[value="${n}"]`);e&&(e.checked=!0),c.checked=safeGet("clock-chimes")==="true",d.value=safeGet("clock-chime-volume")||"50",y.style.opacity=c.checked?"1":"0.4"}c?.addEventListener("change",()=>{y.style.opacity=c.checked?"1":"0.4"}),document.getElementById("clock-settings")?.addEventListener("click",()=>{p(),i.classList.add("show")}),document.getElementById("clock-chime-test")?.addEventListener("click",()=>{const n=parseInt(d.value,10)/100,e=new Audio("/assets/sounds/church-bell.mp3");e.volume=n,e.play().catch(()=>{})}),document.getElementById("clock-settings-save")?.addEventListener("click",()=>{const n=i.querySelector('input[name="clock-style-radio"]:checked'),e=n?n.value:"default";safeSet("clock-style",e),safeSet("clock-chimes",String(c.checked)),safeSet("clock-chime-volume",d.value),A=e,f="",S(),m(),L(),i.classList.remove("show"),showNotification("Clock settings saved","success",2e3)}),document.getElementById("clock-settings-cancel")?.addEventListener("click",()=>{i.classList.remove("show")}),wireModal(i),i?.querySelectorAll('input[name="clock-style-radio"]').forEach(n=>{n.addEventListener("change",()=>{A=n.value,f="",S(),m()})})})(),(function(){function x(g){const N=new Date(g.start),A=isNaN(N.getTime())?`invalid:${g.start==null?"null":String(g.start)}`:N.toISOString();return g.uid?`${g.uid}@${A}`:`${A}|${g.title||""}`}function b(){const g=new Map;return{size:()=>g.size,merge(N,A){if(A)for(const[D,R]of g){const f=new Date(R.start).getTime();f>=A.start.getTime()&&f<=A.end.getTime()&&g.delete(D)}for(const D of N&&Array.isArray(N.events)?N.events:[])g.set(x(D),D);return{events:[...g.values()].sort((D,R)=>new Date(D.start)-new Date(R.start))}}}}const j={eventKey:x,createCache:b};typeof module<"u"&&module.exports&&(module.exports=j),typeof window<"u"&&(window.CalendarCache=j)})(),(function(){const x=new ErrorHandler;injectModal("calendar-modal",`<div id="calendar-modal" class="weather-modal">
<div class="weather-modal-content cal-modal-content" role="dialog" aria-modal="true" aria-labelledby="calendar-modal-title">
<h3 id="calendar-modal-title">\u{1F4C5} Calendar</h3>
<div class="cal-monthbar">
<button id="cal-prev" class="cal-nav-btn" aria-label="Previous month">\u2039</button>
<span id="cal-month-label" class="cal-month-label"></span>
<button id="cal-next" class="cal-nav-btn" aria-label="Next month">\u203A</button>
</div>
<div id="cal-grid" class="cal-grid"></div>
<div id="calendar-upcoming" style="margin:12px 0 14px;">
<div style="font-size:0.8rem;color:var(--muted);margin-bottom:6px;">Upcoming appointments</div>
<div id="calendar-upcoming-list" class="cal-list">
<div class="cal-empty">No upcoming appointments.</div>
</div>
</div>
<div style="margin-top:14px;padding-top:12px;border-top:1px solid var(--border);">
<label style="display:block;font-weight:600;color:var(--fg);margin-bottom:8px;">Calendars</label>
<div id="calendar-sources-list" style="display:flex;flex-direction:column;gap:6px;margin-bottom:10px;"></div>
<details id="calendar-add-details">
<summary style="cursor:pointer;font-size:0.85rem;color:var(--accent);">+ Add a calendar (CalDAV URL or ICS feed)</summary>
<div style="margin-top:10px;display:flex;flex-direction:column;gap:8px;">
<div style="display:flex;gap:8px;">
<label style="font-size:0.82rem;">Type
<select id="cal-add-type" style="margin-left:6px;background:var(--bg);color:var(--fg);border:1px solid var(--border);border-radius:4px;padding:4px;">
<option value="caldav">CalDAV</option>
<option value="ics">ICS feed (read-only)</option>
</select>
</label>
<label style="font-size:0.82rem;flex:1;">Name
<input type="text" id="cal-add-name" placeholder="Work calendar" maxlength="120" style="width:100%;background:var(--bg);color:var(--fg);border:1px solid var(--border);border-radius:4px;padding:4px 8px;">
</label>
</div>
<label style="font-size:0.82rem;">URL
<input type="text" id="cal-add-url" placeholder="https://calendar.example.com/user/calendar/" style="width:100%;background:var(--bg);color:var(--fg);border:1px solid var(--border);border-radius:4px;padding:4px 8px;">
</label>
<div style="display:flex;gap:8px;">
<label style="font-size:0.82rem;flex:1;">User
<input type="text" id="cal-add-user" autocomplete="off" style="width:100%;background:var(--bg);color:var(--fg);border:1px solid var(--border);border-radius:4px;padding:4px 8px;">
</label>
<label style="font-size:0.82rem;flex:1;">Password
<input type="password" id="cal-add-pass" autocomplete="new-password" style="width:100%;background:var(--bg);color:var(--fg);border:1px solid var(--border);border-radius:4px;padding:4px 8px;">
</label>
</div>
<div style="display:flex;gap:8px;justify-content:flex-end;">
<button id="cal-add-test">Test connection</button>
<button id="cal-add-save">Save</button>
</div>
<div id="cal-add-status" style="font-size:0.8rem;color:var(--muted);min-height:1em;"></div>
</div>
</details>
</div>
<div class="weather-modal-buttons"><button id="calendar-close">Close</button></div>
</div></div>`);function b(a){return String(a??"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}const j=()=>({icon:document.querySelector(".calendar-widget-icon"),text:document.querySelector(".calendar-widget-text")});function g(a,t){const o=new Date(a),l=new Date;l.setHours(0,0,0,0);const h=new Date(o);h.setHours(0,0,0,0);const $=Math.round((h-l)/864e5),U=$===0?"Today":$===1?"Tomorrow":o.toLocaleDateString(void 0,{weekday:"short",month:"short",day:"numeric"}),F=t?"all-day":o.toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit"});return`${U} ${F}`}function N(a,t){return t?"all-day":new Date(a).toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit"})}function A(a){return`${a.getFullYear()}-${String(a.getMonth()+1).padStart(2,"0")}-${String(a.getDate()).padStart(2,"0")}`}const D=typeof window<"u"&&window.CalendarCache?window.CalendarCache.createCache():null;function R(a,t){return D?D.merge(a,t):a}let f=[];function C(a){const t=a||new Date,o=new Date(t.getFullYear(),t.getMonth()-1,1,0,0,0,0),l=new Date(t.getFullYear(),t.getMonth()+2,0,23,59,59,999);return{start:o,end:l}}function E(a){return f.some(t=>t.start.getTime()<=a.start.getTime()&&t.end.getTime()>=a.end.getTime())}function M(a){const t=f.filter(l=>l.end.getTime()>=a.start.getTime()&&l.start.getTime()<=a.end.getTime()),o=f.filter(l=>!t.includes(l));t.length&&(a={start:new Date(Math.min(a.start.getTime(),...t.map(l=>l.start.getTime()))),end:new Date(Math.max(a.end.getTime(),...t.map(l=>l.end.getTime())))}),f=o.concat([a]).sort((l,h)=>l.start-h.start)}let w=null,z={events:[]};async function S(a){const t=C(w);if(!a&&E(t))return z;const o=await secureFetch(`/api/v1/calendar/events?start=${t.start.toISOString()}&end=${t.end.toISOString()}`,{cache:"no-store"});if(o.status===404)return{notConfigured:!0};if(!o.ok)throw new Error(`Calendar API HTTP ${o.status}`);const l=await o.json();return z=R(l,t),M(t),z}function T(a){const t=j();if(!t.icon||!t.text)return;const o=B(a&&Array.isArray(a.events)?a.events:[]);if(!o.length){t.icon.textContent="\u{1F4C5}",t.text.innerHTML='<span class="cal-chip-muted">No upcoming appointments</span>';return}const l=o[0];t.icon.textContent=l.allDay?"\u{1F5D3}\uFE0F":"\u23F0",t.text.innerHTML=`<span class="cal-chip-title">${b(l.title||"Untitled")}</span><span class="cal-chip-when">\xB7 ${b(g(l.start,l.allDay))}</span>`}function P(a){const t={};for(const o of a&&Array.isArray(a.events)?a.events:[]){const l=A(new Date(o.start));(t[l]=t[l]||[]).push(o)}return t}function v(a){const t=document.getElementById("cal-grid"),o=document.getElementById("cal-month-label");if(!t||!o)return;w||(w=new Date,w.setDate(1));const l=w.getFullYear(),h=w.getMonth();o.textContent=w.toLocaleDateString(void 0,{month:"long",year:"numeric"});const $=P(a),U=A(new Date),F=new Date(l,h,1).getDay(),_=new Date(l,h+1,0).getDate();let J=["S","M","T","W","T","F","S"].map(q=>`<div class="cal-dow">${q}</div>`).join("");for(let q=0;q<F;q++)J+='<div class="cal-day cal-pad"></div>';for(let q=1;q<=_;q++){const K=`${l}-${String(h+1).padStart(2,"0")}-${String(q).padStart(2,"0")}`,Z=$[K]||[],ee=["cal-day"];K===U&&ee.push("cal-today"),Z.length&&ee.push("cal-has-events");const ne=Z.slice(0,3).map(V=>`<span class="cal-dot" title="${b(N(V.start,V.allDay))}"></span>`).join(""),oe=Z.map(V=>`${N(V.start,V.allDay)} \u2014 ${V.title||"Untitled"}`).join(`
`);J+=`<div class="${ee.join(" ")}" title="${b(oe||K)}"><span class="cal-daynum">${q}</span>${ne?`<span class="cal-dots">${ne}</span>`:""}</div>`}t.innerHTML=J}function B(a){const t=Date.now();return(Array.isArray(a)?a:[]).filter(o=>(o.end?new Date(o.end).getTime():new Date(o.start).getTime())>=t).sort((o,l)=>new Date(o.start)-new Date(l.start))}function H(a){const t=document.getElementById("calendar-upcoming-list");if(!t)return;const o=B(a&&Array.isArray(a.events)?a.events:[]);if(!o.length){t.innerHTML='<div class="cal-empty">No upcoming appointments.</div>';return}t.innerHTML=o.slice(0,12).map(l=>`<div class="cal-row">
<span class="cal-when">${b(g(l.start,l.allDay))}</span>
<span class="cal-evtitle">${b(l.title||"Untitled")}</span>
${l.location?`<span class="cal-loc">${b(l.location)}</span>`:""}
</div>`).join("")}async function O(){const a=document.getElementById("calendar-sources-list");if(!a)return;let t=[];try{const o=await secureFetch("/api/v1/calendar/sources",{cache:"no-store"});if(o.ok){const l=await o.json();t=l&&Array.isArray(l.sources)?l.sources:Array.isArray(l)?l:[]}}catch{}if(!t.length){a.innerHTML='<div class="cal-empty">No calendars connected. Deploy Radicale from the App Selector to auto-connect one, or add a CalDAV/ICS URL below.</div>';return}a.innerHTML=t.map(o=>`
<div class="cal-row cal-src-row">
<span class="cal-evtitle">${b(o.name||o.id)}
<span class="cal-loc">\xB7 ${b(o.type)}${o.autoProvisioned?" \xB7 auto-wired":""}</span></span>
<button class="cal-src-toggle cal-btn" data-id="${b(o.id)}" data-enabled="${o.enabled!==!1?"1":"0"}">${o.enabled!==!1?"\u2713 on":"off"}</button>
<button class="cal-src-del cal-btn cal-btn-danger" data-id="${b(o.id)}">remove</button>
</div>`).join(""),a.querySelectorAll(".cal-src-toggle").forEach(o=>o.addEventListener("click",async()=>{const l=o.dataset.id,h=o.dataset.enabled!=="1";o.disabled=!0;try{const $=await secureFetch(`/api/v1/calendar/sources/${encodeURIComponent(l)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({enabled:h})});if(!$.ok)throw new Error(`HTTP ${$.status}`);O(),m(!0)}catch($){showNotification(`Calendar source update failed: ${$.message}`,"error")}finally{o.disabled=!1}})),a.querySelectorAll(".cal-src-del").forEach(o=>o.addEventListener("click",async()=>{const l=o.dataset.id;o.disabled=!0;try{const h=await secureFetch(`/api/v1/calendar/sources/${encodeURIComponent(l)}`,{method:"DELETE"});if(!h.ok)throw new Error(`HTTP ${h.status}`);O(),m(!0)}catch(h){showNotification(`Calendar source removal failed: ${h.message}`,"error")}finally{o.disabled=!1}}))}let u=null;async function m(a){if(m._inFlight){a&&(m._pendingForce=!0);return}m._inFlight=!0;try{let t=await S(!!a);if(a&&w){const o=w;w=null;const l=await S(!0);w=o;const h=await S(!0);T(l),v(h),H(l),u=l,m._inFlight=!1;return}if(w){const o=w;w=null;const l=await S(!1);w=o;const h=await S(!1);T(l),v(h),H(l),u=l,m._inFlight=!1;return}u=t,T(t),document.getElementById("calendar-modal").classList.contains("show")&&(v(t),H(t))}catch(t){x.logError("calendar-widget",t);const o=j();o.text&&(o.text.innerHTML='<span class="cal-chip-muted">Calendar offline</span>')}finally{m._inFlight=!1,m._pendingForce&&(m._pendingForce=!1,m(!0))}}let L=null;function k(){L=document.activeElement,document.getElementById("calendar-modal").classList.add("show"),v(u||{events:[]}),H(u||{events:[]}),O(),m(),document.getElementById("calendar-close").focus()}function I(){document.getElementById("calendar-modal").classList.remove("show"),L&&typeof L.focus=="function"&&L.focus()}function i(){return{type:document.getElementById("cal-add-type").value,name:document.getElementById("cal-add-name").value.trim(),url:document.getElementById("cal-add-url").value.trim(),user:document.getElementById("cal-add-user").value.trim(),pass:document.getElementById("cal-add-pass").value}}function c(a){document.getElementById("cal-add-status").textContent=a}document.getElementById("cal-add-test").addEventListener("click",async()=>{const a=i();if(!a.url){c("Enter a URL first.");return}c("Testing\u2026");try{const o=await(await secureFetch("/api/v1/calendar/discover",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({url:a.url,user:a.user,pass:a.pass})})).json(),l=o&&o.probe;l&&l.ok?c(`\u2713 Reachable (${l.server||"server"})${l.looksLikeCalendar?" \u2014 looks like a calendar":""}`):c(`\u2717 ${l&&l.error?l.error:"Not reachable"}`)}catch(t){c(`\u2717 ${t.message}`)}}),document.getElementById("cal-add-save").addEventListener("click",async()=>{const a=i();if(!a.name||!a.url){c("Name and URL are required.");return}try{const t=await secureFetch("/api/v1/calendar/sources",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:a.name,type:a.type,url:a.url,user:a.user,pass:a.pass})});if(!t.ok){const o=await t.json().catch(()=>({}));c(`\u2717 ${o.error||o.message||`HTTP ${t.status}`}`);return}c("Saved."),document.getElementById("cal-add-details").open=!1,["cal-add-name","cal-add-url","cal-add-user","cal-add-pass"].forEach(o=>{document.getElementById(o).value=""}),O(),m(!0)}catch(t){c(`\u2717 ${t.message}`)}});const d=document.getElementById("calendar-widget");d&&(d.addEventListener("click",k),d.addEventListener("keydown",a=>{(a.key==="Enter"||a.key===" "||a.key==="Spacebar")&&(a.preventDefault(),k())}));const y=document.getElementById("calendar-settings");y&&y.addEventListener("click",a=>{a.stopPropagation(),k()});const p=document.getElementById("calendar-modal");p&&(document.getElementById("calendar-close").addEventListener("click",I),p.addEventListener("click",a=>{a.target===p&&I()}),document.addEventListener("keydown",a=>{a.key==="Escape"&&p.classList.contains("show")&&I()}));async function n(a){w||(w=new Date,w.setDate(1)),w=new Date(w.getFullYear(),w.getMonth()+a,1);const t=await S(!1).catch(()=>u);v(t||{events:[]})}const e=document.getElementById("cal-prev");e&&e.addEventListener("click",()=>{n(-1)});const r=document.getElementById("cal-next");r&&r.addEventListener("click",()=>{n(1)}),window.refreshCalendarWidget=m;const s=typeof DC<"u"&&DC.POLL&&DC.POLL.CALENDAR||3e5;setInterval(()=>{document.hidden||m(!0)},s),document.addEventListener("visibilitychange",()=>{document.hidden||m(!0)}),setTimeout(m,400)})(),(function(){const x=new ErrorHandler;injectModal("ai-connect-modal",`<div id="ai-connect-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width:560px;max-width:720px;">
<h3>\u{1F916} Connect your AI assistant</h3>
<div id="aiconn-intro" style="font-size:0.85rem;color:var(--muted);margin-bottom:12px;">
DashCaddy speaks MCP \u2014 Claude, ChatGPT and other AI assistants can manage your
homelab (deploy apps, check health, edit DNS) through one endpoint.
Pick an assistant and DashCaddy generates the access key + config for it.
</div>
<div id="aiconn-endpoint" style="display:none;margin:0 0 12px;padding:8px 10px;border:1px solid var(--border);border-radius:6px;font-size:0.8rem;">
<span style="color:var(--muted);">MCP endpoint:</span>
<code id="aiconn-endpoint-url" style="user-select:all;">\u2014</code>
<button id="aiconn-copy-endpoint" style="margin-left:8px;font-size:0.75rem;">Copy</button>
<div id="aiconn-tools" style="color:var(--muted);margin-top:2px;"></div>
</div>
<!-- Step 1: pick client -->
<div id="aiconn-step-pick">
<div style="font-weight:600;margin:6px 0 8px;">Choose your assistant:</div>
<div style="display:flex;gap:8px;flex-wrap:wrap;">
<button class="aiconn-client-btn" data-client="claude">\u{1F7E0} Claude</button>
<button class="aiconn-client-btn" data-client="chatgpt">\u{1F7E2} ChatGPT</button>
<button class="aiconn-client-btn" data-client="generic">\u{1F50C} Other / generic</button>
</div>
</div>
<!-- Step 2: the generated connection -->
<div id="aiconn-step-config" style="display:none;margin-top:12px;">
<div style="font-weight:600;margin-bottom:6px;" id="aiconn-config-title">Your access key (shown once):</div>
<div style="display:flex;gap:6px;align-items:center;margin-bottom:10px;">
<code id="aiconn-key" style="flex:1;padding:6px 8px;border:1px solid var(--accent);border-radius:4px;background:color-mix(in srgb, var(--accent) 8%, transparent);user-select:all;word-break:break-all;">\u2014</code>
<button id="aiconn-copy-key">Copy</button>
</div>
<div style="font-weight:600;margin-bottom:6px;">Paste into your client:</div>
<pre id="aiconn-snippet" style="white-space:pre-wrap;word-break:break-all;font-size:0.78rem;border:1px solid var(--border);border-radius:6px;padding:10px;max-height:220px;overflow:auto;margin:0 0 8px;"></pre>
<div style="display:flex;gap:6px;align-items:center;margin-bottom:8px;">
<button id="aiconn-copy-snippet">Copy config</button>
<button id="aiconn-back">\u2190 Choose a different assistant</button>
</div>
<div id="aiconn-client-note" style="font-size:0.78rem;color:var(--muted);margin-bottom:10px;"></div>
</div>
<!-- Existing connections -->
<div style="margin-top:14px;padding-top:12px;border-top:1px solid var(--border);">
<div style="font-weight:600;margin-bottom:6px;">Active AI connections</div>
<div id="aiconn-connections" style="display:flex;flex-direction:column;gap:4px;max-height:160px;overflow-y:auto;">
<div style="font-size:0.8rem;color:var(--muted);">Loading\u2026</div>
</div>
</div>
<div class="weather-modal-buttons modal-footer-bar">
<span id="aiconn-status" style="flex:1;font-size:0.78rem;color:var(--muted);align-self:center;"></span>
<button id="aiconn-close">Close</button>
</div>
</div></div>`);const b=f=>document.getElementById(f);let j=null;function g(f){b("aiconn-status").textContent=f}async function N(){try{const f=await secureFetch("/api/v1/mcp/info");if(!f.ok)throw new Error(`HTTP ${f.status}`);const C=await f.json();j=C,b("aiconn-endpoint").style.display="block",b("aiconn-endpoint-url").textContent=C.endpoint,b("aiconn-tools").textContent=`${C.toolCount} tools \xB7 MCP ${C.protocolVersion} \xB7 DashCaddy v${C.serverVersion}`}catch(f){x.log(f,"ai-connect-info"),g("MCP endpoint unavailable on this build.")}}async function A(){const f=b("aiconn-connections");try{const E=await(await secureFetch("/api/v1/mcp/connections")).json().catch(()=>({})),M=E&&Array.isArray(E.connections)?E.connections:[];if(!M.length){f.innerHTML='<div style="font-size:0.8rem;color:var(--muted);">No connections yet \u2014 choose an assistant above.</div>';return}f.innerHTML=M.map(w=>`
<div style="display:flex;gap:8px;align-items:center;font-size:0.8rem;">
<span style="flex:1;">${escapeHtml(w.name)}
<span style="color:var(--muted);">\xB7 ${(w.scopes||[]).join(",")} \xB7 since ${escapeHtml((w.createdAt||"").slice(0,10))}${w.lastUsed?" \xB7 last used "+escapeHtml(String(w.lastUsed).slice(0,10)):""}</span></span>
<button class="aiconn-revoke" data-id="${escapeHtml(w.id)}" style="font-size:0.75rem;color:var(--err-fg);">Revoke</button>
</div>`).join(""),f.querySelectorAll(".aiconn-revoke").forEach(w=>w.addEventListener("click",async()=>{w.disabled=!0;try{const z=await secureFetch(`/api/v1/auth/keys/${encodeURIComponent(w.dataset.id)}`,{method:"DELETE"});if(z.ok)g("Connection revoked."),A();else{const S=await z.json().catch(()=>({}));g(S.error||"Revoke failed."),w.disabled=!1}}catch(z){g("Revoke failed: "+z.message),w.disabled=!1}}))}catch{f.innerHTML='<div style="font-size:0.8rem;color:var(--muted);">Could not load connections.</div>'}}async function D(f){g(`Creating ${f} connection\u2026`);try{const C=await secureFetch("/api/v1/mcp/config",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client:f})}),E=await C.json().catch(()=>({}));if(!C.ok||!E.key){g(E.error||`Failed (HTTP ${C.status})`);return}b("aiconn-key").textContent=E.key;const M=E.httpConfig?JSON.stringify(E.httpConfig,null,2):"";b("aiconn-snippet").textContent=M||"(see note below)",b("aiconn-client-note").textContent=E.note||"",b("aiconn-config-title").textContent=f==="chatgpt"?"Access key (ChatGPT note below):":"Your access key (shown once):",b("aiconn-step-pick").style.display="none",b("aiconn-step-config").style.display="block",g(""),A()}catch(C){x.log(C,"ai-connect-create"),g("Failed: "+C.message)}}function R(f,C){navigator.clipboard&&navigator.clipboard.writeText?navigator.clipboard.writeText(f).then(()=>g(C)).catch(()=>g("Copy failed \u2014 select manually.")):g("Clipboard unavailable \u2014 select manually.")}b("ai-connect-btn").addEventListener("click",()=>{b("ai-connect-modal").style.display="flex",b("aiconn-step-pick").style.display="block",b("aiconn-step-config").style.display="none",g(""),N(),A()}),b("aiconn-close").addEventListener("click",()=>{b("ai-connect-modal").style.display="none"}),b("aiconn-back").addEventListener("click",()=>{b("aiconn-step-config").style.display="none",b("aiconn-step-pick").style.display="block"}),document.querySelectorAll(".aiconn-client-btn").forEach(f=>f.addEventListener("click",()=>D(f.dataset.client))),b("aiconn-copy-key").addEventListener("click",()=>R(b("aiconn-key").textContent,"Key copied \u2014 paste it into your client.")),b("aiconn-copy-snippet").addEventListener("click",()=>R(b("aiconn-snippet").textContent,"Config copied.")),b("aiconn-copy-endpoint").addEventListener("click",()=>R(j?j.endpoint:b("aiconn-endpoint-url").textContent,"Endpoint copied."))})(),(function(){async function x(){try{const R=await(await fetch("/api/v1/health-checks/status")).json();if(!R.success||!R.status)return;for(const[f,C]of Object.entries(R.status)){const E=document.getElementById("uptime-"+f),M=document.getElementById("uptime-bar-"+f);if(!E)continue;const w=C.uptime?.["24h"];if(w!=null){const z=w.toFixed(1);E.textContent=`${z}% uptime`,E.className="uptime-chip",w>=99.9?E.classList.add("excellent"):w>=99?E.classList.add("good"):w>=95?E.classList.add("degraded"):E.classList.add("poor"),M&&(M.style.width=z+"%")}}}catch{console.warn("[Card Badges] Health check API unavailable")}}let b;try{b=new Set(JSON.parse(safeSessionGet("dismissed-updates")||"[]"))}catch{b=new Set}let j=[];async function g(D){try{const f=await(await fetch("/api/v1/updates/available")).json();if(!f.success)return;document.querySelectorAll(".update-available-badge").forEach(E=>E.classList.remove("visible"));const C=f.updates||[];if(j=C,D&&C.length>0){const E=window._lastKnownUpdateCount||0;E>0&&C.length>E&&showNotification(`${C.length} container update(s) available \u2014 click Update Management to review.`,"info"),window._lastKnownUpdateCount=C.length}if(!C.length)return;for(const E of C){const M=window.APPS||[];for(const w of M)if(w.containerId===E.containerId||w.id===E.containerName||w.name===E.containerName){if(b.has(w.id))break;const z=document.getElementById("update-badge-"+w.id),S=document.getElementById("update-btn-"+w.id);z&&(z.classList.add("visible"),z.title="Update available \u2014 click to open Update Management.",z.style.cursor="pointer",z.onclick=T=>{T.stopPropagation(),window.openUpdateModal&&window.openUpdateModal(w.id)}),S&&(S.style.background="#f97316",S.style.borderColor="#f97316",S.style.boxShadow="0 0 6px #f9731688",S.title="Update available \u2014 click to open Update Management.");break}}}catch{console.warn("[Card Badges] Updates API unavailable")}}function N(){setTimeout(()=>{x(),g()},5e3),setInterval(()=>{x(),g(!0)},6e4)}const A=window.refreshAll;A&&(window.refreshAll=async function(){try{await A(),setTimeout(x,1e3)}catch(D){console.warn("[Card Badges] Error in refreshAll hook:",D.message)}}),N()})(),(function(){var x=null,b=null,j={},g={dark:"Dark",light:"Light",blue:"Blue",black:"Black",nord:"Nord",dracula:"Dracula","solarized-dark":"Solarized Dark","solarized-light":"Solarized Light",taxi:"Taxi",ocean:"Ocean"},N=[["bg","Background","base"],["card-base","Card","base"],["fg","Text","base"],["muted","Muted Text","base"],["border","Border","base"],["accent","Accent","accent"],["accent-strong","Accent Strong","accent"],["ok-bg","OK Background","status"],["ok-fg","OK Text","status"],["bad-bg","Error Bg","status"],["bad-fg","Error Text","status"],["dot-ok","Dot OK","status"],["dot-bad","Dot Error","status"],["uptime","Uptime Bar","status"],["hover","Hover","advanced"],["card-hover","Card Hover","advanced"],["base","Tags/Badges","advanced"],["fg-muted","Dim Text","advanced"],["success","Success","advanced"],["error","Error","advanced"],["warning","Warning","advanced"]],A=document.getElementById("theme");if(!A)return;var D=document.getElementById("theme-label");function R(s){if(g[s])return g[s];var a=safeGetJSON(window.USER_THEMES_KEY,{});return a[s]&&a[s].name||s}function f(){D&&(D.textContent=R(window.getActiveTheme()))}A.addEventListener("click",function(){var s=window.THEMES.slice(),a=window.getActiveTheme(),t=s.indexOf(a),o=s[(t+1)%s.length];window.applyTheme(o),f()}),f();function C(){var s={base:"Base Colors",accent:"Accent",status:"Status",advanced:"Advanced (auto-derived)"},a={};N.forEach(function(o){a[o[2]]||(a[o[2]]=[]),a[o[2]].push(o)});var t="";return Object.keys(s).forEach(function(o){o==="advanced"?(t+='<div id="theme-builder-advanced-toggle" class="theme-builder-advanced-toggle" style="margin:12px 0 4px;cursor:pointer;color:var(--accent);font-size:.85rem;user-select:none;">Show advanced colors &#9660;</div>',t+='<div id="theme-builder-advanced" class="theme-builder-section" style="display:none;">'):t+='<div class="theme-builder-section">',t+='<div class="theme-builder-section-title">'+s[o]+"</div>",(a[o]||[]).forEach(function(l){t+='<div class="theme-builder-row"><span class="theme-builder-label">'+l[1]+'</span><input type="color" class="theme-builder-color" data-prop="'+l[0]+'"'+(o==="advanced"?' data-advanced="1"':"")+' value="#000000" /><span class="theme-builder-hex" data-hex="'+l[0]+'">#000000</span></div>'}),t+="</div>"}),t}function E(){return window.THEMES.map(function(s){return'<option value="'+s+'">'+R(s)+"</option>"}).join("")}var M='<div id="theme-builder-modal" class="weather-modal"><div class="weather-modal-content" style="min-width:420px;max-width:560px;"><h3>Theme Builder</h3><div id="theme-builder-existing" style="margin-bottom:16px;display:none;"><label style="font-size:.85rem;color:var(--muted);margin-right:8px;">Edit:</label><select id="theme-builder-edit-select" style="padding:6px 10px;background:var(--card-bg);color:var(--fg);border:1px solid var(--border);border-radius:6px;font-size:.85rem;margin-right:8px;"><option value="">\u2014 New Theme \u2014</option></select><button id="theme-builder-delete" style="padding:4px 10px;background:color-mix(in srgb,var(--bad-fg) 15%,transparent);border:1px solid var(--bad-fg);color:var(--bad-fg);border-radius:6px;font-size:.8rem;cursor:pointer;">Delete</button></div><div style="margin-bottom:16px;"><label style="font-size:.85rem;color:var(--muted);margin-right:8px;">Name:</label><input type="text" id="theme-builder-name" maxlength="20" placeholder="My Theme" style="padding:6px 10px;background:var(--card-bg);color:var(--fg);border:1px solid var(--border);border-radius:6px;font-size:.85rem;width:140px;" /></div><div style="margin-bottom:16px;display:flex;align-items:center;"><label style="font-size:.85rem;color:var(--muted);margin-right:8px;cursor:pointer;" for="theme-builder-lightbg"><input type="checkbox" id="theme-builder-lightbg" style="margin-right:6px;cursor:pointer;vertical-align:middle;" />Light background (use dark logo)</label></div><div style="margin-bottom:16px;"><label style="font-size:.85rem;color:var(--muted);margin-right:8px;">Start from:</label><select id="theme-builder-start" style="padding:6px 10px;background:var(--card-bg);color:var(--fg);border:1px solid var(--border);border-radius:6px;font-size:.85rem;">'+E()+'</select></div><div class="theme-builder-preview" id="theme-builder-preview"><div class="theme-builder-card" id="theme-preview-card"><div class="preview-title">Sample Card</div><div class="preview-muted">Secondary text preview</div><div class="preview-badges"><span class="preview-badge" id="preview-badge-ok">ON</span><span class="preview-badge" id="preview-badge-bad">OFF</span></div><div class="preview-dots"><span><span class="preview-dot" id="preview-dot-ok"></span> Online</span><span><span class="preview-dot" id="preview-dot-bad"></span> Offline</span></div><button class="preview-btn" id="preview-accent-btn">Accent Button</button></div></div>'+C()+'<div class="weather-modal-buttons"><button id="theme-builder-cancel">Cancel</button><button id="theme-builder-import" style="margin-left:auto;" title="Import theme from JSON file">Import</button><button id="theme-builder-export" title="Export theme as JSON file">Export</button><button id="theme-builder-save" class="btn-accent">Save Theme</button></div></div></div>';injectModal("theme-builder-modal",M);var w=document.getElementById("theme-builder-modal"),z=document.getElementById("theme-builder-start"),S=document.getElementById("theme-builder-name"),T=document.getElementById("theme-builder-edit-select"),P=document.getElementById("theme-builder-existing"),v=document.getElementById("theme-builder-lightbg"),B=w.querySelectorAll(".theme-builder-color"),H=document.getElementById("theme-builder-advanced"),O=document.getElementById("theme-builder-advanced-toggle"),u=document.getElementById("theme-builder-export"),m=!1;O.addEventListener("click",function(){m=!m,H.style.display=m?"":"none",O.innerHTML=m?"Hide advanced colors &#9650;":"Show advanced colors &#9660;"});function L(){var s={};return B.forEach(function(a){s[a.dataset.prop]=a.value}),s["card-bg"]=s["card-base"],s}function k(){var s={};return B.forEach(function(a){a.dataset.advanced||(s[a.dataset.prop]=a.value)}),s["card-bg"]=s["card-base"],v.checked&&(s.lightBg=!0),s}function I(){var s=k(),a=window.deriveExtendedColors?window.deriveExtendedColors(s):{};B.forEach(function(t){if(t.dataset.advanced&&!j[t.dataset.prop]){var o=a[t.dataset.prop]||"#333333";t.value=o;var l=w.querySelector('[data-hex="'+t.dataset.prop+'"]');l&&(l.textContent=o.toUpperCase())}})}function i(s){var a=window.THEME_COLORS[s];a&&(j={},B.forEach(function(t){var o=a[t.dataset.prop]||"#000000";(o.startsWith("rgba")||o.startsWith("color-mix"))&&(o="#333333"),t.value=o;var l=w.querySelector('[data-hex="'+t.dataset.prop+'"]');l&&(l.textContent=o.toUpperCase())}),v.checked=!!a.lightBg,d())}function c(s){var a=safeGetJSON(window.USER_THEMES_KEY,{}),t=a[s];t&&(j={},B.forEach(function(o){var l=t[o.dataset.prop]||"#000000";o.value=l;var h=w.querySelector('[data-hex="'+o.dataset.prop+'"]');h&&(h.textContent=l.toUpperCase()),o.dataset.advanced&&t[o.dataset.prop]&&(j[o.dataset.prop]=!0)}),S.value=t.name||"",v.checked=!!t.lightBg,I(),d())}function d(){var s=L(),a=document.getElementById("theme-builder-preview"),t=document.getElementById("theme-preview-card"),o=t.querySelector(".preview-title"),l=t.querySelector(".preview-muted"),h=document.getElementById("preview-badge-ok"),$=document.getElementById("preview-badge-bad"),U=document.getElementById("preview-dot-ok"),F=document.getElementById("preview-dot-bad"),_=document.getElementById("preview-accent-btn"),J=t.querySelector(".preview-dots");a.style.background=s.bg,t.style.background=s["card-base"],t.style.borderColor=s.border,o.style.color=s.fg,l.style.color=s.muted,h.style.background=s["ok-bg"],h.style.color=s["ok-fg"],$.style.background=s["bad-bg"],$.style.color=s["bad-fg"],U.style.background=s["dot-ok"],F.style.background=s["dot-bad"],J.style.color=s.fg,_.style.background=s.accent,_.style.color=s.bg}function y(s){var a=window.deriveExtendedColors?window.deriveExtendedColors(s):{};window.THEME_PROPS.forEach(function(t){var o=s[t]||a[t];o&&document.documentElement.style.setProperty("--"+t,o)})}B.forEach(function(s){s.addEventListener("input",function(){var a=w.querySelector('[data-hex="'+s.dataset.prop+'"]');a&&(a.textContent=s.value.toUpperCase()),s.dataset.advanced?j[s.dataset.prop]=!0:I(),d(),y(L())})}),v.addEventListener("change",function(){I(),d(),y(L())}),z.addEventListener("change",function(){j={},i(z.value),y(L())});function p(){var s=safeGetJSON(window.USER_THEMES_KEY,{}),a=Object.keys(s);T.innerHTML='<option value="">\u2014 New Theme \u2014</option>',a.forEach(function(t){var o=document.createElement("option");o.value=t,o.textContent=s[t].name||t,T.appendChild(o)}),P.style.display=a.length?"":"none"}function n(){z.innerHTML=E()}T.addEventListener("change",function(){var s=this.value;s?(b=s,c(s),y(L())):(b=null,j={},S.value="",z.value=window.getActiveTheme(),i(z.value)),u.style.display=b?"":"none"});function e(){x=window.getActiveTheme(),b=null,j={},m=!1,H.style.display="none",O.innerHTML="Show advanced colors &#9660;",p(),n();var s=safeGetJSON(window.USER_THEMES_KEY,{});s[x]?(T.value=x,b=x,c(x)):(T.value="",S.value="",z.value=x,i(x)),u.style.display=b?"":"none",w.classList.add("show")}var r=document.getElementById("theme-customize-btn");r&&r.addEventListener("click",function(){e()}),document.getElementById("theme-builder-save").addEventListener("click",function(){var s=L(),a=S.value.trim();if(!a){showNotification("Please enter a theme name","warning",3e3),S.focus();return}var t=safeGetJSON(window.USER_THEMES_KEY,{}),o,l=null;if(b){o=b;var h=window.slugifyThemeName(a,b);if(h!==b){l=b,delete t[b];var $=window.THEMES.indexOf(b);$!==-1&&window.THEMES.splice($,1),delete window.THEME_COLORS[b],o=h}}else o=window.slugifyThemeName(a);var U={name:a};v.checked&&(U.lightBg=!0),window.THEME_PROPS.forEach(function(_){s[_]&&(U[_]=s[_])}),t[o]=U,safeSet(window.USER_THEMES_KEY,JSON.stringify(t)),window.clearCustomProperties(),window.injectUserThemeStyles(),window.applyTheme(o),w.classList.remove("show"),f();var F={};window.THEME_PROPS.forEach(function(_){s[_]&&(F[_]=s[_])}),l&&secureFetch("/api/v1/themes/"+l,{method:"DELETE"}).catch(function(){}),secureFetch("/api/v1/themes/"+o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:a,colors:F,lightBg:v.checked})}).then(function(){showNotification(a+" theme saved","success",3e3)}).catch(function(){showNotification(a+" theme saved locally (server sync failed)","warning",3e3)})}),document.getElementById("theme-builder-cancel").addEventListener("click",function(){w.classList.remove("show"),window.clearCustomProperties(),x&&window.applyTheme(x)}),document.getElementById("theme-builder-delete").addEventListener("click",function(){if(b){var s=safeGetJSON(window.USER_THEMES_KEY,{}),a=s[b]?s[b].name:b;if(confirm('Delete "'+a+'" theme?')){var t=b;delete s[t],safeSet(window.USER_THEMES_KEY,JSON.stringify(s));var o=window.THEMES.indexOf(t);o!==-1&&window.THEMES.splice(o,1),delete window.THEME_COLORS[t],window.clearCustomProperties(),window.injectUserThemeStyles();var l=x&&x!==t?x:"dark";window.applyTheme(l),b=null,w.classList.remove("show"),f(),secureFetch("/api/v1/themes/"+t,{method:"DELETE"}).then(function(){showNotification(a+" theme deleted","success",3e3)}).catch(function(){showNotification(a+" theme deleted locally (server sync failed)","warning",3e3)})}}}),document.getElementById("theme-builder-export").addEventListener("click",function(){if(!b){showNotification("Save the theme first, then export","warning",3e3);return}var s=safeGetJSON(window.USER_THEMES_KEY,{}),a=s[b];if(a){var t={_dashcaddy_theme:!0,version:"1.0",exportDate:new Date().toISOString(),slug:b,name:a.name,lightBg:a.lightBg||!1,colors:{}};window.THEME_PROPS.forEach(function($){a[$]&&(t.colors[$]=a[$])});var o=new Blob([JSON.stringify(t,null,2)],{type:"application/json"}),l=URL.createObjectURL(o),h=document.createElement("a");h.href=l,h.download=b+"-theme.json",document.body.appendChild(h),h.click(),document.body.removeChild(h),URL.revokeObjectURL(l),showNotification("Theme exported as "+b+"-theme.json","success",3e3)}}),document.getElementById("theme-builder-import").addEventListener("click",function(){var s=document.createElement("input");s.type="file",s.accept=".json",s.onchange=function(a){var t=a.target.files[0];if(t){var o=new FileReader;o.onload=function(l){try{var h=JSON.parse(l.target.result),$,U,F;if(h._dashcaddy_theme&&h.colors)$=h.name||"Imported",U=h.colors,F=h.lightBg||!1;else if(h.name&&(h.bg||h["card-base"]))$=h.name,U={},window.THEME_PROPS.forEach(function(_){h[_]&&(U[_]=h[_])}),F=h.lightBg||!1;else throw new Error("Not a valid DashCaddy theme file");S.value=$,v.checked=!!F,b=null,T.value="",j={},B.forEach(function(_){var J=U[_.dataset.prop]||"#000000";_.value=J;var q=w.querySelector('[data-hex="'+_.dataset.prop+'"]');q&&(q.textContent=J.toUpperCase()),_.dataset.advanced&&U[_.dataset.prop]&&(j[_.dataset.prop]=!0)}),I(),d(),y(L()),u.style.display="none",showNotification('"'+$+'" loaded into builder. Click Save to keep it.',"success",5e3)}catch(_){showNotification("Import failed: "+_.message,"error",5e3)}},o.readAsText(t)}},s.click()}),wireModal(w),w.addEventListener("click",function(s){s.target===w&&(window.clearCustomProperties(),x&&window.applyTheme(x))})})(),(function(){injectModal("license-modal",`<div id="license-modal" class="weather-modal">
<div class="weather-modal-content" style="min-width: 420px; max-width: 520px;">
<h3>DashCaddy License</h3>
<p style="font-size: 0.85rem; color: var(--muted); margin: 0 0 16px;">
Activate a license code to unlock premium features.
</p>
<div id="license-status-section" style="margin-bottom: 16px;">
<div id="license-badge" style="display: inline-flex; align-items: center; gap: 6px; padding: 6px 14px; border-radius: 20px; font-size: 0.85rem; font-weight: 600; margin-bottom: 12px;">
<span id="license-badge-icon"></span>
<span id="license-badge-text"></span>
</div>
<div id="license-details" style="font-size: 0.85rem; color: var(--muted); line-height: 1.6;"></div>
</div>
<div id="license-activate-section">
<label class="form-label-bold">License Code:</label>
<input type="text" id="license-code-input" placeholder="DC-XXXXX-XXXXX-XXXXX-XXXXX-XXXXX"
maxlength="35" spellcheck="false" autocomplete="off"
style="width: 100%; padding: 10px 12px; border: 1px solid var(--border); border-radius: 4px; background: var(--card-bg); color: var(--fg); font-size: 1rem; font-family: monospace; letter-spacing: 1px;" />
<p class="tiny-hint">Enter your license code to activate premium features</p>
</div>
<div id="license-features" style="margin-top: 16px;">
<label class="form-label-bold" style="margin-bottom: 8px; display: block;">Premium Features:</label>
<div id="license-feature-list" style="display: grid; gap: 8px;"></div>
</div>
<div id="license-error" style="display: none; margin-top: 12px; padding: 10px; border-radius: 4px; background: rgba(231,76,60,0.15); color: var(--bad-fg); font-size: 0.85rem;"></div>
<div id="license-success" style="display: none; margin-top: 12px; padding: 10px; border-radius: 4px; background: rgba(46,204,113,0.15); color: var(--ok-fg); font-size: 0.85rem;"></div>
<div class="weather-modal-buttons" style="margin-top: 16px;">
<button id="license-cancel">Close</button>
<button id="license-deactivate" class="btn-accent" style="display: none; background: var(--bad-bg); border-color: var(--bad-fg); color: var(--bad-fg);">Deactivate</button>
<button id="license-activate" class="btn-accent">Activate</button>
</div>
</div>
</div>`);const x=document.getElementById("license-modal"),b=document.getElementById("license-code-input"),j=document.getElementById("license-activate"),g=document.getElementById("license-deactivate"),N=document.getElementById("license-error"),A=document.getElementById("license-success"),D=document.getElementById("license-badge-icon"),R=document.getElementById("license-badge-text"),f=document.getElementById("license-badge"),C=document.getElementById("license-details"),E=document.getElementById("license-feature-list"),M=document.getElementById("license-activate-section");let w=null;function z(){N.style.display="none",A.style.display="none"}function S(L){z(),N.textContent=L,N.style.display="block"}function T(L){z(),A.textContent=L,A.style.display="block"}function P(L){if(w=L,L.active){f.style.background="rgba(46,204,113,0.15)",f.style.color="var(--ok-fg)",D.textContent="\u2605",R.textContent="Premium Active";const i=L.lifetime?"<div>License: <strong>LIFETIME</strong></div>":`<div>Expires: <strong>${new Date(L.expiresAt).toLocaleDateString()}</strong> (${L.daysRemaining} days remaining)</div>`;C.innerHTML=`
<div>Code: <code style="font-family: monospace;">${L.code||"***"}</code></div>
${i}
`,M.style.display="none",j.style.display="none",g.style.display=""}else f.style.background="rgba(149,165,166,0.15)",f.style.color="var(--muted)",D.textContent="\u2606",R.textContent=L.expired?"License Expired":"Free Tier",C.innerHTML=L.expired?"<div>Your license has expired. Enter a new code to renew.</div>":"<div>Enter a license code to unlock premium features.</div>",M.style.display="",j.style.display="",g.style.display="none";const k=L.premiumFeatures||{},I=new Set(L.features||[]);E.innerHTML=Object.entries(k).map(([i,c])=>`<div style="display: flex; align-items: center; gap: 8px; padding: 8px 12px; border-radius: 6px; background: var(--card-bg); border: 1px solid var(--border);">
<span style="font-size: 1.1rem;">${I.has(i)?"\u2705":"\u{1F512}"}</span>
<div>
<div style="font-weight: 600; font-size: 0.9rem;">${c.name}</div>
<div style="font-size: 0.78rem; color: var(--muted);">${c.description}</div>
</div>
</div>`).join("")}async function v(){try{const k=await(await fetch("/api/v1/license/status")).json();k.success&&(P(k.license),O(k.license))}catch(L){console.warn("Failed to load license status:",L.message)}}async function B(){const L=b.value.trim();if(!L){S("Please enter a license code.");return}z(),j.disabled=!0,j.textContent="Activating...";try{const I=await(await secureFetch("/api/v1/license/activate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({code:L})})).json();I.success?(T(I.message),b.value="",P(I.license),showNotification("License activated! Premium features unlocked.","success",5e3),O(I.license)):S(I.error||"Activation failed")}catch(k){S("Network error: "+k.message)}finally{j.disabled=!1,j.textContent="Activate"}}async function H(){if(confirm("Deactivate your license? You can reuse the code on another machine.")){g.disabled=!0,g.textContent="Deactivating...";try{const k=await(await secureFetch("/api/v1/license/deactivate",{method:"POST"})).json();k.success?(T(k.message),await v(),showNotification("License deactivated.","info",3e3),O({active:!1})):S(k.error||"Deactivation failed")}catch(L){S("Network error: "+L.message)}finally{g.disabled=!1,g.textContent="Deactivate"}}}function O(L){const k=document.getElementById("license-status-topbar"),I=document.getElementById("license-topbar-icon"),i=document.getElementById("license-topbar-text"),c=document.getElementById("license-topbar-time");if(k)if(k.className="license-status-topbar "+(L.active?"premium":"free"),L.active)if(I.textContent="\u2605",i.textContent="PREMIUM",L.lifetime)c.textContent="\xB7 LIFETIME";else{const d=L.daysRemaining;c.textContent=d!=null?"\xB7 "+d+"d remaining":""}else I.textContent="\u2606",i.textContent=L.expired?"EXPIRED":"FREE TIER",c.textContent=""}function u(){z(),v(),x.classList.add("show")}b.addEventListener("input",function(){let L=this.value.toUpperCase().replace(/[^A-Z0-9-]/g,"");if(L.length>this._prevLength&&(L=L.replace(/-/g,""),L.length>2&&!L.startsWith("DC")&&(L="DC"+L),L.startsWith("DC")&&L.length>2)){const k=["DC"],I=L.substring(2);for(let i=0;i<I.length;i+=5)k.push(I.substring(i,i+5));L=k.join("-")}this._prevLength=L.length,this.value=L}),j.addEventListener("click",B),g.addEventListener("click",H),b.addEventListener("keydown",L=>{L.key==="Enter"&&B()}),wireModal(x,document.getElementById("license-cancel"));const m=document.getElementById("license-status-topbar");m&&m.addEventListener("click",()=>window.openLicenseModal&&window.openLicenseModal()),window.openLicenseModal=u,window.checkPremiumFeature=async function(L){try{return(await(await fetch(`/api/v1/license/feature/${L}`)).json()).available}catch{return!1}},v().then(L=>{w&&O(w)})})(),(function(){"use strict";if(window.__dc_058_share_modal_loaded)return;window.__dc_058_share_modal_loaded=!0;const x=[{ms:3600*1e3,label:"1 hour"},{ms:1440*60*1e3,label:"24 hours"},{ms:10080*60*1e3,label:"7 days"}];injectModal("share-modal",`
<div id="share-modal" class="weather-modal" role="dialog" aria-labelledby="share-modal-title">
<div class="weather-modal-content" style="min-width: 460px; max-width: 580px;">
<h3 id="share-modal-title">Share <span id="share-modal-service-name">\u2026</span></h3>
<p style="font-size: 0.85rem; color: var(--muted); margin: 0 0 16px;">
Create a public link or Tailscale invite so someone outside your network can access this service.
</p>
<div class="share-tabs" style="display: flex; gap: 4px; margin-bottom: 16px; border-bottom: 1px solid var(--border);">
<button class="share-tab active" data-tab="public" type="button"
style="background: transparent; border: 0; border-bottom: 2px solid var(--accent); padding: 8px 14px; color: var(--fg); font-weight: 600; cursor: pointer;">
Public link
</button>
<button class="share-tab" data-tab="tailscale" type="button"
style="background: transparent; border: 0; border-bottom: 2px solid transparent; padding: 8px 14px; color: var(--muted); cursor: pointer;">
Tailscale invite
</button>
</div>
<div class="share-tab-panel" data-panel="public">
<label class="form-label-bold" for="share-public-ttl">Link duration:</label>
<select id="share-public-ttl" style="width: 100%; padding: 8px 10px; margin: 6px 0 12px; background: var(--input-bg); color: var(--fg); border: 1px solid var(--border); border-radius: 4px;">
${x.map(n=>`<option value="${n.ms}">${n.label}</option>`).join("")}
</select>
<button id="share-public-create" class="btn-accent" type="button"
style="width: 100%; padding: 10px; background: var(--accent); color: #04141f; border: 0; border-radius: 4px; font-weight: 600; cursor: pointer;">
Create share link
</button>
</div>
<div class="share-tab-panel" data-panel="tailscale" style="display: none;">
<label class="form-label-bold" for="share-ts-email">Recipient email:</label>
<input id="share-ts-email" type="email" placeholder="alice@example.com" autocomplete="off"
style="width: 100%; padding: 10px 12px; margin: 6px 0 12px; background: var(--card-bg); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; font-size: 0.95rem;" />
<p style="font-size: 0.8rem; color: var(--muted); margin: 0 0 12px;">
A single-use Tailscale pre-auth key is generated and emailed. The device joins your tailnet and is routed to this service via Caddy.
</p>
<button id="share-ts-create" class="btn-accent" type="button"
style="width: 100%; padding: 10px; background: var(--accent); color: #04141f; border: 0; border-radius: 4px; font-weight: 600; cursor: pointer;">
Create Tailscale invite
</button>
</div>
<div id="share-issued" style="display: none; margin-top: 16px; padding: 12px; background: var(--card-bg); border: 1px solid var(--border); border-radius: 6px;">
<div style="font-size: 0.8rem; color: var(--muted); margin-bottom: 6px;">Share link:</div>
<div style="display: flex; gap: 6px; align-items: center;">
<input id="share-issued-url" type="text" readonly
style="flex: 1; padding: 8px 10px; background: var(--bg); color: var(--fg); border: 1px solid var(--border); border-radius: 4px; font-family: monospace; font-size: 0.85rem;" />
<button id="share-issued-copy" type="button"
style="padding: 8px 14px; background: var(--accent); color: #04141f; border: 0; border-radius: 4px; font-weight: 600; cursor: pointer;">
Copy
</button>
</div>
<div id="share-issued-meta" style="font-size: 0.8rem; color: var(--muted); margin-top: 8px;"></div>
</div>
<div id="share-error" style="display: none; margin-top: 12px; padding: 10px; border-radius: 4px; background: rgba(231,76,60,0.15); color: var(--bad-fg); font-size: 0.85rem;"></div>
<div id="share-success" style="display: none; margin-top: 12px; padding: 10px; border-radius: 4px; background: rgba(46,204,113,0.15); color: var(--ok-fg); font-size: 0.85rem;"></div>
<div id="share-outstanding" style="margin-top: 16px;">
<label class="form-label-bold">Outstanding shares for this service</label>
<div id="share-outstanding-list" style="margin-top: 6px; font-size: 0.85rem;"></div>
</div>
<div class="weather-modal-buttons" style="margin-top: 18px;">
<button id="share-cancel" type="button">Close</button>
</div>
</div>
</div>
`);const b=document.getElementById("share-modal"),j=document.getElementById("share-modal-service-name"),g=document.getElementById("share-issued"),N=document.getElementById("share-issued-url"),A=document.getElementById("share-issued-copy"),D=document.getElementById("share-issued-meta"),R=document.getElementById("share-error"),f=document.getElementById("share-success"),C=document.getElementById("share-outstanding-list"),E=document.getElementById("share-cancel"),M=document.getElementById("share-public-create"),w=document.getElementById("share-ts-create"),z=document.getElementById("share-ts-email"),S=document.getElementById("share-public-ttl");let T=null,P="public";function v(){R.style.display="none",f.style.display="none",g.style.display="none"}function B(n){f.style.display="none",g.style.display="none",R.textContent=n,R.style.display="block"}function H(n){R.style.display="none",f.textContent=n,f.style.display="block"}function O(){return window.location.origin}function u(n){return n.startsWith("http")?n:O()+n}function m(n){if(!n)return"";const e=new Date(n);return Number.isNaN(e.getTime())?"":e.toLocaleString()}function L(n){if(n<=0)return"expired";const e=Math.floor(n/36e5);if(e>=24)return`${Math.floor(e/24)}d ${e%24}h left`;const r=Math.floor(n%36e5/6e4);return`${e}h ${r}m left`}function k(n){P=n,v(),b.querySelectorAll(".share-tab").forEach(e=>{const r=e.dataset.tab===n;e.classList.toggle("active",r),e.style.borderBottomColor=r?"var(--accent)":"transparent",e.style.color=r?"var(--fg)":"var(--muted)",e.style.fontWeight=r?"600":"400"}),b.querySelectorAll(".share-tab-panel").forEach(e=>{e.style.display=e.dataset.panel===n?"":"none"})}async function I(){C.innerHTML='<span style="color: var(--muted);">Loading\u2026</span>';try{const n=await fetch("/api/v1/share",{credentials:"same-origin"});if(!n.ok){C.innerHTML='<span style="color: var(--muted);">No shares listed.</span>';return}const e=await n.json(),s=(e&&e.data||[]).filter(a=>a.serviceId===T.id);if(s.length===0){C.innerHTML='<span style="color: var(--muted);">No outstanding shares for this service.</span>';return}C.innerHTML=s.map(a=>{const t=a.expiresAt?L(new Date(a.expiresAt).getTime()-Date.now()):"";return`
<div class="share-row" data-share-id="${escapeHtml(a.id)}"
style="display: flex; align-items: center; gap: 8px; padding: 6px 0; border-bottom: 1px dashed var(--border);">
<span style="flex: 1;">
<strong>${a.kind==="tailscale"?"Tailscale":"Public"}</strong>
<span style="color: var(--muted);"> \xB7 expires ${escapeHtml(m(a.expiresAt))} (${t})</span>
</span>
<button class="share-revoke" data-share-id="${escapeHtml(a.id)}" type="button"
style="padding: 4px 10px; background: transparent; color: var(--bad-fg); border: 1px solid var(--bad-fg); border-radius: 4px; cursor: pointer; font-size: 0.8rem;">
Revoke
</button>
</div>
`}).join(""),C.querySelectorAll(".share-revoke").forEach(a=>{a.addEventListener("click",()=>i(a.dataset.shareId))})}catch{C.innerHTML='<span style="color: var(--muted);">Could not load outstanding shares.</span>'}}async function i(n){try{const e=await fetch(`/api/v1/share/${encodeURIComponent(n)}`,{method:"DELETE",credentials:"same-origin"});if(!e.ok){const r=await e.json().catch(()=>({}));B(r&&r.error||`Revoke failed (HTTP ${e.status}).`);return}H("Share revoked."),I()}catch{B("Network error while revoking.")}}async function c(){if(!T)return;v(),M.disabled=!0;const n=M.textContent;M.textContent="Creating\u2026";try{const e=parseInt(S.value,10),r=await fetch("/api/v1/share",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceId:T.id,ttlMs:e})}),s=await r.json().catch(()=>({}));if(!r.ok||!s.success){y(r.status,s);return}const a=s.data.urlPath;N.value=u(a),D.textContent=`Public link \xB7 expires ${m(s.data.expiresAt)}`,g.style.display="block",H("Share link created."),I()}catch{B("Network error while creating share.")}finally{M.disabled=!1,M.textContent=n}}async function d(){if(!T)return;const n=(z.value||"").trim();if(!n||!n.includes("@")){B("A valid recipient email is required.");return}v(),w.disabled=!0;const e=w.textContent;w.textContent="Creating\u2026";try{const r=await fetch("/api/v1/share/tailscale",{method:"POST",credentials:"same-origin",headers:{"Content-Type":"application/json"},body:JSON.stringify({serviceId:T.id,email:n})}),s=await r.json().catch(()=>({}));if(!r.ok||!s.success){y(r.status,s);return}const a=s.data&&s.data.urlPath;a?(N.value=u(a),D.textContent=`Tailscale invite \xB7 emailed to ${n} (or use this URL manually if delivery failed).`):(N.value="",D.textContent=`Tailscale invite sent to ${n}.`),g.style.display="block",H("Tailscale invite created."),z.value="",I()}catch{B("Network error while creating Tailscale invite.")}finally{w.disabled=!1,w.textContent=e}}function y(n,e){const r=e&&e.error||"";if(n===402){B("Share is a Pro feature. Activate a license to unlock.");return}if(n===400&&/tailscale/i.test(r)){B("Tailscale is not configured on this host. Set up Tailscale in the dashboard first.");return}if(n===403){B("You do not have permission to share services.");return}if(n===404){B("Service not found. It may have been deleted.");return}B(r||`Request failed (HTTP ${n}).`)}function p(n){!n||!n.id||(T={id:n.id,name:n.name||n.id},j.textContent=T.name,v(),k("public"),z.value="",S.value=String(x[1].ms),b.classList.add("show"),I())}b.querySelectorAll(".share-tab").forEach(n=>{n.addEventListener("click",()=>k(n.dataset.tab))}),M.addEventListener("click",c),w.addEventListener("click",d),E.addEventListener("click",()=>b.classList.remove("show")),wireModal(b,E),A.addEventListener("click",async()=>{const n=N.value;if(n)try{navigator.clipboard&&navigator.clipboard.writeText?await navigator.clipboard.writeText(n):(N.select(),document.execCommand("copy"));const e=A.textContent;A.textContent="Copied!",setTimeout(()=>{A.textContent=e},1200)}catch{B("Could not copy to clipboard. Select the URL manually.")}}),window.openShareModal=p})();
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiPHN0ZGluPiJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLy8gTG9nbyBDdXN0b21pemF0aW9uIFN5c3RlbVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnbG9nby1tb2RhbCcsIGA8ZGl2IGlkPVwibG9nby1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNDAwcHg7IG1heC13aWR0aDogNTIwcHg7XCI+XG4gICAgICA8aDM+RGFzaGJvYXJkIFNldHRpbmdzPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNnB4O1wiPlxuICAgICAgICBDdXN0b21pemUgeW91ciBkYXNoYm9hcmQncyBhcHBlYXJhbmNlIGFuZCBzeXN0ZW0gcHJlZmVyZW5jZXMuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwiZGFzaGJvYXJkLXRpdGxlXCIgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5EYXNoYm9hcmQgVGl0bGU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkYXNoYm9hcmQtdGl0bGVcIiBwbGFjZWhvbGRlcj1cIkRhc2hDYWRkeVwiIG1heGxlbmd0aD1cIjUwXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDFyZW07XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJ0aW55LWhpbnRcIj5TaG93biBpbiBicm93c2VyIHRhYiBhbmQgaGVhZGVyIChtYXggNTAgY2hhcmFjdGVycyk8L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGhyIGNsYXNzPVwiaHItZGl2aWRlclwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5Mb2dvOjwvbGFiZWw+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAycHg7XCI+U2VwYXJhdGUgbG9nb3MgZm9yIGRhcmsgYW5kIGxpZ2h0IHRoZW1lcywgb3IgdXNlIHRoZSBzYW1lIGZvciBib3RoLjwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogIzFhMWEyZTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwuMSk7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImxvZ28tcHJldmlldy1kYXJrXCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZ1wiIGFsdD1cIkRhcmsgdGhlbWUgbG9nb1wiIHN0eWxlPVwibWF4LWhlaWdodDogNjBweDsgbWF4LXdpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiAjOWFhNmJmOyBtYXJnaW4tdG9wOiA2cHg7XCI+RGFyayB0aGVtZXM8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAxNnB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogI2YwZjBmMDsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwuMSk7XCI+XG4gICAgICAgICAgPGltZyBpZD1cImxvZ28tcHJldmlldy1saWdodFwiIHNyYz1cIi9hc3NldHMvZGFzaGNhZGR5LWxvZ28tbGlnaHQucG5nXCIgYWx0PVwiTGlnaHQgdGhlbWUgbG9nb1wiIHN0eWxlPVwibWF4LWhlaWdodDogNjBweDsgbWF4LXdpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IGNvbG9yOiAjNWY2YjdhOyBtYXJnaW4tdG9wOiA2cHg7XCI+TGlnaHQgdGhlbWVzPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPHAgaWQ9XCJsb2dvLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxMnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+VXNpbmcgZGVmYXVsdCBsb2dvczwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuODJyZW07IGN1cnNvcjogcG9pbnRlcjsgdXNlci1zZWxlY3Q6IG5vbmU7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwibG9nby1zYW1lLWJvdGhcIiAvPiBVc2Ugc2FtZSBsb2dvIGZvciBib3RoXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxvZ28tZHVhbC11cGxvYWRzXCIgY2xhc3M9XCJtYi0xNlwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwibG9nby11cGxvYWQtZGFya1wiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDZweDsgZm9udC1zaXplOiAwLjhyZW07XCI+RGFyayB0aGVtZSBsb2dvOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC1kYXJrXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIGNsYXNzPVwiaW5wdXQtY2FyZC1hbHRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImxvZ28tdXBsb2FkLWxpZ2h0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5MaWdodCB0aGVtZSBsb2dvOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJsb2dvLXVwbG9hZC1saWdodFwiIGFjY2VwdD1cImltYWdlLypcIiBjbGFzcz1cImlucHV0LWNhcmQtYWx0XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07XCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxvZ28tc2luZ2xlLXVwbG9hZFwiIGNsYXNzPVwibWItMTZcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxsYWJlbCBmb3I9XCJsb2dvLXVwbG9hZC1zaW5nbGVcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA2cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlVwbG9hZCBsb2dvOjwvbGFiZWw+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwibG9nby11cGxvYWQtc2luZ2xlXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIGNsYXNzPVwiaW5wdXQtY2FyZC1hbHRcIiAvPlxuICAgICAgICA8cCBjbGFzcz1cInRpbnktaGludFwiPlRoaXMgbG9nbyB3aWxsIGJlIHVzZWQgb24gYWxsIHRoZW1lczwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItMTZcIj5cbiAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDhweDtcIj5Mb2dvIFBvc2l0aW9uOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJsb2dvLXBvc2l0aW9uLWJ0bnNcIiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtcG9zPVwibGVmdFwiIGNsYXNzPVwibG9nby1wb3MtYnRuIGJ0bi1vcHRpb25cIj5MZWZ0PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1wb3M9XCJjZW50ZXJcIiBjbGFzcz1cImxvZ28tcG9zLWJ0biBidG4tb3B0aW9uXCI+Q2VudGVyPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1wb3M9XCJyaWdodFwiIGNsYXNzPVwibG9nby1wb3MtYnRuIGJ0bi1vcHRpb25cIj5SaWdodDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8aHIgY2xhc3M9XCJoci1kaXZpZGVyXCIgLz5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLTE2XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPkZhdmljb24gKEJyb3dzZXIgVGFiIEljb24pOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJmYXZpY29uLXByZXZpZXctY29udGFpbmVyXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDhweDsgcGFkZGluZzogMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTtcIj5cbiAgICAgICAgICA8aW1nIGlkPVwiZmF2aWNvbi1wcmV2aWV3XCIgc3JjPVwiL2Fzc2V0cy9kYXNoY2FkZHktZmF2aWNvbi5pY29cIiBhbHQ9XCJDdXJyZW50IGZhdmljb25cIiBzdHlsZT1cIndpZHRoOiAzMnB4OyBoZWlnaHQ6IDMycHg7IGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkO1wiIG9uZXJyb3I9XCJ0aGlzLnNyYz0nZGF0YTppbWFnZS9zdmcreG1sLDxzdmcgeG1sbnM9JTIyaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmclMjIgdmlld0JveD0lMjIwIDAgMzIgMzIlMjI+PHJlY3QgZmlsbD0lMjIlMjM2NjclMjIgd2lkdGg9JTIyMzIlMjIgaGVpZ2h0PSUyMjMyJTIyIHJ4PSUyMjQlMjIvPjwvc3ZnPidcIiAvPlxuICAgICAgICAgIDxzcGFuIGlkPVwiZmF2aWNvbi1zdGF0dXNcIiBjbGFzcz1cInRleHQtdGlueS1tdXRlZFwiPlVzaW5nIERhc2hDYWRkeSBmYXZpY29uPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCJmYXZpY29uLXVwbG9hZFwiIGFjY2VwdD1cImltYWdlL3BuZyxpbWFnZS9zdmcreG1sXCIgY2xhc3M9XCJpbnB1dC1jYXJkLWFsdFwiIC8+XG4gICAgICAgIDxwIGNsYXNzPVwidGlueS1oaW50XCI+VXBsb2FkIFBORyBvciBTVkcgLSBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCB0byBJQ088L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGhyIGNsYXNzPVwiaHItZGl2aWRlclwiIC8+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0xNlwiPlxuICAgICAgICA8bGFiZWwgZm9yPVwic2V0dGluZ3MtdGltZXpvbmVcIiBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPlRpbWV6b25lOjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJzZXR0aW5ncy10aW1lem9uZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAxcmVtO1wiPlxuICAgICAgICAgIDwhLS0gUG9wdWxhdGVkIGJ5IEpTIHdpdGggSUFOQSB0aW1lem9uZXMgLS0+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8cCBjbGFzcz1cInRpbnktaGludFwiPlVzZWQgYnkgYWxsIGRlcGxveWVkIGNvbnRhaW5lcnMuIENoYW5nZXMgYXBwbHkgdG8gbmV3IGRlcGxveW1lbnRzLjwvcD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsb2dvLXJlc2V0XCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgI2VmNDQ0NCAyMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLWNvbG9yOiAjZWY0NDQ0OyBjb2xvcjogI2VmNDQ0NDtcIj5SZXNldCB0byBEZWZhdWx0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsb2dvLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibG9nby1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IGxvZ29Nb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLW1vZGFsJyk7XG4gIGNvbnN0IHByZXZpZXdEYXJrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tcHJldmlldy1kYXJrJyk7XG4gIGNvbnN0IHByZXZpZXdMaWdodCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXByZXZpZXctbGlnaHQnKTtcbiAgY29uc3QgbG9nb1N0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXN0YXR1cycpO1xuICBjb25zdCBzYW1lQm90aENoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc2FtZS1ib3RoJyk7XG4gIGNvbnN0IGR1YWxVcGxvYWRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tZHVhbC11cGxvYWRzJyk7XG4gIGNvbnN0IHNpbmdsZVVwbG9hZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXNpbmdsZS11cGxvYWQnKTtcbiAgY29uc3QgdXBsb2FkRGFyayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXVwbG9hZC1kYXJrJyk7XG4gIGNvbnN0IHVwbG9hZExpZ2h0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tdXBsb2FkLWxpZ2h0Jyk7XG4gIGNvbnN0IHVwbG9hZFNpbmdsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXVwbG9hZC1zaW5nbGUnKTtcbiAgY29uc3QgYnJhbmRMb2dvRGFyayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNicmFuZCAuYnJhbmQtbG9nby1kYXJrJyk7XG4gIGNvbnN0IGJyYW5kTG9nb0xpZ2h0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI2JyYW5kIC5icmFuZC1sb2dvLWxpZ2h0Jyk7XG4gIGNvbnN0IHRvcFJvdyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy50b3Atcm93Jyk7XG4gIGNvbnN0IGRhc2hib2FyZFRpdGxlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGJvYXJkLXRpdGxlJyk7XG4gIGNvbnN0IERFRkFVTFRfVElUTEUgPSBEQy5OQU1FO1xuXG4gIGxldCBwZW5kaW5nRGFya0RhdGEgPSBudWxsO1xuICBsZXQgcGVuZGluZ0xpZ2h0RGF0YSA9IG51bGw7XG4gIGxldCBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gIGxldCBjdXJyZW50UG9zaXRpb24gPSAnbGVmdCc7XG4gIGxldCBjdXJyZW50VGl0bGUgPSBERUZBVUxUX1RJVExFO1xuXG4gIC8vIFRvZ2dsZSBiZXR3ZWVuIGR1YWwgYW5kIHNpbmdsZSB1cGxvYWQgbW9kZVxuICBzYW1lQm90aENoZWNrYm94Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKHNhbWVCb3RoQ2hlY2tib3guY2hlY2tlZCkge1xuICAgICAgZHVhbFVwbG9hZHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHNpbmdsZVVwbG9hZC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAvLyBDbGVhciBpbmRpdmlkdWFsIHBlbmRpbmcgZGF0YVxuICAgICAgcGVuZGluZ0RhcmtEYXRhID0gbnVsbDtcbiAgICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBkdWFsVXBsb2Fkcy5zdHlsZS5kaXNwbGF5ID0gJ2ZsZXgnO1xuICAgICAgc2luZ2xlVXBsb2FkLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gICAgfVxuICB9KTtcblxuICAvLyBSZWFkIGZpbGUgYXMgZGF0YSBVUkwgaGVscGVyXG4gIGZ1bmN0aW9uIHJlYWRGaWxlQXNEYXRhVVJMKGZpbGUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCFmaWxlIHx8ICFmaWxlLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBzZWxlY3QgYW4gaW1hZ2UgZmlsZScsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IChlKSA9PiBjYWxsYmFjayhlLnRhcmdldC5yZXN1bHQpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9XG5cbiAgLy8gVXBsb2FkIGhhbmRsZXJzXG4gIHVwbG9hZERhcms/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgcmVhZEZpbGVBc0RhdGFVUkwoZS50YXJnZXQuZmlsZXNbMF0sIChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nRGFya0RhdGEgPSBkYXRhO1xuICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YTtcbiAgICAgIGxvZ29TdGF0dXMudGV4dENvbnRlbnQgPSAnTmV3IGRhcmsgbG9nbyByZWFkeSB0byBzYXZlJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBsb2FkTGlnaHQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgcmVhZEZpbGVBc0RhdGFVUkwoZS50YXJnZXQuZmlsZXNbMF0sIChkYXRhKSA9PiB7XG4gICAgICBwZW5kaW5nTGlnaHREYXRhID0gZGF0YTtcbiAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhO1xuICAgICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgbGlnaHQgbG9nbyByZWFkeSB0byBzYXZlJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgdXBsb2FkU2luZ2xlPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIHJlYWRGaWxlQXNEYXRhVVJMKGUudGFyZ2V0LmZpbGVzWzBdLCAoZGF0YSkgPT4ge1xuICAgICAgcGVuZGluZ1NpbmdsZURhdGEgPSBkYXRhO1xuICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YTtcbiAgICAgIHByZXZpZXdMaWdodC5zcmMgPSBkYXRhO1xuICAgICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgbG9nbyByZWFkeSB0byBzYXZlIChib3RoIHRoZW1lcyknO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBBcHBseSBsb2dvIHBvc2l0aW9uXG4gIGZ1bmN0aW9uIGFwcGx5TG9nb1Bvc2l0aW9uKHBvcykge1xuICAgIHRvcFJvdy5zZXRBdHRyaWJ1dGUoJ2RhdGEtbG9nby1wb3MnLCBwb3MpO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2dvLXBvcy1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9IGJ0bi5kYXRhc2V0LnBvcyA9PT0gcG9zID8gJ3ZhcigtLWFjY2VudCknIDogJ3ZhcigtLWNhcmQtYmcpJztcbiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IGJ0bi5kYXRhc2V0LnBvcyA9PT0gcG9zID8gJ3doaXRlJyA6ICd2YXIoLS1mZyknO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gQXBwbHkgZGFzaGJvYXJkIHRpdGxlXG4gIGZ1bmN0aW9uIGFwcGx5RGFzaGJvYXJkVGl0bGUodGl0bGUpIHtcbiAgICBjdXJyZW50VGl0bGUgPSB0aXRsZSB8fCBERUZBVUxUX1RJVExFO1xuICAgIGRvY3VtZW50LnRpdGxlID0gY3VycmVudFRpdGxlO1xuICAgIGNvbnN0IGhlYWRlclRpdGxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmRhc2hib2FyZC10aXRsZScpO1xuICAgIGlmIChoZWFkZXJUaXRsZSkgaGVhZGVyVGl0bGUudGV4dENvbnRlbnQgPSBjdXJyZW50VGl0bGU7XG4gIH1cblxuICAvLyBMb2FkIGN1c3RvbSBsb2dvLCBwb3NpdGlvbiwgYW5kIHRpdGxlIG9uIHN0YXJ0dXBcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEN1c3RvbUxvZ28oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbG9nbycpO1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIC8vIEFwcGx5IGRhcmsvbGlnaHQgdmFyaWFudHNcbiAgICAgICAgaWYgKGRhdGEuY3VzdG9tTG9nb0RhcmspIHtcbiAgICAgICAgICBicmFuZExvZ29EYXJrLnNyYyA9IGRhdGEuY3VzdG9tTG9nb0Rhcms7XG4gICAgICAgICAgcHJldmlld0Rhcmsuc3JjID0gZGF0YS5jdXN0b21Mb2dvRGFyaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5jdXN0b21Mb2dvTGlnaHQpIHtcbiAgICAgICAgICBicmFuZExvZ29MaWdodC5zcmMgPSBkYXRhLmN1c3RvbUxvZ29MaWdodDtcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvTGlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTGVnYWN5IHNpbmdsZS1sb2dvIGZhbGxiYWNrXG4gICAgICAgIGlmICghZGF0YS5jdXN0b21Mb2dvRGFyayAmJiAhZGF0YS5jdXN0b21Mb2dvTGlnaHQgJiYgZGF0YS5jdXN0b21Mb2dvKSB7XG4gICAgICAgICAgYnJhbmRMb2dvRGFyay5zcmMgPSBkYXRhLmN1c3RvbUxvZ287XG4gICAgICAgICAgYnJhbmRMb2dvTGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvO1xuICAgICAgICAgIHByZXZpZXdEYXJrLnNyYyA9IGRhdGEuY3VzdG9tTG9nbztcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5jdXN0b21Mb2dvO1xuICAgICAgICB9XG4gICAgICAgIGlmICghZGF0YS5pc0RlZmF1bHQpIHtcbiAgICAgICAgICBsb2dvU3RhdHVzLnRleHRDb250ZW50ID0gJ1VzaW5nIGN1c3RvbSBsb2dvJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YS5wb3NpdGlvbikge1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IGRhdGEucG9zaXRpb247XG4gICAgICAgICAgYXBwbHlMb2dvUG9zaXRpb24oZGF0YS5wb3NpdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGEuZGFzaGJvYXJkVGl0bGUpIHtcbiAgICAgICAgICBhcHBseURhc2hib2FyZFRpdGxlKGRhdGEuZGFzaGJvYXJkVGl0bGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGxvYWQgY3VzdG9tIGxvZ286JywgZXJyb3IubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gUG9zaXRpb24gYnV0dG9uIGhhbmRsZXJzXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5sb2dvLXBvcy1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgY3VycmVudFBvc2l0aW9uID0gYnRuLmRhdGFzZXQucG9zO1xuICAgICAgYXBwbHlMb2dvUG9zaXRpb24oY3VycmVudFBvc2l0aW9uKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gT3BlbiBsb2dvIG1vZGFsIG9uIGJyYW5kIGNsaWNrXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdicmFuZCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBwZW5kaW5nRGFya0RhdGEgPSBudWxsO1xuICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgIHBlbmRpbmdTaW5nbGVEYXRhID0gbnVsbDtcbiAgICBpZiAodXBsb2FkRGFyaykgdXBsb2FkRGFyay52YWx1ZSA9ICcnO1xuICAgIGlmICh1cGxvYWRMaWdodCkgdXBsb2FkTGlnaHQudmFsdWUgPSAnJztcbiAgICBpZiAodXBsb2FkU2luZ2xlKSB1cGxvYWRTaW5nbGUudmFsdWUgPSAnJztcbiAgICAvLyBSZXNldCBjaGVja2JveCB0byBkdWFsIG1vZGVcbiAgICBpZiAoc2FtZUJvdGhDaGVja2JveCkgc2FtZUJvdGhDaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG4gICAgZHVhbFVwbG9hZHMuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICBzaW5nbGVVcGxvYWQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAvLyBSZXNldCBwcmV2aWV3cyB0byBjdXJyZW50IGhlYWRlciBsb2dvc1xuICAgIHByZXZpZXdEYXJrLnNyYyA9IGJyYW5kTG9nb0Rhcmsuc3JjO1xuICAgIHByZXZpZXdMaWdodC5zcmMgPSBicmFuZExvZ29MaWdodC5zcmM7XG4gICAgY29uc3QgaXNDdXN0b20gPSBicmFuZExvZ29EYXJrLnNyYy5pbmNsdWRlcygnY3VzdG9tLWxvZ28nKSB8fCBicmFuZExvZ29MaWdodC5zcmMuaW5jbHVkZXMoJ2N1c3RvbS1sb2dvJyk7XG4gICAgbG9nb1N0YXR1cy50ZXh0Q29udGVudCA9IGlzQ3VzdG9tID8gJ1VzaW5nIGN1c3RvbSBsb2dvJyA6ICdVc2luZyBkZWZhdWx0IGxvZ29zJztcbiAgICBhcHBseUxvZ29Qb3NpdGlvbihjdXJyZW50UG9zaXRpb24pO1xuICAgIGRhc2hib2FyZFRpdGxlSW5wdXQudmFsdWUgPSBjdXJyZW50VGl0bGU7XG4gICAgbG9nb01vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gU2F2ZSBsb2dvLCBwb3NpdGlvbiwgYW5kIHRpdGxlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dvLXNhdmUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5ld1RpdGxlID0gZGFzaGJvYXJkVGl0bGVJbnB1dC52YWx1ZS50cmltKCkgfHwgREVGQVVMVF9USVRMRTtcbiAgICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAgIHBvc2l0aW9uOiBjdXJyZW50UG9zaXRpb24sXG4gICAgICAgIGRhc2hib2FyZFRpdGxlOiBuZXdUaXRsZVxuICAgICAgfTtcblxuICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGxvZ28gZGF0YSB0byBzZW5kXG4gICAgICBpZiAoc2FtZUJvdGhDaGVja2JveD8uY2hlY2tlZCAmJiBwZW5kaW5nU2luZ2xlRGF0YSkge1xuICAgICAgICAvLyBTaW5nbGUgbG9nbyBmb3IgYm90aCB2YXJpYW50c1xuICAgICAgICBwYXlsb2FkLmRhdGFEYXJrID0gcGVuZGluZ1NpbmdsZURhdGE7XG4gICAgICAgIHBheWxvYWQuZGF0YUxpZ2h0ID0gcGVuZGluZ1NpbmdsZURhdGE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAocGVuZGluZ0RhcmtEYXRhKSBwYXlsb2FkLmRhdGFEYXJrID0gcGVuZGluZ0RhcmtEYXRhO1xuICAgICAgICBpZiAocGVuZGluZ0xpZ2h0RGF0YSkgcGF5bG9hZC5kYXRhTGlnaHQgPSBwZW5kaW5nTGlnaHREYXRhO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2xvZ28nLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgY29uc3QgdCA9ICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgaWYgKGRhdGEucGF0aERhcmspIHtcbiAgICAgICAgICBicmFuZExvZ29EYXJrLnNyYyA9IGRhdGEucGF0aERhcmsgKyB0O1xuICAgICAgICAgIHByZXZpZXdEYXJrLnNyYyA9IGRhdGEucGF0aERhcmsgKyB0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhLnBhdGhMaWdodCkge1xuICAgICAgICAgIGJyYW5kTG9nb0xpZ2h0LnNyYyA9IGRhdGEucGF0aExpZ2h0ICsgdDtcbiAgICAgICAgICBwcmV2aWV3TGlnaHQuc3JjID0gZGF0YS5wYXRoTGlnaHQgKyB0O1xuICAgICAgICB9XG4gICAgICAgIGFwcGx5TG9nb1Bvc2l0aW9uKGN1cnJlbnRQb3NpdGlvbik7XG4gICAgICAgIGFwcGx5RGFzaGJvYXJkVGl0bGUobmV3VGl0bGUpO1xuICAgICAgICBsb2dvTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3IgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlOiAnICsgZXJyb3IuZXJyb3IsICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvciBzYXZpbmc6ICcgKyBlcnJvci5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFJlc2V0IGFsbCBicmFuZGluZyB0byBkZWZhdWx0c1xuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1yZXNldCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWNvbmZpcm0oJ1Jlc2V0IGFsbCBicmFuZGluZyB0byBEYXNoQ2FkZHkgZGVmYXVsdHM/XFxuXFxuVGhpcyB3aWxsIHJlc2V0IHRoZSBsb2dvLCBmYXZpY29uLCB0aXRsZSwgYW5kIHBvc2l0aW9uLicpKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9nb1Jlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbG9nbycsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIGlmIChsb2dvUmVzcG9uc2Uub2spIHtcbiAgICAgICAgYnJhbmRMb2dvRGFyay5zcmMgPSAnL2Fzc2V0cy9kYXNoY2FkZHktbG9nby1kYXJrLnBuZyc7XG4gICAgICAgIGJyYW5kTG9nb0xpZ2h0LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZyc7XG4gICAgICAgIHByZXZpZXdEYXJrLnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWRhcmsucG5nJztcbiAgICAgICAgcHJldmlld0xpZ2h0LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1sb2dvLWxpZ2h0LnBuZyc7XG4gICAgICAgIGxvZ29TdGF0dXMudGV4dENvbnRlbnQgPSAnVXNpbmcgZGVmYXVsdCBsb2dvcyc7XG4gICAgICAgIHBlbmRpbmdEYXJrRGF0YSA9IG51bGw7XG4gICAgICAgIHBlbmRpbmdMaWdodERhdGEgPSBudWxsO1xuICAgICAgICBwZW5kaW5nU2luZ2xlRGF0YSA9IG51bGw7XG4gICAgICAgIGRhc2hib2FyZFRpdGxlSW5wdXQudmFsdWUgPSBERUZBVUxUX1RJVExFO1xuICAgICAgICBhcHBseURhc2hib2FyZFRpdGxlKERFRkFVTFRfVElUTEUpO1xuICAgICAgICBjdXJyZW50UG9zaXRpb24gPSAnbGVmdCc7XG4gICAgICAgIGFwcGx5TG9nb1Bvc2l0aW9uKCdsZWZ0Jyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZhdmljb25SZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2Zhdmljb24nLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICBpZiAoZmF2aWNvblJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IGZhdmljb25MaW5rID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignbGlua1tyZWw9XCJpY29uXCJdJyk7XG4gICAgICAgIGNvbnN0IGZhdmljb25QcmV2aWV3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhdmljb24tcHJldmlldycpO1xuICAgICAgICBjb25zdCBmYXZpY29uU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Zhdmljb24tc3RhdHVzJyk7XG4gICAgICAgIGlmIChmYXZpY29uTGluaykgZmF2aWNvbkxpbmsuaHJlZiA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1mYXZpY29uLmljbz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZmF2aWNvblByZXZpZXcpIGZhdmljb25QcmV2aWV3LnNyYyA9ICcvYXNzZXRzL2Rhc2hjYWRkeS1mYXZpY29uLmljbz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoZmF2aWNvblN0YXR1cykgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdVc2luZyBEYXNoQ2FkZHkgZmF2aWNvbic7XG4gICAgICAgIHBlbmRpbmdGYXZpY29uRGF0YSA9IG51bGw7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yIHJlc2V0dGluZyBicmFuZGluZzogJyArIGVycm9yLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgd2lyZU1vZGFsKGxvZ29Nb2RhbCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tY2FuY2VsJykpO1xuXG4gIC8vID09PT09IEZBVklDT04gSEFORExJTkcgPT09PT1cbiAgY29uc3QgZmF2aWNvblByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmF2aWNvbi1wcmV2aWV3Jyk7XG4gIGNvbnN0IGZhdmljb25TdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZmF2aWNvbi1zdGF0dXMnKTtcbiAgY29uc3QgZmF2aWNvblVwbG9hZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmYXZpY29uLXVwbG9hZCcpO1xuICBjb25zdCBmYXZpY29uTGluayA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbcmVsPVwiaWNvblwiXScpIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgbGV0IHBlbmRpbmdGYXZpY29uRGF0YSA9IG51bGw7XG5cbiAgaWYgKCFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdsaW5rW3JlbD1cImljb25cIl0nKSkge1xuICAgIGZhdmljb25MaW5rLnJlbCA9ICdpY29uJztcbiAgICBmYXZpY29uTGluay5ocmVmID0gJy9hc3NldHMvZGFzaGNhZGR5LWZhdmljb24uaWNvJztcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGZhdmljb25MaW5rKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDdXN0b21GYXZpY29uKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Zhdmljb24nKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5jdXN0b21GYXZpY29uKSB7XG4gICAgICAgICAgZmF2aWNvbkxpbmsuaHJlZiA9IGRhdGEuY3VzdG9tRmF2aWNvbiArICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgICBmYXZpY29uUHJldmlldy5zcmMgPSBkYXRhLmN1c3RvbUZhdmljb24gKyAnP3Q9JyArIERhdGUubm93KCk7XG4gICAgICAgICAgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdVc2luZyBjdXN0b20gZmF2aWNvbic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgbG9hZCBjdXN0b20gZmF2aWNvbjonLCBlcnJvci5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBmYXZpY29uVXBsb2FkPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBpZiAoIWZpbGUudHlwZS5tYXRjaCgvXmltYWdlXFwvKHBuZ3xzdmdcXCt4bWwpJC8pKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2Ugc2VsZWN0IGEgUE5HIG9yIFNWRyBmaWxlJywgJ3dhcm5pbmcnKTtcbiAgICAgIGZhdmljb25VcGxvYWQudmFsdWUgPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKGV2ZW50KSA9PiB7XG4gICAgICBwZW5kaW5nRmF2aWNvbkRhdGEgPSBldmVudC50YXJnZXQucmVzdWx0O1xuICAgICAgZmF2aWNvblByZXZpZXcuc3JjID0gcGVuZGluZ0Zhdmljb25EYXRhO1xuICAgICAgZmF2aWNvblN0YXR1cy50ZXh0Q29udGVudCA9ICdOZXcgZmF2aWNvbiByZWFkeSB0byBzYXZlJztcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9KTtcblxuICAvLyBTYXZlIGZhdmljb24gYWxvbmdzaWRlIGxvZ28gc2F2ZVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbG9nby1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmIChwZW5kaW5nRmF2aWNvbkRhdGEpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvZmF2aWNvbicsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGRhdGE6IHBlbmRpbmdGYXZpY29uRGF0YSB9KVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgICBmYXZpY29uTGluay5ocmVmID0gZGF0YS5wYXRoICsgJz90PScgKyBEYXRlLm5vdygpO1xuICAgICAgICAgIGZhdmljb25QcmV2aWV3LnNyYyA9IGRhdGEucGF0aCArICc/dD0nICsgRGF0ZS5ub3coKTtcbiAgICAgICAgICBmYXZpY29uU3RhdHVzLnRleHRDb250ZW50ID0gJ1VzaW5nIGN1c3RvbSBmYXZpY29uJztcbiAgICAgICAgICBwZW5kaW5nRmF2aWNvbkRhdGEgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlIGZhdmljb246ICcgKyBlcnJvci5lcnJvciwgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yIHNhdmluZyBmYXZpY29uOiAnICsgZXJyb3IubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICBsb2FkQ3VzdG9tRmF2aWNvbigpO1xuICBsb2FkQ3VzdG9tTG9nbygpO1xuXG4gIC8vID09PT09IFRJTUVaT05FIFNFVFRJTkcgPT09PT1cbiAgY29uc3Qgc2V0dGluZ3NUelNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy10aW1lem9uZScpO1xuICBpZiAoc2V0dGluZ3NUelNlbGVjdCkge1xuICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKGxvZ29Nb2RhbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSAmJiBzZXR0aW5nc1R6U2VsZWN0Lm9wdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgbGV0IGN1cnJlbnRUejtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvY29uZmlnJyk7XG4gICAgICAgICAgICBpZiAocmVzLm9rKSB7IGNvbnN0IGNmZyA9IGF3YWl0IHJlcy5qc29uKCk7IGN1cnJlbnRUeiA9IGNmZy50aW1lem9uZTsgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH1cbiAgICAgICAgICB3aW5kb3cucG9wdWxhdGVUaW1lem9uZVNlbGVjdChzZXR0aW5nc1R6U2VsZWN0LCBjdXJyZW50VHopO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUobG9nb01vZGFsLCB7IGF0dHJpYnV0ZXM6IHRydWUsIGF0dHJpYnV0ZUZpbHRlcjogWydjbGFzcyddIH0pO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ28tc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHR6ID0gc2V0dGluZ3NUelNlbGVjdC52YWx1ZTtcbiAgICAgIGlmICghdHopIHJldHVybjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbmZpZycpO1xuICAgICAgICBpZiAoIXJlcy5vaykgcmV0dXJuO1xuICAgICAgICBjb25zdCBjZmcgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBjZmcudGltZXpvbmUgPSB0ejtcbiAgICAgICAgY2ZnLnVwZGF0ZWRBdCA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY29uZmlnJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNmZylcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIHNhdmUgdGltZXpvbmU6JywgZS5tZXNzYWdlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufSkoKTtcbjtcbi8vIFNoYXJlZCB0aW1lem9uZSB1dGlsaXR5IFx1MjAxNCB1c2VkIGJ5IHNldHVwIHdpemFyZCBhbmQgc2V0dGluZ3MgbW9kYWxcbi8vIGVycm9ySGFuZGxlciBpcyBkZWNsYXJlZCBnbG9iYWxseSBpbiBnbG9iYWxzLmpzIChjb3JlLmpzIGJ1bmRsZSk7IHJldXNpbmcgaXRcbi8vIGhlcmUgc28gd2UgZG9uJ3QgZ2V0IFwicmVkZWNsYXJhdGlvbiBvZiBjb25zdCBlcnJvckhhbmRsZXJcIiBhdCBzY3JpcHQgc2NvcGUuXG5cbndpbmRvdy5wb3B1bGF0ZVRpbWV6b25lU2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0RWwsIHNlbGVjdGVkVHopIHtcbiAgY29uc3QgdGltZXpvbmVzID0gSW50bC5zdXBwb3J0ZWRWYWx1ZXNPZigndGltZVpvbmUnKTtcbiAgY29uc3QgZGV0ZWN0ZWQgPSBzZWxlY3RlZFR6IHx8IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCAnVVRDJztcbiAgc2VsZWN0RWwuaW5uZXJIVE1MID0gJyc7XG4gIGZvciAoY29uc3QgdHogb2YgdGltZXpvbmVzKSB7XG4gICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgb3B0LnZhbHVlID0gdHo7XG4gICAgb3B0LnRleHRDb250ZW50ID0gdHoucmVwbGFjZSgvXy9nLCAnICcpO1xuICAgIGlmICh0eiA9PT0gZGV0ZWN0ZWQpIG9wdC5zZWxlY3RlZCA9IHRydWU7XG4gICAgc2VsZWN0RWwuYXBwZW5kQ2hpbGQob3B0KTtcbiAgfVxufTtcblxuLy8gU2V0dXAgV2l6YXJkIFN5c3RlbSAtIFNlcnZlci1zaWRlIGNvbmZpZyBzdG9yYWdlXG4oZnVuY3Rpb24gKCkge1xuICBsZXQgY3VycmVudENvbmZpZ1R5cGUgPSAnaG9tZWxhYic7XG4gIGxldCBzZXJ2ZXJDb25maWcgPSBudWxsO1xuXG4gIC8vIENoZWNrIHNlcnZlciBmb3IgZXhpc3RpbmcgY29uZmlnIG9uIHBhZ2UgbG9hZFxuICBhc3luYyBmdW5jdGlvbiBjaGVja1NlcnZlckNvbmZpZygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBzZXJ2ZXJDb25maWcgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChzZXJ2ZXJDb25maWcgJiYgc2VydmVyQ29uZmlnLnNldHVwQ29tcGxldGUpIHtcbiAgICAgICAgICAvLyBDb25maWcgZXhpc3RzIG9uIHNlcnZlciAtIGRvbid0IHNob3cgd2l6YXJkXG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmV0Y2ggc2VydmVyIGNvbmZpZywgY2hlY2tpbmcgbG9jYWxTdG9yYWdlIGZhbGxiYWNrOicsIGVycm9yLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrOiBjaGVjayBsb2NhbFN0b3JhZ2UgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgY29uc3QgbG9jYWxTZXR1cCA9IHNhZmVHZXQoJ2Rhc2hjYWRkeS1zZXR1cCcpO1xuICAgIGlmIChsb2NhbFNldHVwKSB7XG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtd2l6YXJkJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIE5vIGNvbmZpZyBmb3VuZCAtIHNob3cgd2l6YXJkXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gSW5pdGlhbGl6ZSBvbiBwYWdlIGxvYWRcbiAgY2hlY2tTZXJ2ZXJDb25maWcoKTtcblxuICAvLyBQb3B1bGF0ZSB0aW1lem9uZSBkcm9wZG93biB3aXRoIGF1dG8tZGV0ZWN0aW9uXG4gIGNvbnN0IHNldHVwVHpTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKTtcbiAgaWYgKHNldHVwVHpTZWxlY3QpIHdpbmRvdy5wb3B1bGF0ZVRpbWV6b25lU2VsZWN0KHNldHVwVHpTZWxlY3QpO1xuXG4gIC8vIFN0ZXAgbmF2aWdhdGlvblxuICBmdW5jdGlvbiBzaG93U3RlcChzdGVwSWQpIHtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2V0dXAtc3RlcCcpLmZvckVhY2goc3RlcCA9PiB7XG4gICAgICBzdGVwLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0U3RlcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHN0ZXBJZCk7XG4gICAgaWYgKHRhcmdldFN0ZXApIHtcbiAgICAgIHRhcmdldFN0ZXAuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgfVxuICB9XG5cbiAgLy8gU2hvdyBzdW1tYXJ5XG4gIGZ1bmN0aW9uIHNob3dTdW1tYXJ5KCkge1xuICAgIGNvbnN0IHN1bW1hcnlDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXN1bW1hcnktY29udGVudCcpO1xuICAgIGlmICghc3VtbWFyeUNvbnRlbnQpIHJldHVybjtcblxuICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDIwcHg7XCI+JztcblxuICAgIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ2hvbWVsYWInKSB7XG4gICAgICBjb25zdCB0bGQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGxkJyk/LnZhbHVlPy50cmltKCkgfHwgJy5ob21lJztcbiAgICAgIGNvbnN0IGNhTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1jYS1uYW1lJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBkbnNJUCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGRuc1BvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXBvcnQnKT8udmFsdWU/LnRyaW0oKSB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVDtcblxuICAgICAgaHRtbCArPSBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+SG9tZSBMYWIgQ29uZmlndXJhdGlvbjwvaDM+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTJweDsgZm9udC1zaXplOiAwLjk1cmVtO1wiPlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlRMRDo8L3N0cm9uZz4gJHt0bGR9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+Q2VydGlmaWNhdGUgQXV0aG9yaXR5Ojwvc3Ryb25nPiAke2NhTmFtZX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5ETlMgU2VydmVyOjwvc3Ryb25nPiAke2Ruc0lQfToke2Ruc1BvcnR9PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+RXhhbXBsZSBVUkxzOjwvc3Ryb25nPiBodHRwczovL3VwdGltZSR7dGxkfSwgaHR0cHM6Ly9uZXh0Y2xvdWQke3RsZH08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdzaW1wbGUnKSB7XG4gICAgICBjb25zdCBpcCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zaW1wbGUtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnbG9jYWxob3N0JztcblxuICAgICAgaHRtbCArPSBgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+U2ltcGxlIFNldHVwPC9oMz5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4OyBmb250LXNpemU6IDAuOTVyZW07XCI+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+QWNjZXNzIE1ldGhvZDo8L3N0cm9uZz4gSVA6UG9ydCBvbmx5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2PjxzdHJvbmc+RGVmYXVsdCBJUDo8L3N0cm9uZz4gJHtpcH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5TU0w6PC9zdHJvbmc+IE5vbmUgKEhUVFAgb25seSk8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5FeGFtcGxlIFVSTHM6PC9zdHJvbmc+IGh0dHA6Ly8ke2lwfTo4MDgwLCBodHRwOi8vJHtpcH06MzAwMDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3B1YmxpYycpIHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBlbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZW1haWwnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IHJvdXRpbmdNb2RlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInJvdXRpbmctbW9kZVwiXTpjaGVja2VkJyk/LnZhbHVlIHx8ICdzdWJkaXJlY3RvcnknO1xuICAgICAgY29uc3QgZXhhbXBsZVVybHMgPSByb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeSdcbiAgICAgICAgPyBgaHR0cHM6Ly8ke2RvbWFpbn0vc29uYXJyLCBodHRwczovLyR7ZG9tYWlufS9ncmFmYW5hYFxuICAgICAgICA6IGBodHRwczovL3NvbmFyci4ke2RvbWFpbn0sIGh0dHBzOi8vZ3JhZmFuYS4ke2RvbWFpbn1gO1xuICAgICAgY29uc3Qgcm91dGluZ0xhYmVsID0gcm91dGluZ01vZGUgPT09ICdzdWJkaXJlY3RvcnknID8gJ1N1YmRpcmVjdG9yeSAoZG9tYWluLmNvbS9hcHApJyA6ICdTdWJkb21haW4gKGFwcC5kb21haW4uY29tKSc7XG5cbiAgICAgIGh0bWwgKz0gYFxuICAgICAgICA8ZGl2PlxuICAgICAgICAgIDxoMyBzdHlsZT1cIm1hcmdpbjogMCAwIDEycHg7IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPlB1YmxpYyBTZXJ2ZXI8L2gzPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDEycHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cbiAgICAgICAgICAgIDxkaXY+PHN0cm9uZz5Eb21haW46PC9zdHJvbmc+ICR7ZG9tYWlufTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlNTTDo8L3N0cm9uZz4gTGV0J3MgRW5jcnlwdDwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkVtYWlsOjwvc3Ryb25nPiAke2VtYWlsfTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPlJvdXRpbmc6PC9zdHJvbmc+ICR7cm91dGluZ0xhYmVsfTwvZGl2PlxuICAgICAgICAgICAgPGRpdj48c3Ryb25nPkV4YW1wbGUgVVJMczo8L3N0cm9uZz4gJHtleGFtcGxlVXJsc308L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH1cblxuICAgIC8vIFRpbWV6b25lICh1bml2ZXJzYWwgYWNyb3NzIGFsbCBjb25maWcgdHlwZXMpXG4gICAgY29uc3QgdHogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKT8udmFsdWUgfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdVVEMnO1xuICAgIGh0bWwgKz0gYFxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDhweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjk1cmVtO1wiPjxzdHJvbmc+VGltZXpvbmU6PC9zdHJvbmc+ICR7dHoucmVwbGFjZSgvXy9nLCAnICcpfTwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgc3VtbWFyeUNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zdW1tYXJ5Jyk7XG4gIH1cblxuICAvLyBTYXZlIGNvbmZpZyB0byBzZXJ2ZXJcbiAgYXN5bmMgZnVuY3Rpb24gc2F2ZUNvbmZpZ1RvU2VydmVyKGNvbmZpZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2NvbmZpZycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjb25maWcpXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tTZXR1cFdpemFyZF0gU2F2ZSBDb25maWcnLCBuZXcgRXJyb3IoYFNlcnZlciByZXR1cm5lZCAke3Jlc3BvbnNlLnN0YXR1c31gKSwgeyBmdW5jdGlvbjogJ3NhdmVDb25maWdUb1NlcnZlcicgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbU2V0dXBXaXphcmRdIFNhdmUgQ29uZmlnJywgZXJyb3IsIHsgZnVuY3Rpb246ICdzYXZlQ29uZmlnVG9TZXJ2ZXInIH0pO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmlzaCBzZXR1cCBoYW5kbGVyXG4gIGFzeW5jIGZ1bmN0aW9uIGZpbmlzaFNldHVwKCkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNldHVwQ29tcGxldGU6IHRydWUsXG4gICAgICBjb25maWd1cmF0aW9uVHlwZTogY3VycmVudENvbmZpZ1R5cGUsXG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHRpbWV6b25lOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGltZXpvbmUnKT8udmFsdWUgfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdVVEMnXG4gICAgfTtcblxuICAgIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ2hvbWVsYWInKSB7XG4gICAgICBjb25maWcudGxkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXRsZCcpPy52YWx1ZT8udHJpbSgpIHx8ICcuaG9tZSc7XG4gICAgICBjb25maWcuY2FOYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWNhLW5hbWUnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IHNlbGVjdGVkUHJvdmlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXByb3ZpZGVyJyk/LnZhbHVlIHx8ICd0ZWNobml0aXVtJztcbiAgICAgIGNvbmZpZy5kbnMgPSB7XG4gICAgICAgIHByb3ZpZGVyOiBzZWxlY3RlZFByb3ZpZGVyLFxuICAgICAgICBpcDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRucy1pcCcpPy52YWx1ZT8udHJpbSgpIHx8ICcnLFxuICAgICAgICBwb3J0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtZG5zLXBvcnQnKT8udmFsdWU/LnRyaW0oKSB8fCBEQy5ERUZBVUxUUy5ETlNfUE9SVCxcbiAgICAgICAgdG9rZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtdG9rZW4nKT8udmFsdWU/LnRyaW0oKSB8fCAnJ1xuICAgICAgfTtcbiAgICAgIGNvbmZpZy5kZWZhdWx0cyA9IHtcbiAgICAgICAgZG5zVHlwZTogJ3ByaXZhdGUnLFxuICAgICAgICBzc2xUeXBlOiAnaW50ZXJuYWwnLFxuICAgICAgICB0YXJnZXRJUDogJ2xvY2FsaG9zdCdcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgIGNvbmZpZy5kZWZhdWx0SVAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc2ltcGxlLWlwJyk/LnZhbHVlPy50cmltKCkgfHwgJ2xvY2FsaG9zdCc7XG4gICAgICBjb25maWcuZGVmYXVsdHMgPSB7XG4gICAgICAgIGRuc1R5cGU6ICdub25lJyxcbiAgICAgICAgc3NsVHlwZTogJ25vbmUnLFxuICAgICAgICB0YXJnZXRJUDogY29uZmlnLmRlZmF1bHRJUFxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAncHVibGljJykge1xuICAgICAgY29uZmlnLmRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25maWcuZW1haWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtcHVibGljLWVtYWlsJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25maWcucm91dGluZ01vZGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwicm91dGluZy1tb2RlXCJdOmNoZWNrZWQnKT8udmFsdWUgfHwgJ3N1YmRpcmVjdG9yeSc7XG4gICAgICBjb25maWcuZGVmYXVsdHMgPSB7XG4gICAgICAgIGRuc1R5cGU6IGNvbmZpZy5yb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeScgPyAnbm9uZScgOiAncHVibGljJyxcbiAgICAgICAgc3NsVHlwZTogJ2xldHNlbmNyeXB0JyxcbiAgICAgICAgdGFyZ2V0SVA6ICdsb2NhbGhvc3QnXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIFNhdmUgdG8gc2VydmVyIChwcmltYXJ5KSBhbmQgbG9jYWxTdG9yYWdlIChmYWxsYmFjaylcbiAgICBjb25zdCBzYXZlZFRvU2VydmVyID0gYXdhaXQgc2F2ZUNvbmZpZ1RvU2VydmVyKGNvbmZpZyk7XG4gICAgc2FmZVNldCgnZGFzaGNhZGR5LWNvbmZpZycsIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuICAgIHNhZmVTZXQoJ2Rhc2hjYWRkeS1zZXR1cCcsICdjb21wbGV0ZWQnKTtcblxuICAgIC8vIEhpZGUgd2l6YXJkXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXdpemFyZCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAvLyBTaG93IHN1Y2Nlc3Mgbm90aWZpY2F0aW9uXG4gICAgY29uc3QgY29uZmlnTmFtZSA9IGN1cnJlbnRDb25maWdUeXBlID09PSAnaG9tZWxhYicgPyAnUHJvZmVzc2lvbmFsIEhvbWUgTGFiJyA6XG4gICAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbmZpZ1R5cGUgPT09ICdzaW1wbGUnID8gJ1NpbXBsZSBTZXR1cCcgOiAnUHVibGljIFNlcnZlcic7XG4gICAgY29uc3Qgc2F2ZUxvY2F0aW9uID0gc2F2ZWRUb1NlcnZlciA/ICdzZXJ2ZXIgKHNoYXJlZCBhY3Jvc3MgYWxsIGRldmljZXMpJyA6ICdsb2NhbGx5ICh0aGlzIGJyb3dzZXIgb25seSknO1xuXG4gICAgc2hvd05vdGlmaWNhdGlvbihgU2V0dXAgQ29tcGxldGUhIENvbmZpZ3VyZWQgZm9yOiAke2NvbmZpZ05hbWV9LiBTZXR0aW5ncyBzYXZlZCB0bzogJHtzYXZlTG9jYXRpb259YCwgJ3N1Y2Nlc3MnLCA1MDAwKTtcblxuICAgIC8vIFJlbG9hZCBwYWdlIHRvIGFwcGx5IGNvbmZpZ3VyYXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IGxvY2F0aW9uLnJlbG9hZCgpLCA1MDApO1xuICB9XG5cbiAgLy8gPT09PT0gRXZlbnQgSGFuZGxlcnMgdXNpbmcgZGlyZWN0IG9uY2xpY2sgZm9yIHJlbGlhYmlsaXR5ID09PT09XG5cbiAgLy8gU3RlcCAxOiBDb250aW51ZSBidXR0b25cbiAgY29uc3Qgc3RlcDFOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXN0ZXAtMS1uZXh0Jyk7XG4gIGlmIChzdGVwMU5leHQpIHtcbiAgICBzdGVwMU5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImNvbmZpZy10eXBlXCJdOmNoZWNrZWQnKTtcbiAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICBjdXJyZW50Q29uZmlnVHlwZSA9IHNlbGVjdGVkLnZhbHVlO1xuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnaG9tZWxhYicpIHtcbiAgICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtaG9tZWxhYicpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50Q29uZmlnVHlwZSA9PT0gJ3NpbXBsZScpIHtcbiAgICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtc2ltcGxlJyk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAncHVibGljJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1wdWJsaWMnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLWhvbWVsYWInKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLy8gU2tpcCBzZXR1cCBidXR0b25cbiAgY29uc3Qgc2tpcEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1za2lwJyk7XG4gIGlmIChza2lwQnRuKSB7XG4gICAgc2tpcEJ0bi5vbmNsaWNrID0gYXN5bmMgZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGNvbmZpcm0oJ1NraXAgc2V0dXA/IFlvdSBjYW4gcnVuIGl0IGxhdGVyIGZyb20gU2V0dGluZ3MuJykpIHtcbiAgICAgICAgLy8gU2F2ZSBza2lwIHN0YXR1cyB0byBzZXJ2ZXJcbiAgICAgICAgYXdhaXQgc2F2ZUNvbmZpZ1RvU2VydmVyKHsgc2V0dXBDb21wbGV0ZTogdHJ1ZSwgc2tpcHBlZDogdHJ1ZSwgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkgfSk7XG4gICAgICAgIHNhZmVTZXQoJ2Rhc2hjYWRkeS1zZXR1cCcsICdza2lwcGVkJyk7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC13aXphcmQnKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBIb21lIExhYjogVExEIFByZXZpZXdcbiAgY29uc3QgdGxkSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtdGxkJyk7XG4gIGlmICh0bGRJbnB1dCkge1xuICAgIHRsZElucHV0Lm9uaW5wdXQgPSBmdW5jdGlvbihlKSB7XG4gICAgICBjb25zdCB0bGQgPSBlLnRhcmdldC52YWx1ZSB8fCAnLmhvbWUnO1xuICAgICAgY29uc3QgcHJldmlldzEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGxkLXByZXZpZXcnKTtcbiAgICAgIGNvbnN0IHByZXZpZXcyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RsZC1wcmV2aWV3LTInKTtcbiAgICAgIGlmIChwcmV2aWV3MSkgcHJldmlldzEudGV4dENvbnRlbnQgPSB0bGQ7XG4gICAgICBpZiAocHJldmlldzIpIHByZXZpZXcyLnRleHRDb250ZW50ID0gdGxkO1xuICAgIH07XG4gIH1cblxuICAvLyBIb21lIExhYiBuYXZpZ2F0aW9uXG4gIGNvbnN0IGhvbWVsYWJCYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWhvbWVsYWItYmFjaycpO1xuICBpZiAoaG9tZWxhYkJhY2spIHtcbiAgICBob21lbGFiQmFjay5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtMScpO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBob21lbGFiTmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1ob21lbGFiLW5leHQnKTtcbiAgaWYgKGhvbWVsYWJOZXh0KSB7XG4gICAgaG9tZWxhYk5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHRsZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC10bGQnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcbiAgICAgIGNvbnN0IGNhTmFtZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1jYS1uYW1lJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBkbnNJUCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kbnMtaXAnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcblxuICAgICAgaWYgKCF0bGQgfHwgIXRsZC5zdGFydHNXaXRoKCcuJykpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgdmFsaWQgVExEIHN0YXJ0aW5nIHdpdGggYSBkb3QgKGUuZy4sIC5ob21lKScsICd3YXJuaW5nJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghY2FOYW1lKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIENlcnRpZmljYXRlIEF1dGhvcml0eSBuYW1lJywgJ3dhcm5pbmcnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFkbnNJUCkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgeW91ciBETlMgc2VydmVyIElQIGFkZHJlc3MnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VtbWFyeSgpO1xuICAgIH07XG4gIH1cblxuICAvLyBTaW1wbGUgbmF2aWdhdGlvblxuICBjb25zdCBzaW1wbGVCYWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXNpbXBsZS1iYWNrJyk7XG4gIGlmIChzaW1wbGVCYWNrKSB7XG4gICAgc2ltcGxlQmFjay5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N0ZXAoJ3NldHVwLXN0ZXAtMScpO1xuICAgIH07XG4gIH1cblxuICBjb25zdCBzaW1wbGVOZXh0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLXNpbXBsZS1uZXh0Jyk7XG4gIGlmIChzaW1wbGVOZXh0KSB7XG4gICAgc2ltcGxlTmV4dC5vbmNsaWNrID0gZnVuY3Rpb24oZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc2hvd1N1bW1hcnkoKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gUHVibGljIHJvdXRpbmcgbW9kZSB0b2dnbGUgXHUyMDE0IHVwZGF0ZSByZXF1aXJlbWVudCB0ZXh0XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9XCJyb3V0aW5nLW1vZGVcIl0nKS5mb3JFYWNoKGZ1bmN0aW9uKHJhZGlvKSB7XG4gICAgcmFkaW8ub25jaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBub3RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rucy1yZXF1aXJlbWVudC1ub3RlJyk7XG4gICAgICBpZiAobm90ZSkge1xuICAgICAgICBub3RlLnRleHRDb250ZW50ID0gdGhpcy52YWx1ZSA9PT0gJ3N1YmRpcmVjdG9yeSdcbiAgICAgICAgICA/ICdPbmx5IG9uZSBETlMgcmVjb3JkIG5lZWRlZCAoZm9yIHRoZSBtYWluIGRvbWFpbiknXG4gICAgICAgICAgOiAnWW91XFwnbGwgbmVlZCB0byBjb25maWd1cmUgRE5TIG1hbnVhbGx5IGZvciBlYWNoIHN1YmRvbWFpbic7XG4gICAgICB9XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gUHVibGljIG5hdmlnYXRpb25cbiAgY29uc3QgcHVibGljQmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtYmFjaycpO1xuICBpZiAocHVibGljQmFjaykge1xuICAgIHB1YmxpY0JhY2sub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLTEnKTtcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgcHVibGljTmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtbmV4dCcpO1xuICBpZiAocHVibGljTmV4dCkge1xuICAgIHB1YmxpY05leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZG9tYWluJyk/LnZhbHVlPy50cmltKCkgfHwgJyc7XG4gICAgICBjb25zdCBlbWFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1wdWJsaWMtZW1haWwnKT8udmFsdWU/LnRyaW0oKSB8fCAnJztcblxuICAgICAgaWYgKCFkb21haW4pIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIHlvdXIgZG9tYWluIG5hbWUnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIWVtYWlsIHx8ICFlbWFpbC5pbmNsdWRlcygnQCcpKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIHZhbGlkIGVtYWlsIGFkZHJlc3MnLCAnd2FybmluZycpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VtbWFyeSgpO1xuICAgIH07XG4gIH1cblxuICAvLyBTdW1tYXJ5IG5hdmlnYXRpb25cbiAgY29uc3Qgc3VtbWFyeUJhY2sgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V0dXAtc3VtbWFyeS1iYWNrJyk7XG4gIGlmIChzdW1tYXJ5QmFjaykge1xuICAgIHN1bW1hcnlCYWNrLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdob21lbGFiJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1ob21lbGFiJyk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRDb25maWdUeXBlID09PSAnc2ltcGxlJykge1xuICAgICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zaW1wbGUnKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbmZpZ1R5cGUgPT09ICdwdWJsaWMnKSB7XG4gICAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLXB1YmxpYycpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBTdW1tYXJ5IFwiQ29udGludWUgXHUyMTkyXCIgXHUyMDE0IGFkdmFuY2UgdG8gdGhlIGRpc2stc2FmZXR5IHdhcm5pbmcgc3RlcFxuICBjb25zdCBzdW1tYXJ5TmV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1zdW1tYXJ5LW5leHQnKTtcbiAgaWYgKHN1bW1hcnlOZXh0KSB7XG4gICAgc3VtbWFyeU5leHQub25jbGljayA9IGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNob3dTdGVwKCdzZXR1cC1zdGVwLWRpc2stc2FmZXR5Jyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIERpc2stc2FmZXR5IHN0ZXAgbmF2aWdhdGlvblxuICBjb25zdCBkaXNrU2FmZXR5QmFjayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR1cC1kaXNrLXNhZmV0eS1iYWNrJyk7XG4gIGlmIChkaXNrU2FmZXR5QmFjaykge1xuICAgIGRpc2tTYWZldHlCYWNrLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzaG93U3RlcCgnc2V0dXAtc3RlcC1zdW1tYXJ5Jyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEZpbmlzaCBzZXR1cCBidXR0b24gKG5vdyBvbiB0aGUgZGlzay1zYWZldHkgc3RlcClcbiAgY29uc3QgZmluaXNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NldHVwLWRpc2stc2FmZXR5LWZpbmlzaCcpO1xuICBpZiAoZmluaXNoQnRuKSB7XG4gICAgZmluaXNoQnRuLm9uY2xpY2sgPSBmdW5jdGlvbihlKSB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBmaW5pc2hTZXR1cCgpO1xuICAgIH07XG4gIH1cblxuICAvLyBFeHBvc2UgZnVuY3Rpb24gdG8gZ2V0IGdsb2JhbCBjb25maWcgKGZyb20gc2VydmVyIG9yIGxvY2FsU3RvcmFnZSlcbiAgd2luZG93LmdldEdsb2JhbENvbmZpZyA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIC8vIFRyeSBzZXJ2ZXIgZmlyc3RcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9jb25maWcnKTtcbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLnNldHVwQ29tcGxldGUpIHtcbiAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmV0Y2ggY29uZmlnIGZyb20gc2VydmVyJyk7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gbG9jYWxTdG9yYWdlXG4gICAgY29uc3QgY29uZmlnU3RyID0gc2FmZUdldCgnZGFzaGNhZGR5LWNvbmZpZycpO1xuICAgIGlmIChjb25maWdTdHIpIHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGNvbmZpZ1N0cik7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGRlZmF1bHQgY29uZmlnIGlmIG5vdCBzZXRcbiAgICByZXR1cm4ge1xuICAgICAgc2V0dXBDb21wbGV0ZTogZmFsc2UsXG4gICAgICBjb25maWd1cmF0aW9uVHlwZTogJ2hvbWVsYWInLFxuICAgICAgdGxkOiAnLmhvbWUnLFxuICAgICAgY2FOYW1lOiAnJyxcbiAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIGRuc1R5cGU6ICdwcml2YXRlJyxcbiAgICAgICAgc3NsVHlwZTogJ2ludGVybmFsJyxcbiAgICAgICAgdGFyZ2V0SVA6ICdsb2NhbGhvc3QnXG4gICAgICB9XG4gICAgfTtcbiAgfTtcblxuICAvLyBFeHBvc2UgcmVzZXQgZnVuY3Rpb24gZm9yIHNldHRpbmdzXG4gIHdpbmRvdy5yZXNldFNldHVwV2l6YXJkID0gYXN5bmMgZnVuY3Rpb24oKSB7XG4gICAgaWYgKGNvbmZpcm0oJ1Jlc2V0IERhc2hDYWRkeSBjb25maWd1cmF0aW9uPyBUaGlzIHdpbGwgc2hvdyB0aGUgc2V0dXAgd2l6YXJkIGFnYWluLicpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jb25maWcnLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGRlbGV0ZSBzZXJ2ZXIgY29uZmlnJyk7XG4gICAgICB9XG4gICAgICBzYWZlUmVtb3ZlKCdkYXNoY2FkZHktc2V0dXAnKTtcbiAgICAgIHNhZmVSZW1vdmUoJ2Rhc2hjYWRkeS1jb25maWcnKTtcbiAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cbiAgfTtcbn0pKCk7XG47XG4vLyBBcHAgU2VsZWN0b3IgU3lzdGVtXG4oZnVuY3Rpb24gKCkge1xuICBjb25zdCBlcnJvckhhbmRsZXIgPSBuZXcgRXJyb3JIYW5kbGVyKCk7XG4gIGluamVjdE1vZGFsKCdhcHAtc2VsZWN0b3ItbW9kYWwnLCBgPGRpdiBpZD1cImFwcC1zZWxlY3Rvci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJhcHAtc2VsZWN0b3ItY29udGVudFwiPlxuICAgICAgPGgyIHN0eWxlPVwibWFyZ2luOiAwIDAgMjRweDsgY29sb3I6IHZhcigtLWZnKTsgdGV4dC1hbGlnbjogY2VudGVyO1wiPkNob29zZSBhbiBBcHA8L2gyPlxuICAgICAgPGRpdiBpZD1cImFwcC1zZWxlY3Rvci1ncmlkXCIgY2xhc3M9XCJhcHAtc2VsZWN0b3ItZ3JpZFwiPjwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogMjRweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFwcC1zZWxlY3Rvci1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBpbmplY3RNb2RhbCgnYXBwLWRlcGxveS1tb2RhbCcsIGA8ZGl2IGlkPVwiYXBwLWRlcGxveS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjAwcHg7IG1heC13aWR0aDogNzAwcHg7XCI+XG4gICAgICA8aDMgaWQ9XCJhcHAtZGVwbG95LXRpdGxlXCI+RGVwbG95IEFwcGxpY2F0aW9uPC9oMz5cblxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyOyBnYXA6IDE2cHg7IG1hcmdpbi10b3A6IDE2cHg7XCI+XG4gICAgICAgIDwhLS0gU3ViZG9tYWluL0RvbWFpbiAtLT5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZGVwbG95LXN1YmRvbWFpblwiIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cbiAgICAgICAgICAgIFx1RDgzQ1x1REYxMCBTdWJkb21haW4gb3IgRG9tYWluXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRlcGxveS1zdWJkb21haW5cIiBwbGFjZWhvbGRlcj1cInVwdGltZVwiXG4gICAgICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWhpbnQtc21cIj5cbiAgICAgICAgICAgIFlvdXIgYXBwIHdpbGwgYmUgYXZhaWxhYmxlIGF0OiA8c3BhbiBpZD1cImRlcGxveS11cmwtcHJldmlld1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+dXB0aW1lLmhvbWU8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cInN1YnBhdGgtY29tcGF0LXdhcm5pbmdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDhweCAxMnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCAjZmY5ODAwIDEwJSwgdmFyKC0tY2FyZC1iZykpOyBib3JkZXI6IDFweCBzb2xpZCBjb2xvci1taXgoaW4gc3JnYiwgI2ZmOTgwMCAzMCUsIHRyYW5zcGFyZW50KTsgbWFyZ2luLXRvcDogOHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRE5TIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnRcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1RERDMlx1RkUwRiBETlMgQ29uZmlndXJhdGlvblxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtY29sLWdhcFwiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicmFkaW8tb3B0aW9uXCI+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFkaW9cIiBuYW1lPVwiZG5zLXR5cGVcIiB2YWx1ZT1cInByaXZhdGVcIiBjaGVja2VkIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPlByaXZhdGUgRE5TIChUZWNobml0aXVtKTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5Vc2UgeW91ciBsb2NhbCBETlMgc2VydmVyIHdpdGggY3VzdG9tIFRMRCAoLnNhbWksIC5ob21lLCBldGMuKTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJkbnMtdHlwZVwiIHZhbHVlPVwicHVibGljXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+UHVibGljIEROUzwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5Vc2UgYSByZWFsIGRvbWFpbiAoZXhhbXBsZS5jb20pIC0gcmVxdWlyZXMgRE5TIHByb3ZpZGVyIHNldHVwPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cImRucy10eXBlXCIgdmFsdWU9XCJub25lXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+Tm8gRE5TIChJUDpQb3J0IG9ubHkpPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPkFjY2VzcyB2aWEgSVAgYWRkcmVzcyBhbmQgcG9ydCAtIG5vIGRvbWFpbiBzZXR1cDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gU1NMIENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnRcIj5cbiAgICAgICAgICAgIFx1RDgzRFx1REQxMiBTU0wvVExTIENlcnRpZmljYXRlXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtZ2FwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzc2wtdHlwZVwiIHZhbHVlPVwiaW50ZXJuYWxcIiBjaGVja2VkIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPkludGVybmFsIENBPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlVzZSBDYWRkeSdzIGludGVybmFsIGNlcnRpZmljYXRlIGF1dGhvcml0eSAoc2VsZi1zaWduZWQpPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInJhZGlvLW9wdGlvblwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cInNzbC10eXBlXCIgdmFsdWU9XCJsZXRzZW5jcnlwdFwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPkxldCdzIEVuY3J5cHQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1oaW50XCI+RnJlZSBwdWJsaWMgU1NMIGNlcnRpZmljYXRlIChyZXF1aXJlcyBwdWJsaWMgZG9tYWluKTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJzc2wtdHlwZVwiIHZhbHVlPVwibm9uZVwiIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiAxMHB4O1wiIC8+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ3LTUwMFwiPk5vIFNTTCAoSFRUUCBvbmx5KTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWhpbnRcIj5cdTI2QTBcdUZFMEYgTm90IHJlY29tbWVuZGVkIC0gdHJhZmZpYyB3aWxsIGJlIHVuZW5jcnlwdGVkPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBNZWRpYSBMaWJyYXJ5IFBhdGggKHNob3duIGZvciBtZWRpYSBhcHBzKSAtLT5cbiAgICAgICAgPGRpdiBpZD1cIm1lZGlhLXBhdGgtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudFwiPlxuICAgICAgICAgICAgXHVEODNEXHVEQ0MxIE1lZGlhIExpYnJhcnkgTG9jYXRpb25cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgICA8IS0tIERldGVjdGVkIG1vdW50cyBmcm9tIGV4aXN0aW5nIG1lZGlhIHNlcnZlcnMgLS0+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZGV0ZWN0ZWQtbW91bnRzLWNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLXN1Y2Nlc3MpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+XG4gICAgICAgICAgICAgICAgXHUyNzEzIERldGVjdGVkIGZyb20gZXhpc3RpbmcgbWVkaWEgc2VydmVyczpcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJkZXRlY3RlZC1tb3VudHMtbGlzdFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZsZXgtd3JhcDogd3JhcDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIFBhdGggaW5wdXQgd2l0aCBicm93c2UgYnV0dG9uIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImRlcGxveS1tZWRpYS1wYXRoXCIgcGxhY2Vob2xkZXI9XCIvbWVkaWEvTW92aWVzLCAvbWVkaWEvVFZTaG93c1wiXG4gICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlucHV0LWZsZXhcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBpZD1cImJyb3dzZS1tZWRpYS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiPlxuICAgICAgICAgICAgICAgIFx1RDgzRFx1RENDMiBCcm93c2VcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBpZD1cIm1lZGlhLXBhdGgtZGVzY3JpcHRpb25cIiBjbGFzcz1cInRleHQtaGludFwiPlxuICAgICAgICAgICAgICBTZWxlY3QgZm9sZGVycyBmcm9tIGV4aXN0aW5nIHNlcnZlcnMsIGJyb3dzZSwgb3IgdHlwZSBwYXRocyBtYW51YWxseS4gU2VwYXJhdGUgbXVsdGlwbGUgd2l0aCBjb21tYXMuXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBTZWxlY3RlZCBwYXRocyBkaXNwbGF5IC0tPlxuICAgICAgICAgICAgPGRpdiBpZD1cInNlbGVjdGVkLW1lZGlhLXBhdGhzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogNnB4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFBsZXggQ2xhaW0gVG9rZW4gKHNob3duIG9ubHkgZm9yIFBsZXggZGVwbG95bWVudHMpIC0tPlxuICAgICAgICA8ZGl2IGlkPVwicGxleC1jbGFpbS1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdUREMTEgUGxleCBDbGFpbSBUb2tlblxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtcm93LWdhcFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkZXBsb3ktcGxleC1jbGFpbVwiIHBsYWNlaG9sZGVyPVwiY2xhaW0teHh4eHh4eHh4eHh4eHh4eHh4eHhcIlxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQtZmxleFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjk1cmVtO1wiIC8+XG4gICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9wbGV4LnR2L2NsYWltXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDEwcHggMTZweDsgYmFja2dyb3VuZDogI2U1YTAwZDsgY29sb3I6ICMwMDA7IGJvcmRlcjogbm9uZTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtd2VpZ2h0OiA1MDA7IHdoaXRlLXNwYWNlOiBub3dyYXA7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjtcIj5cbiAgICAgICAgICAgICAgR2V0IFRva2VuXG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogI2U1YTAwZDsgbWFyZ2luLXRvcDogNHB4O1wiPlxuICAgICAgICAgICAgVG9rZW4gZXhwaXJlcyBpbiA0IG1pbnV0ZXMhIEdldCBpdCByaWdodCBiZWZvcmUgY2xpY2tpbmcgRGVwbG95LiBMZWF2ZSBlbXB0eSB0byBjb25maWd1cmUgUGxleCBtYW51YWxseSBsYXRlci5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBUYWlsc2NhbGUgU2VjdXJpdHkgLS0+XG4gICAgICAgIDxkaXYgaWQ9XCJ0YWlsc2NhbGUtc2VjdGlvblwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdUREMTAgVGFpbHNjYWxlIFNlY3VyaXR5XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1jb2wtZ2FwXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJyYWRpby1vcHRpb25cIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZGVwbG95LXRhaWxzY2FsZS1vbmx5XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDEwcHg7IHdpZHRoOiAxOHB4OyBoZWlnaHQ6IDE4cHg7XCIgLz5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnctNTAwXCI+VGFpbHNjYWxlLU9ubHkgQWNjZXNzPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtaGludFwiPlJlc3RyaWN0IHRoaXMgc2VydmljZSB0byBUYWlsc2NhbGUgdXNlcnMgb25seSAoMTAwLngueC54IElQcyk8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPGRpdiBpZD1cInRhaWxzY2FsZS1zdGF0dXNcIiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBUYWlsc2NhbGUgc3RhdHVzLi4uPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gQWR2YW5jZWQgT3B0aW9ucyAoQ29sbGFwc2libGUpIC0tPlxuICAgICAgICA8ZGV0YWlscz5cbiAgICAgICAgICA8c3VtbWFyeSBzdHlsZT1cImN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWFjY2VudCk7IGZvbnQtd2VpZ2h0OiA1MDA7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cdTI2OTlcdUZFMEYgQWR2YW5jZWQgT3B0aW9uczwvc3VtbWFyeT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgZGlzcGxheTogZ3JpZDsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1wb3J0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPkN1c3RvbSBQb3J0IChvcHRpb25hbCk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZGVwbG95LXBvcnRcIiBwbGFjZWhvbGRlcj1cIkxlYXZlIGVtcHR5IGZvciBkZWZhdWx0XCJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1pbnB1dC1jYXJkXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1pcFwiIHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IG1hcmdpbi1ib3R0b206IDZweDtcIj5UYXJnZXQgSVAgQWRkcmVzczwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGVwbG95LWlwXCIgdmFsdWU9XCJsb2NhbGhvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWlucHV0LWNhcmRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+XG4gICAgICAgICAgICAgICAgVXNlICdsb2NhbGhvc3QnIGZvciBzYW1lLWhvc3QgY29udGFpbmVycywgb3Igc3BlY2lmaWMgSVAgZm9yIHJlbW90ZSBzZXJ2aWNlc1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBpZD1cInZvbHVtZS1tb3VudHMtc2VjdGlvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5cdUQ4M0RcdURDQzIgVm9sdW1lIE1vdW50czwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgICAgIEN1c3RvbWl6ZSB3aGVyZSBjb250YWluZXIgZGF0YSBpcyBzdG9yZWQgb24gdGhlIGhvc3QuIE1lZGlhIHZvbHVtZXMgYXJlIGNvbmZpZ3VyZWQgYWJvdmUuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGlkPVwidm9sdW1lLW1vdW50cy1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDhweDtcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+XHUyNjk5XHVGRTBGIFJlc291cmNlIExpbWl0czwvbGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgICAgIE9wdGlvbmFsIENQVSBhbmQgbWVtb3J5IGNvbnN0cmFpbnRzLiBMZWF2ZSBhdCAwIGZvciB1bmxpbWl0ZWQuXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJkZXBsb3ktY3B1LWxpbWl0XCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+Q1BVIENvcmVzPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJkZXBsb3ktY3B1LWxpbWl0XCIgdmFsdWU9XCIwXCIgbWluPVwiMFwiIG1heD1cIjY0XCIgc3RlcD1cIjAuMjVcIiBjbGFzcz1cImZvcm0taW5wdXQtY2FyZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgcGxhY2Vob2xkZXI9XCIwID0gdW5saW1pdGVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImRlcGxveS1tZW1vcnktbGltaXRcIiBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDRweDtcIj5NZW1vcnkgKE1CKTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZGVwbG95LW1lbW9yeS1saW1pdFwiIHZhbHVlPVwiMFwiIG1pbj1cIjBcIiBtYXg9XCIxMzEwNzJcIiBzdGVwPVwiNjRcIiBjbGFzcz1cImZvcm0taW5wdXQtY2FyZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCIgcGxhY2Vob2xkZXI9XCIwID0gdW5saW1pdGVkXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDI0cHg7XCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhcHAtZGVwbG95LWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXBwLWRlcGxveS1jb25maXJtXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+XG4gICAgICAgICAgXHVEODNEXHVERTgwIERlcGxveVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBBUFBTX0tFWSA9ICdjdXN0b20tYXBwcyc7XG5cbiAgLy8gQ2FjaGUgZm9yIEFQSSB0ZW1wbGF0ZXNcbiAgbGV0IGFwaVRlbXBsYXRlcyA9IG51bGw7XG4gIGxldCBhcGlDYXRlZ29yaWVzID0gbnVsbDtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItbW9kYWwnKTtcbiAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItZ3JpZCcpO1xuXG4gIC8vIEZldGNoIGFwcCB0ZW1wbGF0ZXMgZnJvbSBBUElcbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hBcHBUZW1wbGF0ZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYXBwcy90ZW1wbGF0ZXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGFwaVRlbXBsYXRlcyA9IGRhdGEudGVtcGxhdGVzO1xuICAgICAgICBhcGlDYXRlZ29yaWVzID0gZGF0YS5jYXRlZ29yaWVzO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gRmV0Y2ggVGVtcGxhdGVzJywgZSwgeyBmdW5jdGlvbjogJ2ZldGNoQXBpVGVtcGxhdGVzJyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ2hlY2sgcG9ydCBhdmFpbGFiaWxpdHlcbiAgYXN5bmMgZnVuY3Rpb24gY2hlY2tQb3J0QXZhaWxhYmlsaXR5KHBvcnQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcHBzL3BvcnRzLyR7cG9ydH0vY2hlY2tgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nRXJyb3IoJ1tBcHBTZWxlY3Rvcl0gQ2hlY2sgUG9ydCcsIGUsIHsgZnVuY3Rpb246ICdjaGVja1BvcnRBdmFpbGFiaWxpdHknIH0pO1xuICAgICAgcmV0dXJuIHsgYXZhaWxhYmxlOiB0cnVlIH07IC8vIEFzc3VtZSBhdmFpbGFibGUgb24gZXJyb3JcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgc3VnZ2VzdGVkIGF2YWlsYWJsZSBwb3J0XG4gIGFzeW5jIGZ1bmN0aW9uIGdldFN1Z2dlc3RlZFBvcnQoYmFzZVBvcnQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9hcHBzL3BvcnRzLyR7YmFzZVBvcnR9L3N1Z2dlc3RgKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiBkYXRhLnN1Z2dlc3RlZFBvcnQ7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbQXBwU2VsZWN0b3JdIEdldCBTdWdnZXN0ZWQgUG9ydCcsIGUsIHsgZnVuY3Rpb246ICdnZXRTdWdnZXN0ZWRQb3J0JyB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGJhc2VQb3J0O1xuICB9XG5cbiAgLy8gQnVpbGQgYXBwIHNlbGVjdG9yIGdyaWQgZnJvbSBBUEkgdGVtcGxhdGVzXG4gIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQXBwU2VsZWN0b3IoKSB7XG4gICAgZ3JpZC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Mb2FkaW5nIGFwcCB0ZW1wbGF0ZXMuLi48L2Rpdj4nO1xuXG4gICAgLy8gRmV0Y2ggdGVtcGxhdGVzIGlmIG5vdCBjYWNoZWRcbiAgICBpZiAoIWFwaVRlbXBsYXRlcykge1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IGZldGNoQXBwVGVtcGxhdGVzKCk7XG4gICAgICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAgICAgZ3JpZC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLWVycm9yKTtcIj5GYWlsZWQgdG8gbG9hZCBhcHAgdGVtcGxhdGVzLiBQbGVhc2UgdHJ5IGFnYWluLjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBncmlkLmlubmVySFRNTCA9ICcnO1xuXG4gICAgLy8gR3JvdXAgdGVtcGxhdGVzIGJ5IGNhdGVnb3J5XG4gICAgY29uc3QgYnlDYXRlZ29yeSA9IHt9O1xuICAgIGZvciAoY29uc3QgW2FwcElkLCB0ZW1wbGF0ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXBpVGVtcGxhdGVzKSkge1xuICAgICAgY29uc3QgY2F0ZWdvcnkgPSB0ZW1wbGF0ZS5jYXRlZ29yeSB8fCAnT3RoZXInO1xuICAgICAgaWYgKCFieUNhdGVnb3J5W2NhdGVnb3J5XSkge1xuICAgICAgICBieUNhdGVnb3J5W2NhdGVnb3J5XSA9IFtdO1xuICAgICAgfVxuICAgICAgYnlDYXRlZ29yeVtjYXRlZ29yeV0ucHVzaCh7IGlkOiBhcHBJZCwgLi4udGVtcGxhdGUgfSk7XG4gICAgfVxuXG4gICAgLy8gU29ydCBjYXRlZ29yaWVzIGJ5IHRoZSBvcmRlciBpbiBhcGlDYXRlZ29yaWVzIGlmIGF2YWlsYWJsZVxuICAgIGNvbnN0IGNhdGVnb3J5T3JkZXIgPSBhcGlDYXRlZ29yaWVzID8gT2JqZWN0LmtleXMoYXBpQ2F0ZWdvcmllcykgOiBPYmplY3Qua2V5cyhieUNhdGVnb3J5KS5zb3J0KCk7XG5cbiAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIGNhdGVnb3J5T3JkZXIpIHtcbiAgICAgIGNvbnN0IGFwcHMgPSBieUNhdGVnb3J5W2NhdGVnb3J5XTtcbiAgICAgIGlmICghYXBwcyB8fCBhcHBzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgIC8vIFNvcnQgYXBwcyBieSBwb3B1bGFyaXR5IChkZXNjZW5kaW5nKVxuICAgICAgYXBwcy5zb3J0KChhLCBiKSA9PiAoYi5wb3B1bGFyaXR5IHx8IDApIC0gKGEucG9wdWxhcml0eSB8fCAwKSk7XG5cbiAgICAgIC8vIENhdGVnb3J5IGhlYWRlciB3aXRoIGljb24gYW5kIGNvbG9yIGZyb20gQVBJXG4gICAgICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGhlYWRlci5jbGFzc05hbWUgPSAnYXBwLWNhdGVnb3J5LWhlYWRlcic7XG4gICAgICBjb25zdCBjYXRlZ29yeUluZm8gPSBhcGlDYXRlZ29yaWVzPy5bY2F0ZWdvcnldIHx8IHt9O1xuICAgICAgaGVhZGVyLmlubmVySFRNTCA9IGAke2VzY2FwZUh0bWwoY2F0ZWdvcnlJbmZvLmljb24gfHwgJycpfSAke2VzY2FwZUh0bWwoY2F0ZWdvcnkpfWA7XG4gICAgICBpZiAoY2F0ZWdvcnlJbmZvLmNvbG9yKSB7XG4gICAgICAgIGhlYWRlci5zdHlsZS5ib3JkZXJCb3R0b21Db2xvciA9IGNhdGVnb3J5SW5mby5jb2xvcjtcbiAgICAgIH1cbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQoaGVhZGVyKTtcblxuICAgICAgLy8gQXBwIG9wdGlvbnNcbiAgICAgIGFwcHMuZm9yRWFjaChhcHAgPT4ge1xuICAgICAgICBjb25zdCBvcHRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgb3B0aW9uLmNsYXNzTmFtZSA9ICdhcHAtb3B0aW9uJztcblxuICAgICAgICAvLyBXaWRnZXQgZW5hYmxlZCBiYWRnZVxuICAgICAgICBjb25zdCBpc1dpZGdldCA9IGFwcC5pc0Rhc2hib2FyZFdpZGdldDtcbiAgICAgICAgY29uc3Qgd2lkZ2V0RW5hYmxlZCA9IGlzV2lkZ2V0ICYmIHNhZmVHZXQoJ3dpZGdldC0nICsgYXBwLmlkICsgJy1lbmFibGVkJykgIT09ICdmYWxzZSc7XG4gICAgICAgIGNvbnN0IHdpZGdldEJhZGdlID0gaXNXaWRnZXRcbiAgICAgICAgICA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjY1cmVtOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7IG1hcmdpbi10b3A6IDRweDsgYmFja2dyb3VuZDogJHt3aWRnZXRFbmFibGVkID8gJyMyZWNjNzEzMCcgOiAnI2U3NGMzYzMwJ307IGNvbG9yOiAke3dpZGdldEVuYWJsZWQgPyAnIzJlY2M3MScgOiAnI2U3NGMzYyd9OyBmb250LXdlaWdodDogNjAwO1wiPiR7d2lkZ2V0RW5hYmxlZCA/ICdPTicgOiAnT0ZGJ308L2Rpdj5gXG4gICAgICAgICAgOiAnJztcblxuICAgICAgICAvLyBTaG93IGRpZmZpY3VsdHkgYmFkZ2UgKG5vbi13aWRnZXRzIG9ubHkpXG4gICAgICAgIGNvbnN0IGRpZmZpY3VsdHlCYWRnZSA9ICFpc1dpZGdldCAmJiBhcHAuZGlmZmljdWx0eSA/XG4gICAgICAgICAgYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBiYWNrZ3JvdW5kOiAke1xuICAgICAgICAgICAgYXBwLmRpZmZpY3VsdHkgPT09ICdFYXN5JyA/ICcjMmVjYzcxJyA6XG4gICAgICAgICAgICBhcHAuZGlmZmljdWx0eSA9PT0gJ0ludGVybWVkaWF0ZScgPyAnI2YzOWMxMicgOiAnI2U3NGMzYydcbiAgICAgICAgICB9MjA7IGNvbG9yOiAke1xuICAgICAgICAgICAgYXBwLmRpZmZpY3VsdHkgPT09ICdFYXN5JyA/ICcjMmVjYzcxJyA6XG4gICAgICAgICAgICBhcHAuZGlmZmljdWx0eSA9PT0gJ0ludGVybWVkaWF0ZScgPyAnI2YzOWMxMicgOiAnI2U3NGMzYydcbiAgICAgICAgICB9O1wiPiR7ZXNjYXBlSHRtbChhcHAuZGlmZmljdWx0eSl9PC9kaXY+YCA6ICcnO1xuXG4gICAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24taWNvblwiPiR7ZXNjYXBlSHRtbChhcHAuaWNvbiB8fCAnXHVEODNEXHVEQ0U2Jyl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24tbmFtZVwiPiR7ZXNjYXBlSHRtbChhcHAubmFtZSl9PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFwcC1vcHRpb24tZGVzY1wiPiR7ZXNjYXBlSHRtbChhcHAuZGVzY3JpcHRpb24gfHwgJycpfTwvZGl2PlxuICAgICAgICAgICR7d2lkZ2V0QmFkZ2V9JHtkaWZmaWN1bHR5QmFkZ2V9XG4gICAgICAgIGA7XG5cbiAgICAgICAgaWYgKGlzV2lkZ2V0KSB7XG4gICAgICAgICAgb3B0aW9uLm9uY2xpY2sgPSAoKSA9PiB0b2dnbGVEYXNoYm9hcmRXaWRnZXQoYXBwLCBvcHRpb24pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9wdGlvbi5vbmNsaWNrID0gKCkgPT4gc2hvd0RlcGxveUNvbmZpZyhhcHApO1xuICAgICAgICB9XG4gICAgICAgIGdyaWQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciByZWNpcGUgY2FyZHMgYXQgdGhlIGVuZCBvZiB0aGUgZ3JpZFxuICAgIGlmICh3aW5kb3cucmVuZGVyUmVjaXBlQ2FyZHMpIHtcbiAgICAgIGF3YWl0IHdpbmRvdy5yZW5kZXJSZWNpcGVDYXJkcyhncmlkKTtcbiAgICB9XG4gIH1cblxuICAvLyBUb2dnbGUgYSBkYXNoYm9hcmQgd2lkZ2V0IG9uL29mZlxuICBmdW5jdGlvbiB0b2dnbGVEYXNoYm9hcmRXaWRnZXQoYXBwLCBvcHRpb25FbCkge1xuICAgIGNvbnN0IGtleSA9ICd3aWRnZXQtJyArIGFwcC5pZCArICctZW5hYmxlZCc7XG4gICAgY29uc3QgY3VycmVudGx5RW5hYmxlZCA9IHNhZmVHZXQoa2V5KSAhPT0gJ2ZhbHNlJztcbiAgICBjb25zdCBuZXdTdGF0ZSA9ICFjdXJyZW50bHlFbmFibGVkO1xuICAgIHNhZmVTZXQoa2V5LCBTdHJpbmcobmV3U3RhdGUpKTtcblxuICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5IGltbWVkaWF0ZWx5XG4gICAgY29uc3Qgc2VsZWN0b3IgPSBhcHAud2lkZ2V0U2VsZWN0b3I7XG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgaWYgKGVsKSBlbC5zdHlsZS5kaXNwbGF5ID0gbmV3U3RhdGUgPyAnJyA6ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgdGhlIGJhZGdlIGluIHRoZSBhcHAgc2VsZWN0b3IgY2FyZFxuICAgIGNvbnN0IGJhZGdlID0gb3B0aW9uRWwucXVlcnlTZWxlY3RvcignZGl2W3N0eWxlKj1cImJvcmRlci1yYWRpdXM6IDRweFwiXScpO1xuICAgIGlmIChiYWRnZSkge1xuICAgICAgYmFkZ2UudGV4dENvbnRlbnQgPSBuZXdTdGF0ZSA/ICdPTicgOiAnT0ZGJztcbiAgICAgIGJhZGdlLnN0eWxlLmJhY2tncm91bmQgPSBuZXdTdGF0ZSA/ICcjMmVjYzcxMzAnIDogJyNlNzRjM2MzMCc7XG4gICAgICBiYWRnZS5zdHlsZS5jb2xvciA9IG5ld1N0YXRlID8gJyMyZWNjNzEnIDogJyNlNzRjM2MnO1xuICAgIH1cblxuICAgIHNob3dOb3RpZmljYXRpb24oYCR7YXBwLm5hbWV9IHdpZGdldCAke25ld1N0YXRlID8gJ2VuYWJsZWQnIDogJ2Rpc2FibGVkJ31gLCAnc3VjY2VzcycsIDIwMDApO1xuICB9XG5cbiAgLy8gU2hvdyBkZXBsb3ltZW50IGNvbmZpZ3VyYXRpb24gbW9kYWxcbiAgYXN5bmMgZnVuY3Rpb24gc2hvd0RlcGxveUNvbmZpZyhhcHBUZW1wbGF0ZSkge1xuICAgIGNvbnN0IGRlcGxveU1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2FwcC1kZXBsb3ktbW9kYWwnKTtcbiAgICBjb25zdCB0aXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LXRpdGxlJyk7XG4gICAgY29uc3Qgc3ViZG9tYWluSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXN1YmRvbWFpbicpO1xuICAgIGNvbnN0IHVybFByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXVybC1wcmV2aWV3Jyk7XG4gICAgY29uc3QgaXBJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktaXAnKTtcbiAgICBjb25zdCBwb3J0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBvcnQnKTtcbiAgICBjb25zdCB0YWlsc2NhbGVDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktdGFpbHNjYWxlLW9ubHknKTtcbiAgICBjb25zdCB0YWlsc2NhbGVTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFpbHNjYWxlLXN0YXR1cycpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGV4aXN0aW5nIGNvbnRhaW5lciB3aXRoIHNhbWUgaW1hZ2VcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hlY2tSZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2FwcHMvY2hlY2stZXhpc3RpbmcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcHBJZDogYXBwVGVtcGxhdGUuaWQgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgY2hlY2tSZXN1bHQgPSBhd2FpdCBjaGVja1Jlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKGNoZWNrUmVzdWx0LnN1Y2Nlc3MgJiYgY2hlY2tSZXN1bHQuZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNoZWNrUmVzdWx0LmNvbnRhaW5lcjtcbiAgICAgICAgY29uc3QgdXNlRXhpc3RpbmcgPSBjb25maXJtKFxuICAgICAgICAgIGBGb3VuZCBleGlzdGluZyAke2FwcFRlbXBsYXRlLm5hbWV9IGNvbnRhaW5lcjpcXG5cXG5gICtcbiAgICAgICAgICBgQ29udGFpbmVyOiAke2NvbnRhaW5lci5uYW1lfVxcbmAgK1xuICAgICAgICAgIGBTdGF0dXM6ICR7Y29udGFpbmVyLnN0YXR1c31cXG5gICtcbiAgICAgICAgICBgUG9ydDogJHtjb250YWluZXIucHJpbWFyeVBvcnQgfHwgJ04vQSd9XFxuXFxuYCArXG4gICAgICAgICAgYFdvdWxkIHlvdSBsaWtlIHRvIHVzZSB0aGlzIGV4aXN0aW5nIGNvbnRhaW5lcj9cXG5cXG5gICtcbiAgICAgICAgICBgQ2xpY2sgT0sgdG8gY29uZmlndXJlIEROUy9DYWRkeSBmb3IgdGhlIGV4aXN0aW5nIGNvbnRhaW5lci5cXG5gICtcbiAgICAgICAgICBgQ2xpY2sgQ2FuY2VsIHRvIGRlcGxveSBhIG5ldyBjb250YWluZXIuYFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICh1c2VFeGlzdGluZykge1xuICAgICAgICAgIC8vIFN0b3JlIGV4aXN0aW5nIGNvbnRhaW5lciBpbmZvIGZvciBkZXBsb3ltZW50XG4gICAgICAgICAgYXBwVGVtcGxhdGUuX3VzZUV4aXN0aW5nID0gdHJ1ZTtcbiAgICAgICAgICBhcHBUZW1wbGF0ZS5fZXhpc3RpbmdDb250YWluZXIgPSBjb250YWluZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZ25vcmUgY29udGFpbmVyIGNoZWNrIGVycm9yc1xuICAgIH1cblxuICAgIC8vIFNldCB0aXRsZSB3aXRoIGFwcCBpbmZvXG4gICAgdGl0bGUudGV4dENvbnRlbnQgPSBgRGVwbG95ICR7YXBwVGVtcGxhdGUubmFtZX1gO1xuXG4gICAgLy8gUHJlLWZpbGwgc3ViZG9tYWluIGZyb20gdGVtcGxhdGUgb3IgYXBwIElEXG4gICAgY29uc3QgZGVmYXVsdFN1YmRvbWFpbiA9IGFwcFRlbXBsYXRlLnN1YmRvbWFpbiB8fCBhcHBUZW1wbGF0ZS5pZC5yZXBsYWNlKC8tL2csICcnKTtcbiAgICBzdWJkb21haW5JbnB1dC52YWx1ZSA9IGRlZmF1bHRTdWJkb21haW47XG5cbiAgICAvLyBTaG93IHN1YnBhdGggY29tcGF0aWJpbGl0eSB3YXJuaW5nIGluIHN1YmRpcmVjdG9yeSBtb2RlXG4gICAgY29uc3Qgc3VicGF0aFdhcm5pbmcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3VicGF0aC1jb21wYXQtd2FybmluZycpO1xuICAgIGlmIChzdWJwYXRoV2FybmluZykge1xuICAgICAgaWYgKFNJVEUucm91dGluZ01vZGUgPT09ICdzdWJkaXJlY3RvcnknKSB7XG4gICAgICAgIGNvbnN0IHN1cHBvcnQgPSBhcHBUZW1wbGF0ZS5zdWJwYXRoU3VwcG9ydCB8fCAnc3RyaXAnO1xuICAgICAgICBpZiAoc3VwcG9ydCA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+JiM5ODg4OyA8c3Ryb25nPicgKyBhcHBUZW1wbGF0ZS5uYW1lICsgJzwvc3Ryb25nPiBkb2VzIG5vdCBzdXBwb3J0IHN1YmRpcmVjdG9yeSBtb2RlLiBJdCBtYXkgbm90IHdvcmsgY29ycmVjdGx5IGF0IGEgc3VicGF0aC48L3NwYW4+JztcbiAgICAgICAgfSBlbHNlIGlmIChzdXBwb3J0ID09PSAnc3RyaXAnKSB7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgc3VicGF0aFdhcm5pbmcuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4mIzk0MzI7ICcgKyBhcHBUZW1wbGF0ZS5uYW1lICsgJyBoYXMgdW52ZXJpZmllZCBzdWJkaXJlY3Rvcnkgc3VwcG9ydC4gSXQgbWF5IHJlcXVpcmUgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uLjwvc3Bhbj4nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1YnBhdGhXYXJuaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN1YnBhdGhXYXJuaW5nLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUHJlLXNlbGVjdCBETlMvU1NMIGZyb20gc2l0ZSBjb25maWcgKHNldCBkdXJpbmcgc2V0dXAgd2l6YXJkKVxuICAgIGNvbnN0IGNmZ0Ruc1R5cGUgPSBTSVRFLmRlZmF1bHRzLmRuc1R5cGUgfHwgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnID8gJ3B1YmxpYycgOiAncHJpdmF0ZScpO1xuICAgIGNvbnN0IGNmZ1NzbFR5cGUgPSBTSVRFLmRlZmF1bHRzLnNzbFR5cGUgfHwgKFNJVEUuY29uZmlndXJhdGlvblR5cGUgPT09ICdwdWJsaWMnID8gJ2xldHNlbmNyeXB0JyA6ICdpbnRlcm5hbCcpO1xuICAgIGNvbnN0IGRuc1JhZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT1cImRucy10eXBlXCJdW3ZhbHVlPVwiJHtjZmdEbnNUeXBlfVwiXWApO1xuICAgIGNvbnN0IHNzbFJhZGlvID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT1cInNzbC10eXBlXCJdW3ZhbHVlPVwiJHtjZmdTc2xUeXBlfVwiXWApO1xuICAgIGlmIChkbnNSYWRpbykgZG5zUmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgZWxzZSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl1bdmFsdWU9XCJwcml2YXRlXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgaWYgKHNzbFJhZGlvKSBzc2xSYWRpby5jaGVja2VkID0gdHJ1ZTtcbiAgICBlbHNlIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0W25hbWU9XCJzc2wtdHlwZVwiXVt2YWx1ZT1cImludGVybmFsXCJdJykuY2hlY2tlZCA9IHRydWU7XG4gICAgaXBJbnB1dC52YWx1ZSA9IFNJVEUuZGVmYXVsdHMudGFyZ2V0SVAgfHwgJ2xvY2FsaG9zdCc7XG4gICAgdGFpbHNjYWxlQ2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgLy8gTW92ZSBETlMvU1NMIGludG8gQWR2YW5jZWQgc2VjdGlvbiB3aGVuIGFscmVhZHkgY29uZmlndXJlZFxuICAgIGNvbnN0IGRuc1NlY3Rpb24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjYXBwLWRlcGxveS1tb2RhbCAuZmxleC1jb2wtZ2FwJyk/LmNsb3Nlc3QoJ2RpdicpO1xuICAgIGNvbnN0IGFkdmFuY2VkRGV0YWlscyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNhcHAtZGVwbG95LW1vZGFsIGRldGFpbHMnKTtcbiAgICBjb25zdCBhZHZhbmNlZENvbnRlbnQgPSBhZHZhbmNlZERldGFpbHM/LnF1ZXJ5U2VsZWN0b3IoJ2RpdicpO1xuICAgIGlmIChhZHZhbmNlZERldGFpbHMgJiYgYWR2YW5jZWRDb250ZW50ICYmIChTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID09PSAncHVibGljJyB8fCBTSVRFLmNvbmZpZ3VyYXRpb25UeXBlID09PSAnaG9tZWxhYicpKSB7XG4gICAgICAvLyBNb3ZlIEROUyBhbmQgU1NMIHNlY3Rpb25zIGluc2lkZSBBZHZhbmNlZFxuICAgICAgY29uc3QgZG5zU2VjdGlvbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2FwcC1kZXBsb3ktbW9kYWwgaW5wdXRbbmFtZT1cImRucy10eXBlXCJdJylbMF0/LmNsb3Nlc3QoJ2Rpdi5mbGV4LWNvbC1nYXAnKT8ucGFyZW50RWxlbWVudDtcbiAgICAgIGNvbnN0IHNzbFNlY3Rpb25FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNhcHAtZGVwbG95LW1vZGFsIGlucHV0W25hbWU9XCJzc2wtdHlwZVwiXScpWzBdPy5jbG9zZXN0KCdkaXYuZmxleC1jb2wtZ2FwJyk/LnBhcmVudEVsZW1lbnQ7XG4gICAgICBpZiAoZG5zU2VjdGlvbkVsICYmICFkbnNTZWN0aW9uRWwuZGF0YXNldC5tb3ZlZCkge1xuICAgICAgICBhZHZhbmNlZENvbnRlbnQuYXBwZW5kQ2hpbGQoZG5zU2VjdGlvbkVsKTtcbiAgICAgICAgZG5zU2VjdGlvbkVsLmRhdGFzZXQubW92ZWQgPSAnMSc7XG4gICAgICB9XG4gICAgICBpZiAoc3NsU2VjdGlvbkVsICYmICFzc2xTZWN0aW9uRWwuZGF0YXNldC5tb3ZlZCkge1xuICAgICAgICBhZHZhbmNlZENvbnRlbnQuYXBwZW5kQ2hpbGQoc3NsU2VjdGlvbkVsKTtcbiAgICAgICAgc3NsU2VjdGlvbkVsLmRhdGFzZXQubW92ZWQgPSAnMSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIG1lZGlhIHBhdGggc2VjdGlvbiBmb3IgbWVkaWEgYXBwc1xuICAgIGNvbnN0IG1lZGlhUGF0aFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWVkaWEtcGF0aC1zZWN0aW9uJyk7XG4gICAgY29uc3QgbWVkaWFQYXRoSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LW1lZGlhLXBhdGgnKTtcbiAgICBjb25zdCBtZWRpYVBhdGhEZXNjcmlwdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtZWRpYS1wYXRoLWRlc2NyaXB0aW9uJyk7XG5cbiAgICBpZiAoYXBwVGVtcGxhdGUubWVkaWFNb3VudCkge1xuICAgICAgbWVkaWFQYXRoU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIG1lZGlhUGF0aElucHV0LnZhbHVlID0gJyc7XG4gICAgICBtZWRpYVBhdGhJbnB1dC5wbGFjZWhvbGRlciA9ICcvbWVkaWEvTW92aWVzLCAvbWVkaWEvVFZTaG93cyBvciBjbGljayBCcm93c2UnO1xuXG4gICAgICAvLyBGZXRjaCBkZXRlY3RlZCBtb3VudHMgZnJvbSBleGlzdGluZyBtZWRpYSBzZXJ2ZXJzXG4gICAgICBjb25zdCBkZXRlY3RlZE1vdW50c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXRlY3RlZC1tb3VudHMtY29udGFpbmVyJyk7XG4gICAgICBjb25zdCBkZXRlY3RlZE1vdW50c0xpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGV0ZWN0ZWQtbW91bnRzLWxpc3QnKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgbW91bnRzUmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9tZWRpYS9kZXRlY3RlZC1tb3VudHMnKTtcbiAgICAgICAgY29uc3QgbW91bnRzUmVzdWx0ID0gYXdhaXQgbW91bnRzUmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAgIGlmIChtb3VudHNSZXN1bHQuc3VjY2VzcyAmJiBtb3VudHNSZXN1bHQubW91bnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBkZXRlY3RlZE1vdW50c0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICBkZXRlY3RlZE1vdW50c0xpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICAgICAgICAvLyBBdXRvLWZpbGwgbWVkaWEgcGF0aCB3aXRoIGFsbCBkZXRlY3RlZCBtb3VudHNcbiAgICAgICAgICBjb25zdCBhdXRvUGF0aHMgPSBbLi4ubmV3IFNldChtb3VudHNSZXN1bHQubW91bnRzLm1hcChtID0+IG0uaG9zdFBhdGgpKV07XG4gICAgICAgICAgbWVkaWFQYXRoSW5wdXQudmFsdWUgPSBhdXRvUGF0aHMuam9pbignLCAnKTtcblxuICAgICAgICAgIG1vdW50c1Jlc3VsdC5tb3VudHMuZm9yRWFjaChtb3VudCA9PiB7XG4gICAgICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgICAgICAgICAgIGJ0bi50eXBlID0gJ2J1dHRvbic7XG4gICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYXV0b1BhdGhzLmluY2x1ZGVzKG1vdW50Lmhvc3RQYXRoKTtcbiAgICAgICAgICAgIGJ0bi5zdHlsZS5jc3NUZXh0ID0gYHBhZGRpbmc6IDhweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1zdWNjZXNzKSAke2lzU2VsZWN0ZWQgPyAnNDAlJyA6ICcxNSUnfSwgdmFyKC0tY2FyZC1iZykpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1zdWNjZXNzKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjdXJzb3I6IHBvaW50ZXI7IGNvbG9yOiB2YXIoLS1mZyk7YDtcbiAgICAgICAgICAgIGJ0bi5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChtb3VudC5mb2xkZXJOYW1lKX08L3NwYW4+PGJyPjxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+ZnJvbSAke2VzY2FwZUh0bWwobW91bnQuc291cmNlSW1hZ2UpfTwvc3Bhbj5gO1xuICAgICAgICAgICAgYnRuLnRpdGxlID0gYCR7bW91bnQuaG9zdFBhdGh9IChmcm9tICR7bW91bnQuc291cmNlQ29udGFpbmVyfSlgO1xuICAgICAgICAgICAgYnRuLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRocyA9IG1lZGlhUGF0aElucHV0LnZhbHVlLnNwbGl0KCcsJykubWFwKHAgPT4gcC50cmltKCkpLmZpbHRlcihwID0+IHApO1xuICAgICAgICAgICAgICBjb25zdCBpZHggPSBjdXJyZW50UGF0aHMuaW5kZXhPZihtb3VudC5ob3N0UGF0aCk7XG4gICAgICAgICAgICAgIGlmIChpZHggPj0gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRocy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMTUlLCB2YXIoLS1jYXJkLWJnKSknO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQYXRocy5wdXNoKG1vdW50Lmhvc3RQYXRoKTtcbiAgICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgNDAlLCB2YXIoLS1jYXJkLWJnKSknO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG1lZGlhUGF0aElucHV0LnZhbHVlID0gY3VycmVudFBhdGhzLmpvaW4oJywgJyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZGV0ZWN0ZWRNb3VudHNMaXN0LmFwcGVuZENoaWxkKGJ0bik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGV0ZWN0ZWRNb3VudHNDb250YWluZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBkZXRlY3RlZE1vdW50c0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgdXAgYnJvd3NlIGJ1dHRvblxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Jyb3dzZS1tZWRpYS1idG4nKS5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgICBvcGVuRm9sZGVyQnJvd3NlcihtZWRpYVBhdGhJbnB1dCk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBtZWRpYVBhdGhTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBtZWRpYVBhdGhJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RldGVjdGVkLW1vdW50cy1jb250YWluZXInKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFNob3cgUGxleCBjbGFpbSB0b2tlbiBzZWN0aW9uIGZvciBQbGV4IGRlcGxveW1lbnRzXG4gICAgY29uc3QgcGxleENsYWltU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwbGV4LWNsYWltLXNlY3Rpb24nKTtcbiAgICBpZiAocGxleENsYWltU2VjdGlvbikge1xuICAgICAgaWYgKGFwcFRlbXBsYXRlLmlkID09PSAncGxleCcgfHwgYXBwVGVtcGxhdGUuY2xhaW1Ub2tlbikge1xuICAgICAgICBwbGV4Q2xhaW1TZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBsZXgtY2xhaW0nKS52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGxleENsYWltU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFBvcHVsYXRlIHZvbHVtZSBtb3VudHMgaW4gQWR2YW5jZWQgT3B0aW9uc1xuICAgIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndm9sdW1lLW1vdW50cy1zZWN0aW9uJyk7XG4gICAgY29uc3Qgdm9sdW1lTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2b2x1bWUtbW91bnRzLWxpc3QnKTtcbiAgICB2b2x1bWVMaXN0LmlubmVySFRNTCA9ICcnO1xuXG4gICAgaWYgKGFwcFRlbXBsYXRlLmRvY2tlcj8udm9sdW1lcz8ubGVuZ3RoKSB7XG4gICAgICBjb25zdCBtZWRpYUNvbnRhaW5lclBhdGggPSBhcHBUZW1wbGF0ZS5tZWRpYU1vdW50Py5jb250YWluZXJQYXRoO1xuICAgICAgY29uc3Qgbm9uTWVkaWFWb2x1bWVzID0gYXBwVGVtcGxhdGUuZG9ja2VyLnZvbHVtZXMuZmlsdGVyKHYgPT4gIXYuaW5jbHVkZXMoJ3t7TUVESUFfUEFUSH19JykgJiYgIShtZWRpYUNvbnRhaW5lclBhdGggJiYgdi5lbmRzV2l0aCgnOicgKyBtZWRpYUNvbnRhaW5lclBhdGgpKSk7XG5cbiAgICAgIGlmIChub25NZWRpYVZvbHVtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBub25NZWRpYVZvbHVtZXMuZm9yRWFjaCgodm9sLCBpKSA9PiB7XG4gICAgICAgICAgY29uc3QgW2hvc3REZWZhdWx0LCBjb250YWluZXJQYXRoXSA9IHZvbC5zcGxpdCgnOicpO1xuICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIHJvdy5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6IGZsZXg7IGdhcDogNnB4OyBhbGlnbi1pdGVtczogY2VudGVyOyc7XG4gICAgICAgICAgcm93LmlubmVySFRNTCA9IGBcbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwidm9sLWhvc3QtcGF0aFwiIGRhdGEtY29udGFpbmVyLXBhdGg9XCIke2NvbnRhaW5lclBhdGh9XCIgdmFsdWU9XCIke2hvc3REZWZhdWx0fVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiAvPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuODVyZW07IHdoaXRlLXNwYWNlOiBub3dyYXA7XCI+XHUyMTkyICR7Y29udGFpbmVyUGF0aH08L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInZvbC1icm93c2UtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0RcdURDQzI8L2J1dHRvbj5cbiAgICAgICAgICBgO1xuICAgICAgICAgIHZvbHVtZUxpc3QuYXBwZW5kQ2hpbGQocm93KTtcbiAgICAgICAgICByb3cucXVlcnlTZWxlY3RvcignLnZvbC1icm93c2UtYnRuJykub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy52b2wtaG9zdC1wYXRoJyk7XG4gICAgICAgICAgICBvcGVuRm9sZGVyQnJvd3NlcihpbnB1dCk7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBTZXQgZGVmYXVsdCBwb3J0IGZyb20gdGVtcGxhdGUgYW5kIGNoZWNrIGF2YWlsYWJpbGl0eVxuICAgIGNvbnN0IGRlZmF1bHRQb3J0ID0gYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgODA4MDtcbiAgICBwb3J0SW5wdXQudmFsdWUgPSAnJztcbiAgICBwb3J0SW5wdXQucGxhY2Vob2xkZXIgPSBgRGVmYXVsdDogJHtkZWZhdWx0UG9ydH1gO1xuXG4gICAgLy8gQWRkIHBvcnQgc3RhdHVzIGVsZW1lbnQgaWYgbm90IGV4aXN0c1xuICAgIGxldCBwb3J0U3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1wb3J0LXN0YXR1cycpO1xuICAgIGlmICghcG9ydFN0YXR1cykge1xuICAgICAgcG9ydFN0YXR1cyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgcG9ydFN0YXR1cy5pZCA9ICdkZXBsb3ktcG9ydC1zdGF0dXMnO1xuICAgICAgcG9ydFN0YXR1cy5zdHlsZS5jc3NUZXh0ID0gJ2ZvbnQtc2l6ZTogMC44cmVtOyBtYXJnaW4tdG9wOiA0cHg7JztcbiAgICAgIHBvcnRJbnB1dC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHBvcnRTdGF0dXMpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGRlZmF1bHQgcG9ydCBhdmFpbGFiaWxpdHlcbiAgICBhc3luYyBmdW5jdGlvbiBjaGVja0FuZFVwZGF0ZVBvcnRTdGF0dXMoKSB7XG4gICAgICBjb25zdCBwb3J0VG9DaGVjayA9IHBvcnRJbnB1dC52YWx1ZSB8fCBkZWZhdWx0UG9ydDtcbiAgICAgIHBvcnRTdGF0dXMuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5DaGVja2luZyBwb3J0Li4uPC9zcGFuPic7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNoZWNrUG9ydEF2YWlsYWJpbGl0eShwb3J0VG9DaGVjayk7XG4gICAgICBpZiAocmVzdWx0LmF2YWlsYWJsZSkge1xuICAgICAgICBwb3J0U3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNGNhZjUwO1wiPlBvcnQgJHtlc2NhcGVIdG1sKFN0cmluZyhwb3J0VG9DaGVjaykpfSBpcyBhdmFpbGFibGU8L3NwYW4+YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHN1Z2dlc3RlZFBvcnQgPSBhd2FpdCBnZXRTdWdnZXN0ZWRQb3J0KGRlZmF1bHRQb3J0KTtcbiAgICAgICAgcG9ydFN0YXR1cy5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogI2U3NGMzYztcIj5Qb3J0ICR7ZXNjYXBlSHRtbChwb3J0VG9DaGVjayl9IGluIHVzZSBieSAke2VzY2FwZUh0bWwocmVzdWx0LmNvbmZsaWN0Py51c2VkQnkgfHwgJ3Vua25vd24nKX08L3NwYW4+XG4gICAgICAgIGA7XG4gICAgICAgIGNvbnN0IHVzZUJ0biA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpO1xuICAgICAgICB1c2VCdG4udHlwZSA9ICdidXR0b24nO1xuICAgICAgICB1c2VCdG4udGV4dENvbnRlbnQgPSBgVXNlICR7c3VnZ2VzdGVkUG9ydH1gO1xuICAgICAgICB1c2VCdG4uc3R5bGUuY3NzVGV4dCA9ICdtYXJnaW4tbGVmdDogOHB4OyBwYWRkaW5nOiAycHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGN1cnNvcjogcG9pbnRlcjsnO1xuICAgICAgICB1c2VCdG4ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LXBvcnQnKS52YWx1ZSA9IHN1Z2dlc3RlZFBvcnQ7XG4gICAgICAgICAgcG9ydFN0YXR1cy5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogIzRjYWY1MDtcIj5Vc2luZyBzdWdnZXN0ZWQgcG9ydCAke2VzY2FwZUh0bWwoU3RyaW5nKHN1Z2dlc3RlZFBvcnQpKX08L3NwYW4+YDtcbiAgICAgICAgfTtcbiAgICAgICAgcG9ydFN0YXR1cy5hcHBlbmRDaGlsZCh1c2VCdG4pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIHBvcnQgb24gaW5wdXQgY2hhbmdlIChkZWJvdW5jZWQpXG4gICAgbGV0IHBvcnRDaGVja1RpbWVvdXQ7XG4gICAgcG9ydElucHV0Lm9uaW5wdXQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGNsZWFyVGltZW91dChwb3J0Q2hlY2tUaW1lb3V0KTtcbiAgICAgIHBvcnRDaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrQW5kVXBkYXRlUG9ydFN0YXR1cywgNTAwKTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbCBwb3J0IGNoZWNrXG4gICAgY2hlY2tBbmRVcGRhdGVQb3J0U3RhdHVzKCk7XG5cbiAgICAvLyBGZXRjaCBUYWlsc2NhbGUgc3RhdHVzXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdGFpbHNjYWxlL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5pbnN0YWxsZWQgJiYgZGF0YS5jb25uZWN0ZWQpIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjNGNhZjUwO1wiPkNvbm5lY3RlZDwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1sZWZ0OiA4cHg7XCI+JHtkYXRhLnNlbGY/Lmhvc3RuYW1lfSAoJHtkYXRhLnNlbGY/LmlwfSk8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogOHB4O1wiPnwgJHtkYXRhLmRldmljZUNvdW50fSBkZXZpY2VzPC9zcGFuPlxuICAgICAgICBgO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmluc3RhbGxlZCkge1xuICAgICAgICB0YWlsc2NhbGVTdGF0dXMuaW5uZXJIVE1MID0gYDxzcGFuIHN0eWxlPVwiY29sb3I6ICNmZjk4MDA7XCI+Tm90IGNvbm5lY3RlZDwvc3Bhbj5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm90IGF2YWlsYWJsZTwvc3Bhbj5gO1xuICAgICAgICB0YWlsc2NhbGVDaGVja2JveC5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGFpbHNjYWxlU3RhdHVzLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q291bGQgbm90IGNoZWNrIHN0YXR1czwvc3Bhbj5gO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBVUkwgcHJldmlldyBpbiByZWFsLXRpbWVcbiAgICBmdW5jdGlvbiB1cGRhdGVVcmxQcmV2aWV3KCkge1xuICAgICAgY29uc3Qgc3ViZG9tYWluID0gc3ViZG9tYWluSW5wdXQudmFsdWUgfHwgJ3N1YmRvbWFpbic7XG4gICAgICBjb25zdCBkbnNUeXBlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImRucy10eXBlXCJdOmNoZWNrZWQnKS52YWx1ZTtcbiAgICAgIGNvbnN0IHNzbFR5cGUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwic3NsLXR5cGVcIl06Y2hlY2tlZCcpLnZhbHVlO1xuXG4gICAgICBsZXQgdXJsID0gJyc7XG4gICAgICBpZiAoU0lURS5yb3V0aW5nTW9kZSA9PT0gJ3N1YmRpcmVjdG9yeScgJiYgU0lURS5kb21haW4pIHtcbiAgICAgICAgLy8gU3ViZGlyZWN0b3J5IG1vZGU6IGRvbWFpbi5jb20vYXBwXG4gICAgICAgIHVybCA9IGBodHRwczovLyR7U0lURS5kb21haW59LyR7c3ViZG9tYWlufWA7XG4gICAgICB9IGVsc2UgaWYgKGRuc1R5cGUgPT09ICdwcml2YXRlJykge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNzbFR5cGUgPT09ICdub25lJyA/ICdodHRwJyA6ICdodHRwcyc7XG4gICAgICAgIHVybCA9IGAke3Byb3RvY29sfTovLyR7YnVpbGREb21haW4oc3ViZG9tYWluKX1gO1xuICAgICAgfSBlbHNlIGlmIChkbnNUeXBlID09PSAncHVibGljJykge1xuICAgICAgICBjb25zdCBwcm90b2NvbCA9IHNzbFR5cGUgPT09ICdub25lJyA/ICdodHRwJyA6ICdodHRwcyc7XG4gICAgICAgIGNvbnN0IGRvbWFpbiA9IFNJVEUuZG9tYWluIHx8IHN1YmRvbWFpbjtcbiAgICAgICAgdXJsID0gU0lURS5kb21haW4gPyBgJHtwcm90b2NvbH06Ly8ke3N1YmRvbWFpbn0uJHtTSVRFLmRvbWFpbn1gIDogYCR7cHJvdG9jb2x9Oi8vJHtzdWJkb21haW59YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHBvcnQgPSBwb3J0SW5wdXQudmFsdWUgfHwgYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgREMuREVGQVVMVFMuU0VSVklDRV9QT1JUO1xuICAgICAgICB1cmwgPSBgaHR0cDovLyR7aXBJbnB1dC52YWx1ZX06JHtwb3J0fWA7XG4gICAgICB9XG4gICAgICB1cmxQcmV2aWV3LnRleHRDb250ZW50ID0gdXJsO1xuICAgIH1cblxuICAgIC8vIEF0dGFjaCBsaXN0ZW5lcnNcbiAgICBzdWJkb21haW5JbnB1dC5vbmlucHV0ID0gdXBkYXRlVXJsUHJldmlldztcbiAgICBpcElucHV0Lm9uaW5wdXQgPSB1cGRhdGVVcmxQcmV2aWV3O1xuICAgIHBvcnRJbnB1dC5vbmlucHV0ID0gdXBkYXRlVXJsUHJldmlldztcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICAgIHJhZGlvLm9uY2hhbmdlID0gdXBkYXRlVXJsUHJldmlldztcbiAgICB9KTtcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwic3NsLXR5cGVcIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICAgIHJhZGlvLm9uY2hhbmdlID0gdXBkYXRlVXJsUHJldmlldztcbiAgICB9KTtcblxuICAgIHVwZGF0ZVVybFByZXZpZXcoKTtcblxuICAgIC8vIENsb3NlIGFwcCBzZWxlY3Rvciwgb3BlbiBkZXBsb3kgY29uZmlnXG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIGRlcGxveU1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcblxuICAgIC8vIFN0b3JlIGFwcCB0ZW1wbGF0ZSBmb3IgZGVwbG95bWVudFxuICAgIGRlcGxveU1vZGFsLmRhdGFzZXQuYXBwVGVtcGxhdGUgPSBKU09OLnN0cmluZ2lmeShhcHBUZW1wbGF0ZSk7XG4gIH1cblxuICAvLyBBZGQgYXBwIHRvIGdyaWQgd2l0aCBmdWxsIERvY2tlciBkZXBsb3ltZW50XG4gIGFzeW5jIGZ1bmN0aW9uIGFkZEFwcFRvR3JpZChkZXBsb3lDb25maWcpIHtcbiAgICBjb25zdCBhcHBUZW1wbGF0ZSA9IGRlcGxveUNvbmZpZy5hcHBUZW1wbGF0ZTtcbiAgICBjb25zdCBjdXN0b21BcHBzID0gc2FmZUdldEpTT04oQVBQU19LRVksIFtdKTtcblxuICAgIC8vIENoZWNrIGlmIHVzaW5nIGV4aXN0aW5nIGNvbnRhaW5lclxuICAgIGNvbnN0IHVzaW5nRXhpc3RpbmcgPSBhcHBUZW1wbGF0ZS5fdXNlRXhpc3RpbmcgJiYgYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyO1xuXG4gICAgLy8gQ2hlY2sgaWYgYXBwIGFscmVhZHkgZXhpc3RzIC0gc2tpcCBpZiB1c2luZyBleGlzdGluZyBjb250YWluZXIgKHVzZXIgYWxyZWFkeSBjb25maXJtZWQpXG4gICAgY29uc3QgZXhpc3RpbmdBcHAgPSBjdXN0b21BcHBzLmZpbmQoYSA9PiBhLmlkID09PSBkZXBsb3lDb25maWcuc3ViZG9tYWluKTtcbiAgICBpZiAoZXhpc3RpbmdBcHAgJiYgIXVzaW5nRXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IGNvbmZpcm1lZCA9IGNvbmZpcm0oYEFuIGFwcCB3aXRoIHN1YmRvbWFpbiBcIiR7ZGVwbG95Q29uZmlnLnN1YmRvbWFpbn1cIiBhbHJlYWR5IGV4aXN0cy4gUmVkZXBsb3k/YCk7XG4gICAgICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBSZW1vdmUgZnJvbSBsb2NhbFN0b3JhZ2UgdG8gYWxsb3cgcmVkZXBsb3ltZW50L3VwZGF0ZVxuICAgIGlmIChleGlzdGluZ0FwcCkge1xuICAgICAgY29uc3QgaW5kZXggPSBjdXN0b21BcHBzLmluZGV4T2YoZXhpc3RpbmdBcHApO1xuICAgICAgY3VzdG9tQXBwcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgc2FmZVNldChBUFBTX0tFWSwgSlNPTi5zdHJpbmdpZnkoY3VzdG9tQXBwcykpO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHBvcnQgYXZhaWxhYmlsaXR5IGJlZm9yZSBkZXBsb3ltZW50IChza2lwIGlmIHVzaW5nIGV4aXN0aW5nIGNvbnRhaW5lcilcbiAgICBpZiAoIXVzaW5nRXhpc3RpbmcpIHtcbiAgICAgIGNvbnN0IHBvcnRUb1VzZSA9IGRlcGxveUNvbmZpZy5wb3J0IHx8IGFwcFRlbXBsYXRlLmRlZmF1bHRQb3J0IHx8IDgwODA7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBDaGVja2luZyBwb3J0ICR7cG9ydFRvVXNlfSBhdmFpbGFiaWxpdHkuLi5gLCAnaW5mbycsIDApO1xuXG4gICAgICBjb25zdCBwb3J0Q2hlY2sgPSBhd2FpdCBjaGVja1BvcnRBdmFpbGFiaWxpdHkocG9ydFRvVXNlKTtcbiAgICAgIGlmICghcG9ydENoZWNrLmF2YWlsYWJsZSkge1xuICAgICAgICBjb25zdCBzdWdnZXN0ZWRQb3J0ID0gYXdhaXQgZ2V0U3VnZ2VzdGVkUG9ydChhcHBUZW1wbGF0ZS5kZWZhdWx0UG9ydCB8fCA4MDgwKTtcbiAgICAgICAgY29uc3QgdXNlQWx0ZXJuYXRlID0gY29uZmlybShcbiAgICAgICAgICBgUG9ydCAke3BvcnRUb1VzZX0gaXMgYWxyZWFkeSBpbiB1c2UgYnkgJHtwb3J0Q2hlY2suY29uZmxpY3Q/LnVzZWRCeSB8fCAnYW5vdGhlciBjb250YWluZXInfS5cXG5cXG5gICtcbiAgICAgICAgICBgV291bGQgeW91IGxpa2UgdG8gdXNlIHBvcnQgJHtzdWdnZXN0ZWRQb3J0fSBpbnN0ZWFkP2BcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHVzZUFsdGVybmF0ZSkge1xuICAgICAgICAgIGRlcGxveUNvbmZpZy5wb3J0ID0gc3VnZ2VzdGVkUG9ydDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdEZXBsb3ltZW50IGNhbmNlbGxlZCAtIHBvcnQgY29uZmxpY3QnLCAnZXJyb3InLCA1MDAwKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVXNlIGV4aXN0aW5nIGNvbnRhaW5lcidzIHBvcnRcbiAgICAgIGRlcGxveUNvbmZpZy5wb3J0ID0gYXBwVGVtcGxhdGUuX2V4aXN0aW5nQ29udGFpbmVyLnByaW1hcnlQb3J0O1xuICAgIH1cbiAgICBzaG93Tm90aWZpY2F0aW9uKFxuICAgICAgdXNpbmdFeGlzdGluZ1xuICAgICAgICA/IGBDb25maWd1cmluZyAke2FwcFRlbXBsYXRlLm5hbWV9IHdpdGggZXhpc3RpbmcgY29udGFpbmVyLi4uYFxuICAgICAgICA6IGBEZXBsb3lpbmcgJHthcHBUZW1wbGF0ZS5uYW1lfS4uLmAsXG4gICAgICAnaW5mbycsIDBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFByZXBhcmUgZGVwbG95bWVudCBjb25maWcgZnJvbSB1c2VyJ3MgY2hvaWNlc1xuICAgICAgY29uc3QgYXBpRGVwbG95Q29uZmlnID0ge1xuICAgICAgICBhcHBJZDogYXBwVGVtcGxhdGUuaWQsXG4gICAgICAgIGNvbmZpZzoge1xuICAgICAgICAgIHN1YmRvbWFpbjogZGVwbG95Q29uZmlnLnN1YmRvbWFpbixcbiAgICAgICAgICBpcDogZGVwbG95Q29uZmlnLmlwLFxuICAgICAgICAgIGNyZWF0ZURuczogZGVwbG95Q29uZmlnLmRuc1R5cGUgPT09ICdwcml2YXRlJywgIC8vIE9ubHkgY3JlYXRlIEROUyBmb3IgcHJpdmF0ZVxuICAgICAgICAgIHBvcnQ6IGRlcGxveUNvbmZpZy5wb3J0IHx8IGFwcFRlbXBsYXRlLmRlZmF1bHRQb3J0IHx8IG51bGwsICAvLyBVc2UgY3VzdG9tLCB0ZW1wbGF0ZSBkZWZhdWx0LCBvciBudWxsXG4gICAgICAgICAgc3NsVHlwZTogZGVwbG95Q29uZmlnLnNzbFR5cGUsXG4gICAgICAgICAgZG5zVHlwZTogZGVwbG95Q29uZmlnLmRuc1R5cGUsXG4gICAgICAgICAgdGFpbHNjYWxlT25seTogZGVwbG95Q29uZmlnLnRhaWxzY2FsZU9ubHkgfHwgZmFsc2UsICAvLyBUYWlsc2NhbGUtb25seSBhY2Nlc3MgcmVzdHJpY3Rpb25cbiAgICAgICAgICBtZWRpYVBhdGg6IGRlcGxveUNvbmZpZy5tZWRpYVBhdGggfHwgbnVsbCwgIC8vIE1lZGlhIGZvbGRlciBwYXRoIGZvciBtZWRpYSBhcHBzXG4gICAgICAgICAgcGxleENsYWltVG9rZW46IGRlcGxveUNvbmZpZy5wbGV4Q2xhaW1Ub2tlbiB8fCBudWxsLCAgLy8gUGxleCBjbGFpbSB0b2tlbiBmb3IgYXV0by1jbGFpbVxuICAgICAgICAgIGN1c3RvbVZvbHVtZXM6IGRlcGxveUNvbmZpZy5jdXN0b21Wb2x1bWVzIHx8IG51bGwgIC8vIEN1c3RvbSB2b2x1bWUgbW91bnQgb3ZlcnJpZGVzXG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIEFkZCBleGlzdGluZyBjb250YWluZXIgaW5mbyBpZiB1c2luZyBleGlzdGluZ1xuICAgICAgaWYgKHVzaW5nRXhpc3RpbmcpIHtcbiAgICAgICAgYXBpRGVwbG95Q29uZmlnLmNvbmZpZy51c2VFeGlzdGluZyA9IHRydWU7XG4gICAgICAgIGFwaURlcGxveUNvbmZpZy5jb25maWcuZXhpc3RpbmdDb250YWluZXJJZCA9IGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5pZDtcbiAgICAgICAgYXBpRGVwbG95Q29uZmlnLmNvbmZpZy5leGlzdGluZ1BvcnQgPSBhcHBUZW1wbGF0ZS5fZXhpc3RpbmdDb250YWluZXIucHJpbWFyeVBvcnQ7XG4gICAgICAgIC8vIFVzZSBleGlzdGluZyBjb250YWluZXIncyBwb3J0IGlmIG5vIGN1c3RvbSBwb3J0IHNwZWNpZmllZFxuICAgICAgICBpZiAoIWRlcGxveUNvbmZpZy5wb3J0ICYmIGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5wcmltYXJ5UG9ydCkge1xuICAgICAgICAgIGFwaURlcGxveUNvbmZpZy5jb25maWcucG9ydCA9IGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lci5wcmltYXJ5UG9ydDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBEQy1DQVRBTE9HLTM6IGRlcGxveSB0aHJvdWdoIHNoaXBkZWNrIChubyBEb2NrZXIgZGFlbW9uKS4gVGhlXG4gICAgICAvLyBicmlkZ2UgcmVuZGVycyB0aGUgY2F0YWxvZyBlbnRyeSBzZXJ2ZXItc2lkZSBhbmQgcnVucyB0aGUgT0NJXG4gICAgICAvLyBpbWFnZSBhcyBhIGhhcmRlbmVkIHN5c3RlbWQgc2VydmljZS4gU2FtZSBtb2RhbCwgc2FtZSBmaWVsZHMuXG4gICAgICBjb25zdCBjYXRhbG9nUGF5bG9hZCA9IHtcbiAgICAgICAgYXBwOiBhcHBUZW1wbGF0ZS5pZCxcbiAgICAgICAgcG9ydDogZGVwbG95Q29uZmlnLnBvcnQgfHwgYXBwVGVtcGxhdGUuZGVmYXVsdFBvcnQgfHwgbnVsbCxcbiAgICAgICAgc3ViZG9tYWluOiBkZXBsb3lDb25maWcuc3ViZG9tYWluIHx8ICcnLFxuICAgICAgICBtZWRpYV9wYXRoOiBkZXBsb3lDb25maWcubWVkaWFQYXRoIHx8ICcnLFxuICAgICAgICBlbnY6IGRlcGxveUNvbmZpZy5wbGV4Q2xhaW1Ub2tlbiA/IHsgUExFWF9DTEFJTTogZGVwbG95Q29uZmlnLnBsZXhDbGFpbVRva2VuIH0gOiB7fVxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9kZXBsb3lzL2NhdGFsb2cvZGVwbG95Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGNhdGFsb2dQYXlsb2FkKVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIC8vIEFkZCB0byBzYXZlZCBhcHBzIChzdG9yZSBJUCBmb3IgbGF0ZXIgZGVsZXRpb24pXG4gICAgICAgIGNvbnN0IG5ld0FwcCA9IHtcbiAgICAgICAgICBpZDogZGVwbG95Q29uZmlnLnN1YmRvbWFpbiwgIC8vIFVzZSBzdWJkb21haW4gYXMgSURcbiAgICAgICAgICBuYW1lOiBhcHBUZW1wbGF0ZS5uYW1lLFxuICAgICAgICAgIGxvZ286IGAvYXNzZXRzLyR7YXBwVGVtcGxhdGUuaWR9LnBuZ2AsXG4gICAgICAgICAgY29udGFpbmVySWQ6IG51bGwsICAvLyBzaGlwZGVjayBkZXBsb3lzIGhhdmUgbm8gZG9ja2VyIGNvbnRhaW5lciBpZFxuICAgICAgICAgIHVybDogcmVzdWx0LnVybCB8fCBgaHR0cDovLzEyNy4wLjAuMToke2NhdGFsb2dQYXlsb2FkLnBvcnR9YCxcbiAgICAgICAgICBpcDogZGVwbG95Q29uZmlnLmlwLCAgLy8gU3RvcmUgSVAgZm9yIEROUyByZWNvcmQgZGVsZXRpb25cbiAgICAgICAgICBhcHBUZW1wbGF0ZTogYXBwVGVtcGxhdGUuaWQsICAvLyBTdG9yZSBvcmlnaW5hbCB0ZW1wbGF0ZSBJRFxuICAgICAgICAgIHRhaWxzY2FsZU9ubHk6IGRlcGxveUNvbmZpZy50YWlsc2NhbGVPbmx5IHx8IGZhbHNlICAvLyBUYWlsc2NhbGUgcHJvdGVjdGlvbiBzdGF0dXNcbiAgICAgICAgfTtcbiAgICAgICAgY3VzdG9tQXBwcy5wdXNoKG5ld0FwcCk7XG4gICAgICAgIHNhZmVTZXQoQVBQU19LRVksIEpTT04uc3RyaW5naWZ5KGN1c3RvbUFwcHMpKTtcblxuICAgICAgICAvLyBBZGQgdG8gQVBQUyBhcnJheSBhbmQgcmVidWlsZCBncmlkXG4gICAgICAgIC8vIEFjY2VzcyBBUFBTIGZyb20gcGFyZW50IHNjb3BlIHZpYSB3aW5kb3dcbiAgICAgICAgaWYgKHdpbmRvdy5BUFBTICYmICF3aW5kb3cuQVBQUy5zb21lKGEgPT4gYS5pZCA9PT0gYXBwVGVtcGxhdGUuaWQpKSB7XG4gICAgICAgICAgd2luZG93LkFQUFMucHVzaChuZXdBcHApO1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LmJ1aWxkR3JpZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgd2luZG93LmJ1aWxkR3JpZCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5yZWZyZXNoQWxsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHdpbmRvdy5yZWZyZXNoQWxsKCksIDUwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvdyBzdWNjZXNzIHdpdGggVVJMIChhbmQgd2FybmluZyBpZiBETlMgZmFpbGVkKVxuICAgICAgICBsZXQgbWVzc2FnZSA9IHJlc3VsdC51c2VkRXhpc3RpbmdcbiAgICAgICAgICA/IGAke2FwcFRlbXBsYXRlLm5hbWV9IGNvbmZpZ3VyZWQgd2l0aCBleGlzdGluZyBjb250YWluZXIhXFxuVVJMOiAke3Jlc3VsdC51cmx9YFxuICAgICAgICAgIDogYCR7YXBwVGVtcGxhdGUubmFtZX0gZGVwbG95ZWQgc3VjY2Vzc2Z1bGx5IVxcblVSTDogJHtyZXN1bHQudXJsfWA7XG4gICAgICAgIGlmIChyZXN1bHQud2FybmluZykge1xuICAgICAgICAgIG1lc3NhZ2UgKz0gYFxcblxcblx1MjZBMCBXYXJuaW5nOiAke3Jlc3VsdC53YXJuaW5nfWA7XG4gICAgICAgIH1cblxuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKG1lc3NhZ2UsICdzdWNjZXNzJywgODAwMCk7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgdGVtcG9yYXJ5IHByb3BlcnRpZXNcbiAgICAgICAgZGVsZXRlIGFwcFRlbXBsYXRlLl91c2VFeGlzdGluZztcbiAgICAgICAgZGVsZXRlIGFwcFRlbXBsYXRlLl9leGlzdGluZ0NvbnRhaW5lcjtcbiAgICAgICAgXG4gICAgICAgIC8vIEZvciBIVFRQUyBVUkxzLCBjaGVjayBTU0wgY2VydGlmaWNhdGUgc3RhdHVzXG4gICAgICAgIGlmIChyZXN1bHQudXJsICYmIHJlc3VsdC51cmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgICAgICAgIGNoZWNrU1NMQ2VydGlmaWNhdGUocmVzdWx0LnVybCwgYXBwVGVtcGxhdGUubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTaG93IHNldHVwIGluc3RydWN0aW9ucyBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKHJlc3VsdC5zZXR1cEluc3RydWN0aW9ucyAmJiByZXN1bHQuc2V0dXBJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25zID0gcmVzdWx0LnNldHVwSW5zdHJ1Y3Rpb25zLmpvaW4oJ1xcbicpO1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgU2V0dXAgSW5zdHJ1Y3Rpb25zIGZvciAke2FwcFRlbXBsYXRlLm5hbWV9OiAke2luc3RydWN0aW9uc31gLCAnaW5mbycsIDEwMDAwKTtcbiAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvciB8fCAnRGVwbG95bWVudCBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbQXBwU2VsZWN0b3JdIERlcGxveW1lbnQnLCBlcnJvciwgeyBmdW5jdGlvbjogJ2RlcGxveScgfSk7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKFxuICAgICAgICBgRmFpbGVkIHRvIGRlcGxveSAke2FwcFRlbXBsYXRlLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgODAwMFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyBDaGVjayBTU0wgY2VydGlmaWNhdGUgc3RhdHVzIGFuZCBub3RpZnkgd2hlbiByZWFkeVxuICBhc3luYyBmdW5jdGlvbiBjaGVja1NTTENlcnRpZmljYXRlKHVybCwgYXBwTmFtZSkge1xuICAgIHNob3dOb3RpZmljYXRpb24oYFx1MjNGMyBHZW5lcmF0aW5nIFNTTCBjZXJ0aWZpY2F0ZSBmb3IgJHthcHBOYW1lfS4uLmAsICd3YXJuaW5nJywgNjAwMDApO1xuICAgIFxuICAgIGxldCBhdHRlbXB0cyA9IDA7XG4gICAgY29uc3QgbWF4QXR0ZW1wdHMgPSAxMjsgLy8gNjAgc2Vjb25kcyB0b3RhbCAoNSBzZWNvbmQgaW50ZXJ2YWxzKVxuICAgIFxuICAgIGNvbnN0IGNoZWNrQ2VydCA9IGFzeW5jICgpID0+IHtcbiAgICAgIGF0dGVtcHRzKys7XG4gICAgICBcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRyeSB0byBmZXRjaCB0aGUgVVJMIC0gaWYgU1NMIHdvcmtzLCB0aGlzIHdpbGwgc3VjY2VlZFxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgeyBcbiAgICAgICAgICBtZXRob2Q6ICdIRUFEJyxcbiAgICAgICAgICBtb2RlOiAnbm8tY29ycycgLy8gQXZvaWQgQ09SUyBpc3N1ZXNcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgU1NMIGlzIHdvcmtpbmdcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgXHUyNzA1ICR7YXBwTmFtZX0gaXMgcmVhZHkhIFNTTCBjZXJ0aWZpY2F0ZSBnZW5lcmF0ZWQuYCwgJ3N1Y2Nlc3MnLCA1MDAwKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBTU0wgbm90IHJlYWR5IHlldFxuICAgICAgICBpZiAoYXR0ZW1wdHMgPCBtYXhBdHRlbXB0cykge1xuICAgICAgICAgIHNldFRpbWVvdXQoY2hlY2tDZXJ0LCA1MDAwKTsgLy8gQ2hlY2sgYWdhaW4gaW4gNSBzZWNvbmRzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hvd05vdGlmaWNhdGlvbihcbiAgICAgICAgICAgIGBcdTI2QTBcdUZFMEYgJHthcHBOYW1lfSBkZXBsb3llZCBidXQgU1NMIGNlcnRpZmljYXRlIG1heSBzdGlsbCBiZSBnZW5lcmF0aW5nLlxcblRyeSByZWZyZXNoaW5nIGluIGEgbW9tZW50IGlmIHlvdSBzZWUgYSBjZXJ0aWZpY2F0ZSBlcnJvci5gLFxuICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgMTAwMDBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuICAgIFxuICAgIC8vIFN0YXJ0IGNoZWNraW5nIGFmdGVyIDMgc2Vjb25kcyAoZ2l2ZSBDYWRkeSB0aW1lIHRvIHN0YXJ0KVxuICAgIHNldFRpbWVvdXQoY2hlY2tDZXJ0LCAzMDAwKTtcbiAgfVxuXG4gIC8vIExvYWQgY3VzdG9tIGFwcHMgb24gc3RhcnR1cFxuICBmdW5jdGlvbiBsb2FkQ3VzdG9tQXBwcygpIHtcbiAgICBjb25zdCBjdXN0b21BcHBzID0gc2FmZUdldEpTT04oQVBQU19LRVksIFtdKTtcbiAgICBjdXN0b21BcHBzLmZvckVhY2goYXBwID0+IHtcbiAgICAgIGlmICghd2luZG93LkFQUFMuc29tZShhID0+IGEuaWQgPT09IGFwcC5pZCkpIHtcbiAgICAgICAgd2luZG93LkFQUFMucHVzaChhcHApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gRXZlbnQgbGlzdGVuZXJzXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2VydmljZS1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgYnVpbGRBcHBTZWxlY3RvcigpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gREMtMTYzOiBwcm9ncmFtbWF0aWMgZGVwbG95LWNvbmZpZyBvcGVuZXIgZm9yIHRoZSBBSSBjaGF0IHBhbmVsIChhbmRcbiAgLy8gYW55IG90aGVyIGluLXBhZ2UgY29uc3VtZXIpLiBSZXNvbHZlcyB0aGUgdGVtcGxhdGUgaWQgYWdhaW5zdCB0aGVcbiAgLy8gY2FjaGVkIEFQSSB0ZW1wbGF0ZXMgKGZldGNoaW5nIHRoZW0gaWYgbmVlZGVkKSwgdGhlbiBvcGVucyB0aGUgc2FtZVxuICAvLyBkZXBsb3kgbW9kYWwgYSBtYW51YWwgY2xpY2sgd291bGQuIFJldHVybnMgZmFsc2UgZm9yIHVua25vd24gaWRzLlxuICB3aW5kb3cub3BlbkRlcGxveUNvbmZpZ0ZvciA9IGFzeW5jIGZ1bmN0aW9uICh0ZW1wbGF0ZUlkKSB7XG4gICAgaWYgKCFhcGlUZW1wbGF0ZXMpIHtcbiAgICAgIGNvbnN0IG9rRmV0Y2ggPSBhd2FpdCBmZXRjaEFwcFRlbXBsYXRlcygpO1xuICAgICAgaWYgKCFva0ZldGNoKSByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IFN0cmluZyh0ZW1wbGF0ZUlkIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IGVudHJ5ID0gT2JqZWN0LmVudHJpZXMoYXBpVGVtcGxhdGVzKS5maW5kKChbaWRdKSA9PiBpZC50b0xvd2VyQ2FzZSgpID09PSBrZXkpO1xuICAgIGlmICghZW50cnkpIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBhcHAgPSB7IGlkOiBlbnRyeVswXSwgLi4uZW50cnlbMV0gfTtcbiAgICBpZiAoYXBwLmlzRGFzaGJvYXJkV2lkZ2V0KSB7XG4gICAgICBhd2FpdCBidWlsZEFwcFNlbGVjdG9yKCk7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgICByZXR1cm4gJ3NlbGVjdG9yJzsgLy8gd2lkZ2V0IFx1MjAxNCBwb2ludCBhdCB0aGUgc2VsZWN0b3IgZ3JpZCBpbnN0ZWFkXG4gICAgfVxuICAgIGF3YWl0IHNob3dEZXBsb3lDb25maWcoYXBwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtc2VsZWN0b3ItY2FuY2VsJykpO1xuXG4gIC8vIERlcGxveSBtb2RhbCBldmVudCBsaXN0ZW5lcnNcbiAgY29uc3QgZGVwbG95TW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwLWRlcGxveS1tb2RhbCcpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LWNhbmNlbCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBkZXBsb3lNb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhcHAtZGVwbG95LWNvbmZpcm0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgLy8gR2V0IHVzZXIgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IGFwcFRlbXBsYXRlID0gSlNPTi5wYXJzZShkZXBsb3lNb2RhbC5kYXRhc2V0LmFwcFRlbXBsYXRlKTtcbiAgICBjb25zdCBtZWRpYVBhdGggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LW1lZGlhLXBhdGgnKS52YWx1ZS50cmltKCk7XG5cbiAgICAvLyBDb2xsZWN0IGN1c3RvbSB2b2x1bWUgb3ZlcnJpZGVzXG4gICAgY29uc3QgY3VzdG9tVm9sdW1lcyA9IFtdO1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyN2b2x1bWUtbW91bnRzLWxpc3QgLnZvbC1ob3N0LXBhdGgnKS5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgIGN1c3RvbVZvbHVtZXMucHVzaCh7IGhvc3RQYXRoOiBpbnB1dC52YWx1ZS50cmltKCksIGNvbnRhaW5lclBhdGg6IGlucHV0LmRhdGFzZXQuY29udGFpbmVyUGF0aCB9KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlcGxveUNvbmZpZyA9IHtcbiAgICAgIGFwcFRlbXBsYXRlOiBhcHBUZW1wbGF0ZSxcbiAgICAgIHN1YmRvbWFpbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1zdWJkb21haW4nKS52YWx1ZS50cmltKCksXG4gICAgICBkbnNUeXBlOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFtuYW1lPVwiZG5zLXR5cGVcIl06Y2hlY2tlZCcpLnZhbHVlLFxuICAgICAgc3NsVHlwZTogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cInNzbC10eXBlXCJdOmNoZWNrZWQnKS52YWx1ZSxcbiAgICAgIGlwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwbG95LWlwJykudmFsdWUudHJpbSgpLFxuICAgICAgcG9ydDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1wb3J0JykudmFsdWUudHJpbSgpLFxuICAgICAgdGFpbHNjYWxlT25seTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS10YWlsc2NhbGUtb25seScpLmNoZWNrZWQsXG4gICAgICBtZWRpYVBhdGg6IG1lZGlhUGF0aCB8fCBudWxsLFxuICAgICAgcGxleENsYWltVG9rZW46IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktcGxleC1jbGFpbScpPy52YWx1ZS50cmltKCkgfHwgbnVsbCxcbiAgICAgIGN1c3RvbVZvbHVtZXM6IGN1c3RvbVZvbHVtZXMubGVuZ3RoID4gMCA/IGN1c3RvbVZvbHVtZXMgOiBudWxsLFxuICAgICAgcmVzb3VyY2VzOiB7XG4gICAgICAgIGNwdXM6IHBhcnNlRmxvYXQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcGxveS1jcHUtbGltaXQnKS52YWx1ZSkgfHwgMCxcbiAgICAgICAgbWVtb3J5OiBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3ktbWVtb3J5LWxpbWl0JykudmFsdWUpIHx8IDAsXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFZhbGlkYXRlIHN1YmRvbWFpblxuICAgIGlmICghZGVwbG95Q29uZmlnLnN1YmRvbWFpbikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgc3ViZG9tYWluIG9yIGRvbWFpbiBuYW1lJywgJ3dhcm5pbmcnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBtZWRpYSBwYXRoIGZvciBtZWRpYSBhcHBzXG4gICAgaWYgKGFwcFRlbXBsYXRlLm1lZGlhTW91bnQ/LnJlcXVpcmVkICYmICFtZWRpYVBhdGgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhIG1lZGlhIGxpYnJhcnkgcGF0aCBmb3IgdGhpcyBhcHBsaWNhdGlvbicsICd3YXJuaW5nJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgZGVwbG95IG1vZGFsXG4gICAgZGVwbG95TW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgLy8gU3RhcnQgZGVwbG95bWVudFxuICAgIGFkZEFwcFRvR3JpZChkZXBsb3lDb25maWcpO1xuICB9KTtcblxuICB3aXJlTW9kYWwoZGVwbG95TW9kYWwpO1xuXG4gIC8vID09PT09IEZPTERFUiBCUk9XU0VSIEZVTkNUSU9OQUxJVFkgPT09PT1cbiAgY29uc3QgZm9sZGVyQnJvd3Nlck1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLW1vZGFsJyk7XG4gIGNvbnN0IGZvbGRlckJyb3dzZXJQYXRoID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2ZvbGRlci1icm93c2VyLXBhdGgnKTtcbiAgY29uc3QgZm9sZGVyQnJvd3Nlckxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItbGlzdCcpO1xuICBjb25zdCBmb2xkZXJCcm93c2VyU2VsZWN0ZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItc2VsZWN0ZWQnKTtcbiAgY29uc3QgZm9sZGVyQnJvd3NlclNlbGVjdGVkTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXItYnJvd3Nlci1zZWxlY3RlZC1saXN0Jyk7XG4gIGxldCBjdXJyZW50QnJvd3NlclBhdGggPSAnJztcbiAgbGV0IHNlbGVjdGVkRm9sZGVycyA9IFtdO1xuICBsZXQgdGFyZ2V0TWVkaWFJbnB1dCA9IG51bGw7XG5cbiAgd2luZG93Lm9wZW5Gb2xkZXJCcm93c2VyID0gZnVuY3Rpb24obWVkaWFJbnB1dCkge1xuICAgIHRhcmdldE1lZGlhSW5wdXQgPSBtZWRpYUlucHV0O1xuICAgIHNlbGVjdGVkRm9sZGVycyA9IG1lZGlhSW5wdXQudmFsdWUuc3BsaXQoJywnKS5tYXAocCA9PiBwLnRyaW0oKSkuZmlsdGVyKHAgPT4gcCk7XG4gICAgY3VycmVudEJyb3dzZXJQYXRoID0gJyc7XG4gICAgdXBkYXRlU2VsZWN0ZWRGb2xkZXJzRGlzcGxheSgpO1xuICAgIGxvYWRGb2xkZXJDb250ZW50cygnJyk7XG4gICAgZm9sZGVyQnJvd3Nlck1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgfTtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkRm9sZGVyQ29udGVudHMocGF0aCkge1xuICAgIGZvbGRlckJyb3dzZXJQYXRoLnRleHRDb250ZW50ID0gcGF0aCB8fCAnU2VsZWN0IGEgZHJpdmUuLi4nO1xuICAgIGZvbGRlckJyb3dzZXJMaXN0LmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkxvYWRpbmcuLi48L2Rpdj4nO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvYnJvd3NlL2RpcmVjdG9yaWVzP3BhdGg9JHtlbmNvZGVVUklDb21wb25lbnQocGF0aCl9YCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgZm9sZGVyQnJvd3Nlckxpc3QuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1lcnJvcik7XCI+RXJyb3I6ICR7ZXNjYXBlSHRtbChyZXN1bHQuZXJyb3IpfTwvZGl2PmA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY3VycmVudEJyb3dzZXJQYXRoID0gcmVzdWx0LnBhdGggfHwgJyc7XG4gICAgICBmb2xkZXJCcm93c2VyUGF0aC50ZXh0Q29udGVudCA9IGN1cnJlbnRCcm93c2VyUGF0aCB8fCAnU2VsZWN0IGEgZHJpdmUuLi4nO1xuXG4gICAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgICAvLyBBZGQgcGFyZW50IGZvbGRlciBuYXZpZ2F0aW9uXG4gICAgICBpZiAocmVzdWx0LnBhcmVudCAmJiByZXN1bHQucGFyZW50ICE9PSByZXN1bHQucGF0aCkge1xuICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiZm9sZGVyLWl0ZW1cIiBkYXRhLXBhdGg9XCIke2VzY2FwZUh0bWwocmVzdWx0LnBhcmVudCl9XCIgc3R5bGU9XCJwYWRkaW5nOiAxMnB4IDE2cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjdXJzb3I6IHBvaW50ZXI7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtO1wiPlx1MkIwNlx1RkUwRjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Li4gUGFyZW50IERpcmVjdG9yeTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGZvbGRlcnNcbiAgICAgIGlmIChyZXN1bHQuaXRlbXMubGVuZ3RoID09PSAwICYmICFyZXN1bHQucGFyZW50KSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gYnJvd3NlYWJsZSBkcml2ZXMgY29uZmlndXJlZC4gQ2hlY2sgeW91ciBkb2NrZXItY29tcG9zZS55bWwgdm9sdW1lIG1vdW50cy48L2Rpdj4nO1xuICAgICAgfSBlbHNlIGlmIChyZXN1bHQuaXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Tm8gc3ViZm9sZGVycyBmb3VuZDwvZGl2Pic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQuaXRlbXMuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICBjb25zdCBpY29uID0gaXRlbS50eXBlID09PSAnZHJpdmUnID8gJ1x1RDgzRFx1RENCRScgOiAnXHVEODNEXHVEQ0MxJztcbiAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gc2VsZWN0ZWRGb2xkZXJzLmluY2x1ZGVzKGl0ZW0ucGF0aCk7XG4gICAgICAgICAgY29uc3Qgc2VsZWN0ZWRTdHlsZSA9IGlzU2VsZWN0ZWQgPyAnYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLXN1Y2Nlc3MpIDIwJSwgdHJhbnNwYXJlbnQpOycgOiAnJztcbiAgICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiZm9sZGVyLWl0ZW1cIiBkYXRhLXBhdGg9XCIke2VzY2FwZUh0bWwoaXRlbS5wYXRoKX1cIiBzdHlsZT1cInBhZGRpbmc6IDEycHggMTZweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyAke3NlbGVjdGVkU3R5bGV9XCI+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4ycmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+JHtlc2NhcGVIdG1sKGl0ZW0ubmFtZSl9PC9zcGFuPlxuICAgICAgICAgICAgJHtpc1NlbGVjdGVkID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLXN1Y2Nlc3MpO1wiPlx1MjcxMzwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGZvbGRlckJyb3dzZXJMaXN0LmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIEFkZCBjbGljayBoYW5kbGVyc1xuICAgICAgZm9sZGVyQnJvd3Nlckxpc3QucXVlcnlTZWxlY3RvckFsbCgnLmZvbGRlci1pdGVtJykuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBsb2FkRm9sZGVyQ29udGVudHMoaXRlbS5kYXRhc2V0LnBhdGgpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgKCkgPT4ge1xuICAgICAgICAgIGl0ZW0uc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1jYXJkLWJnKSc7XG4gICAgICAgIH0pO1xuICAgICAgICBpdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbGVhdmUnLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkRm9sZGVycy5pbmNsdWRlcyhpdGVtLmRhdGFzZXQucGF0aCk7XG4gICAgICAgICAgaXRlbS5zdHlsZS5iYWNrZ3JvdW5kID0gaXNTZWxlY3RlZCA/ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tc3VjY2VzcykgMjAlLCB0cmFuc3BhcmVudCknIDogJyc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZm9sZGVyQnJvd3Nlckxpc3QuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1lcnJvcik7XCI+RmFpbGVkIHRvIGxvYWQ6ICR7ZXNjYXBlSHRtbChlcnJvci5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGVkRm9sZGVyc0Rpc3BsYXkoKSB7XG4gICAgaWYgKHNlbGVjdGVkRm9sZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIGZvbGRlckJyb3dzZXJTZWxlY3RlZC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb2xkZXJCcm93c2VyU2VsZWN0ZWQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgZm9sZGVyQnJvd3NlclNlbGVjdGVkTGlzdC5pbm5lckhUTUwgPSBzZWxlY3RlZEZvbGRlcnMubWFwKHBhdGggPT4gYFxuICAgICAgPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA2cHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLXN1Y2Nlc3MpOyBib3JkZXItcmFkaXVzOiA0cHg7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4O1wiPlxuICAgICAgICAke2VzY2FwZUh0bWwocGF0aCl9XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uY2xpY2s9XCJyZW1vdmVTZWxlY3RlZEZvbGRlcignJHtlc2NhcGVIdG1sKHBhdGgpfScpXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiBub25lOyBib3JkZXI6IG5vbmU7IGN1cnNvcjogcG9pbnRlcjsgY29sb3I6IHZhcigtLWVycm9yKTsgZm9udC1zaXplOiAxcmVtOyBwYWRkaW5nOiAwO1wiPlx1MDBENzwvYnV0dG9uPlxuICAgICAgPC9zcGFuPlxuICAgIGApLmpvaW4oJycpO1xuICB9XG5cbiAgd2luZG93LnJlbW92ZVNlbGVjdGVkRm9sZGVyID0gZnVuY3Rpb24ocGF0aCkge1xuICAgIHNlbGVjdGVkRm9sZGVycyA9IHNlbGVjdGVkRm9sZGVycy5maWx0ZXIocCA9PiBwICE9PSBwYXRoKTtcbiAgICB1cGRhdGVTZWxlY3RlZEZvbGRlcnNEaXNwbGF5KCk7XG4gICAgbG9hZEZvbGRlckNvbnRlbnRzKGN1cnJlbnRCcm93c2VyUGF0aCk7IC8vIFJlZnJlc2ggdG8gdXBkYXRlIGNoZWNrbWFya3NcbiAgfTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItc2VsZWN0LWN1cnJlbnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoY3VycmVudEJyb3dzZXJQYXRoICYmICFzZWxlY3RlZEZvbGRlcnMuaW5jbHVkZXMoY3VycmVudEJyb3dzZXJQYXRoKSkge1xuICAgICAgc2VsZWN0ZWRGb2xkZXJzLnB1c2goY3VycmVudEJyb3dzZXJQYXRoKTtcbiAgICAgIHVwZGF0ZVNlbGVjdGVkRm9sZGVyc0Rpc3BsYXkoKTtcbiAgICAgIGxvYWRGb2xkZXJDb250ZW50cyhjdXJyZW50QnJvd3NlclBhdGgpOyAvLyBSZWZyZXNoIHRvIHNob3cgY2hlY2ttYXJrXG4gICAgfVxuICB9KTtcblxuICB3aXJlTW9kYWwoZm9sZGVyQnJvd3Nlck1vZGFsLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZm9sZGVyLWJyb3dzZXItY2FuY2VsJykpO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmb2xkZXItYnJvd3Nlci1kb25lJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKHRhcmdldE1lZGlhSW5wdXQpIHtcbiAgICAgIHRhcmdldE1lZGlhSW5wdXQudmFsdWUgPSBzZWxlY3RlZEZvbGRlcnMuam9pbignLCAnKTtcbiAgICB9XG4gICAgZm9sZGVyQnJvd3Nlck1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgLy8gTG9hZCBjdXN0b20gYXBwcyBvbiBwYWdlIGxvYWRcbiAgbG9hZEN1c3RvbUFwcHMoKTtcbn0pKCk7XG47XG4vLyBSZWNpcGUgU3lzdGVtIFx1MjAxNCBtdWx0aS1jb250YWluZXIgc3RhY2sgZGVwbG95bWVudFxuKGZ1bmN0aW9uKCkge1xuICAvLyA9PT0gUkVDSVBFIERFUExPWSBXSVpBUkQgTU9EQUwgPT09XG4gIGluamVjdE1vZGFsKCdyZWNpcGUtZGVwbG95LW1vZGFsJywgYDxkaXYgaWQ9XCJyZWNpcGUtZGVwbG95LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA2MjBweDsgbWF4LXdpZHRoOiA3NDBweDtcIj5cbiAgICAgIDxoMyBpZD1cInJlY2lwZS1kZXBsb3ktdGl0bGVcIj5EZXBsb3kgUmVjaXBlPC9oMz5cblxuICAgICAgPCEtLSBTdGVwIGluZGljYXRvciAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcHNcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNHB4OyBtYXJnaW46IDE2cHggMCAyNHB4O1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVjaXBlLXN0ZXAgYWN0aXZlXCIgZGF0YS1zdGVwPVwiMVwiPjxzcGFuPjE8L3NwYW4+IENvbXBvbmVudHM8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY2lwZS1zdGVwXCIgZGF0YS1zdGVwPVwiMlwiPjxzcGFuPjI8L3NwYW4+IENvbmZpZ3VyYXRpb248L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJlY2lwZS1zdGVwXCIgZGF0YS1zdGVwPVwiM1wiPjxzcGFuPjM8L3NwYW4+IFJldmlldzwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVjaXBlLXN0ZXBcIiBkYXRhLXN0ZXA9XCI0XCI+PHNwYW4+NDwvc3Bhbj4gUHJvZ3Jlc3M8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgMTogQ29tcG9uZW50IFNlbGVjdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0xXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlNlbGVjdCBDb21wb25lbnRzOjwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtY29tcG9uZW50LWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogOHB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAyOiBTaGFyZWQgQ29uZmlndXJhdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0yXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiAxNnB4O1wiPlxuICAgICAgICAgIDwhLS0gU2hhcmVkIHZvbHVtZXMgLS0+XG4gICAgICAgICAgPGRpdiBpZD1cInJlY2lwZS12b2x1bWVzLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYWNjZW50LXNtXCI+U2hhcmVkIFZvbHVtZXM6PC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtdm9sdW1lLWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogMTBweDsgbWFyZ2luLXRvcDogOHB4O1wiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBUaW1lem9uZSAtLT5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5UaW1lem9uZTo8L2xhYmVsPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJyZWNpcGUtdGltZXpvbmVcIiB2YWx1ZT1cIlVUQ1wiIHBsYWNlaG9sZGVyPVwiZS5nLiBBbWVyaWNhL05ld19Zb3JrXCJcbiAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7XCIgLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGFyZ2V0IElQIC0tPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWFjY2VudC1zbVwiPlRhcmdldCBJUCBBZGRyZXNzOjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInJlY2lwZS1pcFwiIHZhbHVlPVwiaG9zdC5kb2NrZXIuaW50ZXJuYWxcIiBwbGFjZWhvbGRlcj1cImxvY2FsaG9zdCBvciBJUFwiXG4gICAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+SVAgd2hlcmUgY29udGFpbmVycyBleHBvc2UgcG9ydHM8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDwhLS0gVGFpbHNjYWxlIC0tPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJyZWNpcGUtdGFpbHNjYWxlXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPlJlc3RyaWN0IHRvIFRhaWxzY2FsZSBuZXR3b3JrIG9ubHk8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwIDM6IFJldmlldyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJyZWNpcGUtc3RlcC0zXCIgY2xhc3M9XCJyZWNpcGUtc3RlcC1wYW5lbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IGlkPVwicmVjaXBlLXJldmlldy1jb250ZW50XCIgc3R5bGU9XCJmb250LXNpemU6IDAuOXJlbTsgbGluZS1oZWlnaHQ6IDEuNztcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgNDogUHJvZ3Jlc3MgLS0+XG4gICAgICA8ZGl2IGlkPVwicmVjaXBlLXN0ZXAtNFwiIGNsYXNzPVwicmVjaXBlLXN0ZXAtcGFuZWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cInJlY2lwZS1wcm9ncmVzcy1saXN0XCIgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBnYXA6IDhweDtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInJlY2lwZS1kZXBsb3ktcmVzdWx0XCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4OyBkaXNwbGF5Om5vbmU7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMjBweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlY2lwZS1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInJlY2lwZS1wcmV2XCIgY2xhc3M9XCJidG4tYWNjZW50XCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+QmFjazwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwicmVjaXBlLW5leHRcIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj5OZXh0PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgLy8gPT09IFNUQVRFID09PVxuICBsZXQgcmVjaXBlVGVtcGxhdGVzID0gbnVsbDtcbiAgbGV0IHJlY2lwZUNhdGVnb3JpZXMgPSBudWxsO1xuICBsZXQgY3VycmVudFJlY2lwZSA9IG51bGw7XG4gIGxldCBjdXJyZW50U3RlcCA9IDE7XG4gIGxldCBpc1ByZW1pdW0gPSBmYWxzZTtcblxuICBjb25zdCBkZXBsb3lNb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtZGVwbG95LW1vZGFsJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtY2FuY2VsJyk7XG4gIGNvbnN0IHByZXZCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXByZXYnKTtcbiAgY29uc3QgbmV4dEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtbmV4dCcpO1xuXG4gIHdpcmVNb2RhbChkZXBsb3lNb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyA9PT0gRkVUQ0ggUkVDSVBFIFRFTVBMQVRFUyA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hSZWNpcGVUZW1wbGF0ZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9yZWNpcGVzL3RlbXBsYXRlcycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICByZWNpcGVUZW1wbGF0ZXMgPSBkYXRhLnRlbXBsYXRlcztcbiAgICAgICAgcmVjaXBlQ2F0ZWdvcmllcyA9IGRhdGEuY2F0ZWdvcmllcztcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICAvLyBQcmVtaXVtIHJlcXVpcmVkIFx1MjAxNCB0ZW1wbGF0ZXMgQVBJIGdhdGVkXG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICBpc1ByZW1pdW0gPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignRmFpbGVkIHRvIGZldGNoIHJlY2lwZSB0ZW1wbGF0ZXM6JywgZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gPT09IENIRUNLIFBSRU1JVU0gPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGNoZWNrUmVjaXBlUHJlbWl1bSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xpY2Vuc2UvZmVhdHVyZS9yZWNpcGVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpc1ByZW1pdW0gPSBkYXRhLmF2YWlsYWJsZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIGlzUHJlbWl1bSA9IGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gaXNQcmVtaXVtO1xuICB9XG5cbiAgLy8gPT09IFJFTkRFUiBSRUNJUEUgQ0FSRFMgSU5UTyBBUFAgU0VMRUNUT1IgPT09XG4gIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBhcHAgc2VsZWN0b3IgdG8gaW5qZWN0IHJlY2lwZSBjYXJkc1xuICB3aW5kb3cucmVuZGVyUmVjaXBlQ2FyZHMgPSBhc3luYyBmdW5jdGlvbihncmlkKSB7XG4gICAgYXdhaXQgY2hlY2tSZWNpcGVQcmVtaXVtKCk7XG5cbiAgICAvLyBCdWlsZCByZWNpcGUgZGF0YSBcdTIwMTQgd2UgY2FuIHNob3cgY2FyZCBtZXRhZGF0YSBldmVuIHdpdGhvdXQgcHJlbWl1bVxuICAgIC8vIChjYXJkcyBqdXN0IHNob3cgYSBsb2NrIGFuZCBwcm9tcHQgdG8gdXBncmFkZSlcbiAgICBsZXQgcmVjaXBlcztcbiAgICBpZiAoaXNQcmVtaXVtICYmIHJlY2lwZVRlbXBsYXRlcykge1xuICAgICAgcmVjaXBlcyA9IHJlY2lwZVRlbXBsYXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gU2hvdyBoYXJkY29kZWQgcHJldmlldyBjYXJkcyB3aGVuIG5vdCBwcmVtaXVtXG4gICAgICByZWNpcGVzID0gZ2V0UHJldmlld1JlY2lwZXMoKTtcbiAgICB9XG5cbiAgICBpZiAoIXJlY2lwZXMgfHwgcmVjaXBlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIC8vIENhdGVnb3J5IGhlYWRlclxuICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGhlYWRlci5jbGFzc05hbWUgPSAnYXBwLWNhdGVnb3J5LWhlYWRlcic7XG4gICAgaGVhZGVyLmlubmVySFRNTCA9IGBcXHVEODNFXFx1RERFQSBSZWNpcGVzYDtcbiAgICBoZWFkZXIuc3R5bGUuYm9yZGVyQm90dG9tQ29sb3IgPSAnIzhlNDRhZCc7XG4gICAgZ3JpZC5hcHBlbmRDaGlsZChoZWFkZXIpO1xuXG4gICAgY29uc3QgcmVjaXBlTGlzdCA9IEFycmF5LmlzQXJyYXkocmVjaXBlcykgPyByZWNpcGVzIDogT2JqZWN0LnZhbHVlcyhyZWNpcGVzKTtcbiAgICByZWNpcGVMaXN0LnNvcnQoKGEsIGIpID0+IChiLnBvcHVsYXJpdHkgfHwgMCkgLSAoYS5wb3B1bGFyaXR5IHx8IDApKTtcblxuICAgIGZvciAoY29uc3QgcmVjaXBlIG9mIHJlY2lwZUxpc3QpIHtcbiAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgb3B0aW9uLmNsYXNzTmFtZSA9ICdhcHAtb3B0aW9uJztcbiAgICAgIG9wdGlvbi5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG5cbiAgICAgIGNvbnN0IGNvbXBvbmVudEJhZGdlID0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNjVyZW07IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLXRvcDogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDE0Miw2OCwxNzMsMC4yKTsgY29sb3I6ICNhODU1Zjc7XCI+JHtyZWNpcGUuY29tcG9uZW50Q291bnQgfHwgcmVjaXBlLmNvbXBvbmVudHM/Lmxlbmd0aCB8fCAnPyd9IGFwcHM8L2Rpdj5gO1xuXG4gICAgICBjb25zdCBsb2NrT3ZlcmxheSA9ICFpc1ByZW1pdW0gPyBgPGRpdiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA2cHg7IHJpZ2h0OiA2cHg7IGZvbnQtc2l6ZTogMC42NXJlbTsgcGFkZGluZzogMnB4IDhweDsgYm9yZGVyLXJhZGl1czogMTBweDsgYmFja2dyb3VuZDogcmdiYSgyNDEsMTk2LDE1LDAuMik7IGNvbG9yOiAjZjFjNDBmOyBmb250LXdlaWdodDogNjAwO1wiPlBSRU1JVU08L2Rpdj5gIDogJyc7XG5cbiAgICAgIG9wdGlvbi5pbm5lckhUTUwgPSBgXG4gICAgICAgICR7bG9ja092ZXJsYXl9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtb3B0aW9uLWljb25cIj4ke2VzY2FwZUh0bWwocmVjaXBlLmljb24gfHwgJ1xcdUQ4M0VcXHVEREVBJyl9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcHAtb3B0aW9uLW5hbWVcIj4ke2VzY2FwZUh0bWwocmVjaXBlLm5hbWUpfTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYXBwLW9wdGlvbi1kZXNjXCI+JHtlc2NhcGVIdG1sKHJlY2lwZS5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG4gICAgICAgICR7Y29tcG9uZW50QmFkZ2V9XG4gICAgICBgO1xuXG4gICAgICBvcHRpb24ub25jbGljayA9ICgpID0+IHtcbiAgICAgICAgaWYgKCFpc1ByZW1pdW0pIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdSZWNpcGVzIHJlcXVpcmUgYSBEYXNoQ2FkZHkgUHJlbWl1bSBsaWNlbnNlLiBDbGljayB0aGUgTGljZW5zZSBidXR0b24gdG8gYWN0aXZhdGUuJywgJ3dhcm5pbmcnLCA1MDAwKTtcbiAgICAgICAgICBpZiAod2luZG93Lm9wZW5MaWNlbnNlTW9kYWwpIHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG9wZW5SZWNpcGVEZXBsb3lXaXphcmQocmVjaXBlKTtcbiAgICAgIH07XG5cbiAgICAgIGdyaWQuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICB9XG4gIH07XG5cbiAgZnVuY3Rpb24gZ2V0UHJldmlld1JlY2lwZXMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgaWQ6ICdodHBjLXN1aXRlJywgbmFtZTogJ0hUUEMgU3VpdGUnLCBpY29uOiAnXFx1RDgzQ1xcdURGQUMnLCBkZXNjcmlwdGlvbjogJ0NvbXBsZXRlIG1lZGlhIGF1dG9tYXRpb246IGZpbmQsIGRvd25sb2FkLCBvcmdhbml6ZSwgYW5kIHN0cmVhbScsIGNvbXBvbmVudENvdW50OiA2LCBwb3B1bGFyaXR5OiA5OCB9LFxuICAgICAgeyBpZDogJ25leHRjbG91ZC1jb21wbGV0ZScsIG5hbWU6ICdOZXh0Y2xvdWQgQ29tcGxldGUnLCBpY29uOiAnXFx1MjYwMVxcdUZFMEYnLCBkZXNjcmlwdGlvbjogJ0Z1bGwgcHJvZHVjdGl2aXR5IHN1aXRlOiBjbG91ZCBzdG9yYWdlLCBvZmZpY2UgZWRpdGluZywgYW5kIGNvbGxhYm9yYXRpb24nLCBjb21wb25lbnRDb3VudDogNCwgcG9wdWxhcml0eTogOTAgfSxcbiAgICAgIHsgaWQ6ICdzbWFydC1ob21lJywgbmFtZTogJ1NtYXJ0IEhvbWUgSHViJywgaWNvbjogJ1xcdUQ4M0NcXHVERkUwJywgZGVzY3JpcHRpb246ICdIb21lIGF1dG9tYXRpb246IGNvbnRyb2wsIGF1dG9tYXRlLCBhbmQgbW9uaXRvciBJb1QgZGV2aWNlcycsIGNvbXBvbmVudENvdW50OiA0LCBwb3B1bGFyaXR5OiA4OCB9LFxuICAgICAgeyBpZDogJ2Rldi1lbnZpcm9ubWVudCcsIG5hbWU6ICdEZXYgRW52aXJvbm1lbnQnLCBpY29uOiAnXFx1RDgzRFxcdURDQkInLCBkZXNjcmlwdGlvbjogJ1NlbGYtaG9zdGVkIGRldmVsb3BtZW50IHdvcmtmbG93OiBHaXQsIENJL0NELCBJREUsIGFuZCBkYXRhYmFzZScsIGNvbXBvbmVudENvdW50OiA0LCBwb3B1bGFyaXR5OiA4MiB9XG4gICAgXTtcbiAgfVxuXG4gIC8vID09PSBSRUNJUEUgREVQTE9ZIFdJWkFSRCA9PT1cbiAgZnVuY3Rpb24gb3BlblJlY2lwZURlcGxveVdpemFyZChyZWNpcGUpIHtcbiAgICBjdXJyZW50UmVjaXBlID0gcmVjaXBlO1xuICAgIGN1cnJlbnRTdGVwID0gMTtcblxuICAgIC8vIENsb3NlIGFwcCBzZWxlY3RvclxuICAgIGNvbnN0IGFwcFNlbGVjdG9yTW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXBwLXNlbGVjdG9yLW1vZGFsJyk7XG4gICAgaWYgKGFwcFNlbGVjdG9yTW9kYWwpIGFwcFNlbGVjdG9yTW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1kZXBsb3ktdGl0bGUnKS50ZXh0Q29udGVudCA9IGBEZXBsb3kgJHtyZWNpcGUubmFtZX1gO1xuXG4gICAgLy8gUmVzZXQgc3RlcHNcbiAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICByZW5kZXJTdGVwMSgpO1xuXG4gICAgZGVwbG95TW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgZnVuY3Rpb24gdXBkYXRlU3RlcFVJKCkge1xuICAgIC8vIFN0ZXAgaW5kaWNhdG9yc1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNyZWNpcGUtc3RlcHMgLnJlY2lwZS1zdGVwJykuZm9yRWFjaChlbCA9PiB7XG4gICAgICBjb25zdCBzdGVwID0gcGFyc2VJbnQoZWwuZGF0YXNldC5zdGVwKTtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIHN0ZXAgPT09IGN1cnJlbnRTdGVwKTtcbiAgICAgIGVsLmNsYXNzTGlzdC50b2dnbGUoJ2NvbXBsZXRlZCcsIHN0ZXAgPCBjdXJyZW50U3RlcCk7XG4gICAgfSk7XG5cbiAgICAvLyBTdGVwIHBhbmVsc1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IDQ7IGkrKykge1xuICAgICAgY29uc3QgcGFuZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgcmVjaXBlLXN0ZXAtJHtpfWApO1xuICAgICAgaWYgKHBhbmVsKSBwYW5lbC5zdHlsZS5kaXNwbGF5ID0gaSA9PT0gY3VycmVudFN0ZXAgPyAnJyA6ICdub25lJztcbiAgICB9XG5cbiAgICAvLyBOYXZpZ2F0aW9uIGJ1dHRvbnNcbiAgICBwcmV2QnRuLnN0eWxlLmRpc3BsYXkgPSBjdXJyZW50U3RlcCA+IDEgJiYgY3VycmVudFN0ZXAgPCA0ID8gJycgOiAnbm9uZSc7XG4gICAgaWYgKGN1cnJlbnRTdGVwID09PSA0KSB7XG4gICAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBjYW5jZWxCdG4udGV4dENvbnRlbnQgPSAnQ2xvc2UnO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudFN0ZXAgPT09IDMpIHtcbiAgICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSAnXFx1RDgzRFxcdURFODAgRGVwbG95JztcbiAgICAgIG5leHRCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgY2FuY2VsQnRuLnRleHRDb250ZW50ID0gJ0NhbmNlbCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHRCdG4udGV4dENvbnRlbnQgPSAnTmV4dCc7XG4gICAgICBuZXh0QnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIGNhbmNlbEJ0bi50ZXh0Q29udGVudCA9ICdDYW5jZWwnO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgMTogQ29tcG9uZW50IHNlbGVjdGlvblxuICBmdW5jdGlvbiByZW5kZXJTdGVwMSgpIHtcbiAgICBjb25zdCBsaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1jb21wb25lbnQtbGlzdCcpO1xuICAgIGxpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBjb25zdCBjb21wb25lbnRzID0gY3VycmVudFJlY2lwZS5jb21wb25lbnRzIHx8IFtdO1xuICAgIGZvciAoY29uc3QgY29tcCBvZiBjb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iZyk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7JztcblxuICAgICAgY29uc3QgaXNSZXF1aXJlZCA9IGNvbXAucmVxdWlyZWQ7XG4gICAgICBjb25zdCBpc0ludGVybmFsID0gY29tcC5pbnRlcm5hbDtcblxuICAgICAgZWwuaW5uZXJIVE1MID0gYFxuICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgJHtpc1JlcXVpcmVkID8gJ2NoZWNrZWQgZGlzYWJsZWQnIDogJ2NoZWNrZWQnfSBkYXRhLWNvbXBvbmVudC1pZD1cIiR7Y29tcC5pZH1cIlxuICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDE4cHg7IGhlaWdodDogMThweDsgYWNjZW50LWNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiIC8+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuOXJlbTtcIj4ke2VzY2FwZUh0bWwoY29tcC5yb2xlIHx8IGNvbXAuaWQpfTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgICAgICAke2NvbXAudGVtcGxhdGVSZWYgPyBlc2NhcGVIdG1sKGNvbXAudGVtcGxhdGVSZWYpIDogJ0J1aWx0LWluJ31cbiAgICAgICAgICAgICR7aXNSZXF1aXJlZCA/ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPlJlcXVpcmVkPC9zcGFuPicgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPk9wdGlvbmFsPC9zcGFuPid9XG4gICAgICAgICAgICAke2lzSW50ZXJuYWwgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tbGVmdDogNnB4O1wiPihJbnRlcm5hbCk8L3NwYW4+JyA6ICcnfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICR7Y29tcC5ub3RlID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS13YXJuLWZnKTsgbWFyZ2luLXRvcDogNHB4O1wiPlxcdTI2QTAgJHtlc2NhcGVIdG1sKGNvbXAubm90ZSl9PC9kaXY+YCA6ICcnfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgICBsaXN0LmFwcGVuZENoaWxkKGVsKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGVwIDI6IFNoYXJlZCBjb25maWd1cmF0aW9uXG4gIGZ1bmN0aW9uIHJlbmRlclN0ZXAyKCkge1xuICAgIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXZvbHVtZXMtc2VjdGlvbicpO1xuICAgIGNvbnN0IHZvbHVtZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXZvbHVtZS1saXN0Jyk7XG5cbiAgICBjb25zdCBzaGFyZWRWb2x1bWVzID0gY3VycmVudFJlY2lwZS5zaGFyZWRWb2x1bWVzO1xuICAgIGlmIChzaGFyZWRWb2x1bWVzICYmIE9iamVjdC5rZXlzKHNoYXJlZFZvbHVtZXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgdm9sdW1lTGlzdC5pbm5lckhUTUwgPSAnJztcblxuICAgICAgZm9yIChjb25zdCBba2V5LCB2b2xdIG9mIE9iamVjdC5lbnRyaWVzKHNoYXJlZFZvbHVtZXMpKSB7XG4gICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGVsLnN0eWxlLmNzc1RleHQgPSAnZGlzcGxheTogZ3JpZDsgZ2FwOiA0cHg7JztcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gYFxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4ke2VzY2FwZUh0bWwodm9sLmxhYmVsIHx8IGtleSl9PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBkYXRhLXZvbHVtZS1rZXk9XCIke2tleX1cIiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbCh2b2wuZGVmYXVsdFBhdGggfHwgJycpfVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIiR7ZXNjYXBlSHRtbCh2b2wuZGVmYXVsdFBhdGggfHwgJy9wYXRoJyl9XCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuODVyZW07XCIgLz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1oaW50LXNtXCI+JHtlc2NhcGVIdG1sKHZvbC5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG4gICAgICAgIGA7XG4gICAgICAgIHZvbHVtZUxpc3QuYXBwZW5kQ2hpbGQoZWwpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RlcCAzOiBSZXZpZXdcbiAgZnVuY3Rpb24gcmVuZGVyU3RlcDMoKSB7XG4gICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtcmV2aWV3LWNvbnRlbnQnKTtcbiAgICBjb25zdCBzZWxlY3RlZENvbXBvbmVudHMgPSBnZXRTZWxlY3RlZENvbXBvbmVudHMoKTtcblxuICAgIGNvbnN0IHZvbHVtZUlucHV0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNyZWNpcGUtdm9sdW1lLWxpc3QgaW5wdXRbZGF0YS12b2x1bWUta2V5XScpO1xuICAgIGNvbnN0IHZvbHVtZXMgPSB7fTtcbiAgICB2b2x1bWVJbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICB2b2x1bWVzW2lucHV0LmRhdGFzZXQudm9sdW1lS2V5XSA9IGlucHV0LnZhbHVlO1xuICAgIH0pO1xuXG4gICAgY29uc3QgdHogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXRpbWV6b25lJykudmFsdWUgfHwgJ1VUQyc7XG4gICAgY29uc3QgaXAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLWlwJykudmFsdWUgfHwgJ2hvc3QuZG9ja2VyLmludGVybmFsJztcbiAgICBjb25zdCB0YWlsc2NhbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLXRhaWxzY2FsZScpLmNoZWNrZWQ7XG5cbiAgICBjb250ZW50LmlubmVySFRNTCA9IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07IG1hcmdpbi1ib3R0b206IDEycHg7XCI+JHtlc2NhcGVIdG1sKGN1cnJlbnRSZWNpcGUubmFtZSl9PC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj4ke2VzY2FwZUh0bWwoY3VycmVudFJlY2lwZS5kZXNjcmlwdGlvbiB8fCAnJyl9PC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8c3Ryb25nPkNvbXBvbmVudHMgKCR7c2VsZWN0ZWRDb21wb25lbnRzLmxlbmd0aH0pOjwvc3Ryb25nPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ2FwOiA0cHg7IG1hcmdpbi10b3A6IDZweDtcIj5cbiAgICAgICAgICAke3NlbGVjdGVkQ29tcG9uZW50cy5tYXAoYyA9PiBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDRweCAwOyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICBcXHUyMDIyIDxzdHJvbmc+JHtlc2NhcGVIdG1sKGMucm9sZSB8fCBjLmlkKX08L3N0cm9uZz4gJHtjLmludGVybmFsID8gJzxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpXCI+KGludGVybmFsKTwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9kaXY+YCkuam9pbignJyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgICR7T2JqZWN0LmtleXModm9sdW1lcykubGVuZ3RoID4gMCA/IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgICAgPHN0cm9uZz5Wb2x1bWVzOjwvc3Ryb25nPlxuICAgICAgICAke09iamVjdC5lbnRyaWVzKHZvbHVtZXMpLm1hcCgoW2ssIHZdKSA9PiBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2t9OiAke2VzY2FwZUh0bWwodil9PC9kaXY+YCkuam9pbignJyl9XG4gICAgICA8L2Rpdj5gIDogJyd9XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+XG4gICAgICAgIFRpbWV6b25lOiAke2VzY2FwZUh0bWwodHopfSAmYnVsbDsgSVA6ICR7ZXNjYXBlSHRtbChpcCl9ICR7dGFpbHNjYWxlID8gJyZidWxsOyBUYWlsc2NhbGUgb25seScgOiAnJ31cbiAgICAgIDwvZGl2PlxuXG4gICAgICAke2N1cnJlbnRSZWNpcGUubmV0d29yayA/IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+RG9ja2VyIG5ldHdvcms6IDxjb2RlPiR7ZXNjYXBlSHRtbChjdXJyZW50UmVjaXBlLm5ldHdvcmsubmFtZSl9PC9jb2RlPjwvZGl2PmAgOiAnJ31cbiAgICBgO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRDb21wb25lbnRzKCkge1xuICAgIGNvbnN0IGNoZWNrYm94ZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVjaXBlLWNvbXBvbmVudC1saXN0IGlucHV0W2RhdGEtY29tcG9uZW50LWlkXScpO1xuICAgIGNvbnN0IHNlbGVjdGVkSWRzID0gbmV3IFNldCgpO1xuICAgIGNoZWNrYm94ZXMuZm9yRWFjaChjYiA9PiB7XG4gICAgICBpZiAoY2IuY2hlY2tlZCkgc2VsZWN0ZWRJZHMuYWRkKGNiLmRhdGFzZXQuY29tcG9uZW50SWQpO1xuICAgIH0pO1xuXG4gICAgLy8gQWx3YXlzIGluY2x1ZGUgcmVxdWlyZWQgY29tcG9uZW50c1xuICAgIGNvbnN0IGNvbXBvbmVudHMgPSBjdXJyZW50UmVjaXBlLmNvbXBvbmVudHMgfHwgW107XG4gICAgY29tcG9uZW50cy5maWx0ZXIoYyA9PiBjLnJlcXVpcmVkKS5mb3JFYWNoKGMgPT4gc2VsZWN0ZWRJZHMuYWRkKGMuaWQpKTtcblxuICAgIHJldHVybiBjb21wb25lbnRzLmZpbHRlcihjID0+IHNlbGVjdGVkSWRzLmhhcyhjLmlkKSk7XG4gIH1cblxuICAvLyBTdGVwIDQ6IERlcGxveVxuICBhc3luYyBmdW5jdGlvbiBleGVjdXRlRGVwbG95KCkge1xuICAgIGNvbnN0IHByb2dyZXNzTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtcHJvZ3Jlc3MtbGlzdCcpO1xuICAgIGNvbnN0IHJlc3VsdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS1kZXBsb3ktcmVzdWx0Jyk7XG4gICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBwcm9ncmVzc0xpc3QuaW5uZXJIVE1MID0gJyc7XG5cbiAgICBjb25zdCBzZWxlY3RlZENvbXBvbmVudHMgPSBnZXRTZWxlY3RlZENvbXBvbmVudHMoKTtcblxuICAgIC8vIFNob3cgcHJvZ3Jlc3MgaXRlbXNcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2Ygc2VsZWN0ZWRDb21wb25lbnRzKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgZWwuaWQgPSBgcmVjaXBlLXByb2dyZXNzLSR7Y29tcC5pZH1gO1xuICAgICAgZWwuc3R5bGUuY3NzVGV4dCA9ICdkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IHBhZGRpbmc6IDEwcHggMTJweDsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtOyc7XG4gICAgICBlbC5pbm5lckhUTUwgPSBgXG4gICAgICAgIDxzcGFuIGNsYXNzPVwicmVjaXBlLXByb2dyZXNzLWljb25cIiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPlxcdTIzRjM8L3NwYW4+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDoxOyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChjb21wLnJvbGUgfHwgY29tcC5pZCl9PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInJlY2lwZS1wcm9ncmVzcy1zdGF0dXNcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UXVldWVkPC9zcGFuPlxuICAgICAgYDtcbiAgICAgIHByb2dyZXNzTGlzdC5hcHBlbmRDaGlsZChlbCk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCBjb25maWdcbiAgICBjb25zdCB2b2x1bWVJbnB1dHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcjcmVjaXBlLXZvbHVtZS1saXN0IGlucHV0W2RhdGEtdm9sdW1lLWtleV0nKTtcbiAgICBjb25zdCB2b2x1bWVzID0ge307XG4gICAgdm9sdW1lSW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgdm9sdW1lc1tpbnB1dC5kYXRhc2V0LnZvbHVtZUtleV0gPSBpbnB1dC52YWx1ZTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHNlbGVjdGVkQ29tcG9uZW50czogc2VsZWN0ZWRDb21wb25lbnRzLm1hcChjID0+IGMuaWQpLFxuICAgICAgc2hhcmVkQ29uZmlnOiB7XG4gICAgICAgIGlwOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmVjaXBlLWlwJykudmFsdWUgfHwgJ2hvc3QuZG9ja2VyLmludGVybmFsJyxcbiAgICAgICAgdGltZXpvbmU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZWNpcGUtdGltZXpvbmUnKS52YWx1ZSB8fCAnVVRDJyxcbiAgICAgICAgdGFpbHNjYWxlT25seTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlY2lwZS10YWlsc2NhbGUnKS5jaGVja2VkLFxuICAgICAgICB2b2x1bWVzXG4gICAgICB9LFxuICAgICAgY29tcG9uZW50T3ZlcnJpZGVzOiB7fVxuICAgIH07XG5cbiAgICAvLyBNYXJrIGFsbCBhcyBkZXBsb3lpbmdcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2Ygc2VsZWN0ZWRDb21wb25lbnRzKSB7XG4gICAgICB1cGRhdGVQcm9ncmVzc0l0ZW0oY29tcC5pZCwgJ2RlcGxveWluZycsICdEZXBsb3lpbmcuLi4nKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3JlY2lwZXMvZGVwbG95Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVjaXBlSWQ6IGN1cnJlbnRSZWNpcGUuaWQsIGNvbmZpZyB9KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcC5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gTWFyayBkZXBsb3llZCBjb21wb25lbnRzXG4gICAgICAgIGZvciAoY29uc3QgZGVwbG95ZWQgb2YgKGRhdGEuZGVwbG95ZWQgfHwgW10pKSB7XG4gICAgICAgICAgdXBkYXRlUHJvZ3Jlc3NJdGVtKGRlcGxveWVkLmlkLCAnc3VjY2VzcycsIGRlcGxveWVkLnVybCA/IGBSdW5uaW5nIFxcdTIxOTIgJHtkZXBsb3llZC51cmx9YCA6ICdSdW5uaW5nJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWFyayBlcnJvcnNcbiAgICAgICAgZm9yIChjb25zdCBlcnIgb2YgKGRhdGEuZXJyb3JzIHx8IFtdKSkge1xuICAgICAgICAgIHVwZGF0ZVByb2dyZXNzSXRlbShlcnIuY29tcG9uZW50SWQsICdlcnJvcicsIGVyci5lcnJvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHRFbC5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIHJlc3VsdEVsLmlubmVySFRNTCA9IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTRweDsgYm9yZGVyLXJhZGl1czogOHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDQ2LDIwNCwxMTMsMC4xKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSg0NiwyMDQsMTEzLDAuMyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLW9rLWZnKTsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPiR7ZXNjYXBlSHRtbChkYXRhLm1lc3NhZ2UgfHwgJ0RlcGxveWVkIScpfTwvZGl2PlxuICAgICAgICAgICAgJHtkYXRhLnNldHVwSW5zdHJ1Y3Rpb25zID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogOHB4O1wiPlxuICAgICAgICAgICAgICA8c3Ryb25nPlNldHVwIHRpcHM6PC9zdHJvbmc+XG4gICAgICAgICAgICAgIDx1bCBzdHlsZT1cIm1hcmdpbjogNHB4IDAgMCAxNnB4OyBwYWRkaW5nOiAwO1wiPiR7ZGF0YS5zZXR1cEluc3RydWN0aW9ucy5tYXAocyA9PiBgPGxpPiR7ZXNjYXBlSHRtbChzKX08L2xpPmApLmpvaW4oJycpfTwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG5cbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgJHtjdXJyZW50UmVjaXBlLm5hbWV9IHJlY2lwZSBkZXBsb3llZCBzdWNjZXNzZnVsbHkhYCwgJ3N1Y2Nlc3MnLCA1MDAwKTtcblxuICAgICAgICAvLyBSZWZyZXNoIGRhc2hib2FyZFxuICAgICAgICBpZiAod2luZG93LmxvYWRTZXJ2aWNlcykgd2luZG93LmxvYWRTZXJ2aWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICByZXN1bHRFbC5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDE0cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogcmdiYSgyMzEsNzYsNjAsMC4xKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyMzEsNzYsNjAsMC4zKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XG4gICAgICAgICAgPHN0cm9uZz5EZXBsb3ltZW50IGZhaWxlZDo8L3N0cm9uZz4gJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InKX1cbiAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVjaXBlIGRlcGxveW1lbnQgZmFpbGVkOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJywgNTAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVzdWx0RWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgcmVzdWx0RWwuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNHB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHJnYmEoMjMxLDc2LDYwLDAuMSk7IGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMjMxLDc2LDYwLDAuMyk7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPlxuICAgICAgICA8c3Ryb25nPk5ldHdvcmsgZXJyb3I6PC9zdHJvbmc+ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfVxuICAgICAgPC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVQcm9ncmVzc0l0ZW0oY29tcG9uZW50SWQsIHN0YXR1cywgdGV4dCkge1xuICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYHJlY2lwZS1wcm9ncmVzcy0ke2NvbXBvbmVudElkfWApO1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBpY29uID0gZWwucXVlcnlTZWxlY3RvcignLnJlY2lwZS1wcm9ncmVzcy1pY29uJyk7XG4gICAgY29uc3Qgc3RhdHVzRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCcucmVjaXBlLXByb2dyZXNzLXN0YXR1cycpO1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gJ2RlcGxveWluZycpIHtcbiAgICAgIGljb24udGV4dENvbnRlbnQgPSAnXFx1MjNGMyc7XG4gICAgICBzdGF0dXNFbC5zdHlsZS5jb2xvciA9ICd2YXIoLS1hY2NlbnQpJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ3N1Y2Nlc3MnKSB7XG4gICAgICBpY29uLnRleHRDb250ZW50ID0gJ1xcdTI3MDUnO1xuICAgICAgc3RhdHVzRWwuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcpJztcbiAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ2Vycm9yJykge1xuICAgICAgaWNvbi50ZXh0Q29udGVudCA9ICdcXHUyNzRDJztcbiAgICAgIHN0YXR1c0VsLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgIH1cbiAgICBzdGF0dXNFbC50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cblxuICAvLyA9PT0gU1RFUCBOQVZJR0FUSU9OID09PVxuICBuZXh0QnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMykge1xuICAgICAgY3VycmVudFN0ZXAgPSA0O1xuICAgICAgdXBkYXRlU3RlcFVJKCk7XG4gICAgICBleGVjdXRlRGVwbG95KCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChjdXJyZW50U3RlcCA8IDMpIHtcbiAgICAgIGN1cnJlbnRTdGVwKys7XG4gICAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMikgcmVuZGVyU3RlcDIoKTtcbiAgICAgIGlmIChjdXJyZW50U3RlcCA9PT0gMykgcmVuZGVyU3RlcDMoKTtcbiAgICB9XG4gIH0pO1xuXG4gIHByZXZCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnRTdGVwID4gMSAmJiBjdXJyZW50U3RlcCA8IDQpIHtcbiAgICAgIGN1cnJlbnRTdGVwLS07XG4gICAgICB1cGRhdGVTdGVwVUkoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PSBSRUNJUEUgQ0FSRCBHUk9VUElORyBPTiBEQVNIQk9BUkQgPT09XG4gIC8vIEFmdGVyIGRhc2hib2FyZCBsb2FkcywgZ3JvdXAgY2FyZHMgdGhhdCBzaGFyZSBhIHJlY2lwZUlkXG4gIHdpbmRvdy5ncm91cFJlY2lwZUNhcmRzID0gZnVuY3Rpb24oKSB7XG4gICAgY29uc3QgY2FyZHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VydmljZS1jYXJkW2RhdGEtcmVjaXBlLWlkXScpO1xuICAgIGlmIChjYXJkcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGdyb3VwcyA9IHt9O1xuICAgIGNhcmRzLmZvckVhY2goY2FyZCA9PiB7XG4gICAgICBjb25zdCByZWNpcGVJZCA9IGNhcmQuZGF0YXNldC5yZWNpcGVJZDtcbiAgICAgIGlmICghZ3JvdXBzW3JlY2lwZUlkXSkgZ3JvdXBzW3JlY2lwZUlkXSA9IFtdO1xuICAgICAgZ3JvdXBzW3JlY2lwZUlkXS5wdXNoKGNhcmQpO1xuICAgIH0pO1xuXG4gICAgZm9yIChjb25zdCBbcmVjaXBlSWQsIGdyb3VwQ2FyZHNdIG9mIE9iamVjdC5lbnRyaWVzKGdyb3VwcykpIHtcbiAgICAgIGlmIChncm91cENhcmRzLmxlbmd0aCA8IDIpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBBcHBseSBzdWJ0bGUgdmlzdWFsIGdyb3VwaW5nXG4gICAgICBncm91cENhcmRzLmZvckVhY2goKGNhcmQsIGkpID0+IHtcbiAgICAgICAgY2FyZC5zdHlsZS5ib3JkZXJMZWZ0ID0gJzNweCBzb2xpZCByZ2JhKDE0Miw2OCwxNzMsMC41KSc7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgLy8gQWRkIGEgcmVjaXBlIGxhYmVsIHRvIHRoZSBmaXJzdCBjYXJkXG4gICAgICAgICAgbGV0IGxhYmVsID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcucmVjaXBlLWdyb3VwLWxhYmVsJyk7XG4gICAgICAgICAgaWYgKCFsYWJlbCkge1xuICAgICAgICAgICAgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdyZWNpcGUtZ3JvdXAtbGFiZWwnO1xuICAgICAgICAgICAgbGFiZWwuc3R5bGUuY3NzVGV4dCA9ICdwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogLThweDsgbGVmdDogMTJweDsgZm9udC1zaXplOiAwLjZyZW07IHBhZGRpbmc6IDFweCA4cHg7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogcmdiYSgxNDIsNjgsMTczLDAuMyk7IGNvbG9yOiAjZDRhNWZmOyBmb250LXdlaWdodDogNjAwOyB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOyBsZXR0ZXItc3BhY2luZzogMC41cHg7JztcbiAgICAgICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gcmVjaXBlSWQucmVwbGFjZSgvLS9nLCAnICcpO1xuICAgICAgICAgICAgY2FyZC5zdHlsZS5wb3NpdGlvbiA9ICdyZWxhdGl2ZSc7XG4gICAgICAgICAgICBjYXJkLmFwcGVuZENoaWxkKGxhYmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICAvLyA9PT0gUkVDSVBFIE1BTkFHRU1FTlQgQUNUSU9OUyA9PT1cbiAgd2luZG93Lm1hbmFnZVJlY2lwZSA9IGFzeW5jIGZ1bmN0aW9uKHJlY2lwZUlkLCBhY3Rpb24pIHtcbiAgICBjb25zdCBlbmRwb2ludCA9IGAvYXBpL3YxL3JlY2lwZXMvJHtyZWNpcGVJZH0vJHthY3Rpb259YDtcbiAgICBjb25zdCBtZXRob2QgPSBhY3Rpb24gPT09ICdyZW1vdmUnID8gJ0RFTEVURScgOiAnUE9TVCc7XG4gICAgY29uc3QgdXJsID0gYWN0aW9uID09PSAncmVtb3ZlJyA/IGAvYXBpL3YxL3JlY2lwZXMvJHtyZWNpcGVJZH1gIDogZW5kcG9pbnQ7XG5cbiAgICBpZiAoYWN0aW9uID09PSAncmVtb3ZlJyAmJiAhY29uZmlybShgUmVtb3ZlIHRoZSBlbnRpcmUgJHtyZWNpcGVJZH0gcmVjaXBlPyBUaGlzIHdpbGwgZGVsZXRlIGFsbCBjb250YWluZXJzIGFuZCBjb25maWd1cmF0aW9uLmApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCh1cmwsIHsgbWV0aG9kIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBSZWNpcGUgJHthY3Rpb259OiAke2RhdGEucmVzdWx0cz8uZmlsdGVyKHIgPT4gci5zdGF0dXMgIT09ICdmYWlsZWQnKS5sZW5ndGggfHwgMH0gY29tcG9uZW50cyBwcm9jZXNzZWRgLCAnc3VjY2VzcycsIDQwMDApO1xuICAgICAgICBpZiAod2luZG93LmxvYWRTZXJ2aWNlcykgd2luZG93LmxvYWRTZXJ2aWNlcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbihgUmVjaXBlICR7YWN0aW9ufSBmYWlsZWQ6ICR7ZGF0YS5lcnJvcn1gLCAnZXJyb3InLCA1MDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBOZXR3b3JrIGVycm9yOiAke2UubWVzc2FnZX1gLCAnZXJyb3InLCA1MDAwKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gPT09IElOSkVDVCBDU1MgPT09XG4gIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgc3R5bGUudGV4dENvbnRlbnQgPSBgXG4gICAgLnJlY2lwZS1zdGVwIHtcbiAgICAgIGZsZXg6IDE7XG4gICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiA4cHggNHB4O1xuICAgICAgZm9udC1zaXplOiAwLjc4cmVtO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1xuICAgICAgdHJhbnNpdGlvbjogYWxsIDAuMnM7XG4gICAgfVxuICAgIC5yZWNpcGUtc3RlcCBzcGFuIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1ib3JkZXIpO1xuICAgICAgY29sb3I6IHZhcigtLW11dGVkKTtcbiAgICAgIGZvbnQtc2l6ZTogMC43cmVtO1xuICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICAgIG1hcmdpbi1yaWdodDogNHB4O1xuICAgIH1cbiAgICAucmVjaXBlLXN0ZXAuYWN0aXZlIHtcbiAgICAgIGNvbG9yOiB2YXIoLS1hY2NlbnQpO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tYWNjZW50KTtcbiAgICB9XG4gICAgLnJlY2lwZS1zdGVwLmFjdGl2ZSBzcGFuIHtcbiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7XG4gICAgICBjb2xvcjogI2ZmZjtcbiAgICB9XG4gICAgLnJlY2lwZS1zdGVwLmNvbXBsZXRlZCB7XG4gICAgICBjb2xvcjogdmFyKC0tb2stZmcpO1xuICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tb2stZmcpO1xuICAgIH1cbiAgICAucmVjaXBlLXN0ZXAuY29tcGxldGVkIHNwYW4ge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tb2stZmcpO1xuICAgICAgY29sb3I6ICNmZmY7XG4gICAgfVxuICAgIC5yZWNpcGUtc3RlcC1wYW5lbCB7XG4gICAgICBtaW4taGVpZ2h0OiAxODBweDtcbiAgICB9XG4gIGA7XG4gIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpO1xuXG4gIC8vID09PSBJTklUID09PVxuICAvLyBQcmUtZmV0Y2ggcHJlbWl1bSBzdGF0dXMgb24gbG9hZFxuICBjaGVja1JlY2lwZVByZW1pdW0oKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENBRERZIFJFTE9BRCBCVVRUT04gPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBSZWxvYWQgQ2FkZHkgYnV0dG9uIGhhbmRsZXJcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgYnV0dG9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JlbG9hZC1jYWRkeS10b3AnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidXR0b24udGV4dENvbnRlbnQ7XG5cbiAgICB0cnkge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1MjNGMyBSZWxvYWRpbmcuLi4nO1xuICAgICAgYnV0dG9uLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jYWRkeS9yZWxvYWQnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKHJlc3BvbnNlLm9rICYmIHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9ICdcdTI3MDUgUmVsb2FkZWQhJztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gb3JpZ2luYWxUZXh0O1xuICAgICAgICAgIGJ1dHRvbi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICB9LCAyMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihyZXN1bHQuZXJyb3IgfHwgJ1JlbG9hZCBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgYnV0dG9uLnRleHRDb250ZW50ID0gJ1x1Mjc0QyBGYWlsZWQnO1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRmFpbGVkIHRvIHJlbG9hZCBDYWRkeTogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGJ1dHRvbi50ZXh0Q29udGVudCA9IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9LCAyMDAwKTtcbiAgICB9XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gRVJST1IgTE9HIFZJRVdFUiAoREMtMDUyKSA9PT09PT09PT09XG4vLyBEQy0wNTI6IEFkZHMgTGV2ZWwgLyBDb250ZXh0IC8gU2VhcmNoIC8gVGltZS1yYW5nZSBmaWx0ZXJzLCBzZXJ2ZXItc2lkZVxuLy8gcGFnaW5hdGlvbiB3aXRoIExvYWQgTW9yZSwgY2xpY2stdG8tZXhwYW5kIHN0YWNrIGZyYW1lcywgYW5kIGEgZGlzdGluY3Rcbi8vIGNvbnRleHRzIGRyb3Bkb3duIGJhY2tlZCBieSAvYXBpL3YxL2Vycm9yLWxvZ3MvY29udGV4dHMuIE1pcnJvcnMgdGhlXG4vLyBhdWRpdC1sb2cgVVggKERDLTA1MCkgc28gb3BlcmF0b3JzIGNhbiBkcmlsbCBpbnRvIGEgc3Vic3lzdGVtIGFzIGVhc2lseVxuLy8gYXMgdGhleSBjYW4gYXVkaXQgd2hvLWRpZC13aGF0LlxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTC4gU2FtZSB3ZWF0aGVyLW1vZGFsIHNoZWxsIGFzIGF1ZGl0LWxvZyBzbyBzdHlsZXNcbiAgLy8gYXJlIHNoYXJlZDsgd2lkZXIgbWluLXdpZHRoIGJlY2F1c2UgZXJyb3Igc3RhY2tzIG5lZWQgcm9vbSB0byBicmVhdGhlLlxuICBpbmplY3RNb2RhbCgnZXJyb3ItbG9nLW1vZGFsJywgYDxkaXYgaWQ9XCJlcnJvci1sb2ctbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDk1MHB4OyBtYXgtd2lkdGg6IDExNTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQ0IgRXJyb3IgTG9nczwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIEVycm9ycyBhbmQgd2FybmluZ3MgZnJvbSB0aGUgRGFzaENhZGR5IEFQSS4gQ2xpY2sgYSByb3cgdG8gc2VlIHRoZSBmdWxsIHN0YWNrIHRyYWNlLlxuICAgICAgPC9wPlxuXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxMnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBmbGV4LXdyYXA6IHdyYXA7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5MZXZlbDo8L2xhYmVsPlxuICAgICAgICA8c2VsZWN0IGlkPVwiZXJyb3ItbG9nLWxldmVsXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIkVSUlwiPkVycm9yczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJXQVJOXCI+V2FybmluZ3M8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiSU5GT1wiPkluZm88L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiREVCVUdcIj5EZWJ1Zzwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkNvbnRleHQ6PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cImVycm9yLWxvZy1jb250ZXh0XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTsgbWF4LXdpZHRoOiAyMjBweDtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCIgc3R5bGU9XCJtYXJnaW4tbGVmdDogOHB4O1wiPlNlYXJjaDo8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJlcnJvci1sb2ctc2VhcmNoXCIgdHlwZT1cInNlYXJjaFwiIHBsYWNlaG9sZGVyPVwibWVzc2FnZSAvIHN0YWNrIC8gaXBcIiBzdHlsZT1cInBhZGRpbmc6IDVweCA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODJyZW07IG1pbi13aWR0aDogMTgwcHg7XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA4cHg7XCI+U2luY2U6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiZXJyb3ItbG9nLXNpbmNlXCIgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+VW50aWw6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiZXJyb3ItbG9nLXVudGlsXCIgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgc3R5bGU9XCJwYWRkaW5nOiA1cHggOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLXJlZnJlc2hcIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj48L3NwYW4+XG4gICAgICAgIDxidXR0b24gaWQ9XCJlcnJvci1sb2ctY2xlYXJcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cdUQ4M0RcdURERDFcdUZFMEYgQ2xlYXIgTG9nPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImVycm9yLWxvZy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGVycm9yIGxvZ3MuLi48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLWxvYWQtbW9yZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNnB4IDE2cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPkxvYWQgTW9yZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+XG4gICAgICAgIDxzcGFuIGlkPVwiZXJyb3ItbG9nLXRvdGFsXCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXJyb3ItbG9nLWNsb3NlXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctbW9kYWwnKTtcbiAgY29uc3Qgdmlld0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd2aWV3LWVycm9yLWxvZ3MnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctcmVmcmVzaCcpO1xuICBjb25zdCBjbGVhckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctY2xlYXInKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLWNsb3NlJyk7XG4gIGNvbnN0IGxldmVsU2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1sZXZlbCcpO1xuICBjb25zdCBjb250ZXh0U2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1jb250ZXh0Jyk7XG4gIGNvbnN0IHNlYXJjaElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1zZWFyY2gnKTtcbiAgY29uc3Qgc2luY2VJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctc2luY2UnKTtcbiAgY29uc3QgdW50aWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlcnJvci1sb2ctdW50aWwnKTtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Vycm9yLWxvZy1jb250YWluZXInKTtcbiAgY29uc3QgbG9hZE1vcmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLWxvYWQtbW9yZScpO1xuICBjb25zdCB0b3RhbFNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXJyb3ItbG9nLXRvdGFsJyk7XG5cbiAgY29uc3QgUEFHRV9TSVpFID0gNTA7XG4gIGxldCBjdXJyZW50T2Zmc2V0ID0gMDtcbiAgbGV0IGluZmxpZ2h0ID0gbnVsbDtcbiAgbGV0IGZpbHRlck5vbmNlID0gMDtcbiAgLy8gQ2FjaGVkIGRpc3RpbmN0IGNvbnRleHRzIHNvIHRoZSBkcm9wZG93biBpcyBwb3B1bGF0ZWQgb25jZSBwZXIgb3BlbiBhbmRcbiAgLy8gcmUtcG9wdWxhdGVkIGFmdGVyIGEgY2xlYXIgKHdoaWNoIHJlbW92ZXMgYWxsIGNvbnRleHRzKSBvciBhIHJlZnJlc2hcbiAgLy8gdGhhdCBzdXJmYWNlcyBhIG5ldyBzdWJzeXN0ZW0gZm9yIHRoZSBmaXJzdCB0aW1lLlxuICBsZXQga25vd25Db250ZXh0cyA9IFtdO1xuXG4gIC8vIGRhdGV0aW1lLWxvY2FsIGZpZWxkcyBhcmUgbmFpdmUgbG9jYWwgdGltZSBcdTIwMTQgY29udmVydCB0byBVVEMgSVNPIHNvIHRoZVxuICAvLyBzZXJ2ZXIgY29tcGFyZXMgY29ycmVjdGx5LiBTYW1lIHNoYXBlIGFzIGF1ZGl0LWxvZy5qcyBzbyB0aGUgb3BlcmF0b3JcbiAgLy8gc2VlcyBjb25zaXN0ZW50IGJlaGF2aW91ciBiZXR3ZWVuIHRoZSB0d28gbW9kYWxzLlxuICBmdW5jdGlvbiB0b0lzbyhsb2NhbER0VmFsdWUpIHtcbiAgICBpZiAoIWxvY2FsRHRWYWx1ZSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGxvY2FsRHRWYWx1ZSk7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbiAgfVxuXG4gIC8vIFB1bGwgdGhlIGRpc3RpbmN0IGNvbnRleHRzIGxpc3Qgb25jZSBwZXIgb3Blbi4gRmFpbHVyZXMgYXJlIHNpbGVudFxuICAvLyAodGhlIGRyb3Bkb3duIHdpbGwganVzdCBzaG93IFwiQWxsXCIgb25seSkgc28gYSB0cmFuc2llbnQgYmFja2VuZCBoaWNjdXBcbiAgLy8gZG9lc24ndCBibG9jayB0aGUgb3BlcmF0b3IgZnJvbSBzZWVpbmcgdGhlIGFjdHVhbCBlcnJvciByb3dzLlxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoQ29udGV4dHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Vycm9yLWxvZ3MvY29udGV4dHMnKTtcbiAgICAgIGlmICghcmVzLm9rKSByZXR1cm47XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFBcnJheS5pc0FycmF5KGRhdGEuY29udGV4dHMpKSByZXR1cm47XG4gICAgICBrbm93bkNvbnRleHRzID0gZGF0YS5jb250ZXh0cztcbiAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IGNvbnRleHRTZWwudmFsdWU7XG4gICAgICBjb250ZXh0U2VsLmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+QWxsPC9vcHRpb24+JztcbiAgICAgIGZvciAoY29uc3QgYyBvZiBkYXRhLmNvbnRleHRzKSB7XG4gICAgICAgIGNvbnN0IG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHQudmFsdWUgPSBjLm5hbWU7XG4gICAgICAgIG9wdC50ZXh0Q29udGVudCA9IGAke2MubmFtZX0gKCR7Yy5jb3VudH0pYDtcbiAgICAgICAgY29udGV4dFNlbC5hcHBlbmRDaGlsZChvcHQpO1xuICAgICAgfVxuICAgICAgLy8gUmVzdG9yZSBwcmV2aW91cyBzZWxlY3Rpb24gaWYgc3RpbGwgcHJlc2VudC5cbiAgICAgIGlmIChjdXJyZW50VmFsdWUgJiYgZGF0YS5jb250ZXh0cy5zb21lKChjKSA9PiBjLm5hbWUgPT09IGN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgY29udGV4dFNlbC52YWx1ZSA9IGN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHsgLyogaWdub3JlICovIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkUXVlcnkoKSB7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKFBBR0VfU0laRSkpO1xuICAgIHBhcmFtcy5zZXQoJ29mZnNldCcsIFN0cmluZyhjdXJyZW50T2Zmc2V0KSk7XG4gICAgaWYgKGxldmVsU2VsLnZhbHVlKSBwYXJhbXMuc2V0KCdsZXZlbCcsIGxldmVsU2VsLnZhbHVlKTtcbiAgICBpZiAoY29udGV4dFNlbC52YWx1ZSkgcGFyYW1zLnNldCgnY29udGV4dCcsIGNvbnRleHRTZWwudmFsdWUpO1xuICAgIGNvbnN0IHNpbmNlID0gdG9Jc28oc2luY2VJbnB1dC52YWx1ZSk7XG4gICAgY29uc3QgdW50aWwgPSB0b0lzbyh1bnRpbElucHV0LnZhbHVlKTtcbiAgICBpZiAoc2luY2UpIHBhcmFtcy5zZXQoJ3NpbmNlJywgc2luY2UpO1xuICAgIGlmICh1bnRpbCkgcGFyYW1zLnNldCgndW50aWwnLCB1bnRpbCk7XG4gICAgY29uc3Qgc2VhcmNoID0gKHNlYXJjaElucHV0LnZhbHVlIHx8ICcnKS50cmltKCk7XG4gICAgaWYgKHNlYXJjaCkgcGFyYW1zLnNldCgnc2VhcmNoJywgc2VhcmNoKTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZExvZ3MoYXBwZW5kKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGlmIChpbmZsaWdodCkgaW5mbGlnaHQuYWJvcnQoKTtcbiAgICAgICAgaW5mbGlnaHQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGN1cnJlbnRPZmZzZXQgPSAwO1xuICAgICAgICBmaWx0ZXJOb25jZSsrO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5mbGlnaHQpIGluZmxpZ2h0LmFib3J0KCk7XG4gICAgICAgIGluZmxpZ2h0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgfVxuICAgICAgY29uc3QgbXlOb25jZSA9IGZpbHRlck5vbmNlO1xuICAgICAgY29uc3QgcGFyYW1zID0gYnVpbGRRdWVyeSgpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9lcnJvci1sb2dzPycgKyBwYXJhbXMudG9TdHJpbmcoKSwge1xuICAgICAgICBzaWduYWw6IGluZmxpZ2h0LnNpZ25hbCxcbiAgICAgIH0pO1xuICAgICAgLy8gTWlycm9yIGF1ZGl0LWxvZzogc3VyZmFjZSA0eHgvNXh4IGV4cGxpY2l0bHkgaW5zdGVhZCBvZiBmYWxsaW5nXG4gICAgICAvLyB0aHJvdWdoIHRvIGEgbWlzbGVhZGluZyBcIm5vIGVudHJpZXMgeWV0XCIgZW1wdHkgc3RhdGUuXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiBIVFRQICR7cmVzLnN0YXR1c308L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0b3RhbFNwYW4udGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZGF0YS5lcnJvciB8fCAndW5rbm93bicpfTwvZGl2PmA7XG4gICAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHRvdGFsU3Bhbi50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBTdGFsZS1yZXNwb25zZSBndWFyZDogYSBub24tYXBwZW5kIGxvYWQgaGFwcGVuZWQgYWZ0ZXIgdGhpcyBmZXRjaCxcbiAgICAgIC8vIGRpc2NhcmQgc28gd2UgZG9uJ3Qgc3BsaWNlIGludG8gdGhlIHdyb25nIERPTS5cbiAgICAgIGlmICghYXBwZW5kICYmIG15Tm9uY2UgIT09IGZpbHRlck5vbmNlKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGxvZ3MgPSBBcnJheS5pc0FycmF5KGRhdGEubG9ncykgPyBkYXRhLmxvZ3MgOiBbXTtcbiAgICAgIGlmIChsb2dzLmxlbmd0aCA9PT0gMCAmJiAhYXBwZW5kKSB7XG4gICAgICAgIGNvbnN0IHJlYXNvbiA9IChkYXRhLmZpbHRlcnMgJiYgKGRhdGEuZmlsdGVycy5sZXZlbCB8fCBkYXRhLmZpbHRlcnMuY29udGV4dCB8fCBkYXRhLmZpbHRlcnMuc2VhcmNoIHx8IGRhdGEuZmlsdGVycy5zaW5jZSB8fCBkYXRhLmZpbHRlcnMudW50aWwpKVxuICAgICAgICAgID8gJ05vIGVycm9yIGxvZyBlbnRyaWVzIG1hdGNoIHlvdXIgZmlsdGVycy4nXG4gICAgICAgICAgOiAnXHUyNzA1IE5vIGVycm9ycyBsb2dnZWQhIEV2ZXJ5dGhpbmcgaXMgd29ya2luZyBzbW9vdGhseS4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDQjwvc3Bhbj4ke2VzY2FwZUh0bWwocmVhc29uKX08L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICB0b3RhbFNwYW4udGV4dENvbnRlbnQgPSBkYXRhLnRvdGFsID8gYCR7ZGF0YS50b3RhbH0gdG90YWxgIDogJyc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGh0bWwgPSAnJztcbiAgICAgIGlmICghYXBwZW5kKSB7XG4gICAgICAgIGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxNjBweDtcIj5XaGVuPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiA4MHB4O1wiPkxldmVsPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7IHdpZHRoOiAxNDBweDtcIj5Db250ZXh0PC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TWVzc2FnZTwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0OyB3aWR0aDogMTEwcHg7XCI+SVA8L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzwvdHI+JztcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBsb2cgb2YgbG9ncykge1xuICAgICAgICBjb25zdCBsZXZlbCA9IChsb2cubGV2ZWwgfHwgJz8nKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICBjb25zdCBsZXZlbENvbG9yID0gbGV2ZWwgPT09ICdFUlInID8gJ3ZhcigtLWJhZC1mZyknIDogKGxldmVsID09PSAnV0FSTicgPyAndmFyKC0td2Fybi1mZywgI2YwYzY3NCknIDogJ3ZhcigtLW11dGVkKScpO1xuICAgICAgICBjb25zdCB0cyA9IGxvZy50aW1lc3RhbXAgPyBuZXcgRGF0ZShsb2cudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpIDogJ1x1MjAxNCc7XG4gICAgICAgIGNvbnN0IGN0eCA9IGxvZy5jb250ZXh0IHx8ICdcdTIwMTQnO1xuICAgICAgICBjb25zdCBtc2cgPSAobG9nLmVycm9yIHx8ICcnKS5zcGxpdCgnXFxuJylbMF07XG4gICAgICAgIGNvbnN0IGlwID0gKGxvZy5yZXF1ZXN0ICYmIGxvZy5yZXF1ZXN0LmlwKSB8fCAnJztcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjtcIiBjbGFzcz1cImVycm9yLWxvZy1yb3dcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwobG9nLnRpbWVzdGFtcCB8fCAnJyl9XCI+JHtlc2NhcGVIdG1sKHRzKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiAke2xldmVsQ29sb3J9OyBmb250LXdlaWdodDogNjAwO1wiPiR7ZXNjYXBlSHRtbChsZXZlbCl9PC9zcGFuPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzhyZW07XCI+JHtlc2NhcGVIdG1sKGN0eCl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtlc2NhcGVIdG1sKG1zZyl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj4ke2VzY2FwZUh0bWwoaXApfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICBpZiAobG9nLmRldGFpbCkge1xuICAgICAgICAgIGh0bWwgKz0gYDx0ciBjbGFzcz1cImVycm9yLWxvZy1kZXRhaWxcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PHRkIGNvbHNwYW49XCI1XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggNnB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48cHJlIHN0eWxlPVwibWFyZ2luOiAwOyB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IG1heC1oZWlnaHQ6IDMyMHB4OyBvdmVyZmxvdzogYXV0bztcIj4ke2VzY2FwZUh0bWwobG9nLmRldGFpbCl9PC9wcmU+PC90ZD48L3RyPmA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gICAgICAgIGlmICh0YWJsZSkgdGFibGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudE9mZnNldCArPSBsb2dzLmxlbmd0aDtcbiAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSBkYXRhLmhhc01vcmUgPyAnJyA6ICdub25lJztcbiAgICAgIHRvdGFsU3Bhbi50ZXh0Q29udGVudCA9IGAke2RhdGEudG90YWx9IHRvdGFsJHtkYXRhLmhhc01vcmUgPyAnIChzaG93aW5nICcgKyBjdXJyZW50T2Zmc2V0ICsgJyknIDogJyd9YDtcblxuICAgICAgLy8gVG9nZ2xlIGRldGFpbCByb3dzIG9uIGNsaWNrIFx1MjAxNCBzYW1lIHBhdHRlcm4gYXMgYXVkaXQtbG9nLmpzXG4gICAgICBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLmVycm9yLWxvZy1yb3cnKS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICAgICAgaWYgKHJvdy5kYXRhc2V0LndpcmVkKSByZXR1cm47XG4gICAgICAgIHJvdy5kYXRhc2V0LndpcmVkID0gJ3RydWUnO1xuICAgICAgICByb3cuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZGV0YWlsID0gcm93Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICBpZiAoZGV0YWlsICYmIGRldGFpbC5jbGFzc0xpc3QuY29udGFpbnMoJ2Vycm9yLWxvZy1kZXRhaWwnKSkge1xuICAgICAgICAgICAgZGV0YWlsLnN0eWxlLmRpc3BsYXkgPSBkZXRhaWwuc3R5bGUuZGlzcGxheSA9PT0gJ25vbmUnID8gJycgOiAnbm9uZSc7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChlICYmIGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgICAgdG90YWxTcGFuLnRleHRDb250ZW50ID0gJyc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xlYXJMb2dzKCkge1xuICAgIGlmICghY29uZmlybSgnQ2xlYXIgdGhlIGVudGlyZSBlcnJvciBsb2c/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9lcnJvci1sb2dzJywge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb25maXJtOiAnQ0xFQVInIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgLy8gQWZ0ZXIgYSBjbGVhciwgdGhlIGNvbnRleHRzIGxpc3Qgd2lsbCBiZSBlbXB0eSBcdTIwMTQgcmUtZmV0Y2ggc28gdGhlXG4gICAgICAgIC8vIGRyb3Bkb3duIHJlZmxlY3RzIHJlYWxpdHkuIExvYWQgdGhlIG5vdy1lbXB0eSBwYWdlIGluIHBhcmFsbGVsLlxuICAgICAgICBhd2FpdCByZWZyZXNoQ29udGV4dHMoKTtcbiAgICAgICAgbG9hZExvZ3MoZmFsc2UpO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdcdTI3MDUgRXJyb3IgbG9ncyBjbGVhcmVkJywgJ3N1Y2Nlc3MnLCAzMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1x1Mjc0QyAnICsgKGRhdGEuZXJyb3IgfHwgJ0NsZWFyIGZhaWxlZCcpLCAnZXJyb3InLCA0MDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdcdTI3NEMgJyArIGUubWVzc2FnZSwgJ2Vycm9yJywgNDAwMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVib3VuY2UgdGV4dC1pbnB1dCBjaGFuZ2VzIHNvIHdlIGRvbid0IHJlZmV0Y2ggb24gZXZlcnkga2V5c3Ryb2tlLlxuICBsZXQgc2VhcmNoRGVib3VuY2U7XG4gIGZ1bmN0aW9uIHdpcmVGaWx0ZXJzKCkge1xuICAgIGxldmVsU2VsPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiBsb2FkTG9ncyhmYWxzZSkpO1xuICAgIGNvbnRleHRTZWw/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IGxvYWRMb2dzKGZhbHNlKSk7XG4gICAgc2VhcmNoSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgY2xlYXJUaW1lb3V0KHNlYXJjaERlYm91bmNlKTtcbiAgICAgIHNlYXJjaERlYm91bmNlID0gc2V0VGltZW91dCgoKSA9PiBsb2FkTG9ncyhmYWxzZSksIDI1MCk7XG4gICAgfSk7XG4gICAgbGV0IGRhdGVEZWJvdW5jZTtcbiAgICBbc2luY2VJbnB1dCwgdW50aWxJbnB1dF0uZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgIGVsPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIGNsZWFyVGltZW91dChkYXRlRGVib3VuY2UpO1xuICAgICAgICBkYXRlRGVib3VuY2UgPSBzZXRUaW1lb3V0KCgpID0+IGxvYWRMb2dzKGZhbHNlKSwgMjUwKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZExvZ3MoZmFsc2UpKTtcbiAgICBsb2FkTW9yZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBsb2FkTG9ncyh0cnVlKSk7XG4gICAgY2xlYXJCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xlYXJMb2dzKTtcbiAgICB3aXJlTW9kYWwobW9kYWwsIGNsb3NlQnRuKTtcbiAgfVxuXG4gIHZpZXdCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgYXdhaXQgcmVmcmVzaENvbnRleHRzKCk7XG4gICAgbG9hZExvZ3MoZmFsc2UpO1xuICB9KTtcbiAgd2lyZUZpbHRlcnMoKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENPTlRBSU5FUiBMT0cgVklFV0VSID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2NvbnRhaW5lci1sb2dzLW1vZGFsJywgYDxkaXYgaWQ9XCJjb250YWluZXItbG9ncy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiIHN0eWxlPVwiei1pbmRleDogMTAwMTtcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDkwMHB4OyBtYXgtd2lkdGg6IDk1dnc7IGhlaWdodDogODB2aDsgZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWhlYWRlclwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBwYWRkaW5nLWJvdHRvbTogMTJweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIHN0eWxlPVwibWFyZ2luOiAwO1wiPlx1RDgzRFx1RENEQyBDb250YWluZXIgTG9nczwvaDM+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOiA0cHggMCAwIDA7IGZvbnQtc2l6ZTogMC44NXJlbTsgb3BhY2l0eTogMC43O1wiPlZpZXcgYW5kIHN0cmVhbSBEb2NrZXIgY29udGFpbmVyIGxvZ3M8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1jb250cm9sc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cImNsLWNvbnRhaW5lci1zZWxlY3RcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgbWluLXdpZHRoOiAyMDBweDtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYSBjb250YWluZXIuLi48L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNsLWxvZy1zZWFyY2hcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBsb2dzLi4uXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IHdpZHRoOiAxNTBweDtcIiAvPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjbC1sb2ctdGFpbFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjUwXCI+TGFzdCA1MCBsaW5lczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjEwMFwiIHNlbGVjdGVkPkxhc3QgMTAwIGxpbmVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiNTAwXCI+TGFzdCA1MDAgbGluZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxMDAwXCI+TGFzdCAxMDAwIGxpbmVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIGxvZ3M8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2wtcmVmcmVzaFwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjbC1zdHJlYW1cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XHUyNUI2IFN0cmVhbTwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjbC1kb3dubG9hZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdURDQkUgRG93bmxvYWQ8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY2wtY2xlYXItc2VhcmNoXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiIHRpdGxlPVwiQ2xlYXIgc2VhcmNoXCI+XHUyNzE1PC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNsLWNsb3NlXCIgY2xhc3M9XCJjbG9zZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4O1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGlkPVwiY2wtY29udGFpbmVyLWluZm9cIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogMTZweDsgbWFyZ2luLWJvdHRvbTogMTJweDsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWJnLXNlY29uZGFyeSwgdmFyKC0tYmcpKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgIDxzcGFuPjxzdHJvbmc+SW1hZ2U6PC9zdHJvbmc+IDxzcGFuIGlkPVwiY2wtaW1hZ2VcIj4tPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4+PHN0cm9uZz5TdGF0dXM6PC9zdHJvbmc+IDxzcGFuIGlkPVwiY2wtc3RhdHVzXCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICAgIDxzcGFuPjxzdHJvbmc+Q3JlYXRlZDo8L3N0cm9uZz4gPHNwYW4gaWQ9XCJjbC1jcmVhdGVkXCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIFxuICAgICAgPGRpdiBpZD1cImNsLWxvZy1jb250ZW50XCIgY2xhc3M9XCJsb2dzLWNvbnRlbnQgc2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwiZmxleDogMTsgbWluLWhlaWdodDogMDsgYmFja2dyb3VuZDogIzFhMWExYTsgYm9yZGVyLXJhZGl1czogNnB4OyBwYWRkaW5nOiAxMnB4OyBmb250LWZhbWlseTogJ01vbmFjbycsICdNZW5sbycsICdVYnVudHUgTW9ubycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjc4cmVtOyBvdmVyZmxvdzogYXV0bztcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGxvZ3M8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgXG4gICAgICA8ZGl2IGlkPVwiY2wtc3RyZWFtLXN0YXR1c1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogOHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLW9rLWJnLCAjMWEzYTFhKTsgY29sb3I6IHZhcigtLW9rLWZnLCAjNGFkZTgwKTsgYm9yZGVyLXJhZGl1czogNnB4OyBtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJjbC1zdHJlYW0taW5kaWNhdG9yXCI+XHVEODNEXHVERDM0PC9zcGFuPiA8c3BhbiBpZD1cImNsLXN0cmVhbS10ZXh0XCI+RGlzY29ubmVjdGVkPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICBcbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICA8c3BhbiBpZD1cImNsLWxpbmUtY291bnRcIj4wIGxpbmVzPC9zcGFuPlxuICAgICAgICAgIDxzcGFuPnw8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJjbC1maWx0ZXItY291bnRcIj4wIGZpbHRlcmVkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsLWNsb3NlLWJ0blwiIGNsYXNzPVwiYnRuLXNlY29uZGFyeVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyLWxvZ3MtbW9kYWwnKTtcbiAgY29uc3QgY29udGFpbmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNvbnRhaW5lci1zZWxlY3QnKTtcbiAgY29uc3QgbG9nQ29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1sb2ctY29udGVudCcpO1xuICBjb25zdCBsb2dTZWFyY2ggPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtbG9nLXNlYXJjaCcpO1xuICBjb25zdCBsb2dUYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxvZy10YWlsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtcmVmcmVzaCcpO1xuICBjb25zdCBzdHJlYW1CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtc3RyZWFtJyk7XG4gIGNvbnN0IGRvd25sb2FkQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWRvd25sb2FkJyk7XG4gIGNvbnN0IGNsZWFyU2VhcmNoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWNsZWFyLXNlYXJjaCcpO1xuICBjb25zdCBjbG9zZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1jbG9zZScpO1xuICBjb25zdCBjbG9zZUJ0bjIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY2xvc2UtYnRuJyk7XG4gIGNvbnN0IHN0cmVhbVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zdHJlYW0tc3RhdHVzJyk7XG4gIGNvbnN0IHN0cmVhbUluZGljYXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbC1zdHJlYW0taW5kaWNhdG9yJyk7XG4gIGNvbnN0IHN0cmVhbVRleHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtc3RyZWFtLXRleHQnKTtcbiAgY29uc3QgbGluZUNvdW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWxpbmUtY291bnQnKTtcbiAgY29uc3QgZmlsdGVyQ291bnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtZmlsdGVyLWNvdW50Jyk7XG4gIFxuICAvLyBDb250YWluZXIgaW5mbyBlbGVtZW50c1xuICBjb25zdCBpbWFnZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLWltYWdlJyk7XG4gIGNvbnN0IHN0YXR1c0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NsLXN0YXR1cycpO1xuICBjb25zdCBjcmVhdGVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2wtY3JlYXRlZCcpO1xuXG4gIGxldCBjdXJyZW50Q29udGFpbmVySWQgPSBudWxsO1xuICBsZXQgY3VycmVudExvZ3MgPSBbXTtcbiAgbGV0IGZpbHRlcmVkTG9ncyA9IFtdO1xuICBsZXQgZXZlbnRTb3VyY2UgPSBudWxsO1xuICBsZXQgaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgbGV0IHNlYXJjaFRpbWVvdXQgPSBudWxsO1xuXG4gIC8vIEZvcm1hdCBkYXRlXG4gIGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZVN0cikge1xuICAgIGlmICghZGF0ZVN0cikgcmV0dXJuICctJztcbiAgICBjb25zdCBkID0gbmV3IERhdGUoZGF0ZVN0cik7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIGRhdGVTdHI7XG4gICAgcmV0dXJuIGQudG9Mb2NhbGVTdHJpbmcoKTtcbiAgfVxuXG4gIC8vIEVzY2FwZSBIVE1MXG4gIGZ1bmN0aW9uIGVzY2FwZUh0bWwoc3RyKSB7XG4gICAgaWYgKCFzdHIpIHJldHVybiAnJztcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBzdHI7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICAvLyBGb3JtYXQgbG9nIGVudHJ5IGZvciBkaXNwbGF5XG4gIGZ1bmN0aW9uIGZvcm1hdExvZ0VudHJ5KGxvZywgaW5kZXgpIHtcbiAgICBjb25zdCBzdHJlYW1DbGFzcyA9IGxvZy5zdHJlYW0gPT09ICdzdGRlcnInID8gJ2xvZy1zdGRlcnInIDogJ2xvZy1zdGRvdXQnO1xuICAgIGNvbnN0IHN0cmVhbUljb24gPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICdcdTI2QTBcdUZFMEYnIDogJ1x1RDgzRFx1RENFNCc7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJsb2ctZW50cnkgJHtzdHJlYW1DbGFzc31cIiBkYXRhLWluZGV4PVwiJHtpbmRleH1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjMzMzOyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctbGluZS1udW1cIiBzdHlsZT1cImNvbG9yOiAjNjY2OyBtaW4td2lkdGg6IDQwcHg7IHRleHQtYWxpZ246IHJpZ2h0OyB1c2VyLXNlbGVjdDogbm9uZTtcIj4ke2luZGV4ICsgMX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibG9nLXN0cmVhbS1pY29uXCIgc3R5bGU9XCJjb2xvcjogJHtsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICcjZjU5ZTBiJyA6ICcjMjJjNTVlJ307XCI+JHtzdHJlYW1JY29ufTwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2ctdGV4dFwiIHN0eWxlPVwiZmxleDogMTsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB3b3JkLWJyZWFrOiBicmVhay1hbGw7IGNvbG9yOiAjZTVlNWU1O1wiPiR7ZXNjYXBlSHRtbChsb2cudGV4dCl9PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIC8vIFJlbmRlciBsb2dzIHRvIHRoZSBjb250ZW50IGFyZWFcbiAgZnVuY3Rpb24gcmVuZGVyTG9ncyhsb2dzLCBzZWFyY2hUZXJtID0gJycpIHtcbiAgICBpZiAoIWxvZ3MgfHwgbG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5ObyBsb2dzIGF2YWlsYWJsZTwvZGl2Pic7XG4gICAgICBsaW5lQ291bnQudGV4dENvbnRlbnQgPSAnMCBsaW5lcyc7XG4gICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9ICcwIGZpbHRlcmVkJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjdXJyZW50TG9ncyA9IGxvZ3M7XG4gICAgZmlsdGVyZWRMb2dzID0gc2VhcmNoVGVybSA/IGxvZ3MuZmlsdGVyKGxvZyA9PiBcbiAgICAgIGxvZy50ZXh0ICYmIGxvZy50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKVxuICAgICkgOiBsb2dzO1xuXG4gICAgbGluZUNvdW50LnRleHRDb250ZW50ID0gYCR7bG9ncy5sZW5ndGh9IGxpbmVzYDtcbiAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9IHNlYXJjaFRlcm0gPyBgJHtmaWx0ZXJlZExvZ3MubGVuZ3RofSBvZiAke2xvZ3MubGVuZ3RofSBzaG93bmAgOiBgJHtsb2dzLmxlbmd0aH0gc2hvd25gO1xuXG4gICAgaWYgKGZpbHRlcmVkTG9ncy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5ObyBsb2dzIG1hdGNoIFwiJHtlc2NhcGVIdG1sKHNlYXJjaFRlcm0pfVwiPC9kaXY+YDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dDb250ZW50LmlubmVySFRNTCA9IGZpbHRlcmVkTG9ncy5tYXAoKGxvZywgaSkgPT4gZm9ybWF0TG9nRW50cnkobG9nLCBpKSkuam9pbignJyk7XG4gICAgXG4gICAgLy8gU2Nyb2xsIHRvIGJvdHRvbVxuICAgIGxvZ0NvbnRlbnQuc2Nyb2xsVG9wID0gbG9nQ29udGVudC5zY3JvbGxIZWlnaHQ7XG4gIH1cblxuICAvLyBMb2FkIGNvbnRhaW5lciBsaXN0XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRDb250YWluZXJzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZ2V0SlNPTignL2FwaS92MS9sb2dzL2NvbnRhaW5lcnMnKTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBkYXRhLmNvbnRhaW5lcnMgfHwgW107XG4gICAgICBcbiAgICAgIC8vIFN0b3JlIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICBjb25zdCBjdXJyZW50VmFsID0gY29udGFpbmVyU2VsZWN0LnZhbHVlO1xuICAgICAgXG4gICAgICBjb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgYSBjb250YWluZXIuLi48L29wdGlvbj4nO1xuICAgICAgXG4gICAgICBjb250YWluZXJzLmZvckVhY2goYyA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgICBvcHRpb24udmFsdWUgPSBjLmlkO1xuICAgICAgICBvcHRpb24udGV4dENvbnRlbnQgPSBgJHtjLm5hbWV9ICgke2MuaW1hZ2Uuc3BsaXQoJzonKVswXX0pIC0gJHtjLnN0YXR1c31gO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5uYW1lID0gYy5uYW1lO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5pbWFnZSA9IGMuaW1hZ2U7XG4gICAgICAgIG9wdGlvbi5kYXRhc2V0LnN0YXR1cyA9IGMuc3RhdHVzO1xuICAgICAgICBvcHRpb24uZGF0YXNldC5jcmVhdGVkID0gYy5jcmVhdGVkO1xuICAgICAgICBjb250YWluZXJTZWxlY3QuYXBwZW5kQ2hpbGQob3B0aW9uKTtcbiAgICAgIH0pO1xuICAgICAgXG4gICAgICAvLyBSZXN0b3JlIHNlbGVjdGlvbiBpZiBzdGlsbCB2YWxpZFxuICAgICAgaWYgKGN1cnJlbnRWYWwgJiYgY29udGFpbmVyU2VsZWN0LnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7Y3VycmVudFZhbH1cIl1gKSkge1xuICAgICAgICBjb250YWluZXJTZWxlY3QudmFsdWUgPSBjdXJyZW50VmFsO1xuICAgICAgICBsb2FkQ29udGFpbmVySW5mbyhjdXJyZW50VmFsKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBsb2FkIGNvbnRhaW5lcnM6JywgZXJyKTtcbiAgICB9XG4gIH1cblxuICAvLyBMb2FkIGNvbnRhaW5lciBpbmZvXG4gIGZ1bmN0aW9uIGxvYWRDb250YWluZXJJbmZvKGNvbnRhaW5lcklkKSB7XG4gICAgY29uc3Qgb3B0aW9uID0gY29udGFpbmVyU2VsZWN0LnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7Y29udGFpbmVySWR9XCJdYCk7XG4gICAgaWYgKG9wdGlvbikge1xuICAgICAgaW1hZ2VFbC50ZXh0Q29udGVudCA9IG9wdGlvbi5kYXRhc2V0LmltYWdlIHx8ICctJztcbiAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gb3B0aW9uLmRhdGFzZXQuc3RhdHVzIHx8ICctJztcbiAgICAgIHN0YXR1c0VsLnN0eWxlLmNvbG9yID0gb3B0aW9uLmRhdGFzZXQuc3RhdHVzID09PSAncnVubmluZycgPyAndmFyKC0tb2stZmcsICM0YWRlODApJyA6ICd2YXIoLS1iYWQtZmcsICNlZjQ0NDQpJztcbiAgICAgIGNyZWF0ZWRFbC50ZXh0Q29udGVudCA9IGZvcm1hdERhdGUob3B0aW9uLmRhdGFzZXQuY3JlYXRlZCk7XG4gICAgfVxuICB9XG5cbiAgLy8gTG9hZCBsb2dzIGZvciBzZWxlY3RlZCBjb250YWluZXJcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZExvZ3MoKSB7XG4gICAgY29uc3QgY29udGFpbmVySWQgPSBjb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgaWYgKCFjb250YWluZXJJZCkge1xuICAgICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGxvZ3M8L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIHN0cmVhbVxuICAgIHN0b3BTdHJlYW0oKTtcblxuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IGNvbnRhaW5lcklkO1xuICAgIGxvYWRDb250YWluZXJJbmZvKGNvbnRhaW5lcklkKTtcblxuICAgIGNvbnN0IHRhaWwgPSBsb2dUYWlsLnZhbHVlO1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBsb2dTZWFyY2gudmFsdWUudHJpbSgpO1xuXG4gICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPkxvYWRpbmcgbG9ncy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gYC9hcGkvdjEvbG9ncy9jb250YWluZXIvJHtjb250YWluZXJJZH0ke3RhaWwgIT09ICdhbGwnID8gYD90YWlsPSR7dGFpbH1gIDogJyd9YDtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRKU09OKHVybCk7XG5cbiAgICAgIGlmIChkYXRhLmxvZ3MgJiYgZGF0YS5sb2dzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVuZGVyTG9ncyhkYXRhLmxvZ3MsIHNlYXJjaFRlcm0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nQ29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPk5vIGxvZ3MgZm91bmQgZm9yIHRoaXMgY29udGFpbmVyPC9kaXY+JztcbiAgICAgICAgbGluZUNvdW50LnRleHRDb250ZW50ID0gJzAgbGluZXMnO1xuICAgICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9ICcwIGZpbHRlcmVkJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+RXJyb3IgbG9hZGluZyBsb2dzOiAke2VzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gU3RhcnQgc3RyZWFtaW5nIGxvZ3NcbiAgZnVuY3Rpb24gc3RhcnRTdHJlYW0oKSB7XG4gICAgY29uc3QgY29udGFpbmVySWQgPSBjb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgaWYgKCFjb250YWluZXJJZCkgcmV0dXJuO1xuXG4gICAgLy8gU3RvcCBhbnkgZXhpc3Rpbmcgc3RyZWFtXG4gICAgc3RvcFN0cmVhbSgpO1xuXG4gICAgaXNTdHJlYW1pbmcgPSB0cnVlO1xuICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdTIzRjkgU3RvcCc7XG4gICAgc3RyZWFtU3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnZmxleCc7XG4gICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REZFMic7XG4gICAgc3RyZWFtVGV4dC50ZXh0Q29udGVudCA9ICdDb25uZWN0aW5nLi4uJztcblxuICAgIGNvbnN0IHVybCA9IGAvYXBpL3YxL2xvZ3Mvc3RyZWFtLyR7Y29udGFpbmVySWR9YDtcbiAgICBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh1cmwpO1xuXG4gICAgZXZlbnRTb3VyY2Uub25vcGVuID0gKCkgPT4ge1xuICAgICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REZFMic7XG4gICAgICBzdHJlYW1UZXh0LnRleHRDb250ZW50ID0gJ0Nvbm5lY3RlZCAtIHN0cmVhbWluZyBsb2dzJztcbiAgICB9O1xuXG4gICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBsb2cgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGxvZy5lcnJvcikge1xuICAgICAgICAgIHN0cmVhbUluZGljYXRvci50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdUREMzQnO1xuICAgICAgICAgIHN0cmVhbVRleHQudGV4dENvbnRlbnQgPSBgRXJyb3I6ICR7bG9nLmVycm9yfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIGN1cnJlbnQgbG9nc1xuICAgICAgICBjdXJyZW50TG9ncy5wdXNoKGxvZyk7XG4gICAgICAgIGZpbHRlcmVkTG9ncy5wdXNoKGxvZyk7XG4gICAgICAgIFxuICAgICAgICAvLyBVcGRhdGUgY291bnRzXG4gICAgICAgIGxpbmVDb3VudC50ZXh0Q29udGVudCA9IGAke2N1cnJlbnRMb2dzLmxlbmd0aH0gbGluZXNgO1xuICAgICAgICBmaWx0ZXJDb3VudC50ZXh0Q29udGVudCA9IGAke2ZpbHRlcmVkTG9ncy5sZW5ndGh9IHNob3duYDtcbiAgICAgICAgXG4gICAgICAgIC8vIEFwcGVuZCBuZXcgbG9nIGVudHJ5XG4gICAgICAgIGNvbnN0IHNlYXJjaFRlcm0gPSBsb2dTZWFyY2gudmFsdWUudHJpbSgpO1xuICAgICAgICBpZiAoIXNlYXJjaFRlcm0gfHwgKGxvZy50ZXh0ICYmIGxvZy50ZXh0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpKSkpIHtcbiAgICAgICAgICBjb25zdCBlbnRyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgIGVudHJ5LmlubmVySFRNTCA9IGZvcm1hdExvZ0VudHJ5KGxvZywgZmlsdGVyZWRMb2dzLmxlbmd0aCAtIDEpO1xuICAgICAgICAgIGNvbnN0IGVudHJ5RGl2ID0gZW50cnkuZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgZW50cnlEaXYuc3R5bGUuYmFja2dyb3VuZCA9ICcjMWEzYTFhJztcbiAgICAgICAgICBsb2dDb250ZW50LmFwcGVuZENoaWxkKGVudHJ5RGl2KTtcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBBdXRvLXNjcm9sbCB0byBib3R0b21cbiAgICAgICAgICBsb2dDb250ZW50LnNjcm9sbFRvcCA9IGxvZ0NvbnRlbnQuc2Nyb2xsSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgbG9nOicsIGUpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgc3RyZWFtSW5kaWNhdG9yLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQzNCc7XG4gICAgICBzdHJlYW1UZXh0LnRleHRDb250ZW50ID0gJ0Rpc2Nvbm5lY3RlZCc7XG4gICAgICBpc1N0cmVhbWluZyA9IGZhbHNlO1xuICAgICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1MjVCNiBTdHJlYW0nO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSB0aGUgRXZlbnRTb3VyY2UgZm9yIGNsZWFudXBcbiAgICBtb2RhbC5fZXZlbnRTb3VyY2UgPSBldmVudFNvdXJjZTtcbiAgfVxuXG4gIC8vIFN0b3Agc3RyZWFtaW5nIGxvZ3NcbiAgZnVuY3Rpb24gc3RvcFN0cmVhbSgpIHtcbiAgICBpZiAoZXZlbnRTb3VyY2UpIHtcbiAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7XG4gICAgICBldmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChtb2RhbC5fZXZlbnRTb3VyY2UpIHtcbiAgICAgIG1vZGFsLl9ldmVudFNvdXJjZS5jbG9zZSgpO1xuICAgICAgbW9kYWwuX2V2ZW50U291cmNlID0gbnVsbDtcbiAgICB9XG4gICAgaXNTdHJlYW1pbmcgPSBmYWxzZTtcbiAgICBzdHJlYW1CdG4udGV4dENvbnRlbnQgPSAnXHUyNUI2IFN0cmVhbSc7XG4gICAgc3RyZWFtU3RhdHVzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICAvLyBEb3dubG9hZCBsb2dzIGFzIGZpbGVcbiAgZnVuY3Rpb24gZG93bmxvYWRMb2dzKCkge1xuICAgIGlmICghY3VycmVudExvZ3MgfHwgY3VycmVudExvZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdObyBsb2dzIHRvIGRvd25sb2FkJywgJ2Vycm9yJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lclNlbGVjdC5xdWVyeVNlbGVjdG9yKGBvcHRpb25bdmFsdWU9XCIke2N1cnJlbnRDb250YWluZXJJZH1cIl1gKT8uZGF0YXNldC5uYW1lIHx8IGN1cnJlbnRDb250YWluZXJJZDtcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvWzouXS9nLCAnLScpO1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7Y29udGFpbmVyTmFtZX0tbG9ncy0ke3RpbWVzdGFtcH0udHh0YDtcblxuICAgIGNvbnN0IGNvbnRlbnQgPSBjdXJyZW50TG9ncy5tYXAobG9nID0+IHtcbiAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGxvZy50aW1lc3RhbXAgfHwgJyc7XG4gICAgICBjb25zdCBzdHJlYW0gPSBsb2cuc3RyZWFtID09PSAnc3RkZXJyJyA/ICdbRVJSXScgOiAnW09VVF0nO1xuICAgICAgcmV0dXJuIGAke3RpbWVzdGFtcCA/IHRpbWVzdGFtcCArICcgJyA6ICcnfSR7c3RyZWFtfSAke2xvZy50ZXh0fWA7XG4gICAgfSkuam9pbignXFxuJyk7XG5cbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW2NvbnRlbnRdLCB7IHR5cGU6ICd0ZXh0L3BsYWluJyB9KTtcbiAgICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgYS5ocmVmID0gdXJsO1xuICAgIGEuZG93bmxvYWQgPSBmaWxlbmFtZTtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcblxuICAgIHNob3dOb3RpZmljYXRpb24oYERvd25sb2FkZWQgJHtjdXJyZW50TG9ncy5sZW5ndGh9IGxvZyBsaW5lc2AsICdzdWNjZXNzJyk7XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgY29udGFpbmVyU2VsZWN0Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgbG9hZExvZ3MoKTtcbiAgfSk7XG5cbiAgbG9nVGFpbD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4ge1xuICAgIGxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIHN0cmVhbUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgaWYgKGlzU3RyZWFtaW5nKSB7XG4gICAgICBzdG9wU3RyZWFtKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXJ0U3RyZWFtKCk7XG4gICAgfVxuICB9KTtcblxuICBkb3dubG9hZEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgZG93bmxvYWRMb2dzKCk7XG4gIH0pO1xuXG4gIGNsZWFyU2VhcmNoQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBsb2dTZWFyY2gudmFsdWUgPSAnJztcbiAgICByZW5kZXJMb2dzKGN1cnJlbnRMb2dzLCAnJyk7XG4gIH0pO1xuXG4gIGxvZ1NlYXJjaD8uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgLy8gRGVib3VuY2Ugc2VhcmNoXG4gICAgY2xlYXJUaW1lb3V0KHNlYXJjaFRpbWVvdXQpO1xuICAgIHNlYXJjaFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHJlbmRlckxvZ3MoY3VycmVudExvZ3MsIGxvZ1NlYXJjaC52YWx1ZS50cmltKCkpO1xuICAgIH0sIDMwMCk7XG4gIH0pO1xuXG4gIGxvZ1NlYXJjaD8uYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykge1xuICAgICAgbG9nU2VhcmNoLnZhbHVlID0gJyc7XG4gICAgICByZW5kZXJMb2dzKGN1cnJlbnRMb2dzLCAnJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBPcGVuIG1vZGFsXG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1jb250YWluZXItbG9ncycpO1xuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZENvbnRhaW5lcnMoKTtcbiAgfSk7XG5cbiAgLy8gQ2xvc2UgbW9kYWwgaGFuZGxlcnNcbiAgZnVuY3Rpb24gY2xvc2VNb2RhbCgpIHtcbiAgICBzdG9wU3RyZWFtKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9XG5cbiAgY2xvc2VCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VNb2RhbCk7XG4gIGNsb3NlQnRuMj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjbG9zZU1vZGFsKTtcblxuICAvLyBDbG9zZSBvbiBlc2NhcGUga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgbW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcbiAgICAgIGNsb3NlTW9kYWwoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIFdpcmUgYmFja2Ryb3AgY2xpY2sgdG8gY2xvc2VNb2RhbCBzbyB0aGUgbG9nIHN0cmVhbSBzdG9wcyB0b28uXG4gIC8vIChDYW4ndCB1c2Ugd2lyZU1vZGFsIGhlcmUgXHUyMDE0IGl0IG9ubHkgZG9lcyBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JylcbiAgLy8gb24gYmFja2Ryb3AgY2xpY2ssIHdoaWNoIHdvdWxkIGxlYWsgdGhlIFNTRS9zdHJlYW0gY29ubmVjdGlvbi4pXG4gIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHsgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkgY2xvc2VNb2RhbCgpOyB9KTtcblxuICAvLyBFeHBvc2UgZm9yIHVzZSBieSBzZXJ2aWNlIGNhcmQgYnV0dG9ucyAoZ3JpZC5qcyBjYWxscyBvcGVuQ29udGFpbmVyTG9nc01vZGFsKVxuICB3aW5kb3cub3BlbkNvbnRhaW5lckxvZ3NNb2RhbCA9IGZ1bmN0aW9uKGNvbnRhaW5lcklkLCBjb250YWluZXJOYW1lKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRDb250YWluZXJzKCkudGhlbigoKSA9PiB7XG4gICAgICAvLyBUcnkgdG8gZmluZCBhbmQgc2VsZWN0IHRoZSBjb250YWluZXJcbiAgICAgIGNvbnN0IG9wdGlvbiA9IEFycmF5LmZyb20oY29udGFpbmVyU2VsZWN0Lm9wdGlvbnMpLmZpbmQob3B0ID0+IFxuICAgICAgICBvcHQudmFsdWUgPT09IGNvbnRhaW5lcklkIHx8IG9wdC5kYXRhc2V0Lm5hbWUgPT09IGNvbnRhaW5lck5hbWVcbiAgICAgICk7XG4gICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgIGNvbnRhaW5lclNlbGVjdC52YWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgICAgbG9hZENvbnRhaW5lckluZm8ob3B0aW9uLnZhbHVlKTtcbiAgICAgICAgbG9hZExvZ3MoKTtcbiAgICAgIH0gZWxzZSBpZiAoY29udGFpbmVySWQpIHtcbiAgICAgICAgLy8gSWYgY29udGFpbmVyIG5vdCBmb3VuZCBpbiBsaXN0IGJ1dCB3ZSBoYXZlIGFuIElELCB0cnkgbG9hZGluZyBkaXJlY3RseVxuICAgICAgICBjdXJyZW50Q29udGFpbmVySWQgPSBjb250YWluZXJJZDtcbiAgICAgICAgaW1hZ2VFbC50ZXh0Q29udGVudCA9IGNvbnRhaW5lck5hbWUgfHwgY29udGFpbmVySWQ7XG4gICAgICAgIHN0YXR1c0VsLnRleHRDb250ZW50ID0gJy0nO1xuICAgICAgICBjcmVhdGVkRWwudGV4dENvbnRlbnQgPSAnLSc7XG4gICAgICAgIGxvYWRMb2dzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBObyBjb250YWluZXIgSUQsIGp1c3Qgc2hvdyBtb2RhbCB3aXRoIGNvbnRhaW5lciBsaXN0XG4gICAgICAgIGxvZ0NvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5TZWxlY3QgYSBjb250YWluZXIgdG8gdmlldyBsb2dzPC9kaXY+JztcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IERDLTA1NTogSE9TVCBKT1VSTkFMRCBMT0cgVklFV0VSID09PT09PT09PT1cbi8vIFN0cmVhbXMgaG9zdCBzZXJ2aWNlIGxvZ3MgKGNhZGR5LCBkYXNoY2FkZHktYXBpLCBkb2NrZXIsIHNzaCwgXHUyMDI2KSB2aWEgdGhlXG4vLyBqb3VybmFsY3RsIGJpbmQtbW91bnQgYWRkZWQgaW4gc3RhcnQuc2guIFNlcnZlci1TZW50IEV2ZW50cyBmb3IgbGl2ZVxuLy8gdGFpbGluZzsgYm91bmRlZCBub24tc3RyZWFtaW5nIHJlYWQgZm9yIGhpc3RvcmljYWwgdmlld3MuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBBbGxvdy1saXN0IG1pcnJvcnMgdGhlIGJhY2tlbmQncyBBTExPV0VEX1VOSVRTIHNvIHRoZSBkcm9wZG93biBzdGF5c1xuICAvLyBob25lc3Qgd2hlbiB0aGUgYmluZC1tb3VudCBpc24ndCBhdmFpbGFibGUuIFRoZSBzZXJ2ZXIgaXMgc3RpbGwgdGhlXG4gIC8vIHNvdXJjZSBvZiB0cnV0aCBcdTIwMTQgYW55dGhpbmcgbm90IGluIGl0cyBhbGxvdy1saXN0IHJldHVybnMgNDAwLlxuICBjb25zdCBVTklUX1BSRVNFVFMgPSBbXG4gICAgeyB1bml0OiAnY2FkZHknLCAgICAgICAgICBsYWJlbDogJ0NhZGR5IChyZXZlcnNlIHByb3h5KScgfSxcbiAgICB7IHVuaXQ6ICdkYXNoY2FkZHktYXBpJywgIGxhYmVsOiAnRGFzaENhZGR5IEFQSSAoaG9zdCBzeXN0ZW1kIHVuaXQsIG5vdCB0aGlzIGNvbnRhaW5lciknIH0sXG4gICAgeyB1bml0OiAnZG9ja2VyJywgICAgICAgICBsYWJlbDogJ0RvY2tlciBkYWVtb24nIH0sXG4gICAgeyB1bml0OiAnc3NoJywgICAgICAgICAgICBsYWJlbDogJ1NTSCBzZXJ2ZXInIH0sXG4gICAgeyB1bml0OiAnc3lzdGVtZC1qb3VybmFsZCcsIGxhYmVsOiAnc3lzdGVtZC1qb3VybmFsZCcgfSxcbiAgICB7IHVuaXQ6ICd0YWlsc2NhbGVkJywgICAgIGxhYmVsOiAnVGFpbHNjYWxlJyB9LFxuICAgIHsgdW5pdDogJ25ldHdvcmtkLWRpc3BhdGNoZXInLCBsYWJlbDogJ05ldHdvcmtkIGRpc3BhdGNoZXInIH0sXG4gIF07XG5cbiAgaW5qZWN0TW9kYWwoJ2pvdXJuYWxkLW1vZGFsJywgYFxuICAgIDxkaXYgaWQ9XCJqb3VybmFsZC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiIHN0eWxlPVwiei1pbmRleDogMTAwMjtcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogOTAwcHg7IG1heC13aWR0aDogOTV2dzsgaGVpZ2h0OiA4MHZoOyBkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9ncy1oZWFkZXJcIiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgcGFkZGluZy1ib3R0b206IDEycHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDMgc3R5bGU9XCJtYXJnaW46IDA7XCI+XHVEODNEXHVERUYwXHVGRTBGIEhvc3QgTG9ncyAoam91cm5hbGQpPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIiBzdHlsZT1cIm1hcmdpbjogNHB4IDAgMCAwOyBmb250LXNpemU6IDAuODVyZW07IG9wYWNpdHk6IDAuNztcIj5cbiAgICAgICAgICAgICAgU3RyZWFtIGhvc3Qgc2VydmljZSBsb2dzIGZyb20gPGNvZGU+am91cm5hbGN0bDwvY29kZT4gKHJlYWQtb25seSBtb3VudCkuIERvY2tlciBjb250YWluZXIgbG9ncyBhcmUgc3RpbGwgaW4gdGhlIDxlbT5Db250YWluZXIgTG9nczwvZW0+IG1vZGFsLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWNvbnRyb2xzXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwOyBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1wiPlxuICAgICAgICAgICAgPHNlbGVjdCBpZD1cImpkLXVuaXQtc2VsZWN0XCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IG1pbi13aWR0aDogMjIwcHg7XCI+PC9zZWxlY3Q+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImpkLXNlYXJjaFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGxvZ3MuLi5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgd2lkdGg6IDE2MHB4O1wiIC8+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiamQtdGFpbFwiIG1pbj1cIjFcIiBtYXg9XCI1MDAwXCIgdmFsdWU9XCIyMDBcIiB0aXRsZT1cIkxpbmVzIHRvIGxvYWQgKGhpc3RvcmljYWwgdmlldylcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgd2lkdGg6IDkwcHg7XCIgLz5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1yZWZyZXNoXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlx1RDgzRFx1REQwNCBMb2FkIHRhaWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1zdHJlYW1cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XHUyNUI2IFN0cmVhbTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImpkLWNsZWFyLXNlYXJjaFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiB0aXRsZT1cIkNsZWFyIHNlYXJjaFwiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImpkLWNsb3NlXCIgY2xhc3M9XCJjbG9zZS1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4O1wiPlx1MjcxNTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwiamQtbWV0YVwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiAxNnB4OyBtYXJnaW4tYm90dG9tOiAxMnB4OyBwYWRkaW5nOiA4cHggMTJweDsgYmFja2dyb3VuZDogdmFyKC0tYmctc2Vjb25kYXJ5LCB2YXIoLS1iZykpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44MnJlbTsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgIDxzcGFuPjxzdHJvbmc+U291cmNlOjwvc3Ryb25nPiA8c3BhbiBpZD1cImpkLXNvdXJjZVwiPmpvdXJuYWxkPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj48c3Ryb25nPlVuaXQ6PC9zdHJvbmc+IDxzcGFuIGlkPVwiamQtdW5pdC1kaXNwbGF5XCI+LTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PHN0cm9uZz5TdHJlYW06PC9zdHJvbmc+IDxzcGFuIGlkPVwiamQtc3RyZWFtLXN0YXRlXCI+ZGlzY29ubmVjdGVkPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cImpkLWNvbnRlbnRcIiBjbGFzcz1cImxvZ3MtY29udGVudCBzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJmbGV4OiAxOyBtaW4taGVpZ2h0OiAwOyBiYWNrZ3JvdW5kOiAjMWExYTFhOyBib3JkZXItcmFkaXVzOiA2cHg7IHBhZGRpbmc6IDEycHg7IGZvbnQtZmFtaWx5OiAnTW9uYWNvJywgJ01lbmxvJywgJ1VidW50dSBNb25vJywgbW9ub3NwYWNlOyBmb250LXNpemU6IDAuNzhyZW07IG92ZXJmbG93OiBhdXRvO1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5TZWxlY3QgYSB1bml0IGFuZCBjbGljayA8ZW0+TG9hZCB0YWlsPC9lbT4gb3IgPGVtPlN0cmVhbTwvZW0+LjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmctdG9wOiAxMnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiamQtbGluZS1jb3VudFwiPjAgbGluZXM8L3NwYW4+XG4gICAgICAgICAgICA8c3Bhbj58PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gaWQ9XCJqZC1maWx0ZXItY291bnRcIj4wIHNob3duPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4+fDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiamQtb3ZlcmZsb3dcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IGNvbG9yOiB2YXIoLS13YXJuLWZnLCAjZmJiZjI0KTtcIj5cdTI2QTAgc3RyZWFtIG92ZXJmbG93IFx1MjAxNCByZS1sb2FkIHdpdGggbmFycm93ZXIgd2luZG93PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJqZC1jbG9zZS1idG5cIiBjbGFzcz1cImJ0bi1zZWNvbmRhcnlcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgKTtcblxuICBjb25zdCBtb2RhbCAgICAgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnam91cm5hbGQtbW9kYWwnKTtcbiAgY29uc3QgdW5pdFNlbGVjdCAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXVuaXQtc2VsZWN0Jyk7XG4gIGNvbnN0IHNlYXJjaElucHV0ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1zZWFyY2gnKTtcbiAgY29uc3QgdGFpbElucHV0ICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXRhaWwnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXJlZnJlc2gnKTtcbiAgY29uc3Qgc3RyZWFtQnRuICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXN0cmVhbScpO1xuICBjb25zdCBjbGVhclNlYXJjaCAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtY2xlYXItc2VhcmNoJyk7XG4gIGNvbnN0IGNsb3NlQnRuICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1jbG9zZScpO1xuICBjb25zdCBjbG9zZUJ0bjIgICAgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnamQtY2xvc2UtYnRuJyk7XG4gIGNvbnN0IGNvbnRlbnQgICAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1jb250ZW50Jyk7XG4gIGNvbnN0IGxpbmVDb3VudCAgICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1saW5lLWNvdW50Jyk7XG4gIGNvbnN0IGZpbHRlckNvdW50ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC1maWx0ZXItY291bnQnKTtcbiAgY29uc3Qgb3ZlcmZsb3dIaW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLW92ZXJmbG93Jyk7XG4gIGNvbnN0IHVuaXREaXNwbGF5ICA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqZC11bml0LWRpc3BsYXknKTtcbiAgY29uc3Qgc3RyZWFtU3RhdGUgID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2pkLXN0cmVhbS1zdGF0ZScpO1xuXG4gIGxldCBhdmFpbGFibGUgPSBmYWxzZTsgICAgIC8vIC92YXIvbG9nL2pvdXJuYWwgbW91bnRlZD9cbiAgbGV0IGxpbmVzID0gW107ICAgICAgICAgICAgLy8gY3VycmVudCBidWZmZXIgKGFycmF5IG9mIHt0aW1lc3RhbXAsIHVuaXQsIHRleHR9KVxuICBsZXQgc3RyZWFtaW5nID0gZmFsc2U7XG4gIGxldCBldmVudFNvdXJjZSA9IG51bGw7XG4gIGxldCBzZWFyY2hUaW1lciA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZXNjYXBlSHRtbChzKSB7XG4gICAgLy8gTG9jYWwgcmUtZGVjbGFyYXRpb24gc28gd2UgZG9uJ3QgZGVwZW5kIG9uIGEgZ2xvYmFsOyBzYW1lIHNlbWFudGljc1xuICAgIC8vIGFzIHRoZSBoZWxwZXIgdXNlZCBieSBjb250YWluZXItbG9ncy5qcyBhbmQgZXJyb3ItbG9ncy5qcy5cbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSBTdHJpbmcocyk7XG4gICAgcmV0dXJuIGRpdi5pbm5lckhUTUw7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRBdmFpbGFibGUoaXNBdmFpbGFibGUpIHtcbiAgICBhdmFpbGFibGUgPSBpc0F2YWlsYWJsZTtcbiAgICB1bml0U2VsZWN0LmlubmVySFRNTCA9ICcnO1xuICAgIFVOSVRfUFJFU0VUUy5mb3JFYWNoKHAgPT4ge1xuICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7XG4gICAgICBvcHQudmFsdWUgPSBwLnVuaXQ7XG4gICAgICBvcHQudGV4dENvbnRlbnQgPSBwLmxhYmVsICsgJyAoJyArIHAudW5pdCArICcpJztcbiAgICAgIHVuaXRTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICB9KTtcbiAgICB1bml0U2VsZWN0LmRpc2FibGVkID0gIWlzQXZhaWxhYmxlO1xuICAgIGlmICghaXNBdmFpbGFibGUpIHtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5qb3VybmFsZCBiaW5kLW1vdW50IG5vdCBhdmFpbGFibGUgaW4gdGhpcyBjb250YWluZXIuPGJyLz48c21hbGw+UmVxdWlyZXMgPGNvZGU+L3Zhci9sb2cvam91cm5hbDwvY29kZT4gKyA8Y29kZT4vdXNyL2Jpbi9qb3VybmFsY3RsPC9jb2RlPiBtb3VudGVkIChzdGFydC5zaCkuPC9zbWFsbD48L2Rpdj4nO1xuICAgICAgcmVmcmVzaEJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICBzdHJlYW1CdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZWZyZXNoQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBzdHJlYW1CdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBwcm9iZUF2YWlsYWJsZSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2xvZ3Mvam91cm5hbC91bml0cycpO1xuICAgICAgaWYgKCFyZXNwLm9rKSB7IHNldEF2YWlsYWJsZShmYWxzZSk7IHJldHVybjsgfVxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgc2V0QXZhaWxhYmxlKCEhZGF0YS5hdmFpbGFibGUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNldEF2YWlsYWJsZShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyTGluZXMoKSB7XG4gICAgY29uc3QgdGVybSA9IChzZWFyY2hJbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgZmlsdGVyZWQgPSB0ZXJtID8gbGluZXMuZmlsdGVyKGwgPT4gKGwudGV4dENvbnRlbnQgfHwgJycpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkpIDogbGluZXM7XG4gICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4O1wiPk5vIGVudHJpZXMnICsgKHRlcm0gPyBgIG1hdGNoaW5nICZxdW90OyR7ZXNjYXBlSHRtbCh0ZXJtKX0mcXVvdDtgIDogJycpICsgJzwvZGl2Pic7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGh0bWwgPSBmaWx0ZXJlZC5tYXAobGluZSA9PiB7XG4gICAgICAgIGNvbnN0IHRzID0gbGluZS50aW1lc3RhbXAgPyBlc2NhcGVIdG1sKGxpbmUudGltZXN0YW1wKSA6ICdcdTIwMTQnO1xuICAgICAgICBjb25zdCB0ID0gZXNjYXBlSHRtbChsaW5lLnRleHRDb250ZW50KTtcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiamQtbGluZVwiIHN0eWxlPVwicGFkZGluZzogMXB4IDA7IGxpbmUtaGVpZ2h0OiAxLjQ7IGNvbG9yOiAjZDRkNGQ0O1wiPjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXJpZ2h0OiA4cHg7XCI+JHt0c308L3NwYW4+JHt0fTwvZGl2PmA7XG4gICAgICB9KS5qb2luKCcnKTtcbiAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIC8vIEF1dG8tc2Nyb2xsIG9ubHkgaWYgdXNlciBpcyBhbHJlYWR5IGF0IHRoZSBib3R0b20gKGRvbid0IGZpZ2h0IHRoZW0pLlxuICAgICAgY29uc3QgbmVhckJvdHRvbSA9IGNvbnRlbnQuc2Nyb2xsSGVpZ2h0IC0gY29udGVudC5zY3JvbGxUb3AgLSBjb250ZW50LmNsaWVudEhlaWdodCA8IDgwO1xuICAgICAgaWYgKG5lYXJCb3R0b20pIGNvbnRlbnQuc2Nyb2xsVG9wID0gY29udGVudC5zY3JvbGxIZWlnaHQ7XG4gICAgfVxuICAgIGxpbmVDb3VudC50ZXh0Q29udGVudCA9IGAke2xpbmVzLmxlbmd0aH0gZW50cmllc2A7XG4gICAgZmlsdGVyQ291bnQudGV4dENvbnRlbnQgPSB0ZXJtID8gYCR7ZmlsdGVyZWQubGVuZ3RofSBvZiAke2xpbmVzLmxlbmd0aH0gc2hvd25gIDogYCR7bGluZXMubGVuZ3RofSBzaG93bmA7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkVGFpbCgpIHtcbiAgICBpZiAoIWF2YWlsYWJsZSkgcmV0dXJuO1xuICAgIHN0b3BTdHJlYW0oKTtcbiAgICBjb25zdCB1bml0ID0gdW5pdFNlbGVjdC52YWx1ZTtcbiAgICBpZiAoIXVuaXQpIHJldHVybjtcbiAgICBjb25zdCB0YWlsID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oNTAwMCwgTnVtYmVyKHRhaWxJbnB1dC52YWx1ZSkgfHwgMjAwKSk7XG4gICAgY29uc3QgdGVybSA9IChzZWFyY2hJbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+JztcbiAgICB0cnkge1xuICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCgnL2FwaS92MS9sb2dzL2pvdXJuYWwnLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICAgIHVybC5zZWFyY2hQYXJhbXMuc2V0KCd1bml0JywgdW5pdCk7XG4gICAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndGFpbCcsIFN0cmluZyh0YWlsKSk7XG4gICAgICBpZiAodGVybSkgdXJsLnNlYXJjaFBhcmFtcy5zZXQoJ3NlYXJjaCcsIHRlcm0pO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybC50b1N0cmluZygpKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlmICghcmVzcC5vayB8fCAhZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnRlbnQuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJsb2dzLWxvYWRpbmdcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDQwcHg7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbCgoZGF0YSAmJiBkYXRhLmVycm9yKSB8fCAoJ0hUVFAgJyArIHJlc3Auc3RhdHVzKSkgKyAnPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdW5pdERpc3BsYXkudGV4dENvbnRlbnQgPSB1bml0O1xuICAgICAgbGluZXMgPSAoZGF0YS5lbnRyaWVzIHx8IFtdKS5tYXAoZSA9PiAoe1xuICAgICAgICB0aW1lc3RhbXA6IGUudGltZXN0YW1wLFxuICAgICAgICB1bml0OiBlLnVuaXQsXG4gICAgICAgIHRleHRDb250ZW50OiBlLnRleHQgfHwgJycsXG4gICAgICB9KSk7XG4gICAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHJlbmRlckxpbmVzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGVudC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cImxvZ3MtbG9hZGluZ1wiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZywgI2VmNDQ0NCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDtcIj5FcnJvcjogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXJ0U3RyZWFtKCkge1xuICAgIGlmICghYXZhaWxhYmxlKSByZXR1cm47XG4gICAgc3RvcFN0cmVhbSgpO1xuICAgIGNvbnN0IHVuaXQgPSB1bml0U2VsZWN0LnZhbHVlO1xuICAgIGlmICghdW5pdCkgcmV0dXJuO1xuICAgIGNvbnN0IHRlcm0gPSAoc2VhcmNoSW5wdXQudmFsdWUgfHwgJycpLnRyaW0oKTtcbiAgICB1bml0RGlzcGxheS50ZXh0Q29udGVudCA9IHVuaXQ7XG4gICAgc3RyZWFtQnRuLnRleHRDb250ZW50ID0gJ1x1MjNGOCBTdG9wJztcbiAgICBzdHJlYW1CdG4uY2xhc3NMaXN0LmFkZCgnc3RyZWFtaW5nJyk7XG4gICAgc3RyZWFtU3RhdGUudGV4dENvbnRlbnQgPSAnc3RyZWFtaW5nJztcbiAgICBzdHJlYW1TdGF0ZS5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZywgIzRhZGU4MCknO1xuICAgIGxpbmVzID0gW107XG4gICAgcmVuZGVyTGluZXMoKTtcbiAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKCcvYXBpL3YxL2xvZ3Mvam91cm5hbC9zdHJlYW0nLCB3aW5kb3cubG9jYXRpb24ub3JpZ2luKTtcbiAgICB1cmwuc2VhcmNoUGFyYW1zLnNldCgndW5pdCcsIHVuaXQpO1xuICAgIGlmICh0ZXJtKSB1cmwuc2VhcmNoUGFyYW1zLnNldCgnc2VhcmNoJywgdGVybSk7XG4gICAgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsLnRvU3RyaW5nKCkpO1xuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IChldikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSBKU09OLnBhcnNlKGV2LmRhdGEpO1xuICAgICAgICBpZiAoZW50cnkuZXJyb3IpIHtcbiAgICAgICAgICAvLyBPdmVyZmxvdyAvIHZhbGlkYXRpb24gLyBiaW5kLW1vdW50IGVycm9yc1xuICAgICAgICAgIGlmICgvc3RyZWFtIChleGNlZWRlZHxsaW5lIGNhcCkvLnRlc3QoZW50cnkuZXJyb3IpKSB7XG4gICAgICAgICAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICAgICAgc3RvcFN0cmVhbSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250ZW50LmlubmVySFRNTCArPSAnPGRpdiBjbGFzcz1cImpkLWxpbmVcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcsICNlZjQ0NDQpOyBwYWRkaW5nOiA0cHggMDtcIj5cdTI2QTAgJyArIGVzY2FwZUh0bWwoZW50cnkuZXJyb3IpICsgJzwvZGl2Pic7XG4gICAgICAgICAgY29udGVudC5zY3JvbGxUb3AgPSBjb250ZW50LnNjcm9sbEhlaWdodDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGluZXMucHVzaCh7XG4gICAgICAgICAgdGltZXN0YW1wOiBlbnRyeS50aW1lc3RhbXAsXG4gICAgICAgICAgdW5pdDogZW50cnkudW5pdCB8fCB1bml0LFxuICAgICAgICAgIHRleHRDb250ZW50OiBlbnRyeS50ZXh0IHx8ICcnLFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gSGFyZCBjYXAgdG8ga2VlcCBtZW1vcnkgYm91bmRlZCBpZiBvcGVyYXRvciBzdHJlYW1zIGZvcmV2ZXIuXG4gICAgICAgIGlmIChsaW5lcy5sZW5ndGggPiA1MDAwKSB7XG4gICAgICAgICAgbGluZXMgPSBsaW5lcy5zbGljZShsaW5lcy5sZW5ndGggLSA1MDAwKTtcbiAgICAgICAgICBvdmVyZmxvd0hpbnQuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHJlbmRlckxpbmVzKCk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIC8vIElnbm9yZSBtYWxmb3JtZWQgZXZlbnRzOyB0aGUgc2VydmVyIGlzIGF1dGhvcml0YXRpdmUuXG4gICAgICB9XG4gICAgfTtcbiAgICBldmVudFNvdXJjZS5vbmVycm9yID0gKCkgPT4ge1xuICAgICAgLy8gRXZlbnRTb3VyY2UgYXV0by1yZWNvbm5lY3RzOyBtYXJrIHRyYW5zaWVudCBpZiB3ZSB3ZXJlIGV4cGVjdGluZ1xuICAgICAgLy8gbW9yZSwgb3RoZXJ3aXNlIHdlIGNsb3NlZCBpdCBkZWxpYmVyYXRlbHkuXG4gICAgICBpZiAoIXN0cmVhbWluZykgcmV0dXJuO1xuICAgIH07XG4gICAgc3RyZWFtaW5nID0gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0b3BTdHJlYW0oKSB7XG4gICAgc3RyZWFtaW5nID0gZmFsc2U7XG4gICAgaWYgKGV2ZW50U291cmNlKSB7XG4gICAgICB0cnkgeyBldmVudFNvdXJjZS5jbG9zZSgpOyB9IGNhdGNoIChfKSB7IC8qIGlnbm9yZSAqLyB9XG4gICAgICBldmVudFNvdXJjZSA9IG51bGw7XG4gICAgfVxuICAgIHN0cmVhbUJ0bi50ZXh0Q29udGVudCA9ICdcdTI1QjYgU3RyZWFtJztcbiAgICBzdHJlYW1CdG4uY2xhc3NMaXN0LnJlbW92ZSgnc3RyZWFtaW5nJyk7XG4gICAgc3RyZWFtU3RhdGUudGV4dENvbnRlbnQgPSAnZGlzY29ubmVjdGVkJztcbiAgICBzdHJlYW1TdGF0ZS5zdHlsZS5jb2xvciA9ICd2YXIoLS1tdXRlZCknO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xvc2UoKSB7XG4gICAgc3RvcFN0cmVhbSgpO1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfVxuXG4gIC8vIFdpcmUgZXZlbnRzXG4gIHJlZnJlc2hCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkVGFpbCk7XG4gIHN0cmVhbUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN0cmVhbWluZyA/IHN0b3BTdHJlYW0oKSA6IHN0YXJ0U3RyZWFtKCkpO1xuICBjbGVhclNlYXJjaC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgc2VhcmNoSW5wdXQudmFsdWUgPSAnJzsgcmVuZGVyTGluZXMoKTsgfSk7XG4gIHNlYXJjaElucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dChzZWFyY2hUaW1lcik7XG4gICAgc2VhcmNoVGltZXIgPSBzZXRUaW1lb3V0KHJlbmRlckxpbmVzLCAyMDApO1xuICB9KTtcbiAgc2VhcmNoSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRXNjYXBlJykgeyBzZWFyY2hJbnB1dC52YWx1ZSA9ICcnOyByZW5kZXJMaW5lcygpOyB9XG4gIH0pO1xuICBjbG9zZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlKTtcbiAgY2xvc2VCdG4yLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2UpO1xuICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIGNsb3NlKCk7IH0pO1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICBpZiAoZS5rZXkgPT09ICdFc2NhcGUnICYmIG1vZGFsLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSBjbG9zZSgpO1xuICB9KTtcbiAgLy8gUmVsb2FkIHRhaWwgYXV0b21hdGljYWxseSB3aGVuIHRoZSB1bml0IGRyb3Bkb3duIGNoYW5nZXMgKGlmIHdlIGhhdmVcbiAgLy8gZGF0YSBhbHJlYWR5IFx1MjAxNCBzYXZlcyBhIGNsaWNrKS5cbiAgdW5pdFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaWYgKGxpbmVzLmxlbmd0aCA+IDApIGxvYWRUYWlsKCk7XG4gIH0pO1xuXG4gIC8vIEhvb2sgaW50byB0aGUgZXhpc3RpbmcgXCJDb250YWluZXIgTG9nc1wiIG1vZGFsIGJ1dHRvbiBzbyBvcGVyYXRvcnMgZ2V0IGFcbiAgLy8gc2VwYXJhdGUgZW50cnkgcG9pbnQ7IG1pcnJvciB0aGUgb3BlbkNvbnRhaW5lckxvZ3NNb2RhbCBwYXR0ZXJuLlxuICBmdW5jdGlvbiBvcGVuSm91cm5hbGRNb2RhbCgpIHtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgcHJvYmVBdmFpbGFibGUoKTtcbiAgfVxuICB3aW5kb3cub3BlbkpvdXJuYWxkTW9kYWwgPSBvcGVuSm91cm5hbGRNb2RhbDtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndmlldy1qb3VybmFsZC1sb2dzJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgb3BlbkpvdXJuYWxkTW9kYWwpO1xufSkoKTs7XG4vLyA9PT09PT09PT09IENPTlRBSU5FUiBTTkFQU0hPVCAvIENIRUNLUE9JTlQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnc25hcHNob3QtbW9kYWwnLCBgPGRpdiBpZD1cInNuYXBzaG90LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA3MDBweDsgbWF4LXdpZHRoOiA4NTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQkUgQ29udGFpbmVyIFNuYXBzaG90czwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIENyZWF0ZSBhbmQgbWFuYWdlIERvY2tlciBjb250YWluZXIgY2hlY2twb2ludHMgZm9yIGluc3RhbnQgc3RhdGUgcmVjb3ZlcnkuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1jb250YWluZXItc2VsZWN0LXdyYXBwZXJcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5TZWxlY3QgQ29udGFpbmVyOjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJzbmFwc2hvdC1jb250YWluZXItc2VsZWN0XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogOHB4IDEycHg7IG1hcmdpbi10b3A6IDRweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZWxlY3QgYSBjb250YWluZXIgLS08L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cInNuYXBzaG90LWRldGFpbHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi1ib3R0b206IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1ob3Zlcik7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+SW1hZ2U6PC9zcGFuPiA8c3BhbiBpZD1cInNuYXBzaG90LWltYWdlXCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlN0YXR1czo8L3NwYW4+IDxzcGFuIGlkPVwic25hcHNob3Qtc3RhdHVzXCI+PC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNyZWF0ZWQ6PC9zcGFuPiA8c3BhbiBpZD1cInNuYXBzaG90LWNyZWF0ZWRcIj48L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q29udGFpbmVyIElEOjwvc3Bhbj4gPHNwYW4gaWQ9XCJzbmFwc2hvdC1pZFwiIHN0eWxlPVwiZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj48L3NwYW4+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJzbmFwc2hvdC1jcmVhdGVcIj5DcmVhdGUgU25hcHNob3Q8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJzbmFwc2hvdC1saXN0XCI+TWFuYWdlIFNuYXBzaG90czwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1jcmVhdGVcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb24gYWN0aXZlXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5TbmFwc2hvdCBOYW1lOjwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJzbmFwc2hvdC1uYW1lXCIgcGxhY2Vob2xkZXI9XCJlLmcuLCBiZWZvcmUtdXBkYXRlLTIwMjRcIiBcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMnB4OyBtYXJnaW4tdG9wOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuOXJlbTsgYm94LXNpemluZzogYm9yZGVyLWJveDtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNuYXBzaG90LWxlYXZlLXJ1bm5pbmdcIiBjaGVja2VkIC8+XG4gICAgICAgICAgICBMZWF2ZSBjb250YWluZXIgcnVubmluZyBhZnRlciBjaGVja3BvaW50IChyZXN1bWUgd2l0aG91dCByZXN0YXJ0KVxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIGlkPVwic25hcHNob3QtY3JlYXRlLWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7XCI+XHVEODNEXHVEQ0JFIENyZWF0ZSBTbmFwc2hvdDwvYnV0dG9uPlxuICAgICAgICA8ZGl2IGlkPVwic25hcHNob3QtY3JlYXRlLXN0YXR1c1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cInNuYXBzaG90LWxpc3RcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzbmFwc2hvdC1saXN0LWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogMzAwcHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0JFPC9zcGFuPlNlbGVjdCBhIGNvbnRhaW5lciB0byB2aWV3IGl0cyBzbmFwc2hvdHM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzbmFwc2hvdC1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1idG4nKTtcbiAgY29uc3QgY2xvc2VCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtY2xvc2UnKTtcbiAgY29uc3QgY29udGFpbmVyU2VsZWN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWNvbnRhaW5lci1zZWxlY3QnKTtcbiAgY29uc3QgZGV0YWlsc0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1kZXRhaWxzJyk7XG4gIGNvbnN0IGNyZWF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGUtYnRuJyk7XG4gIGNvbnN0IGNyZWF0ZVN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGUtc3RhdHVzJyk7XG5cbiAgbGV0IGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZENvbnRhaW5lcnMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2NvbnRhaW5lcnMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MgfHwgIWRhdGEuY29udGFpbmVycykgcmV0dXJuO1xuICAgICAgXG4gICAgICBjb250YWluZXJTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj4tLSBTZWxlY3QgYSBjb250YWluZXIgLS08L29wdGlvbj4nO1xuICAgICAgZm9yIChjb25zdCBjIG9mIGRhdGEuY29udGFpbmVycykge1xuICAgICAgICBjb25zdCBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvcHRpb24nKTtcbiAgICAgICAgb3B0LnZhbHVlID0gYy5pZDtcbiAgICAgICAgb3B0LnRleHRDb250ZW50ID0gYCR7Yy5uYW1lIHx8IGMuaWR9ICgke2MuaW1hZ2UgfHwgJ3Vua25vd24nfSlgO1xuICAgICAgICBvcHQuZGF0YXNldC5uYW1lID0gYy5uYW1lO1xuICAgICAgICBvcHQuZGF0YXNldC5pbWFnZSA9IGMuaW1hZ2U7XG4gICAgICAgIG9wdC5kYXRhc2V0LnN0YXR1cyA9IGMuc3RhdHVzO1xuICAgICAgICBvcHQuZGF0YXNldC5jcmVhdGVkID0gYy5jcmVhdGVkO1xuICAgICAgICBjb250YWluZXJTZWxlY3QuYXBwZW5kQ2hpbGQob3B0KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBjb250YWluZXJzOicsIGUpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dDb250YWluZXJEZXRhaWxzKG9wdCkge1xuICAgIGlmICghb3B0IHx8ICFvcHQudmFsdWUpIHtcbiAgICAgIGRldGFpbHNEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGN1cnJlbnRDb250YWluZXJJZCA9IG9wdC52YWx1ZTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtaW1hZ2UnKS50ZXh0Q29udGVudCA9IG9wdC5kYXRhc2V0LmltYWdlIHx8ICctJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3Qtc3RhdHVzJykudGV4dENvbnRlbnQgPSBvcHQuZGF0YXNldC5zdGF0dXMgfHwgJy0nO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1jcmVhdGVkJykudGV4dENvbnRlbnQgPSBvcHQuZGF0YXNldC5jcmVhdGVkID8gbmV3IERhdGUob3B0LmRhdGFzZXQuY3JlYXRlZCAqIDEwMDApLnRvTG9jYWxlU3RyaW5nKCkgOiAnLSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWlkJykudGV4dENvbnRlbnQgPSBvcHQudmFsdWUuc3Vic3RyaW5nKDAsIDEyKTtcbiAgICBkZXRhaWxzRGl2LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNuYXBzaG90KCkge1xuICAgIGlmICghY3VycmVudENvbnRhaW5lcklkKSB7XG4gICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSAnUGxlYXNlIHNlbGVjdCBhIGNvbnRhaW5lciBmaXJzdCc7XG4gICAgICBjcmVhdGVTdGF0dXMuc3R5bGUuY29sb3IgPSAndmFyKC0tYmFkLWZnKSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc25hcHNob3QtbmFtZScpLnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNyZWF0ZVN0YXR1cy50ZXh0Q29udGVudCA9ICdQbGVhc2UgZW50ZXIgYSBzbmFwc2hvdCBuYW1lJztcbiAgICAgIGNyZWF0ZVN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGVhdmVSdW5uaW5nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NuYXBzaG90LWxlYXZlLXJ1bm5pbmcnKS5jaGVja2VkO1xuICAgIFxuICAgIGNyZWF0ZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgY3JlYXRlQnRuLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nLi4uJztcbiAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSAnJztcbiAgICBcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvY29udGFpbmVycy8ke2VuY29kZVVSSUNvbXBvbmVudChjdXJyZW50Q29udGFpbmVySWQpfS9jaGVja3BvaW50YCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgbmFtZSwgbGVhdmVSdW5uaW5nIH0pXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzEzIFNuYXBzaG90IFwiJHtuYW1lfVwiIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5YDtcbiAgICAgICAgY3JlYXRlU3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbmFwc2hvdC1uYW1lJykudmFsdWUgPSAnJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNyZWF0ZVN0YXR1cy50ZXh0Q29udGVudCA9IGBcdTI3MTcgRmFpbGVkOiAke2RhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3InfWA7XG4gICAgICAgIGNyZWF0ZVN0YXR1cy5zdHlsZS5jb2xvciA9ICd2YXIoLS1iYWQtZmcpJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjcmVhdGVTdGF0dXMudGV4dENvbnRlbnQgPSBgXHUyNzE3IEVycm9yOiAke2UubWVzc2FnZX1gO1xuICAgICAgY3JlYXRlU3RhdHVzLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGNyZWF0ZUJ0bi50ZXh0Q29udGVudCA9ICdcdUQ4M0RcdURDQkUgQ3JlYXRlIFNuYXBzaG90JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuTW9kYWwoKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRDb250YWluZXJzKCk7XG4gIH1cblxuICBmdW5jdGlvbiBjbG9zZU1vZGFsKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBkZXRhaWxzRGl2LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgY3VycmVudENvbnRhaW5lcklkID0gbnVsbDtcbiAgICBjb250YWluZXJTZWxlY3Quc2VsZWN0ZWRJbmRleCA9IDA7XG4gIH1cblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5Nb2RhbCk7XG4gIGNsb3NlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpO1xuICB3aXJlTW9kYWwobW9kYWwsIGNsb3NlQnRuKTtcbiAgXG4gIGNvbnRhaW5lclNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGUpID0+IHtcbiAgICBjb25zdCBvcHQgPSBjb250YWluZXJTZWxlY3Qub3B0aW9uc1tjb250YWluZXJTZWxlY3Quc2VsZWN0ZWRJbmRleF07XG4gICAgc2hvd0NvbnRhaW5lckRldGFpbHMob3B0KTtcbiAgfSk7XG4gIFxuICBjcmVhdGVCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY3JlYXRlU25hcHNob3QpO1xuICBcbiAgLy8gVGFiIHN3aXRjaGluZ1xuICBtb2RhbD8ucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXRhYicpLmZvckVhY2godGFiID0+IHtcbiAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcucGFuZWwtdGFiJykuZm9yRWFjaCh0ID0+IHQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnBhbmVsLXNlY3Rpb24nKS5mb3JFYWNoKHMgPT4gcy5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICB0YWIuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICBtb2RhbC5xdWVyeVNlbGVjdG9yKGAjJHt0YWIuZGF0YXNldC5wYW5lbH1gKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICB9KTtcbiAgfSk7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBTTUFSVCBBUlIgQ09OTkVDVCA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGluamVjdE1vZGFsKCdhcnItc2V0dXAtbW9kYWwnLCBgPGRpdiBpZD1cImFyci1zZXR1cC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjAwcHg7IG1heC13aWR0aDogNzIwcHg7XCI+XG4gICAgICA8aDM+XHVEODNDXHVERkFDIFNtYXJ0IEFyciBDb25uZWN0PC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTZweDsgZm9udC1zaXplOiAwLjlyZW07XCI+XG4gICAgICAgIEF1dG8tZGlzY292ZXIgYW5kIGNvbm5lY3QgeW91ciBlbnRpcmUgbWVkaWEgc3RhY2suXG4gICAgICA8L3A+XG5cbiAgICAgIDwhLS0gUGhhc2UgMTogRGV0ZWN0aW9uIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLWRldGVjdFwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZGlzcGxheTogaW5saW5lLWJsb2NrO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjlyZW07XCI+U2Nhbm5pbmcgZm9yIHNlcnZpY2VzLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic21hcnQtZGV0ZWN0LXJlc3VsdHNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQaGFzZSAyOiBDcmVkZW50aWFsIElucHV0IChvbmx5IGZvciBzZXJ2aWNlcyBuZWVkaW5nIGtleXMpIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLWNyZWRlbnRpYWxzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8aDQgY2xhc3M9XCJoZWFkaW5nLWFjY2VudC1zZWN0aW9uXCI+RW50ZXIgTWlzc2luZyBBUEkgS2V5czwvaDQ+XG4gICAgICAgIDxkaXYgaWQ9XCJzbWFydC1jcmVkZW50aWFsLWlucHV0c1wiPjwvZGl2PlxuXG4gICAgICAgIDwhLS0gQ29ubmVjdGlvbiBPcHRpb25zIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDEwcHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+Q29ubmVjdGlvbiBPcHRpb25zPC9oND5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJvcHRpb24tbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNtYXJ0LW9wdC1zZWVyclwiIGNoZWNrZWQgY2xhc3M9XCJjaGVja2JveC1zbVwiIC8+XG4gICAgICAgICAgICBDb25maWd1cmUgU2VlcnIgd2l0aCBSYWRhcnIgKyBTb25hcnJcbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cIm9wdGlvbi1sYWJlbFwiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic21hcnQtb3B0LXBsZXhcIiBjaGVja2VkIGNsYXNzPVwiY2hlY2tib3gtc21cIiAvPlxuICAgICAgICAgICAgQ29ubmVjdCBQbGV4IHRvIFNlZXJyXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJvcHRpb24tbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInNtYXJ0LW9wdC1wcm93bGFyclwiIGNoZWNrZWQgY2xhc3M9XCJjaGVja2JveC1zbVwiIC8+XG4gICAgICAgICAgICBDb25uZWN0IFByb3dsYXJyIHRvIFJhZGFyciArIFNvbmFyclxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic21hcnQtb3B0LXNhdmVcIiBjaGVja2VkIGNsYXNzPVwiY2hlY2tib3gtc21cIiAvPlxuICAgICAgICAgICAgU2F2ZSBBUEkga2V5cyBmb3Igb25lLWNsaWNrIHJlY29ubmVjdFxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b24gaWQ9XCJzbWFydC1jb25uZWN0LWJ0blwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNlNzRjM2MgMCUsICM5YjU5YjYgMTAwJSk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIFNtYXJ0IENvbm5lY3RcbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBQaGFzZSAzOiBDb25uZWN0aW9uIFByb2dyZXNzIC0tPlxuICAgICAgPGRpdiBpZD1cInNtYXJ0LXBoYXNlLXByb2dyZXNzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICA8aDQgY2xhc3M9XCJoZWFkaW5nLWFjY2VudC1zZWN0aW9uXCI+Q29ubmVjdGluZyBFdmVyeXRoaW5nLi4uPC9oND5cbiAgICAgICAgPGRpdiBpZD1cInNtYXJ0LXByb2dyZXNzLXN0ZXBzXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDZweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFBoYXNlIDQ6IFJlc3VsdHMgLS0+XG4gICAgICA8ZGl2IGlkPVwic21hcnQtcGhhc2UtcmVzdWx0c1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cInNtYXJ0LXJlc3VsdHMtY29udGVudFwiPjwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic21hcnQtcGxleC1saWJyYXJpZXNcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgbWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic21hcnQtcmV0cnktYnRuXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBmbGV4OiAxOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiAjZjM5YzEyOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDUwMDsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBSZXRyeSBGYWlsZWQgU3RlcHNcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YSBpZD1cInNtYXJ0LW9wZW4tc2VlcnJcIiBocmVmPVwiI1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgIHN0eWxlPVwiZmxleDogMTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHdoaXRlOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7IHRleHQtYWxpZ246IGNlbnRlcjtcIj5cbiAgICAgICAgICAgIE9wZW4gU2VlcnJcbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gSGVscCBUZXh0IC0tPlxuICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWFjY2VudCkgNSUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICA8c3Ryb25nPldoZXJlIHRvIGZpbmQgQVBJIGtleXM6PC9zdHJvbmc+PGJyPlxuICAgICAgICBSYWRhcnIvU29uYXJyL1Byb3dsYXJyOiBTZXR0aW5ncyAtPiBHZW5lcmFsIC0+IFNlY3VyaXR5IC0+IEFQSSBLZXlcbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENsb3NlIEJ1dHRvbiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXJyLXNldHVwLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXJyLXNldHVwLWNhbmNlbCcpO1xuICBjb25zdCBjb25uZWN0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LWNvbm5lY3QtYnRuJyk7XG5cbiAgLy8gUGhhc2UgZWxlbWVudHNcbiAgY29uc3QgcGhhc2VEZXRlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtZGV0ZWN0Jyk7XG4gIGNvbnN0IHBoYXNlQ3JlZGVudGlhbHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtY3JlZGVudGlhbHMnKTtcbiAgY29uc3QgcGhhc2VQcm9ncmVzcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1waGFzZS1wcm9ncmVzcycpO1xuICBjb25zdCBwaGFzZVJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtcGhhc2UtcmVzdWx0cycpO1xuXG4gIGNvbnN0IGRldGVjdFJlc3VsdHMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc21hcnQtZGV0ZWN0LXJlc3VsdHMnKTtcbiAgY29uc3QgY3JlZGVudGlhbElucHV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1jcmVkZW50aWFsLWlucHV0cycpO1xuICBjb25zdCBwcm9ncmVzc1N0ZXBzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXByb2dyZXNzLXN0ZXBzJyk7XG4gIGNvbnN0IHJlc3VsdHNDb250ZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXJlc3VsdHMtY29udGVudCcpO1xuICBjb25zdCBwbGV4TGlicmFyaWVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXBsZXgtbGlicmFyaWVzJyk7XG4gIGNvbnN0IHJldHJ5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LXJldHJ5LWJ0bicpO1xuXG4gIGxldCBkZXRlY3RlZERhdGEgPSBudWxsOyAvLyBTdG9yZSBkZXRlY3Rpb24gcmVzdWx0cyBmb3Igc21hcnQtY29ubmVjdFxuXG4gIGNvbnN0IHNlcnZpY2VJY29ucyA9IHsgcGxleDogJ1x1RDgzQ1x1REZBQycsIHJhZGFycjogJ1x1RDgzQ1x1REZBQycsIHNvbmFycjogJ1x1RDgzRFx1RENGQScsIHByb3dsYXJyOiAnXHVEODNEXHVERDBEJywgc2VlcnI6ICdcdUQ4M0RcdURDQ0InIH07XG4gIGNvbnN0IHNlcnZpY2VMYWJlbHMgPSB7IHBsZXg6ICdQbGV4JywgcmFkYXJyOiAnUmFkYXJyIChNb3ZpZXMpJywgc29uYXJyOiAnU29uYXJyIChUViknLCBwcm93bGFycjogJ1Byb3dsYXJyIChJbmRleGVycyknLCBzZWVycjogJ1NlZXJyJyB9O1xuXG4gIGZ1bmN0aW9uIHNob3dQaGFzZShwaGFzZSkge1xuICAgIHBoYXNlRGV0ZWN0LnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ2RldGVjdCcgPyAnYmxvY2snIDogJ25vbmUnO1xuICAgIHBoYXNlQ3JlZGVudGlhbHMuc3R5bGUuZGlzcGxheSA9IHBoYXNlID09PSAnY3JlZGVudGlhbHMnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICBwaGFzZVByb2dyZXNzLnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ3Byb2dyZXNzJyA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgcGhhc2VSZXN1bHRzLnN0eWxlLmRpc3BsYXkgPSBwaGFzZSA9PT0gJ3Jlc3VsdHMnID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHN0YXR1c0JhZGdlKHN0YXR1cykge1xuICAgIGNvbnN0IGNvbG9ycyA9IHtcbiAgICAgIGNvbm5lY3RlZDogeyBiZzogJ3ZhcigtLW9rLWZnKScsIGljb246ICcmIzEwMDAzOycsIHRleHQ6ICdDb25uZWN0ZWQnIH0sXG4gICAgICBuZWVkc19rZXk6IHsgYmc6ICcjZjM5YzEyJywgaWNvbjogJyYjMTI4MjczOycsIHRleHQ6ICdOZWVkcyBBUEkgS2V5JyB9LFxuICAgICAgbm90X2ZvdW5kOiB7IGJnOiAndmFyKC0tbXV0ZWQpJywgaWNvbjogJyZtZGFzaDsnLCB0ZXh0OiAnTm90IEZvdW5kJyB9LFxuICAgICAgZXJyb3I6IHsgYmc6ICd2YXIoLS1iYWQtZmcpJywgaWNvbjogJyYjMTAwMDc7JywgdGV4dDogJ0Vycm9yJyB9XG4gICAgfTtcbiAgICBjb25zdCBjID0gY29sb3JzW3N0YXR1c10gfHwgY29sb3JzLm5vdF9mb3VuZDtcbiAgICByZXR1cm4gYDxzcGFuIHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNHB4OyBwYWRkaW5nOiAycHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7Yy5iZ30gMjAlLCB0cmFuc3BhcmVudCk7IGNvbG9yOiAke2MuYmd9O1wiPiR7Yy5pY29ufSAke2MudGV4dH08L3NwYW4+YDtcbiAgfVxuXG4gIC8vIFBoYXNlIDE6IFNtYXJ0IERldGVjdGlvblxuICBhc3luYyBmdW5jdGlvbiBzbWFydERldGVjdCgpIHtcbiAgICBzaG93UGhhc2UoJ2RldGVjdCcpO1xuICAgIGRldGVjdFJlc3VsdHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2Fyci9zbWFydC1kZXRlY3QnKTtcbiAgICAgIGRldGVjdGVkRGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcblxuICAgICAgaWYgKCFkZXRlY3RlZERhdGEuc3VjY2Vzcykge1xuICAgICAgICBkZXRlY3RSZXN1bHRzLmlubmVySFRNTCA9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RGV0ZWN0aW9uIGZhaWxlZDogJHtlc2NhcGVIdG1sKGRldGVjdGVkRGF0YS5lcnJvcil9PC9kaXY+YDtcbiAgICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW5kZXIgZGV0ZWN0aW9uIHJlc3VsdHNcbiAgICAgIGxldCBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDtcIj4nO1xuXG4gICAgICBmb3IgKGNvbnN0IFtzdmMsIGluZm9dIG9mIE9iamVjdC5lbnRyaWVzKGRldGVjdGVkRGF0YS5zZXJ2aWNlcykpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHNlcnZpY2VJY29uc1tzdmNdIHx8ICdcdUQ4M0RcdURDRTYnO1xuICAgICAgICBjb25zdCBsYWJlbCA9IHNlcnZpY2VMYWJlbHNbc3ZjXSB8fCBzdmM7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGluZm8uc291cmNlID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBhZGRpbmc6IDFweCA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXItcmFkaXVzOiAzcHg7XCI+JHtlc2NhcGVIdG1sKGluZm8uc291cmNlKX08L3NwYW4+YCA6ICcnO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gaW5mby52ZXJzaW9uID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+diR7ZXNjYXBlSHRtbChpbmZvLnZlcnNpb24pfTwvc3Bhbj5gIDogJyc7XG4gICAgICAgIGNvbnN0IGtleVNhdmVkID0gKGluZm8uaGFzQXBpS2V5IHx8IGluZm8uaGFzVG9rZW4pICYmIGluZm8uc3RhdHVzID09PSAnY29ubmVjdGVkJ1xuICAgICAgICAgID8gJzxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjdyZW07IGNvbG9yOiB2YXIoLS1vay1mZyk7XCI+S2V5IHNhdmVkPC9zcGFuPicgOiAnJztcblxuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxMHB4OyBwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZsZXg6IDE7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JHtsYWJlbH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZmxleC13cmFwOiB3cmFwO1wiPlxuICAgICAgICAgICAgICAke3NvdXJjZX0gJHt2ZXJzaW9ufSAke2tleVNhdmVkfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgJHtzdGF0dXNCYWRnZShpbmZvLnN0YXR1cyl9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICAgIC8vIFN1bW1hcnlcbiAgICAgIGNvbnN0IHMgPSBkZXRlY3RlZERhdGEuc3VtbWFyeTtcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgJHtlc2NhcGVIdG1sKFN0cmluZyhzLmZ1bGx5Q29ubmVjdGVkKSl9LyR7ZXNjYXBlSHRtbChTdHJpbmcocy50b3RhbERldGVjdGVkICsgKDUgLSBzLnRvdGFsRGV0ZWN0ZWQpKSl9IHNlcnZpY2VzIGRldGVjdGVkICZtaWRkb3Q7XG4gICAgICAgICR7ZXNjYXBlSHRtbChTdHJpbmcocy5mdWxseUNvbm5lY3RlZCkpfSBjb25uZWN0ZWQke3MubmVlZHNBcGlLZXkgPiAwID8gYCAmbWlkZG90OyA8c3Ryb25nPiR7ZXNjYXBlSHRtbChTdHJpbmcocy5uZWVkc0FwaUtleSkpfSBuZWVkcyBBUEkga2V5PC9zdHJvbmc+YCA6ICcnfVxuICAgICAgPC9kaXY+YDtcblxuICAgICAgZGV0ZWN0UmVzdWx0cy5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgLy8gQnVpbGQgY3JlZGVudGlhbCBpbnB1dHMgZm9yIHNlcnZpY2VzIHRoYXQgbmVlZCBrZXlzXG4gICAgICBidWlsZENyZWRlbnRpYWxJbnB1dHMoZGV0ZWN0ZWREYXRhKTtcblxuICAgICAgLy8gQXV0by1hZHZhbmNlIGFmdGVyIGEgc2hvcnQgZGVsYXlcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzaG93UGhhc2UoJ2NyZWRlbnRpYWxzJyk7XG4gICAgICB9LCA4MDApO1xuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGV0ZWN0UmVzdWx0cy5pbm5lckhUTUwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgICAgZGV0ZWN0UmVzdWx0cy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB9XG4gIH1cblxuICAvLyBCdWlsZCBjcmVkZW50aWFsIGlucHV0IGZpZWxkc1xuICBmdW5jdGlvbiBidWlsZENyZWRlbnRpYWxJbnB1dHMoZGF0YSkge1xuICAgIGxldCBodG1sID0gJyc7XG4gICAgY29uc3Qgc2VydmljZXMgPSBkYXRhLnNlcnZpY2VzO1xuICAgIGNvbnN0IGFyclNlcnZpY2VzID0gWydyYWRhcnInLCAnc29uYXJyJywgJ3Byb3dsYXJyJ107XG5cbiAgICBmb3IgKGNvbnN0IHN2YyBvZiBhcnJTZXJ2aWNlcykge1xuICAgICAgY29uc3QgaW5mbyA9IHNlcnZpY2VzW3N2Y107XG4gICAgICBpZiAoIWluZm8gfHwgaW5mby5zdGF0dXMgPT09ICdub3RfZm91bmQnICYmICFpbmZvLnVybCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGljb24gPSBzZXJ2aWNlSWNvbnNbc3ZjXTtcbiAgICAgIGNvbnN0IGxhYmVsID0gc2VydmljZUxhYmVsc1tzdmNdO1xuICAgICAgY29uc3QgaXNDb25uZWN0ZWQgPSBpbmZvLnN0YXR1cyA9PT0gJ2Nvbm5lY3RlZCc7XG4gICAgICBjb25zdCBib3JkZXJDb2xvciA9IGlzQ29ubmVjdGVkID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYm9yZGVyKSc7XG5cbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7Ym9yZGVyQ29sb3J9O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7aWNvbn08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPiR7bGFiZWx9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGlkPVwic21hcnQtJHtzdmN9LXN0YXR1c1wiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IGF1dG87IGZvbnQtc2l6ZTogMC43NXJlbTtcIj5cbiAgICAgICAgICAgICR7aXNDb25uZWN0ZWQgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7IENvbm5lY3RlZDwvc3Bhbj4nIDogJyd9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5VUkw6PC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwic21hcnQtJHtzdmN9LXVybFwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGluZm8udXJsIHx8ICcnKX1cIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vc2VlZGJveC5jb20vJHtzdmN9L1wiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgZm9udC1zaXplOiAwLjg1cmVtOyBwYWRkaW5nOiA2cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5BUEkgS2V5OjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgaWQ9XCJzbWFydC0ke3N2Y30ta2V5XCIgcGxhY2Vob2xkZXI9XCIke2lzQ29ubmVjdGVkID8gJyhzYXZlZCknIDogJ1Bhc3RlIEFQSSBrZXknfVwiXG4gICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgZm9udC1zaXplOiAwLjg1cmVtOyBwYWRkaW5nOiA2cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uIG9uY2xpY2s9XCJzbWFydFRlc3RDb25uZWN0aW9uKCcke3N2Y30nKVwiIHN0eWxlPVwibWFyZ2luLXRvcDogOHB4OyBwYWRkaW5nOiA0cHggMTJweDsgZm9udC1zaXplOiAwLjc1cmVtOyBjdXJzb3I6IHBvaW50ZXI7XCI+VGVzdDwvYnV0dG9uPlxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICAvLyBQbGV4IHN0YXR1cyAobm9uLWVkaXRhYmxlLCBqdXN0IHNob3dzIHN0YXR1cylcbiAgICBjb25zdCBwbGV4ID0gc2VydmljZXMucGxleDtcbiAgICBpZiAocGxleCkge1xuICAgICAgY29uc3QgcGxleENvbm5lY3RlZCA9IHBsZXguc3RhdHVzID09PSAnY29ubmVjdGVkJztcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgJHtwbGV4Q29ubmVjdGVkID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYm9yZGVyKSd9OyBtYXJnaW4tYm90dG9tOiAxMHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTtcIj5cdUQ4M0NcdURGQUM8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPlBsZXg8L3NwYW4+XG4gICAgICAgICAgJHtzdGF0dXNCYWRnZShwbGV4LnN0YXR1cyl9XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbChwbGV4LnNvdXJjZSB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuXG4gICAgLy8gU2VlcnIgc3RhdHVzXG4gICAgY29uc3Qgc2VlcnIgPSBzZXJ2aWNlcy5zZWVycjtcbiAgICBpZiAoc2VlcnIpIHtcbiAgICAgIGNvbnN0IHNlZXJyT2sgPSBzZWVyci5zdGF0dXMgPT09ICdjb25uZWN0ZWQnO1xuICAgICAgbGV0IGNvbmZpZ3VyZWRIdG1sID0gJyc7XG4gICAgICBpZiAoc2VlcnIuY29uZmlndXJlZFNlcnZpY2VzKSB7XG4gICAgICAgIGNvbnN0IGNzID0gc2VlcnIuY29uZmlndXJlZFNlcnZpY2VzO1xuICAgICAgICBjb25maWd1cmVkSHRtbCA9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+XG4gICAgICAgICAgQ29uZmlndXJlZDogJHtjcy5yYWRhcnIgPyAnJiMxMDAwMzsgUmFkYXJyJyA6ICcmIzEwMDA3OyBSYWRhcnInfSAmbWlkZG90O1xuICAgICAgICAgICR7Y3Muc29uYXJyID8gJyYjMTAwMDM7IFNvbmFycicgOiAnJiMxMDAwNzsgU29uYXJyJ30gJm1pZGRvdDtcbiAgICAgICAgICAke2NzLnBsZXggPyAnJiMxMDAwMzsgUGxleCcgOiAnJiMxMDAwNzsgUGxleCd9XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7c2VlcnJPayA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJvcmRlciknfTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAxLjFyZW07XCI+XHVEODNEXHVEQ0NCPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDUwMDtcIj5TZWVycjwvc3Bhbj5cbiAgICAgICAgICAke3N0YXR1c0JhZGdlKHNlZXJyLnN0YXR1cyl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke2NvbmZpZ3VyZWRIdG1sfVxuICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICBjcmVkZW50aWFsSW5wdXRzLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICAvLyBUZXN0IGNvbm5lY3Rpb24gKGdsb2JhbCBmb3Igb25jbGljaylcbiAgd2luZG93LnNtYXJ0VGVzdENvbm5lY3Rpb24gPSBhc3luYyBmdW5jdGlvbihzZXJ2aWNlKSB7XG4gICAgY29uc3QgdXJsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc21hcnQtJHtzZXJ2aWNlfS11cmxgKTtcbiAgICBjb25zdCBrZXlJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3NlcnZpY2V9LWtleWApO1xuICAgIGNvbnN0IHN0YXR1c1NwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgc21hcnQtJHtzZXJ2aWNlfS1zdGF0dXNgKTtcblxuICAgIGNvbnN0IHVybCA9IHVybElucHV0Py52YWx1ZS50cmltKCk7XG4gICAgY29uc3QgYXBpS2V5ID0ga2V5SW5wdXQ/LnZhbHVlLnRyaW0oKTtcblxuICAgIGlmICghdXJsIHx8ICFhcGlLZXkpIHtcbiAgICAgIHN0YXR1c1NwYW4uaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RW50ZXIgVVJMIGFuZCBBUEkga2V5PC9zcGFuPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hcnIvdGVzdC1jb25uZWN0aW9uJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgc2VydmljZSwgdXJsLCBhcGlLZXkgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc3RhdHVzU3Bhbi5pbm5lckhUTUwgPSBgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7ICR7ZXNjYXBlSHRtbChkYXRhLmFwcE5hbWUgfHwgJ0Nvbm5lY3RlZCcpfSB2JHtlc2NhcGVIdG1sKGRhdGEudmVyc2lvbiB8fCAnJyl9PC9zcGFuPmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0dXNTcGFuLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7ICR7ZXNjYXBlSHRtbChkYXRhLmVycm9yKX08L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGF0dXNTcGFuLmlubmVySFRNTCA9IGA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvc3Bhbj5gO1xuICAgIH1cbiAgfTtcblxuICAvLyBQaGFzZSAzOiBTbWFydCBDb25uZWN0XG4gIGFzeW5jIGZ1bmN0aW9uIHNtYXJ0Q29ubmVjdCgpIHtcbiAgICBzaG93UGhhc2UoJ3Byb2dyZXNzJyk7XG4gICAgcHJvZ3Jlc3NTdGVwcy5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+PGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDhweDtcIj5Db25uZWN0aW5nIHNlcnZpY2VzLi4uPC9kaXY+PC9kaXY+JztcblxuICAgIC8vIEdhdGhlciBpbnB1dFxuICAgIGNvbnN0IHNlcnZpY2VzID0ge307XG4gICAgZm9yIChjb25zdCBzdmMgb2YgWydyYWRhcnInLCAnc29uYXJyJywgJ3Byb3dsYXJyJ10pIHtcbiAgICAgIGNvbnN0IHVybCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3N2Y30tdXJsYCk/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGNvbnN0IGFwaUtleSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBzbWFydC0ke3N2Y30ta2V5YCk/LnZhbHVlLnRyaW0oKTtcbiAgICAgIGlmIChhcGlLZXkgJiYgdXJsKSB7XG4gICAgICAgIHNlcnZpY2VzW3N2Y10gPSB7IGFwaUtleSwgdXJsIH07XG4gICAgICB9IGVsc2UgaWYgKGFwaUtleSkge1xuICAgICAgICAvLyBLZXkgcHJvdmlkZWQgd2l0aG91dCBVUkwgLSBsZXQgYmFja2VuZCByZXNvbHZlXG4gICAgICAgIHNlcnZpY2VzW3N2Y10gPSB7IGFwaUtleSB9O1xuICAgICAgfVxuICAgICAgLy8gSWYgbm8ga2V5IGVudGVyZWQgYnV0IHNlcnZpY2Ugd2FzIGFscmVhZHkgY29ubmVjdGVkLCBiYWNrZW5kIHVzZXMgc3RvcmVkIGNyZWRlbnRpYWxzXG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIHNlcnZpY2VzOiBPYmplY3Qua2V5cyhzZXJ2aWNlcykubGVuZ3RoID4gMCA/IHNlcnZpY2VzIDogdW5kZWZpbmVkLFxuICAgICAgY29uZmlndXJlUGxleDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1wbGV4Jyk/LmNoZWNrZWQsXG4gICAgICBjb25maWd1cmVQcm93bGFycjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1wcm93bGFycicpPy5jaGVja2VkLFxuICAgICAgY29uZmlndXJlU2VlcnI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzbWFydC1vcHQtc2VlcnInKT8uY2hlY2tlZCxcbiAgICAgIHNhdmVDcmVkZW50aWFsczogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NtYXJ0LW9wdC1zYXZlJyk/LmNoZWNrZWRcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYXJyL3NtYXJ0LWNvbm5lY3QnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZClcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAvLyBSZW5kZXIgcHJvZ3Jlc3Mgc3RlcHNcbiAgICAgIGxldCBzdGVwc0h0bWwgPSAnJztcbiAgICAgIGZvciAoY29uc3Qgc3RlcCBvZiAoZGF0YS5zdGVwcyB8fCBbXSkpIHtcbiAgICAgICAgY29uc3QgaWNvbiA9IHN0ZXAuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7PC9zcGFuPidcbiAgICAgICAgICAgICAgICAgICA6ICc8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiYjMTAwMDc7PC9zcGFuPic7XG4gICAgICAgIGNvbnN0IGRldGFpbENvbG9yID0gc3RlcC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICd2YXIoLS1tdXRlZCknIDogJ3ZhcigtLWJhZC1mZyknO1xuICAgICAgICBzdGVwc0h0bWwgKz0gYDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgcGFkZGluZzogNnB4IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDZweDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgICR7aWNvbn1cbiAgICAgICAgICA8c3Bhbj4ke2VzY2FwZUh0bWwoc3RlcC5zdGVwKX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogJHtkZXRhaWxDb2xvcn07XCI+JHtlc2NhcGVIdG1sKHN0ZXAuZGV0YWlscyB8fCAnJyl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgICAgcHJvZ3Jlc3NTdGVwcy5pbm5lckhUTUwgPSBzdGVwc0h0bWw7XG5cbiAgICAgIC8vIFNob3cgcmVzdWx0cyBhZnRlciBicmllZiBkZWxheVxuICAgICAgc2V0VGltZW91dCgoKSA9PiBzaG93UmVzdWx0cyhkYXRhKSwgNTAwKTtcblxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHByb2dyZXNzU3RlcHMuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5Db25uZWN0aW9uIGVycm9yOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFBoYXNlIDQ6IFJlc3VsdHNcbiAgZnVuY3Rpb24gc2hvd1Jlc3VsdHMoZGF0YSkge1xuICAgIHNob3dQaGFzZSgncmVzdWx0cycpO1xuXG4gICAgY29uc3QgcyA9IGRhdGEuc3VtbWFyeSB8fCB7fTtcbiAgICBjb25zdCBhbGxHb29kID0gcy5mYWlsZWQgPT09IDAgJiYgcy5zdWNjZWVkZWQgPiAwO1xuICAgIGNvbnN0IGhlYWRlckNvbG9yID0gYWxsR29vZCA/ICd2YXIoLS1vay1mZyknIDogJyNmMzljMTInO1xuICAgIGNvbnN0IGhlYWRlckljb24gPSBhbGxHb29kID8gJyYjMTAwMDM7JyA6ICcmIzk4ODg7JztcbiAgICBjb25zdCBoZWFkZXJUZXh0ID0gYWxsR29vZCA/ICdBbGwgQ29ubmVjdGVkIScgOiBgJHtlc2NhcGVIdG1sKFN0cmluZyhzLnN1Y2NlZWRlZCkpfS8ke2VzY2FwZUh0bWwoU3RyaW5nKHMudG90YWxTdGVwcykpfSBTdGVwcyBTdWNjZWVkZWRgO1xuXG4gICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogY29sb3ItbWl4KGluIHNyZ2IsICR7aGVhZGVyQ29sb3J9IDEyJSwgdHJhbnNwYXJlbnQpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAke2hlYWRlckNvbG9yfTsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuNXJlbTsgY29sb3I6ICR7aGVhZGVyQ29sb3J9O1wiPiR7aGVhZGVySWNvbn08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6ICR7aGVhZGVyQ29sb3J9O1wiPiR7aGVhZGVyVGV4dH08L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj4ke2VzY2FwZUh0bWwoU3RyaW5nKHMuc3VjY2VlZGVkKSl9IHN1Y2NlZWRlZCwgJHtlc2NhcGVIdG1sKFN0cmluZyhzLmZhaWxlZCkpfSBmYWlsZWQ8L2Rpdj5cbiAgICA8L2Rpdj5gO1xuXG4gICAgLy8gU3RlcHMgZGV0YWlsXG4gICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNHB4O1wiPic7XG4gICAgZm9yIChjb25zdCBzdGVwIG9mIChkYXRhLnN0ZXBzIHx8IFtdKSkge1xuICAgICAgY29uc3QgaWNvbiA9IHN0ZXAuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiYjMTAwMDM7PC9zcGFuPidcbiAgICAgICAgICAgICAgICAgOiAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj4mIzEwMDA3Ozwvc3Bhbj4nO1xuICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4OyBwYWRkaW5nOiA0cHggOHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cbiAgICAgICAgJHtpY29ufSAke2VzY2FwZUh0bWwoc3RlcC5zdGVwKX0gPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogYXV0bzsgY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjc1cmVtO1wiPiR7ZXNjYXBlSHRtbChzdGVwLmRldGFpbHMgfHwgJycpfTwvc3Bhbj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfVxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICByZXN1bHRzQ29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgLy8gU2hvdyByZXRyeSBidXR0b24gaWYgYW55IGZhaWx1cmVzXG4gICAgcmV0cnlCdG4uc3R5bGUuZGlzcGxheSA9IHMuZmFpbGVkID4gMCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAvLyBGZXRjaCBQbGV4IGxpYnJhcmllcyBpZiBQbGV4IHdhcyBjb25uZWN0ZWRcbiAgICBpZiAoZGF0YS5zdGVwcz8uc29tZShzdCA9PiBzdC5zdGVwLmluY2x1ZGVzKCdQbGV4JykgJiYgc3Quc3RhdHVzID09PSAnc3VjY2VzcycpKSB7XG4gICAgICBmZXRjaFBsZXhMaWJyYXJpZXMoKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFBsZXhMaWJyYXJpZXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3BsZXgvbGlicmFyaWVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5saWJyYXJpZXM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+XHVEODNDXHVERkFDICR7ZXNjYXBlSHRtbChkYXRhLnNlcnZlck5hbWUpfSBMaWJyYXJpZXM8L2g0PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LXdyYXA6IHdyYXA7IGdhcDogOHB4O1wiPmA7XG4gICAgICAgIGZvciAoY29uc3QgbGliIG9mIGRhdGEubGlicmFyaWVzKSB7XG4gICAgICAgICAgY29uc3QgdHlwZUljb24gPSBsaWIudHlwZSA9PT0gJ21vdmllJyA/ICdcdUQ4M0NcdURGQUMnIDogbGliLnR5cGUgPT09ICdzaG93JyA/ICdcdUQ4M0RcdURDRkEnIDogJ1x1RDgzQ1x1REZCNSc7XG4gICAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyLXJhZGl1czogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+XG4gICAgICAgICAgICAke3R5cGVJY29ufSA8c3Ryb25nPiR7ZXNjYXBlSHRtbChsaWIudGl0bGUpfTwvc3Ryb25nPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKFN0cmluZyhsaWIuY291bnQpKX0gaXRlbXM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfVxuICAgICAgICBodG1sICs9ICc8L2Rpdj48L2Rpdj4nO1xuICAgICAgICBwbGV4TGlicmFyaWVzLmlubmVySFRNTCA9IGh0bWw7XG4gICAgICAgIHBsZXhMaWJyYXJpZXMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWdub3JlIFBsZXggbGlicmFyeSBmZXRjaCBlcnJvcnNcbiAgICB9XG4gIH1cblxuICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIHBsZXhMaWJyYXJpZXMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzbWFydERldGVjdCgpO1xuICB9KTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG4gIGNvbm5lY3RCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc21hcnRDb25uZWN0KTtcbiAgcmV0cnlCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgc21hcnRDb25uZWN0KTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IE5PVElGSUNBVElPTiBTRVRUSU5HUyA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcbiAgLy8gSW5qZWN0IG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ25vdGlmaWNhdGlvbnMtbW9kYWwnLCBgPGRpdiBpZD1cIm5vdGlmaWNhdGlvbnMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDU1MHB4OyBtYXgtd2lkdGg6IDY1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1REQxNCBOb3RpZmljYXRpb24gU2V0dGluZ3M8L2gzPlxuXG4gICAgICA8IS0tIE1hc3RlciBUb2dnbGUgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiYWNjZW50LWluZm8tYm94XCI+XG4gICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogMTBweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm5vdGlmaWNhdGlvbnMtZW5hYmxlZFwiIC8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgY29sb3I6IHZhcigtLWFjY2VudCk7XCI+RW5hYmxlIE5vdGlmaWNhdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10aW55LW11dGVkXCI+UmVjZWl2ZSBhbGVydHMgd2hlbiBjb250YWluZXJzIGdvIHVwL2Rvd248L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFByb3ZpZGVycyBTZWN0aW9uIC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+Tm90aWZpY2F0aW9uIFByb3ZpZGVyczwvaDQ+XG5cbiAgICAgIDwhLS0gRGlzY29yZCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb24tcHJvdmlkZXIgcHJvdmlkZXItY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvdmlkZXItaGVhZGVyXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIj5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImRpc2NvcmQtZW5hYmxlZFwiIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ3LTUwMFwiPkRpc2NvcmQ8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGlzY29yZC10ZXN0XCIgY2xhc3M9XCJ0ZXN0LWJ0biBidG4teHNcIj5UZXN0PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZGlzY29yZC1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5XZWJob29rIFVSTDo8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZGlzY29yZC13ZWJob29rXCIgcGxhY2Vob2xkZXI9XCJodHRwczovL2Rpc2NvcmQuY29tL2FwaS92MS93ZWJob29rcy8uLi5cIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGVsZWdyYW0gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ0ZWxlZ3JhbS1lbmFibGVkXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+VGVsZWdyYW08L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwidGVsZWdyYW0tdGVzdFwiIGNsYXNzPVwidGVzdC1idG4gYnRuLXhzXCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInRlbGVncmFtLWNvbmZpZ1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZC0yY29sXCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPkJvdCBUb2tlbjo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRlbGVncmFtLWJvdC10b2tlblwiIHBsYWNlaG9sZGVyPVwiMTIzNDU2OkFCQy4uLlwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+Q2hhdCBJRDo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInRlbGVncmFtLWNoYXQtaWRcIiBwbGFjZWhvbGRlcj1cIi0xMDAxMjM0NTY3ODkwXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIG50Znkuc2ggLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJudGZ5LWVuYWJsZWRcIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdy01MDBcIj5udGZ5LnNoPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cIm50ZnktdGVzdFwiIGNsYXNzPVwidGVzdC1idG4gYnRuLXhzXCI+VGVzdDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cIm50ZnktY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDJmciAxZnI7IGdhcDogOHB4O1wiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5TZXJ2ZXIgVVJMOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwibnRmeS1zZXJ2ZXJcIiBwbGFjZWhvbGRlcj1cImh0dHBzOi8vbnRmeS5zaFwiIHZhbHVlPVwiaHR0cHM6Ly9udGZ5LnNoXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5Ub3BpYzo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIm50ZnktdG9waWNcIiBwbGFjZWhvbGRlcj1cImRhc2hjYWRkeS1hbGVydHNcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRW1haWwgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwibm90aWZpY2F0aW9uLXByb3ZpZGVyIHByb3ZpZGVyLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb3ZpZGVyLWhlYWRlclwiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsXCI+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJlbWFpbC1lbmFibGVkXCIgLz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+RW1haWwgKFNNVFApPC9zcGFuPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImVtYWlsLXRlc3RcIiBjbGFzcz1cInRlc3QtYnRuIGJ0bi14c1wiPlRlc3Q8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJlbWFpbC1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogMmZyIDFmcjsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+U01UUCBIb3N0OjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtaG9zdFwiIHBsYWNlaG9sZGVyPVwic210cC5nbWFpbC5jb21cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlBvcnQ6PC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImVtYWlsLXBvcnRcIiB2YWx1ZT1cIjU4N1wiIHBsYWNlaG9sZGVyPVwiNTg3XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogOHB4OyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlVzZXJuYW1lOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtdXNlclwiIHBsYWNlaG9sZGVyPVwidXNlckBnbWFpbC5jb21cIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlBhc3N3b3JkOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBpZD1cImVtYWlsLXBhc3NcIiBwbGFjZWhvbGRlcj1cImFwcCBwYXNzd29yZFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsLXNtXCI+RnJvbTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImVtYWlsLWZyb21cIiBwbGFjZWhvbGRlcj1cIkRhc2hDYWRkeSAmbHQ7bm9yZXBseUBleGFtcGxlLmNvbSZndDtcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbC1zbVwiPlRvOjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiZW1haWwtdG9cIiBwbGFjZWhvbGRlcj1cImFkbWluQGV4YW1wbGUuY29tXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogNnB4OyBtYXJnaW4tdG9wOiA4cHg7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZW1haWwtc2VjdXJlXCIgLz4gVXNlIFRMUyAocG9ydCA0NjUpXG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIZWFsdGggQ2hlY2sgU2V0dGluZ3MgLS0+XG4gICAgICA8aDQgY2xhc3M9XCJzZWN0aW9uLWhlYWRpbmdcIj5IZWFsdGggTW9uaXRvcmluZzwvaDQ+XG4gICAgICA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7IGN1cnNvcjogcG9pbnRlcjsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJoZWFsdGgtY2hlY2stZW5hYmxlZFwiIC8+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnctNTAwXCI+RW5hYmxlIEhlYWx0aCBNb25pdG9yaW5nPC9zcGFuPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtdGlueS1tdXRlZFwiPlBlcmlvZGljYWxseSBjaGVjayBjb250YWluZXIgc3RhdHVzPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY2hlY2stY29uZmlnXCIgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWwtc21cIj5DaGVjayBpbnRlcnZhbDo8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJoZWFsdGgtY2hlY2staW50ZXJ2YWxcIiBzdHlsZT1cIndpZHRoOiBhdXRvO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjFcIj4xIG1pbnV0ZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjVcIiBzZWxlY3RlZD41IG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIxNVwiPjE1IG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCIzMFwiPjMwIG1pbnV0ZXM8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI2MFwiPjEgaG91cjwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtY2hlY2stbm93XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc1cmVtOyBtYXJnaW4tbGVmdDogYXV0bztcIj5DaGVjayBOb3c8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtY2hlY2stc3RhdHVzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDhweDtcIj5cbiAgICAgICAgICBMYXN0IGNoZWNrOiBOZXZlclxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEV2ZW50IFR5cGVzIC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+RXZlbnRzIHRvIE5vdGlmeTwvaDQ+XG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDZweDsgcGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWNvbnRhaW5lci1kb3duXCIgY2hlY2tlZCAvPiBDb250YWluZXIgRG93blxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWNvbnRhaW5lci11cFwiIGNoZWNrZWQgLz4gQ29udGFpbmVyIFJlY292ZXJlZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWRlcGxveS1zdWNjZXNzXCIgY2hlY2tlZCAvPiBEZXBsb3ltZW50IFN1Y2Nlc3NcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWwtc21cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1kZXBsb3ktZmFpbGVkXCIgY2hlY2tlZCAvPiBEZXBsb3ltZW50IEZhaWxlZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LXNzbC1jZXJ0LWV4cGlyeVwiIGNoZWNrZWQgLz4gU1NMIEV4cGlyeVxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWRucy1wcm9wYWdhdGlvblwiIGNoZWNrZWQgLz4gRE5TIFByb3BhZ2F0aW9uXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtZHJpZnQtZGV0ZWN0ZWRcIiBjaGVja2VkIC8+IENvbmZpZyBEcmlmdFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LWRlcGVuZGVuY3ktcmVzdGFydFwiIGNoZWNrZWQgLz4gRGVwZW5kZW5jeSBSZXN0YXJ0c1xuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LXJlY2lwZS1yZW1vdmVkXCIgY2hlY2tlZCAvPiBSZWNpcGUgUmVtb3ZlZFxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImV2ZW50LXdvcmtmbG93XCIgY2hlY2tlZCAvPiBXb3JrZmxvdyBBY3Rpb25zXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtYmFja3VwLWNvbXBsZXRlXCIgY2hlY2tlZCAvPiBCYWNrdXAgQ29tcGxldGVcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWwtc21cIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1iYWNrdXAtZmFpbGVkXCIgY2hlY2tlZCAvPiBCYWNrdXAgRmFpbGVkXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94LWxhYmVsLXNtXCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiZXZlbnQtdXBkYXRlLWF2YWlsYWJsZVwiIGNoZWNrZWQgLz4gVXBkYXRlc1xuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbC1zbVwiIHN0eWxlPVwiZ3JpZC1jb2x1bW46IDEgLyAtMTtcIj5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJldmVudC1yZXNvdXJjZS1hbGVydFwiIGNoZWNrZWQgLz4gUmVzb3VyY2UgQWxlcnRzXG4gICAgICAgIDwvbGFiZWw+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIaXN0b3J5IC0tPlxuICAgICAgPGg0IGNsYXNzPVwic2VjdGlvbi1oZWFkaW5nXCI+Tm90aWZpY2F0aW9uIEhpc3Rvcnk8L2g0PlxuICAgICAgPGRpdiBpZD1cIm5vdGlmaWNhdGlvbi1oaXN0b3J5XCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAxNTBweDsgb3ZlcmZsb3cteTogYXV0bzsgcGFkZGluZzogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiAyMHB4O1wiPk5vIG5vdGlmaWNhdGlvbnMgeWV0PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgaWQ9XCJsYXN0LW5vdGlmaWNhdGlvbi1zZW50XCIgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgbWFyZ2luLXRvcDogNnB4O1wiPjwvZGl2PlxuXG4gICAgICA8IS0tIEJ1dHRvbnMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cIm5vdGlmaWNhdGlvbnMtc2VuZC10ZXN0XCIgY2xhc3M9XCJidG4tc2Vjb25kYXJ5XCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IGF1dG87XCI+U2VuZCBUZXN0PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJub3RpZmljYXRpb25zLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwibm90aWZpY2F0aW9ucy1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+U2F2ZSBTZXR0aW5nczwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW5hZ2Utbm90aWZpY2F0aW9ucycpO1xuICBjb25zdCBzYXZlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtc2F2ZScpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9ucy1jYW5jZWwnKTtcblxuICAvLyBQcm92aWRlciB0b2dnbGUgaGFuZGxlcnNcbiAgWydkaXNjb3JkJywgJ3RlbGVncmFtJywgJ250ZnknLCAnZW1haWwnXS5mb3JFYWNoKHByb3ZpZGVyID0+IHtcbiAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGAke3Byb3ZpZGVyfS1lbmFibGVkYCk7XG4gICAgY29uc3QgY29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYCR7cHJvdmlkZXJ9LWNvbmZpZ2ApO1xuXG4gICAgY2hlY2tib3g/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgIGNvbmZpZy5zdHlsZS5kaXNwbGF5ID0gY2hlY2tib3guY2hlY2tlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIEhlYWx0aCBjaGVjayB0b2dnbGVcbiAgY29uc3QgaGVhbHRoQ2hlY2tFbmFibGVkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1lbmFibGVkJyk7XG4gIGNvbnN0IGhlYWx0aENoZWNrQ29uZmlnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1jb25maWcnKTtcbiAgaGVhbHRoQ2hlY2tFbmFibGVkPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgaGVhbHRoQ2hlY2tDb25maWcuc3R5bGUub3BhY2l0eSA9IGhlYWx0aENoZWNrRW5hYmxlZC5jaGVja2VkID8gJzEnIDogJzAuNSc7XG4gIH0pO1xuXG4gIC8vIExvYWQgbm90aWZpY2F0aW9uIGNvbmZpZyBmcm9tIEFQSVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTm90aWZpY2F0aW9uQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvY29uZmlnJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIGNvbnN0IGNvbmZpZyA9IGRhdGEuY29uZmlnO1xuXG4gICAgICAgIC8vIE1hc3RlciB0b2dnbGVcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25vdGlmaWNhdGlvbnMtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcuZW5hYmxlZDtcblxuICAgICAgICAvLyBQcm92aWRlcnNcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rpc2NvcmQtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5kaXNjb3JkPy5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy50ZWxlZ3JhbT8uZW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5udGZ5Py5lbmFibGVkIHx8IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZW5hYmxlZCcpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uZW5hYmxlZCB8fCBmYWxzZTtcblxuICAgICAgICAvLyBTaG93L2hpZGUgY29uZmlnIHNlY3Rpb25zXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5kaXNjb3JkPy5lbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy50ZWxlZ3JhbT8uZW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5udGZ5Py5lbmFibGVkID8gJ2Jsb2NrJyA6ICdub25lJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSBjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uZW5hYmxlZCA/ICdibG9jaycgOiAnbm9uZSc7XG5cbiAgICAgICAgLy8gbnRmeSBzZXJ2ZXIgVVJMXG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZXJzPy5udGZ5Py5zZXJ2ZXJVcmwpIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS1zZXJ2ZXInKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMubnRmeS5zZXJ2ZXJVcmw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbWFpbCBmaWVsZHMgXHUyMDE0IERDLTA5MjogcHJlZmlsbCB0aGUgRlVMTCBmb3JtIHNvIGEgc2F2ZSBkb2Vzbid0XG4gICAgICAgIC8vIHNpbGVudGx5IHdpcGUgZmllbGRzIHRoZSBHRVQgcmVzcG9uc2UgcHJldmlvdXNseSBvbWl0dGVkLiBQYXNzd29yZFxuICAgICAgICAvLyBpcyBuZXZlciByZXR1cm5lZDsgd2hlbiBvbmUgaXMgc3RvcmVkIHRoZSBmaWVsZCBzaG93cyBhIGtlZXAtaGludFxuICAgICAgICAvLyBhbmQgYW4gZW1wdHkgc3VibWl0IHByZXNlcnZlcyB0aGUgc3RvcmVkIGNyZWRlbnRpYWwgc2VydmVyLXNpZGUuXG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZXJzPy5lbWFpbD8uaG9zdCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLWhvc3QnKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwuaG9zdDtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5mcm9tKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZnJvbScpLnZhbHVlID0gY29uZmlnLnByb3ZpZGVycy5lbWFpbC5mcm9tO1xuICAgICAgICBpZiAoY29uZmlnLnByb3ZpZGVycz8uZW1haWw/LnRvKSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdG8nKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwudG87XG4gICAgICAgIGlmIChjb25maWcucHJvdmlkZXJzPy5lbWFpbD8ucG9ydCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBvcnQnKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwucG9ydDtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5zZWN1cmUgIT09IHVuZGVmaW5lZCkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXNlY3VyZScpLmNoZWNrZWQgPSBjb25maWcucHJvdmlkZXJzLmVtYWlsLnNlY3VyZSA9PT0gdHJ1ZTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy51c2VybmFtZSkgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXVzZXInKS52YWx1ZSA9IGNvbmZpZy5wcm92aWRlcnMuZW1haWwudXNlcm5hbWU7XG4gICAgICAgIGNvbnN0IGVtYWlsUGFzc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBhc3MnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5wcm92aWRlcnM/LmVtYWlsPy5oYXNQYXNzd29yZCkge1xuICAgICAgICAgIGVtYWlsUGFzc0VsLnZhbHVlID0gJyc7XG4gICAgICAgICAgZW1haWxQYXNzRWwucGxhY2Vob2xkZXIgPSAnc2F2ZWQgXHUyMDE0IGxlYXZlIGJsYW5rIHRvIGtlZXAnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVtYWlsUGFzc0VsLnBsYWNlaG9sZGVyID0gJ2FwcCBwYXNzd29yZCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIZWFsdGggY2hlY2tcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1lbmFibGVkJykuY2hlY2tlZCA9IGNvbmZpZy5oZWFsdGhDaGVjaz8uZW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgICAgaWYgKGNvbmZpZy5oZWFsdGhDaGVjaz8uaW50ZXJ2YWxNaW51dGVzKSB7XG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1pbnRlcnZhbCcpLnZhbHVlID0gY29uZmlnLmhlYWx0aENoZWNrLmludGVydmFsTWludXRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmhlYWx0aENoZWNrPy5sYXN0Q2hlY2spIHtcbiAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLXN0YXR1cycpLnRleHRDb250ZW50ID1cbiAgICAgICAgICAgIGBMYXN0IGNoZWNrOiAke25ldyBEYXRlKGNvbmZpZy5oZWFsdGhDaGVjay5sYXN0Q2hlY2spLnRvTG9jYWxlU3RyaW5nKCl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV2ZW50cyBcdTIwMTQgY2Fub25pY2FsIGtlYmFiLWNhc2Uga2V5cywgbWF0Y2hpbmcgdGhlIGJhY2tlbmQgc3RvcmVcbiAgICAgICAgLy8gKERDLTA5MjogcHJldmlvdXNseSByZWFkIGNhbWVsQ2FzZSBrZXlzIHRoYXQgbmV2ZXIgZXhpc3RlZCwgc29cbiAgICAgICAgLy8gZXZlcnkgdG9nZ2xlIHJlLXJlbmRlcmVkIGFzICdjaGVja2VkJyByZWdhcmRsZXNzIG9mIHN0b3JlZCBzdGF0ZSkuXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1jb250YWluZXItZG93bicpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2NvbnRhaW5lci1kb3duJ10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtY29udGFpbmVyLXVwJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LlsnY29udGFpbmVyLXVwJ10gPT09IHRydWU7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kZXBsb3ktc3VjY2VzcycpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2RlcGxveS1zdWNjZXNzJ10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZGVwbG95LWZhaWxlZCcpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2RlcGxveS1mYWlsZWQnXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1zc2wtY2VydC1leHBpcnknKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydzc2wtY2VydC1leHBpcnknXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kbnMtcHJvcGFnYXRpb24nKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydkbnMtcHJvcGFnYXRpb24nXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kcmlmdC1kZXRlY3RlZCcpLmNoZWNrZWQgPSBjb25maWcuZXZlbnRzPy5bJ2RyaWZ0LWRldGVjdGVkJ10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZGVwZW5kZW5jeS1yZXN0YXJ0JykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LlsnZGVwZW5kZW5jeS1yZXN0YXJ0J10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtcmVjaXBlLXJlbW92ZWQnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydyZWNpcGUtcmVtb3ZlZCddICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LXdvcmtmbG93JykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/Llsnd29ya2Zsb3cnXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1iYWNrdXAtY29tcGxldGUnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydiYWNrdXAtY29tcGxldGUnXSAhPT0gZmFsc2U7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1iYWNrdXAtZmFpbGVkJykuY2hlY2tlZCA9IGNvbmZpZy5ldmVudHM/LlsnYmFja3VwLWZhaWxlZCddICE9PSBmYWxzZTtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LXVwZGF0ZS1hdmFpbGFibGUnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWyd1cGRhdGUtYXZhaWxhYmxlJ10gIT09IGZhbHNlO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtcmVzb3VyY2UtYWxlcnQnKS5jaGVja2VkID0gY29uZmlnLmV2ZW50cz8uWydhbGVydCddICE9PSBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbTm90aWZpY2F0aW9uc10gTG9hZCBDb25maWcnLCBlcnJvciwgeyBmdW5jdGlvbjogJ2xvYWRDb25maWcnIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIExvYWQgbm90aWZpY2F0aW9uIGhpc3RvcnlcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZE5vdGlmaWNhdGlvbkhpc3RvcnkoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy9oaXN0b3J5P2xpbWl0PTEwJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9uLWhpc3RvcnknKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5oaXN0b3J5Py5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBkYXRhLmhpc3RvcnkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShpdGVtLnRpbWVzdGFtcCkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICAgICAgICBjb25zdCB0eXBlQ29sb3JzID0ge1xuICAgICAgICAgICAgc3VjY2VzczogJ3ZhcigtLW9rLWZnKScsXG4gICAgICAgICAgICBlcnJvcjogJ3ZhcigtLWJhZC1mZyknLFxuICAgICAgICAgICAgd2FybmluZzogJyNmMzljMTInLFxuICAgICAgICAgICAgaW5mbzogJ3ZhcigtLWFjY2VudCknXG4gICAgICAgICAgfTtcbiAgICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICR7dHlwZUNvbG9yc1tpdGVtLnR5cGVdIHx8ICd2YXIoLS1tdXRlZCknfVwiPiR7aXRlbS50eXBlID09PSAnc3VjY2VzcycgPyAnXHUyNzEzJyA6IGl0ZW0udHlwZSA9PT0gJ2Vycm9yJyA/ICdcdTI3MTcnIDogJ1x1MjEzOSd9PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTsgbWluLXdpZHRoOiAwO1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyB3aGl0ZS1zcGFjZTogbm93cmFwOyBvdmVyZmxvdzogaGlkZGVuOyB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcIj4ke2VzY2FwZUh0bWwoaXRlbS50aXRsZSl9PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZGF0ZX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICBgO1xuICAgICAgICB9KS5qb2luKCcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogMjBweDtcIj5ObyBub3RpZmljYXRpb25zIHlldDwvZGl2Pic7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignW05vdGlmaWNhdGlvbnNdIExvYWQgSGlzdG9yeScsIGVycm9yLCB7IGZ1bmN0aW9uOiAnbG9hZEhpc3RvcnknIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNhdmUgbm90aWZpY2F0aW9uIGNvbmZpZ1xuICBhc3luYyBmdW5jdGlvbiBzYXZlTm90aWZpY2F0aW9uQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb25zLWVuYWJsZWQnKS5jaGVja2VkLFxuICAgICAgICBwcm92aWRlcnM6IHtcbiAgICAgICAgICBkaXNjb3JkOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGlzY29yZC1lbmFibGVkJykuY2hlY2tlZCxcbiAgICAgICAgICAgIHdlYmhvb2tVcmw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLXdlYmhvb2snKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRlbGVncmFtOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGVsZWdyYW0tZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgICBib3RUb2tlbjogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWJvdC10b2tlbicpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIGNoYXRJZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RlbGVncmFtLWNoYXQtaWQnKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIG50Znk6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdudGZ5LWVuYWJsZWQnKS5jaGVja2VkLFxuICAgICAgICAgICAgc2VydmVyVXJsOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbnRmeS1zZXJ2ZXInKS52YWx1ZS50cmltKCkgfHwgJ2h0dHBzOi8vbnRmeS5zaCcsXG4gICAgICAgICAgICB0b3BpYzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktdG9waWMnKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVtYWlsOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZW5hYmxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgICBob3N0OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtaG9zdCcpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIHBvcnQ6IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlbWFpbC1wb3J0JykudmFsdWUpIHx8IDU4NyxcbiAgICAgICAgICAgIHNlY3VyZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXNlY3VyZScpLmNoZWNrZWQsXG4gICAgICAgICAgICB1c2VybmFtZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXVzZXInKS52YWx1ZS50cmltKCksXG4gICAgICAgICAgICBwYXNzd29yZDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXBhc3MnKS52YWx1ZS50cmltKCksXG4gICAgICAgICAgICBmcm9tOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtZnJvbScpLnZhbHVlLnRyaW0oKSxcbiAgICAgICAgICAgIHRvOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZW1haWwtdG8nKS52YWx1ZS50cmltKClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50czoge1xuICAgICAgICAgICdjb250YWluZXItZG93bic6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1jb250YWluZXItZG93bicpLmNoZWNrZWQsXG4gICAgICAgICAgJ2NvbnRhaW5lci11cCc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1jb250YWluZXItdXAnKS5jaGVja2VkLFxuICAgICAgICAgICdkZXBsb3ktc3VjY2Vzcyc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1kZXBsb3ktc3VjY2VzcycpLmNoZWNrZWQsXG4gICAgICAgICAgJ2RlcGxveS1mYWlsZWQnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZGVwbG95LWZhaWxlZCcpLmNoZWNrZWQsXG4gICAgICAgICAgJ3NzbC1jZXJ0LWV4cGlyeSc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1zc2wtY2VydC1leHBpcnknKS5jaGVja2VkLFxuICAgICAgICAgICdkbnMtcHJvcGFnYXRpb24nOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZG5zLXByb3BhZ2F0aW9uJykuY2hlY2tlZCxcbiAgICAgICAgICAnZHJpZnQtZGV0ZWN0ZWQnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZHJpZnQtZGV0ZWN0ZWQnKS5jaGVja2VkLFxuICAgICAgICAgICdkZXBlbmRlbmN5LXJlc3RhcnQnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtZGVwZW5kZW5jeS1yZXN0YXJ0JykuY2hlY2tlZCxcbiAgICAgICAgICAncmVjaXBlLXJlbW92ZWQnOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXZlbnQtcmVjaXBlLXJlbW92ZWQnKS5jaGVja2VkLFxuICAgICAgICAgICd3b3JrZmxvdyc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC13b3JrZmxvdycpLmNoZWNrZWQsXG4gICAgICAgICAgJ2JhY2t1cC1jb21wbGV0ZSc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1iYWNrdXAtY29tcGxldGUnKS5jaGVja2VkLFxuICAgICAgICAgICdiYWNrdXAtZmFpbGVkJzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LWJhY2t1cC1mYWlsZWQnKS5jaGVja2VkLFxuICAgICAgICAgICd1cGRhdGUtYXZhaWxhYmxlJzogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V2ZW50LXVwZGF0ZS1hdmFpbGFibGUnKS5jaGVja2VkLFxuICAgICAgICAgICdhbGVydCc6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdldmVudC1yZXNvdXJjZS1hbGVydCcpLmNoZWNrZWRcbiAgICAgICAgfSxcbiAgICAgICAgaGVhbHRoQ2hlY2s6IHtcbiAgICAgICAgICBlbmFibGVkOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNoZWNrLWVuYWJsZWQnKS5jaGVja2VkLFxuICAgICAgICAgIGludGVydmFsTWludXRlczogcGFyc2VJbnQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1pbnRlcnZhbCcpLnZhbHVlKSB8fCA1XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy9jb25maWcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoY29uZmlnKVxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ05vdGlmaWNhdGlvbiBzZXR0aW5ncyBzYXZlZCcsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYEZhaWxlZCB0byBzYXZlOiAke2RhdGEuZXJyb3J9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgMzAwMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gVGVzdCBub3RpZmljYXRpb24gaGFuZGxlcnNcbiAgYXN5bmMgZnVuY3Rpb24gdGVzdFByb3ZpZGVyKHByb3ZpZGVyKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbm90aWZpY2F0aW9ucy90ZXN0Jywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHJvdmlkZXIgfSlcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBUZXN0ICR7cHJvdmlkZXJ9IG5vdGlmaWNhdGlvbiBzZW50IWAsICdzdWNjZXNzJywgMzAwMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBUZXN0IGZhaWxlZDogJHtkYXRhLmVycm9yfWAsICdlcnJvcicsIDMwMDApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIDMwMDApO1xuICAgIH1cbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkaXNjb3JkLXRlc3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0ZXN0UHJvdmlkZXIoJ2Rpc2NvcmQnKSk7XG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZWxlZ3JhbS10ZXN0Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGVzdFByb3ZpZGVyKCd0ZWxlZ3JhbScpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ250ZnktdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHRlc3RQcm92aWRlcignbnRmeScpKTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VtYWlsLXRlc3QnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0ZXN0UHJvdmlkZXIoJ2VtYWlsJykpO1xuXG4gIC8vIEhlYWx0aCBjaGVjayBub3cgYnV0dG9uXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtY2hlY2stbm93Jyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL25vdGlmaWNhdGlvbnMvaGVhbHRoLWNoZWNrJywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1zdGF0dXMnKS50ZXh0Q29udGVudCA9XG4gICAgICAgICAgYExhc3QgY2hlY2s6ICR7bmV3IERhdGUoZGF0YS5sYXN0Q2hlY2spLnRvTG9jYWxlU3RyaW5nKCl9ICgke2RhdGEuY29udGFpbmVyc01vbml0b3JlZH0gY29udGFpbmVycylgO1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdIZWFsdGggY2hlY2sgY29tcGxldGVkJywgJ3N1Y2Nlc3MnLCAyMDAwKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbihgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCAzMDAwKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIE1vZGFsIGhhbmRsZXJzXG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkTm90aWZpY2F0aW9uQ29uZmlnKCk7XG4gICAgbG9hZE5vdGlmaWNhdGlvbkhpc3RvcnkoKTtcbiAgfSk7XG5cbiAgc2F2ZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzYXZlTm90aWZpY2F0aW9uQ29uZmlnKTtcblxuICAvLyBTZW5kIFRlc3QgYnV0dG9uIC0gc2VuZHMgdGVzdCBub3RpZmljYXRpb24gdG8gYWxsIGVuYWJsZWQgcHJvdmlkZXJzXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdub3RpZmljYXRpb25zLXNlbmQtdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbm90aWZpY2F0aW9ucy1zZW5kLXRlc3QnKTtcbiAgICBjb25zdCBvcmlnaW5hbFRleHQgPSBidG4udGV4dENvbnRlbnQ7XG4gICAgYnRuLnRleHRDb250ZW50ID0gJ1NlbmRpbmcuLi4nO1xuICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL3NlbmQnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBcbiAgICAgICAgICBldmVudDogJ3Rlc3QnLFxuICAgICAgICAgIGRhdGE6IHsgbWVzc2FnZTogJ1RoaXMgaXMgYSB0ZXN0IG5vdGlmaWNhdGlvbiBmcm9tIERhc2hDYWRkeS4nIH0sXG4gICAgICAgICAgdHlwZTogJ2luZm8nXG4gICAgICAgIH0pXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignVGVzdCBub3RpZmljYXRpb24gc2VudCEnLCAnc3VjY2VzcycsIDMwMDApO1xuICAgICAgICAvLyBVcGRhdGUgbGFzdCBzZW50IHRpbWVzdGFtcFxuICAgICAgICBsb2FkTm90aWZpY2F0aW9uU3RhdHVzKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGBUZXN0IGZhaWxlZDogJHtkYXRhLnJlc3VsdHM/Lm1hcChyID0+IGAke3IucHJvdmlkZXJ9OiAke3IuZXJyb3IgfHwgJ29rJ31gKS5qb2luKCcsICcpfWAsICdlcnJvcicsIDUwMDApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIDMwMDApO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSBvcmlnaW5hbFRleHQ7XG4gICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIExvYWQgbm90aWZpY2F0aW9uIHN0YXR1cyAobGFzdCBzZW50IHRpbWVzdGFtcClcbiAgYXN5bmMgZnVuY3Rpb24gbG9hZE5vdGlmaWNhdGlvblN0YXR1cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9ub3RpZmljYXRpb25zL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5sYXN0U2VudCkge1xuICAgICAgICBjb25zdCBsYXN0U2VudEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xhc3Qtbm90aWZpY2F0aW9uLXNlbnQnKTtcbiAgICAgICAgaWYgKGxhc3RTZW50RWwpIHtcbiAgICAgICAgICBsYXN0U2VudEVsLnRleHRDb250ZW50ID0gYExhc3Qgc2VudDogJHtuZXcgRGF0ZShkYXRhLmxhc3RTZW50KS50b0xvY2FsZVN0cmluZygpfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gU2lsZW50bHkgZmFpbCAtIHN0YXR1cyBpcyBub3QgY3JpdGljYWxcbiAgICB9XG4gIH1cblxuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBQQU5FTCBUQUIgU1dJVENISU5HIChzaGFyZWQgdXRpbGl0eSkgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgY29uc3QgdGFiID0gZS50YXJnZXQuY2xvc2VzdCgnLnBhbmVsLXRhYicpO1xuICAgIGlmICghdGFiKSByZXR1cm47XG4gICAgY29uc3QgcGFuZWxJZCA9IHRhYi5kYXRhc2V0LnBhbmVsO1xuICAgIGlmICghcGFuZWxJZCkgcmV0dXJuO1xuICAgIGNvbnN0IHRhYkJhciA9IHRhYi5jbG9zZXN0KCcucGFuZWwtdGFicycpO1xuICAgIGNvbnN0IG1vZGFsQ29udGVudCA9IHRhYkJhci5jbG9zZXN0KCcud2VhdGhlci1tb2RhbC1jb250ZW50Jyk7XG4gICAgdGFiQmFyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYW5lbC10YWInKS5mb3JFYWNoKHQgPT4gdC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgdGFiLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgIG1vZGFsQ29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGFuZWwtc2VjdGlvbicpLmZvckVhY2gocyA9PiBzLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpKTtcbiAgICBjb25zdCB0YXJnZXQgPSBtb2RhbENvbnRlbnQucXVlcnlTZWxlY3RvcignIycgKyBwYW5lbElkKTtcbiAgICBpZiAodGFyZ2V0KSB0YXJnZXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gVU5JRklFRCBCQUNLVVAvUkVTVE9SRSB2Mi4wID09PT09PT09PT1cbi8vIFNpbmdsZSBmaWxlIGNhcHR1cmVzIGV2ZXJ5dGhpbmc6IHNlcnZlciBjb25maWcgKyBicm93c2VyIHN0YXRlICsgdGhlbWVzICsgZW5jcnlwdGlvbiBrZXlcbihmdW5jdGlvbigpIHtcbiAgLy8gQWxsIERhc2hDYWRkeSBsb2NhbFN0b3JhZ2Uga2V5cyB0byBpbmNsdWRlIGluIGJhY2t1cFxuICB2YXIgQlJPV1NFUl9TVEFURV9LRVlTID0gW1xuICAgICdkYXNoY2FkZHlfc2l0ZV9jb25maWcnLCAnZGFzaGNhZGR5X29uYm9hcmRpbmcnLCAnZGFzaGNhZGR5LWVuY3J5cHRpb24ta2V5JyxcbiAgICAnZGFzaGNhZGR5LXNldHVwJywgJ2Rhc2hjYWRkeS1jb25maWcnLFxuICAgICd0aGVtZScsICd1c2VyLXRoZW1lcycsICdjdXN0b20tdGhlbWUnLFxuICAgICdjdXN0b20tYXBwcycsICdjdXN0b20tc2VydmljZXMnLCAndG9vbGJhci1zZWN0aW9ucycsXG4gICAgJ3dlYXRoZXItbG9jYXRpb24nLCAnd2VhdGhlci16aXAnLCAnd2VhdGhlci1nZW8nLCAnd2VhdGhlci11bml0JyxcbiAgICAnY2xvY2stc3R5bGUnLCAnY2xvY2stY2hpbWVzJywgJ2Nsb2NrLWNoaW1lLXZvbHVtZSdcbiAgXTtcblxuICAvLyBDb2xsZWN0IGFsbCBEYXNoQ2FkZHkgYnJvd3NlciBzdGF0ZSBmcm9tIGxvY2FsU3RvcmFnZVxuICBmdW5jdGlvbiBjb2xsZWN0QnJvd3NlclN0YXRlKCkge1xuICAgIHZhciBzdGF0ZSA9IHt9O1xuICAgIC8vIEdyYWIgYWxsIHdoaXRlbGlzdGVkIGtleXNcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IEJST1dTRVJfU1RBVEVfS0VZUy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IEJST1dTRVJfU1RBVEVfS0VZU1tpXTtcbiAgICAgIHZhciB2YWwgPSBzYWZlR2V0KGtleSk7XG4gICAgICBpZiAodmFsICE9PSBudWxsICYmIHZhbCAhPT0gdW5kZWZpbmVkKSBzdGF0ZVtrZXldID0gdmFsO1xuICAgIH1cbiAgICAvLyBHcmFiIGR5bmFtaWMgd2lkZ2V0LSotZW5hYmxlZCBrZXlzXG4gICAgdHJ5IHtcbiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbG9jYWxTdG9yYWdlLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIHZhciBrID0gbG9jYWxTdG9yYWdlLmtleShqKTtcbiAgICAgICAgaWYgKC9ed2lkZ2V0LS4rLWVuYWJsZWQkLy50ZXN0KGspKSB7XG4gICAgICAgICAgc3RhdGVba10gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgLyogcHJpdmF0ZSBicm93c2luZyAqLyB9XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLy8gUmVzdG9yZSBicm93c2VyIHN0YXRlIGZyb20gYmFja3VwIGludG8gbG9jYWxTdG9yYWdlXG4gIGZ1bmN0aW9uIHJlc3RvcmVCcm93c2VyU3RhdGUoYnJvd3NlclN0YXRlKSB7XG4gICAgaWYgKCFicm93c2VyU3RhdGUgfHwgdHlwZW9mIGJyb3dzZXJTdGF0ZSAhPT0gJ29iamVjdCcpIHJldHVybiAwO1xuICAgIHZhciBjb3VudCA9IDA7XG4gICAgZm9yICh2YXIga2V5IGluIGJyb3dzZXJTdGF0ZSkge1xuICAgICAgaWYgKCFicm93c2VyU3RhdGUuaGFzT3duUHJvcGVydHkoa2V5KSkgY29udGludWU7XG4gICAgICBzYWZlU2V0KGtleSwgYnJvd3NlclN0YXRlW2tleV0pO1xuICAgICAgY291bnQrKztcbiAgICB9XG4gICAgcmV0dXJuIGNvdW50O1xuICB9XG5cbiAgLy8gSGFuZGxlIGxlZ2FjeSB2MS4wLjAgaW1wb3J0LWV4cG9ydCBmb3JtYXQgKHByZS1iYWNrdXAgbW9kYWwpXG4gIGZ1bmN0aW9uIGlzTGVnYWN5Rm9ybWF0KGRhdGEpIHtcbiAgICByZXR1cm4gZGF0YS52ZXJzaW9uICYmICFkYXRhLmZpbGVzICYmIGRhdGEuc2VydmljZXM7XG4gIH1cblxuICBmdW5jdGlvbiByZXN0b3JlTGVnYWN5Rm9ybWF0KGRhdGEpIHtcbiAgICAvLyBNYXAgdGhlIG9sZCBmbGF0IGtleXMgaW50byBicm93c2VyU3RhdGUgZm9yIGxvY2FsU3RvcmFnZSByZXN0b3JlXG4gICAgdmFyIGJyb3dzZXJTdGF0ZSA9IHt9O1xuICAgIGlmIChkYXRhLmN1c3RvbVNlcnZpY2VzKSBicm93c2VyU3RhdGVbJ2N1c3RvbS1zZXJ2aWNlcyddID0gSlNPTi5zdHJpbmdpZnkoZGF0YS5jdXN0b21TZXJ2aWNlcyk7XG4gICAgaWYgKGRhdGEuY3VzdG9tQXBwcykgYnJvd3NlclN0YXRlWydjdXN0b20tYXBwcyddID0gSlNPTi5zdHJpbmdpZnkoZGF0YS5jdXN0b21BcHBzKTtcbiAgICBpZiAoZGF0YS53ZWF0aGVyWmlwKSBicm93c2VyU3RhdGVbJ3dlYXRoZXItemlwJ10gPSBkYXRhLndlYXRoZXJaaXA7XG4gICAgaWYgKGRhdGEudGhlbWUpIGJyb3dzZXJTdGF0ZVsndGhlbWUnXSA9IGRhdGEudGhlbWU7XG4gICAgaWYgKGRhdGEudXNlclRoZW1lcyAmJiBPYmplY3Qua2V5cyhkYXRhLnVzZXJUaGVtZXMpLmxlbmd0aCkgYnJvd3NlclN0YXRlWyd1c2VyLXRoZW1lcyddID0gSlNPTi5zdHJpbmdpZnkoZGF0YS51c2VyVGhlbWVzKTtcbiAgICByZXN0b3JlQnJvd3NlclN0YXRlKGJyb3dzZXJTdGF0ZSk7XG5cbiAgICAvLyBQdXNoIHNlcnZpY2VzIHRvIHNlcnZlciBpZiBhdmFpbGFibGVcbiAgICBpZiAoZGF0YS5zZXJ2aWNlcyAmJiBBcnJheS5pc0FycmF5KGRhdGEuc2VydmljZXMpKSB7XG4gICAgICBzZWN1cmVGZXRjaCgnL2FwaS92MS9zZXJ2aWNlcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEuc2VydmljZXMpXG4gICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHt9KTtcbiAgICB9XG5cbiAgICAvLyBQdXNoIHRoZW1lcyB0byBzZXJ2ZXIgaWYgYXZhaWxhYmxlXG4gICAgaWYgKGRhdGEudXNlclRoZW1lcykge1xuICAgICAgT2JqZWN0LmtleXMoZGF0YS51c2VyVGhlbWVzKS5mb3JFYWNoKGZ1bmN0aW9uKHNsdWcpIHtcbiAgICAgICAgdmFyIHQgPSBkYXRhLnVzZXJUaGVtZXNbc2x1Z107XG4gICAgICAgIHZhciBjb2xvcnMgPSB7fTtcbiAgICAgICAgKHdpbmRvdy5USEVNRV9QUk9QUyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbihwKSB7IGlmICh0W3BdKSBjb2xvcnNbcF0gPSB0W3BdOyB9KTtcbiAgICAgICAgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdGhlbWVzLycgKyBzbHVnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiB0Lm5hbWUgfHwgc2x1ZywgY29sb3JzOiBjb2xvcnMgfSlcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKSB7fSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnYmFja3VwLW1vZGFsJywgYDxkaXYgaWQ9XCJiYWNrdXAtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDU1MHB4OyBtYXgtd2lkdGg6IDY1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1RENCRSBCYWNrdXAgJiBSZXN0b3JlPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgRnVsbCBiYWNrdXAgb2YgeW91ciBlbnRpcmUgRGFzaENhZGR5IHNldHVwIFx1MjAxNCBzZXJ2ZXIgY29uZmlnLCBjcmVkZW50aWFscywgdGhlbWVzLCBhbmQgYnJvd3NlciBwcmVmZXJlbmNlcyBpbiBvbmUgZmlsZS5cbiAgICAgIDwvcD5cblxuICAgICAgPCEtLSBUYWIgYmFyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYiBhY3RpdmVcIiBkYXRhLXBhbmVsPVwiYmFja3VwLW1hbnVhbFwiPk1hbnVhbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImJhY2t1cC1zY2hlZHVsZXMtdGFiXCI+U2NoZWR1bGVzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiYmFja3VwLWRpc2stdGFiXCI+QmFja3VwcyBvbiBEaXNrPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwiYmFja3VwLXBvaW50aW50aW1lLXRhYlwiPlBvaW50LWluLVRpbWU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJiYWNrdXAtaGlzdG9yeS10YWJcIj5IaXN0b3J5PC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IE1hbnVhbCAtLT5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtbWFudWFsXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8IS0tIEV4cG9ydCBTZWN0aW9uIC0tPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMjBweDsgcGFkZGluZzogMTZweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgY29sb3ItbWl4KGluIHNyZ2IsICMyN2FlNjAgMTUlLCB0cmFuc3BhcmVudCksIGNvbG9yLW1peChpbiBzcmdiLCAjMmVjYzcxIDEwJSwgdHJhbnNwYXJlbnQpKTsgYm9yZGVyLXJhZGl1czogMTBweDsgYm9yZGVyOiAxcHggc29saWQgIzI3YWU2MDtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDAgMCA4cHg7IGNvbG9yOiAjMmVjYzcxOyBmb250LXNpemU6IDAuOTVyZW07XCI+XHVEODNEXHVEQ0U0IEV4cG9ydCBCYWNrdXA8L2g0PlxuICAgICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDEycHg7XCI+XG4gICAgICAgICAgICBEb3dubG9hZHMgZXZlcnl0aGluZyBcdTIwMTQgc2VydmljZXMsIENhZGR5ZmlsZSwgY3JlZGVudGlhbHMsIGVuY3J5cHRpb24ga2V5LCB0aGVtZXMsIGFuZCBhbGwgYnJvd3NlciBwcmVmZXJlbmNlcy5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJhY2t1cC1leHBvcnQtYnRuXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgIzI3YWU2MCAwJSwgIzJlY2M3MSAxMDAlKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGZvbnQtd2VpZ2h0OiA2MDA7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgXHUyQjA3XHVGRTBGIERvd25sb2FkIEZ1bGwgQmFja3VwXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gSW1wb3J0IFNlY3Rpb24gLS0+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNnB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCBjb2xvci1taXgoaW4gc3JnYiwgIzM0OThkYiAxNSUsIHRyYW5zcGFyZW50KSwgY29sb3ItbWl4KGluIHNyZ2IsICMyOTgwYjkgMTAlLCB0cmFuc3BhcmVudCkpOyBib3JkZXItcmFkaXVzOiAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCAjMzQ5OGRiO1wiPlxuICAgICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDhweDsgY29sb3I6ICMzNDk4ZGI7IGZvbnQtc2l6ZTogMC45NXJlbTtcIj5cdUQ4M0RcdURDRTUgUmVzdG9yZSBCYWNrdXA8L2g0PlxuICAgICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDEycHg7XCI+XG4gICAgICAgICAgICBVcGxvYWQgYSBiYWNrdXAgZmlsZSB0byByZXN0b3JlIHlvdXIgZW50aXJlIGNvbmZpZ3VyYXRpb24gXHUyMDE0IGRyYWcgYW5kIGRyb3AgcmVhZHkuXG4gICAgICAgICAgPC9wPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiYmFja3VwLWZpbGUtaW5wdXRcIiBhY2NlcHQ9XCIuanNvblwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIiAvPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJiYWNrdXAtc2VsZWN0LWZpbGVcIiBzdHlsZT1cIndpZHRoOiAxMDAlOyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjMzQ5OGRiIDAlLCAjMjk4MGI5IDEwMCUpOyBib3JkZXI6IG5vbmU7IGNvbG9yOiB3aGl0ZTsgZm9udC13ZWlnaHQ6IDYwMDsgYm9yZGVyLXJhZGl1czogOHB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBcdUQ4M0RcdURDQzEgU2VsZWN0IEJhY2t1cCBGaWxlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPGRpdiBpZD1cImJhY2t1cC1maWxlLW5hbWVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDhweDsgcGFkZGluZzogOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBQcmV2aWV3IFNlY3Rpb24gKHNob3duIGFmdGVyIGZpbGUgc2VsZWN0ZWQpIC0tPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLXByZXZpZXdcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgZm9udC1zaXplOiAwLjlyZW07XCI+XHVEODNEXHVEQ0NCIEJhY2t1cCBDb250ZW50czwvaDQ+XG4gICAgICAgICAgPGRpdiBpZD1cImJhY2t1cC1wcmV2aWV3LWNvbnRlbnRcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3gtbGFiZWxcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiYmFja3VwLXJlbG9hZC1jYWRkeVwiIGNoZWNrZWQgLz5cbiAgICAgICAgICAgICAgUmVsb2FkIENhZGR5IGFmdGVyIHJlc3RvcmVcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImJhY2t1cC1kby1yZXN0b3JlLWJ0blwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IG1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsICNlNzRjM2MgMCUsICNjMDM5MmIgMTAwJSk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogNjAwOyBib3JkZXItcmFkaXVzOiA4cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cbiAgICAgICAgICAgIFx1MjZBMSBSZXN0b3JlIEV2ZXJ5dGhpbmdcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBSZXN1bHQgTWVzc2FnZSAtLT5cbiAgICAgICAgPGRpdiBpZD1cImJhY2t1cC1yZXN1bHRcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDEycHg7IGJvcmRlci1yYWRpdXM6IDhweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogU2NoZWR1bGVzIChQcmVtaXVtKSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtc2NoZWR1bGVzLXRhYlwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiYmFja3VwLXNjaGVkdWxlcy1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1MjNGMDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBzY2hlZHVsZXMuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEJhY2t1cHMgb24gRGlzayAtLT5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtZGlzay10YWJcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImJhY2t1cC1kaXNrLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0JFPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nIGJhY2t1cCBmaWxlcy4uLlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogUG9pbnQtaW4tVGltZSBSZXN0b3JlIC0tPlxuICAgICAgPGRpdiBpZD1cImJhY2t1cC1wb2ludGludGltZS10YWJcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cInBvaW50aW50aW1lLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyM0VBPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBCYWNrdXAgSGlzdG9yeSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJiYWNrdXAtaGlzdG9yeS10YWJcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImJhY2t1cC1oaXN0b3J5LWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogNDAwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0I8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgYmFja3VwIGhpc3RvcnkuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBDbG9zZSBCdXR0b24gLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImJhY2t1cC1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIHZhciBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtbW9kYWwnKTtcbiAgdmFyIG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLXJlc3RvcmUtYnRuJyk7XG4gIHZhciBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFja3VwLWNhbmNlbCcpO1xuICB2YXIgZXhwb3J0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1leHBvcnQtYnRuJyk7XG4gIHZhciBzZWxlY3RGaWxlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1zZWxlY3QtZmlsZScpO1xuICB2YXIgZmlsZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1maWxlLWlucHV0Jyk7XG4gIHZhciBmaWxlTmFtZURpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtZmlsZS1uYW1lJyk7XG4gIHZhciBwcmV2aWV3RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1wcmV2aWV3Jyk7XG4gIHZhciBwcmV2aWV3Q29udGVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtcHJldmlldy1jb250ZW50Jyk7XG4gIHZhciByZXN0b3JlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1kby1yZXN0b3JlLWJ0bicpO1xuICB2YXIgcmVzdWx0RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1yZXN1bHQnKTtcbiAgdmFyIHNjaGVkdWxlQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1zY2hlZHVsZXMtY29udGFpbmVyJyk7XG4gIHZhciBoaXN0b3J5Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1oaXN0b3J5LWNvbnRhaW5lcicpO1xuICB2YXIgZGlza0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWNrdXAtZGlzay1jb250YWluZXInKTtcbiAgdmFyIHBvaW50aW50aW1lQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BvaW50aW50aW1lLWNvbnRhaW5lcicpO1xuXG4gIHZhciBzZWxlY3RlZEJhY2t1cCA9IG51bGw7XG5cbiAgLy8gT3BlbiBtb2RhbFxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBpZiAocmVzdWx0RGl2KSByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBpZiAocHJldmlld0RpdikgcHJldmlld0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlmIChmaWxlTmFtZURpdikgZmlsZU5hbWVEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzZWxlY3RlZEJhY2t1cCA9IG51bGw7XG4gIH0pO1xuXG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyA9PT0gRVhQT1JUOiBTZXJ2ZXIgYmFja3VwICsgYnJvd3NlciBzdGF0ZSBpbiBvbmUgZmlsZSA9PT1cbiAgZXhwb3J0QnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIGV4cG9ydEJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgZXhwb3J0QnRuLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IEV4cG9ydGluZy4uLic7XG4gICAgdHJ5IHtcbiAgICAgIC8vIEZldGNoIHNlcnZlci1zaWRlIGJhY2t1cCAoY29uZmlnLCBzZXJ2aWNlcywgY2FkZHlmaWxlLCBjcmVkZW50aWFscywgZW5jcnlwdGlvbiBrZXksIHRoZW1lcywgZXRjLilcbiAgICAgIHZhciByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2JhY2t1cC9leHBvcnQnKTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAvLyBBZGQgYWxsIGJyb3dzZXIgbG9jYWxTdG9yYWdlIHN0YXRlXG4gICAgICBkYXRhLmJyb3dzZXJTdGF0ZSA9IGNvbGxlY3RCcm93c2VyU3RhdGUoKTtcblxuICAgICAgLy8gRG93bmxvYWQgdW5pZmllZCBiYWNrdXBcbiAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpXSwgeyB0eXBlOiAnYXBwbGljYXRpb24vanNvbicgfSk7XG4gICAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgYS5ocmVmID0gdXJsO1xuICAgICAgYS5kb3dubG9hZCA9ICdkYXNoY2FkZHktYmFja3VwLScgKyBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXSArICcuanNvbic7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgICAgYS5jbGljaygpO1xuICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcblxuICAgICAgdmFyIHN0YXRlQ291bnQgPSBPYmplY3Qua2V5cyhkYXRhLmJyb3dzZXJTdGF0ZSkubGVuZ3RoO1xuICAgICAgdmFyIHRoZW1lQ291bnQgPSBkYXRhLnRoZW1lcyA/IE9iamVjdC5rZXlzKGRhdGEudGhlbWVzKS5sZW5ndGggOiAwO1xuICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3MDUgRnVsbCBiYWNrdXAgZG93bmxvYWRlZCBcdTIwMTQgc2VydmVyIGNvbmZpZyArICcgKyBzdGF0ZUNvdW50ICsgJyBicm93c2VyIHNldHRpbmdzJyArICh0aGVtZUNvdW50ID8gJyArICcgKyB0aGVtZUNvdW50ICsgJyB0aGVtZXMnIDogJycpO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW9rLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCB2YXIoLS1vay1mZyknO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnXHUyNzRDIEV4cG9ydCBmYWlsZWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSk7XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYmFkLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCB2YXIoLS1iYWQtZmcpJztcbiAgICB9XG4gICAgZXhwb3J0QnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgZXhwb3J0QnRuLmlubmVySFRNTCA9ICdcdTJCMDdcdUZFMEYgRG93bmxvYWQgRnVsbCBCYWNrdXAnO1xuICB9KTtcblxuICAvLyBTZWxlY3QgZmlsZSBidXR0b25cbiAgc2VsZWN0RmlsZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgZmlsZUlucHV0LmNsaWNrKCk7IH0pO1xuXG4gIC8vID09PSBGSUxFIFNFTEVDVEVEOiBQcmV2aWV3IGNvbnRlbnRzID09PVxuICBmaWxlSW5wdXQ/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jIGZ1bmN0aW9uKGUpIHtcbiAgICB2YXIgZmlsZSA9IGUudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGlmICghZmlsZSkgcmV0dXJuO1xuICAgIGZpbGVOYW1lRGl2LnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENDNCAnICsgZmlsZS5uYW1lO1xuICAgIGZpbGVOYW1lRGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHRyeSB7XG4gICAgICB2YXIgdGV4dCA9IGF3YWl0IGZpbGUudGV4dCgpO1xuICAgICAgdmFyIGJhY2t1cCA9IEpTT04ucGFyc2UodGV4dCk7XG5cbiAgICAgIC8vIEhhbmRsZSBsZWdhY3kgdjEuMC4wIGZvcm1hdCAoZnJvbSBvbGQgaW1wb3J0LWV4cG9ydC5qcylcbiAgICAgIGlmIChpc0xlZ2FjeUZvcm1hdChiYWNrdXApKSB7XG4gICAgICAgIHNlbGVjdGVkQmFja3VwID0gYmFja3VwO1xuICAgICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBmb250LXNpemU6IDAuOHJlbTtcIj5MZWdhY3kgZm9ybWF0ICh2JyArIGVzY2FwZUh0bWwoYmFja3VwLnZlcnNpb24pICsgJyk8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC13cmFwOiB3cmFwOyBnYXA6IDZweDtcIj4nO1xuICAgICAgICBpZiAoYmFja3VwLnNlcnZpY2VzPy5sZW5ndGgpIGh0bWwgKz0gJzxzcGFuIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjhyZW07XCI+XHVEODNEXHVEQ0NCICcgKyBiYWNrdXAuc2VydmljZXMubGVuZ3RoICsgJyBzZXJ2aWNlczwvc3Bhbj4nO1xuICAgICAgICBpZiAoYmFja3VwLmN1c3RvbUFwcHM/Lmxlbmd0aCkgaHRtbCArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0RcdURDRTYgJyArIGJhY2t1cC5jdXN0b21BcHBzLmxlbmd0aCArICcgY3VzdG9tIGFwcHM8L3NwYW4+JztcbiAgICAgICAgaWYgKGJhY2t1cC50aGVtZSkgaHRtbCArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0NcdURGQTggVGhlbWU6ICcgKyBlc2NhcGVIdG1sKGJhY2t1cC50aGVtZSkgKyAnPC9zcGFuPic7XG4gICAgICAgIGlmIChiYWNrdXAudXNlclRoZW1lcykgaHRtbCArPSAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nOiA0cHggOHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuOHJlbTtcIj5cdUQ4M0NcdURGQTggJyArIE9iamVjdC5rZXlzKGJhY2t1cC51c2VyVGhlbWVzKS5sZW5ndGggKyAnIGN1c3RvbSB0aGVtZXM8L3NwYW4+JztcbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgICAgcHJldmlld0NvbnRlbnQuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgICAgcHJldmlld0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyB2MS4xKyAvIHYyLjAgZm9ybWF0IFx1MjAxNCBzZW5kIHRvIHNlcnZlciBmb3IgcHJldmlld1xuICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3VwL3ByZXZpZXcnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYmFja3VwKVxuICAgICAgfSk7XG4gICAgICB2YXIgcHJldmlldyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIGlmIChwcmV2aWV3LnN1Y2Nlc3MpIHtcbiAgICAgICAgc2VsZWN0ZWRCYWNrdXAgPSBiYWNrdXA7XG4gICAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC44cmVtO1wiPkV4cG9ydGVkOiAnICsgbmV3IERhdGUoYmFja3VwLmV4cG9ydGVkQXQpLnRvTG9jYWxlU3RyaW5nKCkgKyAnICh2JyArIGVzY2FwZUh0bWwoYmFja3VwLnZlcnNpb24pICsgJyk8L2Rpdj4nO1xuXG4gICAgICAgIC8vIFNlcnZlciBmaWxlc1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogNnB4OyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxldHRlci1zcGFjaW5nOiAwLjVweDtcIj5TZXJ2ZXIgQ29uZmlnPC9kaXY+JztcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtd3JhcDogd3JhcDsgZ2FwOiA2cHg7IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+JztcbiAgICAgICAgZm9yICh2YXIga2V5IGluIHByZXZpZXcucHJldmlldy5maWxlcykge1xuICAgICAgICAgIHZhciBpbmZvID0gcHJldmlldy5wcmV2aWV3LmZpbGVzW2tleV07XG4gICAgICAgICAgdmFyIGljb24gPSBpbmZvLmFjdGlvbiA9PT0gJ2NyZWF0ZScgPyAnXHVEODNDXHVERDk1JyA6ICdcdUQ4M0RcdURDREQnO1xuICAgICAgICAgIGh0bWwgKz0gJzxzcGFuIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC1zaXplOiAwLjhyZW07XCI+JyArIGljb24gKyAnICcgKyBlc2NhcGVIdG1sKGluZm8uZGVzY3JpcHRpb24pICsgJzwvc3Bhbj4nO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG5cbiAgICAgICAgLy8gU2VydmljZXMgY291bnRcbiAgICAgICAgaWYgKHByZXZpZXcucHJldmlldy5zZXJ2aWNlQ291bnQpIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+JyArIHByZXZpZXcucHJldmlldy5zZXJ2aWNlQ291bnQgKyAnIHNlcnZpY2VzPC9kaXY+JztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZW1lc1xuICAgICAgICBpZiAocHJldmlldy5wcmV2aWV3LnRoZW1lQ291bnQpIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyBtYXJnaW4tYm90dG9tOiA2cHg7XCI+XHVEODNDXHVERkE4ICcgKyBwcmV2aWV3LnByZXZpZXcudGhlbWVDb3VudCArICcgY3VzdG9tIHRoZW1lczwvZGl2Pic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCcm93c2VyIHN0YXRlXG4gICAgICAgIGlmIChwcmV2aWV3LnByZXZpZXcuYnJvd3NlclN0YXRlQ291bnQpIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogNnB4OyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7IGxldHRlci1zcGFjaW5nOiAwLjVweDtcIj5Ccm93c2VyIFByZWZlcmVuY2VzPC9kaXY+JztcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPlx1RDgzRFx1RERBNVx1RkUwRiAnICsgcHJldmlldy5wcmV2aWV3LmJyb3dzZXJTdGF0ZUNvdW50ICsgJyBzYXZlZCBzZXR0aW5ncyAodGhlbWUsIHdlYXRoZXIsIGNsb2NrLCB3aWRnZXRzLCBldGMuKTwvZGl2Pic7XG4gICAgICAgIH1cblxuICAgICAgICBwcmV2aWV3Q29udGVudC5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgICBwcmV2aWV3RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI2QTBcdUZFMEYgSW52YWxpZCBiYWNrdXAgZmlsZTogJyArIGVzY2FwZUh0bWwocHJldmlldy5lcnJvcik7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsICNmMzljMTIgMTUlLCB0cmFuc3BhcmVudCknO1xuICAgICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCAjZjM5YzEyJztcbiAgICAgICAgcHJldmlld0Rpdi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnXHUyNzRDIENvdWxkIG5vdCByZWFkIGZpbGU6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSk7XG4gICAgICByZXN1bHREaXYuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYmFkLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICByZXN1bHREaXYuc3R5bGUuYm9yZGVyID0gJzFweCBzb2xpZCB2YXIoLS1iYWQtZmcpJztcbiAgICAgIHByZXZpZXdEaXYuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PSBSRVNUT1JFOiBTZXJ2ZXIgKyBicm93c2VyIHN0YXRlID09PVxuICByZXN0b3JlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgIGlmICghc2VsZWN0ZWRCYWNrdXApIHJldHVybjtcbiAgICBpZiAoIWNvbmZpcm0oJ1RoaXMgd2lsbCBvdmVyd3JpdGUgeW91ciBjdXJyZW50IGNvbmZpZ3VyYXRpb24gYW5kIGJyb3dzZXIgcHJlZmVyZW5jZXMuIENvbnRpbnVlPycpKSByZXR1cm47XG4gICAgcmVzdG9yZUJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgcmVzdG9yZUJ0bi5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBSZXN0b3JpbmcuLi4nO1xuICAgIHRyeSB7XG4gICAgICAvLyBIYW5kbGUgbGVnYWN5IGZvcm1hdFxuICAgICAgaWYgKGlzTGVnYWN5Rm9ybWF0KHNlbGVjdGVkQmFja3VwKSkge1xuICAgICAgICByZXN0b3JlTGVnYWN5Rm9ybWF0KHNlbGVjdGVkQmFja3VwKTtcbiAgICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9ICdcdTI3MDUgTGVnYWN5IGJhY2t1cCByZXN0b3JlZCBcdTIwMTQgYnJvd3NlciBzZXR0aW5ncyBhbmQgc2VydmljZXMgaW1wb3J0ZWQuJztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW9rLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLW9rLWZnKSc7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgbG9jYXRpb24ucmVsb2FkKCk7IH0sIDIwMDApO1xuICAgICAgICByZXN0b3JlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgIHJlc3RvcmVCdG4uaW5uZXJIVE1MID0gJ1x1MjZBMSBSZXN0b3JlIEV2ZXJ5dGhpbmcnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIHYxLjErIC8gdjIuMCBcdTIwMTQgcmVzdG9yZSBzZXJ2ZXItc2lkZSBmaXJzdFxuICAgICAgdmFyIHJlbG9hZENhZGR5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2t1cC1yZWxvYWQtY2FkZHknKT8uY2hlY2tlZCA/PyB0cnVlO1xuICAgICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3VwL3Jlc3RvcmUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBiYWNrdXA6IHNlbGVjdGVkQmFja3VwLCBvcHRpb25zOiB7IHJlbG9hZENhZGR5OiByZWxvYWRDYWRkeSB9IH0pXG4gICAgICB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuXG4gICAgICAvLyBUaGVuIHJlc3RvcmUgYnJvd3NlciBzdGF0ZVxuICAgICAgdmFyIGJyb3dzZXJDb3VudCA9IDA7XG4gICAgICBpZiAoc2VsZWN0ZWRCYWNrdXAuYnJvd3NlclN0YXRlKSB7XG4gICAgICAgIGJyb3dzZXJDb3VudCA9IHJlc3RvcmVCcm93c2VyU3RhdGUoc2VsZWN0ZWRCYWNrdXAuYnJvd3NlclN0YXRlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICB2YXIgbXNnID0gJ1x1MjcwNSAnICsgZGF0YS5tZXNzYWdlO1xuICAgICAgICBpZiAoYnJvd3NlckNvdW50ID4gMCkgbXNnICs9ICc8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgYnJvd3NlckNvdW50ICsgJyBicm93c2VyIHNldHRpbmdzIHJlc3RvcmVkPC9zbWFsbD4nO1xuICAgICAgICBpZiAoZGF0YS5yZXN1bHRzLmNhZGR5UmVsb2FkZWQpIG1zZyArPSAnPGJyPjxzbWFsbCBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q2FkZHkgY29uZmlndXJhdGlvbiByZWxvYWRlZDwvc21hbGw+JztcbiAgICAgICAgcmVzdWx0RGl2LmlubmVySFRNTCA9IG1zZztcbiAgICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLW9rLWZnKSAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkIHZhcigtLW9rLWZnKSc7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGxvY2F0aW9uLnJlbG9hZCgpOyB9LCAyMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnXHUyNkEwXHVGRTBGICcgKyBlc2NhcGVIdG1sKGRhdGEubWVzc2FnZSk7XG4gICAgICAgIGlmIChicm93c2VyQ291bnQgPiAwKSByZXN1bHREaXYuaW5uZXJIVE1MICs9ICc8YnI+PHNtYWxsIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4nICsgYnJvd3NlckNvdW50ICsgJyBicm93c2VyIHNldHRpbmdzIHdlcmUgcmVzdG9yZWQ8L3NtYWxsPic7XG4gICAgICAgIGlmIChkYXRhLnJlc3VsdHM/LmVycm9ycz8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgKz0gJzxicj48c21hbGw+JyArIGRhdGEucmVzdWx0cy5lcnJvcnMubWFwKGZ1bmN0aW9uKGUpIHsgcmV0dXJuIGVzY2FwZUh0bWwoZS5maWxlKSArICc6ICcgKyBlc2NhcGVIdG1sKGUuZXJyb3IpOyB9KS5qb2luKCcsICcpICsgJzwvc21hbGw+JztcbiAgICAgICAgfVxuICAgICAgICByZXN1bHREaXYuc3R5bGUuYmFja2dyb3VuZCA9ICdjb2xvci1taXgoaW4gc3JnYiwgI2YzOWMxMiAxNSUsIHRyYW5zcGFyZW50KSc7XG4gICAgICAgIHJlc3VsdERpdi5zdHlsZS5ib3JkZXIgPSAnMXB4IHNvbGlkICNmMzljMTInO1xuICAgICAgfVxuICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlc3VsdERpdi5pbm5lckhUTUwgPSAnXHUyNzRDIFJlc3RvcmUgZmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmJhY2tncm91bmQgPSAnY29sb3ItbWl4KGluIHNyZ2IsIHZhcigtLWJhZC1mZykgMTUlLCB0cmFuc3BhcmVudCknO1xuICAgICAgcmVzdWx0RGl2LnN0eWxlLmJvcmRlciA9ICcxcHggc29saWQgdmFyKC0tYmFkLWZnKSc7XG4gICAgfVxuICAgIHJlc3RvcmVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICByZXN0b3JlQnRuLmlubmVySFRNTCA9ICdcdTI2QTEgUmVzdG9yZSBFdmVyeXRoaW5nJztcbiAgfSk7XG5cbiAgLy8gPT09IFNjaGVkdWxlcyBUYWIgKFByZW1pdW0pID09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkU2NoZWR1bGVzVGFiKCkge1xuICAgIGlmICghc2NoZWR1bGVDb250YWluZXIpIHJldHVybjtcbiAgICBzY2hlZHVsZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+JztcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2JhY2t1cHMvc2NoZWR1bGUnKTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIFxuICAgICAgaWYgKGRhdGEucHJlbWl1bVJlcXVpcmVkKSB7XG4gICAgICAgIHNjaGVkdWxlQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cInBhZGRpbmc6IDI0cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMnJlbTsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cdTJCNTA8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDhweDtcIj5QcmVtaXVtIEZlYXR1cmU8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5BdXRvLWJhY2t1cCBzY2hlZHVsaW5nIHJlcXVpcmVzIGEgRGFzaENhZGR5IFByZW1pdW0gc3Vic2NyaXB0aW9uLjwvZGl2PicgK1xuICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9XCJzaG93Tm90aWZpY2F0aW9uKFxcJ1VwZ3JhZGUgdG8gUHJlbWl1bSB0byBlbmFibGUgYXV0by1iYWNrdXBzIVxcJywgXFwnaW5mb1xcJyk7IHNjcm9sbFRvU2VjdGlvbihcXCdsaWNlbnNlXFwnKTtcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDhweCAyMHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZjM5YzEyLCAjZTY3ZTIyKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwO1wiPlVwZ3JhZGUgdG8gUHJlbWl1bTwvYnV0dG9uPicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvciB8fCAnRmFpbGVkIHRvIGxvYWQgc2NoZWR1bGVzJyk7XG4gICAgICBcbiAgICAgIHZhciBzY2hlZHVsZXMgPSBkYXRhLnNjaGVkdWxlcyB8fCBbXTtcbiAgICAgIFxuICAgICAgaWYgKHNjaGVkdWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPicgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdTIzRjA8L3NwYW4+JyArXG4gICAgICAgICAgJzxkaXY+Tm8gYmFja3VwIHNjaGVkdWxlcyBjb25maWd1cmVkPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPlNlbGVjdCBhcHBzIGJlbG93IHRvIGVuYWJsZSBhdXRvLWJhY2t1cDwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBcbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDhweDtcIj4nO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzY2hlZHVsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHNjaCA9IHNjaGVkdWxlc1tpXTtcbiAgICAgICAgdmFyIG5leHRSdW5TdHIgPSBzY2gubmV4dFJ1biA/IG5ldyBEYXRlKHNjaC5uZXh0UnVuKS50b0xvY2FsZVN0cmluZygpIDogJ05vdCBzY2hlZHVsZWQnO1xuICAgICAgICB2YXIgbGFzdFJ1blN0ciA9IHNjaC5sYXN0UnVuID8gbmV3IERhdGUoc2NoLmxhc3RSdW4pLnRvTG9jYWxlU3RyaW5nKCkgOiAnTmV2ZXInO1xuICAgICAgICBcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHggMTRweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+JyArXG4gICAgICAgICAgJyAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC45cmVtO1wiPicgKyBlc2NhcGVIdG1sKHNjaC5hcHBJZCkgKyAnPC9kaXY+JyArXG4gICAgICAgICAgJyAgPGxhYmVsIGNsYXNzPVwidG9nZ2xlLXN3aXRjaFwiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7XCI+JyArXG4gICAgICAgICAgJyAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJzY2hlZHVsZS10b2dnbGVcIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoc2NoLmFwcElkKSArICdcIicgKyAoc2NoLmVuYWJsZWQgPyAnIGNoZWNrZWQnIDogJycpICsgJyAvPicgK1xuICAgICAgICAgICcgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIChzY2guZW5hYmxlZCA/ICdPTicgOiAnT0ZGJykgKyAnPC9zcGFuPicgK1xuICAgICAgICAgICcgIDwvbGFiZWw+JyArXG4gICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDhweDsgZm9udC1zaXplOiAwLjhyZW07IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+JyArXG4gICAgICAgICAgJyAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+U2NoZWR1bGU6PC9zcGFuPiA8c2VsZWN0IGNsYXNzPVwic2NoZWR1bGUtc2VsZWN0XCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKHNjaC5hcHBJZCkgKyAnXCIgc3R5bGU9XCJiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBwYWRkaW5nOiAycHggNnB4O1wiPicgK1xuICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cImhvdXJseVwiJyArIChzY2guc2NoZWR1bGUgPT09ICdob3VybHknID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPkhvdXJseTwvb3B0aW9uPicgK1xuICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cImRhaWx5XCInICsgKHNjaC5zY2hlZHVsZSA9PT0gJ2RhaWx5JyA/ICcgc2VsZWN0ZWQnIDogJycpICsgJz5EYWlseTwvb3B0aW9uPicgK1xuICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIndlZWtseVwiJyArIChzY2guc2NoZWR1bGUgPT09ICd3ZWVrbHknID8gJyBzZWxlY3RlZCcgOiAnJykgKyAnPldlZWtseTwvb3B0aW9uPicgK1xuICAgICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIm1vbnRobHlcIicgKyAoc2NoLnNjaGVkdWxlID09PSAnbW9udGhseScgPyAnIHNlbGVjdGVkJyA6ICcnKSArICc+TW9udGhseTwvb3B0aW9uPicgK1xuICAgICAgICAgICcgIDwvc2VsZWN0PjwvZGl2PicgK1xuICAgICAgICAgICcgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPktlZXAgbGFzdDo8L3NwYW4+IDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJyZXRlbnRpb24taW5wdXRcIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoc2NoLmFwcElkKSArICdcIiB2YWx1ZT1cIicgKyAoc2NoLnJldGVudGlvbj8ua2VlcCB8fCA3KSArICdcIiBtaW49XCIxXCIgbWF4PVwiMTAwXCIgc3R5bGU9XCJ3aWR0aDogNTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDsgcGFkZGluZzogMnB4IDZweDtcIiAvPjwvZGl2PicgK1xuICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj4nICtcbiAgICAgICAgICAnICA8ZGl2Pk5leHQgcnVuOiAnICsgZXNjYXBlSHRtbChuZXh0UnVuU3RyKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAnICA8ZGl2Pkxhc3QgcnVuOiAnICsgZXNjYXBlSHRtbChsYXN0UnVuU3RyKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDtcIj4nICtcbiAgICAgICAgICAnICA8YnV0dG9uIGNsYXNzPVwic2NoZWR1bGUtcnVuLW5vd1wiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChzY2guYXBwSWQpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogNXB4IDEycHg7IGZvbnQtc2l6ZTogMC44cmVtOyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tb2stZmcpIDIwJSwgdHJhbnNwYXJlbnQpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1vay1mZyk7IGNvbG9yOiB2YXIoLS1vay1mZyk7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlx1MjVCNlx1RkUwRiBSdW4gTm93PC9idXR0b24+JyArXG4gICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cInNjaGVkdWxlLWRlbGV0ZVwiIGRhdGEtYXBwaWQ9XCInICsgZXNjYXBlSHRtbChzY2guYXBwSWQpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogNXB4IDEycHg7IGZvbnQtc2l6ZTogMC44cmVtOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFkLWZnKTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyO1wiPlx1RDgzRFx1REREMVx1RkUwRiBSZW1vdmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgXG4gICAgICAvLyBBZGQgXCJBZGQgU2NoZWR1bGVcIiBzZWN0aW9uIGF0IGJvdHRvbVxuICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDE2cHg7IGJhY2tncm91bmQ6IGNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDUlLCB0cmFuc3BhcmVudCk7IGJvcmRlci1yYWRpdXM6IDEwcHg7IGJvcmRlcjogMXB4IGRhc2hlZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAnPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDsgZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlx1Mjc5NSBBZGQgTmV3IFNjaGVkdWxlPC9oND4nICtcbiAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsgZmxleC13cmFwOiB3cmFwO1wiPicgK1xuICAgICAgICAnICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cIm5ldy1zY2hlZHVsZS1hcHBpZFwiIHBsYWNlaG9sZGVyPVwiQXBwIElEIChlLmcuLCBwbGV4LCBzb25hcnIpXCIgc3R5bGU9XCJmbGV4OiAxOyBtaW4td2lkdGg6IDE1MHB4OyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7XCIgLz4nICtcbiAgICAgICAgJyAgPHNlbGVjdCBpZD1cIm5ldy1zY2hlZHVsZS1pbnRlcnZhbFwiIHN0eWxlPVwicGFkZGluZzogOHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpO1wiPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJob3VybHlcIj5Ib3VybHk8L29wdGlvbj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiZGFpbHlcIiBzZWxlY3RlZD5EYWlseTwvb3B0aW9uPicgK1xuICAgICAgICAnICAgIDxvcHRpb24gdmFsdWU9XCJ3ZWVrbHlcIj5XZWVrbHk8L29wdGlvbj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwibW9udGhseVwiPk1vbnRobHk8L29wdGlvbj4nICtcbiAgICAgICAgJyAgICA8b3B0aW9uIHZhbHVlPVwiNmhcIj5FdmVyeSA2IGhvdXJzPC9vcHRpb24+JyArXG4gICAgICAgICcgICAgPG9wdGlvbiB2YWx1ZT1cIjMwbVwiPkV2ZXJ5IDMwIG1pbnV0ZXM8L29wdGlvbj4nICtcbiAgICAgICAgJyAgPC9zZWxlY3Q+JyArXG4gICAgICAgICcgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJuZXctc2NoZWR1bGUtcmV0ZW50aW9uXCIgdmFsdWU9XCI3XCIgbWluPVwiMVwiIG1heD1cIjEwMFwiIHBsYWNlaG9sZGVyPVwiS2VlcFwiIHN0eWxlPVwid2lkdGg6IDcwcHg7IHBhZGRpbmc6IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTtcIiAvPicgK1xuICAgICAgICAnICA8YnV0dG9uIGlkPVwiYWRkLXNjaGVkdWxlLWJ0blwiIHN0eWxlPVwicGFkZGluZzogOHB4IDE2cHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDtcIj5BZGQgU2NoZWR1bGU8L2J1dHRvbj4nICtcbiAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAnPC9kaXY+JztcbiAgICAgIFxuICAgICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIFxuICAgICAgLy8gV2lyZSB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zY2hlZHVsZS10b2dnbGUnKS5mb3JFYWNoKGZ1bmN0aW9uKHRvZ2dsZSkge1xuICAgICAgICB0b2dnbGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7IHVwZGF0ZVNjaGVkdWxlKHRvZ2dsZS5kYXRhc2V0LmFwcGlkLCB7IGVuYWJsZWQ6IHRvZ2dsZS5jaGVja2VkIH0pOyB9KTtcbiAgICAgIH0pO1xuICAgICAgc2NoZWR1bGVDb250YWluZXIucXVlcnlTZWxlY3RvckFsbCgnLnNjaGVkdWxlLXNlbGVjdCcpLmZvckVhY2goZnVuY3Rpb24oc2VsKSB7XG4gICAgICAgIHNlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsgdXBkYXRlU2NoZWR1bGUoc2VsLmRhdGFzZXQuYXBwaWQsIHsgc2NoZWR1bGU6IHNlbC52YWx1ZSB9KTsgfSk7XG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZXRlbnRpb24taW5wdXQnKS5mb3JFYWNoKGZ1bmN0aW9uKGlucCkge1xuICAgICAgICBpbnAuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24oKSB7IHVwZGF0ZVNjaGVkdWxlKGlucC5kYXRhc2V0LmFwcGlkLCB7IHJldGVudGlvbjogeyBrZWVwOiBwYXJzZUludChpbnAudmFsdWUpIHx8IDcgfSB9KTsgfSk7XG4gICAgICB9KTtcbiAgICAgIHNjaGVkdWxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zY2hlZHVsZS1ydW4tbm93JykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IHJ1bkJhY2t1cE5vdyhidG4uZGF0YXNldC5hcHBpZCk7IH0pO1xuICAgICAgfSk7XG4gICAgICBzY2hlZHVsZUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuc2NoZWR1bGUtZGVsZXRlJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IGRlbGV0ZVNjaGVkdWxlKGJ0bi5kYXRhc2V0LmFwcGlkKTsgfSk7XG4gICAgICB9KTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhZGQtc2NoZWR1bGUtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYWRkTmV3U2NoZWR1bGUpO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2NoZWR1bGVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkIHRvIGxvYWQ6ICcgKyBlc2NhcGVIdG1sKGUubWVzc2FnZSkgKyAnPC9kaXY+JztcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZVNjaGVkdWxlKGFwcElkLCB1cGRhdGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL3NjaGVkdWxlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgYXBwSWQsIC4uLnVwZGF0ZXMgfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdTY2hlZHVsZSB1cGRhdGVkIGZvciAnICsgYXBwSWQsICdzdWNjZXNzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdVcGRhdGUgZmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICAgIGxvYWRTY2hlZHVsZXNUYWIoKTsgLy8gUmVmcmVzaCBvbiBmYWlsdXJlXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuICBcbiAgYXN5bmMgZnVuY3Rpb24gcnVuQmFja3VwTm93KGFwcElkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL2JhY2t1cC8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFwcElkKSwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH1cbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdCYWNrdXAgc3RhcnRlZCBmb3IgJyArIGFwcElkICsgJyEnLCAnc3VjY2VzcycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignQmFja3VwIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duJyksICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVNjaGVkdWxlKGFwcElkKSB7XG4gICAgaWYgKCFjb25maXJtKCdSZW1vdmUgYmFja3VwIHNjaGVkdWxlIGZvciAnICsgYXBwSWQgKyAnPycpKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHZhciByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9iYWNrdXBzL3NjaGVkdWxlLycgKyBlbmNvZGVVUklDb21wb25lbnQoYXBwSWQpLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1NjaGVkdWxlIHJlbW92ZWQgZm9yICcgKyBhcHBJZCwgJ3N1Y2Nlc3MnKTtcbiAgICAgICAgbG9hZFNjaGVkdWxlc1RhYigpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRGVsZXRlIGZhaWxlZDogJyArIChkYXRhLmVycm9yIHx8ICdVbmtub3duJyksICdlcnJvcicpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cbiAgXG4gIGFzeW5jIGZ1bmN0aW9uIGFkZE5ld1NjaGVkdWxlKCkge1xuICAgIHZhciBhcHBJZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctc2NoZWR1bGUtYXBwaWQnKT8udmFsdWU/LnRyaW0oKTtcbiAgICB2YXIgaW50ZXJ2YWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbmV3LXNjaGVkdWxlLWludGVydmFsJyk/LnZhbHVlIHx8ICdkYWlseSc7XG4gICAgdmFyIHJldGVudGlvbiA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCduZXctc2NoZWR1bGUtcmV0ZW50aW9uJyk/LnZhbHVlKSB8fCA3O1xuICAgIFxuICAgIGlmICghYXBwSWQpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BsZWFzZSBlbnRlciBhbiBBcHAgSUQnLCAnd2FybmluZycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBcbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2JhY2t1cHMvc2NoZWR1bGUnLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhcHBJZCwgc2NoZWR1bGU6IGludGVydmFsLCByZXRlbnRpb246IHsga2VlcDogcmV0ZW50aW9uIH0sIGVuYWJsZWQ6IHRydWUgfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdTY2hlZHVsZSBjcmVhdGVkIGZvciAnICsgYXBwSWQsICdzdWNjZXNzJyk7XG4gICAgICAgIGxvYWRTY2hlZHVsZXNUYWIoKTtcbiAgICAgICAgLy8gQ2xlYXIgaW5wdXRzXG4gICAgICAgIHZhciBhcHBJZElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ25ldy1zY2hlZHVsZS1hcHBpZCcpO1xuICAgICAgICBpZiAoYXBwSWRJbnB1dCkgYXBwSWRJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuICBcbiAgLy8gPT09IEJhY2t1cHMgb24gRGlzayBUYWIgPT09XG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWREaXNrQmFja3VwcygpIHtcbiAgICBpZiAoIWRpc2tDb250YWluZXIpIHJldHVybjtcbiAgICBkaXNrQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9maWxlcycpO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdGYWlsZWQgdG8gbG9hZCcpO1xuXG4gICAgICB2YXIgZmlsZXMgPSBkYXRhLmZpbGVzIHx8IFtdO1xuXG4gICAgICBpZiAoZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGRpc2tDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPicgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQkU8L3NwYW4+JyArXG4gICAgICAgICAgJzxkaXY+Tm8gYmFja3VwIGZpbGVzIG9uIGRpc2s8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+UnVuIGEgYmFja3VwIHRvIGNyZWF0ZSBiYWNrdXAgZmlsZXM8L2Rpdj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBHcm91cCBieSBhcHBJZFxuICAgICAgdmFyIGJ5QXBwID0ge307XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmID0gZmlsZXNbaV07XG4gICAgICAgIHZhciBhcHBJZCA9IGYuYXBwSWQgfHwgJ3Vua25vd24nO1xuICAgICAgICBpZiAoIWJ5QXBwW2FwcElkXSkgYnlBcHBbYXBwSWRdID0gW107XG4gICAgICAgIGJ5QXBwW2FwcElkXS5wdXNoKGYpO1xuICAgICAgfVxuXG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiAxMnB4O1wiPicgKyBmaWxlcy5sZW5ndGggKyAnIGJhY2t1cCBmaWxlKHMpIGFjcm9zcyAnICsgT2JqZWN0LmtleXMoYnlBcHApLmxlbmd0aCArICcgYXBwKHMpPC9kaXY+JztcbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogY29sdW1uOyBnYXA6IDEycHg7XCI+JztcblxuICAgICAgdmFyIGFwcElkcyA9IE9iamVjdC5rZXlzKGJ5QXBwKS5zb3J0KCk7XG4gICAgICBmb3IgKHZhciBhID0gMDsgYSA8IGFwcElkcy5sZW5ndGg7IGErKykge1xuICAgICAgICB2YXIgYXBwSWQgPSBhcHBJZHNbYV07XG4gICAgICAgIHZhciBhcHBGaWxlcyA9IGJ5QXBwW2FwcElkXTtcbiAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgb3ZlcmZsb3c6IGhpZGRlbjtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSA4JSwgdHJhbnNwYXJlbnQpOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtO1wiPicgK1xuICAgICAgICAgIGVzY2FwZUh0bWwoYXBwSWQpICsgJyA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiBub3JtYWw7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC43NXJlbTtcIj4oJyArIGFwcEZpbGVzLmxlbmd0aCArICcgYmFja3VwKHMpKTwvc3Bhbj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcblxuICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGFwcEZpbGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgdmFyIGYgPSBhcHBGaWxlc1tqXTtcbiAgICAgICAgICB2YXIgZGF0ZVN0ciA9IG5ldyBEYXRlKGYudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDRweDtcIj4nICtcbiAgICAgICAgICAgICcgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyBmb250LXNpemU6IDAuODVyZW07XCI+JyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAgICcgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIGYuc2l6ZUZvcm1hdHRlZCArICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+JyArIGRhdGVTdHIgKyAnPC9kaXY+JyArXG4gICAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNnB4O1wiPicgK1xuICAgICAgICAgICAgJyAgPGJ1dHRvbiBjbGFzcz1cImRpc2stY29tcGFyZS1idG5cIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoYXBwSWQpICsgJ1wiIGRhdGEtZmlsZW5hbWU9XCInICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogM3B4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtOyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWFjY2VudCk7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyO1wiPkNvbXBhcmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICcgIDxidXR0b24gY2xhc3M9XCJkaXNrLXJlc3RvcmUtYnRuXCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKGFwcElkKSArICdcIiBkYXRhLWZpbGVuYW1lPVwiJyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICdcIiBzdHlsZT1cInBhZGRpbmc6IDNweCA4cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tb2stZmcpLCAjMjdhZTYwKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwO1wiPlJlc3RvcmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nICtcbiAgICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuXG4gICAgICBkaXNrQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIFdpcmUgdXAgYnV0dG9uc1xuICAgICAgZGlza0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZGlzay1jb21wYXJlLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBjb21wYXJlQmFja3VwRmlsZShidG4uZGF0YXNldC5hcHBpZCwgYnRuLmRhdGFzZXQuZmlsZW5hbWUpOyB9KTtcbiAgICAgIH0pO1xuICAgICAgZGlza0NvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuZGlzay1yZXN0b3JlLWJ0bicpLmZvckVhY2goZnVuY3Rpb24oYnRuKSB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uKCkgeyByZXN0b3JlQmFja3VwRmlsZShidG4uZGF0YXNldC5hcHBpZCwgYnRuLmRhdGFzZXQuZmlsZW5hbWUpOyB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGRpc2tDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG4gIFxuICAvLyA9PT0gQmFja3VwIEhpc3RvcnkgVGFiID09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkQmFja3VwSGlzdG9yeSgpIHtcbiAgICBpZiAoIWhpc3RvcnlDb250YWluZXIpIHJldHVybjtcbiAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9oaXN0b3J5P2xpbWl0PTUwJyk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS5oaXN0b3J5Py5sZW5ndGgpIHtcbiAgICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0NCPC9zcGFuPiBObyBiYWNrdXAgaGlzdG9yeSB5ZXQ8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiA2cHg7XCI+JztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5oaXN0b3J5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBiayA9IGRhdGEuaGlzdG9yeVtpXTtcbiAgICAgICAgdmFyIHNpemVNQiA9IGJrLnNpemUgPyAoYmsuc2l6ZSAvIDEwMjQgLyAxMDI0KS50b0ZpeGVkKDIpIDogJz8nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMTBweCAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nO1xuICAgICAgICBodG1sICs9ICcgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDRweDtcIj4nO1xuICAgICAgICBodG1sICs9ICcgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNTAwO1wiPicgKyBlc2NhcGVIdG1sKGJrLm5hbWUgfHwgJ2JhY2t1cCcpICsgJzwvc3Bhbj4nO1xuICAgICAgICBodG1sICs9ICcgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGdhcDogOHB4O1wiPic7XG4gICAgICAgIGh0bWwgKz0gJyAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWJhZGdlICcgKyAoYmsuc3RhdHVzID09PSAnc3VjY2VzcycgPyAnc3VjY2VzcycgOiAnZG93bicpICsgJ1wiPicgKyBlc2NhcGVIdG1sKGJrLnN0YXR1cykgKyAnPC9zcGFuPic7XG4gICAgICAgIGlmIChiay5zdGF0dXMgPT09ICdzdWNjZXNzJykgaHRtbCArPSAnICAgICAgPGJ1dHRvbiBjbGFzcz1cImJhY2t1cC1yZXN0b3JlLWJ0blwiIGRhdGEtYmFja3VwLWlkPVwiJyArIGVzY2FwZUh0bWwoYmsuaWQpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogM3B4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtO1wiPlJlc3RvcmU8L2J1dHRvbj4nO1xuICAgICAgICBodG1sICs9ICcgICAgPC9kaXY+JztcbiAgICAgICAgaHRtbCArPSAnICA8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICcgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JztcbiAgICAgICAgaHRtbCArPSAnICAgICcgKyBuZXcgRGF0ZShiay50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCkgKyAnIHwgJyArIHNpemVNQiArICcgTUIgfCAnICsgKGJrLmR1cmF0aW9uID8gKGJrLmR1cmF0aW9uIC8gMTAwMCkudG9GaXhlZCgxKSArICdzJyA6ICctLScpO1xuICAgICAgICBpZiAoYmsuZW5jcnlwdGVkKSBodG1sICs9ICcgfCBcdUQ4M0RcdUREMTInO1xuICAgICAgICBodG1sICs9ICcgIDwvZGl2Pic7XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuYmFja3VwLXJlc3RvcmUtYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IHdpbmRvdy5fX3Jlc3RvcmVTZXJ2ZXJCYWNrdXAoYnRuLmRhdGFzZXQuYmFja3VwSWQpOyB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAnICsgZXNjYXBlSHRtbChlLm1lc3NhZ2UpICsgJzwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgd2luZG93Ll9fcmVzdG9yZVNlcnZlckJhY2t1cCA9IGFzeW5jIGZ1bmN0aW9uKGJhY2t1cElkKSB7XG4gICAgaWYgKCFjb25maXJtKCdSZXN0b3JlIGZyb20gdGhpcyBzZXJ2ZXIgYmFja3VwPyBUaGlzIHdpbGwgb3ZlcndyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9yZXN0b3JlLycgKyBiYWNrdXBJZCwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVzdG9yZVNlcnZpY2VzOiB0cnVlLCByZXN0b3JlQ29uZmlnOiB0cnVlIH0pXG4gICAgICB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUmVzdG9yZSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5IScsICdzdWNjZXNzJyk7XG4gICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignUmVzdG9yZSBmYWlsZWQ6ICcgKyAoZGF0YS5lcnJvciB8fCAnVW5rbm93biBlcnJvcicpLCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IHNob3dOb3RpZmljYXRpb24oJ1Jlc3RvcmUgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpOyB9XG4gIH07XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJiYWNrdXAtc2NoZWR1bGVzLXRhYlwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRTY2hlZHVsZXNUYWIpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cImJhY2t1cC1kaXNrLXRhYlwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWREaXNrQmFja3Vwcyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiYmFja3VwLXBvaW50aW50aW1lLXRhYlwiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRQb2ludEluVGltZVRhYik7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiYmFja3VwLWhpc3RvcnktdGFiXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEJhY2t1cEhpc3RvcnkpO1xuXG4gIC8vID09PT09IFBvaW50LWluLVRpbWUgUmVzdG9yZSBUYWIgPT09PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFBvaW50SW5UaW1lVGFiKCkge1xuICAgIGlmICghcG9pbnRpbnRpbWVDb250YWluZXIpIHJldHVybjtcblxuICAgIC8vIENoZWNrIHByZW1pdW1cbiAgICB0cnkge1xuICAgICAgdmFyIGxpY2Vuc2VSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9saWNlbnNlL3N0YXR1cycpO1xuICAgICAgdmFyIGxpY2Vuc2VEYXRhID0gYXdhaXQgbGljZW5zZVJlcy5qc29uKCk7XG4gICAgICBpZiAobGljZW5zZURhdGEudGllciAhPT0gJ3ByZW1pdW0nKSB7XG4gICAgICAgIHBvaW50aW50aW1lQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cInBhZGRpbmc6IDI0cHg7IHRleHQtYWxpZ246IGNlbnRlcjtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMnJlbTsgbWFyZ2luLWJvdHRvbTogMTJweDtcIj5cdTJCNTA8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDhweDtcIj5QcmVtaXVtIEZlYXR1cmU8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Qb2ludC1pbi10aW1lIHJlc3RvcmUgcmVxdWlyZXMgRGFzaENhZGR5IFByZW1pdW0gd2l0aCBhdXRvLWJhY2t1cCBlbmFibGVkLjwvZGl2PicgK1xuICAgICAgICAgICc8YnV0dG9uIG9uY2xpY2s9XCJzaG93Tm90aWZpY2F0aW9uKFxcJ1VwZ3JhZGUgdG8gUHJlbWl1bSBmb3IgcG9pbnQtaW4tdGltZSByZXN0b3JlIVxcJywgXFwnaW5mb1xcJyk7IHNjcm9sbFRvU2VjdGlvbihcXCdsaWNlbnNlXFwnKTtcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDhweCAyMHB4OyBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZjM5YzEyLCAjZTY3ZTIyKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwO1wiPlVwZ3JhZGUgdG8gUHJlbWl1bTwvYnV0dG9uPicgK1xuICAgICAgICAgICc8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkgeyAvKiBpZ25vcmUgKi8gfVxuXG4gICAgcG9pbnRpbnRpbWVDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgLy8gRmV0Y2ggc2VydmljZXMgZm9yIGRyb3Bkb3duXG4gICAgICB2YXIgc2VydmljZXNSZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zZXJ2aWNlcycpO1xuICAgICAgdmFyIHNlcnZpY2VzRGF0YSA9IGF3YWl0IHNlcnZpY2VzUmVzLmpzb24oKTtcbiAgICAgIHZhciBzZXJ2aWNlcyA9IHNlcnZpY2VzRGF0YS5zZXJ2aWNlcyB8fCBbXTtcblxuICAgICAgaWYgKHNlcnZpY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwb2ludGludGltZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0U2PC9zcGFuPiBObyBhcHBzIGRlcGxveWVkIHlldDwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGh0bWwgPSAnPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAwIDEycHg7XCI+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+JyArXG4gICAgICAgICcgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgd2hpdGUtc3BhY2U6IG5vd3JhcDtcIj5BcHA6PC9sYWJlbD4nICtcbiAgICAgICAgJyAgPHNlbGVjdCBpZD1cInBpdC1hcHAtc2VsZWN0XCIgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IG1heC13aWR0aDogMjQwcHg7XCI+JztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VydmljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaHRtbCArPSAnPG9wdGlvbiB2YWx1ZT1cIicgKyBlc2NhcGVIdG1sKHNlcnZpY2VzW2ldLmlkIHx8IHNlcnZpY2VzW2ldLm5hbWUgfHwgJycpICsgJ1wiPicgK1xuICAgICAgICAgIGVzY2FwZUh0bWwoc2VydmljZXNbaV0ubmFtZSB8fCBzZXJ2aWNlc1tpXS5pZCB8fCAnJykgKyAnPC9vcHRpb24+JztcbiAgICAgIH1cbiAgICAgIGh0bWwgKz0gJzwvc2VsZWN0PicgK1xuICAgICAgICAnICA8YnV0dG9uIGlkPVwicGl0LWxvYWQtYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMTZweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDZweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwO1wiPkxvYWQgQmFja3VwczwvYnV0dG9uPicgK1xuICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICc8ZGl2IGlkPVwicGl0LWJhY2t1cHMtbGlzdFwiIHN0eWxlPVwibWF4LWhlaWdodDogMzIwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+PC9kaXY+JyArXG4gICAgICAgICc8L2Rpdj4nO1xuXG4gICAgICBwb2ludGludGltZUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGl0LWxvYWQtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBhcHBJZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwaXQtYXBwLXNlbGVjdCcpPy52YWx1ZTtcbiAgICAgICAgaWYgKGFwcElkKSBsb2FkUG9pbnRJblRpbWVCYWNrdXBzKGFwcElkKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHBvaW50aW50aW1lQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRQb2ludEluVGltZUJhY2t1cHMoYXBwSWQpIHtcbiAgICB2YXIgbGlzdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BpdC1iYWNrdXBzLWxpc3QnKTtcbiAgICBpZiAoIWxpc3RFbCkgcmV0dXJuO1xuXG4gICAgbGlzdEVsLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMjBweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBiYWNrdXBzLi4uPC9kaXY+JztcblxuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9maWxlcy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGFwcElkKSk7XG4gICAgICB2YXIgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLmZpbGVzIHx8IGRhdGEuZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0JFPC9zcGFuPiBObyBiYWNrdXAgZmlsZXMgZm9yICcgKyBlc2NhcGVIdG1sKGFwcElkKSArICc8L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBodG1sID0gJzxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDhweDtcIj4nICsgZGF0YS5maWxlcy5sZW5ndGggKyAnIGJhY2t1cChzKTwvZGl2PicgK1xuICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogNnB4O1wiPic7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5maWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZiA9IGRhdGEuZmlsZXNbaV07XG4gICAgICAgIHZhciBkYXRlU3RyID0gbmV3IERhdGUoZi50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCk7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPicgK1xuICAgICAgICAgICcgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNTAwOyBmb250LXNpemU6IDAuODVyZW07XCI+JyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICc8L2Rpdj4nICtcbiAgICAgICAgICAnICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPicgKyBmLnNpemVGb3JtYXR0ZWQgKyAnPC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2PicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tYm90dG9tOiA4cHg7XCI+JyArIGRhdGVTdHIgKyAnPC9kaXY+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDZweDtcIj4nICtcbiAgICAgICAgICAnICA8YnV0dG9uIGNsYXNzPVwicGl0LWNvbXBhcmUtYnRuXCIgZGF0YS1hcHBpZD1cIicgKyBlc2NhcGVIdG1sKGFwcElkKSArICdcIiBkYXRhLWZpbGVuYW1lPVwiJyArIGVzY2FwZUh0bWwoZi5uYW1lKSArICdcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1hY2NlbnQpOyBjb2xvcjogdmFyKC0tYWNjZW50KTsgYm9yZGVyLXJhZGl1czogNXB4OyBjdXJzb3I6IHBvaW50ZXI7XCI+Q29tcGFyZTwvYnV0dG9uPicgK1xuICAgICAgICAgICcgIDxidXR0b24gY2xhc3M9XCJwaXQtcmVzdG9yZS1idG5cIiBkYXRhLWFwcGlkPVwiJyArIGVzY2FwZUh0bWwoYXBwSWQpICsgJ1wiIGRhdGEtZmlsZW5hbWU9XCInICsgZXNjYXBlSHRtbChmLm5hbWUpICsgJ1wiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tb2stZmcpLCAjMjdhZTYwKTsgYm9yZGVyOiBub25lOyBjb2xvcjogd2hpdGU7IGJvcmRlci1yYWRpdXM6IDVweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNTAwO1wiPlJlc3RvcmU8L2J1dHRvbj4nICtcbiAgICAgICAgICAnPC9kaXY+JyArXG4gICAgICAgICAgJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgbGlzdEVsLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIFdpcmUgdXAgYnV0dG9uc1xuICAgICAgbGlzdEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5waXQtY29tcGFyZS1idG4nKS5mb3JFYWNoKGZ1bmN0aW9uKGJ0bikge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbigpIHsgY29tcGFyZUJhY2t1cEZpbGUoYnRuLmRhdGFzZXQuYXBwaWQsIGJ0bi5kYXRhc2V0LmZpbGVuYW1lKTsgfSk7XG4gICAgICB9KTtcbiAgICAgIGxpc3RFbC5xdWVyeVNlbGVjdG9yQWxsKCcucGl0LXJlc3RvcmUtYnRuJykuZm9yRWFjaChmdW5jdGlvbihidG4pIHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7IHJlc3RvcmVCYWNrdXBGaWxlKGJ0bi5kYXRhc2V0LmFwcGlkLCBidG4uZGF0YXNldC5maWxlbmFtZSk7IH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNvbXBhcmVCYWNrdXBGaWxlKGFwcElkLCBmaWxlbmFtZSkge1xuICAgIHRyeSB7XG4gICAgICB2YXIgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvYmFja3Vwcy9jb21wYXJlLycgKyBlbmNvZGVVUklDb21wb25lbnQoZmlsZW5hbWUpLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoe30pXG4gICAgICB9KTtcbiAgICAgIHZhciBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0NvbXBhcmUgZmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGRpZmYgPSBkYXRhLmRpZmY7XG4gICAgICB2YXIgaHRtbCA9ICc8ZGl2IHN0eWxlPVwicG9zaXRpb246IGZpeGVkOyB0b3A6IDA7IGxlZnQ6IDA7IHJpZ2h0OiAwOyBib3R0b206IDA7IGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTsgei1pbmRleDogMTAwMDA7IGRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogY2VudGVyO1wiIGlkPVwiY29tcGFyZS1vdmVybGF5XCI+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDEycHg7IG1heC13aWR0aDogNjAwcHg7IHdpZHRoOiA5MCU7IG1heC1oZWlnaHQ6IDgwdmg7IG92ZXJmbG93OiBhdXRvOyBwYWRkaW5nOiAyMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAnPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgMTZweDtcIj5cdUQ4M0RcdURDQ0EgQ29tcGFyZTogJyArIGVzY2FwZUh0bWwoZmlsZW5hbWUpICsgJzwvaDQ+JyArXG4gICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi1ib3R0b206IDE2cHg7XCI+U2l6ZTogJyArIChkaWZmLnNpemVGb3JtYXR0ZWQgfHwgJz8nKSArICcgfCBDcmVhdGVkOiAnICsgbmV3IERhdGUoZGlmZi50aW1lc3RhbXApLnRvTG9jYWxlU3RyaW5nKCkgKyAnPC9kaXY+JztcblxuICAgICAgaWYgKGRpZmYuc2VydmljZXMpIHtcbiAgICAgICAgdmFyIHN2Y0NoYW5nZWQgPSBkaWZmLnNlcnZpY2VzLmhhc0NoYW5nZXMgPyAnXHVEODNEXHVERDM0JyA6ICdcdUQ4M0RcdURGRTInO1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPicgK1xuICAgICAgICAgICc8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjg1cmVtOyBtYXJnaW4tYm90dG9tOiA0cHg7XCI+JyArIHN2Y0NoYW5nZWQgKyAnIFNlcnZpY2VzIChiYWNrdXAgdnMgY3VycmVudCk8L2Rpdj4nICtcbiAgICAgICAgICAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkJhY2t1cDogJyArIGRpZmYuc2VydmljZXMuYmFja3VwQ291bnQgKyAnIHNlcnZpY2VzIHwgQ3VycmVudDogJyArIGRpZmYuc2VydmljZXMuY3VycmVudENvdW50ICsgJyBzZXJ2aWNlczwvZGl2Pic7XG4gICAgICAgIGlmIChkaWZmLnNlcnZpY2VzLmhhc0NoYW5nZXMpIHtcbiAgICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogNnB4OyBmb250LXNpemU6IDAuOHJlbTsgY29sb3I6ICNmMzljMTI7XCI+U2VydmljZXMgZGlmZmVyIFx1MjAxNCByZXN0b3Jpbmcgd2lsbCByZXBsYWNlIGN1cnJlbnQgY29uZmlndXJhdGlvbjwvZGl2Pic7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIH1cblxuICAgICAgaWYgKGRpZmYuY29uZmlnKSB7XG4gICAgICAgIHZhciBjZmdDaGFuZ2VkID0gZGlmZi5jb25maWcuaGFzQ2hhbmdlcyA/ICdcdUQ4M0RcdUREMzQnIDogJ1x1RDgzRFx1REZFMic7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJhc2UpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+JyArXG4gICAgICAgICAgJzxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07IG1hcmdpbi1ib3R0b206IDRweDtcIj4nICsgY2ZnQ2hhbmdlZCArICcgQ29uZmlndXJhdGlvbjwvZGl2Pic7XG4gICAgICAgIGlmIChkaWZmLmNvbmZpZy5oYXNDaGFuZ2VzKSB7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogI2YzOWMxMjtcIj5Db25maWd1cmF0aW9uIGRpZmZlcnMgXHUyMDE0IHJlc3RvcmluZyB3aWxsIHJlcGxhY2UgY3VycmVudCBzZXR0aW5nczwvZGl2Pic7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaHRtbCArPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tb2stZmcpO1wiPk5vIGNoYW5nZXM8L2Rpdj4nO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzxidXR0b24gaWQ9XCJjb21wYXJlLWNsb3NlLWJ0blwiIHN0eWxlPVwicGFkZGluZzogOHB4IDIwcHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGJvcmRlcjogbm9uZTsgY29sb3I6IHdoaXRlOyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC13ZWlnaHQ6IDUwMDtcIj5DbG9zZTwvYnV0dG9uPicgK1xuICAgICAgICAnPC9kaXY+PC9kaXY+JztcblxuICAgICAgZG9jdW1lbnQuYm9keS5pbnNlcnRBZGphY2VudEhUTUwoJ2JlZm9yZWVuZCcsIGh0bWwpO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBhcmUtY2xvc2UtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wYXJlLW92ZXJsYXknKT8ucmVtb3ZlKCk7XG4gICAgICB9KTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wYXJlLW92ZXJsYXknKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIGlmIChlLnRhcmdldCA9PT0gdGhpcykgdGhpcy5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0NvbXBhcmUgZXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlc3RvcmVCYWNrdXBGaWxlKGFwcElkLCBmaWxlbmFtZSkge1xuICAgIGlmICghY29uZmlybSgnUmVzdG9yZSAnICsgZmlsZW5hbWUgKyAnIGZvciAnICsgYXBwSWQgKyAnP1xcblxcblRoaXMgd2lsbCByZXBsYWNlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgY3JlZGVudGlhbHMsIGFuZCBkYXRhLiBDb250YWluZXJzIHdpbGwgYmUgcmVzdGFydGVkLicpKSByZXR1cm47XG5cbiAgICB0cnkge1xuICAgICAgdmFyIHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2FwcHMvJyArIGVuY29kZVVSSUNvbXBvbmVudChhcHBJZCkgKyAnL3JldmVydC8nICsgZW5jb2RlVVJJQ29tcG9uZW50KGZpbGVuYW1lKSwge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVzdGFydENvbnRhaW5lcnM6IHRydWUgfSlcbiAgICAgIH0pO1xuICAgICAgdmFyIGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGFwcElkICsgJyByZXN0b3JlZCB0byAnICsgZmlsZW5hbWUsICdzdWNjZXNzJyk7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGxvY2F0aW9uLnJlbG9hZCgpOyB9LCAxNTAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1Jlc3RvcmUgZmFpbGVkOiAnICsgKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24nKSwgJ2Vycm9yJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUmVzdG9yZSBlcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBSRVNPVVJDRSBNT05JVE9SIChFbmhhbmNlZCkgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnc3RhdHMtbW9kYWwnLCBgPGRpdiBpZD1cInN0YXRzLW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA3NTBweDsgbWF4LXdpZHRoOiA5NTBweDtcIj5cbiAgICAgIDxoMz5cdUQ4M0RcdURDQ0EgUmVzb3VyY2UgTW9uaXRvcjwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIFJlYWwtdGltZSBhbmQgaGlzdG9yaWNhbCBDUFUsIG1lbW9yeSwgbmV0d29yaywgYW5kIGRpc2sgdXNhZ2UgZm9yIGNvbnRhaW5lcnMuXG4gICAgICA8L3A+XG5cbiAgICAgIDwhLS0gVGFiIGJhciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC10YWJzXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWIgYWN0aXZlXCIgZGF0YS1wYW5lbD1cInN0YXRzLWxpdmVcIj5MaXZlIFN0YXRzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwic3RhdHMtYWdncmVnYXRlZFwiPjI0aCBTdW1tYXJ5PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwic3RhdHMtaGlzdG9yeVwiPkhpc3Rvcnk8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJzdGF0cy1hbGVydHNcIj5BbGVydHM8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogTGl2ZSBTdGF0cyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJzdGF0cy1saXZlXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8ZGl2IGlkPVwic3RhdHMtY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjsgcGFkZGluZzogNDBweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBjb250YWluZXIgc3RhdHMuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IDI0aCBBZ2dyZWdhdGVkIFN1bW1hcnkgLS0+XG4gICAgICA8ZGl2IGlkPVwic3RhdHMtYWdncmVnYXRlZFwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwic3RhdHMtYWdncmVnYXRlZC1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDODwvc3Bhbj5cbiAgICAgICAgICAgIExvYWRpbmcgMjQtaG91ciBhZ2dyZWdhdGVkIG1ldHJpY3MuLi5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IExvbmctdGVybSBIaXN0b3J5IC0tPlxuICAgICAgPGRpdiBpZD1cInN0YXRzLWhpc3RvcnlcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyOyBtYXJnaW4tYm90dG9tOiAxMnB4OyBmbGV4LXdyYXA6IHdyYXA7XCI+XG4gICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvbnRhaW5lcjo8L2xhYmVsPlxuICAgICAgICAgIDxzZWxlY3QgaWQ9XCJzdGF0cy1oaXN0b3J5LWNvbnRhaW5lclwiIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuODVyZW07IGZsZXg6IDE7IG1pbi13aWR0aDogMTgwcHg7XCI+PC9zZWxlY3Q+XG4gICAgICAgICAgPGRpdiBpZD1cInN0YXRzLWhpc3RvcnktcmFuZ2UtYnV0dG9uc1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA0cHg7XCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RhdHMtcmFuZ2UtYnRuIGFjdGl2ZVwiIGRhdGEtcmFuZ2U9XCIxaFwiPjFoPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RhdHMtcmFuZ2UtYnRuXCIgZGF0YS1yYW5nZT1cIjI0aFwiPjI0aDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0YXRzLXJhbmdlLWJ0blwiIGRhdGEtcmFuZ2U9XCI3ZFwiPjdkPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic3RhdHMtcmFuZ2UtYnRuXCIgZGF0YS1yYW5nZT1cIjMwZFwiPjMwZDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInN0YXRzLXJhbmdlLWJ0blwiIGRhdGEtcmFuZ2U9XCIxeVwiPjF5PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic3RhdHMtaGlzdG9yeS1jb250YWluZXItYXJlYVwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0NBPC9zcGFuPlxuICAgICAgICAgICAgQ2hvb3NlIGEgY29udGFpbmVyIGFuZCB0aW1lIHJhbmdlIHRvIHZpZXcgaGlzdG9yeS5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEFsZXJ0IENvbmZpZ3VyYXRpb24gLS0+XG4gICAgICA8ZGl2IGlkPVwic3RhdHMtYWxlcnRzXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJzdGF0cy1hbGVydHMtY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdUREMTQ8L3NwYW4+XG4gICAgICAgICAgICBMb2FkaW5nIGFsZXJ0IGNvbmZpZ3VyYXRpb25zLi4uXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQXV0by1yZWZyZXNoIHRvZ2dsZSAoYm90dG9tIGJhcikgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtYm90dG9tLWJhclwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJjaGVja2JveC1sYWJlbFwiIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cInN0YXRzLWF1dG8tcmVmcmVzaFwiIGNoZWNrZWQgLz5cbiAgICAgICAgICBBdXRvLXJlZnJlc2ggZXZlcnkgNXNcbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPGJ1dHRvbiBpZD1cInN0YXRzLXJlZnJlc2gtYnRuXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaCBOb3c8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4gaWQ9XCJzdGF0cy1sYXN0LXVwZGF0ZVwiIGNsYXNzPVwidGV4dC1hdXRvLXJpZ2h0XCI+PC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ2xvc2UgQnV0dG9uIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzdGF0cy1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udGFpbmVyLXN0YXRzLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtY2FuY2VsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHMtcmVmcmVzaC1idG4nKTtcbiAgY29uc3QgYXV0b1JlZnJlc2hDaGVja2JveCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1hdXRvLXJlZnJlc2gnKTtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWNvbnRhaW5lcicpO1xuICBjb25zdCBhZ2dyZWdhdGVkQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWFnZ3JlZ2F0ZWQtY29udGFpbmVyJyk7XG4gIGNvbnN0IGFsZXJ0c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1hbGVydHMtY29udGFpbmVyJyk7XG4gIGNvbnN0IGxhc3RVcGRhdGVTcGFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3N0YXRzLWxhc3QtdXBkYXRlJyk7XG5cbiAgbGV0IHJlZnJlc2hJbnRlcnZhbCA9IG51bGw7XG4gIGxldCBjYWNoZWRNb25pdG9yaW5nRGF0YSA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZm9ybWF0Qnl0ZXMoYnl0ZXMpIHtcbiAgICBpZiAoYnl0ZXMgPT09IDAgfHwgIWJ5dGVzKSByZXR1cm4gJzAgQic7XG4gICAgY29uc3QgayA9IDEwMjQ7XG4gICAgY29uc3Qgc2l6ZXMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InXTtcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSk7XG4gICAgcmV0dXJuIHBhcnNlRmxvYXQoKGJ5dGVzIC8gTWF0aC5wb3coaywgaSkpLnRvRml4ZWQoMSkpICsgJyAnICsgc2l6ZXNbaV07XG4gIH1cblxuICBmdW5jdGlvbiBnZXRDcHVDb2xvcihwZXJjZW50KSB7XG4gICAgaWYgKHBlcmNlbnQgPCAzMCkgcmV0dXJuICcjMmVjYzcxJztcbiAgICBpZiAocGVyY2VudCA8IDcwKSByZXR1cm4gJyNmMzljMTInO1xuICAgIHJldHVybiAnI2U3NGMzYyc7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRNZW1Db2xvcihwZXJjZW50KSB7XG4gICAgaWYgKHBlcmNlbnQgPCA1MCkgcmV0dXJuICcjMmVjYzcxJztcbiAgICBpZiAocGVyY2VudCA8IDgwKSByZXR1cm4gJyNmMzljMTInO1xuICAgIHJldHVybiAnI2U3NGMzYyc7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkU3RhdHMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSBuZXcgbW9uaXRvcmluZyBBUEkgZmlyc3QsIGZhbGwgYmFjayB0byBvbGRcbiAgICAgIGxldCBzdGF0cyA9IG51bGw7XG4gICAgICBsZXQgaXNOZXdBcGkgPSBmYWxzZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL21vbml0b3Jpbmcvc3RhdHMnKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5zdGF0cykgeyBzdGF0cyA9IGRhdGEuc3RhdHM7IGlzTmV3QXBpID0gdHJ1ZTsgY2FjaGVkTW9uaXRvcmluZ0RhdGEgPSBkYXRhLnN0YXRzOyB9XG4gICAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgICBpZiAoIWlzTmV3QXBpKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc3RhdHMvY29udGFpbmVycycpO1xuICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoZGF0YS5zdWNjZXNzICYmIGRhdGEuc3RhdHMpIHtcbiAgICAgICAgICAvLyBDb252ZXJ0IGFycmF5IGZvcm1hdCB0byBvYmplY3QgZm9ybWF0XG4gICAgICAgICAgc3RhdHMgPSB7fTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHMgb2YgZGF0YS5zdGF0cykge1xuICAgICAgICAgICAgc3RhdHNbcy5uYW1lXSA9IHsgbmFtZTogcy5uYW1lLCBjdXJyZW50OiB7IGNwdTogcy5jcHUsIG1lbW9yeTogeyBwZXJjZW50OiBzLm1lbW9yeS5wZXJjZW50LCB1c2FnZTogcy5tZW1vcnkudXNlZCwgbGltaXQ6IHMubWVtb3J5LmxpbWl0LCB1c2FnZU1COiBNYXRoLnJvdW5kKHMubWVtb3J5LnVzZWQgLyAxMDQ4NTc2KSwgbGltaXRNQjogTWF0aC5yb3VuZChzLm1lbW9yeS5saW1pdCAvIDEwNDg1NzYpIH0sIG5ldHdvcms6IHsgcnhCeXRlczogcy5uZXR3b3JrLnJ4LCB0eEJ5dGVzOiBzLm5ldHdvcmsudHgsIHJ4TUI6IChzLm5ldHdvcmsucnggLyAxMDQ4NTc2KS50b0ZpeGVkKDEpLCB0eE1COiAocy5uZXR3b3JrLnR4IC8gMTA0ODU3NikudG9GaXhlZCgxKSB9LCBkaXNrOiB7IHJlYWRNQjogMCwgd3JpdGVNQjogMCB9IH0sIHN0YXR1czogcy5zdGF0dXMgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FjaGVkTW9uaXRvcmluZ0RhdGEgPSBzdGF0cztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXN0YXRzIHx8IE9iamVjdC5rZXlzKHN0YXRzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk5vIHJ1bm5pbmcgY29udGFpbmVycyBmb3VuZDwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IGh0bWwgPSAnPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47IGdhcDogOHB4O1wiPic7XG5cbiAgICAgIGZvciAoY29uc3QgW2lkLCBpbmZvXSBvZiBPYmplY3QuZW50cmllcyhzdGF0cykpIHtcbiAgICAgICAgY29uc3QgY3VyID0gaW5mby5jdXJyZW50IHx8IGluZm87XG4gICAgICAgIGNvbnN0IGNwdSA9IGN1ci5jcHU/LnBlcmNlbnQgfHwgMDtcbiAgICAgICAgY29uc3QgbWVtID0gY3VyLm1lbW9yeT8ucGVyY2VudCB8fCAwO1xuICAgICAgICBjb25zdCBjcHVDb2xvciA9IGdldENwdUNvbG9yKGNwdSk7XG4gICAgICAgIGNvbnN0IG1lbUNvbG9yID0gZ2V0TWVtQ29sb3IobWVtKTtcbiAgICAgICAgY29uc3QgbWVtVXNlZCA9IGN1ci5tZW1vcnk/LnVzYWdlIHx8IGN1ci5tZW1vcnk/LnVzZWQgfHwgMDtcbiAgICAgICAgY29uc3QgbWVtTGltaXQgPSBjdXIubWVtb3J5Py5saW1pdCB8fCAwO1xuICAgICAgICBjb25zdCBuZXRSeCA9IGN1ci5uZXR3b3JrPy5yeEJ5dGVzIHx8IGN1ci5uZXR3b3JrPy5yeCB8fCAwO1xuICAgICAgICBjb25zdCBuZXRUeCA9IGN1ci5uZXR3b3JrPy50eEJ5dGVzIHx8IGN1ci5uZXR3b3JrPy50eCB8fCAwO1xuICAgICAgICBjb25zdCBhZ2cgPSBpbmZvLmFnZ3JlZ2F0ZWQ7XG5cbiAgICAgICAgaHRtbCArPSBgXG4gICAgICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDEwcHg7XCI+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZmxleDogMTtcIj4ke2luZm8ubmFtZSB8fCBpZH08L3NwYW4+XG4gICAgICAgICAgICAgICR7YWdnID8gYDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjY1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBwYWRkaW5nOiAycHggNnB4OyBiYWNrZ3JvdW5kOiBjb2xvci1taXgoaW4gc3JnYiwgdmFyKC0tYWNjZW50KSAxMCUsIHRyYW5zcGFyZW50KTsgYm9yZGVyLXJhZGl1czogNHB4O1wiPmF2ZyAke2FnZy5jcHU/LmF2Zz8udG9GaXhlZCgwKSB8fCAwfSUgY3B1PC9zcGFuPmAgOiAnJ31cbiAgICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGJhY2tncm91bmQ6IHZhcigtLWJhc2UpOyBwYWRkaW5nOiAycHggOHB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+JHtpbmZvLnN0YXR1cyB8fCAncnVubmluZyd9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoMywgMWZyKTsgZ2FwOiAxMnB4O1wiPlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPkNQVTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBoZWlnaHQ6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDNweDsgb3ZlcmZsb3c6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogMTAwJTsgd2lkdGg6ICR7TWF0aC5taW4oY3B1LCAxMDApfSU7IGJhY2tncm91bmQ6ICR7Y3B1Q29sb3J9OyBib3JkZXItcmFkaXVzOiAzcHg7IHRyYW5zaXRpb246IHdpZHRoIDAuM3M7XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGZvbnQtd2VpZ2h0OiA1MDA7IGNvbG9yOiAke2NwdUNvbG9yfTsgbWluLXdpZHRoOiA0NXB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj4ke2NwdS50b0ZpeGVkKDEpfSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPk1lbW9yeTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDtcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmbGV4OiAxOyBoZWlnaHQ6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmFzZSk7IGJvcmRlci1yYWRpdXM6IDNweDsgb3ZlcmZsb3c6IGhpZGRlbjtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogMTAwJTsgd2lkdGg6ICR7TWF0aC5taW4obWVtLCAxMDApfSU7IGJhY2tncm91bmQ6ICR7bWVtQ29sb3J9OyBib3JkZXItcmFkaXVzOiAzcHg7IHRyYW5zaXRpb246IHdpZHRoIDAuM3M7XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGZvbnQtd2VpZ2h0OiA1MDA7IGNvbG9yOiAke21lbUNvbG9yfTsgbWluLXdpZHRoOiA0NXB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj4ke21lbS50b0ZpeGVkKDEpfSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC42NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4O1wiPiR7Zm9ybWF0Qnl0ZXMobWVtVXNlZCl9IC8gJHtmb3JtYXRCeXRlcyhtZW1MaW1pdCl9PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNHB4O1wiPk5ldHdvcms8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjMzQ5OGRiO1wiPlx1MjE5MyAke2Zvcm1hdEJ5dGVzKG5ldFJ4KX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCA0cHg7XCI+Lzwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6ICNlNzRjM2M7XCI+XHUyMTkxICR7Zm9ybWF0Qnl0ZXMobmV0VHgpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgbGFzdFVwZGF0ZVNwYW4udGV4dENvbnRlbnQgPSAnVXBkYXRlZDogJyArIG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA0MHB4OyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5cdTI3NEMgRmFpbGVkIHRvIGxvYWQgc3RhdHM6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gPT09IDI0aCBBZ2dyZWdhdGVkIFRhYiA9PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEFnZ3JlZ2F0ZWQoKSB7XG4gICAgaWYgKCFhZ2dyZWdhdGVkQ29udGFpbmVyKSByZXR1cm47XG4gICAgY29uc3QgZGF0YSA9IGNhY2hlZE1vbml0b3JpbmdEYXRhO1xuICAgIGlmICghZGF0YSB8fCBPYmplY3Qua2V5cyhkYXRhKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGFnZ3JlZ2F0ZWRDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1RENDODwvc3Bhbj5ObyBtb25pdG9yaW5nIGRhdGEgYXZhaWxhYmxlLiBPcGVuIHRoZSBMaXZlIFN0YXRzIHRhYiBmaXJzdC48L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgaHRtbCA9ICc8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsgZ2FwOiAxMnB4O1wiPic7XG4gICAgZm9yIChjb25zdCBbaWQsIGluZm9dIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEpKSB7XG4gICAgICBjb25zdCBhZ2cgPSBpbmZvLmFnZ3JlZ2F0ZWQ7XG4gICAgICBpZiAoIWFnZykgY29udGludWU7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTsgYm9yZGVyLXJhZGl1czogOHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj4ke2luZm8ubmFtZSB8fCBpZH08L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIDFmcik7IGdhcDogOHB4O1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LW1pbmktY2FyZFwiPjxzcGFuIGNsYXNzPVwic3RhdC12YWxcIj4ke2FnZy5jcHU/LmF2Zz8udG9GaXhlZCgxKSB8fCAwfSU8L3NwYW4+PHNwYW4gY2xhc3M9XCJzdGF0LWxibFwiPkF2ZyBDUFU8L3NwYW4+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXQtbWluaS1jYXJkXCI+PHNwYW4gY2xhc3M9XCJzdGF0LXZhbFwiPiR7YWdnLmNwdT8ubWF4Py50b0ZpeGVkKDEpIHx8IDB9JTwvc3Bhbj48c3BhbiBjbGFzcz1cInN0YXQtbGJsXCI+TWF4IENQVTwvc3Bhbj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdC1taW5pLWNhcmRcIj48c3BhbiBjbGFzcz1cInN0YXQtdmFsXCI+JHthZ2cubWVtb3J5Py5hdmc/LnRvRml4ZWQoMSkgfHwgMH0lPC9zcGFuPjxzcGFuIGNsYXNzPVwic3RhdC1sYmxcIj5BdmcgTWVtPC9zcGFuPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0LW1pbmktY2FyZFwiPjxzcGFuIGNsYXNzPVwic3RhdC12YWxcIj4ke2FnZy5tZW1vcnk/Lm1heD8udG9GaXhlZCgxKSB8fCAwfSU8L3NwYW4+PHNwYW4gY2xhc3M9XCJzdGF0LWxibFwiPk1heCBNZW08L3NwYW4+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICAke2FnZy5kYXRhUG9pbnRzID8gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuN3JlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNnB4O1wiPiR7YWdnLmRhdGFQb2ludHN9IGRhdGEgcG9pbnRzIG92ZXIgJHthZ2cudGltZVJhbmdlIHx8IDI0fWg8L2Rpdj5gIDogJyd9XG4gICAgICA8L2Rpdj5gO1xuICAgIH1cbiAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIGFnZ3JlZ2F0ZWRDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgfVxuXG4gIC8vID09PSBBbGVydHMgVGFiID09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkQWxlcnRzKCkge1xuICAgIGlmICghYWxlcnRzQ29udGFpbmVyKSByZXR1cm47XG4gICAgYWxlcnRzQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgYWxlcnRzLi4uPC9kaXY+JztcblxuICAgIGNvbnN0IGRhdGEgPSBjYWNoZWRNb25pdG9yaW5nRGF0YTtcbiAgICBpZiAoIWRhdGEgfHwgT2JqZWN0LmtleXMoZGF0YSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBhbGVydHNDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1REQxNDwvc3Bhbj5ObyBjb250YWluZXJzIGZvdW5kLiBPcGVuIHRoZSBMaXZlIFN0YXRzIHRhYiBmaXJzdC48L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHByZW1pdW0gc3RhdHVzIGZvciBjb25maWcgc2VjdGlvbiB2aXNpYmlsaXR5XG4gICAgbGV0IGlzUHJlbWl1bSA9IGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbGljZW5zZS9mZWF0dXJlL3Jlc291cmNlLWFsZXJ0cycpO1xuICAgICAgY29uc3QgbGQgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlzUHJlbWl1bSA9IGxkLmF2YWlsYWJsZTtcbiAgICB9IGNhdGNoIChfKSB7IGlzUHJlbWl1bSA9IGZhbHNlOyB9XG5cbiAgICAvLyBGZXRjaCBhbGVydCBoaXN0b3J5XG4gICAgbGV0IGFsZXJ0SGlzdG9yeSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBociA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL21vbml0b3JpbmcvYWxlcnRzP2xpbWl0PTUwJyk7XG4gICAgICBjb25zdCBoZCA9IGF3YWl0IGhyLmpzb24oKTtcbiAgICAgIGlmIChoZC5zdWNjZXNzKSBhbGVydEhpc3RvcnkgPSBoZC5oaXN0b3J5IHx8IFtdO1xuICAgIH0gY2F0Y2ggKF8pIHt9XG5cbiAgICAvLyBGZXRjaCBhbGwgYWxlcnQgY29uZmlnc1xuICAgIGxldCBhbGxDb25maWdzID0ge307XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNyID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbW9uaXRvcmluZy9hbGVydHMvY29uZmlnJyk7XG4gICAgICBjb25zdCBjZCA9IGF3YWl0IGNyLmpzb24oKTtcbiAgICAgIGlmIChjZC5zdWNjZXNzKSBhbGxDb25maWdzID0gY2QuY29uZmlncyB8fCB7fTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgY29uc3QgY29udGFpbmVycyA9IE9iamVjdC5lbnRyaWVzKGRhdGEpO1xuICAgIGNvbnN0IGNvbnRhaW5lclJvd3MgPSBjb250YWluZXJzLm1hcCgoW2lkLCBpbmZvXSkgPT4ge1xuICAgICAgY29uc3QgY2ZnID0gYWxsQ29uZmlnc1tpZF0gfHwgeyBjcHVUaHJlc2hvbGQ6IDgwLCBtZW1vcnlUaHJlc2hvbGQ6IDkwLCBkaXNrSU9UaHJlc2hvbGQ6IDUwLCBhdXRvUmVzdGFydDogZmFsc2UsIGVuYWJsZWQ6IGZhbHNlIH07XG4gICAgICByZXR1cm4gYFxuICAgICAgICA8dHIgZGF0YS1jb250YWluZXI9XCIke2lkfVwiPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IHBhZGRpbmc6IDhweDtcIj4ke2luZm8ubmFtZSB8fCBpZH08L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7XCI+PGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImFsZXJ0LWNwdVwiIHZhbHVlPVwiJHtjZmcuY3B1VGhyZXNob2xkID8/IDgwfVwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiBzdHlsZT1cIndpZHRoOiA2MHB4OyBmb250LXNpemU6IDAuOHJlbTsgcGFkZGluZzogMnB4IDRweDtcIiAke2lzUHJlbWl1bSA/ICcnIDogJ2Rpc2FibGVkJ30gLz48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7XCI+PGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImFsZXJ0LW1lbVwiIHZhbHVlPVwiJHtjZmcubWVtb3J5VGhyZXNob2xkID8/IDkwfVwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiBzdHlsZT1cIndpZHRoOiA2MHB4OyBmb250LXNpemU6IDAuOHJlbTsgcGFkZGluZzogMnB4IDRweDtcIiAke2lzUHJlbWl1bSA/ICcnIDogJ2Rpc2FibGVkJ30gLz48L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDRweCA4cHg7XCI+PGlucHV0IHR5cGU9XCJudW1iZXJcIiBjbGFzcz1cImFsZXJ0LWRpc2tcIiB2YWx1ZT1cIiR7Y2ZnLmRpc2tJT1RocmVzaG9sZCA/PyA1MH1cIiBtaW49XCIwXCIgbWF4PVwiMTAwMFwiIHN0eWxlPVwid2lkdGg6IDcwcHg7IGZvbnQtc2l6ZTogMC44cmVtOyBwYWRkaW5nOiAycHggNHB4O1wiICR7aXNQcmVtaXVtID8gJycgOiAnZGlzYWJsZWQnfSAvPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDtcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJhbGVydC1hdXRvcmVzdGFydFwiICR7Y2ZnLmF1dG9SZXN0YXJ0ID8gJ2NoZWNrZWQnIDogJyd9ICR7aXNQcmVtaXVtID8gJycgOiAnZGlzYWJsZWQnfSAvPjwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhbGVydC10ZXN0LWJ0biBidG4teHNcIiBkYXRhLWNvbnRhaW5lcj1cIiR7aWR9XCIgZGF0YS1uYW1lPVwiJHtpbmZvLm5hbWUgfHwgaWR9XCIgc3R5bGU9XCJwYWRkaW5nOiAycHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyO1wiPlRlc3Q8L2J1dHRvbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgYDtcbiAgICB9KS5qb2luKCcnKTtcblxuICAgIGNvbnN0IGhpc3RvcnlSb3dzID0gYWxlcnRIaXN0b3J5Lm1hcChlbnRyeSA9PiB7XG4gICAgICBjb25zdCB0aW1lID0gbmV3IERhdGUoZW50cnkudGltZXN0YW1wKS50b0xvY2FsZVN0cmluZygpO1xuICAgICAgY29uc3Qgbm90aWZpZWRNYXJrID0gZW50cnkubm90aWZpZWQgPyAnXHUyNzEzJyA6ICdcdTIwMTQnO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IGZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7dGltZX08L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlbnRyeS5jb250YWluZXJOYW1lIHx8IGVudHJ5LmNvbnRhaW5lcklkfTwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDsgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XCI+JHtlbnRyeS5tZXRyaWMgfHwgZW50cnkudHlwZX08L3RkPlxuICAgICAgICAgIDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweCA4cHg7XCI+JHt0eXBlb2YgZW50cnkudmFsdWUgPT09ICdudW1iZXInID8gZW50cnkudmFsdWUudG9GaXhlZCgxKSA6IGVudHJ5LnZhbHVlfSR7ZW50cnkubWV0cmljID09PSAnZGlzaycgPyAnIE1CL3MnIDogJyUnfTwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPiR7bm90aWZpZWRNYXJrfTwvdGQ+XG4gICAgICAgICAgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDsgZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogJHtlbnRyeS5hdXRvUmVzdGFydFRyaWdnZXJlZCA/ICcjZjM5YzEyJyA6ICd2YXIoLS1tdXRlZCknfTtcIj4ke2VudHJ5LmF1dG9SZXN0YXJ0VHJpZ2dlcmVkID8gJ1x1MjFCQicgOiAnJ308L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgYDtcbiAgICB9KS5qb2luKCcnKTtcblxuICAgIGNvbnN0IGNvbmZpZ1NlY3Rpb24gPSBpc1ByZW1pdW0gPyBgXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMjBweDtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgbWFyZ2luLWJvdHRvbTogMTBweDtcIj5cbiAgICAgICAgICA8aDQgc3R5bGU9XCJtYXJnaW46IDA7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlx1MjY5OVx1RkUwRiBBbGVydCBDb25maWd1cmF0aW9uPC9oND5cbiAgICAgICAgICA8YSBocmVmPVwiI1wiIGlkPVwiZ28tdG8tbm90aWZpY2F0aW9uc1wiIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1hY2NlbnQpOyB0ZXh0LWRlY29yYXRpb246IG5vbmU7XCI+Q29uZmlndXJlIG5vdGlmaWNhdGlvbnMgXHUyMTkyPC9hPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm92ZXJmbG93LXg6IGF1dG87XCI+XG4gICAgICAgICAgPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5Db250YWluZXI8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q1BVICU8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TWVtICU8L3RoPlxuICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+RGlzayBJL08gTUIvczwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkF1dG8tUmVzdGFydDwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDtcIj48L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keT4ke2NvbnRhaW5lclJvd3N9PC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IGRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNhdmUtYWxsLWFsZXJ0c1wiIHN0eWxlPVwicGFkZGluZzogNnB4IDE2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJhc2UpOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwO1wiPlNhdmUgQWxsPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYCA6IGBcbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAyMHB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiByZ2JhKDI0MSwxOTYsMTUsMC4xKTsgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNDEsMTk2LDE1LDAuMyk7IGJvcmRlci1yYWRpdXM6IDhweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiAjZjFjNDBmOyBmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDAuODVyZW07XCI+XHUyQjUwIFByZW1pdW0gRmVhdHVyZTwvc3Bhbj5cbiAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW46IDZweCAwIDA7IGZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5VcGdyYWRlIHRvIGNvbmZpZ3VyZSByZXNvdXJjZSBhbGVydCB0aHJlc2hvbGRzIHBlciBjb250YWluZXIuPC9wPlxuICAgICAgICA8YnV0dG9uIGlkPVwidXBncmFkZS1mb3ItYWxlcnRzXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7IHBhZGRpbmc6IDRweCAxMnB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6ICNmMWM0MGY7IGNvbG9yOiAjMDAwOyBib3JkZXI6IG5vbmU7IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwO1wiPlVwZ3JhZGUgTm93PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuXG4gICAgYWxlcnRzQ29udGFpbmVyLmlubmVySFRNTCA9IGBcbiAgICAgICR7Y29uZmlnU2VjdGlvbn1cbiAgICAgIDxkaXY+XG4gICAgICAgIDxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDEwcHg7IGZvbnQtc2l6ZTogMC45cmVtO1wiPlx1RDgzRFx1RENDQiBSZWNlbnQgQWxlcnRzPC9oND5cbiAgICAgICAgJHtoaXN0b3J5Um93cyA/IGBcbiAgICAgICAgICA8ZGl2IHN0eWxlPVwib3ZlcmZsb3cteDogYXV0bztcIj5cbiAgICAgICAgICAgIDx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuOHJlbTtcIj5cbiAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgIDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDsgcGFkZGluZzogNnB4IDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5UaW1lPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Q29udGFpbmVyPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TWV0cmljPC90aD5cbiAgICAgICAgICAgICAgICAgIDx0aCBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDZweCA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VmFsdWU8L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBwYWRkaW5nOiA2cHggOHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlx1MjcxMz88L3RoPlxuICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwicGFkZGluZzogNnB4IDhweDtcIj48L3RoPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgIDx0Ym9keT4ke2hpc3RvcnlSb3dzfTwvdGJvZHk+XG4gICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgIDogJzxkaXYgc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDIwcHg7XCI+Tm8gYWxlcnRzIHJlY29yZGVkIHlldC48L2Rpdj4nfVxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIC8vIFdpcmUgdXAgc2F2ZS1hbGwgYnV0dG9uXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NhdmUtYWxsLWFsZXJ0cycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZ3MgPSB7fTtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJyNzdGF0cy1hbGVydHMtY29udGFpbmVyIHRyW2RhdGEtY29udGFpbmVyXScpLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgY29uc3QgY0lkID0gcm93LmRhdGFzZXQuY29udGFpbmVyO1xuICAgICAgICBjb25maWdzW2NJZF0gPSB7XG4gICAgICAgICAgY3B1VGhyZXNob2xkOiBwYXJzZUludChyb3cucXVlcnlTZWxlY3RvcignLmFsZXJ0LWNwdScpPy52YWx1ZSkgfHwgODAsXG4gICAgICAgICAgbWVtb3J5VGhyZXNob2xkOiBwYXJzZUludChyb3cucXVlcnlTZWxlY3RvcignLmFsZXJ0LW1lbScpPy52YWx1ZSkgfHwgOTAsXG4gICAgICAgICAgZGlza0lPVGhyZXNob2xkOiBwYXJzZUludChyb3cucXVlcnlTZWxlY3RvcignLmFsZXJ0LWRpc2snKT8udmFsdWUpIHx8IDUwLFxuICAgICAgICAgIGF1dG9SZXN0YXJ0OiAhIXJvdy5xdWVyeVNlbGVjdG9yKCcuYWxlcnQtYXV0b3Jlc3RhcnQnKT8uY2hlY2tlZCxcbiAgICAgICAgICBlbmFibGVkOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL21vbml0b3JpbmcvYWxlcnRzL2NvbmZpZycsIHtcbiAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvbmZpZ3MgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2F2ZS1hbGwtYWxlcnRzJyk7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9IGQuc3VjY2VzcyA/ICdcdTI3MDUgU2F2ZWQnIDogJ1x1Mjc0QyBGYWlsZWQnO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgYnRuLnRleHRDb250ZW50ID0gJ1NhdmUgQWxsJzsgfSwgMjAwMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlLWFsbC1hbGVydHMnKTtcbiAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1Mjc0QyBFcnJvcic7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnU2F2ZSBBbGwnOyB9LCAyMDAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFdpcmUgdXAgbm90aWZpY2F0aW9uIHNldHRpbmdzIGxpbmtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ28tdG8tbm90aWZpY2F0aW9ucycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgICBzdG9wQXV0b1JlZnJlc2goKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYW5hZ2Utbm90aWZpY2F0aW9ucycpPy5jbGljaygpO1xuICAgIH0pO1xuXG4gICAgLy8gV2lyZSB1cCB0ZXN0IGJ1dHRvbnNcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYWxlcnQtdGVzdC1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9yaWcgPSBidG4udGV4dENvbnRlbnQ7XG4gICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICcuLi4nO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL21vbml0b3JpbmcvYWxlcnRzLyR7YnRuLmRhdGFzZXQuY29udGFpbmVyfS90ZXN0YCwgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnXHUyNzA1JztcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdUZXN0IGFsZXJ0IHNlbnQgZm9yICcgKyBidG4uZGF0YXNldC5uYW1lLCAnc3VjY2VzcycsIDMwMDApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1Mjc0Qyc7XG4gICAgICAgIH1cbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9IG9yaWc7IH0sIDIwMDApO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBXaXJlIHVwIHVwZ3JhZGUgYnV0dG9uXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZ3JhZGUtZm9yLWFsZXJ0cycpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIHN0b3BBdXRvUmVmcmVzaCgpO1xuICAgICAgaWYgKHR5cGVvZiBvcGVuTGljZW5zZU1vZGFsID09PSAnZnVuY3Rpb24nKSBvcGVuTGljZW5zZU1vZGFsKCk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBzdGFydEF1dG9SZWZyZXNoKCkge1xuICAgIGlmIChyZWZyZXNoSW50ZXJ2YWwpIGNsZWFySW50ZXJ2YWwocmVmcmVzaEludGVydmFsKTtcbiAgICBpZiAoYXV0b1JlZnJlc2hDaGVja2JveD8uY2hlY2tlZCkge1xuICAgICAgcmVmcmVzaEludGVydmFsID0gc2V0SW50ZXJ2YWwobG9hZFN0YXRzLCBEQy5QT0xMLlNUQVRTKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzdG9wQXV0b1JlZnJlc2goKSB7XG4gICAgaWYgKHJlZnJlc2hJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbChyZWZyZXNoSW50ZXJ2YWwpO1xuICAgICAgcmVmcmVzaEludGVydmFsID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBPcGVuIG1vZGFsXG4gIG9wZW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkU3RhdHMoKTtcbiAgICBzdGFydEF1dG9SZWZyZXNoKCk7XG4gIH0pO1xuXG4gIC8vIENsb3NlIG1vZGFsXG4gIGNhbmNlbEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHN0b3BBdXRvUmVmcmVzaCgpO1xuICB9KTtcblxuICBtb2RhbD8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgIGlmIChlLnRhcmdldCA9PT0gbW9kYWwpIHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICAgIHN0b3BBdXRvUmVmcmVzaCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgcmVmcmVzaEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkU3RhdHMpO1xuXG4gIGF1dG9SZWZyZXNoQ2hlY2tib3g/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBpZiAoYXV0b1JlZnJlc2hDaGVja2JveC5jaGVja2VkKSBzdGFydEF1dG9SZWZyZXNoKCk7XG4gICAgZWxzZSBzdG9wQXV0b1JlZnJlc2goKTtcbiAgfSk7XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJzdGF0cy1hZ2dyZWdhdGVkXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEFnZ3JlZ2F0ZWQpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cInN0YXRzLWFsZXJ0c1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRBbGVydHMpO1xuXG4gIC8vID09PSBIaXN0b3J5IFRhYiA9PT1cbiAgY29uc3QgaGlzdG9yeUNvbnRhaW5lclNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1oaXN0b3J5LWNvbnRhaW5lcicpO1xuICBjb25zdCBoaXN0b3J5QXJlYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0cy1oaXN0b3J5LWNvbnRhaW5lci1hcmVhJyk7XG4gIGNvbnN0IHJhbmdlQnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zdGF0cy1yYW5nZS1idG4nKTtcblxuICBsZXQgY3VycmVudFJhbmdlID0gJzFoJztcblxuICBmdW5jdGlvbiByYW5nZVRvTXMocmFuZ2UpIHtcbiAgICBzd2l0Y2ggKHJhbmdlKSB7XG4gICAgICBjYXNlICcxaCc6ICByZXR1cm4gNjAgKiA2MCAqIDEwMDA7XG4gICAgICBjYXNlICcyNGgnOiByZXR1cm4gMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAgIGNhc2UgJzdkJzogIHJldHVybiA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAgIGNhc2UgJzMwZCc6IHJldHVybiAzMCAqIDI0ICogNjAgKiA2MCAqIDEwMDA7XG4gICAgICBjYXNlICcxeSc6ICByZXR1cm4gMzY1ICogMjQgKiA2MCAqIDYwICogMTAwMDtcbiAgICAgIGRlZmF1bHQ6ICAgIHJldHVybiA2MCAqIDYwICogMTAwMDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB0aWVyTGFiZWwodGllcikge1xuICAgIGlmICh0aWVyID09PSAncmF3JykgcmV0dXJuICdsaXZlICgxMHMgc2FtcGxlcyknO1xuICAgIGlmICh0aWVyID09PSAnaG91cmx5JykgcmV0dXJuICdob3VybHkgYXZlcmFnZSc7XG4gICAgaWYgKHRpZXIgPT09ICdkYWlseScpIHJldHVybiAnZGFpbHkgYXZlcmFnZSc7XG4gICAgcmV0dXJuIHRpZXI7XG4gIH1cblxuICAvLyBTaW1wbGUgU1ZHIHNwYXJrbGluZSBcdTIwMTQgbm8gZXh0ZXJuYWwgbGliXG4gIGZ1bmN0aW9uIHJlbmRlclNwYXJrbGluZShzYW1wbGVzLCBhY2Nlc3NvciwgY29sb3IsIGxhYmVsLCB1bml0KSB7XG4gICAgaWYgKCFzYW1wbGVzIHx8IHNhbXBsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gYDxkaXYgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7IHBhZGRpbmc6IDIwcHg7XCI+Tm8gZGF0YSBmb3IgJHtlc2NhcGVIdG1sKGxhYmVsKX08L2Rpdj5gO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZXMgPSBzYW1wbGVzLm1hcChhY2Nlc3NvcikuZmlsdGVyKHYgPT4gdiAhPSBudWxsKTtcbiAgICBpZiAodmFsdWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBwYWRkaW5nOiAyMHB4O1wiPk5vIGRhdGEgZm9yICR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+YDtcbiAgICB9XG4gICAgY29uc3QgbWF4ID0gTWF0aC5tYXgoLi4udmFsdWVzLCAxKTtcbiAgICBjb25zdCBtaW4gPSBNYXRoLm1pbiguLi52YWx1ZXMsIDApO1xuICAgIGNvbnN0IHJhbmdlID0gbWF4IC0gbWluIHx8IDE7XG4gICAgY29uc3QgdyA9IDYwMCwgaCA9IDgwLCBwYWQgPSA0O1xuICAgIGNvbnN0IHN0ZXBYID0gKHcgLSBwYWQgKiAyKSAvIE1hdGgubWF4KHZhbHVlcy5sZW5ndGggLSAxLCAxKTtcbiAgICBjb25zdCBwb2ludHMgPSB2YWx1ZXMubWFwKCh2LCBpKSA9PiB7XG4gICAgICBjb25zdCB4ID0gcGFkICsgaSAqIHN0ZXBYO1xuICAgICAgY29uc3QgeSA9IGggLSBwYWQgLSAoKHYgLSBtaW4pIC8gcmFuZ2UpICogKGggLSBwYWQgKiAyKTtcbiAgICAgIHJldHVybiBgJHt4LnRvRml4ZWQoMSl9LCR7eS50b0ZpeGVkKDEpfWA7XG4gICAgfSkuam9pbignICcpO1xuICAgIGNvbnN0IGxhc3QgPSB2YWx1ZXNbdmFsdWVzLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IGF2ZyA9IHZhbHVlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKSAvIHZhbHVlcy5sZW5ndGg7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNHB4O1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGJhc2VsaW5lOyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDRweDtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC45cmVtO1wiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOiAwLjc1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPmxhc3QgJHtsYXN0LnRvRml4ZWQoMSl9JHt1bml0fSBcdTAwQjcgYXZnICR7YXZnLnRvRml4ZWQoMSl9JHt1bml0fSBcdTAwQjcgbWF4ICR7bWF4LnRvRml4ZWQoMSl9JHt1bml0fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzdmcgdmlld0JveD1cIjAgMCAke3d9ICR7aH1cIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogJHtofXB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iYXNlKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiPlxuICAgICAgICAgIDxwb2x5bGluZSBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiR7Y29sb3J9XCIgc3Ryb2tlLXdpZHRoPVwiMS41XCIgcG9pbnRzPVwiJHtwb2ludHN9XCIgLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9wdWxhdGVIaXN0b3J5Q29udGFpbmVyU2VsZWN0KCkge1xuICAgIGlmICghaGlzdG9yeUNvbnRhaW5lclNlbGVjdCkgcmV0dXJuO1xuICAgIGNvbnN0IGRhdGEgPSBjYWNoZWRNb25pdG9yaW5nRGF0YSB8fCB7fTtcbiAgICBjb25zdCBwcmV2aW91cyA9IGhpc3RvcnlDb250YWluZXJTZWxlY3QudmFsdWU7XG4gICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGRhdGEpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgaGlzdG9yeUNvbnRhaW5lclNlbGVjdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPk5vIGNvbnRhaW5lcnM8L29wdGlvbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBoaXN0b3J5Q29udGFpbmVyU2VsZWN0LmlubmVySFRNTCA9IGVudHJpZXNcbiAgICAgIC5tYXAoKFtpZCwgaW5mb10pID0+IGA8b3B0aW9uIHZhbHVlPVwiJHtlc2NhcGVIdG1sKGlkKX1cIj4ke2VzY2FwZUh0bWwoaW5mby5uYW1lIHx8IGlkKX08L29wdGlvbj5gKVxuICAgICAgLmpvaW4oJycpO1xuICAgIGlmIChwcmV2aW91cyAmJiBkYXRhW3ByZXZpb3VzXSkgaGlzdG9yeUNvbnRhaW5lclNlbGVjdC52YWx1ZSA9IHByZXZpb3VzO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEhpc3RvcnkoKSB7XG4gICAgaWYgKCFoaXN0b3J5QXJlYSB8fCAhaGlzdG9yeUNvbnRhaW5lclNlbGVjdCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbnRhaW5lcklkID0gaGlzdG9yeUNvbnRhaW5lclNlbGVjdC52YWx1ZTtcbiAgICBpZiAoIWNvbnRhaW5lcklkKSB7XG4gICAgICBoaXN0b3J5QXJlYS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0NBPC9zcGFuPk5vIGNvbnRhaW5lciBzZWxlY3RlZC48L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBzdGFydFRpbWUgPSBlbmRUaW1lIC0gcmFuZ2VUb01zKGN1cnJlbnRSYW5nZSk7XG4gICAgaGlzdG9yeUFyZWEuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBoaXN0b3J5Li4uPC9kaXY+JztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9tb25pdG9yaW5nL2hpc3RvcnkvJHtlbmNvZGVVUklDb21wb25lbnQoY29udGFpbmVySWQpfT9zdGFydFRpbWU9JHtzdGFydFRpbWV9JmVuZFRpbWU9JHtlbmRUaW1lfWApO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ0ZhaWxlZCB0byBsb2FkIGhpc3RvcnknKTtcblxuICAgICAgY29uc3Qgc2FtcGxlcyA9IGRhdGEuc2FtcGxlcyB8fCBbXTtcbiAgICAgIGNvbnN0IHRpZXIgPSBkYXRhLnRpZXIgfHwgJ3Jhdyc7XG5cbiAgICAgIGlmIChzYW1wbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBoaXN0b3J5QXJlYS5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0NBPC9zcGFuPk5vIGRhdGEgZm9yIHRoZSBsYXN0ICR7Y3VycmVudFJhbmdlfS4gVGllcjogJHt0aWVyTGFiZWwodGllcil9LjwvZGl2PmA7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRGlmZmVyZW50IHNoYXBlIGJldHdlZW4gcmF3IHZzIHJvbGxlZC11cCBzYW1wbGVzXG4gICAgICBjb25zdCBpc1JhdyA9IHRpZXIgPT09ICdyYXcnO1xuICAgICAgY29uc3QgY3B1QWNjZXNzb3IgPSBpc1JhdyA/IChzKSA9PiBzLmNwdT8ucGVyY2VudCA6IChzKSA9PiBzLmNwdT8uYXZnO1xuICAgICAgY29uc3QgbWVtQWNjZXNzb3IgPSBpc1JhdyA/IChzKSA9PiBzLm1lbW9yeT8ucGVyY2VudCA6IChzKSA9PiBzLm1lbW9yeT8uYXZnUGVyY2VudDtcbiAgICAgIGNvbnN0IG5ldFJ4QWNjZXNzb3IgPSBpc1JhdyA/IChzKSA9PiAocy5uZXR3b3JrPy5yeE1CIHx8IDApIDogKHMpID0+IChzLm5ldHdvcms/LnJ4TUIgfHwgMCk7XG4gICAgICBjb25zdCBuZXRUeEFjY2Vzc29yID0gaXNSYXcgPyAocykgPT4gKHMubmV0d29yaz8udHhNQiB8fCAwKSA6IChzKSA9PiAocy5uZXR3b3JrPy50eE1CIHx8IDApO1xuXG4gICAgICBsZXQgaHRtbCA9IGBcbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICR7c2FtcGxlcy5sZW5ndGh9IHNhbXBsZXMgXHUwMEI3ICR7ZXNjYXBlSHRtbCh0aWVyTGFiZWwodGllcikpfSBcdTAwQjcgJHtuZXcgRGF0ZShzdGFydFRpbWUpLnRvTG9jYWxlU3RyaW5nKCl9IFx1MjE5MiAke25ldyBEYXRlKGVuZFRpbWUpLnRvTG9jYWxlU3RyaW5nKCl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICAgIGh0bWwgKz0gcmVuZGVyU3BhcmtsaW5lKHNhbXBsZXMsIGNwdUFjY2Vzc29yLCAnIzJlY2M3MScsICdDUFUnLCAnJScpO1xuICAgICAgaHRtbCArPSByZW5kZXJTcGFya2xpbmUoc2FtcGxlcywgbWVtQWNjZXNzb3IsICcjMzQ5OGRiJywgJ01lbW9yeScsICclJyk7XG4gICAgICBodG1sICs9IHJlbmRlclNwYXJrbGluZShzYW1wbGVzLCBuZXRSeEFjY2Vzc29yLCAnIzliNTliNicsICdOZXR3b3JrIFJYJywgJyBNQicpO1xuICAgICAgaHRtbCArPSByZW5kZXJTcGFya2xpbmUoc2FtcGxlcywgbmV0VHhBY2Nlc3NvciwgJyNlNjdlMjInLCAnTmV0d29yayBUWCcsICcgTUInKTtcblxuICAgICAgaGlzdG9yeUFyZWEuaW5uZXJIVE1MID0gaHRtbDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBoaXN0b3J5QXJlYS5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyNkEwXHVGRTBGPC9zcGFuPkZhaWxlZCB0byBsb2FkIGhpc3Rvcnk6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgcmFuZ2VCdXR0b25zLmZvckVhY2goYnRuID0+IHtcbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICByYW5nZUJ1dHRvbnMuZm9yRWFjaChiID0+IGIuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJykpO1xuICAgICAgYnRuLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgY3VycmVudFJhbmdlID0gYnRuLmRhdGFzZXQucmFuZ2U7XG4gICAgICBsb2FkSGlzdG9yeSgpO1xuICAgIH0pO1xuICB9KTtcblxuICBoaXN0b3J5Q29udGFpbmVyU2VsZWN0Py5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBsb2FkSGlzdG9yeSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJzdGF0cy1oaXN0b3J5XCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHBvcHVsYXRlSGlzdG9yeUNvbnRhaW5lclNlbGVjdCgpO1xuICAgIGxvYWRIaXN0b3J5KCk7XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gSEVBTFRIIENIRUNLIERBU0hCT0FSRCA9PT09PT09PT09XG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluamVjdCBtb2RhbCBIVE1MXG4gIGluamVjdE1vZGFsKCdoZWFsdGgtbW9kYWwnLCBgPGRpdiBpZD1cImhlYWx0aC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogODAwcHg7IG1heC13aWR0aDogMTAwMHB4O1wiPlxuICAgICAgPGgzPlx1RDgzQ1x1REZFNSBIZWFsdGggQ2hlY2sgRGFzaGJvYXJkPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgU2VydmljZSB1cHRpbWUgdHJhY2tpbmcsIFNMQSBtb25pdG9yaW5nLCBhbmQgaW5jaWRlbnQgbWFuYWdlbWVudC5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYiBhY3RpdmVcIiBkYXRhLXBhbmVsPVwiaGVhbHRoLXN0YXR1c1wiPlN0YXR1czwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImhlYWx0aC1pbmNpZGVudHNcIj5JbmNpZGVudHM8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJoZWFsdGgtY29uZmlnXCI+Q29uZmlndXJlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IFN0YXR1cyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJoZWFsdGgtc3RhdHVzXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8ZGl2IGlkPVwiaGVhbHRoLXN0YXR1cy1jb250YWluZXJcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcgaGVhbHRoIHN0YXR1cy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogSW5jaWRlbnRzIC0tPlxuICAgICAgPGRpdiBpZD1cImhlYWx0aC1pbmNpZGVudHNcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImhlYWx0aC1pbmNpZGVudHMtY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVERUE4PC9zcGFuPiBMb2FkaW5nIGluY2lkZW50cy4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQ29uZmlndXJlIC0tPlxuICAgICAgPGRpdiBpZD1cImhlYWx0aC1jb25maWdcIiBjbGFzcz1cInBhbmVsLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBpZD1cImhlYWx0aC1jb25maWctY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyNjk5XHVGRTBGPC9zcGFuPiBMb2FkaW5nIGNvbmZpZ3VyYXRpb24uLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBHbG9iYWwgU2V0dGluZ3M6IHJldGVudGlvbiwgcG9sbGluZyBpbnRlcnZhbHMsIG1heCBlbnRyaWVzLCBkaXNrLXVzYWdlIHRocmVzaG9sZCAtLT5cbiAgICAgICAgPGRpdiBpZD1cImhlYWx0aC1nbG9iYWwtc2V0dGluZ3NcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE2cHg7IHBhZGRpbmc6IDE2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IHZhcigtLXJhZGl1cyk7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmFzZSk7XCI+XG4gICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOiAwIDAgNHB4O1wiPlx1RDgzQ1x1REYwRCBHbG9iYWwgU2V0dGluZ3M8L2g0PlxuICAgICAgICAgIDxwIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDtcIj5BcHBsaWVzIHRvIGFsbCBoZWFsdGggY2hlY2tzLiBTZXR0aW5ncyBhcmUgc3RvcmVkIGxvY2FsbHkgaW4gdGhpcyBicm93c2VyLjwvcD5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDEycHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+SGVhbHRoIENoZWNrIFBvbGxpbmcgSW50ZXJ2YWwgKHNlY29uZHMpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1zZXR0aW5nLWludGVydmFsXCIgdmFsdWU9XCI2MFwiIG1pbj1cIjVcIiBtYXg9XCIzNjAwXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4O1wiPkhvdyBvZnRlbiBlYWNoIHNlcnZpY2UncyBoZWFsdGggZW5kcG9pbnQgaXMgY2hlY2tlZC48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlN0YXRzIFBvbGxpbmcgSW50ZXJ2YWwgKHNlY29uZHMpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1zZXR0aW5nLXN0YXRzLWludGVydmFsXCIgdmFsdWU9XCIzMFwiIG1pbj1cIjVcIiBtYXg9XCIzNjAwXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4O1wiPkhvdyBvZnRlbiBjb250YWluZXIgc3RhdGlzdGljcyAoQ1BVL21lbW9yeSkgYXJlIHNhbXBsZWQuPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5NYXggRW50cmllcyBQZXIgU2VydmljZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtc2V0dGluZy1tYXgtZW50cmllc1wiIHZhbHVlPVwiNTAwXCIgbWluPVwiMTBcIiBtYXg9XCIxMDAwMDBcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjcycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAycHg7XCI+Q2FwIG9uIHN0b3JlZCBoaXN0b3J5IHJlY29yZHMgcGVyIHNlcnZpY2UuPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5EYXRhIFJldGVudGlvbiAoZGF5cyk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLXNldHRpbmctcmV0ZW50aW9uXCIgdmFsdWU9XCIzMFwiIG1pbj1cIjFcIiBtYXg9XCIzNjUwXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43MnJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogMnB4O1wiPkhlYWx0aCBoaXN0b3J5IG9sZGVyIHRoYW4gdGhpcyBpcyBwcnVuZWQuPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5EaXNrLVVzYWdlIFdhcm5pbmcgKCUpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1zZXR0aW5nLWRpc2stdGhyZXNob2xkXCIgdmFsdWU9XCI4MFwiIG1pbj1cIjUwXCIgbWF4PVwiOTlcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjcycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiAycHg7XCI+V2FybiB3aGVuIGRpc2sgdXNhZ2UgZXhjZWVkcyB0aGlzIGxldmVsLjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDEycHg7IGRpc3BsYXk6IGZsZXg7IGdhcDogOHB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1nbG9iYWwtc2F2ZVwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiPlNhdmUgR2xvYmFsIFNldHRpbmdzPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLWdsb2JhbC1yZXNldFwiIGNsYXNzPVwiYnRuLXNtXCI+UmVzZXQgdG8gRGVmYXVsdHM8L2J1dHRvbj5cbiAgICAgICAgICAgIDxzcGFuIGlkPVwiaGVhbHRoLWdsb2JhbC1zdGF0dXNcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBBZGQvRWRpdCBIZWFsdGggQ2hlY2sgRm9ybSAtLT5cbiAgICAgICAgPGRpdiBpZD1cImhlYWx0aC1jb25maWctZm9ybVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTZweDsgcGFkZGluZzogMTZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogdmFyKC0tcmFkaXVzKTsgYmFja2dyb3VuZDogdmFyKC0tY2FyZC1iYXNlKTtcIj5cbiAgICAgICAgICA8aDQgaWQ9XCJoZWFsdGgtZm9ybS10aXRsZVwiIHN0eWxlPVwibWFyZ2luOiAwIDAgMTJweDtcIj5BZGQgSGVhbHRoIENoZWNrPC9oND5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZ3JpZDsgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnIgMWZyOyBnYXA6IDEycHg7XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+U2VydmljZSBJRDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVhbHRoLWZvcm0taWRcIiBwbGFjZWhvbGRlcj1cImUuZy4gcGxleFwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5EaXNwbGF5IE5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImhlYWx0aC1mb3JtLW5hbWVcIiBwbGFjZWhvbGRlcj1cImUuZy4gUGxleCBNZWRpYSBTZXJ2ZXJcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZ3JpZC1jb2x1bW46IHNwYW4gMjtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlVSTDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiaGVhbHRoLWZvcm0tdXJsXCIgcGxhY2Vob2xkZXI9XCJodHRwczovL3BsZXguaG9tZVwiIGNsYXNzPVwiZm9ybS1pbnB1dFwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5UaW1lb3V0IChtcyk8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiaGVhbHRoLWZvcm0tdGltZW91dFwiIHZhbHVlPVwiMTAwMDBcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+RXhwZWN0ZWQgU3RhdHVzIENvZGVzPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJoZWFsdGgtZm9ybS1jb2Rlc1wiIHZhbHVlPVwiMjAwXCIgcGxhY2Vob2xkZXI9XCIyMDAsIDMwMSwgMzAyXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPlNMQSBUYXJnZXQgKCUpPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cImhlYWx0aC1mb3JtLXNsYVwiIHZhbHVlPVwiOTkuOVwiIHN0ZXA9XCIwLjFcIiBjbGFzcz1cImZvcm0taW5wdXRcIiAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LW11dGVkLXNtXCI+U2xvdyBSZXNwb25zZSBUaHJlc2hvbGQgKG1zKTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJoZWFsdGgtZm9ybS1zbG93XCIgdmFsdWU9XCI1MDAwXCIgY2xhc3M9XCJmb3JtLWlucHV0XCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxMnB4OyBkaXNwbGF5OiBmbGV4OyBnYXA6IDhweDsganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcIj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtZm9ybS1jYW5jZWxcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJoZWFsdGgtZm9ybS1zYXZlXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiaGVhbHRoLWFkZC1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIj4rIEFkZCBIZWFsdGggQ2hlY2s8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvdHRvbS1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1yZWZyZXNoLWJ0blwiIGNsYXNzPVwiYnRuLXNtXCI+XHVEODNEXHVERDA0IFJlZnJlc2g8L2J1dHRvbj5cbiAgICAgICAgPHNwYW4gaWQ9XCJoZWFsdGgtbGFzdC11cGRhdGVcIiBjbGFzcz1cInRleHQtYXV0by1yaWdodFwiPjwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImhlYWx0aC1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jaGVjay1idG4nKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1jYW5jZWwnKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtcmVmcmVzaC1idG4nKTtcbiAgY29uc3Qgc3RhdHVzQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1zdGF0dXMtY29udGFpbmVyJyk7XG4gIGNvbnN0IGluY2lkZW50c0NvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtaW5jaWRlbnRzLWNvbnRhaW5lcicpO1xuICBjb25zdCBjb25maWdDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNvbmZpZy1jb250YWluZXInKTtcbiAgY29uc3QgbGFzdFVwZGF0ZVNwYW4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWxhc3QtdXBkYXRlJyk7XG4gIGNvbnN0IGFkZEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtYWRkLWJ0bicpO1xuICBjb25zdCBmb3JtRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWNvbmZpZy1mb3JtJyk7XG4gIGNvbnN0IGZvcm1UaXRsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS10aXRsZScpO1xuICBjb25zdCBmb3JtQ2FuY2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWNhbmNlbCcpO1xuICBjb25zdCBmb3JtU2F2ZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1zYXZlJyk7XG5cbiAgLy8gLS0tLSBHbG9iYWwgaGVhbHRoIHNldHRpbmdzIChyZXRlbnRpb24sIHBvbGxpbmcgaW50ZXJ2YWxzLCBtYXggZW50cmllcywgZGlzayB0aHJlc2hvbGQpIC0tLS1cbiAgY29uc3QgSEVBTFRIX1NFVFRJTkdTX0tFWSA9ICdkYXNoY2FkZHktaGVhbHRoLXNldHRpbmdzJztcbiAgY29uc3QgSEVBTFRIX0RFRkFVTFRTID0geyByZXRlbnRpb25EYXlzOiAzMCwgcG9sbGluZ0ludGVydmFsOiA2MCwgc3RhdHNQb2xsaW5nSW50ZXJ2YWw6IDMwLCBtYXhFbnRyaWVzUGVyU2VydmljZTogNTAwLCBkaXNrVXNhZ2VUaHJlc2hvbGQ6IDgwIH07XG4gIGNvbnN0IGdsb2JhbFNhdmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWdsb2JhbC1zYXZlJyk7XG4gIGNvbnN0IGdsb2JhbFJlc2V0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1nbG9iYWwtcmVzZXQnKTtcbiAgY29uc3QgZ2xvYmFsU3RhdHVzU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZ2xvYmFsLXN0YXR1cycpO1xuICBjb25zdCByZXRlbnRpb25JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtc2V0dGluZy1yZXRlbnRpb24nKTtcbiAgY29uc3QgaW50ZXJ2YWxJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtc2V0dGluZy1pbnRlcnZhbCcpO1xuICBjb25zdCBzdGF0c0ludGVydmFsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLXNldHRpbmctc3RhdHMtaW50ZXJ2YWwnKTtcbiAgY29uc3QgbWF4RW50cmllc0lucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1zZXR0aW5nLW1heC1lbnRyaWVzJyk7XG4gIGNvbnN0IGRpc2tUaHJlc2hvbGRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtc2V0dGluZy1kaXNrLXRocmVzaG9sZCcpO1xuXG4gIGZ1bmN0aW9uIGxvYWRIZWFsdGhTZXR0aW5ncygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gc2FmZUdldChIRUFMVEhfU0VUVElOR1NfS0VZKTtcbiAgICAgIGNvbnN0IHNhdmVkID0gcmF3ID8gSlNPTi5wYXJzZShyYXcpIDoge307XG4gICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7fSwgSEVBTFRIX0RFRkFVTFRTLCBzYXZlZCk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIEhFQUxUSF9ERUZBVUxUUyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gYXBwbHlIZWFsdGhTZXR0aW5nc1RvVUkoKSB7XG4gICAgY29uc3QgcyA9IGxvYWRIZWFsdGhTZXR0aW5ncygpO1xuICAgIGlmIChyZXRlbnRpb25JbnB1dCkgcmV0ZW50aW9uSW5wdXQudmFsdWUgPSBzLnJldGVudGlvbkRheXM7XG4gICAgaWYgKGludGVydmFsSW5wdXQpIGludGVydmFsSW5wdXQudmFsdWUgPSBzLnBvbGxpbmdJbnRlcnZhbDtcbiAgICBpZiAoc3RhdHNJbnRlcnZhbElucHV0KSBzdGF0c0ludGVydmFsSW5wdXQudmFsdWUgPSBzLnN0YXRzUG9sbGluZ0ludGVydmFsO1xuICAgIGlmIChtYXhFbnRyaWVzSW5wdXQpIG1heEVudHJpZXNJbnB1dC52YWx1ZSA9IHMubWF4RW50cmllc1BlclNlcnZpY2U7XG4gICAgaWYgKGRpc2tUaHJlc2hvbGRJbnB1dCkgZGlza1RocmVzaG9sZElucHV0LnZhbHVlID0gcy5kaXNrVXNhZ2VUaHJlc2hvbGQ7XG4gIH1cblxuICBmdW5jdGlvbiBzYXZlSGVhbHRoU2V0dGluZ3MoKSB7XG4gICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICByZXRlbnRpb25EYXlzOiBNYXRoLm1heCgxLCBNYXRoLm1pbigzNjUwLCBwYXJzZUludChyZXRlbnRpb25JbnB1dD8udmFsdWUpIHx8IEhFQUxUSF9ERUZBVUxUUy5yZXRlbnRpb25EYXlzKSksXG4gICAgICBwb2xsaW5nSW50ZXJ2YWw6IE1hdGgubWF4KDUsIE1hdGgubWluKDM2MDAsIHBhcnNlSW50KGludGVydmFsSW5wdXQ/LnZhbHVlKSB8fCBIRUFMVEhfREVGQVVMVFMucG9sbGluZ0ludGVydmFsKSksXG4gICAgICBzdGF0c1BvbGxpbmdJbnRlcnZhbDogTWF0aC5tYXgoNSwgTWF0aC5taW4oMzYwMCwgcGFyc2VJbnQoc3RhdHNJbnRlcnZhbElucHV0Py52YWx1ZSkgfHwgSEVBTFRIX0RFRkFVTFRTLnN0YXRzUG9sbGluZ0ludGVydmFsKSksXG4gICAgICBtYXhFbnRyaWVzUGVyU2VydmljZTogTWF0aC5tYXgoMTAsIE1hdGgubWluKDEwMDAwMCwgcGFyc2VJbnQobWF4RW50cmllc0lucHV0Py52YWx1ZSkgfHwgSEVBTFRIX0RFRkFVTFRTLm1heEVudHJpZXNQZXJTZXJ2aWNlKSksXG4gICAgICBkaXNrVXNhZ2VUaHJlc2hvbGQ6IE1hdGgubWF4KDUwLCBNYXRoLm1pbig5OSwgcGFyc2VJbnQoZGlza1RocmVzaG9sZElucHV0Py52YWx1ZSkgfHwgSEVBTFRIX0RFRkFVTFRTLmRpc2tVc2FnZVRocmVzaG9sZCkpXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgc2FmZVNldChIRUFMVEhfU0VUVElOR1NfS0VZLCBKU09OLnN0cmluZ2lmeShzZXR0aW5ncykpO1xuICAgICAgYXBwbHlIZWFsdGhTZXR0aW5nc1RvVUkoKTtcbiAgICAgIGlmIChnbG9iYWxTdGF0dXNTcGFuKSB7XG4gICAgICAgIGdsb2JhbFN0YXR1c1NwYW4udGV4dENvbnRlbnQgPSAnU2F2ZWQgXHUyNzEzJztcbiAgICAgICAgZ2xvYmFsU3RhdHVzU3Bhbi5zdHlsZS5jb2xvciA9ICd2YXIoLS1vay1mZyknO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgaWYgKGdsb2JhbFN0YXR1c1NwYW4pIGdsb2JhbFN0YXR1c1NwYW4udGV4dENvbnRlbnQgPSAnJzsgfSwgMjUwMCk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHNob3dOb3RpZmljYXRpb24oJ0dsb2JhbCBoZWFsdGggc2V0dGluZ3Mgc2F2ZWQnLCAnc3VjY2VzcycpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChnbG9iYWxTdGF0dXNTcGFuKSB7IGdsb2JhbFN0YXR1c1NwYW4udGV4dENvbnRlbnQgPSAnU2F2ZSBmYWlsZWQnOyBnbG9iYWxTdGF0dXNTcGFuLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknOyB9XG4gICAgICBpZiAodHlwZW9mIHNob3dOb3RpZmljYXRpb24gPT09ICdmdW5jdGlvbicpIHNob3dOb3RpZmljYXRpb24oJ0ZhaWxlZCB0byBzYXZlIHNldHRpbmdzOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZXNldEhlYWx0aFNldHRpbmdzKCkge1xuICAgIHRyeSB7XG4gICAgICBzYWZlU2V0KEhFQUxUSF9TRVRUSU5HU19LRVksIEpTT04uc3RyaW5naWZ5KEhFQUxUSF9ERUZBVUxUUykpO1xuICAgIH0gY2F0Y2ggKF8pIHsgLyogaWdub3JlICovIH1cbiAgICBhcHBseUhlYWx0aFNldHRpbmdzVG9VSSgpO1xuICAgIGlmIChnbG9iYWxTdGF0dXNTcGFuKSB7XG4gICAgICBnbG9iYWxTdGF0dXNTcGFuLnRleHRDb250ZW50ID0gJ1Jlc2V0IHRvIGRlZmF1bHRzIFx1MjcxMyc7XG4gICAgICBnbG9iYWxTdGF0dXNTcGFuLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW9rLWZnKSc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgaWYgKGdsb2JhbFN0YXR1c1NwYW4pIGdsb2JhbFN0YXR1c1NwYW4udGV4dENvbnRlbnQgPSAnJzsgfSwgMjUwMCk7XG4gICAgfVxuICB9XG5cbiAgYXBwbHlIZWFsdGhTZXR0aW5nc1RvVUkoKTtcbiAgZ2xvYmFsU2F2ZUJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBzYXZlSGVhbHRoU2V0dGluZ3MpO1xuICBnbG9iYWxSZXNldEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZXNldEhlYWx0aFNldHRpbmdzKTtcbiAgLy8gLS0tLSBFbmQgZ2xvYmFsIGhlYWx0aCBzZXR0aW5ncyAtLS0tXG5cbiAgbGV0IGVkaXRpbmdJZCA9IG51bGw7XG5cbiAgZnVuY3Rpb24gdXB0aW1lQ29sb3IocGN0KSB7XG4gICAgaWYgKHBjdCA+PSA5OS45KSByZXR1cm4gJ3ZhcigtLW9rLWZnKSc7XG4gICAgaWYgKHBjdCA+PSA5NSkgcmV0dXJuICcjZjM5YzEyJztcbiAgICByZXR1cm4gJ3ZhcigtLWJhZC1mZyknO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V2ZXJpdHlCYWRnZShzZXYpIHtcbiAgICBjb25zdCBjb2xvcnMgPSB7IGNyaXRpY2FsOiAndmFyKC0tYmFkLWZnKScsIGhpZ2g6ICcjZmY2YjZiJywgbWVkaXVtOiAnI2YzOWMxMicsIGxvdzogJ3ZhcigtLW11dGVkKScgfTtcbiAgICByZXR1cm4gYDxzcGFuIHN0eWxlPVwicGFkZGluZzogMnB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXNpemU6IDAuNzVyZW07IGJhY2tncm91bmQ6ICR7Y29sb3JzW3Nldl0gfHwgJ3ZhcigtLW11dGVkKSd9MjA7IGNvbG9yOiAke2NvbG9yc1tzZXZdIHx8ICd2YXIoLS1tdXRlZCknfTtcIj4ke3Nldn08L3NwYW4+YDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRTdGF0dXMoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL2hlYWx0aC1jaGVja3Mvc3RhdHVzJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzIHx8ICFkYXRhLnN0YXR1cyB8fCBPYmplY3Qua2V5cyhkYXRhLnN0YXR1cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHN0YXR1c0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNDXHVERkU1PC9zcGFuPk5vIGhlYWx0aCBjaGVja3MgY29uZmlndXJlZC4gR28gdG8gdGhlIENvbmZpZ3VyZSB0YWIgdG8gYWRkIHNlcnZpY2VzLjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlcnZpY2VzID0gT2JqZWN0LnZhbHVlcyhkYXRhLnN0YXR1cyk7XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTsgdGV4dC1hbGlnbjogbGVmdDtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPlNlcnZpY2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5TdGF0dXM8L3RoPic7XG4gICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7XCI+VXB0aW1lIDI0aDwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPlVwdGltZSA3ZDwvdGg+JztcbiAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5BdmcgUmVzcG9uc2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj5MYXN0IENoZWNrPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2VydmljZXMpIHtcbiAgICAgICAgY29uc3QgaXNVcCA9IHMuc3RhdHVzID09PSAndXAnO1xuICAgICAgICBjb25zdCBkb3RDb2xvciA9IGlzVXAgPyAndmFyKC0tZG90LW9rKScgOiAndmFyKC0tZG90LWJhZCknO1xuICAgICAgICBjb25zdCB1MjQgPSBzLnVwdGltZT8uWycyNGgnXSA/PyAnLSc7XG4gICAgICAgIGNvbnN0IHU3ZCA9IHMudXB0aW1lPy5bJzdkJ10gPz8gJy0nO1xuICAgICAgICBjb25zdCBhdmdSdCA9IHMuYXZnUmVzcG9uc2VUaW1lICE9IG51bGwgPyBNYXRoLnJvdW5kKHMuYXZnUmVzcG9uc2VUaW1lKSArICdtcycgOiAnLSc7XG4gICAgICAgIGNvbnN0IGxhc3RDaGVjayA9IHMudGltZXN0YW1wID8gdGltZUFnbyhzLnRpbWVzdGFtcCkgOiAnLSc7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjdXJzb3I6IHBvaW50ZXI7XCIgZGF0YS1oZWFsdGgtaWQ9XCIke2VzY2FwZUh0bWwocy5zZXJ2aWNlSWQpfVwiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgZm9udC13ZWlnaHQ6IDUwMDtcIj4ke2VzY2FwZUh0bWwocy5uYW1lIHx8IHMuc2VydmljZUlkKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj48c3BhbiBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDhweDsgaGVpZ2h0OiA4cHg7IGJvcmRlci1yYWRpdXM6IDUwJTsgYmFja2dyb3VuZDogJHtkb3RDb2xvcn07IG1hcmdpbi1yaWdodDogNnB4O1wiPjwvc3Bhbj4ke2lzVXAgPyAnVXAnIDogJ0Rvd24nfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBjb2xvcjogJHt0eXBlb2YgdTI0ID09PSAnbnVtYmVyJyA/IHVwdGltZUNvbG9yKHUyNCkgOiAndmFyKC0tbXV0ZWQpJ307XCI+JHt0eXBlb2YgdTI0ID09PSAnbnVtYmVyJyA/IHUyNC50b0ZpeGVkKDEpICsgJyUnIDogdTI0fTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4OyBjb2xvcjogJHt0eXBlb2YgdTdkID09PSAnbnVtYmVyJyA/IHVwdGltZUNvbG9yKHU3ZCkgOiAndmFyKC0tbXV0ZWQpJ307XCI+JHt0eXBlb2YgdTdkID09PSAnbnVtYmVyJyA/IHU3ZC50b0ZpeGVkKDEpICsgJyUnIDogdTdkfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPiR7YXZnUnR9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtsYXN0Q2hlY2t9PC90ZD5gO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBpZD1cImhlYWx0aC1kZXRhaWwtJHtlc2NhcGVIdG1sKHMuc2VydmljZUlkKX1cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+PHRkIGNvbHNwYW49XCI2XCIgc3R5bGU9XCJwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPjxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBkZXRhaWxzLi4uPC9kaXY+PC90ZD48L3RyPmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBzdGF0dXNDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGxhc3RVcGRhdGVTcGFuLnRleHRDb250ZW50ID0gJ1VwZGF0ZWQgJyArIG5ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCk7XG5cbiAgICAgIC8vIFJvdyBjbGljayB0byBleHBhbmQgZGV0YWlsc1xuICAgICAgc3RhdHVzQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyW2RhdGEtaGVhbHRoLWlkXScpLmZvckVhY2gocm93ID0+IHtcbiAgICAgICAgcm93LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gcm93LmRhdGFzZXQuaGVhbHRoSWQ7XG4gICAgICAgICAgY29uc3QgZGV0YWlsUm93ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1kZXRhaWwtJyArIGlkKTtcbiAgICAgICAgICBpZiAoIWRldGFpbFJvdykgcmV0dXJuO1xuICAgICAgICAgIGlmIChkZXRhaWxSb3cuc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBkZXRhaWxSb3cuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGV0YWlsUm93LnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgciA9IGF3YWl0IGZldGNoKGAvYXBpL3YxL2hlYWx0aC1jaGVja3MvJHtpZH0vc3RhdHM/aG91cnM9MjRgKTtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChkLnN1Y2Nlc3MgJiYgZC5zdGF0cykge1xuICAgICAgICAgICAgICBjb25zdCBzdCA9IGQuc3RhdHM7XG4gICAgICAgICAgICAgIGNvbnN0IHJ0ID0gc3QucmVzcG9uc2VUaW1lIHx8IHt9O1xuICAgICAgICAgICAgICBkZXRhaWxSb3cucXVlcnlTZWxlY3RvcigndGQnKS5pbm5lckhUTUwgPSBgXG4gICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KDQsIDFmcik7IGdhcDogMTJweDsgZm9udC1zaXplOiAwLjgycmVtO1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+VG90YWwgQ2hlY2tzPC9zcGFuPjxicj48c3Ryb25nPiR7c3QudG90YWxDaGVja3MgfHwgMH08L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlVwdGltZTwvc3Bhbj48YnI+PHN0cm9uZyBzdHlsZT1cImNvbG9yOiAke3VwdGltZUNvbG9yKHN0LnVwdGltZSB8fCAwKX07XCI+JHsoc3QudXB0aW1lIHx8IDApLnRvRml4ZWQoMil9JTwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+QXZnIFJlc3BvbnNlPC9zcGFuPjxicj48c3Ryb25nPiR7TWF0aC5yb3VuZChydC5hdmcgfHwgMCl9bXM8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlA5NSAvIFA5OTwvc3Bhbj48YnI+PHN0cm9uZz4ke01hdGgucm91bmQocnQucDk1IHx8IDApfW1zIC8gJHtNYXRoLnJvdW5kKHJ0LnA5OSB8fCAwKX1tczwvc3Ryb25nPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdj48c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+TWluIFJlc3BvbnNlPC9zcGFuPjxicj48c3Ryb25nPiR7TWF0aC5yb3VuZChydC5taW4gfHwgMCl9bXM8L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk1heCBSZXNwb25zZTwvc3Bhbj48YnI+PHN0cm9uZz4ke01hdGgucm91bmQocnQubWF4IHx8IDApfW1zPC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2PjxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5VcCBDaGVja3M8L3NwYW4+PGJyPjxzdHJvbmcgc3R5bGU9XCJjb2xvcjogdmFyKC0tb2stZmcpO1wiPiR7c3QudXBDaGVja3MgfHwgMH08L3N0cm9uZz48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXY+PHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkRvd24gQ2hlY2tzPC9zcGFuPjxicj48c3Ryb25nIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+JHtzdC5kb3duQ2hlY2tzIHx8IDB9PC9zdHJvbmc+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGRldGFpbFJvdy5xdWVyeVNlbGVjdG9yKCd0ZCcpLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5ObyBkZXRhaWxlZCBzdGF0cyBhdmFpbGFibGUgZm9yIHRoaXMgcGVyaW9kLjwvZGl2Pic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGV0YWlsUm93LnF1ZXJ5U2VsZWN0b3IoJ3RkJykuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGF0dXNDb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkIHRvIGxvYWQgaGVhbHRoIHN0YXR1czogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkSW5jaWRlbnRzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBbb3BlblJlcywgaGlzdFJlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL2hlYWx0aC1jaGVja3MvaW5jaWRlbnRzJyksXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL2hlYWx0aC1jaGVja3MvaW5jaWRlbnRzL2hpc3Rvcnk/bGltaXQ9NTAnKVxuICAgICAgXSk7XG4gICAgICBjb25zdCBvcGVuRGF0YSA9IGF3YWl0IG9wZW5SZXMuanNvbigpO1xuICAgICAgY29uc3QgaGlzdERhdGEgPSBhd2FpdCBoaXN0UmVzLmpzb24oKTtcbiAgICAgIGxldCBodG1sID0gJyc7XG5cbiAgICAgIC8vIE9wZW4gaW5jaWRlbnRzXG4gICAgICBjb25zdCBvcGVuID0gKG9wZW5EYXRhLnN1Y2Nlc3MgJiYgb3BlbkRhdGEuaW5jaWRlbnRzKSA/IG9wZW5EYXRhLmluY2lkZW50cyA6IFtdO1xuICAgICAgaWYgKG9wZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDtcIj48aDQgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTsgbWFyZ2luOiAwIDAgOHB4O1wiPk9wZW4gSW5jaWRlbnRzICgnICsgb3Blbi5sZW5ndGggKyAnKTwvaDQ+JztcbiAgICAgICAgZm9yIChjb25zdCBpbmMgb2Ygb3Blbikge1xuICAgICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDEycHg7IG1hcmdpbi1ib3R0b206IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFkLWZnKTMwOyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJhZC1iZyk7XCI+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKGluYy5zZXJ2aWNlSWQpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4+JHtzZXZlcml0eUJhZGdlKGluYy5zZXZlcml0eSl9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7XCI+JHtlc2NhcGVIdG1sKGluYy5tZXNzYWdlKX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbi10b3A6IDRweDtcIj5TdGFydGVkICR7dGltZUFnbyhpbmMuY3JlYXRlZEF0KX0gXHUwMEI3ICR7aW5jLm9jY3VycmVuY2VzIHx8IDF9IG9jY3VycmVuY2Uocyk8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBodG1sICs9ICc8ZGl2IHN0eWxlPVwicGFkZGluZzogMTJweDsgbWFyZ2luLWJvdHRvbTogMTZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tb2stZmcpMzA7IGJvcmRlci1yYWRpdXM6IDhweDsgYmFja2dyb3VuZDogdmFyKC0tb2stYmcpOyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1vay1mZyk7IGZvbnQtc2l6ZTogMC45cmVtO1wiPkFsbCBzZXJ2aWNlcyBvcGVyYXRpb25hbCBcdTIwMTQgbm8gb3BlbiBpbmNpZGVudHM8L2Rpdj4nO1xuICAgICAgfVxuXG4gICAgICAvLyBJbmNpZGVudCBoaXN0b3J5XG4gICAgICBjb25zdCBoaXN0b3J5ID0gKGhpc3REYXRhLnN1Y2Nlc3MgJiYgaGlzdERhdGEuaGlzdG9yeSkgPyBoaXN0RGF0YS5oaXN0b3J5IDogW107XG4gICAgICBpZiAoaGlzdG9yeS5sZW5ndGggPiAwKSB7XG4gICAgICAgIGh0bWwgKz0gJzxoNCBzdHlsZT1cIm1hcmdpbjogMCAwIDhweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5JbmNpZGVudCBIaXN0b3J5PC9oND4nO1xuICAgICAgICBodG1sICs9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TZXJ2aWNlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+VHlwZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlNldmVyaXR5PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U3RhdHVzPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+RHVyYXRpb248L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5XaGVuPC90aD48L3RyPic7XG4gICAgICAgIGZvciAoY29uc3QgaW5jIG9mIGhpc3RvcnkpIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGluYy5zdGF0dXMgPT09ICdyZXNvbHZlZCc7XG4gICAgICAgICAgY29uc3QgZHVyID0gcmVzb2x2ZWQgJiYgaW5jLmR1cmF0aW9uID8gKGluYy5kdXJhdGlvbiA8IDYwMDAwID8gTWF0aC5yb3VuZChpbmMuZHVyYXRpb24gLyAxMDAwKSArICdzJyA6IE1hdGgucm91bmQoaW5jLmR1cmF0aW9uIC8gNjAwMDApICsgJ20nKSA6ICctJztcbiAgICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj4ke2VzY2FwZUh0bWwoaW5jLnNlcnZpY2VJZCl9PC90ZD5gO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj4ke2VzY2FwZUh0bWwoaW5jLnR5cGUpfTwvdGQ+YDtcbiAgICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtzZXZlcml0eUJhZGdlKGluYy5zZXZlcml0eSl9PC90ZD5gO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj48c3BhbiBzdHlsZT1cImNvbG9yOiAke3Jlc29sdmVkID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tYmFkLWZnKSd9O1wiPiR7aW5jLnN0YXR1c308L3NwYW4+PC90ZD5gO1xuICAgICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj4ke2R1cn08L3RkPmA7XG4gICAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7dGltZUFnbyhpbmMuY3JlYXRlZEF0KX08L3RkPmA7XG4gICAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwgKz0gJzwvdGFibGU+JztcbiAgICAgIH1cblxuICAgICAgaW5jaWRlbnRzQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWwgfHwgJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRFx1REVBODwvc3Bhbj5ObyBpbmNpZGVudHMgcmVjb3JkZWQgeWV0LjwvZGl2Pic7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaW5jaWRlbnRzQ29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBjb25zdCBzZXJ2aWNlcyA9IGRhdGEuc3VjY2VzcyAmJiBkYXRhLnN0YXR1cyA/IE9iamVjdC52YWx1ZXMoZGF0YS5zdGF0dXMpIDogW107XG4gICAgICBpZiAoc2VydmljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbmZpZ0NvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyNjk5XHVGRTBGPC9zcGFuPk5vIGhlYWx0aCBjaGVja3MgY29uZmlndXJlZCB5ZXQuIENsaWNrIFwiQWRkIEhlYWx0aCBDaGVja1wiIGJlbG93LjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODVyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5TZXJ2aWNlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U3RhdHVzPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U0xBIFRhcmdldDwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5BY3Rpb25zPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IHMgb2Ygc2VydmljZXMpIHtcbiAgICAgICAgY29uc3QgaXNVcCA9IHMuc3RhdHVzID09PSAndXAnO1xuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKHMubmFtZSB8fCBzLnNlcnZpY2VJZCl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGNvbG9yOiAke2lzVXAgPyAndmFyKC0tb2stZmcpJyA6ICd2YXIoLS1iYWQtZmcpJ307XCI+JHtpc1VwID8gJ1VwJyA6ICdEb3duJ308L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj4ke3Muc2xhPy50YXJnZXQgPyBzLnNsYS50YXJnZXQgKyAnJScgOiAnLSd9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDxidXR0b24gb25jbGljaz1cImRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoZWFsdGgtZWRpdCcsIHtkZXRhaWw6JyR7ZXNjYXBlSHRtbChzLnNlcnZpY2VJZCl9J30pKVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgbWFyZ2luLXJpZ2h0OiA0cHg7XCI+RWRpdDwvYnV0dG9uPmA7XG4gICAgICAgIGh0bWwgKz0gYDxidXR0b24gb25jbGljaz1cImRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdoZWFsdGgtZGVsZXRlJywge2RldGFpbDonJHtlc2NhcGVIdG1sKHMuc2VydmljZUlkKX0nfSkpXCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRlbGV0ZTwvYnV0dG9uPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvdGQ+PC90cj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgY29uZmlnQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uZmlnQ29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzaG93Rm9ybShpZCwgbmFtZSwgdXJsLCB0aW1lb3V0LCBjb2Rlcywgc2xhLCBzbG93KSB7XG4gICAgZWRpdGluZ0lkID0gaWQgfHwgbnVsbDtcbiAgICBmb3JtVGl0bGUudGV4dENvbnRlbnQgPSBpZCA/ICdFZGl0IEhlYWx0aCBDaGVjaycgOiAnQWRkIEhlYWx0aCBDaGVjayc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWlkJykudmFsdWUgPSBpZCB8fCAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0taWQnKS5kaXNhYmxlZCA9ICEhaWQ7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLW5hbWUnKS52YWx1ZSA9IG5hbWUgfHwgJyc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXVybCcpLnZhbHVlID0gdXJsIHx8ICcnO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS10aW1lb3V0JykudmFsdWUgPSB0aW1lb3V0IHx8IDEwMDAwO1xuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1jb2RlcycpLnZhbHVlID0gY29kZXMgfHwgJzIwMCc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXNsYScpLnZhbHVlID0gc2xhIHx8IDk5Ljk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLXNsb3cnKS52YWx1ZSA9IHNsb3cgfHwgNTAwMDtcbiAgICBmb3JtRWwuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgIGFkZEJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlkZUZvcm0oKSB7XG4gICAgZm9ybUVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgYWRkQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICBlZGl0aW5nSWQgPSBudWxsO1xuICB9XG5cbiAgYWRkQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNob3dGb3JtKCcnLCAnJywgJycsIDEwMDAwLCAnMjAwJywgOTkuOSwgNTAwMCkpO1xuICBmb3JtQ2FuY2VsPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGhpZGVGb3JtKTtcblxuICBmb3JtU2F2ZT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgaWQgPSBlZGl0aW5nSWQgfHwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWlkJykudmFsdWUudHJpbSgpO1xuICAgIGlmICghaWQpIHJldHVybiBzaG93Tm90aWZpY2F0aW9uKCdTZXJ2aWNlIElEIGlzIHJlcXVpcmVkJywgJ3dhcm5pbmcnKTtcbiAgICBjb25zdCB1cmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tdXJsJykudmFsdWUudHJpbSgpO1xuICAgIGlmICghdXJsKSByZXR1cm4gc2hvd05vdGlmaWNhdGlvbignVVJMIGlzIHJlcXVpcmVkJywgJ3dhcm5pbmcnKTtcblxuICAgIGNvbnN0IGNvZGVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLWNvZGVzJykudmFsdWUuc3BsaXQoJywnKS5tYXAoYyA9PiBwYXJzZUludChjLnRyaW0oKSkpLmZpbHRlcihCb29sZWFuKTtcbiAgICBjb25zdCBib2R5ID0ge1xuICAgICAgbmFtZTogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2hlYWx0aC1mb3JtLW5hbWUnKS52YWx1ZS50cmltKCkgfHwgaWQsXG4gICAgICB1cmwsXG4gICAgICB0aW1lb3V0OiBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tdGltZW91dCcpLnZhbHVlKSB8fCAxMDAwMCxcbiAgICAgIGV4cGVjdGVkU3RhdHVzQ29kZXM6IGNvZGVzLmxlbmd0aCA/IGNvZGVzIDogWzIwMF0sXG4gICAgICBzbGE6IHsgdGFyZ2V0OiBwYXJzZUZsb2F0KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdoZWFsdGgtZm9ybS1zbGEnKS52YWx1ZSkgfHwgOTkuOSB9LFxuICAgICAgc2xvd1Jlc3BvbnNlVGhyZXNob2xkOiBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnaGVhbHRoLWZvcm0tc2xvdycpLnZhbHVlKSB8fCA1MDAwXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBmb3JtU2F2ZS50ZXh0Q29udGVudCA9ICdTYXZpbmcuLi4nO1xuICAgICAgZm9ybVNhdmUuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvaGVhbHRoLWNoZWNrcy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L2NvbmZpZ3VyZWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KVxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghZGF0YS5zdWNjZXNzKSB0aHJvdyBuZXcgRXJyb3IoZGF0YS5lcnJvciB8fCAnU2F2ZSBmYWlsZWQnKTtcbiAgICAgIGhpZGVGb3JtKCk7XG4gICAgICBsb2FkQ29uZmlnKCk7XG4gICAgICBsb2FkU3RhdHVzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignRXJyb3I6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBmb3JtU2F2ZS50ZXh0Q29udGVudCA9ICdTYXZlJztcbiAgICAgIGZvcm1TYXZlLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdoZWFsdGgtZWRpdCcsIGFzeW5jIChlKSA9PiB7XG4gICAgY29uc3QgaWQgPSBlLmRldGFpbDtcbiAgICAvLyBMb2FkIGV4aXN0aW5nIGNvbmZpZyB0byBwb3B1bGF0ZSBmb3JtIFx1MjAxNCB1c2UgY3VycmVudCBzdGF0dXMgZGF0YSBhcyBmYWxsYmFja1xuICAgIHNob3dGb3JtKGlkLCAnJywgJycsIDEwMDAwLCAnMjAwJywgOTkuOSwgNTAwMCk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2hlYWx0aC1kZWxldGUnLCBhc3luYyAoZSkgPT4ge1xuICAgIGNvbnN0IGlkID0gZS5kZXRhaWw7XG4gICAgaWYgKCFjb25maXJtKGBEZWxldGUgaGVhbHRoIGNoZWNrIGZvciBcIiR7aWR9XCI/YCkpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvaGVhbHRoLWNoZWNrcy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9L2NvbmZpZ3VyZWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHRocm93IG5ldyBFcnJvcihkYXRhLmVycm9yKTtcbiAgICAgIGxvYWRDb25maWcoKTtcbiAgICAgIGxvYWRTdGF0dXMoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgZXJyLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfSk7XG5cbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkU3RhdHVzKCk7XG4gIH0pO1xuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZFN0YXR1cyk7XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJoZWFsdGgtaW5jaWRlbnRzXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEluY2lkZW50cyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiaGVhbHRoLWNvbmZpZ1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWRDb25maWcpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gVVBEQVRFIE1BTkFHRU1FTlQgPT09PT09PT09PVxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgndXBkYXRlcy1tb2RhbCcsIGA8ZGl2IGlkPVwidXBkYXRlcy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNzUwcHg7IG1heC13aWR0aDogOTUwcHg7XCI+XG4gICAgICA8aDM+XHUyQjA2XHVGRTBGIFVwZGF0ZSBNYW5hZ2VtZW50PC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgQ2hlY2sgZm9yIGNvbnRhaW5lciBpbWFnZSB1cGRhdGVzLCBhcHBseSB0aGVtLCBhbmQgbWFuYWdlIHJvbGxiYWNrcy5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLXRhYnNcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYiBhY3RpdmVcIiBkYXRhLXBhbmVsPVwidXBkYXRlcy1hdmFpbGFibGVcIj5BdmFpbGFibGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJ1cGRhdGVzLWhpc3RvcnlcIj5IaXN0b3J5PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJwYW5lbC10YWJcIiBkYXRhLXBhbmVsPVwidXBkYXRlcy1hdXRvXCI+QXV0by1VcGRhdGU8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJ1cGRhdGVzLWRhc2hjYWRkeVwiIGlkPVwidXBkYXRlcy1kYXNoY2FkZHktdGFiXCI+RGFzaENhZGR5PC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IEF2YWlsYWJsZSBVcGRhdGVzIC0tPlxuICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtYXZhaWxhYmxlXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInVwZGF0ZXMtY2hlY2stYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCI+XHVEODNEXHVERDBEIENoZWNrIGZvciBVcGRhdGVzPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInVwZGF0ZXMtdXBkYXRlLWFsbC1idG5cIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IHBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODJyZW07IGJhY2tncm91bmQ6ICNmOTczMTY7IGNvbG9yOiAjZmZmOyBib3JkZXI6IDFweCBzb2xpZCAjZjk3MzE2OyBib3JkZXItcmFkaXVzOiA2cHg7IGN1cnNvcjogcG9pbnRlcjtcIj5cdTJCMDZcdUZFMEYgVXBkYXRlIEFsbDwvYnV0dG9uPlxuICAgICAgICAgIDxzcGFuIGlkPVwidXBkYXRlcy1jb3VudC1iYWRnZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNHB4IDEwcHg7IGJvcmRlci1yYWRpdXM6IDEycHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJnKTtcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwidXBkYXRlcy1hdmFpbGFibGUtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0NTBweDsgb3ZlcmZsb3cteTogYXV0bztcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+IENsaWNrIFwiQ2hlY2sgZm9yIFVwZGF0ZXNcIiB0byBzY2FuIGNvbnRhaW5lcnMuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVGFiOiBIaXN0b3J5IC0tPlxuICAgICAgPGRpdiBpZD1cInVwZGF0ZXMtaGlzdG9yeVwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwidXBkYXRlcy1oaXN0b3J5LWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyB1cGRhdGUgaGlzdG9yeS4uLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFRhYjogQXV0by1VcGRhdGUgLS0+XG4gICAgICA8ZGl2IGlkPVwidXBkYXRlcy1hdXRvXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWF1dG8tY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNFXHVERDE2PC9zcGFuPiBMb2FkaW5nIGF1dG8tdXBkYXRlIGNvbmZpZ3VyYXRpb24uLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUYWI6IERhc2hDYWRkeSBTZWxmLVVwZGF0ZSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJ1cGRhdGVzLWRhc2hjYWRkeVwiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LXZlcnNpb24taW5mb1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiAxNnB4OyBtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDogNjAwOyBmb250LXNpemU6IDFyZW07XCI+RGFzaENhZGR5PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LWN1cnJlbnQtdmVyc2lvblwiIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPkxvYWRpbmcuLi48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LXVwZGF0ZS1iYWRnZVwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgcGFkZGluZzogNHB4IDEycHg7IGJvcmRlci1yYWRpdXM6IDEycHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6IHZhcigtLWJnKTtcIj5VcGRhdGUgYXZhaWxhYmxlPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwiZGFzaGNhZGR5LXVwZGF0ZS1kZXRhaWxzXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tYm90dG9tOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsgYWxpZ24taXRlbXM6IGNlbnRlcjsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogNjAwO1wiPk5ldyB2ZXJzaW9uOiA8c3BhbiBpZD1cImRhc2hjYWRkeS1uZXctdmVyc2lvblwiPjwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIGlkPVwiZGFzaGNhZGR5LWFwcGx5LWJ0blwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE2cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5VcGRhdGUgTm93PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBpZD1cImRhc2hjYWRkeS1jaGFuZ2Vsb2dcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXgtaGVpZ2h0OiAxMjBweDsgb3ZlcmZsb3cteTogYXV0bzsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyBmb250LWZhbWlseTogdmFyKC0tZm9udC1tb25vKTsgbGluZS1oZWlnaHQ6IDEuNTtcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkYXNoY2FkZHktc3RhdHVzLWJhclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXItcmFkaXVzOiA4cHg7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImRhc2hjYWRkeS1jaGVjay1idG5cIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxNHB4OyBmb250LXNpemU6IDAuODJyZW07XCI+Q2hlY2sgZm9yIFVwZGF0ZXM8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGFzaGNhZGR5LXJvbGxiYWNrLWJ0blwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44MnJlbTsgbWFyZ2luLWxlZnQ6IDZweDtcIj5Sb2xsYmFjazwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRhc2hjYWRkeS1oaXN0b3J5LWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogMjUwcHg7IG92ZXJmbG93LXk6IGF1dG87XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHVEODNEXHVEQ0U2PC9zcGFuPk5vIHNlbGYtdXBkYXRlIGhpc3RvcnkuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib3R0b20tYmFyXCI+XG4gICAgICAgIDxzcGFuIGlkPVwidXBkYXRlcy1sYXN0LWNoZWNrXCIgY2xhc3M9XCJ0ZXh0LWF1dG8tcmlnaHRcIj48L3NwYW4+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJ1cGRhdGVzLWNhbmNlbFwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWNhbmNlbCcpO1xuICBjb25zdCBjaGVja0J0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWNoZWNrLWJ0bicpO1xuICBjb25zdCBhdmFpbGFibGVDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1hdmFpbGFibGUtY29udGFpbmVyJyk7XG4gIGNvbnN0IGhpc3RvcnlDb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1oaXN0b3J5LWNvbnRhaW5lcicpO1xuICBjb25zdCBhdXRvQ29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtYXV0by1jb250YWluZXInKTtcbiAgY29uc3QgbGFzdENoZWNrU3BhbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLWxhc3QtY2hlY2snKTtcblxuICBhc3luYyBmdW5jdGlvbiBsb2FkQXZhaWxhYmxlKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS91cGRhdGVzL2F2YWlsYWJsZScpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IpO1xuXG4gICAgICBjb25zdCB1cGRhdGVzID0gZGF0YS51cGRhdGVzIHx8IFtdO1xuICAgICAgaWYgKHVwZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGF2YWlsYWJsZUNvbnRhaW5lci5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJlbXB0eS1pY29uXCI+XHUyNzA1PC9zcGFuPkFsbCBjb250YWluZXJzIGFyZSB1cCB0byBkYXRlLjwvZGl2Pic7XG4gICAgICAgIGxhc3RDaGVja1NwYW4udGV4dENvbnRlbnQgPSAnJztcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtdXBkYXRlLWFsbC1idG4nKS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1jb3VudC1iYWRnZScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHdpbmRvdy5fcGVuZGluZ1VwZGF0ZXMgPSBbXTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+Q29udGFpbmVyPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+SW1hZ2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5DdXJyZW50PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TGF0ZXN0PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPkFjdGlvbnM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgdSBvZiB1cGRhdGVzKSB7XG4gICAgICAgIC8vIE1hdGNoIGFwcCBieSBjb250YWluZXJJZCBmaXJzdCwgdGhlbiBuYW1lXG4gICAgICAgIGNvbnN0IGFwcElkID0gKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBhcHBzID0gd2luZG93LkFQUFMgfHwgW107XG4gICAgICAgICAgZm9yIChjb25zdCBhIG9mIGFwcHMpIHtcbiAgICAgICAgICAgIGlmIChhLmNvbnRhaW5lcklkID09PSB1LmNvbnRhaW5lcklkIHx8IGEubmFtZSA9PT0gdS5jb250YWluZXJOYW1lIHx8IGEuaWQgPT09IHUuY29udGFpbmVyTmFtZSkgcmV0dXJuIGEuaWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1LmNvbnRhaW5lck5hbWU7XG4gICAgICAgIH0pKCk7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBkYXRhLWFwcC1pZD1cIiR7ZXNjYXBlSHRtbChhcHBJZCl9XCIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKHUuY29udGFpbmVyTmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKHUuaW1hZ2VOYW1lKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj48Y29kZSBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBwYWRkaW5nOiAycHggNnB4OyBib3JkZXItcmFkaXVzOiA0cHg7XCI+JHtlc2NhcGVIdG1sKHUuY3VycmVudERpZ2VzdCl9PC9jb2RlPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPjxjb2RlIHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBiYWNrZ3JvdW5kOiB2YXIoLS1vay1iZyk7IGNvbG9yOiB2YXIoLS1vay1mZyk7IHBhZGRpbmc6IDJweCA2cHg7IGJvcmRlci1yYWRpdXM6IDRweDtcIj4ke2VzY2FwZUh0bWwodS5sYXRlc3REaWdlc3QpfTwvY29kZT48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+YDtcbiAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cInVwZGF0ZS1ub3ctYnRuXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbCh1LmNvbnRhaW5lcklkKX1cIiBkYXRhLW5hbWU9XCIke2VzY2FwZUh0bWwodS5jb250YWluZXJOYW1lKX1cIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiB2YXIoLS1iZyk7IGJvcmRlci1jb2xvcjogdmFyKC0tYWNjZW50KTsgbWFyZ2luLXJpZ2h0OiA0cHg7XCI+VXBkYXRlPC9idXR0b24+YDtcbiAgICAgICAgaHRtbCArPSBgPGJ1dHRvbiBjbGFzcz1cInJvbGxiYWNrLWJ0blwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwodS5jb250YWluZXJJZCl9XCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKHUuY29udGFpbmVyTmFtZSl9XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtO1wiPlJvbGxiYWNrPC9idXR0b24+YDtcbiAgICAgICAgaHRtbCArPSAnPC90ZD48L3RyPic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBhdmFpbGFibGVDb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGxhc3RDaGVja1NwYW4udGV4dENvbnRlbnQgPSB1cGRhdGVzLmxlbmd0aCArICcgdXBkYXRlKHMpIGF2YWlsYWJsZSc7XG5cbiAgICAgIC8vIFNob3cgY291bnQgYmFkZ2UgYW5kIFVwZGF0ZSBBbGwgYnV0dG9uXG4gICAgICBjb25zdCBjb3VudEJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtY291bnQtYmFkZ2UnKTtcbiAgICAgIGNvbnN0IHVwZGF0ZUFsbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLXVwZGF0ZS1hbGwtYnRuJyk7XG4gICAgICBpZiAoY291bnRCYWRnZSkge1xuICAgICAgICBjb3VudEJhZGdlLnRleHRDb250ZW50ID0gdXBkYXRlcy5sZW5ndGggKyAnIHBlbmRpbmcnO1xuICAgICAgICBjb3VudEJhZGdlLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICAgIH1cbiAgICAgIGlmICh1cGRhdGVBbGxCdG4gJiYgdXBkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHVwZGF0ZUFsbEJ0bi5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHVwZGF0ZXMgZm9yIFVwZGF0ZSBBbGwgYnV0dG9uXG4gICAgICB3aW5kb3cuX3BlbmRpbmdVcGRhdGVzID0gdXBkYXRlcztcblxuICAgICAgLy8gV2lyZSB1cGRhdGUgYnV0dG9uc1xuICAgICAgYXZhaWxhYmxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy51cGRhdGUtbm93LWJ0bicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gYnRuLmRhdGFzZXQuaWQ7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGJ0bi5kYXRhc2V0Lm5hbWU7XG4gICAgICAgICAgaWYgKCFjb25maXJtKGBVcGRhdGUgXCIke25hbWV9XCIgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uPyBUaGUgY29udGFpbmVyIHdpbGwgcmVzdGFydC5gKSkgcmV0dXJuO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdVcGRhdGluZy4uLic7XG4gICAgICAgICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgciA9IGF3YWl0IHNlY3VyZUZldGNoKGAvYXBpL3YxL3VwZGF0ZXMvdXBkYXRlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhdXRvUm9sbGJhY2s6IHRydWUgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgICAgICAgaWYgKGQuc3VjY2Vzcykge1xuICAgICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnRG9uZSEnO1xuICAgICAgICAgICAgICBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICd2YXIoLS1vay1mZyknO1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IGxvYWRBdmFpbGFibGUoKSwgMjAwMCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZC5lcnJvciB8fCAnVXBkYXRlIGZhaWxlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdGYWlsZWQnO1xuICAgICAgICAgICAgYnRuLnN0eWxlLmNvbG9yID0gJ3ZhcigtLWJhZC1mZyknO1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignVXBkYXRlIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnVXBkYXRlJzsgYnRuLmRpc2FibGVkID0gZmFsc2U7IGJ0bi5zdHlsZS5jb2xvciA9ICcnOyBidG4uc3R5bGUuYmFja2dyb3VuZCA9ICcnOyB9LCAzMDAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFdpcmUgcm9sbGJhY2sgYnV0dG9uc1xuICAgICAgYXZhaWxhYmxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5yb2xsYmFjay1idG4nKS5mb3JFYWNoKGJ0biA9PiB7XG4gICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGJ0bi5kYXRhc2V0LmlkO1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBidG4uZGF0YXNldC5uYW1lO1xuICAgICAgICAgIGlmICghY29uZmlybShgUm9sbGJhY2sgXCIke25hbWV9XCIgdG8gaXRzIHByZXZpb3VzIHZlcnNpb24/YCkpIHJldHVybjtcbiAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnUm9sbGluZyBiYWNrLi4uJztcbiAgICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvdXBkYXRlcy9yb2xsYmFjay8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YCwgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1JvbGxlZCBiYWNrISc7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gbG9hZEF2YWlsYWJsZSgpLCAyMDAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihkLmVycm9yIHx8ICdSb2xsYmFjayBmYWlsZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnRmFpbGVkJztcbiAgICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ1JvbGxiYWNrIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBidG4udGV4dENvbnRlbnQgPSAnUm9sbGJhY2snOyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgfSwgMzAwMCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF2YWlsYWJsZUNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgLy8gVXBkYXRlIEFsbCBcdTIwMTQgc2VxdWVudGlhbGx5LCBza2lwIGZhaWx1cmVzXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbENvbnRhaW5lcnMoKSB7XG4gICAgY29uc3QgdXBkYXRlcyA9IHdpbmRvdy5fcGVuZGluZ1VwZGF0ZXMgfHwgW107XG4gICAgaWYgKCF1cGRhdGVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGVzLXVwZGF0ZS1hbGwtYnRuJyk7XG4gICAgaWYgKCFjb25maXJtKGBVcGRhdGUgYWxsICR7dXBkYXRlcy5sZW5ndGh9IGNvbnRhaW5lcnM/IEVhY2ggd2lsbCByZXN0YXJ0LmApKSByZXR1cm47XG4gICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjNGMyBVcGRhdGluZy4uLic7XG4gICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBsZXQgc3VjY2VzcyA9IDAsIGZhaWxlZCA9IDA7XG4gICAgZm9yIChjb25zdCB1IG9mIHVwZGF0ZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHIgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS91cGRhdGVzL3VwZGF0ZS8ke2VuY29kZVVSSUNvbXBvbmVudCh1LmNvbnRhaW5lcklkKX1gLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBhdXRvUm9sbGJhY2s6IHRydWUgfSlcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgaWYgKGQuc3VjY2Vzcykgc3VjY2VzcysrO1xuICAgICAgICBlbHNlIGZhaWxlZCsrO1xuICAgICAgfSBjYXRjaCAoXykgeyBmYWlsZWQrKzsgfVxuICAgIH1cbiAgICBidG4udGV4dENvbnRlbnQgPSBgXHUyNzA1IERvbmVgO1xuICAgIHNob3dOb3RpZmljYXRpb24oYFVwZGF0ZSBhbGw6ICR7c3VjY2Vzc30gc3VjY2VlZGVkLCAke2ZhaWxlZH0gZmFpbGVkLmAsIHN1Y2Nlc3MgPiAwICYmIGZhaWxlZCA9PT0gMCA/ICdzdWNjZXNzJyA6ICdlcnJvcicpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MkIwNlx1RkUwRiBVcGRhdGUgQWxsJztcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgbG9hZEF2YWlsYWJsZSgpO1xuICAgIH0sIDMwMDApO1xuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwZGF0ZXMtdXBkYXRlLWFsbC1idG4nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB1cGRhdGVBbGxDb250YWluZXJzKTtcblxuICBhc3luYyBmdW5jdGlvbiBjaGVja0ZvclVwZGF0ZXMoKSB7XG4gICAgY2hlY2tCdG4udGV4dENvbnRlbnQgPSAnXHVEODNEXHVERDBEIENoZWNraW5nLi4uJztcbiAgICBjaGVja0J0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3VwZGF0ZXMvY2hlY2snLCB7IG1ldGhvZDogJ1BPU1QnIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcykgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IpO1xuICAgICAgY2hlY2tCdG4udGV4dENvbnRlbnQgPSAnXHUyNzA1IERvbmUhJztcbiAgICAgIGF3YWl0IGxvYWRBdmFpbGFibGUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjaGVja0J0bi50ZXh0Q29udGVudCA9ICdcdTI3NEMgRmFpbGVkJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ0NoZWNrIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7IGNoZWNrQnRuLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1REQwRCBDaGVjayBmb3IgVXBkYXRlcyc7IGNoZWNrQnRuLmRpc2FibGVkID0gZmFsc2U7IH0sIDMwMDApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZEhpc3RvcnkoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZy4uLjwvZGl2Pic7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS91cGRhdGVzL2hpc3Rvcnk/bGltaXQ9NTAnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3QgaGlzdG9yeSA9IGRhdGEuc3VjY2VzcyAmJiBkYXRhLmhpc3RvcnkgPyBkYXRhLmhpc3RvcnkgOiBbXTtcbiAgICAgIGlmIChoaXN0b3J5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBoaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDQ0I8L3NwYW4+Tm8gdXBkYXRlIGhpc3RvcnkgeWV0LjwvZGl2Pic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBodG1sID0gJzx0YWJsZSBzdHlsZT1cIndpZHRoOiAxMDAlOyBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOyBmb250LXNpemU6IDAuODJyZW07XCI+JztcbiAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5XaGVuPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+Q29udGFpbmVyPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+SW1hZ2U8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5EdXJhdGlvbjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlN0YXR1czwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCBoIG9mIGhpc3RvcnkpIHtcbiAgICAgICAgY29uc3Qgb2sgPSBoLnN0YXR1cyA9PT0gJ3N1Y2Nlc3MnO1xuICAgICAgICBjb25zdCBkdXIgPSBoLmR1cmF0aW9uID8gKGguZHVyYXRpb24gPCAxMDAwID8gaC5kdXJhdGlvbiArICdtcycgOiBNYXRoLnJvdW5kKGguZHVyYXRpb24gLyAxMDAwKSArICdzJykgOiAnLSc7XG4gICAgICAgIGh0bWwgKz0gYDx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke3RpbWVBZ28oaC50aW1lc3RhbXApfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChoLmNvbnRhaW5lck5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbChoLmltYWdlTmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+JHtkdXJ9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjogJHtvayA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJhZC1mZyknfTtcIj4ke29rID8gJ1x1MjcxMyBzdWNjZXNzJyA6ICdcdTI3MTcgZmFpbGVkJ308L3NwYW4+PC90ZD5gO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICAgIGlmICghb2sgJiYgaC5lcnJvcikge1xuICAgICAgICAgIGh0bWwgKz0gYDx0cj48dGQgY29sc3Bhbj1cIjVcIiBzdHlsZT1cInBhZGRpbmc6IDRweCA2cHggOHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiR7ZXNjYXBlSHRtbChoLmVycm9yKX08L3RkPjwvdHI+YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgaGlzdG9yeUNvbnRhaW5lci5pbm5lckhUTUwgPSBodG1sO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGhpc3RvcnlDb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRBdXRvQ29uZmlnKCkge1xuICAgIHRyeSB7XG4gICAgICBhdXRvQ29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuXG4gICAgICAvLyBGZXRjaCBjb250YWluZXJzIGFuZCBzYXZlZCBhdXRvLXVwZGF0ZSBjb25maWcgaW4gcGFyYWxsZWxcbiAgICAgIGNvbnN0IFtjb250YWluZXJzUmVzLCBjb25maWdSZXNdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICBmZXRjaCgnL2FwaS92MS9zdGF0cy9jb250YWluZXJzJyksXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL3VwZGF0ZXMvYXV0by11cGRhdGUnKVxuICAgICAgXSk7XG4gICAgICBjb25zdCBjb250YWluZXJzRGF0YSA9IGF3YWl0IGNvbnRhaW5lcnNSZXMuanNvbigpO1xuICAgICAgY29uc3QgY29uZmlnRGF0YSA9IGF3YWl0IGNvbmZpZ1Jlcy5qc29uKCk7XG5cbiAgICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBjb250YWluZXJzRGF0YS5zdWNjZXNzICYmIGNvbnRhaW5lcnNEYXRhLnN0YXRzID8gY29udGFpbmVyc0RhdGEuc3RhdHMgOiBbXTtcbiAgICAgIGNvbnN0IHNhdmVkQ29uZmlnID0gY29uZmlnRGF0YS5zdWNjZXNzICYmIGNvbmZpZ0RhdGEuY29uZmlnID8gY29uZmlnRGF0YS5jb25maWcgOiB7fTtcblxuICAgICAgaWYgKGNvbnRhaW5lcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGF1dG9Db250YWluZXIuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiZW1wdHktaWNvblwiPlx1RDgzRVx1REQxNjwvc3Bhbj5ObyBydW5uaW5nIGNvbnRhaW5lcnMgZm91bmQuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaHRtbCA9ICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+QXV0by11cGRhdGVzIHJ1biBkdXJpbmcgbWFpbnRlbmFuY2Ugd2luZG93IChkZWZhdWx0IDJBTS00QU0pLiBEYWlseSA9IGV2ZXJ5IGRheSwgV2Vla2x5ID0gU3VuZGF5cywgTW9udGhseSA9IDFzdCBvZiBtb250aC48L2Rpdj4nO1xuICAgICAgaHRtbCArPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkNvbnRhaW5lcjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlNjaGVkdWxlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+V2luZG93PC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA4cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+Um9sbGJhY2s8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5MYXN0IFJ1bjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogOHB4OyB0ZXh0LWFsaWduOiByaWdodDtcIj5BY3Rpb25zPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IGMgb2YgY29udGFpbmVycykge1xuICAgICAgICBjb25zdCBuYW1lID0gYy5uYW1lIHx8IGMuTmFtZXM/LlswXT8ucmVwbGFjZSgvXlxcLy8sICcnKSB8fCBjLklkPy5zdWJzdHJpbmcoMCwgMTIpO1xuICAgICAgICBjb25zdCBjaWQgPSBjLmNvbnRhaW5lcklkIHx8IGMuSWQ7XG4gICAgICAgIGNvbnN0IHNhdmVkID0gc2F2ZWRDb25maWdbY2lkXSB8fCB7fTtcbiAgICAgICAgY29uc3Qgc2NoZWR1bGVWYWwgPSBzYXZlZC5lbmFibGVkID8gKHNhdmVkLnNjaGVkdWxlIHx8ICd3ZWVrbHknKSA6ICcnO1xuICAgICAgICBjb25zdCByb2xsYmFja1ZhbCA9IHNhdmVkLmF1dG9Sb2xsYmFjayAhPT0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHdpbmRvd1ZhbCA9IHNhdmVkLm1haW50ZW5hbmNlV2luZG93IHx8ICcnO1xuICAgICAgICBjb25zdCBsYXN0UnVuID0gc2F2ZWQubGFzdEF1dG9VcGRhdGUgPyB0aW1lQWdvKHNhdmVkLmxhc3RBdXRvVXBkYXRlKSA6ICdOZXZlcic7XG5cbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCIgZGF0YS1jb250YWluZXItaWQ9XCIke2VzY2FwZUh0bWwoY2lkKX1cIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA4cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKG5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogOHB4O1wiPlxuICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJhdXRvLXNjaGVkdWxlXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChjaWQpfVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDhweDsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIiR7IXNjaGVkdWxlVmFsID8gJyBzZWxlY3RlZCcgOiAnJ30+RGlzYWJsZWQ8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkYWlseVwiJHtzY2hlZHVsZVZhbCA9PT0gJ2RhaWx5JyA/ICcgc2VsZWN0ZWQnIDogJyd9PkRhaWx5PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwid2Vla2x5XCIke3NjaGVkdWxlVmFsID09PSAnd2Vla2x5JyA/ICcgc2VsZWN0ZWQnIDogJyd9PldlZWtseTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm1vbnRobHlcIiR7c2NoZWR1bGVWYWwgPT09ICdtb250aGx5JyA/ICcgc2VsZWN0ZWQnIDogJyd9Pk1vbnRobHk8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj48aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImF1dG8td2luZG93XCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChjaWQpfVwiIHZhbHVlPVwiJHtlc2NhcGVIdG1sKHdpbmRvd1ZhbCl9XCIgcGxhY2Vob2xkZXI9XCIwMjowMC0wNDowMFwiIHN0eWxlPVwid2lkdGg6IDkwcHg7IHBhZGRpbmc6IDNweCA2cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7XCIgLz48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDtcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJhdXRvLXJvbGxiYWNrXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChjaWQpfVwiJHtyb2xsYmFja1ZhbCA/ICcgY2hlY2tlZCcgOiAnJ30gLz48L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7bGFzdFJ1bn08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDhweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+PGJ1dHRvbiBjbGFzcz1cInNhdmUtYXV0by1idG5cIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKGNpZCl9XCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKG5hbWUpfVwiIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj5TYXZlPC9idXR0b24+PC90ZD5gO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBhdXRvQ29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG5cbiAgICAgIC8vIFdpcmUgc2F2ZSBidXR0b25zXG4gICAgICBhdXRvQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zYXZlLWF1dG8tYnRuJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBidG4uZGF0YXNldC5pZDtcbiAgICAgICAgICBjb25zdCByb3cgPSBidG4uY2xvc2VzdCgndHInKTtcbiAgICAgICAgICBjb25zdCBzY2hlZHVsZSA9IHJvdy5xdWVyeVNlbGVjdG9yKCcuYXV0by1zY2hlZHVsZScpLnZhbHVlO1xuICAgICAgICAgIGNvbnN0IHJvbGxiYWNrID0gcm93LnF1ZXJ5U2VsZWN0b3IoJy5hdXRvLXJvbGxiYWNrJykuY2hlY2tlZDtcbiAgICAgICAgICBjb25zdCB3aW5kb3cgPSByb3cucXVlcnlTZWxlY3RvcignLmF1dG8td2luZG93JykudmFsdWUudHJpbSgpO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdTYXZpbmcuLi4nO1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHIgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS91cGRhdGVzL2F1dG8tdXBkYXRlLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGlkKX1gLCB7XG4gICAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBlbmFibGVkOiAhIXNjaGVkdWxlLCBzY2hlZHVsZTogc2NoZWR1bGUgfHwgJ3dlZWtseScsIGF1dG9Sb2xsYmFjazogcm9sbGJhY2ssIG1haW50ZW5hbmNlV2luZG93OiB3aW5kb3cgfHwgdW5kZWZpbmVkIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGQgPSBhd2FpdCByLmpzb24oKTtcbiAgICAgICAgICAgIGlmIChkLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcxMyBTYXZlZCc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZC5lcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgYnRuLnRleHRDb250ZW50ID0gJ1x1MjcxNyBFcnJvcic7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdTYXZlIGVycm9yOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IGJ0bi50ZXh0Q29udGVudCA9ICdTYXZlJzsgYnRuLmRpc2FibGVkID0gZmFsc2U7IH0sIDIwMDApO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGF1dG9Db250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vID09PT09IERBU0hDQUREWSBTRUxGLVVQREFURSA9PT09PVxuXG4gIGNvbnN0IGRjVmVyc2lvbkluZm8gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LWN1cnJlbnQtdmVyc2lvbicpO1xuICBjb25zdCBkY1VwZGF0ZUJhZGdlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS11cGRhdGUtYmFkZ2UnKTtcbiAgY29uc3QgZGNVcGRhdGVEZXRhaWxzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS11cGRhdGUtZGV0YWlscycpO1xuICBjb25zdCBkY05ld1ZlcnNpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LW5ldy12ZXJzaW9uJyk7XG4gIGNvbnN0IGRjQ2hhbmdlbG9nID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1jaGFuZ2Vsb2cnKTtcbiAgY29uc3QgZGNBcHBseUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkYXNoY2FkZHktYXBwbHktYnRuJyk7XG4gIGNvbnN0IGRjQ2hlY2tCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LWNoZWNrLWJ0bicpO1xuICBjb25zdCBkY1JvbGxiYWNrQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1yb2xsYmFjay1idG4nKTtcbiAgY29uc3QgZGNTdGF0dXNCYXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGFzaGNhZGR5LXN0YXR1cy1iYXInKTtcbiAgY29uc3QgZGNIaXN0b3J5Q29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Rhc2hjYWRkeS1oaXN0b3J5LWNvbnRhaW5lcicpO1xuXG4gIGxldCBkY0xhc3RDaGVjayA9IG51bGw7XG5cbiAgZnVuY3Rpb24gZGNTaG93U3RhdHVzKG1zZywgdHlwZSkge1xuICAgIGlmICghZGNTdGF0dXNCYXIpIHJldHVybjtcbiAgICBkY1N0YXR1c0Jhci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICBkY1N0YXR1c0Jhci5zdHlsZS5iYWNrZ3JvdW5kID0gdHlwZSA9PT0gJ2Vycm9yJyA/ICd2YXIoLS1iYWQtYmcpJyA6IHR5cGUgPT09ICdzdWNjZXNzJyA/ICd2YXIoLS1vay1iZyknIDogJ3ZhcigtLWJnKSc7XG4gICAgZGNTdGF0dXNCYXIuc3R5bGUuY29sb3IgPSB0eXBlID09PSAnZXJyb3InID8gJ3ZhcigtLWJhZC1mZyknIDogdHlwZSA9PT0gJ3N1Y2Nlc3MnID8gJ3ZhcigtLW9rLWZnKScgOiAndmFyKC0tZmcpJztcbiAgICBkY1N0YXR1c0Jhci50ZXh0Q29udGVudCA9IG1zZztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRjTG9hZFZlcnNpb24oKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3N5c3RlbS92ZXJzaW9uJyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgY29tbWl0ID0gZGF0YS5jb21taXQgJiYgZGF0YS5jb21taXQgIT09ICd1bmtub3duJyA/IGRhdGEuY29tbWl0IDogbnVsbDtcbiAgICAgICAgZGNWZXJzaW9uSW5mby50ZXh0Q29udGVudCA9ICd2JyArIGRhdGEudmVyc2lvbiArIChjb21taXQgPyAnICgnICsgY29tbWl0LnN1YnN0cmluZygwLCA3KSArICcpJyA6ICcnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChfKSB7XG4gICAgICBkY1ZlcnNpb25JbmZvLnRleHRDb250ZW50ID0gJ1VuYWJsZSB0byBmZXRjaCB2ZXJzaW9uJztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBkY0NoZWNrRm9yVXBkYXRlKHNpbGVudCkge1xuICAgIGlmICghc2lsZW50KSB7XG4gICAgICBkY0NoZWNrQnRuLnRleHRDb250ZW50ID0gJ0NoZWNraW5nLi4uJztcbiAgICAgIGRjQ2hlY2tCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc3lzdGVtL3VwZGF0ZS1jaGVjaycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBkY0xhc3RDaGVjayA9IGRhdGE7XG5cbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5hdmFpbGFibGUgJiYgZGF0YS5yZW1vdGUpIHtcbiAgICAgICAgZGNVcGRhdGVCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIGRjVXBkYXRlRGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJyc7XG4gICAgICAgIGRjTmV3VmVyc2lvbi50ZXh0Q29udGVudCA9ICd2JyArIGRhdGEucmVtb3RlLnZlcnNpb247XG4gICAgICAgIGRjQ2hhbmdlbG9nLnRleHRDb250ZW50ID0gZGF0YS5yZW1vdGUuY2hhbmdlbG9nIHx8ICdObyBjaGFuZ2Vsb2cgYXZhaWxhYmxlLic7XG5cbiAgICAgICAgLy8gQWRkIG5vdGlmaWNhdGlvbiBkb3QgdG8gdGhlIFVwZGF0ZXMgYnV0dG9uXG4gICAgICAgIGNvbnN0IHVwZGF0ZXNCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1idG4nKTtcbiAgICAgICAgaWYgKHVwZGF0ZXNCdG4gJiYgIXVwZGF0ZXNCdG4ucXVlcnlTZWxlY3RvcignLnVwZGF0ZS1kb3QnKSkge1xuICAgICAgICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICBkb3QuY2xhc3NOYW1lID0gJ3VwZGF0ZS1kb3QnO1xuICAgICAgICAgIGRvdC5zdHlsZS5jc3NUZXh0ID0gJ3Bvc2l0aW9uOmFic29sdXRlO3RvcDoycHg7cmlnaHQ6MnB4O3dpZHRoOjhweDtoZWlnaHQ6OHB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6dmFyKC0tYWNjZW50KTsnO1xuICAgICAgICAgIHVwZGF0ZXNCdG4uc3R5bGUucG9zaXRpb24gPSAncmVsYXRpdmUnO1xuICAgICAgICAgIHVwZGF0ZXNCdG4uYXBwZW5kQ2hpbGQoZG90KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBbHNvIGFkZCBkb3QgdG8gdGhlIERhc2hDYWRkeSB0YWJcbiAgICAgICAgY29uc3QgZGNUYWIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlcy1kYXNoY2FkZHktdGFiJyk7XG4gICAgICAgIGlmIChkY1RhYiAmJiAhZGNUYWIucXVlcnlTZWxlY3RvcignLnVwZGF0ZS1kb3QnKSkge1xuICAgICAgICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICBkb3QuY2xhc3NOYW1lID0gJ3VwZGF0ZS1kb3QnO1xuICAgICAgICAgIGRvdC5zdHlsZS5jc3NUZXh0ID0gJ2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjZweDtoZWlnaHQ6NnB4O2JvcmRlci1yYWRpdXM6NTAlO2JhY2tncm91bmQ6dmFyKC0tYWNjZW50KTttYXJnaW4tbGVmdDo0cHg7dmVydGljYWwtYWxpZ246bWlkZGxlOyc7XG4gICAgICAgICAgZGNUYWIuYXBwZW5kQ2hpbGQoZG90KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGNVcGRhdGVCYWRnZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICBkY1VwZGF0ZURldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgYXdhaXQgZGNMb2FkVmVyc2lvbigpO1xuICAgICAgICBpZiAoIXNpbGVudCkgZGNTaG93U3RhdHVzKCdZb3UgYXJlIHJ1bm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uLicsICdzdWNjZXNzJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghc2lsZW50KSB7XG4gICAgICAgIGRjQ2hlY2tCdG4udGV4dENvbnRlbnQgPSAnQ2hlY2sgZm9yIFVwZGF0ZXMnO1xuICAgICAgICBkY0NoZWNrQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgZGNTaG93U3RhdHVzKCdGYWlsZWQgdG8gY2hlY2s6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgICBkY0NoZWNrQnRuLnRleHRDb250ZW50ID0gJ0NoZWNrIGZvciBVcGRhdGVzJztcbiAgICAgICAgZGNDaGVja0J0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRjQXBwbHlVcGRhdGUoKSB7XG4gICAgaWYgKCFjb25maXJtKCdBcHBseSBEYXNoQ2FkZHkgdXBkYXRlPyBUaGUgQVBJIGNvbnRhaW5lciB3aWxsIHJlc3RhcnQuJykpIHJldHVybiBmYWxzZTtcbiAgICBkY0FwcGx5QnRuLnRleHRDb250ZW50ID0gJ1VwZGF0aW5nLi4uJztcbiAgICBkY0FwcGx5QnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBkY1Nob3dTdGF0dXMoJ0Rvd25sb2FkaW5nIGFuZCBhcHBseWluZyB1cGRhdGUuLi4nLCAnaW5mbycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9zeXN0ZW0vdXBkYXRlLWFwcGx5JywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBkY1Nob3dTdGF0dXMoJ1VwZGF0ZSBpbml0aWF0ZWQ6IHYnICsgKGRhdGEuZnJvbVZlcnNpb24gfHwgJz8nKSArICcgXHUyMTkyIHYnICsgKGRhdGEudG9WZXJzaW9uIHx8ICc/JykgKyAnLiBUaGUgY29udGFpbmVyIHdpbGwgcmVzdGFydCBzaG9ydGx5LicsICdzdWNjZXNzJyk7XG4gICAgICAgIGRjQXBwbHlCdG4udGV4dENvbnRlbnQgPSAnQXBwbGllZCEnO1xuICAgICAgICAvLyBSZW1vdmUgbm90aWZpY2F0aW9uIGRvdHNcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnVwZGF0ZS1kb3QnKS5mb3JFYWNoKGQgPT4gZC5yZW1vdmUoKSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ1VwZGF0ZSBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBkY1Nob3dTdGF0dXMoJ1VwZGF0ZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgICAgZGNBcHBseUJ0bi50ZXh0Q29udGVudCA9ICdVcGRhdGUgTm93JztcbiAgICAgIGRjQXBwbHlCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGNMb2FkSGlzdG9yeSgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc3lzdGVtL3VwZGF0ZS1oaXN0b3J5Jyk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGNvbnN0IGhpc3RvcnkgPSBkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5oaXN0b3J5ID8gZGF0YS5oaXN0b3J5IDogW107XG4gICAgICBpZiAoaGlzdG9yeS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZGNIaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+Tm8gc2VsZi11cGRhdGUgaGlzdG9yeS48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+V2hlbjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlZlcnNpb248L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5Gcm9tPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+U3RhdHVzPC90aD48L3RyPic7XG4gICAgICBmb3IgKGNvbnN0IGggb2YgaGlzdG9yeSkge1xuICAgICAgICBjb25zdCBzdCA9IGguc3RhdHVzID09PSAnc3VjY2VzcycgPyAnXHUyNzEzIHN1Y2Nlc3MnIDogaC5zdGF0dXMgPT09ICdwZW5kaW5nJyA/ICdcdTIzRjMgcGVuZGluZycgOiBoLnN0YXR1cyA9PT0gJ3BhcnRpYWwnID8gJ1x1MjZBMCBwYXJ0aWFsJyA6ICdcdTI3MTcgJyArIGguc3RhdHVzO1xuICAgICAgICBjb25zdCBzdENvbG9yID0gaC5zdGF0dXMgPT09ICdzdWNjZXNzJyA/ICd2YXIoLS1vay1mZyknIDogaC5zdGF0dXMgPT09ICdwZW5kaW5nJyA/ICd2YXIoLS1tdXRlZCknIDogJ3ZhcigtLWJhZC1mZyknO1xuICAgICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj4nO1xuICAgICAgICBodG1sICs9ICc8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIHRpbWVBZ28oaC50aW1lc3RhbXApICsgJzwvdGQ+JztcbiAgICAgICAgaHRtbCArPSAnPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LXdlaWdodDogNTAwO1wiPnYnICsgZXNjYXBlSHRtbChoLnZlcnNpb24pICsgKGgucm9sbGJhY2sgPyAnIChyb2xsYmFjayknIDogJycpICsgJzwvdGQ+JztcbiAgICAgICAgaHRtbCArPSAnPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPnYnICsgZXNjYXBlSHRtbChoLmZyb21WZXJzaW9uIHx8ICc/JykgKyAnPC90ZD4nO1xuICAgICAgICBodG1sICs9ICc8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjogJyArIHN0Q29sb3IgKyAnO1wiPicgKyBzdCArICc8L3NwYW4+PC90ZD4nO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICAgIGlmIChoLmVycm9yKSB7XG4gICAgICAgICAgaHRtbCArPSAnPHRyPjx0ZCBjb2xzcGFuPVwiNFwiIHN0eWxlPVwicGFkZGluZzogNHB4IDZweCA4cHg7IGZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+JyArIGVzY2FwZUh0bWwoaC5lcnJvcikgKyAnPC90ZD48L3RyPic7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGgubm90ZSkge1xuICAgICAgICAgIGh0bWwgKz0gJzx0cj48dGQgY29sc3Bhbj1cIjRcIiBzdHlsZT1cInBhZGRpbmc6IDRweCA2cHggOHB4OyBmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JyArIGVzY2FwZUh0bWwoaC5ub3RlKSArICc8L3RkPjwvdHI+JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgZGNIaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGNIaXN0b3J5Q29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJyArIGVzY2FwZUh0bWwoZS5tZXNzYWdlKSArICc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRjU2hvd1JvbGxiYWNrKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zeXN0ZW0vcm9sbGJhY2stdmVyc2lvbnMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgY29uc3QgdmVyc2lvbnMgPSBkYXRhLnN1Y2Nlc3MgJiYgZGF0YS52ZXJzaW9ucyA/IGRhdGEudmVyc2lvbnMgOiBbXTtcbiAgICAgIGlmICh2ZXJzaW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignTm8gcm9sbGJhY2sgdmVyc2lvbnMgYXZhaWxhYmxlLicsICdpbmZvJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZlcnNpb24gPSBwcm9tcHQoJ0F2YWlsYWJsZSByb2xsYmFjayB2ZXJzaW9uczpcXG4nICsgdmVyc2lvbnMuam9pbignXFxuJykgKyAnXFxuXFxuRW50ZXIgdmVyc2lvbiB0byByb2xsYmFjayB0bzonKTtcbiAgICAgIGlmICghdmVyc2lvbikgcmV0dXJuO1xuICAgICAgaWYgKCF2ZXJzaW9ucy5pbmNsdWRlcyh2ZXJzaW9uKSkge1xuICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdJbnZhbGlkIHZlcnNpb246ICcgKyB2ZXJzaW9uLCAnZXJyb3InKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFjb25maXJtKCdSb2xsYmFjayBEYXNoQ2FkZHkgdG8gdicgKyB2ZXJzaW9uICsgJz8gVGhlIGNvbnRhaW5lciB3aWxsIHJlc3RhcnQuJykpIHJldHVybjtcbiAgICAgIGRjU2hvd1N0YXR1cygnUm9sbGluZyBiYWNrIHRvIHYnICsgdmVyc2lvbiArICcuLi4nLCAnaW5mbycpO1xuICAgICAgY29uc3QgciA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL3N5c3RlbS9yb2xsYmFjaycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHZlcnNpb24gfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZCA9IGF3YWl0IHIuanNvbigpO1xuICAgICAgaWYgKGQuc3VjY2Vzcykge1xuICAgICAgICBkY1Nob3dTdGF0dXMoJ1JvbGxiYWNrIHRvIHYnICsgdmVyc2lvbiArICcgaW5pdGlhdGVkLiBDb250YWluZXIgd2lsbCByZXN0YXJ0LicsICdzdWNjZXNzJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZC5lcnJvciB8fCAnUm9sbGJhY2sgZmFpbGVkJyk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZGNTaG93U3RhdHVzKCdSb2xsYmFjayBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UsICdlcnJvcicpO1xuICAgIH1cbiAgfVxuXG4gIGRjQ2hlY2tCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gZGNDaGVja0ZvclVwZGF0ZShmYWxzZSkpO1xuICBkY0FwcGx5QnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGRjQXBwbHlVcGRhdGUoKS5jYXRjaCgoKSA9PiB7fSkpO1xuICBkY1JvbGxiYWNrQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGRjU2hvd1JvbGxiYWNrKTtcblxuICBjaGVja0J0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBjaGVja0ZvclVwZGF0ZXMpO1xuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRBdmFpbGFibGUoKTtcbiAgfSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyBPcGVuIFVwZGF0ZSBNYW5hZ2VtZW50IG1vZGFsLCBvcHRpb25hbGx5IHNjcm9sbGVkIHRvIGEgc3BlY2lmaWMgYXBwXG4gIHdpbmRvdy5vcGVuVXBkYXRlTW9kYWwgPSBmdW5jdGlvbihhcHBJZCkge1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZEF2YWlsYWJsZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKCFhcHBJZCkgcmV0dXJuO1xuICAgICAgLy8gU2Nyb2xsIHRvIGFuZCBoaWdobGlnaHQgdGhlIG1hdGNoaW5nIHJvd1xuICAgICAgY29uc3Qgcm93ID0gYXZhaWxhYmxlQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWFwcC1pZD1cIiR7YXBwSWR9XCJdYCk7XG4gICAgICBpZiAocm93KSB7XG4gICAgICAgIHJvdy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdjZW50ZXInIH0pO1xuICAgICAgICByb3cuc3R5bGUuYmFja2dyb3VuZCA9ICdyZ2JhKDI0OSwxMTUsMjIsMC4xNSknO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgcm93LnN0eWxlLmJhY2tncm91bmQgPSAnJzsgfSwgMzAwMCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJ1cGRhdGVzLWhpc3RvcnlcIl0nKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsb2FkSGlzdG9yeSk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwidXBkYXRlcy1hdXRvXCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbG9hZEF1dG9Db25maWcpO1xuICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wYW5lbD1cInVwZGF0ZXMtZGFzaGNhZGR5XCJdJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGRjTG9hZFZlcnNpb24oKTtcbiAgICBkY0xvYWRIaXN0b3J5KCk7XG4gICAgaWYgKCFkY0xhc3RDaGVjaykgZGNDaGVja0ZvclVwZGF0ZSh0cnVlKTtcbiAgfSk7XG5cbiAgd2luZG93LmRjQXBwbHlVcGRhdGUgPSBkY0FwcGx5VXBkYXRlO1xuICB3aW5kb3cuZGNDaGVja0ZvclVwZGF0ZSA9IGRjQ2hlY2tGb3JVcGRhdGU7XG5cbiAgLy8gTm9uLWJsb2NraW5nIGNoZWNrIG9uIHBhZ2UgbG9hZCBcdTIwMTQganVzdCBhZGRzIG5vdGlmaWNhdGlvbiBkb3QgaWYgdXBkYXRlIGF2YWlsYWJsZVxuICBzZXRUaW1lb3V0KCgpID0+IGRjQ2hlY2tGb3JVcGRhdGUodHJ1ZSksIDUwMDApO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gRE9DS0VSIFJFU09VUkNFUyAoVm9sdW1lcywgTmV0d29ya3MsIERpc2sgVXNhZ2UpID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgaW5qZWN0TW9kYWwoJ2RvY2tlci1yZXNvdXJjZXMtbW9kYWwnLCBgPGRpdiBpZD1cImRvY2tlci1yZXNvdXJjZXMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDc1MHB4OyBtYXgtd2lkdGg6IDk1MHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1REMzMyBEb2NrZXIgUmVzb3VyY2VzPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5NYW5hZ2Ugdm9sdW1lcywgbmV0d29ya3MsIGFuZCB2aWV3IGRpc2sgdXNhZ2UuPC9wPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtdGFic1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiIGFjdGl2ZVwiIGRhdGEtcGFuZWw9XCJkci12b2x1bWVzXCI+Vm9sdW1lczwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwicGFuZWwtdGFiXCIgZGF0YS1wYW5lbD1cImRyLW5ldHdvcmtzXCI+TmV0d29ya3M8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInBhbmVsLXRhYlwiIGRhdGEtcGFuZWw9XCJkci1kaXNrXCI+RGlzayBVc2FnZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVm9sdW1lcyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJkci12b2x1bWVzXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uIGFjdGl2ZVwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkci12b2wtbmFtZVwiIHBsYWNlaG9sZGVyPVwiVm9sdW1lIG5hbWVcIiBzdHlsZT1cImZsZXg6IDE7IHBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcIiAvPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJkci12b2wtY3JlYXRlXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTRweDsgZm9udC1zaXplOiAwLjgycmVtO1wiPkNyZWF0ZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImRyLXZvbC1saXN0XCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiA0MDBweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBOZXR3b3JrcyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJkci1uZXR3b3Jrc1wiIGNsYXNzPVwicGFuZWwtc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA4cHg7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJkci1uZXQtbmFtZVwiIHBsYWNlaG9sZGVyPVwiTmV0d29yayBuYW1lXCIgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7XCIgLz5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiZHItbmV0LWRyaXZlclwiIHN0eWxlPVwicGFkZGluZzogNnB4IDEwcHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJvcmRlci1yYWRpdXM6IDZweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpO1wiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJyaWRnZVwiPmJyaWRnZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm92ZXJsYXlcIj5vdmVybGF5PC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiaG9zdFwiPmhvc3Q8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZHItbmV0LWNyZWF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudC1zb2xpZFwiIHN0eWxlPVwicGFkZGluZzogNnB4IDE0cHg7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5DcmVhdGU8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkci1uZXQtbGlzdFwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDogNDAwcHg7XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+PHNwYW4gY2xhc3M9XCJicmFuZC1zcGlubmVyXCI+PC9zcGFuPiBMb2FkaW5nLi4uPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gRGlzayBVc2FnZSAtLT5cbiAgICAgIDxkaXYgaWQ9XCJkci1kaXNrXCIgY2xhc3M9XCJwYW5lbC1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJkci1kaXNrLWNvbnRlbnRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJkci1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZG9ja2VyLXJlc291cmNlcy1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RvY2tlci1yZXNvdXJjZXMtYnRuJyk7XG4gIGNvbnN0IGNsb3NlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLWNsb3NlJyk7XG5cbiAgZnVuY3Rpb24gZm10Qnl0ZXMoYnl0ZXMpIHtcbiAgICBpZiAoIWJ5dGVzIHx8IGJ5dGVzID09PSAwKSByZXR1cm4gJzAgQic7XG4gICAgY29uc3QgdW5pdHMgPSBbJ0InLCAnS0InLCAnTUInLCAnR0InLCAnVEInXTtcbiAgICBjb25zdCBpID0gTWF0aC5mbG9vcihNYXRoLmxvZyhNYXRoLmFicyhieXRlcykpIC8gTWF0aC5sb2coMTAyNCkpO1xuICAgIHJldHVybiAoYnl0ZXMgLyBNYXRoLnBvdygxMDI0LCBpKSkudG9GaXhlZCgxKSArICcgJyArIHVuaXRzW2ldO1xuICB9XG5cbiAgLy8gPT09PT0gVk9MVU1FUyA9PT09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkVm9sdW1lcygpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItdm9sLWxpc3QnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldEpTT04oJy9hcGkvdjEvZG9ja2VyL3ZvbHVtZXMnKTtcbiAgICAgIGNvbnN0IHZvbHMgPSBkYXRhLnZvbHVtZXMgfHwgW107XG4gICAgICBpZiAodm9scy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDRTY8L3NwYW4+Tm8gdm9sdW1lcyBmb3VuZC48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICBodG1sICs9ICc8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+TmFtZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPkRyaXZlcjwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPlNjb3BlPC90aD48dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPkFjdGlvbnM8L3RoPjwvdHI+JztcbiAgICAgIGZvciAoY29uc3QgdiBvZiB2b2xzKSB7XG4gICAgICAgIGNvbnN0IGlzU3lzdGVtID0gdi5uYW1lID09PSAnYnVpbGRraXQnIHx8IHYubmFtZS5sZW5ndGggPT09IDY0O1xuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7IG1heC13aWR0aDogMzAwcHg7IG92ZXJmbG93OiBoaWRkZW47IHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyB3aGl0ZS1zcGFjZTogbm93cmFwO1wiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKHYubmFtZSl9XCI+JHtlc2NhcGVIdG1sKHYubmFtZS5sZW5ndGggPiA0MCA/IHYubmFtZS5zdWJzdHJpbmcoMCwgMzcpICsgJy4uLicgOiB2Lm5hbWUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKHYuZHJpdmVyKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogY2VudGVyOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPiR7ZXNjYXBlSHRtbCh2LnNjb3BlKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+YDtcbiAgICAgICAgaWYgKCFpc1N5c3RlbSkge1xuICAgICAgICAgIGh0bWwgKz0gYDxidXR0b24gY2xhc3M9XCJkci12b2wtZGVsXCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKHYubmFtZSl9XCIgc3R5bGU9XCJwYWRkaW5nOiAzcHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRlbGV0ZTwvYnV0dG9uPmA7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSBgPC90ZD48L3RyPmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kci12b2wtZGVsJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKGBEZWxldGUgdm9sdW1lIFwiJHtidG4uZGF0YXNldC5uYW1lfVwiPyBEYXRhIHdpbGwgYmUgbG9zdC5gKSkgcmV0dXJuO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICcuLi4nO1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUFQSShgL2FwaS92MS9kb2NrZXIvdm9sdW1lcy8ke2VuY29kZVVSSUNvbXBvbmVudChidG4uZGF0YXNldC5uYW1lKX0/Zm9yY2U9dHJ1ZWApO1xuICAgICAgICAgICAgbG9hZFZvbHVtZXMoKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdEZWxldGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICdEZWxldGUnO1xuICAgICAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6ICR7ZXNjYXBlSHRtbChlLm1lc3NhZ2UpfTwvZGl2PmA7XG4gICAgfVxuICB9XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLXZvbC1jcmVhdGUnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgbmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLXZvbC1uYW1lJyk7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFuYW1lKSB7IHNob3dOb3RpZmljYXRpb24oJ0VudGVyIGEgdm9sdW1lIG5hbWUnLCAnd2FybmluZycpOyByZXR1cm47IH1cbiAgICB0cnkge1xuICAgICAgYXdhaXQgcG9zdEpTT04oJy9hcGkvdjEvZG9ja2VyL3ZvbHVtZXMnLCB7IG5hbWUgfSk7XG4gICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYFZvbHVtZSBcIiR7bmFtZX1cIiBjcmVhdGVkYCwgJ3N1Y2Nlc3MnKTtcbiAgICAgIGxvYWRWb2x1bWVzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignQ3JlYXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyA9PT09PSBORVRXT1JLUyA9PT09PVxuICBhc3luYyBmdW5jdGlvbiBsb2FkTmV0d29ya3MoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyLW5ldC1saXN0Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRKU09OKCcvYXBpL3YxL2RvY2tlci9uZXR3b3JrcycpO1xuICAgICAgY29uc3QgbmV0cyA9IGRhdGEubmV0d29ya3MgfHwgW107XG4gICAgICBpZiAobmV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0NcdURGMTA8L3NwYW4+Tm8gbmV0d29ya3MgZm91bmQuPC9kaXY+JztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGV0IGh0bWwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6IDEwMCU7IGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj4nO1xuICAgICAgaHRtbCArPSAnPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPk5hbWU8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj5Ecml2ZXI8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDtcIj5TY29wZTwvdGg+PHRoIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPkNvbnRhaW5lcnM8L3RoPjx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogcmlnaHQ7XCI+QWN0aW9uczwvdGg+PC90cj4nO1xuICAgICAgZm9yIChjb25zdCBuIG9mIG5ldHMpIHtcbiAgICAgICAgY29uc3QgaXNTeXN0ZW0gPSBbJ2JyaWRnZScsICdob3N0JywgJ25vbmUnXS5pbmNsdWRlcyhuLm5hbWUpO1xuICAgICAgICBodG1sICs9IGA8dHIgc3R5bGU9XCJib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtd2VpZ2h0OiA1MDA7XCI+JHtlc2NhcGVIdG1sKG4ubmFtZSl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGNlbnRlcjsgY29sb3I6IHZhcigtLW11dGVkKTtcIj4ke2VzY2FwZUh0bWwobi5kcml2ZXIpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKG4uc2NvcGUpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7XCI+JHtuLmNvbnRhaW5lcnN9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IHJpZ2h0O1wiPmA7XG4gICAgICAgIGlmICghaXNTeXN0ZW0pIHtcbiAgICAgICAgICBodG1sICs9IGA8YnV0dG9uIGNsYXNzPVwiZHItbmV0LWRlbFwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwobi5pZCl9XCIgZGF0YS1uYW1lPVwiJHtlc2NhcGVIdG1sKG4ubmFtZSl9XCIgc3R5bGU9XCJwYWRkaW5nOiAzcHggOHB4OyBmb250LXNpemU6IDAuNzVyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRlbGV0ZTwvYnV0dG9uPmA7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbCArPSBgPC90ZD48L3RyPmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L3RhYmxlPic7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgICAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kci1uZXQtZGVsJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgaWYgKCFjb25maXJtKGBEZWxldGUgbmV0d29yayBcIiR7YnRuLmRhdGFzZXQubmFtZX1cIj9gKSkgcmV0dXJuO1xuICAgICAgICAgIGJ0bi50ZXh0Q29udGVudCA9ICcuLi4nO1xuICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGRlbGV0ZUFQSShgL2FwaS92MS9kb2NrZXIvbmV0d29ya3MvJHtlbmNvZGVVUklDb21wb25lbnQoYnRuLmRhdGFzZXQuaWQpfWApO1xuICAgICAgICAgICAgbG9hZE5ldHdvcmtzKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgc2hvd05vdGlmaWNhdGlvbignRGVsZXRlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgICAgICAgICBidG4udGV4dENvbnRlbnQgPSAnRGVsZXRlJztcbiAgICAgICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1uZXQtY3JlYXRlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG5hbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1uZXQtbmFtZScpO1xuICAgIGNvbnN0IGRyaXZlclNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkci1uZXQtZHJpdmVyJyk7XG4gICAgY29uc3QgbmFtZSA9IG5hbWVJbnB1dC52YWx1ZS50cmltKCk7XG4gICAgaWYgKCFuYW1lKSB7IHNob3dOb3RpZmljYXRpb24oJ0VudGVyIGEgbmV0d29yayBuYW1lJywgJ3dhcm5pbmcnKTsgcmV0dXJuOyB9XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHBvc3RKU09OKCcvYXBpL3YxL2RvY2tlci9uZXR3b3JrcycsIHsgbmFtZSwgZHJpdmVyOiBkcml2ZXJTZWxlY3QudmFsdWUgfSk7XG4gICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHNob3dOb3RpZmljYXRpb24oYE5ldHdvcmsgXCIke25hbWV9XCIgY3JlYXRlZGAsICdzdWNjZXNzJyk7XG4gICAgICBsb2FkTmV0d29ya3MoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdDcmVhdGUgZmFpbGVkOiAnICsgZS5tZXNzYWdlLCAnZXJyb3InKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vID09PT09IERJU0sgVVNBR0UgPT09PT1cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZERpc2tVc2FnZSgpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHItZGlzay1jb250ZW50Jyk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRKU09OKCcvYXBpL3YxL2RvY2tlci9kaXNrLXVzYWdlJyk7XG4gICAgICBjb25zdCBzZWN0aW9ucyA9IFtcbiAgICAgICAgeyBsYWJlbDogJ0ltYWdlcycsIGljb246ICdcdUQ4M0RcdURDQzAnLCBjb3VudDogZGF0YS5pbWFnZXMuY291bnQsIHNpemU6IGRhdGEuaW1hZ2VzLnNpemUsIHJlY2xhaW1hYmxlOiBkYXRhLmltYWdlcy5yZWNsYWltYWJsZSB9LFxuICAgICAgICB7IGxhYmVsOiAnQ29udGFpbmVycycsIGljb246ICdcdUQ4M0RcdURDRTYnLCBjb3VudDogZGF0YS5jb250YWluZXJzLmNvdW50LCBzaXplOiBkYXRhLmNvbnRhaW5lcnMuc2l6ZSwgZXh0cmE6IGAke2RhdGEuY29udGFpbmVycy5ydW5uaW5nfSBydW5uaW5nYCB9LFxuICAgICAgICB7IGxhYmVsOiAnVm9sdW1lcycsIGljb246ICdcdUQ4M0RcdURDQkUnLCBjb3VudDogZGF0YS52b2x1bWVzLmNvdW50LCBzaXplOiBkYXRhLnZvbHVtZXMuc2l6ZSwgcmVjbGFpbWFibGU6IGRhdGEudm9sdW1lcy5yZWNsYWltYWJsZSB9LFxuICAgICAgICB7IGxhYmVsOiAnQnVpbGQgQ2FjaGUnLCBpY29uOiAnXHVEODNEXHVERDI3JywgY291bnQ6IGRhdGEuYnVpbGRDYWNoZS5jb3VudCwgc2l6ZTogZGF0YS5idWlsZENhY2hlLnNpemUsIHJlY2xhaW1hYmxlOiBkYXRhLmJ1aWxkQ2FjaGUucmVjbGFpbWFibGUgfSxcbiAgICAgIF07XG5cbiAgICAgIGxldCBodG1sID0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDEuMXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogMTZweDtcIj5Ub3RhbDogJHtmbXRCeXRlcyhkYXRhLnRvdGFsU2l6ZSl9PC9kaXY+YDtcbiAgICAgIGh0bWwgKz0gJzxkaXYgc3R5bGU9XCJkaXNwbGF5OiBncmlkOyBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7IGdhcDogMTJweDtcIj4nO1xuICAgICAgZm9yIChjb25zdCBzIG9mIHNlY3Rpb25zKSB7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxNHB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGJvcmRlci1yYWRpdXM6IDhweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5gO1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPiR7cy5pY29ufSAke3MubGFiZWx9IDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTsgZm9udC13ZWlnaHQ6IDQwMDsgZm9udC1zaXplOiAwLjgycmVtO1wiPigke3MuY291bnR9KTwvc3Bhbj48L2Rpdj5gO1xuICAgICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAxLjFyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1hY2NlbnQpO1wiPiR7Zm10Qnl0ZXMocy5zaXplKX08L2Rpdj5gO1xuICAgICAgICBpZiAocy5yZWNsYWltYWJsZSA+IDApIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UmVjbGFpbWFibGU6ICR7Zm10Qnl0ZXMocy5yZWNsYWltYWJsZSl9PC9kaXY+YDtcbiAgICAgICAgaWYgKHMuZXh0cmEpIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtzLmV4dHJhfTwvZGl2PmA7XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGUubWVzc2FnZSl9PC9kaXY+YDtcbiAgICB9XG4gIH1cblxuICAvLyBNb2RhbCBldmVudHNcbiAgb3BlbkJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbW9kYWw/LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICBsb2FkVm9sdW1lcygpO1xuICB9KTtcbiAgd2lyZU1vZGFsKG1vZGFsLCBjbG9zZUJ0bik7XG5cbiAgLy8gTGF6eS1sb2FkIHRhYnNcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignW2RhdGEtcGFuZWw9XCJkci1uZXR3b3Jrc1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWROZXR3b3Jrcyk7XG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXBhbmVsPVwiZHItZGlza1wiXScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxvYWREaXNrVXNhZ2UpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gRE9DS0VSIENPTVBPU0UgSU1QT1JUID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgaW5qZWN0TW9kYWwoJ2NvbXBvc2UtaW1wb3J0LW1vZGFsJywgYDxkaXYgaWQ9XCJjb21wb3NlLWltcG9ydC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogNjUwcHg7IG1heC13aWR0aDogODAwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0U2IEltcG9ydCBEb2NrZXIgQ29tcG9zZTwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+UGFzdGUgYSBkb2NrZXItY29tcG9zZS55bWwgdG8gaW1wb3J0IGFuZCBkZXBsb3kgc2VydmljZXMuPC9wPlxuXG4gICAgICA8IS0tIFN0ZXAgMTogUGFzdGUgWUFNTCAtLT5cbiAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXN0ZXAtcGFzdGVcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5TdGFjayBOYW1lPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNvbXBvc2Utc3RhY2stbmFtZVwiIHBsYWNlaG9sZGVyPVwibXktc3RhY2tcIiB2YWx1ZT1cIlwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTtcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1hY2NlbnQtc21cIj5kb2NrZXItY29tcG9zZS55bWw8L2xhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cImNvbXBvc2UteWFtbFwiIHJvd3M9XCIxNFwiIHBsYWNlaG9sZGVyPVwidmVyc2lvbjogJzMnJiMxMDtzZXJ2aWNlczomIzEwOyAgd2ViOiYjMTA7ICAgIGltYWdlOiBuZ2lueDpsYXRlc3QmIzEwOyAgICBwb3J0czomIzEwOyAgICAgIC0gJzgwODA6ODAnXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjgycmVtOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgcmVzaXplOiB2ZXJ0aWNhbDtcIj48L3RleHRhcmVhPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiA2cHg7XCI+XG4gICAgICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IGN1cnNvcjogcG9pbnRlcjsgZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImZpbGVcIiBpZD1cImNvbXBvc2UtZmlsZS11cGxvYWRcIiBhY2NlcHQ9XCIueW1sLC55YW1sXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lO1wiIC8+XG4gICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwidGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XCI+b3IgdXBsb2FkIGEgZmlsZTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29tcG9zZS1wYXJzZS1idG5cIiBjbGFzcz1cImJ0bi1hY2NlbnQtc29saWRcIiBzdHlsZT1cInBhZGRpbmc6IDhweCAyMHB4O1wiPlBhcnNlICYgUHJldmlldzwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJjb21wb3NlLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFN0ZXAgMjogUHJldmlldyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXN0ZXAtcHJldmlld1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj5cbiAgICAgICAgPGRpdiBpZD1cImNvbXBvc2UtcHJldmlldy1jb250ZW50XCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnMgbW9kYWwtZm9vdGVyLWJhclwiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiY29tcG9zZS1kZXBsb3ktYnRuXCIgY2xhc3M9XCJidG4tYWNjZW50LXNvbGlkXCIgc3R5bGU9XCJwYWRkaW5nOiA4cHggMjBweDtcIj5EZXBsb3kgQWxsPC9idXR0b24+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNvbXBvc2UtYmFjay1idG5cIj5CYWNrPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAzOiBQcm9ncmVzcyAtLT5cbiAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXN0ZXAtcHJvZ3Jlc3NcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJjb21wb3NlLXByb2dyZXNzLWNvbnRlbnRcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWltcG9ydC1tb2RhbCcpO1xuICBjb25zdCBvcGVuQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtaW1wb3J0LWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1jYW5jZWwnKTtcblxuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG5cbiAgbGV0IHBhcnNlZERhdGEgPSBudWxsO1xuXG4gIGZ1bmN0aW9uIHNob3dTdGVwKHN0ZXApIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGVwLXBhc3RlJykuc3R5bGUuZGlzcGxheSA9IHN0ZXAgPT09ICdwYXN0ZScgPyAnJyA6ICdub25lJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGVwLXByZXZpZXcnKS5zdHlsZS5kaXNwbGF5ID0gc3RlcCA9PT0gJ3ByZXZpZXcnID8gJycgOiAnbm9uZSc7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2Utc3RlcC1wcm9ncmVzcycpLnN0eWxlLmRpc3BsYXkgPSBzdGVwID09PSAncHJvZ3Jlc3MnID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBzaG93U3RlcCgncGFzdGUnKTtcbiAgICBwYXJzZWREYXRhID0gbnVsbDtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS15YW1sJykudmFsdWUgPSAnJztcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGFjay1uYW1lJykudmFsdWUgPSAnJztcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICAvLyBGaWxlIHVwbG9hZFxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1maWxlLXVwbG9hZCcpPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZSkgPT4ge1xuICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcbiAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXlhbWwnKS52YWx1ZSA9IHJlYWRlci5yZXN1bHQ7IH07XG4gICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG4gIH0pO1xuXG4gIC8vIFBhcnNlXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXBhcnNlLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB5YW1sU3RyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UteWFtbCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBzdGFja05hbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1zdGFjay1uYW1lJykudmFsdWUudHJpbSgpIHx8ICdzdGFjayc7XG4gICAgaWYgKCF5YW1sU3RyKSB7IHNob3dOb3RpZmljYXRpb24oJ1Bhc3RlIGEgZG9ja2VyLWNvbXBvc2UueW1sJywgJ3dhcm5pbmcnKTsgcmV0dXJuOyB9XG5cbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1wYXJzZS1idG4nKTtcbiAgICBjb25zdCBvcmlnVGV4dCA9IGJ0bi50ZXh0Q29udGVudDtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnUGFyc2luZy4uLic7XG4gICAgYnRuLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcG9zdEpTT04oJy9hcGkvdjEvYXBwcy9pbXBvcnQtY29tcG9zZScsIHsgeWFtbDogeWFtbFN0ciwgc3RhY2tOYW1lIH0pO1xuICAgICAgcGFyc2VkRGF0YSA9IGRhdGE7XG4gICAgICBwYXJzZWREYXRhLnN0YWNrTmFtZSA9IHN0YWNrTmFtZTtcbiAgICAgIHJlbmRlclByZXZpZXcoZGF0YSk7XG4gICAgICBzaG93U3RlcCgncHJldmlldycpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24oJ1BhcnNlIGZhaWxlZDogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGJ0bi50ZXh0Q29udGVudCA9IG9yaWdUZXh0O1xuICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICBmdW5jdGlvbiByZW5kZXJQcmV2aWV3KGRhdGEpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1wcmV2aWV3LWNvbnRlbnQnKTtcbiAgICBsZXQgaHRtbCA9ICcnO1xuXG4gICAgaWYgKGRhdGEubmV0d29ya3MgJiYgZGF0YS5uZXR3b3Jrcy5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk5ldHdvcmtzOiAke2RhdGEubmV0d29ya3MubWFwKG4gPT4gYDxjb2RlPiR7ZXNjYXBlSHRtbChuKX08L2NvZGU+YCkuam9pbignLCAnKX08L2Rpdj5gO1xuICAgIH1cbiAgICBpZiAoZGF0YS52b2x1bWVzICYmIGRhdGEudm9sdW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTJweDsgZm9udC1zaXplOiAwLjgycmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPlZvbHVtZXM6ICR7ZGF0YS52b2x1bWVzLm1hcCh2ID0+IGA8Y29kZT4ke2VzY2FwZUh0bWwodil9PC9jb2RlPmApLmpvaW4oJywgJyl9PC9kaXY+YDtcbiAgICB9XG5cbiAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogOHB4O1wiPiR7ZGF0YS5zZXJ2aWNlcy5sZW5ndGh9IHNlcnZpY2Uocyk8L2Rpdj5gO1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OiAzNTBweDtcIj4nO1xuXG4gICAgZm9yIChjb25zdCBzdmMgb2YgZGF0YS5zZXJ2aWNlcykge1xuICAgICAgY29uc3QgYm9yZGVyQ29sb3IgPSBzdmMuc2tpcCA/ICd2YXIoLS1iYWQtZmcpJyA6ICd2YXIoLS1ib3JkZXIpJztcbiAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAxMHB4IDE0cHg7IGJvcmRlcjogMXB4IHNvbGlkICR7Ym9yZGVyQ29sb3J9OyBib3JkZXItcmFkaXVzOiA4cHg7IG1hcmdpbi1ib3R0b206IDhweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpO1wiPmA7XG4gICAgICBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC13ZWlnaHQ6IDYwMDsgZm9udC1zaXplOiAwLjlyZW07XCI+JHtlc2NhcGVIdG1sKHN2Yy5uYW1lKX1gO1xuICAgICAgaWYgKHN2Yy5za2lwKSBodG1sICs9IGAgPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTsgZm9udC13ZWlnaHQ6IDQwMDsgZm9udC1zaXplOiAwLjc4cmVtO1wiPlx1MjAxNCBza2lwcGVkOiAke2VzY2FwZUh0bWwoc3ZjLnJlYXNvbil9PC9zcGFuPmA7XG4gICAgICBodG1sICs9IGA8L2Rpdj5gO1xuXG4gICAgICBpZiAoIXN2Yy5za2lwKSB7XG4gICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPkltYWdlOiA8Y29kZT4ke2VzY2FwZUh0bWwoc3ZjLmltYWdlKX08L2NvZGU+PC9kaXY+YDtcbiAgICAgICAgaWYgKHN2Yy5wb3J0cz8ubGVuZ3RoKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+UG9ydHM6ICR7c3ZjLnBvcnRzLm1hcChwID0+IGAke3AuaG9zdH06JHtwLmNvbnRhaW5lcn1gKS5qb2luKCcsICcpfTwvZGl2PmA7XG4gICAgICAgIGlmIChzdmMudm9sdW1lcz8ubGVuZ3RoKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+Vm9sdW1lczogJHtzdmMudm9sdW1lcy5sZW5ndGh9PC9kaXY+YDtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN2Yy5lbnZpcm9ubWVudCB8fCB7fSkubGVuZ3RoKSBodG1sICs9IGA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+RW52IHZhcnM6ICR7T2JqZWN0LmtleXMoc3ZjLmVudmlyb25tZW50KS5sZW5ndGh9PC9kaXY+YDtcbiAgICAgICAgaWYgKHN2Yy5lbnZGaWxlV2FybmluZykgaHRtbCArPSBgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XHUyNkEwICR7ZXNjYXBlSHRtbChzdmMuZW52RmlsZVdhcm5pbmcpfTwvZGl2PmA7XG4gICAgICAgIGlmIChzdmMucmVzb3VyY2VzPy5jcHVzIHx8IHN2Yy5yZXNvdXJjZXM/Lm1lbW9yeSkge1xuICAgICAgICAgIGNvbnN0IHBhcnRzID0gW107XG4gICAgICAgICAgaWYgKHN2Yy5yZXNvdXJjZXMuY3B1cykgcGFydHMucHVzaChgQ1BVOiAke3N2Yy5yZXNvdXJjZXMuY3B1c31gKTtcbiAgICAgICAgICBpZiAoc3ZjLnJlc291cmNlcy5tZW1vcnkpIHBhcnRzLnB1c2goYE1lbTogJHtzdmMucmVzb3VyY2VzLm1lbW9yeX1NQmApO1xuICAgICAgICAgIGh0bWwgKz0gYDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTtcIj5MaW1pdHM6ICR7cGFydHMuam9pbignLCAnKX08L2Rpdj5gO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgfVxuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICAvLyBCYWNrIGJ1dHRvblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29tcG9zZS1iYWNrLWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNob3dTdGVwKCdwYXN0ZScpKTtcblxuICAvLyBEZXBsb3lcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtZGVwbG95LWJ0bicpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXBhcnNlZERhdGEpIHJldHVybjtcblxuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWRlcGxveS1idG4nKTtcbiAgICBidG4udGV4dENvbnRlbnQgPSAnRGVwbG95aW5nLi4uJztcbiAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIHNob3dTdGVwKCdwcm9ncmVzcycpO1xuXG4gICAgY29uc3QgcHJvZ3Jlc3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLXByb2dyZXNzLWNvbnRlbnQnKTtcbiAgICBwcm9ncmVzc0VsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IERlcGxveWluZyBzZXJ2aWNlcy4uLjwvZGl2Pic7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcG9zdEpTT04oJy9hcGkvdjEvYXBwcy9kZXBsb3ktY29tcG9zZScsIHtcbiAgICAgICAgc2VydmljZXM6IHBhcnNlZERhdGEuc2VydmljZXMsXG4gICAgICAgIG5ldHdvcmtzOiBwYXJzZWREYXRhLm5ldHdvcmtzLFxuICAgICAgICBzdGFja05hbWU6IHBhcnNlZERhdGEuc3RhY2tOYW1lXG4gICAgICB9KTtcblxuICAgICAgbGV0IGh0bWwgPSBgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+U3RhY2sgXCIke2VzY2FwZUh0bWwocmVzdWx0LnN0YWNrTmFtZSl9XCIgXHUyMDE0IERlcGxveW1lbnQgQ29tcGxldGU8L2Rpdj5gO1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6IDM1MHB4O1wiPic7XG5cbiAgICAgIGZvciAoY29uc3QgciBvZiByZXN1bHQucmVzdWx0cykge1xuICAgICAgICBjb25zdCBpY29uID0gci5zdGF0dXMgPT09ICdkZXBsb3llZCcgfHwgci5zdGF0dXMgPT09ICdjcmVhdGVkJyA/ICdcdTI3MDUnIDogci5zdGF0dXMgPT09ICdleGlzdHMnID8gJ1x1MjZBMScgOiByLnN0YXR1cyA9PT0gJ3NraXBwZWQnID8gJ1x1MjNFRCcgOiAnXHUyNzRDJztcbiAgICAgICAgaHRtbCArPSBgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDhweCAxMnB4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYCR7aWNvbn0gPHN0cm9uZz4ke2VzY2FwZUh0bWwoci5uYW1lKX08L3N0cm9uZz4gKCR7ci50eXBlfSkgXHUyMDE0ICR7ZXNjYXBlSHRtbChyLnN0YXR1cyl9YDtcbiAgICAgICAgaWYgKHIuZXJyb3IpIGh0bWwgKz0gYCA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPiR7ZXNjYXBlSHRtbChyLmVycm9yKX08L3NwYW4+YDtcbiAgICAgICAgaWYgKHIuc3ViZG9tYWluKSBodG1sICs9IGAgXHUyMTkyIDxjb2RlPiR7ZXNjYXBlSHRtbChyLnN1YmRvbWFpbil9PC9jb2RlPmA7XG4gICAgICAgIGlmIChyLnJlYXNvbikgaHRtbCArPSBgIDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj4oJHtlc2NhcGVIdG1sKHIucmVhc29uKX0pPC9zcGFuPmA7XG4gICAgICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPjxidXR0b24gaWQ9XCJjb21wb3NlLWRvbmUtYnRuXCI+RG9uZTwvYnV0dG9uPjwvZGl2Pic7XG5cbiAgICAgIHByb2dyZXNzRWwuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21wb3NlLWRvbmUtYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICBtb2RhbD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdy5sb2FkU2VydmljZXMgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5sb2FkU2VydmljZXMoKS50aGVuKCgpID0+IHsgaWYgKHR5cGVvZiB3aW5kb3cuYnVpbGRHcmlkID09PSAnZnVuY3Rpb24nKSB3aW5kb3cuYnVpbGRHcmlkKCk7IH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHNob3dOb3RpZmljYXRpb24oYFN0YWNrIFwiJHtyZXN1bHQuc3RhY2tOYW1lfVwiIGRlcGxveWVkYCwgJ3N1Y2Nlc3MnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBwcm9ncmVzc0VsLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkRlcGxveW1lbnQgZmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPjxidXR0b24gaWQ9XCJjb21wb3NlLXJldHJ5LWJ0blwiPkJhY2s8L2J1dHRvbj48L2Rpdj5gO1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbXBvc2UtcmV0cnktYnRuJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2hvd1N0ZXAoJ3Bhc3RlJykpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBidG4udGV4dENvbnRlbnQgPSAnRGVwbG95IEFsbCc7XG4gICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gQ09OVEFJTkVSIEVYRUMgLyBTSEVMTCAoV2ViU29ja2V0ICsgeHRlcm0uanMpID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgaW5qZWN0TW9kYWwoJ2V4ZWMtbW9kYWwnLCBgPGRpdiBpZD1cImV4ZWMtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDcwMHB4OyBtYXgtd2lkdGg6IDkwMHB4OyBwYWRkaW5nLWJvdHRvbTogMDtcIj5cbiAgICAgIDxoMyBpZD1cImV4ZWMtdGl0bGVcIj5UZXJtaW5hbDwvaDM+XG4gICAgICA8ZGl2IGlkPVwiZXhlYy10ZXJtaW5hbFwiIHN0eWxlPVwiaGVpZ2h0OiA0MjBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBvdmVyZmxvdzogaGlkZGVuOyBiYWNrZ3JvdW5kOiAjMWUxZTFlO1wiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiA4cHg7IHBhZGRpbmctYm90dG9tOiAxMnB4O1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiZXhlYy1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+YCk7XG5cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhlYy1tb2RhbCcpO1xuICBjb25zdCB0ZXJtRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZXhlYy10ZXJtaW5hbCcpO1xuICBjb25zdCBjbG9zZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjLWNsb3NlJyk7XG5cbiAgbGV0IHRlcm0gPSBudWxsO1xuICBsZXQgd3MgPSBudWxsO1xuICBsZXQgZml0QWRkb24gPSBudWxsO1xuXG4gIGZ1bmN0aW9uIGNsZWFudXAoKSB7XG4gICAgaWYgKHdzKSB7IHRyeSB7IHdzLmNsb3NlKCk7IH0gY2F0Y2ggKF8pIHt9IHdzID0gbnVsbDsgfVxuICAgIGlmICh0ZXJtKSB7IHRyeSB7IHRlcm0uZGlzcG9zZSgpOyB9IGNhdGNoIChfKSB7fSB0ZXJtID0gbnVsbDsgfVxuICAgIGZpdEFkZG9uID0gbnVsbDtcbiAgICB0ZXJtRWwuaW5uZXJIVE1MID0gJyc7XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuRXhlYyhjb250YWluZXJJZCwgY29udGFpbmVyTmFtZSkge1xuICAgIGNsZWFudXAoKTtcblxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGVjLXRpdGxlJykudGV4dENvbnRlbnQgPSBgVGVybWluYWwgXHUyMDE0ICR7Y29udGFpbmVyTmFtZSB8fCBjb250YWluZXJJZH1gO1xuICAgIG1vZGFsPy5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG5cbiAgICAvLyBFbnN1cmUgeHRlcm0gaXMgYXZhaWxhYmxlXG4gICAgaWYgKHR5cGVvZiBUZXJtaW5hbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRlcm1FbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImNvbG9yOiAjZjQ0OyBwYWRkaW5nOiAyMHB4OyBmb250LWZhbWlseTogbW9ub3NwYWNlO1wiPnh0ZXJtLmpzIG5vdCBsb2FkZWQ8L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRlcm0gPSBuZXcgVGVybWluYWwoe1xuICAgICAgY3Vyc29yQmxpbms6IHRydWUsXG4gICAgICBmb250U2l6ZTogMTQsXG4gICAgICBmb250RmFtaWx5OiBcIidDYXNjYWRpYSBDb2RlJywgJ0ZpcmEgQ29kZScsICdDb25zb2xhcycsIG1vbm9zcGFjZVwiLFxuICAgICAgdGhlbWU6IHtcbiAgICAgICAgYmFja2dyb3VuZDogJyMxZTFlMWUnLFxuICAgICAgICBmb3JlZ3JvdW5kOiAnI2Q0ZDRkNCcsXG4gICAgICAgIGN1cnNvcjogJyNhZWFmYWQnLFxuICAgICAgICBzZWxlY3Rpb25CYWNrZ3JvdW5kOiAnIzI2NGY3OCcsXG4gICAgICB9LFxuICAgICAgc2Nyb2xsYmFjazogNTAwMCxcbiAgICB9KTtcblxuICAgIC8vIEZpdCBhZGRvblxuICAgIGlmICh0eXBlb2YgRml0QWRkb24gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBmaXRBZGRvbiA9IG5ldyBGaXRBZGRvbi5GaXRBZGRvbigpO1xuICAgICAgdGVybS5sb2FkQWRkb24oZml0QWRkb24pO1xuICAgIH1cblxuICAgIHRlcm0ub3Blbih0ZXJtRWwpO1xuICAgIGlmIChmaXRBZGRvbikge1xuICAgICAgLy8gU21hbGwgZGVsYXkgZm9yIERPTSB0byBzZXR0bGVcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZml0QWRkb24uZml0KCksIDUwKTtcbiAgICB9XG5cbiAgICAvLyBDb25uZWN0IFdlYlNvY2tldFxuICAgIGNvbnN0IHByb3RvY29sID0gbG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonID8gJ3dzczonIDogJ3dzOic7XG4gICAgd3MgPSBuZXcgV2ViU29ja2V0KGAke3Byb3RvY29sfS8vJHtsb2NhdGlvbi5ob3N0fS93cy9leGVjLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbnRhaW5lcklkKX1gKTtcbiAgICB3cy5iaW5hcnlUeXBlID0gJ2FycmF5YnVmZmVyJztcblxuICAgIHdzLm9ub3BlbiA9ICgpID0+IHtcbiAgICAgIHRlcm0ud3JpdGVsbignXFx4MWJbMzJtQ29ubmVjdGluZy4uLlxceDFiWzBtJyk7XG4gICAgICAvLyBTZW5kIGluaXRpYWwgcmVzaXplXG4gICAgICBpZiAoZml0QWRkb24pIHtcbiAgICAgICAgY29uc3QgZGltcyA9IGZpdEFkZG9uLnByb3Bvc2VEaW1lbnNpb25zKCk7XG4gICAgICAgIGlmIChkaW1zKSB7XG4gICAgICAgICAgd3Muc2VuZChKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICdyZXNpemUnLCBjb2xzOiBkaW1zLmNvbHMsIHJvd3M6IGRpbXMucm93cyB9KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgd3Mub25tZXNzYWdlID0gKGUpID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZS5kYXRhID09PSAnc3RyaW5nJykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1zZyA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgICBpZiAobXNnLnR5cGUgPT09ICdjb25uZWN0ZWQnKSB7XG4gICAgICAgICAgICB0ZXJtLndyaXRlbG4oYFxceDFiWzMybUNvbm5lY3RlZCAoJHttc2cuc2hlbGx9KVxceDFiWzBtXFxyXFxuYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChtc2cudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgdGVybS53cml0ZWxuKGBcXHgxYlszMW1FcnJvcjogJHttc2cubWVzc2FnZX1cXHgxYlswbWApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAobXNnLnR5cGUgPT09ICdleGl0Jykge1xuICAgICAgICAgICAgdGVybS53cml0ZWxuKCdcXHJcXG5cXHgxYlszM21TZXNzaW9uIGVuZGVkLlxceDFiWzBtJyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICAvLyBQbGFpbiB0ZXh0XG4gICAgICAgIHRlcm0ud3JpdGUoZS5kYXRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJpbmFyeSBkYXRhXG4gICAgICAgIHRlcm0ud3JpdGUobmV3IFVpbnQ4QXJyYXkoZS5kYXRhKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHdzLm9uY2xvc2UgPSAoKSA9PiB7XG4gICAgICBpZiAodGVybSkgdGVybS53cml0ZWxuKCdcXHJcXG5cXHgxYlszM21EaXNjb25uZWN0ZWQuXFx4MWJbMG0nKTtcbiAgICB9O1xuXG4gICAgd3Mub25lcnJvciA9ICgpID0+IHtcbiAgICAgIGlmICh0ZXJtKSB0ZXJtLndyaXRlbG4oJ1xcclxcblxceDFiWzMxbUNvbm5lY3Rpb24gZXJyb3IuXFx4MWJbMG0nKTtcbiAgICB9O1xuXG4gICAgLy8gVGVybWluYWwgaW5wdXQgXHUyMTkyIFdlYlNvY2tldFxuICAgIHRlcm0ub25EYXRhKChkYXRhKSA9PiB7XG4gICAgICBpZiAod3MgJiYgd3MucmVhZHlTdGF0ZSA9PT0gV2ViU29ja2V0Lk9QRU4pIHtcbiAgICAgICAgd3Muc2VuZChkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSByZXNpemVcbiAgICB0ZXJtLm9uUmVzaXplKCh7IGNvbHMsIHJvd3MgfSkgPT4ge1xuICAgICAgaWYgKHdzICYmIHdzLnJlYWR5U3RhdGUgPT09IFdlYlNvY2tldC5PUEVOKSB7XG4gICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAncmVzaXplJywgY29scywgcm93cyB9KSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBSZS1maXQgb24gd2luZG93IHJlc2l6ZVxuICAgIGNvbnN0IHJlc2l6ZUhhbmRsZXIgPSAoKSA9PiB7IGlmIChmaXRBZGRvbikgZml0QWRkb24uZml0KCk7IH07XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHJlc2l6ZUhhbmRsZXIpO1xuXG4gICAgLy8gU3RvcmUgaGFuZGxlciBmb3IgY2xlYW51cFxuICAgIG1vZGFsLl9yZXNpemVIYW5kbGVyID0gcmVzaXplSGFuZGxlcjtcbiAgfVxuXG4gIGNsb3NlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjbGVhbnVwKCk7XG4gICAgaWYgKG1vZGFsLl9yZXNpemVIYW5kbGVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgbW9kYWwuX3Jlc2l6ZUhhbmRsZXIpO1xuICAgIH1cbiAgICBtb2RhbD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICB9KTtcblxuICAvLyBBbHNvIGNsb3NlIG9uIGJhY2tkcm9wIGNsaWNrXG4gIG1vZGFsPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgaWYgKGUudGFyZ2V0ID09PSBtb2RhbCkge1xuICAgICAgY2xlYW51cCgpO1xuICAgICAgaWYgKG1vZGFsLl9yZXNpemVIYW5kbGVyKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCBtb2RhbC5fcmVzaXplSGFuZGxlcik7XG4gICAgICB9XG4gICAgICBtb2RhbD8uY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gRXhwb3J0XG4gIHdpbmRvdy5vcGVuRXhlY01vZGFsID0gb3BlbkV4ZWM7XG59KSgpO1xuO1xuLy8gPT09PT09PT09PSBBVURJVCBMT0cgVklFV0VSID09PT09PT09PT1cbi8vIERDLTA1MDogc3VyZmFjZSBhdXRoZW50aWNhdGVkIHVzZXIgaWRlbnRpdHkgKHVzZXJFbWFpbCAvIHVzZXJSb2xlIGZyb21cbi8vIGF1ZGl0TG9nZ2VyLmRldGFpbHMpLCBhZGQgb3V0Y29tZSBmaWx0ZXIsIHBhc3MgY29uZmlybT1DTEVBUiBib2R5IGZvclxuLy8gZGVzdHJ1Y3RpdmUgREVMRVRFLlxuKGZ1bmN0aW9uKCkge1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnYXVkaXQtbW9kYWwnLCBgPGRpdiBpZD1cImF1ZGl0LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA5NTBweDsgbWF4LXdpZHRoOiAxMTUwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVEQ0RDIEF1ZGl0IExvZzwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIFRyYWNrIGFsbCBhY3Rpb25zIHBlcmZvcm1lZCB0aHJvdWdoIHRoZSBBUEkuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBnYXA6IDEycHg7IG1hcmdpbi1ib3R0b206IDEycHg7IGFsaWduLWl0ZW1zOiBjZW50ZXI7IGZsZXgtd3JhcDogd3JhcDtcIj5cbiAgICAgICAgPGxhYmVsIGNsYXNzPVwidGV4dC1tdXRlZC1zbVwiPkNhdGVnb3J5OjwvbGFiZWw+XG4gICAgICAgIDxzZWxlY3QgaWQ9XCJhdWRpdC1maWx0ZXJcIiBzdHlsZT1cInBhZGRpbmc6IDZweCAxMHB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGJhY2tncm91bmQ6IHZhcigtLWJnKTsgY29sb3I6IHZhcigtLWZnKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGw8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2VydmljZVwiPlNlcnZpY2VzPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNvbnRhaW5lclwiPkNvbnRhaW5lcnM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY2FkZHlcIj5DYWRkeTwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJkbnNcIj5ETlM8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYmFja3VwXCI+QmFja3Vwczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJjb25maWdcIj5Db25maWc8L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYXV0aFwiPkF1dGg8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5SZXN1bHQ6PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBpZD1cImF1ZGl0LW91dGNvbWUtZmlsdGVyXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTBweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj5cbiAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+QW55PC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInN1Y2Nlc3NcIj5cdTI3MTMgU3VjY2Vzczwvb3B0aW9uPlxuICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYWlsdXJlXCI+XHUyNzE3IEZhaWx1cmU8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA4cHg7XCI+U2luY2U6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IGlkPVwiYXVkaXQtc2luY2VcIiB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIiBzdHlsZT1cInBhZGRpbmc6IDVweCA4cHg7IGJvcmRlci1yYWRpdXM6IDZweDsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDAuODJyZW07XCI+XG4gICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtbXV0ZWQtc21cIj5VbnRpbDo8L2xhYmVsPlxuICAgICAgICA8aW5wdXQgaWQ9XCJhdWRpdC11bnRpbFwiIHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0eWxlPVwicGFkZGluZzogNXB4IDhweDsgYm9yZGVyLXJhZGl1czogNnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBiYWNrZ3JvdW5kOiB2YXIoLS1iZyk7IGNvbG9yOiB2YXIoLS1mZyk7IGZvbnQtc2l6ZTogMC44MnJlbTtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImF1ZGl0LXJlZnJlc2gtYnRuXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6IDE7XCI+PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXVkaXQtY2xlYXItYnRuXCIgc3R5bGU9XCJwYWRkaW5nOiA2cHggMTJweDsgZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1iYWQtZmcpOyBib3JkZXItY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+XHVEODNEXHVEREQxXHVGRTBGIENsZWFyIExvZzwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJhdWRpdC1sb2ctY29udGFpbmVyXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPjxzcGFuIGNsYXNzPVwiYnJhbmQtc3Bpbm5lclwiPjwvc3Bhbj4gTG9hZGluZyBhdWRpdCBsb2cuLi48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyO1wiPlxuICAgICAgICA8YnV0dG9uIGlkPVwiYXVkaXQtbG9hZC1tb3JlXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBwYWRkaW5nOiA2cHggMTZweDsgZm9udC1zaXplOiAwLjhyZW07XCI+TG9hZCBNb3JlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhdWRpdC1jYW5jZWxcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LW1vZGFsJyk7XG4gIGNvbnN0IG9wZW5CdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtbG9nLWJ0bicpO1xuICBjb25zdCBjYW5jZWxCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtY2FuY2VsJyk7XG4gIGNvbnN0IHJlZnJlc2hCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtcmVmcmVzaC1idG4nKTtcbiAgY29uc3QgY2xlYXJCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtY2xlYXItYnRuJyk7XG4gIGNvbnN0IGZpbHRlclNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1maWx0ZXInKTtcbiAgY29uc3Qgb3V0Y29tZVNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhdWRpdC1vdXRjb21lLWZpbHRlcicpO1xuICBjb25zdCBzaW5jZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LXNpbmNlJyk7XG4gIGNvbnN0IHVudGlsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtdW50aWwnKTtcbiAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2F1ZGl0LWxvZy1jb250YWluZXInKTtcbiAgY29uc3QgbG9hZE1vcmVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYXVkaXQtbG9hZC1tb3JlJyk7XG4gIGxldCBjdXJyZW50T2Zmc2V0ID0gMDtcbiAgbGV0IGluZmxpZ2h0ID0gbnVsbDsgLy8gQWJvcnRDb250cm9sbGVyIGZvciB0aGUgaW4tZmxpZ2h0IHJlcXVlc3RcbiAgbGV0IGZpbHRlck5vbmNlID0gMDsgLy8gaW5jcmVtZW50cyBvbiBldmVyeSBmcmVzaCAobm9uLWFwcGVuZCkgbG9hZDsgbGV0c1xuICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBpbi1mbGlnaHQgYXBwZW5kIGRldGVjdCB0aGUgZmlsdGVyIGhhcyBjaGFuZ2VkXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBza2lwIGl0cyBET00gc3BsaWNlLlxuICBjb25zdCBQQUdFX1NJWkUgPSA1MDtcblxuICAvLyBkYXRldGltZS1sb2NhbCBmaWVsZHMgY2Fycnkgbm8gdGltZXpvbmUgb2Zmc2V0IFx1MjAxNCBjb252ZXJ0IHRvIElTTyA4NjAxXG4gIC8vIHdpdGggdGhlIGxvY2FsIG9mZnNldCBzbyB0aGUgc2VydmVyIGNhbiBjb21wYXJlIGNvcnJlY3RseS5cbiAgZnVuY3Rpb24gdG9Jc28obG9jYWxEdFZhbHVlKSB7XG4gICAgaWYgKCFsb2NhbER0VmFsdWUpIHJldHVybiBudWxsO1xuICAgIC8vIEJyb3dzZXJzIGV4cG9zZSBkYXRldGltZS1sb2NhbCBhcyBuYWl2ZSBsb2NhbCB0aW1lLiBuZXcgRGF0ZSgpIG9uXG4gICAgLy8gdGhhdCBzdHJpbmcgcGFyc2VzIGl0IGFzIExPQ0FMLCBzbyB0b0lTT1N0cmluZygpIHlpZWxkcyB0aGUgVVRDXG4gICAgLy8gZXF1aXZhbGVudCB0aGUgc2VydmVyIGV4cGVjdHMuXG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGxvY2FsRHRWYWx1ZSk7XG4gICAgaWYgKGlzTmFOKGQuZ2V0VGltZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRBdWRpdChhcHBlbmQpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIHJlcXVlc3QgYW5kIGJ1bXAgdGhlIGZpbHRlciBub25jZSBzbyBhbnlcbiAgICAgICAgLy8gYXBwZW5kaW5nIGZldGNoIChzdGlsbCBpbiBmbGlnaHQpIGtub3dzIHRvIGRpc2NhcmQgaXRzIHJlc3BvbnNlLlxuICAgICAgICBpZiAoaW5mbGlnaHQpIGluZmxpZ2h0LmFib3J0KCk7XG4gICAgICAgIGluZmxpZ2h0ID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICBjdXJyZW50T2Zmc2V0ID0gMDtcbiAgICAgICAgZmlsdGVyTm9uY2UrKztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImJyYW5kLXNwaW5uZXJcIj48L3NwYW4+IExvYWRpbmcuLi48L2Rpdj4nO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGluZmxpZ2h0KSBpbmZsaWdodC5hYm9ydCgpO1xuICAgICAgICBpbmZsaWdodCA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG15Tm9uY2UgPSBmaWx0ZXJOb25jZTtcbiAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgIHBhcmFtcy5zZXQoJ2xpbWl0JywgU3RyaW5nKFBBR0VfU0laRSkpO1xuICAgICAgcGFyYW1zLnNldCgnb2Zmc2V0JywgU3RyaW5nKGN1cnJlbnRPZmZzZXQpKTtcbiAgICAgIGNvbnN0IGFjdGlvbiA9IGZpbHRlclNlbGVjdC52YWx1ZTtcbiAgICAgIGNvbnN0IG91dGNvbWUgPSBvdXRjb21lU2VsZWN0LnZhbHVlO1xuICAgICAgY29uc3Qgc2luY2UgPSB0b0lzbyhzaW5jZUlucHV0LnZhbHVlKTtcbiAgICAgIGNvbnN0IHVudGlsID0gdG9Jc28odW50aWxJbnB1dC52YWx1ZSk7XG4gICAgICBpZiAoYWN0aW9uKSBwYXJhbXMuc2V0KCdhY3Rpb24nLCBhY3Rpb24pO1xuICAgICAgaWYgKG91dGNvbWUpIHBhcmFtcy5zZXQoJ291dGNvbWUnLCBvdXRjb21lKTtcbiAgICAgIGlmIChzaW5jZSkgcGFyYW1zLnNldCgnc2luY2UnLCBzaW5jZSk7XG4gICAgICBpZiAodW50aWwpIHBhcmFtcy5zZXQoJ3VudGlsJywgdW50aWwpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9hdWRpdC1sb2dzPycgKyBwYXJhbXMudG9TdHJpbmcoKSwge1xuICAgICAgICBzaWduYWw6IGluZmxpZ2h0LnNpZ25hbCxcbiAgICAgIH0pO1xuICAgICAgLy8gU3VyZmFjZSA0MDEvNDAzLzUwMCBleHBsaWNpdGx5IFx1MjAxNCB0aGUgZGFzaGJvYXJkIHVzZWQgdG8gcmVuZGVyIGFueVxuICAgICAgLy8gbm9uLXN1Y2Nlc3MgcmVzcG9uc2UgYXMgXCJubyBhdWRpdCBsb2cgZW50cmllcyB5ZXQsXCIgd2hpY2ggaXNcbiAgICAgIC8vIG1pc2xlYWRpbmcgZm9yIGFuIGV4cGlyZWQgc2Vzc2lvbi5cbiAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCIgc3R5bGU9XCJjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5GYWlsZWQ6IEhUVFAgJHtyZXMuc3RhdHVzfTwvZGl2PmA7XG4gICAgICAgIGxvYWRNb3JlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIiBzdHlsZT1cImNvbG9yOiB2YXIoLS1iYWQtZmcpO1wiPkZhaWxlZDogJHtlc2NhcGVIdG1sKGRhdGEuZXJyb3IgfHwgJ3Vua25vd24nKX08L2Rpdj5gO1xuICAgICAgICBsb2FkTW9yZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBJZiBhIG5vbi1hcHBlbmQgbG9hZCBoYXBwZW5lZCBhZnRlciB0aGlzIGZldGNoIHdhcyBpc3N1ZWQsIHRoZVxuICAgICAgLy8gb3BlcmF0b3IgY2hhbmdlZCBmaWx0ZXJzOyBkaXNjYXJkIHRoZSBub3ctc3RhbGUgcmVzcG9uc2UuXG4gICAgICBpZiAoIWFwcGVuZCAmJiBteU5vbmNlICE9PSBmaWx0ZXJOb25jZSkgcmV0dXJuO1xuICAgICAgY29uc3QgZW50cmllcyA9IEFycmF5LmlzQXJyYXkoZGF0YS5lbnRyaWVzKSA/IGRhdGEuZW50cmllcyA6IFtdO1xuXG4gICAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDAgJiYgIWFwcGVuZCkge1xuICAgICAgICBjb25zdCByZWFzb24gPSBkYXRhLmZpbHRlcnMgJiYgKGRhdGEuZmlsdGVycy5hY3Rpb24gfHwgZGF0YS5maWx0ZXJzLm91dGNvbWUgfHwgZGF0YS5maWx0ZXJzLnNpbmNlIHx8IGRhdGEuZmlsdGVycy51bnRpbClcbiAgICAgICAgICA/ICdObyBlbnRyaWVzIG1hdGNoIHlvdXIgZmlsdGVycy4nXG4gICAgICAgICAgOiAnTm8gYXVkaXQgbG9nIGVudHJpZXMgeWV0LiBBY3Rpb25zIHdpbGwgYmUgbG9nZ2VkIGF1dG9tYXRpY2FsbHkuJztcbiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj48c3BhbiBjbGFzcz1cImVtcHR5LWljb25cIj5cdUQ4M0RcdURDREM8L3NwYW4+JHtlc2NhcGVIdG1sKHJlYXNvbil9PC9kaXY+YDtcbiAgICAgICAgbG9hZE1vcmVCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgaHRtbCA9ICcnO1xuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgaHRtbCA9ICc8dGFibGUgc3R5bGU9XCJ3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgZm9udC1zaXplOiAwLjgycmVtO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJzx0ciBzdHlsZT1cImJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPic7XG4gICAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5XaGVuPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+QWN0b3I8L3RoPic7XG4gICAgICAgIGh0bWwgKz0gJzx0aCBzdHlsZT1cInBhZGRpbmc6IDZweDsgdGV4dC1hbGlnbjogbGVmdDtcIj5JUDwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPkFjdGlvbjwvdGg+JztcbiAgICAgICAgaHRtbCArPSAnPHRoIHN0eWxlPVwicGFkZGluZzogNnB4OyB0ZXh0LWFsaWduOiBsZWZ0O1wiPlJlc291cmNlPC90aD4nO1xuICAgICAgICBodG1sICs9ICc8dGggc3R5bGU9XCJwYWRkaW5nOiA2cHg7IHRleHQtYWxpZ246IGxlZnQ7XCI+UmVzdWx0PC90aD4nO1xuICAgICAgICBodG1sICs9ICc8L3RyPic7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGNvbnN0IG9rID0gZS5vdXRjb21lID09PSAnc3VjY2Vzcyc7XG4gICAgICAgIGNvbnN0IGFjdG9yID0gYWN0b3JMYWJlbChlKTtcbiAgICAgICAgaHRtbCArPSBgPHRyIHN0eWxlPVwiYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlcik7IGN1cnNvcjogcG9pbnRlcjtcIiBjbGFzcz1cImF1ZGl0LXJvd1wiPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgY29sb3I6IHZhcigtLW11dGVkKTtcIiB0aXRsZT1cIiR7ZXNjYXBlSHRtbChlLnRpbWVzdGFtcCB8fCAnJyl9XCI+JHt0aW1lQWdvKGUudGltZXN0YW1wKX08L3RkPmA7XG4gICAgICAgIGh0bWwgKz0gYDx0ZCBzdHlsZT1cInBhZGRpbmc6IDZweDsgZm9udC1zaXplOiAwLjc4cmVtO1wiPiR7YWN0b3J9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC43OHJlbTtcIj4ke2VzY2FwZUh0bWwoZS5pcCB8fCAnLScpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4OyBmb250LXdlaWdodDogNTAwO1wiPiR7ZXNjYXBlSHRtbChlLmFjdGlvbiB8fCAnLScpfTwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSBgPHRkIHN0eWxlPVwicGFkZGluZzogNnB4O1wiPiR7ZXNjYXBlSHRtbChlLnJlc291cmNlIHx8ICctJyl9PC90ZD5gO1xuICAgICAgICBodG1sICs9IGA8dGQgc3R5bGU9XCJwYWRkaW5nOiA2cHg7XCI+PHNwYW4gc3R5bGU9XCJjb2xvcjogJHtvayA/ICd2YXIoLS1vay1mZyknIDogJ3ZhcigtLWJhZC1mZyknfTtcIj4ke29rID8gJ1x1MjcxMycgOiAnXHUyNzE3J30gJHtlc2NhcGVIdG1sKGUub3V0Y29tZSB8fCAnJyl9PC9zcGFuPjwvdGQ+YDtcbiAgICAgICAgaHRtbCArPSAnPC90cj4nO1xuICAgICAgICBpZiAoZS5kZXRhaWxzICYmIE9iamVjdC5rZXlzKGUuZGV0YWlscykubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGh0bWwgKz0gYDx0ciBjbGFzcz1cImF1ZGl0LWRldGFpbFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTtcIj48dGQgY29sc3Bhbj1cIjZcIiBzdHlsZT1cInBhZGRpbmc6IDZweCA2cHggMTBweDsgZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPjxwcmUgc3R5bGU9XCJtYXJnaW46IDA7IHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcIj4ke2VzY2FwZUh0bWwoSlNPTi5zdHJpbmdpZnkoZS5kZXRhaWxzLCBudWxsLCAyKSl9PC9wcmU+PC90ZD48L3RyPmA7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFhcHBlbmQpIHtcbiAgICAgICAgaHRtbCArPSAnPC90YWJsZT4nO1xuICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gaHRtbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3RhYmxlJyk7XG4gICAgICAgIGlmICh0YWJsZSkgdGFibGUuaW5zZXJ0QWRqYWNlbnRIVE1MKCdiZWZvcmVlbmQnLCBodG1sKTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudE9mZnNldCArPSBlbnRyaWVzLmxlbmd0aDtcbiAgICAgIC8vIGhhc01vcmUgaXMgcmVwb3J0ZWQgYnkgdGhlIHNlcnZlciAocG9zdC1maWx0ZXIgdG90YWwpLCBzbyB0aGVcbiAgICAgIC8vIExvYWQgTW9yZSBidXR0b24gc3RheXMgYWNjdXJhdGUgd2hlbiBmaWx0ZXJzIGNoYW5nZSBtaWQtc2Nyb2xsLlxuICAgICAgbG9hZE1vcmVCdG4uc3R5bGUuZGlzcGxheSA9IGRhdGEuaGFzTW9yZSA/ICcnIDogJ25vbmUnO1xuXG4gICAgICAvLyBUb2dnbGUgZGV0YWlsIHJvd3Mgb24gY2xpY2tcbiAgICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKCcuYXVkaXQtcm93JykuZm9yRWFjaChyb3cgPT4ge1xuICAgICAgICBpZiAocm93LmRhdGFzZXQud2lyZWQpIHJldHVybjtcbiAgICAgICAgcm93LmRhdGFzZXQud2lyZWQgPSAndHJ1ZSc7XG4gICAgICAgIHJvdy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICBjb25zdCBkZXRhaWwgPSByb3cubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgIGlmIChkZXRhaWwgJiYgZGV0YWlsLmNsYXNzTGlzdC5jb250YWlucygnYXVkaXQtZGV0YWlsJykpIHtcbiAgICAgICAgICAgIGRldGFpbC5zdHlsZS5kaXNwbGF5ID0gZGV0YWlsLnN0eWxlLmRpc3BsYXkgPT09ICdub25lJyA/ICcnIDogJ25vbmUnO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBBYm9ydEVycm9yIGlzIGV4cGVjdGVkIHdoZW4gd2UgZGVsaWJlcmF0ZWx5IGNhbmNlbCBhbiBpbi1mbGlnaHRcbiAgICAgIC8vIHJlcXVlc3QgKGUuZy4gdGhlIG9wZXJhdG9yIGNoYW5nZWQgZmlsdGVycyBtaWQtZmV0Y2gpIFx1MjAxNCBkb24ndFxuICAgICAgLy8gZmxhc2ggYSBcIkZhaWxlZDogVGhlIHVzZXIgYWJvcnRlZCBhIHJlcXVlc3RcIiBtZXNzYWdlIG92ZXIgdGhlXG4gICAgICAvLyBsb2FkaW5nIHNwaW5uZXIuIFRoZSBuZXcgZmV0Y2ggaGFzIGFscmVhZHkga2lja2VkIG9mZi5cbiAgICAgIGlmIChlICYmIGUubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSByZXR1cm47XG4gICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gYDxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiIHN0eWxlPVwiY29sb3I6IHZhcigtLWJhZC1mZyk7XCI+RmFpbGVkOiAke2VzY2FwZUh0bWwoZS5tZXNzYWdlKX08L2Rpdj5gO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJlbmRlciB0aGUgaHVtYW4tcmVhZGFibGUgYWN0b3I6IHByZWZlciB1c2VyRW1haWwsIGZhbGwgYmFjayB0b1xuICAvLyB1c2VySWQsIGZhbGwgYmFjayB0byBiYXJlIElQLiBJZiBubyB1c2VyIGF0dHJpYnV0aW9uLCBtYXJrIGFzXG4gIC8vIFwic3lzdGVtXCIgc28gdGhlIG9wZXJhdG9yIGtub3dzIHRoZSBlbnRyeSBjYW1lIGZyb20gYW4gdW5hdXRoZW50aWNhdGVkXG4gIC8vIG9yIHNlcnZpY2UgcGF0aCAoZS5nLiBjcm9uLWRyaXZlbiBiYWNrdXBzKS5cbiAgZnVuY3Rpb24gYWN0b3JMYWJlbChlbnRyeSkge1xuICAgIGNvbnN0IGQgPSBlbnRyeS5kZXRhaWxzIHx8IHt9O1xuICAgIGNvbnN0IGVtYWlsID0gZC51c2VyRW1haWw7XG4gICAgY29uc3QgaWQgPSBkLnVzZXJJZDtcbiAgICBjb25zdCByb2xlID0gZC51c2VyUm9sZTtcbiAgICBjb25zdCBwcm92aWRlciA9IGQudmlhUHJvdmlkZXI7XG4gICAgaWYgKGVtYWlsKSB7XG4gICAgICBjb25zdCB0YWcgPSByb2xlID8gYCA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7IGZvbnQtc2l6ZTogMC43MnJlbTtcIj5bJHtlc2NhcGVIdG1sKHJvbGUpfSR7cHJvdmlkZXIgPyAnLycgKyBlc2NhcGVIdG1sKHByb3ZpZGVyKSA6ICcnfV08L3NwYW4+YCA6ICcnO1xuICAgICAgcmV0dXJuIGAke2VzY2FwZUh0bWwoZW1haWwpfSR7dGFnfWA7XG4gICAgfVxuICAgIGlmIChpZCkgcmV0dXJuIGA8c3BhbiBzdHlsZT1cImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtlc2NhcGVIdG1sKGlkKX08L3NwYW4+YDtcbiAgICBpZiAoIWVudHJ5LmlwKSByZXR1cm4gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5zeXN0ZW08L3NwYW4+JztcbiAgICByZXR1cm4gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5hbm9uPC9zcGFuPic7XG4gIH1cblxuICBvcGVuQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBtb2RhbD8uY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvYWRBdWRpdChmYWxzZSk7XG4gIH0pO1xuICB3aXJlTW9kYWwobW9kYWwsIGNhbmNlbEJ0bik7XG4gIHJlZnJlc2hCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZEF1ZGl0KGZhbHNlKSk7XG4gIGZpbHRlclNlbGVjdD8uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gbG9hZEF1ZGl0KGZhbHNlKSk7XG4gIG91dGNvbWVTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IGxvYWRBdWRpdChmYWxzZSkpO1xuICAvLyBSZS1mZXRjaCBvbiBkYXRlIGNoYW5nZSBvbmx5IHdoZW4gYm90aCBmaWVsZHMgaGF2ZSBhIHZhbHVlIG9yIGJvdGggYXJlXG4gIC8vIGVtcHR5IFx1MjAxNCB0eXBpbmcgb25lIGNoYXJhY3RlciBzaG91bGRuJ3QgdHJpZ2dlciBhIGZldGNoIGZvciBldmVyeSBrZXlzdHJva2UuXG4gIGxldCBkYXRlRGVib3VuY2U7XG4gIFtzaW5jZUlucHV0LCB1bnRpbElucHV0XS5mb3JFYWNoKChlbCkgPT4ge1xuICAgIGVsPy5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjbGVhclRpbWVvdXQoZGF0ZURlYm91bmNlKTtcbiAgICAgIGRhdGVEZWJvdW5jZSA9IHNldFRpbWVvdXQoKCkgPT4gbG9hZEF1ZGl0KGZhbHNlKSwgMjUwKTtcbiAgICB9KTtcbiAgfSk7XG4gIGxvYWRNb3JlQnRuPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IGxvYWRBdWRpdCh0cnVlKSk7XG5cbiAgY2xlYXJCdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgIGlmICghY29uZmlybSgnQ2xlYXIgdGhlIGVudGlyZSBhdWRpdCBsb2c/IFRoaXMgY2Fubm90IGJlIHVuZG9uZS4nKSkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9hdWRpdC1sb2dzJywge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICBoZWFkZXJzOiB7ICdjb250ZW50LXR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBjb25maXJtOiAnQ0xFQVInIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIGxvYWRBdWRpdChmYWxzZSk7XG4gICAgICBlbHNlIHNob3dOb3RpZmljYXRpb24oJ0Vycm9yOiAnICsgKGRhdGEuZXJyb3IgfHwgJ0NsZWFyIGZhaWxlZCcpLCAnZXJyb3InKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdFcnJvcjogJyArIGUubWVzc2FnZSwgJ2Vycm9yJyk7XG4gICAgfVxuICB9KTtcbn0pKCk7O1xuLy8gPT09PT09PT09PSBTRUNVUklUWSBDRU5URVIgPT09PT09PT09PVxuLy8gTXVsdGktc291cmNlIHNlY3VyaXR5IGV2ZW50IHZpZXdlciArIGhvc3QgcmVnaXN0cnkgVUkuXG4vL1xuLy8gU2hvd3MgbGl2ZSBldmVudHMgZnJvbSBhbnkgc291cmNlIChBUEkgYXVkaXQsIENhZGR5IGFjY2VzcyBsb2csIGZhaWwyYmFuLFxuLy8gc2hhcmVkX2JhbnMpIG9uIGFueSByZWdpc3RlcmVkIGhvc3QgKHRoaXMgRGFzaENhZGR5LCBmdXR1cmUgcmVtb3RlIGFnZW50cykuXG4vL1xuLy8gTGl2ZS10YWlsIHVzZXMgU1NFICgvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cy9zdHJlYW0pLlxuKGZ1bmN0aW9uKCkge1xuICBpbmplY3RNb2RhbCgnc2VjdXJpdHktbW9kYWwnLCBgPGRpdiBpZD1cInNlY3VyaXR5LW1vZGFsXCIgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsXCI+XG4gICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA5ODBweDsgbWF4LXdpZHRoOiAxMjgwcHg7XCI+XG4gICAgICA8aDM+XHVEODNEXHVERUUxXHVGRTBGIFNlY3VyaXR5IENlbnRlcjwvaDM+XG4gICAgICA8cCBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCI+XG4gICAgICAgIExpdmUgZXZlbnRzIGZyb20gQVBJLCBDYWRkeSwgZmFpbDJiYW4gJiBzaGFyZWRfYmFucy4gTGl2ZS10YWlsIHZpYSBTU0UuXG4gICAgICA8L3A+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJzZWMtdGFic1wiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLWJvdHRvbToxNHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZWMtdGFiIGFjdGl2ZVwiIGRhdGEtdGFiPVwib3ZlcnZpZXdcIj5PdmVydmlldzwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VjLXRhYlwiIGRhdGEtdGFiPVwiZXZlbnRzXCI+RXZlbnRzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzZWMtdGFiXCIgZGF0YS10YWI9XCJob3N0c1wiPkhvc3RzPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBPVkVSVklFVyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXBhbmVsXCIgZGF0YS1wYW5lbD1cIm92ZXJ2aWV3XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdHNcIiBpZD1cInNlYy1zdGF0c1wiIHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczpyZXBlYXQoYXV0by1maXQsbWlubWF4KDE4MHB4LDFmcikpO2dhcDoxMnB4O21hcmdpbi1ib3R0b206MThweDtcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjLXN0YXRcIiBkYXRhLWtleT1cInRvdGFsXCI+XHUyMDE0IGV2ZW50czwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdFwiIGRhdGEta2V5PVwid2FyblwiPlx1MjAxNCB3YXJuaW5nczwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWMtc3RhdFwiIGRhdGEta2V5PVwiZXJyb3JcIj5cdTIwMTQgZXJyb3JzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlYy1zdGF0XCIgZGF0YS1rZXk9XCJkZW5pZWRcIj5cdTIwMTQgZGVuaWVkPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlYy1zdGF0XCIgZGF0YS1rZXk9XCJob3N0c1wiPlx1MjAxNCBob3N0czwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6MWZyIDFmcjtnYXA6MTRweDtcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjhweCAwIDZweDtcIj5Ub3AgQWN0b3JzICgyNGgpPC9oND5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJzZWMtdG9wLWFjdG9yc1wiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDoyNDBweDtcIj5cdTIwMTQ8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGg0IHN0eWxlPVwibWFyZ2luOjhweCAwIDZweDtcIj5Ub3AgVGFyZ2V0cyAoMjRoKTwvaDQ+XG4gICAgICAgICAgICA8ZGl2IGlkPVwic2VjLXRvcC10YXJnZXRzXCIgY2xhc3M9XCJzY3JvbGwtY29udGFpbmVyXCIgc3R5bGU9XCJtYXgtaGVpZ2h0OjI0MHB4O1wiPlx1MjAxNDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEVWRU5UUyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXBhbmVsXCIgZGF0YS1wYW5lbD1cImV2ZW50c1wiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7bWFyZ2luLWJvdHRvbToxMnB4O2FsaWduLWl0ZW1zOmNlbnRlcjtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic2VjLWZpbHRlci1zb3VyY2VcIiBjbGFzcz1cInNlYy1maWx0ZXJcIj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5BbGwgc291cmNlczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFwaVwiPkFQSTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNhZGR5XCI+Q2FkZHk8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJmYWlsMmJhblwiPmZhaWwyYmFuPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwic2hhcmVkLWJhbnNcIj5zaGFyZWRfYmFuczwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFnZW50XCI+QWdlbnQ8L29wdGlvbj5cbiAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic2VjLWZpbHRlci1zZXZlcml0eVwiIGNsYXNzPVwic2VjLWZpbHRlclwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBzZXZlcml0aWVzPC9vcHRpb24+XG4gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiY3JpdGljYWxcIj5jcml0aWNhbDwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImVycm9yXCI+ZXJyb3I8L29wdGlvbj5cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJ3YXJuXCI+d2Fybjwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIm5vdGljZVwiPm5vdGljZTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImluZm9cIj5pbmZvPC9vcHRpb24+XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPHNlbGVjdCBpZD1cInNlYy1maWx0ZXItaG9zdFwiIGNsYXNzPVwic2VjLWZpbHRlclwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBob3N0czwvb3B0aW9uPlxuICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDxpbnB1dCBpZD1cInNlYy1maWx0ZXItYWN0b3JcIiBjbGFzcz1cInNlYy1maWx0ZXJcIiBwbGFjZWhvbGRlcj1cImFjdG9yIChJUCBvciB1c2VyKVwiIHN0eWxlPVwicGFkZGluZzo2cHggMTBweDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2VjLXJlZnJlc2gtYnRuXCIgY2xhc3M9XCJidG4tc21cIj5cdUQ4M0RcdUREMDQgUmVmcmVzaDwvYnV0dG9uPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtnYXA6NnB4O1wiPlxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwic2VjLWxpdmUtdGFpbFwiIGNoZWNrZWQ+XG4gICAgICAgICAgICA8c3Bhbj5MaXZlIHRhaWw8L3NwYW4+XG4gICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJzZWMtZXZlbnRzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDo0ODBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBIT1NUUyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwic2VjLXBhbmVsXCIgZGF0YS1wYW5lbD1cImhvc3RzXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tYm90dG9tOjEycHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNlYy1ob3N0LXJlZ2lzdGVyLWJ0blwiIGNsYXNzPVwiYnRuLXNtXCI+XHUyNzk1IFJlZ2lzdGVyIEhvc3Q8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwic2VjLWhvc3RzLXJlZnJlc2hcIiBjbGFzcz1cImJ0bi1zbVwiPlx1RDgzRFx1REQwNCBSZWZyZXNoPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwic2VjLWhvc3RzLWNvbnRhaW5lclwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDo0ODBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9ucyBtb2RhbC1mb290ZXItYmFyXCI+XG4gICAgICAgIDxidXR0b24gaWQ9XCJzZWMtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICAvLyA9PT09PT09PT09PT09IFNUQVRFID09PT09PT09PT09PT1cbiAgY29uc3QgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjdXJpdHktbW9kYWwnKTtcbiAgY29uc3Qgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWN1cml0eS1jZW50ZXItYnRuJyk7XG4gIGNvbnN0IGNhbmNlbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtY2FuY2VsJyk7XG4gIGNvbnN0IHRhYnMgPSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VjLXRhYicpO1xuICBjb25zdCBwYW5lbHMgPSBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VjLXBhbmVsJyk7XG5cbiAgbGV0IGFsbEV2ZW50cyA9IFtdOyAvLyBuZXdlc3QgZmlyc3RcbiAgbGV0IGFsbEhvc3RzID0gW107XG4gIGxldCBzc2VTb3VyY2UgPSBudWxsO1xuXG4gIC8vID09PT09PT09PT09PT0gVEFCIFNXSVRDSElORyA9PT09PT09PT09PT09XG4gIHRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgIHRhYi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIHRhYnMuZm9yRWFjaCh0ID0+IHQuY2xhc3NMaXN0LnRvZ2dsZSgnYWN0aXZlJywgdCA9PT0gdGFiKSk7XG4gICAgICBwYW5lbHMuZm9yRWFjaChwID0+IHAuc3R5bGUuZGlzcGxheSA9IHAuZGF0YXNldC5wYW5lbCA9PT0gdGFiLmRhdGFzZXQudGFiID8gJycgOiAnbm9uZScpO1xuICAgICAgaWYgKHRhYi5kYXRhc2V0LnRhYiA9PT0gJ292ZXJ2aWV3JykgcmVmcmVzaE92ZXJ2aWV3KCk7XG4gICAgICBpZiAodGFiLmRhdGFzZXQudGFiID09PSAnZXZlbnRzJykgcmVmcmVzaEV2ZW50cygpO1xuICAgICAgaWYgKHRhYi5kYXRhc2V0LnRhYiA9PT0gJ2hvc3RzJykgcmVmcmVzaEhvc3RzKCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT0gT1BFTi9DTE9TRSA9PT09PT09PT09PT09XG4gIGlmIChvcGVuQnRuKSB7XG4gICAgb3BlbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5hZGQoJ3Nob3cnKTtcbiAgICAgIHJlZnJlc2hPdmVydmlldygpO1xuICAgICAgc3RhcnRMaXZlVGFpbCgpO1xuICAgIH0pO1xuICB9XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNsb3NlTW9kYWwpO1xuICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGUgPT4geyBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSBjbG9zZU1vZGFsKCk7IH0pO1xuICBmdW5jdGlvbiBjbG9zZU1vZGFsKCkge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICBzdG9wTGl2ZVRhaWwoKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT0gTElWRSBUQUlMIChTU0UpID09PT09PT09PT09PT1cbiAgZnVuY3Rpb24gc3RhcnRMaXZlVGFpbCgpIHtcbiAgICBzdG9wTGl2ZVRhaWwoKTtcbiAgICBpZiAoIWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtbGl2ZS10YWlsJykuY2hlY2tlZCkgcmV0dXJuO1xuICAgIGlmICh0eXBlb2YgRXZlbnRTb3VyY2UgPT09ICd1bmRlZmluZWQnKSByZXR1cm47IC8vIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0XG4gICAgdHJ5IHtcbiAgICAgIHNzZVNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgnL2FwaS92MS9zZWN1cml0eS9ldmVudHMvc3RyZWFtJyk7XG4gICAgICBzc2VTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignaW5pdCcsIChlKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoZS5kYXRhKTtcbiAgICAgICAgICBhbGxFdmVudHMgPSBkYXRhLmV2ZW50cyB8fCBbXTtcbiAgICAgICAgICByZW5kZXJFdmVudHMoKTtcbiAgICAgICAgfSBjYXRjaCB7fVxuICAgICAgfSk7XG4gICAgICBzc2VTb3VyY2UuYWRkRXZlbnRMaXN0ZW5lcignc2VjdXJpdHknLCAoZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGV2ID0gSlNPTi5wYXJzZShlLmRhdGEpO1xuICAgICAgICAgIGFsbEV2ZW50cy51bnNoaWZ0KGV2KTtcbiAgICAgICAgICBpZiAoYWxsRXZlbnRzLmxlbmd0aCA+IDUwMCkgYWxsRXZlbnRzLmxlbmd0aCA9IDUwMDtcbiAgICAgICAgICAvLyBBdXRvLXJlZnJlc2ggd2hpY2hldmVyIHBhbmVsIGlzIHNob3dpbmdcbiAgICAgICAgICBjb25zdCBhY3RpdmUgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcuc2VjLXRhYi5hY3RpdmUnKT8uZGF0YXNldD8udGFiO1xuICAgICAgICAgIGlmIChhY3RpdmUgPT09ICdldmVudHMnKSByZW5kZXJFdmVudHMoKTtcbiAgICAgICAgICBlbHNlIGlmIChhY3RpdmUgPT09ICdvdmVydmlldycpIHJlZnJlc2hPdmVydmlldygpO1xuICAgICAgICB9IGNhdGNoIHt9XG4gICAgICB9KTtcbiAgICAgIHNzZVNvdXJjZS5vbmVycm9yID0gKCkgPT4geyAvKiBicm93c2VyIGF1dG8tcmVjb25uZWN0cyAqLyB9O1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3NlY3VyaXR5XSBTU0UgZmFpbGVkOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHN0b3BMaXZlVGFpbCgpIHtcbiAgICBpZiAoc3NlU291cmNlKSB7IHRyeSB7IHNzZVNvdXJjZS5jbG9zZSgpOyB9IGNhdGNoIHt9IHNzZVNvdXJjZSA9IG51bGw7IH1cbiAgfVxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWxpdmUtdGFpbCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBpZiAobW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHN0YXJ0TGl2ZVRhaWwoKTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PSBPVkVSVklFVyA9PT09PT09PT09PT09XG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hPdmVydmlldygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc2luY2UgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gMjQqNjAqNjAqMTAwMCkudG9JU09TdHJpbmcoKTtcbiAgICAgIGNvbnN0IFtzdGF0c1JlcywgaG9zdHNSZXMsIGV2ZW50c1Jlc10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cy9zdGF0cz9zaW5jZT0ke2VuY29kZVVSSUNvbXBvbmVudChzaW5jZSl9YCksXG4gICAgICAgIGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJyksXG4gICAgICAgIGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2V2ZW50cz9saW1pdD0xJnNpbmNlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNpbmNlKX1gKSxcbiAgICAgIF0pO1xuICAgICAgY29uc3Qgc3RhdHMgPSAoYXdhaXQgc3RhdHNSZXMuanNvbigpKS5kYXRhIHx8IHt9O1xuICAgICAgY29uc3QgaG9zdHMgPSAoYXdhaXQgaG9zdHNSZXMuanNvbigpKS5kYXRhPy5ob3N0cyB8fCBbXTtcbiAgICAgIGNvbnN0IGV2ZW50c0NvdW50ID0gKGF3YWl0IGV2ZW50c1Jlcy5qc29uKCkpLmRhdGE/LnRvdGFsIHx8IDA7XG5cbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwidG90YWxcIl0nKS50ZXh0Q29udGVudCA9IGAke2V2ZW50c0NvdW50fSBldmVudHMgKDI0aClgO1xuICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3NlYy1zdGF0cyBbZGF0YS1rZXk9XCJ3YXJuXCJdJykudGV4dENvbnRlbnQgPSBgJHtzdGF0cy5ieV9zZXZlcml0eT8ud2FybiB8fCAwfSB3YXJuaW5nc2A7XG4gICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjc2VjLXN0YXRzIFtkYXRhLWtleT1cImVycm9yXCJdJykudGV4dENvbnRlbnQgPSBgJHtzdGF0cy5ieV9zZXZlcml0eT8uZXJyb3IgfHwgMH0gZXJyb3JzYDtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwiZGVuaWVkXCJdJykudGV4dENvbnRlbnQgPSBgJHtzdGF0cy5ieV9vdXRjb21lPy5kZW5pZWQgfHwgMH0gZGVuaWVkYDtcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNzZWMtc3RhdHMgW2RhdGEta2V5PVwiaG9zdHNcIl0nKS50ZXh0Q29udGVudCA9IGAke2hvc3RzLmxlbmd0aH0gaG9zdHNgO1xuXG4gICAgICByZW5kZXJUb3BMaXN0KCdzZWMtdG9wLWFjdG9ycycsIHN0YXRzLnRvcF9hY3RvcnMgfHwgW10pO1xuICAgICAgcmVuZGVyVG9wTGlzdCgnc2VjLXRvcC10YXJnZXRzJywgc3RhdHMudG9wX3RhcmdldHMgfHwgW10pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybignW3NlY3VyaXR5XSByZWZyZXNoT3ZlcnZpZXcgZmFpbGVkOicsIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG4gIGZ1bmN0aW9uIHJlbmRlclRvcExpc3QoaWQsIGl0ZW1zKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gICAgaWYgKCFpdGVtcy5sZW5ndGgpIHsgZWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPk5vIGRhdGE8L2Rpdj4nOyByZXR1cm47IH1cbiAgICBlbC5pbm5lckhUTUwgPSAnPHRhYmxlIHN0eWxlPVwid2lkdGg6MTAwJTtmb250LXNpemU6MC44NXJlbTtcIj4nICtcbiAgICAgIGl0ZW1zLm1hcChpdCA9PiBgPHRyPjx0ZCBzdHlsZT1cInBhZGRpbmc6M3B4IDA7d29yZC1icmVhazpicmVhay1hbGw7XCI+JHtlc2NhcGVIdG1sKFN0cmluZyhpdC5rZXkpKX08L3RkPjx0ZCBzdHlsZT1cInRleHQtYWxpZ246cmlnaHQ7Y29sb3I6dmFyKC0tbXV0ZWQpO1wiPiR7aXQuY291bnR9PC90ZD48L3RyPmApLmpvaW4oJycpICtcbiAgICAgICc8L3RhYmxlPic7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IEVWRU5UUyA9PT09PT09PT09PT09XG4gIGNvbnN0IGZpbHRlclNvdXJjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtZmlsdGVyLXNvdXJjZScpO1xuICBjb25zdCBmaWx0ZXJTZXZlcml0eSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtZmlsdGVyLXNldmVyaXR5Jyk7XG4gIGNvbnN0IGZpbHRlckhvc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWZpbHRlci1ob3N0Jyk7XG4gIGNvbnN0IGZpbHRlckFjdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1maWx0ZXItYWN0b3InKTtcbiAgY29uc3QgcmVmcmVzaEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZWMtcmVmcmVzaC1idG4nKTtcblxuICBbZmlsdGVyU291cmNlLCBmaWx0ZXJTZXZlcml0eSwgZmlsdGVySG9zdF0uZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCByZWZyZXNoRXZlbnRzKSk7XG4gIGZpbHRlckFjdG9yLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZGVib3VuY2UocmVmcmVzaEV2ZW50cywgMjUwKSk7XG4gIHJlZnJlc2hCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZWZyZXNoRXZlbnRzKTtcblxuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoRXZlbnRzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICBwYXJhbXMuc2V0KCdsaW1pdCcsICcyMDAnKTtcbiAgICAgIGlmIChmaWx0ZXJTb3VyY2UudmFsdWUpICBwYXJhbXMuc2V0KCdzb3VyY2VfdHlwZScsIGZpbHRlclNvdXJjZS52YWx1ZSk7XG4gICAgICBpZiAoZmlsdGVyU2V2ZXJpdHkudmFsdWUpIHBhcmFtcy5zZXQoJ3NldmVyaXR5JywgZmlsdGVyU2V2ZXJpdHkudmFsdWUpO1xuICAgICAgaWYgKGZpbHRlckhvc3QudmFsdWUpICAgIHBhcmFtcy5zZXQoJ3NvdXJjZV9ob3N0JywgZmlsdGVySG9zdC52YWx1ZSk7XG4gICAgICBpZiAoZmlsdGVyQWN0b3IudmFsdWUpICAgcGFyYW1zLnNldCgnYWN0b3JfcHJlZml4JywgZmlsdGVyQWN0b3IudmFsdWUpO1xuXG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgL2FwaS92MS9zZWN1cml0eS9ldmVudHM/JHtwYXJhbXN9YCk7XG4gICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpLmRhdGE7XG4gICAgICBhbGxFdmVudHMgPSBkYXRhLmV2ZW50cyB8fCBbXTtcbiAgICAgIHJlbmRlckV2ZW50cygpO1xuXG4gICAgICAvLyBSZWZyZXNoIGhvc3QgZHJvcGRvd24gaWYgd2UgZG9uJ3QgaGF2ZSBpdCB5ZXRcbiAgICAgIGlmICghZmlsdGVySG9zdC5vcHRpb25zLmxlbmd0aCB8fCBmaWx0ZXJIb3N0Lm9wdGlvbnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGF3YWl0IHJlZnJlc2hIb3N0RmlsdGVyKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ldmVudHMtY29udGFpbmVyJykuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPkxvYWQgZmFpbGVkOiAnK2VzY2FwZUh0bWwoZS5tZXNzYWdlKSsnPC9kaXY+JztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJFdmVudHMoKSB7XG4gICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2VjLWV2ZW50cy1jb250YWluZXInKTtcbiAgICBpZiAoIWFsbEV2ZW50cy5sZW5ndGgpIHsgZWwuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJwYW5lbC1lbXB0eVwiPk5vIGV2ZW50czwvZGl2Pic7IHJldHVybjsgfVxuICAgIGVsLmlubmVySFRNTCA9IGFsbEV2ZW50cy5zbGljZSgwLCAyMDApLm1hcChyZW5kZXJFdmVudFJvdykuam9pbignJyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJFdmVudFJvdyhldikge1xuICAgIGNvbnN0IHNldiA9IGV2LnNldmVyaXR5IHx8ICdpbmZvJztcbiAgICBjb25zdCBzZXZDb2xvciA9IHtcbiAgICAgIGNyaXRpY2FsOiAnI2MwMzkyYicsIGVycm9yOiAnI2U3NGMzYycsIHdhcm46ICcjZjM5YzEyJyxcbiAgICAgIG5vdGljZTogJyMzNDk4ZGInLCBpbmZvOiAnIzdmOGM4ZCcsXG4gICAgfVtzZXZdIHx8ICcjN2Y4YzhkJztcbiAgICBjb25zdCB0aW1lID0gZXYudHMgPyBuZXcgRGF0ZShldi50cykudG9Mb2NhbGVUaW1lU3RyaW5nKCkgOiAnJztcbiAgICBjb25zdCBzb3VyY2UgPSBldi5zb3VyY2VfdHlwZSB8fCAnJztcbiAgICBjb25zdCBhY3RvciA9IGV2LmFjdG9yIHx8ICdcdTIwMTQnO1xuICAgIGNvbnN0IHRhcmdldCA9IGV2LnRhcmdldCB8fCAnJztcbiAgICBjb25zdCBhY3Rpb24gPSBldi5hY3Rpb24gfHwgJyc7XG4gICAgY29uc3Qgb3V0Y29tZSA9IGV2Lm91dGNvbWUgfHwgJyc7XG4gICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwic2VjLWV2ZW50LXJvd1wiIHN0eWxlPVwiZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtY29sdW1uczo4NHB4IDgwcHggMWZyIDFmciAxMDBweCA5MHB4O2dhcDo4cHg7cGFkZGluZzo1cHggOHB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Zm9udC1zaXplOjAuODJyZW07YWxpZ24taXRlbXM6Y2VudGVyO1wiPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjoke3NldkNvbG9yfTtmb250LXdlaWdodDo2MDA7XCI+JHtlc2NhcGVIdG1sKHNldil9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKHNvdXJjZSl9PC9zcGFuPlxuICAgICAgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwoYWN0b3IpfVwiIHN0eWxlPVwib3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7d2hpdGUtc3BhY2U6bm93cmFwO1wiPiR7ZXNjYXBlSHRtbChhY3Rvcil9PC9zcGFuPlxuICAgICAgPHNwYW4gdGl0bGU9XCIke2VzY2FwZUh0bWwodGFyZ2V0KX1cIiBzdHlsZT1cIm92ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3doaXRlLXNwYWNlOm5vd3JhcDtcIj4ke2VzY2FwZUh0bWwoYWN0aW9uKX0gJHtlc2NhcGVIdG1sKHRhcmdldCl9PC9zcGFuPlxuICAgICAgPHNwYW4gc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzVyZW07XCI+JHtlc2NhcGVIdG1sKG91dGNvbWUpfTwvc3Bhbj5cbiAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO2ZvbnQtc2l6ZTowLjc1cmVtO3RleHQtYWxpZ246cmlnaHQ7XCI+JHtlc2NhcGVIdG1sKHRpbWUpfTwvc3Bhbj5cbiAgICA8L2Rpdj5gO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVmcmVzaEhvc3RGaWx0ZXIoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJyk7XG4gICAgICBjb25zdCBob3N0cyA9IChhd2FpdCByZXMuanNvbigpKS5kYXRhPy5ob3N0cyB8fCBbXTtcbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBmaWx0ZXJIb3N0LnZhbHVlO1xuICAgICAgZmlsdGVySG9zdC5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT1cIlwiPkFsbCBob3N0czwvb3B0aW9uPicgK1xuICAgICAgICBob3N0cy5tYXAoaCA9PiBgPG9wdGlvbiB2YWx1ZT1cIiR7ZXNjYXBlSHRtbChoLmlkKX1cIj4ke2VzY2FwZUh0bWwoaC5sYWJlbCB8fCBoLmlkKX08L29wdGlvbj5gKS5qb2luKCcnKTtcbiAgICAgIGlmIChjdXJyZW50KSBmaWx0ZXJIb3N0LnZhbHVlID0gY3VycmVudDtcbiAgICB9IGNhdGNoIHt9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IEhPU1RTID09PT09PT09PT09PT1cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0LXJlZ2lzdGVyLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcmVnaXN0ZXJIb3N0UHJvbXB0KTtcbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0cy1yZWZyZXNoJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCByZWZyZXNoSG9zdHMpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hIb3N0cygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvc2VjdXJpdHkvaG9zdHMnKTtcbiAgICAgIGNvbnN0IGhvc3RzID0gKGF3YWl0IHJlcy5qc29uKCkpLmRhdGE/Lmhvc3RzIHx8IFtdO1xuICAgICAgYWxsSG9zdHMgPSBob3N0cztcbiAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0cy1jb250YWluZXInKTtcbiAgICAgIGlmICghaG9zdHMubGVuZ3RoKSB7IGVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwicGFuZWwtZW1wdHlcIj5ObyBob3N0cyByZWdpc3RlcmVkLiBDbGljayBcdTI3OTUgUmVnaXN0ZXIgSG9zdCB0byBhZGQgb25lLjwvZGl2Pic7IHJldHVybjsgfVxuICAgICAgZWwuaW5uZXJIVE1MID0gaG9zdHMubWFwKGggPT4ge1xuICAgICAgICBjb25zdCBzdGF0dXMgPSAhaC5lbmFibGVkID8gJ1x1RDgzRFx1REQzNCBkaXNhYmxlZCdcbiAgICAgICAgICAgICAgICAgICAgIDogIWgubGFzdF9zZWVuX2F0ID8gJ1x1MjZBQSByZWdpc3RlcmVkJ1xuICAgICAgICAgICAgICAgICAgICAgOiAoRGF0ZS5ub3coKSAtIERhdGUucGFyc2UoaC5sYXN0X3NlZW5fYXQpID4gMzAqNjAqMTAwMCkgPyAnXHVEODNEXHVERkUxIHN0YWxlJ1xuICAgICAgICAgICAgICAgICAgICAgOiAnXHVEODNEXHVERkUyIG9ubGluZSc7XG4gICAgICAgIHJldHVybiBgPGRpdiBzdHlsZT1cInBhZGRpbmc6MTBweCAxMnB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHN0cm9uZz4ke2VzY2FwZUh0bWwoaC5sYWJlbCB8fCBoLmlkKX08L3N0cm9uZz5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1sZWZ0OjhweDtmb250LXNpemU6MC44cmVtO1wiPiR7ZXNjYXBlSHRtbChoLnR5cGUpfTwvc3Bhbj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJjb2xvcjp2YXIoLS1tdXRlZCk7Zm9udC1zaXplOjAuNzhyZW07bWFyZ2luLXRvcDoycHg7XCI+XG4gICAgICAgICAgICAgIGlkOiAke2VzY2FwZUh0bWwoaC5pZCl9IFx1MDBCN1xuICAgICAgICAgICAgICByZWdpc3RlcmVkICR7bmV3IERhdGUoaC5yZWdpc3RlcmVkX2F0KS50b0xvY2FsZURhdGVTdHJpbmcoKX0gXHUwMEI3XG4gICAgICAgICAgICAgIGxhc3Qgc2VlbiAke2gubGFzdF9zZWVuX2F0ID8gbmV3IERhdGUoaC5sYXN0X3NlZW5fYXQpLnRvTG9jYWxlU3RyaW5nKCkgOiAnbmV2ZXInfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZm9udC1zaXplOjAuODVyZW07bWFyZ2luLXJpZ2h0OjEycHg7XCI+JHtzdGF0dXN9PC9zcGFuPlxuICAgICAgICAgICAgJHtoLmlkID09PSAnc2VsZicgPyAnJyA6IGA8YnV0dG9uIGNsYXNzPVwiYnRuLXNtIHNlYy1ob3N0LWRlbFwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwoaC5pZCl9XCIgc3R5bGU9XCJjb2xvcjp2YXIoLS1iYWQtZmcpO1wiPlJlbW92ZTwvYnV0dG9uPmB9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PmA7XG4gICAgICB9KS5qb2luKCcnKTtcblxuICAgICAgZWwucXVlcnlTZWxlY3RvckFsbCgnLnNlYy1ob3N0LWRlbCcpLmZvckVhY2goYnRuID0+IHtcbiAgICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmICghY29uZmlybShgUmVtb3ZlIGhvc3QgJHtidG4uZGF0YXNldC5pZH0/IEV2ZW50cyBhbHJlYWR5IHJlY2VpdmVkIHdpbGwgcmVtYWluIGluIHRoZSBzdG9yZS5gKSkgcmV0dXJuO1xuICAgICAgICAgIGF3YWl0IGZldGNoKGAvYXBpL3YxL3NlY3VyaXR5L2hvc3RzLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGJ0bi5kYXRhc2V0LmlkKX1gLCB7IG1ldGhvZDogJ0RFTEVURScgfSk7XG4gICAgICAgICAgcmVmcmVzaEhvc3RzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NlYy1ob3N0cy1jb250YWluZXInKS5pbm5lckhUTUwgPSAnPGRpdiBjbGFzcz1cInBhbmVsLWVtcHR5XCI+TG9hZCBmYWlsZWQ6ICcrZXNjYXBlSHRtbChlLm1lc3NhZ2UpKyc8L2Rpdj4nO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZ2lzdGVySG9zdFByb21wdCgpIHtcbiAgICBjb25zdCBpZCA9IHByb21wdCgnSG9zdCBpZCAobG93ZXJjYXNlLCBubyBzcGFjZXMpOicpO1xuICAgIGlmICghaWQpIHJldHVybjtcbiAgICBjb25zdCBsYWJlbCA9IHByb21wdCgnRGlzcGxheSBsYWJlbDonLCBpZCkgfHwgaWQ7XG4gICAgY29uc3QgdHlwZSAgPSBwcm9tcHQoJ1R5cGUgKFwiZGFzaGNhZGR5XCIsIFwic2VydmljZVwiLCBvciBcImFnZW50XCIpOicsICdhZ2VudCcpIHx8ICdhZ2VudCc7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NlY3VyaXR5L2hvc3RzJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgaWQsIGxhYmVsLCB0eXBlIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgIGlmICghcmVzLm9rKSB7IGFsZXJ0KCdGYWlsZWQ6ICcgKyAoZGF0YT8uZXJyb3I/Lm1lc3NhZ2UgfHwgcmVzLnN0YXR1c1RleHQpKTsgcmV0dXJuOyB9XG4gICAgICAvLyBTaG93IHRoZSBhcGlfa2V5IE9OQ0UgaW4gYSBkaWFsb2dcbiAgICAgIGFsZXJ0KGBcdTI3MDUgSG9zdCByZWdpc3RlcmVkIVxcblxcbmlkOiAke2RhdGEuZGF0YS5ob3N0LmlkfVxcbmxhYmVsOiAke2RhdGEuZGF0YS5ob3N0LmxhYmVsfVxcbnR5cGU6ICR7ZGF0YS5kYXRhLmhvc3QudHlwZX1cXG5cXG5cdUQ4M0RcdUREMTEgQVBJIEtFWSAoc2F2ZSB0aGlzIE5PVyBcdTIwMTQgd29uJ3QgYmUgc2hvd24gYWdhaW4pOlxcblxcbiR7ZGF0YS5kYXRhLmFwaV9rZXl9XFxuXFxuU2VuZCB0aGlzIGtleSBhczogQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhcGlfa2V5PlxcblRvIGVuZHBvaW50OiBQT1NUIC9hcGkvdjEvc2VjdXJpdHkvZXZlbnRzL2luZ2VzdCBvciAvZXZlbnRzL2JhdGNoYCk7XG4gICAgICByZWZyZXNoSG9zdHMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBhbGVydCgnRmFpbGVkOiAnICsgZS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09IEhFTFBFUlMgPT09PT09PT09PT09PVxuICBmdW5jdGlvbiBlc2NhcGVIdG1sKHMpIHtcbiAgICByZXR1cm4gU3RyaW5nKHMpLnJlcGxhY2UoL1smPD5cIiddL2csIGMgPT4gKHsnJic6JyZhbXA7JywnPCc6JyZsdDsnLCc+JzonJmd0OycsJ1wiJzonJnF1b3Q7JyxcIidcIjonJiMzOTsnfVtjXSkpO1xuICB9XG4gIGZ1bmN0aW9uIGRlYm91bmNlKGZuLCBtcykge1xuICAgIGxldCB0OyByZXR1cm4gZnVuY3Rpb24oKSB7IGNsZWFyVGltZW91dCh0KTsgdCA9IHNldFRpbWVvdXQoKCkgPT4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSwgbXMpOyB9O1xuICB9XG59KSgpOztcbi8vID09PT09PT09PT0gU0hJUERFQ0sgREVQTE9ZUyAoREMtMTMwKSA9PT09PT09PT09XG4vLyBTb3VyY2UgZGVwbG95cyBwYW5lbDogZHJpdmVzIHRoZSBzaGlwZGVjayBDTEkgdmlhIHRoZSBEYXNoQ2FkZHlcbi8vIC9hcGkvdjEvZGVwbG95cyBicmlkZ2UgcHJveHkuIE1vZGFsIGxpc3RzIGRlcGxveWFibGUgcmVwb3MgKyBkZXBsb3llZFxuLy8gc2VydmljZXMsIHNob3dzIHRoZSBqb3VybmFsLCBhbmQgcnVucyBkZXBsb3kvcm9sbGJhY2sgd2l0aCBsaXZlIG91dHB1dC5cbi8vXG4vLyBGb2xsb3dzIHRoZSBzZWN1cml0eS1jZW50ZXIuanMgbW9kYWwgcGF0dGVybiAoaW5qZWN0TW9kYWwgKyBidXR0b24gaW4gdGhlXG4vLyB0b3AgYmFyKSBhbmQgdGhlIHdlYXRoZXItbW9kYWwgdmlzdWFsIGxhbmd1YWdlLlxuXG4vLyBEQy0xMzM6IHB1cmUgcmVwby1vcHRpb24gYnVpbGRlci4gUmVtb3RlIEdpdGVhIGZpZWxkcyBhcmUgVU5UUlVTVEVEIChhXG4vLyBob3N0aWxlIGluc3RhbmNlIGNvbnRyb2xzIGZ1bGxfbmFtZS9kZXNjcmlwdGlvbi91cmwpLCBzbyBldmVyeVxuLy8gaW50ZXJwb2xhdGVkIHZhbHVlIG11c3QgYmUgSFRNTC1lc2NhcGVkIGJlZm9yZSBpbm5lckhUTUwuIEV4cG9zZWQgb25cbi8vIHdpbmRvdyBzbyBzdGF0dXMvdGVzdHMgY2FuIHBpbiB0aGUgZXNjYXBpbmcgd2l0aCBob3N0aWxlIHBheWxvYWRzLlxud2luZG93Ll9fZGMxMzNfYnVpbGRSZXBvT3B0aW9ucyA9IGZ1bmN0aW9uIChyZXBvcywgZXNjRm4pIHtcbiAgdmFyIGUgPSBlc2NGbiB8fCBmdW5jdGlvbiAocykge1xuICAgIHJldHVybiBTdHJpbmcocykucmVwbGFjZSgvWyY8PlwiJ10vZywgZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiB7ICcmJzogJyZhbXA7JywgJzwnOiAnJmx0OycsICc+JzogJyZndDsnLCAnXCInOiAnJnF1b3Q7JywgXCInXCI6ICcmIzM5OycgfVtjXTtcbiAgICB9KTtcbiAgfTtcbiAgcmV0dXJuICc8b3B0aW9uIHZhbHVlPVwiXCI+XHUyMDE0IGNob29zZSBhIHJlcG8gXHUyMDE0PC9vcHRpb24+JyArXG4gICAgKHJlcG9zIHx8IFtdKS5tYXAoZnVuY3Rpb24gKHIpIHtcbiAgICAgIHJldHVybiAnPG9wdGlvbiB2YWx1ZT1cIicgKyBlKHIudXJsKSArICdcIiBkYXRhLWlkPVwiJyArIGUoci5pZCkgKyAnXCI+JyArXG4gICAgICAgIGUoci5mdWxsX25hbWUpICsgKHIuZGVzY3JpcHRpb24gPyAnIFx1MjAxNCAnICsgZShyLmRlc2NyaXB0aW9uKSA6ICcnKSArICc8L29wdGlvbj4nO1xuICAgIH0pLmpvaW4oJycpO1xufTtcblxuLy8gVGhyZWUtc3RhdGUgdG9rZW4gc2VtYW50aWNzLCBleHBvc2VkIGZvciBWTSB0ZXN0czpcbi8vIGFub255bW91cz10cnVlIC0+IGV4cGxpY2l0IGVtcHR5OyB0eXBlZCB2YWx1ZSAtPiB0b2tlbjsgbmVpdGhlciAtPiBvbWl0dGVkLlxud2luZG93Ll9fZGMxMzNfcmVxdWVzdFRva2VuID0gZnVuY3Rpb24gKGFub255bW91cywgdHlwZWQpIHtcbiAgaWYgKGFub255bW91cykgcmV0dXJuICcnO1xuICB2YXIgdCA9IFN0cmluZyh0eXBlZCB8fCAnJykudHJpbSgpO1xuICByZXR1cm4gdCB8fCB1bmRlZmluZWQ7XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICBpbmplY3RNb2RhbCgnZGVwbG95cy1tb2RhbCcsIGA8ZGl2IGlkPVwiZGVwbG95cy1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDogODYwcHg7IG1heC13aWR0aDogMTIwMHB4O1wiPlxuICAgICAgPGgzPlx1RDgzRFx1REU5QSBEZXBsb3lzPC9oMz5cbiAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5cbiAgICAgICAgU291cmNlIGRlcGxveXMgdmlhIHNoaXBkZWNrOiBidWlsZCBcdTIxOTIgcGFja2FnZSBcdTIxOTIgc3lzdGVtZCByZWxlYXNlIFx1MjE5MiBDYWRkeSBnYXRlIFx1MjE5MiBETlMgXHUyMTkyIHZlcmlmeS5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBjbGFzcz1cInNlYy10YWJzXCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDttYXJnaW4tYm90dG9tOjE0cHg7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRlcC10YWIgYWN0aXZlXCIgZGF0YS10YWI9XCJzZXJ2aWNlc1wiPlNlcnZpY2VzPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJkZXAtdGFiXCIgZGF0YS10YWI9XCJkZXBsb3lcIj5EZXBsb3k8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImRlcC10YWJcIiBkYXRhLXRhYj1cImpvdXJuYWxcIj5Kb3VybmFsPC9idXR0b24+PGJ1dHRvbiBjbGFzcz1cImRlcC10YWJcIiBkYXRhLXRhYj1cImluc3RhbGxcIj5JbnN0YWxsPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTRVJWSUNFUyBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGVwLXBhbmVsXCIgZGF0YS1wYW5lbD1cInNlcnZpY2VzXCI+XG4gICAgICAgIDxkaXYgaWQ9XCJkZXAtc2VydmljZXNcIiBjbGFzcz1cInNjcm9sbC1jb250YWluZXJcIiBzdHlsZT1cIm1heC1oZWlnaHQ6MzIwcHg7XCI+TG9hZGluZ1x1MjAyNjwvZGl2PlxuICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O2Rpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJkZXAtc3RhdHVzLW5hbWVcIiBwbGFjZWhvbGRlcj1cInNlcnZpY2UgbmFtZVwiIHN0eWxlPVwid2lkdGg6MjIwcHg7XCIgLz5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgaWQ9XCJkZXAtc3RhdHVzLWJ0blwiPkNoZWNrIHN0YXR1czwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIERFUExPWSBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGVwLXBhbmVsXCIgZGF0YS1wYW5lbD1cImRlcGxveVwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206MTBweDtcIj5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwiZGVwLXJlcG8tc2VsZWN0XCIgc3R5bGU9XCJtaW4td2lkdGg6MjgwcHg7XCI+PG9wdGlvbj5Mb2FkaW5nXHUyMDI2PC9vcHRpb24+PC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIGlkPVwiZGVwLWRlcGxveS1idG5cIj5EZXBsb3k8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwIGNsYXNzPVwibW9kYWwtc3VidGl0bGVcIj5EZXBsb3lzIGFyZSBzZXJpYWxpemVkIGZsZWV0LXNpZGU7IGEgcnVuIHRha2VzIH4zMC02MHMuIE91dHB1dCBzdHJlYW1zIGJlbG93IHdoZW4gaXQgZmluaXNoZXMuPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gSk9VUk5BTCBUQUIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGVwLXBhbmVsXCIgZGF0YS1wYW5lbD1cImpvdXJuYWxcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6OHB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICAgICAgPGlucHV0IGlkPVwiZGVwLWpvdXJuYWwtbmFtZVwiIHBsYWNlaG9sZGVyPVwic2VydmljZSAoZW1wdHkgPSBhbGwpXCIgc3R5bGU9XCJ3aWR0aDoyMjBweDtcIiAvPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG5cIiBpZD1cImRlcC1qb3VybmFsLWJ0blwiPlJlZnJlc2g8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJkZXAtam91cm5hbFwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwibWF4LWhlaWdodDozMjBweDtcIj5Mb2FkaW5nXHUyMDI2PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBJTlNUQUxMIFRBQiAoREMtMTMxKSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJkZXAtcGFuZWxcIiBkYXRhLXBhbmVsPVwiaW5zdGFsbFwiIHN0eWxlPVwiZGlzcGxheTpub25lO1wiPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpncmlkO2dhcDoxMHB4O21heC13aWR0aDo2NDBweDtcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpncmlkO2dhcDo0cHg7XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1vZGFsLXN1YnRpdGxlXCIgc3R5bGU9XCJtYXJnaW46MDtcIj5HaXRlYSBzZXJ2ZXIgKGFueSBpbnN0YW5jZSk8L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7XCI+XG4gICAgICAgICAgICAgIDxpbnB1dCBpZD1cImRlcC1naC1naXRlYS1ob3N0XCIgcGxhY2Vob2xkZXI9XCJnaXQuZGFzaGNhZGR5Lm5ldCAoZGVmYXVsdClcIiBzdHlsZT1cImZsZXg6MTtcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIiAvPlxuICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJkZXAtZ2gtZ2l0ZWEtdG9rZW5cIiB0eXBlPVwicGFzc3dvcmRcIiBwbGFjZWhvbGRlcj1cInRva2VuIChwcml2YXRlIHJlcG9zKVwiIHN0eWxlPVwiZmxleDoxO1wiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O2FsaWduLWl0ZW1zOmNlbnRlcjtmb250LXNpemU6MTJweDtcIj5cbiAgICAgICAgICAgICAgPGlucHV0IGlkPVwiZGVwLWdoLWFub255bW91c1wiIHR5cGU9XCJjaGVja2JveFwiIC8+XG4gICAgICAgICAgICAgIEFub255bW91cyBcdTIwMTQgaWdub3JlIHRoZSBzYXZlZCBmbGVldCB0b2tlbiBmb3IgdGhpcyByZXF1ZXN0XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6NHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7XCI+UGljayBhIHJlcG88L3NwYW4+XG4gICAgICAgICAgICA8c2VsZWN0IGlkPVwiZGVwLWdoLWdpdGVhXCIgc3R5bGU9XCJtaW4td2lkdGg6MjgwcHg7XCI+PG9wdGlvbiB2YWx1ZT1cIlwiPkxvYWRpbmdcdTIwMjY8L29wdGlvbj48L3NlbGVjdD5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6NHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7XCI+XHUyMDI2b3IgcGFzdGUgYW55IHJlcG8gVVJMIChHaXRIdWIsIEdpdGVhLCBvciBhbnkgaHR0cHMgZ2l0IGhvc3QpPC9zcGFuPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwiZGVwLWdoLXVybFwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9ob3N0L293bmVyL3JlcG9cIiBzdHlsZT1cIndpZHRoOjEwMCU7XCIgLz5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6NHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7XCI+TmFtZSAodXNlZCBhcyBzdWJkb21haW47IGNhcmQgdGl0bGUgZmFsbHMgYmFjayB0byByZXBvIG5hbWUpPC9zcGFuPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwiZGVwLWdoLXNlcnZpY2VcIiBwbGFjZWhvbGRlcj1cIm15LWFwcFwiIHN0eWxlPVwid2lkdGg6MjIwcHg7XCIgLz5cbiAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6Z3JpZDtnYXA6NHB4O1wiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7XCI+T3B0aW9uYWwgbGF1bmNoIGFyZ3MgKHNwYWNlLXNlcGFyYXRlZCBzaW1wbGUgdG9rZW5zLCBlLmcuIC10ZXh0IGhpKTwvc3Bhbj5cbiAgICAgICAgICAgIDxpbnB1dCBpZD1cImRlcC1naC1hcmdzXCIgcGxhY2Vob2xkZXI9XCItdGV4dCBoZWxsb1wiIHN0eWxlPVwid2lkdGg6MTAwJTtcIiAvPlxuICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgPHAgY2xhc3M9XCJtb2RhbC1zdWJ0aXRsZVwiIHN0eWxlPVwibWFyZ2luOjA7XCI+XG4gICAgICAgICAgICBHbyByZXBvcyB3aXRoIGEgbWFpbiBwYWNrYWdlIGluc3RhbGwgYXV0b21hdGljYWxseTogYnVpbGQsIHN5c3RlbWQgcmVsZWFzZSxcbiAgICAgICAgICAgIENhZGR5IGdhdGUgKHRhaWxuZXQtb25seSksIEROUywgdmVyaWZ5LCBkYXNoYm9hcmQgY2FyZC4gVGFrZXMgfjMwLTYwcy5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGRpdj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgaWQ9XCJkZXAtZ2gtYnRuXCI+SW5zdGFsbDwvYnV0dG9uPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPCEtLSBPVVRQVVQgLS0+XG4gICAgICA8cHJlIGlkPVwiZGVwLW91dHB1dFwiIGNsYXNzPVwic2Nyb2xsLWNvbnRhaW5lclwiIHN0eWxlPVwiZGlzcGxheTpub25lO21heC1oZWlnaHQ6MjYwcHg7bWFyZ2luLXRvcDoxMnB4O2JhY2tncm91bmQ6dmFyKC0tYmctMiwjMTExKTtwYWRkaW5nOjEwcHg7Ym9yZGVyLXJhZGl1czo4cHg7d2hpdGUtc3BhY2U6cHJlLXdyYXA7XCI+PC9wcmU+XG5cbiAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO2dhcDo4cHg7bWFyZ2luLXRvcDoxNHB4O1wiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuXCIgaWQ9XCJkZXAtY2xvc2VcIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PmApO1xuXG4gIGNvbnN0ICQgPSAoaWQpID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgbGV0IG9wZW5CdG4gPSBudWxsO1xuICBsZXQgbG9hZGVkT25jZSA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGVzYyhzKSB7XG4gICAgcmV0dXJuIHdpbmRvdy5lc2NhcGVIdG1sID8gd2luZG93LmVzY2FwZUh0bWwoU3RyaW5nKHMpKSA6IFN0cmluZyhzKS5yZXBsYWNlKC9bJjw+XCInXS9nLCAoYykgPT4gKHsnJic6JyZhbXA7JywnPCc6JyZsdDsnLCc+JzonJmd0OycsJ1wiJzonJnF1b3Q7JyxcIidcIjonJiMzOTsnfVtjXSkpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gYXBpKHBhdGgsIG9wdHMpIHtcbiAgICBjb25zdCByID0gYXdhaXQgZmV0Y2goJy9kYXNoY2FkZHktYXBpL2FwaS92MS9kZXBsb3lzJyArIHBhdGgsIE9iamVjdC5hc3NpZ24oeyBjcmVkZW50aWFsczogJ2luY2x1ZGUnIH0sIG9wdHMgfHwge30pKTtcbiAgICBsZXQgYm9keSA9IG51bGw7XG4gICAgdHJ5IHsgYm9keSA9IGF3YWl0IHIuanNvbigpOyB9IGNhdGNoIChlKSB7IGJvZHkgPSB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ25vbi1KU09OIHJlc3BvbnNlJyB9OyB9XG4gICAgcmV0dXJuIHsgc3RhdHVzOiByLnN0YXR1cywgYm9keSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gc2hvd091dHB1dCh0ZXh0KSB7XG4gICAgY29uc3QgZWwgPSAkKCdkZXAtb3V0cHV0Jyk7XG4gICAgZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgZWwudGV4dENvbnRlbnQgPSB0ZXh0IHx8ICcobm8gb3V0cHV0KSc7XG4gICAgZWwuc2Nyb2xsVG9wID0gZWwuc2Nyb2xsSGVpZ2h0O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFNlcnZpY2VzKCkge1xuICAgIGNvbnN0IGVsID0gJCgnZGVwLXNlcnZpY2VzJyk7XG4gICAgY29uc3QgeyBib2R5IH0gPSBhd2FpdCBhcGkoJy9zZXJ2aWNlcycpO1xuICAgIGlmICghYm9keS5zdWNjZXNzKSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSAnPGVtPicgKyBlc2MoYm9keS5lcnJvciB8fCAndW5hdmFpbGFibGUnKSArICc8L2VtPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJvd3MgPSBib2R5LnNlcnZpY2VzIHx8IFtdO1xuICAgIGlmICghcm93cy5sZW5ndGgpIHtcbiAgICAgIGVsLmlubmVySFRNTCA9ICc8ZW0+Tm8gc2hpcGRlY2sgZGVwbG95bWVudHMgb24gcmVjb3JkIHlldC48L2VtPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsLmlubmVySFRNTCA9ICc8dGFibGUgY2xhc3M9XCJ0YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj48dGhlYWQ+PHRyPicgK1xuICAgICAgJzx0aD5TZXJ2aWNlPC90aD48dGg+TGFzdCBhY3Rpb248L3RoPjx0aD5XaGVuPC90aD48dGg+UmVsZWFzZTwvdGg+PHRoPjwvdGg+JyArXG4gICAgICAnPC90cj48L3RoZWFkPjx0Ym9keT4nICtcbiAgICAgIHJvd3MubWFwKChzKSA9PlxuICAgICAgICAnPHRyPicgK1xuICAgICAgICAnPHRkPjxzdHJvbmc+JyArIGVzYyhzLm5hbWUpICsgJzwvc3Ryb25nPjwvdGQ+JyArXG4gICAgICAgICc8dGQ+JyArIGVzYyhzLmxhc3RfYWN0aW9uKSArICc8L3RkPicgK1xuICAgICAgICAnPHRkPicgKyBlc2Mocy5sYXN0X3RpbWUpICsgJzwvdGQ+JyArXG4gICAgICAgICc8dGQ+JyArIGVzYyhzLmxhc3RfZXBvY2gpICsgJzwvdGQ+JyArXG4gICAgICAgICc8dGQ+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gZGVwLXJvbGxiYWNrXCIgZGF0YS1zZXJ2aWNlPVwiJyArIGVzYyhzLm5hbWUpICsgJ1wiPlJvbGxiYWNrPC9idXR0b24+ICcgK1xuICAgICAgICAnPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gZGVwLXN0YXR1c1wiIGRhdGEtc2VydmljZT1cIicgKyBlc2Mocy5uYW1lKSArICdcIj5TdGF0dXM8L2J1dHRvbj48L3RkPicgK1xuICAgICAgICAnPC90cj4nXG4gICAgICApLmpvaW4oJycpICsgJzwvdGJvZHk+PC90YWJsZT4nO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZFJlcG9zKCkge1xuICAgIGNvbnN0IHNlbCA9ICQoJ2RlcC1yZXBvLXNlbGVjdCcpO1xuICAgIGNvbnN0IHsgYm9keSB9ID0gYXdhaXQgYXBpKCcvcmVwb3MnKTtcbiAgICBpZiAoIWJvZHkuc3VjY2Vzcykge1xuICAgICAgc2VsLmlubmVySFRNTCA9ICc8b3B0aW9uPicgKyBlc2MoYm9keS5lcnJvciB8fCAndW5hdmFpbGFibGUnKSArICc8L29wdGlvbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCByZXBvcyA9IGJvZHkucmVwb3MgfHwgW107XG4gICAgc2VsLmlubmVySFRNTCA9IHJlcG9zLmxlbmd0aFxuICAgICAgPyByZXBvcy5tYXAoKHIpID0+ICc8b3B0aW9uIHZhbHVlPVwiJyArIGVzYyhyLmRpcikgKyAnXCI+JyArIGVzYyhyLm5hbWUpICsgJzwvb3B0aW9uPicpLmpvaW4oJycpXG4gICAgICA6ICc8b3B0aW9uIHZhbHVlPVwiXCI+KG5vIHJlcG9zIHdpdGggYSBTaGlwZGVja2ZpbGUgZm91bmQpPC9vcHRpb24+JztcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRKb3VybmFsKHNlcnZpY2UpIHtcbiAgICBjb25zdCBlbCA9ICQoJ2RlcC1qb3VybmFsJyk7XG4gICAgY29uc3QgcXMgPSBzZXJ2aWNlID8gJz9zZXJ2aWNlPScgKyBlbmNvZGVVUklDb21wb25lbnQoc2VydmljZSkgOiAnJztcbiAgICBjb25zdCB7IGJvZHkgfSA9IGF3YWl0IGFwaSgnL2pvdXJuYWwnICsgcXMpO1xuICAgIGNvbnN0IHJvd3MgPSAoYm9keS5yb3dzIHx8IFtdKTtcbiAgICBpZiAoIXJvd3MubGVuZ3RoKSB7XG4gICAgICBlbC5pbm5lckhUTUwgPSAnPGVtPk5vIGpvdXJuYWwgcm93cy48L2VtPic7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsLmlubmVySFRNTCA9ICc8dGFibGUgY2xhc3M9XCJ0YWJsZVwiIHN0eWxlPVwid2lkdGg6MTAwJTtcIj48dGhlYWQ+PHRyPicgK1xuICAgICAgJzx0aD5UaW1lPC90aD48dGg+U2VydmljZTwvdGg+PHRoPkFjdGlvbjwvdGg+PHRoPlJlbGVhc2U8L3RoPjx0aD5EdXJhdGlvbjwvdGg+JyArXG4gICAgICAnPC90cj48L3RoZWFkPjx0Ym9keT4nICtcbiAgICAgIHJvd3MubWFwKChyKSA9PlxuICAgICAgICAnPHRyPjx0ZD4nICsgZXNjKHIudGltZSkgKyAnPC90ZD48dGQ+JyArIGVzYyhyLnNlcnZpY2UpICsgJzwvdGQ+PHRkPicgKyBlc2Moci5hY3Rpb24pICtcbiAgICAgICAgJzwvdGQ+PHRkPicgKyBlc2Moci5lcG9jaCkgKyAnPC90ZD48dGQ+JyArIGVzYyhyLmR1cmF0aW9uIHx8ICdcdTIwMTQnKSArICc8L3RkPjwvdHI+J1xuICAgICAgKS5qb2luKCcnKSArICc8L3Rib2R5PjwvdGFibGU+JztcbiAgfVxuXG5cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkR2l0ZWFSZXBvcygpIHtcbiAgICBjb25zdCBzZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLWdpdGVhJyk7XG4gICAgY29uc3QgaG9zdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcC1naC1naXRlYS1ob3N0Jyk7XG4gICAgY29uc3QgdG9rRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLWdpdGVhLXRva2VuJyk7XG4gICAgY29uc3QgYW5vbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcC1naC1hbm9ueW1vdXMnKTtcbiAgICBjb25zdCBwYXlsb2FkID0ge307XG4gICAgaWYgKGhvc3RFbCAmJiBob3N0RWwudmFsdWUudHJpbSgpKSBwYXlsb2FkLmdpdGVhX3VybCA9ICdodHRwczovLycgKyBob3N0RWwudmFsdWUudHJpbSgpLnJlcGxhY2UoL15odHRwcz86XFwvKi8sICcnKTtcbiAgICAvLyBEaXN0aW5ndWlzaCBvbWl0dGVkIChmbGVldCBmYWxsYmFjayBhbGxvd2VkKSBmcm9tIGV4cGxpY2l0IGFub255bW91c1xuICAgIC8vIChlbXB0eSB0b2tlbiBwcmVzZXJ2ZWQgb24gd2lyZSkuIEEgbm9uLWVtcHR5IHVzZXIgdG9rZW4gd2lucy5cbiAgICBpZiAoYW5vbkVsICYmIGFub25FbC5jaGVja2VkKSBwYXlsb2FkLnRva2VuID0gJyc7XG4gICAgZWxzZSB7XG4gICAgICBjb25zdCB0ID0gd2luZG93Ll9fZGMxMzNfcmVxdWVzdFRva2VuKGZhbHNlLCB0b2tFbCAmJiB0b2tFbC52YWx1ZSk7XG4gICAgICBpZiAodCAhPT0gdW5kZWZpbmVkKSBwYXlsb2FkLnRva2VuID0gdDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgc3RhdHVzLCBib2R5IH0gPSBhd2FpdCBhcGkoJy9naXRlYS1yZXBvcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShwYXlsb2FkKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFib2R5LnN1Y2Nlc3MgfHwgIShib2R5LnJlcG9zIHx8IFtdKS5sZW5ndGgpIHtcbiAgICAgICAgc2VsLmlubmVySFRNTCA9ICc8b3B0aW9uIHZhbHVlPVwiXCI+JyArIGVzYyhib2R5LmVycm9yIHx8ICdubyByZXBvcyBmb3VuZCcpICsgJzwvb3B0aW9uPic7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIEFsbCByZW1vdGUgZmllbGRzIGFyZSB1bnRydXN0ZWQgKGhvc3RpbGUgR2l0ZWEgaW5zdGFuY2Ugb3IgcmVwb1xuICAgICAgLy8gbWV0YWRhdGEpIFx1MjAxNCBidWlsZCBvcHRpb25zIHRocm91Z2ggdGhlIGVzY2FwaW5nIGhlbHBlciAocGlubmVkIGJ5XG4gICAgICAvLyBzdGF0dXMvdGVzdHMvZGVwbG95cy1pbnN0YWxsLnRlc3QuanMpLlxuICAgICAgc2VsLmlubmVySFRNTCA9IHdpbmRvdy5fX2RjMTMzX2J1aWxkUmVwb09wdGlvbnMoYm9keS5yZXBvcywgZXNjKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZWwuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj51bmF2YWlsYWJsZTwvb3B0aW9uPic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcnVuSW5zdGFsbCgpIHtcbiAgICBjb25zdCBidG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLWJ0bicpO1xuICAgIGNvbnN0IHJlcG9VcmwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLXVybCcpLnZhbHVlLnRyaW0oKTtcbiAgICBjb25zdCBzZXJ2aWNlID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXAtZ2gtc2VydmljZScpLnZhbHVlLnRyaW0oKSB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBhcmdzUmF3ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcC1naC1hcmdzJykudmFsdWUudHJpbSgpO1xuICAgIGlmICghcmVwb1VybCB8fCAhc2VydmljZSkgeyBzaG93T3V0cHV0KCdSZXBvIFVSTCBhbmQgbmFtZSBhcmUgcmVxdWlyZWQuJyk7IHJldHVybjsgfVxuICAgIGNvbnN0IGFyZ3MgPSBhcmdzUmF3ID8gYXJnc1Jhdy5zcGxpdCgvXFxzKy8pIDogW107XG4gICAgc2V0QnVzeSh0cnVlLCBidG4sICdJbnN0YWxsJyk7XG4gICAgc2hvd091dHB1dCgnSW5zdGFsbGluZyAnICsgcmVwb1VybCArICdcXG5DbG9uaW5nLCBidWlsZGluZywgZ2F0aW5nIGFuZCBETlMtaW5nLi4uICh+MzAtNjBzKScpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhbm9ueW1vdXMgPSAhIShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLWFub255bW91cycpIHx8IHt9KS5jaGVja2VkO1xuICAgICAgY29uc3QgdHlwZWRUb2tlbiA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLWdpdGVhLXRva2VuJykgfHwgeyB2YWx1ZTogJycgfSkudmFsdWU7XG4gICAgICBjb25zdCByZXF1ZXN0VG9rZW4gPSB3aW5kb3cuX19kYzEzM19yZXF1ZXN0VG9rZW4oYW5vbnltb3VzLCB0eXBlZFRva2VuKTtcbiAgICAgIGNvbnN0IHsgc3RhdHVzLCBib2R5IH0gPSBhd2FpdCBhcGkoJy9pbnN0YWxsJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcmVwb191cmw6IHJlcG9VcmwsIHNlcnZpY2UsIGFyZ3MsXG4gICAgICAgICAgdG9rZW46IHJlcXVlc3RUb2tlbiB9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKCFib2R5LnN1Y2Nlc3MpIHtcbiAgICAgICAgc2hvd091dHB1dCgoYm9keS5vdXRwdXQgPyBib2R5Lm91dHB1dCArICdcXG4nIDogJycpICsgJ0ZBSUwgJyArIChib2R5LmVycm9yIHx8ICgnSFRUUCAnICsgc3RhdHVzKSkpO1xuICAgICAgICBzZXRCdXN5KGZhbHNlLCBidG4sICdJbnN0YWxsJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN2YyA9IGJvZHkuc2VydmljZSB8fCB7fTtcbiAgICAgIGNvbnN0IGV4aXN0cyA9ICh3aW5kb3cuQVBQUyB8fCBbXSkuc29tZSgoYSkgPT4gYS5pZCA9PT0gc3ZjLmlkKTtcbiAgICAgIGlmICghZXhpc3RzKSB7XG4gICAgICAgIGNvbnN0IGNhcmQgPSB7IGlkOiBzdmMuaWQsIG5hbWU6IHN2Yy5uYW1lIHx8IHN2Yy5pZCwgdXJsOiBzdmMudXJsLCBsb2dvOiBzdmMubG9nbywgdGFpbHNjYWxlT25seTogdHJ1ZSwgaXNDdXN0b206IHRydWUgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBmZXRjaCgnL2Rhc2hjYWRkeS1hcGkvYXBpL3YxL3NlcnZpY2VzJywge1xuICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShjYXJkKSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB3aW5kb3cuQVBQUy5wdXNoKGNhcmQpO1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LnJlbmRlckFwcHMgPT09ICdmdW5jdGlvbicpIHdpbmRvdy5yZW5kZXJBcHBzKCk7XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cucmVuZGVyR3JpZCA9PT0gJ2Z1bmN0aW9uJykgd2luZG93LnJlbmRlckdyaWQoKTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiBjYXJkIHJlZ2lzdHJhdGlvbiBiZXN0LWVmZm9ydCAqLyB9XG4gICAgICB9XG4gICAgICBzaG93T3V0cHV0KCdJTlNUQUxMRUQgJyArIChzdmMubmFtZSB8fCBzdmMuaWQpICsgJyBpbiAnICsgKHN2Yy5kZXBsb3lfc2Vjb25kcyB8fCAnPycpICsgJ3MnICtcbiAgICAgICAgJ1xcbkNhcmQ6ICcgKyAoc3ZjLnVybCB8fCAnJykgK1xuICAgICAgICAnXFxuJyArIChib2R5Lm91dHB1dCB8fCAnJykuc2xpY2UoLTgwMCkpO1xuICAgICAgbG9hZFNlcnZpY2VzKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2hvd091dHB1dCgnaW5zdGFsbCBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICAgIHNldEJ1c3koZmFsc2UsIGJ0biwgJ0luc3RhbGwnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEJ1c3koYnVzeSwgYnRuLCBsYWJlbCkge1xuICAgIGlmICghYnRuKSByZXR1cm47XG4gICAgYnRuLmRpc2FibGVkID0gYnVzeTtcbiAgICBpZiAobGFiZWwpIGJ0bi50ZXh0Q29udGVudCA9IGJ1c3kgPyAnV29ya2luZ1x1MjAyNicgOiBsYWJlbDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHJ1bkRlcGxveSgpIHtcbiAgICBjb25zdCBidG4gPSAkKCdkZXAtZGVwbG95LWJ0bicpO1xuICAgIGNvbnN0IGRpciA9ICQoJ2RlcC1yZXBvLXNlbGVjdCcpLnZhbHVlO1xuICAgIGlmICghZGlyKSByZXR1cm47XG4gICAgc2V0QnVzeSh0cnVlLCBidG4sICdEZXBsb3knKTtcbiAgICBzaG93T3V0cHV0KCdEZXBsb3lpbmcgJyArIGRpciArICdcXG5UaGlzIGNhbiB0YWtlIH4zMC02MHNcdTIwMjYnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBib2R5IH0gPSBhd2FpdCBhcGkoJy9kZXBsb3knLCB7XG4gICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBkaXIgfSksXG4gICAgICB9KTtcbiAgICAgIHNob3dPdXRwdXQoKGJvZHkub3V0cHV0IHx8IGJvZHkuZXJyb3IgfHwgJycpICsgKGJvZHkuc3VjY2VzcyA/ICdcXG5cdTI3MDUgU1VDQ0VTUycgOiAnXFxuXHUyNzRDIEZBSUxFRCcpKTtcbiAgICAgIGxvYWRTZXJ2aWNlcygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dPdXRwdXQoJ2RlcGxveSBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICAgIHNldEJ1c3koZmFsc2UsIGJ0biwgJ0RlcGxveScpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcnVuUm9sbGJhY2soc2VydmljZSwgYnRuKSB7XG4gICAgaWYgKCFjb25maXJtKCdSb2xsIGJhY2sgJyArIHNlcnZpY2UgKyAnIHRvIHRoZSBwcmV2aW91cyByZWxlYXNlPycpKSByZXR1cm47XG4gICAgc2V0QnVzeSh0cnVlLCBidG4sICdSb2xsYmFjaycpO1xuICAgIHNob3dPdXRwdXQoJ1JvbGxpbmcgYmFjayAnICsgc2VydmljZSArICdcdTIwMjYnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBib2R5IH0gPSBhd2FpdCBhcGkoJy9yb2xsYmFjaycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlcnZpY2UgfSksXG4gICAgICB9KTtcbiAgICAgIHNob3dPdXRwdXQoKGJvZHkub3V0cHV0IHx8IGJvZHkuZXJyb3IgfHwgJycpICsgKGJvZHkuc3VjY2VzcyA/ICdcXG5cdTI3MDUgUk9MTEVEIEJBQ0snIDogJ1xcblx1Mjc0QyBGQUlMRUQnKSk7XG4gICAgICBsb2FkU2VydmljZXMoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93T3V0cHV0KCdyb2xsYmFjayBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICAgIHNldEJ1c3koZmFsc2UsIGJ0biwgJ1JvbGxiYWNrJyk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBydW5TdGF0dXMoc2VydmljZSwgYnRuKSB7XG4gICAgc2V0QnVzeSh0cnVlLCBidG4sICdTdGF0dXMnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBib2R5IH0gPSBhd2FpdCBhcGkoJy9zdGF0dXM/c2VydmljZT0nICsgZW5jb2RlVVJJQ29tcG9uZW50KHNlcnZpY2UpKTtcbiAgICAgIHNob3dPdXRwdXQoYm9keS5vdXRwdXQgfHwgYm9keS5lcnJvciB8fCAnKG5vIG91dHB1dCknKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93T3V0cHV0KCdzdGF0dXMgZXJyb3I6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBzZXRCdXN5KGZhbHNlLCBidG4sICdTdGF0dXMnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHdpcmUoKSB7XG4gICAgb3BlbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXBsb3lzLWJ0bicpO1xuICAgIGlmICghb3BlbkJ0bikgcmV0dXJuO1xuXG4gICAgb3BlbkJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICQoJ2RlcGxveXMtbW9kYWwnKS5jbGFzc0xpc3QuYWRkKCdvcGVuJyk7XG4gICAgICBpZiAoIWxvYWRlZE9uY2UpIHtcbiAgICAgICAgbG9hZGVkT25jZSA9IHRydWU7XG4gICAgICAgIGxvYWRTZXJ2aWNlcygpO1xuICAgICAgICBsb2FkUmVwb3MoKTtcbiAgICAgICAgbG9hZEpvdXJuYWwoJycpO1xuICAgICAgICBsb2FkR2l0ZWFSZXBvcygpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgJCgnZGVwLWNsb3NlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAkKCdkZXBsb3lzLW1vZGFsJykuY2xhc3NMaXN0LnJlbW92ZSgnb3BlbicpO1xuICAgIH0pO1xuXG4gICAgLy8gdGFiIHN3aXRjaGluZ1xuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXAtdGFiJykuZm9yRWFjaCgodGFiKSA9PiB7XG4gICAgICB0YWIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kZXAtdGFiJykuZm9yRWFjaCgodCkgPT4gdC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKSk7XG4gICAgICAgIHRhYi5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnI2RlcGxveXMtbW9kYWwgLmRlcC1wYW5lbCcpLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgICBwLnN0eWxlLmRpc3BsYXkgPSBwLmRhdGFzZXQucGFuZWwgPT09IHRhYi5kYXRhc2V0LnRhYiA/ICdibG9jaycgOiAnbm9uZSc7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAkKCdkZXAtZGVwbG95LWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcnVuRGVwbG95KTtcbiAgICAkKCdkZXAtZ2gtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBydW5JbnN0YWxsKTtcbiAgICBbJ2RlcC1naC1naXRlYS1ob3N0JywgJ2RlcC1naC1naXRlYS10b2tlbiddLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgIGlmIChlbCkgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gbG9hZEdpdGVhUmVwb3MoKSk7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RlcC1naC1naXRlYScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7XG4gICAgICBjb25zdCB2ID0gZS50YXJnZXQudmFsdWU7XG4gICAgICBpZiAodikge1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZGVwLWdoLXVybCcpLnZhbHVlID0gdjtcbiAgICAgICAgY29uc3Qgb3B0ID0gZS50YXJnZXQuc2VsZWN0ZWRPcHRpb25zWzBdO1xuICAgICAgICBjb25zdCBpZCA9IG9wdCAmJiBvcHQuZGF0YXNldCA/IG9wdC5kYXRhc2V0LmlkIDogJyc7XG4gICAgICAgIGNvbnN0IHN2YyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkZXAtZ2gtc2VydmljZScpO1xuICAgICAgICBpZiAoaWQgJiYgIXN2Yy52YWx1ZSkgc3ZjLnZhbHVlID0gaWQ7XG4gICAgICB9XG4gICAgfSk7XG5cblxuICAgICQoJ2RlcC1qb3VybmFsLWJ0bicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gbG9hZEpvdXJuYWwoJCgnZGVwLWpvdXJuYWwtbmFtZScpLnZhbHVlLnRyaW0oKSkpO1xuICAgICQoJ2RlcC1zdGF0dXMtYnRuJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgICBjb25zdCBuYW1lID0gJCgnZGVwLXN0YXR1cy1uYW1lJykudmFsdWUudHJpbSgpO1xuICAgICAgaWYgKG5hbWUpIHJ1blN0YXR1cyhuYW1lKTtcbiAgICB9KTtcblxuICAgIC8vIGR5bmFtaWMgYnV0dG9ucyAoc2VydmljZSB0YWJsZSlcbiAgICAkKCdkZXAtc2VydmljZXMnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBjb25zdCByYiA9IGUudGFyZ2V0LmNsb3Nlc3QoJy5kZXAtcm9sbGJhY2snKTtcbiAgICAgIGlmIChyYikgcmV0dXJuIHJ1blJvbGxiYWNrKHJiLmRhdGFzZXQuc2VydmljZSwgcmIpO1xuICAgICAgY29uc3Qgc2IgPSBlLnRhcmdldC5jbG9zZXN0KCcuZGVwLXN0YXR1cycpO1xuICAgICAgaWYgKHNiKSByZXR1cm4gcnVuU3RhdHVzKHNiLmRhdGFzZXQuc2VydmljZSwgc2IpO1xuICAgIH0pO1xuICB9XG5cbiAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCB3aXJlKTtcbiAgfSBlbHNlIHtcbiAgICB3aXJlKCk7XG4gIH1cbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFdFQVRIRVIgV0lER0VUID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuICAvLyBJbmplY3QgbW9kYWwgSFRNTFxuICBpbmplY3RNb2RhbCgnd2VhdGhlci1tb2RhbCcsIGA8ZGl2IGlkPVwid2VhdGhlci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPjxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIj48aDM+V2VhdGhlciBTZXR0aW5nczwvaDM+XG4gICAgPGxhYmVsIGZvcj1cIndlYXRoZXItbG9jYXRpb24taW5wdXRcIj5Mb2NhdGlvbjo8L2xhYmVsPlxuICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwid2VhdGhlci1sb2NhdGlvbi1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiQ2l0eSBuYW1lIG9yIFpJUCAoZS5nLiwgSGFtYnVyZywgOTAyMTApXCIgbWF4bGVuZ3RoPVwiMTAwXCI+XG4gICAgPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTogMC43OHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLXRvcDogNHB4O1wiPkVudGVyIGEgY2l0eSBuYW1lLCBwb3N0YWwgY29kZSwgb3IgJmxkcXVvO0NpdHksIENvdW50cnkmcmRxdW87PC9kaXY+XG4gICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6IDE0cHg7IHBhZGRpbmctdG9wOiAxMnB4OyBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgIDxsYWJlbCBzdHlsZT1cImRpc3BsYXk6IGJsb2NrOyBtYXJnaW4tYm90dG9tOiA4cHg7IGZvbnQtd2VpZ2h0OiA2MDA7IGNvbG9yOiB2YXIoLS1mZyk7XCI+VW5pdHM8L2xhYmVsPlxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogOHB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtb3B0aW9uXCI+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ3ZWF0aGVyLXVuaXQtcmFkaW9cIiB2YWx1ZT1cImltcGVyaWFsXCI+PHNwYW4gY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtY2FyZFwiPiZkZWc7RiAvIG1waDwvc3Bhbj48L2xhYmVsPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJ3ZWF0aGVyLXVuaXQtb3B0aW9uXCI+PGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJ3ZWF0aGVyLXVuaXQtcmFkaW9cIiB2YWx1ZT1cIm1ldHJpY1wiPjxzcGFuIGNsYXNzPVwid2VhdGhlci11bml0LWNhcmRcIj4mZGVnO0MgLyBrbS9oPC9zcGFuPjwvbGFiZWw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+PGJ1dHRvbiBpZD1cIndlYXRoZXItY2FuY2VsXCI+Q2FuY2VsPC9idXR0b24+PGJ1dHRvbiBpZD1cIndlYXRoZXItc2F2ZVwiPlNhdmU8L2J1dHRvbj48L2Rpdj48L2Rpdj48L2Rpdj5gKTtcblxuICAvKiBXZWF0aGVyIFdpZGdldCBcdTIwMTQgcG93ZXJlZCBieSBPcGVuLU1ldGVvIChmcmVlLCBubyBBUEkga2V5KSAqL1xuICBjb25zdCBMT0NBVElPTl9LRVkgPSAnd2VhdGhlci1sb2NhdGlvbic7XG4gIGNvbnN0IExFR0FDWV9LRVkgPSAnd2VhdGhlci16aXAnO1xuICBjb25zdCBHRU9fQ0FDSEVfS0VZID0gJ3dlYXRoZXItZ2VvJztcbiAgY29uc3QgVU5JVF9LRVkgPSAnd2VhdGhlci11bml0JztcblxuICAvLyBNaWdyYXRlIGZyb20gb2xkIFpJUC1vbmx5IGtleVxuICBpZiAoIXNhZmVHZXQoTE9DQVRJT05fS0VZKSAmJiBzYWZlR2V0KExFR0FDWV9LRVkpKSB7XG4gICAgc2FmZVNldChMT0NBVElPTl9LRVksIHNhZmVHZXQoTEVHQUNZX0tFWSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0VW5pdCgpIHtcbiAgICByZXR1cm4gc2FmZUdldChVTklUX0tFWSkgfHwgJ2ltcGVyaWFsJztcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFdlYXRoZXJFbGVtZW50cygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWNvbjogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItaWNvbicpLFxuICAgICAgdGVtcDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItdGVtcCcpLFxuICAgICAgY29uZGl0aW9uOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VhdGhlci1jb25kaXRpb24nKSxcbiAgICAgIGxvY2F0aW9uOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcud2VhdGhlci1sb2NhdGlvbicpLFxuICAgICAgd2luZDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLndlYXRoZXItd2luZCcpXG4gICAgfTtcbiAgfVxuXG4gIC8vIFdNTyBXZWF0aGVyIENvZGUgbWFwcGluZ1xuICBjb25zdCB3bW9EZXNjcmlwdGlvbnMgPSB7XG4gICAgMDogJ0NsZWFyIHNreScsIDE6ICdNYWlubHkgY2xlYXInLCAyOiAnUGFydGx5IGNsb3VkeScsIDM6ICdPdmVyY2FzdCcsXG4gICAgNDU6ICdGb2cnLCA0ODogJ1JpbWUgZm9nJyxcbiAgICA1MTogJ0xpZ2h0IGRyaXp6bGUnLCA1MzogJ0RyaXp6bGUnLCA1NTogJ0RlbnNlIGRyaXp6bGUnLFxuICAgIDU2OiAnRnJlZXppbmcgZHJpenpsZScsIDU3OiAnRGVuc2UgZnJlZXppbmcgZHJpenpsZScsXG4gICAgNjE6ICdMaWdodCByYWluJywgNjM6ICdNb2RlcmF0ZSByYWluJywgNjU6ICdIZWF2eSByYWluJyxcbiAgICA2NjogJ0xpZ2h0IGZyZWV6aW5nIHJhaW4nLCA2NzogJ0hlYXZ5IGZyZWV6aW5nIHJhaW4nLFxuICAgIDcxOiAnTGlnaHQgc25vdycsIDczOiAnTW9kZXJhdGUgc25vdycsIDc1OiAnSGVhdnkgc25vdycsIDc3OiAnU25vdyBncmFpbnMnLFxuICAgIDgwOiAnTGlnaHQgc2hvd2VycycsIDgxOiAnTW9kZXJhdGUgc2hvd2VycycsIDgyOiAnVmlvbGVudCBzaG93ZXJzJyxcbiAgICA4NTogJ0xpZ2h0IHNub3cgc2hvd2VycycsIDg2OiAnSGVhdnkgc25vdyBzaG93ZXJzJyxcbiAgICA5NTogJ1RodW5kZXJzdG9ybScsIDk2OiAnVGh1bmRlcnN0b3JtIHdpdGggaGFpbCcsIDk5OiAnU2V2ZXJlIHRodW5kZXJzdG9ybSdcbiAgfTtcblxuICBjb25zdCB3bW9JY29ucyA9IHtcbiAgICAwOiAnXHUyNjAwXHVGRTBGJywgMTogJ1x1RDgzQ1x1REYyNFx1RkUwRicsIDI6ICdcdTI2QzUnLCAzOiAnXHUyNjAxXHVGRTBGJyxcbiAgICA0NTogJ1x1RDgzQ1x1REYyQlx1RkUwRicsIDQ4OiAnXHVEODNDXHVERjJCXHVGRTBGJyxcbiAgICA1MTogJ1x1RDgzQ1x1REYyNlx1RkUwRicsIDUzOiAnXHVEODNDXHVERjI2XHVGRTBGJywgNTU6ICdcdUQ4M0NcdURGMjZcdUZFMEYnLFxuICAgIDU2OiAnXHVEODNDXHVERjI4XHVGRTBGJywgNTc6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLFxuICAgIDYxOiAnXHVEODNDXHVERjI2XHVGRTBGJywgNjM6ICdcdUQ4M0NcdURGMjdcdUZFMEYnLCA2NTogJ1x1RDgzQ1x1REYyN1x1RkUwRicsXG4gICAgNjY6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA2NzogJ1x1RDgzQ1x1REYyOFx1RkUwRicsXG4gICAgNzE6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA3MzogJ1x1Mjc0NFx1RkUwRicsIDc1OiAnXHUyNzQ0XHVGRTBGJywgNzc6ICdcdTI3NDRcdUZFMEYnLFxuICAgIDgwOiAnXHVEODNDXHVERjI2XHVGRTBGJywgODE6ICdcdUQ4M0NcdURGMjdcdUZFMEYnLCA4MjogJ1x1RDgzQ1x1REYyN1x1RkUwRicsXG4gICAgODU6ICdcdUQ4M0NcdURGMjhcdUZFMEYnLCA4NjogJ1x1Mjc0NFx1RkUwRicsXG4gICAgOTU6ICdcdTI2QzhcdUZFMEYnLCA5NjogJ1x1MjZDOFx1RkUwRicsIDk5OiAnXHUyNkM4XHVGRTBGJ1xuICB9O1xuXG4gIC8vIFdpbmQgZGlyZWN0aW9uIGZyb20gZGVncmVlc1xuICBjb25zdCB3aW5kRGlycyA9IFsnTicsJ05ORScsJ05FJywnRU5FJywnRScsJ0VTRScsJ1NFJywnU1NFJywnUycsJ1NTVycsJ1NXJywnV1NXJywnVycsJ1dOVycsJ05XJywnTk5XJ107XG4gIGZ1bmN0aW9uIGRlZ1RvRGlyKGRlZykge1xuICAgIHJldHVybiB3aW5kRGlyc1tNYXRoLnJvdW5kKGRlZyAvIDIyLjUpICUgMTZdO1xuICB9XG5cbiAgLy8gR2VvY29kZSBsb2NhdGlvbiB2aWEgT3Blbi1NZXRlbywgd2l0aCBsb2NhbFN0b3JhZ2UgY2FjaGVcbiAgYXN5bmMgZnVuY3Rpb24gZ2VvY29kZUxvY2F0aW9uKHF1ZXJ5KSB7XG4gICAgY29uc3QgY2FjaGVkID0gc2FmZUdldChHRU9fQ0FDSEVfS0VZKTtcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBnZW8gPSBKU09OLnBhcnNlKGNhY2hlZCk7XG4gICAgICAgIGlmIChnZW8ucXVlcnkgPT09IHF1ZXJ5KSByZXR1cm4gZ2VvO1xuICAgICAgfSBjYXRjaCB7fVxuICAgIH1cbiAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goYGh0dHBzOi8vZ2VvY29kaW5nLWFwaS5vcGVuLW1ldGVvLmNvbS92MS9zZWFyY2g/bmFtZT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9JmNvdW50PTEmbGFuZ3VhZ2U9ZW4mZm9ybWF0PWpzb25gKTtcbiAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcignR2VvY29kaW5nIGZhaWxlZCcpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICBpZiAoIWRhdGEucmVzdWx0cyB8fCAhZGF0YS5yZXN1bHRzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdMb2NhdGlvbiBub3QgZm91bmQnKTtcbiAgICBjb25zdCByID0gZGF0YS5yZXN1bHRzWzBdO1xuICAgIGNvbnN0IGdlbyA9IHtcbiAgICAgIHF1ZXJ5LFxuICAgICAgbGF0OiByLmxhdGl0dWRlLFxuICAgICAgbG9uOiByLmxvbmdpdHVkZSxcbiAgICAgIGNpdHk6IHIubmFtZSxcbiAgICAgIHN0YXRlOiByLmFkbWluMSB8fCAnJyxcbiAgICAgIGNvdW50cnk6IHIuY291bnRyeSB8fCAnJyxcbiAgICAgIGNvdW50cnlDb2RlOiByLmNvdW50cnlfY29kZSB8fCAnJ1xuICAgIH07XG4gICAgc2FmZVNldChHRU9fQ0FDSEVfS0VZLCBKU09OLnN0cmluZ2lmeShnZW8pKTtcbiAgICByZXR1cm4gZ2VvO1xuICB9XG5cbiAgZnVuY3Rpb24gZm9ybWF0TG9jYXRpb24oZ2VvKSB7XG4gICAgLy8gRm9yIFVTIGxvY2F0aW9ucyBzaG93IFwiQ2l0eSwgU3RhdGVcIiwgZm9yIG90aGVycyBzaG93IFwiQ2l0eSwgQ291bnRyeVwiXG4gICAgaWYgKGdlby5jb3VudHJ5Q29kZSA9PT0gJ1VTJyAmJiBnZW8uc3RhdGUpIHtcbiAgICAgIHJldHVybiBgJHtnZW8uY2l0eX0sICR7Z2VvLnN0YXRlfWA7XG4gICAgfVxuICAgIGlmIChnZW8uY291bnRyeSkge1xuICAgICAgcmV0dXJuIGAke2dlby5jaXR5fSwgJHtnZW8uY291bnRyeX1gO1xuICAgIH1cbiAgICByZXR1cm4gZ2VvLmNpdHk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBmZXRjaFdlYXRoZXIobG9jYXRpb24pIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZ2VvID0gYXdhaXQgZ2VvY29kZUxvY2F0aW9uKGxvY2F0aW9uKTtcbiAgICAgIGNvbnN0IHVuaXQgPSBnZXRVbml0KCk7XG4gICAgICBjb25zdCB0ZW1wVW5pdCA9IHVuaXQgPT09ICdtZXRyaWMnID8gJ2NlbHNpdXMnIDogJ2ZhaHJlbmhlaXQnO1xuICAgICAgY29uc3Qgd2luZFVuaXQgPSB1bml0ID09PSAnbWV0cmljJyA/ICdrbWgnIDogJ21waCc7XG4gICAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9hcGkub3Blbi1tZXRlby5jb20vdjEvZm9yZWNhc3Q/bGF0aXR1ZGU9JHtnZW8ubGF0fSZsb25naXR1ZGU9JHtnZW8ubG9ufSZjdXJyZW50PXRlbXBlcmF0dXJlXzJtLHdlYXRoZXJfY29kZSx3aW5kX3NwZWVkXzEwbSx3aW5kX2RpcmVjdGlvbl8xMG0mdGVtcGVyYXR1cmVfdW5pdD0ke3RlbXBVbml0fSZ3aW5kX3NwZWVkX3VuaXQ9JHt3aW5kVW5pdH1gO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKHVybCk7XG4gICAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcignV2VhdGhlciBmZXRjaCBmYWlsZWQnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGNvbnN0IGMgPSBkYXRhLmN1cnJlbnQ7XG4gICAgICBjb25zdCBjb2RlID0gYy53ZWF0aGVyX2NvZGU7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0ZW1wOiBNYXRoLnJvdW5kKGMudGVtcGVyYXR1cmVfMm0pLFxuICAgICAgICBjb25kaXRpb246IHdtb0Rlc2NyaXB0aW9uc1tjb2RlXSB8fCAnVW5rbm93bicsXG4gICAgICAgIGljb246IHdtb0ljb25zW2NvZGVdIHx8ICdcdUQ4M0NcdURGMjRcdUZFMEYnLFxuICAgICAgICBsb2NhdGlvblN0cjogZm9ybWF0TG9jYXRpb24oZ2VvKSxcbiAgICAgICAgd2luZFNwZWVkOiBNYXRoLnJvdW5kKGMud2luZF9zcGVlZF8xMG0pLFxuICAgICAgICB3aW5kRGlyOiBkZWdUb0RpcihjLndpbmRfZGlyZWN0aW9uXzEwbSksXG4gICAgICAgIHVuaXRcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybignV2VhdGhlciBmZXRjaCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlV2VhdGhlcigpIHtcbiAgICBjb25zdCB3ZWF0aGVyV2lkZ2V0ID0gZ2V0V2VhdGhlckVsZW1lbnRzKCk7XG4gICAgaWYgKCF3ZWF0aGVyV2lkZ2V0Lmljb24gfHwgIXdlYXRoZXJXaWRnZXQudGVtcCB8fCAhd2VhdGhlcldpZGdldC5jb25kaXRpb24gfHwgIXdlYXRoZXJXaWRnZXQubG9jYXRpb24gfHwgIXdlYXRoZXJXaWRnZXQud2luZCkge1xuICAgICAgY29uc29sZS53YXJuKCdXZWF0aGVyIHdpZGdldCBlbGVtZW50cyBub3QgZm91bmQnKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsb2NhdGlvbiA9IHNhZmVHZXQoTE9DQVRJT05fS0VZKTtcbiAgICBpZiAoIWxvY2F0aW9uKSB7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LmxvY2F0aW9uLnRleHRDb250ZW50ID0gJ1NldCBMb2NhdGlvbic7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LnRlbXAudGV4dENvbnRlbnQgPSAnLS1cXHUwMEIwJztcbiAgICAgIHdlYXRoZXJXaWRnZXQuY29uZGl0aW9uLnRleHRDb250ZW50ID0gJ0NsaWNrIFxcdTI2OTlcXHVGRTBGIHRvIGNvbmZpZ3VyZSc7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LndpbmQudGV4dENvbnRlbnQgPSAnLS0nO1xuICAgICAgd2VhdGhlcldpZGdldC5pY29uLmlubmVySFRNTCA9ICc8c3BhbiBjbGFzcz1cIndlYXRoZXItZW1vamlcIj5cXHVEODNDXFx1REYyNFxcdUZFMEY8L3NwYW4+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgd2VhdGhlciA9IGF3YWl0IGZldGNoV2VhdGhlcihsb2NhdGlvbik7XG4gICAgICBpZiAod2VhdGhlcikge1xuICAgICAgICBjb25zdCB0ZW1wU3VmZml4ID0gd2VhdGhlci51bml0ID09PSAnbWV0cmljJyA/ICdcXHUwMEIwQycgOiAnXFx1MDBCMEYnO1xuICAgICAgICBjb25zdCB3aW5kTGFiZWwgPSB3ZWF0aGVyLnVuaXQgPT09ICdtZXRyaWMnID8gJ2ttL2gnIDogJ21waCc7XG4gICAgICAgIHdlYXRoZXJXaWRnZXQubG9jYXRpb24udGV4dENvbnRlbnQgPSB3ZWF0aGVyLmxvY2F0aW9uU3RyO1xuICAgICAgICB3ZWF0aGVyV2lkZ2V0LnRlbXAudGV4dENvbnRlbnQgPSBgJHt3ZWF0aGVyLnRlbXB9JHt0ZW1wU3VmZml4fWA7XG4gICAgICAgIHdlYXRoZXJXaWRnZXQuY29uZGl0aW9uLnRleHRDb250ZW50ID0gd2VhdGhlci5jb25kaXRpb247XG4gICAgICAgIHdlYXRoZXJXaWRnZXQud2luZC50ZXh0Q29udGVudCA9IGBXaW5kOiAke3dlYXRoZXIud2luZFNwZWVkfSAke3dpbmRMYWJlbH0gJHt3ZWF0aGVyLndpbmREaXJ9YDtcbiAgICAgICAgd2VhdGhlcldpZGdldC5pY29uLmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz1cIndlYXRoZXItZW1vamlcIj4ke2VzY2FwZUh0bWwod2VhdGhlci5pY29uKX08L3NwYW4+YDtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgZXJyb3JIYW5kbGVyLmxvZ0Vycm9yKCdbV2VhdGhlcl0gVXBkYXRlIEVycm9yJywgZXJyb3IsIHsgZnVuY3Rpb246ICd1cGRhdGVXZWF0aGVyJyB9KTtcbiAgICAgIHdlYXRoZXJXaWRnZXQubG9jYXRpb24udGV4dENvbnRlbnQgPSAnV2VhdGhlciBFcnJvcic7XG4gICAgICB3ZWF0aGVyV2lkZ2V0LnRlbXAudGV4dENvbnRlbnQgPSAnRXJyb3InO1xuICAgICAgd2VhdGhlcldpZGdldC5jb25kaXRpb24udGV4dENvbnRlbnQgPSAnRmFpbGVkIHRvIGxvYWQnO1xuICAgICAgd2VhdGhlcldpZGdldC53aW5kLnRleHRDb250ZW50ID0gJy0tJztcbiAgICB9XG4gIH1cblxuICAvLyBXZWF0aGVyIHNldHRpbmdzIG1vZGFsXG4gIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItbW9kYWwnKTtcbiAgY29uc3QgbG9jYXRpb25JbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd3ZWF0aGVyLWxvY2F0aW9uLWlucHV0Jyk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItc2V0dGluZ3MnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbG9jYXRpb25JbnB1dC52YWx1ZSA9IHNhZmVHZXQoTE9DQVRJT05fS0VZKSB8fCAnJztcbiAgICAvLyBTZXQgdW5pdCByYWRpb1xuICAgIGNvbnN0IHVuaXQgPSBnZXRVbml0KCk7XG4gICAgY29uc3QgcmFkaW8gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKGBpbnB1dFtuYW1lPVwid2VhdGhlci11bml0LXJhZGlvXCJdW3ZhbHVlPVwiJHt1bml0fVwiXWApO1xuICAgIGlmIChyYWRpbykgcmFkaW8uY2hlY2tlZCA9IHRydWU7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIGxvY2F0aW9uSW5wdXQuZm9jdXMoKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3dlYXRoZXItc2F2ZScpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCBsb2MgPSBsb2NhdGlvbklucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAobG9jKSB7XG4gICAgICAvLyBDbGVhciBnZW8gY2FjaGUgd2hlbiBsb2NhdGlvbiBjaGFuZ2VzIHNvIGl0IHJlLWdlb2NvZGVzXG4gICAgICBjb25zdCBvbGRMb2MgPSBzYWZlR2V0KExPQ0FUSU9OX0tFWSk7XG4gICAgICBpZiAob2xkTG9jICE9PSBsb2MpIHNhZmVTZXQoR0VPX0NBQ0hFX0tFWSwgJycpO1xuICAgICAgc2FmZVNldChMT0NBVElPTl9LRVksIGxvYyk7XG4gICAgICAvLyBTYXZlIHVuaXQgcHJlZmVyZW5jZVxuICAgICAgY29uc3QgdW5pdFJhZGlvID0gbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cIndlYXRoZXItdW5pdC1yYWRpb1wiXTpjaGVja2VkJyk7XG4gICAgICBjb25zdCBuZXdVbml0ID0gdW5pdFJhZGlvID8gdW5pdFJhZGlvLnZhbHVlIDogJ2ltcGVyaWFsJztcbiAgICAgIGNvbnN0IG9sZFVuaXQgPSBnZXRVbml0KCk7XG4gICAgICBzYWZlU2V0KFVOSVRfS0VZLCBuZXdVbml0KTtcbiAgICAgIC8vIENsZWFyIGdlbyBjYWNoZSBpZiB1bml0IGNoYW5nZWQgKG5lZWQgZnJlc2ggd2VhdGhlciBkYXRhKVxuICAgICAgaWYgKG9sZFVuaXQgIT09IG5ld1VuaXQpIHNhZmVTZXQoR0VPX0NBQ0hFX0tFWSwgJycpO1xuICAgICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgICAgdXBkYXRlV2VhdGhlcigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdQbGVhc2UgZW50ZXIgYSBsb2NhdGlvbiAoZS5nLiwgSGFtYnVyZywgTG9uZG9uLCA5MDIxMCknLCAnd2FybmluZycpO1xuICAgIH1cbiAgfSk7XG5cbiAgd2lyZU1vZGFsKG1vZGFsKTtcblxuICAvLyBDbG9zZSBtb2RhbCBvbiBFc2NhcGUga2V5XG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCAoZSkgPT4ge1xuICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgbW9kYWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdzaG93JykpIHtcbiAgICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEluaXRpYWxpemUgd2VhdGhlclxuICB1cGRhdGVXZWF0aGVyKCk7XG4gIC8vIFVwZGF0ZSB3ZWF0aGVyIGV2ZXJ5IDEwIG1pbnV0ZXNcbiAgc2V0SW50ZXJ2YWwodXBkYXRlV2VhdGhlciwgREMuUE9MTC5XRUFUSEVSKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IERJR0lUQUwgQ0xPQ0sgV0lER0VUID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgY29uc3Qgd2lkZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2Nsb2NrLXdpZGdldCcpO1xuICBjb25zdCByZW5kZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stcmVuZGVyJyk7XG4gIGlmICghd2lkZ2V0IHx8ICFyZW5kZXIpIHJldHVybjtcblxuICBjb25zdCBEQVlTID0gWydTdW5kYXknLCdNb25kYXknLCdUdWVzZGF5JywnV2VkbmVzZGF5JywnVGh1cnNkYXknLCdGcmlkYXknLCdTYXR1cmRheSddO1xuICBjb25zdCBNT05USFMgPSBbJ0phbnVhcnknLCdGZWJydWFyeScsJ01hcmNoJywnQXByaWwnLCdNYXknLCdKdW5lJywnSnVseScsJ0F1Z3VzdCcsJ1NlcHRlbWJlcicsJ09jdG9iZXInLCdOb3ZlbWJlcicsJ0RlY2VtYmVyJ107XG4gIGNvbnN0IFJPTUFOID0gWydYSUknLCdJJywnSUknLCdJSUknLCdJVicsJ1YnLCdWSScsJ1ZJSScsJ1ZJSUknLCdJWCcsJ1gnLCdYSSddO1xuXG4gIGxldCBjdXJyZW50U3R5bGUgPSBzYWZlR2V0KCdjbG9jay1zdHlsZScpIHx8ICdkZWZhdWx0JztcbiAgbGV0IGxhc3RDaGltZUhvdXIgPSAtMTtcbiAgbGV0IGNoaW1lUGxheWluZyA9IGZhbHNlO1xuICBsZXQgcHJldkZsaXBEaWdpdHMgPSAnJztcbiAgbGV0IGFjdGl2ZUxheW91dCA9ICcnO1xuICBsZXQgZGlnaXRhbFJlZnMgPSBudWxsO1xuICBsZXQgdGlja1RpbWVyID0gbnVsbDtcblxuICAvLyA9PT09PSBDSElNRVMgPT09PT1cbiAgZnVuY3Rpb24gcGxheUNoaW1lcyhjb3VudCkge1xuICAgIGlmIChjaGltZVBsYXlpbmcpIHJldHVybjtcbiAgICBpZiAoc2FmZUdldCgnY2xvY2stY2hpbWVzJykgIT09ICd0cnVlJykgcmV0dXJuO1xuICAgIGNoaW1lUGxheWluZyA9IHRydWU7XG4gICAgY29uc3Qgdm9sID0gcGFyc2VJbnQoc2FmZUdldCgnY2xvY2stY2hpbWUtdm9sdW1lJykgfHwgJzUwJywgMTApIC8gMTAwO1xuICAgIGxldCBpID0gMDtcbiAgICBmdW5jdGlvbiBzdHJpa2UoKSB7XG4gICAgICBpZiAoaSA+PSBjb3VudCkgeyBjaGltZVBsYXlpbmcgPSBmYWxzZTsgcmV0dXJuOyB9XG4gICAgICBjb25zdCBiZWxsID0gbmV3IEF1ZGlvKCcvYXNzZXRzL3NvdW5kcy9jaHVyY2gtYmVsbC5tcDMnKTtcbiAgICAgIGJlbGwudm9sdW1lID0gdm9sO1xuICAgICAgYmVsbC5wbGF5KCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgaSsrO1xuICAgICAgaWYgKGkgPCBjb3VudCkgc2V0VGltZW91dChzdHJpa2UsIDI1MDApO1xuICAgICAgZWxzZSBzZXRUaW1lb3V0KCgpID0+IHsgY2hpbWVQbGF5aW5nID0gZmFsc2U7IH0sIDI1MDApO1xuICAgIH1cbiAgICBzdHJpa2UoKTtcbiAgfVxuXG4gIC8vID09PT09IERBVEUgU1RSSU5HID09PT09XG4gIGZ1bmN0aW9uIGRhdGVTdHIobm93KSB7XG4gICAgcmV0dXJuIERBWVNbbm93LmdldERheSgpXSArICcsICcgKyBNT05USFNbbm93LmdldE1vbnRoKCldICsgJyAnICsgbm93LmdldERhdGUoKSArICcsICcgKyBub3cuZ2V0RnVsbFllYXIoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc2V0UmVuZGVyTGF5b3V0KCkge1xuICAgIGFjdGl2ZUxheW91dCA9ICcnO1xuICAgIGRpZ2l0YWxSZWZzID0gbnVsbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVuc3VyZURpZ2l0YWxMYXlvdXQoKSB7XG4gICAgaWYgKGFjdGl2ZUxheW91dCAhPT0gJ2RpZ2l0YWwnKSB7XG4gICAgICByZW5kZXIuaW5uZXJIVE1MID1cbiAgICAgICAgJzxkaXYgY2xhc3M9XCJjbG9jay10aW1lXCI+PHNwYW4gY2xhc3M9XCJjbG9jay1tYWluXCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwiY2xvY2stc2Vjb25kc1wiPjwvc3Bhbj48c3BhbiBjbGFzcz1cImNsb2NrLWFtcG1cIj48L3NwYW4+PC9kaXY+JyArXG4gICAgICAgICc8ZGl2IGNsYXNzPVwiY2xvY2stZGF0ZVwiPjwvZGl2Pic7XG4gICAgICBkaWdpdGFsUmVmcyA9IHtcbiAgICAgICAgbWFpbjogcmVuZGVyLnF1ZXJ5U2VsZWN0b3IoJy5jbG9jay1tYWluJyksXG4gICAgICAgIHNlY29uZHM6IHJlbmRlci5xdWVyeVNlbGVjdG9yKCcuY2xvY2stc2Vjb25kcycpLFxuICAgICAgICBhbXBtOiByZW5kZXIucXVlcnlTZWxlY3RvcignLmNsb2NrLWFtcG0nKSxcbiAgICAgICAgZGF0ZTogcmVuZGVyLnF1ZXJ5U2VsZWN0b3IoJy5jbG9jay1kYXRlJylcbiAgICAgIH07XG4gICAgICBhY3RpdmVMYXlvdXQgPSAnZGlnaXRhbCc7XG4gICAgfVxuICAgIHJldHVybiBkaWdpdGFsUmVmcztcbiAgfVxuXG4gIC8vID09PT09IFNUWUxFIFJFTkRFUkVSUyA9PT09PVxuXG4gIGZ1bmN0aW9uIHJlbmRlckRlZmF1bHQobm93KSB7XG4gICAgY29uc3QgaDI0ID0gbm93LmdldEhvdXJzKCksIG0gPSBub3cuZ2V0TWludXRlcygpLCBzID0gbm93LmdldFNlY29uZHMoKTtcbiAgICBjb25zdCBhbXBtID0gaDI0ID49IDEyID8gJ1BNJyA6ICdBTSc7XG4gICAgY29uc3QgaCA9IGgyNCAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IHJlZnMgPSBlbnN1cmVEaWdpdGFsTGF5b3V0KCk7XG4gICAgcmVmcy5tYWluLnRleHRDb250ZW50ID0gYCR7aH06JHtTdHJpbmcobSkucGFkU3RhcnQoMiwnMCcpfWA7XG4gICAgcmVmcy5zZWNvbmRzLnRleHRDb250ZW50ID0gYDoke1N0cmluZyhzKS5wYWRTdGFydCgyLCcwJyl9YDtcbiAgICByZWZzLmFtcG0udGV4dENvbnRlbnQgPSBhbXBtO1xuICAgIHJlZnMuZGF0ZS50ZXh0Q29udGVudCA9IGRhdGVTdHIobm93KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbmRlckxjZChub3csIGNscykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgYW1wbSA9IGgyNCA+PSAxMiA/ICdQTScgOiAnQU0nO1xuICAgIGNvbnN0IGggPSBoMjQgJSAxMiB8fCAxMjtcbiAgICBjb25zdCByZWZzID0gZW5zdXJlRGlnaXRhbExheW91dCgpO1xuICAgIHJlZnMubWFpbi50ZXh0Q29udGVudCA9IGAke1N0cmluZyhoKS5wYWRTdGFydCgyLCcwJyl9OiR7U3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKX1gO1xuICAgIHJlZnMuc2Vjb25kcy50ZXh0Q29udGVudCA9IGA6JHtTdHJpbmcocykucGFkU3RhcnQoMiwnMCcpfWA7XG4gICAgcmVmcy5hbXBtLnRleHRDb250ZW50ID0gYW1wbTtcbiAgICByZWZzLmRhdGUudGV4dENvbnRlbnQgPSBkYXRlU3RyKG5vdyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJGbGlwKG5vdykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgYW1wbSA9IGgyNCA+PSAxMiA/ICdQTScgOiAnQU0nO1xuICAgIGNvbnN0IGggPSBoMjQgJSAxMiB8fCAxMjtcbiAgICBjb25zdCBkaWdpdHMgPSBTdHJpbmcoaCkucGFkU3RhcnQoMiwnICcpICsgU3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKSArIFN0cmluZyhzKS5wYWRTdGFydCgyLCcwJyk7XG5cbiAgICBsZXQgaHRtbCA9ICc8ZGl2IGNsYXNzPVwiZmxpcC1jbG9jay1yb3dcIj4nO1xuICAgIC8vIEhvdXJzXG4gICAgaHRtbCArPSBmbGlwQ2FyZChkaWdpdHNbMF0sIDApO1xuICAgIGh0bWwgKz0gZmxpcENhcmQoZGlnaXRzWzFdLCAxKTtcbiAgICBodG1sICs9ICc8c3BhbiBjbGFzcz1cImZsaXAtY29sb25cIj46PC9zcGFuPic7XG4gICAgLy8gTWludXRlc1xuICAgIGh0bWwgKz0gZmxpcENhcmQoZGlnaXRzWzJdLCAyKTtcbiAgICBodG1sICs9IGZsaXBDYXJkKGRpZ2l0c1szXSwgMyk7XG4gICAgaHRtbCArPSAnPHNwYW4gY2xhc3M9XCJmbGlwLWNvbG9uXCI+Ojwvc3Bhbj4nO1xuICAgIC8vIFNlY29uZHNcbiAgICBodG1sICs9IGZsaXBDYXJkKGRpZ2l0c1s0XSwgNCk7XG4gICAgaHRtbCArPSBmbGlwQ2FyZChkaWdpdHNbNV0sIDUpO1xuICAgIGh0bWwgKz0gYDxzcGFuIGNsYXNzPVwiZmxpcC1hbXBtXCI+JHthbXBtfTwvc3Bhbj5gO1xuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cImNsb2NrLWRhdGVcIj4ke2RhdGVTdHIobm93KX08L2Rpdj5gO1xuICAgIHJlbmRlci5pbm5lckhUTUwgPSBodG1sO1xuICAgIGFjdGl2ZUxheW91dCA9ICdmbGlwJztcblxuICAgIC8vIFRyaWdnZXIgZmxpcCBhbmltYXRpb24gb24gY2hhbmdlZCBkaWdpdHNcbiAgICBpZiAocHJldkZsaXBEaWdpdHMpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgIGlmIChkaWdpdHNbaV0gIT09IHByZXZGbGlwRGlnaXRzW2ldKSB7XG4gICAgICAgICAgY29uc3QgY2FyZCA9IHJlbmRlci5xdWVyeVNlbGVjdG9yKGAuZmxpcC1jYXJkW2RhdGEtaWR4PVwiJHtpfVwiXWApO1xuICAgICAgICAgIGlmIChjYXJkKSBjYXJkLmNsYXNzTGlzdC5hZGQoJ2ZsaXBwaW5nJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJldkZsaXBEaWdpdHMgPSBkaWdpdHM7XG4gIH1cblxuICBmdW5jdGlvbiBmbGlwQ2FyZChkaWdpdCwgaWR4KSB7XG4gICAgY29uc3QgZCA9IGRpZ2l0ID09PSAnICcgPyAnJyA6IGRpZ2l0O1xuICAgIHJldHVybiBgPGRpdiBjbGFzcz1cImZsaXAtY2FyZFwiIGRhdGEtaWR4PVwiJHtpZHh9XCI+PGRpdiBjbGFzcz1cImZsaXAtdG9wXCI+JHtkfTwvZGl2PjxkaXYgY2xhc3M9XCJmbGlwLWJvdHRvbVwiPiR7ZH08L2Rpdj48L2Rpdj5gO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQmluYXJ5KG5vdykge1xuICAgIGNvbnN0IGgyNCA9IG5vdy5nZXRIb3VycygpLCBtID0gbm93LmdldE1pbnV0ZXMoKSwgcyA9IG5vdy5nZXRTZWNvbmRzKCk7XG4gICAgY29uc3QgaCA9IGgyNCAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IGFtcG0gPSBoMjQgPj0gMTIgPyAnUE0nIDogJ0FNJztcbiAgICAvLyA2IGNvbHVtbnM6IEggdGVucywgSCBvbmVzLCBNIHRlbnMsIE0gb25lcywgUyB0ZW5zLCBTIG9uZXNcbiAgICBjb25zdCBjb2xzID0gW1xuICAgICAgTWF0aC5mbG9vcihoIC8gMTApLCBoICUgMTAsXG4gICAgICBNYXRoLmZsb29yKG0gLyAxMCksIG0gJSAxMCxcbiAgICAgIE1hdGguZmxvb3IocyAvIDEwKSwgcyAlIDEwXG4gICAgXTtcblxuICAgIGxldCBodG1sID0gJzxkaXYgY2xhc3M9XCJiaW5hcnktY2xvY2tcIj4nO1xuICAgIC8vIExhYmVsc1xuICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJiaW5hcnktbGFiZWxzXCI+PHNwYW4+SDwvc3Bhbj48c3Bhbj5IPC9zcGFuPjxzcGFuPk08L3NwYW4+PHNwYW4+TTwvc3Bhbj48c3Bhbj5TPC9zcGFuPjxzcGFuPlM8L3NwYW4+PC9kaXY+JztcbiAgICAvLyA0IHJvd3MgZm9yIGJpdHMgOCw0LDIsMVxuICAgIGZvciAobGV0IGJpdCA9IDM7IGJpdCA+PSAwOyBiaXQtLSkge1xuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cImJpbmFyeS1yb3dcIj4nO1xuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgNjsgY29sKyspIHtcbiAgICAgICAgY29uc3Qgb24gPSAoY29sc1tjb2xdID4+IGJpdCkgJiAxO1xuICAgICAgICBodG1sICs9IGA8ZGl2IGNsYXNzPVwiYmluYXJ5LWRvdCAke29uID8gJ29uJyA6ICcnfVwiPjwvZGl2PmA7XG4gICAgICB9XG4gICAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIH1cbiAgICAvLyBWYWx1ZSByb3dcbiAgICBodG1sICs9ICc8ZGl2IGNsYXNzPVwiYmluYXJ5LXZhbHVlc1wiPic7XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgNjsgY29sKyspIHtcbiAgICAgIGh0bWwgKz0gYDxzcGFuPiR7Y29sc1tjb2xdfTwvc3Bhbj5gO1xuICAgIH1cbiAgICBodG1sICs9ICc8L2Rpdj4nO1xuICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCJiaW5hcnktYW1wbVwiPiR7YW1wbX08L2Rpdj5gO1xuICAgIGh0bWwgKz0gJzwvZGl2Pic7XG4gICAgaHRtbCArPSBgPGRpdiBjbGFzcz1cImNsb2NrLWRhdGVcIj4ke2RhdGVTdHIobm93KX08L2Rpdj5gO1xuICAgIHJlbmRlci5pbm5lckhUTUwgPSBodG1sO1xuICAgIGFjdGl2ZUxheW91dCA9ICdiaW5hcnknO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyQW5hbG9nKG5vdywgdXNlUm9tYW4pIHtcbiAgICBjb25zdCBoID0gbm93LmdldEhvdXJzKCksIG0gPSBub3cuZ2V0TWludXRlcygpLCBzID0gbm93LmdldFNlY29uZHMoKTtcbiAgICBjb25zdCBzaXplID0gMTIwO1xuICAgIGNvbnN0IGN4ID0gc2l6ZSAvIDIsIGN5ID0gc2l6ZSAvIDI7XG5cbiAgICAvLyBBbmdsZXNcbiAgICBjb25zdCBzQW5nbGUgPSAocyAvIDYwKSAqIDM2MCAtIDkwO1xuICAgIGNvbnN0IG1BbmdsZSA9ICgobSArIHMgLyA2MCkgLyA2MCkgKiAzNjAgLSA5MDtcbiAgICBjb25zdCBoQW5nbGUgPSAoKChoICUgMTIpICsgbSAvIDYwKSAvIDEyKSAqIDM2MCAtIDkwO1xuXG4gICAgLy8gTnVtYmVyIGxhYmVsc1xuICAgIGxldCBsYWJlbHMgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSAxMjsgaSsrKSB7XG4gICAgICBjb25zdCBhbmdsZSA9IChpIC8gMTIpICogMiAqIE1hdGguUEkgLSBNYXRoLlBJIC8gMjtcbiAgICAgIGNvbnN0IHIgPSA0NztcbiAgICAgIGNvbnN0IHggPSBjeCArIHIgKiBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICBjb25zdCB5ID0gY3kgKyByICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgY29uc3QgbGFiZWwgPSB1c2VSb21hbiA/IFJPTUFOW2kgJSAxMl0gOiBpO1xuICAgICAgY29uc3QgZnMgPSB1c2VSb21hbiA/ICc3JyA6ICc5JztcbiAgICAgIGxhYmVscyArPSBgPHRleHQgeD1cIiR7eH1cIiB5PVwiJHt5fVwiIHRleHQtYW5jaG9yPVwibWlkZGxlXCIgZG9taW5hbnQtYmFzZWxpbmU9XCJjZW50cmFsXCIgZmlsbD1cInZhcigtLWZnKVwiIGZvbnQtc2l6ZT1cIiR7ZnN9XCIgZm9udC13ZWlnaHQ9XCI2MDBcIiBmb250LWZhbWlseT1cIidTYW1pIEdyb3Rlc2snLHNhbnMtc2VyaWZcIj4ke2xhYmVsfTwvdGV4dD5gO1xuICAgIH1cblxuICAgIC8vIFRpY2sgbWFya3NcbiAgICBsZXQgdGlja3MgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDYwOyBpKyspIHtcbiAgICAgIGNvbnN0IGFuZ2xlID0gKGkgLyA2MCkgKiAyICogTWF0aC5QSSAtIE1hdGguUEkgLyAyO1xuICAgICAgY29uc3Qgb3V0ZXIgPSA1NjtcbiAgICAgIGNvbnN0IGlubmVyID0gaSAlIDUgPT09IDAgPyA1MiA6IDU0O1xuICAgICAgY29uc3QgeDEgPSBjeCArIGlubmVyICogTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgY29uc3QgeTEgPSBjeSArIGlubmVyICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgY29uc3QgeDIgPSBjeCArIG91dGVyICogTWF0aC5jb3MoYW5nbGUpO1xuICAgICAgY29uc3QgeTIgPSBjeSArIG91dGVyICogTWF0aC5zaW4oYW5nbGUpO1xuICAgICAgY29uc3QgdyA9IGkgJSA1ID09PSAwID8gMS41IDogMC41O1xuICAgICAgdGlja3MgKz0gYDxsaW5lIHgxPVwiJHt4MX1cIiB5MT1cIiR7eTF9XCIgeDI9XCIke3gyfVwiIHkyPVwiJHt5Mn1cIiBzdHJva2U9XCJ2YXIoLS1tdXRlZClcIiBzdHJva2Utd2lkdGg9XCIke3d9XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5gO1xuICAgIH1cblxuICAgIGNvbnN0IHN2ZyA9IGA8c3ZnIGNsYXNzPVwiYW5hbG9nLWNsb2NrLXN2Z1wiIHZpZXdCb3g9XCIwIDAgJHtzaXplfSAke3NpemV9XCIgd2lkdGg9XCIke3NpemV9XCIgaGVpZ2h0PVwiJHtzaXplfVwiPlxuICAgICAgPGNpcmNsZSBjeD1cIiR7Y3h9XCIgY3k9XCIke2N5fVwiIHI9XCI1OFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwidmFyKC0tYm9yZGVyKVwiIHN0cm9rZS13aWR0aD1cIjJcIi8+XG4gICAgICAke3RpY2tzfVxuICAgICAgJHtsYWJlbHN9XG4gICAgICA8bGluZSB4MT1cIiR7Y3h9XCIgeTE9XCIke2N5fVwiIHgyPVwiJHtjeCArIDI4ICogTWF0aC5jb3MoaEFuZ2xlICogTWF0aC5QSSAvIDE4MCl9XCIgeTI9XCIke2N5ICsgMjggKiBNYXRoLnNpbihoQW5nbGUgKiBNYXRoLlBJIC8gMTgwKX1cIiBzdHJva2U9XCJ2YXIoLS1mZylcIiBzdHJva2Utd2lkdGg9XCIzXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgIDxsaW5lIHgxPVwiJHtjeH1cIiB5MT1cIiR7Y3l9XCIgeDI9XCIke2N4ICsgMzggKiBNYXRoLmNvcyhtQW5nbGUgKiBNYXRoLlBJIC8gMTgwKX1cIiB5Mj1cIiR7Y3kgKyAzOCAqIE1hdGguc2luKG1BbmdsZSAqIE1hdGguUEkgLyAxODApfVwiIHN0cm9rZT1cInZhcigtLWZnKVwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgPGxpbmUgeDE9XCIke2N4fVwiIHkxPVwiJHtjeX1cIiB4Mj1cIiR7Y3ggKyA0MiAqIE1hdGguY29zKHNBbmdsZSAqIE1hdGguUEkgLyAxODApfVwiIHkyPVwiJHtjeSArIDQyICogTWF0aC5zaW4oc0FuZ2xlICogTWF0aC5QSSAvIDE4MCl9XCIgc3Ryb2tlPVwiI2U3NGMzY1wiIHN0cm9rZS13aWR0aD1cIjFcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIvPlxuICAgICAgPGNpcmNsZSBjeD1cIiR7Y3h9XCIgY3k9XCIke2N5fVwiIHI9XCIzXCIgZmlsbD1cInZhcigtLWZnKVwiLz5cbiAgICA8L3N2Zz5gO1xuXG4gICAgY29uc3QgYW1wbSA9IG5vdy5nZXRIb3VycygpID49IDEyID8gJ1BNJyA6ICdBTSc7XG4gICAgcmVuZGVyLmlubmVySFRNTCA9IGA8ZGl2IGNsYXNzPVwiYW5hbG9nLWNsb2NrLXdyYXBcIj4ke3N2Z308ZGl2IGNsYXNzPVwiYW5hbG9nLWluZm9cIj48c3BhbiBjbGFzcz1cImFuYWxvZy1kaWdpdGFsXCI+JHsobm93LmdldEhvdXJzKCkgJSAxMiB8fCAxMil9OiR7U3RyaW5nKG0pLnBhZFN0YXJ0KDIsJzAnKX0gJHthbXBtfTwvc3Bhbj48c3BhbiBjbGFzcz1cImFuYWxvZy1kYXRlLXNtXCI+JHtkYXRlU3RyKG5vdyl9PC9zcGFuPjwvZGl2PjwvZGl2PmA7XG4gICAgYWN0aXZlTGF5b3V0ID0gJ2FuYWxvZyc7XG4gIH1cblxuICAvLyA9PT09PSBNQUlOIFRJQ0sgPT09PT1cbiAgZnVuY3Rpb24gdGljaygpIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGggPSBub3cuZ2V0SG91cnMoKSAlIDEyIHx8IDEyO1xuICAgIGNvbnN0IG0gPSBub3cuZ2V0TWludXRlcygpO1xuICAgIGNvbnN0IHMgPSBub3cuZ2V0U2Vjb25kcygpO1xuXG4gICAgLy8gU2V0IHN0eWxlIGNsYXNzIG9uIHdpZGdldFxuICAgIGNvbnN0IG5leHRDbGFzc05hbWUgPSAnY2xvY2std2lkZ2V0JyArIChjdXJyZW50U3R5bGUgIT09ICdkZWZhdWx0JyA/ICcgJyArIGN1cnJlbnRTdHlsZSA6ICcnKTtcbiAgICBpZiAod2lkZ2V0LmNsYXNzTmFtZSAhPT0gbmV4dENsYXNzTmFtZSkge1xuICAgICAgd2lkZ2V0LmNsYXNzTmFtZSA9IG5leHRDbGFzc05hbWU7XG4gICAgfVxuXG4gICAgc3dpdGNoIChjdXJyZW50U3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xjZCc6IHJlbmRlckxjZChub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2xjZC1ibHVlJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLWFtYmVyJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLXJldHJvJzogcmVuZGVyTGNkKG5vdyk7IGJyZWFrO1xuICAgICAgY2FzZSAnbGNkLXRheGknOiByZW5kZXJMY2Qobm93KTsgYnJlYWs7XG4gICAgICBjYXNlICdmbGlwJzogcmVuZGVyRmxpcChub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2JpbmFyeSc6IHJlbmRlckJpbmFyeShub3cpOyBicmVhaztcbiAgICAgIGNhc2UgJ2FuYWxvZyc6IHJlbmRlckFuYWxvZyhub3csIGZhbHNlKTsgYnJlYWs7XG4gICAgICBjYXNlICdyb21hbic6IHJlbmRlckFuYWxvZyhub3csIHRydWUpOyBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHJlbmRlckRlZmF1bHQobm93KTtcbiAgICB9XG5cbiAgICAvLyBIb3VybHkgY2hpbWVzXG4gICAgaWYgKG0gPT09IDAgJiYgcyA9PT0gMCAmJiBoICE9PSBsYXN0Q2hpbWVIb3VyKSB7XG4gICAgICBsYXN0Q2hpbWVIb3VyID0gaDtcbiAgICAgIHBsYXlDaGltZXMoaCk7XG4gICAgfVxuICAgIGlmIChtICE9PSAwKSBsYXN0Q2hpbWVIb3VyID0gLTE7XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZU5leHRUaWNrKCkge1xuICAgIGNsZWFyVGltZW91dCh0aWNrVGltZXIpO1xuICAgIGNvbnN0IGludGVydmFsID0gZG9jdW1lbnQuaGlkZGVuID8gNjAwMDAgOiAxMDAwO1xuICAgIGNvbnN0IGRlbGF5ID0gaW50ZXJ2YWwgLSAoRGF0ZS5ub3coKSAlIGludGVydmFsKSArIDI1O1xuICAgIHRpY2tUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGljaygpO1xuICAgICAgc2NoZWR1bGVOZXh0VGljaygpO1xuICAgIH0sIGRlbGF5KTtcbiAgfVxuXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7XG4gICAgcHJldkZsaXBEaWdpdHMgPSAnJztcbiAgICByZXNldFJlbmRlckxheW91dCgpO1xuICAgIHRpY2soKTtcbiAgICBzY2hlZHVsZU5leHRUaWNrKCk7XG4gIH0pO1xuXG4gIHRpY2soKTtcbiAgc2NoZWR1bGVOZXh0VGljaygpO1xuXG4gIC8vID09PT09IFNFVFRJTkdTIE1PREFMID09PT09XG4gIGNvbnN0IFNUWUxFUyA9IFtcbiAgICB7IGlkOiAnZGVmYXVsdCcsIGxhYmVsOiAnRGVmYXVsdCcsIGljb246ICdcdUQ4M0RcdURENTAnIH0sXG4gICAgeyBpZDogJ2xjZCcsIGxhYmVsOiAnTENEIEdyZWVuJywgaWNvbjogJ1x1RDgzRFx1REM5QScgfSxcbiAgICB7IGlkOiAnbGNkLWJsdWUnLCBsYWJlbDogJ0xDRCBCbHVlJywgaWNvbjogJ1x1RDgzRFx1REM5OScgfSxcbiAgICB7IGlkOiAnbGNkLWFtYmVyJywgbGFiZWw6ICdMQ0QgQW1iZXInLCBpY29uOiAnXHVEODNEXHVERkUwJyB9LFxuICAgIHsgaWQ6ICdsY2QtcmV0cm8nLCBsYWJlbDogJ0xDRCBSZXRybycsIGljb246ICdcdUQ4M0RcdURGRTknIH0sXG4gICAgeyBpZDogJ2xjZC10YXhpJywgbGFiZWw6ICdMQ0QgVGF4aScsIGljb246ICdcdUQ4M0RcdURGRTEnIH0sXG4gICAgeyBpZDogJ2ZsaXAnLCBsYWJlbDogJ0ZsaXAgQ2xvY2snLCBpY29uOiAnXHVEODNEXHVEQ0RGJyB9LFxuICAgIHsgaWQ6ICdiaW5hcnknLCBsYWJlbDogJ0JpbmFyeScsIGljb246ICdcdUQ4M0RcdURDQkInIH0sXG4gICAgeyBpZDogJ2FuYWxvZycsIGxhYmVsOiAnQW5hbG9nJywgaWNvbjogJ1x1MjNGMCcgfSxcbiAgICB7IGlkOiAncm9tYW4nLCBsYWJlbDogJ1JvbWFuJywgaWNvbjogJ1x1RDgzQ1x1REZEQlx1RkUwRicgfSxcbiAgXTtcblxuICBsZXQgc3R5bGVPcHRpb25zSHRtbCA9ICc8ZGl2IGNsYXNzPVwiY2xvY2stc3R5bGUtZ3JpZFwiPic7XG4gIFNUWUxFUy5mb3JFYWNoKHMgPT4ge1xuICAgIHN0eWxlT3B0aW9uc0h0bWwgKz0gYDxsYWJlbCBjbGFzcz1cImNsb2NrLXN0eWxlLW9wdGlvblwiPlxuICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJjbG9jay1zdHlsZS1yYWRpb1wiIHZhbHVlPVwiJHtzLmlkfVwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJjbG9jay1zdHlsZS1jYXJkXCI+PHNwYW4gY2xhc3M9XCJjbG9jay1zdHlsZS1pY29uXCI+JHtzLmljb259PC9zcGFuPjxzcGFuIGNsYXNzPVwiY2xvY2stc3R5bGUtbGFiZWxcIj4ke3MubGFiZWx9PC9zcGFuPjwvc3Bhbj5cbiAgICA8L2xhYmVsPmA7XG4gIH0pO1xuICBzdHlsZU9wdGlvbnNIdG1sICs9ICc8L2Rpdj4nO1xuXG4gIGluamVjdE1vZGFsKCdjbG9jay1zZXR0aW5ncy1tb2RhbCcsIGA8ZGl2IGlkPVwiY2xvY2stc2V0dGluZ3MtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtYXgtd2lkdGg6IDQyMHB4O1wiPlxuICAgICAgPGgzPkNsb2NrIFNldHRpbmdzPC9oMz5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiAxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogOHB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlN0eWxlPC9sYWJlbD5cbiAgICAgICAgJHtzdHlsZU9wdGlvbnNIdG1sfVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTZweDsgcGFkZGluZy10b3A6IDEycHg7IGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgY3Vyc29yOiBwb2ludGVyOyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cImNsb2NrLWNoaW1lcy10b2dnbGVcIj4gSG91cmx5IGNodXJjaCBiZWxsIGNoaW1lc1xuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOiAwLjc4cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA0cHg7IG1hcmdpbi1sZWZ0OiAyNHB4O1wiPlxuICAgICAgICAgIFN0cmlrZXMgdGhlIG51bWJlciBvZiB0aGUgaG91ciAoZS5nLiwgMyBiZWxscyBhdCAzOjAwKVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCIgaWQ9XCJjbG9jay12b2x1bWUtc2VjdGlvblwiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OiBibG9jazsgbWFyZ2luLWJvdHRvbTogNnB4OyBmb250LXdlaWdodDogNjAwOyBjb2xvcjogdmFyKC0tZmcpO1wiPlZvbHVtZTwvbGFiZWw+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDEwcHg7XCI+XG4gICAgICAgICAgPHNwYW4gc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07XCI+XHVEODNEXHVERDA4PC9zcGFuPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwicmFuZ2VcIiBpZD1cImNsb2NrLWNoaW1lLXZvbHVtZVwiIG1pbj1cIjBcIiBtYXg9XCIxMDBcIiB2YWx1ZT1cIjUwXCIgc3R5bGU9XCJmbGV4OiAxOyBhY2NlbnQtY29sb3I6IHZhcigtLW9rLWZnKTtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTtcIj5cdUQ4M0RcdUREMEE8L3NwYW4+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cImNsb2NrLWNoaW1lLXRlc3RcIiBzdHlsZT1cInBhZGRpbmc6IDRweCAxMHB4OyBmb250LXNpemU6IDAuNzhyZW07IGJvcmRlci1yYWRpdXM6IDRweDsgY3Vyc29yOiBwb2ludGVyO1wiPlRlc3Q8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNsb2NrLXNldHRpbmdzLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2xvY2stc2V0dGluZ3Mtc2F2ZVwiPlNhdmU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1zZXR0aW5ncy1tb2RhbCcpO1xuICBjb25zdCBjaGltZXNUb2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stY2hpbWVzLXRvZ2dsZScpO1xuICBjb25zdCB2b2x1bWVTbGlkZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stY2hpbWUtdm9sdW1lJyk7XG4gIGNvbnN0IHZvbHVtZVNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stdm9sdW1lLXNlY3Rpb24nKTtcblxuICBmdW5jdGlvbiBsb2FkU2V0dGluZ3MoKSB7XG4gICAgY29uc3Qgc3R5bGUgPSBzYWZlR2V0KCdjbG9jay1zdHlsZScpIHx8ICdkZWZhdWx0JztcbiAgICBjb25zdCByYWRpbyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoYGlucHV0W3ZhbHVlPVwiJHtzdHlsZX1cIl1gKTtcbiAgICBpZiAocmFkaW8pIHJhZGlvLmNoZWNrZWQgPSB0cnVlO1xuICAgIGNoaW1lc1RvZ2dsZS5jaGVja2VkID0gc2FmZUdldCgnY2xvY2stY2hpbWVzJykgPT09ICd0cnVlJztcbiAgICB2b2x1bWVTbGlkZXIudmFsdWUgPSBzYWZlR2V0KCdjbG9jay1jaGltZS12b2x1bWUnKSB8fCAnNTAnO1xuICAgIHZvbHVtZVNlY3Rpb24uc3R5bGUub3BhY2l0eSA9IGNoaW1lc1RvZ2dsZS5jaGVja2VkID8gJzEnIDogJzAuNCc7XG4gIH1cblxuICBjaGltZXNUb2dnbGU/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICB2b2x1bWVTZWN0aW9uLnN0eWxlLm9wYWNpdHkgPSBjaGltZXNUb2dnbGUuY2hlY2tlZCA/ICcxJyA6ICcwLjQnO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stc2V0dGluZ3MnKT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgbG9hZFNldHRpbmdzKCk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stY2hpbWUtdGVzdCcpPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBjb25zdCB2b2wgPSBwYXJzZUludCh2b2x1bWVTbGlkZXIudmFsdWUsIDEwKSAvIDEwMDtcbiAgICBjb25zdCBiZWxsID0gbmV3IEF1ZGlvKCcvYXNzZXRzL3NvdW5kcy9jaHVyY2gtYmVsbC5tcDMnKTtcbiAgICBiZWxsLnZvbHVtZSA9IHZvbDtcbiAgICBiZWxsLnBsYXkoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH0pO1xuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjbG9jay1zZXR0aW5ncy1zYXZlJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGNvbnN0IHJhZGlvID0gbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXRbbmFtZT1cImNsb2NrLXN0eWxlLXJhZGlvXCJdOmNoZWNrZWQnKTtcbiAgICBjb25zdCBzdHlsZSA9IHJhZGlvID8gcmFkaW8udmFsdWUgOiAnZGVmYXVsdCc7XG4gICAgc2FmZVNldCgnY2xvY2stc3R5bGUnLCBzdHlsZSk7XG4gICAgc2FmZVNldCgnY2xvY2stY2hpbWVzJywgU3RyaW5nKGNoaW1lc1RvZ2dsZS5jaGVja2VkKSk7XG4gICAgc2FmZVNldCgnY2xvY2stY2hpbWUtdm9sdW1lJywgdm9sdW1lU2xpZGVyLnZhbHVlKTtcbiAgICBjdXJyZW50U3R5bGUgPSBzdHlsZTtcbiAgICBwcmV2RmxpcERpZ2l0cyA9ICcnO1xuICAgIHJlc2V0UmVuZGVyTGF5b3V0KCk7XG4gICAgdGljaygpO1xuICAgIHNjaGVkdWxlTmV4dFRpY2soKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgc2hvd05vdGlmaWNhdGlvbignQ2xvY2sgc2V0dGluZ3Mgc2F2ZWQnLCAnc3VjY2VzcycsIDIwMDApO1xuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2xvY2stc2V0dGluZ3MtY2FuY2VsJyk/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKTtcbiAgfSk7XG5cbiAgd2lyZU1vZGFsKG1vZGFsKTtcblxuICAvLyBMaXZlIHByZXZpZXcgd2hlbiBjbGlja2luZyBzdHlsZSBvcHRpb25zXG4gIG1vZGFsPy5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dFtuYW1lPVwiY2xvY2stc3R5bGUtcmFkaW9cIl0nKS5mb3JFYWNoKHJhZGlvID0+IHtcbiAgICByYWRpby5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICBjdXJyZW50U3R5bGUgPSByYWRpby52YWx1ZTtcbiAgICAgIHByZXZGbGlwRGlnaXRzID0gJyc7XG4gICAgICByZXNldFJlbmRlckxheW91dCgpO1xuICAgICAgdGljaygpO1xuICAgIH0pO1xuICB9KTtcbn0pKCk7XG47XG4vLyBEQy0xNjg6IGNhbGVuZGFyIGV2ZW50LWNhY2hlIHNlbWFudGljcyAoc2hhcmVkIGJ5IHdpZGdldCArIHRlc3RzKS5cbi8vIEtleWVkIGJ5IHVpZCtzdGFydCAocmVjdXJyaW5nIGluc3RhbmNlcyBkaWZmZXIgcGVyIG9jY3VycmVuY2UpOyBhIGZldGNoZWRcbi8vIHdpbmRvdyBpcyBhdXRob3JpdGF0aXZlIGZvciBlbnRyaWVzIHN0YXJ0aW5nIGluc2lkZSBpdCAoZGVsZXRpb25zIGFuZFxuLy8gcmVzY2hlZHVsZXMgcHJvcGFnYXRlKSwgZW50cmllcyBvdXRzaWRlIGl0IHN1cnZpdmUuXG4ndXNlIHN0cmljdCc7XG4oZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBldmVudEtleShldikge1xuICAgIC8vIEF1ZGl0IDIwMjYtMTAtMjc6IGEgbnVsbC9pbnZhbGlkIHN0YXJ0IHRocmV3IFJhbmdlRXJyb3Igb3V0IG9mIG1lcmdlKClcbiAgICAvLyBhbmQgZmxpcHBlZCB0aGUgd2hvbGUgd2lkZ2V0IG9mZmxpbmUgXHUyMDE0IGRlZ3JhZGUgdG8gYSBzdHJpbmcga2V5IGluc3RlYWQuXG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGV2LnN0YXJ0KTtcbiAgICBjb25zdCBzdGFydElzbyA9IGlzTmFOKGQuZ2V0VGltZSgpKVxuICAgICAgPyBgaW52YWxpZDoke2V2LnN0YXJ0ID09IG51bGwgPyAnbnVsbCcgOiBTdHJpbmcoZXYuc3RhcnQpfWBcbiAgICAgIDogZC50b0lTT1N0cmluZygpO1xuICAgIHJldHVybiBldi51aWQgPyBgJHtldi51aWR9QCR7c3RhcnRJc299YCA6IGAke3N0YXJ0SXNvfXwke2V2LnRpdGxlIHx8ICcnfWA7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVDYWNoZSgpIHtcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNpemU6ICgpID0+IG1hcC5zaXplLFxuICAgICAgbWVyZ2UoYm9keSwgcmFuZ2UpIHtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBbaywgZXZdIG9mIG1hcCkge1xuICAgICAgICAgICAgY29uc3QgdCA9IG5ldyBEYXRlKGV2LnN0YXJ0KS5nZXRUaW1lKCk7XG4gICAgICAgICAgICBpZiAodCA+PSByYW5nZS5zdGFydC5nZXRUaW1lKCkgJiYgdCA8PSByYW5nZS5lbmQuZ2V0VGltZSgpKSBtYXAuZGVsZXRlKGspO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGV2IG9mICgoYm9keSAmJiBBcnJheS5pc0FycmF5KGJvZHkuZXZlbnRzKSkgPyBib2R5LmV2ZW50cyA6IFtdKSkge1xuICAgICAgICAgIG1hcC5zZXQoZXZlbnRLZXkoZXYpLCBldik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgZXZlbnRzOiBbLi4ubWFwLnZhbHVlcygpXS5zb3J0KChhLCBiKSA9PiBuZXcgRGF0ZShhLnN0YXJ0KSAtIG5ldyBEYXRlKGIuc3RhcnQpKSB9O1xuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgYXBpID0geyBldmVudEtleSwgY3JlYXRlQ2FjaGUgfTtcbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IGFwaTtcbiAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB3aW5kb3cuQ2FsZW5kYXJDYWNoZSA9IGFwaTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IENBTEVOREFSIFdJREdFVCAoREMtMTYxICsgREMtMTY4KSA9PT09PT09PT09XG4vLyBaZXJvLWNvbmZpZyBmb3IgY2FsZW5kYXJzIGRlcGxveWVkIHRocm91Z2ggRGFzaENhZGR5IChSYWRpY2FsZSBhdXRvLXdpcmluZyk7XG4vLyBtYW51YWwgQ2FsREFWL0lDUyBzb3VyY2VzIHZpYSB0aGUgXHUyNjk5XHVGRTBGIHNldHRpbmdzIG1vZGFsLiBXZWF0aGVyLXdpZGdldCBwYXR0ZXJuOlxuLy8gY29tcGFjdCB0b3AtYmFyIGRpc3BsYXkgKyB3ZWF0aGVyLW1vZGFsIHNoZWxsICsgc2VydmVyLWJhY2tlZCBzZXR0aW5ncy5cbi8vXG4vLyBEQy0xNjggKG93bmVyIHJlcXVpcmVtZW50cyk6XG4vLyAgMS4gRW1wdHkgXHUyMTkyIGNoaXAgc2F5cyBcIk5vIHVwY29taW5nIGFwcG9pbnRtZW50c1wiIChjYWxlbmRhciBJUyBjb25uZWN0ZWQpLlxuLy8gIDIuIFdpdGggZXZlbnRzIFx1MjE5MiBjaGlwIHNob3dzIHRoZSBuZXh0IGFwcG9pbnRtZW50ICh0aXRsZSArIGRheS90aW1lKS5cbi8vICAzLiBNb2RhbCBcdTIxOTIgbW9udGggR1JJRCB3aXRoIGFwcG9pbnRtZW50IGRheXMgaGlnaGxpZ2h0ZWQgKCsgdGltZXMgaW5cbi8vICAgICB0b29sdGlwIGFuZCB0aGUgVXBjb21pbmcgbGlzdCksIG5vdCBqdXN0IGEgZmxhdCBsaXN0LlxuLy8gIDQuIENoaXAgc3RheXMgd2VhdGhlci13aWRnZXQgc2l6ZSAoQ1NTIGtlZXBzIHBhZGRpbmcvZm9udCBpZGVudGljYWwpLlxuLy8gIDUuIEV2ZXJ5dGhpbmcgc3R5bGVkIHdpdGggQ1NTIHZhcmlhYmxlcyArIFtkYXRhLXRoZW1lXSBvdmVycmlkZXMgaW5cbi8vICAgICBkYXNoYm9hcmQuY3NzIFx1MjAxNCBjb3JyZWN0IGFjcm9zcyBhbGwgdGhlbWVzIGFuZCB1c2VyIHRoZW1lcy5cbihmdW5jdGlvbigpIHtcbiAgY29uc3QgZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpO1xuXG4gIGluamVjdE1vZGFsKCdjYWxlbmRhci1tb2RhbCcsIGA8ZGl2IGlkPVwiY2FsZW5kYXItbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50IGNhbC1tb2RhbC1jb250ZW50XCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbW9kYWw9XCJ0cnVlXCIgYXJpYS1sYWJlbGxlZGJ5PVwiY2FsZW5kYXItbW9kYWwtdGl0bGVcIj5cbiAgICAgIDxoMyBpZD1cImNhbGVuZGFyLW1vZGFsLXRpdGxlXCI+XHVEODNEXHVEQ0M1IENhbGVuZGFyPC9oMz5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYWwtbW9udGhiYXJcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImNhbC1wcmV2XCIgY2xhc3M9XCJjYWwtbmF2LWJ0blwiIGFyaWEtbGFiZWw9XCJQcmV2aW91cyBtb250aFwiPlx1MjAzOTwvYnV0dG9uPlxuICAgICAgICA8c3BhbiBpZD1cImNhbC1tb250aC1sYWJlbFwiIGNsYXNzPVwiY2FsLW1vbnRoLWxhYmVsXCI+PC9zcGFuPlxuICAgICAgICA8YnV0dG9uIGlkPVwiY2FsLW5leHRcIiBjbGFzcz1cImNhbC1uYXYtYnRuXCIgYXJpYS1sYWJlbD1cIk5leHQgbW9udGhcIj5cdTIwM0E8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBpZD1cImNhbC1ncmlkXCIgY2xhc3M9XCJjYWwtZ3JpZFwiPjwvZGl2PlxuICAgICAgPGRpdiBpZD1cImNhbGVuZGFyLXVwY29taW5nXCIgc3R5bGU9XCJtYXJnaW46MTJweCAwIDE0cHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6MC44cmVtO2NvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tYm90dG9tOjZweDtcIj5VcGNvbWluZyBhcHBvaW50bWVudHM8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImNhbGVuZGFyLXVwY29taW5nLWxpc3RcIiBjbGFzcz1cImNhbC1saXN0XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhbC1lbXB0eVwiPk5vIHVwY29taW5nIGFwcG9pbnRtZW50cy48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOjE0cHg7cGFkZGluZy10b3A6MTJweDtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8bGFiZWwgc3R5bGU9XCJkaXNwbGF5OmJsb2NrO2ZvbnQtd2VpZ2h0OjYwMDtjb2xvcjp2YXIoLS1mZyk7bWFyZ2luLWJvdHRvbTo4cHg7XCI+Q2FsZW5kYXJzPC9sYWJlbD5cbiAgICAgICAgPGRpdiBpZD1cImNhbGVuZGFyLXNvdXJjZXMtbGlzdFwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtnYXA6NnB4O21hcmdpbi1ib3R0b206MTBweDtcIj48L2Rpdj5cbiAgICAgICAgPGRldGFpbHMgaWQ9XCJjYWxlbmRhci1hZGQtZGV0YWlsc1wiPlxuICAgICAgICAgIDxzdW1tYXJ5IHN0eWxlPVwiY3Vyc29yOnBvaW50ZXI7Zm9udC1zaXplOjAuODVyZW07Y29sb3I6dmFyKC0tYWNjZW50KTtcIj4rIEFkZCBhIGNhbGVuZGFyIChDYWxEQVYgVVJMIG9yIElDUyBmZWVkKTwvc3VtbWFyeT5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwibWFyZ2luLXRvcDoxMHB4O2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjhweDtcIj5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODJyZW07XCI+VHlwZVxuICAgICAgICAgICAgICAgIDxzZWxlY3QgaWQ9XCJjYWwtYWRkLXR5cGVcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjZweDtiYWNrZ3JvdW5kOnZhcigtLWJnKTtjb2xvcjp2YXIoLS1mZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NHB4O1wiPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImNhbGRhdlwiPkNhbERBVjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImljc1wiPklDUyBmZWVkIChyZWFkLW9ubHkpPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTowLjgycmVtO2ZsZXg6MTtcIj5OYW1lXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJjYWwtYWRkLW5hbWVcIiBwbGFjZWhvbGRlcj1cIldvcmsgY2FsZW5kYXJcIiBtYXhsZW5ndGg9XCIxMjBcIiBzdHlsZT1cIndpZHRoOjEwMCU7YmFja2dyb3VuZDp2YXIoLS1iZyk7Y29sb3I6dmFyKC0tZmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjRweDtwYWRkaW5nOjRweCA4cHg7XCI+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTowLjgycmVtO1wiPlVSTFxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNhbC1hZGQtdXJsXCIgcGxhY2Vob2xkZXI9XCJodHRwczovL2NhbGVuZGFyLmV4YW1wbGUuY29tL3VzZXIvY2FsZW5kYXIvXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO2JhY2tncm91bmQ6dmFyKC0tYmcpO2NvbG9yOnZhcigtLWZnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo0cHggOHB4O1wiPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODJyZW07ZmxleDoxO1wiPlVzZXJcbiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cImNhbC1hZGQtdXNlclwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIHN0eWxlPVwid2lkdGg6MTAwJTtiYWNrZ3JvdW5kOnZhcigtLWJnKTtjb2xvcjp2YXIoLS1mZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NHB4O3BhZGRpbmc6NHB4IDhweDtcIj5cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOjAuODJyZW07ZmxleDoxO1wiPlBhc3N3b3JkXG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIGlkPVwiY2FsLWFkZC1wYXNzXCIgYXV0b2NvbXBsZXRlPVwibmV3LXBhc3N3b3JkXCIgc3R5bGU9XCJ3aWR0aDoxMDAlO2JhY2tncm91bmQ6dmFyKC0tYmcpO2NvbG9yOnZhcigtLWZnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo0cHg7cGFkZGluZzo0cHggOHB4O1wiPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo4cHg7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO1wiPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiY2FsLWFkZC10ZXN0XCI+VGVzdCBjb25uZWN0aW9uPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJjYWwtYWRkLXNhdmVcIj5TYXZlPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgaWQ9XCJjYWwtYWRkLXN0YXR1c1wiIHN0eWxlPVwiZm9udC1zaXplOjAuOHJlbTtjb2xvcjp2YXIoLS1tdXRlZCk7bWluLWhlaWdodDoxZW07XCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGV0YWlscz5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiPjxidXR0b24gaWQ9XCJjYWxlbmRhci1jbG9zZVwiPkNsb3NlPC9idXR0b24+PC9kaXY+XG4gICAgPC9kaXY+PC9kaXY+YCk7XG5cbiAgZnVuY3Rpb24gZXNjYXBlSHRtbChzKSB7XG4gICAgcmV0dXJuIFN0cmluZyhzID09IG51bGwgPyAnJyA6IHMpXG4gICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpLnJlcGxhY2UoLycvZywgJyYjMzk7Jyk7XG4gIH1cblxuICBjb25zdCB3aWRnZXRFbHMgPSAoKSA9PiAoe1xuICAgIGljb246IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYWxlbmRhci13aWRnZXQtaWNvbicpLFxuICAgIHRleHQ6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jYWxlbmRhci13aWRnZXQtdGV4dCcpLFxuICB9KTtcblxuICBmdW5jdGlvbiBmbXRXaGVuKHN0YXJ0LCBhbGxEYXkpIHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUoc3RhcnQpO1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTsgdG9kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgY29uc3QgZGF5ID0gbmV3IERhdGUoZCk7IGRheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICBjb25zdCBkYXlzID0gTWF0aC5yb3VuZCgoZGF5IC0gdG9kYXkpIC8gODY0MDAwMDApO1xuICAgIGNvbnN0IGRheUxhYmVsID0gZGF5cyA9PT0gMCA/ICdUb2RheScgOiBkYXlzID09PSAxID8gJ1RvbW9ycm93JyA6XG4gICAgICBkLnRvTG9jYWxlRGF0ZVN0cmluZyh1bmRlZmluZWQsIHsgd2Vla2RheTogJ3Nob3J0JywgbW9udGg6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnIH0pO1xuICAgIGNvbnN0IHRpbWVMYWJlbCA9IGFsbERheSA/ICdhbGwtZGF5JyA6IGQudG9Mb2NhbGVUaW1lU3RyaW5nKHVuZGVmaW5lZCwgeyBob3VyOiAnbnVtZXJpYycsIG1pbnV0ZTogJzItZGlnaXQnIH0pO1xuICAgIHJldHVybiBgJHtkYXlMYWJlbH0gJHt0aW1lTGFiZWx9YDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZtdFRpbWUoc3RhcnQsIGFsbERheSkge1xuICAgIGlmIChhbGxEYXkpIHJldHVybiAnYWxsLWRheSc7XG4gICAgcmV0dXJuIG5ldyBEYXRlKHN0YXJ0KS50b0xvY2FsZVRpbWVTdHJpbmcodW5kZWZpbmVkLCB7IGhvdXI6ICdudW1lcmljJywgbWludXRlOiAnMi1kaWdpdCcgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBkYXlLZXkoZCkge1xuICAgIHJldHVybiBgJHtkLmdldEZ1bGxZZWFyKCl9LSR7U3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyl9LSR7U3RyaW5nKGQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpfWA7XG4gIH1cblxuICAvLyBFdmVudCBjYWNoZSBrZXllZCBieSBpZGVudGl0eTogdWlkICsgc3RhcnQgKHJlY3VycmluZyBpbnN0YW5jZXMgc2hhcmUgYVxuICAvLyBVSUQgYnV0IGRpZmZlciBwZXIgb2NjdXJyZW5jZTsgZXZlbnRzIHdpdGhvdXQgVUlEIGZhbGwgYmFjayB0b1xuICAvLyBzdGFydCt0aXRsZSkuIE9uIGVhY2ggZmV0Y2gsIGVudHJpZXMgd2hvc2Ugc3RhcnQgZmFsbHMgSU5TSURFIHRoZSBmZXRjaGVkXG4gIC8vIHdpbmRvdyBhcmUgUkVQTEFDRUQgYnkgdGhlIHNlcnZlciByZXNwb25zZSAoYXV0aG9yaXRhdGl2ZSBmb3IgdGhhdFxuICAvLyB3aW5kb3cgXHUyMDE0IGRlbGV0aW9ucy9yZXNjaGVkdWxlcyBwcm9wYWdhdGUpOyBlbnRyaWVzIG91dHNpZGUgaXQgc3Vydml2ZS5cbiAgLy8gREMtMTY4OiBjYWNoZSBzZW1hbnRpY3MgbGl2ZSBpbiBjYWxlbmRhci1jYWNoZS5qcyAoc2FtZSBmaWxlIGJ1bmRsZWRcbiAgLy8gYWhlYWQgb2YgdGhpcyBvbmUpIHNvIHRlc3RzIGNhbiBleGVyY2lzZSB0aGVtIGRpcmVjdGx5LlxuICBjb25zdCBjYWNoZSA9ICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuQ2FsZW5kYXJDYWNoZSlcbiAgICA/IHdpbmRvdy5DYWxlbmRhckNhY2hlLmNyZWF0ZUNhY2hlKCkgOiBudWxsO1xuICBmdW5jdGlvbiBtZXJnZUV2ZW50cyhib2R5LCByYW5nZSkge1xuICAgIGlmIChjYWNoZSkgcmV0dXJuIGNhY2hlLm1lcmdlKGJvZHksIHJhbmdlKTtcbiAgICAvLyBmYWxsYmFjayBpZiB0aGUgaGVscGVyIHNvbWVob3cgZmFpbGVkIHRvIGxvYWQ6IG5haXZlIHBhc3N0aHJvdWdoXG4gICAgcmV0dXJuIGJvZHk7XG4gIH1cbiAgLy8gTG9hZGVkIHJhbmdlOiB0aGUgdW5pb24gb2YgW3N0YXJ0LGVuZF0gd2luZG93cyBhbHJlYWR5IGZldGNoZWQuIE5hdmlnYXRpbmdcbiAgLy8gdGhlIGdyaWQgb3V0c2lkZSBpdCB0cmlnZ2VycyBhIHJlZmV0Y2ggZm9yIHRoZSBtaXNzaW5nIG1vbnRoIChqdWRnZSByMTpcbiAgLy8gXCJyZWZldGNoIHdoZW4gbmF2aWdhdGluZyBvdXRzaWRlIHRoZSBsb2FkZWQgcmFuZ2VcIjsganVkZ2UgcjI6IG1lcmdlIGJ5XG4gIC8vIGV2ZW50IGlkZW50aXR5IHNvIG1vbnRoIG5hdmlnYXRpb24gbmV2ZXIgZHJvcHMgcHJpb3IgbW9udGhzKS5cbiAgLy8gZmV0Y2hlZCBpbnRlcnZhbHMgYXMgYSBkaXNqb2ludCBsaXN0IFx1MjAxNCBhIGdhcCBiZXR3ZWVuIHR3byBmZXRjaGVkIHdpbmRvd3NcbiAgLy8gaXMgTkVWRVIgcmVwb3J0ZWQgY292ZXJlZCAoanVkZ2UgcjYpLlxuICBsZXQgbG9hZGVkSW50ZXJ2YWxzID0gW107IC8vIFt7c3RhcnQ6IERhdGUsIGVuZDogRGF0ZX1dIHNvcnRlZCwgZGlzam9pbnRcbiAgZnVuY3Rpb24gd2luZG93Rm9yKHZpZXcpIHtcbiAgICAvLyBBbmNob3Igb24gdGhlIHZpc2libGUgbW9udGg6IHRoYXQgbW9udGggXHUwMEIxIHBhZGRpbmcgZm9yIHRoZSBjaGlwJ3NcbiAgICAvLyBcIm5leHQgYXBwb2ludG1lbnRcIiAoMSBkYXkgYmFjayBmb3IgaW4tcHJvZ3Jlc3MsIDIgbW9udGhzIGZvcndhcmQpLlxuICAgIGNvbnN0IGJhc2UgPSB2aWV3IHx8IG5ldyBEYXRlKCk7XG4gICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZShiYXNlLmdldEZ1bGxZZWFyKCksIGJhc2UuZ2V0TW9udGgoKSAtIDEsIDEsIDAsIDAsIDAsIDApO1xuICAgIGNvbnN0IGVuZCA9IG5ldyBEYXRlKGJhc2UuZ2V0RnVsbFllYXIoKSwgYmFzZS5nZXRNb250aCgpICsgMiwgMCwgMjMsIDU5LCA1OSwgOTk5KTtcbiAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gIH1cbiAgZnVuY3Rpb24gY292ZXJzKHJhbmdlKSB7XG4gICAgLy8gY292ZXJlZCBvbmx5IGlmIFNPTUUgc2luZ2xlIGZldGNoZWQgaW50ZXJ2YWwgZnVsbHkgY29udGFpbnMgdGhlIHJhbmdlXG4gICAgcmV0dXJuIGxvYWRlZEludGVydmFscy5zb21lKGl2ID0+XG4gICAgICBpdi5zdGFydC5nZXRUaW1lKCkgPD0gcmFuZ2Uuc3RhcnQuZ2V0VGltZSgpICYmXG4gICAgICBpdi5lbmQuZ2V0VGltZSgpID49IHJhbmdlLmVuZC5nZXRUaW1lKCkpO1xuICB9XG4gIGZ1bmN0aW9uIG1lcmdlUmFuZ2UocmFuZ2UpIHtcbiAgICAvLyBpbnNlcnQgKyBtZXJnZSBvdmVybGFwcGluZy9hZGphY2VudCBpbnRlcnZhbHMsIGtlZXBpbmcgdGhlIGxpc3QgZGlzam9pbnRcbiAgICBjb25zdCBpdnMgPSBsb2FkZWRJbnRlcnZhbHMuZmlsdGVyKGl2ID0+XG4gICAgICBpdi5lbmQuZ2V0VGltZSgpID49IHJhbmdlLnN0YXJ0LmdldFRpbWUoKSAmJiBpdi5zdGFydC5nZXRUaW1lKCkgPD0gcmFuZ2UuZW5kLmdldFRpbWUoKSk7XG4gICAgY29uc3QgcmVzdCA9IGxvYWRlZEludGVydmFscy5maWx0ZXIoaXYgPT4gIWl2cy5pbmNsdWRlcyhpdikpO1xuICAgIGlmIChpdnMubGVuZ3RoKSB7XG4gICAgICByYW5nZSA9IHtcbiAgICAgICAgc3RhcnQ6IG5ldyBEYXRlKE1hdGgubWluKHJhbmdlLnN0YXJ0LmdldFRpbWUoKSwgLi4uaXZzLm1hcChpID0+IGkuc3RhcnQuZ2V0VGltZSgpKSkpLFxuICAgICAgICBlbmQ6IG5ldyBEYXRlKE1hdGgubWF4KHJhbmdlLmVuZC5nZXRUaW1lKCksIC4uLml2cy5tYXAoaSA9PiBpLmVuZC5nZXRUaW1lKCkpKSksXG4gICAgICB9O1xuICAgIH1cbiAgICBsb2FkZWRJbnRlcnZhbHMgPSByZXN0LmNvbmNhdChbcmFuZ2VdKS5zb3J0KChhLCBiKSA9PiBhLnN0YXJ0IC0gYi5zdGFydCk7XG4gIH1cbiAgbGV0IHZpZXdNb250aCA9IG51bGw7IC8vIGZpcnN0IGRheSBvZiB2aXNpYmxlIG1vbnRoIChob2lzdGVkIGVhcmx5OiB1c2VkIGJ5IGZldGNoKVxuICBsZXQgbGFzdENhY2hlZCA9IHsgZXZlbnRzOiBbXSB9O1xuICBhc3luYyBmdW5jdGlvbiBmZXRjaENhbGVuZGFyKGZvcmNlKSB7XG4gICAgY29uc3QgcmFuZ2UgPSB3aW5kb3dGb3Iodmlld01vbnRoKTtcbiAgICBpZiAoIWZvcmNlICYmIGNvdmVycyhyYW5nZSkpIHJldHVybiBsYXN0Q2FjaGVkO1xuICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9jYWxlbmRhci9ldmVudHM/c3RhcnQ9JHtyYW5nZS5zdGFydC50b0lTT1N0cmluZygpfSZlbmQ9JHtyYW5nZS5lbmQudG9JU09TdHJpbmcoKX1gLCB7IGNhY2hlOiAnbm8tc3RvcmUnIH0pO1xuICAgIGlmIChyZXNwLnN0YXR1cyA9PT0gNDA0KSByZXR1cm4geyBub3RDb25maWd1cmVkOiB0cnVlIH07XG4gICAgaWYgKCFyZXNwLm9rKSB0aHJvdyBuZXcgRXJyb3IoYENhbGVuZGFyIEFQSSBIVFRQICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgIGxhc3RDYWNoZWQgPSBtZXJnZUV2ZW50cyhib2R5LCByYW5nZSk7XG4gICAgbWVyZ2VSYW5nZShyYW5nZSk7XG4gICAgcmV0dXJuIGxhc3RDYWNoZWQ7XG4gIH1cblxuICBmdW5jdGlvbiByZW5kZXJXaWRnZXQoYm9keSkge1xuICAgIGNvbnN0IGVscyA9IHdpZGdldEVscygpO1xuICAgIGlmICghZWxzLmljb24gfHwgIWVscy50ZXh0KSByZXR1cm47XG4gICAgY29uc3QgdXBjb21pbmcgPSB1cGNvbWluZ09ubHkoKGJvZHkgJiYgQXJyYXkuaXNBcnJheShib2R5LmV2ZW50cykpID8gYm9keS5ldmVudHMgOiBbXSk7XG4gICAgaWYgKCF1cGNvbWluZy5sZW5ndGgpIHtcbiAgICAgIGVscy5pY29uLnRleHRDb250ZW50ID0gJ1x1RDgzRFx1RENDNSc7XG4gICAgICBlbHMudGV4dC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJjYWwtY2hpcC1tdXRlZFwiPk5vIHVwY29taW5nIGFwcG9pbnRtZW50czwvc3Bhbj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gdXBjb21pbmdbMF07XG4gICAgZWxzLmljb24udGV4dENvbnRlbnQgPSBuZXh0LmFsbERheSA/ICdcdUQ4M0RcdURERDNcdUZFMEYnIDogJ1x1MjNGMCc7XG4gICAgZWxzLnRleHQuaW5uZXJIVE1MID0gYDxzcGFuIGNsYXNzPVwiY2FsLWNoaXAtdGl0bGVcIj4ke2VzY2FwZUh0bWwobmV4dC50aXRsZSB8fCAnVW50aXRsZWQnKX08L3NwYW4+YCArXG4gICAgICBgPHNwYW4gY2xhc3M9XCJjYWwtY2hpcC13aGVuXCI+XHUwMEI3ICR7ZXNjYXBlSHRtbChmbXRXaGVuKG5leHQuc3RhcnQsIG5leHQuYWxsRGF5KSl9PC9zcGFuPmA7XG4gIH1cblxuICAvLyAtLS0tIE1vbnRoIGdyaWQgLS0tLVxuICBmdW5jdGlvbiBldmVudE1hcChib2R5KSB7XG4gICAgY29uc3QgbWFwID0ge307XG4gICAgZm9yIChjb25zdCBldiBvZiAoKGJvZHkgJiYgQXJyYXkuaXNBcnJheShib2R5LmV2ZW50cykpID8gYm9keS5ldmVudHMgOiBbXSkpIHtcbiAgICAgIGNvbnN0IGsgPSBkYXlLZXkobmV3IERhdGUoZXYuc3RhcnQpKTtcbiAgICAgIChtYXBba10gPSBtYXBba10gfHwgW10pLnB1c2goZXYpO1xuICAgIH1cbiAgICByZXR1cm4gbWFwO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyR3JpZChib2R5KSB7XG4gICAgY29uc3QgZ3JpZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtZ3JpZCcpO1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbC1tb250aC1sYWJlbCcpO1xuICAgIGlmICghZ3JpZCB8fCAhbGFiZWwpIHJldHVybjtcbiAgICBpZiAoIXZpZXdNb250aCkgeyB2aWV3TW9udGggPSBuZXcgRGF0ZSgpOyB2aWV3TW9udGguc2V0RGF0ZSgxKTsgfVxuICAgIGNvbnN0IHkgPSB2aWV3TW9udGguZ2V0RnVsbFllYXIoKSwgbSA9IHZpZXdNb250aC5nZXRNb250aCgpO1xuICAgIGxhYmVsLnRleHRDb250ZW50ID0gdmlld01vbnRoLnRvTG9jYWxlRGF0ZVN0cmluZyh1bmRlZmluZWQsIHsgbW9udGg6ICdsb25nJywgeWVhcjogJ251bWVyaWMnIH0pO1xuICAgIGNvbnN0IGJ5RGF5ID0gZXZlbnRNYXAoYm9keSk7XG4gICAgY29uc3QgdG9kYXlLZXkgPSBkYXlLZXkobmV3IERhdGUoKSk7XG4gICAgY29uc3QgZmlyc3REb3cgPSBuZXcgRGF0ZSh5LCBtLCAxKS5nZXREYXkoKTtcbiAgICBjb25zdCBkYXlzSW4gPSBuZXcgRGF0ZSh5LCBtICsgMSwgMCkuZ2V0RGF0ZSgpO1xuICAgIGxldCBodG1sID0gWydTJywgJ00nLCAnVCcsICdXJywgJ1QnLCAnRicsICdTJ10ubWFwKGQgPT4gYDxkaXYgY2xhc3M9XCJjYWwtZG93XCI+JHtkfTwvZGl2PmApLmpvaW4oJycpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlyc3REb3c7IGkrKykgaHRtbCArPSAnPGRpdiBjbGFzcz1cImNhbC1kYXkgY2FsLXBhZFwiPjwvZGl2Pic7XG4gICAgZm9yIChsZXQgZGF5ID0gMTsgZGF5IDw9IGRheXNJbjsgZGF5KyspIHtcbiAgICAgIGNvbnN0IGtleSA9IGAke3l9LSR7U3RyaW5nKG0gKyAxKS5wYWRTdGFydCgyLCAnMCcpfS0ke1N0cmluZyhkYXkpLnBhZFN0YXJ0KDIsICcwJyl9YDtcbiAgICAgIGNvbnN0IGRheUV2ZW50cyA9IGJ5RGF5W2tleV0gfHwgW107XG4gICAgICBjb25zdCBjbHMgPSBbJ2NhbC1kYXknXTtcbiAgICAgIGlmIChrZXkgPT09IHRvZGF5S2V5KSBjbHMucHVzaCgnY2FsLXRvZGF5Jyk7XG4gICAgICBpZiAoZGF5RXZlbnRzLmxlbmd0aCkgY2xzLnB1c2goJ2NhbC1oYXMtZXZlbnRzJyk7XG4gICAgICBjb25zdCBkb3RzID0gZGF5RXZlbnRzLnNsaWNlKDAsIDMpLm1hcCgoZSkgPT5cbiAgICAgICAgYDxzcGFuIGNsYXNzPVwiY2FsLWRvdFwiIHRpdGxlPVwiJHtlc2NhcGVIdG1sKGZtdFRpbWUoZS5zdGFydCwgZS5hbGxEYXkpKX1cIj48L3NwYW4+YCkuam9pbignJyk7XG4gICAgICBjb25zdCB0aXAgPSBkYXlFdmVudHMubWFwKGUgPT4gYCR7Zm10VGltZShlLnN0YXJ0LCBlLmFsbERheSl9IFx1MjAxNCAke2UudGl0bGUgfHwgJ1VudGl0bGVkJ31gKS5qb2luKCdcXG4nKTtcbiAgICAgIGh0bWwgKz0gYDxkaXYgY2xhc3M9XCIke2Nscy5qb2luKCcgJyl9XCIgdGl0bGU9XCIke2VzY2FwZUh0bWwodGlwIHx8IGtleSl9XCI+YCArXG4gICAgICAgIGA8c3BhbiBjbGFzcz1cImNhbC1kYXludW1cIj4ke2RheX08L3NwYW4+JHtkb3RzID8gYDxzcGFuIGNsYXNzPVwiY2FsLWRvdHNcIj4ke2RvdHN9PC9zcGFuPmAgOiAnJ308L2Rpdj5gO1xuICAgIH1cbiAgICBncmlkLmlubmVySFRNTCA9IGh0bWw7XG4gIH1cblxuICBmdW5jdGlvbiB1cGNvbWluZ09ubHkoZXZlbnRzKSB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkoZXZlbnRzKSA/IGV2ZW50cyA6IFtdKVxuICAgICAgLmZpbHRlcihlID0+IHtcbiAgICAgICAgY29uc3QgZW5kVCA9IGUuZW5kID8gbmV3IERhdGUoZS5lbmQpLmdldFRpbWUoKSA6IG5ldyBEYXRlKGUuc3RhcnQpLmdldFRpbWUoKTtcbiAgICAgICAgcmV0dXJuIGVuZFQgPj0gbm93OyAvLyBvbmdvaW5nIGFwcG9pbnRtZW50cyBzdGlsbCBxdWFsaWZ5XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IG5ldyBEYXRlKGEuc3RhcnQpIC0gbmV3IERhdGUoYi5zdGFydCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyVXBjb21pbmcoYm9keSkge1xuICAgIGNvbnN0IGxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsZW5kYXItdXBjb21pbmctbGlzdCcpO1xuICAgIGlmICghbGlzdCkgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50cyA9IHVwY29taW5nT25seSgoYm9keSAmJiBBcnJheS5pc0FycmF5KGJvZHkuZXZlbnRzKSkgPyBib2R5LmV2ZW50cyA6IFtdKTtcbiAgICBpZiAoIWV2ZW50cy5sZW5ndGgpIHtcbiAgICAgIGxpc3QuaW5uZXJIVE1MID0gJzxkaXYgY2xhc3M9XCJjYWwtZW1wdHlcIj5ObyB1cGNvbWluZyBhcHBvaW50bWVudHMuPC9kaXY+JztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGlzdC5pbm5lckhUTUwgPSBldmVudHMuc2xpY2UoMCwgMTIpLm1hcChldiA9PlxuICAgICAgYDxkaXYgY2xhc3M9XCJjYWwtcm93XCI+XG4gICAgICAgICA8c3BhbiBjbGFzcz1cImNhbC13aGVuXCI+JHtlc2NhcGVIdG1sKGZtdFdoZW4oZXYuc3RhcnQsIGV2LmFsbERheSkpfTwvc3Bhbj5cbiAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FsLWV2dGl0bGVcIj4ke2VzY2FwZUh0bWwoZXYudGl0bGUgfHwgJ1VudGl0bGVkJyl9PC9zcGFuPlxuICAgICAgICAgJHtldi5sb2NhdGlvbiA/IGA8c3BhbiBjbGFzcz1cImNhbC1sb2NcIj4ke2VzY2FwZUh0bWwoZXYubG9jYXRpb24pfTwvc3Bhbj5gIDogJyd9XG4gICAgICAgPC9kaXY+YCkuam9pbignJyk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZW5kZXJTb3VyY2VzKCkge1xuICAgIGNvbnN0IGxpc3RFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxlbmRhci1zb3VyY2VzLWxpc3QnKTtcbiAgICBpZiAoIWxpc3RFbCkgcmV0dXJuO1xuICAgIGxldCBzb3VyY2VzID0gW107XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9jYWxlbmRhci9zb3VyY2VzJywgeyBjYWNoZTogJ25vLXN0b3JlJyB9KTtcbiAgICAgIGlmIChyZXNwLm9rKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgICAgc291cmNlcyA9IChib2R5ICYmIEFycmF5LmlzQXJyYXkoYm9keS5zb3VyY2VzKSkgPyBib2R5LnNvdXJjZXNcbiAgICAgICAgICA6IChBcnJheS5pc0FycmF5KGJvZHkpID8gYm9keSA6IFtdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IC8qIG1vZGFsIHN0aWxsIHVzYWJsZSAqLyB9XG4gICAgaWYgKCFzb3VyY2VzLmxlbmd0aCkge1xuICAgICAgbGlzdEVsLmlubmVySFRNTCA9ICc8ZGl2IGNsYXNzPVwiY2FsLWVtcHR5XCI+Tm8gY2FsZW5kYXJzIGNvbm5lY3RlZC4gRGVwbG95IFJhZGljYWxlIGZyb20gdGhlIEFwcCBTZWxlY3RvciB0byBhdXRvLWNvbm5lY3Qgb25lLCBvciBhZGQgYSBDYWxEQVYvSUNTIFVSTCBiZWxvdy48L2Rpdj4nO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsaXN0RWwuaW5uZXJIVE1MID0gc291cmNlcy5tYXAocyA9PiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsLXJvdyBjYWwtc3JjLXJvd1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNhbC1ldnRpdGxlXCI+JHtlc2NhcGVIdG1sKHMubmFtZSB8fCBzLmlkKX1cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhbC1sb2NcIj5cdTAwQjcgJHtlc2NhcGVIdG1sKHMudHlwZSl9JHtzLmF1dG9Qcm92aXNpb25lZCA/ICcgXHUwMEI3IGF1dG8td2lyZWQnIDogJyd9PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNhbC1zcmMtdG9nZ2xlIGNhbC1idG5cIiBkYXRhLWlkPVwiJHtlc2NhcGVIdG1sKHMuaWQpfVwiIGRhdGEtZW5hYmxlZD1cIiR7cy5lbmFibGVkICE9PSBmYWxzZSA/ICcxJyA6ICcwJ31cIj4ke3MuZW5hYmxlZCAhPT0gZmFsc2UgPyAnXHUyNzEzIG9uJyA6ICdvZmYnfTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2FsLXNyYy1kZWwgY2FsLWJ0biBjYWwtYnRuLWRhbmdlclwiIGRhdGEtaWQ9XCIke2VzY2FwZUh0bWwocy5pZCl9XCI+cmVtb3ZlPC9idXR0b24+XG4gICAgICA8L2Rpdj5gKS5qb2luKCcnKTtcbiAgICBsaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnLmNhbC1zcmMtdG9nZ2xlJykuZm9yRWFjaChidG4gPT4gYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBidG4uZGF0YXNldC5pZDtcbiAgICAgIGNvbnN0IGVuYWJsZSA9IGJ0bi5kYXRhc2V0LmVuYWJsZWQgIT09ICcxJztcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvY2FsZW5kYXIvc291cmNlcy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YCwge1xuICAgICAgICAgIG1ldGhvZDogJ1BVVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgZW5hYmxlZDogZW5hYmxlIH0pXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3Auc3RhdHVzfWApO1xuICAgICAgICByZW5kZXJTb3VyY2VzKCk7IHJlZnJlc2godHJ1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYENhbGVuZGFyIHNvdXJjZSB1cGRhdGUgZmFpbGVkOiAke2UubWVzc2FnZX1gLCAnZXJyb3InKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pKTtcbiAgICBsaXN0RWwucXVlcnlTZWxlY3RvckFsbCgnLmNhbC1zcmMtZGVsJykuZm9yRWFjaChidG4gPT4gYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaWQgPSBidG4uZGF0YXNldC5pZDtcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goYC9hcGkvdjEvY2FsZW5kYXIvc291cmNlcy8ke2VuY29kZVVSSUNvbXBvbmVudChpZCl9YCwgeyBtZXRob2Q6ICdERUxFVEUnIH0pO1xuICAgICAgICBpZiAoIXJlc3Aub2spIHRocm93IG5ldyBFcnJvcihgSFRUUCAke3Jlc3Auc3RhdHVzfWApO1xuICAgICAgICByZW5kZXJTb3VyY2VzKCk7IHJlZnJlc2godHJ1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oYENhbGVuZGFyIHNvdXJjZSByZW1vdmFsIGZhaWxlZDogJHtlLm1lc3NhZ2V9YCwgJ2Vycm9yJyk7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBidG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICBsZXQgbGFzdEJvZHkgPSBudWxsO1xuICBhc3luYyBmdW5jdGlvbiByZWZyZXNoKGZvcmNlKSB7XG4gICAgLy8gQ29hbGVzY2UgaW5zdGVhZCBvZiBkcm9wcGluZyAoYXVkaXQgMjAyNi0xMC0yNyk6IGEgZm9yY2VkIHJlZnJlc2ggdGhhdFxuICAgIC8vIGxhbmRzIHdoaWxlIGFub3RoZXIgaXMgbWlkLWZsaWdodCBwcmV2aW91c2x5IHZhbmlzaGVkLCBsZWF2aW5nIHRoZVxuICAgIC8vIGNoaXAvZ3JpZCBzdGFsZSB1bnRpbCB0aGUgbmV4dCA1LW1pbnV0ZSB0aWNrLlxuICAgIGlmIChyZWZyZXNoLl9pbkZsaWdodCkgeyBpZiAoZm9yY2UpIHJlZnJlc2guX3BlbmRpbmdGb3JjZSA9IHRydWU7IHJldHVybjsgfVxuICAgIHJlZnJlc2guX2luRmxpZ2h0ID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgLy8gZm9yY2U9dHJ1ZSAocGVyaW9kaWMgdGljaywgc291cmNlIG11dGF0aW9ucyk6IGJ5cGFzcyB0aGUgY292ZXJlZC1cbiAgICAgIC8vIHdpbmRvdyBjYWNoZSBzbyBzZXJ2ZXItc2lkZSBkZWxldGlvbnMvcmVzY2hlZHVsZXMgcHJvcGFnYXRlLlxuICAgICAgbGV0IGJvZHkgPSBhd2FpdCBmZXRjaENhbGVuZGFyKCEhZm9yY2UpO1xuICAgICAgaWYgKGZvcmNlICYmIHZpZXdNb250aCkge1xuICAgICAgICAvLyBuYXZpZ2F0ZWQgdmlldzogQUxTTyByZWZyZXNoIHRoZSBub3ctd2luZG93IHNvIHRoZSBjaGlwIGNhbid0IGdvXG4gICAgICAgIC8vIHN0YWxlLCB0aGVuIHRoZSB2aWV3IHdpbmRvdyBzbyB0aGUgZ3JpZCBjYW4ndCBnbyBzdGFsZS4gVGhlIENISVBcbiAgICAgICAgLy8gYWx3YXlzIHJlbmRlcnMgZnJvbSB0aGUgbm93LXdpbmRvdyAocjE0OiBhIHZpZXdlZCBmdXR1cmUvcGFzdCBtb250aFxuICAgICAgICAvLyBtdXN0IG5ldmVyIHJlcGxhY2UgdGhlIHJlYWwgbmV4dCBhcHBvaW50bWVudCkuXG4gICAgICAgIGNvbnN0IHNhdmVkID0gdmlld01vbnRoO1xuICAgICAgICB2aWV3TW9udGggPSBudWxsO1xuICAgICAgICBjb25zdCBub3dCb2R5ID0gYXdhaXQgZmV0Y2hDYWxlbmRhcih0cnVlKTtcbiAgICAgICAgdmlld01vbnRoID0gc2F2ZWQ7XG4gICAgICAgIGNvbnN0IHZpZXdCb2R5ID0gYXdhaXQgZmV0Y2hDYWxlbmRhcih0cnVlKTtcbiAgICAgICAgcmVuZGVyV2lkZ2V0KG5vd0JvZHkpOyAgICAgICAvLyBjaGlwID0gYWN0dWFsIG5leHQgYXBwb2ludG1lbnRcbiAgICAgICAgcmVuZGVyR3JpZCh2aWV3Qm9keSk7ICAgICAgICAvLyBncmlkID0gbmF2aWdhdGVkIG1vbnRoXG4gICAgICAgIHJlbmRlclVwY29taW5nKG5vd0JvZHkpOyAgICAgLy8gbGlzdCA9IHVwY29taW5nIG9ubHlcbiAgICAgICAgbGFzdEJvZHkgPSBub3dCb2R5O1xuICAgICAgICByZWZyZXNoLl9pbkZsaWdodCA9IGZhbHNlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmlld01vbnRoKSB7XG4gICAgICAgIC8vIHIxNTogbm9uLWZvcmNlZCByZWZyZXNoIHdpdGggYSBuYXZpZ2F0ZWQgdmlld01vbnRoIFx1MjAxNCBzYW1lIGd1YXJhbnRlZTpcbiAgICAgICAgLy8gY2hpcCBmcm9tIHRoZSBOT1ctd2luZG93LCBncmlkIGZyb20gdGhlIHZpZXctd2luZG93LlxuICAgICAgICBjb25zdCBzYXZlZCA9IHZpZXdNb250aDtcbiAgICAgICAgdmlld01vbnRoID0gbnVsbDtcbiAgICAgICAgY29uc3Qgbm93Qm9keSA9IGF3YWl0IGZldGNoQ2FsZW5kYXIoZmFsc2UpO1xuICAgICAgICB2aWV3TW9udGggPSBzYXZlZDtcbiAgICAgICAgY29uc3Qgdmlld0JvZHkgPSBhd2FpdCBmZXRjaENhbGVuZGFyKGZhbHNlKTtcbiAgICAgICAgcmVuZGVyV2lkZ2V0KG5vd0JvZHkpO1xuICAgICAgICByZW5kZXJHcmlkKHZpZXdCb2R5KTtcbiAgICAgICAgcmVuZGVyVXBjb21pbmcobm93Qm9keSk7XG4gICAgICAgIGxhc3RCb2R5ID0gbm93Qm9keTtcbiAgICAgICAgcmVmcmVzaC5faW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGFzdEJvZHkgPSBib2R5O1xuICAgICAgcmVuZGVyV2lkZ2V0KGJvZHkpO1xuICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxlbmRhci1tb2RhbCcpLmNsYXNzTGlzdC5jb250YWlucygnc2hvdycpKSB7XG4gICAgICAgIHJlbmRlckdyaWQoYm9keSk7XG4gICAgICAgIHJlbmRlclVwY29taW5nKGJvZHkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2dFcnJvcignY2FsZW5kYXItd2lkZ2V0JywgZSk7IC8vIHdhcyBlcnJvckhhbmRsZXIubG9nKCkgXHUyMDE0IHdoaWNoIG5ldmVyIGV4aXN0ZWQgKG9ubHkgbG9nRXJyb3IgZG9lcyksIHNvIHRoZSBjYXRjaCBpdHNlbGYgdGhyZXdcbiAgICAgIGNvbnN0IGVscyA9IHdpZGdldEVscygpO1xuICAgICAgaWYgKGVscy50ZXh0KSBlbHMudGV4dC5pbm5lckhUTUwgPSAnPHNwYW4gY2xhc3M9XCJjYWwtY2hpcC1tdXRlZFwiPkNhbGVuZGFyIG9mZmxpbmU8L3NwYW4+JztcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcmVmcmVzaC5faW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgIGlmIChyZWZyZXNoLl9wZW5kaW5nRm9yY2UpIHtcbiAgICAgICAgcmVmcmVzaC5fcGVuZGluZ0ZvcmNlID0gZmFsc2U7XG4gICAgICAgIHJlZnJlc2godHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tLSBNb2RhbCB3aXJpbmcgKGNsYXNzLWJhc2VkIC5zaG93IGxpa2UgZXZlcnkgb3RoZXIgbW9kYWwsIHNvXG4gIC8vIGNsaWNrLW91dHNpZGUgdmlhIHdpcmVNb2RhbCArIEVzY2FwZSArIGZvY3VzIG1hbmFnZW1lbnQgYWxsIHdvcmspIC0tLS1cbiAgbGV0IGNhbExhc3RGb2N1cyA9IG51bGw7XG4gIGZ1bmN0aW9uIG9wZW5Nb2RhbCgpIHtcbiAgICBjYWxMYXN0Rm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIGNvbnN0IG1vZGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGVuZGFyLW1vZGFsJyk7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICAgIHJlbmRlckdyaWQobGFzdEJvZHkgfHwgeyBldmVudHM6IFtdIH0pO1xuICAgIHJlbmRlclVwY29taW5nKGxhc3RCb2R5IHx8IHsgZXZlbnRzOiBbXSB9KTtcbiAgICByZW5kZXJTb3VyY2VzKCk7XG4gICAgLy8gcmVmcmVzaCgpIHJlbmRlcnMgZ3JpZCt1cGNvbWluZyBpdHNlbGYgb25jZSB0aGUgbW9kYWwgaXMgc2hvd2luZyBcdTIwMTQgb25lXG4gICAgLy8gZmV0Y2ggc2VxdWVuY2UsIG5vdCB0d28gcmFjaW5nIG9uZXMgKGF1ZGl0IDIwMjYtMTAtMjcpLlxuICAgIHJlZnJlc2goKTtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsZW5kYXItY2xvc2UnKS5mb2N1cygpO1xuICB9XG4gIGZ1bmN0aW9uIGNsb3NlTW9kYWwoKSB7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbGVuZGFyLW1vZGFsJykuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIGlmIChjYWxMYXN0Rm9jdXMgJiYgdHlwZW9mIGNhbExhc3RGb2N1cy5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykgY2FsTGFzdEZvY3VzLmZvY3VzKCk7XG4gIH1cblxuICBmdW5jdGlvbiBmb3JtQ3JlZHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtYWRkLXR5cGUnKS52YWx1ZSxcbiAgICAgIG5hbWU6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtYWRkLW5hbWUnKS52YWx1ZS50cmltKCksXG4gICAgICB1cmw6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtYWRkLXVybCcpLnZhbHVlLnRyaW0oKSxcbiAgICAgIHVzZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtYWRkLXVzZXInKS52YWx1ZS50cmltKCksXG4gICAgICBwYXNzOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsLWFkZC1wYXNzJykudmFsdWUsXG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFN0YXR1cyhtc2cpIHtcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsLWFkZC1zdGF0dXMnKS50ZXh0Q29udGVudCA9IG1zZztcbiAgfVxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtYWRkLXRlc3QnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmID0gZm9ybUNyZWRzKCk7XG4gICAgaWYgKCFmLnVybCkgeyBzZXRTdGF0dXMoJ0VudGVyIGEgVVJMIGZpcnN0LicpOyByZXR1cm47IH1cbiAgICBzZXRTdGF0dXMoJ1Rlc3RpbmdcdTIwMjYnKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IHNlY3VyZUZldGNoKCcvYXBpL3YxL2NhbGVuZGFyL2Rpc2NvdmVyJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJywgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgdXJsOiBmLnVybCwgdXNlcjogZi51c2VyLCBwYXNzOiBmLnBhc3MgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpO1xuICAgICAgY29uc3QgcCA9IGJvZHkgJiYgYm9keS5wcm9iZTtcbiAgICAgIGlmIChwICYmIHAub2spIHNldFN0YXR1cyhgXHUyNzEzIFJlYWNoYWJsZSAoJHtwLnNlcnZlciB8fCAnc2VydmVyJ30pJHtwLmxvb2tzTGlrZUNhbGVuZGFyID8gJyBcdTIwMTQgbG9va3MgbGlrZSBhIGNhbGVuZGFyJyA6ICcnfWApO1xuICAgICAgZWxzZSBzZXRTdGF0dXMoYFx1MjcxNyAke3AgJiYgcC5lcnJvciA/IHAuZXJyb3IgOiAnTm90IHJlYWNoYWJsZSd9YCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc2V0U3RhdHVzKGBcdTI3MTcgJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9KTtcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsLWFkZC1zYXZlJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZiA9IGZvcm1DcmVkcygpO1xuICAgIGlmICghZi5uYW1lIHx8ICFmLnVybCkgeyBzZXRTdGF0dXMoJ05hbWUgYW5kIFVSTCBhcmUgcmVxdWlyZWQuJyk7IHJldHVybjsgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvY2FsZW5kYXIvc291cmNlcycsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IG5hbWU6IGYubmFtZSwgdHlwZTogZi50eXBlLCB1cmw6IGYudXJsLCB1c2VyOiBmLnVzZXIsIHBhc3M6IGYucGFzcyB9KVxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgICBzZXRTdGF0dXMoYFx1MjcxNyAke2JvZHkuZXJyb3IgfHwgYm9keS5tZXNzYWdlIHx8IGBIVFRQICR7cmVzcC5zdGF0dXN9YH1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2V0U3RhdHVzKCdTYXZlZC4nKTtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWwtYWRkLWRldGFpbHMnKS5vcGVuID0gZmFsc2U7XG4gICAgICBbJ2NhbC1hZGQtbmFtZScsICdjYWwtYWRkLXVybCcsICdjYWwtYWRkLXVzZXInLCAnY2FsLWFkZC1wYXNzJ10uZm9yRWFjaChpZCA9PiB7IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS52YWx1ZSA9ICcnOyB9KTtcbiAgICAgIHJlbmRlclNvdXJjZXMoKTsgcmVmcmVzaCh0cnVlKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzZXRTdGF0dXMoYFx1MjcxNyAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGNhbEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxlbmRhci13aWRnZXQnKTtcbiAgaWYgKGNhbEJ0bikge1xuICAgIGNhbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5Nb2RhbCk7XG4gICAgLy8gcm9sZT1cImJ1dHRvblwiICsgdGFiaW5kZXg9MCBwcm9taXNlIGtleWJvYXJkIHN1cHBvcnQgXHUyMDE0IGhvbm9yIGl0XG4gICAgLy8gKGF1ZGl0IDIwMjYtMTAtMjc6IEVudGVyL1NwYWNlIHByZXZpb3VzbHkgZGlkIG5vdGhpbmcpLlxuICAgIGNhbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VudGVyJyB8fCBlLmtleSA9PT0gJyAnIHx8IGUua2V5ID09PSAnU3BhY2ViYXInKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgb3Blbk1vZGFsKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgY29uc3QgY2FsU2V0dGluZ3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsZW5kYXItc2V0dGluZ3MnKTtcbiAgaWYgKGNhbFNldHRpbmdzKSBjYWxTZXR0aW5ncy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGUuc3RvcFByb3BhZ2F0aW9uKCk7IG9wZW5Nb2RhbCgpOyB9KTtcbiAgY29uc3QgY2FsTW9kYWxFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxlbmRhci1tb2RhbCcpO1xuICBpZiAoY2FsTW9kYWxFbCkge1xuICAgIC8vIEFsbCB0aHJlZSBkaXNtaXNzYWwgcGF0aHMgKENsb3NlIGJ1dHRvbiwgYmFja2Ryb3AgY2xpY2ssIEVzY2FwZSkgcm91dGVcbiAgICAvLyB0aHJvdWdoIGNsb3NlTW9kYWwgc28gZm9jdXMgcmV0dXJucyB0byB0aGUgd2lkZ2V0IGV2ZXJ5IHRpbWUgKGp1ZGdlXG4gICAgLy8gcG9saXNoLCB1cm46dW1wOmRieG15aHZyN2Nwa2V1M21iZmRldnJjbzd1dHNvazc0M3VkanNqN2F0aWg2cWs0ZnJkaXEgXHUyMDE0XG4gICAgLy8gd2lyZU1vZGFsJ3Mgb3duIGhhbmRsZXJzIGJ5cGFzcyBmb2N1cyByZXN0b3JlLCBzbyB0aGV5J3JlIG5vdCB1c2VkIGhlcmUpLlxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYWxlbmRhci1jbG9zZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgY2xvc2VNb2RhbCk7XG4gICAgY2FsTW9kYWxFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IGlmIChlLnRhcmdldCA9PT0gY2FsTW9kYWxFbCkgY2xvc2VNb2RhbCgpOyB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScgJiYgY2FsTW9kYWxFbC5jbGFzc0xpc3QuY29udGFpbnMoJ3Nob3cnKSkgY2xvc2VNb2RhbCgpO1xuICAgIH0pO1xuICB9XG4gIGFzeW5jIGZ1bmN0aW9uIG5hdmlnYXRlKGRlbHRhKSB7XG4gICAgaWYgKCF2aWV3TW9udGgpIHsgdmlld01vbnRoID0gbmV3IERhdGUoKTsgdmlld01vbnRoLnNldERhdGUoMSk7IH1cbiAgICB2aWV3TW9udGggPSBuZXcgRGF0ZSh2aWV3TW9udGguZ2V0RnVsbFllYXIoKSwgdmlld01vbnRoLmdldE1vbnRoKCkgKyBkZWx0YSwgMSk7XG4gICAgY29uc3QgYm9keSA9IGF3YWl0IGZldGNoQ2FsZW5kYXIoZmFsc2UpLmNhdGNoKCgpID0+IGxhc3RCb2R5KTtcbiAgICByZW5kZXJHcmlkKGJvZHkgfHwgeyBldmVudHM6IFtdIH0pO1xuICB9XG4gIGNvbnN0IGNhbFByZXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsLXByZXYnKTtcbiAgaWYgKGNhbFByZXYpIGNhbFByZXYuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IG5hdmlnYXRlKC0xKTsgfSk7XG4gIGNvbnN0IGNhbE5leHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2FsLW5leHQnKTtcbiAgaWYgKGNhbE5leHQpIGNhbE5leHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7IG5hdmlnYXRlKDEpOyB9KTtcblxuICB3aW5kb3cucmVmcmVzaENhbGVuZGFyV2lkZ2V0ID0gcmVmcmVzaDtcblxuICBjb25zdCBQT0xMID0gKHR5cGVvZiBEQyAhPT0gJ3VuZGVmaW5lZCcgJiYgREMuUE9MTCAmJiBEQy5QT0xMLkNBTEVOREFSKSB8fCAzMDAwMDA7XG4gIC8vIFNraXAgdGlja3MgaW4gaGlkZGVuIHRhYnM7IGNhdGNoIHVwIG9uY2Ugb24gcmV0dXJuIChhdWRpdCAyMDI2LTEwLTI3KS5cbiAgc2V0SW50ZXJ2YWwoKCkgPT4geyBpZiAoIWRvY3VtZW50LmhpZGRlbikgcmVmcmVzaCh0cnVlKTsgfSwgUE9MTCk7IC8vIGZvcmNlZDogY2F0Y2ggc2VydmVyLXNpZGUgZGVsZXRpb25zXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCAoKSA9PiB7IGlmICghZG9jdW1lbnQuaGlkZGVuKSByZWZyZXNoKHRydWUpOyB9KTtcbiAgc2V0VGltZW91dChyZWZyZXNoLCA0MDApO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gQ09OTkVDVCBZT1VSIEFJIChEQy0xNjIpID09PT09PT09PT1cbi8vIE9uZSBidXR0b24sIG9uZSBmbG93OiBjbGljayBcIlx1RDgzRVx1REQxNiBDb25uZWN0IEFJXCIgXHUyMTkyIHBpY2sgQ2xhdWRlL0NoYXRHUFQvZ2VuZXJpY1xuLy8gXHUyMTkyIERhc2hDYWRkeSBtaW50cyBhIGRlZGljYXRlZCBka18ga2V5ICsgcmVhZHktdG8tcGFzdGUgTUNQIGNvbmZpZy4gVGhlXG4vLyBkYXNoYm9hcmQncyBvd24gc2Vzc2lvbiBkb2VzIHRoZSBzaWduaW5nLWluOyB0aGUgQUkgYXNzaXN0YW50IGF1dGhlbnRpY2F0ZXNcbi8vIHdpdGggdGhlIGtleSBhZ2FpbnN0IFBPU1QgL2FwaS92MS9tY3AuIEtleXMgbGlzdGVkL3Jldm9rZWFibGUgaGVyZSB0b28uXG4oZnVuY3Rpb24oKSB7XG4gIGNvbnN0IGVycm9ySGFuZGxlciA9IG5ldyBFcnJvckhhbmRsZXIoKTtcblxuICBpbmplY3RNb2RhbCgnYWktY29ubmVjdC1tb2RhbCcsIGA8ZGl2IGlkPVwiYWktY29ubmVjdC1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWNvbnRlbnRcIiBzdHlsZT1cIm1pbi13aWR0aDo1NjBweDttYXgtd2lkdGg6NzIwcHg7XCI+XG4gICAgICA8aDM+XHVEODNFXHVERDE2IENvbm5lY3QgeW91ciBBSSBhc3Npc3RhbnQ8L2gzPlxuICAgICAgPGRpdiBpZD1cImFpY29ubi1pbnRyb1wiIHN0eWxlPVwiZm9udC1zaXplOjAuODVyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1ib3R0b206MTJweDtcIj5cbiAgICAgICAgRGFzaENhZGR5IHNwZWFrcyBNQ1AgXHUyMDE0IENsYXVkZSwgQ2hhdEdQVCBhbmQgb3RoZXIgQUkgYXNzaXN0YW50cyBjYW4gbWFuYWdlIHlvdXJcbiAgICAgICAgaG9tZWxhYiAoZGVwbG95IGFwcHMsIGNoZWNrIGhlYWx0aCwgZWRpdCBETlMpIHRocm91Z2ggb25lIGVuZHBvaW50LlxuICAgICAgICBQaWNrIGFuIGFzc2lzdGFudCBhbmQgRGFzaENhZGR5IGdlbmVyYXRlcyB0aGUgYWNjZXNzIGtleSArIGNvbmZpZyBmb3IgaXQuXG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImFpY29ubi1lbmRwb2ludFwiIHN0eWxlPVwiZGlzcGxheTpub25lO21hcmdpbjowIDAgMTJweDtwYWRkaW5nOjhweCAxMHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6MC44cmVtO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOnZhcigtLW11dGVkKTtcIj5NQ1AgZW5kcG9pbnQ6PC9zcGFuPlxuICAgICAgICA8Y29kZSBpZD1cImFpY29ubi1lbmRwb2ludC11cmxcIiBzdHlsZT1cInVzZXItc2VsZWN0OmFsbDtcIj5cdTIwMTQ8L2NvZGU+XG4gICAgICAgIDxidXR0b24gaWQ9XCJhaWNvbm4tY29weS1lbmRwb2ludFwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6OHB4O2ZvbnQtc2l6ZTowLjc1cmVtO1wiPkNvcHk8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBpZD1cImFpY29ubi10b29sc1wiIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi10b3A6MnB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU3RlcCAxOiBwaWNrIGNsaWVudCAtLT5cbiAgICAgIDxkaXYgaWQ9XCJhaWNvbm4tc3RlcC1waWNrXCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luOjZweCAwIDhweDtcIj5DaG9vc2UgeW91ciBhc3Npc3RhbnQ6PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDtmbGV4LXdyYXA6d3JhcDtcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWljb25uLWNsaWVudC1idG5cIiBkYXRhLWNsaWVudD1cImNsYXVkZVwiPlx1RDgzRFx1REZFMCBDbGF1ZGU8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYWljb25uLWNsaWVudC1idG5cIiBkYXRhLWNsaWVudD1cImNoYXRncHRcIj5cdUQ4M0RcdURGRTIgQ2hhdEdQVDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhaWNvbm4tY2xpZW50LWJ0blwiIGRhdGEtY2xpZW50PVwiZ2VuZXJpY1wiPlx1RDgzRFx1REQwQyBPdGhlciAvIGdlbmVyaWM8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTdGVwIDI6IHRoZSBnZW5lcmF0ZWQgY29ubmVjdGlvbiAtLT5cbiAgICAgIDxkaXYgaWQ9XCJhaWNvbm4tc3RlcC1jb25maWdcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTttYXJnaW4tdG9wOjEycHg7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo2cHg7XCIgaWQ9XCJhaWNvbm4tY29uZmlnLXRpdGxlXCI+WW91ciBhY2Nlc3Mga2V5IChzaG93biBvbmNlKTo8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtnYXA6NnB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjEwcHg7XCI+XG4gICAgICAgICAgPGNvZGUgaWQ9XCJhaWNvbm4ta2V5XCIgc3R5bGU9XCJmbGV4OjE7cGFkZGluZzo2cHggOHB4O2JvcmRlcjoxcHggc29saWQgdmFyKC0tYWNjZW50KTtib3JkZXItcmFkaXVzOjRweDtiYWNrZ3JvdW5kOmNvbG9yLW1peChpbiBzcmdiLCB2YXIoLS1hY2NlbnQpIDglLCB0cmFuc3BhcmVudCk7dXNlci1zZWxlY3Q6YWxsO3dvcmQtYnJlYWs6YnJlYWstYWxsO1wiPlx1MjAxNDwvY29kZT5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYWljb25uLWNvcHkta2V5XCI+Q29weTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OjYwMDttYXJnaW4tYm90dG9tOjZweDtcIj5QYXN0ZSBpbnRvIHlvdXIgY2xpZW50OjwvZGl2PlxuICAgICAgICA8cHJlIGlkPVwiYWljb25uLXNuaXBwZXRcIiBzdHlsZT1cIndoaXRlLXNwYWNlOnByZS13cmFwO3dvcmQtYnJlYWs6YnJlYWstYWxsO2ZvbnQtc2l6ZTowLjc4cmVtO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjEwcHg7bWF4LWhlaWdodDoyMjBweDtvdmVyZmxvdzphdXRvO21hcmdpbjowIDAgOHB4O1wiPjwvcHJlPlxuICAgICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2dhcDo2cHg7YWxpZ24taXRlbXM6Y2VudGVyO21hcmdpbi1ib3R0b206OHB4O1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJhaWNvbm4tY29weS1zbmlwcGV0XCI+Q29weSBjb25maWc8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiYWljb25uLWJhY2tcIj5cdTIxOTAgQ2hvb3NlIGEgZGlmZmVyZW50IGFzc2lzdGFudDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cImFpY29ubi1jbGllbnQtbm90ZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNzhyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1ib3R0b206MTBweDtcIj48L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEV4aXN0aW5nIGNvbm5lY3Rpb25zIC0tPlxuICAgICAgPGRpdiBzdHlsZT1cIm1hcmdpbi10b3A6MTRweDtwYWRkaW5nLXRvcDoxMnB4O2JvcmRlci10b3A6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7XCI+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXdlaWdodDo2MDA7bWFyZ2luLWJvdHRvbTo2cHg7XCI+QWN0aXZlIEFJIGNvbm5lY3Rpb25zPC9kaXY+XG4gICAgICAgIDxkaXYgaWQ9XCJhaWNvbm4tY29ubmVjdGlvbnNcIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Z2FwOjRweDttYXgtaGVpZ2h0OjE2MHB4O292ZXJmbG93LXk6YXV0bztcIj5cbiAgICAgICAgICA8ZGl2IHN0eWxlPVwiZm9udC1zaXplOjAuOHJlbTtjb2xvcjp2YXIoLS1tdXRlZCk7XCI+TG9hZGluZ1x1MjAyNjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zIG1vZGFsLWZvb3Rlci1iYXJcIj5cbiAgICAgICAgPHNwYW4gaWQ9XCJhaWNvbm4tc3RhdHVzXCIgc3R5bGU9XCJmbGV4OjE7Zm9udC1zaXplOjAuNzhyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO2FsaWduLXNlbGY6Y2VudGVyO1wiPjwvc3Bhbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImFpY29ubi1jbG9zZVwiPkNsb3NlPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj48L2Rpdj5gKTtcblxuICBjb25zdCAkID0gKGlkKSA9PiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7XG4gIGxldCBpbmZvID0gbnVsbDtcblxuICBmdW5jdGlvbiBzZXRTdGF0dXMobXNnKSB7ICQoJ2FpY29ubi1zdGF0dXMnKS50ZXh0Q29udGVudCA9IG1zZzsgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGxvYWRJbmZvKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbWNwL2luZm8nKTtcbiAgICAgIGlmICghcmVzcC5vaykgdGhyb3cgbmV3IEVycm9yKGBIVFRQICR7cmVzcC5zdGF0dXN9YCk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBpbmZvID0gYm9keTtcbiAgICAgICQoJ2FpY29ubi1lbmRwb2ludCcpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgJCgnYWljb25uLWVuZHBvaW50LXVybCcpLnRleHRDb250ZW50ID0gYm9keS5lbmRwb2ludDtcbiAgICAgICQoJ2FpY29ubi10b29scycpLnRleHRDb250ZW50ID0gYCR7Ym9keS50b29sQ291bnR9IHRvb2xzIFx1MDBCNyBNQ1AgJHtib2R5LnByb3RvY29sVmVyc2lvbn0gXHUwMEI3IERhc2hDYWRkeSB2JHtib2R5LnNlcnZlclZlcnNpb259YDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBlcnJvckhhbmRsZXIubG9nKGUsICdhaS1jb25uZWN0LWluZm8nKTtcbiAgICAgIHNldFN0YXR1cygnTUNQIGVuZHBvaW50IHVuYXZhaWxhYmxlIG9uIHRoaXMgYnVpbGQuJyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gbG9hZENvbm5lY3Rpb25zKCkge1xuICAgIGNvbnN0IGxpc3RFbCA9ICQoJ2FpY29ubi1jb25uZWN0aW9ucycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbWNwL2Nvbm5lY3Rpb25zJyk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBjb25zdCBrZXlzID0gKGJvZHkgJiYgQXJyYXkuaXNBcnJheShib2R5LmNvbm5lY3Rpb25zKSkgPyBib2R5LmNvbm5lY3Rpb25zIDogW107XG4gICAgICBpZiAoIWtleXMubGVuZ3RoKSB7XG4gICAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjhyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO1wiPk5vIGNvbm5lY3Rpb25zIHlldCBcdTIwMTQgY2hvb3NlIGFuIGFzc2lzdGFudCBhYm92ZS48L2Rpdj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsaXN0RWwuaW5uZXJIVE1MID0ga2V5cy5tYXAoayA9PiBgXG4gICAgICAgIDxkaXYgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Z2FwOjhweDthbGlnbi1pdGVtczpjZW50ZXI7Zm9udC1zaXplOjAuOHJlbTtcIj5cbiAgICAgICAgICA8c3BhbiBzdHlsZT1cImZsZXg6MTtcIj4ke2VzY2FwZUh0bWwoay5uYW1lKX1cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6dmFyKC0tbXV0ZWQpO1wiPlx1MDBCNyAkeyhrLnNjb3BlcyB8fCBbXSkuam9pbignLCcpfSBcdTAwQjcgc2luY2UgJHtlc2NhcGVIdG1sKChrLmNyZWF0ZWRBdCB8fCAnJykuc2xpY2UoMCwgMTApKX0ke2subGFzdFVzZWQgPyAnIFx1MDBCNyBsYXN0IHVzZWQgJyArIGVzY2FwZUh0bWwoU3RyaW5nKGsubGFzdFVzZWQpLnNsaWNlKDAsIDEwKSkgOiAnJ308L3NwYW4+PC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJhaWNvbm4tcmV2b2tlXCIgZGF0YS1pZD1cIiR7ZXNjYXBlSHRtbChrLmlkKX1cIiBzdHlsZT1cImZvbnQtc2l6ZTowLjc1cmVtO2NvbG9yOnZhcigtLWVyci1mZyk7XCI+UmV2b2tlPC9idXR0b24+XG4gICAgICAgIDwvZGl2PmApLmpvaW4oJycpO1xuICAgICAgbGlzdEVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5haWNvbm4tcmV2b2tlJykuZm9yRWFjaChidG4gPT4gYnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBidG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaChgL2FwaS92MS9hdXRoL2tleXMvJHtlbmNvZGVVUklDb21wb25lbnQoYnRuLmRhdGFzZXQuaWQpfWAsIHsgbWV0aG9kOiAnREVMRVRFJyB9KTtcbiAgICAgICAgICBpZiAocmVzcC5vaykgeyBzZXRTdGF0dXMoJ0Nvbm5lY3Rpb24gcmV2b2tlZC4nKTsgbG9hZENvbm5lY3Rpb25zKCk7IH1cbiAgICAgICAgICBlbHNlIHsgY29uc3QgYiA9IGF3YWl0IHJlc3AuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpOyBzZXRTdGF0dXMoYi5lcnJvciB8fCAnUmV2b2tlIGZhaWxlZC4nKTsgYnRuLmRpc2FibGVkID0gZmFsc2U7IH1cbiAgICAgICAgfSBjYXRjaCAoZSkgeyBzZXRTdGF0dXMoJ1Jldm9rZSBmYWlsZWQ6ICcgKyBlLm1lc3NhZ2UpOyBidG4uZGlzYWJsZWQgPSBmYWxzZTsgfVxuICAgICAgfSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxpc3RFbC5pbm5lckhUTUwgPSAnPGRpdiBzdHlsZT1cImZvbnQtc2l6ZTowLjhyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO1wiPkNvdWxkIG5vdCBsb2FkIGNvbm5lY3Rpb25zLjwvZGl2Pic7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ29ubmVjdGlvbihjbGllbnQpIHtcbiAgICBzZXRTdGF0dXMoYENyZWF0aW5nICR7Y2xpZW50fSBjb25uZWN0aW9uXHUyMDI2YCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBzZWN1cmVGZXRjaCgnL2FwaS92MS9tY3AvY29uZmlnJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgY2xpZW50IH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBpZiAoIXJlc3Aub2sgfHwgIWJvZHkua2V5KSB7XG4gICAgICAgIHNldFN0YXR1cyhib2R5LmVycm9yIHx8IGBGYWlsZWQgKEhUVFAgJHtyZXNwLnN0YXR1c30pYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgICQoJ2FpY29ubi1rZXknKS50ZXh0Q29udGVudCA9IGJvZHkua2V5O1xuICAgICAgLy8gcmV2MiBjb25maWcgc2hhcGU6IGh0dHBDb25maWcgPSB7dXJsLCB0cmFuc3BvcnQsIGhlYWRlcnMsXG4gICAgICAvLyBtY3BQcm90b2NvbFZlcnNpb259IFx1MjAxNCB0aGUgc3RhbmRhcmQgU3RyZWFtYWJsZS1IVFRQIGNvbm5lY3Rpb24gY2FyZC5cbiAgICAgIGNvbnN0IHNuaXBwZXQgPSBib2R5Lmh0dHBDb25maWcgPyBKU09OLnN0cmluZ2lmeShib2R5Lmh0dHBDb25maWcsIG51bGwsIDIpIDogJyc7XG4gICAgICAkKCdhaWNvbm4tc25pcHBldCcpLnRleHRDb250ZW50ID0gc25pcHBldCB8fCAnKHNlZSBub3RlIGJlbG93KSc7XG4gICAgICAkKCdhaWNvbm4tY2xpZW50LW5vdGUnKS50ZXh0Q29udGVudCA9IGJvZHkubm90ZSB8fCAnJztcbiAgICAgICQoJ2FpY29ubi1jb25maWctdGl0bGUnKS50ZXh0Q29udGVudCA9XG4gICAgICAgIGNsaWVudCA9PT0gJ2NoYXRncHQnID8gJ0FjY2VzcyBrZXkgKENoYXRHUFQgbm90ZSBiZWxvdyk6JyA6ICdZb3VyIGFjY2VzcyBrZXkgKHNob3duIG9uY2UpOic7XG4gICAgICAkKCdhaWNvbm4tc3RlcC1waWNrJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICQoJ2FpY29ubi1zdGVwLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgc2V0U3RhdHVzKCcnKTtcbiAgICAgIGxvYWRDb25uZWN0aW9ucygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9ySGFuZGxlci5sb2coZSwgJ2FpLWNvbm5lY3QtY3JlYXRlJyk7XG4gICAgICBzZXRTdGF0dXMoJ0ZhaWxlZDogJyArIGUubWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY29weVRleHQodGV4dCwgb2tNc2cpIHtcbiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkge1xuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGV4dCkudGhlbigoKSA9PiBzZXRTdGF0dXMob2tNc2cpKS5jYXRjaCgoKSA9PiBzZXRTdGF0dXMoJ0NvcHkgZmFpbGVkIFx1MjAxNCBzZWxlY3QgbWFudWFsbHkuJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdGF0dXMoJ0NsaXBib2FyZCB1bmF2YWlsYWJsZSBcdTIwMTQgc2VsZWN0IG1hbnVhbGx5LicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIC0tLS0gd2lyaW5nIC0tLS1cbiAgJCgnYWktY29ubmVjdC1idG4nKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAkKCdhaS1jb25uZWN0LW1vZGFsJykuc3R5bGUuZGlzcGxheSA9ICdmbGV4JztcbiAgICAkKCdhaWNvbm4tc3RlcC1waWNrJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgJCgnYWljb25uLXN0ZXAtY29uZmlnJykuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzZXRTdGF0dXMoJycpO1xuICAgIGxvYWRJbmZvKCk7XG4gICAgbG9hZENvbm5lY3Rpb25zKCk7XG4gIH0pO1xuICAkKCdhaWNvbm4tY2xvc2UnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHsgJCgnYWktY29ubmVjdC1tb2RhbCcpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7IH0pO1xuICAkKCdhaWNvbm4tYmFjaycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICQoJ2FpY29ubi1zdGVwLWNvbmZpZycpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgJCgnYWljb25uLXN0ZXAtcGljaycpLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9KTtcbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmFpY29ubi1jbGllbnQtYnRuJykuZm9yRWFjaChidG4gPT5cbiAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBjcmVhdGVDb25uZWN0aW9uKGJ0bi5kYXRhc2V0LmNsaWVudCkpKTtcbiAgJCgnYWljb25uLWNvcHkta2V5JykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBjb3B5VGV4dCgkKCdhaWNvbm4ta2V5JykudGV4dENvbnRlbnQsICdLZXkgY29waWVkIFx1MjAxNCBwYXN0ZSBpdCBpbnRvIHlvdXIgY2xpZW50LicpKTtcbiAgJCgnYWljb25uLWNvcHktc25pcHBldCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29weVRleHQoJCgnYWljb25uLXNuaXBwZXQnKS50ZXh0Q29udGVudCwgJ0NvbmZpZyBjb3BpZWQuJykpO1xuICAkKCdhaWNvbm4tY29weS1lbmRwb2ludCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gY29weVRleHQoaW5mbyA/IGluZm8uZW5kcG9pbnQgOiAkKCdhaWNvbm4tZW5kcG9pbnQtdXJsJykudGV4dENvbnRlbnQsICdFbmRwb2ludCBjb3BpZWQuJykpO1xufSkoKTtcbjtcbi8vID09PT09PT09PT0gQ0FSRCBIRUFMVEggJiBVUERBVEUgQkFER0VTID09PT09PT09PT1cbihmdW5jdGlvbigpIHtcbiAgLy8gRmV0Y2ggaGVhbHRoIGRhdGEgYW5kIHVwZGF0ZSBjYXJkIFVJXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hDYXJkSGVhbHRoKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9oZWFsdGgtY2hlY2tzL3N0YXR1cycpO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICBpZiAoIWRhdGEuc3VjY2VzcyB8fCAhZGF0YS5zdGF0dXMpIHJldHVybjtcblxuICAgICAgZm9yIChjb25zdCBbc2VydmljZUlkLCBzdmNdIG9mIE9iamVjdC5lbnRyaWVzKGRhdGEuc3RhdHVzKSkge1xuICAgICAgICBjb25zdCB1cHRpbWVFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cHRpbWUtJyArIHNlcnZpY2VJZCk7XG4gICAgICAgIGNvbnN0IGJhckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VwdGltZS1iYXItJyArIHNlcnZpY2VJZCk7XG4gICAgICAgIGlmICghdXB0aW1lRWwpIGNvbnRpbnVlO1xuXG4gICAgICAgIGNvbnN0IHVwdGltZTI0ID0gc3ZjLnVwdGltZT8uWycyNGgnXTtcbiAgICAgICAgaWYgKHVwdGltZTI0ICE9PSB1bmRlZmluZWQgJiYgdXB0aW1lMjQgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBwY3QgPSB1cHRpbWUyNC50b0ZpeGVkKDEpO1xuICAgICAgICAgIHVwdGltZUVsLnRleHRDb250ZW50ID0gYCR7cGN0fSUgdXB0aW1lYDtcbiAgICAgICAgICAvLyBDb2xvciBjbGFzc1xuICAgICAgICAgIHVwdGltZUVsLmNsYXNzTmFtZSA9ICd1cHRpbWUtY2hpcCc7XG4gICAgICAgICAgaWYgKHVwdGltZTI0ID49IDk5LjkpIHVwdGltZUVsLmNsYXNzTGlzdC5hZGQoJ2V4Y2VsbGVudCcpO1xuICAgICAgICAgIGVsc2UgaWYgKHVwdGltZTI0ID49IDk5KSB1cHRpbWVFbC5jbGFzc0xpc3QuYWRkKCdnb29kJyk7XG4gICAgICAgICAgZWxzZSBpZiAodXB0aW1lMjQgPj0gOTUpIHVwdGltZUVsLmNsYXNzTGlzdC5hZGQoJ2RlZ3JhZGVkJyk7XG4gICAgICAgICAgZWxzZSB1cHRpbWVFbC5jbGFzc0xpc3QuYWRkKCdwb29yJyk7XG5cbiAgICAgICAgICBpZiAoYmFyRWwpIGJhckVsLnN0eWxlLndpZHRoID0gcGN0ICsgJyUnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgLyogSGVhbHRoIGNoZWNrIEFQSSB1bmF2YWlsYWJsZSBcdTIwMTQgdXB0aW1lIGNoaXBzIHN0YXkgaGlkZGVuICovXG4gICAgICBjb25zb2xlLndhcm4oJ1tDYXJkIEJhZGdlc10gSGVhbHRoIGNoZWNrIEFQSSB1bmF2YWlsYWJsZScpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRyYWNrIGRpc21pc3NlZCB1cGRhdGVzIChwZXIgc2Vzc2lvbilcbiAgbGV0IGRpc21pc3NlZFVwZGF0ZXM7XG4gIHRyeSB7XG4gICAgZGlzbWlzc2VkVXBkYXRlcyA9IG5ldyBTZXQoSlNPTi5wYXJzZShzYWZlU2Vzc2lvbkdldCgnZGlzbWlzc2VkLXVwZGF0ZXMnKSB8fCAnW10nKSk7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICAvKiBTZXNzaW9uIHN0b3JhZ2UgdW5hdmFpbGFibGUgKi9cbiAgICBkaXNtaXNzZWRVcGRhdGVzID0gbmV3IFNldCgpO1xuICB9XG5cbiAgLy8gVHJhY2sgZ2xvYmFsIHVwZGF0ZSBzdGF0ZSBmb3IgY3Jvc3MtY29tcG9uZW50IGFjY2Vzc1xuICBsZXQga25vd25VcGRhdGVzID0gW107XG5cbiAgLy8gRmV0Y2ggdXBkYXRlIGRhdGEgYW5kIHNob3cgYmFkZ2VzXG4gIGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hDYXJkVXBkYXRlcyhub3RpZnlOZXcpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvdXBkYXRlcy9hdmFpbGFibGUnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgaWYgKCFkYXRhLnN1Y2Nlc3MpIHJldHVybjtcblxuICAgICAgLy8gQ2xlYXIgYWxsIHVwZGF0ZSBiYWRnZXMgZmlyc3RcbiAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy51cGRhdGUtYXZhaWxhYmxlLWJhZGdlJykuZm9yRWFjaChlbCA9PiBlbC5jbGFzc0xpc3QucmVtb3ZlKCd2aXNpYmxlJykpO1xuXG4gICAgICBjb25zdCB1cGRhdGVzID0gZGF0YS51cGRhdGVzIHx8IFtdO1xuICAgICAga25vd25VcGRhdGVzID0gdXBkYXRlczsgLy8gc3RvcmUgZ2xvYmFsbHlcblxuICAgICAgLy8gTm90aWZ5IGlmIG5ldyB1cGRhdGVzIGFwcGVhcmVkIChwZXJpb2RpYyBjaGVjayB3aXRoIG5vdGlmaWNhdGlvbilcbiAgICAgIGlmIChub3RpZnlOZXcgJiYgdXBkYXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHByZXYgPSB3aW5kb3cuX2xhc3RLbm93blVwZGF0ZUNvdW50IHx8IDA7XG4gICAgICAgIGlmIChwcmV2ID4gMCAmJiB1cGRhdGVzLmxlbmd0aCA+IHByZXYpIHtcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKGAke3VwZGF0ZXMubGVuZ3RofSBjb250YWluZXIgdXBkYXRlKHMpIGF2YWlsYWJsZSBcdTIwMTQgY2xpY2sgVXBkYXRlIE1hbmFnZW1lbnQgdG8gcmV2aWV3LmAsICdpbmZvJyk7XG4gICAgICAgIH1cbiAgICAgICAgd2luZG93Ll9sYXN0S25vd25VcGRhdGVDb3VudCA9IHVwZGF0ZXMubGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXVwZGF0ZXMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgIGZvciAoY29uc3QgdXBkIG9mIHVwZGF0ZXMpIHtcbiAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIGJ5IGNvbnRhaW5lciBuYW1lIHRvIHNlcnZpY2UgaWRcbiAgICAgICAgY29uc3QgYXBwcyA9IHdpbmRvdy5BUFBTIHx8IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGFwcCBvZiBhcHBzKSB7XG4gICAgICAgICAgaWYgKGFwcC5jb250YWluZXJJZCA9PT0gdXBkLmNvbnRhaW5lcklkIHx8IGFwcC5pZCA9PT0gdXBkLmNvbnRhaW5lck5hbWUgfHwgYXBwLm5hbWUgPT09IHVwZC5jb250YWluZXJOYW1lKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGRpc21pc3NlZCB1cGRhdGVzXG4gICAgICAgICAgICBpZiAoZGlzbWlzc2VkVXBkYXRlcy5oYXMoYXBwLmlkKSkgYnJlYWs7XG4gICAgICAgICAgICBjb25zdCBiYWRnZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGRhdGUtYmFkZ2UtJyArIGFwcC5pZCk7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBkYXRlLWJ0bi0nICsgYXBwLmlkKTtcbiAgICAgICAgICAgIGlmIChiYWRnZSkge1xuICAgICAgICAgICAgICBiYWRnZS5jbGFzc0xpc3QuYWRkKCd2aXNpYmxlJyk7XG4gICAgICAgICAgICAgIGJhZGdlLnRpdGxlID0gYFVwZGF0ZSBhdmFpbGFibGUgXHUyMDE0IGNsaWNrIHRvIG9wZW4gVXBkYXRlIE1hbmFnZW1lbnQuYDtcbiAgICAgICAgICAgICAgYmFkZ2Uuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICAgICAgICBiYWRnZS5vbmNsaWNrID0gKGUpID0+IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIC8vIE9wZW4gVXBkYXRlIE1hbmFnZW1lbnQgbW9kYWwgZm9jdXNlZCBvbiB0aGlzIGFwcFxuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cub3BlblVwZGF0ZU1vZGFsKSB3aW5kb3cub3BlblVwZGF0ZU1vZGFsKGFwcC5pZCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBIaWdobGlnaHQgdXBkYXRlIGJ1dHRvbiBpZiB1cGRhdGUgaXMgYXZhaWxhYmxlXG4gICAgICAgICAgICBpZiAodXBkYXRlQnRuKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZUJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gJyNmOTczMTYnO1xuICAgICAgICAgICAgICB1cGRhdGVCdG4uc3R5bGUuYm9yZGVyQ29sb3IgPSAnI2Y5NzMxNic7XG4gICAgICAgICAgICAgIHVwZGF0ZUJ0bi5zdHlsZS5ib3hTaGFkb3cgPSAnMCAwIDZweCAjZjk3MzE2ODgnO1xuICAgICAgICAgICAgICB1cGRhdGVCdG4udGl0bGUgPSBgVXBkYXRlIGF2YWlsYWJsZSBcdTIwMTQgY2xpY2sgdG8gb3BlbiBVcGRhdGUgTWFuYWdlbWVudC5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgLyogVXBkYXRlcyBBUEkgdW5hdmFpbGFibGUgXHUyMDE0IGJhZGdlcyBzdGF5IGhpZGRlbiAqL1xuICAgICAgY29uc29sZS53YXJuKCdbQ2FyZCBCYWRnZXNdIFVwZGF0ZXMgQVBJIHVuYXZhaWxhYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gUnVuIGhlYWx0aCBhbmQgdXBkYXRlIGNoZWNrcyBhZnRlciBtYWluIHJlZnJlc2gsIGFuZCBwZXJpb2RpY2FsbHlcbiAgZnVuY3Rpb24gc2NoZWR1bGVDYXJkRW5oYW5jZW1lbnRzKCkge1xuICAgIC8vIEluaXRpYWwgbG9hZCAoZGVsYXllZCB0byBub3QgY29tcGV0ZSB3aXRoIG1haW4gcHJvYmUgY2hlY2tzKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgcmVmcmVzaENhcmRIZWFsdGgoKTtcbiAgICAgIHJlZnJlc2hDYXJkVXBkYXRlcygpO1xuICAgIH0sIDUwMDApO1xuXG4gICAgLy8gUGVyaW9kaWMgcmVmcmVzaCBldmVyeSA2MCBzZWNvbmRzIFx1MjAxNCBub3RpZnkgb24gbmV3IHVwZGF0ZXMgZGV0ZWN0ZWRcbiAgICBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICByZWZyZXNoQ2FyZEhlYWx0aCgpO1xuICAgICAgcmVmcmVzaENhcmRVcGRhdGVzKHRydWUpOyAvLyB0cnVlID0gbm90aWZ5IGlmIG5ldyB1cGRhdGVzIGZvdW5kXG4gICAgfSwgNjAwMDApO1xuICB9XG5cbiAgLy8gSG9vayBpbnRvIG1haW4gcmVmcmVzaCBjeWNsZVxuICBjb25zdCBvcmlnUmVmcmVzaEFsbCA9IHdpbmRvdy5yZWZyZXNoQWxsO1xuICBpZiAob3JpZ1JlZnJlc2hBbGwpIHtcbiAgICB3aW5kb3cucmVmcmVzaEFsbCA9IGFzeW5jIGZ1bmN0aW9uKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb3JpZ1JlZnJlc2hBbGwoKTtcbiAgICAgICAgLy8gUmVmcmVzaCBoZWFsdGggZGF0YSBhZnRlciBtYWluIHN0YXR1cyBjaGVja1xuICAgICAgICBzZXRUaW1lb3V0KHJlZnJlc2hDYXJkSGVhbHRoLCAxMDAwKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbQ2FyZCBCYWRnZXNdIEVycm9yIGluIHJlZnJlc2hBbGwgaG9vazonLCBlLm1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBzY2hlZHVsZUNhcmRFbmhhbmNlbWVudHMoKTtcbn0pKCk7XG47XG4vLyA9PT09PT09PT09IFRIRU1FIFBJQ0tFUiArIFRIRU1FIEJVSUxERVIgPT09PT09PT09PVxuKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoZW1lQmVmb3JlQnVpbGRlciA9IG51bGw7XG4gIHZhciBlZGl0aW5nU2x1ZyA9IG51bGw7XG4gIHZhciBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9OyAvLyB0cmFja3Mgd2hpY2ggYWR2YW5jZWQgZmllbGRzIHVzZXIgbWFudWFsbHkgY2hhbmdlZFxuXG4gIC8vIERpc3BsYXkgbmFtZXMgZm9yIGJ1aWx0LWluIHRoZW1lc1xuICB2YXIgVEhFTUVfTEFCRUxTID0ge1xuICAgIGRhcms6ICdEYXJrJyxcbiAgICBsaWdodDogJ0xpZ2h0JyxcbiAgICBibHVlOiAnQmx1ZScsXG4gICAgYmxhY2s6ICdCbGFjaycsXG4gICAgbm9yZDogJ05vcmQnLFxuICAgIGRyYWN1bGE6ICdEcmFjdWxhJyxcbiAgICAnc29sYXJpemVkLWRhcmsnOiAnU29sYXJpemVkIERhcmsnLFxuICAgICdzb2xhcml6ZWQtbGlnaHQnOiAnU29sYXJpemVkIExpZ2h0JyxcbiAgICB0YXhpOiAnVGF4aScsXG4gICAgb2NlYW46ICdPY2VhbicsXG4gIH07XG5cbiAgLy8gQ29sb3IgcGlja2VyIGZpZWxkIGRlZmluaXRpb25zOiBbY3NzLXByb3AsIGxhYmVsLCBzZWN0aW9uXVxuICB2YXIgRklFTERTID0gW1xuICAgIFsnYmcnLCAgICAgICAgICAgICdCYWNrZ3JvdW5kJywgICAgJ2Jhc2UnXSxcbiAgICBbJ2NhcmQtYmFzZScsICAgICAnQ2FyZCcsICAgICAgICAgICdiYXNlJ10sXG4gICAgWydmZycsICAgICAgICAgICAgJ1RleHQnLCAgICAgICAgICAnYmFzZSddLFxuICAgIFsnbXV0ZWQnLCAgICAgICAgICdNdXRlZCBUZXh0JywgICAgJ2Jhc2UnXSxcbiAgICBbJ2JvcmRlcicsICAgICAgICAnQm9yZGVyJywgICAgICAgICdiYXNlJ10sXG4gICAgWydhY2NlbnQnLCAgICAgICAgJ0FjY2VudCcsICAgICAgICAnYWNjZW50J10sXG4gICAgWydhY2NlbnQtc3Ryb25nJywgJ0FjY2VudCBTdHJvbmcnLCAnYWNjZW50J10sXG4gICAgWydvay1iZycsICAgICAgICAgJ09LIEJhY2tncm91bmQnLCAnc3RhdHVzJ10sXG4gICAgWydvay1mZycsICAgICAgICAgJ09LIFRleHQnLCAgICAgICAnc3RhdHVzJ10sXG4gICAgWydiYWQtYmcnLCAgICAgICAgJ0Vycm9yIEJnJywgICAgICAnc3RhdHVzJ10sXG4gICAgWydiYWQtZmcnLCAgICAgICAgJ0Vycm9yIFRleHQnLCAgICAnc3RhdHVzJ10sXG4gICAgWydkb3Qtb2snLCAgICAgICAgJ0RvdCBPSycsICAgICAgICAnc3RhdHVzJ10sXG4gICAgWydkb3QtYmFkJywgICAgICAgJ0RvdCBFcnJvcicsICAgICAnc3RhdHVzJ10sXG4gICAgWyd1cHRpbWUnLCAgICAgICAgJ1VwdGltZSBCYXInLCAgICAnc3RhdHVzJ10sXG4gICAgWydob3ZlcicsICAgICAgICAgJ0hvdmVyJywgICAgICAgICAnYWR2YW5jZWQnXSxcbiAgICBbJ2NhcmQtaG92ZXInLCAgICAnQ2FyZCBIb3ZlcicsICAgICdhZHZhbmNlZCddLFxuICAgIFsnYmFzZScsICAgICAgICAgICdUYWdzL0JhZGdlcycsICAgJ2FkdmFuY2VkJ10sXG4gICAgWydmZy1tdXRlZCcsICAgICAgJ0RpbSBUZXh0JywgICAgICAnYWR2YW5jZWQnXSxcbiAgICBbJ3N1Y2Nlc3MnLCAgICAgICAnU3VjY2VzcycsICAgICAgICdhZHZhbmNlZCddLFxuICAgIFsnZXJyb3InLCAgICAgICAgICdFcnJvcicsICAgICAgICAgJ2FkdmFuY2VkJ10sXG4gICAgWyd3YXJuaW5nJywgICAgICAgJ1dhcm5pbmcnLCAgICAgICAnYWR2YW5jZWQnXSxcbiAgXTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgVGhlbWUgQ3ljbGUgQnV0dG9uIFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIHZhciB0aGVtZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZScpO1xuICBpZiAoIXRoZW1lQnRuKSByZXR1cm47XG4gIHZhciB0aGVtZUxhYmVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWxhYmVsJyk7XG5cbiAgZnVuY3Rpb24gZ2V0TGFiZWxGb3IodCkge1xuICAgIGlmIChUSEVNRV9MQUJFTFNbdF0pIHJldHVybiBUSEVNRV9MQUJFTFNbdF07XG4gICAgdmFyIHVzZXJUaGVtZXMgPSBzYWZlR2V0SlNPTih3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCB7fSk7XG4gICAgaWYgKHVzZXJUaGVtZXNbdF0pIHJldHVybiB1c2VyVGhlbWVzW3RdLm5hbWUgfHwgdDtcbiAgICByZXR1cm4gdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUxhYmVsKCkge1xuICAgIGlmICh0aGVtZUxhYmVsKSB0aGVtZUxhYmVsLnRleHRDb250ZW50ID0gZ2V0TGFiZWxGb3Iod2luZG93LmdldEFjdGl2ZVRoZW1lKCkpO1xuICB9XG5cbiAgdGhlbWVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGxpc3QgPSB3aW5kb3cuVEhFTUVTLnNsaWNlKCk7XG4gICAgdmFyIGN1cnJlbnQgPSB3aW5kb3cuZ2V0QWN0aXZlVGhlbWUoKTtcbiAgICB2YXIgaWR4ID0gbGlzdC5pbmRleE9mKGN1cnJlbnQpO1xuICAgIHZhciBuZXh0ID0gbGlzdFsoaWR4ICsgMSkgJSBsaXN0Lmxlbmd0aF07XG4gICAgd2luZG93LmFwcGx5VGhlbWUobmV4dCk7XG4gICAgdXBkYXRlTGFiZWwoKTtcbiAgfSk7XG5cbiAgdXBkYXRlTGFiZWwoKTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgVGhlbWUgQnVpbGRlciBNb2RhbCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBidWlsZEZpZWxkc0hUTUwoKSB7XG4gICAgdmFyIHNlY3Rpb25zID0geyBiYXNlOiAnQmFzZSBDb2xvcnMnLCBhY2NlbnQ6ICdBY2NlbnQnLCBzdGF0dXM6ICdTdGF0dXMnLCBhZHZhbmNlZDogJ0FkdmFuY2VkIChhdXRvLWRlcml2ZWQpJyB9O1xuICAgIHZhciBncm91cGVkID0ge307XG4gICAgRklFTERTLmZvckVhY2goZnVuY3Rpb24gKGYpIHtcbiAgICAgIGlmICghZ3JvdXBlZFtmWzJdXSkgZ3JvdXBlZFtmWzJdXSA9IFtdO1xuICAgICAgZ3JvdXBlZFtmWzJdXS5wdXNoKGYpO1xuICAgIH0pO1xuXG4gICAgdmFyIGh0bWwgPSAnJztcbiAgICBPYmplY3Qua2V5cyhzZWN0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgICBpZiAoa2V5ID09PSAnYWR2YW5jZWQnKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgaWQ9XCJ0aGVtZS1idWlsZGVyLWFkdmFuY2VkLXRvZ2dsZVwiIGNsYXNzPVwidGhlbWUtYnVpbGRlci1hZHZhbmNlZC10b2dnbGVcIiBzdHlsZT1cIm1hcmdpbjoxMnB4IDAgNHB4O2N1cnNvcjpwb2ludGVyO2NvbG9yOnZhcigtLWFjY2VudCk7Zm9udC1zaXplOi44NXJlbTt1c2VyLXNlbGVjdDpub25lO1wiPlNob3cgYWR2YW5jZWQgY29sb3JzICYjOTY2MDs8L2Rpdj4nO1xuICAgICAgICBodG1sICs9ICc8ZGl2IGlkPVwidGhlbWUtYnVpbGRlci1hZHZhbmNlZFwiIGNsYXNzPVwidGhlbWUtYnVpbGRlci1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLXNlY3Rpb25cIj4nO1xuICAgICAgfVxuICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItc2VjdGlvbi10aXRsZVwiPicgKyBzZWN0aW9uc1trZXldICsgJzwvZGl2Pic7XG4gICAgICAoZ3JvdXBlZFtrZXldIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChmKSB7XG4gICAgICAgIGh0bWwgKz0gJzxkaXYgY2xhc3M9XCJ0aGVtZS1idWlsZGVyLXJvd1wiPicgK1xuICAgICAgICAgICc8c3BhbiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItbGFiZWxcIj4nICsgZlsxXSArICc8L3NwYW4+JyArXG4gICAgICAgICAgJzxpbnB1dCB0eXBlPVwiY29sb3JcIiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItY29sb3JcIiBkYXRhLXByb3A9XCInICsgZlswXSArICdcIicgKyAoa2V5ID09PSAnYWR2YW5jZWQnID8gJyBkYXRhLWFkdmFuY2VkPVwiMVwiJyA6ICcnKSArICcgdmFsdWU9XCIjMDAwMDAwXCIgLz4nICtcbiAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ0aGVtZS1idWlsZGVyLWhleFwiIGRhdGEtaGV4PVwiJyArIGZbMF0gKyAnXCI+IzAwMDAwMDwvc3Bhbj4nICtcbiAgICAgICAgICAnPC9kaXY+JztcbiAgICAgIH0pO1xuICAgICAgaHRtbCArPSAnPC9kaXY+JztcbiAgICB9KTtcbiAgICByZXR1cm4gaHRtbDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkU3RhcnRGcm9tT3B0aW9ucygpIHtcbiAgICByZXR1cm4gd2luZG93LlRIRU1FUy5tYXAoZnVuY3Rpb24gKHQpIHtcbiAgICAgIHJldHVybiAnPG9wdGlvbiB2YWx1ZT1cIicgKyB0ICsgJ1wiPicgKyBnZXRMYWJlbEZvcih0KSArICc8L29wdGlvbj4nO1xuICAgIH0pLmpvaW4oJycpO1xuICB9XG5cbiAgdmFyIG1vZGFsSFRNTCA9ICc8ZGl2IGlkPVwidGhlbWUtYnVpbGRlci1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiPicgK1xuICAgICc8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6NDIwcHg7bWF4LXdpZHRoOjU2MHB4O1wiPicgK1xuICAgICc8aDM+VGhlbWUgQnVpbGRlcjwvaDM+JyArXG5cbiAgICAvLyBFZGl0IGV4aXN0aW5nIHVzZXIgdGhlbWVzIGRyb3Bkb3duXG4gICAgJzxkaXYgaWQ9XCJ0aGVtZS1idWlsZGVyLWV4aXN0aW5nXCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7ZGlzcGxheTpub25lO1wiPicgK1xuICAgICc8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6Ljg1cmVtO2NvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tcmlnaHQ6OHB4O1wiPkVkaXQ6PC9sYWJlbD4nICtcbiAgICAnPHNlbGVjdCBpZD1cInRoZW1lLWJ1aWxkZXItZWRpdC1zZWxlY3RcIiBzdHlsZT1cInBhZGRpbmc6NnB4IDEwcHg7YmFja2dyb3VuZDp2YXIoLS1jYXJkLWJnKTtjb2xvcjp2YXIoLS1mZyk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO2JvcmRlci1yYWRpdXM6NnB4O2ZvbnQtc2l6ZTouODVyZW07bWFyZ2luLXJpZ2h0OjhweDtcIj4nICtcbiAgICAnPG9wdGlvbiB2YWx1ZT1cIlwiPlx1MjAxNCBOZXcgVGhlbWUgXHUyMDE0PC9vcHRpb24+JyArXG4gICAgJzwvc2VsZWN0PicgK1xuICAgICc8YnV0dG9uIGlkPVwidGhlbWUtYnVpbGRlci1kZWxldGVcIiBzdHlsZT1cInBhZGRpbmc6NHB4IDEwcHg7YmFja2dyb3VuZDpjb2xvci1taXgoaW4gc3JnYix2YXIoLS1iYWQtZmcpIDE1JSx0cmFuc3BhcmVudCk7Ym9yZGVyOjFweCBzb2xpZCB2YXIoLS1iYWQtZmcpO2NvbG9yOnZhcigtLWJhZC1mZyk7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOi44cmVtO2N1cnNvcjpwb2ludGVyO1wiPkRlbGV0ZTwvYnV0dG9uPicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luLWJvdHRvbToxNnB4O1wiPicgK1xuICAgICc8bGFiZWwgc3R5bGU9XCJmb250LXNpemU6Ljg1cmVtO2NvbG9yOnZhcigtLW11dGVkKTttYXJnaW4tcmlnaHQ6OHB4O1wiPk5hbWU6PC9sYWJlbD4nICtcbiAgICAnPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJ0aGVtZS1idWlsZGVyLW5hbWVcIiBtYXhsZW5ndGg9XCIyMFwiIHBsYWNlaG9sZGVyPVwiTXkgVGhlbWVcIiAnICtcbiAgICAnc3R5bGU9XCJwYWRkaW5nOjZweCAxMHB4O2JhY2tncm91bmQ6dmFyKC0tY2FyZC1iZyk7Y29sb3I6dmFyKC0tZmcpO2JvcmRlcjoxcHggc29saWQgdmFyKC0tYm9yZGVyKTtib3JkZXItcmFkaXVzOjZweDtmb250LXNpemU6Ljg1cmVtO3dpZHRoOjE0MHB4O1wiIC8+JyArXG4gICAgJzwvZGl2PicgK1xuXG4gICAgJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtcIj4nICtcbiAgICAnPGxhYmVsIHN0eWxlPVwiZm9udC1zaXplOi44NXJlbTtjb2xvcjp2YXIoLS1tdXRlZCk7bWFyZ2luLXJpZ2h0OjhweDtjdXJzb3I6cG9pbnRlcjtcIiBmb3I9XCJ0aGVtZS1idWlsZGVyLWxpZ2h0YmdcIj4nICtcbiAgICAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwidGhlbWUtYnVpbGRlci1saWdodGJnXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6NnB4O2N1cnNvcjpwb2ludGVyO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTtcIiAvPicgK1xuICAgICdMaWdodCBiYWNrZ3JvdW5kICh1c2UgZGFyayBsb2dvKTwvbGFiZWw+JyArXG4gICAgJzwvZGl2PicgK1xuXG4gICAgJzxkaXYgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjE2cHg7XCI+JyArXG4gICAgJzxsYWJlbCBzdHlsZT1cImZvbnQtc2l6ZTouODVyZW07Y29sb3I6dmFyKC0tbXV0ZWQpO21hcmdpbi1yaWdodDo4cHg7XCI+U3RhcnQgZnJvbTo8L2xhYmVsPicgK1xuICAgICc8c2VsZWN0IGlkPVwidGhlbWUtYnVpbGRlci1zdGFydFwiIHN0eWxlPVwicGFkZGluZzo2cHggMTBweDtiYWNrZ3JvdW5kOnZhcigtLWNhcmQtYmcpO2NvbG9yOnZhcigtLWZnKTtib3JkZXI6MXB4IHNvbGlkIHZhcigtLWJvcmRlcik7Ym9yZGVyLXJhZGl1czo2cHg7Zm9udC1zaXplOi44NXJlbTtcIj4nICtcbiAgICBidWlsZFN0YXJ0RnJvbU9wdGlvbnMoKSArXG4gICAgJzwvc2VsZWN0PicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgICc8ZGl2IGNsYXNzPVwidGhlbWUtYnVpbGRlci1wcmV2aWV3XCIgaWQ9XCJ0aGVtZS1idWlsZGVyLXByZXZpZXdcIj4nICtcbiAgICAnPGRpdiBjbGFzcz1cInRoZW1lLWJ1aWxkZXItY2FyZFwiIGlkPVwidGhlbWUtcHJldmlldy1jYXJkXCI+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwcmV2aWV3LXRpdGxlXCI+U2FtcGxlIENhcmQ8L2Rpdj4nICtcbiAgICAnPGRpdiBjbGFzcz1cInByZXZpZXctbXV0ZWRcIj5TZWNvbmRhcnkgdGV4dCBwcmV2aWV3PC9kaXY+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwcmV2aWV3LWJhZGdlc1wiPicgK1xuICAgICc8c3BhbiBjbGFzcz1cInByZXZpZXctYmFkZ2VcIiBpZD1cInByZXZpZXctYmFkZ2Utb2tcIj5PTjwvc3Bhbj4nICtcbiAgICAnPHNwYW4gY2xhc3M9XCJwcmV2aWV3LWJhZGdlXCIgaWQ9XCJwcmV2aWV3LWJhZGdlLWJhZFwiPk9GRjwvc3Bhbj4nICtcbiAgICAnPC9kaXY+JyArXG4gICAgJzxkaXYgY2xhc3M9XCJwcmV2aWV3LWRvdHNcIj4nICtcbiAgICAnPHNwYW4+PHNwYW4gY2xhc3M9XCJwcmV2aWV3LWRvdFwiIGlkPVwicHJldmlldy1kb3Qtb2tcIj48L3NwYW4+IE9ubGluZTwvc3Bhbj4nICtcbiAgICAnPHNwYW4+PHNwYW4gY2xhc3M9XCJwcmV2aWV3LWRvdFwiIGlkPVwicHJldmlldy1kb3QtYmFkXCI+PC9zcGFuPiBPZmZsaW5lPC9zcGFuPicgK1xuICAgICc8L2Rpdj4nICtcbiAgICAnPGJ1dHRvbiBjbGFzcz1cInByZXZpZXctYnRuXCIgaWQ9XCJwcmV2aWV3LWFjY2VudC1idG5cIj5BY2NlbnQgQnV0dG9uPC9idXR0b24+JyArXG4gICAgJzwvZGl2PicgK1xuICAgICc8L2Rpdj4nICtcblxuICAgIGJ1aWxkRmllbGRzSFRNTCgpICtcblxuICAgICc8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1idXR0b25zXCI+JyArXG4gICAgJzxidXR0b24gaWQ9XCJ0aGVtZS1idWlsZGVyLWNhbmNlbFwiPkNhbmNlbDwvYnV0dG9uPicgK1xuICAgICc8YnV0dG9uIGlkPVwidGhlbWUtYnVpbGRlci1pbXBvcnRcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OmF1dG87XCIgdGl0bGU9XCJJbXBvcnQgdGhlbWUgZnJvbSBKU09OIGZpbGVcIj5JbXBvcnQ8L2J1dHRvbj4nICtcbiAgICAnPGJ1dHRvbiBpZD1cInRoZW1lLWJ1aWxkZXItZXhwb3J0XCIgdGl0bGU9XCJFeHBvcnQgdGhlbWUgYXMgSlNPTiBmaWxlXCI+RXhwb3J0PC9idXR0b24+JyArXG4gICAgJzxidXR0b24gaWQ9XCJ0aGVtZS1idWlsZGVyLXNhdmVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIj5TYXZlIFRoZW1lPC9idXR0b24+JyArXG4gICAgJzwvZGl2PicgK1xuICAgICc8L2Rpdj48L2Rpdj4nO1xuXG4gIGluamVjdE1vZGFsKCd0aGVtZS1idWlsZGVyLW1vZGFsJywgbW9kYWxIVE1MKTtcblxuICB2YXIgbW9kYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1tb2RhbCcpO1xuICB2YXIgc3RhcnRTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1zdGFydCcpO1xuICB2YXIgbmFtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItbmFtZScpO1xuICB2YXIgZWRpdFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWVkaXQtc2VsZWN0Jyk7XG4gIHZhciBleGlzdGluZ1NlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1leGlzdGluZycpO1xuICB2YXIgbGlnaHRCZ0NoZWNrID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItbGlnaHRiZycpO1xuICB2YXIgcGlja2VycyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJy50aGVtZS1idWlsZGVyLWNvbG9yJyk7XG4gIHZhciBhZHZhbmNlZFNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1hZHZhbmNlZCcpO1xuICB2YXIgYWR2YW5jZWRUb2dnbGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1hZHZhbmNlZC10b2dnbGUnKTtcbiAgdmFyIGV4cG9ydEJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWV4cG9ydCcpO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBBZHZhbmNlZCB0b2dnbGUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgdmFyIGFkdmFuY2VkVmlzaWJsZSA9IGZhbHNlO1xuICBhZHZhbmNlZFRvZ2dsZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBhZHZhbmNlZFZpc2libGUgPSAhYWR2YW5jZWRWaXNpYmxlO1xuICAgIGFkdmFuY2VkU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gYWR2YW5jZWRWaXNpYmxlID8gJycgOiAnbm9uZSc7XG4gICAgYWR2YW5jZWRUb2dnbGUuaW5uZXJIVE1MID0gYWR2YW5jZWRWaXNpYmxlXG4gICAgICA/ICdIaWRlIGFkdmFuY2VkIGNvbG9ycyAmIzk2NTA7J1xuICAgICAgOiAnU2hvdyBhZHZhbmNlZCBjb2xvcnMgJiM5NjYwOyc7XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDb2xvciBwaWNrZXIgaGVscGVycyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBmdW5jdGlvbiBnZXRDdXJyZW50Q29sb3JzKCkge1xuICAgIHZhciBjb2xvcnMgPSB7fTtcbiAgICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIGNvbG9yc1twLmRhdGFzZXQucHJvcF0gPSBwLnZhbHVlO1xuICAgIH0pO1xuICAgIGNvbG9yc1snY2FyZC1iZyddID0gY29sb3JzWydjYXJkLWJhc2UnXTtcbiAgICByZXR1cm4gY29sb3JzO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0QmFzZUNvbG9ycygpIHtcbiAgICB2YXIgY29sb3JzID0ge307XG4gICAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAoIXAuZGF0YXNldC5hZHZhbmNlZCkgY29sb3JzW3AuZGF0YXNldC5wcm9wXSA9IHAudmFsdWU7XG4gICAgfSk7XG4gICAgY29sb3JzWydjYXJkLWJnJ10gPSBjb2xvcnNbJ2NhcmQtYmFzZSddO1xuICAgIGlmIChsaWdodEJnQ2hlY2suY2hlY2tlZCkgY29sb3JzLmxpZ2h0QmcgPSB0cnVlO1xuICAgIHJldHVybiBjb2xvcnM7XG4gIH1cblxuICBmdW5jdGlvbiB1cGRhdGVBZHZhbmNlZEZyb21EZXJpdmVkKCkge1xuICAgIHZhciBiYXNlID0gZ2V0QmFzZUNvbG9ycygpO1xuICAgIHZhciBkZXJpdmVkID0gd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzID8gd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzKGJhc2UpIDoge307XG4gICAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAocC5kYXRhc2V0LmFkdmFuY2VkICYmICFhZHZhbmNlZE92ZXJyaWRlc1twLmRhdGFzZXQucHJvcF0pIHtcbiAgICAgICAgdmFyIHZhbCA9IGRlcml2ZWRbcC5kYXRhc2V0LnByb3BdIHx8ICcjMzMzMzMzJztcbiAgICAgICAgcC52YWx1ZSA9IHZhbDtcbiAgICAgICAgdmFyIGhleCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhleD1cIicgKyBwLmRhdGFzZXQucHJvcCArICdcIl0nKTtcbiAgICAgICAgaWYgKGhleCkgaGV4LnRleHRDb250ZW50ID0gdmFsLnRvVXBwZXJDYXNlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBsb2FkVGhlbWVJbnRvUGlja2Vycyh0aGVtZU5hbWUpIHtcbiAgICB2YXIgY29sb3JzID0gd2luZG93LlRIRU1FX0NPTE9SU1t0aGVtZU5hbWVdO1xuICAgIGlmICghY29sb3JzKSByZXR1cm47XG4gICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcbiAgICBwaWNrZXJzLmZvckVhY2goZnVuY3Rpb24gKHApIHtcbiAgICAgIHZhciB2YWwgPSBjb2xvcnNbcC5kYXRhc2V0LnByb3BdIHx8ICcjMDAwMDAwJztcbiAgICAgIGlmICh2YWwuc3RhcnRzV2l0aCgncmdiYScpIHx8IHZhbC5zdGFydHNXaXRoKCdjb2xvci1taXgnKSkgdmFsID0gJyMzMzMzMzMnO1xuICAgICAgcC52YWx1ZSA9IHZhbDtcbiAgICAgIHZhciBoZXggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZXg9XCInICsgcC5kYXRhc2V0LnByb3AgKyAnXCJdJyk7XG4gICAgICBpZiAoaGV4KSBoZXgudGV4dENvbnRlbnQgPSB2YWwudG9VcHBlckNhc2UoKTtcbiAgICB9KTtcbiAgICBsaWdodEJnQ2hlY2suY2hlY2tlZCA9ICEhY29sb3JzLmxpZ2h0Qmc7XG4gICAgdXBkYXRlUHJldmlldygpO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9hZFVzZXJUaGVtZUludG9QaWNrZXJzKHNsdWcpIHtcbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgdGhlbWUgPSB1c2VyVGhlbWVzW3NsdWddO1xuICAgIGlmICghdGhlbWUpIHJldHVybjtcbiAgICBhZHZhbmNlZE92ZXJyaWRlcyA9IHt9O1xuICAgIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgdmFyIHZhbCA9IHRoZW1lW3AuZGF0YXNldC5wcm9wXSB8fCAnIzAwMDAwMCc7XG4gICAgICBwLnZhbHVlID0gdmFsO1xuICAgICAgdmFyIGhleCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhleD1cIicgKyBwLmRhdGFzZXQucHJvcCArICdcIl0nKTtcbiAgICAgIGlmIChoZXgpIGhleC50ZXh0Q29udGVudCA9IHZhbC50b1VwcGVyQ2FzZSgpO1xuICAgICAgLy8gSWYgdGhlbWUgaGFzIGV4cGxpY2l0IGFkdmFuY2VkIHZhbHVlcywgbWFyayBhcyBvdmVycmlkZGVuXG4gICAgICBpZiAocC5kYXRhc2V0LmFkdmFuY2VkICYmIHRoZW1lW3AuZGF0YXNldC5wcm9wXSkge1xuICAgICAgICBhZHZhbmNlZE92ZXJyaWRlc1twLmRhdGFzZXQucHJvcF0gPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIG5hbWVJbnB1dC52YWx1ZSA9IHRoZW1lLm5hbWUgfHwgJyc7XG4gICAgbGlnaHRCZ0NoZWNrLmNoZWNrZWQgPSAhIXRoZW1lLmxpZ2h0Qmc7XG4gICAgLy8gRmlsbCBhbnkgbWlzc2luZyBhZHZhbmNlZCBmaWVsZHMgZnJvbSBkZXJpdmF0aW9uXG4gICAgdXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCgpO1xuICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZVByZXZpZXcoKSB7XG4gICAgdmFyIGMgPSBnZXRDdXJyZW50Q29sb3JzKCk7XG4gICAgdmFyIHByZXZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1wcmV2aWV3Jyk7XG4gICAgdmFyIGNhcmQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtcHJldmlldy1jYXJkJyk7XG4gICAgdmFyIHRpdGxlID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcucHJldmlldy10aXRsZScpO1xuICAgIHZhciBtdXRlZCA9IGNhcmQucXVlcnlTZWxlY3RvcignLnByZXZpZXctbXV0ZWQnKTtcbiAgICB2YXIgYmFkZ2VPayA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWJhZGdlLW9rJyk7XG4gICAgdmFyIGJhZGdlQmFkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctYmFkZ2UtYmFkJyk7XG4gICAgdmFyIGRvdE9rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctZG90LW9rJyk7XG4gICAgdmFyIGRvdEJhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwcmV2aWV3LWRvdC1iYWQnKTtcbiAgICB2YXIgYnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXctYWNjZW50LWJ0bicpO1xuICAgIHZhciBkb3RzID0gY2FyZC5xdWVyeVNlbGVjdG9yKCcucHJldmlldy1kb3RzJyk7XG5cbiAgICBwcmV2aWV3LnN0eWxlLmJhY2tncm91bmQgPSBjWydiZyddO1xuICAgIGNhcmQuc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2NhcmQtYmFzZSddO1xuICAgIGNhcmQuc3R5bGUuYm9yZGVyQ29sb3IgPSBjWydib3JkZXInXTtcbiAgICB0aXRsZS5zdHlsZS5jb2xvciA9IGNbJ2ZnJ107XG4gICAgbXV0ZWQuc3R5bGUuY29sb3IgPSBjWydtdXRlZCddO1xuICAgIGJhZGdlT2suc3R5bGUuYmFja2dyb3VuZCA9IGNbJ29rLWJnJ107XG4gICAgYmFkZ2VPay5zdHlsZS5jb2xvciA9IGNbJ29rLWZnJ107XG4gICAgYmFkZ2VCYWQuc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2JhZC1iZyddO1xuICAgIGJhZGdlQmFkLnN0eWxlLmNvbG9yID0gY1snYmFkLWZnJ107XG4gICAgZG90T2suc3R5bGUuYmFja2dyb3VuZCA9IGNbJ2RvdC1vayddO1xuICAgIGRvdEJhZC5zdHlsZS5iYWNrZ3JvdW5kID0gY1snZG90LWJhZCddO1xuICAgIGRvdHMuc3R5bGUuY29sb3IgPSBjWydmZyddO1xuICAgIGJ0bi5zdHlsZS5iYWNrZ3JvdW5kID0gY1snYWNjZW50J107XG4gICAgYnRuLnN0eWxlLmNvbG9yID0gY1snYmcnXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5Q29sb3JzTGl2ZShjb2xvcnMpIHtcbiAgICAvLyBJbmNsdWRlIGRlcml2ZWQgY29sb3JzIGZvciBmdWxsIGxpdmUgcHJldmlld1xuICAgIHZhciBkZXJpdmVkID0gd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzID8gd2luZG93LmRlcml2ZUV4dGVuZGVkQ29sb3JzKGNvbG9ycykgOiB7fTtcbiAgICB3aW5kb3cuVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkge1xuICAgICAgdmFyIHZhbCA9IGNvbG9yc1twcm9wXSB8fCBkZXJpdmVkW3Byb3BdO1xuICAgICAgaWYgKHZhbCkge1xuICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoJy0tJyArIHByb3AsIHZhbCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBXaXJlIHVwIGNvbG9yIHBpY2tlcnNcbiAgcGlja2Vycy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgcC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciBoZXggPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1oZXg9XCInICsgcC5kYXRhc2V0LnByb3AgKyAnXCJdJyk7XG4gICAgICBpZiAoaGV4KSBoZXgudGV4dENvbnRlbnQgPSBwLnZhbHVlLnRvVXBwZXJDYXNlKCk7XG5cbiAgICAgIC8vIFRyYWNrIG1hbnVhbCBhZHZhbmNlZCBvdmVycmlkZXNcbiAgICAgIGlmIChwLmRhdGFzZXQuYWR2YW5jZWQpIHtcbiAgICAgICAgYWR2YW5jZWRPdmVycmlkZXNbcC5kYXRhc2V0LnByb3BdID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEJhc2UgY29sb3IgY2hhbmdlZCBcdTIwMTQgcmUtZGVyaXZlIGFkdmFuY2VkIHZhbHVlcyAodW5sZXNzIG92ZXJyaWRkZW4pXG4gICAgICAgIHVwZGF0ZUFkdmFuY2VkRnJvbURlcml2ZWQoKTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlUHJldmlldygpO1xuICAgICAgYXBwbHlDb2xvcnNMaXZlKGdldEN1cnJlbnRDb2xvcnMoKSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIExpZ2h0LWJnIGNoZWNrYm94IHNob3VsZCByZS1kZXJpdmUgYWR2YW5jZWQgY29sb3JzXG4gIGxpZ2h0QmdDaGVjay5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCgpO1xuICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgICBhcHBseUNvbG9yc0xpdmUoZ2V0Q3VycmVudENvbG9ycygpKTtcbiAgfSk7XG5cbiAgc3RhcnRTZWxlY3QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG4gICAgbG9hZFRoZW1lSW50b1BpY2tlcnMoc3RhcnRTZWxlY3QudmFsdWUpO1xuICAgIGFwcGx5Q29sb3JzTGl2ZShnZXRDdXJyZW50Q29sb3JzKCkpO1xuICB9KTtcblxuICAvLyBQb3B1bGF0ZSBhbmQgcmVmcmVzaCB0aGUgZWRpdC1leGlzdGluZyBkcm9wZG93blxuICBmdW5jdGlvbiByZWZyZXNoRWRpdERyb3Bkb3duKCkge1xuICAgIHZhciB1c2VyVGhlbWVzID0gc2FmZUdldEpTT04od2luZG93LlVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIHZhciBzbHVncyA9IE9iamVjdC5rZXlzKHVzZXJUaGVtZXMpO1xuICAgIGVkaXRTZWxlY3QuaW5uZXJIVE1MID0gJzxvcHRpb24gdmFsdWU9XCJcIj5cdTIwMTQgTmV3IFRoZW1lIFx1MjAxNDwvb3B0aW9uPic7XG4gICAgc2x1Z3MuZm9yRWFjaChmdW5jdGlvbiAoc2x1Zykge1xuICAgICAgdmFyIG9wdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ29wdGlvbicpO1xuICAgICAgb3B0LnZhbHVlID0gc2x1ZztcbiAgICAgIG9wdC50ZXh0Q29udGVudCA9IHVzZXJUaGVtZXNbc2x1Z10ubmFtZSB8fCBzbHVnO1xuICAgICAgZWRpdFNlbGVjdC5hcHBlbmRDaGlsZChvcHQpO1xuICAgIH0pO1xuICAgIGV4aXN0aW5nU2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gc2x1Z3MubGVuZ3RoID8gJycgOiAnbm9uZSc7XG4gIH1cblxuICAvLyBBbHNvIHJlZnJlc2ggXCJTdGFydCBmcm9tXCIgb3B0aW9uc1xuICBmdW5jdGlvbiByZWZyZXNoU3RhcnRGcm9tKCkge1xuICAgIHN0YXJ0U2VsZWN0LmlubmVySFRNTCA9IGJ1aWxkU3RhcnRGcm9tT3B0aW9ucygpO1xuICB9XG5cbiAgLy8gRWRpdCBkcm9wZG93biBjaGFuZ2VcbiAgZWRpdFNlbGVjdC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHNsdWcgPSB0aGlzLnZhbHVlO1xuICAgIGlmIChzbHVnKSB7XG4gICAgICBlZGl0aW5nU2x1ZyA9IHNsdWc7XG4gICAgICBsb2FkVXNlclRoZW1lSW50b1BpY2tlcnMoc2x1Zyk7XG4gICAgICBhcHBseUNvbG9yc0xpdmUoZ2V0Q3VycmVudENvbG9ycygpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRpdGluZ1NsdWcgPSBudWxsO1xuICAgICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcbiAgICAgIG5hbWVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgc3RhcnRTZWxlY3QudmFsdWUgPSB3aW5kb3cuZ2V0QWN0aXZlVGhlbWUoKTtcbiAgICAgIGxvYWRUaGVtZUludG9QaWNrZXJzKHN0YXJ0U2VsZWN0LnZhbHVlKTtcbiAgICB9XG4gICAgZXhwb3J0QnRuLnN0eWxlLmRpc3BsYXkgPSBlZGl0aW5nU2x1ZyA/ICcnIDogJ25vbmUnO1xuICB9KTtcblxuICBmdW5jdGlvbiBvcGVuQnVpbGRlcigpIHtcbiAgICB0aGVtZUJlZm9yZUJ1aWxkZXIgPSB3aW5kb3cuZ2V0QWN0aXZlVGhlbWUoKTtcbiAgICBlZGl0aW5nU2x1ZyA9IG51bGw7XG4gICAgYWR2YW5jZWRPdmVycmlkZXMgPSB7fTtcblxuICAgIC8vIFJlc2V0IGFkdmFuY2VkIHNlY3Rpb24gdG8gY29sbGFwc2VkXG4gICAgYWR2YW5jZWRWaXNpYmxlID0gZmFsc2U7XG4gICAgYWR2YW5jZWRTZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgYWR2YW5jZWRUb2dnbGUuaW5uZXJIVE1MID0gJ1Nob3cgYWR2YW5jZWQgY29sb3JzICYjOTY2MDsnO1xuXG4gICAgcmVmcmVzaEVkaXREcm9wZG93bigpO1xuICAgIHJlZnJlc2hTdGFydEZyb20oKTtcblxuICAgIHZhciB1c2VyVGhlbWVzID0gc2FmZUdldEpTT04od2luZG93LlVTRVJfVEhFTUVTX0tFWSwge30pO1xuICAgIGlmICh1c2VyVGhlbWVzW3RoZW1lQmVmb3JlQnVpbGRlcl0pIHtcbiAgICAgIC8vIEFjdGl2ZSB0aGVtZSBpcyBhIHVzZXIgdGhlbWUgXHUyMDE0IG9wZW4gaXQgZm9yIGVkaXRpbmdcbiAgICAgIGVkaXRTZWxlY3QudmFsdWUgPSB0aGVtZUJlZm9yZUJ1aWxkZXI7XG4gICAgICBlZGl0aW5nU2x1ZyA9IHRoZW1lQmVmb3JlQnVpbGRlcjtcbiAgICAgIGxvYWRVc2VyVGhlbWVJbnRvUGlja2Vycyh0aGVtZUJlZm9yZUJ1aWxkZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlZGl0U2VsZWN0LnZhbHVlID0gJyc7XG4gICAgICBuYW1lSW5wdXQudmFsdWUgPSAnJztcbiAgICAgIHN0YXJ0U2VsZWN0LnZhbHVlID0gdGhlbWVCZWZvcmVCdWlsZGVyO1xuICAgICAgbG9hZFRoZW1lSW50b1BpY2tlcnModGhlbWVCZWZvcmVCdWlsZGVyKTtcbiAgICB9XG5cbiAgICBleHBvcnRCdG4uc3R5bGUuZGlzcGxheSA9IGVkaXRpbmdTbHVnID8gJycgOiAnbm9uZSc7XG4gICAgbW9kYWwuY2xhc3NMaXN0LmFkZCgnc2hvdycpO1xuICB9XG5cbiAgdmFyIGN1c3RvbWl6ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1jdXN0b21pemUtYnRuJyk7XG4gIGlmIChjdXN0b21pemVCdG4pIHtcbiAgICBjdXN0b21pemVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7IG9wZW5CdWlsZGVyKCk7IH0pO1xuICB9XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIFNhdmUgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItc2F2ZScpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBjb2xvcnMgPSBnZXRDdXJyZW50Q29sb3JzKCk7XG4gICAgdmFyIG5hbWUgPSBuYW1lSW5wdXQudmFsdWUudHJpbSgpO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgc2hvd05vdGlmaWNhdGlvbignUGxlYXNlIGVudGVyIGEgdGhlbWUgbmFtZScsICd3YXJuaW5nJywgMzAwMCk7XG4gICAgICBuYW1lSW5wdXQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgc2x1ZztcbiAgICB2YXIgb2xkU2x1ZyA9IG51bGw7XG5cbiAgICBpZiAoZWRpdGluZ1NsdWcpIHtcbiAgICAgIHNsdWcgPSBlZGl0aW5nU2x1ZztcbiAgICAgIC8vIElmIG5hbWUgY2hhbmdlZCwgcmUtc2x1Z2lmeSBhbmQgcG90ZW50aWFsbHkgcmVuYW1lXG4gICAgICB2YXIgbmV3U2x1ZyA9IHdpbmRvdy5zbHVnaWZ5VGhlbWVOYW1lKG5hbWUsIGVkaXRpbmdTbHVnKTtcbiAgICAgIGlmIChuZXdTbHVnICE9PSBlZGl0aW5nU2x1Zykge1xuICAgICAgICBvbGRTbHVnID0gZWRpdGluZ1NsdWc7XG4gICAgICAgIGRlbGV0ZSB1c2VyVGhlbWVzW2VkaXRpbmdTbHVnXTtcbiAgICAgICAgdmFyIGlkeCA9IHdpbmRvdy5USEVNRVMuaW5kZXhPZihlZGl0aW5nU2x1Zyk7XG4gICAgICAgIGlmIChpZHggIT09IC0xKSB3aW5kb3cuVEhFTUVTLnNwbGljZShpZHgsIDEpO1xuICAgICAgICBkZWxldGUgd2luZG93LlRIRU1FX0NPTE9SU1tlZGl0aW5nU2x1Z107XG4gICAgICAgIHNsdWcgPSBuZXdTbHVnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzbHVnID0gd2luZG93LnNsdWdpZnlUaGVtZU5hbWUobmFtZSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhlbWUgZGF0YSB3aXRoIEFMTCBjb2xvciBwcm9wZXJ0aWVzXG4gICAgdmFyIHRoZW1lRGF0YSA9IHsgbmFtZTogbmFtZSB9O1xuICAgIGlmIChsaWdodEJnQ2hlY2suY2hlY2tlZCkgdGhlbWVEYXRhLmxpZ2h0QmcgPSB0cnVlO1xuICAgIHdpbmRvdy5USEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7XG4gICAgICBpZiAoY29sb3JzW3BdKSB0aGVtZURhdGFbcF0gPSBjb2xvcnNbcF07XG4gICAgfSk7XG5cbiAgICAvLyBVcGRhdGUgbG9jYWxTdG9yYWdlIGNhY2hlIGltbWVkaWF0ZWx5IGZvciBpbnN0YW50IFVJXG4gICAgdXNlclRoZW1lc1tzbHVnXSA9IHRoZW1lRGF0YTtcbiAgICBzYWZlU2V0KHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIEpTT04uc3RyaW5naWZ5KHVzZXJUaGVtZXMpKTtcblxuICAgIC8vIENsZWFyIGlubGluZSBwcmV2aWV3IHByb3BlcnRpZXNcbiAgICB3aW5kb3cuY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG5cbiAgICAvLyBSZS1pbmplY3QgQ1NTIGFuZCBhcHBseVxuICAgIHdpbmRvdy5pbmplY3RVc2VyVGhlbWVTdHlsZXMoKTtcbiAgICB3aW5kb3cuYXBwbHlUaGVtZShzbHVnKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgdXBkYXRlTGFiZWwoKTtcblxuICAgIC8vIFNhdmUgdG8gc2VydmVyIChzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgdmFyIGFwaUNvbG9ycyA9IHt9O1xuICAgIHdpbmRvdy5USEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGlmIChjb2xvcnNbcF0pIGFwaUNvbG9yc1twXSA9IGNvbG9yc1twXTsgfSk7XG5cbiAgICAvLyBJZiBzbHVnIGNoYW5nZWQsIGRlbGV0ZSB0aGUgb2xkIG9uZSBmcm9tIHNlcnZlclxuICAgIGlmIChvbGRTbHVnKSB7XG4gICAgICBzZWN1cmVGZXRjaCgnL2FwaS92MS90aGVtZXMvJyArIG9sZFNsdWcsIHsgbWV0aG9kOiAnREVMRVRFJyB9KS5jYXRjaChmdW5jdGlvbiAoKSB7fSk7XG4gICAgfVxuXG4gICAgc2VjdXJlRmV0Y2goJy9hcGkvdjEvdGhlbWVzLycgKyBzbHVnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBuYW1lOiBuYW1lLCBjb2xvcnM6IGFwaUNvbG9ycywgbGlnaHRCZzogbGlnaHRCZ0NoZWNrLmNoZWNrZWQgfSlcbiAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24obmFtZSArICcgdGhlbWUgc2F2ZWQnLCAnc3VjY2VzcycsIDMwMDApO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24obmFtZSArICcgdGhlbWUgc2F2ZWQgbG9jYWxseSAoc2VydmVyIHN5bmMgZmFpbGVkKScsICd3YXJuaW5nJywgMzAwMCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBDYW5jZWwgXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXHUyNTAwXG5cbiAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RoZW1lLWJ1aWxkZXItY2FuY2VsJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgbW9kYWwuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpO1xuICAgIHdpbmRvdy5jbGVhckN1c3RvbVByb3BlcnRpZXMoKTtcbiAgICBpZiAodGhlbWVCZWZvcmVCdWlsZGVyKSB7XG4gICAgICB3aW5kb3cuYXBwbHlUaGVtZSh0aGVtZUJlZm9yZUJ1aWxkZXIpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIERlbGV0ZSBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1kZWxldGUnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWVkaXRpbmdTbHVnKSByZXR1cm47XG5cbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgbmFtZSA9IHVzZXJUaGVtZXNbZWRpdGluZ1NsdWddID8gdXNlclRoZW1lc1tlZGl0aW5nU2x1Z10ubmFtZSA6IGVkaXRpbmdTbHVnO1xuXG4gICAgaWYgKCFjb25maXJtKCdEZWxldGUgXCInICsgbmFtZSArICdcIiB0aGVtZT8nKSkgcmV0dXJuO1xuXG4gICAgdmFyIHNsdWdUb0RlbGV0ZSA9IGVkaXRpbmdTbHVnO1xuXG4gICAgLy8gVXBkYXRlIGxvY2FsU3RvcmFnZSBjYWNoZSBpbW1lZGlhdGVseVxuICAgIGRlbGV0ZSB1c2VyVGhlbWVzW3NsdWdUb0RlbGV0ZV07XG4gICAgc2FmZVNldCh3aW5kb3cuVVNFUl9USEVNRVNfS0VZLCBKU09OLnN0cmluZ2lmeSh1c2VyVGhlbWVzKSk7XG5cbiAgICAvLyBSZW1vdmUgZnJvbSBydW50aW1lXG4gICAgdmFyIGlkeCA9IHdpbmRvdy5USEVNRVMuaW5kZXhPZihzbHVnVG9EZWxldGUpO1xuICAgIGlmIChpZHggIT09IC0xKSB3aW5kb3cuVEhFTUVTLnNwbGljZShpZHgsIDEpO1xuICAgIGRlbGV0ZSB3aW5kb3cuVEhFTUVfQ09MT1JTW3NsdWdUb0RlbGV0ZV07XG5cbiAgICB3aW5kb3cuY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG4gICAgd2luZG93LmluamVjdFVzZXJUaGVtZVN0eWxlcygpO1xuXG4gICAgdmFyIGZhbGxiYWNrID0gdGhlbWVCZWZvcmVCdWlsZGVyICYmIHRoZW1lQmVmb3JlQnVpbGRlciAhPT0gc2x1Z1RvRGVsZXRlID8gdGhlbWVCZWZvcmVCdWlsZGVyIDogJ2RhcmsnO1xuICAgIHdpbmRvdy5hcHBseVRoZW1lKGZhbGxiYWNrKTtcblxuICAgIGVkaXRpbmdTbHVnID0gbnVsbDtcbiAgICBtb2RhbC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93Jyk7XG4gICAgdXBkYXRlTGFiZWwoKTtcblxuICAgIC8vIERlbGV0ZSBmcm9tIHNlcnZlclxuICAgIHNlY3VyZUZldGNoKCcvYXBpL3YxL3RoZW1lcy8nICsgc2x1Z1RvRGVsZXRlLCB7IG1ldGhvZDogJ0RFTEVURScgfSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKG5hbWUgKyAnIHRoZW1lIGRlbGV0ZWQnLCAnc3VjY2VzcycsIDMwMDApO1xuICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHtcbiAgICAgIHNob3dOb3RpZmljYXRpb24obmFtZSArICcgdGhlbWUgZGVsZXRlZCBsb2NhbGx5IChzZXJ2ZXIgc3luYyBmYWlsZWQpJywgJ3dhcm5pbmcnLCAzMDAwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gXHUyNTAwXHUyNTAwXHUyNTAwIEV4cG9ydCBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGhlbWUtYnVpbGRlci1leHBvcnQnKS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIWVkaXRpbmdTbHVnKSB7XG4gICAgICBzaG93Tm90aWZpY2F0aW9uKCdTYXZlIHRoZSB0aGVtZSBmaXJzdCwgdGhlbiBleHBvcnQnLCAnd2FybmluZycsIDMwMDApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgdXNlclRoZW1lcyA9IHNhZmVHZXRKU09OKHdpbmRvdy5VU0VSX1RIRU1FU19LRVksIHt9KTtcbiAgICB2YXIgdGhlbWUgPSB1c2VyVGhlbWVzW2VkaXRpbmdTbHVnXTtcbiAgICBpZiAoIXRoZW1lKSByZXR1cm47XG5cbiAgICB2YXIgZXhwb3J0RGF0YSA9IHtcbiAgICAgIF9kYXNoY2FkZHlfdGhlbWU6IHRydWUsXG4gICAgICB2ZXJzaW9uOiAnMS4wJyxcbiAgICAgIGV4cG9ydERhdGU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHNsdWc6IGVkaXRpbmdTbHVnLFxuICAgICAgbmFtZTogdGhlbWUubmFtZSxcbiAgICAgIGxpZ2h0Qmc6IHRoZW1lLmxpZ2h0QmcgfHwgZmFsc2UsXG4gICAgICBjb2xvcnM6IHt9XG4gICAgfTtcbiAgICB3aW5kb3cuVEhFTUVfUFJPUFMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgaWYgKHRoZW1lW3BdKSBleHBvcnREYXRhLmNvbG9yc1twXSA9IHRoZW1lW3BdO1xuICAgIH0pO1xuXG4gICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbSlNPTi5zdHJpbmdpZnkoZXhwb3J0RGF0YSwgbnVsbCwgMildLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICB2YXIgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICBhLmhyZWYgPSB1cmw7XG4gICAgYS5kb3dubG9hZCA9IGVkaXRpbmdTbHVnICsgJy10aGVtZS5qc29uJztcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGEpO1xuICAgIGEuY2xpY2soKTtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGEpO1xuICAgIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbiAgICBzaG93Tm90aWZpY2F0aW9uKCdUaGVtZSBleHBvcnRlZCBhcyAnICsgZWRpdGluZ1NsdWcgKyAnLXRoZW1lLmpzb24nLCAnc3VjY2VzcycsIDMwMDApO1xuICB9KTtcblxuICAvLyBcdTI1MDBcdTI1MDBcdTI1MDAgSW1wb3J0IFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFxuXG4gIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0aGVtZS1idWlsZGVyLWltcG9ydCcpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgaW5wdXQudHlwZSA9ICdmaWxlJztcbiAgICBpbnB1dC5hY2NlcHQgPSAnLmpzb24nO1xuICAgIGlucHV0Lm9uY2hhbmdlID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgIHZhciBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07XG4gICAgICBpZiAoIWZpbGUpIHJldHVybjtcbiAgICAgIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChldikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShldi50YXJnZXQucmVzdWx0KTtcblxuICAgICAgICAgIC8vIFN1cHBvcnQgYm90aCB3cmFwcGVkIGZvcm1hdCBhbmQgcmF3IHRoZW1lIGZvcm1hdFxuICAgICAgICAgIHZhciB0aGVtZU5hbWUsIHRoZW1lQ29sb3JzLCB0aGVtZUxpZ2h0Qmc7XG4gICAgICAgICAgaWYgKGRhdGEuX2Rhc2hjYWRkeV90aGVtZSAmJiBkYXRhLmNvbG9ycykge1xuICAgICAgICAgICAgLy8gV3JhcHBlZCBleHBvcnQgZm9ybWF0XG4gICAgICAgICAgICB0aGVtZU5hbWUgPSBkYXRhLm5hbWUgfHwgJ0ltcG9ydGVkJztcbiAgICAgICAgICAgIHRoZW1lQ29sb3JzID0gZGF0YS5jb2xvcnM7XG4gICAgICAgICAgICB0aGVtZUxpZ2h0QmcgPSBkYXRhLmxpZ2h0QmcgfHwgZmFsc2U7XG4gICAgICAgICAgfSBlbHNlIGlmIChkYXRhLm5hbWUgJiYgKGRhdGEuYmcgfHwgZGF0YVsnY2FyZC1iYXNlJ10pKSB7XG4gICAgICAgICAgICAvLyBSYXcgdGhlbWUgSlNPTiAoc2FtZSBmb3JtYXQgYXMgc2VydmVyIGZpbGVzKVxuICAgICAgICAgICAgdGhlbWVOYW1lID0gZGF0YS5uYW1lO1xuICAgICAgICAgICAgdGhlbWVDb2xvcnMgPSB7fTtcbiAgICAgICAgICAgIHdpbmRvdy5USEVNRV9QUk9QUy5mb3JFYWNoKGZ1bmN0aW9uIChwKSB7IGlmIChkYXRhW3BdKSB0aGVtZUNvbG9yc1twXSA9IGRhdGFbcF07IH0pO1xuICAgICAgICAgICAgdGhlbWVMaWdodEJnID0gZGF0YS5saWdodEJnIHx8IGZhbHNlO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIHZhbGlkIERhc2hDYWRkeSB0aGVtZSBmaWxlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTG9hZCBpbnRvIGJ1aWxkZXJcbiAgICAgICAgICBuYW1lSW5wdXQudmFsdWUgPSB0aGVtZU5hbWU7XG4gICAgICAgICAgbGlnaHRCZ0NoZWNrLmNoZWNrZWQgPSAhIXRoZW1lTGlnaHRCZztcbiAgICAgICAgICBlZGl0aW5nU2x1ZyA9IG51bGw7XG4gICAgICAgICAgZWRpdFNlbGVjdC52YWx1ZSA9ICcnO1xuICAgICAgICAgIGFkdmFuY2VkT3ZlcnJpZGVzID0ge307XG5cbiAgICAgICAgICAvLyBBcHBseSBjb2xvcnMgdG8gcGlja2Vyc1xuICAgICAgICAgIHBpY2tlcnMuZm9yRWFjaChmdW5jdGlvbiAocCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoZW1lQ29sb3JzW3AuZGF0YXNldC5wcm9wXSB8fCAnIzAwMDAwMCc7XG4gICAgICAgICAgICBwLnZhbHVlID0gdmFsO1xuICAgICAgICAgICAgdmFyIGhleCA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLWhleD1cIicgKyBwLmRhdGFzZXQucHJvcCArICdcIl0nKTtcbiAgICAgICAgICAgIGlmIChoZXgpIGhleC50ZXh0Q29udGVudCA9IHZhbC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKHAuZGF0YXNldC5hZHZhbmNlZCAmJiB0aGVtZUNvbG9yc1twLmRhdGFzZXQucHJvcF0pIHtcbiAgICAgICAgICAgICAgYWR2YW5jZWRPdmVycmlkZXNbcC5kYXRhc2V0LnByb3BdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEZpbGwgYW55IG1pc3NpbmcgYWR2YW5jZWQgZmllbGRzXG4gICAgICAgICAgdXBkYXRlQWR2YW5jZWRGcm9tRGVyaXZlZCgpO1xuICAgICAgICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgICAgICAgICBhcHBseUNvbG9yc0xpdmUoZ2V0Q3VycmVudENvbG9ycygpKTtcbiAgICAgICAgICBleHBvcnRCdG4uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICBzaG93Tm90aWZpY2F0aW9uKCdcIicgKyB0aGVtZU5hbWUgKyAnXCIgbG9hZGVkIGludG8gYnVpbGRlci4gQ2xpY2sgU2F2ZSB0byBrZWVwIGl0LicsICdzdWNjZXNzJywgNTAwMCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0ltcG9ydCBmYWlsZWQ6ICcgKyBlcnIubWVzc2FnZSwgJ2Vycm9yJywgNTAwMCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcbiAgICB9O1xuICAgIGlucHV0LmNsaWNrKCk7XG4gIH0pO1xuXG4gIC8vIFx1MjUwMFx1MjUwMFx1MjUwMCBNb2RhbCBjbG9zZSBoYW5kbGluZyBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcblxuICB3aXJlTW9kYWwobW9kYWwpO1xuXG4gIG1vZGFsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICBpZiAoZS50YXJnZXQgPT09IG1vZGFsKSB7XG4gICAgICB3aW5kb3cuY2xlYXJDdXN0b21Qcm9wZXJ0aWVzKCk7XG4gICAgICBpZiAodGhlbWVCZWZvcmVCdWlsZGVyKSB3aW5kb3cuYXBwbHlUaGVtZSh0aGVtZUJlZm9yZUJ1aWxkZXIpO1xuICAgIH1cbiAgfSk7XG59KSgpO1xuO1xuLy8gTGljZW5zZSBNYW5hZ2VtZW50IFVJXG4oZnVuY3Rpb24oKSB7XG4gIC8vIEluamVjdCBsaWNlbnNlIG1vZGFsIEhUTUxcbiAgaW5qZWN0TW9kYWwoJ2xpY2Vuc2UtbW9kYWwnLCBgPGRpdiBpZD1cImxpY2Vuc2UtbW9kYWxcIiBjbGFzcz1cIndlYXRoZXItbW9kYWxcIj5cbiAgICA8ZGl2IGNsYXNzPVwid2VhdGhlci1tb2RhbC1jb250ZW50XCIgc3R5bGU9XCJtaW4td2lkdGg6IDQyMHB4OyBtYXgtd2lkdGg6IDUyMHB4O1wiPlxuICAgICAgPGgzPkRhc2hDYWRkeSBMaWNlbnNlPC9oMz5cbiAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjg1cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW46IDAgMCAxNnB4O1wiPlxuICAgICAgICBBY3RpdmF0ZSBhIGxpY2Vuc2UgY29kZSB0byB1bmxvY2sgcHJlbWl1bSBmZWF0dXJlcy5cbiAgICAgIDwvcD5cblxuICAgICAgPGRpdiBpZD1cImxpY2Vuc2Utc3RhdHVzLXNlY3Rpb25cIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDE2cHg7XCI+XG4gICAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWJhZGdlXCIgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA2cHg7IHBhZGRpbmc6IDZweCAxNHB4OyBib3JkZXItcmFkaXVzOiAyMHB4OyBmb250LXNpemU6IDAuODVyZW07IGZvbnQtd2VpZ2h0OiA2MDA7IG1hcmdpbi1ib3R0b206IDEycHg7XCI+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJsaWNlbnNlLWJhZGdlLWljb25cIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gaWQ9XCJsaWNlbnNlLWJhZGdlLXRleHRcIj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGlkPVwibGljZW5zZS1kZXRhaWxzXCIgc3R5bGU9XCJmb250LXNpemU6IDAuODVyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IGxpbmUtaGVpZ2h0OiAxLjY7XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBpZD1cImxpY2Vuc2UtYWN0aXZhdGUtc2VjdGlvblwiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIj5MaWNlbnNlIENvZGU6PC9sYWJlbD5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgaWQ9XCJsaWNlbnNlLWNvZGUtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIkRDLVhYWFhYLVhYWFhYLVhYWFhYLVhYWFhYLVhYWFhYXCJcbiAgICAgICAgICBtYXhsZW5ndGg9XCIzNVwiIHNwZWxsY2hlY2s9XCJmYWxzZVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXNpemU6IDFyZW07IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGxldHRlci1zcGFjaW5nOiAxcHg7XCIgLz5cbiAgICAgICAgPHAgY2xhc3M9XCJ0aW55LWhpbnRcIj5FbnRlciB5b3VyIGxpY2Vuc2UgY29kZSB0byBhY3RpdmF0ZSBwcmVtaXVtIGZlYXR1cmVzPC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWZlYXR1cmVzXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsLWJvbGRcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDhweDsgZGlzcGxheTogYmxvY2s7XCI+UHJlbWl1bSBGZWF0dXJlczo8L2xhYmVsPlxuICAgICAgICA8ZGl2IGlkPVwibGljZW5zZS1mZWF0dXJlLWxpc3RcIiBzdHlsZT1cImRpc3BsYXk6IGdyaWQ7IGdhcDogOHB4O1wiPjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgaWQ9XCJsaWNlbnNlLWVycm9yXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxMnB4OyBwYWRkaW5nOiAxMHB4OyBib3JkZXItcmFkaXVzOiA0cHg7IGJhY2tncm91bmQ6IHJnYmEoMjMxLDc2LDYwLDAuMTUpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgZm9udC1zaXplOiAwLjg1cmVtO1wiPjwvZGl2PlxuICAgICAgPGRpdiBpZD1cImxpY2Vuc2Utc3VjY2Vzc1wiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDQ2LDIwNCwxMTMsMC4xNSk7IGNvbG9yOiB2YXIoLS1vay1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtYnV0dG9uc1wiIHN0eWxlPVwibWFyZ2luLXRvcDogMTZweDtcIj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImxpY2Vuc2UtY2FuY2VsXCI+Q2xvc2U8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBpZD1cImxpY2Vuc2UtZGVhY3RpdmF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgYmFja2dyb3VuZDogdmFyKC0tYmFkLWJnKTsgYm9yZGVyLWNvbG9yOiB2YXIoLS1iYWQtZmcpOyBjb2xvcjogdmFyKC0tYmFkLWZnKTtcIj5EZWFjdGl2YXRlPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gaWQ9XCJsaWNlbnNlLWFjdGl2YXRlXCIgY2xhc3M9XCJidG4tYWNjZW50XCI+QWN0aXZhdGU8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5gKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLW1vZGFsJyk7XG4gIGNvbnN0IGNvZGVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWNvZGUtaW5wdXQnKTtcbiAgY29uc3QgYWN0aXZhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1hY3RpdmF0ZScpO1xuICBjb25zdCBkZWFjdGl2YXRlQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtZGVhY3RpdmF0ZScpO1xuICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtZXJyb3InKTtcbiAgY29uc3Qgc3VjY2Vzc0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2Utc3VjY2VzcycpO1xuICBjb25zdCBiYWRnZUljb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1iYWRnZS1pY29uJyk7XG4gIGNvbnN0IGJhZGdlVGV4dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWJhZGdlLXRleHQnKTtcbiAgY29uc3QgYmFkZ2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1iYWRnZScpO1xuICBjb25zdCBkZXRhaWxzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS1kZXRhaWxzJyk7XG4gIGNvbnN0IGZlYXR1cmVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtZmVhdHVyZS1saXN0Jyk7XG4gIGNvbnN0IGFjdGl2YXRlU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLWFjdGl2YXRlLXNlY3Rpb24nKTtcblxuICBsZXQgY3VycmVudFN0YXR1cyA9IG51bGw7XG5cbiAgZnVuY3Rpb24gaGlkZU1lc3NhZ2VzKCkge1xuICAgIGVycm9yRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBzdWNjZXNzRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgfVxuXG4gIGZ1bmN0aW9uIHNob3dFcnJvcihtc2cpIHtcbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gbXNnO1xuICAgIGVycm9yRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93U3VjY2Vzcyhtc2cpIHtcbiAgICBoaWRlTWVzc2FnZXMoKTtcbiAgICBzdWNjZXNzRWwudGV4dENvbnRlbnQgPSBtc2c7XG4gICAgc3VjY2Vzc0VsLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVuZGVyU3RhdHVzKHN0YXR1cykge1xuICAgIGN1cnJlbnRTdGF0dXMgPSBzdGF0dXM7XG5cbiAgICBpZiAoc3RhdHVzLmFjdGl2ZSkge1xuICAgICAgYmFkZ2Uuc3R5bGUuYmFja2dyb3VuZCA9ICdyZ2JhKDQ2LDIwNCwxMTMsMC4xNSknO1xuICAgICAgYmFkZ2Uuc3R5bGUuY29sb3IgPSAndmFyKC0tb2stZmcpJztcbiAgICAgIGJhZGdlSWNvbi50ZXh0Q29udGVudCA9ICdcXHUyNjA1JztcbiAgICAgIGJhZGdlVGV4dC50ZXh0Q29udGVudCA9ICdQcmVtaXVtIEFjdGl2ZSc7XG4gICAgICBjb25zdCBleHBpcnlMaW5lID0gc3RhdHVzLmxpZmV0aW1lXG4gICAgICAgID8gJzxkaXY+TGljZW5zZTogPHN0cm9uZz5MSUZFVElNRTwvc3Ryb25nPjwvZGl2PidcbiAgICAgICAgOiBgPGRpdj5FeHBpcmVzOiA8c3Ryb25nPiR7bmV3IERhdGUoc3RhdHVzLmV4cGlyZXNBdCkudG9Mb2NhbGVEYXRlU3RyaW5nKCl9PC9zdHJvbmc+ICgke3N0YXR1cy5kYXlzUmVtYWluaW5nfSBkYXlzIHJlbWFpbmluZyk8L2Rpdj5gO1xuICAgICAgZGV0YWlsc0VsLmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdj5Db2RlOiA8Y29kZSBzdHlsZT1cImZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XCI+JHtzdGF0dXMuY29kZSB8fCAnKioqJ308L2NvZGU+PC9kaXY+XG4gICAgICAgICR7ZXhwaXJ5TGluZX1cbiAgICAgIGA7XG4gICAgICBhY3RpdmF0ZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIGFjdGl2YXRlQnRuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICBkZWFjdGl2YXRlQnRuLnN0eWxlLmRpc3BsYXkgPSAnJztcbiAgICB9IGVsc2Uge1xuICAgICAgYmFkZ2Uuc3R5bGUuYmFja2dyb3VuZCA9ICdyZ2JhKDE0OSwxNjUsMTY2LDAuMTUpJztcbiAgICAgIGJhZGdlLnN0eWxlLmNvbG9yID0gJ3ZhcigtLW11dGVkKSc7XG4gICAgICBiYWRnZUljb24udGV4dENvbnRlbnQgPSAnXFx1MjYwNic7XG4gICAgICBiYWRnZVRleHQudGV4dENvbnRlbnQgPSBzdGF0dXMuZXhwaXJlZCA/ICdMaWNlbnNlIEV4cGlyZWQnIDogJ0ZyZWUgVGllcic7XG4gICAgICBkZXRhaWxzRWwuaW5uZXJIVE1MID0gc3RhdHVzLmV4cGlyZWRcbiAgICAgICAgPyAnPGRpdj5Zb3VyIGxpY2Vuc2UgaGFzIGV4cGlyZWQuIEVudGVyIGEgbmV3IGNvZGUgdG8gcmVuZXcuPC9kaXY+J1xuICAgICAgICA6ICc8ZGl2PkVudGVyIGEgbGljZW5zZSBjb2RlIHRvIHVubG9jayBwcmVtaXVtIGZlYXR1cmVzLjwvZGl2Pic7XG4gICAgICBhY3RpdmF0ZVNlY3Rpb24uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgYWN0aXZhdGVCdG4uc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgZGVhY3RpdmF0ZUJ0bi5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciBmZWF0dXJlIGxpc3RcbiAgICBjb25zdCBmZWF0dXJlcyA9IHN0YXR1cy5wcmVtaXVtRmVhdHVyZXMgfHwge307XG4gICAgY29uc3QgYWN0aXZlRmVhdHVyZXMgPSBuZXcgU2V0KHN0YXR1cy5mZWF0dXJlcyB8fCBbXSk7XG4gICAgZmVhdHVyZUxpc3QuaW5uZXJIVE1MID0gT2JqZWN0LmVudHJpZXMoZmVhdHVyZXMpLm1hcCgoW2tleSwgaW5mb10pID0+IHtcbiAgICAgIGNvbnN0IGFjdGl2ZSA9IGFjdGl2ZUZlYXR1cmVzLmhhcyhrZXkpO1xuICAgICAgcmV0dXJuIGA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsgZ2FwOiA4cHg7IHBhZGRpbmc6IDhweCAxMnB4OyBib3JkZXItcmFkaXVzOiA2cHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICA8c3BhbiBzdHlsZT1cImZvbnQtc2l6ZTogMS4xcmVtO1wiPiR7YWN0aXZlID8gJ1xcdTI3MDUnIDogJ1xcdUQ4M0RcXHVERDEyJ308L3NwYW4+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImZvbnQtd2VpZ2h0OiA2MDA7IGZvbnQtc2l6ZTogMC45cmVtO1wiPiR7aW5mby5uYW1lfTwvZGl2PlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuNzhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+JHtpbmZvLmRlc2NyaXB0aW9ufTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PmA7XG4gICAgfSkuam9pbignJyk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkU3RhdHVzKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goJy9hcGkvdjEvbGljZW5zZS9zdGF0dXMnKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgcmVuZGVyU3RhdHVzKGRhdGEubGljZW5zZSk7XG4gICAgICAgIHVwZGF0ZUhlYWRlckJhZGdlKGRhdGEubGljZW5zZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gbG9hZCBsaWNlbnNlIHN0YXR1czonLCBlLm1lc3NhZ2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFjdGl2YXRlTGljZW5zZSgpIHtcbiAgICBjb25zdCBjb2RlID0gY29kZUlucHV0LnZhbHVlLnRyaW0oKTtcbiAgICBpZiAoIWNvZGUpIHtcbiAgICAgIHNob3dFcnJvcignUGxlYXNlIGVudGVyIGEgbGljZW5zZSBjb2RlLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIGFjdGl2YXRlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBhY3RpdmF0ZUJ0bi50ZXh0Q29udGVudCA9ICdBY3RpdmF0aW5nLi4uJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbGljZW5zZS9hY3RpdmF0ZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IGNvZGUgfSlcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHJlc3AuanNvbigpO1xuXG4gICAgICBpZiAoZGF0YS5zdWNjZXNzKSB7XG4gICAgICAgIHNob3dTdWNjZXNzKGRhdGEubWVzc2FnZSk7XG4gICAgICAgIGNvZGVJbnB1dC52YWx1ZSA9ICcnO1xuICAgICAgICByZW5kZXJTdGF0dXMoZGF0YS5saWNlbnNlKTtcbiAgICAgICAgc2hvd05vdGlmaWNhdGlvbignTGljZW5zZSBhY3RpdmF0ZWQhIFByZW1pdW0gZmVhdHVyZXMgdW5sb2NrZWQuJywgJ3N1Y2Nlc3MnLCA1MDAwKTtcbiAgICAgICAgdXBkYXRlSGVhZGVyQmFkZ2UoZGF0YS5saWNlbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNob3dFcnJvcihkYXRhLmVycm9yIHx8ICdBY3RpdmF0aW9uIGZhaWxlZCcpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dFcnJvcignTmV0d29yayBlcnJvcjogJyArIGUubWVzc2FnZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGFjdGl2YXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBhY3RpdmF0ZUJ0bi50ZXh0Q29udGVudCA9ICdBY3RpdmF0ZSc7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZGVhY3RpdmF0ZUxpY2Vuc2UoKSB7XG4gICAgaWYgKCFjb25maXJtKCdEZWFjdGl2YXRlIHlvdXIgbGljZW5zZT8gWW91IGNhbiByZXVzZSB0aGUgY29kZSBvbiBhbm90aGVyIG1hY2hpbmUuJykpIHJldHVybjtcblxuICAgIGRlYWN0aXZhdGVCdG4uZGlzYWJsZWQgPSB0cnVlO1xuICAgIGRlYWN0aXZhdGVCdG4udGV4dENvbnRlbnQgPSAnRGVhY3RpdmF0aW5nLi4uJztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgc2VjdXJlRmV0Y2goJy9hcGkvdjEvbGljZW5zZS9kZWFjdGl2YXRlJywgeyBtZXRob2Q6ICdQT1NUJyB9KTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcblxuICAgICAgaWYgKGRhdGEuc3VjY2Vzcykge1xuICAgICAgICBzaG93U3VjY2VzcyhkYXRhLm1lc3NhZ2UpO1xuICAgICAgICBhd2FpdCBsb2FkU3RhdHVzKCk7XG4gICAgICAgIHNob3dOb3RpZmljYXRpb24oJ0xpY2Vuc2UgZGVhY3RpdmF0ZWQuJywgJ2luZm8nLCAzMDAwKTtcbiAgICAgICAgdXBkYXRlSGVhZGVyQmFkZ2UoeyBhY3RpdmU6IGZhbHNlIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2hvd0Vycm9yKGRhdGEuZXJyb3IgfHwgJ0RlYWN0aXZhdGlvbiBmYWlsZWQnKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3I6ICcgKyBlLm1lc3NhZ2UpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkZWFjdGl2YXRlQnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICBkZWFjdGl2YXRlQnRuLnRleHRDb250ZW50ID0gJ0RlYWN0aXZhdGUnO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHVwZGF0ZUhlYWRlckJhZGdlKHN0YXR1cykge1xuICAgIGNvbnN0IHRvcGJhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXN0YXR1cy10b3BiYXInKTtcbiAgICBjb25zdCBpY29uRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbGljZW5zZS10b3BiYXItaWNvbicpO1xuICAgIGNvbnN0IHRleHRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXRvcGJhci10ZXh0Jyk7XG4gICAgY29uc3QgdGltZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtdG9wYmFyLXRpbWUnKTtcbiAgICBpZiAoIXRvcGJhcikgcmV0dXJuO1xuXG4gICAgdG9wYmFyLmNsYXNzTmFtZSA9ICdsaWNlbnNlLXN0YXR1cy10b3BiYXIgJyArIChzdGF0dXMuYWN0aXZlID8gJ3ByZW1pdW0nIDogJ2ZyZWUnKTtcblxuICAgIGlmIChzdGF0dXMuYWN0aXZlKSB7XG4gICAgICBpY29uRWwudGV4dENvbnRlbnQgPSAnXFx1MjYwNSc7XG4gICAgICB0ZXh0RWwudGV4dENvbnRlbnQgPSAnUFJFTUlVTSc7XG4gICAgICBpZiAoc3RhdHVzLmxpZmV0aW1lKSB7XG4gICAgICAgIHRpbWVFbC50ZXh0Q29udGVudCA9ICdcXHUwMGI3IExJRkVUSU1FJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGRheXMgPSBzdGF0dXMuZGF5c1JlbWFpbmluZztcbiAgICAgICAgdGltZUVsLnRleHRDb250ZW50ID0gZGF5cyAhPSBudWxsID8gJ1xcdTAwYjcgJyArIGRheXMgKyAnZCByZW1haW5pbmcnIDogJyc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGljb25FbC50ZXh0Q29udGVudCA9ICdcXHUyNjA2JztcbiAgICAgIHRleHRFbC50ZXh0Q29udGVudCA9IHN0YXR1cy5leHBpcmVkID8gJ0VYUElSRUQnIDogJ0ZSRUUgVElFUic7XG4gICAgICB0aW1lRWwudGV4dENvbnRlbnQgPSAnJztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuTGljZW5zZU1vZGFsKCkge1xuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIGxvYWRTdGF0dXMoKTtcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gIH1cblxuICAvLyBGb3JtYXQgY29kZSBpbnB1dCBhcyB1c2VyIHR5cGVzIChhdXRvLWFkZCBkYXNoZXMpXG4gIGNvZGVJbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIGZ1bmN0aW9uKCkge1xuICAgIGxldCB2YWwgPSB0aGlzLnZhbHVlLnRvVXBwZXJDYXNlKCkucmVwbGFjZSgvW15BLVowLTktXS9nLCAnJyk7XG4gICAgLy8gRG9uJ3QgYXV0by1mb3JtYXQgaWYgdXNlciBpcyBkZWxldGluZ1xuICAgIGlmICh2YWwubGVuZ3RoID4gdGhpcy5fcHJldkxlbmd0aCkge1xuICAgICAgdmFsID0gdmFsLnJlcGxhY2UoLy0vZywgJycpO1xuICAgICAgaWYgKHZhbC5sZW5ndGggPiAyICYmICF2YWwuc3RhcnRzV2l0aCgnREMnKSkge1xuICAgICAgICB2YWwgPSAnREMnICsgdmFsO1xuICAgICAgfVxuICAgICAgLy8gQWRkIGRhc2hlcyBhZnRlciBEQyBhbmQgZXZlcnkgNSBjaGFyc1xuICAgICAgaWYgKHZhbC5zdGFydHNXaXRoKCdEQycpICYmIHZhbC5sZW5ndGggPiAyKSB7XG4gICAgICAgIGNvbnN0IHBhcnRzID0gWydEQyddO1xuICAgICAgICBjb25zdCByZXN0ID0gdmFsLnN1YnN0cmluZygyKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN0Lmxlbmd0aDsgaSArPSA1KSB7XG4gICAgICAgICAgcGFydHMucHVzaChyZXN0LnN1YnN0cmluZyhpLCBpICsgNSkpO1xuICAgICAgICB9XG4gICAgICAgIHZhbCA9IHBhcnRzLmpvaW4oJy0nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fcHJldkxlbmd0aCA9IHZhbC5sZW5ndGg7XG4gICAgdGhpcy52YWx1ZSA9IHZhbDtcbiAgfSk7XG5cbiAgLy8gV2lyZSB1cCBldmVudHNcbiAgYWN0aXZhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBhY3RpdmF0ZUxpY2Vuc2UpO1xuICBkZWFjdGl2YXRlQnRuLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZGVhY3RpdmF0ZUxpY2Vuc2UpO1xuICBjb2RlSW5wdXQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChlKSA9PiB7XG4gICAgaWYgKGUua2V5ID09PSAnRW50ZXInKSBhY3RpdmF0ZUxpY2Vuc2UoKTtcbiAgfSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xpY2Vuc2UtY2FuY2VsJykpO1xuICBjb25zdCB0b3BiYXJFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsaWNlbnNlLXN0YXR1cy10b3BiYXInKTtcbiAgaWYgKHRvcGJhckVsKSB0b3BiYXJFbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsICYmIHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsKCkpO1xuXG4gIC8vIEV4cG9zZSBmb3Igb3RoZXIgbW9kdWxlcyB0byBvcGVuXG4gIHdpbmRvdy5vcGVuTGljZW5zZU1vZGFsID0gb3BlbkxpY2Vuc2VNb2RhbDtcblxuICAvLyBFeHBvc2UgZmVhdHVyZSBjaGVjayBmb3IgZnJvbnRlbmQgZ2F0aW5nXG4gIHdpbmRvdy5jaGVja1ByZW1pdW1GZWF0dXJlID0gYXN5bmMgZnVuY3Rpb24oZmVhdHVyZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvbGljZW5zZS9mZWF0dXJlLyR7ZmVhdHVyZX1gKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgIHJldHVybiBkYXRhLmF2YWlsYWJsZTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH07XG5cbiAgLy8gTG9hZCBzdGF0dXMgb24gcGFnZSBsb2FkXG4gIGxvYWRTdGF0dXMoKS50aGVuKHN0YXR1cyA9PiB7XG4gICAgaWYgKGN1cnJlbnRTdGF0dXMpIHVwZGF0ZUhlYWRlckJhZGdlKGN1cnJlbnRTdGF0dXMpO1xuICB9KTtcbn0pKCk7XG47XG4vLyBTaGFyZSBNb2RhbCBcdTIwMTQgREMtMDU4XG4vL1xuLy8gQWRtaW4gVUkgZm9yIERDLTA1MyBzaGFyZSByb3V0ZXMuIE9wZW5lZCBmcm9tIHRoZSBcIlNoYXJlXCIgYnV0dG9uIG9uIGVhY2hcbi8vIHNlcnZpY2UgY2FyZCAoYWRkZWQgaW4gY29yZS9ncmlkLmpzIG5leHQgdG8gdGhlIGV4aXN0aW5nIG9wdGlvbnMvZGVsZXRlXG4vLyBidXR0b25zKS4gVHdvIHRhYnM6XG4vLyAgIC0gUHVibGljIGxpbms6IHBpY2sgYSBUVEwgKDFoLzI0aC83ZCksIFBPU1QgL2FwaS92MS9zaGFyZSwgcmVuZGVyIHRoZVxuLy8gICAgIHJldHVybmVkIHVybFBhdGggd2l0aCBhIGNvcHkgYnV0dG9uICsgcmV2b2tlIGNvbnRyb2wuXG4vLyAgIC0gVGFpbHNjYWxlIGludml0ZTogZW50ZXIgYW4gZW1haWwsIFBPU1QgL2FwaS92MS9zaGFyZS90YWlsc2NhbGUsIHJlbmRlclxuLy8gICAgIGRlbGl2ZXJlZCBzdGF0dXMgKGluYm94IHZzIGRldi1jb25zb2xlIGZhbGxiYWNrIHZzIFVSTCBmYWxsYmFjaykuXG4vL1xuLy8gTW9kYWwgYWxzbyBsaXN0cyBvdXRzdGFuZGluZyBzaGFyZXMgZm9yIHRoZSBzZWxlY3RlZCBzZXJ2aWNlIChHRVQgL2FwaS92MS9zaGFyZSlcbi8vIHdpdGggcmV2b2tlIGJ1dHRvbnMuIFRoZSBsaXN0IHJlZnJlc2hlcyBhZnRlciBldmVyeSBpc3N1ZS9yZXZva2UuXG4vL1xuLy8gQm90aCBpc3N1ZSBlbmRwb2ludHMgYXJlIFByby1nYXRlZCBvbiB0aGUgc2VydmVyIFx1MjAxNCB0aGUgbW9kYWwgc3VyZmFjZXMgYSA0MDJcbi8vIGFzIGFuIHVwZ3JhZGUgcHJvbXB0IChcIlNoYXJlIGlzIGEgUHJvIGZlYXR1cmUuIEFjdGl2YXRlIGEgbGljZW5zZSB0byB1bmxvY2suXCIpLlxuLy8gVGFpbHNjYWxlIGludml0ZXMgYWRkaXRpb25hbGx5IHJlcXVpcmUgdGFpbHNjYWxlQ29vcmQgY29uZmlndXJlZCBvbiB0aGUgaG9zdDtcbi8vIHRoZSBzZXJ2ZXIgcmV0dXJucyA0MDAgd2l0aCBhIGNsZWFyIG1lc3NhZ2Ugd2hlbiBtaXNzaW5nLlxuXG4oZnVuY3Rpb24oKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAod2luZG93Ll9fZGNfMDU4X3NoYXJlX21vZGFsX2xvYWRlZCkgcmV0dXJuO1xuICB3aW5kb3cuX19kY18wNThfc2hhcmVfbW9kYWxfbG9hZGVkID0gdHJ1ZTtcblxuICBjb25zdCBUVExfT1BUSU9OUyA9IFtcbiAgICB7IG1zOiA2MCAqIDYwICogMTAwMCwgbGFiZWw6ICcxIGhvdXInIH0sXG4gICAgeyBtczogMjQgKiA2MCAqIDYwICogMTAwMCwgbGFiZWw6ICcyNCBob3VycycgfSxcbiAgICB7IG1zOiA3ICogMjQgKiA2MCAqIDYwICogMTAwMCwgbGFiZWw6ICc3IGRheXMnIH0sXG4gIF07XG5cbiAgaW5qZWN0TW9kYWwoJ3NoYXJlLW1vZGFsJywgYFxuICAgIDxkaXYgaWQ9XCJzaGFyZS1tb2RhbFwiIGNsYXNzPVwid2VhdGhlci1tb2RhbFwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJzaGFyZS1tb2RhbC10aXRsZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIndlYXRoZXItbW9kYWwtY29udGVudFwiIHN0eWxlPVwibWluLXdpZHRoOiA0NjBweDsgbWF4LXdpZHRoOiA1ODBweDtcIj5cbiAgICAgICAgPGgzIGlkPVwic2hhcmUtbW9kYWwtdGl0bGVcIj5TaGFyZSA8c3BhbiBpZD1cInNoYXJlLW1vZGFsLXNlcnZpY2UtbmFtZVwiPlx1MjAyNjwvc3Bhbj48L2gzPlxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMC44NXJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luOiAwIDAgMTZweDtcIj5cbiAgICAgICAgICBDcmVhdGUgYSBwdWJsaWMgbGluayBvciBUYWlsc2NhbGUgaW52aXRlIHNvIHNvbWVvbmUgb3V0c2lkZSB5b3VyIG5ldHdvcmsgY2FuIGFjY2VzcyB0aGlzIHNlcnZpY2UuXG4gICAgICAgIDwvcD5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwic2hhcmUtdGFic1wiIHN0eWxlPVwiZGlzcGxheTogZmxleDsgZ2FwOiA0cHg7IG1hcmdpbi1ib3R0b206IDE2cHg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpO1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaGFyZS10YWIgYWN0aXZlXCIgZGF0YS10YWI9XCJwdWJsaWNcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7IGJvcmRlcjogMDsgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLWFjY2VudCk7IHBhZGRpbmc6IDhweCAxNHB4OyBjb2xvcjogdmFyKC0tZmcpOyBmb250LXdlaWdodDogNjAwOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBQdWJsaWMgbGlua1xuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJzaGFyZS10YWJcIiBkYXRhLXRhYj1cInRhaWxzY2FsZVwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyOiAwOyBib3JkZXItYm90dG9tOiAycHggc29saWQgdHJhbnNwYXJlbnQ7IHBhZGRpbmc6IDhweCAxNHB4OyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBUYWlsc2NhbGUgaW52aXRlXG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaGFyZS10YWItcGFuZWxcIiBkYXRhLXBhbmVsPVwicHVibGljXCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1ib2xkXCIgZm9yPVwic2hhcmUtcHVibGljLXR0bFwiPkxpbmsgZHVyYXRpb246PC9sYWJlbD5cbiAgICAgICAgICA8c2VsZWN0IGlkPVwic2hhcmUtcHVibGljLXR0bFwiIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDhweCAxMHB4OyBtYXJnaW46IDZweCAwIDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWlucHV0LWJnKTsgY29sb3I6IHZhcigtLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNHB4O1wiPlxuICAgICAgICAgICAgJHtUVExfT1BUSU9OUy5tYXAobyA9PiBgPG9wdGlvbiB2YWx1ZT1cIiR7by5tc31cIj4ke28ubGFiZWx9PC9vcHRpb24+YCkuam9pbignJyl9XG4gICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNoYXJlLXB1YmxpYy1jcmVhdGVcIiBjbGFzcz1cImJ0bi1hY2NlbnRcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IHBhZGRpbmc6IDEwcHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiAjMDQxNDFmOyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgQ3JlYXRlIHNoYXJlIGxpbmtcbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNoYXJlLXRhYi1wYW5lbFwiIGRhdGEtcGFuZWw9XCJ0YWlsc2NhbGVcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XG4gICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbC1ib2xkXCIgZm9yPVwic2hhcmUtdHMtZW1haWxcIj5SZWNpcGllbnQgZW1haWw6PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgaWQ9XCJzaGFyZS10cy1lbWFpbFwiIHR5cGU9XCJlbWFpbFwiIHBsYWNlaG9sZGVyPVwiYWxpY2VAZXhhbXBsZS5jb21cIiBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweCAxMnB4OyBtYXJnaW46IDZweCAwIDEycHg7IGJhY2tncm91bmQ6IHZhcigtLWNhcmQtYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC45NXJlbTtcIiAvPlxuICAgICAgICAgIDxwIHN0eWxlPVwiZm9udC1zaXplOiAwLjhyZW07IGNvbG9yOiB2YXIoLS1tdXRlZCk7IG1hcmdpbjogMCAwIDEycHg7XCI+XG4gICAgICAgICAgICBBIHNpbmdsZS11c2UgVGFpbHNjYWxlIHByZS1hdXRoIGtleSBpcyBnZW5lcmF0ZWQgYW5kIGVtYWlsZWQuIFRoZSBkZXZpY2Ugam9pbnMgeW91ciB0YWlsbmV0IGFuZCBpcyByb3V0ZWQgdG8gdGhpcyBzZXJ2aWNlIHZpYSBDYWRkeS5cbiAgICAgICAgICA8L3A+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNoYXJlLXRzLWNyZWF0ZVwiIGNsYXNzPVwiYnRuLWFjY2VudFwiIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogMTAwJTsgcGFkZGluZzogMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYWNjZW50KTsgY29sb3I6ICMwNDE0MWY7IGJvcmRlcjogMDsgYm9yZGVyLXJhZGl1czogNHB4OyBmb250LXdlaWdodDogNjAwOyBjdXJzb3I6IHBvaW50ZXI7XCI+XG4gICAgICAgICAgICBDcmVhdGUgVGFpbHNjYWxlIGludml0ZVxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGlkPVwic2hhcmUtaXNzdWVkXCIgc3R5bGU9XCJkaXNwbGF5OiBub25lOyBtYXJnaW4tdG9wOiAxNnB4OyBwYWRkaW5nOiAxMnB4OyBiYWNrZ3JvdW5kOiB2YXIoLS1jYXJkLWJnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyKTsgYm9yZGVyLXJhZGl1czogNnB4O1wiPlxuICAgICAgICAgIDxkaXYgc3R5bGU9XCJmb250LXNpemU6IDAuOHJlbTsgY29sb3I6IHZhcigtLW11dGVkKTsgbWFyZ2luLWJvdHRvbTogNnB4O1wiPlNoYXJlIGxpbms6PC9kaXY+XG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGdhcDogNnB4OyBhbGlnbi1pdGVtczogY2VudGVyO1wiPlxuICAgICAgICAgICAgPGlucHV0IGlkPVwic2hhcmUtaXNzdWVkLXVybFwiIHR5cGU9XCJ0ZXh0XCIgcmVhZG9ubHlcbiAgICAgICAgICAgICAgc3R5bGU9XCJmbGV4OiAxOyBwYWRkaW5nOiA4cHggMTBweDsgYmFja2dyb3VuZDogdmFyKC0tYmcpOyBjb2xvcjogdmFyKC0tZmcpOyBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXIpOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGZvbnQtc2l6ZTogMC44NXJlbTtcIiAvPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNoYXJlLWlzc3VlZC1jb3B5XCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogOHB4IDE0cHg7IGJhY2tncm91bmQ6IHZhcigtLWFjY2VudCk7IGNvbG9yOiAjMDQxNDFmOyBib3JkZXI6IDA7IGJvcmRlci1yYWRpdXM6IDRweDsgZm9udC13ZWlnaHQ6IDYwMDsgY3Vyc29yOiBwb2ludGVyO1wiPlxuICAgICAgICAgICAgICBDb3B5XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGlkPVwic2hhcmUtaXNzdWVkLW1ldGFcIiBzdHlsZT1cImZvbnQtc2l6ZTogMC44cmVtOyBjb2xvcjogdmFyKC0tbXV0ZWQpOyBtYXJnaW4tdG9wOiA4cHg7XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgaWQ9XCJzaGFyZS1lcnJvclwiIHN0eWxlPVwiZGlzcGxheTogbm9uZTsgbWFyZ2luLXRvcDogMTJweDsgcGFkZGluZzogMTBweDsgYm9yZGVyLXJhZGl1czogNHB4OyBiYWNrZ3JvdW5kOiByZ2JhKDIzMSw3Niw2MCwwLjE1KTsgY29sb3I6IHZhcigtLWJhZC1mZyk7IGZvbnQtc2l6ZTogMC44NXJlbTtcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBpZD1cInNoYXJlLXN1Y2Nlc3NcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7IG1hcmdpbi10b3A6IDEycHg7IHBhZGRpbmc6IDEwcHg7IGJvcmRlci1yYWRpdXM6IDRweDsgYmFja2dyb3VuZDogcmdiYSg0NiwyMDQsMTEzLDAuMTUpOyBjb2xvcjogdmFyKC0tb2stZmcpOyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG5cbiAgICAgICAgPGRpdiBpZD1cInNoYXJlLW91dHN0YW5kaW5nXCIgc3R5bGU9XCJtYXJnaW4tdG9wOiAxNnB4O1wiPlxuICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwtYm9sZFwiPk91dHN0YW5kaW5nIHNoYXJlcyBmb3IgdGhpcyBzZXJ2aWNlPC9sYWJlbD5cbiAgICAgICAgICA8ZGl2IGlkPVwic2hhcmUtb3V0c3RhbmRpbmctbGlzdFwiIHN0eWxlPVwibWFyZ2luLXRvcDogNnB4OyBmb250LXNpemU6IDAuODVyZW07XCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3ZWF0aGVyLW1vZGFsLWJ1dHRvbnNcIiBzdHlsZT1cIm1hcmdpbi10b3A6IDE4cHg7XCI+XG4gICAgICAgICAgPGJ1dHRvbiBpZD1cInNoYXJlLWNhbmNlbFwiIHR5cGU9XCJidXR0b25cIj5DbG9zZTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgKTtcblxuICBjb25zdCBtb2RhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1tb2RhbCcpO1xuICBjb25zdCBzZXJ2aWNlTmFtZUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLW1vZGFsLXNlcnZpY2UtbmFtZScpO1xuICBjb25zdCBpc3N1ZWRFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1pc3N1ZWQnKTtcbiAgY29uc3QgaXNzdWVkVXJsSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtaXNzdWVkLXVybCcpO1xuICBjb25zdCBpc3N1ZWRDb3B5QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWlzc3VlZC1jb3B5Jyk7XG4gIGNvbnN0IGlzc3VlZE1ldGFFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1pc3N1ZWQtbWV0YScpO1xuICBjb25zdCBlcnJvckVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWVycm9yJyk7XG4gIGNvbnN0IHN1Y2Nlc3NFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1zdWNjZXNzJyk7XG4gIGNvbnN0IG91dHN0YW5kaW5nTGlzdEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLW91dHN0YW5kaW5nLWxpc3QnKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLWNhbmNlbCcpO1xuICBjb25zdCBwdWJsaWNDcmVhdGVCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2hhcmUtcHVibGljLWNyZWF0ZScpO1xuICBjb25zdCB0c0NyZWF0ZUJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS10cy1jcmVhdGUnKTtcbiAgY29uc3QgdHNFbWFpbElucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NoYXJlLXRzLWVtYWlsJyk7XG4gIGNvbnN0IHB1YmxpY1R0bFNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzaGFyZS1wdWJsaWMtdHRsJyk7XG5cbiAgbGV0IGN1cnJlbnRTZXJ2aWNlID0gbnVsbDsgLy8geyBpZCwgbmFtZSB9XG4gIGxldCBhY3RpdmVUYWIgPSAncHVibGljJztcblxuICBmdW5jdGlvbiBoaWRlTWVzc2FnZXMoKSB7XG4gICAgZXJyb3JFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIHN1Y2Nlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIGlzc3VlZEVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93RXJyb3IobXNnKSB7XG4gICAgc3VjY2Vzc0VsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgaXNzdWVkRWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICBlcnJvckVsLnRleHRDb250ZW50ID0gbXNnO1xuICAgIGVycm9yRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93U3VjY2Vzcyhtc2cpIHtcbiAgICBlcnJvckVsLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgc3VjY2Vzc0VsLnRleHRDb250ZW50ID0gbXNnO1xuICAgIHN1Y2Nlc3NFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgfVxuXG4gIGZ1bmN0aW9uIF9vcmlnaW5Gcm9tUGFnZSgpIHtcbiAgICAvLyBCdWlsZCB0aGUgYWJzb2x1dGUgc2hhcmUgVVJMIGZyb20gdGhlIHBhZ2UncyBjdXJyZW50IG9yaWdpbiBzbyB0aGVcbiAgICAvLyBsaW5rIGlzIGNvcnJlY3QgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSB1c2VyIGlzIG9uIGh0dHA6Ly9sb2NhbGhvc3RcbiAgICAvLyAoZGV2KSBvciBodHRwczovL3N0YXR1cy5zYW1pIChwcm9kKS4gVGhlIHVybFBhdGggcmV0dXJuZWQgYnkgdGhlIEFQSVxuICAgIC8vIGlzIGEgcGF0aC1vbmx5IHN0cmluZyBzdGFydGluZyB3aXRoIC9zaGFyZS8uXG4gICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW47XG4gIH1cblxuICBmdW5jdGlvbiBfYWJzVXJsKHVybFBhdGgpIHtcbiAgICBpZiAodXJsUGF0aC5zdGFydHNXaXRoKCdodHRwJykpIHJldHVybiB1cmxQYXRoO1xuICAgIHJldHVybiBfb3JpZ2luRnJvbVBhZ2UoKSArIHVybFBhdGg7XG4gIH1cblxuICBmdW5jdGlvbiBfZm9ybWF0RXhwaXJ5KGlzbykge1xuICAgIGlmICghaXNvKSByZXR1cm4gJyc7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKGlzbyk7XG4gICAgaWYgKE51bWJlci5pc05hTihkLmdldFRpbWUoKSkpIHJldHVybiAnJztcbiAgICByZXR1cm4gZC50b0xvY2FsZVN0cmluZygpO1xuICB9XG5cbiAgZnVuY3Rpb24gX2Zvcm1hdFJlbWFpbmluZyhtcykge1xuICAgIGlmIChtcyA8PSAwKSByZXR1cm4gJ2V4cGlyZWQnO1xuICAgIGNvbnN0IGggPSBNYXRoLmZsb29yKG1zIC8gMzYwMDAwMCk7XG4gICAgaWYgKGggPj0gMjQpIHJldHVybiBgJHtNYXRoLmZsb29yKGggLyAyNCl9ZCAke2ggJSAyNH1oIGxlZnRgO1xuICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKChtcyAlIDM2MDAwMDApIC8gNjAwMDApO1xuICAgIHJldHVybiBgJHtofWggJHttfW0gbGVmdGA7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRBY3RpdmVUYWIobmFtZSkge1xuICAgIGFjdGl2ZVRhYiA9IG5hbWU7XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnNoYXJlLXRhYicpLmZvckVhY2goYnRuID0+IHtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gYnRuLmRhdGFzZXQudGFiID09PSBuYW1lO1xuICAgICAgYnRuLmNsYXNzTGlzdC50b2dnbGUoJ2FjdGl2ZScsIGlzQWN0aXZlKTtcbiAgICAgIGJ0bi5zdHlsZS5ib3JkZXJCb3R0b21Db2xvciA9IGlzQWN0aXZlID8gJ3ZhcigtLWFjY2VudCknIDogJ3RyYW5zcGFyZW50JztcbiAgICAgIGJ0bi5zdHlsZS5jb2xvciA9IGlzQWN0aXZlID8gJ3ZhcigtLWZnKScgOiAndmFyKC0tbXV0ZWQpJztcbiAgICAgIGJ0bi5zdHlsZS5mb250V2VpZ2h0ID0gaXNBY3RpdmUgPyAnNjAwJyA6ICc0MDAnO1xuICAgIH0pO1xuICAgIG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5zaGFyZS10YWItcGFuZWwnKS5mb3JFYWNoKHAgPT4ge1xuICAgICAgcC5zdHlsZS5kaXNwbGF5ID0gcC5kYXRhc2V0LnBhbmVsID09PSBuYW1lID8gJycgOiAnbm9uZSc7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBsb2FkT3V0c3RhbmRpbmcoKSB7XG4gICAgb3V0c3RhbmRpbmdMaXN0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5Mb2FkaW5nXHUyMDI2PC9zcGFuPic7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCBmZXRjaCgnL2FwaS92MS9zaGFyZScsIHsgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicgfSk7XG4gICAgICBpZiAoIXJlc3Aub2spIHtcbiAgICAgICAgb3V0c3RhbmRpbmdMaXN0RWwuaW5uZXJIVE1MID0gJzxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLW11dGVkKTtcIj5ObyBzaGFyZXMgbGlzdGVkLjwvc3Bhbj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCk7XG4gICAgICBjb25zdCBsaXN0ID0gKGJvZHkgJiYgYm9keS5kYXRhKSB8fCBbXTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gbGlzdC5maWx0ZXIocyA9PiBzLnNlcnZpY2VJZCA9PT0gY3VycmVudFNlcnZpY2UuaWQpO1xuICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBvdXRzdGFuZGluZ0xpc3RFbC5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPk5vIG91dHN0YW5kaW5nIHNoYXJlcyBmb3IgdGhpcyBzZXJ2aWNlLjwvc3Bhbj4nO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBvdXRzdGFuZGluZ0xpc3RFbC5pbm5lckhUTUwgPSBmaWx0ZXJlZC5tYXAocyA9PiB7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHMuZXhwaXJlc0F0ID8gX2Zvcm1hdFJlbWFpbmluZyhuZXcgRGF0ZShzLmV4cGlyZXNBdCkuZ2V0VGltZSgpIC0gRGF0ZS5ub3coKSkgOiAnJztcbiAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2hhcmUtcm93XCIgZGF0YS1zaGFyZS1pZD1cIiR7ZXNjYXBlSHRtbChzLmlkKX1cIlxuICAgICAgICAgICAgc3R5bGU9XCJkaXNwbGF5OiBmbGV4OyBhbGlnbi1pdGVtczogY2VudGVyOyBnYXA6IDhweDsgcGFkZGluZzogNnB4IDA7IGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQgdmFyKC0tYm9yZGVyKTtcIj5cbiAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZmxleDogMTtcIj5cbiAgICAgICAgICAgICAgPHN0cm9uZz4ke3Mua2luZCA9PT0gJ3RhaWxzY2FsZScgPyAnVGFpbHNjYWxlJyA6ICdQdWJsaWMnfTwvc3Ryb25nPlxuICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1tdXRlZCk7XCI+IFx1MDBCNyBleHBpcmVzICR7ZXNjYXBlSHRtbChfZm9ybWF0RXhwaXJ5KHMuZXhwaXJlc0F0KSl9ICgke3JlbWFpbmluZ30pPC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNoYXJlLXJldm9rZVwiIGRhdGEtc2hhcmUtaWQ9XCIke2VzY2FwZUh0bWwocy5pZCl9XCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIHN0eWxlPVwicGFkZGluZzogNHB4IDEwcHg7IGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OyBjb2xvcjogdmFyKC0tYmFkLWZnKTsgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYmFkLWZnKTsgYm9yZGVyLXJhZGl1czogNHB4OyBjdXJzb3I6IHBvaW50ZXI7IGZvbnQtc2l6ZTogMC44cmVtO1wiPlxuICAgICAgICAgICAgICBSZXZva2VcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgICAgfSkuam9pbignJyk7XG4gICAgICBvdXRzdGFuZGluZ0xpc3RFbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hhcmUtcmV2b2tlJykuZm9yRWFjaChidG4gPT4ge1xuICAgICAgICBidG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiByZXZva2VTaGFyZShidG4uZGF0YXNldC5zaGFyZUlkKSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBvdXRzdGFuZGluZ0xpc3RFbC5pbm5lckhUTUwgPSAnPHNwYW4gc3R5bGU9XCJjb2xvcjogdmFyKC0tbXV0ZWQpO1wiPkNvdWxkIG5vdCBsb2FkIG91dHN0YW5kaW5nIHNoYXJlcy48L3NwYW4+JztcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiByZXZva2VTaGFyZShpZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwID0gYXdhaXQgZmV0Y2goYC9hcGkvdjEvc2hhcmUvJHtlbmNvZGVVUklDb21wb25lbnQoaWQpfWAsIHtcbiAgICAgICAgbWV0aG9kOiAnREVMRVRFJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICB9KTtcbiAgICAgIGlmICghcmVzcC5vaykge1xuICAgICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICAgIHNob3dFcnJvcihib2R5ICYmIGJvZHkuZXJyb3IgfHwgYFJldm9rZSBmYWlsZWQgKEhUVFAgJHtyZXNwLnN0YXR1c30pLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzaG93U3VjY2VzcygnU2hhcmUgcmV2b2tlZC4nKTtcbiAgICAgIGxvYWRPdXRzdGFuZGluZygpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dFcnJvcignTmV0d29yayBlcnJvciB3aGlsZSByZXZva2luZy4nKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBpc3N1ZVB1YmxpYygpIHtcbiAgICBpZiAoIWN1cnJlbnRTZXJ2aWNlKSByZXR1cm47XG4gICAgaGlkZU1lc3NhZ2VzKCk7XG4gICAgcHVibGljQ3JlYXRlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHB1YmxpY0NyZWF0ZUJ0bi50ZXh0Q29udGVudDtcbiAgICBwdWJsaWNDcmVhdGVCdG4udGV4dENvbnRlbnQgPSAnQ3JlYXRpbmdcdTIwMjYnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0dGxNcyA9IHBhcnNlSW50KHB1YmxpY1R0bFNlbGVjdC52YWx1ZSwgMTApO1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NoYXJlJywge1xuICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgY3JlZGVudGlhbHM6ICdzYW1lLW9yaWdpbicsXG4gICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHNlcnZpY2VJZDogY3VycmVudFNlcnZpY2UuaWQsIHR0bE1zIH0pLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzcC5qc29uKCkuY2F0Y2goKCkgPT4gKHt9KSk7XG4gICAgICBpZiAoIXJlc3Aub2sgfHwgIWJvZHkuc3VjY2Vzcykge1xuICAgICAgICBfcmVuZGVyQXBpRXJyb3IocmVzcC5zdGF0dXMsIGJvZHkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cmxQYXRoID0gYm9keS5kYXRhLnVybFBhdGg7XG4gICAgICBpc3N1ZWRVcmxJbnB1dC52YWx1ZSA9IF9hYnNVcmwodXJsUGF0aCk7XG4gICAgICBpc3N1ZWRNZXRhRWwudGV4dENvbnRlbnQgPSBgUHVibGljIGxpbmsgXHUwMEI3IGV4cGlyZXMgJHtfZm9ybWF0RXhwaXJ5KGJvZHkuZGF0YS5leHBpcmVzQXQpfWA7XG4gICAgICBpc3N1ZWRFbC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHNob3dTdWNjZXNzKCdTaGFyZSBsaW5rIGNyZWF0ZWQuJyk7XG4gICAgICBsb2FkT3V0c3RhbmRpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3Igd2hpbGUgY3JlYXRpbmcgc2hhcmUuJyk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHB1YmxpY0NyZWF0ZUJ0bi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgcHVibGljQ3JlYXRlQnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWw7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaXNzdWVUYWlsc2NhbGUoKSB7XG4gICAgaWYgKCFjdXJyZW50U2VydmljZSkgcmV0dXJuO1xuICAgIGNvbnN0IGVtYWlsID0gKHRzRW1haWxJbnB1dC52YWx1ZSB8fCAnJykudHJpbSgpO1xuICAgIGlmICghZW1haWwgfHwgIWVtYWlsLmluY2x1ZGVzKCdAJykpIHtcbiAgICAgIHNob3dFcnJvcignQSB2YWxpZCByZWNpcGllbnQgZW1haWwgaXMgcmVxdWlyZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIHRzQ3JlYXRlQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBjb25zdCBvcmlnaW5hbCA9IHRzQ3JlYXRlQnRuLnRleHRDb250ZW50O1xuICAgIHRzQ3JlYXRlQnRuLnRleHRDb250ZW50ID0gJ0NyZWF0aW5nXHUyMDI2JztcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKCcvYXBpL3YxL3NoYXJlL3RhaWxzY2FsZScsIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGNyZWRlbnRpYWxzOiAnc2FtZS1vcmlnaW4nLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBzZXJ2aWNlSWQ6IGN1cnJlbnRTZXJ2aWNlLmlkLCBlbWFpbCB9KSxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlc3AuanNvbigpLmNhdGNoKCgpID0+ICh7fSkpO1xuICAgICAgaWYgKCFyZXNwLm9rIHx8ICFib2R5LnN1Y2Nlc3MpIHtcbiAgICAgICAgX3JlbmRlckFwaUVycm9yKHJlc3Auc3RhdHVzLCBib2R5KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gVGFpbHNjYWxlIHNoYXJlcyBzaG93IHRoZSByYXcgdXJsUGF0aCAod2hpY2ggaXMgdGhlIHNoYXJlIFVSTCkgaWZcbiAgICAgIC8vIGVtYWlsIGRlbGl2ZXJ5IGZhaWxlZC4gVGhlIHNoYXJlIGl0c2VsZiBpcyBvbmUtc2hvdCBzbyB0aGUgYWRtaW5cbiAgICAgIC8vIGNhbiBtYW51YWxseSBwYXN0ZSB0aGUgbGluayBpbnRvIGEgY2hhdCBpZiBTTVRQIGZhaWxlZC5cbiAgICAgIGNvbnN0IGZhbGxiYWNrID0gYm9keS5kYXRhICYmIGJvZHkuZGF0YS51cmxQYXRoO1xuICAgICAgaWYgKGZhbGxiYWNrKSB7XG4gICAgICAgIGlzc3VlZFVybElucHV0LnZhbHVlID0gX2Fic1VybChmYWxsYmFjayk7XG4gICAgICAgIGlzc3VlZE1ldGFFbC50ZXh0Q29udGVudCA9IGBUYWlsc2NhbGUgaW52aXRlIFx1MDBCNyBlbWFpbGVkIHRvICR7ZW1haWx9IChvciB1c2UgdGhpcyBVUkwgbWFudWFsbHkgaWYgZGVsaXZlcnkgZmFpbGVkKS5gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaXNzdWVkVXJsSW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgaXNzdWVkTWV0YUVsLnRleHRDb250ZW50ID0gYFRhaWxzY2FsZSBpbnZpdGUgc2VudCB0byAke2VtYWlsfS5gO1xuICAgICAgfVxuICAgICAgaXNzdWVkRWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICBzaG93U3VjY2VzcygnVGFpbHNjYWxlIGludml0ZSBjcmVhdGVkLicpO1xuICAgICAgdHNFbWFpbElucHV0LnZhbHVlID0gJyc7XG4gICAgICBsb2FkT3V0c3RhbmRpbmcoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzaG93RXJyb3IoJ05ldHdvcmsgZXJyb3Igd2hpbGUgY3JlYXRpbmcgVGFpbHNjYWxlIGludml0ZS4nKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdHNDcmVhdGVCdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRzQ3JlYXRlQnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWw7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX3JlbmRlckFwaUVycm9yKHN0YXR1cywgYm9keSkge1xuICAgIGNvbnN0IGVyciA9IChib2R5ICYmIGJvZHkuZXJyb3IpIHx8ICcnO1xuICAgIGlmIChzdGF0dXMgPT09IDQwMikge1xuICAgICAgc2hvd0Vycm9yKCdTaGFyZSBpcyBhIFBybyBmZWF0dXJlLiBBY3RpdmF0ZSBhIGxpY2Vuc2UgdG8gdW5sb2NrLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc3RhdHVzID09PSA0MDAgJiYgL3RhaWxzY2FsZS9pLnRlc3QoZXJyKSkge1xuICAgICAgc2hvd0Vycm9yKCdUYWlsc2NhbGUgaXMgbm90IGNvbmZpZ3VyZWQgb24gdGhpcyBob3N0LiBTZXQgdXAgVGFpbHNjYWxlIGluIHRoZSBkYXNoYm9hcmQgZmlyc3QuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IDQwMykge1xuICAgICAgc2hvd0Vycm9yKCdZb3UgZG8gbm90IGhhdmUgcGVybWlzc2lvbiB0byBzaGFyZSBzZXJ2aWNlcy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICBzaG93RXJyb3IoJ1NlcnZpY2Ugbm90IGZvdW5kLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQuJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNob3dFcnJvcihlcnIgfHwgYFJlcXVlc3QgZmFpbGVkIChIVFRQICR7c3RhdHVzfSkuYCk7XG4gIH1cblxuICBmdW5jdGlvbiBvcGVuU2hhcmVNb2RhbChzZXJ2aWNlKSB7XG4gICAgaWYgKCFzZXJ2aWNlIHx8ICFzZXJ2aWNlLmlkKSByZXR1cm47XG4gICAgY3VycmVudFNlcnZpY2UgPSB7IGlkOiBzZXJ2aWNlLmlkLCBuYW1lOiBzZXJ2aWNlLm5hbWUgfHwgc2VydmljZS5pZCB9O1xuICAgIHNlcnZpY2VOYW1lRWwudGV4dENvbnRlbnQgPSBjdXJyZW50U2VydmljZS5uYW1lO1xuICAgIGhpZGVNZXNzYWdlcygpO1xuICAgIHNldEFjdGl2ZVRhYigncHVibGljJyk7XG4gICAgdHNFbWFpbElucHV0LnZhbHVlID0gJyc7XG4gICAgcHVibGljVHRsU2VsZWN0LnZhbHVlID0gU3RyaW5nKFRUTF9PUFRJT05TWzFdLm1zKTsgLy8gMjRoIGRlZmF1bHRcbiAgICBtb2RhbC5jbGFzc0xpc3QuYWRkKCdzaG93Jyk7XG4gICAgbG9hZE91dHN0YW5kaW5nKCk7XG4gIH1cblxuICAvLyBXaXJlIGV2ZW50c1xuICBtb2RhbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2hhcmUtdGFiJykuZm9yRWFjaChidG4gPT4ge1xuICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldEFjdGl2ZVRhYihidG4uZGF0YXNldC50YWIpKTtcbiAgfSk7XG4gIHB1YmxpY0NyZWF0ZUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGlzc3VlUHVibGljKTtcbiAgdHNDcmVhdGVCdG4uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBpc3N1ZVRhaWxzY2FsZSk7XG4gIGNhbmNlbEJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IG1vZGFsLmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gIHdpcmVNb2RhbChtb2RhbCwgY2FuY2VsQnRuKTtcblxuICAvLyBDb3B5LXRvLWNsaXBib2FyZCBmb3IgdGhlIGlzc3VlZCBzaGFyZSBVUkxcbiAgaXNzdWVkQ29weUJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB1cmwgPSBpc3N1ZWRVcmxJbnB1dC52YWx1ZTtcbiAgICBpZiAoIXVybCkgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZCAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCkge1xuICAgICAgICBhd2FpdCBuYXZpZ2F0b3IuY2xpcGJvYXJkLndyaXRlVGV4dCh1cmwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRmFsbGJhY2sgZm9yIG9sZGVyIGJyb3dzZXJzIC8gdW5zYWZlIGNvbnRleHRzXG4gICAgICAgIGlzc3VlZFVybElucHV0LnNlbGVjdCgpO1xuICAgICAgICBkb2N1bWVudC5leGVjQ29tbWFuZCgnY29weScpO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3JpZ2luYWwgPSBpc3N1ZWRDb3B5QnRuLnRleHRDb250ZW50O1xuICAgICAgaXNzdWVkQ29weUJ0bi50ZXh0Q29udGVudCA9ICdDb3BpZWQhJztcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyBpc3N1ZWRDb3B5QnRuLnRleHRDb250ZW50ID0gb3JpZ2luYWw7IH0sIDEyMDApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHNob3dFcnJvcignQ291bGQgbm90IGNvcHkgdG8gY2xpcGJvYXJkLiBTZWxlY3QgdGhlIFVSTCBtYW51YWxseS4nKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIEV4cG9zZSBmb3Igb3RoZXIgbW9kdWxlcyB0byBvcGVuXG4gIHdpbmRvdy5vcGVuU2hhcmVNb2RhbCA9IG9wZW5TaGFyZU1vZGFsO1xufSkoKTtcbiJdLAogICJtYXBwaW5ncyI6ICJDQUNDLFVBQVcsQ0FFVixZQUFZLGFBQWM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFNBNEZuQixFQUVQLE1BQU1BLEVBQVksU0FBUyxlQUFlLFlBQVksRUFDaERDLEVBQWMsU0FBUyxlQUFlLG1CQUFt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QUFBO0FBQUEsU0FRM0IsRUFFUCxZQUFZLG1CQUFvQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFB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QUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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QixFQUFlLE9BQU8sRUFDdEIsU0FBUyxZQUFZLE1BQU0sR0FFN0IsTUFBTXNCLEVBQVdyQixFQUFjLFlBQy9CQSxFQUFjLFlBQWMsVUFDNUIsV0FBVyxJQUFNLENBQUVBLEVBQWMsWUFBY3FCLENBQVUsRUFBRyxJQUFJLENBQ2xFLE1BQVksQ0FDVjFDLEVBQVUsdURBQXVELENBQ25FLENBQ0YsQ0FBQyxFQUdELE9BQU8sZUFBaUI4QyxDQUMxQixHQUFHIiwKICAibmFtZXMiOiBbImxvZ29Nb2RhbCIsICJwcmV2aWV3RGFyayIsICJwcmV2aWV3TGlnaHQiLCAibG9nb1N0YXR1cyIsICJzYW1lQm90aENoZWNrYm94IiwgImR1YWxVcGxvYWRzIiwgInNpbmdsZVVwbG9hZCIsICJ1cGxvYWREYXJrIiwgInVwbG9hZExpZ2h0IiwgInVwbG9hZFNpbmdsZSIsICJicmFuZExvZ29EYXJrIiwgImJyYW5kTG9nb0xpZ2h0IiwgInRvcFJvdyIsICJkYXNoYm9hcmRUaXRsZUlucHV0IiwgIkRFRkFVTFRfVElUTEUiLCAicGVuZGluZ0RhcmtEYXRhIiwgInBlbmRpbmdMaWdodERhdGEiLCAicGVuZGluZ1NpbmdsZURhdGEiLCAiY3VycmVudFBvc2l0aW9uIiwgImN1cnJlbnRUaXRsZSIsICJyZWFkRmlsZUFzRGF0YVVSTCIsICJmaWxlIiwgImNhbGxiYWNrIiwgInJlYWRlciIsICJlIiwgImRhdGEiLCAiYXBwbHlMb2dvUG9zaXRpb24iLCAicG9zIiwgImJ0biIsICJhcHBseURhc2hib2FyZFRpdGxlIiwgInRpdGxlIiwgImhlYWRlclRpdGxlIiwgImxvYWRDdXN0b21Mb2dvIiwgInJlc3BvbnNlIiwgImVycm9yIiwgImlzQ3VzdG9tIiwgIm5ld1RpdGxlIiwgInBheWxvYWQiLCAidCIsICJmYXZpY29uTGluayIsICJmYXZpY29uUHJldmlldyIsICJmYXZpY29uU3RhdHVzIiwgInBlbmRpbmdGYXZpY29uRGF0YSIsICJmYXZpY29uVXBsb2FkIiwgImxvYWRDdXN0b21GYXZpY29uIiwgImV2ZW50IiwgInNldHRpbmdzVHpTZWxlY3QiLCAiY3VycmVudFR6IiwgInJlcyIsICJ0eiIsICJjZmciLCAic2VsZWN0RWwiLCAic2VsZWN0ZWRUeiIsICJ0aW1lem9uZXMiLCAiZGV0ZWN0ZWQiLCAib3B0IiwgImN1cnJlbnRDb25maWdUeXBlIiwgInNlcnZlckNvbmZpZyIsICJjaGVja1NlcnZlckNvbmZpZyIsICJzZXR1cFR6U2VsZWN0IiwgInNob3dTdGVwIiwgInN0ZXBJZCIsICJzdGVwIiwgInRhcmdldFN0ZXAiLCAic2hvd1N1bW1hcnkiLCAic3VtbWFyeUNvbnRlbnQiLCAiaHRtbCIsICJ0bGQiLCAiY2FOYW1lIiwgImRuc0lQIiwgImRuc1BvcnQiLCAiaXAiLCAiZG9tYWluIiwgImVtYWlsIiwgInJvdXRpbmdNb2RlIiwgImV4YW1wbGVVcmxzIiwgInNhdmVDb25maWdUb1NlcnZlciIsICJjb25maWciLCAiZmluaXNoU2V0dXAiLCAic2VsZWN0ZWRQcm92aWRlciIsICJzYXZlZFRvU2VydmVyIiwgImNvbmZpZ05hbWUiLCAic2F2ZUxvY2F0aW9uIiwgInN0ZXAxTmV4dCIsICJzZWxlY3RlZCIsICJza2lwQnRuIiwgInRsZElucHV0IiwgInByZXZpZXcxIiwgInByZXZpZXcyIiwgImhvbWVsYWJCYWNrIiwgImhvbWVsYWJOZXh0IiwgInNpbXBsZUJhY2siLCAic2ltcGxlTmV4dCIsICJyYWRpbyIsICJub3RlIiwgInB1YmxpY0JhY2siLCAicHVibGljTmV4dCIsICJzdW1tYXJ5QmFjayIsICJzdW1tYXJ5TmV4dCIsICJkaXNrU2FmZXR5QmFjayIsICJmaW5pc2hCdG4iLCAiY29uZmlnU3RyIiwgImVycm9ySGFuZGxlciIsICJBUFBTX0tFWSIsICJhcGlUZW1wbGF0ZXMiLCAiYXBpQ2F0ZWdvcmllcyIsICJtb2RhbCIsICJncmlkIiwgImZldGNoQXBwVGVtcGxhdGVzIiwgImNoZWNrUG9ydEF2YWlsYWJpbGl0eSIsICJwb3J0IiwgImdldFN1Z2dlc3RlZFBvcnQiLCAiYmFzZVBvcnQiLCAiYnVpbGRBcHBTZWxlY3RvciIsICJieUNhdGVnb3J5IiwgImFwcElkIiwgInRlbXBsYXRlIiwgImNhdGVnb3J5IiwgImNhdGVnb3J5T3JkZXIiLCAiYXBwcyIsICJhIiwgImIiLCAiaGVhZGVyIiwgImNhdGVnb3J5SW5mbyIsICJhcHAiLCAib3B0aW9uIiwgImlzV2lkZ2V0IiwgIndpZGdldEVuYWJsZWQiLCAid2lkZ2V0QmFkZ2UiLCAiZGlmZmljdWx0eUJhZGdlIiwgInRvZ2dsZURhc2hib2FyZFdpZGdldCIsICJzaG93RGVwbG95Q29uZmlnIiwgIm9wdGlvbkVsIiwgImtleSIsICJuZXdTdGF0ZSIsICJzZWxlY3RvciIsICJlbCIsICJiYWRnZSIsICJhcHBUZW1wbGF0ZSIsICJkZXBsb3lNb2RhbCIsICJzdWJkb21haW5JbnB1dCIsICJ1cmxQcmV2aWV3IiwgImlwSW5wdXQiLCAicG9ydElucHV0IiwgInRhaWxzY2FsZUNoZWNrYm94IiwgInRhaWxzY2FsZVN0YXR1cyIsICJjaGVja1Jlc3VsdCIsICJjb250YWluZXIiLCAiZGVmYXVsdFN1YmRvbWFpbiIsICJzdWJwYXRoV2FybmluZyIsICJzdXBwb3J0IiwgImNmZ0Ruc1R5cGUiLCAiY2ZnU3NsVHlwZSIsICJkbnNSYWRpbyIsICJzc2xSYWRpbyIsICJkbnNTZWN0aW9uIiwgImFkdmFuY2VkRGV0YWlscyIsICJhZHZhbmNlZENvbnRlbnQiLCAiZG5zU2VjdGlvbkVsIiwgInNzbFNlY3Rpb25FbCIsICJtZWRpYVBhdGhTZWN0aW9uIiwgIm1lZGlhUGF0aElucHV0IiwgIm1lZGlhUGF0aERlc2NyaXB0aW9uIiwgImRldGVjdGVkTW91bnRzQ29udGFpbmVyIiwgImRldGVjdGVkTW91bnRzTGlzdCIsICJtb3VudHNSZXN1bHQiLCAiYXV0b1BhdGhzIiwgIm0iLCAibW91bnQiLCAiaXNTZWxlY3RlZCIsICJjdXJyZW50UGF0aHMiLCAicCIsICJpZHgiLCAicGxleENsYWltU2VjdGlvbiIsICJ2b2x1bWVTZWN0aW9uIiwgInZvbHVtZUxpc3QiLCAibWVkaWFDb250YWluZXJQYXRoIiwgIm5vbk1lZGlhVm9sdW1lcyIsICJ2IiwgInZvbCIsICJpIiwgImhvc3REZWZhdWx0IiwgImNvbnRhaW5lclBhdGgiLCAicm93IiwgImlucHV0IiwgImRlZmF1bHRQb3J0IiwgInBvcnRTdGF0dXMiLCAiY2hlY2tBbmRVcGRhdGVQb3J0U3RhdHVzIiwgInBvcnRUb0NoZWNrIiwgInJlc3VsdCIsICJzdWdnZXN0ZWRQb3J0IiwgInVzZUJ0biIsICJwb3J0Q2hlY2tUaW1lb3V0IiwgInVwZGF0ZVVybFByZXZpZXciLCAic3ViZG9tYWluIiwgImRuc1R5cGUiLCAic3NsVHlwZSIsICJ1cmwiLCAicHJvdG9jb2wiLCAiYWRkQXBwVG9HcmlkIiwgImRlcGxveUNvbmZpZyIsICJjdXN0b21BcHBzIiwgInVzaW5nRXhpc3RpbmciLCAiZXhpc3RpbmdBcHAiLCAiaW5kZXgiLCAicG9ydFRvVXNlIiwgInBvcnRDaGVjayIsICJhcGlEZXBsb3lDb25maWciLCAiY2F0YWxvZ1BheWxvYWQiLCAibmV3QXBwIiwgIm1lc3NhZ2UiLCAiY2hlY2tTU0xDZXJ0aWZpY2F0ZSIsICJpbnN0cnVjdGlvbnMiLCAiYXBwTmFtZSIsICJhdHRlbXB0cyIsICJtYXhBdHRlbXB0cyIsICJjaGVja0NlcnQiLCAibG9hZEN1c3RvbUFwcHMiLCAidGVtcGxhdGVJZCIsICJlbnRyeSIsICJpZCIsICJtZWRpYVBhdGgiLCAiY3VzdG9tVm9sdW1lcyIsICJmb2xkZXJCcm93c2VyTW9kYWwiLCAiZm9sZGVyQnJvd3NlclBhdGgiLCAiZm9sZGVyQnJvd3Nlckxpc3QiLCAiZm9sZGVyQnJvd3NlclNlbGVjdGVkIiwgImZvbGRlckJyb3dzZXJTZWxlY3RlZExpc3QiLCAiY3VycmVudEJyb3dzZXJQYXRoIiwgInNlbGVjdGVkRm9sZGVycyIsICJ0YXJnZXRNZWRpYUlucHV0IiwgIm1lZGlhSW5wdXQiLCAidXBkYXRlU2VsZWN0ZWRGb2xkZXJzRGlzcGxheSIsICJsb2FkRm9sZGVyQ29udGVudHMiLCAicGF0aCIsICJpdGVtIiwgImljb24iLCAic2VsZWN0ZWRTdHlsZSIsICJyZWNpcGVUZW1wbGF0ZXMiLCAicmVjaXBlQ2F0ZWdvcmllcyIsICJjdXJyZW50UmVjaXBlIiwgImN1cnJlbnRTdGVwIiwgImlzUHJlbWl1bSIsICJjYW5jZWxCdG4iLCAicHJldkJ0biIsICJuZXh0QnRuIiwgImZldGNoUmVjaXBlVGVtcGxhdGVzIiwgInJlc3AiLCAiY2hlY2tSZWNpcGVQcmVtaXVtIiwgInJlY2lwZXMiLCAiZ2V0UHJldmlld1JlY2lwZXMiLCAicmVjaXBlTGlzdCIsICJyZWNpcGUiLCAiY29tcG9uZW50QmFkZ2UiLCAibG9ja092ZXJsYXkiLCAib3BlblJlY2lwZURlcGxveVdpemFyZCIsICJhcHBTZWxlY3Rvck1vZGFsIiwgInVwZGF0ZVN0ZXBVSSIsICJyZW5kZXJTdGVwMSIsICJwYW5lbCIsICJsaXN0IiwgImNvbXBvbmVudHMiLCAiY29tcCIsICJpc1JlcXVpcmVkIiwgImlzSW50ZXJuYWwiLCAicmVuZGVyU3RlcDIiLCAic2hhcmVkVm9sdW1lcyIsICJyZW5kZXJTdGVwMyIsICJjb250ZW50IiwgInNlbGVjdGVkQ29tcG9uZW50cyIsICJnZXRTZWxlY3RlZENvbXBvbmVudHMiLCAidm9sdW1lSW5wdXRzIiwgInZvbHVtZXMiLCAidGFpbHNjYWxlIiwgImMiLCAiayIsICJjaGVja2JveGVzIiwgInNlbGVjdGVkSWRzIiwgImNiIiwgImV4ZWN1dGVEZXBsb3kiLCAicHJvZ3Jlc3NMaXN0IiwgInJlc3VsdEVsIiwgInVwZGF0ZVByb2dyZXNzSXRlbSIsICJkZXBsb3llZCIsICJlcnIiLCAicyIsICJjb21wb25lbnRJZCIsICJzdGF0dXMiLCAidGV4dCIsICJzdGF0dXNFbCIsICJjYXJkcyIsICJncm91cHMiLCAiY2FyZCIsICJyZWNpcGVJZCIsICJncm91cENhcmRzIiwgImxhYmVsIiwgImFjdGlvbiIsICJlbmRwb2ludCIsICJtZXRob2QiLCAiciIsICJzdHlsZSIsICJidXR0b24iLCAib3JpZ2luYWxUZXh0IiwgInZpZXdCdG4iLCAicmVmcmVzaEJ0biIsICJjbGVhckJ0biIsICJjbG9zZUJ0biIsICJsZXZlbFNlbCIsICJjb250ZXh0U2VsIiwgInNlYXJjaElucHV0IiwgInNpbmNlSW5wdXQiLCAidW50aWxJbnB1dCIsICJsb2FkTW9yZUJ0biIsICJ0b3RhbFNwYW4iLCAiUEFHRV9TSVpFIiwgImN1cnJlbnRPZmZzZXQiLCAiaW5mbGlnaHQiLCAiZmlsdGVyTm9uY2UiLCAia25vd25Db250ZXh0cyIsICJ0b0lzbyIsICJsb2NhbER0VmFsdWUiLCAiZCIsICJyZWZyZXNoQ29udGV4dHMiLCAiY3VycmVudFZhbHVlIiwgImJ1aWxkUXVlcnkiLCAicGFyYW1zIiwgInNpbmNlIiwgInVudGlsIiwgInNlYXJjaCIsICJsb2FkTG9ncyIsICJhcHBlbmQiLCAibXlOb25jZSIsICJsb2dzIiwgInJlYXNvbiIsICJsb2ciLCAibGV2ZWwiLCAibGV2ZWxDb2xvciIsICJ0cyIsICJjdHgiLCAibXNnIiwgInRhYmxlIiwgImRldGFpbCIsICJjbGVhckxvZ3MiLCAic2VhcmNoRGVib3VuY2UiLCAid2lyZUZpbHRlcnMiLCAiZGF0ZURlYm91bmNlIiwgImNvbnRhaW5lclNlbGVjdCIsICJsb2dDb250ZW50IiwgImxvZ1NlYXJjaCIsICJsb2dUYWlsIiwgInN0cmVhbUJ0biIsICJkb3dubG9hZEJ0biIsICJjbGVhclNlYXJjaEJ0biIsICJjbG9zZUJ0bjIiLCAic3RyZWFtU3RhdHVzIiwgInN0cmVhbUluZGljYXRvciIsICJzdHJlYW1UZXh0IiwgImxpbmVDb3VudCIsICJmaWx0ZXJDb3VudCIsICJpbWFnZUVsIiwgImNyZWF0ZWRFbCIsICJjdXJyZW50Q29udGFpbmVySWQiLCAiY3VycmVudExvZ3MiLCAiZmlsdGVyZWRMb2dzIiwgImV2ZW50U291cmNlIiwgImlzU3RyZWFtaW5nIiwgInNlYXJjaFRpbWVvdXQiLCAiZm9ybWF0RGF0ZSIsICJkYXRlU3RyIiwgImVzY2FwZUh0bWwiLCAic3RyIiwgImRpdiIsICJmb3JtYXRMb2dFbnRyeSIsICJzdHJlYW1DbGFzcyIsICJzdHJlYW1JY29uIiwgInJlbmRlckxvZ3MiLCAic2VhcmNoVGVybSIsICJsb2FkQ29udGFpbmVycyIsICJjb250YWluZXJzIiwgImN1cnJlbnRWYWwiLCAibG9hZENvbnRhaW5lckluZm8iLCAiY29udGFpbmVySWQiLCAic3RvcFN0cmVhbSIsICJ0YWlsIiwgInN0YXJ0U3RyZWFtIiwgImVudHJ5RGl2IiwgImRvd25sb2FkTG9ncyIsICJjb250YWluZXJOYW1lIiwgInRpbWVzdGFtcCIsICJmaWxlbmFtZSIsICJzdHJlYW0iLCAiYmxvYiIsICJjbG9zZU1vZGFsIiwgIlVOSVRfUFJFU0VUUyIsICJ1bml0U2VsZWN0IiwgInRhaWxJbnB1dCIsICJjbGVhclNlYXJjaCIsICJvdmVyZmxvd0hpbnQiLCAidW5pdERpc3BsYXkiLCAic3RyZWFtU3RhdGUiLCAiYXZhaWxhYmxlIiwgImxpbmVzIiwgInN0cmVhbWluZyIsICJzZWFyY2hUaW1lciIsICJzZXRBdmFpbGFibGUiLCAiaXNBdmFpbGFibGUiLCAicHJvYmVBdmFpbGFibGUiLCAicmVuZGVyTGluZXMiLCAidGVybSIsICJmaWx0ZXJlZCIsICJsIiwgImxpbmUiLCAibG9hZFRhaWwiLCAidW5pdCIsICJldiIsICJjbG9zZSIsICJvcGVuSm91cm5hbGRNb2RhbCIsICJvcGVuQnRuIiwgImRldGFpbHNEaXYiLCAiY3JlYXRlQnRuIiwgImNyZWF0ZVN0YXR1cyIsICJzaG93Q29udGFpbmVyRGV0YWlscyIsICJjcmVhdGVTbmFwc2hvdCIsICJuYW1lIiwgImxlYXZlUnVubmluZyIsICJvcGVuTW9kYWwiLCAidGFiIiwgImNvbm5lY3RCdG4iLCAicGhhc2VEZXRlY3QiLCAicGhhc2VDcmVkZW50aWFscyIsICJwaGFzZVByb2dyZXNzIiwgInBoYXNlUmVzdWx0cyIsICJkZXRlY3RSZXN1bHRzIiwgImNyZWRlbnRpYWxJbnB1dHMiLCAicHJvZ3Jlc3NTdGVwcyIsICJyZXN1bHRzQ29udGVudCIsICJwbGV4TGlicmFyaWVzIiwgInJldHJ5QnRuIiwgImRldGVjdGVkRGF0YSIsICJzZXJ2aWNlSWNvbnMiLCAic2VydmljZUxhYmVscyIsICJzaG93UGhhc2UiLCAicGhhc2UiLCAic3RhdHVzQmFkZ2UiLCAiY29sb3JzIiwgInNtYXJ0RGV0ZWN0IiwgInN2YyIsICJpbmZvIiwgInNvdXJjZSIsICJ2ZXJzaW9uIiwgImtleVNhdmVkIiwgImJ1aWxkQ3JlZGVudGlhbElucHV0cyIsICJzZXJ2aWNlcyIsICJhcnJTZXJ2aWNlcyIsICJpc0Nvbm5lY3RlZCIsICJwbGV4IiwgInBsZXhDb25uZWN0ZWQiLCAic2VlcnIiLCAic2VlcnJPayIsICJjb25maWd1cmVkSHRtbCIsICJjcyIsICJzZXJ2aWNlIiwgInVybElucHV0IiwgImtleUlucHV0IiwgInN0YXR1c1NwYW4iLCAiYXBpS2V5IiwgInNtYXJ0Q29ubmVjdCIsICJzdGVwc0h0bWwiLCAiZGV0YWlsQ29sb3IiLCAic2hvd1Jlc3VsdHMiLCAiYWxsR29vZCIsICJoZWFkZXJDb2xvciIsICJoZWFkZXJJY29uIiwgImhlYWRlclRleHQiLCAic3QiLCAiZmV0Y2hQbGV4TGlicmFyaWVzIiwgImxpYiIsICJ0eXBlSWNvbiIsICJzYXZlQnRuIiwgInByb3ZpZGVyIiwgImNoZWNrYm94IiwgImhlYWx0aENoZWNrRW5hYmxlZCIsICJoZWFsdGhDaGVja0NvbmZpZyIsICJsb2FkTm90aWZpY2F0aW9uQ29uZmlnIiwgImVtYWlsUGFzc0VsIiwgImxvYWROb3RpZmljYXRpb25IaXN0b3J5IiwgImRhdGUiLCAic2F2ZU5vdGlmaWNhdGlvbkNvbmZpZyIsICJ0ZXN0UHJvdmlkZXIiLCAibG9hZE5vdGlmaWNhdGlvblN0YXR1cyIsICJsYXN0U2VudEVsIiwgInBhbmVsSWQiLCAidGFiQmFyIiwgIm1vZGFsQ29udGVudCIsICJ0YXJnZXQiLCAiQlJPV1NFUl9TVEFURV9LRVlTIiwgImNvbGxlY3RCcm93c2VyU3RhdGUiLCAic3RhdGUiLCAidmFsIiwgImoiLCAicmVzdG9yZUJyb3dzZXJTdGF0ZSIsICJicm93c2VyU3RhdGUiLCAiY291bnQiLCAiaXNMZWdhY3lGb3JtYXQiLCAicmVzdG9yZUxlZ2FjeUZvcm1hdCIsICJzbHVnIiwgImV4cG9ydEJ0biIsICJzZWxlY3RGaWxlQnRuIiwgImZpbGVJbnB1dCIsICJmaWxlTmFtZURpdiIsICJwcmV2aWV3RGl2IiwgInByZXZpZXdDb250ZW50IiwgInJlc3RvcmVCdG4iLCAicmVzdWx0RGl2IiwgInNjaGVkdWxlQ29udGFpbmVyIiwgImhpc3RvcnlDb250YWluZXIiLCAiZGlza0NvbnRhaW5lciIsICJwb2ludGludGltZUNvbnRhaW5lciIsICJzZWxlY3RlZEJhY2t1cCIsICJzdGF0ZUNvdW50IiwgInRoZW1lQ291bnQiLCAiYmFja3VwIiwgInByZXZpZXciLCAicmVsb2FkQ2FkZHkiLCAiYnJvd3NlckNvdW50IiwgImxvYWRTY2hlZHVsZXNUYWIiLCAic2NoZWR1bGVzIiwgInNjaCIsICJuZXh0UnVuU3RyIiwgImxhc3RSdW5TdHIiLCAidG9nZ2xlIiwgInVwZGF0ZVNjaGVkdWxlIiwgInNlbCIsICJpbnAiLCAicnVuQmFja3VwTm93IiwgImRlbGV0ZVNjaGVkdWxlIiwgImFkZE5ld1NjaGVkdWxlIiwgInVwZGF0ZXMiLCAiaW50ZXJ2YWwiLCAicmV0ZW50aW9uIiwgImFwcElkSW5wdXQiLCAibG9hZERpc2tCYWNrdXBzIiwgImZpbGVzIiwgImJ5QXBwIiwgImYiLCAiYXBwSWRzIiwgImFwcEZpbGVzIiwgImNvbXBhcmVCYWNrdXBGaWxlIiwgInJlc3RvcmVCYWNrdXBGaWxlIiwgImxvYWRCYWNrdXBIaXN0b3J5IiwgImJrIiwgInNpemVNQiIsICJiYWNrdXBJZCIsICJsb2FkUG9pbnRJblRpbWVUYWIiLCAibGljZW5zZVJlcyIsICJsaWNlbnNlRGF0YSIsICJzZXJ2aWNlc1JlcyIsICJzZXJ2aWNlc0RhdGEiLCAibG9hZFBvaW50SW5UaW1lQmFja3VwcyIsICJsaXN0RWwiLCAiZGlmZiIsICJzdmNDaGFuZ2VkIiwgImNmZ0NoYW5nZWQiLCAiYXV0b1JlZnJlc2hDaGVja2JveCIsICJhZ2dyZWdhdGVkQ29udGFpbmVyIiwgImFsZXJ0c0NvbnRhaW5lciIsICJsYXN0VXBkYXRlU3BhbiIsICJyZWZyZXNoSW50ZXJ2YWwiLCAiY2FjaGVkTW9uaXRvcmluZ0RhdGEiLCAiZm9ybWF0Qnl0ZXMiLCAiYnl0ZXMiLCAic2l6ZXMiLCAiZ2V0Q3B1Q29sb3IiLCAicGVyY2VudCIsICJnZXRNZW1Db2xvciIsICJsb2FkU3RhdHMiLCAic3RhdHMiLCAiaXNOZXdBcGkiLCAiY3VyIiwgImNwdSIsICJtZW0iLCAiY3B1Q29sb3IiLCAibWVtQ29sb3IiLCAibWVtVXNlZCIsICJtZW1MaW1pdCIsICJuZXRSeCIsICJuZXRUeCIsICJhZ2ciLCAibG9hZEFnZ3JlZ2F0ZWQiLCAibG9hZEFsZXJ0cyIsICJhbGVydEhpc3RvcnkiLCAiaGQiLCAiYWxsQ29uZmlncyIsICJjZCIsICJjb250YWluZXJSb3dzIiwgImhpc3RvcnlSb3dzIiwgInRpbWUiLCAibm90aWZpZWRNYXJrIiwgImNvbmZpZ1NlY3Rpb24iLCAiY29uZmlncyIsICJjSWQiLCAic3RvcEF1dG9SZWZyZXNoIiwgIm9yaWciLCAic3RhcnRBdXRvUmVmcmVzaCIsICJoaXN0b3J5Q29udGFpbmVyU2VsZWN0IiwgImhpc3RvcnlBcmVhIiwgInJhbmdlQnV0dG9ucyIsICJjdXJyZW50UmFuZ2UiLCAicmFuZ2VUb01zIiwgInJhbmdlIiwgInRpZXJMYWJlbCIsICJ0aWVyIiwgInJlbmRlclNwYXJrbGluZSIsICJzYW1wbGVzIiwgImFjY2Vzc29yIiwgImNvbG9yIiwgInZhbHVlcyIsICJtYXgiLCAibWluIiwgInciLCAiaCIsICJwYWQiLCAic3RlcFgiLCAicG9pbnRzIiwgIngiLCAieSIsICJsYXN0IiwgImF2ZyIsICJwb3B1bGF0ZUhpc3RvcnlDb250YWluZXJTZWxlY3QiLCAicHJldmlvdXMiLCAiZW50cmllcyIsICJsb2FkSGlzdG9yeSIsICJlbmRUaW1lIiwgInN0YXJ0VGltZSIsICJpc1JhdyIsICJjcHVBY2Nlc3NvciIsICJtZW1BY2Nlc3NvciIsICJuZXRSeEFjY2Vzc29yIiwgIm5ldFR4QWNjZXNzb3IiLCAic3RhdHVzQ29udGFpbmVyIiwgImluY2lkZW50c0NvbnRhaW5lciIsICJjb25maWdDb250YWluZXIiLCAiYWRkQnRuIiwgImZvcm1FbCIsICJmb3JtVGl0bGUiLCAiZm9ybUNhbmNlbCIsICJmb3JtU2F2ZSIsICJIRUFMVEhfU0VUVElOR1NfS0VZIiwgIkhFQUxUSF9ERUZBVUxUUyIsICJnbG9iYWxTYXZlQnRuIiwgImdsb2JhbFJlc2V0QnRuIiwgImdsb2JhbFN0YXR1c1NwYW4iLCAicmV0ZW50aW9uSW5wdXQiLCAiaW50ZXJ2YWxJbnB1dCIsICJzdGF0c0ludGVydmFsSW5wdXQiLCAibWF4RW50cmllc0lucHV0IiwgImRpc2tUaHJlc2hvbGRJbnB1dCIsICJsb2FkSGVhbHRoU2V0dGluZ3MiLCAicmF3IiwgInNhdmVkIiwgImFwcGx5SGVhbHRoU2V0dGluZ3NUb1VJIiwgInNhdmVIZWFsdGhTZXR0aW5ncyIsICJzZXR0aW5ncyIsICJyZXNldEhlYWx0aFNldHRpbmdzIiwgImVkaXRpbmdJZCIsICJ1cHRpbWVDb2xvciIsICJwY3QiLCAic2V2ZXJpdHlCYWRnZSIsICJzZXYiLCAibG9hZFN0YXR1cyIsICJpc1VwIiwgImRvdENvbG9yIiwgInUyNCIsICJ1N2QiLCAiYXZnUnQiLCAibGFzdENoZWNrIiwgImRldGFpbFJvdyIsICJydCIsICJsb2FkSW5jaWRlbnRzIiwgIm9wZW5SZXMiLCAiaGlzdFJlcyIsICJvcGVuRGF0YSIsICJoaXN0RGF0YSIsICJvcGVuIiwgImluYyIsICJoaXN0b3J5IiwgInJlc29sdmVkIiwgImR1ciIsICJsb2FkQ29uZmlnIiwgInNob3dGb3JtIiwgInRpbWVvdXQiLCAiY29kZXMiLCAic2xhIiwgInNsb3ciLCAiaGlkZUZvcm0iLCAiYm9keSIsICJjaGVja0J0biIsICJhdmFpbGFibGVDb250YWluZXIiLCAiYXV0b0NvbnRhaW5lciIsICJsYXN0Q2hlY2tTcGFuIiwgImxvYWRBdmFpbGFibGUiLCAidSIsICJjb3VudEJhZGdlIiwgInVwZGF0ZUFsbEJ0biIsICJ1cGRhdGVBbGxDb250YWluZXJzIiwgInN1Y2Nlc3MiLCAiZmFpbGVkIiwgImNoZWNrRm9yVXBkYXRlcyIsICJvayIsICJsb2FkQXV0b0NvbmZpZyIsICJjb250YWluZXJzUmVzIiwgImNvbmZpZ1JlcyIsICJjb250YWluZXJzRGF0YSIsICJjb25maWdEYXRhIiwgInNhdmVkQ29uZmlnIiwgImNpZCIsICJzY2hlZHVsZVZhbCIsICJyb2xsYmFja1ZhbCIsICJ3aW5kb3dWYWwiLCAibGFzdFJ1biIsICJzY2hlZHVsZSIsICJyb2xsYmFjayIsICJ3aW5kb3ciLCAiZGNWZXJzaW9uSW5mbyIsICJkY1VwZGF0ZUJhZGdlIiwgImRjVXBkYXRlRGV0YWlscyIsICJkY05ld1ZlcnNpb24iLCAiZGNDaGFuZ2Vsb2ciLCAiZGNBcHBseUJ0biIsICJkY0NoZWNrQnRuIiwgImRjUm9sbGJhY2tCdG4iLCAiZGNTdGF0dXNCYXIiLCAiZGNIaXN0b3J5Q29udGFpbmVyIiwgImRjTGFzdENoZWNrIiwgImRjU2hvd1N0YXR1cyIsICJ0eXBlIiwgImRjTG9hZFZlcnNpb24iLCAiY29tbWl0IiwgImRjQ2hlY2tGb3JVcGRhdGUiLCAic2lsZW50IiwgInVwZGF0ZXNCdG4iLCAiZG90IiwgImRjVGFiIiwgImRjQXBwbHlVcGRhdGUiLCAiZGNMb2FkSGlzdG9yeSIsICJzdENvbG9yIiwgImRjU2hvd1JvbGxiYWNrIiwgInZlcnNpb25zIiwgImZtdEJ5dGVzIiwgInVuaXRzIiwgImxvYWRWb2x1bWVzIiwgInZvbHMiLCAiaXNTeXN0ZW0iLCAibmFtZUlucHV0IiwgImxvYWROZXR3b3JrcyIsICJuZXRzIiwgIm4iLCAiZHJpdmVyU2VsZWN0IiwgImxvYWREaXNrVXNhZ2UiLCAic2VjdGlvbnMiLCAicGFyc2VkRGF0YSIsICJ5YW1sU3RyIiwgInN0YWNrTmFtZSIsICJvcmlnVGV4dCIsICJyZW5kZXJQcmV2aWV3IiwgImJvcmRlckNvbG9yIiwgInBhcnRzIiwgInByb2dyZXNzRWwiLCAidGVybUVsIiwgIndzIiwgImZpdEFkZG9uIiwgImNsZWFudXAiLCAib3BlbkV4ZWMiLCAiZGltcyIsICJjb2xzIiwgInJvd3MiLCAicmVzaXplSGFuZGxlciIsICJmaWx0ZXJTZWxlY3QiLCAib3V0Y29tZVNlbGVjdCIsICJsb2FkQXVkaXQiLCAib3V0Y29tZSIsICJhY3RvciIsICJhY3RvckxhYmVsIiwgInJvbGUiLCAidGFnIiwgInRhYnMiLCAicGFuZWxzIiwgImFsbEV2ZW50cyIsICJhbGxIb3N0cyIsICJzc2VTb3VyY2UiLCAicmVmcmVzaE92ZXJ2aWV3IiwgInJlZnJlc2hFdmVudHMiLCAicmVmcmVzaEhvc3RzIiwgInN0YXJ0TGl2ZVRhaWwiLCAic3RvcExpdmVUYWlsIiwgInJlbmRlckV2ZW50cyIsICJhY3RpdmUiLCAic3RhdHNSZXMiLCAiaG9zdHNSZXMiLCAiZXZlbnRzUmVzIiwgImhvc3RzIiwgImV2ZW50c0NvdW50IiwgInJlbmRlclRvcExpc3QiLCAiaXRlbXMiLCAiaXQiLCAiZmlsdGVyU291cmNlIiwgImZpbHRlclNldmVyaXR5IiwgImZpbHRlckhvc3QiLCAiZmlsdGVyQWN0b3IiLCAiZGVib3VuY2UiLCAicmVmcmVzaEhvc3RGaWx0ZXIiLCAicmVuZGVyRXZlbnRSb3ciLCAic2V2Q29sb3IiLCAiY3VycmVudCIsICJyZWdpc3Rlckhvc3RQcm9tcHQiLCAiZm4iLCAibXMiLCAicmVwb3MiLCAiZXNjRm4iLCAiYW5vbnltb3VzIiwgInR5cGVkIiwgIiQiLCAibG9hZGVkT25jZSIsICJlc2MiLCAiYXBpIiwgIm9wdHMiLCAic2hvd091dHB1dCIsICJsb2FkU2VydmljZXMiLCAibG9hZFJlcG9zIiwgImxvYWRKb3VybmFsIiwgInFzIiwgImxvYWRHaXRlYVJlcG9zIiwgImhvc3RFbCIsICJ0b2tFbCIsICJhbm9uRWwiLCAicnVuSW5zdGFsbCIsICJyZXBvVXJsIiwgImFyZ3NSYXciLCAiYXJncyIsICJzZXRCdXN5IiwgInR5cGVkVG9rZW4iLCAicmVxdWVzdFRva2VuIiwgImJ1c3kiLCAicnVuRGVwbG95IiwgImRpciIsICJydW5Sb2xsYmFjayIsICJydW5TdGF0dXMiLCAid2lyZSIsICJyYiIsICJzYiIsICJMT0NBVElPTl9LRVkiLCAiTEVHQUNZX0tFWSIsICJHRU9fQ0FDSEVfS0VZIiwgIlVOSVRfS0VZIiwgImdldFVuaXQiLCAiZ2V0V2VhdGhlckVsZW1lbnRzIiwgIndtb0Rlc2NyaXB0aW9ucyIsICJ3bW9JY29ucyIsICJ3aW5kRGlycyIsICJkZWdUb0RpciIsICJkZWciLCAiZ2VvY29kZUxvY2F0aW9uIiwgInF1ZXJ5IiwgImNhY2hlZCIsICJnZW8iLCAiZm9ybWF0TG9jYXRpb24iLCAiZmV0Y2hXZWF0aGVyIiwgImxvY2F0aW9uIiwgInRlbXBVbml0IiwgIndpbmRVbml0IiwgImNvZGUiLCAidXBkYXRlV2VhdGhlciIsICJ3ZWF0aGVyV2lkZ2V0IiwgIndlYXRoZXIiLCAidGVtcFN1ZmZpeCIsICJ3aW5kTGFiZWwiLCAibG9jYXRpb25JbnB1dCIsICJsb2MiLCAidW5pdFJhZGlvIiwgIm5ld1VuaXQiLCAib2xkVW5pdCIsICJ3aWRnZXQiLCAicmVuZGVyIiwgIkRBWVMiLCAiTU9OVEhTIiwgIlJPTUFOIiwgImN1cnJlbnRTdHlsZSIsICJsYXN0Q2hpbWVIb3VyIiwgImNoaW1lUGxheWluZyIsICJwcmV2RmxpcERpZ2l0cyIsICJhY3RpdmVMYXlvdXQiLCAiZGlnaXRhbFJlZnMiLCAidGlja1RpbWVyIiwgInBsYXlDaGltZXMiLCAic3RyaWtlIiwgImJlbGwiLCAibm93IiwgInJlc2V0UmVuZGVyTGF5b3V0IiwgImVuc3VyZURpZ2l0YWxMYXlvdXQiLCAicmVuZGVyRGVmYXVsdCIsICJoMjQiLCAiYW1wbSIsICJyZWZzIiwgInJlbmRlckxjZCIsICJjbHMiLCAicmVuZGVyRmxpcCIsICJkaWdpdHMiLCAiZmxpcENhcmQiLCAiZGlnaXQiLCAicmVuZGVyQmluYXJ5IiwgImJpdCIsICJjb2wiLCAib24iLCAicmVuZGVyQW5hbG9nIiwgInVzZVJvbWFuIiwgInNpemUiLCAiY3giLCAiY3kiLCAic0FuZ2xlIiwgIm1BbmdsZSIsICJoQW5nbGUiLCAibGFiZWxzIiwgImFuZ2xlIiwgInRpY2tzIiwgIm91dGVyIiwgImlubmVyIiwgIngxIiwgInkxIiwgIngyIiwgInkyIiwgInN2ZyIsICJ0aWNrIiwgIm5leHRDbGFzc05hbWUiLCAic2NoZWR1bGVOZXh0VGljayIsICJkZWxheSIsICJTVFlMRVMiLCAic3R5bGVPcHRpb25zSHRtbCIsICJjaGltZXNUb2dnbGUiLCAidm9sdW1lU2xpZGVyIiwgImxvYWRTZXR0aW5ncyIsICJldmVudEtleSIsICJzdGFydElzbyIsICJjcmVhdGVDYWNoZSIsICJtYXAiLCAid2lkZ2V0RWxzIiwgImZtdFdoZW4iLCAic3RhcnQiLCAiYWxsRGF5IiwgInRvZGF5IiwgImRheSIsICJkYXlzIiwgImRheUxhYmVsIiwgInRpbWVMYWJlbCIsICJmbXRUaW1lIiwgImRheUtleSIsICJjYWNoZSIsICJtZXJnZUV2ZW50cyIsICJsb2FkZWRJbnRlcnZhbHMiLCAid2luZG93Rm9yIiwgInZpZXciLCAiYmFzZSIsICJlbmQiLCAiY292ZXJzIiwgIml2IiwgIm1lcmdlUmFuZ2UiLCAiaXZzIiwgInJlc3QiLCAidmlld01vbnRoIiwgImxhc3RDYWNoZWQiLCAiZmV0Y2hDYWxlbmRhciIsICJmb3JjZSIsICJyZW5kZXJXaWRnZXQiLCAiZWxzIiwgInVwY29taW5nIiwgInVwY29taW5nT25seSIsICJuZXh0IiwgImV2ZW50TWFwIiwgInJlbmRlckdyaWQiLCAiYnlEYXkiLCAidG9kYXlLZXkiLCAiZmlyc3REb3ciLCAiZGF5c0luIiwgImRheUV2ZW50cyIsICJkb3RzIiwgInRpcCIsICJldmVudHMiLCAicmVuZGVyVXBjb21pbmciLCAicmVuZGVyU291cmNlcyIsICJzb3VyY2VzIiwgImVuYWJsZSIsICJyZWZyZXNoIiwgImxhc3RCb2R5IiwgIm5vd0JvZHkiLCAidmlld0JvZHkiLCAiY2FsTGFzdEZvY3VzIiwgImZvcm1DcmVkcyIsICJzZXRTdGF0dXMiLCAiY2FsQnRuIiwgImNhbFNldHRpbmdzIiwgImNhbE1vZGFsRWwiLCAibmF2aWdhdGUiLCAiZGVsdGEiLCAiY2FsUHJldiIsICJjYWxOZXh0IiwgIlBPTEwiLCAibG9hZEluZm8iLCAibG9hZENvbm5lY3Rpb25zIiwgImtleXMiLCAiY3JlYXRlQ29ubmVjdGlvbiIsICJjbGllbnQiLCAic25pcHBldCIsICJjb3B5VGV4dCIsICJva01zZyIsICJyZWZyZXNoQ2FyZEhlYWx0aCIsICJzZXJ2aWNlSWQiLCAidXB0aW1lRWwiLCAiYmFyRWwiLCAidXB0aW1lMjQiLCAiZGlzbWlzc2VkVXBkYXRlcyIsICJrbm93blVwZGF0ZXMiLCAicmVmcmVzaENhcmRVcGRhdGVzIiwgIm5vdGlmeU5ldyIsICJwcmV2IiwgInVwZCIsICJ1cGRhdGVCdG4iLCAic2NoZWR1bGVDYXJkRW5oYW5jZW1lbnRzIiwgIm9yaWdSZWZyZXNoQWxsIiwgInRoZW1lQmVmb3JlQnVpbGRlciIsICJlZGl0aW5nU2x1ZyIsICJhZHZhbmNlZE92ZXJyaWRlcyIsICJUSEVNRV9MQUJFTFMiLCAiRklFTERTIiwgInRoZW1lQnRuIiwgInRoZW1lTGFiZWwiLCAiZ2V0TGFiZWxGb3IiLCAidXNlclRoZW1lcyIsICJ1cGRhdGVMYWJlbCIsICJidWlsZEZpZWxkc0hUTUwiLCAiZ3JvdXBlZCIsICJidWlsZFN0YXJ0RnJvbU9wdGlvbnMiLCAibW9kYWxIVE1MIiwgInN0YXJ0U2VsZWN0IiwgImVkaXRTZWxlY3QiLCAiZXhpc3RpbmdTZWN0aW9uIiwgImxpZ2h0QmdDaGVjayIsICJwaWNrZXJzIiwgImFkdmFuY2VkU2VjdGlvbiIsICJhZHZhbmNlZFRvZ2dsZSIsICJhZHZhbmNlZFZpc2libGUiLCAiZ2V0Q3VycmVudENvbG9ycyIsICJnZXRCYXNlQ29sb3JzIiwgInVwZGF0ZUFkdmFuY2VkRnJvbURlcml2ZWQiLCAiZGVyaXZlZCIsICJoZXgiLCAibG9hZFRoZW1lSW50b1BpY2tlcnMiLCAidGhlbWVOYW1lIiwgInVwZGF0ZVByZXZpZXciLCAibG9hZFVzZXJUaGVtZUludG9QaWNrZXJzIiwgInRoZW1lIiwgIm11dGVkIiwgImJhZGdlT2siLCAiYmFkZ2VCYWQiLCAiZG90T2siLCAiZG90QmFkIiwgImFwcGx5Q29sb3JzTGl2ZSIsICJwcm9wIiwgInJlZnJlc2hFZGl0RHJvcGRvd24iLCAic2x1Z3MiLCAicmVmcmVzaFN0YXJ0RnJvbSIsICJvcGVuQnVpbGRlciIsICJjdXN0b21pemVCdG4iLCAib2xkU2x1ZyIsICJuZXdTbHVnIiwgInRoZW1lRGF0YSIsICJhcGlDb2xvcnMiLCAic2x1Z1RvRGVsZXRlIiwgImZhbGxiYWNrIiwgImV4cG9ydERhdGEiLCAidGhlbWVDb2xvcnMiLCAidGhlbWVMaWdodEJnIiwgImNvZGVJbnB1dCIsICJhY3RpdmF0ZUJ0biIsICJkZWFjdGl2YXRlQnRuIiwgImVycm9yRWwiLCAic3VjY2Vzc0VsIiwgImJhZGdlSWNvbiIsICJiYWRnZVRleHQiLCAiZGV0YWlsc0VsIiwgImZlYXR1cmVMaXN0IiwgImFjdGl2YXRlU2VjdGlvbiIsICJjdXJyZW50U3RhdHVzIiwgImhpZGVNZXNzYWdlcyIsICJzaG93RXJyb3IiLCAic2hvd1N1Y2Nlc3MiLCAicmVuZGVyU3RhdHVzIiwgImV4cGlyeUxpbmUiLCAiZmVhdHVyZXMiLCAiYWN0aXZlRmVhdHVyZXMiLCAidXBkYXRlSGVhZGVyQmFkZ2UiLCAiYWN0aXZhdGVMaWNlbnNlIiwgImRlYWN0aXZhdGVMaWNlbnNlIiwgInRvcGJhciIsICJpY29uRWwiLCAidGV4dEVsIiwgInRpbWVFbCIsICJvcGVuTGljZW5zZU1vZGFsIiwgInRvcGJhckVsIiwgImZlYXR1cmUiLCAiVFRMX09QVElPTlMiLCAibyIsICJzZXJ2aWNlTmFtZUVsIiwgImlzc3VlZEVsIiwgImlzc3VlZFVybElucHV0IiwgImlzc3VlZENvcHlCdG4iLCAiaXNzdWVkTWV0YUVsIiwgIm91dHN0YW5kaW5nTGlzdEVsIiwgInB1YmxpY0NyZWF0ZUJ0biIsICJ0c0NyZWF0ZUJ0biIsICJ0c0VtYWlsSW5wdXQiLCAicHVibGljVHRsU2VsZWN0IiwgImN1cnJlbnRTZXJ2aWNlIiwgImFjdGl2ZVRhYiIsICJfb3JpZ2luRnJvbVBhZ2UiLCAiX2Fic1VybCIsICJ1cmxQYXRoIiwgIl9mb3JtYXRFeHBpcnkiLCAiaXNvIiwgIl9mb3JtYXRSZW1haW5pbmciLCAic2V0QWN0aXZlVGFiIiwgImlzQWN0aXZlIiwgImxvYWRPdXRzdGFuZGluZyIsICJyZW1haW5pbmciLCAicmV2b2tlU2hhcmUiLCAiaXNzdWVQdWJsaWMiLCAib3JpZ2luYWwiLCAidHRsTXMiLCAiX3JlbmRlckFwaUVycm9yIiwgImlzc3VlVGFpbHNjYWxlIiwgIm9wZW5TaGFyZU1vZGFsIl0KfQo=