User:Eejit43/scripts/redirect-helper.js
Appearance
< User:Eejit43 | scripts
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | This user script seems to have a documentation page at User:Eejit43/scripts/redirect-helper. |
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/redirect-helper.ts
"use strict";mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","oojs-ui.styles.icons-content","oojs-ui.styles.icons-editing-core"],()=>{class x extends OO.ui.TextInputWidget{api=new mw.Api;pageTitleParsed;constructor(t,i){super(t),OO.ui.mixin.LookupElement.call(this,t),this.pageTitleParsed=i}getLookupRequest=()=>{const t=this.getValue(),i=$.Deferred();if(!t)i.resolve([]);else if(t.includes("#")){const e=t.split("#")[0];this.api.get({action:"parse",page:e,prop:"sections",redirects:!0}).catch(()=>null).then(a=>{if(a){const r=a.parse.sections.filter(s=>s.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(t.split("#")[1].toLowerCase()));i.resolve(r.map(s=>({data:`${a.parse.title}#${s.line.replaceAll(/<\/?i>/g,"")}`,label:`${a.parse.title}#${s.line.replaceAll(/<\/?i>/g,"")}`})))}else i.resolve([])})}else{const e=mw.Title.newFromText(t);this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:e?.getNamespaceId()??0,gapprefix:e?.getMainText()??t,generator:"allpages",prop:["info","pageprops"]}).catch(()=>null).then(a=>{a?i.resolve(a.query?.pages?a.query.pages.filter(r=>r.title!==this.pageTitleParsed.toString()).map(r=>({data:r.title,label:new OO.ui.HtmlSnippet(`${r.title}${r.pageprops&&"disambiguation"in r.pageprops?" <i>(disambiguation)</i>":""}${"redirect"in r?" <i>(redirect)</i>":""}`)})):[]):i.resolve([])})}return i.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:i,label:e})=>new OO.ui.MenuOptionWidget({data:i,label:e}))}Object.assign(x.prototype,OO.ui.mixin.LookupElement.prototype);class O extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{const t=this.getValue(),i=$.Deferred();t||i.resolve([]);const e=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:e?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(a=>{if(a?.query?.pages){const r=a.query.pages.filter(s=>!s.categories?.some(o=>o.title==="Category:Wikipedia soft redirected categories")).map(s=>{const o=s.title.split(":")[1];return{data:o,label:o}});this.emit("showing-values",r),i.resolve(r)}else i.resolve([])}),i.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:i,label:e})=>new OO.ui.MenuOptionWidget({data:i,label:e}))}Object.assign(O.prototype,OO.ui.mixin.LookupElement.prototype);class f extends OO.ui.ProcessDialog{api=new mw.Api;pageTitleParsed;constructor(t,i){super(t),this.pageTitleParsed=i,f.static.name="TemplatePreviewDialog",f.static.title="Redirect categorization templates preview",f.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>f.super.prototype.getSetupProcess.call(this).next(()=>this.api.post({action:"parse",formatversion:"2",contentmodel:"wikitext",prop:["text","categorieshtml"],title:this.pageTitleParsed.getPrefixedDb(),text:this.getData()}).then(t=>{const i=t.parse.text,e=t.parse.categorieshtml,a=new OO.ui.PanelLayout({padded:!0,expanded:!1});a.$element.append(i,e),this.$body.append(a.$element)}));getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):f.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>f.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})}Object.assign(f.prototype,OO.ui.ProcessDialog.prototype);class y extends OO.ui.ProcessDialog{api=new mw.Api;constructor(t){super(t),y.static.name="ShowChangesDialog",y.static.title="Changes to be made",y.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>y.super.prototype.getSetupProcess.call(this).next(()=>{const[t,i]=this.getData();return this.api.post({action:"compare",formatversion:"2",prop:["diff"],fromslots:"main","fromtext-main":t,"fromcontentmodel-main":"wikitext",toslots:"main","totext-main":i,"tocontentmodel-main":"wikitext"}).then(e=>{const a=e.compare.body,r=new OO.ui.MessageWidget({type:"warning",label:"No changes to make!"}),s=new OO.ui.PanelLayout({padded:!0,expanded:!1});s.$element.append(a?`
<table class="diff diff-editfont-monospace">
<colgroup>
<col class="diff-marker">
<col class="diff-content">
<col class="diff-marker">
<col class="diff-content">
</colgroup>
<tbody>
${a}
</tbody>
</table>`:r.$element[0]),this.$body.append(s.$element)})});getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):y.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>y.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})}Object.assign(y.prototype,OO.ui.ProcessDialog.prototype);class v{api=new mw.Api;redirectTemplates;contentText;pageTitle;pageTitleParsed;async run(){if(this.passesPreChecks()){if(this.redirectTemplates=await this.fetchRedirectTemplates(),this.contentText=document.querySelector("#mw-content-text"),!this.contentText)return mw.notify("redirect-helper: Failed to find content text element!",{type:"error"});if(this.pageTitle=mw.config.get("wgPageName"),this.pageTitleParsed=mw.Title.newFromText(this.pageTitle),!this.pageTitleParsed)return mw.notify("redirect-helper: Failed to parse page title!",{type:"error"});await this.checkPageAndLoad()}}passesPreChecks(){return[mw.config.get("wgNamespaceNumber")>=0,mw.config.get("wgIsProbablyEditable"),mw.config.get("wgIsArticle"),mw.config.get("wgAction")==="view",mw.config.get("wgRevisionId")===mw.config.get("wgCurRevisionId"),!mw.config.get("wgDiffOldId")].every(Boolean)}async fetchRedirectTemplates(){return JSON.parse((await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:"User:Eejit43/scripts/redirect-helper.json"})).query.pages?.[0]?.revisions?.[0]?.slots?.main?.content||"{}")}async checkPageAndLoad(){const t=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitle}),i={redirectTemplates:this.redirectTemplates,contentText:this.contentText,pageTitle:this.pageTitle,pageTitleParsed:this.pageTitleParsed};if(t.query.pages[0].missing){mw.util.addCSS(`
#create-redirect-button {
margin-bottom: 20px;
}`);const e=new OO.ui.ButtonWidget({id:"create-redirect-button",label:"Create redirect",icon:"articleRedirect",flags:["progressive"]});e.on("click",()=>{e.$element[0].remove(),new b(i,!1).load()}),this.contentText.prepend(e.$element[0])}else if(t.query.pages[0].redirect)new b(i,!0).load();else{const e=mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Redirect page","redirect-helper");e.addEventListener("click",a=>{a.preventDefault(),new b(i,!1).load(),window.scrollTo({top:0,behavior:"smooth"}),e.remove()})}}}class b{api=new mw.Api;redirectRegex=/^#redirect:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+?)?]]\s*/i;scriptAdvert=" (via [[User:Eejit43/scripts/redirect-helper|redirect-helper]])";redirectTemplates;contentText;pageTitle;pageTitleParsed;exists;needsCheck=!0;editorBox;syncWithMainButton;redirectInput;redirectInputLayout;tagSelect;tagSelectLayout;templateParametersEditor;templateEditorsInfo=[];categorySelect;categorySelectInput;categorySelectLayout;defaultSortInput;defaultSortSuggestButton;defaultSortInputLayout;summaryInput;summaryInputLayout;submitButton;showChangesButton;showPreviewButton;syncTalkCheckbox;syncTalkCheckboxLayout;patrolCheckbox;patrolCheckboxLayout;submitLayout;talkData;pageContent="";oldRedirectTarget;oldRedirectTags;oldRedirectTagData;oldDefaultSort;oldCategories;oldStrayText;parsedDestination;constructor({redirectTemplates:t,contentText:i,pageTitle:e,pageTitleParsed:a},r){this.redirectTemplates=t,this.contentText=i,this.pageTitle=e,this.pageTitleParsed=a,this.exists=r}async load(){mw.util.addCSS(`
#create-redirect-button {
margin-bottom: 20px;
}
#redirect-helper-box {
color: #202122;
background-color: whitesmoke;
width: 700px;
max-width: calc(100% - 50px);
margin-left: auto;
margin-right: auto;
margin-bottom: 25px !important;
}
.redirect-input-layout label {
font-weight: bold;
}
.redirect-helper-redirect-possibilities::after {
content: " (redirect with possibilities)";
font-style: italic;
}
.redirect-helper-template-parameters-container, .redirect-helper-template-parameters-container details {
background-color: #e2e2e2;
border-radius: 5px;
margin-block: 10px;
padding: 5px;
}
.redirect-helper-template-parameters-container summary {
cursor: pointer;
font-weight: bold;
}
.redirect-helper-template-parameters-container details {
background-color: #d1cece;
margin-block: 5px;
}
#redirect-helper-no-templates-message {
padding: 5px;
}
#redirect-helper-summary-layout {
padding-top: 10px;
margin-top: 15px;
border-top: 1px solid gray;
}
#redirect-helper-submit-layout {
margin-top: 10px;
}
#redirect-helper-submit-layout > * {
margin-bottom: 0;
}
.redirect-helper-warning {
margin-top: 8px;
}
.redirect-helper-autofix-button {
margin-left: 5px;
font-size: 12px;
}
.redirect-helper-autofix-button a {
padding: 3px 4px !important;
min-height: unset !important;
}`),mw.loader.addLinkTag("https://www.mediawiki.org/w/load.php?modules=mediawiki.diff.styles&only=styles"),this.editorBox=new OO.ui.PanelLayout({id:"redirect-helper-box",padded:!0,expanded:!1,framed:!0}),this.pageTitleParsed.isTalkPage()&&(await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getSubjectPage().getPrefixedText()})).query.pages[0].redirect&&await this.loadSyncWithMainButton(),this.loadInputElements(),await this.loadSubmitElements(),this.editorBox.$element[0].append(...[this.syncWithMainButton?.$element?.[0],this.redirectInputLayout.$element[0],this.tagSelectLayout.$element[0],this.templateParametersEditor,this.defaultSortInputLayout.$element[0],this.categorySelectLayout.$element[0],this.summaryInputLayout.$element[0],this.submitLayout.$element[0]].filter(Boolean)),this.contentText.prepend(this.editorBox.$element[0]),this.exists&&this.loadExistingData()}async loadSyncWithMainButton(){const t=await this.getPageContent(this.pageTitleParsed.getSubjectPage().getPrefixedText());this.syncWithMainButton=new OO.ui.ButtonWidget({label:"Sync with main page",icon:"link",flags:["progressive"]}),this.syncWithMainButton.on("click",()=>{const i=this.redirectRegex.exec(t)?.[1];if(!i)return mw.notify("Failed to parse main page content!",{type:"error"});this.redirectInput.setValue(mw.Title.newFromText(i)?.getTalkPage()?.toString()??""),["R from move",...this.redirectTemplates["R from move"].aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(t))&&this.tagSelect.setValue(["R from move"])})}loadInputElements(){this.redirectInput=new x({placeholder:"Target page name",required:!0},this.pageTitleParsed),this.redirectInput.on("change",()=>{let e=this.redirectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^:/,""),e.length>0?(this.redirectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," ")),this.defaultSortSuggestButton.setDisabled(!1),this.submitButton.setDisabled(!1),this.showPreviewButton.setDisabled(!1),this.showChangesButton.setDisabled(!1)):(this.defaultSortSuggestButton.setDisabled(!0),this.submitButton.setDisabled(!0),this.showPreviewButton.setDisabled(!0),this.showChangesButton.setDisabled(!0)),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.redirectInputLayout=new OO.ui.FieldLayout(this.redirectInput,{label:"Redirect target:",classes:["redirect-input-layout"],align:"top"}),this.tagSelect=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.redirectTemplates).map(([e,{redirect:a}])=>{if(!a)return{data:e,label:e};const r=new OO.ui.HtmlSnippet(`<span class="redirect-helper-redirect-possibilities">${e}</span>`);return{data:e,label:r}})}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",()=>{const e=this.tagSelect.getValue().sort((r,s)=>r.toLowerCase().localeCompare(s.toLowerCase()));this.tagSelect.getValue().join(";")!==e.join(";")&&this.tagSelect.setValue(e),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0;for(const r of this.templateEditorsInfo)r.details.style.display="none";let a=0;for(const r of this.tagSelect.getValue()){const s=this.templateEditorsInfo.find(o=>o.name===r);s&&(s.details.style.display="block",a++)}t.textContent=`Template parameters (${a>0?`for ${a} template${a>1?"s":""}`:"none to show"})`,i.style.display=a>0?"none":"block"}),this.tagSelectLayout=new OO.ui.FieldLayout(this.tagSelect,{label:"Redirect categorization templates:",classes:["redirect-input-layout"],align:"top"}),this.templateParametersEditor=document.createElement("details"),this.templateParametersEditor.classList.add("redirect-helper-template-parameters-container");const t=document.createElement("summary");t.textContent="Template parameters (none to show)",this.templateParametersEditor.append(t);for(const[e,a]of Object.entries(this.redirectTemplates)){const r=Object.entries(a.parameters);if(r.length===0)continue;const s=document.createElement("details");s.style.display="none";const o=document.createElement("summary");o.textContent=e,s.append(o);const u={name:e,details:s,parameters:[]};for(const[p,l]of r){const d=new OO.ui.TextInputWidget({placeholder:l.default?.toString(),required:l.required});d.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});const n=new OO.ui.FieldLayout(d,{label:new OO.ui.HtmlSnippet(`${p}${!l.label||p.toLowerCase()===l.label?.toLowerCase()?"":` (${l.label})`}${l.description?` (${l.description})`:""} (type: ${l.type}) ${l.suggested?" (suggested)":""}${l.example?` (example: "${l.example}")`:""}`),align:"inline"});s.append(n.$element[0]),u.parameters.push({name:p,aliases:l.aliases,editor:d})}this.templateParametersEditor.append(s),this.templateEditorsInfo.push(u)}const i=document.createElement("div");i.id="redirect-helper-no-templates-message",i.textContent="No templates with parameters to display!",this.templateParametersEditor.append(i),this.defaultSortInput=new OO.ui.TextInputWidget,this.defaultSortInput.on("change",()=>{const e=this.defaultSortInput.getValue();e.length>0&&this.defaultSortInput.setValue(e.replaceAll("_"," ")),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.defaultSortSuggestButton=new OO.ui.ButtonWidget({icon:"robot",label:"Suggest",disabled:!0}),this.defaultSortSuggestButton.on("click",()=>{let e=this.pageTitleParsed.getMainText().replace(/ \(.*\)$/,"");if(["R from birth name","R from fictional character","R from band member","R from member","R from person","R from personal name","R from relative","R from spouse"].some(a=>this.tagSelect.getValue().includes(a))){if(!e.includes(" "))return mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"});let a="";if(/ (?:[JS]r.?|[IVX]+)$/.test(e)&&(a=e.slice(e.lastIndexOf(" ")),e=e.slice(0,e.lastIndexOf(" ")),!e.includes(" ")))return e+a;const r=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),s=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(r+", "+s+a)}else{let a=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(const r of["An","A","The"])if(a.startsWith(r+" ")){a=a.slice(r.length+1)+", "+r;break}a===e?mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"}):this.defaultSortInput.setValue(a)}}),this.defaultSortInputLayout=new OO.ui.ActionFieldLayout(this.defaultSortInput,this.defaultSortSuggestButton,{label:new OO.ui.HtmlSnippet(`Default sort key (DEFAULTSORT) (see <a href="${mw.util.getUrl("Wikipedia:Categorization#Sort keys")}" target="_blank">guideline</a>):`),classes:["redirect-input-layout"],align:"top"}),this.categorySelectInput=new O({placeholder:"Add categories here"}),this.categorySelectInput.on("change",()=>{let e=this.categorySelectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^Category:/,""),e.length>0&&this.categorySelectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," "))}),this.categorySelectInput.on("showing-values",e=>{for(const a of e)this.categorySelect.addAllowedValue(a.data)}),this.categorySelect=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:this.categorySelectInput}),this.categorySelect.on("change",()=>{const e=this.categorySelect.getValue().sort((a,r)=>a.toLowerCase().localeCompare(r.toLowerCase()));this.categorySelect.getValue().join(";")!==e.join(";")&&this.categorySelect.setValue(e),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.categorySelectLayout=new OO.ui.FieldLayout(this.categorySelect,{label:"Categories:",classes:["redirect-input-layout"],align:"top"}),this.summaryInput=new OO.ui.ComboBoxInputWidget({options:[{data:"Resolve double redirect"},{data:"Resolve self redirect"},{data:"Remove incorrect rcats"}]}),this.summaryInputLayout=new OO.ui.FieldLayout(this.summaryInput,{id:"redirect-helper-summary-layout",label:"Summary:",classes:["redirect-input-layout"],align:"top"})}async loadSubmitElements(){const t=new OO.ui.WindowManager;document.body.append(t.$element[0]),this.submitButton=new OO.ui.ButtonWidget({label:"Submit",disabled:!0,flags:["progressive"]}),this.submitButton.on("click",()=>this.handleSubmitButtonClick());const i=new f({size:"large"},this.pageTitleParsed);t.addWindows([i]),this.showPreviewButton=new OO.ui.ButtonWidget({label:"Show preview",disabled:!0}),this.showPreviewButton.on("click",()=>{i.setData(this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())),i.open()});const e=new y({size:"large"});t.addWindows([e]),this.showChangesButton=new OO.ui.ButtonWidget({label:"Show changes",disabled:!0}),this.showChangesButton.on("click",async()=>{this.exists&&(this.pageContent=await this.getPageContent(this.pageTitle)),e.setData([this.pageContent,this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())]),e.open()}),this.pageTitleParsed.isTalkPage()||(this.talkData=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getTalkPage().getPrefixedText()}),this.syncTalkCheckbox=new OO.ui.CheckboxInputWidget({selected:!!this.talkData.query.pages[0].redirect}),this.syncTalkCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.syncTalkCheckbox,{label:"Sync talk page",align:"inline"})]})),await this.checkShouldPromptPatrol()&&(this.patrolCheckbox=new OO.ui.CheckboxInputWidget({selected:!0}),this.patrolCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.patrolCheckbox,{label:"Mark as patrolled",align:"inline"})]})),this.submitLayout=new OO.ui.HorizontalLayout({id:"redirect-helper-submit-layout",items:[this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckboxLayout,this.patrolCheckboxLayout].filter(Boolean)})}async checkShouldPromptPatrol(){const t=document.querySelector("#mwe-pt-mark .mwe-pt-tool-icon");if(t?.click(),t?.click(),mw.config.get("wgNamespaceNumber")!==0)return!1;if(document.querySelector(".patrollink"))return!0;if(document.querySelector("#mwe-pt-mark-as-reviewed-button"))return!0;if(document.querySelector("#mwe-pt-mark-as-unreviewed-button"))return!1;{if(!mw.config.get("wgArticleId")||!(await this.api.get({action:"query",meta:"userinfo",uiprop:"rights"})).query.userinfo.rights.includes("patrol"))return!1;const e=await this.api.get({action:"pagetriagelist",page_id:mw.config.get("wgArticleId")});return e.pagetriagelist.pages[0]?.user_name===mw.config.get("wgUserName")||e.pagetriagelist.result!=="success"||e.pagetriagelist.pages.length===0?!1:!Number.parseInt(e.pagetriagelist.pages[0]?.patrol_status)}}updateSummary(){const t=this.redirectInput.getValue().trim();if(!t)this.summaryInput.$tabIndexed[0].placeholder="";else if(this.exists){const i=t!==this.oldRedirectTarget?.replaceAll("_"," "),e=this.tagSelect.getValue().some(u=>!this.oldRedirectTags.includes(u))||this.oldRedirectTags.some(u=>!this.tagSelect.getValue().includes(u));let a=!1;if(this.oldRedirectTagData){const u=Object.entries(this.redirectTemplates).filter(([,p])=>Object.entries(p.parameters).length>0);for(const[p,l]of u){if(!this.oldRedirectTags.includes(p)||!this.tagSelect.getValue().includes(p))continue;const n=this.oldRedirectTagData[p]??Object.entries(l.parameters).map(([g])=>[g,""]),c=this.templateEditorsInfo.find(g=>g.name===p);for(const g of c.parameters){const m=n.find(w=>w[0]===g.name)?.[1]??"",h=g.editor.getValue().trim();if(m!==h){a=!0;break}}if(a)break}}const r=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),s=this.categorySelect.getValue().some(u=>!this.oldCategories.includes(u))||this.oldCategories.some(u=>!this.categorySelect.getValue().includes(u)),o=[];i&&o.push(`retarget to [[${t}]]`),e&&o.push(`${this.tagSelect.getValue().length>0&&this.oldRedirectTags.length>0?"change":this.tagSelect.getValue().length>0?"add":"remove"} categorization templates`),a&&o.push("change categorization template arguments"),r&&o.push(`${this.defaultSortInput.getValue().trim().length>0&&this.oldDefaultSort.replaceAll("_"," ").length>0?"change":this.defaultSortInput.getValue().trim().length>0?"add":"remove"} default sort key`),s&&o.push(`${this.categorySelect.getValue().length>0&&this.oldCategories.length>0?"change":this.categorySelect.getValue().length>0?"add":"remove"} categories`),o.length===0&&o.push("perform redirect cleanup"),o[0]=o[0][0].toUpperCase()+o[0].slice(1),o.length>1&&(o[o.length-1]=`and ${o.at(-1)}`),this.summaryInput.$tabIndexed[0].placeholder=o.join(o.length>2?", ":" ")}else this.summaryInput.$tabIndexed[0].placeholder=`Create redirect to [[${t}]]`}async loadExistingData(){this.exists&&(this.pageContent=await this.getPageContent(this.pageTitle)),this.oldRedirectTarget=this.redirectRegex.exec(this.pageContent)?.[1],this.oldRedirectTags=Object.entries(this.redirectTemplates).map(([i,e])=>[i,...e.aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(this.pageContent))?i:null).filter(Boolean).sort((i,e)=>i.toLowerCase().localeCompare(e.toLowerCase()));const t=Object.entries(this.redirectTemplates).flatMap(([i,e])=>[i,...e.aliases]).map(i=>new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\s*(\\||}})`).test(this.pageContent)?i:null).filter(Boolean);this.oldRedirectTagData=Object.fromEntries(t.map(i=>{const e=new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\|?(.*?)\\s*}}`).exec(this.pageContent),a=Object.entries(this.redirectTemplates).find(([o,u])=>[o,...u.aliases].includes(i))?.[0];if(!e?.[1])return null;const s=e[1].split("|").map((o,u)=>{if(!o.includes("="))return[(u+1).toString(),o.trim()];const[p,l]=o.split("=");return[p.trim(),l.trim()]});return[a,s]}).filter(Boolean)),this.oldDefaultSort=this.pageContent.match(/{{DEFAULTSORT:.*?}}/g)?.at(-1)?.slice(14,-2)?.trim()??"",this.oldCategories=this.pageContent.match(/\[\[[Cc]ategory:.+?]]/g)?.map(i=>i.slice(11,-2))??[],this.oldStrayText=[/{{short description\|.*?}}/i.exec(this.pageContent)?.[0],/{{DISPLAYTITLE:.*?}}/.exec(this.pageContent)?.[0],/{{italic title\|?.*?}}/i.exec(this.pageContent)?.[0],/{{title language\|.*?}}/.exec(this.pageContent)?.[0],/{{authority control(\|.*?)?}}/i.exec(this.pageContent)?.[0]].filter(Boolean).join(`
`),this.oldRedirectTarget?this.redirectInput.setValue(this.oldRedirectTarget.replaceAll("_"," ")):mw.notify("Could not find redirect target!",{type:"error"}),this.tagSelect.setValue(this.oldRedirectTags);for(const[i,e]of Object.entries(this.oldRedirectTagData)){const a=this.templateEditorsInfo.find(r=>r.name===i);if(a)for(const[r,s]of e){const o=a.parameters.find(u=>[u.name,...u.aliases].includes(r));o&&o.editor.setValue(s)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(const i of this.oldCategories)this.categorySelect.addAllowedValue(i);this.categorySelect.setValue(this.oldCategories.map(i=>({data:i,label:i}))),this.updateSummary()}async validateSubmission(){const t=[],i=this.redirectInput.getValue().trim(),e=this.tagSelect.getValue();/^\s*[^[\]{|}]+\s*$/.test(i)||t.push({title:i,message:"is not a valid page title!"});try{this.parsedDestination=mw.Title.newFromText(i)}catch{t.length===0&&t.push({title:i,message:"is not a valid page title!"})}!this.parsedDestination&&t.length===0&&t.push({title:i,message:"is not a valid page title!"}),this.parsedDestination?.toString()===this.pageTitleParsed.toString()&&t.push({message:"cannot redirect to itself!"});const a=await this.api.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:i}).catch(n=>(n==="missingtitle"?t.push({title:i,message:"does not exist!"}):t.push({title:i,message:`was not able to be fetched from the API (${n})!`}),null)),r=await this.api.get({action:"parse",page:i,prop:"sections",redirects:!0});if(r.parse.redirects?.[0]){const n=r.parse.redirects[0].to+(r.parse.redirects[0].tofragment?`#${r.parse.redirects[0].tofragment}`:"");t.push({title:i,message:`is a redirect to <a href="${mw.util.getUrl(n)}" target="_blank">${n}</a>. Retarget to that page instead, as double redirects aren't allowed.`,autoFixes:[{type:"change-target",target:n}]})}if(i.split("#").length>1)if(r.parse.sections.find(c=>c.line.replaceAll(/<\/?i>/g,"")===i.split("#")[1]))e.includes("R to anchor")&&t.push({message:"is tagged as a redirect to an anchor, but it is actually a redirect to a section!",autoFixes:[{type:"add",tag:"R to section"},{type:"remove",tag:"R to anchor"}]}),e.includes("R to section")||t.push({message:"is a redirect to a section, but it is not tagged with <code>{{R to section}}</code>!",autoFixes:[{type:"add",tag:"R to section"}]});else{const c=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.parsedDestination.toString()})).query.pages[0].revisions[0].slots.main.content;[...c.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(m=>m.split("|").map(h=>h.trim()))?.flat()??[],...c.match(/(?<={{\s*?(?:[Vv](?:isible anchors?|isanc|Anch|anchor|isibleanchor|a)|[Aa](?:nchord|chored|nchor\+)|[Tt]ext anchor)\s*?\|).+?(?=(?<!!|=)}})/g)?.map(m=>m.split("|").map(h=>h.trim()).filter(h=>!/^text\s*?=/.test(h)))?.flat()??[],...c.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(m=>m.trim())??[],...c.match(/EpisodeNumber += +\d+/g)?.map(m=>`ep${m.split("=")[1].trim()}`)??[]].includes(i.split("#")[1])?(e.includes("R to section")&&t.push({message:"is tagged as a redirect to a section, but it is actually a redirect to an anchor!",autoFixes:[{type:"add",tag:"R to anchor"},{type:"remove",tag:"R to section"}]}),e.includes("R to anchor")||t.push({message:"is a redirect to an anchor, but it is not tagged with <code>{{R from anchor}}</code>!",autoFixes:[{type:"add",tag:"R to anchor"}]})):t.push({message:`is a redirect to <a href="${mw.util.getUrl(i)}" target="_blank">${i}</a>, but that section or anchor does not exist!`,autoFixes:[{type:"change-target",target:i.split("#")[0]}]})}if(i.split("#").length===1)for(const n of["R to section","R to anchor"])e.includes(n)&&t.push({message:`is not a redirect to a section/anchor, but it is tagged with <code>{{${n}}}</code>!`,autoFixes:[{type:"remove",tag:n}]});const s=!!(a.query.pages[0].pageprops&&"disambiguation"in a.query.pages[0].pageprops),o=!!a.query.pages[0].categories?.some(n=>n.title==="Category:Surnames"),u=["R to disambiguation page","R from incomplete disambiguation"],p=["R from ambiguous sort name","R from ambiguous term"],l=u.some(n=>e.includes(n)),d=p.some(n=>e.includes(n));s&&!l&&!d&&t.push({message:"is a redirect to a disambiguation page, but it is not tagged with a disambiguation categorization template!"}),a.query.pages[0].pageprops&&!s&&((!o&&(l||d)||o&&l)&&t.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!",autoFixes:[...u,...p].map(n=>({type:"remove",tag:n}))}),o&&!d&&t.push({message:"is a redirect to a surname list, but it is not tagged with a correct disambiguation categorization template!"})),s&&e.includes("R to disambiguation page")&&!this.pageTitleParsed.getMainText().endsWith(" (disambiguation)")&&t.push({message:'is tagged with <code>{{R to disambiguation page}}</code>, but this title does not end with " (disambiguation)". Use <code>{{R from ambiguous term}}</code> or a similar categorization template instead!',autoFixes:[{type:"remove",tag:"R to disambiguation page"}]});for(const n of["R protected","R semi-protected","R extended-protected","R template-protected","R fully protected"])e.includes(n)&&t.push({message:`is tagged with unnecessarily tagged with <code>{{${n}}}</code> which will be duplicated by the redirect category shell!`,autoFixes:[{type:"remove",tag:n}]});mw.config.get("wgWikibaseItemId")&&!e.includes("R with Wikidata item")&&t.push({message:"is linked to a Wikidata item but it isn't tagged with <code>{{R with Wikidata item}}</code>!",autoFixes:[{type:"add",tag:"R with Wikidata item"}]}),e.includes("R with Wikidata item")&&!mw.config.get("wgWikibaseItemId")&&t.push({message:"is tagged with <code>{{R with Wikidata item}}</code> but it is not actually linked to a Wikidata item!",autoFixes:[{type:"remove",tag:"R with Wikidata item"}]});for(const n of e){const c=this.redirectTemplates[n];if(c)for(const[g,m]of Object.entries(c.parameters)){const h=this.templateEditorsInfo.find(w=>w.name===n)?.parameters.find(w=>[w.name,...w.aliases].includes(g));h&&m.required&&!h.editor.getValue().trim()&&t.push({message:`is tagged with <code>{{${n}}}</code> but it is missing the required parameter <code>${g}</code>!`})}}return this.syncTalkCheckbox?.isSelected()&&!this.talkData.query.pages[0].missing&&!this.talkData.query.pages[0].redirect&&t.push({title:this.pageTitleParsed.getTalkPage().getPrefixedText(),message:"exists, but is not a redirect!"}),t}async handleSubmitButtonClick(){const t=[this.redirectInput,this.tagSelect,...this.templateEditorsInfo.flatMap(s=>s.parameters.map(o=>o.editor)),this.defaultSortInput,this.defaultSortSuggestButton,this.categorySelect,this.summaryInput,this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckbox,this.patrolCheckbox].filter(Boolean);for(const s of t)s.setDisabled(!0);this.submitButton.setLabel("Checking target validity...");let i=[];if(this.needsCheck?i=await this.validateSubmission():this.parsedDestination=mw.Title.newFromText(this.redirectInput.getValue()),i.length>0){for(const s of document.querySelectorAll(".redirect-helper-warning"))s.remove();for(const{title:s,message:o,autoFixes:u}of i){const p=new OO.ui.HtmlSnippet(`${s?`<a href="${mw.util.getUrl(s)}" target="_blank">${s}</a>`:"This page"} ${o} Click again without making changes to submit anyway.`),l=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:p});if(u){const d=new OO.ui.ButtonWidget({label:"Perform auto-fix",flags:["progressive"],classes:["redirect-helper-autofix-button"]});d.on("click",()=>{const n=this.tagSelect.getValue();for(const c of u)c.type==="add"&&!n.includes(c.tag)&&this.tagSelect.addTag(c.tag,c.tag),c.type==="remove"&&n.includes(c.tag)&&this.tagSelect.removeTagByData(c.tag),c.type==="change-target"&&this.redirectInput.setValue(c.target);l.$element[0].style.textDecoration="line-through 2px black",d.$element[0].remove()}),l.$element[0].querySelector(".oo-ui-labelElement-label").append(d.$element[0])}this.editorBox.$element[0].append(l.$element[0])}for(const s of t)s.setDisabled(!1);this.submitButton.setLabel("Submit anyway"),this.needsCheck=!1;return}this.submitButton.setLabel(`${this.exists?"Editing":"Creating"} redirect...`);const e=this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue()),a=(this.summaryInput.getValue()||this.summaryInput.$tabIndexed[0].placeholder)+this.scriptAdvert;if(await this.editOrCreate(this.pageTitle,e,a)){if(mw.notify(`Redirect ${this.exists?"edited":"created"} successfully!`,{type:"success"}),this.syncTalkCheckbox?.isSelected()){this.submitButton.setLabel("Editing talk page...");const s=this.tagSelect.getValue().includes("R from move"),o=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),s?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),o,"Syncing redirect from main page"+this.scriptAdvert))return;mw.notify("Talk page synced successfully!",{type:"success"})}if(this.patrolCheckbox?.isSelected()){this.submitButton.setLabel("Patrolling redirect...");const s=document.querySelector(".patrollink a"),o=document.querySelector("#mwe-pt-mark-as-reviewed-button");s?await this.api.postWithToken("patrol",{action:"patrol",rcid:new URL(s.href).searchParams.get("rcid")}).catch((p,l)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${l?.error.info??"Unknown error"} (${p})`,{type:"error"}),null))&&mw.notify("Redirect patrolled successfully!",{type:"success"}):o?(o.click(),mw.notify("Redirect patrolled successfully!",{type:"success"})):mw.notify("Page curation toolbar not found, redirect cannot be patrolled!",{type:"error"})}this.submitButton.setLabel("Complete, reloading..."),window.location.href=mw.util.getUrl(this.pageTitle,{redirect:"no"})}}createOutput(t,i,e,a,r){const s=mw.Title.newFromText(t),o=s?`${s.getNamespaceId()===14?":":""}${s.getPrefixedText()}${s.getFragment()?`#${s.getFragment()}`:""}`:t.trim();this.pageTitleParsed.getMainText().toLocaleLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")===a?.toLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")&&(a=void 0);const u=i.map(p=>{const l=this.templateEditorsInfo.find(c=>c.name===p);if(!l)return`{{${p}}}`;const d=l.parameters.findLastIndex((c,g)=>c.name===(g+1).toString()&&c.editor.getValue().trim()),n=l.parameters.map((c,g)=>{const m=c.editor.getValue().trim();return!m&&g>d?null:`|${c.name===(g+1).toString()?"":`${c.name}=`}${m}`}).filter(Boolean).join("");return`{{${p}${n}}}`});return[`#REDIRECT [[${o}]]
`,i.length>0?`{{Redirect category shell|
${u.join(`
`)}
}}
`:null,e?e+`
`:null,a?`{{DEFAULTSORT:${a.trim()}}}`:null,r.length>0?r.map(p=>`[[Category:${p}]]`).join(`
`):null].filter(Boolean).join(`
`)}async getPageContent(t){return(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:t})).query.pages[0].revisions[0].slots.main.content.trim()}async editOrCreate(t,i,e){return await this.api.edit(t,()=>({text:i,summary:e})).catch((a,r)=>a==="nocreate-missing"?this.api.create(t,{summary:e},i).catch((s,o)=>{mw.notify(`Error creating ${t}: ${o?.error.info??"Unknown error"} (${s})`,{type:"error"})}):(mw.notify(`Error editing or creating ${t}: ${r?.error.info??"Unknown error"} (${a})`,{type:"error"}),null))}}new v().run()});
// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gICAgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtcywgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bmljb3JuL3ByZXZlbnQtYWJicmV2aWF0aW9uc1xuICAgIENhdGVnb3JpZXNSZXN1bHQsXG4gICAgTWVkaWFXaWtpRGF0YUVycm9yLFxuICAgIFBhZ2VJbmZvUmVzdWx0LFxuICAgIFBhZ2VQYXJzZVJlc3VsdCxcbiAgICBQYWdlUmV2aXNpb25zUmVzdWx0LFxuICAgIFBhZ2VUcmlhZ2VMaXN0UmVzcG9uc2UsXG4gICAgUGFnZXByb3BzUmVzdWx0LFxuICAgIFVzZXJQZXJtaXNzaW9uc1Jlc3BvbnNlLFxufSBmcm9tICcuLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUge1xuICAgIEFwaUNvbXBhcmVQYWdlc1BhcmFtcyxcbiAgICBBcGlQYXJzZVBhcmFtcyxcbiAgICBBcGlRdWVyeUluZm9QYXJhbXMsXG4gICAgQXBpUXVlcnlQYWdlUHJvcHNQYXJhbXMsXG4gICAgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMsXG4gICAgQXBpUXVlcnlVc2VySW5mb1BhcmFtcyxcbiAgICBQYWdlVHJpYWdlQXBpUGFnZVRyaWFnZUxpc3RQYXJhbXMsXG59IGZyb20gJy4uL25vZGVfbW9kdWxlcy90eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcy9pbmRleCc7XG5cbmV4cG9ydCB0eXBlIFJlZGlyZWN0VGVtcGxhdGVEYXRhID0gUmVjb3JkPHN0cmluZywgeyByZWRpcmVjdD86IHRydWU7IHBhcmFtZXRlcnM6IFJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzOyBhbGlhc2VzOiBzdHJpbmdbXSB9PjtcblxudHlwZSBSZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVycyA9IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgICBhbGlhc2VzOiBzdHJpbmdbXTtcbiAgICAgICAgbGFiZWw6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICAgIHJlcXVpcmVkOiBib29sZWFuO1xuICAgICAgICBzdWdnZXN0ZWQ6IGJvb2xlYW47XG4gICAgICAgIGRlZmF1bHQ6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgICAgICBleGFtcGxlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICB9XG4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG4gICAgcGFyYW1ldGVyczogeyBuYW1lOiBzdHJpbmc7IGFsaWFzZXM6IHN0cmluZ1tdOyBlZGl0b3I6IE9PLnVpLlRleHRJbnB1dFdpZGdldCB9W107XG59XG5cbmludGVyZmFjZSBMb29rdXBFbGVtZW50Q29uZmlnIGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0LkNvbmZpZ09wdGlvbnMsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuQ29uZmlnT3B0aW9ucyB7fVxuXG5tdy5sb2FkZXIudXNpbmcoWydtZWRpYXdpa2kudXRpbCcsICdvb2pzLXVpLWNvcmUnLCAnb29qcy11aS13aWRnZXRzJywgJ29vanMtdWktd2luZG93cycsICdvb2pzLXVpLnN0eWxlcy5pY29ucy1jb250ZW50JywgJ29vanMtdWkuc3R5bGVzLmljb25zLWVkaXRpbmctY29yZSddLCAoKSA9PiB7XG4gICAgLy8gU2V0dXAgUmVkaXJlY3RJbnB1dFdpZGdldFxuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIHRpdGxlIGxvb2t1cCBlbGVtZW50LlxuICAgICAqL1xuICAgIGNsYXNzIFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICAvLyBBc3NpZ25lZCBpbiBjb25zdHJ1Y3RvclxuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGU7XG5cbiAgICAgICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnLCBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlKSB7XG4gICAgICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlLmluY2x1ZGVzKCcjJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHZhbHVlLnNwbGl0KCcjJylbMF07XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAuZ2V0KHsgYWN0aW9uOiAncGFyc2UnLCBwYWdlOiB0aXRsZSwgcHJvcDogJ3NlY3Rpb25zJywgcmVkaXJlY3RzOiB0cnVlIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogUGFnZVBhcnNlUmVzdWx0IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRTZWN0aW9ucyA9IHJlc3VsdC5wYXJzZS5zZWN0aW9ucy5maWx0ZXIoKHNlY3Rpb24pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24ubGluZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXJ0c1dpdGgodmFsdWUuc3BsaXQoJyMnKVsxXS50b0xvd2VyQ2FzZSgpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRTZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBgJHtyZXN1bHQucGFyc2UudGl0bGV9IyR7c2VjdGlvbi5saW5lLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogYCR7cmVzdWx0LnBhcnNlLnRpdGxlfSMke3NlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IHBhcnNlZFRpdGxlPy5nZXROYW1lc3BhY2VJZCgpID8/IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBnYXBwcmVmaXg6IHBhcnNlZFRpdGxlPy5nZXRNYWluVGV4dCgpID8/IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yOiAnYWxscGFnZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogWydpbmZvJywgJ3BhZ2Vwcm9wcyddLFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogeyBxdWVyeTogeyBwYWdlczogeyB0aXRsZTogc3RyaW5nOyBwYWdlcHJvcHM6IHsgZGlzYW1iaWd1YXRpb24/OiBzdHJpbmcgfTsgcmVkaXJlY3Q/OiBzdHJpbmcgfVtdIH0gfSB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnF1ZXJ5Py5wYWdlcyAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucXVlcnkucGFnZXMgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UudGl0bGUgIT09IHRoaXMucGFnZVRpdGxlUGFyc2VkLnRvU3RyaW5nKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYWdlKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHBhZ2UudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGFnZS50aXRsZX0ke3BhZ2UucGFnZXByb3BzICYmICdkaXNhbWJpZ3VhdGlvbicgaW4gcGFnZS5wYWdlcHJvcHMgPyAnIDxpPihkaXNhbWJpZ3VhdGlvbik8L2k+JyA6ICcnfSR7J3JlZGlyZWN0JyBpbiBwYWdlID8gJyA8aT4ocmVkaXJlY3QpPC9pPicgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgICAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4gZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0LnByb3RvdHlwZSwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUpO1xuXG4gICAgLy8gU2V0dXAgQ2F0ZWdvcnlJbnB1dFdpZGdldFxuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICAgICAqL1xuICAgIGNsYXNzIENhdGVnb3J5SW5wdXRXaWRnZXQgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExvb2t1cEVsZW1lbnRDb25maWcpIHtcbiAgICAgICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICBnZXRMb29rdXBSZXF1ZXN0ID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICAgICAgaWYgKCF2YWx1ZSkgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IDE0LFxuICAgICAgICAgICAgICAgICAgICBnYXBwcmVmaXg6IHBhcnNlZFRpdGxlPy5nZXRNYWluVGV4dCgpID8/IHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgICAgIHByb3A6ICdjYXRlZ29yaWVzJyxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1zKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IHsgcXVlcnk6IHsgcGFnZXM6IHsgdGl0bGU6IHN0cmluZzsgY2F0ZWdvcmllcz86IHsgdGl0bGU6IHN0cmluZyB9W10gfVtdIH0gfSB8IG51bGwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8ucXVlcnk/LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IHJlc3VsdC5xdWVyeS5wYWdlcyAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlLmNhdGVnb3JpZXM/LnNvbWUoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50aXRsZSA9PT0gJ0NhdGVnb3J5Oldpa2lwZWRpYSBzb2Z0IHJlZGlyZWN0ZWQgY2F0ZWdvcmllcycpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGVXaXRob3V0TmFtZXNwYWNlID0gcGFnZS50aXRsZS5zcGxpdCgnOicpWzFdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSwgbGFiZWw6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcGFnZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgICAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4gZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG4gICAgfVxuXG4gICAgT2JqZWN0LmFzc2lnbihDYXRlZ29yeUlucHV0V2lkZ2V0LnByb3RvdHlwZSwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUpO1xuXG4gICAgLy8gU2V0dXAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nXG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZGlhbG9nIHVzZWQgZm9yIHByZXZpZXdpbmcgdGVtcGxhdGVzLlxuICAgICAqL1xuICAgIGNsYXNzIFRlbXBsYXRlUHJldmlld0RpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICAvLyBBc3NpZ25lZCBpbiBjb25zdHJ1Y3RvclxuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGU7XG5cbiAgICAgICAgY29uc3RydWN0b3IoY29uZmlnOiBPTy51aS5Qcm9jZXNzRGlhbG9nLkNvbmZpZ09wdGlvbnMsIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUpIHtcbiAgICAgICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgICAgICBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3RhdGljLm5hbWUgPSAnVGVtcGxhdGVQcmV2aWV3RGlhbG9nJztcbiAgICAgICAgICAgIFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzIHByZXZpZXcnO1xuICAgICAgICAgICAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnN0YXRpYy5hY3Rpb25zID0gW3sgYWN0aW9uOiAnY2FuY2VsJywgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAucG9zdCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwYXJzZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50bW9kZWw6ICd3aWtpdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiBbJ3RleHQnLCAnY2F0ZWdvcmllc2h0bWwnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRQcmVmaXhlZERiKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLmdldERhdGEoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzQ29udGVudCA9IChyZXN1bHQgYXMgeyBwYXJzZTogeyB0ZXh0OiBzdHJpbmcgfSB9KS5wYXJzZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0NvbnRlbnQgPSAocmVzdWx0IGFzIHsgcGFyc2U6IHsgY2F0ZWdvcmllc2h0bWw6IHN0cmluZyB9IH0pLnBhcnNlLmNhdGVnb3JpZXNodG1sO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWxMYXlvdXQuJGVsZW1lbnQuYXBwZW5kKHRhZ3NDb250ZW50LCBjYXRlZ29yaWVzQ29udGVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChwYW5lbExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvblxuICAgICAgICAgICAgICAgID8gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWFuYWdlcigpLmNsb3NlV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuXG4gICAgLy8gU2V0dXAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nXG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZGlhbG9nIHVzZWQgZm9yIHNob3dpbmcgY2hhbmdlcyB0byBiZSBtYWRlLlxuICAgICAqL1xuICAgIGNsYXNzIFNob3dDaGFuZ2VzRGlhbG9nIGV4dGVuZHMgT08udWkuUHJvY2Vzc0RpYWxvZyB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT08udWkuUHJvY2Vzc0RpYWxvZy5Db25maWdPcHRpb25zKSB7XG4gICAgICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgICAgICBTaG93Q2hhbmdlc0RpYWxvZy5zdGF0aWMubmFtZSA9ICdTaG93Q2hhbmdlc0RpYWxvZyc7XG4gICAgICAgICAgICBTaG93Q2hhbmdlc0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnQ2hhbmdlcyB0byBiZSBtYWRlJztcbiAgICAgICAgICAgIFNob3dDaGFuZ2VzRGlhbG9nLnN0YXRpYy5hY3Rpb25zID0gW3sgYWN0aW9uOiAnY2FuY2VsJywgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9XTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBTaG93Q2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgW29sZFRleHQsIG5ld1RleHRdID0gdGhpcy5nZXREYXRhKCkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY29tcGFyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiBbJ2RpZmYnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZyb21zbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb210ZXh0LW1haW4nOiBvbGRUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb21jb250ZW50bW9kZWwtbWFpbic6ICd3aWtpdGV4dCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3Nsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAndG90ZXh0LW1haW4nOiBuZXdUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RvY29udGVudG1vZGVsLW1haW4nOiAnd2lraXRleHQnLFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlDb21wYXJlUGFnZXNQYXJhbXMgJiB7ICdmcm9tdGV4dC1tYWluJzogc3RyaW5nOyAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nOyAndG90ZXh0LW1haW4nOiBzdHJpbmc7ICd0b2NvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBhcmlzb24gPSAocmVzdWx0IGFzIHsgY29tcGFyZTogeyBib2R5OiBzdHJpbmcgfSB9KS5jb21wYXJlLmJvZHk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vQ2hhbmdlc0VsZW1lbnQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICd3YXJuaW5nJywgbGFiZWw6ICdObyBjaGFuZ2VzIHRvIG1ha2UhJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWxMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsTGF5b3V0LiRlbGVtZW50LmFwcGVuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYFxuPHRhYmxlIGNsYXNzPVwiZGlmZiBkaWZmLWVkaXRmb250LW1vbm9zcGFjZVwiPlxuICAgIDxjb2xncm91cD5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtbWFya2VyXCI+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLWNvbnRlbnRcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtbWFya2VyXCI+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLWNvbnRlbnRcIj5cbiAgICA8L2NvbGdyb3VwPlxuICAgIDx0Ym9keT5cbiAgICAgICAgJHtjb21wYXJpc29ufVxuICAgIDwvdGJvZHk+XG48L3RhYmxlPmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBub0NoYW5nZXNFbGVtZW50LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHBhbmVsTGF5b3V0LiRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICAgICAgPyBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRNYW5hZ2VyKCkuY2xvc2VXaW5kb3codGhpcyk7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIDogU2hvd0NoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBTaG93Q2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oU2hvd0NoYW5nZXNEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhbmRsZXMgdGhlIGVudGlyZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSByZWRpcmVjdC1oZWxwZXIgc2NyaXB0LlxuICAgICAqL1xuICAgIGNsYXNzIFJlZGlyZWN0SGVscGVyIHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICAgICAgcHJpdmF0ZSByZWRpcmVjdFRlbXBsYXRlcyE6IFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuICAgICAgICBwcml2YXRlIGNvbnRlbnRUZXh0ITogSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlITogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZCE6IG13LlRpdGxlO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSdW5zIHRoZSByZWRpcmVjdCBoZWxwZXIuXG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBydW4oKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFzc2VzUHJlQ2hlY2tzKCkpIHJldHVybjtcblxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyA9IGF3YWl0IHRoaXMuZmV0Y2hSZWRpcmVjdFRlbXBsYXRlcygpO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213LWNvbnRlbnQtdGV4dCcpIGFzIEhUTUxEaXZFbGVtZW50O1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRUZXh0KSByZXR1cm4gbXcubm90aWZ5KCdyZWRpcmVjdC1oZWxwZXI6IEZhaWxlZCB0byBmaW5kIGNvbnRlbnQgdGV4dCBlbGVtZW50IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGhpcy5wYWdlVGl0bGUpITtcbiAgICAgICAgICAgIGlmICghdGhpcy5wYWdlVGl0bGVQYXJzZWQpIHJldHVybiBtdy5ub3RpZnkoJ3JlZGlyZWN0LWhlbHBlcjogRmFpbGVkIHRvIHBhcnNlIHBhZ2UgdGl0bGUhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrUGFnZUFuZExvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhlIHBhZ2UgcGFzc2VzIHByZSBjaGVja3MuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIHBhc3Nlc1ByZUNoZWNrcygpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA+PSAwLCAvLyBJcyBub3QgdmlydHVhbCBuYW1lc3BhY2VcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z0lzUHJvYmFibHlFZGl0YWJsZScpLCAvLyBQYWdlIGlzIGVkaXRhYmxlXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dJc0FydGljbGUnKSwgLy8gVmlld2luZyB0aGUgY29udGVudCBvZiBhIHBhZ2VcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z0FjdGlvbicpID09PSAndmlldycsIC8vIFZpZXdpbmcgdGhlIHBhZ2UgKG5vdCBlZGl0aW5nKVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnUmV2aXNpb25JZCcpID09PSBtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSwgLy8gVmlld2luZyB0aGUgY3VycmVudCByZXZpc2lvblxuICAgICAgICAgICAgICAgICFtdy5jb25maWcuZ2V0KCd3Z0RpZmZPbGRJZCcpLCAvLyBOb3Qgdmlld2luZyBhIGRpZmZcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25zLmV2ZXJ5KEJvb2xlYW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoZXMgdGhlIHJlZGlyZWN0IHRlbXBsYXRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgZmV0Y2hSZWRpcmVjdFRlbXBsYXRlcygpIHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiAnVXNlcjpFZWppdDQzL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyLmpzb24nLFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgICAgICAgICApLnF1ZXJ5LnBhZ2VzPy5bMF0/LnJldmlzaW9ucz8uWzBdPy5zbG90cz8ubWFpbj8uY29udGVudCB8fCAne30nLFxuICAgICAgICAgICAgKSBhcyBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgYSBwYWdlJ3Mgc3RhdHVzIGFuZCBsb2FkcyB0aGUgaGVscGVyIGFwcHJvcHJpYXRlbHkuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGNoZWNrUGFnZUFuZExvYWQoKSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlSW5mbyA9IChhd2FpdCB0aGlzLmFwaS5nZXQoeyBhY3Rpb246ICdxdWVyeScsIGZvcm1hdHZlcnNpb246ICcyJywgcHJvcDogJ2luZm8nLCB0aXRsZXM6IHRoaXMucGFnZVRpdGxlIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuXG4gICAgICAgICAgICBjb25zdCBkaWFsb2dJbmZvID0geyByZWRpcmVjdFRlbXBsYXRlczogdGhpcy5yZWRpcmVjdFRlbXBsYXRlcywgY29udGVudFRleHQ6IHRoaXMuY29udGVudFRleHQsIHBhZ2VUaXRsZTogdGhpcy5wYWdlVGl0bGUsIHBhZ2VUaXRsZVBhcnNlZDogdGhpcy5wYWdlVGl0bGVQYXJzZWQgfTtcblxuICAgICAgICAgICAgaWYgKHBhZ2VJbmZvLnF1ZXJ5LnBhZ2VzWzBdLm1pc3NpbmcpIHtcbiAgICAgICAgICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4jY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1gKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBpZDogJ2NyZWF0ZS1yZWRpcmVjdC1idXR0b24nLCBsYWJlbDogJ0NyZWF0ZSByZWRpcmVjdCcsIGljb246ICdhcnRpY2xlUmVkaXJlY3QnLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICAgICAgICAgIGJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi4kZWxlbWVudFswXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlKS5sb2FkKCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0LnByZXBlbmQoYnV0dG9uLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFnZUluZm8ucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QpIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCB0cnVlKS5sb2FkKCk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3J0bGV0TGluayA9IG13LnV0aWwuYWRkUG9ydGxldExpbmsobXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC10YicgOiAncC1jYWN0aW9ucycsICcjJywgJ1JlZGlyZWN0IHBhZ2UnLCAncmVkaXJlY3QtaGVscGVyJykhO1xuICAgICAgICAgICAgICAgIHBvcnRsZXRMaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlKS5sb2FkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHsgdG9wOiAwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcG9ydGxldExpbmsucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhbmRsZXMgdGhlIGRpYWxvZyBwb3J0aW9uIG9mIHJlZGlyZWN0LWhlbHBlciBzY3JpcHQuXG4gICAgICovXG4gICAgY2xhc3MgUmVkaXJlY3RIZWxwZXJEaWFsb2cge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcbiAgICAgICAgcHJpdmF0ZSByZWRpcmVjdFJlZ2V4ID0gL14jcmVkaXJlY3Q6P1xccypcXFtcXFtcXHMqOj8oW15bXFxde3x9XSs/KVxccyooPzpcXHxbXltcXF17fH1dKz8pP11dXFxzKi9pO1xuICAgICAgICBwcml2YXRlIHNjcmlwdEFkdmVydCA9ICcgKHZpYSBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlcnxyZWRpcmVjdC1oZWxwZXJdXSknO1xuXG4gICAgICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RUZW1wbGF0ZXM6IFJlZGlyZWN0VGVtcGxhdGVEYXRhO1xuICAgICAgICBwcml2YXRlIGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGU6IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgICAgIHByaXZhdGUgZXhpc3RzOiBib29sZWFuO1xuXG4gICAgICAgIC8vIFVzZWQgZHVyaW5nIHJ1bigpXG4gICAgICAgIHByaXZhdGUgbmVlZHNDaGVjayA9IHRydWU7XG5cbiAgICAgICAgcHJpdmF0ZSBlZGl0b3JCb3ghOiBPTy51aS5QYW5lbExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBzeW5jV2l0aE1haW5CdXR0b24/OiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RJbnB1dCE6IFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RJbnB1dExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgICAgICBwcml2YXRlIHRhZ1NlbGVjdCE6IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSB0YWdTZWxlY3RMYXlvdXQhOiBPTy51aS5BY3Rpb25GaWVsZExheW91dDtcbiAgICAgICAgcHJpdmF0ZSB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IhOiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVFZGl0b3JzSW5mbzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdID0gW107XG4gICAgICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3QhOiBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdElucHV0ITogQ2F0ZWdvcnlJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgICAgICBwcml2YXRlIGRlZmF1bHRTb3J0SW5wdXQhOiBPTy51aS5UZXh0SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgICAgICBwcml2YXRlIGRlZmF1bHRTb3J0SW5wdXRMYXlvdXQhOiBPTy51aS5BY3Rpb25GaWVsZExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBzdW1tYXJ5SW5wdXQhOiBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHN1bW1hcnlJbnB1dExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgICAgICBwcml2YXRlIHN1Ym1pdEJ1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzaG93Q2hhbmdlc0J1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzaG93UHJldmlld0J1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzeW5jVGFsa0NoZWNrYm94PzogT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzeW5jVGFsa0NoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHBhdHJvbENoZWNrYm94PzogT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBwYXRyb2xDaGVja2JveExheW91dD86IE9PLnVpLldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzdWJtaXRMYXlvdXQhOiBPTy51aS5Ib3Jpem9udGFsTGF5b3V0O1xuXG4gICAgICAgIHByaXZhdGUgdGFsa0RhdGE/OiBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICBwcml2YXRlIHBhZ2VDb250ZW50ID0gJyc7XG5cbiAgICAgICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhcmdldD86IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhZ3M/OiBzdHJpbmdbXTtcbiAgICAgICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhZ0RhdGE/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXVtdPjtcbiAgICAgICAgcHJpdmF0ZSBvbGREZWZhdWx0U29ydD86IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBvbGRDYXRlZ29yaWVzPzogc3RyaW5nW107XG4gICAgICAgIHByaXZhdGUgb2xkU3RyYXlUZXh0Pzogc3RyaW5nO1xuXG4gICAgICAgIHByaXZhdGUgcGFyc2VkRGVzdGluYXRpb24hOiBtdy5UaXRsZSB8IG51bGw7XG5cbiAgICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgICAgICB7IHJlZGlyZWN0VGVtcGxhdGVzLCBjb250ZW50VGV4dCwgcGFnZVRpdGxlLCBwYWdlVGl0bGVQYXJzZWQgfTogeyByZWRpcmVjdFRlbXBsYXRlczogUmVkaXJlY3RUZW1wbGF0ZURhdGE7IGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDsgcGFnZVRpdGxlOiBzdHJpbmc7IHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUgfSxcbiAgICAgICAgICAgIGV4aXN0czogYm9vbGVhbixcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gcmVkaXJlY3RUZW1wbGF0ZXM7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0ID0gY29udGVudFRleHQ7XG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZSA9IHBhZ2VUaXRsZTtcbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgICAgICB0aGlzLmV4aXN0cyA9IGV4aXN0cztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyB0aGUgcmVkaXJlY3QtaGVscGVyIGRpYWxvZyBpbnRvIHRoZSBwYWdlLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgICAgIG13LnV0aWwuYWRkQ1NTKGBcbiNjcmVhdGUtcmVkaXJlY3QtYnV0dG9uIHtcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLWJveCB7XG4gICAgY29sb3I6ICMyMDIxMjI7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGVzbW9rZTtcbiAgICB3aWR0aDogNzAwcHg7XG4gICAgbWF4LXdpZHRoOiBjYWxjKDEwMCUgLSA1MHB4KTtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gICAgbWFyZ2luLWJvdHRvbTogMjVweCAhaW1wb3J0YW50O1xufVxuXG4ucmVkaXJlY3QtaW5wdXQtbGF5b3V0IGxhYmVsIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci1yZWRpcmVjdC1wb3NzaWJpbGl0aWVzOjphZnRlciB7XG4gICAgY29udGVudDogXCIgKHJlZGlyZWN0IHdpdGggcG9zc2liaWxpdGllcylcIjtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIsIC5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgbWFyZ2luLWJsb2NrOiAxMHB4O1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBzdW1tYXJ5IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QxY2VjZTtcbiAgICBtYXJnaW4tYmxvY2s6IDVweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSB7XG4gICAgcGFkZGluZzogNXB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1bW1hcnktbGF5b3V0IHtcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcbiAgICBtYXJnaW4tdG9wOiAxNXB4O1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBncmF5O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQge1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dCA+ICoge1xuICAgIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItd2FybmluZyB7XG4gICAgbWFyZ2luLXRvcDogOHB4O1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLWF1dG9maXgtYnV0dG9uIHtcbiAgICBtYXJnaW4tbGVmdDogNXB4O1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci1hdXRvZml4LWJ1dHRvbiBhIHtcbiAgICBwYWRkaW5nOiAzcHggNHB4ICFpbXBvcnRhbnQ7XG4gICAgbWluLWhlaWdodDogdW5zZXQgIWltcG9ydGFudDtcbn1gKTtcblxuICAgICAgICAgICAgbXcubG9hZGVyLmFkZExpbmtUYWcoJ2h0dHBzOi8vd3d3Lm1lZGlhd2lraS5vcmcvdy9sb2FkLnBocD9tb2R1bGVzPW1lZGlhd2lraS5kaWZmLnN0eWxlcyZvbmx5PXN0eWxlcycpO1xuXG4gICAgICAgICAgICAvKiBMb2FkIGVsZW1lbnRzICovXG4gICAgICAgICAgICB0aGlzLmVkaXRvckJveCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IGlkOiAncmVkaXJlY3QtaGVscGVyLWJveCcsIHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlLCBmcmFtZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2VUaXRsZVBhcnNlZC5pc1RhbGtQYWdlKCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYWluUGFnZURhdGEgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIHByb3A6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRTdWJqZWN0UGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgICAgIGlmIChtYWluUGFnZURhdGEucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QpIGF3YWl0IHRoaXMubG9hZFN5bmNXaXRoTWFpbkJ1dHRvbigpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRTdWJtaXRFbGVtZW50cygpO1xuXG4gICAgICAgICAgICAvKiBBZGQgZWxlbWVudHMgdG8gc2NyZWVuIGFuZCBsb2FkIGRhdGEgKGlmIGFwcGxpY2FibGUpICovXG4gICAgICAgICAgICB0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXS5hcHBlbmQoXG4gICAgICAgICAgICAgICAgLi4uKFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24/LiRlbGVtZW50Py5bMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICBdLmZpbHRlcihCb29sZWFuKSBhcyBIVE1MRWxlbWVudFtdKSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudFRleHQucHJlcGVuZCh0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmV4aXN0cykgdGhpcy5sb2FkRXhpc3RpbmdEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIFwiU3luYyB3aXRoIG1haW4gcGFnZVwiIGJ1dHRvblwiIG9uIHRhbGsgcGFnZXMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGxvYWRTeW5jV2l0aE1haW5CdXR0b24oKSB7XG4gICAgICAgICAgICBjb25zdCBtYWluUGFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFN1YmplY3RQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpKTtcblxuICAgICAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTeW5jIHdpdGggbWFpbiBwYWdlJywgaWNvbjogJ2xpbmsnLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucmVkaXJlY3RSZWdleC5leGVjKG1haW5QYWdlQ29udGVudCk/LlsxXTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG13Lm5vdGlmeSgnRmFpbGVkIHRvIHBhcnNlIG1haW4gcGFnZSBjb250ZW50IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZShtdy5UaXRsZS5uZXdGcm9tVGV4dCh0YXJnZXQpPy5nZXRUYWxrUGFnZSgpPy50b1N0cmluZygpID8/ICcnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tTW92ZSA9IFsnUiBmcm9tIG1vdmUnLCAuLi50aGlzLnJlZGlyZWN0VGVtcGxhdGVzWydSIGZyb20gbW92ZSddLmFsaWFzZXNdLnNvbWUoKHRhZ09yUmVkaXJlY3QpID0+XG4gICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KG1haW5QYWdlQ29udGVudCksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoZnJvbU1vdmUpIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKFsnUiBmcm9tIG1vdmUnXSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyB0aGUgaW5wdXQgZWxlbWVudHMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGxvYWRJbnB1dEVsZW1lbnRzKCkge1xuICAgICAgICAgICAgLyogUmVkaXJlY3QgdGFyZ2V0IGlucHV0ICovXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQgPSBuZXcgUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnVGFyZ2V0IHBhZ2UgbmFtZScsIHJlcXVpcmVkOiB0cnVlIH0sIHRoaXMucGFnZVRpdGxlUGFyc2VkKTtcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL146LywgJycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnJlZGlyZWN0SW5wdXQsIHsgbGFiZWw6ICdSZWRpcmVjdCB0YXJnZXQ6JywgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSwgYWxpZ246ICd0b3AnIH0pO1xuXG4gICAgICAgICAgICAvKiBSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBzZWxlY3Rpb24gKi9cbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0ID0gbmV3IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgYWxsb3dBcmJpdHJhcnk6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykubWFwKChbdGFnLCB7IHJlZGlyZWN0IH1dKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcmVkaXJlY3QpIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWw6IHRhZyB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGA8c3BhbiBjbGFzcz1cInJlZGlyZWN0LWhlbHBlci1yZWRpcmVjdC1wb3NzaWJpbGl0aWVzXCI+JHt0YWd9PC9zcGFuPmApO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWwgfTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgKHRoaXMudGFnU2VsZWN0LmdldE1lbnUoKSBhcyBPTy51aS5NZW51U2VsZWN0V2lkZ2V0LkNvbmZpZ09wdGlvbnMpLmZpbHRlck1vZGUgPSAnc3Vic3RyaW5nJztcbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9ICh0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgICAgIGlmICgodGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWRpdG9ySW5mbyBvZiB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8pIGVkaXRvckluZm8uZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICAgICAgbGV0IHNob3duVGVtcGxhdGVFZGl0b3JzID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvckluZm8gPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlZGl0b3JJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93blRlbXBsYXRlRWRpdG9ycysrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSBgVGVtcGxhdGUgcGFyYW1ldGVycyAoJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyBgZm9yICR7c2hvd25UZW1wbGF0ZUVkaXRvcnN9IHRlbXBsYXRlJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDEgPyAncycgOiAnJ31gIDogJ25vbmUgdG8gc2hvdyd9KWA7XG5cbiAgICAgICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2Uuc3R5bGUuZGlzcGxheSA9IHNob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/ICdub25lJyA6ICdibG9jayc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy50YWdTZWxlY3QsIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1JlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlczonLFxuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi9cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuY2xhc3NMaXN0LmFkZCgncmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSAnVGVtcGxhdGUgcGFyYW1ldGVycyAobm9uZSB0byBzaG93KSc7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXModGVtcGxhdGVEYXRhLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgICAgIGRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICAgICAgc3VtbWFyeS50ZXh0Q29udGVudCA9IHRlbXBsYXRlTmFtZTtcbiAgICAgICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChzdW1tYXJ5KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvID0geyBuYW1lOiB0ZW1wbGF0ZU5hbWUsIGRldGFpbHMsIHBhcmFtZXRlcnM6IFtdIH07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiBwYXJhbWV0ZXJEYXRhLmRlZmF1bHQ/LnRvU3RyaW5nKCksIHJlcXVpcmVkOiBwYXJhbWV0ZXJEYXRhLnJlcXVpcmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChpbnB1dCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwYXJhbWV0ZXJOYW1lfSR7IXBhcmFtZXRlckRhdGEubGFiZWwgfHwgcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJhbWV0ZXJEYXRhLmxhYmVsPy50b0xvd2VyQ2FzZSgpID8gJycgOiBgICgke3BhcmFtZXRlckRhdGEubGFiZWx9KWB9JHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9uID8gYCAoJHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9ufSlgIDogJyd9ICh0eXBlOiAke3BhcmFtZXRlckRhdGEudHlwZX0pICR7cGFyYW1ldGVyRGF0YS5zdWdnZXN0ZWQgPyAnIChzdWdnZXN0ZWQpJyA6ICcnfSR7cGFyYW1ldGVyRGF0YS5leGFtcGxlID8gYCAoZXhhbXBsZTogXCIke3BhcmFtZXRlckRhdGEuZXhhbXBsZX1cIilgIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChpbnB1dExheW91dC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudERhdGEucGFyYW1ldGVycy5wdXNoKHsgbmFtZTogcGFyYW1ldGVyTmFtZSwgYWxpYXNlczogcGFyYW1ldGVyRGF0YS5hbGlhc2VzLCBlZGl0b3I6IGlucHV0IH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChkZXRhaWxzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5wdXNoKGVsZW1lbnREYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgbm9UZW1wbGF0ZXNNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UuaWQgPSAncmVkaXJlY3QtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlJztcbiAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS50ZXh0Q29udGVudCA9ICdObyB0ZW1wbGF0ZXMgd2l0aCBwYXJhbWV0ZXJzIHRvIGRpc3BsYXkhJztcblxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKG5vVGVtcGxhdGVzTWVzc2FnZSk7XG5cbiAgICAgICAgICAgIC8qIERFRkFVTFRTT1JUIGlucHV0ICovXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KCk7XG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZSh2YWx1ZS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBpY29uOiAncm9ib3QnLCBsYWJlbDogJ1N1Z2dlc3QnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldE1haW5UZXh0KCkucmVwbGFjZSgvIFxcKC4qXFwpJC8sICcnKTsgLy8gUmVtb3ZlIGRpc2FtYmlndWF0aW9uXG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIFsnUiBmcm9tIGJpcnRoIG5hbWUnLCAnUiBmcm9tIGZpY3Rpb25hbCBjaGFyYWN0ZXInLCAnUiBmcm9tIGJhbmQgbWVtYmVyJywgJ1IgZnJvbSBtZW1iZXInLCAnUiBmcm9tIHBlcnNvbicsICdSIGZyb20gcGVyc29uYWwgbmFtZScsICdSIGZyb20gcmVsYXRpdmUnLCAnUiBmcm9tIHNwb3VzZSddLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAodGFnKSA9PiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZyksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxpbmcgaXMgbW9kaWZpZWQgZnJvbSBldmFkMzcncyBcIlJhdGVyXCJcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSkgcmV0dXJuIG13Lm5vdGlmeShcInJlZGlyZWN0LWhlbHBlciB3YXNuJ3QgYWJsZSB0byBkZXRlcm1pbmUgYSBzb3J0IGtleSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBwYWdlIHRpdGxlIVwiLCB7IHR5cGU6ICd3YXJuJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgZ2VuZXJhdGlvbmFsU3VmZml4ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmICgvICg/OltKU11yLj98W0lWWF0rKSQvLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25hbFN1ZmZpeCA9IG5hbWUuc2xpY2UobmFtZS5sYXN0SW5kZXhPZignICcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoJyAnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSkgcmV0dXJuIG5hbWUgKyBnZW5lcmF0aW9uYWxTdWZmaXg7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0TmFtZSA9IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykgKyAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLywkLywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvTycvLCAnTycpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvdGhlck5hbWVzID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZShsYXN0TmFtZSArICcsICcgKyBvdGhlck5hbWVzICsgZ2VuZXJhdGlvbmFsU3VmZml4KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3TmFtZSA9IG5hbWUucmVwbGFjZUFsbCgnTXIuJywgJ01pc3RlcicpLnJlcGxhY2VBbGwoJyYnLCAnQW5kJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBsZWFkaW5nQXJ0aWNsZSBvZiBbJ0FuJywgJ0EnLCAnVGhlJ10pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3TmFtZS5zdGFydHNXaXRoKGxlYWRpbmdBcnRpY2xlICsgJyAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBuZXdOYW1lLnNsaWNlKGxlYWRpbmdBcnRpY2xlLmxlbmd0aCArIDEpICsgJywgJyArIGxlYWRpbmdBcnRpY2xlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lID09PSBuYW1lKSBtdy5ub3RpZnkoXCJyZWRpcmVjdC1oZWxwZXIgd2Fzbid0IGFibGUgdG8gZGV0ZXJtaW5lIGEgc29ydCBrZXkgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgcGFnZSB0aXRsZSFcIiwgeyB0eXBlOiAnd2FybicgfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKG5ld05hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuQWN0aW9uRmllbGRMYXlvdXQodGhpcy5kZWZhdWx0U29ydElucHV0LCB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiwge1xuICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoYERlZmF1bHQgc29ydCBrZXkgKERFRkFVTFRTT1JUKSAoc2VlIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKCdXaWtpcGVkaWE6Q2F0ZWdvcml6YXRpb24jU29ydCBrZXlzJyl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+Z3VpZGVsaW5lPC9hPik6YCksXG4gICAgICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogQ2F0ZWdvcmllcyBzZWxlY3Rpb24gKi9cbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dCA9IG5ldyBDYXRlZ29yeUlucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdBZGQgY2F0ZWdvcmllcyBoZXJlJyB9KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgdGhpcy5jYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7IGFsbG93UmVvcmRlcmluZzogZmFsc2UsIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJywgaW5wdXRXaWRnZXQ6IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dCB9KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkuam9pbignOycpICE9PSBzb3J0ZWRUYWdzLmpvaW4oJzsnKSkgdGhpcy5jYXRlZ29yeVNlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5jYXRlZ29yeVNlbGVjdCwgeyBsYWJlbDogJ0NhdGVnb3JpZXM6JywgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSwgYWxpZ246ICd0b3AnIH0pO1xuXG4gICAgICAgICAgICAvKiBTdW1tYXJ5IGlucHV0ICovXG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dCA9IG5ldyBPTy51aS5Db21ib0JveElucHV0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIHsgZGF0YTogJ1Jlc29sdmUgZG91YmxlIHJlZGlyZWN0JyB9LCAvL1xuICAgICAgICAgICAgICAgICAgICB7IGRhdGE6ICdSZXNvbHZlIHNlbGYgcmVkaXJlY3QnIH0sXG4gICAgICAgICAgICAgICAgICAgIHsgZGF0YTogJ1JlbW92ZSBpbmNvcnJlY3QgcmNhdHMnIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnN1bW1hcnlJbnB1dCwgeyBpZDogJ3JlZGlyZWN0LWhlbHBlci1zdW1tYXJ5LWxheW91dCcsIGxhYmVsOiAnU3VtbWFyeTonLCBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLCBhbGlnbjogJ3RvcCcgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIGVsZW1lbnRzIGluIHRoZSBzdWJtaXQgYnV0dG9uIHJvdy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgbG9hZFN1Ym1pdEVsZW1lbnRzKCkge1xuICAgICAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZCh3aW5kb3dNYW5hZ2VyLiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgLyogU2V0dXAgc3VibWl0IGJ1dHRvbiAqL1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTdWJtaXQnLCBkaXNhYmxlZDogdHJ1ZSwgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSB9KTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuaGFuZGxlU3VibWl0QnV0dG9uQ2xpY2soKSk7XG5cbiAgICAgICAgICAgIC8qIFNldHVwIHNob3cgcHJldmlldyBidXR0b24gKi9cbiAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlUHJldmlld0RpYWxvZyA9IG5ldyBUZW1wbGF0ZVByZXZpZXdEaWFsb2coeyBzaXplOiAnbGFyZ2UnIH0sIHRoaXMucGFnZVRpdGxlUGFyc2VkKTtcbiAgICAgICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbdGVtcGxhdGVQcmV2aWV3RGlhbG9nXSk7XG5cbiAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTaG93IHByZXZpZXcnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJldmlld0RpYWxvZy5zZXREYXRhKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZVByZXZpZXdEaWFsb2cub3BlbigpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFNldHVwIHNob3cgY2hhbmdlcyBidXR0b24gKi9cbiAgICAgICAgICAgIGNvbnN0IHNob3dDaGFuZ2VzRGlhbG9nID0gbmV3IFNob3dDaGFuZ2VzRGlhbG9nKHsgc2l6ZTogJ2xhcmdlJyB9KTtcbiAgICAgICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbc2hvd0NoYW5nZXNEaWFsb2ddKTtcblxuICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1Nob3cgY2hhbmdlcycsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5vbignY2xpY2snLCBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLnBhZ2VDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRQYWdlQ29udGVudCh0aGlzLnBhZ2VUaXRsZSk7XG5cbiAgICAgICAgICAgICAgICBzaG93Q2hhbmdlc0RpYWxvZy5zZXREYXRhKFtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIHNob3dDaGFuZ2VzRGlhbG9nLm9wZW4oKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBTZXR1cCBzeW5jIHRhbGsgY2hlY2tib3ggKi9cbiAgICAgICAgICAgIGlmICghdGhpcy5wYWdlVGl0bGVQYXJzZWQuaXNUYWxrUGFnZSgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWxrRGF0YSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcykpIGFzIFBhZ2VJbmZvUmVzdWx0O1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KHsgc2VsZWN0ZWQ6ICEhdGhpcy50YWxrRGF0YS5xdWVyeS5wYWdlc1swXS5yZWRpcmVjdCB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveExheW91dCA9IG5ldyBPTy51aS5XaWRnZXQoeyBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3luY1RhbGtDaGVja2JveCwgeyBsYWJlbDogJ1N5bmMgdGFsayBwYWdlJywgYWxpZ246ICdpbmxpbmUnIH0pXSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogU2V0dXAgcGF0cm9sIGNoZWNrYm94ICovXG4gICAgICAgICAgICBpZiAoYXdhaXQgdGhpcy5jaGVja1Nob3VsZFByb21wdFBhdHJvbCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KHsgc2VsZWN0ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94TGF5b3V0ID0gbmV3IE9PLnVpLldpZGdldCh7IGNvbnRlbnQ6IFtuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5wYXRyb2xDaGVja2JveCwgeyBsYWJlbDogJ01hcmsgYXMgcGF0cm9sbGVkJywgYWxpZ246ICdpbmxpbmUnIH0pXSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogU2V0dXAgbGF5b3V0ICovXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdExheW91dCA9IG5ldyBPTy51aS5Ib3Jpem9udGFsTGF5b3V0KHtcbiAgICAgICAgICAgICAgICBpZDogJ3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0JyxcbiAgICAgICAgICAgICAgICBpdGVtczogW3RoaXMuc3VibWl0QnV0dG9uLCB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLCB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLCB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQsIHRoaXMucGF0cm9sQ2hlY2tib3hMYXlvdXRdLmZpbHRlcihCb29sZWFuKSBhcyBPTy51aS5XaWRnZXRbXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIERldGVybWluZXMgaWYgdGhlIHVzZXIgc2hvdWxkIGJlIHByb21wdGVkIHRvIHBhdHJvbCB0aGUgcGFnZS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgY2hlY2tTaG91bGRQcm9tcHRQYXRyb2woKSB7XG4gICAgICAgICAgICBjb25zdCBwYWdlVHJpYWdlTWFya0J1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd2UtcHQtbWFyayAubXdlLXB0LXRvb2wtaWNvbicpIGFzIEhUTUxJbWFnZUVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgcGFnZVRyaWFnZU1hcmtCdXR0b24/LmNsaWNrKCk7XG4gICAgICAgICAgICBwYWdlVHJpYWdlTWFya0J1dHRvbj8uY2xpY2soKTtcblxuICAgICAgICAgICAgaWYgKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgIT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYXRyb2xsaW5rJykpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXJldmlld2VkLWJ1dHRvbicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd2UtcHQtbWFyay1hcy11bnJldmlld2VkLWJ1dHRvbicpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIW13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VyUGVybWlzc2lvbnMgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHsgYWN0aW9uOiAncXVlcnknLCBtZXRhOiAndXNlcmluZm8nLCB1aXByb3A6ICdyaWdodHMnIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5VXNlckluZm9QYXJhbXMpKSBhcyBVc2VyUGVybWlzc2lvbnNSZXNwb25zZTtcbiAgICAgICAgICAgICAgICBpZiAoIXVzZXJQZXJtaXNzaW9ucy5xdWVyeS51c2VyaW5mby5yaWdodHMuaW5jbHVkZXMoJ3BhdHJvbCcpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXRyb2xSZXNwb25zZSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdwYWdldHJpYWdlbGlzdCcsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VfaWQ6IG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJyksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgUGFnZVRyaWFnZUFwaVBhZ2VUcmlhZ2VMaXN0UGFyYW1zKSkgYXMgUGFnZVRyaWFnZUxpc3RSZXNwb25zZTtcblxuICAgICAgICAgICAgICAgIGlmIChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlc1swXT8udXNlcl9uYW1lID09PSBtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5yZXN1bHQgIT09ICdzdWNjZXNzJyB8fCBwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5wYWdlcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICBlbHNlIHJldHVybiAhTnVtYmVyLnBhcnNlSW50KHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzWzBdPy5wYXRyb2xfc3RhdHVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdW1tYXJ5IGlucHV0IHBsYWNlaG9sZGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSB1cGRhdGVTdW1tYXJ5KCkge1xuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RWYWx1ZSA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgaWYgKCFyZWRpcmVjdFZhbHVlKSAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSAnJztcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZXhpc3RzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0Q2hhbmdlZCA9IHJlZGlyZWN0VmFsdWUgIT09IHRoaXMub2xkUmVkaXJlY3RUYXJnZXQ/LnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFnc0NoYW5nZWQgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLnNvbWUoKHRhZykgPT4gIXRoaXMub2xkUmVkaXJlY3RUYWdzIS5pbmNsdWRlcyh0YWcgYXMgc3RyaW5nKSkgfHwgdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLnNvbWUoKHRhZykgPT4gIXRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSk7XG5cbiAgICAgICAgICAgICAgICBsZXQgdGFnQXJndW1lbnRzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzV2l0aFBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5maWx0ZXIoKFssIGRhdGFdKSA9PiBPYmplY3QuZW50cmllcyhkYXRhLnBhcmFtZXRlcnMpLmxlbmd0aCA+IDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW3RhZywgZGF0YV0gb2YgdGFnc1dpdGhQYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdXYXNTZWxlY3RlZCA9IHRoaXMub2xkUmVkaXJlY3RUYWdzIS5pbmNsdWRlcyh0YWcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdXYXNTZWxlY3RlZCB8fCAhdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyh0YWcpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkVGFnRGF0YSA9IHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhW3RhZyBhcyBzdHJpbmddID8/IE9iamVjdC5lbnRyaWVzKGRhdGEucGFyYW1ldGVycykubWFwKChbbmFtZV0pID0+IFtuYW1lLCAnJ10pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFRhZ0VkaXRvckRhdGEgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm5hbWUgPT09IHRhZykhO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBmb3VuZFRhZ0VkaXRvckRhdGEucGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZEFyZ3VtZW50ID0gb2xkVGFnRGF0YS5maW5kKChhcmd1bWVudCkgPT4gYXJndW1lbnRbMF0gPT09IHBhcmFtZXRlci5uYW1lKT8uWzFdID8/ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FyZ3VtZW50ID0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbGRBcmd1bWVudCAhPT0gbmV3QXJndW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnQXJndW1lbnRzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ0FyZ3VtZW50c0NoYW5nZWQpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdFNvcnRDaGFuZ2VkID0gdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCkudHJpbSgpICE9PSB0aGlzLm9sZERlZmF1bHRTb3J0IS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXNDaGFuZ2VkID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLnNvbWUoKGNhdGVnb3J5KSA9PiAhdGhpcy5vbGRDYXRlZ29yaWVzIS5pbmNsdWRlcyhjYXRlZ29yeSBhcyBzdHJpbmcpKSB8fFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZENhdGVnb3JpZXMhLnNvbWUoKGNhdGVnb3J5KSA9PiAhdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKGNhdGVnb3J5KSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gW107XG5cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Q2hhbmdlZCkgY2hhbmdlcy5wdXNoKGByZXRhcmdldCB0byBbWyR7cmVkaXJlY3RWYWx1ZX1dXWApO1xuICAgICAgICAgICAgICAgIGlmICh0YWdzQ2hhbmdlZClcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwICYmIHRoaXMub2xkUmVkaXJlY3RUYWdzIS5sZW5ndGggPiAwID8gJ2NoYW5nZScgOiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgPyAnYWRkJyA6ICdyZW1vdmUnfSBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXNgLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICh0YWdBcmd1bWVudHNDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goJ2NoYW5nZSBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBhcmd1bWVudHMnKTtcbiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdFNvcnRDaGFuZ2VkKVxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCkubGVuZ3RoID4gMCAmJiB0aGlzLm9sZERlZmF1bHRTb3J0IS5yZXBsYWNlQWxsKCdfJywgJyAnKS5sZW5ndGggPiAwID8gJ2NoYW5nZScgOiB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCkubGVuZ3RoID4gMCA/ICdhZGQnIDogJ3JlbW92ZSd9IGRlZmF1bHQgc29ydCBrZXlgLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yaWVzQ2hhbmdlZClcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5wdXNoKGAke3RoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwICYmIHRoaXMub2xkQ2F0ZWdvcmllcyEubGVuZ3RoID4gMCA/ICdjaGFuZ2UnIDogdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgPyAnYWRkJyA6ICdyZW1vdmUnfSBjYXRlZ29yaWVzYCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIGNoYW5nZXMucHVzaCgncGVyZm9ybSByZWRpcmVjdCBjbGVhbnVwJyk7XG5cbiAgICAgICAgICAgICAgICBjaGFuZ2VzWzBdID0gY2hhbmdlc1swXVswXS50b1VwcGVyQ2FzZSgpICsgY2hhbmdlc1swXS5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPiAxKSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV0gPSBgYW5kICR7Y2hhbmdlcy5hdCgtMSl9YDtcblxuICAgICAgICAgICAgICAgICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9IGNoYW5nZXMuam9pbihjaGFuZ2VzLmxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgICAgICAgIH0gZWxzZSAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSBgQ3JlYXRlIHJlZGlyZWN0IHRvIFtbJHtyZWRpcmVjdFZhbHVlfV1dYDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyBleGlzdGluZyBwYWdlIGRhdGEuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGxvYWRFeGlzdGluZ0RhdGEoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5leGlzdHMpIHRoaXMucGFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlKTtcblxuICAgICAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhcmdldCA9IHRoaXMucmVkaXJlY3RSZWdleC5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMV07XG5cbiAgICAgICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdzID0gKFxuICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKFt0YWcsIHRhZ0RhdGFdKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RhZywgLi4udGFnRGF0YS5hbGlhc2VzXS5zb21lKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KHRoaXMucGFnZUNvbnRlbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGFnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW11cbiAgICAgICAgICAgICkuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUmVkaXJlY3RUYWdzID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICAuZmxhdE1hcCgoW3RhZywgdGFnRGF0YV0pID0+IFt0YWcsIC4uLnRhZ0RhdGEuYWxpYXNlc10pXG4gICAgICAgICAgICAgICAgLm1hcCgodGFnT3JSZWRpcmVjdCkgPT4gKG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KHRoaXMucGFnZUNvbnRlbnQpID8gdGFnT3JSZWRpcmVjdCA6IG51bGwpKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsUmVkaXJlY3RUYWdzXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ1swXS50b0xvd2VyQ2FzZSgpfSR7dGFnWzBdfV0ke3RhZy5zbGljZSgxKX1cXFxcfD8oLio/KVxcXFxzKn19YCkuZXhlYyh0aGlzLnBhZ2VDb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3VGFnID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykuZmluZCgoW3RlbXBsYXRlLCB0YWdEYXRhXSkgPT4gW3RlbXBsYXRlLCAuLi50YWdEYXRhLmFsaWFzZXNdLmluY2x1ZGVzKHRhZykpPy5bMF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQXJndW1lbnRzID0gbWF0Y2g/LlsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb3JpZ2luYWxBcmd1bWVudHMpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRBcmd1bWVudHMgPSBtYXRjaFsxXS5zcGxpdCgnfCcpLm1hcCgoYXJndW1lbnQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhcmd1bWVudC5pbmNsdWRlcygnPScpKSByZXR1cm4gWyhpbmRleCArIDEpLnRvU3RyaW5nKCksIGFyZ3VtZW50LnRyaW0oKV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gYXJndW1lbnQuc3BsaXQoJz0nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbmFtZS50cmltKCksIHZhbHVlLnRyaW0oKV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuZXdUYWcsIGZvcm1hdHRlZEFyZ3VtZW50c107XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgW3N0cmluZywgc3RyaW5nW11bXV1bXSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMub2xkRGVmYXVsdFNvcnQgPVxuICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgLm1hdGNoKC97e0RFRkFVTFRTT1JUOi4qP319L2cpXG4gICAgICAgICAgICAgICAgICAgID8uYXQoLTEpXG4gICAgICAgICAgICAgICAgICAgID8uc2xpY2UoMTQsIC0yKVxuICAgICAgICAgICAgICAgICAgICA/LnRyaW0oKSA/PyAnJztcblxuICAgICAgICAgICAgdGhpcy5vbGRDYXRlZ29yaWVzID0gdGhpcy5wYWdlQ29udGVudC5tYXRjaCgvXFxbXFxbW0NjXWF0ZWdvcnk6Lis/XV0vZyk/Lm1hcCgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnNsaWNlKDExLCAtMikpID8/IFtdO1xuXG4gICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCA9IFtcbiAgICAgICAgICAgICAgICAve3tzaG9ydCBkZXNjcmlwdGlvblxcfC4qP319L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICAgICAgICAgIC97e0RJU1BMQVlUSVRMRTouKj99fS8uZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICAgICAgICAgIC97e2l0YWxpYyB0aXRsZVxcfD8uKj99fS9pLmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlswXSxcbiAgICAgICAgICAgICAgICAve3t0aXRsZSBsYW5ndWFnZVxcfC4qP319Ly5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAgICAgL3t7YXV0aG9yaXR5IGNvbnRyb2woXFx8Lio/KT99fS9pLmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlswXSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vbGRSZWRpcmVjdFRhcmdldCkgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKHRoaXMub2xkUmVkaXJlY3RUYXJnZXQucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgZWxzZSBtdy5ub3RpZnkoJ0NvdWxkIG5vdCBmaW5kIHJlZGlyZWN0IHRhcmdldCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKHRoaXMub2xkUmVkaXJlY3RUYWdzKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCBkYXRhXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFRlbXBsYXRlRWRpdG9yID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGVtcGxhdGVOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kVGVtcGxhdGVFZGl0b3IpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgYXJndW1lbnRdIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRQYXJhbWV0ZXJFZGl0b3IgPSBmb3VuZFRlbXBsYXRlRWRpdG9yLnBhcmFtZXRlcnMuZmluZCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIC4uLnBhcmFtZXRlci5hbGlhc2VzXS5pbmNsdWRlcyhwYXJhbWV0ZXJOYW1lKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kUGFyYW1ldGVyRWRpdG9yKSBmb3VuZFBhcmFtZXRlckVkaXRvci5lZGl0b3Iuc2V0VmFsdWUoYXJndW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMub2xkRGVmYXVsdFNvcnQpIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZSh0aGlzLm9sZERlZmF1bHRTb3J0KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiB0aGlzLm9sZENhdGVnb3JpZXMpIHRoaXMuY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKGNhdGVnb3J5KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUodGhpcy5vbGRDYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+ICh7IGRhdGE6IGNhdGVnb3J5LCBsYWJlbDogY2F0ZWdvcnkgfSkpKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyBjaGVja3Mgb24gdGhlIHByb3ZpZGVkIGRhdGEgYW5kIHJldHVybnMgdGhlIGVycm9ycyAoaWYgYW55KS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVTdWJtaXNzaW9uKCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzOiB7IHRpdGxlPzogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IGF1dG9GaXhlcz86ICh7IHR5cGU6ICdhZGQnIHwgJ3JlbW92ZSc7IHRhZzogc3RyaW5nIH0gfCB7IHR5cGU6ICdjaGFuZ2UtdGFyZ2V0JzsgdGFyZ2V0OiBzdHJpbmcgfSlbXSB9W10gPSBbXTtcblxuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICBjb25zdCB0YWdzID0gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAgICAgLyogSW52YWxpZCBjaGFyYWN0ZXJzICovXG4gICAgICAgICAgICBpZiAoIS9eXFxzKlteW1xcXXt8fV0rXFxzKiQvLnRlc3QoZGVzdGluYXRpb24pKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcblxuICAgICAgICAgICAgLyogRmFpbGVkIGR1cmluZyB0aXRsZSBwYXJzaW5nICovXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkRGVzdGluYXRpb24gPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChkZXN0aW5hdGlvbik7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA9PT0gMCkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFyc2VkRGVzdGluYXRpb24gJiYgZXJyb3JzLmxlbmd0aCA9PT0gMCkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG5cbiAgICAgICAgICAgIC8qIFNlbGYgcmVkaXJlY3RzICovXG4gICAgICAgICAgICBpZiAodGhpcy5wYXJzZWREZXN0aW5hdGlvbj8udG9TdHJpbmcoKSA9PT0gdGhpcy5wYWdlVGl0bGVQYXJzZWQudG9TdHJpbmcoKSkgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnY2Fubm90IHJlZGlyZWN0IHRvIGl0c2VsZiEnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkRhdGEgPSAoYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAuZ2V0KHsgYWN0aW9uOiAncXVlcnknLCBmb3JtYXR2ZXJzaW9uOiAnMicsIHByb3A6IFsncGFnZXByb3BzJywgJ2NhdGVnb3JpZXMnXSwgdGl0bGVzOiBkZXN0aW5hdGlvbiB9IHNhdGlzZmllcyBBcGlRdWVyeVBhZ2VQcm9wc1BhcmFtcylcbiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8qIE5vbmV4aXN0ZW50IGRlc3RpbmF0aW9uICovIGlmIChlcnJvckNvZGUgPT09ICdtaXNzaW5ndGl0bGUnKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2RvZXMgbm90IGV4aXN0IScgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8qIE90aGVyIEFQSSBlcnJvciAqLyBlbHNlIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiBgd2FzIG5vdCBhYmxlIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgQVBJICgke2Vycm9yQ29kZX0pIWAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH0pKSBhcyAoUGFnZXByb3BzUmVzdWx0ICYgQ2F0ZWdvcmllc1Jlc3VsdCkgfCBudWxsO1xuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25QYXJzZVJlc3VsdCA9IChhd2FpdCB0aGlzLmFwaS5nZXQoeyBhY3Rpb246ICdwYXJzZScsIHBhZ2U6IGRlc3RpbmF0aW9uLCBwcm9wOiAnc2VjdGlvbnMnLCByZWRpcmVjdHM6IHRydWUgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpKSBhcyBQYWdlUGFyc2VSZXN1bHQ7XG5cbiAgICAgICAgICAgIC8qIERvdWJsZSByZWRpcmVjdHMgKi9cbiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnJlZGlyZWN0cz8uWzBdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25SZWRpcmVjdCA9XG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvICsgKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvZnJhZ21lbnQgPyBgIyR7ZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHNbMF0udG9mcmFnbWVudH1gIDogJycpO1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgYSByZWRpcmVjdCB0byA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybChcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUmVkaXJlY3QsXG4gICAgICAgICAgICAgICAgICAgICl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHtkZXN0aW5hdGlvblJlZGlyZWN0fTwvYT4uIFJldGFyZ2V0IHRvIHRoYXQgcGFnZSBpbnN0ZWFkLCBhcyBkb3VibGUgcmVkaXJlY3RzIGFyZW4ndCBhbGxvd2VkLmAsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ2NoYW5nZS10YXJnZXQnLCB0YXJnZXQ6IGRlc3RpbmF0aW9uUmVkaXJlY3QgfV0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIE5vbmV4aXN0ZW50IHNlY3Rpb24gKi9cbiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZFNlY3Rpb24gPSBkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnNlY3Rpb25zLmZpbmQoKHNlY3Rpb24pID0+IHNlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKSA9PT0gZGVzdGluYXRpb24uc3BsaXQoJyMnKVsxXSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkU2VjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB0byBhbmNob3InKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgdGFnZ2VkIGFzIGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yLCBidXQgaXQgaXMgYWN0dWFsbHkgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBzZWN0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHRvIGFuY2hvcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCA8Y29kZT57e1IgdG8gc2VjdGlvbn19PC9jb2RlPiEnLCBhdXRvRml4ZXM6IFt7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHRvIHNlY3Rpb24nIH1dIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYXJzZWREZXN0aW5hdGlvbiEudG9TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICAgICAgICAgICAgICAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5jaG9ycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goLyg/PD17e1xccyo/W0FhXSg/Om5jaG9ycz98bmNob3IgZm9yIHJlZGlyZWN0fG5rZXJ8TkNIT1J8bmMpXFxzKj9cXHwpLis/KD89fX0pL2cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PiBhbmNob3Iuc3BsaXQoJ3wnKS5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmZsYXQoKSA/PyBbXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hdGNoKC8oPzw9e3tcXHMqPyg/OltWdl0oPzppc2libGUgYW5jaG9ycz98aXNhbmN8QW5jaHxhbmNob3J8aXNpYmxlYW5jaG9yfGEpfFtBYV0oPzpuY2hvcmR8Y2hvcmVkfG5jaG9yXFwrKXxbVHRdZXh0IGFuY2hvcilcXHMqP1xcfCkuKz8oPz0oPzwhIXw9KX19KS9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChhbmNob3I6IHN0cmluZykgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ3wnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiAhL150ZXh0XFxzKj89Ly50ZXN0KHBhcnQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5mbGF0KCkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudC5tYXRjaCgvKD88PWlkPSlcIj8uKz8oPz1cInw+fFxcfCkvZyk/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGFuY2hvci50cmltKCkpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnQubWF0Y2goL0VwaXNvZGVOdW1iZXIgKz0gK1xcZCsvZyk/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGBlcCR7YW5jaG9yLnNwbGl0KCc9JylbMV0udHJpbSgpfWApID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2hvcnMuaW5jbHVkZXMoZGVzdGluYXRpb24uc3BsaXQoJyMnKVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHRvIHNlY3Rpb24nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyB0YWdnZWQgYXMgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24sIGJ1dCBpdCBpcyBhY3R1YWxseSBhIHJlZGlyZWN0IHRvIGFuIGFuY2hvciEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gYW5jaG9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVtb3ZlJywgdGFnOiAnUiB0byBzZWN0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiBmcm9tIGFuY2hvcn19PC9jb2RlPiEnLCBhdXRvRml4ZXM6IFt7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHRvIGFuY2hvcicgfV0gfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKGRlc3RpbmF0aW9uKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9ufTwvYT4sIGJ1dCB0aGF0IHNlY3Rpb24gb3IgYW5jaG9yIGRvZXMgbm90IGV4aXN0IWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnY2hhbmdlLXRhcmdldCcsIHRhcmdldDogZGVzdGluYXRpb24uc3BsaXQoJyMnKVswXSB9XSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogSW1wcm9wZXJseSB0YWdnZWQgYXMgcmVkaXJlY3QgdG8gc2VjdGlvbi9hbmNob3IgKi9cbiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBbJ1IgdG8gc2VjdGlvbicsICdSIHRvIGFuY2hvciddKVxuICAgICAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcyh0YWcpKSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6IGBpcyBub3QgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24vYW5jaG9yLCBidXQgaXQgaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RhZ319fTwvY29kZT4hYCwgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnIH1dIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSA9ICEhKGRlc3RpbmF0aW9uRGF0YSEucXVlcnkucGFnZXNbMF0ucGFnZXByb3BzICYmICdkaXNhbWJpZ3VhdGlvbicgaW4gZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5wYWdlcHJvcHMpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0SXNTdXJuYW1lTGlzdCA9ICEhZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5jYXRlZ29yaWVzPy5zb21lKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudGl0bGUgPT09ICdDYXRlZ29yeTpTdXJuYW1lcycpO1xuXG4gICAgICAgICAgICBjb25zdCB0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3MgPSBbJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScsICdSIGZyb20gaW5jb21wbGV0ZSBkaXNhbWJpZ3VhdGlvbiddO1xuICAgICAgICAgICAgY29uc3QgdG9TdXJuYW1lTGlzdFRhZ3MgPSBbJ1IgZnJvbSBhbWJpZ3VvdXMgc29ydCBuYW1lJywgJ1IgZnJvbSBhbWJpZ3VvdXMgdGVybSddO1xuXG4gICAgICAgICAgICBjb25zdCB0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgPSB0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3Muc29tZSgodGVtcGxhdGUpID0+IHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKTtcbiAgICAgICAgICAgIGNvbnN0IHRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0ID0gdG9TdXJuYW1lTGlzdFRhZ3Muc29tZSgodGVtcGxhdGUpID0+IHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKTtcblxuICAgICAgICAgICAgLyogUmVkaXJlY3QgdG8gZGlzYW1iaWd1YXRpb24gcGFnZSB3aXRob3V0IHRlbXBsYXRlICovXG4gICAgICAgICAgICBpZiAodGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSAmJiAhdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhIGRpc2FtYmlndWF0aW9uIHBhZ2UsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggYSBkaXNhbWJpZ3VhdGlvbiBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSEnIH0pO1xuXG4gICAgICAgICAgICBpZiAoZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5wYWdlcHJvcHMgJiYgIXRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlKSB7XG4gICAgICAgICAgICAgICAgLyogSW1wcm9wZXJseSB0YWdnZWQgYXMgcmVkaXJlY3QgdG8gZGlzYW1iaWd1YXRpb24gcGFnZSAqL1xuICAgICAgICAgICAgICAgIGlmICgoIXRhcmdldElzU3VybmFtZUxpc3QgJiYgKHRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSB8fCB0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdCkpIHx8ICh0YXJnZXRJc1N1cm5hbWVMaXN0ICYmIHRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSkpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBub3QgYSByZWRpcmVjdCB0byBhIGRpc2FtYmlndWF0aW9uIHBhZ2UsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCBhIGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFsuLi50b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3MsIC4uLnRvU3VybmFtZUxpc3RUYWdzXS5tYXAoKHRhZykgPT4gKHsgdHlwZTogJ3JlbW92ZScsIHRhZyB9KSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLyogUmVkaXJlY3QgdG8gc3VybmFtZSBsaXN0IHdpdGhvdXQgdGVtcGxhdGUgKi9cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXNTdXJuYW1lTGlzdCAmJiAhdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBzdXJuYW1lIGxpc3QsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggYSBjb3JyZWN0IGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIHt7UiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlfX0gd2l0aG91dCBcIiAoZGlzYW1iaWd1YXRpb24pXCIgYXQgZW5kIG9mIHRpdGxlICovXG4gICAgICAgICAgICBpZiAodGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgJiYgdGFncy5pbmNsdWRlcygnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJykgJiYgIXRoaXMucGFnZVRpdGxlUGFyc2VkLmdldE1haW5UZXh0KCkuZW5kc1dpdGgoJyAoZGlzYW1iaWd1YXRpb24pJykpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlfX08L2NvZGU+LCBidXQgdGhpcyB0aXRsZSBkb2VzIG5vdCBlbmQgd2l0aCBcIiAoZGlzYW1iaWd1YXRpb24pXCIuIFVzZSA8Y29kZT57e1IgZnJvbSBhbWJpZ3VvdXMgdGVybX19PC9jb2RlPiBvciBhIHNpbWlsYXIgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgaW5zdGVhZCEnLFxuICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UnIH1dLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBUYWdnZWQgd2l0aCBhIHByb3RlY3Rpb24gdGVtcGxhdGUgKi9cbiAgICAgICAgICAgIGZvciAoY29uc3QgdGVtcGxhdGUgb2YgWydSIHByb3RlY3RlZCcsICdSIHNlbWktcHJvdGVjdGVkJywgJ1IgZXh0ZW5kZWQtcHJvdGVjdGVkJywgJ1IgdGVtcGxhdGUtcHJvdGVjdGVkJywgJ1IgZnVsbHkgcHJvdGVjdGVkJ10pXG4gICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgdGFnZ2VkIHdpdGggdW5uZWNlc3NhcmlseSB0YWdnZWQgd2l0aCA8Y29kZT57eyR7dGVtcGxhdGV9fX08L2NvZGU+IHdoaWNoIHdpbGwgYmUgZHVwbGljYXRlZCBieSB0aGUgcmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGwhYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogdGVtcGxhdGUgfV0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBMaW5rZWQgdG8gYSBXaWtpZGF0YSBpdGVtIHdpdGhvdXQgYmVpbmcgdGFnZ2VkIHdpdGgge3tSIHdpdGggV2lraWRhdGEgaXRlbX19ICovXG4gICAgICAgICAgICBpZiAobXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpICYmICF0YWdzLmluY2x1ZGVzKCdSIHdpdGggV2lraWRhdGEgaXRlbScpKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogXCJpcyBsaW5rZWQgdG8gYSBXaWtpZGF0YSBpdGVtIGJ1dCBpdCBpc24ndCB0YWdnZWQgd2l0aCA8Y29kZT57e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX08L2NvZGU+IVwiLCBhdXRvRml4ZXM6IFt7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHdpdGggV2lraWRhdGEgaXRlbScgfV0gfSk7XG5cbiAgICAgICAgICAgIC8qIFRhZ2dlZCB3aXRoIHt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fSB3aXRob3V0IGJlaW5nIGxpbmtlZCB0byBhbiBpdGVtICovXG4gICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nKSAmJiAhbXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fTwvY29kZT4gYnV0IGl0IGlzIG5vdCBhY3R1YWxseSBsaW5rZWQgdG8gYSBXaWtpZGF0YSBpdGVtIScsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJyB9XSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogTWlzc2luZyB0YWcgcmVxdWlyZWQgcGFyYW1ldGVyICovXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnRGF0YSA9IHRoaXMucmVkaXJlY3RUZW1wbGF0ZXNbdGFnXTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhZ0RhdGEpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGFnRGF0YS5wYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFBhcmFtZXRlciA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mb1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKVxuICAgICAgICAgICAgICAgICAgICAgICAgPy5wYXJhbWV0ZXJzLmZpbmQoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCAuLi5wYXJhbWV0ZXIuYWxpYXNlc10uaW5jbHVkZXMocGFyYW1ldGVyTmFtZSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZm91bmRQYXJhbWV0ZXIpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJEYXRhLnJlcXVpcmVkICYmICFmb3VuZFBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6IGBpcyB0YWdnZWQgd2l0aCA8Y29kZT57eyR7dGFnfX19PC9jb2RlPiBidXQgaXQgaXMgbWlzc2luZyB0aGUgcmVxdWlyZWQgcGFyYW1ldGVyIDxjb2RlPiR7cGFyYW1ldGVyTmFtZX08L2NvZGU+IWAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBTeW5jaW5nIHRhbGsgcGFnZSBidXQgdGFsayBwYWdlIGV4aXN0cyBhbmQgaXNuJ3QgYSByZWRpcmVjdCAqL1xuICAgICAgICAgICAgaWYgKHRoaXMuc3luY1RhbGtDaGVja2JveD8uaXNTZWxlY3RlZCgpICYmICF0aGlzLnRhbGtEYXRhIS5xdWVyeS5wYWdlc1swXS5taXNzaW5nICYmICF0aGlzLnRhbGtEYXRhIS5xdWVyeS5wYWdlc1swXS5yZWRpcmVjdClcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7IHRpdGxlOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSwgbWVzc2FnZTogJ2V4aXN0cywgYnV0IGlzIG5vdCBhIHJlZGlyZWN0IScgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBlcnJvcnM7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogSGFuZGxlcyB0aGUgZXZlbnQgd2hlbiB0aGUgdXNlciBjbGlja3MgdGhlIFwiU3VibWl0XCIgYnV0dG9uLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTdWJtaXRCdXR0b25DbGljaygpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzVG9EaXNhYmxlID0gW1xuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dCxcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdCxcbiAgICAgICAgICAgICAgICAuLi50aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmxhdE1hcCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLnBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci5lZGl0b3IpKSxcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQsXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdCxcbiAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dCxcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jVGFsa0NoZWNrYm94LFxuICAgICAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3gsXG4gICAgICAgICAgICBdLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzVG9EaXNhYmxlKSAoZWxlbWVudCBhcyBPTy51aS5XaWRnZXQpLnNldERpc2FibGVkKHRydWUpO1xuXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnQ2hlY2tpbmcgdGFyZ2V0IHZhbGlkaXR5Li4uJyk7XG5cbiAgICAgICAgICAgIGxldCBlcnJvcnM6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgdGhpcy52YWxpZGF0ZVN1Ym1pc3Npb24+PiA9IFtdO1xuICAgICAgICAgICAgaWYgKHRoaXMubmVlZHNDaGVjaykgZXJyb3JzID0gYXdhaXQgdGhpcy52YWxpZGF0ZVN1Ym1pc3Npb24oKTtcbiAgICAgICAgICAgIGVsc2UgdGhpcy5wYXJzZWREZXN0aW5hdGlvbiA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpKTtcblxuICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZWRpcmVjdC1oZWxwZXItd2FybmluZycpKSBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgeyB0aXRsZSwgbWVzc2FnZSwgYXV0b0ZpeGVzIH0gb2YgZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGl0bGUgPyBgPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwodGl0bGUpfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7dGl0bGV9PC9hPmAgOiAnVGhpcyBwYWdlJ30gJHttZXNzYWdlfSBDbGljayBhZ2FpbiB3aXRob3V0IG1ha2luZyBjaGFuZ2VzIHRvIHN1Ym1pdCBhbnl3YXkuYCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FybmluZ01lc3NhZ2UgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICdlcnJvcicsIGNsYXNzZXM6IFsncmVkaXJlY3QtaGVscGVyLXdhcm5pbmcnXSwgaW5saW5lOiB0cnVlLCBsYWJlbCB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvRml4QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnUGVyZm9ybSBhdXRvLWZpeCcsIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10sIGNsYXNzZXM6IFsncmVkaXJlY3QtaGVscGVyLWF1dG9maXgtYnV0dG9uJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdzID0gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0b0ZpeCBvZiBhdXRvRml4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9GaXgudHlwZSA9PT0gJ2FkZCcgJiYgIXRhZ3MuaW5jbHVkZXMoYXV0b0ZpeC50YWcpKSB0aGlzLnRhZ1NlbGVjdC5hZGRUYWcoYXV0b0ZpeC50YWcsIGF1dG9GaXgudGFnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeC50eXBlID09PSAncmVtb3ZlJyAmJiB0YWdzLmluY2x1ZGVzKGF1dG9GaXgudGFnKSkgdGhpcy50YWdTZWxlY3QucmVtb3ZlVGFnQnlEYXRhKGF1dG9GaXgudGFnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeC50eXBlID09PSAnY2hhbmdlLXRhcmdldCcpIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZShhdXRvRml4LnRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ01lc3NhZ2UuJGVsZW1lbnRbMF0uc3R5bGUudGV4dERlY29yYXRpb24gPSAnbGluZS10aHJvdWdoIDJweCBibGFjayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeEJ1dHRvbi4kZWxlbWVudFswXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXS5xdWVyeVNlbGVjdG9yKCcub28tdWktbGFiZWxFbGVtZW50LWxhYmVsJykhLmFwcGVuZChhdXRvRml4QnV0dG9uLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdLmFwcGVuZCh3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzVG9EaXNhYmxlKSAoZWxlbWVudCBhcyBPTy51aS5XaWRnZXQpLnNldERpc2FibGVkKGZhbHNlKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQgYW55d2F5Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIEVkaXQvY3JlYXRlIHJlZGlyZWN0ICovXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbChgJHt0aGlzLmV4aXN0cyA/ICdFZGl0aW5nJyA6ICdDcmVhdGluZyd9IHJlZGlyZWN0Li4uYCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9ICh0aGlzLnN1bW1hcnlJbnB1dC5nZXRWYWx1ZSgpIHx8ICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlcikgKyB0aGlzLnNjcmlwdEFkdmVydDtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUodGhpcy5wYWdlVGl0bGUsIG91dHB1dCwgc3VtbWFyeSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBtdy5ub3RpZnkoYFJlZGlyZWN0ICR7dGhpcy5leGlzdHMgPyAnZWRpdGVkJyA6ICdjcmVhdGVkJ30gc3VjY2Vzc2Z1bGx5IWAsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuXG4gICAgICAgICAgICAvKiBTeW5jIHRhbGsgcGFnZSBjaGVja2JveCBoYW5kbGVyICovXG4gICAgICAgICAgICBpZiAodGhpcy5zeW5jVGFsa0NoZWNrYm94Py5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnRWRpdGluZyB0YWxrIHBhZ2UuLi4nKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGZyb21Nb3ZlID0gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcygnUiBmcm9tIG1vdmUnKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuY3JlYXRlT3V0cHV0KHRoaXMucGFyc2VkRGVzdGluYXRpb24hLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLCBmcm9tTW92ZSA/IFsnUiBmcm9tIG1vdmUnXSA6IFtdLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgW10pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdGFsa1Jlc3VsdCA9IGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLCBvdXRwdXQsICdTeW5jaW5nIHJlZGlyZWN0IGZyb20gbWFpbiBwYWdlJyArIHRoaXMuc2NyaXB0QWR2ZXJ0KTtcbiAgICAgICAgICAgICAgICBpZiAoIXRhbGtSZXN1bHQpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIG13Lm5vdGlmeSgnVGFsayBwYWdlIHN5bmNlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFBhdHJvbCBjaGVja2JveCBoYW5kbGVyICovXG4gICAgICAgICAgICBpZiAodGhpcy5wYXRyb2xDaGVja2JveD8uaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1BhdHJvbGxpbmcgcmVkaXJlY3QuLi4nKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdHJvbExpbms6IEhUTUxBbmNob3JFbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYXRyb2xsaW5rIGEnKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXJrUmV2aWV3ZWRCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmstYXMtcmV2aWV3ZWQtYnV0dG9uJykgYXMgSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhdHJvbExpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0cm9sUmVzdWx0ID0gYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0V2l0aFRva2VuKCdwYXRyb2wnLCB7IGFjdGlvbjogJ3BhdHJvbCcsIHJjaWQ6IG5ldyBVUkwocGF0cm9sTGluay5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCdyY2lkJykhIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgRXJyb3IgcGF0cm9sbGluZyAke3RoaXMucGFnZVRpdGxlfSB2aWEgQVBJOiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXRyb2xSZXN1bHQpIG13Lm5vdGlmeSgnUmVkaXJlY3QgcGF0cm9sbGVkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hcmtSZXZpZXdlZEJ1dHRvbikge1xuICAgICAgICAgICAgICAgICAgICBtYXJrUmV2aWV3ZWRCdXR0b24uY2xpY2soKTtcbiAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KCdSZWRpcmVjdCBwYXRyb2xsZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBtdy5ub3RpZnkoJ1BhZ2UgY3VyYXRpb24gdG9vbGJhciBub3QgZm91bmQsIHJlZGlyZWN0IGNhbm5vdCBiZSBwYXRyb2xsZWQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnQ29tcGxldGUsIHJlbG9hZGluZy4uLicpO1xuXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IG13LnV0aWwuZ2V0VXJsKHRoaXMucGFnZVRpdGxlLCB7IHJlZGlyZWN0OiAnbm8nIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICogVGFrZXMgcHJvdmlkZWQgdmFsdWVzIHRvIGNyZWF0ZSB0aGUgcGFnZSBvdXRwdXQuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGNyZWF0ZU91dHB1dCh0YXJnZXQ6IHN0cmluZywgdGFnczogc3RyaW5nW10sIHN0cmF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLCBkZWZhdWx0U29ydDogc3RyaW5nIHwgdW5kZWZpbmVkLCBjYXRlZ29yaWVzOiBzdHJpbmdbXSkge1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkVGFyZ2V0ID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGFyZ2V0KTtcblxuICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkVGl0bGUgPSBwYXJzZWRUYXJnZXRcbiAgICAgICAgICAgICAgICA/IGAke3BhcnNlZFRhcmdldC5nZXROYW1lc3BhY2VJZCgpID09PSAxNCA/ICc6JyA6ICcnfSR7cGFyc2VkVGFyZ2V0LmdldFByZWZpeGVkVGV4dCgpfSR7cGFyc2VkVGFyZ2V0LmdldEZyYWdtZW50KCkgPyBgIyR7cGFyc2VkVGFyZ2V0LmdldEZyYWdtZW50KCl9YCA6ICcnfWBcbiAgICAgICAgICAgICAgICA6IHRhcmdldC50cmltKCk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZFxuICAgICAgICAgICAgICAgICAgICAuZ2V0TWFpblRleHQoKVxuICAgICAgICAgICAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvW1xcdTAzMDAtXFx1MDM2Rl0vZywgJycpID09PVxuICAgICAgICAgICAgICAgIGRlZmF1bHRTb3J0XG4gICAgICAgICAgICAgICAgICAgID8udG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvW1xcdTAzMDAtXFx1MDM2Rl0vZywgJycpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgZGVmYXVsdFNvcnQgPSB1bmRlZmluZWQ7IC8vIENoZWNrIGlmIHRpdGxlcyBub3JtYWxpemUgdG8gdGhlIHNhbWUgdGV4dCwgYW5kIHJlbW92ZXMgdGhlIERFRkFVTFRTT1JUIGlmIHNvXG5cbiAgICAgICAgICAgIGNvbnN0IHRhZ3NXaXRoQXJndW1lbnRzID0gdGFncy5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kQXJndW1lbnRFZGl0b3IgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpO1xuICAgICAgICAgICAgICAgIGlmICghZm91bmRBcmd1bWVudEVkaXRvcikgcmV0dXJuIGB7eyR7dGFnfX19YDtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVycy5maW5kTGFzdEluZGV4KChwYXJhbWV0ZXIsIGluZGV4KSA9PiBwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSAmJiBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IG1hcHBlZEFyZ3VtZW50cyA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVyc1xuICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlICYmIGluZGV4ID4gbGFzdE51bWJlclBhcmFtZXRlckluZGV4KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB8JHtwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSA/ICcnIDogYCR7cGFyYW1ldGVyLm5hbWV9PWB9JHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBge3ske3RhZ30ke21hcHBlZEFyZ3VtZW50c319fWA7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICBgI1JFRElSRUNUIFtbJHtmb3JtYXR0ZWRUaXRsZX1dXVxcbmAsIC8vXG4gICAgICAgICAgICAgICAgdGFncy5sZW5ndGggPiAwID8gYHt7UmVkaXJlY3QgY2F0ZWdvcnkgc2hlbGx8XFxuJHt0YWdzV2l0aEFyZ3VtZW50cy5qb2luKCdcXG4nKX1cXG59fVxcbmAgOiBudWxsLFxuICAgICAgICAgICAgICAgIHN0cmF5VGV4dCA/IHN0cmF5VGV4dCArICdcXG4nIDogbnVsbCxcbiAgICAgICAgICAgICAgICBkZWZhdWx0U29ydCA/IGB7e0RFRkFVTFRTT1JUOiR7ZGVmYXVsdFNvcnQudHJpbSgpfX19YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5sZW5ndGggPiAwID8gY2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBgW1tDYXRlZ29yeToke2NhdGVnb3J5fV1dYCkuam9pbignXFxuJykgOiBudWxsLFxuICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2hlcyB0aGUgY29udGVudCBvZiBhIGdpdmVuIHBhZ2UuXG4gICAgICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgdG8gZmV0Y2guXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGdldFBhZ2VDb250ZW50KHRpdGxlOiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aXRsZSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgICAgICkucXVlcnkucGFnZXNbMF0ucmV2aXNpb25zWzBdLnNsb3RzLm1haW4uY29udGVudC50cmltKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRWRpdHMgb3IgY3JlYXRlcyBhIHBhZ2Ugd2l0aCBnaXZlbiB0ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHBhZ2UgdGl0bGUuXG4gICAgICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBwYWdlIHRleHQuXG4gICAgICAgICAqIEBwYXJhbSBzdW1tYXJ5IFRoZSBlZGl0IHN1bW1hcnkuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGVkaXRPckNyZWF0ZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHN1bW1hcnk6IHN0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLmVkaXQodGl0bGUsICgpID0+ICh7IHRleHQsIHN1bW1hcnkgfSkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ25vY3JlYXRlLW1pc3NpbmcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpLmNyZWF0ZSh0aXRsZSwgeyBzdW1tYXJ5IH0sIHRleHQpLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEVycm9yIGNyZWF0aW5nICR7dGl0bGV9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBFcnJvciBlZGl0aW5nIG9yIGNyZWF0aW5nICR7dGl0bGV9OiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCwgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5ldyBSZWRpcmVjdEhlbHBlcigpLnJ1bigpO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7YUE2Q0EsR0FBRyxPQUFPLE1BQU0sQ0FBQyxpQkFBa0IsZUFBZ0Isa0JBQW1CLGtCQUFtQiwrQkFBZ0MsbUNBQW1DLEVBQUcsSUFBTSxDQU1qSyxNQUFNQSxVQUFrQyxHQUFHLEdBQUcsZUFBZ0IsQ0FFbEQsSUFBTSxJQUFJLEdBQUcsSUFHYixnQkFFUixZQUFZQyxFQUE2QkMsRUFBMkIsQ0FDaEUsTUFBTUQsQ0FBTSxFQUNaLEdBQUcsR0FBRyxNQUFNLGNBQWMsS0FBSyxLQUE4Q0EsQ0FBTSxFQUVuRixLQUFLLGdCQUFrQkMsQ0FDM0IsQ0FFQSxpQkFBbUIsSUFBTSxDQUNyQixNQUFNQyxFQUFRLEtBQUssU0FBUyxFQUN0QkMsRUFBVyxFQUFFLFNBQVMsRUFFNUIsR0FBSSxDQUFDRCxFQUFPQyxFQUFTLFFBQVEsQ0FBQyxDQUFDLFVBQ3RCRCxFQUFNLFNBQVMsR0FBRyxFQUFHLENBQzFCLE1BQU1FLEVBQVFGLEVBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUVoQyxLQUFLLElBQ0EsSUFBSSxDQUFFLE9BQVEsUUFBUyxLQUFNRSxFQUFPLEtBQU0sV0FBWSxVQUFXLEVBQUssQ0FBMEIsRUFDaEcsTUFBTSxJQUFNLElBQUksRUFDaEIsS0FBTUMsR0FBbUMsQ0FDdEMsR0FBSUEsRUFBUSxDQUNSLE1BQU1DLEVBQWtCRCxFQUFPLE1BQU0sU0FBUyxPQUFRRSxHQUNsREEsRUFBUSxLQUNILFlBQVksRUFDWixXQUFXLFVBQVcsRUFBRSxFQUN4QixXQUFXTCxFQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FDckQsRUFDQUMsRUFBUyxRQUNMRyxFQUFnQixJQUFLQyxJQUFhLENBQzlCLEtBQU0sR0FBR0YsRUFBTyxNQUFNLEtBQUssSUFBSUUsRUFBUSxLQUFLLFdBQVcsVUFBVyxFQUFFLENBQUMsR0FDckUs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VCxPQUFRQSxDQUNaLENBQW1DLEdBQ3JDLE1BQU0sTUFBTSxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsTUFBTSxLQUFLLFFBQVEsS0FBSyxDQUMxRCxDQVFBLE1BQWMsYUFBYUEsRUFBZWdJLEVBQWM5RSxFQUFpQixDQUNyRSxPQUFPLE1BQU0sS0FBSyxJQUNiLEtBQUtsRCxFQUFPLEtBQU8sQ0FBRSxLQUFBZ0ksRUFBTSxRQUFBOUUsQ0FBUSxFQUFFLEVBQ3JDLE1BQU0sQ0FBQzRDLEVBQW1Cd0IsSUFDbkJ4QixJQUFjLG1CQUNQLEtBQUssSUFBSSxPQUFPOUYsRUFBTyxDQUFFLFFBQUFrRCxDQUFRLEVBQUc4RSxDQUFJLEVBQUUsTUFBTSxDQUFDbEMsRUFBbUJ3QixJQUFrQyxDQUN6RyxHQUFHLE9BQU8sa0JBQWtCdEgsQ0FBSyxLQUFLc0gsR0FBVyxNQUFNLE1BQVEsZUFBZSxLQUFLeEIsQ0FBUyxJQUFLLENBQUUsS0FBTSxPQUFRLENBQUMsQ0FDdEgsQ0FBQyxHQUVELEdBQUcsT0FBTyw2QkFBNkI5RixDQUFLLEtBQUtzSCxHQUFXLE1BQU0sTUFBUSxlQUFlLEtBQUt4QixDQUFTLElBQUssQ0FBRSxLQUFNLE9BQVEsQ0FBQyxFQUN0SCxLQUVkLENBQ1QsQ0FDSixDQUVBLElBQUl2RSxFQUFlLEVBQUUsSUFBSSxDQUM3QixDQUFDIiwKICAibmFtZXMiOiBbIlJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQiLCAiY29uZmlnIiwgInBhZ2VUaXRsZVBhcnNlZCIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJ0aXRsZSIsICJyZXN1bHQiLCAibWF0Y2hlZFNlY3Rpb25zIiwgInNlY3Rpb24iLCAicGFyc2VkVGl0bGUiLCAicGFnZSIsICJyZXNwb25zZSIsICJkYXRhIiwgImxhYmVsIiwgIkNhdGVnb3J5SW5wdXRXaWRnZXQiLCAicGFnZXMiLCAiY2F0ZWdvcnkiLCAidGl0bGVXaXRob3V0TmFtZXNwYWNlIiwgIlRlbXBsYXRlUHJldmlld0RpYWxvZyIsICJ0YWdzQ29udGVudCIsICJjYXRlZ29yaWVzQ29udGVudCIsICJwYW5lbExheW91dCIsICJhY3Rpb24iLCAiU2hvd0NoYW5nZXNEaWFsb2ciLCAib2xkVGV4dCIsICJuZXdUZXh0IiwgImNvbXBhcmlzb24iLCAibm9DaGFuZ2VzRWxlbWVudCIsICJSZWRpcmVjdEhlbHBlciIsICJwYWdlSW5mbyIsICJkaWFsb2dJbmZvIiwgImJ1dHRvbiIsICJSZWRpcmVjdEhlbHBlckRpYWxvZyIsICJwb3J0bGV0TGluayIsICJldmVudCIsICJyZWRpcmVjdFRlbXBsYXRlcyIsICJjb250ZW50VGV4dCIsICJwYWdlVGl0bGUiLCAiZXhpc3RzIiwgIm1haW5QYWdlQ29udGVudCIsICJ0YXJnZXQiLCAidGFnT3JSZWRpcmVjdCIsICJ0YWciLCAicmVkaXJlY3QiLCAic29ydGVkVGFncyIsICJhIiwgImIiLCAiZWRpdG9ySW5mbyIsICJzaG93blRlbXBsYXRlRWRpdG9ycyIsICJzdW1tYXJ5RWxlbWVudCIsICJub1RlbXBsYXRlc01lc3NhZ2UiLCAidGVtcGxhdGVOYW1lIiwgInRlbXBsYXRlRGF0YSIsICJwYXJhbWV0ZXJzIiwgImRldGFpbHMiLCAic3VtbWFyeSIsICJlbGVtZW50RGF0YSIsICJwYXJhbWV0ZXJOYW1lIiwgInBhcmFtZXRlckRhdGEiLCAiaW5wdXQiLCAiaW5wdXRMYXlvdXQiLCAibmFtZSIsICJnZW5lcmF0aW9uYWxTdWZmaXgiLCAibGFzdE5hbWUiLCAib3RoZXJOYW1lcyIsICJuZXdOYW1lIiwgImxlYWRpbmdBcnRpY2xlIiwgIndpbmRvd01hbmFnZXIiLCAidGVtcGxhdGVQcmV2aWV3RGlhbG9nIiwgInNob3dDaGFuZ2VzRGlhbG9nIiwgInBhZ2VUcmlhZ2VNYXJrQnV0dG9uIiwgInBhdHJvbFJlc3BvbnNlIiwgInJlZGlyZWN0VmFsdWUiLCAidGFyZ2V0Q2hhbmdlZCIsICJ0YWdzQ2hhbmdlZCIsICJ0YWdBcmd1bWVudHNDaGFuZ2VkIiwgInRhZ3NXaXRoUGFyYW1ldGVycyIsICJvbGRUYWdEYXRhIiwgImZvdW5kVGFnRWRpdG9yRGF0YSIsICJ0ZW1wbGF0ZSIsICJwYXJhbWV0ZXIiLCAib2xkQXJndW1lbnQiLCAiYXJndW1lbnQiLCAibmV3QXJndW1lbnQiLCAiZGVmYXVsdFNvcnRDaGFuZ2VkIiwgImNhdGVnb3JpZXNDaGFuZ2VkIiwgImNoYW5nZXMiLCAidGFnRGF0YSIsICJvcmlnaW5hbFJlZGlyZWN0VGFncyIsICJtYXRjaCIsICJuZXdUYWciLCAiZm9ybWF0dGVkQXJndW1lbnRzIiwgImluZGV4IiwgImZvdW5kVGVtcGxhdGVFZGl0b3IiLCAiZm91bmRQYXJhbWV0ZXJFZGl0b3IiLCAiZXJyb3JzIiwgImRlc3RpbmF0aW9uIiwgInRhZ3MiLCAiZGVzdGluYXRpb25EYXRhIiwgImVycm9yQ29kZSIsICJkZXN0aW5hdGlvblBhcnNlUmVzdWx0IiwgImRlc3RpbmF0aW9uUmVkaXJlY3QiLCAiZGVzdGluYXRpb25Db250ZW50IiwgImFuY2hvciIsICJwYXJ0IiwgInRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlIiwgInRhcmdldElzU3VybmFtZUxpc3QiLCAidG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzIiwgInRvU3VybmFtZUxpc3RUYWdzIiwgInRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSIsICJ0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdCIsICJmb3VuZFBhcmFtZXRlciIsICJlbGVtZW50c1RvRGlzYWJsZSIsICJlbGVtZW50IiwgIm1lc3NhZ2UiLCAiYXV0b0ZpeGVzIiwgIndhcm5pbmdNZXNzYWdlIiwgImF1dG9GaXhCdXR0b24iLCAiYXV0b0ZpeCIsICJvdXRwdXQiLCAiZnJvbU1vdmUiLCAicGF0cm9sTGluayIsICJtYXJrUmV2aWV3ZWRCdXR0b24iLCAiZXJyb3JJbmZvIiwgInN0cmF5VGV4dCIsICJkZWZhdWx0U29ydCIsICJjYXRlZ29yaWVzIiwgInBhcnNlZFRhcmdldCIsICJmb3JtYXR0ZWRUaXRsZSIsICJ0YWdzV2l0aEFyZ3VtZW50cyIsICJmb3VuZEFyZ3VtZW50RWRpdG9yIiwgImxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCIsICJtYXBwZWRBcmd1bWVudHMiLCAidGV4dCJdCn0K