User:Eejit43/scripts/afcrc-helper.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <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.ts

"use strict";mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],()=>{const z=mw.config.get("wgPageName")==="Wikipedia:Articles_for_creation/Redirects",Y=mw.config.get("wgPageName")==="Wikipedia:Articles_for_creation/Categories";if(!z&&!Y)return;const F=z?"redirect":"category";mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#",`Handle ${F} creation requests`,"afcrc-helper").addEventListener("click",B=>{B.preventDefault();const t=new OO.ui.WindowManager;document.body.append(t.$element[0]);const e=new I(F,mw.config.get("wgPageName").replaceAll("_"," "));t.addWindows([e]),e.open(),e.load()});class N extends OO.ui.Dialog{contentLayout;logOutput;closeButton;constructor(){super({size:"large"}),N.static.name="ShowActionsDialog",N.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(t,e="notice"){const s=new OO.ui.MessageWidget({type:e,inline:!0,label:new OO.ui.HtmlSnippet(t)});this.logOutput.append(s.$element[0]),this.updateSize(),this.closeButton.scrollElementIntoView()}showReload(){this.closeButton.$element.remove();const t=new OO.ui.ButtonWidget({label:"Reload",flags:["primary"]});t.on("click",()=>window.location.reload()),this.contentLayout.$element.append(t.$element)}}Object.assign(N.prototype,OO.ui.Dialog.prototype);class _ extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{const t=this.getValue(),e=$.Deferred();t||e.resolve([]);const s=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:s?.getNamespaceId()??0,gapprefix:s?.getMainText()??t,generator:"allpages"}).catch(()=>null).then(r=>{if(r?.query?.pages){const i=r.query.pages.map(c=>({data:c.title,label:c.title}));this.emit("showing-values",i),e.resolve(i)}else e.resolve([])}),e.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:e,label:s})=>new OO.ui.MenuOptionWidget({data:e,label:s}))}Object.assign(_.prototype,OO.ui.mixin.LookupElement.prototype);class Q extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{const t=this.getValue(),e=$.Deferred();t||e.resolve([]);const s=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:s?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(r=>{if(r?.query?.pages){const i=r.query.pages.filter(c=>!c.categories?.some(a=>a.title==="Category:Wikipedia soft redirected categories")).map(c=>{const a=c.title.split(":")[1];return{data:a,label:a}});this.emit("showing-values",i),e.resolve(i)}else e.resolve([])}),e.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:e,label:s})=>new OO.ui.MenuOptionWidget({data:e,label:s}))}Object.assign(Q.prototype,OO.ui.mixin.LookupElement.prototype);class I extends OO.ui.ProcessDialog{api=new mw.Api;scriptMessage=" ([[User:Eejit43/scripts/afcrc-helper|afcrc-helper]])";requestPageType;pageTitle;redirectTemplates;beforeText;pageContent;parsedRequests=[];actionsToTake=[];editsCreationsToMake=[];constructor(t,e){super({size:"large"}),I.static.name="AfcrcHelperDialog",I.static.title="afcrc-helper",I.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"save",label:"Run",flags:["primary","progressive"]}],this.pageTitle=e,this.requestPageType=t,mw.util.addCSS(`
.afcrc-helper-request {
    background-color: #eee;
    border-radius: 5px;
    margin: 10px;
    padding: 5px;
}

.afcrc-helper-request summary {
    cursor: pointer;
}

.afcrc-helper-target-editor {
    font-family: monospace;
    min-width: 1ch;
    max-width: calc(100% - 4ch);
}

.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 {
    background-color: #fff;
    border: 1px solid #a2a9b1;
    border-radius: 2px;
    margin-block: 10px;
    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 {
    background-color: #e2e2e2;
    margin-block: 5px;
}

#afcrc-helper-no-templates-message {
    padding: 5px;
}`)}getActionProcess=t=>t==="cancel"?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):t==="save"?new OO.ui.Process(()=>{this.performActions()}):I.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>I.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});async load(){const t=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(t.query.pages?.[0]?.revisions?.[0]?.slots?.main?.content||"{}");const 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=this.pageContent.match(/^(.*?)==/s)[1],this.pageContent=this.pageContent.replace(/^.*?==/s,"==");const t=[...this.pageContent.matchAll(/^==.*?==$(\s*(?!==[^=]).*)*/gim)].map(e=>e[0]);for(const e of t){if(/{{afc-c\|/i.test(e))continue;const r=e.match(/^==(.*?)==$/m)[1].trim();if(F==="redirect"){const i={},c=[...r.matchAll(/\[\[(.*?)]]/g)].map(h=>h[1]?.trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean);if(c.length===0)continue;i.pages=c;const a=e.match(/Target of redirect: ?\[\[(.*?)]]/)?.[1].trim().replace(/^:/,"").replaceAll("_"," ");if(!a)continue;i.target=a,i.reason=e.match(/reason: ?(.*?)\*source(?: \(if applicable\))?:/is)?.[1].trim()??"",i.source=e.match(/source(?: \(if applicable\))?: ?(.*?)(?:<references \/>|\n\n)/is)?.[1].trim()??"";const o=e.match(e.includes("<references />")?/<references \/>\n+(.*)/:new RegExp(`(?:<references \\/>${i.source?`|${i.source.replaceAll(/[\s#$()*+,.?[\\\]^{|}-]/g,"\\$&")}`:""})
+(.*)`))?.[1].trim();i.requester=o?{type:/\[\[User( talk)?:/.test(o)?"user":"ip",name:o.match(/(?:Special:Contributions\/|User(?: talk)?:)(.*?)\|/)[1].trim()}:null,this.parsedRequests.push(i),this.actionsToTake.push({target:i.target,requests:Object.fromEntries(c.map(h=>[h,{originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"}]))})}else{const i={},c=r.match(/:?Category:(.*?)(]]|$)/)?.[1].trim();if(!c)continue;i.category=c.replaceAll("_"," "),i.examples=[...e.match(/example pages which belong to this category:(.*?)parent category\/categories:/is)[1].matchAll(/\*\s*(?:\[\[)?(.*?)(\||]]|\s*?\n)/g)].map(y=>y[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean)??[],i.parents=[...e.match(/parent category\/categories:(.*?)(\n\n|\n\[\[(special:contributions\/|user:))/is)[1].matchAll(/(?<!\|)#?:?Category:(.*?)(\||]]|\s*?\n)/g)].map(y=>y[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean)??[];const a=e.indexOf("[[User:"),o=e.indexOf("[[User talk:"),h=e.indexOf("[[Special:Contributions/"),u=Math.min(...[a,o,h].filter(y=>y!==-1));i.requester=u===Number.POSITIVE_INFINITY?null:u===h?{type:"ip",name:e.match(/\[\[Special:Contributions\/(.*?)(\||]])/)[1].trim()}:{type:"user",name:e.match(/\[\[User(?: talk)?:(.*?)(\||]])/)[1].trim()},i.requester?.name||(i.requester=null),this.parsedRequests.push(i),this.actionsToTake.push({category:i.category,examples:i.examples,parents:i.parents,originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"})}}}loadInputElements(){if(this.parsedRequests.length>0){let t=0;const e=()=>{const r=Math.min(t+5,this.parsedRequests.length);this.title.setLabel(`afcrc-helper (loading ${t+1}-${r}/${this.parsedRequests.length} requests)`);for(let i=t;i<r;i++)this.requestPageType==="redirect"?this.loadRedirectRequestElements(i):this.loadCategoryRequestElements(i);r<this.parsedRequests.length?(t=r,setTimeout(e,0)):this.title.setLabel(`afcrc-helper (${this.parsedRequests.length} requests loaded)`)};e()}else{const t=new OO.ui.MessageWidget({type:"notice",label:"No valid requests to handle!"}),e=new OO.ui.PanelLayout({padded:!0,expanded:!1});e.$element.append(t.$element),this.$body.append(e.$element),this.updateSize()}}loadRedirectRequestElements(t){const e=this.parsedRequests[t],s=document.createElement("details");s.classList.add("afcrc-helper-request"),s.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));const r=document.createElement("summary");r.innerHTML=e.pages.map(l=>`<b>${l}</b>`).join(", ")+" \u2192 ",r.addEventListener("keyup",l=>{document.activeElement?.tagName==="INPUT"&&l.key===" "&&l.preventDefault()});const i=document.createElement("input");i.classList.add("afcrc-helper-target-editor"),i.style.width=`${e.target.length}ch`,i.value=e.target,i.addEventListener("input",()=>{i.value=i.value.replaceAll("_"," "),i.style.width=`${i.value.length}ch`,this.actionsToTake[t].target=i.value,c.href=mw.util.getUrl(i.value)}),r.append(i);const c=document.createElement("a");c.classList.add("afcrc-helper-external-link"),c.target="_blank",c.href=mw.util.getUrl(e.target),c.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>`,r.append(c),s.append(r);const a=document.createElement("div");a.classList.add("afcrc-helper-request-info");const o=document.createElement("span");o.style.color="dimgray",o.textContent="None";const h=document.createElement("span");h.style.color="dimgray",h.textContent="Unknown";const u=document.createElement("div"),y=document.createElement("b");y.textContent="Reason: ",u.append(y),e.reason?u.append(e.reason):u.append(o.cloneNode(!0)),a.append(u);const k=document.createElement("div"),w=document.createElement("b");w.textContent="Source: ",k.append(w),e.source?k.append(e.source):k.append(o.cloneNode(!0)),a.append(k);const b=document.createElement("div"),T=document.createElement("b");if(T.textContent="Requester: ",b.append(T),e.requester){const l=document.createElement("a");l.target="_blank",l.href=e.requester.type==="user"?mw.util.getUrl(`User:${e.requester.name}`):mw.util.getUrl(`Special:Contributions/${e.requester.name}`),l.textContent=e.requester.name,b.append(l)}else b.append(h.cloneNode(!0));a.append(b),s.append(a),s.append(document.createElement("hr"));const O=document.createElement("div");O.classList.add("afcrc-helper-request-responder");for(const l of e.pages){const d=document.createElement("div"),g=document.createElement("b");g.textContent=l,d.append(g);let C,m;const j=[],L=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(n=>new OO.ui.RadioOptionWidget({data:n,label:n}))});L.selectItemByLabel("None"),L.on("choose",()=>{setTimeout(()=>this.updateSize(),0);const n=L.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[t].requests[l].action=n,!C||!m){const p=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.redirectTemplates).map(([v,{redirect:D}])=>{if(!D)return{data:v,label:v};const E=new OO.ui.HtmlSnippet(`${v} <i>(redirect with possibilities)</i>`);return{data:v,label:E}})});p.getMenu().filterMode="substring",p.on("change",()=>{const v=p.getValue().sort((E,x)=>E.toLowerCase().localeCompare(x.toLowerCase()));p.getValue().join(";")!==v.join(";")&&p.setValue(v),this.actionsToTake[t].requests[l].redirectTemplates=v;for(const E of j)E.details.style.display="none";let D=0;for(const E of p.getValue()){const x=j.find(U=>U.name===E);x&&(x.details.style.display="block",D++)}f.textContent=`Template parameters (${D>0?`for ${D} template${D>1?"s":""}`:"none to show"})`,V.style.display=D>0?"none":"block"}),C=new OO.ui.FieldLayout(p,{classes:["afcrc-helper-tag-select-layout"],align:"inline",label:"Redirect templates:"}),A.$element[0].before(C.$element[0]),m=document.createElement("details"),m.classList.add("afcrc-helper-template-parameters-container");const f=document.createElement("summary");f.textContent="Template parameters (none to show)",m.append(f);for(const[v,D]of Object.entries(this.redirectTemplates)){const E=Object.entries(D.parameters);if(E.length===0)continue;const x=document.createElement("details");x.style.display="none";const U=document.createElement("summary");U.textContent=v,x.append(U);const J={name:v,details:x,parameters:[]};for(const[H,R]of E){const G=new OO.ui.TextInputWidget({placeholder:R.default?.toString(),required:R.required}),K=new OO.ui.FieldLayout(G,{label:new OO.ui.HtmlSnippet(`${H}${!R.label||H.toLowerCase()===R.label?.toLowerCase()?"":` (${R.label})`}${R.description?` (${R.description})`:""} (type: ${R.type}) ${R.suggested?" (suggested)":""}${R.example?` (example: "${R.example}")`:""}`),align:"inline"});x.append(K.$element[0]),J.parameters.push({name:H,aliases:R.aliases,editor:G})}m.append(x),j.push(J)}this.actionsToTake[t].requests[l].redirectTemplateParameters=j;const V=document.createElement("div");V.id="afcrc-helper-no-templates-message",V.textContent="No templates with parameters to display!",m.append(V),A.$element[0].before(m)}if(["accept","comment","close"].includes(n)){A.$element.show();const p=W.getValue().trim();p?this.actionsToTake[t].requests[l].comment=p:delete this.actionsToTake[t].requests[l].comment}else A.$element.hide(),delete this.actionsToTake[t].requests[l].comment;switch(this.updateRequestColor(s,t),C.$element.hide(),m.style.display="none",P.$element.hide(),M.$element.hide(),n){case"accept":{C.$element.show(),m.style.display="block";break}case"deny":{P.$element.show();break}case"close":{M.$element.show();break}}});const q=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(([n,p])=>({data:`autofill:${n}`,label:`Autofilled text for ${p}`}))});q.on("change",()=>{this.actionsToTake[t].requests[l].denyReason=q.getValue()||"autofill:unlikely"}),q.setValue("autofill:unlikely"),q.getMenu().selectItemByData("autofill:unlikely");const P=new OO.ui.FieldLayout(q,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'});P.$element.hide();const S=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([n,p])=>new OO.ui.MenuOptionWidget({data:p,label:n}))}});S.getMenu().on("choose",()=>{const n=S.getMenu().findSelectedItem();this.actionsToTake[t].requests[l].closingReason={name:n.getLabel(),id:n.getData()},this.updateRequestColor(s,t)}),S.getMenu().selectItemByData("r"),this.actionsToTake[t].requests[l].closingReason={name:"No response",id:"r"};const M=new OO.ui.FieldLayout(S,{align:"inline",label:"Closing reason:"});M.$element.hide();const W=new OO.ui.TextInputWidget;W.on("change",()=>{const n=W.getValue().trim();n?this.actionsToTake[t].requests[l].comment=n:delete this.actionsToTake[t].requests[l].comment});const A=new OO.ui.FieldLayout(W,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});A.$element.hide(),d.append(L.$element[0],P.$element[0],M.$element[0],A.$element[0]),O.append(d)}s.append(O),this.$body.append(s),this.updateSize()}loadCategoryRequestElements(t){const e=this.parsedRequests[t],s=document.createElement("details");s.classList.add("afcrc-helper-request"),s.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));const r=document.createElement("summary");r.innerHTML=`<b>Category:${e.category}</b>`,s.append(r);const i=document.createElement("div");i.classList.add("afcrc-helper-request-info");const c=document.createElement("span");c.style.color="dimgray",c.textContent="None";const a=document.createElement("span");a.style.color="dimgray",a.textContent="Unknown";const o=document.createElement("div"),h=document.createElement("b");if(h.textContent="Examples: ",o.append(h),e.examples.length>0)for(const[n,p]of e.examples.entries()){const f=document.createElement("a");f.target="_blank",f.href=mw.util.getUrl(p),f.textContent=p,o.append(f),n!==e.examples.length-1&&o.append(", ")}else o.append(c.cloneNode(!0));i.append(o);const u=document.createElement("div"),y=document.createElement("b");if(y.textContent="Parents: ",u.append(y),e.parents.length>0)for(const[n,p]of e.parents.entries()){const f=document.createElement("a");f.target="_blank",f.href=mw.util.getUrl(`Category:${p}`),f.textContent=p,u.append(f),n!==e.parents.length-1&&u.append(", ")}else u.append(c.cloneNode(!0));i.append(u);const k=document.createElement("div"),w=document.createElement("b");if(w.textContent="Requester: ",k.append(w),e.requester){const n=document.createElement("a");n.target="_blank",n.href=e.requester.type==="user"?mw.util.getUrl(`User:${e.requester.name}`):mw.util.getUrl(`Special:Contributions/${e.requester.name}`),n.textContent=e.requester.name,k.append(n)}else k.append(a.cloneNode(!0));i.append(k),s.append(i),s.append(document.createElement("hr"));const b=document.createElement("div");b.classList.add("afcrc-helper-request-responder");const T=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(n=>new OO.ui.RadioOptionWidget({data:n,label:n}))});T.selectItemByLabel("None"),T.on("choose",()=>{setTimeout(()=>this.updateSize(),0);const n=T.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[t].action=n,["comment","close"].includes(n)){A.$element.show();const p=W.getValue().trim();p?this.actionsToTake[t].comment=p:delete this.actionsToTake[t].comment}else A.$element.hide(),delete this.actionsToTake[t].comment;switch(this.updateRequestColor(s,t),g.$element.hide(),L.$element.hide(),P.$element.hide(),M.$element.hide(),n){case"accept":{g.$element.show(),L.$element.show();break}case"deny":{P.$element.show();break}case"close":{M.$element.show();break}}});const O=new _({placeholder:"Add pages here"});O.on("change",()=>{let n=O.getValue();n=n.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),n=n.replace(/^:/,""),n.length>0&&O.setValue(n[0].toUpperCase()+n.slice(1).replaceAll("_"," "))}),O.on("showing-values",n=>{for(const p of n)l.addAllowedValue(p.data)});const l=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:O});l.on("change",()=>{const n=l.getValue().sort((p,f)=>p.toLowerCase().localeCompare(f.toLowerCase()));l.getValue().join(";")!==n.join(";")&&l.setValue(n),this.actionsToTake[t].examples=n});const{examples:d}=this.actionsToTake[t];for(const n of d)l.addAllowedValue(n);l.setValue(d);const g=new OO.ui.FieldLayout(l,{align:"inline",label:"Pages to categorize:"});g.$element.hide();const C=new Q({placeholder:"Add categories here"});C.on("change",()=>{let n=C.getValue();n=n.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),n=n.replace(/^Category:/,""),n.length>0&&C.setValue(n[0].toUpperCase()+n.slice(1).replaceAll("_"," "))}),C.on("showing-values",n=>{for(const p of n)m.addAllowedValue(p.data)});const m=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:C});m.on("change",()=>{const n=m.getValue().sort((p,f)=>p.toLowerCase().localeCompare(f.toLowerCase()));m.getValue().join(";")!==n.join(";")&&m.setValue(n),this.actionsToTake[t].parents=n});const{parents:j}=this.actionsToTake[t];for(const n of j)m.addAllowedValue(n);m.setValue(j);const L=new OO.ui.FieldLayout(m,{align:"inline",label:"Categories:"});L.$element.hide();const q=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(([n,p])=>({data:`autofill:${n}`,label:`Autofilled text for ${p}`}))});q.on("change",()=>{this.actionsToTake[t].denyReason=q.getValue()||"autofill:unlikely"}),q.setValue("autofill:unlikely"),q.getMenu().selectItemByData("autofill:unlikely");const P=new OO.ui.FieldLayout(q,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'});P.$element.hide();const S=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([n,p])=>new OO.ui.MenuOptionWidget({data:p,label:n}))}});S.getMenu().on("choose",()=>{const n=S.getMenu().findSelectedItem();this.actionsToTake[t].closingReason={name:n.getLabel(),id:n.getData()},this.updateRequestColor(s,t)}),S.getMenu().selectItemByData("r"),this.actionsToTake[t].closingReason={name:"No response",id:"r"};const M=new OO.ui.FieldLayout(S,{align:"inline",label:"Closing reason:"});M.$element.hide();const W=new OO.ui.TextInputWidget;W.on("change",()=>{const n=W.getValue().trim();n?this.actionsToTake[t].comment=n:delete this.actionsToTake[t].comment});const A=new OO.ui.FieldLayout(W,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});A.$element.hide(),b.append(T.$element[0],g.$element[0],L.$element[0],P.$element[0],M.$element[0],A.$element[0]),s.append(b),this.$body.append(s),this.updateSize()}updateRequestColor(t,e){if(this.requestPageType==="redirect"){const s=Object.values(this.actionsToTake[e].requests),r=s.every(o=>o.action==="accept"||o.action==="deny"),i=s.find(o=>o.action==="close")?.closingReason?.id,c=s.every(o=>o.action==="close"&&o.closingReason?.id===i);let a="";if(r){const o=s.filter(u=>u.action==="accept").length,h=s.filter(u=>u.action==="deny").length;o>0&&h>0?a="#fff17e":o>0?a="#a0ffa0":a="#ffcece"}else c&&(i==="r"?a="#ffcece":i==="s"?a="#90c090":a="#b8b8b8");t.style.backgroundColor=a}else{const{action:s}=this.actionsToTake[e];let r="";s==="accept"?r="#a0ffa0":s==="deny"?r="#ffcece":s==="close"&&(this.actionsToTake[e].closingReason?.id==="r"?r="#ffcece":this.actionsToTake[e].closingReason?.id==="s"?r="#90c090":r="#b8b8b8"),t.style.backgroundColor=r}}async performActions(){const t=new OO.ui.WindowManager;document.body.append(t.$element[0]);const e=new N;t.addWindows([e]),e.open();const s={accepted:0,denied:0,"commented on":0,closed:0};let r=(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();if(this.requestPageType==="redirect")if(this.actionsToTake.some(c=>Object.values(c.requests).some(a=>a.action!=="none"))){for(const{target:a,requests:o}of this.actionsToTake){const h=Object.values(o).some(d=>d.action==="accept"||d.action==="deny"),u=Object.values(o).every(d=>d.action==="accept"||d.action==="deny"),y=Object.values(o).find(d=>d.action==="close")?.closingReason?.id,k=Object.values(o).every(d=>d.action==="close"&&d.closingReason?.id===y),w=[],b=[],T=[],O=Object.keys(o).length;for(const[d,g]of Object.entries(o))switch(g.action){case"accept":{h&&!u?e.addLogEntry(`Not all requests to "${a}" were accepted or denied, the handling of "${d}" will be ignored.`,"warning"):(w.push(d),g.comment&&T.push([d,g.comment]),s.accepted++);break}case"deny":{h&&!u?e.addLogEntry(`Not all requests to "${a}" were accepted or denied, the handling of "${d}" is being ignored.`,"warning"):(b.push([d,g.denyReason]),s.denied++);break}case"comment":{g.comment?(T.push([d,g.comment]),s["commented on"]++):e.addLogEntry(`The request to create "${d}" \u2192 "${a}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{k?(g.comment&&T.push([d,g.comment]),s.closed++):e.addLogEntry(`Not all requests to "${a}" were closed with the same reason, the handling of "${d}" is being ignored.`,"warning");break}}let l={pageText:r,...Object.values(o)[0].originalText};if(T.length>0&&(l=this.modifySectionData(l,{append:this.mapComments(T,O===1,T.length===O)})),u){let d;if(w.length>0&&b.length>0){d="p";const g=`* {{subst:AfC redirect}} (${w.map(m=>`[[${m}]]`).join(", ")}) ~~~~`,C=this.mapDeniedReasons(b,!1,!1);for(const m of w)this.handleAcceptedRedirect(m,o[m],a);l=this.modifySectionData(l,{append:`${g}
${C}`})}else if(w.length>0){d="a";for(const g of w)this.handleAcceptedRedirect(g,o[g],a);l=this.modifySectionData(l,{append:`* {{subst:AfC redirect${w.length>1?"|all":""}}} ~~~~`})}else d="d",l=this.modifySectionData(l,{append:this.mapDeniedReasons(b,O===1,!0)});l=this.modifySectionData(l,{prepend:`{{AfC-c|${d}}}`,append:"{{AfC-c|b}}"})}else k&&(l=this.modifySectionData(l,{prepend:`{{AfC-c|${y}}}`,append:"{{AfC-c|b}}"}));r=l.pageText}if(this.beforeText+this.pageContent===r)return e.addLogEntry("No requests have been handled (page content identical)!");const c=Object.entries(s).filter(([,a])=>a>0).map(([a,o])=>`${a} ${o}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:r,summary:`Handling AfC redirect requests (${c})${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!");else if(this.actionsToTake.some(c=>c.action!=="none")){for(const a of this.actionsToTake){let o={pageText:r,...a.originalText};switch(a.action){case"accept":{o=this.modifySectionData(o,{prepend:"{{AfC-c|a}}",append:`* {{subst:AfC category}} ~~~~
{{AfC-c|b}}`}),this.handleAcceptedCategory(a),s.accepted++;break}case"deny":{o=this.modifySectionData(o,{prepend:"{{AfC-c|d}}",append:`* ${this.formatDeniedReason(a.denyReason)} ~~~~
{{AfC-c|b}}`}),s.denied++;break}case"comment":{a.comment?(o=this.modifySectionData(o,{append:`* {{AfC comment|1=${a.comment}}} ~~~~`}),s["commented on"]++):e.addLogEntry(`The request to create "${a.category}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{o=this.modifySectionData(o,{prepend:`{{AfC-c|${a.closingReason.id}}}`,append:(a.comment?`* {{AfC comment|1=${a.comment}}} ~~~~`:"")+`
{{AfC-c|b}`}),s.closed++;break}}r=o.pageText}if(this.beforeText+this.pageContent===r)return e.addLogEntry("No requests have been handled (page content identical)!");const c=Object.entries(s).filter(([,a])=>a>0).map(([a,o])=>`${a} ${o}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:r,summary:`Handling AfC category requests (${c})${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!")}formatDeniedReason(t){const e=t.startsWith("autofill:")?t.match(/autofill:(\w+)/)[1]:`decline|2=${t}`,s=t.includes(",")?" "+t.slice(t.indexOf(",")+1).trim():"";return`{{subst:AfC ${this.requestPageType}|${e}}}${s}`}mapDeniedReasons(t,e,s){if(e)return`* ${this.formatDeniedReason(t[0][1])} ~~~~`;const r={};for(const[c,a]of t)r[a]||(r[a]=[]),r[a].push(c);const i=Object.entries(r);return i.map(([c,a])=>`* ${this.formatDeniedReason(c)}${i.length>1||!s?` (${a.map(o=>`[[${o}]]`).join(", ")})`:""} ~~~~`).join(`
`)}mapComments(t,e,s){if(e)return`* {{AfC comment|1=${t[0][1]}}} ~~~~`;const r={};for(const[c,a]of t)r[a]||(r[a]=[]),r[a].push(c);const i=Object.entries(r);return i.map(([c,a])=>`* {{AfC comment|1=${c}}}${i.length>1||!s?` (${a.map(o=>`[[${o}]]`).join(", ")})`:""} ~~~~`).join(`
`)}modifySectionData(t,{prepend:e,append:s}){const{fullSectionText:r,sectionText:i}=t;return e&&(t.sectionText=e+`
`+t.sectionText),s&&(t.sectionText+=`
`+s),t.fullSectionText=t.fullSectionText.replace(i,t.sectionText),t.pageText=t.pageText.replace(r,t.fullSectionText),t}handleAcceptedRedirect(t,e,s){const r=e.redirectTemplates&&e.redirectTemplates.length>0?e.redirectTemplates.map(i=>{const c=e.redirectTemplateParameters?.find(o=>o.name===i);if(!c)return`{{${i}}}`;const a=c.parameters.map((o,h)=>{const u=o.editor.getValue().trim();return u?`|${o.name===(h+1).toString()?"":`${o.name}=`}${u}`:null}).filter(Boolean).join("");return`{{${i}${a}}}`}):null;this.editsCreationsToMake.push({type:"create",isRedirect:!0,title:t,text:`#REDIRECT [[${s}]]${r?`

{{Redirect category shell|
${r.join(`
`)}
}}`:""}`,summary:`Creating redirect to [[${s}]] as requested at [[WP:AFC/R]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:mw.Title.newFromText(t).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}`})}handleAcceptedCategory(t){this.editsCreationsToMake.push({type:"create",isRedirect:!1,title:`Category:${t.category}`,text:t.parents.map(e=>`[[Category:${e}]]`).join(`
`),summary:`Creating category as requested at [[WP:AFC/C]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:`Category talk:${t.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}`},...t.examples.map(e=>({type:"edit",title:e,transform:({content:s})=>({text:`${s}
[[Category:${t.category}]]`,summary:`Adding page to [[:Category:${t.category}]] as requested at [[WP:AFC/C]]${this.scriptMessage}`})})))}async makeAllEditsCreations(t){for(const e of this.editsCreationsToMake){const s=e.type==="edit"?this.api.edit(e.title,e.transform):this.api.create(e.title,{summary:e.summary},e.text),r=document.createElement("a");r.target="_blank",r.href=mw.util.getUrl(e.title,"isRedirect"in e&&e.isRedirect?{redirect:"no"}:void 0),r.textContent=e.title,t.addLogEntry(`${e.type==="edit"?"Editing":"Creating"} ${r.outerHTML}...`),await s.catch(async(i,c)=>{i==="ratelimited"?(t.addLogEntry(`Rate limited. Waiting for 70 seconds... (resuming at ${new Date(Date.now()+7e4).toLocaleTimeString()})`,"warning"),await new Promise(a=>setTimeout(a,7e4)),t.addLogEntry("Continuing...","success"),await s.catch((a,o)=>{t.addLogEntry(`Error ${e.type==="edit"?"editing":"creating"} ${r.outerHTML}: ${o?.error.info??"Unknown error"} (${a}).`,"error")})):t.addLogEntry(`Error ${e.type==="edit"?"editing":"creating"} ${r.outerHTML}: ${c?.error.info??"Unknown error"} (${i}).`,"error")})}}}Object.assign(I.prototype,OO.ui.ProcessDialog.prototype)});

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IEFwaUVkaXRQYWdlUGFyYW1zLCBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcbmltcG9ydCB7IEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbXMsIE1lZGlhV2lraURhdGFFcnJvciwgUGFnZVJldmlzaW9uc1Jlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC10eXBlcyc7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdW5pY29ybi9wcmV2ZW50LWFiYnJldmlhdGlvbnNcbmltcG9ydCB7IFJlZGlyZWN0VGVtcGxhdGVEYXRhLCBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvIH0gZnJvbSAnLi9yZWRpcmVjdC1oZWxwZXInO1xuXG5tdy5sb2FkZXIudXNpbmcoWydtZWRpYXdpa2kudXRpbCcsICdvb2pzLXVpLWNvcmUnLCAnb29qcy11aS13aWRnZXRzJywgJ29vanMtdWktd2luZG93cyddLCAoKSA9PiB7XG4gICAgY29uc3QgaXNSZWRpcmVjdFJlcXVlc3RQYWdlID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpID09PSAnV2lraXBlZGlhOkFydGljbGVzX2Zvcl9jcmVhdGlvbi9SZWRpcmVjdHMnO1xuICAgIGNvbnN0IGlzQ2F0ZWdvcnlSZXF1ZXN0UGFnZSA9IG13LmNvbmZpZy5nZXQoJ3dnUGFnZU5hbWUnKSA9PT0gJ1dpa2lwZWRpYTpBcnRpY2xlc19mb3JfY3JlYXRpb24vQ2F0ZWdvcmllcyc7XG5cbiAgICBpZiAoIWlzUmVkaXJlY3RSZXF1ZXN0UGFnZSAmJiAhaXNDYXRlZ29yeVJlcXVlc3RQYWdlKSByZXR1cm47XG5cbiAgICBjb25zdCByZXF1ZXN0UGFnZVR5cGUgPSBpc1JlZGlyZWN0UmVxdWVzdFBhZ2UgPyAncmVkaXJlY3QnIDogJ2NhdGVnb3J5JztcblxuICAgIGNvbnN0IGxpbmsgPSBtdy51dGlsLmFkZFBvcnRsZXRMaW5rKG13LmNvbmZpZy5nZXQoJ3NraW4nKSA9PT0gJ21pbmVydmEnID8gJ3AtdGInIDogJ3AtY2FjdGlvbnMnLCAnIycsIGBIYW5kbGUgJHtyZXF1ZXN0UGFnZVR5cGV9IGNyZWF0aW9uIHJlcXVlc3RzYCwgJ2FmY3JjLWhlbHBlcicpITtcblxuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgY29uc3QgYWZjcmNIZWxwZXJEaWFsb2cgPSBuZXcgQWZjcmNIZWxwZXJEaWFsb2cocmVxdWVzdFBhZ2VUeXBlLCBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykucmVwbGFjZUFsbCgnXycsICcgJykpO1xuXG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbYWZjcmNIZWxwZXJEaWFsb2ddKTtcblxuICAgICAgICBhZmNyY0hlbHBlckRpYWxvZy5vcGVuKCk7XG4gICAgICAgIGFmY3JjSGVscGVyRGlhbG9nLmxvYWQoKTtcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYW4gYWN0aW9uIGRpYWxvZy5cbiAgICAgKi9cbiAgICBjbGFzcyBTaG93QWN0aW9uc0RpYWxvZyBleHRlbmRzIE9PLnVpLkRpYWxvZyB7XG4gICAgICAgIHByaXZhdGUgY29udGVudExheW91dCE6IE9PLnVpLlBhbmVsTGF5b3V0O1xuICAgICAgICBwcml2YXRlIGxvZ091dHB1dCE6IEhUTUxEaXZFbGVtZW50O1xuICAgICAgICBwcml2YXRlIGNsb3NlQnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoeyBzaXplOiAnbGFyZ2UnIH0pO1xuXG4gICAgICAgICAgICBTaG93QWN0aW9uc0RpYWxvZy5zdGF0aWMubmFtZSA9ICdTaG93QWN0aW9uc0RpYWxvZyc7XG4gICAgICAgICAgICBTaG93QWN0aW9uc0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnQWN0aW9ucyc7XG4gICAgICAgIH1cblxuICAgICAgICBpbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgICAgICAgT08udWkuRGlhbG9nLnByb3RvdHlwZS5pbml0aWFsaXplLmFwcGx5KHRoaXMpO1xuXG4gICAgICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4uYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyIGRpdiB7XG4gICAgbWFyZ2luLWJsb2NrOiA4cHg7XG59YCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgIHRoaXMubG9nT3V0cHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICB0aGlzLmxvZ091dHB1dC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItYWN0aW9ucy1jb250YWluZXInKTtcblxuICAgICAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH0pO1xuICAgICAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB0aGlzLmNsb3NlKCkpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKHRoaXMubG9nT3V0cHV0LCB0aGlzLmNsb3NlQnV0dG9uLiRlbGVtZW50KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFkZHMgYSBsb2cgZW50cnkgdG8gdGhlIGRpYWxvZy5cbiAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLlxuICAgICAgICAgKiBAcGFyYW0gdHlwZSBUaGUgbWVzc2FnZSB0eXBlLlxuICAgICAgICAgKi9cbiAgICAgICAgcHVibGljIGFkZExvZ0VudHJ5KG1lc3NhZ2U6IHN0cmluZywgdHlwZTogT08udWkuTWVzc2FnZVdpZGdldC5UeXBlID0gJ25vdGljZScpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VXaWRnZXQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGUsIGlubGluZTogdHJ1ZSwgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChtZXNzYWdlKSB9KTtcblxuICAgICAgICAgICAgdGhpcy5sb2dPdXRwdXQuYXBwZW5kKG1lc3NhZ2VXaWRnZXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcblxuICAgICAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi5zY3JvbGxFbGVtZW50SW50b1ZpZXcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZW1vdmVzIHRoZSBjbG9zZSBidXR0b24gYW5kIGFkZHMgYSByZWxvYWQgYnV0dG9uLlxuICAgICAgICAgKi9cbiAgICAgICAgcHVibGljIHNob3dSZWxvYWQoKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLiRlbGVtZW50LnJlbW92ZSgpO1xuXG4gICAgICAgICAgICBjb25zdCByZWxvYWRCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdSZWxvYWQnLCBmbGFnczogWydwcmltYXJ5J10gfSk7XG4gICAgICAgICAgICByZWxvYWRCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4gd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50LmFwcGVuZChyZWxvYWRCdXR0b24uJGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihTaG93QWN0aW9uc0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUpO1xuXG4gICAgaW50ZXJmYWNlIExvb2t1cEVsZW1lbnRDb25maWcgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQuQ29uZmlnT3B0aW9ucywgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5Db25maWdPcHRpb25zIHt9XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgcGFnZSBsb29rdXAgZWxlbWVudC5cbiAgICAgKi9cbiAgICBjbGFzcyBQYWdlSW5wdXRXaWRnZXQgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExvb2t1cEVsZW1lbnRDb25maWcpIHtcbiAgICAgICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IHBhcnNlZFRpdGxlPy5nZXROYW1lc3BhY2VJZCgpID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1zKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcXVlcnk6IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZyB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzLm1hcCgocGFnZSkgPT4gKHsgZGF0YTogcGFnZS50aXRsZSwgbGFiZWw6IHBhZ2UudGl0bGUgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcGFnZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgICAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4gZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihQYWdlSW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgY2F0ZWdvcnkgbG9va3VwIGVsZW1lbnQuXG4gICAgICovXG4gICAgY2xhc3MgQ2F0ZWdvcnlJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZykge1xuICAgICAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogMTQsXG4gICAgICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ2NhdGVnb3JpZXMnLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbXMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogeyBxdWVyeTogeyBwYWdlczogeyB0aXRsZTogc3RyaW5nOyBjYXRlZ29yaWVzPzogeyB0aXRsZTogc3RyaW5nIH1bXSB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGFnZSkgPT4gIXBhZ2UuY2F0ZWdvcmllcz8uc29tZSgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6V2lraXBlZGlhIHNvZnQgcmVkaXJlY3RlZCBjYXRlZ29yaWVzJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVdpdGhvdXROYW1lc3BhY2UgPSBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGl0bGVXaXRob3V0TmFtZXNwYWNlLCBsYWJlbDogdGl0bGVXaXRob3V0TmFtZXNwYWNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnc2hvd2luZy12YWx1ZXMnLCBwYWdlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocGFnZXMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICAgICAgfTtcblxuICAgICAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKENhdGVnb3J5SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG5cbiAgICBpbnRlcmZhY2UgUmVkaXJlY3RSZXF1ZXN0RGF0YSB7XG4gICAgICAgIHBhZ2VzOiBzdHJpbmdbXTtcbiAgICAgICAgdGFyZ2V0OiBzdHJpbmc7XG4gICAgICAgIHJlYXNvbjogc3RyaW5nO1xuICAgICAgICBzb3VyY2U6IHN0cmluZztcbiAgICAgICAgcmVxdWVzdGVyOiB7IHR5cGU6ICd1c2VyJyB8ICdpcCc7IG5hbWU6IHN0cmluZyB9IHwgbnVsbDtcbiAgICB9XG5cbiAgICBpbnRlcmZhY2UgQ2F0ZWdvcnlSZXF1ZXN0RGF0YSB7XG4gICAgICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgICAgIGV4YW1wbGVzOiBzdHJpbmdbXTtcbiAgICAgICAgcGFyZW50czogc3RyaW5nW107XG4gICAgICAgIHJlcXVlc3RlcjogeyB0eXBlOiAndXNlcicgfCAnaXAnOyBuYW1lOiBzdHJpbmcgfSB8IG51bGw7XG4gICAgfVxuXG4gICAgdHlwZSBBY3Rpb25UeXBlID0gJ2FjY2VwdCcgfCAnZGVueScgfCAnY29tbWVudCcgfCAnY2xvc2UnIHwgJ25vbmUnO1xuXG4gICAgaW50ZXJmYWNlIEFjdGlvbiB7XG4gICAgICAgIG9yaWdpbmFsVGV4dDogeyBmdWxsU2VjdGlvblRleHQ6IHN0cmluZzsgc2VjdGlvblRleHQ6IHN0cmluZyB9O1xuICAgICAgICBhY3Rpb246IEFjdGlvblR5cGU7XG4gICAgICAgIGNvbW1lbnQ/OiBzdHJpbmc7XG4gICAgICAgIGRlbnlSZWFzb24/OiBzdHJpbmc7XG4gICAgICAgIGNsb3NpbmdSZWFzb24/OiB7IG5hbWU6IHN0cmluZzsgaWQ6IHN0cmluZyB9O1xuICAgIH1cblxuICAgIHR5cGUgUmVkaXJlY3RBY3Rpb24gPSBBY3Rpb24gJiB7IHJlZGlyZWN0VGVtcGxhdGVzPzogc3RyaW5nW107IHJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzPzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdIH07XG5cbiAgICB0eXBlIENhdGVnb3J5QWN0aW9uID0gQWN0aW9uICYgeyBjYXRlZ29yeTogc3RyaW5nOyBleGFtcGxlczogc3RyaW5nW107IHBhcmVudHM6IHN0cmluZ1tdIH07XG5cbiAgICB0eXBlIFJlZGlyZWN0QWN0aW9ucyA9IHsgdGFyZ2V0OiBzdHJpbmc7IHJlcXVlc3RzOiBSZWNvcmQ8c3RyaW5nLCBSZWRpcmVjdEFjdGlvbj4gfVtdO1xuXG4gICAgdHlwZSBDYXRlZ29yeUFjdGlvbnMgPSBDYXRlZ29yeUFjdGlvbltdO1xuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB0aGF0IGhhbmRsZXMgcmVkaXJlY3QgYW5kIGNhdGVnb3J5IHJlcXVlc3RzLlxuICAgICAqL1xuICAgIGNsYXNzIEFmY3JjSGVscGVyRGlhbG9nIGV4dGVuZHMgT08udWkuUHJvY2Vzc0RpYWxvZyB7XG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIHByaXZhdGUgc2NyaXB0TWVzc2FnZSA9ICcgKFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvYWZjcmMtaGVscGVyfGFmY3JjLWhlbHBlcl1dKSc7XG5cbiAgICAgICAgcHJpdmF0ZSByZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknO1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZSE6IHN0cmluZztcblxuICAgICAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzITogUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG5cbiAgICAgICAgcHJpdmF0ZSBiZWZvcmVUZXh0ITogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIHBhZ2VDb250ZW50ITogc3RyaW5nO1xuXG4gICAgICAgIHByaXZhdGUgcGFyc2VkUmVxdWVzdHM6IFJlZGlyZWN0UmVxdWVzdERhdGFbXSB8IENhdGVnb3J5UmVxdWVzdERhdGFbXSA9IFtdO1xuICAgICAgICBwcml2YXRlIGFjdGlvbnNUb1Rha2U6IFJlZGlyZWN0QWN0aW9ucyB8IENhdGVnb3J5QWN0aW9ucyA9IFtdO1xuICAgICAgICBwcml2YXRlIGVkaXRzQ3JlYXRpb25zVG9NYWtlOiAoXG4gICAgICAgICAgICB8IHsgdHlwZTogJ2VkaXQnOyB0aXRsZTogc3RyaW5nOyB0cmFuc2Zvcm06IChkYXRhOiB7IGNvbnRlbnQ6IHN0cmluZyB9KSA9PiBBcGlFZGl0UGFnZVBhcmFtcyB9XG4gICAgICAgICAgICB8IHsgdHlwZTogJ2NyZWF0ZSc7IGlzUmVkaXJlY3Q6IGJvb2xlYW47IHRpdGxlOiBzdHJpbmc7IHRleHQ6IHN0cmluZzsgc3VtbWFyeTogc3RyaW5nIH1cbiAgICAgICAgKVtdID0gW107XG5cbiAgICAgICAgY29uc3RydWN0b3IocmVxdWVzdFBhZ2VUeXBlOiAncmVkaXJlY3QnIHwgJ2NhdGVnb3J5JywgcGFnZVRpdGxlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHN1cGVyKHsgc2l6ZTogJ2xhcmdlJyB9KTtcblxuICAgICAgICAgICAgQWZjcmNIZWxwZXJEaWFsb2cuc3RhdGljLm5hbWUgPSAnQWZjcmNIZWxwZXJEaWFsb2cnO1xuICAgICAgICAgICAgQWZjcmNIZWxwZXJEaWFsb2cuc3RhdGljLnRpdGxlID0gJ2FmY3JjLWhlbHBlcic7XG4gICAgICAgICAgICBBZmNyY0hlbHBlckRpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICB7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfSxcbiAgICAgICAgICAgICAgICB7IGFjdGlvbjogJ3NhdmUnLCBsYWJlbDogJ1J1bicsIGZsYWdzOiBbJ3ByaW1hcnknLCAncHJvZ3Jlc3NpdmUnXSB9LFxuICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgICAgICB0aGlzLnJlcXVlc3RQYWdlVHlwZSA9IHJlcXVlc3RQYWdlVHlwZTtcblxuICAgICAgICAgICAgbXcudXRpbC5hZGRDU1MoYFxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBtYXJnaW46IDEwcHg7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3Qgc3VtbWFyeSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYWZjcmMtaGVscGVyLXRhcmdldC1lZGl0b3Ige1xuICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7XG4gICAgbWluLXdpZHRoOiAxY2g7XG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA0Y2gpO1xufVxuXG4uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsge1xuICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50O1xufVxuXG4uYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsgc3ZnIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgd2lkdGg6IDFlbTtcbiAgICBoZWlnaHQ6IDFlbTtcbiAgICBmaWxsOiBjdXJyZW50Q29sb3I7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1pbmZvLCAuYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyIHtcbiAgICBtYXJnaW46IDVweDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LWluZm8gPiBkaXYsIC5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgPiBkaXYge1xuICAgIG1hcmdpbi1ibG9jazogOHB4O1xufVxuXG4uYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVyID4gZGl2Omxhc3Qtb2YtdHlwZSB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciAub28tdWktZmllbGRMYXlvdXQge1xuICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG59XG5cbi5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgLm9vLXVpLWZpZWxkTGF5b3V0LWhlYWRlciB7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xufVxuXG4uYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyB7XG4gICAgbWFyZ2luLXRvcDogOHB4O1xufVxuXG4uYWZjcmMtaGVscGVyLWFjdGlvbi1yYWRpbyAub28tdWktcmFkaW9PcHRpb25XaWRnZXQge1xuICAgIGRpc3BsYXk6IGlubGluZTtcbiAgICBwYWRkaW5nOiA4cHg7XG59XG5cbi5hZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCwgLmFmY3JjLWNvbW1lbnQtaW5wdXQge1xuICAgIG1heC13aWR0aDogNTAlO1xufVxuXG4uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyLCAuYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHMge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2EyYTliMTtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgbWFyZ2luLWJsb2NrOiAxMHB4O1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciB7XG4gICAgbWFyZ2luLWxlZnQ6IDhweDtcbn1cblxuLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBzdW1tYXJ5IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjtcbiAgICBtYXJnaW4tYmxvY2s6IDVweDtcbn1cblxuI2FmY3JjLWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSB7XG4gICAgcGFkZGluZzogNXB4O1xufWApO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2NhbmNlbCcpXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYW5hZ2VyKCkuY2xvc2VXaW5kb3codGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdzYXZlJylcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm1BY3Rpb25zKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlbHNlIHJldHVybiBBZmNyY0hlbHBlckRpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIEFmY3JjSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWQgZWxlbWVudHMgaW4gdGhlIHdpbmRvdy5cbiAgICAgICAgICovXG4gICAgICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RUZW1wbGF0ZVJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiAnVXNlcjpFZWppdDQzL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyLmpzb24nLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0O1xuXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gSlNPTi5wYXJzZShyZWRpcmVjdFRlbXBsYXRlUmVzcG9uc2UucXVlcnkucGFnZXM/LlswXT8ucmV2aXNpb25zPy5bMF0/LnNsb3RzPy5tYWluPy5jb250ZW50IHx8ICd7fScpIGFzIFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuXG4gICAgICAgICAgICBjb25zdCBwYWdlUmV2aXNpb24gPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0O1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50ID0gcGFnZVJldmlzaW9uLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgICAgICB0aGlzLnBhcnNlUmVxdWVzdHMoKTtcbiAgICAgICAgICAgIHRoaXMubG9hZElucHV0RWxlbWVudHMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQYXJzZXMgcmVxdWVzdHMgZnJvbSB0aGUgcGFnZSBjb250ZW50LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBwYXJzZVJlcXVlc3RzKCkge1xuICAgICAgICAgICAgdGhpcy5iZWZvcmVUZXh0ID0gdGhpcy5wYWdlQ29udGVudC5tYXRjaCgvXiguKj8pPT0vcykhWzFdO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50ID0gdGhpcy5wYWdlQ29udGVudC5yZXBsYWNlKC9eLio/PT0vcywgJz09Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25zID0gWy4uLnRoaXMucGFnZUNvbnRlbnQubWF0Y2hBbGwoL149PS4qPz09JChcXHMqKD8hPT1bXj1dKS4qKSovZ2ltKV0ubWFwKChtYXRjaCkgPT4gbWF0Y2hbMF0pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb25UZXh0IG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNDbG9zZWQgPSAve3thZmMtY1xcfC9pLnRlc3Qoc2VjdGlvblRleHQpO1xuICAgICAgICAgICAgICAgIGlmIChpc0Nsb3NlZCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzZWN0aW9uSGVhZGVyID0gc2VjdGlvblRleHQubWF0Y2goL149PSguKj8pPT0kL20pIVsxXS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFBhZ2VUeXBlID09PSAncmVkaXJlY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB7fSBhcyBSZWRpcmVjdFJlcXVlc3REYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlZFBhZ2VzID0gWy4uLnNlY3Rpb25IZWFkZXIubWF0Y2hBbGwoL1xcW1xcWyguKj8pXV0vZyldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdPy50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpLmZpbHRlcihCb29sZWFuKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RlZFBhZ2VzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5wYWdlcyA9IHJlcXVlc3RlZFBhZ2VzO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IHNlY3Rpb25UZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goL1RhcmdldCBvZiByZWRpcmVjdDogP1xcW1xcWyguKj8pXV0vKT8uWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXjovLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKCdfJywgJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRUYXJnZXQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEudGFyZ2V0ID0gcGFyc2VkVGFyZ2V0O1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEucmVhc29uID0gc2VjdGlvblRleHQubWF0Y2goL3JlYXNvbjogPyguKj8pXFwqc291cmNlKD86IFxcKGlmIGFwcGxpY2FibGVcXCkpPzovaXMpPy5bMV0udHJpbSgpID8/ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEuc291cmNlID0gc2VjdGlvblRleHQubWF0Y2goL3NvdXJjZSg/OiBcXChpZiBhcHBsaWNhYmxlXFwpKT86ID8oLio/KSg/OjxyZWZlcmVuY2VzIFxcLz58XFxuXFxuKS9pcyk/LlsxXS50cmltKCkgPz8gJyc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyID0gc2VjdGlvblRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uVGV4dC5pbmNsdWRlcygnPHJlZmVyZW5jZXMgLz4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IC88cmVmZXJlbmNlcyBcXC8+XFxuKyguKikvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFJlZ0V4cChgKD86PHJlZmVyZW5jZXMgXFxcXC8+JHtwYXJzZWREYXRhLnNvdXJjZSA/IGB8JHtwYXJzZWREYXRhLnNvdXJjZS5yZXBsYWNlQWxsKC9bXFxzIyQoKSorLC4/W1xcXFxcXF1ee3x9LV0vZywgJ1xcXFwkJicpfWAgOiAnJ30pXFxuKyguKilgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk/LlsxXVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICBwYXJzZWREYXRhLnJlcXVlc3RlciA9IHJlcXVlc3RlclxuICAgICAgICAgICAgICAgICAgICAgICAgPyB7IHR5cGU6IC9cXFtcXFtVc2VyKCB0YWxrKT86Ly50ZXN0KHJlcXVlc3RlcikgPyAndXNlcicgOiAnaXAnLCBuYW1lOiByZXF1ZXN0ZXIubWF0Y2goLyg/OlNwZWNpYWw6Q29udHJpYnV0aW9uc1xcL3xVc2VyKD86IHRhbGspPzopKC4qPylcXHwvKSFbMV0udHJpbSgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcy5wYXJzZWRSZXF1ZXN0cyBhcyBSZWRpcmVjdFJlcXVlc3REYXRhW10pLnB1c2gocGFyc2VkRGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBwYXJzZWREYXRhLnRhcmdldCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzOiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkUGFnZXMubWFwKChwYWdlKSA9PiBbcGFnZSwgeyBvcmlnaW5hbFRleHQ6IHsgZnVsbFNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dCwgc2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LnJlcGxhY2UoL149PS4qPz09JC9tLCAnJykudHJpbSgpIH0sIGFjdGlvbjogJ25vbmUnIH1dKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB7fSBhcyBDYXRlZ29yeVJlcXVlc3REYXRhO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQ2F0ZWdvcnkgPSBzZWN0aW9uSGVhZGVyLm1hdGNoKC86P0NhdGVnb3J5OiguKj8pKF1dfCQpLyk/LlsxXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRDYXRlZ29yeSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5jYXRlZ29yeSA9IGZvdW5kQ2F0ZWdvcnkucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5leGFtcGxlcyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBbLi4uc2VjdGlvblRleHQubWF0Y2goL2V4YW1wbGUgcGFnZXMgd2hpY2ggYmVsb25nIHRvIHRoaXMgY2F0ZWdvcnk6KC4qPylwYXJlbnQgY2F0ZWdvcnlcXC9jYXRlZ29yaWVzOi9pcykhWzFdLm1hdGNoQWxsKC9cXCpcXHMqKD86XFxbXFxbKT8oLio/KShcXHx8XV18XFxzKj9cXG4pL2cpXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSA/PyBbXTtcblxuICAgICAgICAgICAgICAgICAgICBwYXJzZWREYXRhLnBhcmVudHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgWy4uLnNlY3Rpb25UZXh0Lm1hdGNoKC9wYXJlbnQgY2F0ZWdvcnlcXC9jYXRlZ29yaWVzOiguKj8pKFxcblxcbnxcXG5cXFtcXFsoc3BlY2lhbDpjb250cmlidXRpb25zXFwvfHVzZXI6KSkvaXMpIVsxXS5tYXRjaEFsbCgvKD88IVxcfCkjPzo/Q2F0ZWdvcnk6KC4qPykoXFx8fF1dfFxccyo/XFxuKS9nKV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdLnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pID8/IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0VXNlckluZGV4ID0gc2VjdGlvblRleHQuaW5kZXhPZignW1tVc2VyOicpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFVzZXJUYWxrSW5kZXggPSBzZWN0aW9uVGV4dC5pbmRleE9mKCdbW1VzZXIgdGFsazonKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RJcEluZGV4ID0gc2VjdGlvblRleHQuaW5kZXhPZignW1tTcGVjaWFsOkNvbnRyaWJ1dGlvbnMvJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlyc3RJbmRleCA9IE1hdGgubWluKC4uLltmaXJzdFVzZXJJbmRleCwgZmlyc3RVc2VyVGFsa0luZGV4LCBmaXJzdElwSW5kZXhdLmZpbHRlcigoaW5kZXgpID0+IGluZGV4ICE9PSAtMSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZERhdGEucmVxdWVzdGVyID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0SW5kZXggPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmlyc3RJbmRleCA9PT0gZmlyc3RJcEluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgdHlwZTogJ2lwJywgbmFtZTogc2VjdGlvblRleHQubWF0Y2goL1xcW1xcW1NwZWNpYWw6Q29udHJpYnV0aW9uc1xcLyguKj8pKFxcfHxdXSkvKSFbMV0udHJpbSgpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyB0eXBlOiAndXNlcicsIG5hbWU6IHNlY3Rpb25UZXh0Lm1hdGNoKC9cXFtcXFtVc2VyKD86IHRhbGspPzooLio/KShcXHx8XV0pLykhWzFdLnRyaW0oKSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlZERhdGEucmVxdWVzdGVyPy5uYW1lKSBwYXJzZWREYXRhLnJlcXVlc3RlciA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMucGFyc2VkUmVxdWVzdHMgYXMgQ2F0ZWdvcnlSZXF1ZXN0RGF0YVtdKS5wdXNoKHBhcnNlZERhdGEpO1xuXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKS5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiBwYXJzZWREYXRhLmNhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZXM6IHBhcnNlZERhdGEuZXhhbXBsZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzOiBwYXJzZWREYXRhLnBhcmVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFRleHQ6IHsgZnVsbFNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dCwgc2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LnJlcGxhY2UoL149PS4qPz09JC9tLCAnJykudHJpbSgpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSBpbnB1dCBlbGVtZW50cyBpbiB0aGUgZGlhbG9nLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBsb2FkSW5wdXRFbGVtZW50cygpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXRjaFNpemUgPSA1O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IE1hdGgubWluKGluZGV4ICsgYmF0Y2hTaXplLCB0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyB0aXRsZTogT08udWkuTGFiZWxXaWRnZXQgfSkudGl0bGUuc2V0TGFiZWwoYGFmY3JjLWhlbHBlciAobG9hZGluZyAke2luZGV4ICsgMX0tJHtlbmRJbmRleH0vJHt0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aH0gcmVxdWVzdHMpYCk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViSW5kZXggPSBpbmRleDsgc3ViSW5kZXggPCBlbmRJbmRleDsgc3ViSW5kZXgrKylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlcXVlc3RQYWdlVHlwZSA9PT0gJ3JlZGlyZWN0JykgdGhpcy5sb2FkUmVkaXJlY3RSZXF1ZXN0RWxlbWVudHMoc3ViSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB0aGlzLmxvYWRDYXRlZ29yeVJlcXVlc3RFbGVtZW50cyhzdWJJbmRleCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4IDwgdGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gZW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGhhbmRsZSwgMCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSAodGhpcyBhcyB1bmtub3duIGFzIHsgdGl0bGU6IE9PLnVpLkxhYmVsV2lkZ2V0IH0pLnRpdGxlLnNldExhYmVsKGBhZmNyYy1oZWxwZXIgKCR7dGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGh9IHJlcXVlc3RzIGxvYWRlZClgKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaGFuZGxlKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VXaWRnZXQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICdub3RpY2UnLCBsYWJlbDogJ05vIHZhbGlkIHJlcXVlc3RzIHRvIGhhbmRsZSEnIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZVdpZGdldExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXaWRnZXRMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKG1lc3NhZ2VXaWRnZXQuJGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKG1lc3NhZ2VXaWRnZXRMYXlvdXQuJGVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgYSBnaXZlbiByZWRpcmVjdCByZXF1ZXN0IGludG8gdGhlIGRpYWxvZy5cbiAgICAgICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdCB0byBsb2FkLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBsb2FkUmVkaXJlY3RSZXF1ZXN0RWxlbWVudHMoaW5kZXg6IG51bWJlcikge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucGFyc2VkUmVxdWVzdHNbaW5kZXhdIGFzIFJlZGlyZWN0UmVxdWVzdERhdGE7XG5cbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QnKTtcbiAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCkpO1xuXG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LmlubmVySFRNTCA9IHJlcXVlc3QucGFnZXMubWFwKChwYWdlKSA9PiBgPGI+JHtwYWdlfTwvYj5gKS5qb2luKCcsICcpICsgJyBcdTIxOTIgJztcbiAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZXZlbnQua2V5ID09PSAnICcpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0RWRpdG9yRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci10YXJnZXQtZWRpdG9yJyk7XG4gICAgICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cmVxdWVzdC50YXJnZXQubGVuZ3RofWNoYDtcbiAgICAgICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWUgPSByZXF1ZXN0LnRhcmdldDtcbiAgICAgICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSA9IHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWUucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICAgICAgICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7dGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZS5sZW5ndGh9Y2hgO1xuXG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS50YXJnZXQgPSB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlO1xuXG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKHRhcmdldEVkaXRvckVsZW1lbnQudmFsdWUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LmFwcGVuZCh0YXJnZXRFZGl0b3JFbGVtZW50KTtcblxuICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItZXh0ZXJuYWwtbGluaycpO1xuICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwocmVxdWVzdC50YXJnZXQpO1xuICAgICAgICAgICAgbGlua0VsZW1lbnQuaW5uZXJIVE1MID0gYFxuPHN2ZyB2aWV3Ym94PVwiMCAwIDQ4IDQ4XCI+XG4gICAgPHBhdGggZD1cIk0zNiAyNGMtMS4yIDAtMiAwLjgtMiAydjEyYzAgMS4yLTAuOCAyLTIgMmgtMjJjLTEuMlxuICAgICAgICAwLTItMC44LTItMnYtMjJjMC0xLjIgMC44LTIgMi0yaDEyYzEuMiAwIDItMC44IDItMnMtMC44LTItMi0yaC0xMmMtMy40XG4gICAgICAgIDAtNiAyLjYtNiA2djIyYzAgMy40IDIuNiA2IDYgNmgyMmMzLjQgMCA2LTIuNlxuICAgICAgICA2LTZ2LTEyYzAtMS4yLTAuOC0yLTItMnpcIj48L3BhdGg+XG4gICAgPHBhdGggZD1cIk00My44IDUuMmMtMC4yLTAuNC0wLjYtMC44LTEtMS0wLjItMC4yLTAuNi0wLjItMC44LTAuMmgtMTJjLTEuMlxuICAgICAgICAwLTIgMC44LTIgMnMwLjggMiAyIDJoNy4ybC0xOC42IDE4LjZjLTAuOCAwLjgtMC44IDIgMCAyLjggMC40IDAuNCAwLjhcbiAgICAgICAgMC42IDEuNCAwLjZzMS0wLjIgMS40LTAuNmwxOC42LTE4LjZ2Ny4yYzAgMS4yIDAuOCAyIDIgMnMyLTAuOFxuICAgICAgICAyLTJ2LTEyYzAtMC4yIDAtMC42LTAuMi0wLjh6XCI+PC9wYXRoPlxuPC9zdmc+YDtcblxuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQuYXBwZW5kKGxpbmtFbGVtZW50KTtcblxuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEluZm9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbycpO1xuXG4gICAgICAgICAgICBjb25zdCBub25lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIG5vbmVFbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICAgICAgbm9uZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnTm9uZSc7XG5cbiAgICAgICAgICAgIGNvbnN0IHVua25vd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgdW5rbm93bkVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgICAgICB1bmtub3duRWxlbWVudC50ZXh0Q29udGVudCA9ICdVbmtub3duJztcblxuICAgICAgICAgICAgY29uc3QgcmVhc29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlYXNvbkxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICAgICAgcmVhc29uTGFiZWwudGV4dENvbnRlbnQgPSAnUmVhc29uOiAnO1xuICAgICAgICAgICAgcmVhc29uRGl2LmFwcGVuZChyZWFzb25MYWJlbCk7XG5cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LnJlYXNvbikgcmVhc29uRGl2LmFwcGVuZChyZXF1ZXN0LnJlYXNvbik7XG4gICAgICAgICAgICBlbHNlIHJlYXNvbkRpdi5hcHBlbmQobm9uZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChyZWFzb25EaXYpO1xuXG4gICAgICAgICAgICBjb25zdCBzb3VyY2VEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgY29uc3Qgc291cmNlTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgICAgICBzb3VyY2VMYWJlbC50ZXh0Q29udGVudCA9ICdTb3VyY2U6ICc7XG4gICAgICAgICAgICBzb3VyY2VEaXYuYXBwZW5kKHNvdXJjZUxhYmVsKTtcblxuICAgICAgICAgICAgaWYgKHJlcXVlc3Quc291cmNlKSBzb3VyY2VEaXYuYXBwZW5kKHJlcXVlc3Quc291cmNlKTtcbiAgICAgICAgICAgIGVsc2Ugc291cmNlRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHNvdXJjZURpdik7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxhYmVsLnRleHRDb250ZW50ID0gJ1JlcXVlc3RlcjogJztcbiAgICAgICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGFiZWwpO1xuXG4gICAgICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0ZXIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJMaW5rID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICAgICAgcmVxdWVzdGVyTGluay5ocmVmID0gcmVxdWVzdC5yZXF1ZXN0ZXIudHlwZSA9PT0gJ3VzZXInID8gbXcudXRpbC5nZXRVcmwoYFVzZXI6JHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApIDogbXcudXRpbC5nZXRVcmwoYFNwZWNpYWw6Q29udHJpYnV0aW9ucy8ke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YCk7XG4gICAgICAgICAgICAgICAgcmVxdWVzdGVyTGluay50ZXh0Q29udGVudCA9IHJlcXVlc3QucmVxdWVzdGVyLm5hbWU7XG4gICAgICAgICAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMaW5rKTtcbiAgICAgICAgICAgIH0gZWxzZSByZXF1ZXN0ZXJEaXYuYXBwZW5kKHVua25vd25FbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQocmVxdWVzdGVyRGl2KTtcblxuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RJbmZvRWxlbWVudCk7XG5cbiAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdocicpKTtcblxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlcicpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3RlZFRpdGxlIG9mIHJlcXVlc3QucGFnZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0ZWRUaXRsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgICAgICAgICAgbGFiZWwudGV4dENvbnRlbnQgPSByZXF1ZXN0ZWRUaXRsZTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRUaXRsZURpdi5hcHBlbmQobGFiZWwpO1xuXG4gICAgICAgICAgICAgICAgbGV0IHRhZ1NlbGVjdExheW91dDogT08udWkuRmllbGRMYXlvdXQsIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcjogSFRNTERldGFpbHNFbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVFZGl0b3JzSW5mbzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdID0gW107XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25SYWRpb0lucHV0ID0gbmV3IE9PLnVpLlJhZGlvU2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvJ10sXG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbJ0FjY2VwdCcsICdEZW55JywgJ0NvbW1lbnQnLCAnQ2xvc2UnLCAnTm9uZSddLm1hcCgobGFiZWwpID0+IG5ldyBPTy51aS5SYWRpb09wdGlvbldpZGdldCh7IGRhdGE6IGxhYmVsLCBsYWJlbCB9KSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5zZWxlY3RJdGVtQnlMYWJlbCgnTm9uZScpO1xuICAgICAgICAgICAgICAgIGFjdGlvblJhZGlvSW5wdXQub24oJ2Nob29zZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnVwZGF0ZVNpemUoKSwgMCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gKChhY3Rpb25SYWRpb0lucHV0LmZpbmRTZWxlY3RlZEl0ZW0oKSBhcyBPTy51aS5SYWRpb09wdGlvbldpZGdldCkuZ2V0RGF0YSgpIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKSBhcyBBY3Rpb25UeXBlO1xuXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmFjdGlvbiA9IG9wdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhZ1NlbGVjdExheW91dCB8fCAhdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdTZWxlY3QgPSBuZXcgT08udWkuTWVudVRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd0FyYml0cmFyeTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5tYXAoKFt0YWcsIHsgcmVkaXJlY3QgfV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdCkgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbDogdGFnIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQoYCR7dGFnfSA8aT4ocmVkaXJlY3Qgd2l0aCBwb3NzaWJpbGl0aWVzKTwvaT5gKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0YWcsIGxhYmVsIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0YWdTZWxlY3QuZ2V0TWVudSgpIGFzIE9PLnVpLk1lbnVTZWxlY3RXaWRnZXQuQ29uZmlnT3B0aW9ucykuZmlsdGVyTW9kZSA9ICdzdWJzdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnU2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9ICh0YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSB0YWdTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5yZWRpcmVjdFRlbXBsYXRlcyA9IHNvcnRlZFRhZ3M7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVkaXRvckluZm8gb2YgdGVtcGxhdGVFZGl0b3JzSW5mbykgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2hvd25UZW1wbGF0ZUVkaXRvcnMgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvckluZm8gPSB0ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWRpdG9ySW5mbykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd25UZW1wbGF0ZUVkaXRvcnMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gYFRlbXBsYXRlIHBhcmFtZXRlcnMgKCR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gYGZvciAke3Nob3duVGVtcGxhdGVFZGl0b3JzfSB0ZW1wbGF0ZSR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAxID8gJ3MnIDogJyd9YCA6ICdub25lIHRvIHNob3cnfSlgO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnN0eWxlLmRpc3BsYXkgPSBzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1NlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0YWdTZWxlY3QsIHsgY2xhc3NlczogWydhZmNyYy1oZWxwZXItdGFnLXNlbGVjdC1sYXlvdXQnXSwgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ1JlZGlyZWN0IHRlbXBsYXRlczonIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50WzBdLmJlZm9yZSh0YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSAnVGVtcGxhdGUgcGFyYW1ldGVycyAobm9uZSB0byBzaG93KSc7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlRGF0YS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkudGV4dENvbnRlbnQgPSB0ZW1wbGF0ZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoc3VtbWFyeSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50RGF0YTogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyA9IHsgbmFtZTogdGVtcGxhdGVOYW1lLCBkZXRhaWxzLCBwYXJhbWV0ZXJzOiBbXSB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyRGF0YV0gb2YgcGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogcGFyYW1ldGVyRGF0YS5kZWZhdWx0Py50b1N0cmluZygpLCByZXF1aXJlZDogcGFyYW1ldGVyRGF0YS5yZXF1aXJlZCB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChpbnB1dCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwYXJhbWV0ZXJOYW1lfSR7IXBhcmFtZXRlckRhdGEubGFiZWwgfHwgcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJhbWV0ZXJEYXRhLmxhYmVsPy50b0xvd2VyQ2FzZSgpID8gJycgOiBgICgke3BhcmFtZXRlckRhdGEubGFiZWx9KWB9JHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9uID8gYCAoJHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9ufSlgIDogJyd9ICh0eXBlOiAke3BhcmFtZXRlckRhdGEudHlwZX0pICR7cGFyYW1ldGVyRGF0YS5zdWdnZXN0ZWQgPyAnIChzdWdnZXN0ZWQpJyA6ICcnfSR7cGFyYW1ldGVyRGF0YS5leGFtcGxlID8gYCAoZXhhbXBsZTogXCIke3BhcmFtZXRlckRhdGEuZXhhbXBsZX1cIilgIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChpbnB1dExheW91dC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudERhdGEucGFyYW1ldGVycy5wdXNoKHsgbmFtZTogcGFyYW1ldGVyTmFtZSwgYWxpYXNlczogcGFyYW1ldGVyRGF0YS5hbGlhc2VzLCBlZGl0b3I6IGlucHV0IH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoZGV0YWlscyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZUVkaXRvcnNJbmZvLnB1c2goZWxlbWVudERhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5yZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVycyA9IHRlbXBsYXRlRWRpdG9yc0luZm87XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vVGVtcGxhdGVzTWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLmlkID0gJ2FmY3JjLWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UudGV4dENvbnRlbnQgPSAnTm8gdGVtcGxhdGVzIHdpdGggcGFyYW1ldGVycyB0byBkaXNwbGF5ISc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQobm9UZW1wbGF0ZXNNZXNzYWdlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50WzBdLmJlZm9yZSh0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFsnYWNjZXB0JywgJ2NvbW1lbnQnLCAnY2xvc2UnXS5pbmNsdWRlcyhvcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY29tbWVudDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzW3JlcXVlc3RlZFRpdGxlXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQsIGluZGV4KTtcblxuICAgICAgICAgICAgICAgICAgICB0YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3Iuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3Iuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGRlbnlSZWFzb24gPSBuZXcgT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdhdXRvZmlsbDp1bmxpa2VseScsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFsnZXhpc3RzJywgJ2V4aXN0aW5nIHBhZ2VzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ2VtcHR5JywgJ2VtcHR5IHN1Ym1pc3Npb25zJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ25vdGFyZ2V0JywgJ25vbmV4aXN0ZW50IG9yIG5vIHByb3ZpZGVkIHRhcmdldCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydub3RpdGxlJywgJ25vIHRpdGxlIHByb3ZpZGVkJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ3VubGlrZWx5JywgJ3VubGlrZWx5IHJlZGlyZWN0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydub3RyZWRpcmVjdCcsICdhcnRpY2xlIGNyZWF0aW9uIHJlcXVlc3RzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ2V4dGVybmFsbGluaycsICdleHRlcm5hbCBsaW5rIHJlZGlyZWN0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgWydlZGl0cmVxdWVzdCcsICdlZGl0IHJlcXVlc3RzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ25vdGVuZ2xpc2gnLCAncmVxdWVzdHMgbm90IGluIEVuZ2xpc2gnXSxcbiAgICAgICAgICAgICAgICAgICAgXS5tYXAoKFt2YWx1ZSwgbGFiZWxdKSA9PiAoeyBkYXRhOiBgYXV0b2ZpbGw6JHt2YWx1ZX1gLCBsYWJlbDogYEF1dG9maWxsZWQgdGV4dCBmb3IgJHtsYWJlbH1gIH0pKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZW55UmVhc29uLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmRlbnlSZWFzb24gPSBkZW55UmVhc29uLmdldFZhbHVlKCkgfHwgJ2F1dG9maWxsOnVubGlrZWx5JztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZW55UmVhc29uLnNldFZhbHVlKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuICAgICAgICAgICAgICAgIGRlbnlSZWFzb24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkZW55UmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGRlbnlSZWFzb24sIHtcbiAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0RlbnkgcmVhc29uOicsXG4gICAgICAgICAgICAgICAgICAgIGhlbHA6ICdTdXBwb3J0cyBhdXRvbWF0aWMgcmVhc29uaW5nLCBjdXN0b20gcmVhc29uaW5nLCBvciBhIGNvbWJpbmF0aW9uIG9mIHRoZSB0d28gd2l0aCBcImF1dG9maWxsOlJFQVNPTiwgQ1VTVE9NXCIgZm9ybWF0JyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb24gPSBuZXcgT08udWkuRHJvcGRvd25XaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICAgICAgICAgIG1lbnU6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydObyByZXNwb25zZScsICdyJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWydTdWNjZWVkZWQnLCAncyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnV2l0aGRyYXduJywgJ3cnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0ubWFwKChbdGl0bGUsIGlkXSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhOiBpZCwgbGFiZWw6IHRpdGxlIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5vbignY2hvb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKSBhcyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0O1xuXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmNsb3NpbmdSZWFzb24gPSB7IG5hbWU6IHNlbGVjdGVkLmdldExhYmVsKCkgYXMgc3RyaW5nLCBpZDogc2VsZWN0ZWQuZ2V0RGF0YSgpIGFzIHN0cmluZyB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50LCBpbmRleCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgncicpO1xuICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmNsb3NpbmdSZWFzb24gPSB7IG5hbWU6ICdObyByZXNwb25zZScsIGlkOiAncicgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY2xvc2luZ1JlYXNvbiwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnQ2xvc2luZyByZWFzb246JyB9KTtcbiAgICAgICAgICAgICAgICBjbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgICAgICAgICBjb21tZW50SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tbWVudCkgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBSZWRpcmVjdEFjdGlvbnMpW2luZGV4XS5yZXF1ZXN0c1tyZXF1ZXN0ZWRUaXRsZV0uY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgZGVsZXRlICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKVtpbmRleF0ucmVxdWVzdHNbcmVxdWVzdGVkVGl0bGVdLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY29tbWVudElucHV0LCB7IGNsYXNzZXM6IFsnYWZjcmMtY29tbWVudC1pbnB1dCddLCBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnQ29tbWVudDonIH0pO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRUaXRsZURpdi5hcHBlbmQoYWN0aW9uUmFkaW9JbnB1dC4kZWxlbWVudFswXSwgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudFswXSwgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudFswXSwgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmFwcGVuZChyZXF1ZXN0ZWRUaXRsZURpdik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0UmVzcG9uZGVyRWxlbWVudCk7XG5cbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChkZXRhaWxzRWxlbWVudCk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIGEgZ2l2ZW4gY2F0ZWdvcnkgcmVxdWVzdCBpbnRvIHRoZSBkaWFsb2cuXG4gICAgICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIHJlcXVlc3QgdG8gbG9hZC5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgbG9hZENhdGVnb3J5UmVxdWVzdEVsZW1lbnRzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLnBhcnNlZFJlcXVlc3RzW2luZGV4XSBhcyBDYXRlZ29yeVJlcXVlc3REYXRhO1xuXG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0Jyk7XG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICBzdW1tYXJ5RWxlbWVudC5pbm5lckhUTUwgPSBgPGI+Q2F0ZWdvcnk6JHtyZXF1ZXN0LmNhdGVnb3J5fTwvYj5gO1xuICAgICAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEluZm9FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbycpO1xuXG4gICAgICAgICAgICBjb25zdCBub25lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgICAgIG5vbmVFbGVtZW50LnN0eWxlLmNvbG9yID0gJ2RpbWdyYXknO1xuICAgICAgICAgICAgbm9uZUVsZW1lbnQudGV4dENvbnRlbnQgPSAnTm9uZSc7XG5cbiAgICAgICAgICAgIGNvbnN0IHVua25vd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICAgICAgdW5rbm93bkVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgICAgICB1bmtub3duRWxlbWVudC50ZXh0Q29udGVudCA9ICdVbmtub3duJztcblxuICAgICAgICAgICAgY29uc3QgZXhhbXBsZXNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgY29uc3QgZXhhbXBsZXNMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgICAgIGV4YW1wbGVzTGFiZWwudGV4dENvbnRlbnQgPSAnRXhhbXBsZXM6ICc7XG4gICAgICAgICAgICBleGFtcGxlc0Rpdi5hcHBlbmQoZXhhbXBsZXNMYWJlbCk7XG5cbiAgICAgICAgICAgIGlmIChyZXF1ZXN0LmV4YW1wbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGV4YW1wbGVdIG9mIHJlcXVlc3QuZXhhbXBsZXMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKGV4YW1wbGUpO1xuICAgICAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50ZXh0Q29udGVudCA9IGV4YW1wbGU7XG5cbiAgICAgICAgICAgICAgICAgICAgZXhhbXBsZXNEaXYuYXBwZW5kKGxpbmtFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IHJlcXVlc3QuZXhhbXBsZXMubGVuZ3RoIC0gMSkgZXhhbXBsZXNEaXYuYXBwZW5kKCcsICcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgZXhhbXBsZXNEaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQoZXhhbXBsZXNEaXYpO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcmVudHNMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgICAgIHBhcmVudHNMYWJlbC50ZXh0Q29udGVudCA9ICdQYXJlbnRzOiAnO1xuICAgICAgICAgICAgcGFyZW50c0Rpdi5hcHBlbmQocGFyZW50c0xhYmVsKTtcblxuICAgICAgICAgICAgaWYgKHJlcXVlc3QucGFyZW50cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBwYXJlbnRdIG9mIHJlcXVlc3QucGFyZW50cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoYENhdGVnb3J5OiR7cGFyZW50fWApO1xuICAgICAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50ZXh0Q29udGVudCA9IHBhcmVudDtcblxuICAgICAgICAgICAgICAgICAgICBwYXJlbnRzRGl2LmFwcGVuZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSByZXF1ZXN0LnBhcmVudHMubGVuZ3RoIC0gMSkgcGFyZW50c0Rpdi5hcHBlbmQoJywgJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBwYXJlbnRzRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHBhcmVudHNEaXYpO1xuXG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMYWJlbC50ZXh0Q29udGVudCA9ICdSZXF1ZXN0ZXI6ICc7XG4gICAgICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxhYmVsKTtcblxuICAgICAgICAgICAgaWYgKHJlcXVlc3QucmVxdWVzdGVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdGVyTGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlckxpbmsuaHJlZiA9IHJlcXVlc3QucmVxdWVzdGVyLnR5cGUgPT09ICd1c2VyJyA/IG13LnV0aWwuZ2V0VXJsKGBVc2VyOiR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKSA6IG13LnV0aWwuZ2V0VXJsKGBTcGVjaWFsOkNvbnRyaWJ1dGlvbnMvJHtyZXF1ZXN0LnJlcXVlc3Rlci5uYW1lfWApO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGV4dENvbnRlbnQgPSByZXF1ZXN0LnJlcXVlc3Rlci5uYW1lO1xuICAgICAgICAgICAgICAgIHJlcXVlc3RlckRpdi5hcHBlbmQocmVxdWVzdGVyTGluayk7XG4gICAgICAgICAgICB9IGVsc2UgcmVxdWVzdGVyRGl2LmFwcGVuZCh1bmtub3duRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RlckRpdik7XG5cbiAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LmFwcGVuZChyZXF1ZXN0SW5mb0VsZW1lbnQpO1xuXG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHInKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25kZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXInKTtcblxuICAgICAgICAgICAgY29uc3QgYWN0aW9uUmFkaW9JbnB1dCA9IG5ldyBPTy51aS5SYWRpb1NlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvJ10sXG4gICAgICAgICAgICAgICAgaXRlbXM6IFsnQWNjZXB0JywgJ0RlbnknLCAnQ29tbWVudCcsICdDbG9zZScsICdOb25lJ10ubWFwKChsYWJlbCkgPT4gbmV3IE9PLnVpLlJhZGlvT3B0aW9uV2lkZ2V0KHsgZGF0YTogbGFiZWwsIGxhYmVsIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5zZWxlY3RJdGVtQnlMYWJlbCgnTm9uZScpO1xuICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5vbignY2hvb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gKChhY3Rpb25SYWRpb0lucHV0LmZpbmRTZWxlY3RlZEl0ZW0oKSBhcyBPTy51aS5SYWRpb09wdGlvbldpZGdldCkuZ2V0RGF0YSgpIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKSBhcyBBY3Rpb25UeXBlO1xuXG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5hY3Rpb24gPSBvcHRpb247XG5cbiAgICAgICAgICAgICAgICBpZiAoWydjb21tZW50JywgJ2Nsb3NlJ10uaW5jbHVkZXMob3B0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSBjb21tZW50SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50KSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNvbW1lbnQgPSBjb21tZW50O1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGRlbGV0ZSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudElucHV0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jb21tZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50LCBpbmRleCk7XG5cbiAgICAgICAgICAgICAgICBwYWdlU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgICAgICBjYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlU2VsZWN0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBwYWdlU2VsZWN0SW5wdXQgPSBuZXcgUGFnZUlucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdBZGQgcGFnZXMgaGVyZScgfSk7XG4gICAgICAgICAgICBwYWdlU2VsZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBwYWdlU2VsZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eOi8sICcnKTtcblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSBwYWdlU2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcGFnZVNlbGVjdElucHV0Lm9uKCdzaG93aW5nLXZhbHVlcycsIChwYWdlczogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSBwYWdlU2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2VTZWxlY3QgPSBuZXcgT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQoeyBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLCBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsIGlucHV0V2lkZ2V0OiBwYWdlU2VsZWN0SW5wdXQgfSk7XG4gICAgICAgICAgICBwYWdlU2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9IChwYWdlU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKChwYWdlU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHBhZ2VTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmV4YW1wbGVzID0gc29ydGVkVGFncztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB7IGV4YW1wbGVzIH0gPSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV4YW1wbGUgb2YgZXhhbXBsZXMpIHBhZ2VTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKGV4YW1wbGUpO1xuICAgICAgICAgICAgcGFnZVNlbGVjdC5zZXRWYWx1ZShleGFtcGxlcyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhZ2VTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQocGFnZVNlbGVjdCwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnUGFnZXMgdG8gY2F0ZWdvcml6ZTonIH0pO1xuICAgICAgICAgICAgcGFnZVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhdGVnb3J5U2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSk7XG4gICAgICAgICAgICBjYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gY2F0ZWdvcnlTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgY2F0ZWdvcnlTZWxlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdzaG93aW5nLXZhbHVlcycsIChwYWdlczogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSBjYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yeVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7IGFsbG93UmVvcmRlcmluZzogZmFsc2UsIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJywgaW5wdXRXaWRnZXQ6IGNhdGVnb3J5U2VsZWN0SW5wdXQgfSk7XG4gICAgICAgICAgICBjYXRlZ29yeVNlbGVjdC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAoY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIGNhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHNvcnRlZFRhZ3MpO1xuXG4gICAgICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5wYXJlbnRzID0gc29ydGVkVGFncztcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB7IHBhcmVudHMgfSA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF07XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFyZW50IG9mIHBhcmVudHMpIGNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYXJlbnQpO1xuICAgICAgICAgICAgY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUocGFyZW50cyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhdGVnb3J5U2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNhdGVnb3J5U2VsZWN0LCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDYXRlZ29yaWVzOicgfSk7XG4gICAgICAgICAgICBjYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRlbnlSZWFzb24gPSBuZXcgT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiAnYXV0b2ZpbGw6dW5saWtlbHknLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgWydleGlzdHMnLCAnZXhpc3RpbmcgY2F0ZWdvcmllcyddLFxuICAgICAgICAgICAgICAgICAgICBbJ2VtcHR5JywgJ2VtcHR5IHN1Ym1pc3Npb25zJ10sXG4gICAgICAgICAgICAgICAgICAgIFsndW5saWtlbHknLCAnY2F0ZWdvcmllcyB0aGF0IGFyZSB1bmxpa2VseSB0byBoYXZlIGVub3VnaCBwYWdlcyddLFxuICAgICAgICAgICAgICAgICAgICBbJ25vdGNhdGVnb3J5JywgJ3BhZ2UgY3JlYXRpb24gcmVxdWVzdHMnXSxcbiAgICAgICAgICAgICAgICAgICAgWydub3RlbmdsaXNoJywgJ3JlcXVlc3RzIG5vdCBpbiBFbmdsaXNoJ10sXG4gICAgICAgICAgICAgICAgXS5tYXAoKFt2YWx1ZSwgbGFiZWxdKSA9PiAoeyBkYXRhOiBgYXV0b2ZpbGw6JHt2YWx1ZX1gLCBsYWJlbDogYEF1dG9maWxsZWQgdGV4dCBmb3IgJHtsYWJlbH1gIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVueVJlYXNvbi5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uZGVueVJlYXNvbiA9IGRlbnlSZWFzb24uZ2V0VmFsdWUoKSB8fCAnYXV0b2ZpbGw6dW5saWtlbHknO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZW55UmVhc29uLnNldFZhbHVlKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuICAgICAgICAgICAgZGVueVJlYXNvbi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgnYXV0b2ZpbGw6dW5saWtlbHknKTtcblxuICAgICAgICAgICAgY29uc3QgZGVueVJlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChkZW55UmVhc29uLCB7XG4gICAgICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgICAgIGxhYmVsOiAnRGVueSByZWFzb246JyxcbiAgICAgICAgICAgICAgICBoZWxwOiAnU3VwcG9ydHMgYXV0b21hdGljIHJlYXNvbmluZywgY3VzdG9tIHJlYXNvbmluZywgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIHdpdGggXCJhdXRvZmlsbDpSRUFTT04sIENVU1RPTVwiIGZvcm1hdCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBjbG9zaW5nUmVhc29uID0gbmV3IE9PLnVpLkRyb3Bkb3duV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWNsb3NpbmctcmVhc29uLWlucHV0J10sXG4gICAgICAgICAgICAgICAgbWVudToge1xuICAgICAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgWydObyByZXNwb25zZScsICdyJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ1N1Y2NlZWRlZCcsICdzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBbJ1dpdGhkcmF3bicsICd3J10sXG4gICAgICAgICAgICAgICAgICAgIF0ubWFwKChbdGl0bGUsIGlkXSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhOiBpZCwgbGFiZWw6IHRpdGxlIH0pKSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjbG9zaW5nUmVhc29uLmdldE1lbnUoKS5vbignY2hvb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuZmluZFNlbGVjdGVkSXRlbSgpIGFzIE9PLnVpLk1lbnVPcHRpb25XaWRnZXQ7XG5cbiAgICAgICAgICAgICAgICAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNsb3NpbmdSZWFzb24gPSB7IG5hbWU6IHNlbGVjdGVkLmdldExhYmVsKCkgYXMgc3RyaW5nLCBpZDogc2VsZWN0ZWQuZ2V0RGF0YSgpIGFzIHN0cmluZyB9O1xuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSZXF1ZXN0Q29sb3IoZGV0YWlsc0VsZW1lbnQsIGluZGV4KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgncicpO1xuICAgICAgICAgICAgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jbG9zaW5nUmVhc29uID0geyBuYW1lOiAnTm8gcmVzcG9uc2UnLCBpZDogJ3InIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGNsb3NpbmdSZWFzb25MYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY2xvc2luZ1JlYXNvbiwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnQ2xvc2luZyByZWFzb246JyB9KTtcbiAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBjb21tZW50SW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KCk7XG4gICAgICAgICAgICBjb21tZW50SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbW1lbnQpICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY29tbWVudCA9IGNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgZWxzZSBkZWxldGUgKHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpW2luZGV4XS5jb21tZW50O1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChjb21tZW50SW5wdXQsIHsgY2xhc3NlczogWydhZmNyYy1jb21tZW50LWlucHV0J10sIGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdDb21tZW50OicgfSk7XG4gICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgICAgICByZXF1ZXN0UmVzcG9uZGVyRWxlbWVudC5hcHBlbmQoXG4gICAgICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICBwYWdlU2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIGNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5hcHBlbmQocmVxdWVzdFJlc3BvbmRlckVsZW1lbnQpO1xuXG4gICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQoZGV0YWlsc0VsZW1lbnQpO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNpemUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGVzIHRoZSBjb2xvciBvZiBhIGRldGFpbHMgZWxlbWVudCBiYXNlZCBvbiB0aGUgaGFuZGxpbmcgb2YgdGhlIHJlcXVlc3RzIGluc2lkZS5cbiAgICAgICAgICogQHBhcmFtIGRldGFpbHNFbGVtZW50IFRoZSBkZXRhaWxzIGVsZW1lbnQgdG8gdXBkYXRlLlxuICAgICAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZWRpcmVjdCB0YXJnZXQuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIHVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudDogSFRNTERldGFpbHNFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5yZXF1ZXN0UGFnZVR5cGUgPT09ICdyZWRpcmVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25zVG9UYWtlID0gT2JqZWN0LnZhbHVlcygodGhpcy5hY3Rpb25zVG9UYWtlIGFzIFJlZGlyZWN0QWN0aW9ucylbaW5kZXhdLnJlcXVlc3RzKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQgPSBhY3Rpb25zVG9UYWtlLmV2ZXJ5KChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnIHx8IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55Jyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdENsb3NlUmVhc29uID0gYWN0aW9uc1RvVGFrZS5maW5kKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScpPy5jbG9zaW5nUmVhc29uPy5pZDtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0Nsb3NlZCA9IGFjdGlvbnNUb1Rha2UuZXZlcnkoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyAmJiBhY3Rpb24uY2xvc2luZ1JlYXNvbj8uaWQgPT09IGZpcnN0Q2xvc2VSZWFzb24pO1xuXG4gICAgICAgICAgICAgICAgbGV0IGJhY2tncm91bmRDb2xvciA9ICcnO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRDb3VudCA9IGFjdGlvbnNUb1Rha2UuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbmllZENvdW50ID0gYWN0aW9uc1RvVGFrZS5maWx0ZXIoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2RlbnknKS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkQ291bnQgPiAwICYmIGRlbmllZENvdW50ID4gMCkgYmFja2dyb3VuZENvbG9yID0gJyNmZmYxN2UnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChhY2NlcHRlZENvdW50ID4gMCkgYmFja2dyb3VuZENvbG9yID0gJyNhMGZmYTAnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFsbFJlcXVlc3RzQ2xvc2VkKVxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RDbG9zZVJlYXNvbiA9PT0gJ3InKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpcnN0Q2xvc2VSZWFzb24gPT09ICdzJykgYmFja2dyb3VuZENvbG9yID0gJyM5MGMwOTAnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGJhY2tncm91bmRDb2xvciA9ICcjYjhiOGI4JztcblxuICAgICAgICAgICAgICAgIGRldGFpbHNFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBhY3Rpb24gfSA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF07XG5cbiAgICAgICAgICAgICAgICBsZXQgYmFja2dyb3VuZENvbG9yID0gJyc7XG5cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItc3dpdGNoXG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2FjY2VwdCcpIGJhY2tncm91bmRDb2xvciA9ICcjYTBmZmEwJztcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdkZW55JykgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2Nsb3NlJylcbiAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgQ2F0ZWdvcnlBY3Rpb25zKVtpbmRleF0uY2xvc2luZ1JlYXNvbj8uaWQgPT09ICdyJykgYmFja2dyb3VuZENvbG9yID0gJyNmZmNlY2UnO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucylbaW5kZXhdLmNsb3NpbmdSZWFzb24/LmlkID09PSAncycpIGJhY2tncm91bmRDb2xvciA9ICcjOTBjMDkwJztcbiAgICAgICAgICAgICAgICAgICAgZWxzZSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2I4YjhiOCc7XG5cbiAgICAgICAgICAgICAgICBkZXRhaWxzRWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBiYWNrZ3JvdW5kQ29sb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogUGVyZm9ybXMgYWxsIGFjdGlvbnMgYW5kIGxvZ3MgdGhlaXIgcmVzdWx0cy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgcGVyZm9ybUFjdGlvbnMoKSB7XG4gICAgICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHdpbmRvd01hbmFnZXIuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICBjb25zdCBzaG93QWN0aW9uc0RpYWxvZyA9IG5ldyBTaG93QWN0aW9uc0RpYWxvZygpO1xuICAgICAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFtzaG93QWN0aW9uc0RpYWxvZ10pO1xuICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cub3BlbigpO1xuXG4gICAgICAgICAgICBjb25zdCBjb3VudHMgPSB7IGFjY2VwdGVkOiAwLCBkZW5pZWQ6IDAsICdjb21tZW50ZWQgb24nOiAwLCBjbG9zZWQ6IDAgfTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cblxuICAgICAgICAgICAgbGV0IG5ld1BhZ2VUZXh0ID0gKFxuICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5yZXF1ZXN0UGFnZVR5cGUgPT09ICdyZWRpcmVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhbnlSZXF1ZXN0SGFuZGxlZCA9ICh0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKS5zb21lKChhY3Rpb25EYXRhKSA9PiBPYmplY3QudmFsdWVzKGFjdGlvbkRhdGEucmVxdWVzdHMpLnNvbWUoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiAhPT0gJ25vbmUnKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYW55UmVxdWVzdEhhbmRsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IHRhcmdldCwgcmVxdWVzdHMgfSBvZiB0aGlzLmFjdGlvbnNUb1Rha2UgYXMgUmVkaXJlY3RBY3Rpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuc29tZSgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JyB8fCBhY3Rpb24uYWN0aW9uID09PSAnZGVueScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLmV2ZXJ5KChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnIHx8IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0Q2xvc2VSZWFzb24gPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzIGFzIFJlY29yZDxzdHJpbmcsIFJlZGlyZWN0QWN0aW9uPikuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnKT8uY2xvc2luZ1JlYXNvbj8uaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0Nsb3NlZCA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMgYXMgUmVjb3JkPHN0cmluZywgUmVkaXJlY3RBY3Rpb24+KS5ldmVyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnICYmIGFjdGlvbi5jbG9zaW5nUmVhc29uPy5pZCA9PT0gZmlyc3RDbG9zZVJlYXNvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkUGFnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbmllZFBhZ2VzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbW91bnRPZlBhZ2VzID0gT2JqZWN0LmtleXMocmVxdWVzdHMpLmxlbmd0aDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbl0gb2YgT2JqZWN0LmVudHJpZXMocmVxdWVzdHMpIGFzIFtzdHJpbmcsIFJlZGlyZWN0QWN0aW9uXVtdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCAmJiAhYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgYWNjZXB0ZWQgb3IgZGVuaWVkLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIHdpbGwgYmUgaWdub3JlZC5gLCAnd2FybmluZycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXB0ZWRQYWdlcy5wdXNoKHJlcXVlc3RlZFRpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIGNvbW1lbnRzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uY29tbWVudF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5hY2NlcHRlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQgJiYgIWFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoYE5vdCBhbGwgcmVxdWVzdHMgdG8gXCIke3RhcmdldH1cIiB3ZXJlIGFjY2VwdGVkIG9yIGRlbmllZCwgdGhlIGhhbmRsaW5nIG9mIFwiJHtyZXF1ZXN0ZWRUaXRsZX1cIiBpcyBiZWluZyBpZ25vcmVkLmAsICd3YXJuaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZW5pZWRQYWdlcy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmRlbnlSZWFzb24hXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmRlbmllZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbi5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzWydjb21tZW50ZWQgb24nXSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgcmVxdWVzdCB0byBjcmVhdGUgXCIke3JlcXVlc3RlZFRpdGxlfVwiIFx1MjE5MiBcIiR7dGFyZ2V0fVwiIHdhcyBtYXJrZWQgdG8gYmUgY29tbWVudGVkIG9uLCBidXQgbm8gY29tbWVudCB3YXMgcHJvdmlkZWQgc28gaXQgd2lsbCBiZSBza2lwcGVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uY29tbWVudCkgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmNsb3NlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBOb3QgYWxsIHJlcXVlc3RzIHRvIFwiJHt0YXJnZXR9XCIgd2VyZSBjbG9zZWQgd2l0aCB0aGUgc2FtZSByZWFzb24sIHRoZSBoYW5kbGluZyBvZiBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgaXMgYmVpbmcgaWdub3JlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VjdGlvbkRhdGEgPSB7IHBhZ2VUZXh0OiBuZXdQYWdlVGV4dCwgLi4uT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cylbMF0ub3JpZ2luYWxUZXh0IH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21tZW50cy5sZW5ndGggPiAwKSBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHsgYXBwZW5kOiB0aGlzLm1hcENvbW1lbnRzKGNvbW1lbnRzLCBhbW91bnRPZlBhZ2VzID09PSAxLCBjb21tZW50cy5sZW5ndGggPT09IGFtb3VudE9mUGFnZXMpIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjbG9zaW5nSWQ6IHN0cmluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY2NlcHRlZFBhZ2VzLmxlbmd0aCA+IDAgJiYgZGVuaWVkUGFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nSWQgPSAncCc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRQYWdlc01lc3NhZ2UgPSBgKiB7e3N1YnN0OkFmQyByZWRpcmVjdH19ICgke2FjY2VwdGVkUGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2V9XV1gKS5qb2luKCcsICcpfSkgfn5+fmA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlbmllZFBhZ2VzTWVzc2FnZSA9IHRoaXMubWFwRGVuaWVkUmVhc29ucyhkZW5pZWRQYWdlcywgZmFsc2UsIGZhbHNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgYWNjZXB0ZWRQYWdlcykgdGhpcy5oYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2UsIHJlcXVlc3RzW3BhZ2VdLCB0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwgeyBhcHBlbmQ6IGAke2FjY2VwdGVkUGFnZXNNZXNzYWdlfVxcbiR7ZGVuaWVkUGFnZXNNZXNzYWdlfWAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY2NlcHRlZFBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2luZ0lkID0gJ2EnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBhY2NlcHRlZFBhZ2VzKSB0aGlzLmhhbmRsZUFjY2VwdGVkUmVkaXJlY3QocGFnZSwgcmVxdWVzdHNbcGFnZV0sIHRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7IGFwcGVuZDogYCoge3tzdWJzdDpBZkMgcmVkaXJlY3Qke2FjY2VwdGVkUGFnZXMubGVuZ3RoID4gMSA/ICd8YWxsJyA6ICcnfX19IH5+fn5gIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdkJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHsgYXBwZW5kOiB0aGlzLm1hcERlbmllZFJlYXNvbnMoZGVuaWVkUGFnZXMsIGFtb3VudE9mUGFnZXMgPT09IDEsIHRydWUpIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwgeyBwcmVwZW5kOiBge3tBZkMtY3wke2Nsb3NpbmdJZH19fWAsIGFwcGVuZDogJ3t7QWZDLWN8Yn19JyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWxsUmVxdWVzdHNDbG9zZWQpIHNlY3Rpb25EYXRhID0gdGhpcy5tb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YSwgeyBwcmVwZW5kOiBge3tBZkMtY3wke2ZpcnN0Q2xvc2VSZWFzb259fX1gLCBhcHBlbmQ6ICd7e0FmQy1jfGJ9fScgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhZ2VUZXh0ID0gc2VjdGlvbkRhdGEucGFnZVRleHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5iZWZvcmVUZXh0ICsgdGhpcy5wYWdlQ29udGVudCA9PT0gbmV3UGFnZVRleHQpIHJldHVybiBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQgKHBhZ2UgY29udGVudCBpZGVudGljYWwpIScpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZENvdW50cyA9IE9iamVjdC5lbnRyaWVzKGNvdW50cylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIGNvdW50XSkgPT4gY291bnQgPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoW2FjdGlvbiwgY291bnRdKSA9PiBgJHthY3Rpb259ICR7Y291bnR9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZWRpdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICgpID0+ICh7IHRleHQ6IG5ld1BhZ2VUZXh0LCBzdW1tYXJ5OiBgSGFuZGxpbmcgQWZDIHJlZGlyZWN0IHJlcXVlc3RzICgke21hcHBlZENvdW50c30pJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCB9KSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlQWxsRWRpdHNDcmVhdGlvbnMoc2hvd0FjdGlvbnNEaWFsb2cpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdBbGwgY2hhbmdlcyBtYWRlLCBjbGljayBiZWxvdyB0byByZWxvYWQhJywgJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5zaG93UmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCEnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYW55UmVxdWVzdEhhbmRsZWQgPSAodGhpcy5hY3Rpb25zVG9UYWtlIGFzIENhdGVnb3J5QWN0aW9ucykuc29tZSgoYWN0aW9uRGF0YSkgPT4gYWN0aW9uRGF0YS5hY3Rpb24gIT09ICdub25lJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYW55UmVxdWVzdEhhbmRsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhY3Rpb25EYXRhIG9mIHRoaXMuYWN0aW9uc1RvVGFrZSBhcyBDYXRlZ29yeUFjdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWN0aW9uRGF0YSA9IHsgcGFnZVRleHQ6IG5ld1BhZ2VUZXh0LCAuLi5hY3Rpb25EYXRhLm9yaWdpbmFsVGV4dCB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFjdGlvbkRhdGEuYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHsgcHJlcGVuZDogJ3t7QWZDLWN8YX19JywgYXBwZW5kOiAnKiB7e3N1YnN0OkFmQyBjYXRlZ29yeX19IH5+fn5cXG57e0FmQy1jfGJ9fScgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVBY2NlcHRlZENhdGVnb3J5KGFjdGlvbkRhdGEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5hY2NlcHRlZCsrO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkZW55Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6ICd7e0FmQy1jfGR9fScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAqICR7dGhpcy5mb3JtYXREZW5pZWRSZWFzb24oYWN0aW9uRGF0YS5kZW55UmVhc29uISl9IH5+fn5cXG57e0FmQy1jfGJ9fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5kZW5pZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnY29tbWVudCc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGlvbkRhdGEuY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7IGFwcGVuZDogYCoge3tBZkMgY29tbWVudHwxPSR7YWN0aW9uRGF0YS5jb21tZW50fX19IH5+fn5gIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbJ2NvbW1lbnRlZCBvbiddKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFRoZSByZXF1ZXN0IHRvIGNyZWF0ZSBcIiR7YWN0aW9uRGF0YS5jYXRlZ29yeX1cIiB3YXMgbWFya2VkIHRvIGJlIGNvbW1lbnRlZCBvbiwgYnV0IG5vIGNvbW1lbnQgd2FzIHByb3ZpZGVkIHNvIGl0IHdpbGwgYmUgc2tpcHBlZC5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXBlbmQ6IGB7e0FmQy1jfCR7YWN0aW9uRGF0YS5jbG9zaW5nUmVhc29uIS5pZH19fWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IChhY3Rpb25EYXRhLmNvbW1lbnQgPyBgKiB7e0FmQyBjb21tZW50fDE9JHthY3Rpb25EYXRhLmNvbW1lbnR9fX0gfn5+fmAgOiAnJykgKyAnXFxue3tBZkMtY3xifScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5jbG9zZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhZ2VUZXh0ID0gc2VjdGlvbkRhdGEucGFnZVRleHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5iZWZvcmVUZXh0ICsgdGhpcy5wYWdlQ29udGVudCA9PT0gbmV3UGFnZVRleHQpIHJldHVybiBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQgKHBhZ2UgY29udGVudCBpZGVudGljYWwpIScpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZENvdW50cyA9IE9iamVjdC5lbnRyaWVzKGNvdW50cylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKFssIGNvdW50XSkgPT4gY291bnQgPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoW2FjdGlvbiwgY291bnRdKSA9PiBgJHthY3Rpb259ICR7Y291bnR9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdHNDcmVhdGlvbnNUb01ha2UucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZWRpdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICgpID0+ICh7IHRleHQ6IG5ld1BhZ2VUZXh0LCBzdW1tYXJ5OiBgSGFuZGxpbmcgQWZDIGNhdGVnb3J5IHJlcXVlc3RzICgke21hcHBlZENvdW50c30pJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCB9KSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlQWxsRWRpdHNDcmVhdGlvbnMoc2hvd0FjdGlvbnNEaWFsb2cpO1xuXG4gICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdBbGwgY2hhbmdlcyBtYWRlLCBjbGljayBiZWxvdyB0byByZWxvYWQhJywgJ3N1Y2Nlc3MnKTtcblxuICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5zaG93UmVsb2FkKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCEnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGb3JtYXRzIGEgcmVxdWVzdCBkZW5pYWwgcmVhc29uIHRvIGEge3tzdWJzdDpBZkMgcmVkaXJlY3R9fSBjYWxsLlxuICAgICAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gdG8gZm9ybWF0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBmb3JtYXREZW5pZWRSZWFzb24ocmVhc29uOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlUGFyYW1ldGVycyA9IHJlYXNvbi5zdGFydHNXaXRoKCdhdXRvZmlsbDonKSA/IHJlYXNvbi5tYXRjaCgvYXV0b2ZpbGw6KFxcdyspLykhWzFdIDogYGRlY2xpbmV8Mj0ke3JlYXNvbn1gO1xuXG4gICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsUmVhc29uaW5nID0gcmVhc29uLmluY2x1ZGVzKCcsJykgPyAnICcgKyByZWFzb24uc2xpY2UocmVhc29uLmluZGV4T2YoJywnKSArIDEpLnRyaW0oKSA6ICcnO1xuXG4gICAgICAgICAgICByZXR1cm4gYHt7c3Vic3Q6QWZDICR7dGhpcy5yZXF1ZXN0UGFnZVR5cGV9fCR7dGVtcGxhdGVQYXJhbWV0ZXJzfX19JHthZGRpdGlvbmFsUmVhc29uaW5nfWA7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTWFwcyBhIGdyb3VwIG9mIGRlbmllZCByZWFzb25zLlxuICAgICAgICAgKiBAcGFyYW0gZGVuaWVkUGFnZXMgVGhlIHBhZ2VzIHRvIG1hcC5cbiAgICAgICAgICogQHBhcmFtIHNpbmd1bGFyUmVxdWVzdCBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIHRoZSBvbmx5IHJlcXVlc3QuXG4gICAgICAgICAqIEBwYXJhbSBhbGxSZXF1ZXN0cyBXaGV0aGVyIGFsbCByZXF1ZXN0cyBhcmUgYmVpbmcgbWFwcGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBtYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgICAgICBpZiAoc2luZ3VsYXJSZXF1ZXN0KSByZXR1cm4gYCogJHt0aGlzLmZvcm1hdERlbmllZFJlYXNvbihkZW5pZWRQYWdlc1swXVsxXSl9IH5+fn5gO1xuXG4gICAgICAgICAgICBjb25zdCByZWFzb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7fTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFnZSwgcmVhc29uXSBvZiBkZW5pZWRQYWdlcykge1xuICAgICAgICAgICAgICAgIGlmICghcmVhc29uc1tyZWFzb25dKSByZWFzb25zW3JlYXNvbl0gPSBbXTtcbiAgICAgICAgICAgICAgICByZWFzb25zW3JlYXNvbl0ucHVzaChwYWdlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcmVhc29uc0FycmF5ID0gT2JqZWN0LmVudHJpZXMocmVhc29ucyk7XG5cbiAgICAgICAgICAgIHJldHVybiByZWFzb25zQXJyYXlcbiAgICAgICAgICAgICAgICAubWFwKChbcmVhc29uLCBwYWdlc10pID0+IGAqICR7dGhpcy5mb3JtYXREZW5pZWRSZWFzb24ocmVhc29uKX0ke3JlYXNvbnNBcnJheS5sZW5ndGggPiAxIHx8ICFhbGxSZXF1ZXN0cyA/IGAgKCR7cGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2V9XV1gKS5qb2luKCcsICcpfSlgIDogJyd9IH5+fn5gKVxuICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBNYXBzIGEgZ3JvdXAgb2YgY29tbWVudHMuXG4gICAgICAgICAqIEBwYXJhbSBjb21tZW50cyBUaGUgY29tbWVudHMgdG8gbWFwLlxuICAgICAgICAgKiBAcGFyYW0gc2luZ3VsYXJSZXF1ZXN0IFdoZXRoZXIgdGhlIHJlcXVlc3QgaXMgdGhlIG9ubHkgcmVxdWVzdC5cbiAgICAgICAgICogQHBhcmFtIGFsbFJlcXVlc3RzIFdoZXRoZXIgYWxsIHJlcXVlc3RzIGFyZSBiZWluZyBtYXBwZWQuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIG1hcENvbW1lbnRzKGNvbW1lbnRzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgICAgICBpZiAoc2luZ3VsYXJSZXF1ZXN0KSByZXR1cm4gYCoge3tBZkMgY29tbWVudHwxPSR7Y29tbWVudHNbMF1bMV19fX0gfn5+fmA7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRNZXNzYWdlczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhZ2UsIGNvbW1lbnRdIG9mIGNvbW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFjb21tZW50TWVzc2FnZXNbY29tbWVudF0pIGNvbW1lbnRNZXNzYWdlc1tjb21tZW50XSA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbW1lbnRNZXNzYWdlc1tjb21tZW50XS5wdXNoKHBhZ2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb21tZW50c0FycmF5ID0gT2JqZWN0LmVudHJpZXMoY29tbWVudE1lc3NhZ2VzKTtcblxuICAgICAgICAgICAgcmV0dXJuIGNvbW1lbnRzQXJyYXlcbiAgICAgICAgICAgICAgICAubWFwKChbY29tbWVudCwgcGFnZXNdKSA9PiBgKiB7e0FmQyBjb21tZW50fDE9JHtjb21tZW50fX19JHtjb21tZW50c0FycmF5Lmxlbmd0aCA+IDEgfHwgIWFsbFJlcXVlc3RzID8gYCAoJHtwYWdlcy5tYXAoKHBhZ2UpID0+IGBbWyR7cGFnZX1dXWApLmpvaW4oJywgJyl9KWAgOiAnJ30gfn5+fmApXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1vZGlmaWVzIGEgZ2l2ZW4gc2VjdGlvbiB0ZXh0IHdpdGggcHJlcGVuZGVkIGFuZCBhcHBlbmRlZCB0ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gc2VjdGlvbkRhdGEgVGhlIHNlY3Rpb24gZGF0YS5cbiAgICAgICAgICogQHBhcmFtIGNoYW5nZXMgVGhlIHByZXBlbmRpbmcgYW5kIGFwcGVuZGluZyB0ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gY2hhbmdlcy5wcmVwZW5kIFRoZSB0ZXh0IHRvIHByZXBlbmQgdG8gdGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgICAgICogQHBhcmFtIGNoYW5nZXMuYXBwZW5kIFRoZSB0ZXh0IHRvIGFwcGVuZCB0byB0aGUgc2VjdGlvbiB0ZXh0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBtb2RpZnlTZWN0aW9uRGF0YShzZWN0aW9uRGF0YTogeyBwYWdlVGV4dDogc3RyaW5nIH0gJiBBY3Rpb25bJ29yaWdpbmFsVGV4dCddLCB7IHByZXBlbmQsIGFwcGVuZCB9OiB7IHByZXBlbmQ/OiBzdHJpbmc7IGFwcGVuZD86IHN0cmluZyB9KSB7XG4gICAgICAgICAgICBjb25zdCB7IGZ1bGxTZWN0aW9uVGV4dDogb2xkRnVsbFNlY3Rpb25UZXh0LCBzZWN0aW9uVGV4dDogb2xkU2VjdGlvblRleHQgfSA9IHNlY3Rpb25EYXRhO1xuXG4gICAgICAgICAgICBpZiAocHJlcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgPSBwcmVwZW5kICsgJ1xcbicgKyBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dDtcbiAgICAgICAgICAgIGlmIChhcHBlbmQpIHNlY3Rpb25EYXRhLnNlY3Rpb25UZXh0ICs9ICdcXG4nICsgYXBwZW5kO1xuXG4gICAgICAgICAgICBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQgPSBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQucmVwbGFjZShvbGRTZWN0aW9uVGV4dCwgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQpO1xuXG4gICAgICAgICAgICBzZWN0aW9uRGF0YS5wYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0LnJlcGxhY2Uob2xkRnVsbFNlY3Rpb25UZXh0LCBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gc2VjdGlvbkRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgcGFnZXMgcmVsYXRlZCB0byBhbiBhY2NlcHRlZCByZWRpcmVjdCByZXF1ZXN0LlxuICAgICAgICAgKiBAcGFyYW0gcGFnZSBUaGUgcmVxdWVzdGVkIHBhZ2UuXG4gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIG9mIHRoZSByZXF1ZXN0ZWQgcGFnZS5cbiAgICAgICAgICogQHBhcmFtIHRhcmdldCBUaGUgdGFyZ2V0IG9mIHRoZSByZXF1ZXN0ZWQgcGFnZS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgaGFuZGxlQWNjZXB0ZWRSZWRpcmVjdChwYWdlOiBzdHJpbmcsIGRhdGE6IFJlZGlyZWN0QWN0aW9uLCB0YXJnZXQ6IHN0cmluZykge1xuICAgICAgICAgICAgY29uc3QgdGFnc1dpdGhBcmd1bWVudHMgPVxuICAgICAgICAgICAgICAgIGRhdGEucmVkaXJlY3RUZW1wbGF0ZXMgJiYgZGF0YS5yZWRpcmVjdFRlbXBsYXRlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgID8gZGF0YS5yZWRpcmVjdFRlbXBsYXRlcy5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZEFyZ3VtZW50RWRpdG9yID0gZGF0YS5yZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVycz8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kQXJndW1lbnRFZGl0b3IpIHJldHVybiBge3ske3RhZ319fWA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkQXJndW1lbnRzID0gZm91bmRBcmd1bWVudEVkaXRvci5wYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB8JHtwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSA/ICcnIDogYCR7cGFyYW1ldGVyLm5hbWV9PWB9JHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYHt7JHt0YWd9JHttYXBwZWRBcmd1bWVudHN9fX1gO1xuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICAgICAgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5wdXNoKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgIGlzUmVkaXJlY3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBwYWdlLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgI1JFRElSRUNUIFtbJHt0YXJnZXR9XV0ke3RhZ3NXaXRoQXJndW1lbnRzID8gYFxcblxcbnt7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx8XFxuJHt0YWdzV2l0aEFyZ3VtZW50cy5qb2luKCdcXG4nKX1cXG59fWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQ3JlYXRpbmcgcmVkaXJlY3QgdG8gW1ske3RhcmdldH1dXSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvUl1dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgIGlzUmVkaXJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogbXcuVGl0bGUubmV3RnJvbVRleHQocGFnZSkhLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBge3tXaWtpUHJvamVjdCBiYW5uZXIgc2hlbGx8XFxue3tXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb258dHM9e3tzdWJzdDpMT0NBTFRJTUVTVEFNUH19fHJldmlld2VyPSR7bXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpfX19XFxufX1gLFxuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWRkaW5nIFtbV2lraXBlZGlhOldpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnxXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb25dXSBiYW5uZXIke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhhbmRsZXMgdGhlIGNyZWF0aW9uIG9mIHBhZ2VzIHJlbGF0ZWQgdG8gYW4gYWNjZXB0ZWQgY2F0ZWdvcnkgcmVxdWVzdC5cbiAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgb2YgdGhlIHJlcXVlc3RlZCBjYXRlZ29yeS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgaGFuZGxlQWNjZXB0ZWRDYXRlZ29yeShkYXRhOiBDYXRlZ29yeUFjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5wdXNoKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgIGlzUmVkaXJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogYENhdGVnb3J5OiR7ZGF0YS5jYXRlZ29yeX1gLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBkYXRhLnBhcmVudHMubWFwKChwYXJlbnQpID0+IGBbW0NhdGVnb3J5OiR7cGFyZW50fV1dYCkuam9pbignXFxuJyksXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBDcmVhdGluZyBjYXRlZ29yeSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvQ11dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgICAgIGlzUmVkaXJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogYENhdGVnb3J5IHRhbGs6JHtkYXRhLmNhdGVnb3J5fWAsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGB7e1dpa2lQcm9qZWN0IGJhbm5lciBzaGVsbHxcXG57e1dpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnx0cz17e3N1YnN0OkxPQ0FMVElNRVNUQU1QfX18cmV2aWV3ZXI9JHttdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJyl9fX1cXG59fWAsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZGRpbmcgW1tXaWtpcGVkaWE6V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9ufFdpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbl1dIGJhbm5lciR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAuLi5kYXRhLmV4YW1wbGVzLm1hcCgoZXhhbXBsZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2VkaXQnIGFzIGNvbnN0LFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogZXhhbXBsZSxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoeyBjb250ZW50IH06IHsgY29udGVudDogc3RyaW5nIH0pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiBgJHtjb250ZW50fVxcbltbQ2F0ZWdvcnk6JHtkYXRhLmNhdGVnb3J5fV1dYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBBZGRpbmcgcGFnZSB0byBbWzpDYXRlZ29yeToke2RhdGEuY2F0ZWdvcnl9XV0gYXMgcmVxdWVzdGVkIGF0IFtbV1A6QUZDL0NdXSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTWFrZXMgYWxsIGVkaXRzIGFuZCBjcmVhdGlvbnMgdGhhdCBuZWVkIHRvIGJlIG1hZGUuXG4gICAgICAgICAqIEBwYXJhbSBzaG93QWN0aW9uc0RpYWxvZyBUaGUgZGlhbG9nIHRvIGxvZyB0aGUgcmVzdWx0cyB0by5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgbWFrZUFsbEVkaXRzQ3JlYXRpb25zKHNob3dBY3Rpb25zRGlhbG9nOiBTaG93QWN0aW9uc0RpYWxvZykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFwaUZ1bmN0aW9uID0gYWN0aW9uLnR5cGUgPT09ICdlZGl0JyA/IHRoaXMuYXBpLmVkaXQoYWN0aW9uLnRpdGxlLCBhY3Rpb24udHJhbnNmb3JtKSA6IHRoaXMuYXBpLmNyZWF0ZShhY3Rpb24udGl0bGUsIHsgc3VtbWFyeTogYWN0aW9uLnN1bW1hcnkgfSwgYWN0aW9uLnRleHQpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKGFjdGlvbi50aXRsZSwgJ2lzUmVkaXJlY3QnIGluIGFjdGlvbiAmJiBhY3Rpb24uaXNSZWRpcmVjdCA/IHsgcmVkaXJlY3Q6ICdubycgfSA6IHVuZGVmaW5lZCk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGV4dENvbnRlbnQgPSBhY3Rpb24udGl0bGU7XG5cbiAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShgJHthY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gJ0VkaXRpbmcnIDogJ0NyZWF0aW5nJ30gJHtsaW5rRWxlbWVudC5vdXRlckhUTUx9Li4uYCk7XG5cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgICAgIGF3YWl0IGFwaUZ1bmN0aW9uLmNhdGNoKGFzeW5jIChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ3JhdGVsaW1pdGVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoYFJhdGUgbGltaXRlZC4gV2FpdGluZyBmb3IgNzAgc2Vjb25kcy4uLiAocmVzdW1pbmcgYXQgJHtuZXcgRGF0ZShEYXRlLm5vdygpICsgNzBfMDAwKS50b0xvY2FsZVRpbWVTdHJpbmcoKX0pYCwgJ3dhcm5pbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDcwXzAwMCkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnQ29udGludWluZy4uLicsICdzdWNjZXNzJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaUZ1bmN0aW9uLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yICR7YWN0aW9uLnR5cGUgPT09ICdlZGl0JyA/ICdlZGl0aW5nJyA6ICdjcmVhdGluZyd9ICR7bGlua0VsZW1lbnQub3V0ZXJIVE1MfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgJHthY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gJ2VkaXRpbmcnIDogJ2NyZWF0aW5nJ30gJHtsaW5rRWxlbWVudC5vdXRlckhUTUx9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKEFmY3JjSGVscGVyRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7YUFJQSxHQUFHLE9BQU8sTUFBTSxDQUFDLGlCQUFrQixlQUFnQixrQkFBbUIsaUJBQWlCLEVBQUcsSUFBTSxDQUM1RixNQUFNQSxFQUF3QixHQUFHLE9BQU8sSUFBSSxZQUFZLElBQU0sNENBQ3hEQyxFQUF3QixHQUFHLE9BQU8sSUFBSSxZQUFZLElBQU0sNkNBRTlELEdBQUksQ0FBQ0QsR0FBeUIsQ0FBQ0MsRUFBdUIsT0FFdEQsTUFBTUMsRUFBa0JGLEVBQXdCLFdBQWEsV0FFaEQsR0FBRyxLQUFLLGVBQWUsR0FBRyxPQUFPLElBQUksTUFBTSxJQUFNLFVBQVksT0FBUyxhQUFjLElBQUssVUFBVUUsQ0FBZSxxQkFBc0IsY0FBYyxFQUU5SixpQkFBaUIsUUFBVUMsR0FBVSxDQUN0Q0EsRUFBTSxlQUFlLEVBRXJCLE1BQU1DLEVBQWdCLElBQUksR0FBRyxH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QzVFLENBQUMiLAogICJuYW1lcyI6IFsiaXNSZWRpcmVjdFJlcXVlc3RQYWdlIiwgImlzQ2F0ZWdvcnlSZXF1ZXN0UGFnZSIsICJyZXF1ZXN0UGFnZVR5cGUiLCAiZXZlbnQiLCAid2luZG93TWFuYWdlciIsICJhZmNyY0hlbHBlckRpYWxvZyIsICJBZmNyY0hlbHBlckRpYWxvZyIsICJTaG93QWN0aW9uc0RpYWxvZyIsICJtZXNzYWdlIiwgInR5cGUiLCAibWVzc2FnZVdpZGdldCIsICJyZWxvYWRCdXR0b24iLCAiUGFnZUlucHV0V2lkZ2V0IiwgImNvbmZpZyIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJwYXJzZWRUaXRsZSIsICJyZXN1bHQiLCAicGFnZXMiLCAicGFnZSIsICJyZXNwb25zZSIsICJkYXRhIiwgImxhYmVsIiwgIkNhdGVnb3J5SW5wdXRXaWRnZXQiLCAiY2F0ZWdvcnkiLCAidGl0bGVXaXRob3V0TmFtZXNwYWNlIiwgInBhZ2VUaXRsZSIsICJhY3Rpb24iLCAicmVkaXJlY3RUZW1wbGF0ZVJlc3BvbnNlIiwgInBhZ2VSZXZpc2lvbiIsICJzZWN0aW9ucyIsICJtYXRjaCIsICJzZWN0aW9uVGV4dCIsICJzZWN0aW9uSGVhZGVyIiwgInBhcnNlZERhdGEiLCAicmVxdWVzdGVkUGFnZXMiLCAicGFyc2VkVGFyZ2V0IiwgInJlcXVlc3RlciIsICJmb3VuZENhdGVnb3J5IiwgImZpcnN0VXNlckluZGV4IiwgImZpcnN0VXNlclRhbGtJbmRleCIsICJmaXJzdElwSW5kZXgiLCAiZmlyc3RJbmRleCIsICJpbmRleCIsICJoYW5kbGUiLCAiZW5kSW5kZXgiLCAic3ViSW5kZXgiLCAibWVzc2FnZVdpZGdldExheW91dCIsICJyZXF1ZXN0IiwgImRldGFpbHNFbGVtZW50IiwgInN1bW1hcnlFbGVtZW50IiwgInRhcmdldEVkaXRvckVsZW1lbnQiLCAibGlua0VsZW1lbnQiLCAicmVxdWVzdEluZm9FbGVtZW50IiwgIm5vbmVFbGVtZW50IiwgInVua25vd25FbGVtZW50IiwgInJlYXNvbkRpdiIsICJyZWFzb25MYWJlbCIsICJzb3VyY2VEaXYiLCAic291cmNlTGFiZWwiLCAicmVxdWVzdGVyRGl2IiwgInJlcXVlc3RlckxhYmVsIiwgInJlcXVlc3RlckxpbmsiLCAicmVxdWVzdFJlc3BvbmRlckVsZW1lbnQiLCAicmVxdWVzdGVkVGl0bGUiLCAicmVxdWVzdGVkVGl0bGVEaXYiLCAidGFnU2VsZWN0TGF5b3V0IiwgInRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciIsICJ0ZW1wbGF0ZUVkaXRvcnNJbmZvIiwgImFjdGlvblJhZGlvSW5wdXQiLCAib3B0aW9uIiwgInRhZ1NlbGVjdCIsICJ0YWciLCAicmVkaXJlY3QiLCAic29ydGVkVGFncyIsICJhIiwgImIiLCAiZWRpdG9ySW5mbyIsICJzaG93blRlbXBsYXRlRWRpdG9ycyIsICJub1RlbXBsYXRlc01lc3NhZ2UiLCAiY29tbWVudElucHV0TGF5b3V0IiwgInRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZURhdGEiLCAicGFyYW1ldGVycyIsICJkZXRhaWxzIiwgInN1bW1hcnkiLCAiZWxlbWVudERhdGEiLCAicGFyYW1ldGVyTmFtZSIsICJwYXJhbWV0ZXJEYXRhIiwgImlucHV0IiwgImlucHV0TGF5b3V0IiwgImNvbW1lbnQiLCAiY29tbWVudElucHV0IiwgImRlbnlSZWFzb25MYXlvdXQiLCAiY2xvc2luZ1JlYXNvbkxheW91dCIsICJkZW55UmVhc29uIiwgImNsb3NpbmdSZWFzb24iLCAidGl0bGUiLCAiaWQiLCAic2VsZWN0ZWQiLCAiZXhhbXBsZXNEaXYiLCAiZXhhbXBsZXNMYWJlbCIsICJleGFtcGxlIiwgInBhcmVudHNEaXYiLCAicGFyZW50c0xhYmVsIiwgInBhcmVudCIsICJwYWdlU2VsZWN0TGF5b3V0IiwgImNhdGVnb3J5U2VsZWN0TGF5b3V0IiwgInBhZ2VTZWxlY3RJbnB1dCIsICJwYWdlU2VsZWN0IiwgImV4YW1wbGVzIiwgImNhdGVnb3J5U2VsZWN0SW5wdXQiLCAiY2F0ZWdvcnlTZWxlY3QiLCAicGFyZW50cyIsICJhY3Rpb25zVG9UYWtlIiwgImFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQiLCAiZmlyc3RDbG9zZVJlYXNvbiIsICJhbGxSZXF1ZXN0c0Nsb3NlZCIsICJiYWNrZ3JvdW5kQ29sb3IiLCAiYWNjZXB0ZWRDb3VudCIsICJkZW5pZWRDb3VudCIsICJzaG93QWN0aW9uc0RpYWxvZyIsICJjb3VudHMiLCAibmV3UGFnZVRleHQiLCAiYWN0aW9uRGF0YSIsICJ0YXJnZXQiLCAicmVxdWVzdHMiLCAic29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCIsICJhY2NlcHRlZFBhZ2VzIiwgImRlbmllZFBhZ2VzIiwgImNvbW1lbnRzIiwgImFtb3VudE9mUGFnZXMiLCAic2VjdGlvbkRhdGEiLCAiY2xvc2luZ0lkIiwgImFjY2VwdGVkUGFnZXNNZXNzYWdlIiwgImRlbmllZFBhZ2VzTWVzc2FnZSIsICJtYXBwZWRDb3VudHMiLCAiY291bnQiLCAicmVhc29uIiwgInRlbXBsYXRlUGFyYW1ldGVycyIsICJhZGRpdGlvbmFsUmVhc29uaW5nIiwgInNpbmd1bGFyUmVxdWVzdCIsICJhbGxSZXF1ZXN0cyIsICJyZWFzb25zIiwgInJlYXNvbnNBcnJheSIsICJjb21tZW50TWVzc2FnZXMiLCAiY29tbWVudHNBcnJheSIsICJwcmVwZW5kIiwgImFwcGVuZCIsICJvbGRGdWxsU2VjdGlvblRleHQiLCAib2xkU2VjdGlvblRleHQiLCAidGFnc1dpdGhBcmd1bWVudHMiLCAiZm91bmRBcmd1bWVudEVkaXRvciIsICJtYXBwZWRBcmd1bWVudHMiLCAicGFyYW1ldGVyIiwgImNvbnRlbnQiLCAiYXBpRnVuY3Rpb24iLCAiZXJyb3JDb2RlIiwgImVycm9ySW5mbyIsICJyZXNvbHZlIl0KfQo=