Jump to content

User:Eejit43/scripts/afcrc-helper.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Eejit43 (talk | contribs) at 17:12, 9 April 2025 (Syncing script from GitHub (via script)). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
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/afcrc-helper.ts

"use strict";(()=>{var se=Object.defineProperty;var k=(f,e)=>()=>(f&&(e=f(f=0)),e);var J=(f,e)=>{for(var t in e)se(f,t,{get:e[t],enumerable:!0})};var S,G=k(()=>{"use strict";S=class f extends OO.ui.Dialog{contentLayout;logOutput;closeButton;constructor(){super({size:"large"}),f.static.name="ActionsDialog",f.static.title="Actions"}initialize=()=>(OO.ui.Dialog.prototype.initialize.apply(this),this.contentLayout=new OO.ui.PanelLayout({padded:!0,expanded:!1}),this.$body.append(this.contentLayout.$element),this.logOutput=document.createElement("div"),this.logOutput.classList.add("afcrc-helper-actions-container"),this.closeButton=new OO.ui.ButtonWidget({label:"Close",flags:["safe","close"]}),this.closeButton.on("click",()=>this.close()),this.contentLayout.$element.append(this.logOutput,this.closeButton.$element),this);addLogEntry(e,t="notice"){let n=new OO.ui.MessageWidget({type:t,inline:!0,label:new OO.ui.HtmlSnippet(e)});this.logOutput.append(n.$element[0]),this.updateSize(),this.closeButton.scrollElementIntoView()}showReload(){this.closeButton.$element.remove();let e=new OO.ui.ButtonWidget({label:"Reload",flags:["primary"]});e.on("click",()=>{window.location.reload()}),this.contentLayout.$element.append(e.$element)}};Object.assign(S.prototype,OO.ui.Dialog.prototype)});var E,Q=k(()=>{"use strict";G();E=class f extends OO.ui.ProcessDialog{api=new mw.Api;scriptMessage=" ([[User:Eejit43/scripts/afcrc-helper|afcrc-helper]])";requestPageType;pageTitle;createdPageWatchMethod;beforeText;pageContent;parsedRequests;editsCreationsToMake=[];constructor(e,t,n){super({size:"large"}),f.static.name="AfcrcHelperDialog",f.static.title="afcrc-helper",f.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"save",label:"Run",flags:["primary","progressive"]}],this.pageTitle=t,this.requestPageType=e,this.createdPageWatchMethod=n&&["nochange","preferences","unwatch","watch"].includes(n)?n:"preferences",document.body.classList.add("afcrc-helper-open")}getActionProcess=e=>!e||e==="cancel"?new OO.ui.Process(()=>{this.parsedRequests.length>0?OO.ui.confirm("Are you sure you want to close? All changes will be discarded.").then(t=>t?this.close():null):this.close()}):e==="save"?new OO.ui.Process(()=>{this.performActions()}):f.super.prototype.getActionProcess.call(this,e);getTeardownProcess=()=>f.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty(),document.body.classList.remove("afcrc-helper-open")});async load(){let e=await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.pageTitle});this.pageContent=e.query.pages[0].revisions[0].slots.main.content.trim(),this.parseRequests(),this.loadInputElements()}parseRequests(){this.beforeText=/^(.*?)==/s.exec(this.pageContent)[1],this.pageContent=this.pageContent.replace(/^.*?==/s,"==");let e=[...this.pageContent.matchAll(/^==.*?==$(\s*(?!==[^=]).*)*/gim)].map(t=>t[0]);for(let t of e){if(/{{afc-c\|/i.test(t))continue;let s=/^==(.*?)==$/m.exec(t)[1].trim();this.parseSubtypeRequests(t,s)}}loadInputElements(){if(this.parsedRequests.length>0){let e=0,t=()=>{let s=Math.min(e+5,this.parsedRequests.length);this.title.setLabel(`afcrc-helper (loading ${e+1}-${s}/${this.parsedRequests.length} requests)`);for(let i=e;i<s;i++)this.loadSubtypeElements(i);s<this.parsedRequests.length?(e=s,setTimeout(t,0)):this.title.setLabel(`afcrc-helper (${this.parsedRequests.length} requests loaded)`)};t()}else{let e=new OO.ui.MessageWidget({type:"notice",label:"No valid requests to handle!"}),t=new OO.ui.PanelLayout({padded:!0,expanded:!1});t.$element.append(e.$element),this.$body.append(t.$element),this.updateSize()}}async performActions(){let e=new OO.ui.WindowManager;document.body.append(e.$element[0]);let t=new S;e.addWindows([t]),t.open();let n={accepted:0,denied:0,"commented on":0,closed:0},s=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.pageTitle})).query.pages[0].revisions[0].slots.main.content.trim();this.performSubtypeActions(t,n,s)}formatDeniedReason(e){let t=e.startsWith("autofill:")?/autofill:(\w+)/.exec(e)[1]:`decline|2=${e}`,n=e.startsWith("autofill:")&&e.includes(",")?" "+e.slice(e.indexOf(",")+1).trim():"";return`{{subst:AfC ${this.requestPageType}|${t}}}${n}`}mapDeniedReasons(e,t,n){if(t)return`* ${this.formatDeniedReason(e[0][1])} ~~~~`;let s={};for(let[o,a]of e)a in s||(s[a]=[]),s[a].push(o);let i=Object.entries(s);return i.map(([o,a])=>`* ${this.formatDeniedReason(o)}${i.length>1||!n?` (${a.map(l=>`[[${l}]]`).join(", ")})`:""} ~~~~`).join(`
`)}mapComments(e,t,n){if(t)return`* {{AfC comment|1=${e[0][1]}}} ~~~~`;let s={};for(let[o,a]of e)a in s||(s[a]=[]),s[a].push(o);let i=Object.entries(s);return i.map(([o,a])=>`* {{AfC comment|1=${o}}}${i.length>1||!n?` (${a.map(l=>`[[${l}]]`).join(", ")})`:""} ~~~~`).join(`
`)}modifySectionData(e,{prepend:t,append:n}){let{fullSectionText:s,sectionText:i}=e;return t&&(e.sectionText=t+`
`+e.sectionText),n&&(e.sectionText+=`
`+n),e.fullSectionText=e.fullSectionText.replace(i,e.sectionText),e.pageText=e.pageText.replace(s,e.fullSectionText),e}async makeAllEditsCreations(e){for(let[t,n]of this.editsCreationsToMake.entries()){let s=n.type==="edit"?()=>this.api.edit(n.title,n.transform):()=>this.api.create(n.title,{summary:n.summary,watchlist:this.createdPageWatchMethod},n.text),i=document.createElement("a");i.target="_blank",i.href=mw.util.getUrl(n.title,"isRedirect"in n&&n.isRedirect?{redirect:"no"}:void 0),i.textContent=n.title;let o=`afcrc-helper-action-result-${t}`;e.addLogEntry(`${n.type==="edit"?"Editing":"Creating"} ${i.outerHTML}... <span id="${o}"></span>`),await s().then(a=>{if(a.result==="Success"){let l;"nochange"in a||(l=document.createElement("a"),l.target="_blank",l.href=mw.util.getUrl(`Special:Diff/${a.oldrevid?`${a.oldrevid}/`:""}${a.newrevid}`),l.textContent="diff");let p=document.querySelector(`#${o}`);l?p.append("(done, see ",l,")"):p.textContent="(done, no changes)"}}).catch(async(a,l)=>{a==="ratelimited"?(e.addLogEntry(`Rate limited. Waiting for 70 seconds... (resuming at ${new Date(Date.now()+7e4).toLocaleTimeString()})`,"warning"),await new Promise(p=>setTimeout(p,7e4)),e.addLogEntry("Continuing...","success"),await s().catch((p,d)=>{e.addLogEntry(`Error ${n.type==="edit"?"editing":"creating"} ${i.outerHTML}: ${d?.error?.info??"Unknown error"} (${p}).`,"error")})):e.addLogEntry(`Error ${n.type==="edit"?"editing":"creating"} ${i.outerHTML}: ${l?.error?.info??"Unknown error"} (${a}).`,"error")})}}parseSubtypeRequests(e,t){throw new Error("Not implemented.")}loadSubtypeElements(e){throw new Error("Not implemented.")}updateRequestColor(e,t){throw new Error("Not implemented.")}async performSubtypeActions(e,t,n){throw new Error("Not implemented.")}};Object.assign(E.prototype,OO.ui.ProcessDialog.prototype)});var W,Y=k(()=>{"use strict";W=class{titleIndex;title;detailsElement;responderElement;dialog;templateParametersEditor;templateEditorsInfo=[];commentInput;tagSelectLayout;denyReasonLayout;closingReasonLayout;commentLayout;constructor(e,t,n,s,i){this.titleIndex=e,this.title=t,this.detailsElement=n,this.responderElement=s,this.dialog=i}setUp(){let e=document.createElement("div"),t=document.createElement("b");t.textContent=this.title,e.append(t);let n=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(s=>new OO.ui.RadioOptionWidget({data:s,label:s}))});n.selectItemByLabel("None"),n.on("choose",s=>{this.handleActionChange(s)}),this.loadCommentLayout(),e.append(n.$element[0],this.commentLayout.$element[0]),this.responderElement.append(e)}handleActionChange(e){setTimeout(()=>this.dialog.updateSize(),0);let t=e.getData().toLowerCase();switch(this.updateActionsToTake({action:t}),this.dialog.updateRequestColor(this.detailsElement,this.titleIndex),this.tagSelectLayout&&this.tagSelectLayout.$element.hide(),this.templateParametersEditor&&(this.templateParametersEditor.style.display="none"),this.denyReasonLayout&&this.denyReasonLayout.$element.hide(),this.closingReasonLayout&&this.closingReasonLayout.$element.hide(),t){case"accept":{(!this.tagSelectLayout||!this.templateParametersEditor)&&this.loadTagSelectAndParametersEditor(),this.tagSelectLayout.$element.show(),this.templateParametersEditor.style.display="block";break}case"deny":{this.denyReasonLayout||this.loadDenyReasonLayout(),this.denyReasonLayout.$element.show();break}case"close":{this.closingReasonLayout||this.loadClosingReasonLayout(),this.closingReasonLayout.$element.show();break}}if(["accept","comment","close"].includes(t)){this.commentLayout.$element.show();let n=this.commentInput.getValue().trim();n?this.updateActionsToTake({comment:n}):this.updateActionsToTake({comment:void 0})}else this.commentLayout.$element.hide(),this.updateActionsToTake({comment:void 0})}loadTagSelectAndParametersEditor(){let e=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.dialog.redirectTemplates).map(([s,{redirect:i}])=>{if(!i)return{data:s,label:s};let o=new OO.ui.HtmlSnippet(`<span class="afcrc-helper-redirect-possibilities">${s}</span>`);return{data:s,label:o}})});e.getMenu().filterMode="substring",e.on("change",s=>{let i=s.map(l=>l.getData()),o=i.toSorted((l,p)=>l.toLowerCase().localeCompare(p.toLowerCase()));if(i.join(";")!==o.join(";")){let l=s.at(-1);e.reorder(l,o.indexOf(l.getData()))}this.updateActionsToTake({redirectTemplates:o});let a=0;for(let l of this.templateEditorsInfo){let p=o.includes(l.name);l.details.style.display=p?"block":"none",p&&a++}t.textContent=`Template parameters (${a>0?`for ${a} template${a>1?"s":""}`:"none to show"})`,n.style.display=a>0?"none":"block"}),this.tagSelectLayout=new OO.ui.FieldLayout(e,{classes:["afcrc-helper-tag-select-layout"],align:"inline",label:"Redirect templates:"}),this.commentLayout.$element[0].before(this.tagSelectLayout.$element[0]),this.templateParametersEditor=document.createElement("details"),this.templateParametersEditor.classList.add("afcrc-helper-template-parameters-container");let t=document.createElement("summary");t.textContent="Template parameters (none to show)",this.templateParametersEditor.append(t);for(let[s,i]of Object.entries(this.dialog.redirectTemplates)){let o=Object.entries(i.parameters);if(o.length===0)continue;let a=document.createElement("details");a.style.display="none";let l=document.createElement("summary");l.textContent=s,a.append(l);let p={name:s,details:a,parameters:[]};for(let[d,u]of o){let g=new OO.ui.TextInputWidget({placeholder:u.default?.toString(),required:u.required}),R=new OO.ui.FieldLayout(g,{label:new OO.ui.HtmlSnippet(`${d}${!u.label||d.toLowerCase()===u.label.toLowerCase()?"":` (${u.label})`}${u.description?` (${u.description})`:""} (type: ${u.type}) ${u.suggested?" (suggested)":""}${u.example?` (example: "${u.example}")`:""}`),align:"inline"});a.append(R.$element[0]),p.parameters.push({name:d,aliases:u.aliases,editor:g})}this.templateParametersEditor.append(a),this.templateEditorsInfo.push(p)}this.updateActionsToTake({redirectTemplateParameters:this.templateEditorsInfo});let n=document.createElement("div");n.id="afcrc-helper-no-templates-message",n.textContent="No templates with parameters to display!",this.templateParametersEditor.append(n),this.commentLayout.$element[0].before(this.templateParametersEditor)}loadDenyReasonLayout(){let e=new OO.ui.ComboBoxInputWidget({classes:["afcrc-closing-reason-input"],placeholder:"autofill:unlikely",options:[["exists","existing pages"],["empty","empty submissions"],["notarget","nonexistent or no provided target"],["notitle","no title provided"],["unlikely","unlikely redirects"],["unrelated","apparently unrelated titles"],["notredirect","article creation requests"],["externallink","external link redirects"],["editrequest","edit requests"],["notenglish","requests not in English"]].map(([t,n])=>({data:`autofill:${t}`,label:`Autofilled text for ${n}`}))});e.on("change",t=>{this.updateActionsToTake({denyReason:t||"autofill:unlikely"})}),e.setValue("autofill:unlikely"),e.getMenu().selectItemByData("autofill:unlikely"),this.denyReasonLayout=new OO.ui.FieldLayout(e,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'}),this.denyReasonLayout.$element.hide(),this.commentLayout.$element[0].before(this.denyReasonLayout.$element[0])}loadClosingReasonLayout(){let e=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([t,n])=>new OO.ui.MenuOptionWidget({data:n,label:t}))}});e.getMenu().selectItemByData("r"),e.getMenu().on("choose",t=>{this.updateActionsToTake({closingReason:{name:t.getLabel(),id:t.getData()}}),this.dialog.updateRequestColor(this.detailsElement,this.titleIndex)}),this.closingReasonLayout=new OO.ui.FieldLayout(e,{align:"inline",label:"Closing reason:"}),this.closingReasonLayout.$element.hide(),this.commentLayout.$element[0].before(this.closingReasonLayout.$element[0])}loadCommentLayout(){this.commentInput=new OO.ui.TextInputWidget,this.commentInput.on("change",e=>{let t=e.trim();t?this.updateActionsToTake({comment:t}):this.updateActionsToTake({comment:void 0})}),this.commentLayout=new OO.ui.FieldLayout(this.commentInput,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"}),this.commentLayout.$element.hide()}updateActionsToTake(e){Object.assign(this.dialog.actionsToTake[this.titleIndex].requests[this.title],e)}}});var X={};J(X,{default:()=>B});var B,Z=k(()=>{"use strict";Q();Y();B=class extends E{redirectTemplates;parsedRequests=[];actionsToTake=[];async load(){let e=await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:"User:Eejit43/scripts/redirect-helper.json"});this.redirectTemplates=JSON.parse(e.query.pages[0]?.revisions?.[0]?.slots?.main?.content||"{}"),super.load()}parseSubtypeRequests(e,t){let n={},s=t.matchAll(/\[\[(.*?)]]/g).toArray().map(l=>l[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean);if(s.length===0)return;n.pages=s;let i=/Target of redirect: ?\[\[(.*?)]]/.exec(e)?.[1].trim().replace(/^:/,"").replaceAll("_"," ");if(!i)return;n.target=i,n.reason=/reason: ?(.*?)\*source(?: \(if applicable\))?:/is.exec(e)?.[1].trim()??"",n.source=/source(?: \(if applicable\))?: ?(.*?)(?:<references \/>|\n\n)/is.exec(e)?.[1].trim()??"";let o=e.match(e.includes("<references />")?/<references \/>\n+(.*)/:new RegExp(`(?:<references \\/>${n.source?`|${n.source.replaceAll(/[\s#$()*+,.?[\\\]^{|}-]/g,"\\$&")}`:""})
+(.*)`))?.[1].trim(),a=o?/(?:Special:Contributions\/|User(?: talk)?:)(.*?)\|/.exec(o)?.[1].trim():null;n.requester=o&&a?{type:/\[\[User( talk)?:/.test(o)?"user":"ip",name:a}:null,this.parsedRequests.push(n),this.actionsToTake.push({target:n.target,requests:Object.fromEntries(s.map(l=>[l,{originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"}]))})}loadSubtypeElements(e){let t=this.parsedRequests[e],n=document.createElement("details");n.classList.add("afcrc-helper-request"),n.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));let s=document.createElement("summary");s.innerHTML=t.pages.map(c=>`<b>${c}</b>`).join(", ")+" \u2192 ",s.addEventListener("keyup",c=>{document.activeElement?.tagName==="INPUT"&&c.key===" "&&c.preventDefault()});let i=document.createElement("input");i.classList.add("afcrc-helper-target-editor"),i.style.width=`${t.target.length}ch`,i.value=t.target,i.addEventListener("input",()=>{i.value=i.value.replaceAll("_"," "),i.style.width=`${i.value.length}ch`,this.actionsToTake[e].target=i.value,o.href=mw.util.getUrl(i.value)}),s.append(i);let o=document.createElement("a");o.classList.add("afcrc-helper-external-link"),o.target="_blank",o.href=mw.util.getUrl(t.target),o.innerHTML=`
<svg viewbox="0 0 48 48">
<path d="M36 24c-1.2 0-2 0.8-2 2v12c0 1.2-0.8 2-2 2h-22c-1.2
    0-2-0.8-2-2v-22c0-1.2 0.8-2 2-2h12c1.2 0 2-0.8 2-2s-0.8-2-2-2h-12c-3.4
    0-6 2.6-6 6v22c0 3.4 2.6 6 6 6h22c3.4 0 6-2.6
    6-6v-12c0-1.2-0.8-2-2-2z"></path>
<path d="M43.8 5.2c-0.2-0.4-0.6-0.8-1-1-0.2-0.2-0.6-0.2-0.8-0.2h-12c-1.2
    0-2 0.8-2 2s0.8 2 2 2h7.2l-18.6 18.6c-0.8 0.8-0.8 2 0 2.8 0.4 0.4 0.8
    0.6 1.4 0.6s1-0.2 1.4-0.6l18.6-18.6v7.2c0 1.2 0.8 2 2 2s2-0.8
    2-2v-12c0-0.2 0-0.6-0.2-0.8z"></path>
</svg>`,s.append(o),n.append(s);let a=document.createElement("div");a.classList.add("afcrc-helper-request-info");let l=document.createElement("span");l.style.color="dimgray",l.textContent="None";let p=document.createElement("span");p.style.color="dimgray",p.textContent="Unknown";let d=document.createElement("div"),u=document.createElement("b");u.textContent="Reason: ",d.append(u),t.reason?d.append(t.reason):d.append(l.cloneNode(!0)),a.append(d);let g=document.createElement("div"),R=document.createElement("b");R.textContent="Source: ",g.append(R),t.source?g.append(t.source):g.append(l.cloneNode(!0)),a.append(g);let T=document.createElement("div"),O=document.createElement("b");if(O.textContent="Requester: ",T.append(O),t.requester){let c=document.createElement("a");c.target="_blank",c.href=t.requester.type==="user"?mw.util.getUrl(`User:${t.requester.name}`):mw.util.getUrl(`Special:Contributions/${t.requester.name}`),c.textContent=t.requester.name,T.append(c)}else T.append(p.cloneNode(!0));a.append(T),n.append(a),n.append(document.createElement("hr"));let h=document.createElement("div");h.classList.add("afcrc-helper-request-responder");for(let c of t.pages)new W(e,c,n,h,this).setUp();n.append(h),this.$body.append(n),this.updateSize()}updateRequestColor(e,t){let n=Object.values(this.actionsToTake[t].requests),s=n.every(l=>l.action==="accept"||l.action==="deny"),i=n.find(l=>l.action==="close")?.closingReason?.id,o=n.every(l=>l.action==="close"&&l.closingReason?.id===i),a="";if(s){let l=n.filter(d=>d.action==="accept").length,p=n.filter(d=>d.action==="deny").length;l>0&&p>0?a="#fff17e":l>0?a="#a0ffa0":a="#ffcece"}else o&&(i==="r"?a="#ffcece":i==="s"?a="#90c090":a="#b8b8b8");e.style.backgroundColor=a}async performSubtypeActions(e,t,n){if(this.actionsToTake.some(i=>Object.values(i.requests).some(o=>o.action!=="none"))){for(let{target:o,requests:a}of this.actionsToTake){let l=Object.values(a).some(c=>c.action==="accept"||c.action==="deny"),p=Object.values(a).every(c=>c.action==="accept"||c.action==="deny"),d=Object.values(a).find(c=>c.action==="close")?.closingReason?.id,u=Object.values(a).every(c=>c.action==="close"&&c.closingReason?.id===d),g=[],R=[],T=[],O=Object.keys(a).length;for(let[c,w]of Object.entries(a))switch(w.action){case"accept":{l&&!p?e.addLogEntry(`Not all requests to "${o}" were accepted or denied, the handling of "${c}" will be ignored.`,"warning"):(g.push(c),w.comment&&T.push([c,w.comment]),t.accepted++);break}case"deny":{l&&!p?e.addLogEntry(`Not all requests to "${o}" were accepted or denied, the handling of "${c}" is being ignored.`,"warning"):(R.push([c,w.denyReason]),t.denied++);break}case"comment":{w.comment?(T.push([c,w.comment]),t["commented on"]++):e.addLogEntry(`The request to create "${c}" \u2192 "${o}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{u?(w.comment&&T.push([c,w.comment]),t.closed++):e.addLogEntry(`Not all requests to "${o}" were closed with the same reason, the handling of "${c}" is being ignored.`,"warning");break}}let h={pageText:n,...Object.values(a)[0].originalText};if(T.length>0&&(h=this.modifySectionData(h,{append:this.mapComments(T,O===1,T.length===O)})),p){let c;if(g.length>0&&R.length>0){c="p";let w=`* {{subst:AfC redirect}} (${g.map(C=>`[[${C}]]`).join(", ")}) ~~~~`,x=this.mapDeniedReasons(R,!1,!1);for(let C of g)this.handleAcceptedRedirect(C,a[C],o);h=this.modifySectionData(h,{append:`${w}
${x}`})}else if(g.length>0){c="a";for(let w of g)this.handleAcceptedRedirect(w,a[w],o);h=this.modifySectionData(h,{append:`* {{subst:AfC redirect${g.length>1?"|all":""}}} ~~~~`})}else c="d",h=this.modifySectionData(h,{append:this.mapDeniedReasons(R,O===1,!0)});h=this.modifySectionData(h,{prepend:`{{AfC-c|${c}}}`,append:"{{AfC-c|b}}"})}else u&&(h=this.modifySectionData(h,{prepend:`{{AfC-c|${d}}}`,append:"{{AfC-c|b}}"}));n=h.pageText}if(this.beforeText+this.pageContent===n){e.addLogEntry("No requests have been handled (page content identical)!");return}let i=Object.entries(t).filter(([,o])=>o>0).map(([o,a])=>`${o} ${a}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:n,summary:`Handling AfC redirect requests (${i})${this.scriptMessage}`})}),await this.makeAllEditsCreations(e),e.addLogEntry("All changes made, click below to reload!","success"),e.showReload()}else e.addLogEntry("No requests have been handled!")}handleAcceptedRedirect(e,t,n){let s=t.redirectTemplates&&t.redirectTemplates.length>0?t.redirectTemplates.map(o=>{let a=t.redirectTemplateParameters?.find(d=>d.name===o);if(!a)return`{{${o}}}`;let l=a.parameters.findLastIndex((d,u)=>d.name===(u+1).toString()&&d.editor.getValue().trim()),p=a.parameters.map((d,u)=>{let g=d.editor.getValue().trim();return!g&&u>l?null:`|${d.name===(u+1).toString()?"":`${d.name}=`}${g}`}).filter(Boolean).join("");return`{{${o}${p}}}`}):null,i=mw.Title.newFromText(e);this.editsCreationsToMake.push({type:"create",isRedirect:!0,title:i.getPrefixedText(),text:`#REDIRECT [[${n}]]${s?`

{{Redirect category shell|
${s.join(`
`)}
}}`:""}`,summary:`Creating redirect to [[${n}]] as requested at [[WP:AFC/R]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:i.getTalkPage().getPrefixedText(),text:`{{WikiProject banner shell|
{{WikiProject Articles for creation|ts={{subst:LOCALTIMESTAMP}}|reviewer=${mw.config.get("wgUserName")}}}
}}`,summary:`Adding [[Wikipedia:WikiProject Articles for creation|WikiProject Articles for creation]] banner${this.scriptMessage}`})}}});var v,ee=k(()=>{"use strict";v=class extends OO.ui.TextInputWidget{api=new mw.Api;supportsSortKey;validCategories=new Set;constructor(e,t=!1){super(e),OO.ui.mixin.LookupElement.call(this,e),this.supportsSortKey=t}getLookupRequest=()=>{let e=this.getValue().split("|")[0],t=$.Deferred();if(e||t.resolve([]),this.supportsSortKey){let s=this.getValue().split("|")[1];if(s&&this.validCategories.has(e)){let i=[{data:`${e}|${s}`,label:`${e} (with sort key "${s}")`}];t.resolve(i),this.emit("showing-values",i)}}let n=mw.Title.newFromText(e);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:n?.getMainText()??e,generator:"allpages",prop:"categories"}).catch(()=>null).then(s=>{if(s?.query?.pages){let i=s.query.pages.filter(o=>!o.categories?.some(a=>a.title==="Category:Wikipedia soft redirected categories")).map(o=>{let a=o.title.split(":")[1];return this.supportsSortKey&&this.validCategories.add(a),{data:a,label:a}});this.emit("showing-values",i),t.resolve(i)}else t.resolve([])}),t.promise({abort(){}})};getLookupCacheDataFromResponse=e=>e??[];getLookupMenuOptionsFromData=e=>e.map(({data:t,label:n})=>new OO.ui.MenuOptionWidget({data:t,label:n}))};Object.assign(v.prototype,OO.ui.mixin.LookupElement.prototype)});var P,te=k(()=>{"use strict";P=class extends OO.ui.TextInputWidget{api=new mw.Api;constructor(e){super(e),OO.ui.mixin.LookupElement.call(this,e)}getLookupRequest=()=>{let e=this.getValue(),t=$.Deferred();e||t.resolve([]);let n=mw.Title.newFromText(e);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:n?.getNamespaceId()??0,gapprefix:n?.getMainText()??e,generator:"allpages"}).catch(()=>null).then(s=>{if(s?.query?.pages){let i=s.query.pages.map(o=>({data:o.title,label:o.title}));this.emit("showing-values",i),t.resolve(i)}else t.resolve([])}),t.promise({abort(){}})};getLookupCacheDataFromResponse=e=>e??[];getLookupMenuOptionsFromData=e=>e.map(({data:t,label:n})=>new OO.ui.MenuOptionWidget({data:t,label:n}))};Object.assign(P.prototype,OO.ui.mixin.LookupElement.prototype)});var ne={};J(ne,{default:()=>_});var _,ae=k(()=>{"use strict";ee();Q();te();_=class extends E{parsedRequests=[];actionsToTake=[];parseSubtypeRequests(e,t){let n={},s=/:?Category:(.*?)(]]|$)/.exec(t)?.[1].trim();if(!s)return;n.category=s.replaceAll("_"," "),n.examples=[...(/example pages which belong to this category:(.*?)(parent category\/categories:|\n\[\[(special:contributions\/|user:))/is.exec(e)?.[1]??"").matchAll(/\*\s*(?:\[\[)?(.*?)(\||]]|\s*?\n)/g)].map(p=>p[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean),n.parents=[...(/parent category\/categories:(.*?)(\n\n|\n\[\[(special:contributions\/|user:))/is.exec(e)?.[1]??"").matchAll(/(?<!\|)#?:?Category:(.*?)(\||]]|\s*?\n)/g)].map(p=>p[1].trim().replace(/^:/,"").replaceAll("_"," ")).filter(Boolean);let i=e.indexOf("[[User:"),o=e.indexOf("[[User talk:"),a=e.indexOf("[[Special:Contributions/"),l=Math.min(...[i,o,a].filter(p=>p!==-1));n.requester=l===Number.POSITIVE_INFINITY?null:l===a?{type:"ip",name:/\[\[Special:Contributions\/(.*?)(\||]])/.exec(e)[1].trim()}:{type:"user",name:/\[\[User(?: talk)?:(.*?)(\||]])/.exec(e)[1].trim()},n.requester?.name||(n.requester=null),this.parsedRequests.push(n),this.actionsToTake.push({category:n.category,categorizedPages:n.examples,parents:n.parents,categoriesToRemove:[...n.parents],originalText:{fullSectionText:e,sectionText:e.replace(/^==.*?==$/m,"").trim()},action:"none"})}loadSubtypeElements(e){let t=this.parsedRequests[e],n=document.createElement("details");n.classList.add("afcrc-helper-request"),n.addEventListener("click",()=>setTimeout(()=>this.updateSize(),0));let s=document.createElement("summary");s.innerHTML=`<b>Category:${t.category}</b>`,n.append(s);let i=document.createElement("div");i.classList.add("afcrc-helper-request-info");let o=document.createElement("span");o.style.color="dimgray",o.textContent="None";let a=document.createElement("span");a.style.color="dimgray",a.textContent="Unknown";let l=document.createElement("div"),p=document.createElement("b");if(p.textContent="Examples: ",l.append(p),t.examples.length>0)for(let[r,m]of t.examples.entries()){let y=document.createElement("a");y.target="_blank",y.href=mw.util.getUrl(m),y.textContent=m,l.append(y),r!==t.examples.length-1&&l.append(", ")}else l.append(o.cloneNode(!0));i.append(l);let d=document.createElement("div"),u=document.createElement("b");if(u.textContent="Parents: ",d.append(u),t.parents.length>0)for(let[r,m]of t.parents.entries()){let y=document.createElement("a");y.target="_blank",y.href=mw.util.getUrl(`Category:${m}`),y.textContent=m,d.append(y),r!==t.parents.length-1&&d.append(", ")}else d.append(o.cloneNode(!0));i.append(d);let g=document.createElement("div"),R=document.createElement("b");if(R.textContent="Requester: ",g.append(R),t.requester){let r=document.createElement("a");r.target="_blank",r.href=t.requester.type==="user"?mw.util.getUrl(`User:${t.requester.name}`):mw.util.getUrl(`Special:Contributions/${t.requester.name}`),r.textContent=t.requester.name,g.append(r)}else g.append(a.cloneNode(!0));i.append(g),n.append(i),n.append(document.createElement("hr"));let T=document.createElement("div");T.classList.add("afcrc-helper-request-responder");let O=new OO.ui.RadioSelectWidget({classes:["afcrc-helper-action-radio"],items:["Accept","Deny","Comment","Close","None"].map(r=>new OO.ui.RadioOptionWidget({data:r,label:r}))});O.selectItemByLabel("None"),O.on("choose",()=>{setTimeout(()=>this.updateSize(),0);let r=O.findSelectedItem().getData().toLowerCase();if(this.actionsToTake[e].action=r,["comment","close"].includes(r)){z.$element.show();let m=V.getValue().trim();m?this.actionsToTake[e].comment=m:delete this.actionsToTake[e].comment}else z.$element.hide(),delete this.actionsToTake[e].comment;switch(this.updateRequestColor(n,e),x.$element.hide(),j.$element.hide(),N.$element.hide(),U.$element.hide(),F.$element.hide(),r){case"accept":{x.$element.show(),j.$element.show(),N.$element.show();break}case"deny":{U.$element.show();break}case"close":{F.$element.show();break}}});let h=new P({placeholder:"Add pages here"});h.on("change",()=>{let r=h.getValue();r=r.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),r=r.replace(/^:/,""),r.length>0&&h.setValue(r[0].toUpperCase()+r.slice(1).replaceAll("_"," "))}),h.on("showing-values",r=>{for(let m of r)c.addAllowedValue(m.data)});let c=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:h});c.on("change",r=>{let m=r.map(b=>b.getData()),y=m.toSorted((b,M)=>b.toLowerCase().localeCompare(M.toLowerCase()));if(m.join(";")!==y.join(";")){let b=r.at(-1);c.reorder(b,y.indexOf(b.getData()))}this.actionsToTake[e].categorizedPages=y});let{categorizedPages:w}=this.actionsToTake[e];for(let r of w)c.addAllowedValue(r);c.setValue(w);let x=new OO.ui.FieldLayout(c,{align:"inline",label:"Pages to categorize:"});x.$element.hide();let C=new v({placeholder:"Add categories here"});C.on("change",()=>{let r=C.getValue();r=r.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),r=r.replace(/^Category:/,""),r.length>0&&C.setValue(r[0].toUpperCase()+r.slice(1).replaceAll("_"," "))}),C.on("showing-values",r=>{for(let m of r)L.addAllowedValue(m.data)});let L=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:C});L.on("change",r=>{let m=r.map(b=>b.getData()),y=m.toSorted((b,M)=>b.toLowerCase().localeCompare(M.toLowerCase()));if(m.join(";")!==y.join(";")){let b=r.at(-1);L.reorder(b,y.indexOf(b.getData()))}this.actionsToTake[e].categoriesToRemove=y});let{parents:I}=this.actionsToTake[e];for(let r of I)L.addAllowedValue(r);L.setValue(I);let j=new OO.ui.FieldLayout(L,{align:"inline",label:"Categories to remove from pages to categorize:"});j.$element.hide();let q=new v({placeholder:"Add categories here"},!0);q.on("change",()=>{let r=q.getValue();r=r.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),r=r.replace(/^Category:/,""),r.length>0&&q.setValue(r[0].toUpperCase()+r.slice(1).replaceAll("_"," "))}),q.on("showing-values",r=>{for(let m of r)A.addAllowedValue(m.data)});let A=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:q});A.on("change",r=>{let m=r.map(b=>b.getData()),y=m.toSorted((b,M)=>b.toLowerCase().localeCompare(M.toLowerCase()));if(m.join(";")!==y.join(";")){let b=r.at(-1);A.reorder(b,y.indexOf(b.getData()))}this.actionsToTake[e].parents=y});for(let r of I)A.addAllowedValue(r),q.validCategories.add(r);A.setValue(I);let N=new OO.ui.FieldLayout(A,{align:"inline",label:"Parent categories:"});N.$element.hide();let D=new OO.ui.ComboBoxInputWidget({classes:["afcrc-closing-reason-input"],placeholder:"autofill:unlikely",options:[["exists","existing categories"],["empty","empty submissions"],["unlikely","categories that are unlikely to have enough pages"],["notcategory","page creation requests"],["notenglish","requests not in English"]].map(([r,m])=>({data:`autofill:${r}`,label:`Autofilled text for ${m}`}))});D.on("change",()=>{this.actionsToTake[e].denyReason=D.getValue()||"autofill:unlikely"}),D.setValue("autofill:unlikely"),D.getMenu().selectItemByData("autofill:unlikely");let U=new OO.ui.FieldLayout(D,{align:"inline",label:"Deny reason:",help:'Supports automatic reasoning, custom reasoning, or a combination of the two with "autofill:REASON, CUSTOM" format'});U.$element.hide();let H=new OO.ui.DropdownWidget({classes:["afcrc-closing-reason-input"],menu:{items:[["No response","r"],["Succeeded","s"],["Withdrawn","w"]].map(([r,m])=>new OO.ui.MenuOptionWidget({data:m,label:r}))}});H.getMenu().on("choose",()=>{let r=H.getMenu().findSelectedItem();this.actionsToTake[e].closingReason={name:r.getLabel(),id:r.getData()},this.updateRequestColor(n,e)}),H.getMenu().selectItemByData("r"),this.actionsToTake[e].closingReason={name:"No response",id:"r"};let F=new OO.ui.FieldLayout(H,{align:"inline",label:"Closing reason:"});F.$element.hide();let V=new OO.ui.TextInputWidget;V.on("change",()=>{let r=V.getValue().trim();r?this.actionsToTake[e].comment=r:delete this.actionsToTake[e].comment});let z=new OO.ui.FieldLayout(V,{classes:["afcrc-comment-input"],align:"inline",label:"Comment:"});z.$element.hide(),T.append(O.$element[0],x.$element[0],j.$element[0],N.$element[0],U.$element[0],F.$element[0],z.$element[0]),n.append(T),this.$body.append(n),this.updateSize()}updateRequestColor(e,t){let{action:n}=this.actionsToTake[t],s="";n==="accept"?s="#a0ffa0":n==="deny"?s="#ffcece":n==="close"&&(this.actionsToTake[t].closingReason?.id==="r"?s="#ffcece":this.actionsToTake[t].closingReason?.id==="s"?s="#90c090":s="#b8b8b8"),e.style.backgroundColor=s}async performSubtypeActions(e,t,n){if(this.actionsToTake.some(i=>i.action!=="none")){for(let o of this.actionsToTake){let a={pageText:n,...o.originalText};switch(o.action){case"accept":{a=this.modifySectionData(a,{prepend:"{{AfC-c|a}}",append:`* {{subst:AfC category}} ~~~~
{{AfC-c|b}}`}),this.handleAcceptedCategory(o),t.accepted++;break}case"deny":{a=this.modifySectionData(a,{prepend:"{{AfC-c|d}}",append:`* ${this.formatDeniedReason(o.denyReason)} ~~~~
{{AfC-c|b}}`}),t.denied++;break}case"comment":{o.comment?(a=this.modifySectionData(a,{append:`* {{AfC comment|1=${o.comment}}} ~~~~`}),t["commented on"]++):e.addLogEntry(`The request to create "${o.category}" was marked to be commented on, but no comment was provided so it will be skipped.`,"warning");break}case"close":{a=this.modifySectionData(a,{prepend:`{{AfC-c|${o.closingReason.id}}}`,append:(o.comment?`* {{AfC comment|1=${o.comment}}} ~~~~`:"")+`
{{AfC-c|b}}`}),t.closed++;break}}n=a.pageText}if(this.beforeText+this.pageContent===n){e.addLogEntry("No requests have been handled (page content identical)!");return}let i=Object.entries(t).filter(([,o])=>o>0).map(([o,a])=>`${o} ${a}`).join(", ");this.editsCreationsToMake.push({type:"edit",title:this.pageTitle,transform:()=>({text:n,summary:`Handling AfC category requests (${i})${this.scriptMessage}`})}),await this.makeAllEditsCreations(e),e.addLogEntry("All changes made, click below to reload!","success"),e.showReload()}else e.addLogEntry("No requests have been handled!")}handleAcceptedCategory(e){this.editsCreationsToMake.push({type:"create",isRedirect:!1,title:`Category:${e.category}`,text:e.parents.map(t=>`[[Category:${t}]]`).join(`
`),summary:`Creating category as requested at [[WP:AFC/C]]${this.scriptMessage}`},{type:"create",isRedirect:!1,title:`Category talk:${e.category}`,text:`{{WikiProject banner shell|
{{WikiProject Articles for creation|ts={{subst:LOCALTIMESTAMP}}|reviewer=${mw.config.get("wgUserName")}}}
}}`,summary:`Adding [[Wikipedia:WikiProject Articles for creation|WikiProject Articles for creation]] banner${this.scriptMessage}`},...e.categorizedPages.map(t=>({type:"edit",title:t,transform:({content:n})=>{let s=!1;n=n.replace(/((\[\[:?[Cc]ategory:.+?]]\n?)+)/,i=>{s=!0;let o=i.endsWith(`
`);return`${i}${o?"":`
`}[[Category:${e.category}]]${o?`
`:""}`}),s||(n+=`
[[Category:${e.category}]]`);for(let i of e.categoriesToRemove)n=n.replaceAll(new RegExp(`\\[\\[:?[Cc]ategory:${i}(\\|.*?)?\\]\\]
?`,"gi"),"");return{text:n,summary:`Adding page to [[:Category:${e.category}]] as requested at [[WP:AFC/C]]${this.scriptMessage}`}}})))}}});var K=`body.afcrc-helper-open #mw-teleport-target{z-index:500}.afcrc-helper-request{margin:10px;border-radius:5px;background-color:#eee;padding:5px;color:#202122}.afcrc-helper-request summary{cursor:pointer}.afcrc-helper-target-editor{min-width:1ch;max-width:calc(100% - 4ch);font-family:monospace}.afcrc-helper-external-link{-webkit-text-decoration:none!important;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-top:8px;margin-bottom: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:-moz-max-content;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-redirect-possibilities:after{content:" (redirect with possibilities)";font-style:italic}.afcrc-helper-template-parameters-container,.afcrc-helper-template-parameters-container details{margin-top:10px;margin-bottom:10px;border:1px solid #a2a9b1;border-radius:2px;background-color:#fff;padding:5px}.afcrc-helper-template-parameters-container{margin-left:8px}.afcrc-helper-template-parameters-container summary{cursor:pointer;font-weight:700}.afcrc-helper-template-parameters-container details{margin-top:5px;margin-bottom:5px;background-color:#e2e2e2}#afcrc-helper-no-templates-message{padding:5px}.afcrc-helper-actions-container div{margin-top:8px;margin-bottom:8px}
`;mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],async()=>{let{default:f}=await Promise.resolve().then(()=>(Z(),X)),{default:e}=await Promise.resolve().then(()=>(ae(),ne)),t=mw.config.get("wgPageName").replaceAll("_"," "),n=t==="Wikipedia:Articles for creation/Redirects";if(!n&&!(t==="Wikipedia:Articles for creation/Categories"))return;let i=n?"redirect":"category";mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#",`Handle ${i} creation requests`,"afcrc-helper").addEventListener("click",a=>{a.preventDefault(),mw.util.addCSS(K);let l=new OO.ui.WindowManager;document.body.append(l.$element[0]);let p=i==="redirect"?f:e,d=new p(i,t,window.afcrcConfiguration?.createdPageWatchMethod);l.addWindows([d]),d.open(),d.load()})});})();

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc2NyaXB0cy9hZmNyYy1oZWxwZXIvc2hvdy1hY3Rpb25zLWRpYWxvZy50cyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9oZWxwZXItZGlhbG9nLnRzIiwgIi4uL3NjcmlwdHMvYWZjcmMtaGVscGVyL3JlZGlyZWN0LXJlcXVlc3QtaGFuZGxlci50cyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9yZWRpcmVjdHMtZGlhbG9nLnRzIiwgIi4uL3NjcmlwdHMvYWZjcmMtaGVscGVyL2NhdGVnb3J5LWlucHV0LXdpZGdldC50cyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9wYWdlLWlucHV0LXdpZGdldC50cyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9jYXRlZ29yaWVzLWRpYWxvZy50cyIsICIuLi9zdHlsZXMvYWZjcmMtaGVscGVyLmNzcyIsICIuLi9zY3JpcHRzL2FmY3JjLWhlbHBlci9hZmNyYy1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhbiBhY3Rpb24gZGlhbG9nLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBBY3Rpb25zRGlhbG9nIGV4dGVuZHMgT08udWkuRGlhbG9nIHtcbiAgICBwcml2YXRlIGNvbnRlbnRMYXlvdXQhOiBPTy51aS5QYW5lbExheW91dDtcbiAgICBwcml2YXRlIGxvZ091dHB1dCE6IEhUTUxEaXZFbGVtZW50O1xuICAgIHByaXZhdGUgY2xvc2VCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoeyBzaXplOiAnbGFyZ2UnIH0pO1xuXG4gICAgICAgIEFjdGlvbnNEaWFsb2cuc3RhdGljLm5hbWUgPSAnQWN0aW9uc0RpYWxvZyc7XG4gICAgICAgIEFjdGlvbnNEaWFsb2cuc3RhdGljLnRpdGxlID0gJ0FjdGlvbnMnO1xuICAgIH1cblxuICAgIGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICAgIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUuaW5pdGlhbGl6ZS5hcHBseSh0aGlzKTtcblxuICAgICAgICB0aGlzLmNvbnRlbnRMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy5sb2dPdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5sb2dPdXRwdXQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH0pO1xuICAgICAgICB0aGlzLmNsb3NlQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuY2xvc2UoKSk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50TGF5b3V0LiRlbGVtZW50LmFwcGVuZCh0aGlzLmxvZ091dHB1dCwgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBsb2cgZW50cnkgdG8gdGhlIGRpYWxvZy5cbiAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIG1lc3NhZ2UgdHlwZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9nRW50cnkobWVzc2FnZTogc3RyaW5nLCB0eXBlOiBPTy51aS5NZXNzYWdlV2lkZ2V0LlR5cGUgPSAnbm90aWNlJykge1xuICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlLCBpbmxpbmU6IHRydWUsIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQobWVzc2FnZSkgfSk7XG5cbiAgICAgICAgdGhpcy5sb2dPdXRwdXQuYXBwZW5kKG1lc3NhZ2VXaWRnZXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuY2xvc2VCdXR0b24uc2Nyb2xsRWxlbWVudEludG9WaWV3KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyB0aGUgY2xvc2UgYnV0dG9uIGFuZCBhZGRzIGEgcmVsb2FkIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2hvd1JlbG9hZCgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbi4kZWxlbWVudC5yZW1vdmUoKTtcblxuICAgICAgICBjb25zdCByZWxvYWRCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdSZWxvYWQnLCBmbGFnczogWydwcmltYXJ5J10gfSk7XG4gICAgICAgIHJlbG9hZEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29udGVudExheW91dC4kZWxlbWVudC5hcHBlbmQocmVsb2FkQnV0dG9uLiRlbGVtZW50KTtcbiAgICB9XG59XG5cbk9iamVjdC5hc3NpZ24oQWN0aW9uc0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLkRpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpRWRpdFBhZ2VQYXJhbXMsIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBNZWRpYVdpa2lEYXRhRXJyb3IsIFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBXYXRjaE1ldGhvZCB9IGZyb20gJy4vYWZjcmMtaGVscGVyJztcbmltcG9ydCBBY3Rpb25zRGlhbG9nIGZyb20gJy4vc2hvdy1hY3Rpb25zLWRpYWxvZyc7XG5cbmV4cG9ydCB0eXBlIFJlcXVlc3RSZXF1ZXN0ZXIgPSB7IHR5cGU6ICd1c2VyJyB8ICdpcCc7IG5hbWU6IHN0cmluZyB9IHwgbnVsbDtcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEFjdGlvblR5cGUgPSAnYWNjZXB0JyB8ICdkZW55JyB8ICdjb21tZW50JyB8ICdjbG9zZScgfCAnbm9uZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEFjdGlvbiB7XG4gICAgb3JpZ2luYWxUZXh0OiB7IGZ1bGxTZWN0aW9uVGV4dDogc3RyaW5nOyBzZWN0aW9uVGV4dDogc3RyaW5nIH07XG4gICAgYWN0aW9uOiBSZXF1ZXN0QWN0aW9uVHlwZTtcbiAgICBjb21tZW50Pzogc3RyaW5nO1xuICAgIGRlbnlSZWFzb24/OiBzdHJpbmc7XG4gICAgY2xvc2luZ1JlYXNvbj86IHsgbmFtZTogc3RyaW5nOyBpZDogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB0aGF0IGhhbmRsZXMgcmVkaXJlY3QgYW5kIGNhdGVnb3J5IHJlcXVlc3RzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIZWxwZXJEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICBwcm90ZWN0ZWQgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgcHJvdGVjdGVkIHNjcmlwdE1lc3NhZ2UgPSAnIChbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL2FmY3JjLWhlbHBlcnxhZmNyYy1oZWxwZXJdXSknO1xuXG4gICAgcHJpdmF0ZSByZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknO1xuICAgIHByb3RlY3RlZCBwYWdlVGl0bGU6IHN0cmluZztcblxuICAgIHByaXZhdGUgY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZDogV2F0Y2hNZXRob2Q7XG5cbiAgICBwcm90ZWN0ZWQgYmVmb3JlVGV4dCE6IHN0cmluZztcbiAgICBwcm90ZWN0ZWQgcGFnZUNvbnRlbnQhOiBzdHJpbmc7XG5cbiAgICBwcm90ZWN0ZWQgcGFyc2VkUmVxdWVzdHMhOiB1bmtub3duW107XG4gICAgcHJvdGVjdGVkIGVkaXRzQ3JlYXRpb25zVG9NYWtlOiAoXG4gICAgICAgIHwgeyB0eXBlOiAnZWRpdCc7IHRpdGxlOiBzdHJpbmc7IHRyYW5zZm9ybTogKGRhdGE6IHsgY29udGVudDogc3RyaW5nIH0pID0+IEFwaUVkaXRQYWdlUGFyYW1zIH1cbiAgICAgICAgfCB7IHR5cGU6ICdjcmVhdGUnOyBpc1JlZGlyZWN0OiBib29sZWFuOyB0aXRsZTogc3RyaW5nOyB0ZXh0OiBzdHJpbmc7IHN1bW1hcnk6IHN0cmluZyB9XG4gICAgKVtdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0UGFnZVR5cGU6ICdyZWRpcmVjdCcgfCAnY2F0ZWdvcnknLCBwYWdlVGl0bGU6IHN0cmluZywgY3JlYXRlZFdhdGNoTWV0aG9kOiBXYXRjaE1ldGhvZCB8IHVuZGVmaW5lZCkge1xuICAgICAgICBzdXBlcih7IHNpemU6ICdsYXJnZScgfSk7XG5cbiAgICAgICAgSGVscGVyRGlhbG9nLnN0YXRpYy5uYW1lID0gJ0FmY3JjSGVscGVyRGlhbG9nJztcbiAgICAgICAgSGVscGVyRGlhbG9nLnN0YXRpYy50aXRsZSA9ICdhZmNyYy1oZWxwZXInO1xuICAgICAgICBIZWxwZXJEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfSxcbiAgICAgICAgICAgIHsgYWN0aW9uOiAnc2F2ZScsIGxhYmVsOiAnUnVuJywgZmxhZ3M6IFsncHJpbWFyeScsICdwcm9ncmVzc2l2ZSddIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHRoaXMucmVxdWVzdFBhZ2VUeXBlID0gcmVxdWVzdFBhZ2VUeXBlO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCA9XG4gICAgICAgICAgICBjcmVhdGVkV2F0Y2hNZXRob2QgJiYgWydub2NoYW5nZScsICdwcmVmZXJlbmNlcycsICd1bndhdGNoJywgJ3dhdGNoJ10uaW5jbHVkZXMoY3JlYXRlZFdhdGNoTWV0aG9kKVxuICAgICAgICAgICAgICAgID8gY3JlYXRlZFdhdGNoTWV0aG9kXG4gICAgICAgICAgICAgICAgOiAncHJlZmVyZW5jZXMnO1xuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLW9wZW4nKTtcbiAgICB9XG5cbiAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmICghYWN0aW9uIHx8IGFjdGlvbiA9PT0gJ2NhbmNlbCcpXG4gICAgICAgICAgICByZXR1cm4gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIE9PLnVpXG4gICAgICAgICAgICAgICAgICAgICAgICAuY29uZmlybSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNsb3NlPyBBbGwgY2hhbmdlcyB3aWxsIGJlIGRpc2NhcmRlZC4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGNvbmZpcm1lZCkgPT4gKGNvbmZpcm1lZCA/IHRoaXMuY2xvc2UoKSA6IG51bGwpKTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09ICdzYXZlJylcbiAgICAgICAgICAgIHJldHVybiBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgdm9pZCB0aGlzLnBlcmZvcm1BY3Rpb25zKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgZWxzZSByZXR1cm4gSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICB9O1xuXG4gICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gSGVscGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZSgnYWZjcmMtaGVscGVyLW9wZW4nKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIExvYWQgZWxlbWVudHMgaW4gdGhlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgY29uc3QgcGFnZVJldmlzaW9uID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0O1xuXG4gICAgICAgIHRoaXMucGFnZUNvbnRlbnQgPSBwYWdlUmV2aXNpb24ucXVlcnkhLnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuXG4gICAgICAgIHRoaXMucGFyc2VSZXF1ZXN0cygpO1xuICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUGFyc2VzIHJlcXVlc3RzIGZyb20gdGhlIHBhZ2UgY29udGVudC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHBhcnNlUmVxdWVzdHMoKSB7XG4gICAgICAgIHRoaXMuYmVmb3JlVGV4dCA9IC9eKC4qPyk9PS9zLmV4ZWModGhpcy5wYWdlQ29udGVudCkhWzFdO1xuXG4gICAgICAgIHRoaXMucGFnZUNvbnRlbnQgPSB0aGlzLnBhZ2VDb250ZW50LnJlcGxhY2UoL14uKj89PS9zLCAnPT0nKTtcblxuICAgICAgICBjb25zdCBzZWN0aW9ucyA9IFsuLi50aGlzLnBhZ2VDb250ZW50Lm1hdGNoQWxsKC9ePT0uKj89PSQoXFxzKig/IT09W149XSkuKikqL2dpbSldLm1hcCgobWF0Y2gpID0+IG1hdGNoWzBdKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHNlY3Rpb25UZXh0IG9mIHNlY3Rpb25zKSB7XG4gICAgICAgICAgICBjb25zdCBpc0Nsb3NlZCA9IC97e2FmYy1jXFx8L2kudGVzdChzZWN0aW9uVGV4dCk7XG4gICAgICAgICAgICBpZiAoaXNDbG9zZWQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBzZWN0aW9uSGVhZGVyID0gL149PSguKj8pPT0kL20uZXhlYyhzZWN0aW9uVGV4dCkhWzFdLnRyaW0oKTtcblxuICAgICAgICAgICAgdGhpcy5wYXJzZVN1YnR5cGVSZXF1ZXN0cyhzZWN0aW9uVGV4dCwgc2VjdGlvbkhlYWRlcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgaW5wdXQgZWxlbWVudHMgaW4gdGhlIGRpYWxvZy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICBpZiAodGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXggPSAwO1xuXG4gICAgICAgICAgICBjb25zdCBoYW5kbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmF0Y2hTaXplID0gNTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IE1hdGgubWluKGluZGV4ICsgYmF0Y2hTaXplLCB0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7IHRpdGxlOiBPTy51aS5MYWJlbFdpZGdldCB9KS50aXRsZS5zZXRMYWJlbChcbiAgICAgICAgICAgICAgICAgICAgYGFmY3JjLWhlbHBlciAobG9hZGluZyAke2luZGV4ICsgMX0tJHtlbmRJbmRleH0vJHt0aGlzLnBhcnNlZFJlcXVlc3RzLmxlbmd0aH0gcmVxdWVzdHMpYCxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3ViSW5kZXggPSBpbmRleDsgc3ViSW5kZXggPCBlbmRJbmRleDsgc3ViSW5kZXgrKykgdGhpcy5sb2FkU3VidHlwZUVsZW1lbnRzKHN1YkluZGV4KTtcblxuICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCA8IHRoaXMucGFyc2VkUmVxdWVzdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4ID0gZW5kSW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoaGFuZGxlLCAwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7IHRpdGxlOiBPTy51aS5MYWJlbFdpZGdldCB9KS50aXRsZS5zZXRMYWJlbChcbiAgICAgICAgICAgICAgICAgICAgICAgIGBhZmNyYy1oZWxwZXIgKCR7dGhpcy5wYXJzZWRSZXF1ZXN0cy5sZW5ndGh9IHJlcXVlc3RzIGxvYWRlZClgLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaGFuZGxlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlV2lkZ2V0ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlOiAnbm90aWNlJywgbGFiZWw6ICdObyB2YWxpZCByZXF1ZXN0cyB0byBoYW5kbGUhJyB9KTtcblxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZVdpZGdldExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgbWVzc2FnZVdpZGdldExheW91dC4kZWxlbWVudC5hcHBlbmQobWVzc2FnZVdpZGdldC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChtZXNzYWdlV2lkZ2V0TGF5b3V0LiRlbGVtZW50KTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhbGwgYWN0aW9ucyBhbmQgbG9ncyB0aGVpciByZXN1bHRzLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgcGVyZm9ybUFjdGlvbnMoKSB7XG4gICAgICAgIGNvbnN0IHdpbmRvd01hbmFnZXIgPSBuZXcgT08udWkuV2luZG93TWFuYWdlcigpO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICBjb25zdCBzaG93QWN0aW9uc0RpYWxvZyA9IG5ldyBBY3Rpb25zRGlhbG9nKCk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbc2hvd0FjdGlvbnNEaWFsb2ddKTtcbiAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cub3BlbigpO1xuXG4gICAgICAgIGNvbnN0IGNvdW50cyA9IHsgJ2FjY2VwdGVkJzogMCwgJ2RlbmllZCc6IDAsICdjb21tZW50ZWQgb24nOiAwLCAnY2xvc2VkJzogMCB9OyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXG4gICAgICAgIGNvbnN0IG5ld1BhZ2VUZXh0ID0gKFxuICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICApLnF1ZXJ5IS5wYWdlc1swXS5yZXZpc2lvbnNbMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcblxuICAgICAgICB2b2lkIHRoaXMucGVyZm9ybVN1YnR5cGVBY3Rpb25zKHNob3dBY3Rpb25zRGlhbG9nLCBjb3VudHMsIG5ld1BhZ2VUZXh0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JtYXRzIGEgcmVxdWVzdCBkZW5pYWwgcmVhc29uIHRvIGEge3tzdWJzdDpBZkMgcmVkaXJlY3QvY2F0ZWdvcnl9fSBjYWxsLlxuICAgICAqIEBwYXJhbSByZWFzb24gVGhlIHJlYXNvbiB0byBmb3JtYXQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGZvcm1hdERlbmllZFJlYXNvbihyZWFzb246IHN0cmluZykge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZVBhcmFtZXRlcnMgPSByZWFzb24uc3RhcnRzV2l0aCgnYXV0b2ZpbGw6JykgPyAvYXV0b2ZpbGw6KFxcdyspLy5leGVjKHJlYXNvbikhWzFdIDogYGRlY2xpbmV8Mj0ke3JlYXNvbn1gO1xuXG4gICAgICAgIGNvbnN0IGFkZGl0aW9uYWxSZWFzb25pbmcgPVxuICAgICAgICAgICAgcmVhc29uLnN0YXJ0c1dpdGgoJ2F1dG9maWxsOicpICYmIHJlYXNvbi5pbmNsdWRlcygnLCcpID8gJyAnICsgcmVhc29uLnNsaWNlKHJlYXNvbi5pbmRleE9mKCcsJykgKyAxKS50cmltKCkgOiAnJztcblxuICAgICAgICByZXR1cm4gYHt7c3Vic3Q6QWZDICR7dGhpcy5yZXF1ZXN0UGFnZVR5cGV9fCR7dGVtcGxhdGVQYXJhbWV0ZXJzfX19JHthZGRpdGlvbmFsUmVhc29uaW5nfWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWFwcyBhIGdyb3VwIG9mIGRlbmllZCByZWFzb25zLlxuICAgICAqIEBwYXJhbSBkZW5pZWRQYWdlcyBUaGUgcGFnZXMgdG8gbWFwLlxuICAgICAqIEBwYXJhbSBzaW5ndWxhclJlcXVlc3QgV2hldGhlciB0aGUgcmVxdWVzdCBpcyB0aGUgb25seSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBhbGxSZXF1ZXN0cyBXaGV0aGVyIGFsbCByZXF1ZXN0cyBhcmUgYmVpbmcgbWFwcGVkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBtYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzaW5ndWxhclJlcXVlc3QpIHJldHVybiBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKGRlbmllZFBhZ2VzWzBdWzFdKX0gfn5+fmA7XG5cbiAgICAgICAgY29uc3QgcmVhc29uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG5cbiAgICAgICAgZm9yIChjb25zdCBbcGFnZSwgcmVhc29uXSBvZiBkZW5pZWRQYWdlcykge1xuICAgICAgICAgICAgaWYgKCEocmVhc29uIGluIHJlYXNvbnMpKSByZWFzb25zW3JlYXNvbl0gPSBbXTtcbiAgICAgICAgICAgIHJlYXNvbnNbcmVhc29uXS5wdXNoKHBhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVhc29uc0FycmF5ID0gT2JqZWN0LmVudHJpZXMocmVhc29ucyk7XG5cbiAgICAgICAgcmV0dXJuIHJlYXNvbnNBcnJheVxuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoW3JlYXNvbiwgcGFnZXNdKSA9PlxuICAgICAgICAgICAgICAgICAgICBgKiAke3RoaXMuZm9ybWF0RGVuaWVkUmVhc29uKHJlYXNvbil9JHtyZWFzb25zQXJyYXkubGVuZ3RoID4gMSB8fCAhYWxsUmVxdWVzdHMgPyBgICgke3BhZ2VzLm1hcCgocGFnZSkgPT4gYFtbJHtwYWdlfV1dYCkuam9pbignLCAnKX0pYCA6ICcnfSB+fn5+YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYXBzIGEgZ3JvdXAgb2YgY29tbWVudHMuXG4gICAgICogQHBhcmFtIGNvbW1lbnRzIFRoZSBjb21tZW50cyB0byBtYXAuXG4gICAgICogQHBhcmFtIHNpbmd1bGFyUmVxdWVzdCBXaGV0aGVyIHRoZSByZXF1ZXN0IGlzIHRoZSBvbmx5IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIGFsbFJlcXVlc3RzIFdoZXRoZXIgYWxsIHJlcXVlc3RzIGFyZSBiZWluZyBtYXBwZWQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1hcENvbW1lbnRzKGNvbW1lbnRzOiBzdHJpbmdbXVtdLCBzaW5ndWxhclJlcXVlc3Q6IGJvb2xlYW4sIGFsbFJlcXVlc3RzOiBib29sZWFuKSB7XG4gICAgICAgIGlmIChzaW5ndWxhclJlcXVlc3QpIHJldHVybiBgKiB7e0FmQyBjb21tZW50fDE9JHtjb21tZW50c1swXVsxXX19fSB+fn5+YDtcblxuICAgICAgICBjb25zdCBjb21tZW50TWVzc2FnZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuXG4gICAgICAgIGZvciAoY29uc3QgW3BhZ2UsIGNvbW1lbnRdIG9mIGNvbW1lbnRzKSB7XG4gICAgICAgICAgICBpZiAoIShjb21tZW50IGluIGNvbW1lbnRNZXNzYWdlcykpIGNvbW1lbnRNZXNzYWdlc1tjb21tZW50XSA9IFtdO1xuICAgICAgICAgICAgY29tbWVudE1lc3NhZ2VzW2NvbW1lbnRdLnB1c2gocGFnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb21tZW50c0FycmF5ID0gT2JqZWN0LmVudHJpZXMoY29tbWVudE1lc3NhZ2VzKTtcblxuICAgICAgICByZXR1cm4gY29tbWVudHNBcnJheVxuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoW2NvbW1lbnQsIHBhZ2VzXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgYCoge3tBZkMgY29tbWVudHwxPSR7Y29tbWVudH19fSR7Y29tbWVudHNBcnJheS5sZW5ndGggPiAxIHx8ICFhbGxSZXF1ZXN0cyA/IGAgKCR7cGFnZXMubWFwKChwYWdlKSA9PiBgW1ske3BhZ2V9XV1gKS5qb2luKCcsICcpfSlgIDogJyd9IH5+fn5gLFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vZGlmaWVzIGEgZ2l2ZW4gc2VjdGlvbiB0ZXh0IHdpdGggcHJlcGVuZGVkIGFuZCBhcHBlbmRlZCB0ZXh0LlxuICAgICAqIEBwYXJhbSBzZWN0aW9uRGF0YSBUaGUgc2VjdGlvbiBkYXRhLlxuICAgICAqIEBwYXJhbSBjaGFuZ2VzIFRoZSBwcmVwZW5kaW5nIGFuZCBhcHBlbmRpbmcgdGV4dC5cbiAgICAgKiBAcGFyYW0gY2hhbmdlcy5wcmVwZW5kIFRoZSB0ZXh0IHRvIHByZXBlbmQgdG8gdGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gY2hhbmdlcy5hcHBlbmQgVGhlIHRleHQgdG8gYXBwZW5kIHRvIHRoZSBzZWN0aW9uIHRleHQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG1vZGlmeVNlY3Rpb25EYXRhKFxuICAgICAgICBzZWN0aW9uRGF0YTogeyBwYWdlVGV4dDogc3RyaW5nIH0gJiBSZXF1ZXN0QWN0aW9uWydvcmlnaW5hbFRleHQnXSxcbiAgICAgICAgeyBwcmVwZW5kLCBhcHBlbmQgfTogeyBwcmVwZW5kPzogc3RyaW5nOyBhcHBlbmQ/OiBzdHJpbmcgfSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgeyBmdWxsU2VjdGlvblRleHQ6IG9sZEZ1bGxTZWN0aW9uVGV4dCwgc2VjdGlvblRleHQ6IG9sZFNlY3Rpb25UZXh0IH0gPSBzZWN0aW9uRGF0YTtcblxuICAgICAgICBpZiAocHJlcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgPSBwcmVwZW5kICsgJ1xcbicgKyBzZWN0aW9uRGF0YS5zZWN0aW9uVGV4dDtcbiAgICAgICAgaWYgKGFwcGVuZCkgc2VjdGlvbkRhdGEuc2VjdGlvblRleHQgKz0gJ1xcbicgKyBhcHBlbmQ7XG5cbiAgICAgICAgc2VjdGlvbkRhdGEuZnVsbFNlY3Rpb25UZXh0ID0gc2VjdGlvbkRhdGEuZnVsbFNlY3Rpb25UZXh0LnJlcGxhY2Uob2xkU2VjdGlvblRleHQsIHNlY3Rpb25EYXRhLnNlY3Rpb25UZXh0KTtcblxuICAgICAgICBzZWN0aW9uRGF0YS5wYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0LnJlcGxhY2Uob2xkRnVsbFNlY3Rpb25UZXh0LCBzZWN0aW9uRGF0YS5mdWxsU2VjdGlvblRleHQpO1xuXG4gICAgICAgIHJldHVybiBzZWN0aW9uRGF0YTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNYWtlcyBhbGwgZWRpdHMgYW5kIGNyZWF0aW9ucyB0aGF0IG5lZWQgdG8gYmUgbWFkZS5cbiAgICAgKiBAcGFyYW0gc2hvd0FjdGlvbnNEaWFsb2cgVGhlIGRpYWxvZyB0byBsb2cgdGhlIHJlc3VsdHMgdG8uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIG1ha2VBbGxFZGl0c0NyZWF0aW9ucyhzaG93QWN0aW9uc0RpYWxvZzogQWN0aW9uc0RpYWxvZykge1xuICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgYWN0aW9uXSBvZiB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgY29uc3QgYXBpRnVuY3Rpb24gPVxuICAgICAgICAgICAgICAgIGFjdGlvbi50eXBlID09PSAnZWRpdCdcbiAgICAgICAgICAgICAgICAgICAgPyAoKSA9PiB0aGlzLmFwaS5lZGl0KGFjdGlvbi50aXRsZSwgYWN0aW9uLnRyYW5zZm9ybSlcbiAgICAgICAgICAgICAgICAgICAgOiAoKSA9PiB0aGlzLmFwaS5jcmVhdGUoYWN0aW9uLnRpdGxlLCB7IHN1bW1hcnk6IGFjdGlvbi5zdW1tYXJ5LCB3YXRjaGxpc3Q6IHRoaXMuY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCB9LCBhY3Rpb24udGV4dCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwoYWN0aW9uLnRpdGxlLCAnaXNSZWRpcmVjdCcgaW4gYWN0aW9uICYmIGFjdGlvbi5pc1JlZGlyZWN0ID8geyByZWRpcmVjdDogJ25vJyB9IDogdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGxpbmtFbGVtZW50LnRleHRDb250ZW50ID0gYWN0aW9uLnRpdGxlO1xuXG4gICAgICAgICAgICBjb25zdCBhY3Rpb25SZXN1bHRFbGVtZW50SWQgPSBgYWZjcmMtaGVscGVyLWFjdGlvbi1yZXN1bHQtJHtpbmRleH1gO1xuXG4gICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICBgJHthY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gJ0VkaXRpbmcnIDogJ0NyZWF0aW5nJ30gJHtsaW5rRWxlbWVudC5vdXRlckhUTUx9Li4uIDxzcGFuIGlkPVwiJHthY3Rpb25SZXN1bHRFbGVtZW50SWR9XCI+PC9zcGFuPmAsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgYXdhaXQgYXBpRnVuY3Rpb24oKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5yZXN1bHQgPT09ICdTdWNjZXNzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmtFbGVtZW50OiBIVE1MQW5jaG9yRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKCdub2NoYW5nZScgaW4gcmVzdWx0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFNwZWNpYWw6RGlmZi8ke3Jlc3VsdC5vbGRyZXZpZCA/IGAke3Jlc3VsdC5vbGRyZXZpZH0vYCA6ICcnfSR7cmVzdWx0Lm5ld3JldmlkfWAsIC8vIG9sZHJldmlkIGlzIDAgb24gcGFnZSBjcmVhdGlvbnMsIGFuZCBpcyB0aHVzIHVubmVlZGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50ZXh0Q29udGVudCA9ICdkaWZmJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uUmVzdWx0RWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCMke2FjdGlvblJlc3VsdEVsZW1lbnRJZH1gKSE7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5rRWxlbWVudCkgYWN0aW9uUmVzdWx0RWxlbWVudC5hcHBlbmQoJyhkb25lLCBzZWUgJywgbGlua0VsZW1lbnQsICcpJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGFjdGlvblJlc3VsdEVsZW1lbnQudGV4dENvbnRlbnQgPSAnKGRvbmUsIG5vIGNoYW5nZXMpJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGFzeW5jIChlcnJvckNvZGUsIGVycm9ySW5mbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JDb2RlID09PSAncmF0ZWxpbWl0ZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgUmF0ZSBsaW1pdGVkLiBXYWl0aW5nIGZvciA3MCBzZWNvbmRzLi4uIChyZXN1bWluZyBhdCAke25ldyBEYXRlKERhdGUubm93KCkgKyA3MF8wMDApLnRvTG9jYWxlVGltZVN0cmluZygpfSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA3MF8wMDApKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ0NvbnRpbnVpbmcuLi4nLCAnc3VjY2VzcycpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcGlGdW5jdGlvbigpLmNhdGNoKChlcnJvckNvZGUsIGVycm9ySW5mbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgJHthY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gJ2VkaXRpbmcnIDogJ2NyZWF0aW5nJ30gJHtsaW5rRWxlbWVudC5vdXRlckhUTUx9OiAkeyhlcnJvckluZm8gYXMgTWVkaWFXaWtpRGF0YUVycm9yKT8uZXJyb3I/LmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KS5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgJHthY3Rpb24udHlwZSA9PT0gJ2VkaXQnID8gJ2VkaXRpbmcnIDogJ2NyZWF0aW5nJ30gJHtsaW5rRWxlbWVudC5vdXRlckhUTUx9OiAkeyhlcnJvckluZm8gYXMgTWVkaWFXaWtpRGF0YUVycm9yKT8uZXJyb3I/LmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGUgYXMgc3RyaW5nfSkuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgcGFyc2VTdWJ0eXBlUmVxdWVzdHMoc2VjdGlvblRleHQ6IHN0cmluZywgc2VjdGlvbkhlYWRlcjogc3RyaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgbG9hZFN1YnR5cGVFbGVtZW50cyhpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBwcm90ZWN0ZWQgdXBkYXRlUmVxdWVzdENvbG9yKGRldGFpbHNFbGVtZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQsIGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgaW1wbGVtZW50ZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycywgQHR5cGVzY3JpcHQtZXNsaW50L3JlcXVpcmUtYXdhaXRcbiAgICBwcm90ZWN0ZWQgYXN5bmMgcGVyZm9ybVN1YnR5cGVBY3Rpb25zKGRpYWxvZzogQWN0aW9uc0RpYWxvZywgY291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+LCBuZXdQYWdlVGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGltcGxlbWVudGVkLicpO1xuICAgIH1cbn1cblxuT2JqZWN0LmFzc2lnbihIZWxwZXJEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUgeyBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvIH0gZnJvbSAnLi4vcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LWhlbHBlci1kaWFsb2cnO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0QWN0aW9uVHlwZSB9IGZyb20gJy4vaGVscGVyLWRpYWxvZyc7XG5pbXBvcnQgdHlwZSBSZWRpcmVjdHNEaWFsb2cgZnJvbSAnLi9yZWRpcmVjdHMtZGlhbG9nJztcbmltcG9ydCB0eXBlIHsgUmVkaXJlY3RBY3Rpb24gfSBmcm9tICcuL3JlZGlyZWN0cy1kaWFsb2cnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWRpcmVjdFJlcXVlc3RIYW5kbGVyIHtcbiAgICBwcml2YXRlIHRpdGxlSW5kZXg6IG51bWJlcjtcbiAgICBwcml2YXRlIHRpdGxlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBkZXRhaWxzRWxlbWVudDogSFRNTERldGFpbHNFbGVtZW50O1xuICAgIHByaXZhdGUgcmVzcG9uZGVyRWxlbWVudDogSFRNTERpdkVsZW1lbnQ7XG4gICAgcHJpdmF0ZSBkaWFsb2c6IFJlZGlyZWN0c0RpYWxvZztcblxuICAgIHByaXZhdGUgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yPzogSFRNTERldGFpbHNFbGVtZW50O1xuXG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZUVkaXRvcnNJbmZvOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvW10gPSBbXTtcblxuICAgIHByaXZhdGUgY29tbWVudElucHV0ITogT08udWkuVGV4dElucHV0V2lkZ2V0O1xuXG4gICAgcHJpdmF0ZSB0YWdTZWxlY3RMYXlvdXQ/OiBPTy51aS5GaWVsZExheW91dDtcbiAgICBwcml2YXRlIGRlbnlSZWFzb25MYXlvdXQ/OiBPTy51aS5GaWVsZExheW91dDtcbiAgICBwcml2YXRlIGNsb3NpbmdSZWFzb25MYXlvdXQ/OiBPTy51aS5GaWVsZExheW91dDtcbiAgICBwcml2YXRlIGNvbW1lbnRMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICB0aXRsZUluZGV4OiBudW1iZXIsXG4gICAgICAgIHRpdGxlOiBzdHJpbmcsXG4gICAgICAgIGRldGFpbHNFbGVtZW50OiBIVE1MRGV0YWlsc0VsZW1lbnQsXG4gICAgICAgIHJlc3BvbmRlckVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50LFxuICAgICAgICBkaWFsb2c6IFJlZGlyZWN0c0RpYWxvZyxcbiAgICApIHtcbiAgICAgICAgdGhpcy50aXRsZUluZGV4ID0gdGl0bGVJbmRleDtcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgICAgICB0aGlzLmRldGFpbHNFbGVtZW50ID0gZGV0YWlsc0VsZW1lbnQ7XG4gICAgICAgIHRoaXMucmVzcG9uZGVyRWxlbWVudCA9IHJlc3BvbmRlckVsZW1lbnQ7XG4gICAgICAgIHRoaXMuZGlhbG9nID0gZGlhbG9nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdXAgdGhlIHJlcXVlc3QgaGFuZGxlciwgbG9hZGluZyBlbGVtZW50cyBpbnRvIHRoZSBET00uXG4gICAgICovXG4gICAgcHVibGljIHNldFVwKCkge1xuICAgICAgICBjb25zdCByZXF1ZXN0ZWRUaXRsZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICBsYWJlbC50ZXh0Q29udGVudCA9IHRoaXMudGl0bGU7XG4gICAgICAgIHJlcXVlc3RlZFRpdGxlRGl2LmFwcGVuZChsYWJlbCk7XG5cbiAgICAgICAgY29uc3QgYWN0aW9uUmFkaW9JbnB1dCA9IG5ldyBPTy51aS5SYWRpb1NlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ2FmY3JjLWhlbHBlci1hY3Rpb24tcmFkaW8nXSxcbiAgICAgICAgICAgIGl0ZW1zOiBbJ0FjY2VwdCcsICdEZW55JywgJ0NvbW1lbnQnLCAnQ2xvc2UnLCAnTm9uZSddLm1hcCgobGFiZWwpID0+IG5ldyBPTy51aS5SYWRpb09wdGlvbldpZGdldCh7IGRhdGE6IGxhYmVsLCBsYWJlbCB9KSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGFjdGlvblJhZGlvSW5wdXQuc2VsZWN0SXRlbUJ5TGFiZWwoJ05vbmUnKTtcblxuICAgICAgICBhY3Rpb25SYWRpb0lucHV0Lm9uKCdjaG9vc2UnLCAoc2VsZWN0ZWQpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQWN0aW9uQ2hhbmdlKHNlbGVjdGVkKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sb2FkQ29tbWVudExheW91dCgpO1xuXG4gICAgICAgIHJlcXVlc3RlZFRpdGxlRGl2LmFwcGVuZChhY3Rpb25SYWRpb0lucHV0LiRlbGVtZW50WzBdLCB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIHRoaXMucmVzcG9uZGVyRWxlbWVudC5hcHBlbmQocmVxdWVzdGVkVGl0bGVEaXYpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXIgZm9yIHNlbGVjdGVkIGFjdGlvbiBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBzZWxlY3RlZCBUaGUgbmV3IHNlbGVjdGVkIG9wdGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGhhbmRsZUFjdGlvbkNoYW5nZShzZWxlY3RlZDogT08udWkuT3B0aW9uV2lkZ2V0KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5kaWFsb2cudXBkYXRlU2l6ZSgpLCAwKTtcblxuICAgICAgICBjb25zdCBvcHRpb24gPSAoc2VsZWN0ZWQuZ2V0RGF0YSgpIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKSBhcyBSZXF1ZXN0QWN0aW9uVHlwZTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBhY3Rpb246IG9wdGlvbiB9KTtcblxuICAgICAgICB0aGlzLmRpYWxvZy51cGRhdGVSZXF1ZXN0Q29sb3IodGhpcy5kZXRhaWxzRWxlbWVudCwgdGhpcy50aXRsZUluZGV4KTtcblxuICAgICAgICBpZiAodGhpcy50YWdTZWxlY3RMYXlvdXQpIHRoaXMudGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgaWYgKHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yKSB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgIGlmICh0aGlzLmRlbnlSZWFzb25MYXlvdXQpIHRoaXMuZGVueVJlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgICAgIGlmICh0aGlzLmNsb3NpbmdSZWFzb25MYXlvdXQpIHRoaXMuY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgc3dpdGNoIChvcHRpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ2FjY2VwdCc6IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMudGFnU2VsZWN0TGF5b3V0IHx8ICF0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcikgdGhpcy5sb2FkVGFnU2VsZWN0QW5kUGFyYW1ldGVyc0VkaXRvcigpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQhLiRlbGVtZW50LnNob3coKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciEuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlbnlSZWFzb25MYXlvdXQpIHRoaXMubG9hZERlbnlSZWFzb25MYXlvdXQoKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGVueVJlYXNvbkxheW91dCEuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY2xvc2luZ1JlYXNvbkxheW91dCkgdGhpcy5sb2FkQ2xvc2luZ1JlYXNvbkxheW91dCgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0IS4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChbJ2FjY2VwdCcsICdjb21tZW50JywgJ2Nsb3NlJ10uaW5jbHVkZXMob3B0aW9uKSkge1xuICAgICAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50LnNob3coKTtcblxuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoY29tbWVudCkgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgY29tbWVudCB9KTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgY29tbWVudDogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb21tZW50TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgY29tbWVudDogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIHRhZyBzZWxlY3QgYW5kIHRlbXBsYXRlIHBhcmFtZXRlcnMgZWRpdG9ycy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRUYWdTZWxlY3RBbmRQYXJhbWV0ZXJzRWRpdG9yKCkge1xuICAgICAgICBjb25zdCB0YWdTZWxlY3QgPSBuZXcgT08udWkuTWVudVRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGFsbG93QXJiaXRyYXJ5OiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBvcHRpb25zOiBPYmplY3QuZW50cmllcyh0aGlzLmRpYWxvZy5yZWRpcmVjdFRlbXBsYXRlcykubWFwKChbdGFnLCB7IHJlZGlyZWN0IH1dKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFyZWRpcmVjdCkgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbDogdGFnIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChgPHNwYW4gY2xhc3M9XCJhZmNyYy1oZWxwZXItcmVkaXJlY3QtcG9zc2liaWxpdGllc1wiPiR7dGFnfTwvc3Bhbj5gKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWwgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgKHRhZ1NlbGVjdC5nZXRNZW51KCkgYXMgT08udWkuTWVudVNlbGVjdFdpZGdldC5Db25maWdPcHRpb25zKS5maWx0ZXJNb2RlID0gJ3N1YnN0cmluZyc7XG4gICAgICAgIHRhZ1NlbGVjdC5vbignY2hhbmdlJywgKHNlbGVjdGVkRWxlbWVudHMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkVGFncyA9IHNlbGVjdGVkRWxlbWVudHMubWFwKChlbGVtZW50KSA9PiBlbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpO1xuXG4gICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gc2VsZWN0ZWRUYWdzLnRvU29ydGVkKChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkVGFncy5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLmF0KC0xKSBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkRyYWdnYWJsZUVsZW1lbnQgJiBPTy51aS5FbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgdGFnU2VsZWN0LnJlb3JkZXIobGFzdEVsZW1lbnQsIHNvcnRlZFRhZ3MuaW5kZXhPZihsYXN0RWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlQWN0aW9uc1RvVGFrZSh7IHJlZGlyZWN0VGVtcGxhdGVzOiBzb3J0ZWRUYWdzIH0pO1xuXG4gICAgICAgICAgICBsZXQgc2hvd25UZW1wbGF0ZUVkaXRvcnMgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCBlZGl0b3JJbmZvIG9mIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mbykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzVGFnU2VsZWN0ZWQgPSBzb3J0ZWRUYWdzLmluY2x1ZGVzKGVkaXRvckluZm8ubmFtZSk7XG5cbiAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9IGlzVGFnU2VsZWN0ZWQgPyAnYmxvY2snIDogJ25vbmUnO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVGFnU2VsZWN0ZWQpIHNob3duVGVtcGxhdGVFZGl0b3JzKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gYFRlbXBsYXRlIHBhcmFtZXRlcnMgKCR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gYGZvciAke3Nob3duVGVtcGxhdGVFZGl0b3JzfSB0ZW1wbGF0ZSR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAxID8gJ3MnIDogJyd9YCA6ICdub25lIHRvIHNob3cnfSlgO1xuXG4gICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2Uuc3R5bGUuZGlzcGxheSA9IHNob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/ICdub25lJyA6ICdibG9jayc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudGFnU2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRhZ1NlbGVjdCwge1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1oZWxwZXItdGFnLXNlbGVjdC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnUmVkaXJlY3QgdGVtcGxhdGVzOicsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRoaXMudGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gJ1RlbXBsYXRlIHBhcmFtZXRlcnMgKG5vbmUgdG8gc2hvdyknO1xuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW3RlbXBsYXRlTmFtZSwgdGVtcGxhdGVEYXRhXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmRpYWxvZy5yZWRpcmVjdFRlbXBsYXRlcykpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh0ZW1wbGF0ZURhdGEucGFyYW1ldGVycyk7XG4gICAgICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICBjb25zdCBzdW1tYXJ5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgc3VtbWFyeS50ZXh0Q29udGVudCA9IHRlbXBsYXRlTmFtZTtcbiAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKHN1bW1hcnkpO1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50RGF0YTogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyA9IHsgbmFtZTogdGVtcGxhdGVOYW1lLCBkZXRhaWxzLCBwYXJhbWV0ZXJzOiBbXSB9O1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHBhcmFtZXRlckRhdGEuZGVmYXVsdD8udG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IHBhcmFtZXRlckRhdGEucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChpbnB1dCwge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGFyYW1ldGVyTmFtZX0keyFwYXJhbWV0ZXJEYXRhLmxhYmVsIHx8IHBhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFyYW1ldGVyRGF0YS5sYWJlbC50b0xvd2VyQ2FzZSgpID8gJycgOiBgICgke3BhcmFtZXRlckRhdGEubGFiZWx9KWB9JHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9uID8gYCAoJHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9ufSlgIDogJyd9ICh0eXBlOiAke3BhcmFtZXRlckRhdGEudHlwZX0pICR7cGFyYW1ldGVyRGF0YS5zdWdnZXN0ZWQgPyAnIChzdWdnZXN0ZWQpJyA6ICcnfSR7cGFyYW1ldGVyRGF0YS5leGFtcGxlID8gYCAoZXhhbXBsZTogXCIke3BhcmFtZXRlckRhdGEuZXhhbXBsZX1cIilgIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKGlucHV0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnBhcmFtZXRlcnMucHVzaCh7IG5hbWU6IHBhcmFtZXRlck5hbWUsIGFsaWFzZXM6IHBhcmFtZXRlckRhdGEuYWxpYXNlcywgZWRpdG9yOiBpbnB1dCB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKGRldGFpbHMpO1xuXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8ucHVzaChlbGVtZW50RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyByZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVyczogdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvIH0pO1xuXG4gICAgICAgIGNvbnN0IG5vVGVtcGxhdGVzTWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UuaWQgPSAnYWZjcmMtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlJztcbiAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnRleHRDb250ZW50ID0gJ05vIHRlbXBsYXRlcyB3aXRoIHBhcmFtZXRlcnMgdG8gZGlzcGxheSEnO1xuXG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChub1RlbXBsYXRlc01lc3NhZ2UpO1xuXG4gICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudFswXS5iZWZvcmUodGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSBkZW55IHJlYXNvbiBsYXlvdXQuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkRGVueVJlYXNvbkxheW91dCgpIHtcbiAgICAgICAgY29uc3QgZGVueVJlYXNvbklucHV0ID0gbmV3IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdhdXRvZmlsbDp1bmxpa2VseScsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgWydleGlzdHMnLCAnZXhpc3RpbmcgcGFnZXMnXSxcbiAgICAgICAgICAgICAgICBbJ2VtcHR5JywgJ2VtcHR5IHN1Ym1pc3Npb25zJ10sXG4gICAgICAgICAgICAgICAgWydub3RhcmdldCcsICdub25leGlzdGVudCBvciBubyBwcm92aWRlZCB0YXJnZXQnXSxcbiAgICAgICAgICAgICAgICBbJ25vdGl0bGUnLCAnbm8gdGl0bGUgcHJvdmlkZWQnXSxcbiAgICAgICAgICAgICAgICBbJ3VubGlrZWx5JywgJ3VubGlrZWx5IHJlZGlyZWN0cyddLFxuICAgICAgICAgICAgICAgIFsndW5yZWxhdGVkJywgJ2FwcGFyZW50bHkgdW5yZWxhdGVkIHRpdGxlcyddLFxuICAgICAgICAgICAgICAgIFsnbm90cmVkaXJlY3QnLCAnYXJ0aWNsZSBjcmVhdGlvbiByZXF1ZXN0cyddLFxuICAgICAgICAgICAgICAgIFsnZXh0ZXJuYWxsaW5rJywgJ2V4dGVybmFsIGxpbmsgcmVkaXJlY3RzJ10sXG4gICAgICAgICAgICAgICAgWydlZGl0cmVxdWVzdCcsICdlZGl0IHJlcXVlc3RzJ10sXG4gICAgICAgICAgICAgICAgWydub3RlbmdsaXNoJywgJ3JlcXVlc3RzIG5vdCBpbiBFbmdsaXNoJ10sXG4gICAgICAgICAgICBdLm1hcCgoW3ZhbHVlLCBsYWJlbF0pID0+ICh7IGRhdGE6IGBhdXRvZmlsbDoke3ZhbHVlfWAsIGxhYmVsOiBgQXV0b2ZpbGxlZCB0ZXh0IGZvciAke2xhYmVsfWAgfSkpLFxuICAgICAgICB9KTtcblxuICAgICAgICBkZW55UmVhc29uSW5wdXQub24oJ2NoYW5nZScsICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBY3Rpb25zVG9UYWtlKHsgZGVueVJlYXNvbjogdmFsdWUgfHwgJ2F1dG9maWxsOnVubGlrZWx5JyB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZGVueVJlYXNvbklucHV0LnNldFZhbHVlKCdhdXRvZmlsbDp1bmxpa2VseScpO1xuICAgICAgICBkZW55UmVhc29uSW5wdXQuZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG5cbiAgICAgICAgdGhpcy5kZW55UmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGRlbnlSZWFzb25JbnB1dCwge1xuICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgbGFiZWw6ICdEZW55IHJlYXNvbjonLFxuICAgICAgICAgICAgaGVscDogJ1N1cHBvcnRzIGF1dG9tYXRpYyByZWFzb25pbmcsIGN1c3RvbSByZWFzb25pbmcsIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIHR3byB3aXRoIFwiYXV0b2ZpbGw6UkVBU09OLCBDVVNUT01cIiBmb3JtYXQnLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRoaXMuZGVueVJlYXNvbkxheW91dC4kZWxlbWVudFswXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGNsb3NpbmcgcmVhc29uIGxheW91dC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGxvYWRDbG9zaW5nUmVhc29uTGF5b3V0KCkge1xuICAgICAgICBjb25zdCBjbG9zaW5nUmVhc29uRHJvcGRvd24gPSBuZXcgT08udWkuRHJvcGRvd25XaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgbWVudToge1xuICAgICAgICAgICAgICAgIGl0ZW1zOiBbXG4gICAgICAgICAgICAgICAgICAgIFsnTm8gcmVzcG9uc2UnLCAnciddLFxuICAgICAgICAgICAgICAgICAgICBbJ1N1Y2NlZWRlZCcsICdzJ10sXG4gICAgICAgICAgICAgICAgICAgIFsnV2l0aGRyYXduJywgJ3cnXSxcbiAgICAgICAgICAgICAgICBdLm1hcCgoW3RpdGxlLCBpZF0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YTogaWQsIGxhYmVsOiB0aXRsZSB9KSksXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgY2xvc2luZ1JlYXNvbkRyb3Bkb3duLmdldE1lbnUoKS5zZWxlY3RJdGVtQnlEYXRhKCdyJyk7XG5cbiAgICAgICAgY2xvc2luZ1JlYXNvbkRyb3Bkb3duLmdldE1lbnUoKS5vbignY2hvb3NlJywgKHNlbGVjdGVkKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjbG9zaW5nUmVhc29uOiB7IG5hbWU6IHNlbGVjdGVkLmdldExhYmVsKCkgYXMgc3RyaW5nLCBpZDogc2VsZWN0ZWQuZ2V0RGF0YSgpIGFzIHN0cmluZyB9IH0pO1xuXG4gICAgICAgICAgICB0aGlzLmRpYWxvZy51cGRhdGVSZXF1ZXN0Q29sb3IodGhpcy5kZXRhaWxzRWxlbWVudCwgdGhpcy50aXRsZUluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNsb3NpbmdSZWFzb25Ecm9wZG93biwgeyBhbGlnbjogJ2lubGluZScsIGxhYmVsOiAnQ2xvc2luZyByZWFzb246JyB9KTtcbiAgICAgICAgdGhpcy5jbG9zaW5nUmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICB0aGlzLmNvbW1lbnRMYXlvdXQuJGVsZW1lbnRbMF0uYmVmb3JlKHRoaXMuY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudFswXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGNvbW1lbnQgbGF5b3V0LlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZENvbW1lbnRMYXlvdXQoKSB7XG4gICAgICAgIHRoaXMuY29tbWVudElucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCgpO1xuXG4gICAgICAgIHRoaXMuY29tbWVudElucHV0Lm9uKCdjaGFuZ2UnLCAodmFsdWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50KSB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjb21tZW50IH0pO1xuICAgICAgICAgICAgZWxzZSB0aGlzLnVwZGF0ZUFjdGlvbnNUb1Rha2UoeyBjb21tZW50OiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuY29tbWVudExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmNvbW1lbnRJbnB1dCwge1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jb21tZW50LWlucHV0J10sXG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0NvbW1lbnQ6JyxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY29tbWVudExheW91dC4kZWxlbWVudC5oaWRlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBhIHJlcXVlc3QncyBhY3Rpb25zIGRhdGEuXG4gICAgICogQHBhcmFtIHVwZGF0ZSBUaGUgdXBkYXRlcyB0byBtYWtlLlxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlQWN0aW9uc1RvVGFrZSh1cGRhdGU6IFBhcnRpYWw8UmVkaXJlY3RBY3Rpb24+KSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kaWFsb2cuYWN0aW9uc1RvVGFrZVt0aGlzLnRpdGxlSW5kZXhdLnJlcXVlc3RzW3RoaXMudGl0bGVdLCB1cGRhdGUpO1xuICAgIH1cbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHR5cGUgeyBQYWdlUmV2aXNpb25zUmVzdWx0IH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgUmVkaXJlY3RUZW1wbGF0ZURhdGEsIFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gfSBmcm9tICcuLi9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyLWRpYWxvZyc7XG5pbXBvcnQgSGVscGVyRGlhbG9nLCB7IHR5cGUgUmVxdWVzdEFjdGlvbiwgdHlwZSBSZXF1ZXN0UmVxdWVzdGVyIH0gZnJvbSAnLi9oZWxwZXItZGlhbG9nJztcbmltcG9ydCBSZWRpcmVjdFJlcXVlc3RIYW5kbGVyIGZyb20gJy4vcmVkaXJlY3QtcmVxdWVzdC1oYW5kbGVyJztcbmltcG9ydCB0eXBlIEFjdGlvbnNEaWFsb2cgZnJvbSAnLi9zaG93LWFjdGlvbnMtZGlhbG9nJztcblxuaW50ZXJmYWNlIFJlZGlyZWN0UmVxdWVzdERhdGEge1xuICAgIHBhZ2VzOiBzdHJpbmdbXTtcbiAgICB0YXJnZXQ6IHN0cmluZztcbiAgICByZWFzb246IHN0cmluZztcbiAgICBzb3VyY2U6IHN0cmluZztcbiAgICByZXF1ZXN0ZXI6IFJlcXVlc3RSZXF1ZXN0ZXI7XG59XG5cbmV4cG9ydCB0eXBlIFJlZGlyZWN0QWN0aW9uID0gUmVxdWVzdEFjdGlvbiAmIHsgcmVkaXJlY3RUZW1wbGF0ZXM/OiBzdHJpbmdbXTsgcmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM/OiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvW10gfTtcblxudHlwZSBSZWRpcmVjdEFjdGlvbnMgPSB7IHRhcmdldDogc3RyaW5nOyByZXF1ZXN0czogUmVjb3JkPHN0cmluZywgUmVkaXJlY3RBY3Rpb24+IH1bXTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmVkaXJlY3RzRGlhbG9nIGV4dGVuZHMgSGVscGVyRGlhbG9nIHtcbiAgICBwdWJsaWMgcmVkaXJlY3RUZW1wbGF0ZXMhOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcblxuICAgIHByb3RlY3RlZCBwYXJzZWRSZXF1ZXN0czogUmVkaXJlY3RSZXF1ZXN0RGF0YVtdID0gW107XG4gICAgcHVibGljIGFjdGlvbnNUb1Rha2U6IFJlZGlyZWN0QWN0aW9ucyA9IFtdO1xuXG4gICAgLyoqXG4gICAgICogTG9hZCBlbGVtZW50cyBpbiB0aGUgd2luZG93LlxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBsb2FkKCkge1xuICAgICAgICBjb25zdCByZWRpcmVjdFRlbXBsYXRlUmVzcG9uc2UgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICB0aXRsZXM6ICdVc2VyOkVlaml0NDMvc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIuanNvbicsXG4gICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdDtcblxuICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgIHJlZGlyZWN0VGVtcGxhdGVSZXNwb25zZS5xdWVyeSEucGFnZXNbMF0/LnJldmlzaW9ucz8uWzBdPy5zbG90cz8ubWFpbj8uY29udGVudCB8fCAne30nLFxuICAgICAgICApIGFzIFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuXG4gICAgICAgIHZvaWQgc3VwZXIubG9hZCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyByZWRpcmVjdCByZXF1ZXN0cyBmcm9tIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvbkhlYWRlciBUaGUgc2VjdGlvbiBoZWFkZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHBhcnNlU3VidHlwZVJlcXVlc3RzKHNlY3Rpb25UZXh0OiBzdHJpbmcsIHNlY3Rpb25IZWFkZXI6IHN0cmluZykge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRhID0ge30gYXMgUmVkaXJlY3RSZXF1ZXN0RGF0YTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZWRQYWdlcyA9IHNlY3Rpb25IZWFkZXJcbiAgICAgICAgICAgIC5tYXRjaEFsbCgvXFxbXFxbKC4qPyldXS9nKVxuICAgICAgICAgICAgLnRvQXJyYXkoKVxuICAgICAgICAgICAgLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdLnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gICAgICAgIGlmIChyZXF1ZXN0ZWRQYWdlcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICBwYXJzZWREYXRhLnBhZ2VzID0gcmVxdWVzdGVkUGFnZXM7XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVGFyZ2V0ID0gL1RhcmdldCBvZiByZWRpcmVjdDogP1xcW1xcWyguKj8pXV0vLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0udHJpbSgpLnJlcGxhY2UoL146LywgJycpLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuICAgICAgICBpZiAoIXBhcnNlZFRhcmdldCkgcmV0dXJuO1xuXG4gICAgICAgIHBhcnNlZERhdGEudGFyZ2V0ID0gcGFyc2VkVGFyZ2V0O1xuXG4gICAgICAgIHBhcnNlZERhdGEucmVhc29uID0gL3JlYXNvbjogPyguKj8pXFwqc291cmNlKD86IFxcKGlmIGFwcGxpY2FibGVcXCkpPzovaXMuZXhlYyhzZWN0aW9uVGV4dCk/LlsxXS50cmltKCkgPz8gJyc7XG5cbiAgICAgICAgcGFyc2VkRGF0YS5zb3VyY2UgPSAvc291cmNlKD86IFxcKGlmIGFwcGxpY2FibGVcXCkpPzogPyguKj8pKD86PHJlZmVyZW5jZXMgXFwvPnxcXG5cXG4pL2lzLmV4ZWMoc2VjdGlvblRleHQpPy5bMV0udHJpbSgpID8/ICcnO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RlciA9IHNlY3Rpb25UZXh0XG4gICAgICAgICAgICAubWF0Y2goXG4gICAgICAgICAgICAgICAgc2VjdGlvblRleHQuaW5jbHVkZXMoJzxyZWZlcmVuY2VzIC8+JylcbiAgICAgICAgICAgICAgICAgICAgPyAvPHJlZmVyZW5jZXMgXFwvPlxcbisoLiopL1xuICAgICAgICAgICAgICAgICAgICA6IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGAoPzo8cmVmZXJlbmNlcyBcXFxcLz4ke3BhcnNlZERhdGEuc291cmNlID8gYHwke3BhcnNlZERhdGEuc291cmNlLnJlcGxhY2VBbGwoL1tcXHMjJCgpKissLj9bXFxcXFxcXV57fH0tXS9nLCAnXFxcXCQmJyl9YCA6ICcnfSlcXG4rKC4qKWAsXG4gICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk/LlsxXVxuICAgICAgICAgICAgLnRyaW0oKTtcblxuICAgICAgICBjb25zdCBuYW1lID0gcmVxdWVzdGVyID8gLyg/OlNwZWNpYWw6Q29udHJpYnV0aW9uc1xcL3xVc2VyKD86IHRhbGspPzopKC4qPylcXHwvLmV4ZWMocmVxdWVzdGVyKT8uWzFdLnRyaW0oKSA6IG51bGw7XG5cbiAgICAgICAgcGFyc2VkRGF0YS5yZXF1ZXN0ZXIgPSByZXF1ZXN0ZXIgJiYgbmFtZSA/IHsgdHlwZTogL1xcW1xcW1VzZXIoIHRhbGspPzovLnRlc3QocmVxdWVzdGVyKSA/ICd1c2VyJyA6ICdpcCcsIG5hbWUgfSA6IG51bGw7XG5cbiAgICAgICAgdGhpcy5wYXJzZWRSZXF1ZXN0cy5wdXNoKHBhcnNlZERhdGEpO1xuXG4gICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZS5wdXNoKHtcbiAgICAgICAgICAgIHRhcmdldDogcGFyc2VkRGF0YS50YXJnZXQsXG4gICAgICAgICAgICByZXF1ZXN0czogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBhZ2VzLm1hcCgocGFnZSkgPT4gW1xuICAgICAgICAgICAgICAgICAgICBwYWdlLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsU2VjdGlvblRleHQ6IHNlY3Rpb25UZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dC5yZXBsYWNlKC9ePT0uKj89PSQvbSwgJycpLnRyaW0oKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdub25lJyxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdKSxcbiAgICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGEgZ2l2ZW4gcmVkaXJlY3QgcmVxdWVzdCBpbnRvIHRoZSBkaWFsb2cuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdCB0byBsb2FkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBsb2FkU3VidHlwZUVsZW1lbnRzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucGFyc2VkUmVxdWVzdHNbaW5kZXhdO1xuXG4gICAgICAgIGNvbnN0IGRldGFpbHNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdCcpO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQuaW5uZXJIVE1MID0gcmVxdWVzdC5wYWdlcy5tYXAoKHBhZ2UpID0+IGA8Yj4ke3BhZ2V9PC9iPmApLmpvaW4oJywgJykgKyAnIFx1MjE5MiAnO1xuICAgICAgICBzdW1tYXJ5RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LnRhZ05hbWUgPT09ICdJTlBVVCcgJiYgZXZlbnQua2V5ID09PSAnICcpIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRhcmdldEVkaXRvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci10YXJnZXQtZWRpdG9yJyk7XG4gICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtyZXF1ZXN0LnRhcmdldC5sZW5ndGh9Y2hgO1xuICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlID0gcmVxdWVzdC50YXJnZXQ7XG4gICAgICAgIHRhcmdldEVkaXRvckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoKSA9PiB7XG4gICAgICAgICAgICB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlID0gdGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgdGFyZ2V0RWRpdG9yRWxlbWVudC5zdHlsZS53aWR0aCA9IGAke3RhcmdldEVkaXRvckVsZW1lbnQudmFsdWUubGVuZ3RofWNoYDtcblxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS50YXJnZXQgPSB0YXJnZXRFZGl0b3JFbGVtZW50LnZhbHVlO1xuXG4gICAgICAgICAgICBsaW5rRWxlbWVudC5ocmVmID0gbXcudXRpbC5nZXRVcmwodGFyZ2V0RWRpdG9yRWxlbWVudC52YWx1ZSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmFwcGVuZCh0YXJnZXRFZGl0b3JFbGVtZW50KTtcblxuICAgICAgICBjb25zdCBsaW5rRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgICAgbGlua0VsZW1lbnQuY2xhc3NMaXN0LmFkZCgnYWZjcmMtaGVscGVyLWV4dGVybmFsLWxpbmsnKTtcbiAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChyZXF1ZXN0LnRhcmdldCk7XG4gICAgICAgIGxpbmtFbGVtZW50LmlubmVySFRNTCA9IGBcbjxzdmcgdmlld2JveD1cIjAgMCA0OCA0OFwiPlxuPHBhdGggZD1cIk0zNiAyNGMtMS4yIDAtMiAwLjgtMiAydjEyYzAgMS4yLTAuOCAyLTIgMmgtMjJjLTEuMlxuICAgIDAtMi0wLjgtMi0ydi0yMmMwLTEuMiAwLjgtMiAyLTJoMTJjMS4yIDAgMi0wLjggMi0ycy0wLjgtMi0yLTJoLTEyYy0zLjRcbiAgICAwLTYgMi42LTYgNnYyMmMwIDMuNCAyLjYgNiA2IDZoMjJjMy40IDAgNi0yLjZcbiAgICA2LTZ2LTEyYzAtMS4yLTAuOC0yLTItMnpcIj48L3BhdGg+XG48cGF0aCBkPVwiTTQzLjggNS4yYy0wLjItMC40LTAuNi0wLjgtMS0xLTAuMi0wLjItMC42LTAuMi0wLjgtMC4yaC0xMmMtMS4yXG4gICAgMC0yIDAuOC0yIDJzMC44IDIgMiAyaDcuMmwtMTguNiAxOC42Yy0wLjggMC44LTAuOCAyIDAgMi44IDAuNCAwLjQgMC44XG4gICAgMC42IDEuNCAwLjZzMS0wLjIgMS40LTAuNmwxOC42LTE4LjZ2Ny4yYzAgMS4yIDAuOCAyIDIgMnMyLTAuOFxuICAgIDItMnYtMTJjMC0wLjIgMC0wLjYtMC4yLTAuOHpcIj48L3BhdGg+XG48L3N2Zz5gO1xuXG4gICAgICAgIHN1bW1hcnlFbGVtZW50LmFwcGVuZChsaW5rRWxlbWVudCk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0SW5mb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LWluZm8nKTtcblxuICAgICAgICBjb25zdCBub25lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgbm9uZUVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgIG5vbmVFbGVtZW50LnRleHRDb250ZW50ID0gJ05vbmUnO1xuXG4gICAgICAgIGNvbnN0IHVua25vd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB1bmtub3duRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgdW5rbm93bkVsZW1lbnQudGV4dENvbnRlbnQgPSAnVW5rbm93bic7XG5cbiAgICAgICAgY29uc3QgcmVhc29uRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgcmVhc29uTGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdiJyk7XG4gICAgICAgIHJlYXNvbkxhYmVsLnRleHRDb250ZW50ID0gJ1JlYXNvbjogJztcbiAgICAgICAgcmVhc29uRGl2LmFwcGVuZChyZWFzb25MYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QucmVhc29uKSByZWFzb25EaXYuYXBwZW5kKHJlcXVlc3QucmVhc29uKTtcbiAgICAgICAgZWxzZSByZWFzb25EaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChyZWFzb25EaXYpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZURpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZUxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICBzb3VyY2VMYWJlbC50ZXh0Q29udGVudCA9ICdTb3VyY2U6ICc7XG4gICAgICAgIHNvdXJjZURpdi5hcHBlbmQoc291cmNlTGFiZWwpO1xuXG4gICAgICAgIGlmIChyZXF1ZXN0LnNvdXJjZSkgc291cmNlRGl2LmFwcGVuZChyZXF1ZXN0LnNvdXJjZSk7XG4gICAgICAgIGVsc2Ugc291cmNlRGl2LmFwcGVuZChub25lRWxlbWVudC5jbG9uZU5vZGUodHJ1ZSkpO1xuXG4gICAgICAgIHJlcXVlc3RJbmZvRWxlbWVudC5hcHBlbmQoc291cmNlRGl2KTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgcmVxdWVzdGVyTGFiZWwudGV4dENvbnRlbnQgPSAnUmVxdWVzdGVyOiAnO1xuICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay5ocmVmID1cbiAgICAgICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3Rlci50eXBlID09PSAndXNlcidcbiAgICAgICAgICAgICAgICAgICAgPyBtdy51dGlsLmdldFVybChgVXNlcjoke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YClcbiAgICAgICAgICAgICAgICAgICAgOiBtdy51dGlsLmdldFVybChgU3BlY2lhbDpDb250cmlidXRpb25zLyR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGV4dENvbnRlbnQgPSByZXF1ZXN0LnJlcXVlc3Rlci5uYW1lO1xuICAgICAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMaW5rKTtcbiAgICAgICAgfSBlbHNlIHJlcXVlc3RlckRpdi5hcHBlbmQodW5rbm93bkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RlckRpdik7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RJbmZvRWxlbWVudCk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hyJykpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25kZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlcicpO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVxdWVzdGVkVGl0bGUgb2YgcmVxdWVzdC5wYWdlcykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IG5ldyBSZWRpcmVjdFJlcXVlc3RIYW5kbGVyKGluZGV4LCByZXF1ZXN0ZWRUaXRsZSwgZGV0YWlsc0VsZW1lbnQsIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LCB0aGlzKTtcblxuICAgICAgICAgICAgaGFuZGxlci5zZXRVcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RSZXNwb25kZXJFbGVtZW50KTtcblxuICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQoZGV0YWlsc0VsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGNvbG9yIG9mIGEgZGV0YWlscyBlbGVtZW50IGJhc2VkIG9uIHRoZSBoYW5kbGluZyBvZiB0aGUgcmVxdWVzdHMgaW5zaWRlLlxuICAgICAqIEBwYXJhbSBkZXRhaWxzRWxlbWVudCBUaGUgZGV0YWlscyBlbGVtZW50IHRvIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZWRpcmVjdCB0YXJnZXQuXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudDogSFRNTERldGFpbHNFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IGFjdGlvbnNUb1Rha2UgPSBPYmplY3QudmFsdWVzKHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0ucmVxdWVzdHMpO1xuXG4gICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQgPSBhY3Rpb25zVG9UYWtlLmV2ZXJ5KChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnIHx8IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55Jyk7XG5cbiAgICAgICAgY29uc3QgZmlyc3RDbG9zZVJlYXNvbiA9IGFjdGlvbnNUb1Rha2UuZmluZCgoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnY2xvc2UnKT8uY2xvc2luZ1JlYXNvbj8uaWQ7XG4gICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQ2xvc2VkID0gYWN0aW9uc1RvVGFrZS5ldmVyeShcbiAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScgJiYgYWN0aW9uLmNsb3NpbmdSZWFzb24/LmlkID09PSBmaXJzdENsb3NlUmVhc29uLFxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBiYWNrZ3JvdW5kQ29sb3IgPSAnJztcblxuICAgICAgICBpZiAoYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCkge1xuICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRDb3VudCA9IGFjdGlvbnNUb1Rha2UuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnKS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBkZW5pZWRDb3VudCA9IGFjdGlvbnNUb1Rha2UuZmlsdGVyKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55JykubGVuZ3RoO1xuXG4gICAgICAgICAgICBpZiAoYWNjZXB0ZWRDb3VudCA+IDAgJiYgZGVuaWVkQ291bnQgPiAwKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmZjE3ZSc7XG4gICAgICAgICAgICBlbHNlIGlmIChhY2NlcHRlZENvdW50ID4gMCkgYmFja2dyb3VuZENvbG9yID0gJyNhMGZmYTAnO1xuICAgICAgICAgICAgZWxzZSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgIH0gZWxzZSBpZiAoYWxsUmVxdWVzdHNDbG9zZWQpXG4gICAgICAgICAgICBpZiAoZmlyc3RDbG9zZVJlYXNvbiA9PT0gJ3InKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgICAgICBlbHNlIGlmIChmaXJzdENsb3NlUmVhc29uID09PSAncycpIGJhY2tncm91bmRDb2xvciA9ICcjOTBjMDkwJztcbiAgICAgICAgICAgIGVsc2UgYmFja2dyb3VuZENvbG9yID0gJyNiOGI4YjgnO1xuXG4gICAgICAgIGRldGFpbHNFbGVtZW50LnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGJhY2tncm91bmRDb2xvcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtcyBhY3Rpb25zIG9uIGEgZ2l2ZW4gY2F0ZWdvcnkgcmVxdWVzdC5cbiAgICAgKiBAcGFyYW0gc2hvd0FjdGlvbnNEaWFsb2cgVGhlIGRpYWxvZyB0byBhZGQgbWVzc2FnZXMgdG8uXG4gICAgICogQHBhcmFtIGNvdW50cyBUaGUgY291bnQgb2JqZWN0IHVzZWQgdG8gdHJhY2sgcmVxdWVzdHMgZm9yIHRoZSBlZGl0IHN1bW1hcnkuXG4gICAgICogQHBhcmFtIG5ld1BhZ2VUZXh0IFRoZSBuZXcgcGFnZSB0ZXh0LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBwZXJmb3JtU3VidHlwZUFjdGlvbnMoc2hvd0FjdGlvbnNEaWFsb2c6IEFjdGlvbnNEaWFsb2csIGNvdW50czogUmVjb3JkPHN0cmluZywgbnVtYmVyPiwgbmV3UGFnZVRleHQ6IHN0cmluZykge1xuICAgICAgICBjb25zdCBhbnlSZXF1ZXN0SGFuZGxlZCA9IHRoaXMuYWN0aW9uc1RvVGFrZS5zb21lKChhY3Rpb25EYXRhKSA9PlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhhY3Rpb25EYXRhLnJlcXVlc3RzKS5zb21lKChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gIT09ICdub25lJyksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGFueVJlcXVlc3RIYW5kbGVkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHsgdGFyZ2V0LCByZXF1ZXN0cyB9IG9mIHRoaXMuYWN0aW9uc1RvVGFrZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQgPSBPYmplY3QudmFsdWVzKHJlcXVlc3RzKS5zb21lKFxuICAgICAgICAgICAgICAgICAgICAoYWN0aW9uKSA9PiBhY3Rpb24uYWN0aW9uID09PSAnYWNjZXB0JyB8fCBhY3Rpb24uYWN0aW9uID09PSAnZGVueScsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdhY2NlcHQnIHx8IGFjdGlvbi5hY3Rpb24gPT09ICdkZW55JyxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RDbG9zZVJlYXNvbiA9IE9iamVjdC52YWx1ZXMocmVxdWVzdHMpLmZpbmQoKGFjdGlvbikgPT4gYWN0aW9uLmFjdGlvbiA9PT0gJ2Nsb3NlJyk/LmNsb3NpbmdSZWFzb24/LmlkO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFsbFJlcXVlc3RzQ2xvc2VkID0gT2JqZWN0LnZhbHVlcyhyZXF1ZXN0cykuZXZlcnkoXG4gICAgICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IGFjdGlvbi5hY3Rpb24gPT09ICdjbG9zZScgJiYgYWN0aW9uLmNsb3NpbmdSZWFzb24/LmlkID09PSBmaXJzdENsb3NlUmVhc29uLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhY2NlcHRlZFBhZ2VzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkUGFnZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYW1vdW50T2ZQYWdlcyA9IE9iamVjdC5rZXlzKHJlcXVlc3RzKS5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uXSBvZiBPYmplY3QuZW50cmllcyhyZXF1ZXN0cykpXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWN0aW9uLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb21lUmVxdWVzdEFjY2VwdGVkRGVuaWVkICYmICFhbGxSZXF1ZXN0c0FjY2VwdGVkRGVuaWVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBOb3QgYWxsIHJlcXVlc3RzIHRvIFwiJHt0YXJnZXR9XCIgd2VyZSBhY2NlcHRlZCBvciBkZW5pZWQsIHRoZSBoYW5kbGluZyBvZiBcIiR7cmVxdWVzdGVkVGl0bGV9XCIgd2lsbCBiZSBpZ25vcmVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGVkUGFnZXMucHVzaChyZXF1ZXN0ZWRUaXRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uY29tbWVudCkgY29tbWVudHMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5jb21tZW50XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5hY2NlcHRlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZGVueSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc29tZVJlcXVlc3RBY2NlcHRlZERlbmllZCAmJiAhYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGFsbCByZXF1ZXN0cyB0byBcIiR7dGFyZ2V0fVwiIHdlcmUgYWNjZXB0ZWQgb3IgZGVuaWVkLCB0aGUgaGFuZGxpbmcgb2YgXCIke3JlcXVlc3RlZFRpdGxlfVwiIGlzIGJlaW5nIGlnbm9yZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3YXJuaW5nJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVuaWVkUGFnZXMucHVzaChbcmVxdWVzdGVkVGl0bGUsIGFjdGlvbi5kZW55UmVhc29uIV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuZGVuaWVkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdjb21tZW50Jzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb24uY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50cy5wdXNoKFtyZXF1ZXN0ZWRUaXRsZSwgYWN0aW9uLmNvbW1lbnRdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzWydjb21tZW50ZWQgb24nXSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgcmVxdWVzdCB0byBjcmVhdGUgXCIke3JlcXVlc3RlZFRpdGxlfVwiIFx1MjE5MiBcIiR7dGFyZ2V0fVwiIHdhcyBtYXJrZWQgdG8gYmUgY29tbWVudGVkIG9uLCBidXQgbm8gY29tbWVudCB3YXMgcHJvdmlkZWQgc28gaXQgd2lsbCBiZSBza2lwcGVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uLmNvbW1lbnQpIGNvbW1lbnRzLnB1c2goW3JlcXVlc3RlZFRpdGxlLCBhY3Rpb24uY29tbWVudF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuY2xvc2VkKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYE5vdCBhbGwgcmVxdWVzdHMgdG8gXCIke3RhcmdldH1cIiB3ZXJlIGNsb3NlZCB3aXRoIHRoZSBzYW1lIHJlYXNvbiwgdGhlIGhhbmRsaW5nIG9mIFwiJHtyZXF1ZXN0ZWRUaXRsZX1cIiBpcyBiZWluZyBpZ25vcmVkLmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2FybmluZycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBzZWN0aW9uRGF0YSA9IHsgcGFnZVRleHQ6IG5ld1BhZ2VUZXh0LCAuLi5PYmplY3QudmFsdWVzKHJlcXVlc3RzKVswXS5vcmlnaW5hbFRleHQgfTtcblxuICAgICAgICAgICAgICAgIGlmIChjb21tZW50cy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogdGhpcy5tYXBDb21tZW50cyhjb21tZW50cywgYW1vdW50T2ZQYWdlcyA9PT0gMSwgY29tbWVudHMubGVuZ3RoID09PSBhbW91bnRPZlBhZ2VzKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWxsUmVxdWVzdHNBY2NlcHRlZERlbmllZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2xvc2luZ0lkOiBzdHJpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkUGFnZXMubGVuZ3RoID4gMCAmJiBkZW5pZWRQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nSWQgPSAncCc7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkUGFnZXNNZXNzYWdlID0gYCoge3tzdWJzdDpBZkMgcmVkaXJlY3R9fSAoJHthY2NlcHRlZFBhZ2VzLm1hcCgocGFnZSkgPT4gYFtbJHtwYWdlfV1dYCkuam9pbignLCAnKX0pIH5+fn5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVuaWVkUGFnZXNNZXNzYWdlID0gdGhpcy5tYXBEZW5pZWRSZWFzb25zKGRlbmllZFBhZ2VzLCBmYWxzZSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgYWNjZXB0ZWRQYWdlcykgdGhpcy5oYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2UsIHJlcXVlc3RzW3BhZ2VdLCB0YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IGAke2FjY2VwdGVkUGFnZXNNZXNzYWdlfVxcbiR7ZGVuaWVkUGFnZXNNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhY2NlcHRlZFBhZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdhJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIGFjY2VwdGVkUGFnZXMpIHRoaXMuaGFuZGxlQWNjZXB0ZWRSZWRpcmVjdChwYWdlLCByZXF1ZXN0c1twYWdlXSwgdGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiBgKiB7e3N1YnN0OkFmQyByZWRpcmVjdCR7YWNjZXB0ZWRQYWdlcy5sZW5ndGggPiAxID8gJ3xhbGwnIDogJyd9fX0gfn5+fmAsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NpbmdJZCA9ICdkJztcblxuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiB0aGlzLm1hcERlbmllZFJlYXNvbnMoZGVuaWVkUGFnZXMsIGFtb3VudE9mUGFnZXMgPT09IDEsIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHsgcHJlcGVuZDogYHt7QWZDLWN8JHtjbG9zaW5nSWR9fX1gLCBhcHBlbmQ6ICd7e0FmQy1jfGJ9fScgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhbGxSZXF1ZXN0c0Nsb3NlZClcbiAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kOiBge3tBZkMtY3wke2ZpcnN0Q2xvc2VSZWFzb259fX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kOiAne3tBZkMtY3xifX0nLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIG5ld1BhZ2VUZXh0ID0gc2VjdGlvbkRhdGEucGFnZVRleHQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmJlZm9yZVRleHQgKyB0aGlzLnBhZ2VDb250ZW50ID09PSBuZXdQYWdlVGV4dCkge1xuICAgICAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCAocGFnZSBjb250ZW50IGlkZW50aWNhbCkhJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1hcHBlZENvdW50cyA9IE9iamVjdC5lbnRyaWVzKGNvdW50cylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKChbLCBjb3VudF0pID0+IGNvdW50ID4gMClcbiAgICAgICAgICAgICAgICAubWFwKChbYWN0aW9uLCBjb3VudF0pID0+IGAke2FjdGlvbn0gJHtjb3VudH1gKVxuICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGUsXG4gICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAoKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB0ZXh0OiBuZXdQYWdlVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeTogYEhhbmRsaW5nIEFmQyByZWRpcmVjdCByZXF1ZXN0cyAoJHttYXBwZWRDb3VudHN9KSR7dGhpcy5zY3JpcHRNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5tYWtlQWxsRWRpdHNDcmVhdGlvbnMoc2hvd0FjdGlvbnNEaWFsb2cpO1xuXG4gICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnQWxsIGNoYW5nZXMgbWFkZSwgY2xpY2sgYmVsb3cgdG8gcmVsb2FkIScsICdzdWNjZXNzJyk7XG5cbiAgICAgICAgICAgIHNob3dBY3Rpb25zRGlhbG9nLnNob3dSZWxvYWQoKTtcbiAgICAgICAgfSBlbHNlIHNob3dBY3Rpb25zRGlhbG9nLmFkZExvZ0VudHJ5KCdObyByZXF1ZXN0cyBoYXZlIGJlZW4gaGFuZGxlZCEnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHRoZSBjcmVhdGlvbiBvZiBwYWdlcyByZWxhdGVkIHRvIGFuIGFjY2VwdGVkIHJlZGlyZWN0IHJlcXVlc3QuXG4gICAgICogQHBhcmFtIHBhZ2UgVGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIG9mIHRoZSByZXF1ZXN0ZWQgcGFnZS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgb2YgdGhlIHJlcXVlc3RlZCBwYWdlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBoYW5kbGVBY2NlcHRlZFJlZGlyZWN0KHBhZ2U6IHN0cmluZywgZGF0YTogUmVkaXJlY3RBY3Rpb24sIHRhcmdldDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHRhZ3NXaXRoQXJndW1lbnRzID1cbiAgICAgICAgICAgIGRhdGEucmVkaXJlY3RUZW1wbGF0ZXMgJiYgZGF0YS5yZWRpcmVjdFRlbXBsYXRlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgPyBkYXRhLnJlZGlyZWN0VGVtcGxhdGVzLm1hcCgodGFnKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRBcmd1bWVudEVkaXRvciA9IGRhdGEucmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM/LmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kQXJndW1lbnRFZGl0b3IpIHJldHVybiBge3ske3RhZ319fWA7XG5cbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXggPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnMuZmluZExhc3RJbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtZXRlciwgaW5kZXgpID0+IHBhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpICYmIHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCksXG4gICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZEFyZ3VtZW50cyA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlICYmIGluZGV4ID4gbGFzdE51bWJlclBhcmFtZXRlckluZGV4KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB8JHtwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSA/ICcnIDogYCR7cGFyYW1ldGVyLm5hbWV9PWB9JHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBge3ske3RhZ30ke21hcHBlZEFyZ3VtZW50c319fWA7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogbnVsbDtcblxuICAgICAgICBjb25zdCB0aXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHBhZ2UpITtcblxuICAgICAgICB0aGlzLmVkaXRzQ3JlYXRpb25zVG9NYWtlLnB1c2goXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB0aXRsZTogdGl0bGUuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgdGV4dDogYCNSRURJUkVDVCBbWyR7dGFyZ2V0fV1dJHt0YWdzV2l0aEFyZ3VtZW50cyA/IGBcXG5cXG57e1JlZGlyZWN0IGNhdGVnb3J5IHNoZWxsfFxcbiR7dGFnc1dpdGhBcmd1bWVudHMuam9pbignXFxuJyl9XFxufX1gIDogJyd9YCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQ3JlYXRpbmcgcmVkaXJlY3QgdG8gW1ske3RhcmdldH1dXSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvUl1dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIHRleHQ6IGB7e1dpa2lQcm9qZWN0IGJhbm5lciBzaGVsbHxcXG57e1dpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnx0cz17e3N1YnN0OkxPQ0FMVElNRVNUQU1QfX18cmV2aWV3ZXI9JHttdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJyl9fX1cXG59fWAsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBbW1dpa2lwZWRpYTpXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb258V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9uXV0gYmFubmVyJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMsIENhdGVnb3JpZXNSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBMb29rdXBFbGVtZW50Q29uZmlnIH0gZnJvbSAnLi4vcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LXRhcmdldC1pbnB1dC13aWRnZXQnO1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBjYXRlZ29yeSBsb29rdXAgZWxlbWVudC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2F0ZWdvcnlJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgIHByaXZhdGUgc3VwcG9ydHNTb3J0S2V5OiBib29sZWFuO1xuXG4gICAgcHVibGljIHZhbGlkQ2F0ZWdvcmllcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnLCBzdXBwb3J0c1NvcnRLZXkgPSBmYWxzZSkge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG5cbiAgICAgICAgdGhpcy5zdXBwb3J0c1NvcnRLZXkgPSBzdXBwb3J0c1NvcnRLZXk7XG4gICAgfVxuXG4gICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCkuc3BsaXQoJ3wnKVswXTtcbiAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG5cbiAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNTb3J0S2V5KSB7XG4gICAgICAgICAgICBjb25zdCBzb3J0S2V5ID0gdGhpcy5nZXRWYWx1ZSgpLnNwbGl0KCd8JylbMV07XG5cbiAgICAgICAgICAgIGlmIChzb3J0S2V5ICYmIHRoaXMudmFsaWRDYXRlZ29yaWVzLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IFt7IGRhdGE6IGAke3ZhbHVlfXwke3NvcnRLZXl9YCwgbGFiZWw6IGAke3ZhbHVlfSAod2l0aCBzb3J0IGtleSBcIiR7c29ydEtleX1cIilgIH1dO1xuXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogMTQsXG4gICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2NhdGVnb3JpZXMnLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IENhdGVnb3JpZXNSZXN1bHQgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8ucXVlcnk/LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcGFnZS5jYXRlZ29yaWVzPy5zb21lKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudGl0bGUgPT09ICdDYXRlZ29yeTpXaWtpcGVkaWEgc29mdCByZWRpcmVjdGVkIGNhdGVnb3JpZXMnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVdpdGhvdXROYW1lc3BhY2UgPSBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0c1NvcnRLZXkpIHRoaXMudmFsaWRDYXRlZ29yaWVzLmFkZCh0aXRsZVdpdGhvdXROYW1lc3BhY2UpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGl0bGVXaXRob3V0TmFtZXNwYWNlLCBsYWJlbDogdGl0bGVXaXRob3V0TmFtZXNwYWNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcGFnZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocGFnZXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICB9O1xuXG4gICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PlxuICAgICAgICBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbn1cblxuT2JqZWN0LmFzc2lnbihDYXRlZ29yeUlucHV0V2lkZ2V0LnByb3RvdHlwZSwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBMb29rdXBFbGVtZW50Q29uZmlnIH0gZnJvbSAnLi4vcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LXRhcmdldC1pbnB1dC13aWRnZXQnO1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBwYWdlIGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYWdlSW5wdXRXaWRnZXQgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQge1xuICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExvb2t1cEVsZW1lbnRDb25maWcpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgIH1cblxuICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcblxuICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiBwYXJzZWRUaXRsZT8uZ2V0TmFtZXNwYWNlSWQoKSA/PyAwLFxuICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcXVlcnk/OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmcgfVtdIH0gfSB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZXMgPSByZXN1bHQucXVlcnkucGFnZXMubWFwKChwYWdlKSA9PiAoeyBkYXRhOiBwYWdlLnRpdGxlLCBsYWJlbDogcGFnZS50aXRsZSB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG59XG5cbk9iamVjdC5hc3NpZ24oUGFnZUlucHV0V2lkZ2V0LnByb3RvdHlwZSwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUpO1xuIiwgImltcG9ydCBDYXRlZ29yeUlucHV0V2lkZ2V0IGZyb20gJy4vY2F0ZWdvcnktaW5wdXQtd2lkZ2V0JztcbmltcG9ydCBIZWxwZXJEaWFsb2csIHsgdHlwZSBSZXF1ZXN0QWN0aW9uLCB0eXBlIFJlcXVlc3RBY3Rpb25UeXBlLCB0eXBlIFJlcXVlc3RSZXF1ZXN0ZXIgfSBmcm9tICcuL2hlbHBlci1kaWFsb2cnO1xuaW1wb3J0IFBhZ2VJbnB1dFdpZGdldCBmcm9tICcuL3BhZ2UtaW5wdXQtd2lkZ2V0JztcbmltcG9ydCB0eXBlIEFjdGlvbnNEaWFsb2cgZnJvbSAnLi9zaG93LWFjdGlvbnMtZGlhbG9nJztcblxuaW50ZXJmYWNlIENhdGVnb3J5UmVxdWVzdERhdGEge1xuICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgZXhhbXBsZXM6IHN0cmluZ1tdO1xuICAgIHBhcmVudHM6IHN0cmluZ1tdO1xuICAgIHJlcXVlc3RlcjogUmVxdWVzdFJlcXVlc3Rlcjtcbn1cblxudHlwZSBDYXRlZ29yeUFjdGlvbiA9IFJlcXVlc3RBY3Rpb24gJiB7IGNhdGVnb3J5OiBzdHJpbmc7IGNhdGVnb3JpemVkUGFnZXM6IHN0cmluZ1tdOyBwYXJlbnRzOiBzdHJpbmdbXTsgY2F0ZWdvcmllc1RvUmVtb3ZlOiBzdHJpbmdbXSB9O1xuXG50eXBlIENhdGVnb3J5QWN0aW9ucyA9IENhdGVnb3J5QWN0aW9uW107XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhdGVnb3JpZXNEaWFsb2cgZXh0ZW5kcyBIZWxwZXJEaWFsb2cge1xuICAgIHByb3RlY3RlZCBwYXJzZWRSZXF1ZXN0czogQ2F0ZWdvcnlSZXF1ZXN0RGF0YVtdID0gW107XG4gICAgcHJpdmF0ZSBhY3Rpb25zVG9UYWtlOiBDYXRlZ29yeUFjdGlvbnMgPSBbXTtcblxuICAgIC8qKlxuICAgICAqIFBhcnNlcyByZWRpcmVjdCByZXF1ZXN0cyBmcm9tIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvblRleHQgVGhlIHNlY3Rpb24gdGV4dC5cbiAgICAgKiBAcGFyYW0gc2VjdGlvbkhlYWRlciBUaGUgc2VjdGlvbiBoZWFkZXIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHBhcnNlU3VidHlwZVJlcXVlc3RzKHNlY3Rpb25UZXh0OiBzdHJpbmcsIHNlY3Rpb25IZWFkZXI6IHN0cmluZykge1xuICAgICAgICBjb25zdCBwYXJzZWREYXRhID0ge30gYXMgQ2F0ZWdvcnlSZXF1ZXN0RGF0YTtcblxuICAgICAgICBjb25zdCBmb3VuZENhdGVnb3J5ID0gLzo/Q2F0ZWdvcnk6KC4qPykoXV18JCkvLmV4ZWMoc2VjdGlvbkhlYWRlcik/LlsxXS50cmltKCk7XG4gICAgICAgIGlmICghZm91bmRDYXRlZ29yeSkgcmV0dXJuO1xuXG4gICAgICAgIHBhcnNlZERhdGEuY2F0ZWdvcnkgPSBmb3VuZENhdGVnb3J5LnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgICAgIHBhcnNlZERhdGEuZXhhbXBsZXMgPSBbXG4gICAgICAgICAgICAuLi4oXG4gICAgICAgICAgICAgICAgL2V4YW1wbGUgcGFnZXMgd2hpY2ggYmVsb25nIHRvIHRoaXMgY2F0ZWdvcnk6KC4qPykocGFyZW50IGNhdGVnb3J5XFwvY2F0ZWdvcmllczp8XFxuXFxbXFxbKHNwZWNpYWw6Y29udHJpYnV0aW9uc1xcL3x1c2VyOikpL2lzLmV4ZWMoXG4gICAgICAgICAgICAgICAgICAgIHNlY3Rpb25UZXh0LFxuICAgICAgICAgICAgICAgICk/LlsxXSA/PyAnJ1xuICAgICAgICAgICAgKS5tYXRjaEFsbCgvXFwqXFxzKig/OlxcW1xcWyk/KC4qPykoXFx8fF1dfFxccyo/XFxuKS9nKSxcbiAgICAgICAgXVxuICAgICAgICAgICAgLm1hcCgobWF0Y2gpID0+IG1hdGNoWzFdLnRyaW0oKS5yZXBsYWNlKC9eOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKSlcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgcGFyc2VkRGF0YS5wYXJlbnRzID0gW1xuICAgICAgICAgICAgLi4uKC9wYXJlbnQgY2F0ZWdvcnlcXC9jYXRlZ29yaWVzOiguKj8pKFxcblxcbnxcXG5cXFtcXFsoc3BlY2lhbDpjb250cmlidXRpb25zXFwvfHVzZXI6KSkvaXMuZXhlYyhzZWN0aW9uVGV4dCk/LlsxXSA/PyAnJykubWF0Y2hBbGwoXG4gICAgICAgICAgICAgICAgLyg/PCFcXHwpIz86P0NhdGVnb3J5OiguKj8pKFxcfHxdXXxcXHMqP1xcbikvZyxcbiAgICAgICAgICAgICksXG4gICAgICAgIF1cbiAgICAgICAgICAgIC5tYXAoKG1hdGNoKSA9PiBtYXRjaFsxXS50cmltKCkucmVwbGFjZSgvXjovLCAnJykucmVwbGFjZUFsbCgnXycsICcgJykpXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0VXNlckluZGV4ID0gc2VjdGlvblRleHQuaW5kZXhPZignW1tVc2VyOicpO1xuICAgICAgICBjb25zdCBmaXJzdFVzZXJUYWxrSW5kZXggPSBzZWN0aW9uVGV4dC5pbmRleE9mKCdbW1VzZXIgdGFsazonKTtcbiAgICAgICAgY29uc3QgZmlyc3RJcEluZGV4ID0gc2VjdGlvblRleHQuaW5kZXhPZignW1tTcGVjaWFsOkNvbnRyaWJ1dGlvbnMvJyk7XG5cbiAgICAgICAgY29uc3QgZmlyc3RJbmRleCA9IE1hdGgubWluKC4uLltmaXJzdFVzZXJJbmRleCwgZmlyc3RVc2VyVGFsa0luZGV4LCBmaXJzdElwSW5kZXhdLmZpbHRlcigoaW5kZXgpID0+IGluZGV4ICE9PSAtMSkpO1xuXG4gICAgICAgIHBhcnNlZERhdGEucmVxdWVzdGVyID1cbiAgICAgICAgICAgIGZpcnN0SW5kZXggPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWVxuICAgICAgICAgICAgICAgID8gbnVsbFxuICAgICAgICAgICAgICAgIDogZmlyc3RJbmRleCA9PT0gZmlyc3RJcEluZGV4XG4gICAgICAgICAgICAgICAgICA/IHsgdHlwZTogJ2lwJywgbmFtZTogL1xcW1xcW1NwZWNpYWw6Q29udHJpYnV0aW9uc1xcLyguKj8pKFxcfHxdXSkvLmV4ZWMoc2VjdGlvblRleHQpIVsxXS50cmltKCkgfVxuICAgICAgICAgICAgICAgICAgOiB7IHR5cGU6ICd1c2VyJywgbmFtZTogL1xcW1xcW1VzZXIoPzogdGFsayk/OiguKj8pKFxcfHxdXSkvLmV4ZWMoc2VjdGlvblRleHQpIVsxXS50cmltKCkgfTtcbiAgICAgICAgaWYgKCFwYXJzZWREYXRhLnJlcXVlc3Rlcj8ubmFtZSkgcGFyc2VkRGF0YS5yZXF1ZXN0ZXIgPSBudWxsO1xuXG4gICAgICAgIHRoaXMucGFyc2VkUmVxdWVzdHMucHVzaChwYXJzZWREYXRhKTtcblxuICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2UucHVzaCh7XG4gICAgICAgICAgICBjYXRlZ29yeTogcGFyc2VkRGF0YS5jYXRlZ29yeSxcbiAgICAgICAgICAgIGNhdGVnb3JpemVkUGFnZXM6IHBhcnNlZERhdGEuZXhhbXBsZXMsXG4gICAgICAgICAgICBwYXJlbnRzOiBwYXJzZWREYXRhLnBhcmVudHMsXG4gICAgICAgICAgICBjYXRlZ29yaWVzVG9SZW1vdmU6IFsuLi5wYXJzZWREYXRhLnBhcmVudHNdLFxuICAgICAgICAgICAgb3JpZ2luYWxUZXh0OiB7IGZ1bGxTZWN0aW9uVGV4dDogc2VjdGlvblRleHQsIHNlY3Rpb25UZXh0OiBzZWN0aW9uVGV4dC5yZXBsYWNlKC9ePT0uKj89PSQvbSwgJycpLnRyaW0oKSB9LFxuICAgICAgICAgICAgYWN0aW9uOiAnbm9uZScsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGEgZ2l2ZW4gY2F0ZWdvcnkgcmVxdWVzdCBpbnRvIHRoZSBkaWFsb2cuXG4gICAgICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgcmVxdWVzdCB0byBsb2FkLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBsb2FkU3VidHlwZUVsZW1lbnRzKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMucGFyc2VkUmVxdWVzdHNbaW5kZXhdO1xuXG4gICAgICAgIGNvbnN0IGRldGFpbHNFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdhZmNyYy1oZWxwZXItcmVxdWVzdCcpO1xuICAgICAgICBkZXRhaWxzRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy51cGRhdGVTaXplKCksIDApKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQuaW5uZXJIVE1MID0gYDxiPkNhdGVnb3J5OiR7cmVxdWVzdC5jYXRlZ29yeX08L2I+YDtcbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHN1bW1hcnlFbGVtZW50KTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0SW5mb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LWluZm8nKTtcblxuICAgICAgICBjb25zdCBub25lRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICAgICAgbm9uZUVsZW1lbnQuc3R5bGUuY29sb3IgPSAnZGltZ3JheSc7XG4gICAgICAgIG5vbmVFbGVtZW50LnRleHRDb250ZW50ID0gJ05vbmUnO1xuXG4gICAgICAgIGNvbnN0IHVua25vd25FbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgICAgICB1bmtub3duRWxlbWVudC5zdHlsZS5jb2xvciA9ICdkaW1ncmF5JztcbiAgICAgICAgdW5rbm93bkVsZW1lbnQudGV4dENvbnRlbnQgPSAnVW5rbm93bic7XG5cbiAgICAgICAgY29uc3QgZXhhbXBsZXNEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCBleGFtcGxlc0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICBleGFtcGxlc0xhYmVsLnRleHRDb250ZW50ID0gJ0V4YW1wbGVzOiAnO1xuICAgICAgICBleGFtcGxlc0Rpdi5hcHBlbmQoZXhhbXBsZXNMYWJlbCk7XG5cbiAgICAgICAgaWYgKHJlcXVlc3QuZXhhbXBsZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBleGFtcGxlXSBvZiByZXF1ZXN0LmV4YW1wbGVzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpbmtFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgIGxpbmtFbGVtZW50LmhyZWYgPSBtdy51dGlsLmdldFVybChleGFtcGxlKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50ZXh0Q29udGVudCA9IGV4YW1wbGU7XG5cbiAgICAgICAgICAgICAgICBleGFtcGxlc0Rpdi5hcHBlbmQobGlua0VsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSByZXF1ZXN0LmV4YW1wbGVzLmxlbmd0aCAtIDEpIGV4YW1wbGVzRGl2LmFwcGVuZCgnLCAnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgZWxzZSBleGFtcGxlc0Rpdi5hcHBlbmQobm9uZUVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKGV4YW1wbGVzRGl2KTtcblxuICAgICAgICBjb25zdCBwYXJlbnRzRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgY29uc3QgcGFyZW50c0xhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYicpO1xuICAgICAgICBwYXJlbnRzTGFiZWwudGV4dENvbnRlbnQgPSAnUGFyZW50czogJztcbiAgICAgICAgcGFyZW50c0Rpdi5hcHBlbmQocGFyZW50c0xhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5wYXJlbnRzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgcGFyZW50XSBvZiByZXF1ZXN0LnBhcmVudHMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlua0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gICAgICAgICAgICAgICAgbGlua0VsZW1lbnQuaHJlZiA9IG13LnV0aWwuZ2V0VXJsKGBDYXRlZ29yeToke3BhcmVudH1gKTtcbiAgICAgICAgICAgICAgICBsaW5rRWxlbWVudC50ZXh0Q29udGVudCA9IHBhcmVudDtcblxuICAgICAgICAgICAgICAgIHBhcmVudHNEaXYuYXBwZW5kKGxpbmtFbGVtZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gcmVxdWVzdC5wYXJlbnRzLmxlbmd0aCAtIDEpIHBhcmVudHNEaXYuYXBwZW5kKCcsICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICBlbHNlIHBhcmVudHNEaXYuYXBwZW5kKG5vbmVFbGVtZW50LmNsb25lTm9kZSh0cnVlKSk7XG5cbiAgICAgICAgcmVxdWVzdEluZm9FbGVtZW50LmFwcGVuZChwYXJlbnRzRGl2KTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXJEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuICAgICAgICBjb25zdCByZXF1ZXN0ZXJMYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2InKTtcbiAgICAgICAgcmVxdWVzdGVyTGFiZWwudGV4dENvbnRlbnQgPSAnUmVxdWVzdGVyOiAnO1xuICAgICAgICByZXF1ZXN0ZXJEaXYuYXBwZW5kKHJlcXVlc3RlckxhYmVsKTtcblxuICAgICAgICBpZiAocmVxdWVzdC5yZXF1ZXN0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RlckxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICByZXF1ZXN0ZXJMaW5rLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgcmVxdWVzdGVyTGluay5ocmVmID1cbiAgICAgICAgICAgICAgICByZXF1ZXN0LnJlcXVlc3Rlci50eXBlID09PSAndXNlcidcbiAgICAgICAgICAgICAgICAgICAgPyBtdy51dGlsLmdldFVybChgVXNlcjoke3JlcXVlc3QucmVxdWVzdGVyLm5hbWV9YClcbiAgICAgICAgICAgICAgICAgICAgOiBtdy51dGlsLmdldFVybChgU3BlY2lhbDpDb250cmlidXRpb25zLyR7cmVxdWVzdC5yZXF1ZXN0ZXIubmFtZX1gKTtcbiAgICAgICAgICAgIHJlcXVlc3RlckxpbmsudGV4dENvbnRlbnQgPSByZXF1ZXN0LnJlcXVlc3Rlci5uYW1lO1xuICAgICAgICAgICAgcmVxdWVzdGVyRGl2LmFwcGVuZChyZXF1ZXN0ZXJMaW5rKTtcbiAgICAgICAgfSBlbHNlIHJlcXVlc3RlckRpdi5hcHBlbmQodW5rbm93bkVsZW1lbnQuY2xvbmVOb2RlKHRydWUpKTtcblxuICAgICAgICByZXF1ZXN0SW5mb0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RlckRpdik7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RJbmZvRWxlbWVudCk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2hyJykpO1xuXG4gICAgICAgIGNvbnN0IHJlcXVlc3RSZXNwb25kZXJFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIHJlcXVlc3RSZXNwb25kZXJFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2FmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlcicpO1xuXG4gICAgICAgIGNvbnN0IGFjdGlvblJhZGlvSW5wdXQgPSBuZXcgT08udWkuUmFkaW9TZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvJ10sXG4gICAgICAgICAgICBpdGVtczogWydBY2NlcHQnLCAnRGVueScsICdDb21tZW50JywgJ0Nsb3NlJywgJ05vbmUnXS5tYXAoKGxhYmVsKSA9PiBuZXcgT08udWkuUmFkaW9PcHRpb25XaWRnZXQoeyBkYXRhOiBsYWJlbCwgbGFiZWwgfSkpLFxuICAgICAgICB9KTtcbiAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC5zZWxlY3RJdGVtQnlMYWJlbCgnTm9uZScpO1xuICAgICAgICBhY3Rpb25SYWRpb0lucHV0Lm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMudXBkYXRlU2l6ZSgpLCAwKTtcblxuICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0gKFxuICAgICAgICAgICAgICAgIChhY3Rpb25SYWRpb0lucHV0LmZpbmRTZWxlY3RlZEl0ZW0oKSBhcyBPTy51aS5SYWRpb09wdGlvbldpZGdldCkuZ2V0RGF0YSgpIGFzIHN0cmluZ1xuICAgICAgICAgICAgKS50b0xvd2VyQ2FzZSgpIGFzIFJlcXVlc3RBY3Rpb25UeXBlO1xuXG4gICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmFjdGlvbiA9IG9wdGlvbjtcblxuICAgICAgICAgICAgaWYgKFsnY29tbWVudCcsICdjbG9zZSddLmluY2x1ZGVzKG9wdGlvbikpIHtcbiAgICAgICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IGNvbW1lbnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICBpZiAoY29tbWVudCkgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgICAgICBlbHNlIGRlbGV0ZSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNvbW1lbnQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jb21tZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudCwgaW5kZXgpO1xuXG4gICAgICAgICAgICBwYWdlU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgIGNhdGVnb3J5UmVtb3ZlU2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcbiAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnYWNjZXB0Jzoge1xuICAgICAgICAgICAgICAgICAgICBwYWdlU2VsZWN0TGF5b3V0LiRlbGVtZW50LnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3RMYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgICAgIGRlbnlSZWFzb25MYXlvdXQuJGVsZW1lbnQuc2hvdygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXNlICdjbG9zZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgY2xvc2luZ1JlYXNvbkxheW91dC4kZWxlbWVudC5zaG93KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYWdlU2VsZWN0SW5wdXQgPSBuZXcgUGFnZUlucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdBZGQgcGFnZXMgaGVyZScgfSk7XG4gICAgICAgIHBhZ2VTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gcGFnZVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL146LywgJycpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgcGFnZVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgIH0pO1xuICAgICAgICBwYWdlU2VsZWN0SW5wdXQub24oJ3Nob3dpbmctdmFsdWVzJywgKHBhZ2VzOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgcGFnZVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFnZVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLFxuICAgICAgICAgICAgaW5wdXRXaWRnZXQ6IHBhZ2VTZWxlY3RJbnB1dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHBhZ2VTZWxlY3Qub24oJ2NoYW5nZScsIChzZWxlY3RlZEVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhZ2VzID0gc2VsZWN0ZWRFbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0RGF0YSgpIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZFBhZ2VzID0gc2VsZWN0ZWRQYWdlcy50b1NvcnRlZCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZFBhZ2VzLmpvaW4oJzsnKSAhPT0gc29ydGVkUGFnZXMuam9pbignOycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzLmF0KC0xKSBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkRyYWdnYWJsZUVsZW1lbnQgJiBPTy51aS5FbGVtZW50O1xuXG4gICAgICAgICAgICAgICAgcGFnZVNlbGVjdC5yZW9yZGVyKGxhc3RFbGVtZW50LCBzb3J0ZWRQYWdlcy5pbmRleE9mKGxhc3RFbGVtZW50LmdldERhdGEoKSBhcyBzdHJpbmcpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jYXRlZ29yaXplZFBhZ2VzID0gc29ydGVkUGFnZXM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHsgY2F0ZWdvcml6ZWRQYWdlcyB9ID0gdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBhZ2Ugb2YgY2F0ZWdvcml6ZWRQYWdlcykgcGFnZVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZSk7XG4gICAgICAgIHBhZ2VTZWxlY3Quc2V0VmFsdWUoY2F0ZWdvcml6ZWRQYWdlcyk7XG5cbiAgICAgICAgY29uc3QgcGFnZVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChwYWdlU2VsZWN0LCB7IGFsaWduOiAnaW5saW5lJywgbGFiZWw6ICdQYWdlcyB0byBjYXRlZ29yaXplOicgfSk7XG4gICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5UmVtb3ZlU2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSk7XG4gICAgICAgIGNhdGVnb3J5UmVtb3ZlU2VsZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGNhdGVnb3J5UmVtb3ZlU2VsZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXkNhdGVnb3J5Oi8sICcnKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIGNhdGVnb3J5UmVtb3ZlU2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhdGVnb3J5UmVtb3ZlU2VsZWN0SW5wdXQub24oJ3Nob3dpbmctdmFsdWVzJywgKHBhZ2VzOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgY2F0ZWdvcnlSZW1vdmVTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhZ2UuZGF0YSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGNhdGVnb3J5UmVtb3ZlU2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBpbnB1dFBvc2l0aW9uOiAnb3V0bGluZScsXG4gICAgICAgICAgICBpbnB1dFdpZGdldDogY2F0ZWdvcnlSZW1vdmVTZWxlY3RJbnB1dCxcbiAgICAgICAgfSk7XG4gICAgICAgIGNhdGVnb3J5UmVtb3ZlU2VsZWN0Lm9uKCdjaGFuZ2UnLCAoc2VsZWN0ZWRFbGVtZW50cykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDYXRlZ29yaWVzID0gc2VsZWN0ZWRFbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0RGF0YSgpIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZENhdGVnb3JpZXMgPSBzZWxlY3RlZENhdGVnb3JpZXMudG9Tb3J0ZWQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRDYXRlZ29yaWVzLmpvaW4oJzsnKSAhPT0gc29ydGVkQ2F0ZWdvcmllcy5qb2luKCc7JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMuYXQoLTEpIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uRHJhZ2dhYmxlRWxlbWVudCAmIE9PLnVpLkVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICBjYXRlZ29yeVJlbW92ZVNlbGVjdC5yZW9yZGVyKGxhc3RFbGVtZW50LCBzb3J0ZWRDYXRlZ29yaWVzLmluZGV4T2YobGFzdEVsZW1lbnQuZ2V0RGF0YSgpIGFzIHN0cmluZykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNhdGVnb3JpZXNUb1JlbW92ZSA9IHNvcnRlZENhdGVnb3JpZXM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHsgcGFyZW50czogcGFyZW50Q2F0ZWdvcmllcyB9ID0gdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XTtcblxuICAgICAgICBmb3IgKGNvbnN0IHBhcmVudCBvZiBwYXJlbnRDYXRlZ29yaWVzKSBjYXRlZ29yeVJlbW92ZVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFyZW50KTtcbiAgICAgICAgY2F0ZWdvcnlSZW1vdmVTZWxlY3Quc2V0VmFsdWUocGFyZW50Q2F0ZWdvcmllcyk7XG5cbiAgICAgICAgY29uc3QgY2F0ZWdvcnlSZW1vdmVTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoY2F0ZWdvcnlSZW1vdmVTZWxlY3QsIHtcbiAgICAgICAgICAgIGFsaWduOiAnaW5saW5lJyxcbiAgICAgICAgICAgIGxhYmVsOiAnQ2F0ZWdvcmllcyB0byByZW1vdmUgZnJvbSBwYWdlcyB0byBjYXRlZ29yaXplOicsXG4gICAgICAgIH0pO1xuICAgICAgICBjYXRlZ29yeVJlbW92ZVNlbGVjdExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgY29uc3QgcGFyZW50Q2F0ZWdvcnlTZWxlY3RJbnB1dCA9IG5ldyBDYXRlZ29yeUlucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdBZGQgY2F0ZWdvcmllcyBoZXJlJyB9LCB0cnVlKTtcbiAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gcGFyZW50Q2F0ZWdvcnlTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eQ2F0ZWdvcnk6LywgJycpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgcGFyZW50Q2F0ZWdvcnlTZWxlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICB9KTtcbiAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSBwYXJlbnRDYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcGFyZW50Q2F0ZWdvcnlTZWxlY3QgPSBuZXcgT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJyxcbiAgICAgICAgICAgIGlucHV0V2lkZ2V0OiBwYXJlbnRDYXRlZ29yeVNlbGVjdElucHV0LFxuICAgICAgICB9KTtcbiAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3Qub24oJ2NoYW5nZScsIChzZWxlY3RlZEVsZW1lbnRzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZENhdGVnb3JpZXMgPSBzZWxlY3RlZEVsZW1lbnRzLm1hcCgoZWxlbWVudCkgPT4gZWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKTtcblxuICAgICAgICAgICAgY29uc3Qgc29ydGVkQ2F0ZWdvcmllcyA9IHNlbGVjdGVkQ2F0ZWdvcmllcy50b1NvcnRlZCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGlmIChzZWxlY3RlZENhdGVnb3JpZXMuam9pbignOycpICE9PSBzb3J0ZWRDYXRlZ29yaWVzLmpvaW4oJzsnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50cy5hdCgtMSkgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5EcmFnZ2FibGVFbGVtZW50ICYgT08udWkuRWxlbWVudDtcblxuICAgICAgICAgICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0LnJlb3JkZXIobGFzdEVsZW1lbnQsIHNvcnRlZENhdGVnb3JpZXMuaW5kZXhPZihsYXN0RWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0ucGFyZW50cyA9IHNvcnRlZENhdGVnb3JpZXM7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgcGFyZW50Q2F0ZWdvcnkgb2YgcGFyZW50Q2F0ZWdvcmllcykge1xuICAgICAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKHBhcmVudENhdGVnb3J5KTtcbiAgICAgICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0SW5wdXQudmFsaWRDYXRlZ29yaWVzLmFkZChwYXJlbnRDYXRlZ29yeSk7XG4gICAgICAgIH1cbiAgICAgICAgcGFyZW50Q2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUocGFyZW50Q2F0ZWdvcmllcyk7XG5cbiAgICAgICAgY29uc3QgcGFyZW50Q2F0ZWdvcnlTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQocGFyZW50Q2F0ZWdvcnlTZWxlY3QsIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ1BhcmVudCBjYXRlZ29yaWVzOicgfSk7XG4gICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBjb25zdCBkZW55UmVhc29uID0gbmV3IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jbG9zaW5nLXJlYXNvbi1pbnB1dCddLFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI6ICdhdXRvZmlsbDp1bmxpa2VseScsXG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgWydleGlzdHMnLCAnZXhpc3RpbmcgY2F0ZWdvcmllcyddLFxuICAgICAgICAgICAgICAgIFsnZW1wdHknLCAnZW1wdHkgc3VibWlzc2lvbnMnXSxcbiAgICAgICAgICAgICAgICBbJ3VubGlrZWx5JywgJ2NhdGVnb3JpZXMgdGhhdCBhcmUgdW5saWtlbHkgdG8gaGF2ZSBlbm91Z2ggcGFnZXMnXSxcbiAgICAgICAgICAgICAgICBbJ25vdGNhdGVnb3J5JywgJ3BhZ2UgY3JlYXRpb24gcmVxdWVzdHMnXSxcbiAgICAgICAgICAgICAgICBbJ25vdGVuZ2xpc2gnLCAncmVxdWVzdHMgbm90IGluIEVuZ2xpc2gnXSxcbiAgICAgICAgICAgIF0ubWFwKChbdmFsdWUsIGxhYmVsXSkgPT4gKHsgZGF0YTogYGF1dG9maWxsOiR7dmFsdWV9YCwgbGFiZWw6IGBBdXRvZmlsbGVkIHRleHQgZm9yICR7bGFiZWx9YCB9KSksXG4gICAgICAgIH0pO1xuICAgICAgICBkZW55UmVhc29uLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmRlbnlSZWFzb24gPSBkZW55UmVhc29uLmdldFZhbHVlKCkgfHwgJ2F1dG9maWxsOnVubGlrZWx5JztcbiAgICAgICAgfSk7XG4gICAgICAgIGRlbnlSZWFzb24uc2V0VmFsdWUoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG4gICAgICAgIGRlbnlSZWFzb24uZ2V0TWVudSgpLnNlbGVjdEl0ZW1CeURhdGEoJ2F1dG9maWxsOnVubGlrZWx5Jyk7XG5cbiAgICAgICAgY29uc3QgZGVueVJlYXNvbkxheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChkZW55UmVhc29uLCB7XG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0RlbnkgcmVhc29uOicsXG4gICAgICAgICAgICBoZWxwOiAnU3VwcG9ydHMgYXV0b21hdGljIHJlYXNvbmluZywgY3VzdG9tIHJlYXNvbmluZywgb3IgYSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvIHdpdGggXCJhdXRvZmlsbDpSRUFTT04sIENVU1RPTVwiIGZvcm1hdCcsXG4gICAgICAgIH0pO1xuICAgICAgICBkZW55UmVhc29uTGF5b3V0LiRlbGVtZW50LmhpZGUoKTtcblxuICAgICAgICBjb25zdCBjbG9zaW5nUmVhc29uID0gbmV3IE9PLnVpLkRyb3Bkb3duV2lkZ2V0KHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQnXSxcbiAgICAgICAgICAgIG1lbnU6IHtcbiAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICBbJ05vIHJlc3BvbnNlJywgJ3InXSxcbiAgICAgICAgICAgICAgICAgICAgWydTdWNjZWVkZWQnLCAncyddLFxuICAgICAgICAgICAgICAgICAgICBbJ1dpdGhkcmF3bicsICd3J10sXG4gICAgICAgICAgICAgICAgXS5tYXAoKFt0aXRsZSwgaWRdKSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGE6IGlkLCBsYWJlbDogdGl0bGUgfSkpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLm9uKCdjaG9vc2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3RlZCA9IGNsb3NpbmdSZWFzb24uZ2V0TWVudSgpLmZpbmRTZWxlY3RlZEl0ZW0oKSBhcyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0O1xuXG4gICAgICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNsb3NpbmdSZWFzb24gPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogc2VsZWN0ZWQuZ2V0TGFiZWwoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgaWQ6IHNlbGVjdGVkLmdldERhdGEoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudCwgaW5kZXgpO1xuICAgICAgICB9KTtcbiAgICAgICAgY2xvc2luZ1JlYXNvbi5nZXRNZW51KCkuc2VsZWN0SXRlbUJ5RGF0YSgncicpO1xuICAgICAgICB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNsb3NpbmdSZWFzb24gPSB7IG5hbWU6ICdObyByZXNwb25zZScsIGlkOiAncicgfTtcblxuICAgICAgICBjb25zdCBjbG9zaW5nUmVhc29uTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNsb3NpbmdSZWFzb24sIHsgYWxpZ246ICdpbmxpbmUnLCBsYWJlbDogJ0Nsb3NpbmcgcmVhc29uOicgfSk7XG4gICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnQuaGlkZSgpO1xuXG4gICAgICAgIGNvbnN0IGNvbW1lbnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgY29tbWVudElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gY29tbWVudElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoY29tbWVudCkgdGhpcy5hY3Rpb25zVG9UYWtlW2luZGV4XS5jb21tZW50ID0gY29tbWVudDtcbiAgICAgICAgICAgIGVsc2UgZGVsZXRlIHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY29tbWVudDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY29tbWVudElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGNvbW1lbnRJbnB1dCwge1xuICAgICAgICAgICAgY2xhc3NlczogWydhZmNyYy1jb21tZW50LWlucHV0J10sXG4gICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICBsYWJlbDogJ0NvbW1lbnQ6JyxcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbW1lbnRJbnB1dExheW91dC4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgcmVxdWVzdFJlc3BvbmRlckVsZW1lbnQuYXBwZW5kKFxuICAgICAgICAgICAgYWN0aW9uUmFkaW9JbnB1dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIHBhZ2VTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBjYXRlZ29yeVJlbW92ZVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIHBhcmVudENhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgZGVueVJlYXNvbkxheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIGNsb3NpbmdSZWFzb25MYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICBjb21tZW50SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICk7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuYXBwZW5kKHJlcXVlc3RSZXNwb25kZXJFbGVtZW50KTtcblxuICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQoZGV0YWlsc0VsZW1lbnQpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIGNvbG9yIG9mIGEgZGV0YWlscyBlbGVtZW50IGJhc2VkIG9uIHRoZSBoYW5kbGluZyBvZiB0aGUgcmVxdWVzdHMgaW5zaWRlLlxuICAgICAqIEBwYXJhbSBkZXRhaWxzRWxlbWVudCBUaGUgZGV0YWlscyBlbGVtZW50IHRvIHVwZGF0ZS5cbiAgICAgKiBAcGFyYW0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSByZWRpcmVjdCB0YXJnZXQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZVJlcXVlc3RDb2xvcihkZXRhaWxzRWxlbWVudDogSFRNTERldGFpbHNFbGVtZW50LCBpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHsgYWN0aW9uIH0gPSB0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdO1xuXG4gICAgICAgIGxldCBiYWNrZ3JvdW5kQ29sb3IgPSAnJztcblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9wcmVmZXItc3dpdGNoXG4gICAgICAgIGlmIChhY3Rpb24gPT09ICdhY2NlcHQnKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2EwZmZhMCc7XG4gICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2RlbnknKSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2ZmY2VjZSc7XG4gICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2Nsb3NlJylcbiAgICAgICAgICAgIGlmICh0aGlzLmFjdGlvbnNUb1Rha2VbaW5kZXhdLmNsb3NpbmdSZWFzb24/LmlkID09PSAncicpIGJhY2tncm91bmRDb2xvciA9ICcjZmZjZWNlJztcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuYWN0aW9uc1RvVGFrZVtpbmRleF0uY2xvc2luZ1JlYXNvbj8uaWQgPT09ICdzJykgYmFja2dyb3VuZENvbG9yID0gJyM5MGMwOTAnO1xuICAgICAgICAgICAgZWxzZSBiYWNrZ3JvdW5kQ29sb3IgPSAnI2I4YjhiOCc7XG5cbiAgICAgICAgZGV0YWlsc0VsZW1lbnQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gYmFja2dyb3VuZENvbG9yO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBlcmZvcm1zIGFjdGlvbnMgb24gYSBnaXZlbiBjYXRlZ29yeSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBzaG93QWN0aW9uc0RpYWxvZyBUaGUgZGlhbG9nIHRvIGFkZCBtZXNzYWdlcyB0by5cbiAgICAgKiBAcGFyYW0gY291bnRzIFRoZSBjb3VudCBvYmplY3QgdXNlZCB0byB0cmFjayByZXF1ZXN0cyBmb3IgdGhlIGVkaXQgc3VtbWFyeS5cbiAgICAgKiBAcGFyYW0gbmV3UGFnZVRleHQgVGhlIG5ldyBwYWdlIHRleHQuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFzeW5jIHBlcmZvcm1TdWJ0eXBlQWN0aW9ucyhzaG93QWN0aW9uc0RpYWxvZzogQWN0aW9uc0RpYWxvZywgY291bnRzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+LCBuZXdQYWdlVGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGFueVJlcXVlc3RIYW5kbGVkID0gdGhpcy5hY3Rpb25zVG9UYWtlLnNvbWUoKGFjdGlvbkRhdGEpID0+IGFjdGlvbkRhdGEuYWN0aW9uICE9PSAnbm9uZScpO1xuXG4gICAgICAgIGlmIChhbnlSZXF1ZXN0SGFuZGxlZCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhY3Rpb25EYXRhIG9mIHRoaXMuYWN0aW9uc1RvVGFrZSkge1xuICAgICAgICAgICAgICAgIGxldCBzZWN0aW9uRGF0YSA9IHsgcGFnZVRleHQ6IG5ld1BhZ2VUZXh0LCAuLi5hY3Rpb25EYXRhLm9yaWdpbmFsVGV4dCB9O1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoIChhY3Rpb25EYXRhLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdhY2NlcHQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kOiAne3tBZkMtY3xhfX0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogJyoge3tzdWJzdDpBZkMgY2F0ZWdvcnl9fSB+fn5+XFxue3tBZkMtY3xifX0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQWNjZXB0ZWRDYXRlZ29yeShhY3Rpb25EYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzLmFjY2VwdGVkKys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RlbnknOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uRGF0YSA9IHRoaXMubW9kaWZ5U2VjdGlvbkRhdGEoc2VjdGlvbkRhdGEsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVwZW5kOiAne3tBZkMtY3xkfX0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogYCogJHt0aGlzLmZvcm1hdERlbmllZFJlYXNvbihhY3Rpb25EYXRhLmRlbnlSZWFzb24hKX0gfn5+flxcbnt7QWZDLWN8Yn19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHMuZGVuaWVkKys7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uRGF0YS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZDogYCoge3tBZkMgY29tbWVudHwxPSR7YWN0aW9uRGF0YS5jb21tZW50fX19IH5+fn5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzWydjb21tZW50ZWQgb24nXSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUaGUgcmVxdWVzdCB0byBjcmVhdGUgXCIke2FjdGlvbkRhdGEuY2F0ZWdvcnl9XCIgd2FzIG1hcmtlZCB0byBiZSBjb21tZW50ZWQgb24sIGJ1dCBubyBjb21tZW50IHdhcyBwcm92aWRlZCBzbyBpdCB3aWxsIGJlIHNraXBwZWQuYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dhcm5pbmcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Nsb3NlJzoge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkRhdGEgPSB0aGlzLm1vZGlmeVNlY3Rpb25EYXRhKHNlY3Rpb25EYXRhLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGVuZDogYHt7QWZDLWN8JHthY3Rpb25EYXRhLmNsb3NpbmdSZWFzb24hLmlkfX19YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ6IChhY3Rpb25EYXRhLmNvbW1lbnQgPyBgKiB7e0FmQyBjb21tZW50fDE9JHthY3Rpb25EYXRhLmNvbW1lbnR9fX0gfn5+fmAgOiAnJykgKyAnXFxue3tBZkMtY3xifX0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50cy5jbG9zZWQrKztcblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBuZXdQYWdlVGV4dCA9IHNlY3Rpb25EYXRhLnBhZ2VUZXh0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5iZWZvcmVUZXh0ICsgdGhpcy5wYWdlQ29udGVudCA9PT0gbmV3UGFnZVRleHQpIHtcbiAgICAgICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQgKHBhZ2UgY29udGVudCBpZGVudGljYWwpIScpO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBtYXBwZWRDb3VudHMgPSBPYmplY3QuZW50cmllcyhjb3VudHMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoWywgY291bnRdKSA9PiBjb3VudCA+IDApXG4gICAgICAgICAgICAgICAgLm1hcCgoW2FjdGlvbiwgY291bnRdKSA9PiBgJHthY3Rpb259ICR7Y291bnR9YClcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcblxuICAgICAgICAgICAgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5wdXNoKHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZWRpdCcsXG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogbmV3UGFnZVRleHQsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBIYW5kbGluZyBBZkMgY2F0ZWdvcnkgcmVxdWVzdHMgKCR7bWFwcGVkQ291bnRzfSkke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHRoaXMubWFrZUFsbEVkaXRzQ3JlYXRpb25zKHNob3dBY3Rpb25zRGlhbG9nKTtcblxuICAgICAgICAgICAgc2hvd0FjdGlvbnNEaWFsb2cuYWRkTG9nRW50cnkoJ0FsbCBjaGFuZ2VzIG1hZGUsIGNsaWNrIGJlbG93IHRvIHJlbG9hZCEnLCAnc3VjY2VzcycpO1xuXG4gICAgICAgICAgICBzaG93QWN0aW9uc0RpYWxvZy5zaG93UmVsb2FkKCk7XG4gICAgICAgIH0gZWxzZSBzaG93QWN0aW9uc0RpYWxvZy5hZGRMb2dFbnRyeSgnTm8gcmVxdWVzdHMgaGF2ZSBiZWVuIGhhbmRsZWQhJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyB0aGUgY3JlYXRpb24gb2YgcGFnZXMgcmVsYXRlZCB0byBhbiBhY2NlcHRlZCBjYXRlZ29yeSByZXF1ZXN0LlxuICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIG9mIHRoZSByZXF1ZXN0ZWQgY2F0ZWdvcnkuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGhhbmRsZUFjY2VwdGVkQ2F0ZWdvcnkoZGF0YTogQ2F0ZWdvcnlBY3Rpb24pIHtcbiAgICAgICAgdGhpcy5lZGl0c0NyZWF0aW9uc1RvTWFrZS5wdXNoKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdjcmVhdGUnLFxuICAgICAgICAgICAgICAgIGlzUmVkaXJlY3Q6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpdGxlOiBgQ2F0ZWdvcnk6JHtkYXRhLmNhdGVnb3J5fWAsXG4gICAgICAgICAgICAgICAgdGV4dDogZGF0YS5wYXJlbnRzLm1hcCgocGFyZW50KSA9PiBgW1tDYXRlZ29yeToke3BhcmVudH1dXWApLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IGBDcmVhdGluZyBjYXRlZ29yeSBhcyByZXF1ZXN0ZWQgYXQgW1tXUDpBRkMvQ11dJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogJ2NyZWF0ZScsXG4gICAgICAgICAgICAgICAgaXNSZWRpcmVjdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgdGl0bGU6IGBDYXRlZ29yeSB0YWxrOiR7ZGF0YS5jYXRlZ29yeX1gLFxuICAgICAgICAgICAgICAgIHRleHQ6IGB7e1dpa2lQcm9qZWN0IGJhbm5lciBzaGVsbHxcXG57e1dpa2lQcm9qZWN0IEFydGljbGVzIGZvciBjcmVhdGlvbnx0cz17e3N1YnN0OkxPQ0FMVElNRVNUQU1QfX18cmV2aWV3ZXI9JHttdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJyl9fX1cXG59fWAsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogYEFkZGluZyBbW1dpa2lwZWRpYTpXaWtpUHJvamVjdCBBcnRpY2xlcyBmb3IgY3JlYXRpb258V2lraVByb2plY3QgQXJ0aWNsZXMgZm9yIGNyZWF0aW9uXV0gYmFubmVyJHt0aGlzLnNjcmlwdE1lc3NhZ2V9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5kYXRhLmNhdGVnb3JpemVkUGFnZXMubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlZGl0JyBhcyBjb25zdCxcbiAgICAgICAgICAgICAgICB0aXRsZTogcGFnZSxcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06ICh7IGNvbnRlbnQgfTogeyBjb250ZW50OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlkUmVwbGFjZUNhdGVnb3J5ID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvKChcXFtcXFs6P1tDY11hdGVnb3J5Oi4rP11dXFxuPykrKS8sIChtYXRjaCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlkUmVwbGFjZUNhdGVnb3J5ID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hFbmRzV2l0aE5ld2xpbmUgPSBtYXRjaC5lbmRzV2l0aCgnXFxuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHttYXRjaH0ke21hdGNoRW5kc1dpdGhOZXdsaW5lID8gJycgOiAnXFxuJ31bW0NhdGVnb3J5OiR7ZGF0YS5jYXRlZ29yeX1dXSR7bWF0Y2hFbmRzV2l0aE5ld2xpbmUgPyAnXFxuJyA6ICcnfWA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZGlkUmVwbGFjZUNhdGVnb3J5KSBjb250ZW50ICs9IGBcXG5bW0NhdGVnb3J5OiR7ZGF0YS5jYXRlZ29yeX1dXWA7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvblxuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgZGF0YS5jYXRlZ29yaWVzVG9SZW1vdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKG5ldyBSZWdFeHAoYFxcXFxbXFxcXFs6P1tDY11hdGVnb3J5OiR7Y2F0ZWdvcnl9KFxcXFx8Lio/KT9cXFxcXVxcXFxdXFxuP2AsICdnaScpLCAnJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiBgQWRkaW5nIHBhZ2UgdG8gW1s6Q2F0ZWdvcnk6JHtkYXRhLmNhdGVnb3J5fV1dIGFzIHJlcXVlc3RlZCBhdCBbW1dQOkFGQy9DXV0ke3RoaXMuc2NyaXB0TWVzc2FnZX1gLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSksXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwgImJvZHkuYWZjcmMtaGVscGVyLW9wZW4gI213LXRlbGVwb3J0LXRhcmdldHt6LWluZGV4OjUwMH0uYWZjcmMtaGVscGVyLXJlcXVlc3R7bWFyZ2luOjEwcHg7Ym9yZGVyLXJhZGl1czo1cHg7YmFja2dyb3VuZC1jb2xvcjojZWVlO3BhZGRpbmc6NXB4O2NvbG9yOiMyMDIxMjJ9LmFmY3JjLWhlbHBlci1yZXF1ZXN0IHN1bW1hcnl7Y3Vyc29yOnBvaW50ZXJ9LmFmY3JjLWhlbHBlci10YXJnZXQtZWRpdG9ye21pbi13aWR0aDoxY2g7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDRjaCk7Zm9udC1mYW1pbHk6bW9ub3NwYWNlfS5hZmNyYy1oZWxwZXItZXh0ZXJuYWwtbGlua3std2Via2l0LXRleHQtZGVjb3JhdGlvbjpub25lIWltcG9ydGFudDt0ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnR9LmFmY3JjLWhlbHBlci1leHRlcm5hbC1saW5rIHN2Z3tkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxZW07aGVpZ2h0OjFlbTtmaWxsOmN1cnJlbnRjb2xvcn0uYWZjcmMtaGVscGVyLXJlcXVlc3QtaW5mbywuYWZjcmMtaGVscGVyLXJlcXVlc3QtcmVzcG9uZGVye21hcmdpbjo1cHh9LmFmY3JjLWhlbHBlci1yZXF1ZXN0LWluZm8+ZGl2LC5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXI+ZGl2e21hcmdpbi10b3A6OHB4O21hcmdpbi1ib3R0b206OHB4fS5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXI+ZGl2Omxhc3Qtb2YtdHlwZXttYXJnaW4tYm90dG9tOjB9LmFmY3JjLWhlbHBlci1yZXF1ZXN0LXJlc3BvbmRlciAub28tdWktZmllbGRMYXlvdXR7bWFyZ2luLWxlZnQ6OHB4fS5hZmNyYy1oZWxwZXItcmVxdWVzdC1yZXNwb25kZXIgLm9vLXVpLWZpZWxkTGF5b3V0LWhlYWRlcnt3aWR0aDotbW96LW1heC1jb250ZW50O3dpZHRoOm1heC1jb250ZW50fS5hZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlve21hcmdpbi10b3A6OHB4fS5hZmNyYy1oZWxwZXItYWN0aW9uLXJhZGlvIC5vby11aS1yYWRpb09wdGlvbldpZGdldHtkaXNwbGF5OmlubGluZTtwYWRkaW5nOjhweH0uYWZjcmMtY2xvc2luZy1yZWFzb24taW5wdXQsLmFmY3JjLWNvbW1lbnQtaW5wdXR7bWF4LXdpZHRoOjUwJX0uYWZjcmMtaGVscGVyLXJlZGlyZWN0LXBvc3NpYmlsaXRpZXM6YWZ0ZXJ7Y29udGVudDpcIiAocmVkaXJlY3Qgd2l0aCBwb3NzaWJpbGl0aWVzKVwiO2ZvbnQtc3R5bGU6aXRhbGljfS5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIsLmFmY3JjLWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxze21hcmdpbi10b3A6MTBweDttYXJnaW4tYm90dG9tOjEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjYTJhOWIxO2JvcmRlci1yYWRpdXM6MnB4O2JhY2tncm91bmQtY29sb3I6I2ZmZjtwYWRkaW5nOjVweH0uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVye21hcmdpbi1sZWZ0OjhweH0uYWZjcmMtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIHN1bW1hcnl7Y3Vyc29yOnBvaW50ZXI7Zm9udC13ZWlnaHQ6NzAwfS5hZmNyYy1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlsc3ttYXJnaW4tdG9wOjVweDttYXJnaW4tYm90dG9tOjVweDtiYWNrZ3JvdW5kLWNvbG9yOiNlMmUyZTJ9I2FmY3JjLWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZXtwYWRkaW5nOjVweH0uYWZjcmMtaGVscGVyLWFjdGlvbnMtY29udGFpbmVyIGRpdnttYXJnaW4tdG9wOjhweDttYXJnaW4tYm90dG9tOjhweH1cbiIsICJpbXBvcnQgY3NzQ29udGVudCBmcm9tICcuLi8uLi9zdHlsZXMvYWZjcmMtaGVscGVyLmNzcycgd2l0aCB7IHR5cGU6ICdjc3MnIH07XG5cbmV4cG9ydCB0eXBlIFdhdGNoTWV0aG9kID0gJ25vY2hhbmdlJyB8ICdwcmVmZXJlbmNlcycgfCAndW53YXRjaCcgfCAnd2F0Y2gnO1xuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIGFmY3JjQ29uZmlndXJhdGlvbj86IHsgY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZD86IFdhdGNoTWV0aG9kIH07XG4gICAgfVxufVxuXG5tdy5sb2FkZXIudXNpbmcoWydtZWRpYXdpa2kudXRpbCcsICdvb2pzLXVpLWNvcmUnLCAnb29qcy11aS13aWRnZXRzJywgJ29vanMtdWktd2luZG93cyddLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBkZWZhdWx0OiBSZWRpcmVjdHNEaWFsb2cgfSA9IGF3YWl0IGltcG9ydCgnLi9yZWRpcmVjdHMtZGlhbG9nJyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgY29uc3QgeyBkZWZhdWx0OiBDYXRlZ29yaWVzRGlhbG9nIH0gPSBhd2FpdCBpbXBvcnQoJy4vY2F0ZWdvcmllcy1kaWFsb2cnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cblxuICAgIGNvbnN0IHBhZ2VOYW1lID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgY29uc3QgaXNSZWRpcmVjdFJlcXVlc3RQYWdlID0gcGFnZU5hbWUgPT09ICdXaWtpcGVkaWE6QXJ0aWNsZXMgZm9yIGNyZWF0aW9uL1JlZGlyZWN0cyc7XG4gICAgY29uc3QgaXNDYXRlZ29yeVJlcXVlc3RQYWdlID0gcGFnZU5hbWUgPT09ICdXaWtpcGVkaWE6QXJ0aWNsZXMgZm9yIGNyZWF0aW9uL0NhdGVnb3JpZXMnO1xuXG4gICAgaWYgKCFpc1JlZGlyZWN0UmVxdWVzdFBhZ2UgJiYgIWlzQ2F0ZWdvcnlSZXF1ZXN0UGFnZSkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVxdWVzdFBhZ2VUeXBlID0gaXNSZWRpcmVjdFJlcXVlc3RQYWdlID8gJ3JlZGlyZWN0JyA6ICdjYXRlZ29yeSc7XG5cbiAgICBjb25zdCBsaW5rID0gbXcudXRpbC5hZGRQb3J0bGV0TGluayhcbiAgICAgICAgbXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC10YicgOiAncC1jYWN0aW9ucycsXG4gICAgICAgICcjJyxcbiAgICAgICAgYEhhbmRsZSAke3JlcXVlc3RQYWdlVHlwZX0gY3JlYXRpb24gcmVxdWVzdHNgLFxuICAgICAgICAnYWZjcmMtaGVscGVyJyxcbiAgICApITtcblxuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBtdy51dGlsLmFkZENTUyhjc3NDb250ZW50KTtcblxuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgY29uc3QgaGVscGVyID0gcmVxdWVzdFBhZ2VUeXBlID09PSAncmVkaXJlY3QnID8gUmVkaXJlY3RzRGlhbG9nIDogQ2F0ZWdvcmllc0RpYWxvZztcblxuICAgICAgICBjb25zdCBhZmNyY0hlbHBlckRpYWxvZyA9IG5ldyBoZWxwZXIocmVxdWVzdFBhZ2VUeXBlLCBwYWdlTmFtZSwgd2luZG93LmFmY3JjQ29uZmlndXJhdGlvbj8uY3JlYXRlZFBhZ2VXYXRjaE1ldGhvZCk7XG5cbiAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFthZmNyY0hlbHBlckRpYWxvZ10pO1xuXG4gICAgICAgIGFmY3JjSGVscGVyRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgdm9pZCBhZmNyY0hlbHBlckRpYWxvZy5sb2FkKCk7XG4gICAgfSk7XG59KTtcbiJd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c19kaWFsb2ciLCAiX19lc21NaW4iLCAiX0FjdGlvbnNEaWFsb2ciLCAibWVzc2FnZSIsICJ0eXBlIiwgIm1lc3NhZ2VXaWRnZXQiLCAicmVsb2FkQnV0dG9uIiwgIkhlbHBlckRpYWxvZyIsICJpbml0X2hlbHBlcl9kaWFsb2ciLCAiX19lc21NaW4iLCAiaW5pdF9zaG93X2FjdGlvbnNfZGlhbG9nIiwgIl9IZWxwZXJEaWFsb2ciLCAicmVxdWVzdFBhZ2VUeXBlIiwgInBhZ2VUaXRsZSIsICJjcmVhdGVkV2F0Y2hNZXRob2QiLCAiYWN0aW9uIiwgImNvbmZpcm1lZCIsICJwYWdlUmV2aXNpb24iLCAic2VjdGlvbnMiLCAibWF0Y2giLCAic2VjdGlvblRleHQiLCAic2VjdGlvbkhlYWRlciIsICJpbmRleCIsICJoYW5kbGUiLCAiZW5kSW5kZXgiLCAic3ViSW5kZXgiLCAibWVzc2FnZVdpZGdldCIsICJtZXNzYWdlV2lkZ2V0TGF5b3V0IiwgIndpbmRvd01hbmFnZXIiLCAic2hvd0FjdGlvbnNEaWFsb2ciLCAiQWN0aW9uc0RpYWxvZyIsICJjb3VudHMiLCAibmV3UGFnZVRleHQiLCAicmVhc29uIiwgInRlbXBsYXRlUGFyYW1ldGVycyIsICJhZGRpdGlvbmFsUmVhc29uaW5nIiwgImRlbmllZFBhZ2VzIiwgInNpbmd1bGFyUmVxdWVzdCIsICJhbGxSZXF1ZXN0cyIsICJyZWFzb25zIiwgInBhZ2UiLCAicmVhc29uc0FycmF5IiwgInBhZ2VzIiwgImNvbW1lbnRzIiwgImNvbW1lbnRNZXNzYWdlcyIsICJjb21tZW50IiwgImNvbW1lbnRzQXJyYXkiLCAic2VjdGlvbkRhdGEiLCAicHJlcGVuZCIsICJhcHBlbmQiLCAib2xkRnVsbFNlY3Rpb25UZXh0IiwgIm9sZFNlY3Rpb25UZXh0IiwgImFwaUZ1bmN0aW9uIiwgImxpbmtFbGVtZW50IiwgImFjdGlvblJlc3VsdEVsZW1lbnRJZCIsICJyZXN1bHQiLCAiYWN0aW9uUmVzdWx0RWxlbWVudCIsICJlcnJvckNvZGUiLCAiZXJyb3JJbmZvIiwgInJlc29sdmUiLCAiZGV0YWlsc0VsZW1lbnQiLCAiZGlhbG9nIiwgIlJlZGlyZWN0UmVxdWVzdEhhbmRsZXIiLCAiaW5pdF9yZWRpcmVjdF9yZXF1ZXN0X2hhbmRsZXIiLCAiX19lc21NaW4iLCAidGl0bGVJbmRleCIsICJ0aXRsZSIsICJkZXRhaWxzRWxlbWVudCIsICJyZXNwb25kZXJFbGVtZW50IiwgImRpYWxvZyIsICJyZXF1ZXN0ZWRUaXRsZURpdiIsICJsYWJlbCIsICJhY3Rpb25SYWRpb0lucHV0IiwgInNlbGVjdGVkIiwgIm9wdGlvbiIsICJjb21tZW50IiwgInRhZ1NlbGVjdCIsICJ0YWciLCAicmVkaXJlY3QiLCAic2VsZWN0ZWRFbGVtZW50cyIsICJzZWxlY3RlZFRhZ3MiLCAiZWxlbWVudCIsICJzb3J0ZWRUYWdzIiwgImEiLCAiYiIsICJsYXN0RWxlbWVudCIsICJzaG93blRlbXBsYXRlRWRpdG9ycyIsICJlZGl0b3JJbmZvIiwgImlzVGFnU2VsZWN0ZWQiLCAic3VtbWFyeUVsZW1lbnQiLCAibm9UZW1wbGF0ZXNNZXNzYWdlIiwgInRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZURhdGEiLCAicGFyYW1ldGVycyIsICJkZXRhaWxzIiwgInN1bW1hcnkiLCAiZWxlbWVudERhdGEiLCAicGFyYW1ldGVyTmFtZSIsICJwYXJhbWV0ZXJEYXRhIiwgImlucHV0IiwgImlucHV0TGF5b3V0IiwgImRlbnlSZWFzb25JbnB1dCIsICJ2YWx1ZSIsICJjbG9zaW5nUmVhc29uRHJvcGRvd24iLCAiaWQiLCAidXBkYXRlIiwgInJlZGlyZWN0c19kaWFsb2dfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJSZWRpcmVjdHNEaWFsb2ciLCAiaW5pdF9yZWRpcmVjdHNfZGlhbG9nIiwgIl9fZXNtTWluIiwgImluaXRfaGVscGVyX2RpYWxvZyIsICJpbml0X3JlZGlyZWN0X3JlcXVlc3RfaGFuZGxlciIsICJIZWxwZXJEaWFsb2ciLCAicmVkaXJlY3RUZW1wbGF0ZVJlc3BvbnNlIiwgInNlY3Rpb25UZXh0IiwgInNlY3Rpb25IZWFkZXIiLCAicGFyc2VkRGF0YSIsICJyZXF1ZXN0ZWRQYWdlcyIsICJtYXRjaCIsICJwYXJzZWRUYXJnZXQiLCAicmVxdWVzdGVyIiwgIm5hbWUiLCAicGFnZSIsICJpbmRleCIsICJyZXF1ZXN0IiwgImRldGFpbHNFbGVtZW50IiwgInN1bW1hcnlFbGVtZW50IiwgImV2ZW50IiwgInRhcmdldEVkaXRvckVsZW1lbnQiLCAibGlua0VsZW1lbnQiLCAicmVxdWVzdEluZm9FbGVtZW50IiwgIm5vbmVFbGVtZW50IiwgInVua25vd25FbGVtZW50IiwgInJlYXNvbkRpdiIsICJyZWFzb25MYWJlbCIsICJzb3VyY2VEaXYiLCAic291cmNlTGFiZWwiLCAicmVxdWVzdGVyRGl2IiwgInJlcXVlc3RlckxhYmVsIiwgInJlcXVlc3RlckxpbmsiLCAicmVxdWVzdFJlc3BvbmRlckVsZW1lbnQiLCAicmVxdWVzdGVkVGl0bGUiLCAiUmVkaXJlY3RSZXF1ZXN0SGFuZGxlciIsICJhY3Rpb25zVG9UYWtlIiwgImFsbFJlcXVlc3RzQWNjZXB0ZWREZW5pZWQiLCAiYWN0aW9uIiwgImZpcnN0Q2xvc2VSZWFzb24iLCAiYWxsUmVxdWVzdHNDbG9zZWQiLCAiYmFja2dyb3VuZENvbG9yIiwgImFjY2VwdGVkQ291bnQiLCAiZGVuaWVkQ291bnQiLCAic2hvd0FjdGlvbnNEaWFsb2ciLCAiY291bnRzIiwgIm5ld1BhZ2VUZXh0IiwgImFjdGlvbkRhdGEiLCAidGFyZ2V0IiwgInJlcXVlc3RzIiwgInNvbWVSZXF1ZXN0QWNjZXB0ZWREZW5pZWQiLCAiYWNjZXB0ZWRQYWdlcyIsICJkZW5pZWRQYWdlcyIsICJjb21tZW50cyIsICJhbW91bnRPZlBhZ2VzIiwgInNlY3Rpb25EYXRhIiwgImNsb3NpbmdJZCIsICJhY2NlcHRlZFBhZ2VzTWVzc2FnZSIsICJkZW5pZWRQYWdlc01lc3NhZ2UiLCAibWFwcGVkQ291bnRzIiwgImNvdW50IiwgImRhdGEiLCAidGFnc1dpdGhBcmd1bWVudHMiLCAidGFnIiwgImZvdW5kQXJndW1lbnRFZGl0b3IiLCAiZWRpdG9ySW5mbyIsICJsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXgiLCAicGFyYW1ldGVyIiwgIm1hcHBlZEFyZ3VtZW50cyIsICJ2YWx1ZSIsICJ0aXRsZSIsICJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgImluaXRfY2F0ZWdvcnlfaW5wdXRfd2lkZ2V0IiwgIl9fZXNtTWluIiwgImNvbmZpZyIsICJzdXBwb3J0c1NvcnRLZXkiLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAic29ydEtleSIsICJyZXNwb25zZSIsICJwYXJzZWRUaXRsZSIsICJyZXN1bHQiLCAicGFnZXMiLCAicGFnZSIsICJjYXRlZ29yeSIsICJ0aXRsZVdpdGhvdXROYW1lc3BhY2UiLCAiZGF0YSIsICJsYWJlbCIsICJQYWdlSW5wdXRXaWRnZXQiLCAiaW5pdF9wYWdlX2lucHV0X3dpZGdldCIsICJfX2VzbU1pbiIsICJjb25maWciLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAicGFyc2VkVGl0bGUiLCAicmVzdWx0IiwgInBhZ2VzIiwgInBhZ2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJjYXRlZ29yaWVzX2RpYWxvZ19leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkNhdGVnb3JpZXNEaWFsb2ciLCAiaW5pdF9jYXRlZ29yaWVzX2RpYWxvZyIsICJfX2VzbU1pbiIsICJpbml0X2NhdGVnb3J5X2lucHV0X3dpZGdldCIsICJpbml0X2hlbHBlcl9kaWFsb2ciLCAiaW5pdF9wYWdlX2lucHV0X3dpZGdldCIsICJIZWxwZXJEaWFsb2ciLCAic2VjdGlvblRleHQiLCAic2VjdGlvbkhlYWRlciIsICJwYXJzZWREYXRhIiwgImZvdW5kQ2F0ZWdvcnkiLCAibWF0Y2giLCAiZmlyc3RVc2VySW5kZXgiLCAiZmlyc3RVc2VyVGFsa0luZGV4IiwgImZpcnN0SXBJbmRleCIsICJmaXJzdEluZGV4IiwgImluZGV4IiwgInJlcXVlc3QiLCAiZGV0YWlsc0VsZW1lbnQiLCAic3VtbWFyeUVsZW1lbnQiLCAicmVxdWVzdEluZm9FbGVtZW50IiwgIm5vbmVFbGVtZW50IiwgInVua25vd25FbGVtZW50IiwgImV4YW1wbGVzRGl2IiwgImV4YW1wbGVzTGFiZWwiLCAiZXhhbXBsZSIsICJsaW5rRWxlbWVudCIsICJwYXJlbnRzRGl2IiwgInBhcmVudHNMYWJlbCIsICJwYXJlbnQiLCAicmVxdWVzdGVyRGl2IiwgInJlcXVlc3RlckxhYmVsIiwgInJlcXVlc3RlckxpbmsiLCAicmVxdWVzdFJlc3BvbmRlckVsZW1lbnQiLCAiYWN0aW9uUmFkaW9JbnB1dCIsICJsYWJlbCIsICJvcHRpb24iLCAiY29tbWVudElucHV0TGF5b3V0IiwgImNvbW1lbnQiLCAiY29tbWVudElucHV0IiwgInBhZ2VTZWxlY3RMYXlvdXQiLCAiY2F0ZWdvcnlSZW1vdmVTZWxlY3RMYXlvdXQiLCAicGFyZW50Q2F0ZWdvcnlTZWxlY3RMYXlvdXQiLCAiZGVueVJlYXNvbkxheW91dCIsICJjbG9zaW5nUmVhc29uTGF5b3V0IiwgInBhZ2VTZWxlY3RJbnB1dCIsICJQYWdlSW5wdXRXaWRnZXQiLCAidmFsdWUiLCAicGFnZXMiLCAicGFnZSIsICJwYWdlU2VsZWN0IiwgInNlbGVjdGVkRWxlbWVudHMiLCAic2VsZWN0ZWRQYWdlcyIsICJlbGVtZW50IiwgInNvcnRlZFBhZ2VzIiwgImEiLCAiYiIsICJsYXN0RWxlbWVudCIsICJjYXRlZ29yaXplZFBhZ2VzIiwgImNhdGVnb3J5UmVtb3ZlU2VsZWN0SW5wdXQiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJjYXRlZ29yeVJlbW92ZVNlbGVjdCIsICJzZWxlY3RlZENhdGVnb3JpZXMiLCAic29ydGVkQ2F0ZWdvcmllcyIsICJwYXJlbnRDYXRlZ29yaWVzIiwgInBhcmVudENhdGVnb3J5U2VsZWN0SW5wdXQiLCAicGFyZW50Q2F0ZWdvcnlTZWxlY3QiLCAicGFyZW50Q2F0ZWdvcnkiLCAiZGVueVJlYXNvbiIsICJjbG9zaW5nUmVhc29uIiwgInRpdGxlIiwgImlkIiwgInNlbGVjdGVkIiwgImFjdGlvbiIsICJiYWNrZ3JvdW5kQ29sb3IiLCAic2hvd0FjdGlvbnNEaWFsb2ciLCAiY291bnRzIiwgIm5ld1BhZ2VUZXh0IiwgImFjdGlvbkRhdGEiLCAic2VjdGlvbkRhdGEiLCAibWFwcGVkQ291bnRzIiwgImNvdW50IiwgImRhdGEiLCAiY29udGVudCIsICJkaWRSZXBsYWNlQ2F0ZWdvcnkiLCAibWF0Y2hFbmRzV2l0aE5ld2xpbmUiLCAiY2F0ZWdvcnkiLCAiYWZjcmNfaGVscGVyX2RlZmF1bHQiLCAiUmVkaXJlY3RzRGlhbG9nIiwgIkNhdGVnb3JpZXNEaWFsb2ciLCAicGFnZU5hbWUiLCAiaXNSZWRpcmVjdFJlcXVlc3RQYWdlIiwgInJlcXVlc3RQYWdlVHlwZSIsICJldmVudCIsICJhZmNyY19oZWxwZXJfZGVmYXVsdCIsICJ3aW5kb3dNYW5hZ2VyIiwgImhlbHBlciIsICJhZmNyY0hlbHBlckRpYWxvZyJdCn0K