User:Eejit43/scripts/afcrc-helper.js
Appearance
< User:Eejit43 | scripts
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
This user script seems to have a documentation page at User:Eejit43/scripts/afcrc-helper. |
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/afcrc-helper/afcrc-helper.ts
"use strict";(()=>{var X=Object.defineProperty;var C=(h,e)=>()=>(h&&(e=h(h=0)),e);var F=(h,e)=>{for(var t in e)X(h,t,{get:e[t],enumerable:!0})};var L,B=C(()=>{"use strict";L=class h extends OO.ui.Dialog{contentLayout;logOutput;closeButton;constructor(){super({size:"large"}),h.static.name="ActionsDialog",h.static.title="Actions"}initialize=()=>(OO.ui.Dialog.prototype.initialize.apply(this),mw.util.addCSS(`
.afcrc-helper-actions-container div {
margin-block: 8px;
}`),this.contentLayout=new OO.ui.PanelLayout({padded:!0,expanded:!1}),this.$body.append(this.contentLayout.$element),this.logOutput=document.createElement("div"),this.logOutput.classList.add("afcrc-helper-actions-container"),this.closeButton=new OO.ui.ButtonWidget({label:"Close",flags:["safe","close"]}),this.closeButton.on("click",()=>this.close()),this.contentLayout.$element.append(this.logOutput,this.closeButton.$element),this);addLogEntry(e,t="notice"){let n=new OO.ui.MessageWidget({type:t,inline:!0,label:new OO.ui.HtmlSnippet(e)});this.logOutput.append(n.$element[0]),this.updateSize(),this.closeButton.scrollElementIntoView()}showReload(){this.closeButton.$element.remove();let e=new OO.ui.ButtonWidget({label:"Reload",flags:["primary"]});e.on("click",()=>window.location.reload()),this.contentLayout.$element.append(e.$element)}};Object.assign(L.prototype,OO.ui.Dialog.prototype)});var E,V=C(()=>{"use strict";B();E=class h extends OO.ui.ProcessDialog{api=new mw.Api;scriptMessage=" ([[User:Eejit43/scripts/afcrc-helper|afcrc-helper]])";requestPageType;pageTitle;createdPageWatchMethod;beforeText;pageContent;parsedRequests;editsCreationsToMake=[];constructor(e,t,n){super({size:"large"}),h.static.name="AfcrcHelperDialog",h.static.title="afcrc-helper",h.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"save",label:"Run",flags:["primary","progressive"]}],this.pageTitle=t,this.requestPageType=e,this.createdPageWatchMethod=n&&["nochange","preferences","unwatch","watch"].includes(n)?n:"preferences",document.body.classList.add("afcrc-helper-open"),mw.util.addCSS(`
body.afcrc-helper-open #mw-teleport-target {
z-index: 500;
}
.afcrc-helper-request {
margin: 10px;
border-radius: 5px;
background-color: #eee;
padding: 5px;
color: #202122;
}
.afcrc-helper-request summary {
cursor: pointer;
}
.afcrc-helper-target-editor {
min-width: 1ch;
max-width: calc(100% - 4ch);
font-family: monospace;
}
.afcrc-helper-external-link {
text-decoration: none !important;
}
.afcrc-helper-external-link svg {
display: inline-block;
width: 1em;
height: 1em;
fill: currentColor;
}
.afcrc-helper-request-info,
.afcrc-helper-request-responder {
margin: 5px;
}
.afcrc-helper-request-info > div,
.afcrc-helper-request-responder > div {
margin-block: 8px;
}
.afcrc-helper-request-responder > div:last-of-type {
margin-bottom: 0;
}
.afcrc-helper-request-responder .oo-ui-fieldLayout {
margin-left: 8px;
}
.afcrc-helper-request-responder .oo-ui-fieldLayout-header {
width: max-content;
}
.afcrc-helper-action-radio {
margin-top: 8px;
}
.afcrc-helper-action-radio .oo-ui-radioOptionWidget {
display: inline;
padding: 8px;
}
.afcrc-closing-reason-input,
.afcrc-comment-input {
max-width: 50%;
}
.afcrc-helper-template-parameters-container,
.afcrc-helper-template-parameters-container details {
margin-block: 10px;
border: 1px solid #a2a9b1;
border-radius: 2px;
background-color: white;
padding: 5px;
}
.afcrc-helper-template-parameters-container {
margin-left: 8px;
}
.afcrc-helper-template-parameters-container summary {
cursor: pointer;
font-weight: bold;
}
.afcrc-helper-template-parameters-container details {
margin-block: 5px;
background-color: #e2e2e2;
}
#afcrc-helper-no-templates-message {
padding: 5px;
}`)}getActionProcess=e=>!e||e==="cancel"?new OO.ui.Process(()=>{this.parsedRequests.length>0?OO.ui.confirm("Are you sure you want to close? All changes will be discarded.").then(t=>t?this.close():null):this.close()}):e==="save"?new OO.ui.Process(()=>{this.performActions()}):h.super.prototype.getActionProcess.call(this,e);getTeardownProcess=()=>h.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty(),document.body.classList.remove("afcrc-helper-open")});async load(){let e=await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.pageTitle});this.pageContent=e.query.pages[0].revisions[0].slots.main.content.trim(),this.parseRequests(),this.loadInputElements()}parseRequests(){this.beforeText=/^(.*?)==/s.exec(this.pageContent)[1],this.pageContent=this.pageContent.replace(/^.*?==/s,"==");let e=[...this.pageContent.matchAll(/^==.*?==$(\s*(?!==[^=]).*)*/gim)].map(t=>t[0]);for(let t of e){if(/{{afc-c\|/i.test(t))continue;let s=/^==(.*?)==$/m.exec(t)[1].trim();this.parseSubtypeRequests(t,s)}}loadInputElements(){if(this.parsedRequests.length>0){let e=0,t=()=>{let s=Math.min(e+5,this.parsedRequests.length);this.title.setLabel(`afcrc-helper (loading ${e+1}-${s}/${this.parsedRequests.length} requests)`);for(let o=e;o<s;o++)this.loadSubtypeElements(o);s<this.parsedRequests.length?(e=s,setTimeout(t,0)):this.title.setLabel(`afcrc-helper (${this.parsedRequests.length} requests loaded)`)};t()}else{let e=new OO.ui.MessageWidget({type:"notice",label:"No valid requests to handle!"}),t=new OO.ui.PanelLayout({padded:!0,expanded:!1});t.$element.append(e.$element),this.$body.append(t.$element),this.updateSize()}}async performActions(){let e=new OO.ui.WindowManager;document.body.append(e.$element[0]);let t=new L;e.addWindows([t]),t.open();let n={accepted:0,denied:0,"commented on":0,closed:0},s=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.pageTitle})).query.pages[0].revisions[0].slots.main.content.trim();this.performSubtypeActions(t,n,s)}formatDeniedReason(e){let t=e.startsWith("autofill:")?/autofill:(\w+)/.exec(e)[1]:`decline|2=${e}`,n=e.includes(",")?" "+e.slice(e.indexOf(",")+1).trim():"";return`{{subst:AfC ${this.requestPageType}|${t}}}${n}`}mapDeniedReasons(e,t,n){if(t)return`* ${this.formatDeniedReason(e[0][1])} ~~~~`;let s={};for(let[i,a]of e)s[a]||(s[a]=[]),s[a].push(i);let o=Object.entries(s);return o.map(([i,a])=>`* ${this.formatDeniedReason(i)}${o.length>1||!n?` (${a.map(c=>`[[${c}]]`).join(", ")})`:""} ~~~~`).join(`
`)}mapComments(e,t,n){if(t)return`* {{AfC comment|1=${e[0][1]}}} ~~~~`;let s={};for(let[i,a]of e)s[a]||(s[a]=[]),s[a].push(i);let o=Object.entries(s);return o.map(([i,a])=>`* {{AfC comment|1=${i}}}${o.length>1||!n?` (${a.map(c=>`[[${c}]]`).join(", ")})`:""} ~~~~`).join(`
`)}modifySectionData(e,{prepend:t,append:n}){let{fullSectionText:s,sectionText:o}=e;return t&&(e.sectionText=t+`
`+e.sectionText),n&&(e.sectionText+=`
`+n),e.fullSectionText=e.fullSectionText.replace(o,e.sectionText),e.pageText=e.pageText.replace(s,e.fullSectionText),e}async makeAllEditsCreations(e){for(let t of this.editsCreationsToMake){let n=t.type==="edit"?this.api.edit(t.title,t.transform):this.api.create(t.title,{summary:t.summary,watchlist:this.createdPageWatchMethod},t.text),s=document.createElement("a");s.target="_blank",s.href=mw.util.getUrl(t.title,"isRedirect"in t&&t.isRedirect?{redirect:"no"}:void 0),s.textContent=t.title,e.addLogEntry(`${t.type==="edit"?"Editing":"Creating"} ${s.outerHTML}...`),await n.catch(async(o,i)=>{o==="ratelimited"?(e.addLogEntry(`Rate limited. Waiting for 70 seconds... (resuming at ${new Date(Date.now()+7e4).toLocaleTimeString()})`,"warning"),await new Promise(a=>setTimeout(a,7e4)),e.addLogEntry("Continuing...","success"),await n.catch((a,c)=>{e.addLogEntry(`Error ${t.type==="edit"?"editing":"creating"} ${s.outerHTML}: ${c?.error.info??"Unknown error"} (${a}).`,"error")})):e.addLogEntry(`Error ${t.type==="edit"?"editing":"creating"} ${s.outerHTML}: ${i?.error.info??"Unknown error"} (${o}).`,"error")})}}parseSubtypeRequests(e,t){throw new Error("Not implemented.")}loadSubtypeElements(e){throw new Error("Not implemented.")}updateRequestColor(e,t){throw new Error("Not implemented.")}async performSubtypeActions(e,t,n){throw new Error("Not implemented.")}};Object.assign(E.prototype,OO.ui.ProcessDialog.prototype)});var S,z=C(()=>{"use strict";S=class{titleIndex;title;detailsElement;responderElement;dialog;templateParametersEditor;templateEditorsInfo=[];commentInput;tagSelectLayout;denyReasonLayout;closingReasonLayout;commentLayout;constructor(e,t,n,s,o){this.titleIndex=e,this.title=t,this.detailsElement=n,this.responderElement=s,this.dialog=o}setup(){let e=document.createElement("div"),t=document.createElement("b");t.textContent=this.title,e.append(t);let n=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(s=>new OO.ui.RadioOptionWidget({data:s,label:s}))});n.selectItemByLabel("None"),n.on("choose",s=>this.handleActionChange(s)),this.loadCommentLayout(),e.append(n.$element[0],this.commentLayout.$element[0]),this.responderElement.append(e)}handleActionChange(e){setTimeout(()=>this.dialog.updateSize(),0);let t=e.getData().toLowerCase();switch(this.updateActionsToTake({action:t}),this.dialog.updateRequestColor(this.detailsElement,this.titleIndex),this.tagSelectLayout&&this.tagSelectLayout.$element.hide(),this.templateParametersEditor&&(this.templateParametersEditor.style.display="none"),this.denyReasonLayout&&this.denyReasonLayout.$element.hide(),this.closingReasonLayout&&this.closingReasonLayout.$element.hide(),t){case"accept":{(!this.tagSelectLayout||!this.templateParametersEditor)&&this.loadTagSelectAndParametersEditor(),this.tagSelectLayout.$element.show(),this.templateParametersEditor.style.display="block";break}case"deny":{this.denyReasonLayout||this.loadDenyReasonLayout(),this.denyReasonLayout.$element.show();break}case"close":{this.closingReasonLayout||this.loadClosingReasonLayout(),this.closingReasonLayout.$element.show();break}}if(["accept","comment","close"].includes(t)){this.commentLayout.$element.show();let n=this.commentInput.getValue().trim();n?this.updateActionsToTake({comment:n}):this.updateActionsToTake({comment:void 0})}else this.commentLayout.$element.hide(),this.updateActionsToTake({comment:void 0})}loadTagSelectAndParametersEditor(){let e=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.dialog.redirectTemplates).map(([s,{redirect:o}])=>{if(!o)return{data:s,label:s};let i=new OO.ui.HtmlSnippet(`${s} <i>(redirect with possibilities)</i>`);return{data:s,label:i}})});e.getMenu().filterMode="substring",e.on("change",()=>{let s=e.getValue().sort((i,a)=>i.toLowerCase().localeCompare(a.toLowerCase()));e.getValue().join(";")!==s.join(";")&&e.setValue(s),this.updateActionsToTake({redirectTemplates:s});let o=0;for(let i of this.templateEditorsInfo){let a=s.includes(i.name);i.details.style.display=a?"block":"none",a&&o++}t.textContent=`Template parameters (${o>0?`for ${o} template${o>1?"s":""}`:"none to show"})`,n.style.display=o>0?"none":"block"}),this.tagSelectLayout=new OO.ui.FieldLayout(e,{classes:["afcrc-helper-tag-select-layout"],align:"inline",label:"Redirect templates:"}),this.commentLayout.$element[0].before(this.tagSelectLayout.$element[0]),this.templateParametersEditor=document.createElement("details"),this.templateParametersEditor.classList.add("afcrc-helper-template-parameters-container");let t=document.createElement("summary");t.textContent="Template parameters (none to show)",this.templateParametersEditor.append(t);for(let[s,o]of Object.entries(this.dialog.redirectTemplates)){let i=Object.entries(o.parameters);if(i.length===0)continue;let a=document.createElement("details");a.style.display="none";let c=document.createElement("summary");c.textContent=s,a.append(c);let u={name:s,details:a,parameters:[]};for(let[p,d]of i){let m=new OO.ui.TextInputWidget({placeholder:d.default?.toString(),required:d.required}),T=new OO.ui.FieldLayout(m,{label:new OO.ui.HtmlSnippet(`${p}${!d.label||p.toLowerCase()===d.label?.toLowerCase()?"":` (${d.label})`}${d.description?` (${d.description})`:""} (type: ${d.type}) ${d.suggested?" (suggested)":""}${d.example?` (example: "${d.example}")`:""}`),align:"inline"});a.append(T.$element[0]),u.parameters.push({name:p,aliases:d.aliases,editor:m})}this.templateParametersEditor.append(a),this.templateEditorsInfo.push(u)}this.updateActionsToTake({redirectTemplateParameters:this.templateEditorsInfo});let n=document.createElement("div");n.id="afcrc-helper-no-templates-message",n.textContent="No templates with parameters to display!",this.templateParametersEditor.append(n),this.commentLayout.$element[0].before(this.templateParametersEditor)}loadDenyReasonLayout(){let e=new OO.ui.ComboBoxInputWidget({classes:["afcrc-closing-reason-input"],placeholder:"autofill:unlikely",options:[["exists","existing pages"],["empty","empty submissions"],["notarget","nonexistent or no provided target"],["notitle","no title provided"],["unlikely","unlikely redirects"],["notredirect","article creation requests"],["externallink","external link redirects"],["editrequest","edit requests"],["notenglish","requests not in English"]].map(([t,n])=>({data:`autofill:${t}`,label:`Autofilled text for ${n}`}))});e.setValue("autofill:unlikely"),e.getMenu().selectItemByData("autofill:unlikely"),e.on("change",t=>{this.updateActionsToTake({denyReason:t||"autofill:unlikely"})}),this.denyReasonLayout=new OO.ui.FieldLayout(e,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'}),this.denyReasonLayout.$element.hide(),this.commentLayout.$element[0].before(this.denyReasonLayout.$element[0])}loadClosingReasonLayout(){let e=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([t,n])=>new OO.ui.MenuOptionWidget({data:n,label:t}))}});e.getMenu().selectItemByData("r"),e.getMenu().on("choose",t=>{this.updateActionsToTake({closingReason:{name:t.getLabel(),id:t.getData()}}),this.dialog.updateRequestColor(this.detailsElement,this.titleIndex)}),this.updateActionsToTake({closingReason:{name:"No response",id:"r"}}),this.closingReasonLayout=new OO.ui.FieldLayout(e,{align:"inline",label:"Closing reason:"}),this.closingReasonLayout.$element.hide(),this.commentLayout.$element[0].before(this.closingReasonLayout.$element[0])}loadCommentLayout(){this.commentInput=new OO.ui.TextInputWidget,this.commentInput.on("change",e=>{let t=e.trim();t?this.updateActionsToTake({comment:t}):this.updateActionsToTake({comment:void 0})}),this.commentLayout=new OO.ui.FieldLayout(this.commentInput,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"}),this.commentLayout.$element.hide()}updateActionsToTake(e){Object.assign(this.dialog.actionsToTake[this.titleIndex].requests[this.title],e)}}});var Q={};F(Q,{default:()=>N});var N,_=C(()=>{"use strict";V();z();N=class extends E{redirectTemplates;parsedRequests=[];actionsToTake=[];async load(){let e=await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:"User:Eejit43/scripts/redirect-helper.json"});this.redirectTemplates=JSON.parse(e.query.pages?.[0]?.revisions?.[0]?.slots?.main?.content||"{}"),super.load()}parseSubtypeRequests(e,t){let n={},s=[...t.matchAll(/\[\[(.*?)]]/g)].map(c=>c[1]?.trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean);if(s.length===0)return;n.pages=s;let o=/Target of redirect: ?\[\[(.*?)]]/.exec(e)?.[1].trim().replace(/^:/,"").replaceAll("_"," ");if(!o)return;n.target=o,n.reason=/reason: ?(.*?)\*source(?: \(if applicable\))?:/is.exec(e)?.[1].trim()??"",n.source=/source(?: \(if applicable\))?: ?(.*?)(?:<references \/>|\n\n)/is.exec(e)?.[1].trim()??"";let i=e.match(e.includes("<references />")?/<references \/>\n+(.*)/:new RegExp(`(?:<references \\/>${n.source?`|${n.source.replaceAll(/[\s#$()*+,.?[\\\]^{|}-]/g,"\\$&")}`:""})
+(.*)`))?.[1].trim(),a=i?/(?:Special:Contributions\/|User(?: talk)?:)(.*?)\|/.exec(i)?.[1].trim():null;n.requester=i&&a?{type:/\[\[User( talk)?:/.test(i)?"user":"ip",name:a}:null,this.parsedRequests.push(n),this.actionsToTake.push({target:n.target,requests:Object.fromEntries(s.map(c=>[c,{originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"}]))})}loadSubtypeElements(e){let t=this.parsedRequests[e],n=document.createElement("details");n.classList.add("afcrc-helper-request"),n.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));let s=document.createElement("summary");s.innerHTML=t.pages.map(l=>`<b>${l}</b>`).join(", ")+" \u2192 ",s.addEventListener("keyup",l=>{document.activeElement?.tagName==="INPUT"&&l.key===" "&&l.preventDefault()});let o=document.createElement("input");o.classList.add("afcrc-helper-target-editor"),o.style.width=`${t.target.length}ch`,o.value=t.target,o.addEventListener("input",()=>{o.value=o.value.replaceAll("_"," "),o.style.width=`${o.value.length}ch`,this.actionsToTake[e].target=o.value,i.href=mw.util.getUrl(o.value)}),s.append(o);let i=document.createElement("a");i.classList.add("afcrc-helper-external-link"),i.target="_blank",i.href=mw.util.getUrl(t.target),i.innerHTML=`
<svg viewbox="0 0 48 48">
<path d="M36 24c-1.2 0-2 0.8-2 2v12c0 1.2-0.8 2-2 2h-22c-1.2
0-2-0.8-2-2v-22c0-1.2 0.8-2 2-2h12c1.2 0 2-0.8 2-2s-0.8-2-2-2h-12c-3.4
0-6 2.6-6 6v22c0 3.4 2.6 6 6 6h22c3.4 0 6-2.6
6-6v-12c0-1.2-0.8-2-2-2z"></path>
<path d="M43.8 5.2c-0.2-0.4-0.6-0.8-1-1-0.2-0.2-0.6-0.2-0.8-0.2h-12c-1.2
0-2 0.8-2 2s0.8 2 2 2h7.2l-18.6 18.6c-0.8 0.8-0.8 2 0 2.8 0.4 0.4 0.8
0.6 1.4 0.6s1-0.2 1.4-0.6l18.6-18.6v7.2c0 1.2 0.8 2 2 2s2-0.8
2-2v-12c0-0.2 0-0.6-0.2-0.8z"></path>
</svg>`,s.append(i),n.append(s);let a=document.createElement("div");a.classList.add("afcrc-helper-request-info");let c=document.createElement("span");c.style.color="dimgray",c.textContent="None";let u=document.createElement("span");u.style.color="dimgray",u.textContent="Unknown";let p=document.createElement("div"),d=document.createElement("b");d.textContent="Reason: ",p.append(d),t.reason?p.append(t.reason):p.append(c.cloneNode(!0)),a.append(p);let m=document.createElement("div"),T=document.createElement("b");T.textContent="Source: ",m.append(T),t.source?m.append(t.source):m.append(c.cloneNode(!0)),a.append(m);let b=document.createElement("div"),R=document.createElement("b");if(R.textContent="Requester: ",b.append(R),t.requester){let l=document.createElement("a");l.target="_blank",l.href=t.requester.type==="user"?mw.util.getUrl(`User:${t.requester.name}`):mw.util.getUrl(`Special:Contributions/${t.requester.name}`),l.textContent=t.requester.name,b.append(l)}else b.append(u.cloneNode(!0));a.append(b),n.append(a),n.append(document.createElement("hr"));let g=document.createElement("div");g.classList.add("afcrc-helper-request-responder");for(let l of t.pages)new S(e,l,n,g,this).setup();n.append(g),this.$body.append(n),this.updateSize()}updateRequestColor(e,t){let n=Object.values(this.actionsToTake[t].requests),s=n.every(c=>c.action==="accept"||c.action==="deny"),o=n.find(c=>c.action==="close")?.closingReason?.id,i=n.every(c=>c.action==="close"&&c.closingReason?.id===o),a="";if(s){let c=n.filter(p=>p.action==="accept").length,u=n.filter(p=>p.action==="deny").length;c>0&&u>0?a="#fff17e":c>0?a="#a0ffa0":a="#ffcece"}else i&&(o==="r"?a="#ffcece":o==="s"?a="#90c090":a="#b8b8b8");e.style.backgroundColor=a}async performSubtypeActions(e,t,n){if(this.actionsToTake.some(o=>Object.values(o.requests).some(i=>i.action!=="none"))){for(let{target:i,requests:a}of this.actionsToTake){let c=Object.values(a).some(l=>l.action==="accept"||l.action==="deny"),u=Object.values(a).every(l=>l.action==="accept"||l.action==="deny"),p=Object.values(a).find(l=>l.action==="close")?.closingReason?.id,d=Object.values(a).every(l=>l.action==="close"&&l.closingReason?.id===p),m=[],T=[],b=[],R=Object.keys(a).length;for(let[l,y]of Object.entries(a))switch(y.action){case"accept":{c&&!u?e.addLogEntry(`Not all requests to "${i}" were accepted or denied, the handling of "${l}" will be ignored.`,"warning"):(m.push(l),y.comment&&b.push([l,y.comment]),t.accepted++);break}case"deny":{c&&!u?e.addLogEntry(`Not all requests to "${i}" were accepted or denied, the handling of "${l}" is being ignored.`,"warning"):(T.push([l,y.denyReason]),t.denied++);break}case"comment":{y.comment?(b.push([l,y.comment]),t["commented on"]++):e.addLogEntry(`The request to create "${l}" \u2192 "${i}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{d?(y.comment&&b.push([l,y.comment]),t.closed++):e.addLogEntry(`Not all requests to "${i}" were closed with the same reason, the handling of "${l}" is being ignored.`,"warning");break}}let g={pageText:n,...Object.values(a)[0].originalText};if(b.length>0&&(g=this.modifySectionData(g,{append:this.mapComments(b,R===1,b.length===R)})),u){let l;if(m.length>0&&T.length>0){l="p";let y=`* {{subst:AfC redirect}} (${m.map(O=>`[[${O}]]`).join(", ")}) ~~~~`,q=this.mapDeniedReasons(T,!1,!1);for(let O of m)this.handleAcceptedRedirect(O,a[O],i);g=this.modifySectionData(g,{append:`${y}
${q}`})}else if(m.length>0){l="a";for(let y of m)this.handleAcceptedRedirect(y,a[y],i);g=this.modifySectionData(g,{append:`* {{subst:AfC redirect${m.length>1?"|all":""}}} ~~~~`})}else l="d",g=this.modifySectionData(g,{append:this.mapDeniedReasons(T,R===1,!0)});g=this.modifySectionData(g,{prepend:`{{AfC-c|${l}}}`,append:"{{AfC-c|b}}"})}else d&&(g=this.modifySectionData(g,{prepend:`{{AfC-c|${p}}}`,append:"{{AfC-c|b}}"}));n=g.pageText}if(this.beforeText+this.pageContent===n)return e.addLogEntry("No requests have been handled (page content identical)!");let o=Object.entries(t).filter(([,i])=>i>0).map(([i,a])=>`${i} ${a}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:n,summary:`Handling AfC redirect requests (${o})${this.scriptMessage}`})}),await this.makeAllEditsCreations(e),e.addLogEntry("All changes made, click below to reload!","success"),e.showReload()}else e.addLogEntry("No requests have been handled!")}handleAcceptedRedirect(e,t,n){let s=t.redirectTemplates&&t.redirectTemplates.length>0?t.redirectTemplates.map(i=>{let a=t.redirectTemplateParameters?.find(p=>p.name===i);if(!a)return`{{${i}}}`;let c=a.parameters.findLastIndex((p,d)=>p.name===(d+1).toString()&&p.editor.getValue().trim()),u=a.parameters.map((p,d)=>{let m=p.editor.getValue().trim();return!m&&d>c?null:`|${p.name===(d+1).toString()?"":`${p.name}=`}${m}`}).filter(Boolean).join("");return`{{${i}${u}}}`}):null,o=mw.Title.newFromText(e);this.editsCreationsToMake.push({type:"create",isRedirect:!0,title:o.getPrefixedText(),text:`#REDIRECT [[${n}]]${s?`
{{Redirect category shell|
${s.join(`
`)}
}}`:""}`,summary:`Creating redirect to [[${n}]] as requested at [[WP:AFC/R]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:o.getTalkPage().getPrefixedText(),text:`{{WikiProject banner shell|
{{WikiProject Articles for creation|ts={{subst:LOCALTIMESTAMP}}|reviewer=${mw.config.get("wgUserName")}}}
}}`,summary:`Adding [[Wikipedia:WikiProject Articles for creation|WikiProject Articles for creation]] banner${this.scriptMessage}`})}}});var x,J=C(()=>{"use strict";x=class extends OO.ui.TextInputWidget{api=new mw.Api;constructor(e){super(e),OO.ui.mixin.LookupElement.call(this,e)}getLookupRequest=()=>{let e=this.getValue(),t=$.Deferred();e||t.resolve([]);let n=mw.Title.newFromText(e);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:n?.getMainText()??e,generator:"allpages",prop:"categories"}).catch(()=>null).then(s=>{if(s?.query?.pages){let o=s.query.pages.filter(i=>!i.categories?.some(a=>a.title==="Category:Wikipedia soft redirected categories")).map(i=>{let a=i.title.split(":")[1];return{data:a,label:a}});this.emit("showing-values",o),t.resolve(o)}else t.resolve([])}),t.promise({abort(){}})};getLookupCacheDataFromResponse=e=>e??[];getLookupMenuOptionsFromData=e=>e.map(({data:t,label:n})=>new OO.ui.MenuOptionWidget({data:t,label:n}))};Object.assign(x.prototype,OO.ui.mixin.LookupElement.prototype)});var v,G=C(()=>{"use strict";v=class extends OO.ui.TextInputWidget{api=new mw.Api;constructor(e){super(e),OO.ui.mixin.LookupElement.call(this,e)}getLookupRequest=()=>{let e=this.getValue(),t=$.Deferred();e||t.resolve([]);let n=mw.Title.newFromText(e);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:n?.getNamespaceId()??0,gapprefix:n?.getMainText()??e,generator:"allpages"}).catch(()=>null).then(s=>{if(s?.query?.pages){let o=s.query.pages.map(i=>({data:i.title,label:i.title}));this.emit("showing-values",o),t.resolve(o)}else t.resolve([])}),t.promise({abort(){}})};getLookupCacheDataFromResponse=e=>e??[];getLookupMenuOptionsFromData=e=>e.map(({data:t,label:n})=>new OO.ui.MenuOptionWidget({data:t,label:n}))};Object.assign(v.prototype,OO.ui.mixin.LookupElement.prototype)});var Y={};F(Y,{default:()=>U});var U,K=C(()=>{"use strict";J();V();G();U=class extends E{parsedRequests=[];actionsToTake=[];parseSubtypeRequests(e,t){let n={},s=/:?Category:(.*?)(]]|$)/.exec(t)?.[1].trim();if(!s)return;n.category=s.replaceAll("_"," "),n.examples=[...(/example pages which belong to this category:(.*?)(parent category\/categories:|\n\[\[(special:contributions\/|user:))/is.exec(e)?.[1]??"").matchAll(/\*\s*(?:\[\[)?(.*?)(\||]]|\s*?\n)/g)].map(u=>u[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean)??[],n.parents=[...(/parent category\/categories:(.*?)(\n\n|\n\[\[(special:contributions\/|user:))/is.exec(e)?.[1]??"").matchAll(/(?<!\|)#?:?Category:(.*?)(\||]]|\s*?\n)/g)].map(u=>u[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean)??[];let o=e.indexOf("[[User:"),i=e.indexOf("[[User talk:"),a=e.indexOf("[[Special:Contributions/"),c=Math.min(...[o,i,a].filter(u=>u!==-1));n.requester=c===Number.POSITIVE_INFINITY?null:c===a?{type:"ip",name:/\[\[Special:Contributions\/(.*?)(\||]])/.exec(e)[1].trim()}:{type:"user",name:/\[\[User(?: talk)?:(.*?)(\||]])/.exec(e)[1].trim()},n.requester?.name||(n.requester=null),this.parsedRequests.push(n),this.actionsToTake.push({category:n.category,examples:n.examples,parents:n.parents,originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"})}loadSubtypeElements(e){let t=this.parsedRequests[e],n=document.createElement("details");n.classList.add("afcrc-helper-request"),n.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));let s=document.createElement("summary");s.innerHTML=`<b>Category:${t.category}</b>`,n.append(s);let o=document.createElement("div");o.classList.add("afcrc-helper-request-info");let i=document.createElement("span");i.style.color="dimgray",i.textContent="None";let a=document.createElement("span");a.style.color="dimgray",a.textContent="Unknown";let c=document.createElement("div"),u=document.createElement("b");if(u.textContent="Examples: ",c.append(u),t.examples.length>0)for(let[r,f]of t.examples.entries()){let w=document.createElement("a");w.target="_blank",w.href=mw.util.getUrl(f),w.textContent=f,c.append(w),r!==t.examples.length-1&&c.append(", ")}else c.append(i.cloneNode(!0));o.append(c);let p=document.createElement("div"),d=document.createElement("b");if(d.textContent="Parents: ",p.append(d),t.parents.length>0)for(let[r,f]of t.parents.entries()){let w=document.createElement("a");w.target="_blank",w.href=mw.util.getUrl(`Category:${f}`),w.textContent=f,p.append(w),r!==t.parents.length-1&&p.append(", ")}else p.append(i.cloneNode(!0));o.append(p);let m=document.createElement("div"),T=document.createElement("b");if(T.textContent="Requester: ",m.append(T),t.requester){let r=document.createElement("a");r.target="_blank",r.href=t.requester.type==="user"?mw.util.getUrl(`User:${t.requester.name}`):mw.util.getUrl(`Special:Contributions/${t.requester.name}`),r.textContent=t.requester.name,m.append(r)}else m.append(a.cloneNode(!0));o.append(m),n.append(o),n.append(document.createElement("hr"));let b=document.createElement("div");b.classList.add("afcrc-helper-request-responder");let R=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(r=>new OO.ui.RadioOptionWidget({data:r,label:r}))});R.selectItemByLabel("None"),R.on("choose",()=>{setTimeout(()=>this.updateSize(),0);let r=R.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[e].action=r,["comment","close"].includes(r)){j.$element.show();let f=I.getValue().trim();f?this.actionsToTake[e].comment=f:delete this.actionsToTake[e].comment}else j.$element.hide(),delete this.actionsToTake[e].comment;switch(this.updateRequestColor(n,e),q.$element.hide(),P.$element.hide(),M.$element.hide(),W.$element.hide(),r){case"accept":{q.$element.show(),P.$element.show();break}case"deny":{M.$element.show();break}case"close":{W.$element.show();break}}});let g=new v({placeholder:"Add pages here"});g.on("change",()=>{let r=g.getValue();r=r.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),r=r.replace(/^:/,""),r.length>0&&g.setValue(r[0].toUpperCase()+r.slice(1).replaceAll("_"," "))}),g.on("showing-values",r=>{for(let f of r)l.addAllowedValue(f.data)});let l=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:g});l.on("change",()=>{let r=l.getValue().sort((f,w)=>f.toLowerCase().localeCompare(w.toLowerCase()));l.getValue().join(";")!==r.join(";")&&l.setValue(r),this.actionsToTake[e].examples=r});let{examples:y}=this.actionsToTake[e];for(let r of y)l.addAllowedValue(r);l.setValue(y);let q=new OO.ui.FieldLayout(l,{align:"inline",label:"Pages to categorize:"});q.$element.hide();let O=new x({placeholder:"Add categories here"});O.on("change",()=>{let r=O.getValue();r=r.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),r=r.replace(/^Category:/,""),r.length>0&&O.setValue(r[0].toUpperCase()+r.slice(1).replaceAll("_"," "))}),O.on("showing-values",r=>{for(let f of r)k.addAllowedValue(f.data)});let k=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:O});k.on("change",()=>{let r=k.getValue().sort((f,w)=>f.toLowerCase().localeCompare(w.toLowerCase()));k.getValue().join(";")!==r.join(";")&&k.setValue(r),this.actionsToTake[e].parents=r});let{parents:H}=this.actionsToTake[e];for(let r of H)k.addAllowedValue(r);k.setValue(H);let P=new OO.ui.FieldLayout(k,{align:"inline",label:"Categories:"});P.$element.hide();let A=new OO.ui.ComboBoxInputWidget({classes:["afcrc-closing-reason-input"],placeholder:"autofill:unlikely",options:[["exists","existing categories"],["empty","empty submissions"],["unlikely","categories that are unlikely to have enough pages"],["notcategory","page creation requests"],["notenglish","requests not in English"]].map(([r,f])=>({data:`autofill:${r}`,label:`Autofilled text for ${f}`}))});A.on("change",()=>{this.actionsToTake[e].denyReason=A.getValue()||"autofill:unlikely"}),A.setValue("autofill:unlikely"),A.getMenu().selectItemByData("autofill:unlikely");let M=new OO.ui.FieldLayout(A,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'});M.$element.hide();let D=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([r,f])=>new OO.ui.MenuOptionWidget({data:f,label:r}))}});D.getMenu().on("choose",()=>{let r=D.getMenu().findSelectedItem();this.actionsToTake[e].closingReason={name:r.getLabel(),id:r.getData()},this.updateRequestColor(n,e)}),D.getMenu().selectItemByData("r"),this.actionsToTake[e].closingReason={name:"No response",id:"r"};let W=new OO.ui.FieldLayout(D,{align:"inline",label:"Closing reason:"});W.$element.hide();let I=new OO.ui.TextInputWidget;I.on("change",()=>{let r=I.getValue().trim();r?this.actionsToTake[e].comment=r:delete this.actionsToTake[e].comment});let j=new OO.ui.FieldLayout(I,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});j.$element.hide(),b.append(R.$element[0],q.$element[0],P.$element[0],M.$element[0],W.$element[0],j.$element[0]),n.append(b),this.$body.append(n),this.updateSize()}updateRequestColor(e,t){let{action:n}=this.actionsToTake[t],s="";n==="accept"?s="#a0ffa0":n==="deny"?s="#ffcece":n==="close"&&(this.actionsToTake[t].closingReason?.id==="r"?s="#ffcece":this.actionsToTake[t].closingReason?.id==="s"?s="#90c090":s="#b8b8b8"),e.style.backgroundColor=s}async performSubtypeActions(e,t,n){if(this.actionsToTake.some(o=>o.action!=="none")){for(let i of this.actionsToTake){let a={pageText:n,...i.originalText};switch(i.action){case"accept":{a=this.modifySectionData(a,{prepend:"{{AfC-c|a}}",append:`* {{subst:AfC category}} ~~~~
{{AfC-c|b}}`}),this.handleAcceptedCategory(i),t.accepted++;break}case"deny":{a=this.modifySectionData(a,{prepend:"{{AfC-c|d}}",append:`* ${this.formatDeniedReason(i.denyReason)} ~~~~
{{AfC-c|b}}`}),t.denied++;break}case"comment":{i.comment?(a=this.modifySectionData(a,{append:`* {{AfC comment|1=${i.comment}}} ~~~~`}),t["commented on"]++):e.addLogEntry(`The request to create "${i.category}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{a=this.modifySectionData(a,{prepend:`{{AfC-c|${i.closingReason.id}}}`,append:(i.comment?`* {{AfC comment|1=${i.comment}}} ~~~~`:"")+`
{{AfC-c|b}`}),t.closed++;break}}n=a.pageText}if(this.beforeText+this.pageContent===n)return e.addLogEntry("No requests have been handled (page content identical)!");let o=Object.entries(t).filter(([,i])=>i>0).map(([i,a])=>`${i} ${a}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:n,summary:`Handling AfC category requests (${o})${this.scriptMessage}`})}),await this.makeAllEditsCreations(e),e.addLogEntry("All changes made, click below to reload!","success"),e.showReload()}else e.addLogEntry("No requests have been handled!")}handleAcceptedCategory(e){this.editsCreationsToMake.push({type:"create",isRedirect:!1,title:`Category:${e.category}`,text:e.parents.map(t=>`[[Category:${t}]]`).join(`
`),summary:`Creating category as requested at [[WP:AFC/C]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:`Category talk:${e.category}`,text:`{{WikiProject banner shell|
{{WikiProject Articles for creation|ts={{subst:LOCALTIMESTAMP}}|reviewer=${mw.config.get("wgUserName")}}}
}}`,summary:`Adding [[Wikipedia:WikiProject Articles for creation|WikiProject Articles for creation]] banner${this.scriptMessage}`},...e.examples.map(t=>({type:"edit",title:t,transform:({content:n})=>({text:`${n}
[[Category:${e.category}]]`,summary:`Adding page to [[:Category:${e.category}]] as requested at [[WP:AFC/C]]${this.scriptMessage}`})})))}}});mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],async()=>{let{default:h}=await Promise.resolve().then(()=>(_(),Q)),{default:e}=await Promise.resolve().then(()=>(K(),Y)),t=mw.config.get("wgPageName").replaceAll("_"," "),n=t==="Wikipedia:Articles for creation/Redirects";if(!n&&!(t==="Wikipedia:Articles for creation/Categories"))return;let o=n?"redirect":"category";mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#",`Handle ${o} creation requests`,"afcrc-helper").addEventListener("click",a=>{a.preventDefault();let c=new OO.ui.WindowManager;document.body.append(c.$element[0]);let u=o==="redirect"?h:e,p=new u(o,t,window.afcrcConfiguration?.createdPageWatchMethod);c.addWindows([p]),p.open(),p.load()})});})();
// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvc2hvdy1hY3Rpb25zLWRpYWxvZy50cyIsICIuLi8uLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9oZWxwZXItZGlhbG9nLnRzIiwgIi4uLy4uL3NjcmlwdHMvYWZjcmMtaGVscGVyL3JlZGlyZWN0LXJlcXVlc3QtaGFuZGxlci50cyIsICIuLi8uLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9yZWRpcmVjdHMtZGlhbG9nLnRzIiwgIi4uLy4uL3NjcmlwdHMvYWZjcmMtaGVscGVyL2NhdGVnb3J5LWlucHV0LXdpZGdldC50cyIsICIuLi8uLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9wYWdlLWlucHV0LXdpZGdldC50cyIsICIuLi8uLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9jYXRlZ29yaWVzLWRpYWxvZy50cyIsICIuLi8uLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9hZmNyYy1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhbiBhY3Rpb24gZGlhbG9nLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY3Rpb25zRGlhbG9nIGV4dGVuZHMgT08udWkuRGlhbG9nIHtcbiAgICBwcml2YXRlIGNvbnRlbnRMYXlvdXQhOiBPTy51aS5QYW5lbExheW91dDtcbiAgICBwcml2YXRlIGxvZ091dHB1dCE6IEhUTUxEaXZFbGVtZW50O1xuICAgIHByaXZhdGUgY2xvc2VCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoeyBzaXplOiAnbGFyZ2UnIH0pO1xuXG4gICAgICAgIEFjdGlvbnNEaWFsb2cuc3RhdGljLm5hbWUgPSAnQWN0aW9uc0RpYWxvZyc7XG4gICAgICAgIEFjdGlvbnNEaWFsb2cuc3RhdGljLnRpdGxlID0gJ0FjdGlvbnMnO1xuICAgIH1cblxuICAgIGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICAgIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzKTtcblxuICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4uYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyIGRpdiB7XG5tYXJnaW4tYmxvY2s6IDhweDtcbn1gKTtcblxuICAgICAgICB0aGlzLmNvbnRlbnRMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy5sb2dPdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5sb2dPdXRwdXQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH0pO1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoKSk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50LmFwcGVuZCh0aGlzLmxvZ091dHB1dCwgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsb2cgZW50cnkgdG8gdGhlIGRpYWxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9nRW50cnkobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBPTy51aS5NZXNzYWdlV2lkZ2V0LlR5cGUgPSAnbm90aWNlJykge1xuICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlLCBpbmxpbmU6IHRydWUsIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQobWVzc2FnZSkgfSk7XG5cbiAgICAgICAgdGhpcy5sb2dPdXRwdXQuYXBwZW5kKG1lc3NhZ2VXaWRnZXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24uc2Nyb2xsRWxlbWVudEludG9WaWV3KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY2xvc2UgYnV0dG9uIGFuZCBhZGRzIGEgcmVsb2FkIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2hvd1JlbG9hZCgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudC5yZW1vdmUoKTtcblxuICAgICAgICBjb25zdCByZWxvYWRCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdSZWxvYWQnLCBmbGFnczogWydwcmltYXJ5J10gfSk7XG4gICAgICAgIHJlbG9hZEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCkpO1xuXG4gICAgICAgIHRoaXMuY29udGVudExheW91dC4kZWxlbWVudC5hcHBlbmQocmVsb2FkQnV0dG9uLiRlbGVtZW50KTtcbiAgICB9XG59XG5cbk9iamVjdC5hc3NpZ24oQWN0aW9uc0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpRWRpdFBhZ2VQYXJhbXMsIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBNZWRpYVdpa2lEYXRhRXJyb3IsIFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBXYXRjaE1ldGhvZCB9IGZyb20gJy4vYWZjcmMtaGVscGVyJztcbmltcG9ydCBBY3Rpb25zRGlhbG9nIGZyb20gJy4vc2hvdy1hY3Rpb25zLWRpYWxvZyc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RSZXF1ZXN0ZXIgPSB7IHR5cGU6ICd1c2VyJyB8ICdpcCc7IG5hbWU6IHN0cmluZyB9IHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEFjdGlvblR5cGUgPSAnYWNjZXB0JyB8ICdkZW55JyB8ICdjb21tZW50JyB8ICdjbG9zZScgfCAnbm9uZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEFjdGlvbiB7XG4gICAgb3JpZ2luYWxUZXh0OiB7IGZ1bGxTZWN0aW9uVGV4dDogc3RyaW5nOyBzZWN0aW9uVGV4dDogc3RyaW5nIH07XG4gICAgYWN0aW9uOiBSZXF1ZXN0QWN0aW9uVHlwZTtcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGRlbnlSZWFzb24/OiBzdHJpbmc7XG4gICAgY2xvc2luZ1JlYXNvbj86IHsgbmFtZTogc3RyaW5nOyBpZDogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB0aGF0IGhhbmRsZXMgcmVkaXJlY3QgYW5kIGNhdGVnb3J5IHJlcXVlc3RzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIZWxwZXJEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICBwcm90ZWN0ZWQgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgcHJvdGVjdGVkIHNjcmlwdE1lc3NhZ2UgPSAnIChbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL2FmY3JjLWhlbHBlcnxhZmNyYy1oZWxwZXJdXSknO1xuXG4gICAgcHJpdmF0ZSByZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknO1xuICAgIHByb3RlY3RlZCBwYWdlVGl0bGU6IHN0cmluZztcblxuICAgIHByaXZhdGUgY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZDogV2F0Y2hNZXRob2Q7XG5cbiAgICBwcm90ZWN0ZWQgYmVmb3JlVGV4dCE6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcGFnZUNvbnRlbnQhOiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgcGFyc2VkUmVxdWVzdHMhOiB1bmtub3duW107XG4gICAgcHJvdGVjdGVkIGVkaXRzQ3JlYXRpb25zVG9NYWtlOiAoXG4gICAgICAgIHwgeyB0eXBlOiAnZWRpdCc7IHRpdGxlOiBzdHJpbmc7IHRyYW5zZm9ybTogKGRhdGE6IHsgY29udGVudDogc3RyaW5nIH0pID0+IEFwaUVkaXRQYWdlUGFyYW1zIH1cbiAgICAgICAgfCB7IHR5cGU6ICdjcmVhdGUnOyBpc1JlZGlyZWN0OiBib29sZWFuOyB0aXRsZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IHN1bW1hcnk6IHN0cmluZyB9XG4gICAgKVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknLCBwYWdlVGl0bGU6IHN0cmluZywgY3JlYXRlZFdhdGNoTWV0aG9kOiBXYXRjaE1ldGhvZCB8IHVuZGVmaW5lZCkge1xuICAgICAgICBzdXBlcih7IHNpemU6ICdsYXJnZScgfSk7XG5cbiAgICAgICAgSGVscGVyRGlhbG9nLnN0YXRpYy5uYW1lID0gJ0FmY3JjSGVscGVyRGlhbG9nJztcbiAgICAgICAgSGVscGVyRGlhbG9nLnN0YXRpYy50aXRsZSA9ICdhZmNyYy1oZWxwZXInO1xuICAgICAgICBIZWxwZXJEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfSxcbiAgICAgICAgICAgIHsgYWN0aW9uOiAnc2F2ZScsIGxhYmVsOiAnUnVuJywgZmxhZ3M6IFsncHJpbWFyeScsICdwcm9ncmVzc2l2ZSddIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHRoaXMucmVxdWVzdFBhZ2VUeXBlID0gcmVxdWVzdFBhZ2VUeXBlO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCA9XG4gICAgICAgICAgICBjcmVhdGVkV2F0Y2hNZXRob2QgJiYgWydub2NoYW5nZScsICdwcmVmZXJlbmNlcycsICd1bndhdGNoJywgJ3dhdGNoJ10uaW5jbHVkZXMoY3JlYXRlZFdhdGNoTWV0aG9kKVxuICAgICAgICAgICAgICAgID8gY3JlYXRlZFdhdGNoTWV0aG9kXG4gICAgICAgICAgICAgICAgOiAncHJlZmVyZW5jZXMnO1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLW9wZW4nKTtcblxuICAgICAgICBtdy51dGlsLmFkZENTUyhgXG5ib2R5LmFmY3JjLWhlbHBlci1vcGVuICNtdy10ZWxlcG9ydC10YXJnZXQge1xuICAgIHotaW5kZXg6IDUwMDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0IHtcbiAgICBtYXJnaW46IDEwcHg7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7XG4gICAgcGFkZGluZzogNXB4O1xuICAgIGNvbG9yOiAjMjAyMTIyO1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3Qgc3VtbWFyeSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYWZjcmMtaGVscGVyLXRhcmdldC1lZGl0b3Ige1xuICAgIG1pbi13aWR0aDogMWNoO1xuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gNGNoKTtcbiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlO1xufVxuXG4uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsgc3ZnIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDFlbTtcbiAgICBoZWlnaHQ6IDFlbTtcbiAgICBmaWxsOiBjdXJyZW50Q29sb3I7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvLFxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciB7XG4gICAgbWFyZ2luOiA1cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvID4gZGl2LFxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciA+IGRpdiB7XG4gICAgbWFyZ2luLWJsb2NrOiA4cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgPiBkaXY6bGFzdC1vZi10eXBlIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyIC5vby11aS1maWVsZExheW91dCB7XG4gICAgbWFyZ2luLWxlZnQ6IDhweDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciAub28tdWktZmllbGRMYXlvdXQtaGVhZGVyIHtcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XG59XG5cbi5hZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvIHtcbiAgICBtYXJnaW4tdG9wOiA4cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvIC5vby11aS1yYWRpb09wdGlvbldpZGdldCB7XG4gICAgZGlzcGxheTogaW5saW5lO1xuICAgIHBhZGRpbmc6IDhweDtcbn1cblxuLmFmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0LFxuLmFmY3JjLWNvbW1lbnQtaW5wdXQge1xuICAgIG1heC13aWR0aDogNTAlO1xufVxuXG4uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyLFxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBtYXJnaW4tYmxvY2s6IDEwcHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2EyYTliMTtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIHtcbiAgICBtYXJnaW4tbGVmdDogOHB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIHN1bW1hcnkge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxzIHtcbiAgICBtYXJnaW4tYmxvY2s6IDVweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyO1xufVxuXG4jYWZjcmMtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlIHtcbiAgICBwYWRkaW5nOiA1cHg7XG59YCk7XG4gICAgfVxuXG4gICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoIWFjdGlvbiB8fCBhY3Rpb24gPT09ICdjYW5jZWwnKVxuICAgICAgICAgICAgcmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBPTy51aVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmZpcm0oJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjbG9zZT8gQWxsIGNoYW5nZXMgd2lsbCBiZSBkaXNjYXJkZWQuJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChjb25maXJtZWQpID0+IChjb25maXJtZWQgPyB0aGlzLmNsb3NlKCkgOiBudWxsKSk7XG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAnc2F2ZScpXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybUFjdGlvbnMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBlbHNlIHJldHVybiBIZWxwZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgIH07XG5cbiAgICBnZXRUZWFyZG93blByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBIZWxwZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdhZmNyYy1oZWxwZXItb3BlbicpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTG9hZCBlbGVtZW50cyBpbiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCBwYWdlUmV2aXNpb24gPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHQ7XG5cbiAgICAgICAgdGhpcy5wYWdlQ29udGVudCA9IHBhZ2VSZXZpc2lvbi5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcblxuICAgICAgICB0aGlzLnBhcnNlUmVxdWVzdHMoKTtcbiAgICAgICAgdGhpcy5sb2FkSW5wdXRFbGVtZW50cygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyByZXF1ZXN0cyBmcm9tIHRoZSBwYWdlIGNvbnRlbnQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYXJzZVJlcXVlc3RzKCkge1xuICAgICAgICB0aGlzLmJlZm9yZVRleHQgPSAvXiguKj8pPT0vcy5leGVjKHRoaXMucGFnZUNvbnRlbnQpIVsxXTtcblxuICAgICAgICB0aGlzLnBhZ2VDb250ZW50ID0gdGhpcy5wYWdlQ29udGVudC5yZXBsYWNlKC9eLio/PT0vcywgJz09Jyk7XG5cbiAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBbLi4udGhpcy5wYWdlQ29udGVudC5tYXRjaEFsbCgvXj09Lio/PT0kKFxccyooPyE9PVtePV0pLiopKi9naW0pXS5tYXAoKG1hdGNoKSA9PiBtYXRjaFswXSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZWN0aW9uVGV4dCBvZiBzZWN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgaXNDbG9zZWQgPSAve3thZmMtY1xcfC9pLnRlc3Qoc2VjdGlvblRleHQpO1xuICAgICAgICAgICAgaWYgKGlzQ2xvc2VkKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3Qgc2VjdGlvbkhlYWRlciA9IC9ePT0oLio/KT09JC9tLmV4ZWMoc2VjdGlvblRleHQpIVsxXS50cmltKCk7XG5cbiAgICAgICAgICAgIHRoaXMucGFyc2VTdWJ0eXBlUmVxdWVzdHMoc2VjdGlvblRleHQsIHNlY3Rpb25IZWFkZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGlucHV0IGVsZW1lbnRzIGluIHRoZSBkaWFsb2cuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkSW5wdXRFbGVtZW50cygpIHtcbiAgICAgICAgaWYgKHRoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGluZGV4ID0gMDtcblxuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IDU7XG4gICAgICAgICAgICAgICAgY29uc3QgZW5kSW5kZXggPSBNYXRoLm1pbihpbmRleCArIGJhdGNoU2l6ZSwgdGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyB0aXRsZTogT08udWkuTGFiZWxXaWRnZXQgfSkudGl0bGUuc2V0TGFiZWwoXG4gICAgICAgICAgICAgICAgICAgIGBhZmNyYy1oZWxwZXIgKGxvYWRpbmcgJHtpbmRleCArIDF9LSR7ZW5kSW5kZXh9LyR7dGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGh9IHJlcXVlc3RzKWAsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHN1YkluZGV4ID0gaW5kZXg7IHN1YkluZGV4IDwgZW5kSW5kZXg7IHN1YkluZGV4KyspIHRoaXMubG9hZFN1YnR5cGVFbGVtZW50cyhzdWJJbmRleCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggPCB0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGVuZEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGhhbmRsZSwgMCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyB0aXRsZTogT08udWkuTGFiZWxXaWRnZXQgfSkudGl0bGUuc2V0TGFiZWwoXG4gICAgICAgICAgICAgICAgICAgICAgICBgYWZjcmMtaGVscGVyICgke3RoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RofSByZXF1ZXN0cyBsb2FkZWQpYCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGhhbmRsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZVdpZGdldCA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHsgdHlwZTogJ25vdGljZScsIGxhYmVsOiAnTm8gdmFsaWQgcmVxdWVzdHMgdG8gaGFuZGxlIScgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VXaWRnZXRMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgIG1lc3NhZ2VXaWRnZXRMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKG1lc3NhZ2VXaWRnZXQuJGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQobWVzc2FnZVdpZGdldExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYWxsIGFjdGlvbnMgYW5kIGxvZ3MgdGhlaXIgcmVzdWx0cy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHBlcmZvcm1BY3Rpb25zKCkge1xuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgY29uc3Qgc2hvd0FjdGlvbnNEaWFsb2cgPSBuZXcgQWN0aW9uc0RpYWxvZygpO1xuICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3Nob3dBY3Rpb25zRGlhbG9nXSk7XG4gICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLm9wZW4oKTtcblxuICAgICAgICBjb25zdCBjb3VudHMgPSB7ICdhY2NlcHRlZCc6IDAsICdkZW5pZWQnOiAwLCAnY29tbWVudGVkIG9uJzogMCwgJ2Nsb3NlZCc6IDAgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cblxuICAgICAgICBjb25zdCBuZXdQYWdlVGV4dCA9IChcbiAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgKS5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcblxuICAgICAgICB0aGlzLnBlcmZvcm1TdWJ0eXBlQWN0aW9ucyhzaG93QWN0aW9uc0RpYWxvZywgY291bnRzLCBuZXdQYWdlVGV4dCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9ybWF0cyBhIHJlcXVlc3QgZGVuaWFsIHJlYXNvbiB0byBhIHt7c3Vic3Q6QWZDIHJlZGlyZWN0L2NhdGVnb3J5fX0gY2FsbC5cbiAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gdG8gZm9ybWF0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBmb3JtYXREZW5pZWRSZWFzb24ocmVhc29uOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXJhbWV0ZXJzID0gcmVhc29uLnN0YXJ0c1dpdGgoJ2F1dG9maWxsOicpID8gL2F1dG9maWxsOihcXHcrKS8uZXhlYyhyZWFzb24pIVsxXSA6IGBkZWNsaW5lfDI9JHtyZWFzb259YDtcblxuICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVhc29uaW5nID0gcmVhc29uLmluY2x1ZGVzKCcsJykgPyAnICcgKyByZWFzb24uc2xpY2UocmVhc29uLmluZGV4T2YoJywnKSArIDEpLnRyaW0oKSA6ICcnO1xuXG4gICAgICAgIHJldHVybiBge3tzdWJzdDpBZkMgJHt0aGlzLnJlcXVlc3RQYWdlVHlwZX18JHt0ZW1wbGF0ZVBhcmFtZXRlcnN9fX0ke2FkZGl0aW9uYWxSZWFzb25pbmd9YDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGEgZ3JvdXAgb2YgZGVuaWVkIHJlYXNvbnMuXG4gICAgICogQHBhcmFtIGRlbmllZFBhZ2VzIFRoZSBwYWdlcyB0byBtYXAuXG4gICAgICogQHBhcmFtIHNpbmd1bGFyUmVxdWVzdCBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIHRoZSBvbmx5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGFsbFJlcXVlc3RzIFdoZXRoZXIgYWxsIHJlcXVlc3RzIGFyZSBiZWluZyBtYXBwZWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1hcERlbmllZFJlYXNvbnMoZGVuaWVkUGFnZXM6IHN0cmluZ1tdW10sIHNpbmd1bGFyUmVxdWVzdDogYm9vbGVhbiwgYWxsUmVxdWVzdHM6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHNpbmd1bGFyUmVxdWVzdCkgcmV0dXJuIGAqICR7dGhpcy5mb3JtYXREZW5pZWRSZWFzb24oZGVuaWVkUGFnZXNbMF1bMV0pfSB+fn5+YDtcblxuICAgICAgICBjb25zdCByZWFzb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtwYWdlLCByZWFzb25dIG9mIGRlbmllZFBhZ2VzKSB7XG4gICAgICAgICAgICBpZiAoIXJlYXNvbnNbcmVhc29uXSkgcmVhc29uc1tyZWFzb25dID0gW107XG4gICAgICAgICAgICByZWFzb25zW3JlYXNvbl0ucHVzaChwYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJlYXNvbnNBcnJheSA9IE9iamVjdC5lbnRyaWVzKHJlYXNvbnMpO1xuXG4gICAgICAgIHJldHVybiByZWFzb25zQXJyYXlcbiAgICAgICAgICAgIC5tYXAoXG4gICAgICAgICAgICAgICAgKFtyZWFzb24sIHBhZ2VzXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgYCogJHt0aGlzLmZvcm1hdERlbmllZFJlYXNvbihyZWFzb24pfSR7cmVhc29uc0FycmF5Lmxlbmd0aCA+IDEgfHwgIWFsbFJlcXVlc3RzID8gYCAoJHtwYWdlcy5tYXAoKHBhZ2UpID0+IGBbWyR7cGFnZX1dXWApLmpvaW4oJywgJyl9KWAgOiAnJ30gfn5+fmAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBhIGdyb3VwIG9mIGNvbW1lbnRzLlxuICAgICAqIEBwYXJhbSBjb21tZW50cyBUaGUgY29tbWVudHMgdG8gbWFwLlxuICAgICAqIEBwYXJhbSBzaW5ndWxhclJlcXVlc3QgV2hldGhlciB0aGUgcmVxdWVzdCBpcyB0aGUgb25seSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBhbGxSZXF1ZXN0cyBXaGV0aGVyIGFsbCByZXF1ZXN0cyBhcmUgYmVpbmcgbWFwcGVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtYXBDb21tZW50cyhjb21tZW50czogc3RyaW5nW11bXSwgc2luZ3VsYXJSZXF1ZXN0OiBib29sZWFuLCBhbGxSZXF1ZXN0czogYm9vbGVhbikge1xuICAgICAgICBpZiAoc2luZ3VsYXJSZXF1ZXN0KSByZXR1cm4gYCoge3tBZkMgY29tbWVudHwxPSR7Y29tbWVudHNbMF1bMV19fX0gfn5+fmA7XG5cbiAgICAgICAgY29uc3QgY29tbWVudE1lc3NhZ2VzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblxuICAgICAgICBmb3IgKGNvbnN0IFtwYWdlLCBjb21tZW50XSBvZiBjb21tZW50cykge1xuICAgICAgICAgICAgaWYgKCFjb21tZW50TWVzc2FnZXNbY29tbWVudF0pIGNvbW1lbnRNZXNzYWdlc1tjb21tZW50XSA9IFtdO1xuICAgICAgICAgICAgY29tbWVudE1lc3NhZ2VzW2NvbW1lbnRdLnB1c2gocGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21tZW50c0FycmF5ID0gT2JqZWN0LmVudHJpZXMoY29tbWVudE1lc3NhZ2VzKTtcblxuICAgICAgICByZXR1cm4gY29tbWVudHNBcnJheVxuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoW2NvbW1lbnQsIHBhZ2VzXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgYCoge3tBZkMgY29tbWVudHwxPSR7Y29tbWVudH19fSR7Y29tbWVudHNBcnJheS5sZW5ndGggPiAxIHx8ICFhbGxSZXF1ZXN0cyA/IGAgKCR7cGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2V9XV1gKS5qb2luKCcsICcpfSlgIDogJyd9IH5+fn5gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vZGlmaWVzIGEgZ2l2ZW4gc2VjdGlvbiB0ZXh0IHdpdGggcHJlcGVuZGVkIGFuZCBhcHBlbmRlZCB0ZXh0LlxuICAgICAqIEBwYXJhbSBzZWN0aW9uRGF0YSBUaGUgc2VjdGlvbiBkYXRhLlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzIFRoZSBwcmVwZW5kaW5nIGFuZCBhcHBlbmRpbmcgdGV4dC5cbiAgICAgKiBAcGFyYW0gY2hhbmdlcy5wcmVwZW5kIFRoZSB0ZXh0IHRvIHByZXBlbmQgdG8gdGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gY2hhbmdlcy5hcHBlbmQgVGhlIHRleHQgdG8gYXBwZW5kIHRvIHRoZSBzZWN0aW9uIHRleHQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1vZGlmeVNlY3Rpb25EYXRhKFxuICAgICAgICBzZWN0aW9uRGF0YTogeyBwYWdlVGV4dDogc3RyaW5nIH0gJiBSZXF1ZXN0QWN0aW9uWydvcmlnaW5hbFRleHQnXSxcbiAgICAgICAgeyBwcmVwZW5kLCBhcHBlbmQgfTogeyBwcmVwZW5kPzogc3RyaW5nOyBhcHBlbmQ/OiBzdHJpbmcgfSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgeyBmdWxsU2VjdGlvblRleHQ6IG9sZEZ1bGxTZWN0aW9uVGV4dCwgc2VjdGlvblRleHQ6IG9sZFNlY3Rpb25UZXh0IH0gPSBzZWN0aW9uRGF0YTtcblxuICAgICAgICBpZiAocHJlcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgPSBwcmVwZW5kICsgJ1xcbicgKyBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dDtcbiAgICAgICAgaWYgKGFwcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgKz0gJ1xcbicgKyBhcHBlbmQ7XG5cbiAgICAgICAgc2VjdGlvbkRhdGEuZnVsbFNlY3Rpb25UZXh0ID0gc2VjdGlvbkRhdGEuZnVsbFNlY3Rpb25UZXh0LnJlcGxhY2Uob2xkU2VjdGlvblRleHQsIHNlY3Rpb25EYXRhLnNlY3Rpb25UZXh0KTtcblxuICAgICAgICBzZWN0aW9uRGF0YS5wYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0LnJlcGxhY2Uob2xkRnVsbFNlY3Rpb25UZXh0LCBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQpO1xuXG4gICAgICAgIHJldHVybiBzZWN0aW9uRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhbGwgZWRpdHMgYW5kIGNyZWF0aW9ucyB0aGF0IG5lZWQgdG8gYmUgbWFkZS5cbiAgICAgKiBAcGFyYW0gc2hvd0FjdGlvbnNEaWFsb2cgVGhlIGRpYWxvZyB0byBsb2cgdGhlIHJlc3VsdHMgdG8uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIG1ha2VBbGxFZGl0c0NyZWF0aW9ucyhzaG93QWN0aW9uc0RpYWxvZzogQWN0aW9uc0RpYWxvZykge1xuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlKSB7XG4gICAgICAgICAgICBjb25zdCBhcGlGdW5jdGlvbiA9XG4gICAgICAgICAgICAgICAgYWN0aW9uLnR5cGUgPT09ICdlZGl0J1xuICAgICAgICAgICAgICAgICAgICA/IHRoaXMuYXBpLmVkaXQoYWN0aW9uLnRpdGxlLCBhY3Rpb24udHJhbnNmb3JtKVxuICAgICAgICAgICAgICAgICAgICA6IHRoaXMuYXBpLmNyZWF0ZShhY3Rpb24udGl0bGUsIHsgc3VtbWFyeTogYWN0aW9uLnN1bW1hcnksIHdhdGNobGlzdDogdGhpcy5jcmVhdGVkUGFnZVdhdGNoTWV0aG9kIH0sIGFjdGlvbi50ZXh0KTtcblxuICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChhY3Rpb24udGl0bGUsICdpc1JlZGlyZWN0JyBpbiBhY3Rpb24gJiYgYWN0aW9uLmlzUmVkaXJlY3QgPyB7IHJlZGlyZWN0OiAnbm8nIH0gOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSBhY3Rpb24udGl0bGU7XG5cbiAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KGAke2FjdGlvbi50eXBlID09PSAnZWRpdCcgPyAnRWRpdGluZycgOiAnQ3JlYXRpbmcnfSAke2xpbmtFbGVtZW50Lm91dGVySFRNTH0uLi5gKTtcblxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3BcbiAgICAgICAgICAgIGF3YWl0IGFwaUZ1bmN0aW9uLmNhdGNoKGFzeW5jIChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb2RlID09PSAncmF0ZWxpbWl0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgYFJhdGUgbGltaXRlZC4gV2FpdGluZyBmb3IgNzAgc2Vjb25kcy4uLiAocmVzdW1pbmcgYXQgJHtuZXcgRGF0ZShEYXRlLm5vdygpICsgNzBfMDAwKS50b0xvY2FsZVRpbWVTdHJpbmcoKX0pYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgNzBfMDAwKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ0NvbnRpbnVpbmcuLi4nLCAnc3VjY2VzcycpO1xuXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaUZ1bmN0aW9uLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciAke2FjdGlvbi50eXBlID09PSAnZWRpdCcgPyAnZWRpdGluZycgOiAnY3JlYXRpbmcnfSAke2xpbmtFbGVtZW50Lm91dGVySFRNTH06ICR7ZXJyb3JJbmZvPy5lcnJvci5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSkuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yICR7YWN0aW9uLnR5cGUgPT09ICdlZGl0JyA/ICdlZGl0aW5nJyA6ICdjcmVhdGluZyd9ICR7bGlua0VsZW1lbnQub3V0ZXJIVE1MfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCBwYXJzZVN1YnR5cGVSZXF1ZXN0cyhzZWN0aW9uVGV4dDogc3RyaW5nLCBzZWN0aW9uSGVhZGVyOiBzdHJpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCBsb2FkU3VidHlwZUVsZW1lbnRzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHByb3RlY3RlZCB1cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBpbXBsZW1lbnRlZC4nKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzLCBAdHlwZXNjcmlwdC1lc2xpbnQvcmVxdWlyZS1hd2FpdFxuICAgIHByb3RlY3RlZCBhc3luYyBwZXJmb3JtU3VidHlwZUFjdGlvbnMoZGlhbG9nOiBBY3Rpb25zRGlhbG9nLCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sIG5ld1BhZ2VUZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxufVxuXG5PYmplY3QuYXNzaWduKEhlbHBlckRpYWxvZy5wcm90b3R5cGUsIE9PLnVpLlByb2Nlc3NEaWFsb2cucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgdHlwZSB7IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyLWRpYWxvZyc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RBY3Rpb25UeXBlIH0gZnJvbSAnLi9oZWxwZXItZGlhbG9nJztcbmltcG9ydCB0eXBlIFJlZGlyZWN0c0RpYWxvZyBmcm9tICcuL3JlZGlyZWN0cy1kaWFsb2cnO1xuaW1wb3J0IHR5cGUgeyBSZWRpcmVjdEFjdGlvbiB9IGZyb20gJy4vcmVkaXJlY3RzLWRpYWxvZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZGlyZWN0UmVxdWVzdEhhbmRsZXIge1xuICAgIHByaXZhdGUgdGl0bGVJbmRleDogbnVtYmVyO1xuICAgIHByaXZhdGUgdGl0bGU6IHN0cmluZztcbiAgICBwcml2YXRlIGRldGFpbHNFbGVtZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG4gICAgcHJpdmF0ZSByZXNwb25kZXJFbGVtZW50OiBIVE1MRGl2RWxlbWVudDtcbiAgICBwcml2YXRlIGRpYWxvZzogUmVkaXJlY3RzRGlhbG9nO1xuXG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3I/OiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG5cbiAgICBwcml2YXRlIHRlbXBsYXRlRWRpdG9yc0luZm86IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm9bXSA9IFtdO1xuXG4gICAgcHJpdmF0ZSBjb21tZW50SW5wdXQhOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQ7XG5cbiAgICBwcml2YXRlIHRhZ1NlbGVjdExheW91dD86IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgZGVueVJlYXNvbkxheW91dD86IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgY2xvc2luZ1JlYXNvbkxheW91dD86IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgY29tbWVudExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHRpdGxlSW5kZXg6IG51bWJlcixcbiAgICAgICAgdGl0bGU6IHN0cmluZyxcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudCxcbiAgICAgICAgcmVzcG9uZGVyRWxlbWVudDogSFRNTERpdkVsZW1lbnQsXG4gICAgICAgIGRpYWxvZzogUmVkaXJlY3RzRGlhbG9nLFxuICAgICkge1xuICAgICAgICB0aGlzLnRpdGxlSW5kZXggPSB0aXRsZUluZGV4O1xuICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7XG4gICAgICAgIHRoaXMuZGV0YWlsc0VsZW1lbnQgPSBkZXRhaWxzRWxlbWVudDtcbiAgICAgICAgdGhpcy5yZXNwb25kZXJFbGVtZW50ID0gcmVzcG9uZGVyRWxlbWVudDtcbiAgICAgICAgdGhpcy5kaWFsb2cgPSBkaWFsb2c7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyB1cCB0aGUgcmVxdWVzdCBoYW5kbGVyLCBsb2FkaW5nIGVsZW1lbnRzIGludG8gdGhlIERPTS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0dXAoKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3RlZFRpdGxlRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIGxhYmVsLnRleHRDb250ZW50ID0gdGhpcy50aXRsZTtcbiAgICAgICAgcmVxdWVzdGVkVGl0bGVEaXYuYXBwZW5kKGxhYmVsKTtcblxuICAgICAgICBjb25zdCBhY3Rpb25SYWRpb0lucHV0ID0gbmV3IE9PLnVpLlJhZGlvU2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyddLFxuICAgICAgICAgICAgaXRlbXM6IFsnQWNjZXB0JywgJ0RlbnknLCAnQ29tbWVudCcsICdDbG9zZScsICdOb25lJ10ubWFwKChsYWJlbCkgPT4gbmV3IE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KHsgZGF0YTogbGFiZWwsIGxhYmVsIH0pKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5zZWxlY3RJdGVtQnlMYWJlbCgnTm9uZScpO1xuXG4gICAgICAgIGFjdGlvblJhZGlvSW5wdXQub24oJ2Nob29zZScsIChzZWxlY3RlZCkgPT4gdGhpcy5oYW5kbGVBY3Rpb25DaGFuZ2Uoc2VsZWN0ZWQpKTtcblxuICAgICAgICB0aGlzLmxvYWRDb21tZW50TGF5b3V0KCk7XG5cbiAgICAgICAgcmVxdWVzdGVkVGl0bGVEaXYuYXBwZW5kKGFjdGlvblJhZGlvSW5wdXQuJGVsZW1lbnRbMF0sIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgdGhpcy5yZXNwb25kZXJFbGVtZW50LmFwcGVuZChyZXF1ZXN0ZWRUaXRsZURpdik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlciBmb3Igc2VsZWN0ZWQgYWN0aW9uIGNoYW5nZXMuXG4gICAgICogQHBhcmFtIHNlbGVjdGVkIFRoZSBuZXcgc2VsZWN0ZWQgb3B0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgaGFuZGxlQWN0aW9uQ2hhbmdlKHNlbGVjdGVkOiBPTy51aS5PcHRpb25XaWRnZXQpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmRpYWxvZy51cGRhdGVTaXplKCksIDApO1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IChzZWxlY3RlZC5nZXREYXRhKCkgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpIGFzIFJlcXVlc3RBY3Rpb25UeXBlO1xuXG4gICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGFjdGlvbjogb3B0aW9uIH0pO1xuXG4gICAgICAgIHRoaXMuZGlhbG9nLnVwZGF0ZVJlcXVlc3RDb2xvcih0aGlzLmRldGFpbHNFbGVtZW50LCB0aGlzLnRpdGxlSW5kZXgpO1xuXG4gICAgICAgIGlmICh0aGlzLnRhZ1NlbGVjdExheW91dCkgdGhpcy50YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICBpZiAodGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IpIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVueVJlYXNvbkxheW91dCkgdGhpcy5kZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgaWYgKHRoaXMuY2xvc2luZ1JlYXNvbkxheW91dCkgdGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy50YWdTZWxlY3RMYXlvdXQgfHwgIXRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yKSB0aGlzLmxvYWRUYWdTZWxlY3RBbmRQYXJhbWV0ZXJzRWRpdG9yKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dCEuJGVsZW1lbnQuc2hvdygpO1xuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yIS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGVueVJlYXNvbkxheW91dCkgdGhpcy5sb2FkRGVueVJlYXNvbkxheW91dCgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZW55UmVhc29uTGF5b3V0IS4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0KSB0aGlzLmxvYWRDbG9zaW5nUmVhc29uTGF5b3V0KCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNsb3NpbmdSZWFzb25MYXlvdXQhLiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFsnYWNjZXB0JywgJ2NvbW1lbnQnLCAnY2xvc2UnXS5pbmNsdWRlcyhvcHRpb24pKSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gdGhpcy5jb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50KSB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjb21tZW50IH0pO1xuICAgICAgICAgICAgZWxzZSB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjb21tZW50OiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjb21tZW50OiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgdGFnIHNlbGVjdCBhbmQgdGVtcGxhdGUgcGFyYW1ldGVycyBlZGl0b3JzLlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZFRhZ1NlbGVjdEFuZFBhcmFtZXRlcnNFZGl0b3IoKSB7XG4gICAgICAgIGNvbnN0IHRhZ1NlbGVjdCA9IG5ldyBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dBcmJpdHJhcnk6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5lbnRyaWVzKHRoaXMuZGlhbG9nLnJlZGlyZWN0VGVtcGxhdGVzKS5tYXAoKFt0YWcsIHsgcmVkaXJlY3QgfV0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0KSByZXR1cm4geyBkYXRhOiB0YWcsIGxhYmVsOiB0YWcgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGAke3RhZ30gPGk+KHJlZGlyZWN0IHdpdGggcG9zc2liaWxpdGllcyk8L2k+YCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0YWcsIGxhYmVsIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgICh0YWdTZWxlY3QuZ2V0TWVudSgpIGFzIE9PLnVpLk1lbnVTZWxlY3RXaWRnZXQuQ29uZmlnT3B0aW9ucykuZmlsdGVyTW9kZSA9ICdzdWJzdHJpbmcnO1xuICAgICAgICB0YWdTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAodGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoKHRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSB0YWdTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IHJlZGlyZWN0VGVtcGxhdGVzOiBzb3J0ZWRUYWdzIH0pO1xuXG4gICAgICAgICAgICBsZXQgc2hvd25UZW1wbGF0ZUVkaXRvcnMgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlZGl0b3JJbmZvIG9mIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mbykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzVGFnU2VsZWN0ZWQgPSBzb3J0ZWRUYWdzLmluY2x1ZGVzKGVkaXRvckluZm8ubmFtZSk7XG5cbiAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9IGlzVGFnU2VsZWN0ZWQgPyAnYmxvY2snIDogJ25vbmUnO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVGFnU2VsZWN0ZWQpIHNob3duVGVtcGxhdGVFZGl0b3JzKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gYFRlbXBsYXRlIHBhcmFtZXRlcnMgKCR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gYGZvciAke3Nob3duVGVtcGxhdGVFZGl0b3JzfSB0ZW1wbGF0ZSR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAxID8gJ3MnIDogJyd9YCA6ICdub25lIHRvIHNob3cnfSlgO1xuXG4gICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2Uuc3R5bGUuZGlzcGxheSA9IHNob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/ICdub25lJyA6ICdibG9jayc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudGFnU2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRhZ1NlbGVjdCwge1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1oZWxwZXItdGFnLXNlbGVjdC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnUmVkaXJlY3QgdGVtcGxhdGVzOicsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRoaXMudGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gJ1RlbXBsYXRlIHBhcmFtZXRlcnMgKG5vbmUgdG8gc2hvdyknO1xuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW3RlbXBsYXRlTmFtZSwgdGVtcGxhdGVEYXRhXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmRpYWxvZy5yZWRpcmVjdFRlbXBsYXRlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZURhdGEucGFyYW1ldGVycyk7XG4gICAgICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgc3VtbWFyeS50ZXh0Q29udGVudCA9IHRlbXBsYXRlTmFtZTtcbiAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKHN1bW1hcnkpO1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50RGF0YTogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyA9IHsgbmFtZTogdGVtcGxhdGVOYW1lLCBkZXRhaWxzLCBwYXJhbWV0ZXJzOiBbXSB9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHBhcmFtZXRlckRhdGEuZGVmYXVsdD8udG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHBhcmFtZXRlckRhdGEucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChpbnB1dCwge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGFyYW1ldGVyTmFtZX0keyFwYXJhbWV0ZXJEYXRhLmxhYmVsIHx8IHBhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFyYW1ldGVyRGF0YS5sYWJlbD8udG9Mb3dlckNhc2UoKSA/ICcnIDogYCAoJHtwYXJhbWV0ZXJEYXRhLmxhYmVsfSlgfSR7cGFyYW1ldGVyRGF0YS5kZXNjcmlwdGlvbiA/IGAgKCR7cGFyYW1ldGVyRGF0YS5kZXNjcmlwdGlvbn0pYCA6ICcnfSAodHlwZTogJHtwYXJhbWV0ZXJEYXRhLnR5cGV9KSAke3BhcmFtZXRlckRhdGEuc3VnZ2VzdGVkID8gJyAoc3VnZ2VzdGVkKScgOiAnJ30ke3BhcmFtZXRlckRhdGEuZXhhbXBsZSA/IGAgKGV4YW1wbGU6IFwiJHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGV9XCIpYCA6ICcnfWAsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChpbnB1dExheW91dC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50RGF0YS5wYXJhbWV0ZXJzLnB1c2goeyBuYW1lOiBwYXJhbWV0ZXJOYW1lLCBhbGlhc2VzOiBwYXJhbWV0ZXJEYXRhLmFsaWFzZXMsIGVkaXRvcjogaW5wdXQgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChkZXRhaWxzKTtcblxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLnB1c2goZWxlbWVudERhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgcmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM6IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mbyB9KTtcblxuICAgICAgICBjb25zdCBub1RlbXBsYXRlc01lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLmlkID0gJ2FmY3JjLWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSc7XG4gICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS50ZXh0Q29udGVudCA9ICdObyB0ZW1wbGF0ZXMgd2l0aCBwYXJhbWV0ZXJzIHRvIGRpc3BsYXkhJztcblxuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQobm9UZW1wbGF0ZXNNZXNzYWdlKTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgZGVueSByZWFzb24gbGF5b3V0LlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZERlbnlSZWFzb25MYXlvdXQoKSB7XG4gICAgICAgIGNvbnN0IGRlbnlSZWFzb25JbnB1dCA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnYXV0b2ZpbGw6dW5saWtlbHknLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgIFsnZXhpc3RzJywgJ2V4aXN0aW5nIHBhZ2VzJ10sXG4gICAgICAgICAgICAgICAgWydlbXB0eScsICdlbXB0eSBzdWJtaXNzaW9ucyddLFxuICAgICAgICAgICAgICAgIFsnbm90YXJnZXQnLCAnbm9uZXhpc3RlbnQgb3Igbm8gcHJvdmlkZWQgdGFyZ2V0J10sXG4gICAgICAgICAgICAgICAgWydub3RpdGxlJywgJ25vIHRpdGxlIHByb3ZpZGVkJ10sXG4gICAgICAgICAgICAgICAgWyd1bmxpa2VseScsICd1bmxpa2VseSByZWRpcmVjdHMnXSxcbiAgICAgICAgICAgICAgICBbJ25vdHJlZGlyZWN0JywgJ2FydGljbGUgY3JlYXRpb24gcmVxdWVzdHMnXSxcbiAgICAgICAgICAgICAgICBbJ2V4dGVybmFsbGluaycsICdleHRlcm5hbCBsaW5rIHJlZGlyZWN0cyddLFxuICAgICAgICAgICAgICAgIFsnZWRpdHJlcXVlc3QnLCAnZWRpdCByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgIFsnbm90ZW5nbGlzaCcsICdyZXF1ZXN0cyBub3QgaW4gRW5nbGlzaCddLFxuICAgICAgICAgICAgXS5tYXAoKFt2YWx1ZSwgbGFiZWxdKSA9PiAoeyBkYXRhOiBgYXV0b2ZpbGw6JHt2YWx1ZX1gLCBsYWJlbDogYEF1dG9maWxsZWQgdGV4dCBmb3IgJHtsYWJlbH1gIH0pKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVueVJlYXNvbklucHV0LnNldFZhbHVlKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuICAgICAgICBkZW55UmVhc29uSW5wdXQuZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG5cbiAgICAgICAgZGVueVJlYXNvbklucHV0Lm9uKCdjaGFuZ2UnLCAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGRlbnlSZWFzb246IHZhbHVlIHx8ICdhdXRvZmlsbDp1bmxpa2VseScgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGVueVJlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChkZW55UmVhc29uSW5wdXQsIHtcbiAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnRGVueSByZWFzb246JyxcbiAgICAgICAgICAgIGhlbHA6ICdTdXBwb3J0cyBhdXRvbWF0aWMgcmVhc29uaW5nLCBjdXN0b20gcmVhc29uaW5nLCBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gd2l0aCBcImF1dG9maWxsOlJFQVNPTiwgQ1VTVE9NXCIgZm9ybWF0JyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50WzBdLmJlZm9yZSh0aGlzLmRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnRbMF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBjbG9zaW5nIHJlYXNvbiBsYXlvdXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkQ2xvc2luZ1JlYXNvbkxheW91dCgpIHtcbiAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbkRyb3Bkb3duID0gbmV3IE9PLnVpLkRyb3Bkb3duV2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgIG1lbnU6IHtcbiAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICBbJ05vIHJlc3BvbnNlJywgJ3InXSxcbiAgICAgICAgICAgICAgICAgICAgWydTdWNjZWVkZWQnLCAncyddLFxuICAgICAgICAgICAgICAgICAgICBbJ1dpdGhkcmF3bicsICd3J10sXG4gICAgICAgICAgICAgICAgXS5tYXAoKFt0aXRsZSwgaWRdKSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGE6IGlkLCBsYWJlbDogdGl0bGUgfSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNsb3NpbmdSZWFzb25Ecm9wZG93bi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgncicpO1xuXG4gICAgICAgIGNsb3NpbmdSZWFzb25Ecm9wZG93bi5nZXRNZW51KCkub24oJ2Nob29zZScsIChzZWxlY3RlZCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgY2xvc2luZ1JlYXNvbjogeyBuYW1lOiBzZWxlY3RlZC5nZXRMYWJlbCgpIGFzIHN0cmluZywgaWQ6IHNlbGVjdGVkLmdldERhdGEoKSBhcyBzdHJpbmcgfSB9KTtcblxuICAgICAgICAgICAgdGhpcy5kaWFsb2cudXBkYXRlUmVxdWVzdENvbG9yKHRoaXMuZGV0YWlsc0VsZW1lbnQsIHRoaXMudGl0bGVJbmRleCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IGNsb3NpbmdSZWFzb246IHsgbmFtZTogJ05vIHJlc3BvbnNlJywgaWQ6ICdyJyB9IH0pO1xuXG4gICAgICAgIHRoaXMuY2xvc2luZ1JlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjbG9zaW5nUmVhc29uRHJvcGRvd24sIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ0Nsb3NpbmcgcmVhc29uOicgfSk7XG4gICAgICAgIHRoaXMuY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50WzBdLmJlZm9yZSh0aGlzLmNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnRbMF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBjb21tZW50IGxheW91dC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRDb21tZW50TGF5b3V0KCkge1xuICAgICAgICB0aGlzLmNvbW1lbnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRJbnB1dC5vbignY2hhbmdlJywgKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gdmFsdWUudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoY29tbWVudCkgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgY29tbWVudCB9KTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgY29tbWVudDogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5jb21tZW50SW5wdXQsIHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY29tbWVudC1pbnB1dCddLFxuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdDb21tZW50OicsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYSByZXF1ZXN0J3MgYWN0aW9ucyBkYXRhLlxuICAgICAqIEBwYXJhbSB1cGRhdGUgVGhlIHVwZGF0ZXMgdG8gbWFrZS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVwZGF0ZUFjdGlvbnNUb1Rha2UodXBkYXRlOiBQYXJ0aWFsPFJlZGlyZWN0QWN0aW9uPikge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuZGlhbG9nLmFjdGlvbnNUb1Rha2VbdGhpcy50aXRsZUluZGV4XS5yZXF1ZXN0c1t0aGlzLnRpdGxlXSwgdXBkYXRlKTtcbiAgICB9XG59XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcbmltcG9ydCB0eXBlIHsgUGFnZVJldmlzaW9uc1Jlc3VsdCB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGlyZWN0VGVtcGxhdGVEYXRhLCBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvIH0gZnJvbSAnLi4vcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LWhlbHBlci1kaWFsb2cnO1xuaW1wb3J0IEhlbHBlckRpYWxvZywgeyB0eXBlIFJlcXVlc3RBY3Rpb24sIHR5cGUgUmVxdWVzdFJlcXVlc3RlciB9IGZyb20gJy4vaGVscGVyLWRpYWxvZyc7XG5pbXBvcnQgUmVkaXJlY3RSZXF1ZXN0SGFuZGxlciBmcm9tICcuL3JlZGlyZWN0LXJlcXVlc3QtaGFuZGxlcic7XG5pbXBvcnQgdHlwZSBBY3Rpb25zRGlhbG9nIGZyb20gJy4vc2hvdy1hY3Rpb25zLWRpYWxvZyc7XG5cbmludGVyZmFjZSBSZWRpcmVjdFJlcXVlc3REYXRhIHtcbiAgICBwYWdlczogc3RyaW5nW107XG4gICAgdGFyZ2V0OiBzdHJpbmc7XG4gICAgcmVhc29uOiBzdHJpbmc7XG4gICAgc291cmNlOiBzdHJpbmc7XG4gICAgcmVxdWVzdGVyOiBSZXF1ZXN0UmVxdWVzdGVyO1xufVxuXG5leHBvcnQgdHlwZSBSZWRpcmVjdEFjdGlvbiA9IFJlcXVlc3RBY3Rpb24gJiB7IHJlZGlyZWN0VGVtcGxhdGVzPzogc3RyaW5nW107IHJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzPzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdIH07XG5cbnR5cGUgUmVkaXJlY3RBY3Rpb25zID0geyB0YXJnZXQ6IHN0cmluZzsgcmVxdWVzdHM6IFJlY29yZDxzdHJpbmcsIFJlZGlyZWN0QWN0aW9uPiB9W107XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZGlyZWN0c0RpYWxvZyBleHRlbmRzIEhlbHBlckRpYWxvZyB7XG4gICAgcHVibGljIHJlZGlyZWN0VGVtcGxhdGVzITogUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG5cbiAgICBwcm90ZWN0ZWQgcGFyc2VkUmVxdWVzdHM6IFJlZGlyZWN0UmVxdWVzdERhdGFbXSA9IFtdO1xuICAgIHB1YmxpYyBhY3Rpb25zVG9UYWtlOiBSZWRpcmVjdEFjdGlvbnMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgZWxlbWVudHMgaW4gdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgY29uc3QgcmVkaXJlY3RUZW1wbGF0ZVJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgdGl0bGVzOiAnVXNlcjpFZWppdDQzL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyLmpzb24nLFxuICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHQ7XG5cbiAgICAgICAgdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICByZWRpcmVjdFRlbXBsYXRlUmVzcG9uc2UucXVlcnkucGFnZXM/LlswXT8ucmV2aXNpb25zPy5bMF0/LnNsb3RzPy5tYWluPy5jb250ZW50IHx8ICd7fScsXG4gICAgICAgICkgYXMgUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG5cbiAgICAgICAgc3VwZXIubG9hZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyByZWRpcmVjdCByZXF1ZXN0cyBmcm9tIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvbkhlYWRlciBUaGUgc2VjdGlvbiBoZWFkZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHBhcnNlU3VidHlwZVJlcXVlc3RzKHNlY3Rpb25UZXh0OiBzdHJpbmcsIHNlY3Rpb25IZWFkZXI6IHN0cmluZykge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRhID0ge30gYXMgUmVkaXJlY3RSZXF1ZXN0RGF0YTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZWRQYWdlcyA9IFsuLi5zZWN0aW9uSGVhZGVyLm1hdGNoQWxsKC9cXFtcXFsoLio/KV1dL2cpXVxuICAgICAgICAgICAgLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdPy50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICAgICAgICBpZiAocmVxdWVzdGVkUGFnZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgcGFyc2VkRGF0YS5wYWdlcyA9IHJlcXVlc3RlZFBhZ2VzO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IC9UYXJnZXQgb2YgcmVkaXJlY3Q6ID9cXFtcXFsoLio/KV1dLy5leGVjKHNlY3Rpb25UZXh0KT8uWzFdLnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcbiAgICAgICAgaWYgKCFwYXJzZWRUYXJnZXQpIHJldHVybjtcblxuICAgICAgICBwYXJzZWREYXRhLnRhcmdldCA9IHBhcnNlZFRhcmdldDtcblxuICAgICAgICBwYXJzZWREYXRhLnJlYXNvbiA9IC9yZWFzb246ID8oLio/KVxcKnNvdXJjZSg/OiBcXChpZiBhcHBsaWNhYmxlXFwpKT86L2lzLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0udHJpbSgpID8/ICcnO1xuXG4gICAgICAgIHBhcnNlZERhdGEuc291cmNlID0gL3NvdXJjZSg/OiBcXChpZiBhcHBsaWNhYmxlXFwpKT86ID8oLio/KSg/OjxyZWZlcmVuY2VzIFxcLz58XFxuXFxuKS9pcy5leGVjKHNlY3Rpb25UZXh0KT8uWzFdLnRyaW0oKSA/PyAnJztcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXIgPSBzZWN0aW9uVGV4dFxuICAgICAgICAgICAgLm1hdGNoKFxuICAgICAgICAgICAgICAgIHNlY3Rpb25UZXh0LmluY2x1ZGVzKCc8cmVmZXJlbmNlcyAvPicpXG4gICAgICAgICAgICAgICAgICAgID8gLzxyZWZlcmVuY2VzIFxcLz5cXG4rKC4qKS9cbiAgICAgICAgICAgICAgICAgICAgOiBuZXcgUmVnRXhwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICBgKD86PHJlZmVyZW5jZXMgXFxcXC8+JHtwYXJzZWREYXRhLnNvdXJjZSA/IGB8JHtwYXJzZWREYXRhLnNvdXJjZS5yZXBsYWNlQWxsKC9bXFxzIyQoKSorLC4/W1xcXFxcXF1ee3x9LV0vZywgJ1xcXFwkJicpfWAgOiAnJ30pXFxuKyguKilgLFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApPy5bMV1cbiAgICAgICAgICAgIC50cmltKCk7XG5cbiAgICAgICAgY29uc3QgbmFtZSA9IHJlcXVlc3RlciA/IC8oPzpTcGVjaWFsOkNvbnRyaWJ1dGlvbnNcXC98VXNlcig/OiB0YWxrKT86KSguKj8pXFx8Ly5leGVjKHJlcXVlc3Rlcik/LlsxXS50cmltKCkgOiBudWxsO1xuXG4gICAgICAgIHBhcnNlZERhdGEucmVxdWVzdGVyID0gcmVxdWVzdGVyICYmIG5hbWUgPyB7IHR5cGU6IC9cXFtcXFtVc2VyKCB0YWxrKT86Ly50ZXN0KHJlcXVlc3RlcikgPyAndXNlcicgOiAnaXAnLCBuYW1lIH0gOiBudWxsO1xuXG4gICAgICAgIHRoaXMucGFyc2VkUmVxdWVzdHMucHVzaChwYXJzZWREYXRhKTtcblxuICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2UucHVzaCh7XG4gICAgICAgICAgICB0YXJnZXQ6IHBhcnNlZERhdGEudGFyZ2V0LFxuICAgICAgICAgICAgcmVxdWVzdHM6IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQYWdlcy5tYXAoKHBhZ2UpID0+IFtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxUZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uVGV4dDogc2VjdGlvblRleHQucmVwbGFjZSgvXj09Lio/PT0kL20sICcnKS50cmltKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyBhIGdpdmVuIHJlZGlyZWN0IHJlcXVlc3QgaW50byB0aGUgZGlhbG9nLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHJlcXVlc3QgdG8gbG9hZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgbG9hZFN1YnR5cGVFbGVtZW50cyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBhcnNlZFJlcXVlc3RzW2luZGV4XTtcblxuICAgICAgICBjb25zdCBkZXRhaWxzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QnKTtcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlU2l6ZSgpLCAwKSk7XG5cbiAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmlubmVySFRNTCA9IHJlcXVlc3QucGFnZXMubWFwKChwYWdlKSA9PiBgPGI+JHtwYWdlfTwvYj5gKS5qb2luKCcsICcpICsgJyBcdTIxOTIgJztcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50Py50YWdOYW1lID09PSAnSU5QVVQnICYmIGV2ZW50LmtleSA9PT0gJyAnKSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0YXJnZXRFZGl0b3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItdGFyZ2V0LWVkaXRvcicpO1xuICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmVxdWVzdC50YXJnZXQubGVuZ3RofWNoYDtcbiAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSA9IHJlcXVlc3QudGFyZ2V0O1xuICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4ge1xuICAgICAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSA9IHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWUucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICAgICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHt0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlLmxlbmd0aH1jaGA7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0udGFyZ2V0ID0gdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZTtcblxuICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWUpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzdW1tYXJ5RWxlbWVudC5hcHBlbmQodGFyZ2V0RWRpdG9yRWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgIGxpbmtFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1leHRlcm5hbC1saW5rJyk7XG4gICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwocmVxdWVzdC50YXJnZXQpO1xuICAgICAgICBsaW5rRWxlbWVudC5pbm5lckhUTUwgPSBgXG48c3ZnIHZpZXdib3g9XCIwIDAgNDggNDhcIj5cbjxwYXRoIGQ9XCJNMzYgMjRjLTEuMiAwLTIgMC44LTIgMnYxMmMwIDEuMi0wLjggMi0yIDJoLTIyYy0xLjJcbiAgICAwLTItMC44LTItMnYtMjJjMC0xLjIgMC44LTIgMi0yaDEyYzEuMiAwIDItMC44IDItMnMtMC44LTItMi0yaC0xMmMtMy40XG4gICAgMC02IDIuNi02IDZ2MjJjMCAzLjQgMi42IDYgNiA2aDIyYzMuNCAwIDYtMi42XG4gICAgNi02di0xMmMwLTEuMi0wLjgtMi0yLTJ6XCI+PC9wYXRoPlxuPHBhdGggZD1cIk00My44IDUuMmMtMC4yLTAuNC0wLjYtMC44LTEtMS0wLjItMC4yLTAuNi0wLjItMC44LTAuMmgtMTJjLTEuMlxuICAgIDAtMiAwLjgtMiAyczAuOCAyIDIgMmg3LjJsLTE4LjYgMTguNmMtMC44IDAuOC0wLjggMiAwIDIuOCAwLjQgMC40IDAuOFxuICAgIDAuNiAxLjQgMC42czEtMC4yIDEuNC0wLjZsMTguNi0xOC42djcuMmMwIDEuMiAwLjggMiAyIDJzMi0wLjhcbiAgICAyLTJ2LTEyYzAtMC4yIDAtMC42LTAuMi0wLjh6XCI+PC9wYXRoPlxuPC9zdmc+YDtcblxuICAgICAgICBzdW1tYXJ5RWxlbWVudC5hcHBlbmQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdEluZm9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvJyk7XG5cbiAgICAgICAgY29uc3Qgbm9uZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIG5vbmVFbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICBub25lRWxlbWVudC50ZXh0Q29udGVudCA9ICdOb25lJztcblxuICAgICAgICBjb25zdCB1bmtub3duRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgdW5rbm93bkVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgIHVua25vd25FbGVtZW50LnRleHRDb250ZW50ID0gJ1Vua25vd24nO1xuXG4gICAgICAgIGNvbnN0IHJlYXNvbkRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHJlYXNvbkxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICByZWFzb25MYWJlbC50ZXh0Q29udGVudCA9ICdSZWFzb246ICc7XG4gICAgICAgIHJlYXNvbkRpdi5hcHBlbmQocmVhc29uTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnJlYXNvbikgcmVhc29uRGl2LmFwcGVuZChyZXF1ZXN0LnJlYXNvbik7XG4gICAgICAgIGVsc2UgcmVhc29uRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocmVhc29uRGl2KTtcblxuICAgICAgICBjb25zdCBzb3VyY2VEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCBzb3VyY2VMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgc291cmNlTGFiZWwudGV4dENvbnRlbnQgPSAnU291cmNlOiAnO1xuICAgICAgICBzb3VyY2VEaXYuYXBwZW5kKHNvdXJjZUxhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5zb3VyY2UpIHNvdXJjZURpdi5hcHBlbmQocmVxdWVzdC5zb3VyY2UpO1xuICAgICAgICBlbHNlIHNvdXJjZURpdi5hcHBlbmQobm9uZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHNvdXJjZURpdik7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVyRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdGVyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHJlcXVlc3RlckxhYmVsLnRleHRDb250ZW50ID0gJ1JlcXVlc3RlcjogJztcbiAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdGVyKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsuaHJlZiA9XG4gICAgICAgICAgICAgICAgcmVxdWVzdC5yZXF1ZXN0ZXIudHlwZSA9PT0gJ3VzZXInXG4gICAgICAgICAgICAgICAgICAgID8gbXcudXRpbC5nZXRVcmwoYFVzZXI6JHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApXG4gICAgICAgICAgICAgICAgICAgIDogbXcudXRpbC5nZXRVcmwoYFNwZWNpYWw6Q29udHJpYnV0aW9ucy8ke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YCk7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRleHRDb250ZW50ID0gcmVxdWVzdC5yZXF1ZXN0ZXIubmFtZTtcbiAgICAgICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGluayk7XG4gICAgICAgIH0gZWxzZSByZXF1ZXN0ZXJEaXYuYXBwZW5kKHVua25vd25FbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChyZXF1ZXN0ZXJEaXYpO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0SW5mb0VsZW1lbnQpO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdocicpKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXInKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3RlZFRpdGxlIG9mIHJlcXVlc3QucGFnZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgUmVkaXJlY3RSZXF1ZXN0SGFuZGxlcihpbmRleCwgcmVxdWVzdGVkVGl0bGUsIGRldGFpbHNFbGVtZW50LCByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCwgdGhpcyk7XG5cbiAgICAgICAgICAgIGhhbmRsZXIuc2V0dXAoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCk7XG5cbiAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKGRldGFpbHNFbGVtZW50KTtcblxuICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBjb2xvciBvZiBhIGRldGFpbHMgZWxlbWVudCBiYXNlZCBvbiB0aGUgaGFuZGxpbmcgb2YgdGhlIHJlcXVlc3RzIGluc2lkZS5cbiAgICAgKiBAcGFyYW0gZGV0YWlsc0VsZW1lbnQgVGhlIGRldGFpbHMgZWxlbWVudCB0byB1cGRhdGUuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVkaXJlY3QgdGFyZ2V0LlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQ6IEhUTUxEZXRhaWxzRWxlbWVudCwgaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCBhY3Rpb25zVG9UYWtlID0gT2JqZWN0LnZhbHVlcyh0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLnJlcXVlc3RzKTtcblxuICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkID0gYWN0aW9uc1RvVGFrZS5ldmVyeSgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JyB8fCBhY3Rpb24uYWN0aW9uID09PSAnZGVueScpO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0Q2xvc2VSZWFzb24gPSBhY3Rpb25zVG9UYWtlLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyk/LmNsb3NpbmdSZWFzb24/LmlkO1xuICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0Nsb3NlZCA9IGFjdGlvbnNUb1Rha2UuZXZlcnkoXG4gICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnICYmIGFjdGlvbi5jbG9zaW5nUmVhc29uPy5pZCA9PT0gZmlyc3RDbG9zZVJlYXNvbixcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgYmFja2dyb3VuZENvbG9yID0gJyc7XG5cbiAgICAgICAgaWYgKGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkQ291bnQgPSBhY3Rpb25zVG9UYWtlLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JykubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgZGVuaWVkQ291bnQgPSBhY3Rpb25zVG9UYWtlLmZpbHRlcigoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnZGVueScpLmxlbmd0aDtcblxuICAgICAgICAgICAgaWYgKGFjY2VwdGVkQ291bnQgPiAwICYmIGRlbmllZENvdW50ID4gMCkgYmFja2dyb3VuZENvbG9yID0gJyNmZmYxN2UnO1xuICAgICAgICAgICAgZWxzZSBpZiAoYWNjZXB0ZWRDb3VudCA+IDApIGJhY2tncm91bmRDb2xvciA9ICcjYTBmZmEwJztcbiAgICAgICAgICAgIGVsc2UgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICB9IGVsc2UgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKVxuICAgICAgICAgICAgaWYgKGZpcnN0Q2xvc2VSZWFzb24gPT09ICdyJykgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICAgICAgZWxzZSBpZiAoZmlyc3RDbG9zZVJlYXNvbiA9PT0gJ3MnKSBiYWNrZ3JvdW5kQ29sb3IgPSAnIzkwYzA5MCc7XG4gICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjYjhiOGI4JztcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYWN0aW9ucyBvbiBhIGdpdmVuIGNhdGVnb3J5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHNob3dBY3Rpb25zRGlhbG9nIFRoZSBkaWFsb2cgdG8gYWRkIG1lc3NhZ2VzIHRvLlxuICAgICAqIEBwYXJhbSBjb3VudHMgVGhlIGNvdW50IG9iamVjdCB1c2VkIHRvIHRyYWNrIHJlcXVlc3RzIGZvciB0aGUgZWRpdCBzdW1tYXJ5LlxuICAgICAqIEBwYXJhbSBuZXdQYWdlVGV4dCBUaGUgbmV3IHBhZ2UgdGV4dC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcGVyZm9ybVN1YnR5cGVBY3Rpb25zKHNob3dBY3Rpb25zRGlhbG9nOiBBY3Rpb25zRGlhbG9nLCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sIG5ld1BhZ2VUZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgYW55UmVxdWVzdEhhbmRsZWQgPSB0aGlzLmFjdGlvbnNUb1Rha2Uuc29tZSgoYWN0aW9uRGF0YSkgPT5cbiAgICAgICAgICAgIE9iamVjdC52YWx1ZXMoYWN0aW9uRGF0YS5yZXF1ZXN0cykuc29tZSgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uICE9PSAnbm9uZScpLFxuICAgICAgICApO1xuXG4gICAgICAgIGlmIChhbnlSZXF1ZXN0SGFuZGxlZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCB7IHRhcmdldCwgcmVxdWVzdHMgfSBvZiB0aGlzLmFjdGlvbnNUb1Rha2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuc29tZShcbiAgICAgICAgICAgICAgICAgICAgKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2FjY2VwdCcgfHwgYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JyB8fCBhY3Rpb24uYWN0aW9uID09PSAnZGVueScsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q2xvc2VSZWFzb24gPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5maW5kKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScpPy5jbG9zaW5nUmVhc29uPy5pZDtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0Nsb3NlZCA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLmV2ZXJ5KFxuICAgICAgICAgICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnICYmIGFjdGlvbi5jbG9zaW5nUmVhc29uPy5pZCA9PT0gZmlyc3RDbG9zZVJlYXNvbixcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRQYWdlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlbmllZFBhZ2VzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWVudHMgPSBbXTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGFtb3VudE9mUGFnZXMgPSBPYmplY3Qua2V5cyhyZXF1ZXN0cykubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMocmVxdWVzdHMpKVxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbi5hY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCAmJiAhYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgYWNjZXB0ZWQgb3IgZGVuaWVkLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIHdpbGwgYmUgaWdub3JlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRlZFBhZ2VzLnB1c2gocmVxdWVzdGVkVGl0bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIGNvbW1lbnRzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uY29tbWVudF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuYWNjZXB0ZWQrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQgJiYgIWFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE5vdCBhbGwgcmVxdWVzdHMgdG8gXCIke3RhcmdldH1cIiB3ZXJlIGFjY2VwdGVkIG9yIGRlbmllZCwgdGhlIGhhbmRsaW5nIG9mIFwiJHtyZXF1ZXN0ZWRUaXRsZX1cIiBpcyBiZWluZyBpZ25vcmVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbmllZFBhZ2VzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uZGVueVJlYXNvbiFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmRlbmllZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1snY29tbWVudGVkIG9uJ10rKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVGhlIHJlcXVlc3QgdG8gY3JlYXRlIFwiJHtyZXF1ZXN0ZWRUaXRsZX1cIiBcdTIxOTIgXCIke3RhcmdldH1cIiB3YXMgbWFya2VkIHRvIGJlIGNvbW1lbnRlZCBvbiwgYnV0IG5vIGNvbW1lbnQgd2FzIHByb3ZpZGVkIHNvIGl0IHdpbGwgYmUgc2tpcHBlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsUmVxdWVzdHNDbG9zZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5jb21tZW50KSBjb21tZW50cy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmNvbW1lbnRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmNsb3NlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBOb3QgYWxsIHJlcXVlc3RzIHRvIFwiJHt0YXJnZXR9XCIgd2VyZSBjbG9zZWQgd2l0aCB0aGUgc2FtZSByZWFzb24sIHRoZSBoYW5kbGluZyBvZiBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgaXMgYmVpbmcgaWdub3JlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc2VjdGlvbkRhdGEgPSB7IHBhZ2VUZXh0OiBuZXdQYWdlVGV4dCwgLi4uT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cylbMF0ub3JpZ2luYWxUZXh0IH07XG5cbiAgICAgICAgICAgICAgICBpZiAoY29tbWVudHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IHRoaXMubWFwQ29tbWVudHMoY29tbWVudHMsIGFtb3VudE9mUGFnZXMgPT09IDEsIGNvbW1lbnRzLmxlbmd0aCA9PT0gYW1vdW50T2ZQYWdlcyksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsb3NpbmdJZDogc3RyaW5nO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY2NlcHRlZFBhZ2VzLmxlbmd0aCA+IDAgJiYgZGVuaWVkUGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0lkID0gJ3AnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY2NlcHRlZFBhZ2VzTWVzc2FnZSA9IGAqIHt7c3Vic3Q6QWZDIHJlZGlyZWN0fX0gKCR7YWNjZXB0ZWRQYWdlcy5tYXAoKHBhZ2UpID0+IGBbWyR7cGFnZX1dXWApLmpvaW4oJywgJyl9KSB+fn5+YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbmllZFBhZ2VzTWVzc2FnZSA9IHRoaXMubWFwRGVuaWVkUmVhc29ucyhkZW5pZWRQYWdlcywgZmFsc2UsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIGFjY2VwdGVkUGFnZXMpIHRoaXMuaGFuZGxlQWNjZXB0ZWRSZWRpcmVjdChwYWdlLCByZXF1ZXN0c1twYWdlXSwgdGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgJHthY2NlcHRlZFBhZ2VzTWVzc2FnZX1cXG4ke2RlbmllZFBhZ2VzTWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nSWQgPSAnYSc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBhY2NlcHRlZFBhZ2VzKSB0aGlzLmhhbmRsZUFjY2VwdGVkUmVkaXJlY3QocGFnZSwgcmVxdWVzdHNbcGFnZV0sIHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogYCoge3tzdWJzdDpBZkMgcmVkaXJlY3Qke2FjY2VwdGVkUGFnZXMubGVuZ3RoID4gMSA/ICd8YWxsJyA6ICcnfX19IH5+fn5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nSWQgPSAnZCc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogdGhpcy5tYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzLCBhbW91bnRPZlBhZ2VzID09PSAxLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7IHByZXBlbmQ6IGB7e0FmQy1jfCR7Y2xvc2luZ0lkfX19YCwgYXBwZW5kOiAne3tBZkMtY3xifX0nIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxsUmVxdWVzdHNDbG9zZWQpXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogYHt7QWZDLWN8JHtmaXJzdENsb3NlUmVhc29ufX19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogJ3t7QWZDLWN8Yn19JyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBuZXdQYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5iZWZvcmVUZXh0ICsgdGhpcy5wYWdlQ29udGVudCA9PT0gbmV3UGFnZVRleHQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCAocGFnZSBjb250ZW50IGlkZW50aWNhbCkhJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZENvdW50cyA9IE9iamVjdC5lbnRyaWVzKGNvdW50cylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCBjb3VudF0pID0+IGNvdW50ID4gMClcbiAgICAgICAgICAgICAgICAubWFwKChbYWN0aW9uLCBjb3VudF0pID0+IGAke2FjdGlvbn0gJHtjb3VudH1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBuZXdQYWdlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEhhbmRsaW5nIEFmQyByZWRpcmVjdCByZXF1ZXN0cyAoJHttYXBwZWRDb3VudHN9KSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlQWxsRWRpdHNDcmVhdGlvbnMoc2hvd0FjdGlvbnNEaWFsb2cpO1xuXG4gICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnQWxsIGNoYW5nZXMgbWFkZSwgY2xpY2sgYmVsb3cgdG8gcmVsb2FkIScsICdzdWNjZXNzJyk7XG5cbiAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLnNob3dSZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCEnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBwYWdlcyByZWxhdGVkIHRvIGFuIGFjY2VwdGVkIHJlZGlyZWN0IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIG9mIHRoZSByZXF1ZXN0ZWQgcGFnZS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2YgdGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBoYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2U6IHN0cmluZywgZGF0YTogUmVkaXJlY3RBY3Rpb24sIHRhcmdldDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRhZ3NXaXRoQXJndW1lbnRzID1cbiAgICAgICAgICAgIGRhdGEucmVkaXJlY3RUZW1wbGF0ZXMgJiYgZGF0YS5yZWRpcmVjdFRlbXBsYXRlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBkYXRhLnJlZGlyZWN0VGVtcGxhdGVzLm1hcCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRBcmd1bWVudEVkaXRvciA9IGRhdGEucmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM/LmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kQXJndW1lbnRFZGl0b3IpIHJldHVybiBge3ske3RhZ319fWA7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXggPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnMuZmluZExhc3RJbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtZXRlciwgaW5kZXgpID0+IHBhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpICYmIHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCksXG4gICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZEFyZ3VtZW50cyA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlICYmIGluZGV4ID4gbGFzdE51bWJlclBhcmFtZXRlckluZGV4KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB8JHtwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSA/ICcnIDogYCR7cGFyYW1ldGVyLm5hbWV9PWB9JHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBge3ske3RhZ30ke21hcHBlZEFyZ3VtZW50c319fWA7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICBjb25zdCB0aXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHBhZ2UpITtcblxuICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgdGV4dDogYCNSRURJUkVDVCBbWyR7dGFyZ2V0fV1dJHt0YWdzV2l0aEFyZ3VtZW50cyA/IGBcXG5cXG57e1JlZGlyZWN0IGNhdGVnb3J5IHNoZWxsfFxcbiR7dGFnc1dpdGhBcmd1bWVudHMuam9pbignXFxuJyl9XFxufX1gIDogJyd9YCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQ3JlYXRpbmcgcmVkaXJlY3QgdG8gW1ske3RhcmdldH1dXSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvUl1dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIHRleHQ6IGB7e1dpa2lQcm9qZWN0IGJhbm5lciBzaGVsbHxcXG57e1dpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnx0cz17e3N1YnN0OkxPQ0FMVElNRVNUQU1QfX18cmV2aWV3ZXI9JHttdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJyl9fX1cXG59fWAsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBbW1dpa2lwZWRpYTpXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb258V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9uXV0gYmFubmVyJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBMb29rdXBFbGVtZW50Q29uZmlnIH0gZnJvbSAnLi4vcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LXRhcmdldC1pbnB1dC13aWRnZXQnO1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBjYXRlZ29yeSBsb29rdXAgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2F0ZWdvcnlJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IDE0LFxuICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgICAgIHByb3A6ICdjYXRlZ29yaWVzJyxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzKVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAudGhlbigocmVzdWx0OiB7IHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IGNhdGVnb3JpZXM/OiB7IHRpdGxlOiBzdHJpbmcgfVtdIH1bXSB9IH0gfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8ucXVlcnk/LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcGFnZS5jYXRlZ29yaWVzPy5zb21lKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudGl0bGUgPT09ICdDYXRlZ29yeTpXaWtpcGVkaWEgc29mdCByZWRpcmVjdGVkIGNhdGVnb3JpZXMnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVdpdGhvdXROYW1lc3BhY2UgPSBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UsIGxhYmVsOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCBwYWdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwYWdlcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIH07XG5cbiAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+XG4gICAgICAgIGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xufVxuXG5PYmplY3QuYXNzaWduKENhdGVnb3J5SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycyB9IGZyb20gJy4uLy4uL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgdHlwZSB7IExvb2t1cEVsZW1lbnRDb25maWcgfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtdGFyZ2V0LWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIHBhZ2UgbG9va3VwIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBhZ2VJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IHBhcnNlZFRpdGxlPy5nZXROYW1lc3BhY2VJZCgpID8/IDAsXG4gICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycylcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogeyBxdWVyeTogeyBwYWdlczogeyB0aXRsZTogc3RyaW5nIH1bXSB9IH0gfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8ucXVlcnk/LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzLm1hcCgocGFnZSkgPT4gKHsgZGF0YTogcGFnZS50aXRsZSwgbGFiZWw6IHBhZ2UudGl0bGUgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCBwYWdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwYWdlcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIH07XG5cbiAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+XG4gICAgICAgIGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xufVxuXG5PYmplY3QuYXNzaWduKFBhZ2VJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgQ2F0ZWdvcnlJbnB1dFdpZGdldCBmcm9tICcuL2NhdGVnb3J5LWlucHV0LXdpZGdldCc7XG5pbXBvcnQgSGVscGVyRGlhbG9nLCB7IHR5cGUgUmVxdWVzdEFjdGlvbiwgdHlwZSBSZXF1ZXN0QWN0aW9uVHlwZSwgdHlwZSBSZXF1ZXN0UmVxdWVzdGVyIH0gZnJvbSAnLi9oZWxwZXItZGlhbG9nJztcbmltcG9ydCBQYWdlSW5wdXRXaWRnZXQgZnJvbSAnLi9wYWdlLWlucHV0LXdpZGdldCc7XG5pbXBvcnQgdHlwZSBBY3Rpb25zRGlhbG9nIGZyb20gJy4vc2hvdy1hY3Rpb25zLWRpYWxvZyc7XG5cbmludGVyZmFjZSBDYXRlZ29yeVJlcXVlc3REYXRhIHtcbiAgICBjYXRlZ29yeTogc3RyaW5nO1xuICAgIGV4YW1wbGVzOiBzdHJpbmdbXTtcbiAgICBwYXJlbnRzOiBzdHJpbmdbXTtcbiAgICByZXF1ZXN0ZXI6IFJlcXVlc3RSZXF1ZXN0ZXI7XG59XG5cbmV4cG9ydCB0eXBlIENhdGVnb3J5QWN0aW9uID0gUmVxdWVzdEFjdGlvbiAmIHsgY2F0ZWdvcnk6IHN0cmluZzsgZXhhbXBsZXM6IHN0cmluZ1tdOyBwYXJlbnRzOiBzdHJpbmdbXSB9O1xuXG5leHBvcnQgdHlwZSBDYXRlZ29yeUFjdGlvbnMgPSBDYXRlZ29yeUFjdGlvbltdO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yaWVzRGlhbG9nIGV4dGVuZHMgSGVscGVyRGlhbG9nIHtcbiAgICBwcm90ZWN0ZWQgcGFyc2VkUmVxdWVzdHM6IENhdGVnb3J5UmVxdWVzdERhdGFbXSA9IFtdO1xuICAgIHByaXZhdGUgYWN0aW9uc1RvVGFrZTogQ2F0ZWdvcnlBY3Rpb25zID0gW107XG5cbiAgICAvKipcbiAgICAgKiBQYXJzZXMgcmVkaXJlY3QgcmVxdWVzdHMgZnJvbSBzZWN0aW9uIHRleHQuXG4gICAgICogQHBhcmFtIHNlY3Rpb25UZXh0IFRoZSBzZWN0aW9uIHRleHQuXG4gICAgICogQHBhcmFtIHNlY3Rpb25IZWFkZXIgVGhlIHNlY3Rpb24gaGVhZGVyLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBwYXJzZVN1YnR5cGVSZXF1ZXN0cyhzZWN0aW9uVGV4dDogc3RyaW5nLCBzZWN0aW9uSGVhZGVyOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IHt9IGFzIENhdGVnb3J5UmVxdWVzdERhdGE7XG5cbiAgICAgICAgY29uc3QgZm91bmRDYXRlZ29yeSA9IC86P0NhdGVnb3J5OiguKj8pKF1dfCQpLy5leGVjKHNlY3Rpb25IZWFkZXIpPy5bMV0udHJpbSgpO1xuICAgICAgICBpZiAoIWZvdW5kQ2F0ZWdvcnkpIHJldHVybjtcblxuICAgICAgICBwYXJzZWREYXRhLmNhdGVnb3J5ID0gZm91bmRDYXRlZ29yeS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICBwYXJzZWREYXRhLmV4YW1wbGVzID1cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAuLi4oXG4gICAgICAgICAgICAgICAgICAgIC9leGFtcGxlIHBhZ2VzIHdoaWNoIGJlbG9uZyB0byB0aGlzIGNhdGVnb3J5OiguKj8pKHBhcmVudCBjYXRlZ29yeVxcL2NhdGVnb3JpZXM6fFxcblxcW1xcWyhzcGVjaWFsOmNvbnRyaWJ1dGlvbnNcXC98dXNlcjopKS9pcy5leGVjKFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvblRleHQsXG4gICAgICAgICAgICAgICAgICAgICk/LlsxXSA/PyAnJ1xuICAgICAgICAgICAgICAgICkubWF0Y2hBbGwoL1xcKlxccyooPzpcXFtcXFspPyguKj8pKFxcfHxdXXxcXHMqP1xcbikvZyksXG4gICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdLnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pID8/IFtdO1xuXG4gICAgICAgIHBhcnNlZERhdGEucGFyZW50cyA9XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgLi4uKFxuICAgICAgICAgICAgICAgICAgICAvcGFyZW50IGNhdGVnb3J5XFwvY2F0ZWdvcmllczooLio/KShcXG5cXG58XFxuXFxbXFxbKHNwZWNpYWw6Y29udHJpYnV0aW9uc1xcL3x1c2VyOikpL2lzLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0gPz8gJydcbiAgICAgICAgICAgICAgICApLm1hdGNoQWxsKC8oPzwhXFx8KSM/Oj9DYXRlZ29yeTooLio/KShcXHx8XV18XFxzKj9cXG4pL2cpLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgID8ubWFwKChtYXRjaCkgPT4gbWF0Y2hbMV0udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgPz8gW107XG5cbiAgICAgICAgY29uc3QgZmlyc3RVc2VySW5kZXggPSBzZWN0aW9uVGV4dC5pbmRleE9mKCdbW1VzZXI6Jyk7XG4gICAgICAgIGNvbnN0IGZpcnN0VXNlclRhbGtJbmRleCA9IHNlY3Rpb25UZXh0LmluZGV4T2YoJ1tbVXNlciB0YWxrOicpO1xuICAgICAgICBjb25zdCBmaXJzdElwSW5kZXggPSBzZWN0aW9uVGV4dC5pbmRleE9mKCdbW1NwZWNpYWw6Q29udHJpYnV0aW9ucy8nKTtcblxuICAgICAgICBjb25zdCBmaXJzdEluZGV4ID0gTWF0aC5taW4oLi4uW2ZpcnN0VXNlckluZGV4LCBmaXJzdFVzZXJUYWxrSW5kZXgsIGZpcnN0SXBJbmRleF0uZmlsdGVyKChpbmRleCkgPT4gaW5kZXggIT09IC0xKSk7XG5cbiAgICAgICAgcGFyc2VkRGF0YS5yZXF1ZXN0ZXIgPVxuICAgICAgICAgICAgZmlyc3RJbmRleCA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZXG4gICAgICAgICAgICAgICAgPyBudWxsXG4gICAgICAgICAgICAgICAgOiBmaXJzdEluZGV4ID09PSBmaXJzdElwSW5kZXhcbiAgICAgICAgICAgICAgICAgID8geyB0eXBlOiAnaXAnLCBuYW1lOiAvXFxbXFxbU3BlY2lhbDpDb250cmlidXRpb25zXFwvKC4qPykoXFx8fF1dKS8uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKSB9XG4gICAgICAgICAgICAgICAgICA6IHsgdHlwZTogJ3VzZXInLCBuYW1lOiAvXFxbXFxbVXNlcig/OiB0YWxrKT86KC4qPykoXFx8fF1dKS8uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKSB9O1xuICAgICAgICBpZiAoIXBhcnNlZERhdGEucmVxdWVzdGVyPy5uYW1lKSBwYXJzZWREYXRhLnJlcXVlc3RlciA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5wYXJzZWRSZXF1ZXN0cy5wdXNoKHBhcnNlZERhdGEpO1xuXG4gICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZS5wdXNoKHtcbiAgICAgICAgICAgIGNhdGVnb3J5OiBwYXJzZWREYXRhLmNhdGVnb3J5LFxuICAgICAgICAgICAgZXhhbXBsZXM6IHBhcnNlZERhdGEuZXhhbXBsZXMsXG4gICAgICAgICAgICBwYXJlbnRzOiBwYXJzZWREYXRhLnBhcmVudHMsXG4gICAgICAgICAgICBvcmlnaW5hbFRleHQ6IHsgZnVsbFNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dCwgc2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LnJlcGxhY2UoL149PS4qPz09JC9tLCAnJykudHJpbSgpIH0sXG4gICAgICAgICAgICBhY3Rpb246ICdub25lJyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgYSBnaXZlbiBjYXRlZ29yeSByZXF1ZXN0IGludG8gdGhlIGRpYWxvZy5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZXF1ZXN0IHRvIGxvYWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGxvYWRTdWJ0eXBlRWxlbWVudHMoaW5kZXg6IG51bWJlcikge1xuICAgICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5wYXJzZWRSZXF1ZXN0c1tpbmRleF07XG5cbiAgICAgICAgY29uc3QgZGV0YWlsc0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0Jyk7XG4gICAgICAgIGRldGFpbHNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCkpO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC5pbm5lckhUTUwgPSBgPGI+Q2F0ZWdvcnk6JHtyZXF1ZXN0LmNhdGVnb3J5fTwvYj5gO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RJbmZvRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbycpO1xuXG4gICAgICAgIGNvbnN0IG5vbmVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICBub25lRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgbm9uZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnTm9uZSc7XG5cbiAgICAgICAgY29uc3QgdW5rbm93bkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgIHVua25vd25FbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICB1bmtub3duRWxlbWVudC50ZXh0Q29udGVudCA9ICdVbmtub3duJztcblxuICAgICAgICBjb25zdCBleGFtcGxlc0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IGV4YW1wbGVzTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIGV4YW1wbGVzTGFiZWwudGV4dENvbnRlbnQgPSAnRXhhbXBsZXM6ICc7XG4gICAgICAgIGV4YW1wbGVzRGl2LmFwcGVuZChleGFtcGxlc0xhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5leGFtcGxlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGV4YW1wbGVdIG9mIHJlcXVlc3QuZXhhbXBsZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKGV4YW1wbGUpO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gZXhhbXBsZTtcblxuICAgICAgICAgICAgICAgIGV4YW1wbGVzRGl2LmFwcGVuZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IHJlcXVlc3QuZXhhbXBsZXMubGVuZ3RoIC0gMSkgZXhhbXBsZXNEaXYuYXBwZW5kKCcsICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlIGV4YW1wbGVzRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQoZXhhbXBsZXNEaXYpO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudHNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCBwYXJlbnRzTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHBhcmVudHNMYWJlbC50ZXh0Q29udGVudCA9ICdQYXJlbnRzOiAnO1xuICAgICAgICBwYXJlbnRzRGl2LmFwcGVuZChwYXJlbnRzTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnBhcmVudHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBwYXJlbnRdIG9mIHJlcXVlc3QucGFyZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoYENhdGVnb3J5OiR7cGFyZW50fWApO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gcGFyZW50O1xuXG4gICAgICAgICAgICAgICAgcGFyZW50c0Rpdi5hcHBlbmQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSByZXF1ZXN0LnBhcmVudHMubGVuZ3RoIC0gMSkgcGFyZW50c0Rpdi5hcHBlbmQoJywgJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGVsc2UgcGFyZW50c0Rpdi5hcHBlbmQobm9uZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHBhcmVudHNEaXYpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlckxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICByZXF1ZXN0ZXJMYWJlbC50ZXh0Q29udGVudCA9ICdSZXF1ZXN0ZXI6ICc7XG4gICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnJlcXVlc3Rlcikge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLmhyZWYgPVxuICAgICAgICAgICAgICAgIHJlcXVlc3QucmVxdWVzdGVyLnR5cGUgPT09ICd1c2VyJ1xuICAgICAgICAgICAgICAgICAgICA/IG13LnV0aWwuZ2V0VXJsKGBVc2VyOiR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKVxuICAgICAgICAgICAgICAgICAgICA6IG13LnV0aWwuZ2V0VXJsKGBTcGVjaWFsOkNvbnRyaWJ1dGlvbnMvJHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay50ZXh0Q29udGVudCA9IHJlcXVlc3QucmVxdWVzdGVyLm5hbWU7XG4gICAgICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxpbmspO1xuICAgICAgICB9IGVsc2UgcmVxdWVzdGVyRGl2LmFwcGVuZCh1bmtub3duRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocmVxdWVzdGVyRGl2KTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdEluZm9FbGVtZW50KTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKSk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyJyk7XG5cbiAgICAgICAgY29uc3QgYWN0aW9uUmFkaW9JbnB1dCA9IG5ldyBPTy51aS5SYWRpb1NlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci1hY3Rpb24tcmFkaW8nXSxcbiAgICAgICAgICAgIGl0ZW1zOiBbJ0FjY2VwdCcsICdEZW55JywgJ0NvbW1lbnQnLCAnQ2xvc2UnLCAnTm9uZSddLm1hcCgobGFiZWwpID0+IG5ldyBPTy51aS5SYWRpb09wdGlvbldpZGdldCh7IGRhdGE6IGxhYmVsLCBsYWJlbCB9KSksXG4gICAgICAgIH0pO1xuICAgICAgICBhY3Rpb25SYWRpb0lucHV0LnNlbGVjdEl0ZW1CeUxhYmVsKCdOb25lJyk7XG4gICAgICAgIGFjdGlvblJhZGlvSW5wdXQub24oJ2Nob29zZScsICgpID0+IHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApO1xuXG4gICAgICAgICAgICBjb25zdCBvcHRpb24gPSAoXG4gICAgICAgICAgICAgICAgKGFjdGlvblJhZGlvSW5wdXQuZmluZFNlbGVjdGVkSXRlbSgpIGFzIE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KS5nZXREYXRhKCkgYXMgc3RyaW5nXG4gICAgICAgICAgICApLnRvTG93ZXJDYXNlKCkgYXMgUmVxdWVzdEFjdGlvblR5cGU7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uYWN0aW9uID0gb3B0aW9uO1xuXG4gICAgICAgICAgICBpZiAoWydjb21tZW50JywgJ2Nsb3NlJ10uaW5jbHVkZXMob3B0aW9uKSkge1xuICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmIChjb21tZW50KSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICAgICAgICAgIGVsc2UgZGVsZXRlIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY29tbWVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNvbW1lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50LCBpbmRleCk7XG5cbiAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgY2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYWdlU2VsZWN0SW5wdXQgPSBuZXcgUGFnZUlucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdBZGQgcGFnZXMgaGVyZScgfSk7XG4gICAgICAgIHBhZ2VTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gcGFnZVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL146LywgJycpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgcGFnZVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBwYWdlU2VsZWN0SW5wdXQub24oJ3Nob3dpbmctdmFsdWVzJywgKHBhZ2VzOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgcGFnZVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFnZVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLFxuICAgICAgICAgICAgaW5wdXRXaWRnZXQ6IHBhZ2VTZWxlY3RJbnB1dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHBhZ2VTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAocGFnZVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgaWYgKChwYWdlU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHBhZ2VTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uZXhhbXBsZXMgPSBzb3J0ZWRUYWdzO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB7IGV4YW1wbGVzIH0gPSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdO1xuXG4gICAgICAgIGZvciAoY29uc3QgZXhhbXBsZSBvZiBleGFtcGxlcykgcGFnZVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUoZXhhbXBsZSk7XG4gICAgICAgIHBhZ2VTZWxlY3Quc2V0VmFsdWUoZXhhbXBsZXMpO1xuXG4gICAgICAgIGNvbnN0IHBhZ2VTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQocGFnZVNlbGVjdCwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnUGFnZXMgdG8gY2F0ZWdvcml6ZTonIH0pO1xuICAgICAgICBwYWdlU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBjb25zdCBjYXRlZ29yeVNlbGVjdElucHV0ID0gbmV3IENhdGVnb3J5SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ0FkZCBjYXRlZ29yaWVzIGhlcmUnIH0pO1xuICAgICAgICBjYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSBjYXRlZ29yeVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSBjYXRlZ29yeVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBjYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdzaG93aW5nLXZhbHVlcycsIChwYWdlczogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIGNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjYXRlZ29yeVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLFxuICAgICAgICAgICAgaW5wdXRXaWRnZXQ6IGNhdGVnb3J5U2VsZWN0SW5wdXQsXG4gICAgICAgIH0pO1xuICAgICAgICBjYXRlZ29yeVNlbGVjdC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9IChjYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgaWYgKChjYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSBjYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5wYXJlbnRzID0gc29ydGVkVGFncztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgeyBwYXJlbnRzIH0gPSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudHMpIGNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYXJlbnQpO1xuICAgICAgICBjYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZShwYXJlbnRzKTtcblxuICAgICAgICBjb25zdCBjYXRlZ29yeVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjYXRlZ29yeVNlbGVjdCwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnQ2F0ZWdvcmllczonIH0pO1xuICAgICAgICBjYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgY29uc3QgZGVueVJlYXNvbiA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnYXV0b2ZpbGw6dW5saWtlbHknLFxuICAgICAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAgICAgIFsnZXhpc3RzJywgJ2V4aXN0aW5nIGNhdGVnb3JpZXMnXSxcbiAgICAgICAgICAgICAgICBbJ2VtcHR5JywgJ2VtcHR5IHN1Ym1pc3Npb25zJ10sXG4gICAgICAgICAgICAgICAgWyd1bmxpa2VseScsICdjYXRlZ29yaWVzIHRoYXQgYXJlIHVubGlrZWx5IHRvIGhhdmUgZW5vdWdoIHBhZ2VzJ10sXG4gICAgICAgICAgICAgICAgWydub3RjYXRlZ29yeScsICdwYWdlIGNyZWF0aW9uIHJlcXVlc3RzJ10sXG4gICAgICAgICAgICAgICAgWydub3RlbmdsaXNoJywgJ3JlcXVlc3RzIG5vdCBpbiBFbmdsaXNoJ10sXG4gICAgICAgICAgICBdLm1hcCgoW3ZhbHVlLCBsYWJlbF0pID0+ICh7IGRhdGE6IGBhdXRvZmlsbDoke3ZhbHVlfWAsIGxhYmVsOiBgQXV0b2ZpbGxlZCB0ZXh0IGZvciAke2xhYmVsfWAgfSkpLFxuICAgICAgICB9KTtcbiAgICAgICAgZGVueVJlYXNvbi5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5kZW55UmVhc29uID0gZGVueVJlYXNvbi5nZXRWYWx1ZSgpIHx8ICdhdXRvZmlsbDp1bmxpa2VseSc7XG4gICAgICAgIH0pO1xuICAgICAgICBkZW55UmVhc29uLnNldFZhbHVlKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuICAgICAgICBkZW55UmVhc29uLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuXG4gICAgICAgIGNvbnN0IGRlbnlSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoZGVueVJlYXNvbiwge1xuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdEZW55IHJlYXNvbjonLFxuICAgICAgICAgICAgaGVscDogJ1N1cHBvcnRzIGF1dG9tYXRpYyByZWFzb25pbmcsIGN1c3RvbSByZWFzb25pbmcsIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIHR3byB3aXRoIFwiYXV0b2ZpbGw6UkVBU09OLCBDVVNUT01cIiBmb3JtYXQnLFxuICAgICAgICB9KTtcbiAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbiA9IG5ldyBPTy51aS5Ecm9wZG93bldpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICBtZW51OiB7XG4gICAgICAgICAgICAgICAgaXRlbXM6IFtcbiAgICAgICAgICAgICAgICAgICAgWydObyByZXNwb25zZScsICdyJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnU3VjY2VlZGVkJywgJ3MnXSxcbiAgICAgICAgICAgICAgICAgICAgWydXaXRoZHJhd24nLCAndyddLFxuICAgICAgICAgICAgICAgIF0ubWFwKChbdGl0bGUsIGlkXSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhOiBpZCwgbGFiZWw6IHRpdGxlIH0pKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5vbignY2hvb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5maW5kU2VsZWN0ZWRJdGVtKCkgYXMgT08udWkuTWVudU9wdGlvbldpZGdldDtcblxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jbG9zaW5nUmVhc29uID0ge1xuICAgICAgICAgICAgICAgIG5hbWU6IHNlbGVjdGVkLmdldExhYmVsKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgIGlkOiBzZWxlY3RlZC5nZXREYXRhKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQsIGluZGV4KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoJ3InKTtcbiAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jbG9zaW5nUmVhc29uID0geyBuYW1lOiAnTm8gcmVzcG9uc2UnLCBpZDogJ3InIH07XG5cbiAgICAgICAgY29uc3QgY2xvc2luZ1JlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjbG9zaW5nUmVhc29uLCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDbG9zaW5nIHJlYXNvbjonIH0pO1xuICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBjb25zdCBjb21tZW50SW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KCk7XG4gICAgICAgIGNvbW1lbnRJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKGNvbW1lbnQpIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgICAgICBlbHNlIGRlbGV0ZSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNvbW1lbnQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjb21tZW50SW5wdXQsIHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY29tbWVudC1pbnB1dCddLFxuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdDb21tZW50OicsXG4gICAgICAgIH0pO1xuICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmFwcGVuZChcbiAgICAgICAgICAgIGFjdGlvblJhZGlvSW5wdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBwYWdlU2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgY2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgKTtcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdFJlc3BvbmRlckVsZW1lbnQpO1xuXG4gICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChkZXRhaWxzRWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyB0aGUgY29sb3Igb2YgYSBkZXRhaWxzIGVsZW1lbnQgYmFzZWQgb24gdGhlIGhhbmRsaW5nIG9mIHRoZSByZXF1ZXN0cyBpbnNpZGUuXG4gICAgICogQHBhcmFtIGRldGFpbHNFbGVtZW50IFRoZSBkZXRhaWxzIGVsZW1lbnQgdG8gdXBkYXRlLlxuICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHJlZGlyZWN0IHRhcmdldC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgdXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgeyBhY3Rpb24gfSA9IHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF07XG5cbiAgICAgICAgbGV0IGJhY2tncm91bmRDb2xvciA9ICcnO1xuXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL3ByZWZlci1zd2l0Y2hcbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2FjY2VwdCcpIGJhY2tncm91bmRDb2xvciA9ICcjYTBmZmEwJztcbiAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAnZGVueScpIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAnY2xvc2UnKVxuICAgICAgICAgICAgaWYgKHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY2xvc2luZ1JlYXNvbj8uaWQgPT09ICdyJykgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jbG9zaW5nUmVhc29uPy5pZCA9PT0gJ3MnKSBiYWNrZ3JvdW5kQ29sb3IgPSAnIzkwYzA5MCc7XG4gICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjYjhiOGI4JztcblxuICAgICAgICBkZXRhaWxzRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGVyZm9ybXMgYWN0aW9ucyBvbiBhIGdpdmVuIGNhdGVnb3J5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHNob3dBY3Rpb25zRGlhbG9nIFRoZSBkaWFsb2cgdG8gYWRkIG1lc3NhZ2VzIHRvLlxuICAgICAqIEBwYXJhbSBjb3VudHMgVGhlIGNvdW50IG9iamVjdCB1c2VkIHRvIHRyYWNrIHJlcXVlc3RzIGZvciB0aGUgZWRpdCBzdW1tYXJ5LlxuICAgICAqIEBwYXJhbSBuZXdQYWdlVGV4dCBUaGUgbmV3IHBhZ2UgdGV4dC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYXN5bmMgcGVyZm9ybVN1YnR5cGVBY3Rpb25zKHNob3dBY3Rpb25zRGlhbG9nOiBBY3Rpb25zRGlhbG9nLCBjb3VudHM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4sIG5ld1BhZ2VUZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgYW55UmVxdWVzdEhhbmRsZWQgPSB0aGlzLmFjdGlvbnNUb1Rha2Uuc29tZSgoYWN0aW9uRGF0YSkgPT4gYWN0aW9uRGF0YS5hY3Rpb24gIT09ICdub25lJyk7XG5cbiAgICAgICAgaWYgKGFueVJlcXVlc3RIYW5kbGVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbkRhdGEgb2YgdGhpcy5hY3Rpb25zVG9UYWtlKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlY3Rpb25EYXRhID0geyBwYWdlVGV4dDogbmV3UGFnZVRleHQsIC4uLmFjdGlvbkRhdGEub3JpZ2luYWxUZXh0IH07XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbkRhdGEuYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6ICd7e0FmQy1jfGF9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiAnKiB7e3N1YnN0OkFmQyBjYXRlZ29yeX19IH5+fn5cXG57e0FmQy1jfGJ9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBY2NlcHRlZENhdGVnb3J5KGFjdGlvbkRhdGEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuYWNjZXB0ZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6ICd7e0FmQy1jfGR9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKGFjdGlvbkRhdGEuZGVueVJlYXNvbiEpfSB+fn5+XFxue3tBZkMtY3xifX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5kZW5pZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25EYXRhLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgKiB7e0FmQyBjb21tZW50fDE9JHthY3Rpb25EYXRhLmNvbW1lbnR9fX0gfn5+fmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbJ2NvbW1lbnRlZCBvbiddKys7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSByZXF1ZXN0IHRvIGNyZWF0ZSBcIiR7YWN0aW9uRGF0YS5jYXRlZ29yeX1cIiB3YXMgbWFya2VkIHRvIGJlIGNvbW1lbnRlZCBvbiwgYnV0IG5vIGNvbW1lbnQgd2FzIHByb3ZpZGVkIHNvIGl0IHdpbGwgYmUgc2tpcHBlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnY2xvc2UnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kOiBge3tBZkMtY3wke2FjdGlvbkRhdGEuY2xvc2luZ1JlYXNvbiEuaWR9fX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogKGFjdGlvbkRhdGEuY29tbWVudCA/IGAqIHt7QWZDIGNvbW1lbnR8MT0ke2FjdGlvbkRhdGEuY29tbWVudH19fSB+fn5+YCA6ICcnKSArICdcXG57e0FmQy1jfGJ9JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuY2xvc2VkKys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbmV3UGFnZVRleHQgPSBzZWN0aW9uRGF0YS5wYWdlVGV4dDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuYmVmb3JlVGV4dCArIHRoaXMucGFnZUNvbnRlbnQgPT09IG5ld1BhZ2VUZXh0KVxuICAgICAgICAgICAgICAgIHJldHVybiBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQgKHBhZ2UgY29udGVudCBpZGVudGljYWwpIScpO1xuXG4gICAgICAgICAgICBjb25zdCBtYXBwZWRDb3VudHMgPSBPYmplY3QuZW50cmllcyhjb3VudHMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoWywgY291bnRdKSA9PiBjb3VudCA+IDApXG4gICAgICAgICAgICAgICAgLm1hcCgoW2FjdGlvbiwgY291bnRdKSA9PiBgJHthY3Rpb259ICR7Y291bnR9YClcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcblxuICAgICAgICAgICAgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZWRpdCcsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogbmV3UGFnZVRleHQsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBIYW5kbGluZyBBZkMgY2F0ZWdvcnkgcmVxdWVzdHMgKCR7bWFwcGVkQ291bnRzfSkke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZUFsbEVkaXRzQ3JlYXRpb25zKHNob3dBY3Rpb25zRGlhbG9nKTtcblxuICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ0FsbCBjaGFuZ2VzIG1hZGUsIGNsaWNrIGJlbG93IHRvIHJlbG9hZCEnLCAnc3VjY2VzcycpO1xuXG4gICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5zaG93UmVsb2FkKCk7XG4gICAgICAgIH0gZWxzZSBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQhJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgcGFnZXMgcmVsYXRlZCB0byBhbiBhY2NlcHRlZCBjYXRlZ29yeSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIG9mIHRoZSByZXF1ZXN0ZWQgY2F0ZWdvcnkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGhhbmRsZUFjY2VwdGVkQ2F0ZWdvcnkoZGF0YTogQ2F0ZWdvcnlBY3Rpb24pIHtcbiAgICAgICAgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5wdXNoKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgICAgIGlzUmVkaXJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiBgQ2F0ZWdvcnk6JHtkYXRhLmNhdGVnb3J5fWAsXG4gICAgICAgICAgICAgICAgdGV4dDogZGF0YS5wYXJlbnRzLm1hcCgocGFyZW50KSA9PiBgW1tDYXRlZ29yeToke3BhcmVudH1dXWApLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBDcmVhdGluZyBjYXRlZ29yeSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvQ11dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IGBDYXRlZ29yeSB0YWxrOiR7ZGF0YS5jYXRlZ29yeX1gLFxuICAgICAgICAgICAgICAgIHRleHQ6IGB7e1dpa2lQcm9qZWN0IGJhbm5lciBzaGVsbHxcXG57e1dpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnx0cz17e3N1YnN0OkxPQ0FMVElNRVNUQU1QfX18cmV2aWV3ZXI9JHttdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJyl9fX1cXG59fWAsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBbW1dpa2lwZWRpYTpXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb258V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9uXV0gYmFubmVyJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5kYXRhLmV4YW1wbGVzLm1hcCgoZXhhbXBsZSkgPT4gKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZWRpdCcgYXMgY29uc3QsXG4gICAgICAgICAgICAgICAgdGl0bGU6IGV4YW1wbGUsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoeyBjb250ZW50IH06IHsgY29udGVudDogc3RyaW5nIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGAke2NvbnRlbnR9XFxuW1tDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9XV1gLFxuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWRkaW5nIHBhZ2UgdG8gW1s6Q2F0ZWdvcnk6JHtkYXRhLmNhdGVnb3J5fV1dIGFzIHJlcXVlc3RlZCBhdCBbW1dQOkFGQy9DXV0ke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSkpLFxuICAgICAgICApO1xuICAgIH1cbn1cbiIsICJleHBvcnQgdHlwZSBXYXRjaE1ldGhvZCA9ICdub2NoYW5nZScgfCAncHJlZmVyZW5jZXMnIHwgJ3Vud2F0Y2gnIHwgJ3dhdGNoJztcblxuZGVjbGFyZSBnbG9iYWwge1xuICAgIGludGVyZmFjZSBXaW5kb3cge1xuICAgICAgICBhZmNyY0NvbmZpZ3VyYXRpb24/OiB7IGNyZWF0ZWRQYWdlV2F0Y2hNZXRob2Q/OiBXYXRjaE1ldGhvZCB9O1xuICAgIH1cbn1cblxubXcubG9hZGVyLnVzaW5nKFsnbWVkaWF3aWtpLnV0aWwnLCAnb29qcy11aS1jb3JlJywgJ29vanMtdWktd2lkZ2V0cycsICdvb2pzLXVpLXdpbmRvd3MnXSwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdDogUmVkaXJlY3RzRGlhbG9nIH0gPSBhd2FpdCBpbXBvcnQoJy4vcmVkaXJlY3RzLWRpYWxvZycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgIGNvbnN0IHsgZGVmYXVsdDogQ2F0ZWdvcmllc0RpYWxvZyB9ID0gYXdhaXQgaW1wb3J0KCcuL2NhdGVnb3JpZXMtZGlhbG9nJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG5cbiAgICBjb25zdCBwYWdlTmFtZSA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgIGNvbnN0IGlzUmVkaXJlY3RSZXF1ZXN0UGFnZSA9IHBhZ2VOYW1lID09PSAnV2lraXBlZGlhOkFydGljbGVzIGZvciBjcmVhdGlvbi9SZWRpcmVjdHMnO1xuICAgIGNvbnN0IGlzQ2F0ZWdvcnlSZXF1ZXN0UGFnZSA9IHBhZ2VOYW1lID09PSAnV2lraXBlZGlhOkFydGljbGVzIGZvciBjcmVhdGlvbi9DYXRlZ29yaWVzJztcblxuICAgIGlmICghaXNSZWRpcmVjdFJlcXVlc3RQYWdlICYmICFpc0NhdGVnb3J5UmVxdWVzdFBhZ2UpIHJldHVybjtcblxuICAgIGNvbnN0IHJlcXVlc3RQYWdlVHlwZSA9IGlzUmVkaXJlY3RSZXF1ZXN0UGFnZSA/ICdyZWRpcmVjdCcgOiAnY2F0ZWdvcnknO1xuXG4gICAgY29uc3QgbGluayA9IG13LnV0aWwuYWRkUG9ydGxldExpbmsoXG4gICAgICAgIG13LmNvbmZpZy5nZXQoJ3NraW4nKSA9PT0gJ21pbmVydmEnID8gJ3AtdGInIDogJ3AtY2FjdGlvbnMnLFxuICAgICAgICAnIycsXG4gICAgICAgIGBIYW5kbGUgJHtyZXF1ZXN0UGFnZVR5cGV9IGNyZWF0aW9uIHJlcXVlc3RzYCxcbiAgICAgICAgJ2FmY3JjLWhlbHBlcicsXG4gICAgKSE7XG5cbiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHdpbmRvd01hbmFnZXIuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIGNvbnN0IGhlbHBlciA9IHJlcXVlc3RQYWdlVHlwZSA9PT0gJ3JlZGlyZWN0JyA/IFJlZGlyZWN0c0RpYWxvZyA6IENhdGVnb3JpZXNEaWFsb2c7XG5cbiAgICAgICAgY29uc3QgYWZjcmNIZWxwZXJEaWFsb2cgPSBuZXcgaGVscGVyKHJlcXVlc3RQYWdlVHlwZSwgcGFnZU5hbWUsIHdpbmRvdy5hZmNyY0NvbmZpZ3VyYXRpb24/LmNyZWF0ZWRQYWdlV2F0Y2hNZXRob2QpO1xuXG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbYWZjcmNIZWxwZXJEaWFsb2ddKTtcblxuICAgICAgICBhZmNyY0hlbHBlckRpYWxvZy5vcGVuKCk7XG4gICAgICAgIGFmY3JjSGVscGVyRGlhbG9nLmxvYWQoKTtcbiAgICB9KTtcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O2dKQUFBLElBR3FCQSxFQUhyQkMsRUFBQUMsRUFBQSxrQkFHcUJGLEVBQXJCLE1BQXFCRyxVQUFzQixHQUFHLEdBQUcsTUFBTyxDQUM1QyxjQUNBLFVBQ0EsWUFFUixhQUFjLENBQ1YsTUFBTSxDQUFFLEtBQU0sT0FBUSxDQUFDLEVBRXZCQSxFQUFjLE9BQU8sS0FB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QyxFQUFnQixJQUFJLEdBQUcsR0FBRyxjQUNoQyxTQUFTLEtBQUssT0FBT0EsRUFBYyxTQUFTLENBQUMsQ0FBQyxFQUU5QyxJQUFNQyxFQUFTSCxJQUFvQixXQUFhSixFQUFrQkMsRUFFNURPLEVBQW9CLElBQUlELEVBQU9ILEVBQWlCRixFQUFVLE9BQU8sb0JBQW9CLHNCQUFzQixFQUVqSEksRUFBYyxXQUFXLENBQUNFLENBQWlCLENBQUMsRUFFNUNBLEVBQWtCLEtBQUssRUFDdkJBLEVBQWtCLEtBQUssQ0FDM0IsQ0FBQyxDQUNMLENBQUMiLAogICJuYW1lcyI6IFsiQWN0aW9uc0RpYWxvZyIsICJpbml0X3Nob3dfYWN0aW9uc19kaWFsb2ciLCAiX19lc21NaW4iLCAiX0FjdGlvbnNEaWFsb2ciLCAibWVzc2FnZSIsICJ0eXBlIiwgIm1lc3NhZ2VXaWRnZXQiLCAicmVsb2FkQnV0dG9uIiwgIkhlbHBlckRpYWxvZyIsICJpbml0X2hlbHBlcl9kaWFsb2ciLCAiX19lc21NaW4iLCAiaW5pdF9zaG93X2FjdGlvbnNfZGlhbG9nIiwgIl9IZWxwZXJEaWFsb2ciLCAicmVxdWVzdFBhZ2VUeXBlIiwgInBhZ2VUaXRsZSIsICJjcmVhdGVkV2F0Y2hNZXRob2QiLCAiYWN0aW9uIiwgImNvbmZpcm1lZCIsICJwYWdlUmV2aXNpb24iLCAic2VjdGlvbnMiLCAibWF0Y2giLCAic2VjdGlvblRleHQiLCAic2VjdGlvbkhlYWRlciIsICJpbmRleCIsICJoYW5kbGUiLCAiZW5kSW5kZXgiLCAic3ViSW5kZXgiLCAibWVzc2FnZVdpZGdldCIsICJtZXNzYWdlV2lkZ2V0TGF5b3V0IiwgIndpbmRvd01hbmFnZXIiLCAic2hvd0FjdGlvbnNEaWFsb2ciLCAiQWN0aW9uc0RpYWxvZyIsICJjb3VudHMiLCAibmV3UGFnZVRleHQiLCAicmVhc29uIiwgInRlbXBsYXRlUGFyYW1ldGVycyIsICJhZGRpdGlvbmFsUmVhc29uaW5nIiwgImRlbmllZFBhZ2VzIiwgInNpbmd1bGFyUmVxdWVzdCIsICJhbGxSZXF1ZXN0cyIsICJyZWFzb25zIiwgInBhZ2UiLCAicmVhc29uc0FycmF5IiwgInBhZ2VzIiwgImNvbW1lbnRzIiwgImNvbW1lbnRNZXNzYWdlcyIsICJjb21tZW50IiwgImNvbW1lbnRzQXJyYXkiLCAic2VjdGlvbkRhdGEiLCAicHJlcGVuZCIsICJhcHBlbmQiLCAib2xkRnVsbFNlY3Rpb25UZXh0IiwgIm9sZFNlY3Rpb25UZXh0IiwgImFwaUZ1bmN0aW9uIiwgImxpbmtFbGVtZW50IiwgImVycm9yQ29kZSIsICJlcnJvckluZm8iLCAicmVzb2x2ZSIsICJkZXRhaWxzRWxlbWVudCIsICJkaWFsb2ciLCAiUmVkaXJlY3RSZXF1ZXN0SGFuZGxlciIsICJpbml0X3JlZGlyZWN0X3JlcXVlc3RfaGFuZGxlciIsICJfX2VzbU1pbiIsICJ0aXRsZUluZGV4IiwgInRpdGxlIiwgImRldGFpbHNFbGVtZW50IiwgInJlc3BvbmRlckVsZW1lbnQiLCAiZGlhbG9nIiwgInJlcXVlc3RlZFRpdGxlRGl2IiwgImxhYmVsIiwgImFjdGlvblJhZGlvSW5wdXQiLCAic2VsZWN0ZWQiLCAib3B0aW9uIiwgImNvbW1lbnQiLCAidGFnU2VsZWN0IiwgInRhZyIsICJyZWRpcmVjdCIsICJzb3J0ZWRUYWdzIiwgImEiLCAiYiIsICJzaG93blRlbXBsYXRlRWRpdG9ycyIsICJlZGl0b3JJbmZvIiwgImlzVGFnU2VsZWN0ZWQiLCAic3VtbWFyeUVsZW1lbnQiLCAibm9UZW1wbGF0ZXNNZXNzYWdlIiwgInRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZURhdGEiLCAicGFyYW1ldGVycyIsICJkZXRhaWxzIiwgInN1bW1hcnkiLCAiZWxlbWVudERhdGEiLCAicGFyYW1ldGVyTmFtZSIsICJwYXJhbWV0ZXJEYXRhIiwgImlucHV0IiwgImlucHV0TGF5b3V0IiwgImRlbnlSZWFzb25JbnB1dCIsICJ2YWx1ZSIsICJjbG9zaW5nUmVhc29uRHJvcGRvd24iLCAiaWQiLCAidXBkYXRlIiwgInJlZGlyZWN0c19kaWFsb2dfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJSZWRpcmVjdHNEaWFsb2ciLCAiaW5pdF9yZWRpcmVjdHNfZGlhbG9nIiwgIl9fZXNtTWluIiwgImluaXRfaGVscGVyX2RpYWxvZyIsICJpbml0X3JlZGlyZWN0X3JlcXVlc3RfaGFuZGxlciIsICJIZWxwZXJEaWFsb2ciLCAicmVkaXJlY3RUZW1wbGF0ZVJlc3BvbnNlIiwgInNlY3Rpb25UZXh0IiwgInNlY3Rpb25IZWFkZXIiLCAicGFyc2VkRGF0YSIsICJyZXF1ZXN0ZWRQYWdlcyIsICJtYXRjaCIsICJwYXJzZWRUYXJnZXQiLCAicmVxdWVzdGVyIiwgIm5hbWUiLCAicGFnZSIsICJpbmRleCIsICJyZXF1ZXN0IiwgImRldGFpbHNFbGVtZW50IiwgInN1bW1hcnlFbGVtZW50IiwgImV2ZW50IiwgInRhcmdldEVkaXRvckVsZW1lbnQiLCAibGlua0VsZW1lbnQiLCAicmVxdWVzdEluZm9FbGVtZW50IiwgIm5vbmVFbGVtZW50IiwgInVua25vd25FbGVtZW50IiwgInJlYXNvbkRpdiIsICJyZWFzb25MYWJlbCIsICJzb3VyY2VEaXYiLCAic291cmNlTGFiZWwiLCAicmVxdWVzdGVyRGl2IiwgInJlcXVlc3RlckxhYmVsIiwgInJlcXVlc3RlckxpbmsiLCAicmVxdWVzdFJlc3BvbmRlckVsZW1lbnQiLCAicmVxdWVzdGVkVGl0bGUiLCAiUmVkaXJlY3RSZXF1ZXN0SGFuZGxlciIsICJhY3Rpb25zVG9UYWtlIiwgImFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQiLCAiYWN0aW9uIiwgImZpcnN0Q2xvc2VSZWFzb24iLCAiYWxsUmVxdWVzdHNDbG9zZWQiLCAiYmFja2dyb3VuZENvbG9yIiwgImFjY2VwdGVkQ291bnQiLCAiZGVuaWVkQ291bnQiLCAic2hvd0FjdGlvbnNEaWFsb2ciLCAiY291bnRzIiwgIm5ld1BhZ2VUZXh0IiwgImFjdGlvbkRhdGEiLCAidGFyZ2V0IiwgInJlcXVlc3RzIiwgInNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQiLCAiYWNjZXB0ZWRQYWdlcyIsICJkZW5pZWRQYWdlcyIsICJjb21tZW50cyIsICJhbW91bnRPZlBhZ2VzIiwgInNlY3Rpb25EYXRhIiwgImNsb3NpbmdJZCIsICJhY2NlcHRlZFBhZ2VzTWVzc2FnZSIsICJkZW5pZWRQYWdlc01lc3NhZ2UiLCAibWFwcGVkQ291bnRzIiwgImNvdW50IiwgImRhdGEiLCAidGFnc1dpdGhBcmd1bWVudHMiLCAidGFnIiwgImZvdW5kQXJndW1lbnRFZGl0b3IiLCAiZWRpdG9ySW5mbyIsICJsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXgiLCAicGFyYW1ldGVyIiwgIm1hcHBlZEFyZ3VtZW50cyIsICJ2YWx1ZSIsICJ0aXRsZSIsICJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgImluaXRfY2F0ZWdvcnlfaW5wdXRfd2lkZ2V0IiwgIl9fZXNtTWluIiwgImNvbmZpZyIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJwYXJzZWRUaXRsZSIsICJyZXN1bHQiLCAicGFnZXMiLCAicGFnZSIsICJjYXRlZ29yeSIsICJ0aXRsZVdpdGhvdXROYW1lc3BhY2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJQYWdlSW5wdXRXaWRnZXQiLCAiaW5pdF9wYWdlX2lucHV0X3dpZGdldCIsICJfX2VzbU1pbiIsICJjb25maWciLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAicGFyc2VkVGl0bGUiLCAicmVzdWx0IiwgInBhZ2VzIiwgInBhZ2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJjYXRlZ29yaWVzX2RpYWxvZ19leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkNhdGVnb3JpZXNEaWFsb2ciLCAiaW5pdF9jYXRlZ29yaWVzX2RpYWxvZyIsICJfX2VzbU1pbiIsICJpbml0X2NhdGVnb3J5X2lucHV0X3dpZGdldCIsICJpbml0X2hlbHBlcl9kaWFsb2ciLCAiaW5pdF9wYWdlX2lucHV0X3dpZGdldCIsICJIZWxwZXJEaWFsb2ciLCAic2VjdGlvblRleHQiLCAic2VjdGlvbkhlYWRlciIsICJwYXJzZWREYXRhIiwgImZvdW5kQ2F0ZWdvcnkiLCAibWF0Y2giLCAiZmlyc3RVc2VySW5kZXgiLCAiZmlyc3RVc2VyVGFsa0luZGV4IiwgImZpcnN0SXBJbmRleCIsICJmaXJzdEluZGV4IiwgImluZGV4IiwgInJlcXVlc3QiLCAiZGV0YWlsc0VsZW1lbnQiLCAic3VtbWFyeUVsZW1lbnQiLCAicmVxdWVzdEluZm9FbGVtZW50IiwgIm5vbmVFbGVtZW50IiwgInVua25vd25FbGVtZW50IiwgImV4YW1wbGVzRGl2IiwgImV4YW1wbGVzTGFiZWwiLCAiZXhhbXBsZSIsICJsaW5rRWxlbWVudCIsICJwYXJlbnRzRGl2IiwgInBhcmVudHNMYWJlbCIsICJwYXJlbnQiLCAicmVxdWVzdGVyRGl2IiwgInJlcXVlc3RlckxhYmVsIiwgInJlcXVlc3RlckxpbmsiLCAicmVxdWVzdFJlc3BvbmRlckVsZW1lbnQiLCAiYWN0aW9uUmFkaW9JbnB1dCIsICJsYWJlbCIsICJvcHRpb24iLCAiY29tbWVudElucHV0TGF5b3V0IiwgImNvbW1lbnQiLCAiY29tbWVudElucHV0IiwgInBhZ2VTZWxlY3RMYXlvdXQiLCAiY2F0ZWdvcnlTZWxlY3RMYXlvdXQiLCAiZGVueVJlYXNvbkxheW91dCIsICJjbG9zaW5nUmVhc29uTGF5b3V0IiwgInBhZ2VTZWxlY3RJbnB1dCIsICJQYWdlSW5wdXRXaWRnZXQiLCAidmFsdWUiLCAicGFnZXMiLCAicGFnZSIsICJwYWdlU2VsZWN0IiwgInNvcnRlZFRhZ3MiLCAiYSIsICJiIiwgImV4YW1wbGVzIiwgImNhdGVnb3J5U2VsZWN0SW5wdXQiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJjYXRlZ29yeVNlbGVjdCIsICJwYXJlbnRzIiwgImRlbnlSZWFzb24iLCAiY2xvc2luZ1JlYXNvbiIsICJ0aXRsZSIsICJpZCIsICJzZWxlY3RlZCIsICJhY3Rpb24iLCAiYmFja2dyb3VuZENvbG9yIiwgInNob3dBY3Rpb25zRGlhbG9nIiwgImNvdW50cyIsICJuZXdQYWdlVGV4dCIsICJhY3Rpb25EYXRhIiwgInNlY3Rpb25EYXRhIiwgIm1hcHBlZENvdW50cyIsICJjb3VudCIsICJkYXRhIiwgImNvbnRlbnQiLCAiUmVkaXJlY3RzRGlhbG9nIiwgIkNhdGVnb3JpZXNEaWFsb2ciLCAicGFnZU5hbWUiLCAiaXNSZWRpcmVjdFJlcXVlc3RQYWdlIiwgInJlcXVlc3RQYWdlVHlwZSIsICJldmVudCIsICJ3aW5kb3dNYW5hZ2VyIiwgImhlbHBlciIsICJhZmNyY0hlbHBlckRpYWxvZyJdCn0K