Jump to content

User:Eejit43/scripts/redirect-helper.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Eejit43 (talk | contribs) at 16:58, 13 December 2024 (Syncing script from GitHub (via script)). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/redirect-helper/redirect-helper.ts

"use strict";(()=>{var D=Object.defineProperty;var O=(g,t)=>()=>(g&&(t=g(g=0)),t);var A=(g,t)=>{for(var i in t)D(g,i,{get:t[i],enumerable:!0})};var w,v=O(()=>{"use strict";w=class extends OO.ui.TextInputWidget{api=new mw.Api;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{let t=this.getValue(),i=$.Deferred();t||i.resolve([]);let 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){let s=a.query.pages.filter(r=>!r.categories?.some(o=>o.title==="Category:Wikipedia soft redirected categories")).map(r=>{let o=r.title.split(":")[1];return{data:o,label:o}});this.emit("showing-values",s),i.resolve(s)}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(w.prototype,OO.ui.mixin.LookupElement.prototype)});var b,S=O(()=>{"use strict";b=class g extends OO.ui.ProcessDialog{api=new mw.Api;constructor(t){super(t),g.static.name="ShowChangesDialog",g.static.title="Changes to be made",g.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>g.super.prototype.getSetupProcess.call(this).next(()=>{let[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=>{let a=e.compare.body,s=new OO.ui.MessageWidget({type:"warning",label:"No changes to make!"}),r=new OO.ui.PanelLayout({padded:!0,expanded:!1});r.$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>`:s.$element[0]),this.$body.append(r.$element)})});getActionProcess=t=>t?new OO.ui.Process(()=>{this.close()}):g.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>g.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};Object.assign(b.prototype,OO.ui.ProcessDialog.prototype)});var T,k=O(()=>{"use strict";T=class g extends OO.ui.ProcessDialog{api=new mw.Api;pageTitleParsed;constructor(t,i){super(t),this.pageTitleParsed=i,g.static.name="OutputPreviewDialog",g.static.title="Redirect categorization templates preview",g.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>g.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=>{let 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.close()}):g.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>g.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};Object.assign(T.prototype,OO.ui.ProcessDialog.prototype)});var x,R=O(()=>{"use strict";x=class 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=()=>{let t=this.getValue(),i=$.Deferred();if(!t)i.resolve([]);else if(t.includes("#")){let e=t.split("#")[0];this.api.get({action:"parse",page:e,prop:"sections",redirects:!0}).catch(()=>null).then(a=>{if(a){let s=a.parse.sections.filter(r=>r.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(t.split("#")[1].toLowerCase()));i.resolve(s.map(r=>({data:`${a.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`,label:`${a.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`})))}else i.resolve([])})}else{let 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(s=>s.title!==this.pageTitleParsed.getPrefixedText()).map(s=>({data:s.title,label:new OO.ui.HtmlSnippet(`${s.title}${s.pageprops&&"disambiguation"in s.pageprops?" <i>(disambiguation)</i>":""}${"redirect"in s?" <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)});var C={};A(C,{default:()=>P});var P,I=O(()=>{"use strict";v();S();k();R();P=class{api=new mw.Api;redirectRegex=/^#redirect:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+?)?]]\s*/i;scriptMessage=" (via [[w:en: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},s){this.redirectTemplates=t,this.contentText=i,this.pageTitle=e,this.pageTitleParsed=a,this.exists=s}async load(){mw.util.addCSS(`
#create-redirect-button {
    margin-bottom: 20px;
}

#redirect-helper-box {
    margin-right: auto;
    margin-bottom: 25px !important;
    margin-left: auto;
    background-color: whitesmoke;
    width: 700px;
    max-width: calc(100% - 50px);
    color: #202122;
}

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

.redirect-helper-template-parameters-container summary {
    cursor: pointer;
    font-weight: bold;
}

.redirect-helper-template-parameters-container details {
    margin-block: 5px;
    background-color: #d1cece;
}

#redirect-helper-no-templates-message {
    padding: 5px;
}

#redirect-helper-summary-layout {
    margin-top: 15px;
    border-top: 1px solid gray;
    padding-top: 10px;
}

#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(){let 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",()=>{let 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()?.getPrefixedText()??""),["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};let s=new OO.ui.HtmlSnippet(`<span class="redirect-helper-redirect-possibilities">${e}</span>`);return{data:e,label:s}})}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",()=>{let e=this.tagSelect.getValue().sort((s,r)=>s.toLowerCase().localeCompare(r.toLowerCase()));this.tagSelect.getValue().join(";")!==e.join(";")&&this.tagSelect.setValue(e),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0;for(let s of this.templateEditorsInfo)s.details.style.display="none";let a=0;for(let s of this.tagSelect.getValue()){let r=this.templateEditorsInfo.find(o=>o.name===s);r&&(r.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");let t=document.createElement("summary");t.textContent="Template parameters (none to show)",this.templateParametersEditor.append(t);for(let[e,a]of Object.entries(this.redirectTemplates)){let s=Object.entries(a.parameters);if(s.length===0)continue;let r=document.createElement("details");r.style.display="none";let o=document.createElement("summary");o.textContent=e,r.append(o);let n={name:e,details:r,parameters:[]};for(let[u,l]of s){let m=new OO.ui.TextInputWidget({placeholder:l.default?.toString(),required:l.required});m.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});let p=new OO.ui.FieldLayout(m,{label:new OO.ui.HtmlSnippet(`${u}${!l.label||u.toLowerCase()===l.label?.toLowerCase()?"":` (${l.label})`}${l.description?` (${l.description})`:""} (type: ${l.type}) ${l.suggested?" (suggested)":""}${l.example?` (example: "${l.example}")`:""}`),align:"inline"});r.append(p.$element[0]),n.parameters.push({name:u,aliases:l.aliases,editor:m})}this.templateParametersEditor.append(r),this.templateEditorsInfo.push(n)}let 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",()=>{let 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;let s=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),r=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(s+", "+r+a)}else{let a=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(let s of["An","A","The"])if(a.startsWith(s+" ")){a=a.slice(s.length+1)+", "+s;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 w({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(let 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",()=>{let e=this.categorySelect.getValue().sort((a,s)=>a.toLowerCase().localeCompare(s.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(){let 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());let i=new T({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()});let e=new b({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(){let 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 mw.user.getRights()).includes("patrol"))return!1;let 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(){let t=this.redirectInput.getValue().trim();if(!t)this.summaryInput.$tabIndexed[0].placeholder="";else if(this.exists){let i=this.oldRedirectTarget?.replaceAll("_"," ");i&&(i=i[0].toUpperCase()+i.slice(1));let e=t!==i,a=this.tagSelect.getValue().some(u=>!this.oldRedirectTags.includes(u))||this.oldRedirectTags.some(u=>!this.tagSelect.getValue().includes(u)),s=!1;if(this.oldRedirectTagData){let u=Object.entries(this.redirectTemplates).filter(([,l])=>Object.entries(l.parameters).length>0);for(let[l,m]of u){if(!this.oldRedirectTags.includes(l)||!this.tagSelect.getValue().includes(l))continue;let c=this.oldRedirectTagData[l]??Object.entries(m.parameters).map(([d])=>[d,""]),h=this.templateEditorsInfo.find(d=>d.name===l);for(let d of h.parameters){let f=c.find(L=>L[0]===d.name)?.[1]??"",y=d.editor.getValue().trim();if(f!==y){s=!0;break}}if(s)break}}let r=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),o=this.categorySelect.getValue().some(u=>!this.oldCategories.includes(u))||this.oldCategories.some(u=>!this.categorySelect.getValue().includes(u)),n=[];e&&n.push(`retarget to [[${t}]]`),a&&n.push(`${this.tagSelect.getValue().length>0&&this.oldRedirectTags.length>0?"change":this.tagSelect.getValue().length>0?"add":"remove"} categorization templates`),s&&n.push("change categorization template arguments"),r&&n.push(`${this.defaultSortInput.getValue().trim().length>0&&this.oldDefaultSort.replaceAll("_"," ").length>0?"change":this.defaultSortInput.getValue().trim().length>0?"add":"remove"} default sort key`),o&&n.push(`${this.categorySelect.getValue().length>0&&this.oldCategories.length>0?"change":this.categorySelect.getValue().length>0?"add":"remove"} categories`),n.length===0&&n.push("perform redirect cleanup"),n[0]=n[0][0].toUpperCase()+n[0].slice(1),n.length>1&&(n[n.length-1]=`and ${n.at(-1)}`),this.summaryInput.$tabIndexed[0].placeholder=n.join(n.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()));let 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=>{let e=new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\|?(.*?)\\s*}}`).exec(this.pageContent),a=Object.entries(this.redirectTemplates).find(([o,n])=>[o,...n.aliases].includes(i))?.[0];if(!e?.[1])return null;let r=e[1].split("|").map((o,n)=>{if(!o.includes("="))return[(n+1).toString(),o.trim()];let[u,l]=o.split("=");return[u.trim(),l.trim()]});return[a,r]}).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(let[i,e]of Object.entries(this.oldRedirectTagData)){let a=this.templateEditorsInfo.find(s=>s.name===i);if(a)for(let[s,r]of e){let o=a.parameters.find(n=>[n.name,...n.aliases].includes(s));o&&o.editor.setValue(r)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(let i of this.oldCategories)this.categorySelect.addAllowedValue(i);this.categorySelect.setValue(this.oldCategories.map(i=>({data:i,label:i}))),this.updateSummary()}async validateSubmission(){let 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?.getPrefixedText()===this.pageTitleParsed.getPrefixedText()&&t.push({message:"cannot redirect to itself!"});let a=await this.api.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:i}).catch(p=>(p==="missingtitle"?t.push({title:i,message:"does not exist!"}):t.push({title:i,message:`was not able to be fetched from the API (${p})!`}),null)),s=await this.api.get({action:"parse",page:i,prop:"sections",redirects:!0});if(s.parse.redirects?.[0]){let p=s.parse.redirects[0].to+(s.parse.redirects[0].tofragment?`#${s.parse.redirects[0].tofragment}`:"");t.push({title:i,message:`is a redirect to <a href="${mw.util.getUrl(p)}" target="_blank">${p}</a>. Retarget to that page instead, as double redirects aren't allowed.`,autoFixes:[{type:"change-target",target:p}]})}if(i.split("#").length>1)if(s.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{let c=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.parsedDestination.getPrefixedText()})).query.pages[0].revisions[0].slots.main.content;[...c.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(d=>d.split("|").map(f=>f.trim()))?.flat()??[],...c.match(/(?<={{\s*?(?:[Vv](?:isible anchors?|isanc|Anch|anchor|isibleanchor|a)|[Aa](?:nchord|chored|nchor\+)|[Tt]ext anchor)\s*?\|).+?(?=(?<!!|=)}})/g)?.map(d=>d.split("|").map(f=>f.trim()).filter(f=>!/^text\s*?=/.test(f)))?.flat()??[],...c.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(d=>d.trim())??[],...c.match(/EpisodeNumber += +\d+/g)?.map(d=>`ep${d.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(let p of["R to section","R to anchor"])e.includes(p)&&t.push({message:`is not a redirect to a section/anchor, but it is tagged with <code>{{${p}}}</code>!`,autoFixes:[{type:"remove",tag:p}]});let r=!!(a.query.pages[0].pageprops&&"disambiguation"in a.query.pages[0].pageprops),o=!!a.query.pages[0].categories?.some(p=>p.title==="Category:Surnames"),n=["R to disambiguation page","R from incomplete disambiguation"],u=["R from ambiguous sort name","R from ambiguous term"],l=n.some(p=>e.includes(p)),m=u.some(p=>e.includes(p));r&&!l&&!m&&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&&!r&&((!o&&(l||m)||o&&l)&&t.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!",autoFixes:[...n,...u].map(p=>({type:"remove",tag:p}))}),o&&!m&&t.push({message:"is a redirect to a surname list, but it is not tagged with a correct disambiguation categorization template!"})),r&&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(let p of["R protected","R semi-protected","R extended-protected","R template-protected","R fully protected"])e.includes(p)&&t.push({message:`is tagged with unnecessarily tagged with <code>{{${p}}}</code> which will be duplicated by the redirect category shell!`,autoFixes:[{type:"remove",tag:p}]});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(let p of e){let c=this.redirectTemplates[p];if(c)for(let[h,d]of Object.entries(c.parameters)){let f=this.templateEditorsInfo.find(y=>y.name===p)?.parameters.find(y=>[y.name,...y.aliases].includes(h));f&&d.required&&!f.editor.getValue().trim()&&t.push({message:`is tagged with <code>{{${p}}}</code> but it is missing the required parameter <code>${h}</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(){let t=[this.redirectInput,this.tagSelect,...this.templateEditorsInfo.flatMap(r=>r.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(let r of t)r.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(let r of document.querySelectorAll(".redirect-helper-warning"))r.remove();for(let{title:r,message:o,autoFixes:n}of i){let u=new OO.ui.HtmlSnippet(`${r?`<a href="${mw.util.getUrl(r)}" target="_blank">${r}</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:u});if(n){let m=new OO.ui.ButtonWidget({label:"Perform auto-fix",flags:["progressive"],classes:["redirect-helper-autofix-button"]});m.on("click",()=>{let p=this.tagSelect.getValue();for(let c of n)c.type==="add"&&!p.includes(c.tag)&&this.tagSelect.addTag(c.tag,c.tag),c.type==="remove"&&p.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",m.$element[0].remove()}),l.$element[0].querySelector(".oo-ui-labelElement-label").append(m.$element[0])}this.editorBox.$element[0].append(l.$element[0])}for(let r of t)r.setDisabled(!1);this.submitButton.setLabel("Submit anyway"),this.needsCheck=!1;return}this.submitButton.setLabel(`${this.exists?"Editing":"Creating"} redirect...`);let 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.scriptMessage;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...");let r=this.tagSelect.getValue().includes("R from move"),o=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),r?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),o,"Syncing redirect from main page"+this.scriptMessage))return;mw.notify("Talk page synced successfully!",{type:"success"})}if(this.patrolCheckbox?.isSelected()){this.submitButton.setLabel("Patrolling redirect...");let r=document.querySelector(".patrollink a"),o=document.querySelector("#mwe-pt-mark-as-reviewed-button");r?await this.api.postWithToken("patrol",{action:"patrol",rcid:new URL(r.href).searchParams.get("rcid")}).catch((u,l)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${l?.error.info??"Unknown error"} (${u})`,{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,s){let r=mw.Title.newFromText(t),o=r?`${r.getNamespaceId()===14?":":""}${r.getPrefixedText()}${r.getFragment()?`#${r.getFragment()}`:""}`:t.trim();this.pageTitleParsed.getMainText().toLocaleLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")===a?.toLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")&&(a=void 0);let n=i.map(u=>{let l=this.templateEditorsInfo.find(c=>c.name===u);if(!l)return`{{${u}}}`;let m=l.parameters.findLastIndex((c,h)=>c.name===(h+1).toString()&&c.editor.getValue().trim()),p=l.parameters.map((c,h)=>{let d=c.editor.getValue().trim();return!d&&h>m?null:`|${c.name===(h+1).toString()?"":`${c.name}=`}${d}`}).filter(Boolean).join("");return`{{${u}${p}}}`});return[`#REDIRECT [[${o}]]
`,i.length>0?`{{Redirect category shell|
${n.join(`
`)}
}}
`:null,e?e+`
`:null,a?`{{DEFAULTSORT:${a.trim()}}}`:null,s.length>0?s.map(u=>`[[Category:${u}]]`).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,s)=>a==="nocreate-missing"?this.api.create(t,{summary:e},i).catch((r,o)=>{mw.notify(`Error creating ${t}: ${o?.error.info??"Unknown error"} (${r})`,{type:"error"})}):(mw.notify(`Error editing or creating ${t}: ${s?.error.info??"Unknown error"} (${a})`,{type:"error"}),null))}}});var E=["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","oojs-ui.styles.icons-content","oojs-ui.styles.icons-editing-core"];mw.loader.using(E,async()=>{let{default:g}=await Promise.resolve().then(()=>(I(),C));class t{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("wgAction")==="view"||mw.config.get("wgAction")==="edit",(mw.config.get("wgRevisionId")||mw.config.get("wgCurRevisionId"))===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(){let e=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitle}),a={redirectTemplates:this.redirectTemplates,contentText:this.contentText,pageTitle:this.pageTitle,pageTitleParsed:this.pageTitleParsed};if(e.query.pages[0].missing){mw.util.addCSS(`
#create-redirect-button {
    margin-bottom: 20px;
}`);let s=new OO.ui.ButtonWidget({id:"create-redirect-button",label:"Create redirect",icon:"articleRedirect",flags:["progressive"]});s.on("click",()=>{s.$element[0].remove(),new g(a,!1).load()}),this.contentText.prepend(s.$element[0])}else if(e.query.pages[0].redirect)new g(a,!0).load();else{let s=mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Redirect page","redirect-helper");s.addEventListener("click",r=>{r.preventDefault(),new g(a,!1).load(),window.scrollTo({top:0,behavior:"smooth"}),s.remove()})}}}new t().run()});})();

// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvY2F0ZWdvcnktaW5wdXQtd2lkZ2V0LnRzIiwgIi4uLy4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL2NoYW5nZXMtZGlhbG9nLnRzIiwgIi4uLy4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL291dHB1dC1wcmV2aWV3LWRpYWxvZy50cyIsICIuLi8uLi9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC10YXJnZXQtaW5wdXQtd2lkZ2V0LnRzIiwgIi4uLy4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LWhlbHBlci1kaWFsb2cudHMiLCAiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB0eXBlIHsgTG9va3VwRWxlbWVudENvbmZpZyB9IGZyb20gJy4vcmVkaXJlY3QtdGFyZ2V0LWlucHV0LXdpZGdldCc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGNhdGVnb3J5IGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYXRlZ29yeUlucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuICAgIH1cblxuICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICBjb25zdCBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcblxuICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcblxuICAgICAgICBjb25zdCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHZhbHVlKTtcblxuICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiAxNCxcbiAgICAgICAgICAgICAgICBnYXBwcmVmaXg6IHBhcnNlZFRpdGxlPy5nZXRNYWluVGV4dCgpID8/IHZhbHVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1ldGVycylcbiAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogeyBxdWVyeTogeyBwYWdlczogeyB0aXRsZTogc3RyaW5nOyBjYXRlZ29yaWVzPzogeyB0aXRsZTogc3RyaW5nIH1bXSB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQ/LnF1ZXJ5Py5wYWdlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlcyA9IHJlc3VsdC5xdWVyeS5wYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXBhZ2UuY2F0ZWdvcmllcz8uc29tZSgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6V2lraXBlZGlhIHNvZnQgcmVkaXJlY3RlZCBjYXRlZ29yaWVzJyksXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGVXaXRob3V0TmFtZXNwYWNlID0gcGFnZS50aXRsZS5zcGxpdCgnOicpWzFdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGl0bGVXaXRob3V0TmFtZXNwYWNlLCBsYWJlbDogdGl0bGVXaXRob3V0TmFtZXNwYWNlIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3Nob3dpbmctdmFsdWVzJywgcGFnZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUocGFnZXMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICB9O1xuXG4gICAgZ2V0TG9va3VwQ2FjaGVEYXRhRnJvbVJlc3BvbnNlID0gPFQ+KHJlc3BvbnNlOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKSA9PiByZXNwb25zZSA/PyBbXTtcblxuICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PlxuICAgICAgICBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbn1cblxuT2JqZWN0LmFzc2lnbihDYXRlZ29yeUlucHV0V2lkZ2V0LnByb3RvdHlwZSwgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpQ29tcGFyZVBhZ2VzUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuXG4vKipcbiAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdXNlZCBmb3Igc2hvd2luZyBjaGFuZ2VzIHRvIGJlIG1hZGUuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENoYW5nZXNEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBPTy51aS5Qcm9jZXNzRGlhbG9nLkNvbmZpZ09wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICBDaGFuZ2VzRGlhbG9nLnN0YXRpYy5uYW1lID0gJ1Nob3dDaGFuZ2VzRGlhbG9nJztcbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnQ2hhbmdlcyB0byBiZSBtYWRlJztcbiAgICAgICAgQ2hhbmdlc0RpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFt7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfV07XG4gICAgfVxuXG4gICAgZ2V0U2V0dXBQcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gQ2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBbb2xkVGV4dCwgbmV3VGV4dF0gPSB0aGlzLmdldERhdGEoKSBhcyBzdHJpbmdbXTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAnYWN0aW9uJzogJ2NvbXBhcmUnLFxuICAgICAgICAgICAgICAgICAgICAnZm9ybWF0dmVyc2lvbic6ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgJ3Byb3AnOiBbJ2RpZmYnXSxcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb21zbG90cyc6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb210ZXh0LW1haW4nOiBvbGRUZXh0LFxuICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgJ3Rvc2xvdHMnOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICd0b3RleHQtbWFpbic6IG5ld1RleHQsXG4gICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlDb21wYXJlUGFnZXNQYXJhbXMgJiB7XG4gICAgICAgICAgICAgICAgICAgICdmcm9tdGV4dC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAndG90ZXh0LW1haW4nOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJpc29uID0gKHJlc3VsdCBhcyB7IGNvbXBhcmU6IHsgYm9keTogc3RyaW5nIH0gfSkuY29tcGFyZS5ib2R5O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vQ2hhbmdlc0VsZW1lbnQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICd3YXJuaW5nJywgbGFiZWw6ICdObyBjaGFuZ2VzIHRvIG1ha2UhJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICBwYW5lbExheW91dC4kZWxlbWVudC5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgXG48dGFibGUgY2xhc3M9XCJkaWZmIGRpZmYtZWRpdGZvbnQtbW9ub3NwYWNlXCI+XG4gICAgPGNvbGdyb3VwPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1tYXJrZXJcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtY29udGVudFwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1tYXJrZXJcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtY29udGVudFwiPlxuICAgIDwvY29sZ3JvdXA+XG4gICAgPHRib2R5PlxuICAgICAgICAke2NvbXBhcmlzb259XG4gICAgPC90Ym9keT5cbjwvdGFibGU+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbm9DaGFuZ2VzRWxlbWVudC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQocGFuZWxMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICA/IG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogQ2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgfTtcblxuICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIENoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuT2JqZWN0LmFzc2lnbihDaGFuZ2VzRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpUGFyc2VQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB1c2VkIGZvciBwcmV2aWV3aW5nIHRlbXBsYXRlIG91dHB1dC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3V0cHV0UHJldmlld0RpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAvLyBBc3NpZ25lZCBpbiBjb25zdHJ1Y3RvclxuICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT08udWkuUHJvY2Vzc0RpYWxvZy5Db25maWdPcHRpb25zLCBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG5cbiAgICAgICAgT3V0cHV0UHJldmlld0RpYWxvZy5zdGF0aWMubmFtZSA9ICdPdXRwdXRQcmV2aWV3RGlhbG9nJztcbiAgICAgICAgT3V0cHV0UHJldmlld0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzIHByZXZpZXcnO1xuICAgICAgICBPdXRwdXRQcmV2aWV3RGlhbG9nLnN0YXRpYy5hY3Rpb25zID0gW3sgYWN0aW9uOiAnY2FuY2VsJywgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9XTtcbiAgICB9XG5cbiAgICBnZXRTZXR1cFByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgIHJldHVybiBPdXRwdXRQcmV2aWV3RGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRTZXR1cFByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaVxuICAgICAgICAgICAgICAgIC5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncGFyc2UnLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRtb2RlbDogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogWyd0ZXh0JywgJ2NhdGVnb3JpZXNodG1sJ10sXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRQcmVmaXhlZERiKCksXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0RGF0YSgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcylcbiAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NDb250ZW50ID0gKHJlc3VsdCBhcyB7IHBhcnNlOiB7IHRleHQ6IHN0cmluZyB9IH0pLnBhcnNlLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXNDb250ZW50ID0gKHJlc3VsdCBhcyB7IHBhcnNlOiB7IGNhdGVnb3JpZXNodG1sOiBzdHJpbmcgfSB9KS5wYXJzZS5jYXRlZ29yaWVzaHRtbDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICBwYW5lbExheW91dC4kZWxlbWVudC5hcHBlbmQodGFnc0NvbnRlbnQsIGNhdGVnb3JpZXNDb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQocGFuZWxMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICA/IG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogT3V0cHV0UHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgfTtcblxuICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIE91dHB1dFByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuT2JqZWN0LmFzc2lnbihPdXRwdXRQcmV2aWV3RGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpUGFyc2VQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvYXBpX3BhcmFtcyc7XG5pbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzLCBQYWdlUGFyc2VSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExvb2t1cEVsZW1lbnRDb25maWcgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQuQ29uZmlnT3B0aW9ucywgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5Db25maWdPcHRpb25zIHt9XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIHRpdGxlIGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGU7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExvb2t1cEVsZW1lbnRDb25maWcsIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUpIHtcbiAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG5cbiAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG4gICAgfVxuXG4gICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICBlbHNlIGlmICh2YWx1ZS5pbmNsdWRlcygnIycpKSB7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IHZhbHVlLnNwbGl0KCcjJylbMF07XG5cbiAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLmdldCh7IGFjdGlvbjogJ3BhcnNlJywgcGFnZTogdGl0bGUsIHByb3A6ICdzZWN0aW9ucycsIHJlZGlyZWN0czogdHJ1ZSB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcylcbiAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0OiBQYWdlUGFyc2VSZXN1bHQgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWRTZWN0aW9ucyA9IHJlc3VsdC5wYXJzZS5zZWN0aW9ucy5maWx0ZXIoKHNlY3Rpb24pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnRzV2l0aCh2YWx1ZS5zcGxpdCgnIycpWzFdLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogYCR7cmVzdWx0LnBhcnNlLnRpdGxlfSMke3NlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogYCR7cmVzdWx0LnBhcnNlLnRpdGxlfSMke3NlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgICAgIC5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IHBhcnNlZFRpdGxlPy5nZXROYW1lc3BhY2VJZCgpID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogWydpbmZvJywgJ3BhZ2Vwcm9wcyddLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgIC50aGVuKFxuICAgICAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogeyBwYWdlczogeyB0aXRsZTogc3RyaW5nOyBwYWdlcHJvcHM6IHsgZGlzYW1iaWd1YXRpb24/OiBzdHJpbmcgfTsgcmVkaXJlY3Q/OiBzdHJpbmcgfVtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5xdWVyeT8ucGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnF1ZXJ5LnBhZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYWdlKSA9PiBwYWdlLnRpdGxlICE9PSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRQcmVmaXhlZFRleHQoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcGFnZS50aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwYWdlLnRpdGxlfSR7cGFnZS5wYWdlcHJvcHMgJiYgJ2Rpc2FtYmlndWF0aW9uJyBpbiBwYWdlLnBhZ2Vwcm9wcyA/ICcgPGk+KGRpc2FtYmlndWF0aW9uKTwvaT4nIDogJyd9JHsncmVkaXJlY3QnIGluIHBhZ2UgPyAnIDxpPihyZWRpcmVjdCk8L2k+JyA6ICcnfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgIH07XG5cbiAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+XG4gICAgICAgIGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xufVxuXG5PYmplY3QuYXNzaWduKFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUge1xuICAgIEFwaVBhcnNlUGFyYW1zLFxuICAgIEFwaVF1ZXJ5SW5mb1BhcmFtcyxcbiAgICBBcGlRdWVyeVBhZ2VQcm9wc1BhcmFtcyxcbiAgICBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyxcbiAgICBQYWdlVHJpYWdlQXBpUGFnZVRyaWFnZUxpc3RQYXJhbXMsXG59IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcbmltcG9ydCB0eXBlIHtcbiAgICBDYXRlZ29yaWVzUmVzdWx0LFxuICAgIE1lZGlhV2lraURhdGFFcnJvcixcbiAgICBQYWdlSW5mb1Jlc3VsdCxcbiAgICBQYWdlUGFyc2VSZXN1bHQsXG4gICAgUGFnZVJldmlzaW9uc1Jlc3VsdCxcbiAgICBQYWdlVHJpYWdlTGlzdFJlc3BvbnNlLFxuICAgIFBhZ2Vwcm9wc1Jlc3VsdCxcbn0gZnJvbSAnLi4vLi4vZ2xvYmFsLXR5cGVzJztcbmltcG9ydCBDYXRlZ29yeUlucHV0V2lkZ2V0IGZyb20gJy4vY2F0ZWdvcnktaW5wdXQtd2lkZ2V0JztcbmltcG9ydCBDaGFuZ2VzRGlhbG9nIGZyb20gJy4vY2hhbmdlcy1kaWFsb2cnO1xuaW1wb3J0IE91dHB1dFByZXZpZXdEaWFsb2cgZnJvbSAnLi9vdXRwdXQtcHJldmlldy1kaWFsb2cnO1xuaW1wb3J0IFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQgZnJvbSAnLi9yZWRpcmVjdC10YXJnZXQtaW5wdXQtd2lkZ2V0JztcblxuZXhwb3J0IHR5cGUgUmVkaXJlY3RUZW1wbGF0ZURhdGEgPSBSZWNvcmQ8c3RyaW5nLCB7IHJlZGlyZWN0PzogdHJ1ZTsgcGFyYW1ldGVyczogUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM7IGFsaWFzZXM6IHN0cmluZ1tdIH0+O1xuXG50eXBlIFJlZGlyZWN0VGVtcGxhdGVQYXJhbWV0ZXJzID0gUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB7XG4gICAgICAgIGFsaWFzZXM6IHN0cmluZ1tdO1xuICAgICAgICBsYWJlbDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHR5cGU6IHN0cmluZztcbiAgICAgICAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gICAgICAgIHN1Z2dlc3RlZDogYm9vbGVhbjtcbiAgICAgICAgZGVmYXVsdDogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgICAgIGV4YW1wbGU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgIH1cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwYXJhbWV0ZXJzOiB7IG5hbWU6IHN0cmluZzsgYWxpYXNlczogc3RyaW5nW107IGVkaXRvcjogT08udWkuVGV4dElucHV0V2lkZ2V0IH1bXTtcbn1cblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGhhbmRsZXMgdGhlIGRpYWxvZyBwb3J0aW9uIG9mIHJlZGlyZWN0LWhlbHBlciBzY3JpcHQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZGlyZWN0SGVscGVyRGlhbG9nIHtcbiAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuICAgIHByaXZhdGUgcmVkaXJlY3RSZWdleCA9IC9eI3JlZGlyZWN0Oj9cXHMqXFxbXFxbXFxzKjo/KFteW1xcXXt8fV0rPylcXHMqKD86XFx8W15bXFxde3x9XSs/KT9dXVxccyovaTtcbiAgICBwcml2YXRlIHNjcmlwdE1lc3NhZ2UgPSAnICh2aWEgW1t3OmVuOlVzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlcnxyZWRpcmVjdC1oZWxwZXJdXSknO1xuXG4gICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICBwcml2YXRlIGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDtcbiAgICBwcml2YXRlIHBhZ2VUaXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgIHByaXZhdGUgZXhpc3RzOiBib29sZWFuO1xuXG4gICAgLy8gVXNlZCBkdXJpbmcgcnVuKClcbiAgICBwcml2YXRlIG5lZWRzQ2hlY2sgPSB0cnVlO1xuXG4gICAgcHJpdmF0ZSBlZGl0b3JCb3ghOiBPTy51aS5QYW5lbExheW91dDtcbiAgICBwcml2YXRlIHN5bmNXaXRoTWFpbkJ1dHRvbj86IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIHJlZGlyZWN0SW5wdXQhOiBSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgcmVkaXJlY3RJbnB1dExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgdGFnU2VsZWN0ITogT08udWkuTWVudVRhZ011bHRpc2VsZWN0V2lkZ2V0O1xuICAgIHByaXZhdGUgdGFnU2VsZWN0TGF5b3V0ITogT08udWkuQWN0aW9uRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IhOiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG4gICAgcHJpdmF0ZSB0ZW1wbGF0ZUVkaXRvcnNJbmZvOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvW10gPSBbXTtcbiAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0ITogT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQ7XG4gICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdElucHV0ITogQ2F0ZWdvcnlJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0TGF5b3V0ITogT08udWkuRmllbGRMYXlvdXQ7XG4gICAgcHJpdmF0ZSBkZWZhdWx0U29ydElucHV0ITogT08udWkuVGV4dElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgIHByaXZhdGUgZGVmYXVsdFNvcnRJbnB1dExheW91dCE6IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgc3VtbWFyeUlucHV0ITogT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIHN1bW1hcnlJbnB1dExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgc3VibWl0QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgIHByaXZhdGUgc2hvd0NoYW5nZXNCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgcHJpdmF0ZSBzaG93UHJldmlld0J1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIHN5bmNUYWxrQ2hlY2tib3g/OiBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgc3luY1RhbGtDaGVja2JveExheW91dD86IE9PLnVpLldpZGdldDtcbiAgICBwcml2YXRlIHBhdHJvbENoZWNrYm94PzogT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIHBhdHJvbENoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgIHByaXZhdGUgc3VibWl0TGF5b3V0ITogT08udWkuSG9yaXpvbnRhbExheW91dDtcblxuICAgIHByaXZhdGUgdGFsa0RhdGE/OiBQYWdlSW5mb1Jlc3VsdDtcblxuICAgIHByaXZhdGUgcGFnZUNvbnRlbnQgPSAnJztcblxuICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYXJnZXQ/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhZ3M/OiBzdHJpbmdbXTtcbiAgICBwcml2YXRlIG9sZFJlZGlyZWN0VGFnRGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdW10+O1xuICAgIHByaXZhdGUgb2xkRGVmYXVsdFNvcnQ/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvbGRDYXRlZ29yaWVzPzogc3RyaW5nW107XG4gICAgcHJpdmF0ZSBvbGRTdHJheVRleHQ/OiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIHBhcnNlZERlc3RpbmF0aW9uITogbXcuVGl0bGUgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VGVtcGxhdGVzLFxuICAgICAgICAgICAgY29udGVudFRleHQsXG4gICAgICAgICAgICBwYWdlVGl0bGUsXG4gICAgICAgICAgICBwYWdlVGl0bGVQYXJzZWQsXG4gICAgICAgIH06IHsgcmVkaXJlY3RUZW1wbGF0ZXM6IFJlZGlyZWN0VGVtcGxhdGVEYXRhOyBjb250ZW50VGV4dDogSFRNTERpdkVsZW1lbnQ7IHBhZ2VUaXRsZTogc3RyaW5nOyBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlIH0sXG4gICAgICAgIGV4aXN0czogYm9vbGVhbixcbiAgICApIHtcbiAgICAgICAgdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyA9IHJlZGlyZWN0VGVtcGxhdGVzO1xuICAgICAgICB0aGlzLmNvbnRlbnRUZXh0ID0gY29udGVudFRleHQ7XG4gICAgICAgIHRoaXMucGFnZVRpdGxlID0gcGFnZVRpdGxlO1xuICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcblxuICAgICAgICB0aGlzLmV4aXN0cyA9IGV4aXN0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgcmVkaXJlY3QtaGVscGVyIGRpYWxvZyBpbnRvIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgIG13LnV0aWwuYWRkQ1NTKGBcbiNjcmVhdGUtcmVkaXJlY3QtYnV0dG9uIHtcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLWJveCB7XG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICAgIG1hcmdpbi1ib3R0b206IDI1cHggIWltcG9ydGFudDtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZXNtb2tlO1xuICAgIHdpZHRoOiA3MDBweDtcbiAgICBtYXgtd2lkdGg6IGNhbGMoMTAwJSAtIDUwcHgpO1xuICAgIGNvbG9yOiAjMjAyMTIyO1xufVxuXG4ucmVkaXJlY3QtaW5wdXQtbGF5b3V0IGxhYmVsIHtcbiAgICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci1yZWRpcmVjdC1wb3NzaWJpbGl0aWVzOjphZnRlciB7XG4gICAgY29udGVudDogXCIgKHJlZGlyZWN0IHdpdGggcG9zc2liaWxpdGllcylcIjtcbiAgICBmb250LXN0eWxlOiBpdGFsaWM7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIsXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHMge1xuICAgIG1hcmdpbi1ibG9jazogMTBweDtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjtcbiAgICBwYWRkaW5nOiA1cHg7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgc3VtbWFyeSB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyIGRldGFpbHMge1xuICAgIG1hcmdpbi1ibG9jazogNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNkMWNlY2U7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItbm8tdGVtcGxhdGVzLW1lc3NhZ2Uge1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1zdW1tYXJ5LWxheW91dCB7XG4gICAgbWFyZ2luLXRvcDogMTVweDtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgZ3JheTtcbiAgICBwYWRkaW5nLXRvcDogMTBweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0IHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xufVxuXG4jcmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQgPiAqIHtcbiAgICBtYXJnaW4tYm90dG9tOiAwO1xufVxuXG4ucmVkaXJlY3QtaGVscGVyLXdhcm5pbmcge1xuICAgIG1hcmdpbi10b3A6IDhweDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci1hdXRvZml4LWJ1dHRvbiB7XG4gICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICBmb250LXNpemU6IDEycHg7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItYXV0b2ZpeC1idXR0b24gYSB7XG4gICAgcGFkZGluZzogM3B4IDRweCAhaW1wb3J0YW50O1xuICAgIG1pbi1oZWlnaHQ6IHVuc2V0ICFpbXBvcnRhbnQ7XG59YCk7XG5cbiAgICAgICAgbXcubG9hZGVyLmFkZExpbmtUYWcoJ2h0dHBzOi8vd3d3Lm1lZGlhd2lraS5vcmcvdy9sb2FkLnBocD9tb2R1bGVzPW1lZGlhd2lraS5kaWZmLnN0eWxlcyZvbmx5PXN0eWxlcycpO1xuXG4gICAgICAgIC8qIExvYWQgZWxlbWVudHMgKi9cbiAgICAgICAgdGhpcy5lZGl0b3JCb3ggPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBpZDogJ3JlZGlyZWN0LWhlbHBlci1ib3gnLCBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSwgZnJhbWVkOiB0cnVlIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnBhZ2VUaXRsZVBhcnNlZC5pc1RhbGtQYWdlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1haW5QYWdlRGF0YSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgaWYgKG1haW5QYWdlRGF0YS5xdWVyeS5wYWdlc1swXS5yZWRpcmVjdCkgYXdhaXQgdGhpcy5sb2FkU3luY1dpdGhNYWluQnV0dG9uKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFN1Ym1pdEVsZW1lbnRzKCk7XG5cbiAgICAgICAgLyogQWRkIGVsZW1lbnRzIHRvIHNjcmVlbiBhbmQgbG9hZCBkYXRhIChpZiBhcHBsaWNhYmxlKSAqL1xuICAgICAgICB0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXS5hcHBlbmQoXG4gICAgICAgICAgICAuLi4oW1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY1dpdGhNYWluQnV0dG9uPy4kZWxlbWVudD8uWzBdLFxuICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcixcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pIGFzIEhUTUxFbGVtZW50W10pLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuY29udGVudFRleHQucHJlcGVuZCh0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLmxvYWRFeGlzdGluZ0RhdGEoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgXCJTeW5jIHdpdGggbWFpbiBwYWdlXCIgYnV0dG9uXCIgb24gdGFsayBwYWdlcy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRTeW5jV2l0aE1haW5CdXR0b24oKSB7XG4gICAgICAgIGNvbnN0IG1haW5QYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCkpO1xuXG4gICAgICAgIHRoaXMuc3luY1dpdGhNYWluQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU3luYyB3aXRoIG1haW4gcGFnZScsIGljb246ICdsaW5rJywgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSB9KTtcbiAgICAgICAgdGhpcy5zeW5jV2l0aE1haW5CdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5yZWRpcmVjdFJlZ2V4LmV4ZWMobWFpblBhZ2VDb250ZW50KT8uWzFdO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBtdy5ub3RpZnkoJ0ZhaWxlZCB0byBwYXJzZSBtYWluIHBhZ2UgY29udGVudCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZShtdy5UaXRsZS5uZXdGcm9tVGV4dCh0YXJnZXQpPy5nZXRUYWxrUGFnZSgpPy5nZXRQcmVmaXhlZFRleHQoKSA/PyAnJyk7XG4gICAgICAgICAgICBjb25zdCBmcm9tTW92ZSA9IFsnUiBmcm9tIG1vdmUnLCAuLi50aGlzLnJlZGlyZWN0VGVtcGxhdGVzWydSIGZyb20gbW92ZSddLmFsaWFzZXNdLnNvbWUoKHRhZ09yUmVkaXJlY3QpID0+XG4gICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWApLnRlc3QoXG4gICAgICAgICAgICAgICAgICAgIG1haW5QYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChmcm9tTW92ZSkgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUoWydSIGZyb20gbW92ZSddKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGlucHV0IGVsZW1lbnRzLlxuICAgICAqL1xuICAgIHByaXZhdGUgbG9hZElucHV0RWxlbWVudHMoKSB7XG4gICAgICAgIC8qIFJlZGlyZWN0IHRhcmdldCBpbnB1dCAqL1xuICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQgPSBuZXcgUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnVGFyZ2V0IHBhZ2UgbmFtZScsIHJlcXVpcmVkOiB0cnVlIH0sIHRoaXMucGFnZVRpdGxlUGFyc2VkKTtcbiAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShuZXcgUmVnRXhwKGBeKGh0dHBzPzopPy97Mn0/JHttdy5jb25maWcuZ2V0KCd3Z1NlcnZlcicpLnJlcGxhY2UoL15cXC97Mn0vLCAnJyl9L3dpa2kvYCksICcnKTtcbiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXjovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnJlZGlyZWN0SW5wdXQsIHtcbiAgICAgICAgICAgIGxhYmVsOiAnUmVkaXJlY3QgdGFyZ2V0OicsXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvKiBSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBzZWxlY3Rpb24gKi9cbiAgICAgICAgdGhpcy50YWdTZWxlY3QgPSBuZXcgT08udWkuTWVudVRhZ011bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgIGFsbG93QXJiaXRyYXJ5OiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93UmVvcmRlcmluZzogZmFsc2UsXG4gICAgICAgICAgICBvcHRpb25zOiBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5tYXAoKFt0YWcsIHsgcmVkaXJlY3QgfV0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlZGlyZWN0KSByZXR1cm4geyBkYXRhOiB0YWcsIGxhYmVsOiB0YWcgfTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbmV3IE9PLnVpLkh0bWxTbmlwcGV0KGA8c3BhbiBjbGFzcz1cInJlZGlyZWN0LWhlbHBlci1yZWRpcmVjdC1wb3NzaWJpbGl0aWVzXCI+JHt0YWd9PC9zcGFuPmApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogdGFnLCBsYWJlbCB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgICAgICAodGhpcy50YWdTZWxlY3QuZ2V0TWVudSgpIGFzIE9PLnVpLk1lbnVTZWxlY3RXaWRnZXQuQ29uZmlnT3B0aW9ucykuZmlsdGVyTW9kZSA9ICdzdWJzdHJpbmcnO1xuICAgICAgICB0aGlzLnRhZ1NlbGVjdC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc29ydGVkVGFncyA9ICh0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgaWYgKCh0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSB0aGlzLnRhZ1NlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVkaXRvckluZm8gb2YgdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvKSBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgbGV0IHNob3duVGVtcGxhdGVFZGl0b3JzID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0b3JJbmZvID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcblxuICAgICAgICAgICAgICAgIGlmIChlZGl0b3JJbmZvKSB7XG4gICAgICAgICAgICAgICAgICAgIGVkaXRvckluZm8uZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICAgICAgc2hvd25UZW1wbGF0ZUVkaXRvcnMrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gYFRlbXBsYXRlIHBhcmFtZXRlcnMgKCR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gYGZvciAke3Nob3duVGVtcGxhdGVFZGl0b3JzfSB0ZW1wbGF0ZSR7c2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAxID8gJ3MnIDogJyd9YCA6ICdub25lIHRvIHNob3cnfSlgO1xuXG4gICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2Uuc3R5bGUuZGlzcGxheSA9IHNob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/ICdub25lJyA6ICdibG9jayc7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMudGFnU2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMudGFnU2VsZWN0LCB7XG4gICAgICAgICAgICBsYWJlbDogJ1JlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlczonLFxuICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgcGFyYW1ldGVycyAqL1xuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuY2xhc3NMaXN0LmFkZCgncmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgY29uc3Qgc3VtbWFyeUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgIHN1bW1hcnlFbGVtZW50LnRleHRDb250ZW50ID0gJ1RlbXBsYXRlIHBhcmFtZXRlcnMgKG5vbmUgdG8gc2hvdyknO1xuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW3RlbXBsYXRlTmFtZSwgdGVtcGxhdGVEYXRhXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKSkge1xuICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IE9iamVjdC5lbnRyaWVzKHRlbXBsYXRlRGF0YS5wYXJhbWV0ZXJzKTtcbiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkZXRhaWxzJyk7XG4gICAgICAgICAgICBkZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICBzdW1tYXJ5LnRleHRDb250ZW50ID0gdGVtcGxhdGVOYW1lO1xuICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoc3VtbWFyeSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvID0geyBuYW1lOiB0ZW1wbGF0ZU5hbWUsIGRldGFpbHMsIHBhcmFtZXRlcnM6IFtdIH07XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIHBhcmFtZXRlckRhdGFdIG9mIHBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogcGFyYW1ldGVyRGF0YS5kZWZhdWx0Py50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogcGFyYW1ldGVyRGF0YS5yZXF1aXJlZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQoaW5wdXQsIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhcmFtZXRlck5hbWV9JHshcGFyYW1ldGVyRGF0YS5sYWJlbCB8fCBwYXJhbWV0ZXJOYW1lLnRvTG93ZXJDYXNlKCkgPT09IHBhcmFtZXRlckRhdGEubGFiZWw/LnRvTG93ZXJDYXNlKCkgPyAnJyA6IGAgKCR7cGFyYW1ldGVyRGF0YS5sYWJlbH0pYH0ke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb24gPyBgICgke3BhcmFtZXRlckRhdGEuZGVzY3JpcHRpb259KWAgOiAnJ30gKHR5cGU6ICR7cGFyYW1ldGVyRGF0YS50eXBlfSkgJHtwYXJhbWV0ZXJEYXRhLnN1Z2dlc3RlZCA/ICcgKHN1Z2dlc3RlZCknIDogJyd9JHtwYXJhbWV0ZXJEYXRhLmV4YW1wbGUgPyBgIChleGFtcGxlOiBcIiR7cGFyYW1ldGVyRGF0YS5leGFtcGxlfVwiKWAgOiAnJ31gLFxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGV0YWlscy5hcHBlbmQoaW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEucGFyYW1ldGVycy5wdXNoKHsgbmFtZTogcGFyYW1ldGVyTmFtZSwgYWxpYXNlczogcGFyYW1ldGVyRGF0YS5hbGlhc2VzLCBlZGl0b3I6IGlucHV0IH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoZGV0YWlscyk7XG5cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5wdXNoKGVsZW1lbnREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vVGVtcGxhdGVzTWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UuaWQgPSAncmVkaXJlY3QtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlJztcbiAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLnRleHRDb250ZW50ID0gJ05vIHRlbXBsYXRlcyB3aXRoIHBhcmFtZXRlcnMgdG8gZGlzcGxheSEnO1xuXG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChub1RlbXBsYXRlc01lc3NhZ2UpO1xuXG4gICAgICAgIC8qIERFRkFVTFRTT1JUIGlucHV0ICovXG4gICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKHZhbHVlLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBpY29uOiAncm9ib3QnLCBsYWJlbDogJ1N1Z2dlc3QnLCBkaXNhYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IG5hbWUgPSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRNYWluVGV4dCgpLnJlcGxhY2UoLyBcXCguKlxcKSQvLCAnJyk7IC8vIFJlbW92ZSBkaXNhbWJpZ3VhdGlvblxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGJpcnRoIG5hbWUnLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGZpY3Rpb25hbCBjaGFyYWN0ZXInLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIGJhbmQgbWVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBtZW1iZXInLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHBlcnNvbicsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gcGVyc29uYWwgbmFtZScsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gcmVsYXRpdmUnLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHNwb3VzZScsXG4gICAgICAgICAgICAgICAgXS5zb21lKCh0YWcpID0+IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSlcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEhhbmRsaW5nIGlzIG1vZGlmaWVkIGZyb20gZXZhZDM3J3MgXCJSYXRlclwiXG5cbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG13Lm5vdGlmeShcInJlZGlyZWN0LWhlbHBlciB3YXNuJ3QgYWJsZSB0byBkZXRlcm1pbmUgYSBzb3J0IGtleSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBwYWdlIHRpdGxlIVwiLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybicsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IGdlbmVyYXRpb25hbFN1ZmZpeCA9ICcnO1xuICAgICAgICAgICAgICAgIGlmICgvICg/OltKU11yLj98W0lWWF0rKSQvLnRlc3QobmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbmFsU3VmZml4ID0gbmFtZS5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSkgcmV0dXJuIG5hbWUgKyBnZW5lcmF0aW9uYWxTdWZmaXg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdE5hbWUgPSBuYW1lXG4gICAgICAgICAgICAgICAgICAgIC5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykgKyAxKVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvLCQvLCAnJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL08nLywgJ08nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdGhlck5hbWVzID0gbmFtZS5zbGljZSgwLCBuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKGxhc3ROYW1lICsgJywgJyArIG90aGVyTmFtZXMgKyBnZW5lcmF0aW9uYWxTdWZmaXgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3TmFtZSA9IG5hbWUucmVwbGFjZUFsbCgnTXIuJywgJ01pc3RlcicpLnJlcGxhY2VBbGwoJyYnLCAnQW5kJyk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxlYWRpbmdBcnRpY2xlIG9mIFsnQW4nLCAnQScsICdUaGUnXSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05hbWUuc3RhcnRzV2l0aChsZWFkaW5nQXJ0aWNsZSArICcgJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWUgPSBuZXdOYW1lLnNsaWNlKGxlYWRpbmdBcnRpY2xlLmxlbmd0aCArIDEpICsgJywgJyArIGxlYWRpbmdBcnRpY2xlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lID09PSBuYW1lKVxuICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXCJyZWRpcmVjdC1oZWxwZXIgd2Fzbid0IGFibGUgdG8gZGV0ZXJtaW5lIGEgc29ydCBrZXkgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgcGFnZSB0aXRsZSFcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZShuZXdOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0KHRoaXMuZGVmYXVsdFNvcnRJbnB1dCwgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24sIHtcbiAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgYERlZmF1bHQgc29ydCBrZXkgKERFRkFVTFRTT1JUKSAoc2VlIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKCdXaWtpcGVkaWE6Q2F0ZWdvcml6YXRpb24jU29ydCBrZXlzJyl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+Z3VpZGVsaW5lPC9hPik6YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvKiBDYXRlZ29yaWVzIHNlbGVjdGlvbiAqL1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQgPSBuZXcgQ2F0ZWdvcnlJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiAnQWRkIGNhdGVnb3JpZXMgaGVyZScgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15DYXRlZ29yeTovLCAnJyk7XG5cbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5vbignc2hvd2luZy12YWx1ZXMnLCAocGFnZXM6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT4ge1xuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB0aGlzLmNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdCA9IG5ldyBPTy51aS5UYWdNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLFxuICAgICAgICAgICAgaW5wdXRXaWRnZXQ6IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dCxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAodGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgaWYgKCh0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHRoaXMuY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUoc29ydGVkVGFncyk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmNhdGVnb3J5U2VsZWN0LCB7XG4gICAgICAgICAgICBsYWJlbDogJ0NhdGVnb3JpZXM6JyxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFN1bW1hcnkgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXQgPSBuZXcgT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICBvcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVzb2x2ZSBkb3VibGUgcmVkaXJlY3QnIH0sIC8vXG4gICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVzb2x2ZSBzZWxmIHJlZGlyZWN0JyB9LFxuICAgICAgICAgICAgICAgIHsgZGF0YTogJ1JlbW92ZSBpbmNvcnJlY3QgcmNhdHMnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnN1bW1hcnlJbnB1dCwge1xuICAgICAgICAgICAgaWQ6ICdyZWRpcmVjdC1oZWxwZXItc3VtbWFyeS1sYXlvdXQnLFxuICAgICAgICAgICAgbGFiZWw6ICdTdW1tYXJ5OicsXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgZWxlbWVudHMgaW4gdGhlIHN1Ym1pdCBidXR0b24gcm93LlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZFN1Ym1pdEVsZW1lbnRzKCkge1xuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgLyogU2V0dXAgc3VibWl0IGJ1dHRvbiAqL1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1N1Ym1pdCcsIGRpc2FibGVkOiB0cnVlLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB0aGlzLmhhbmRsZVN1Ym1pdEJ1dHRvbkNsaWNrKCkpO1xuXG4gICAgICAgIC8qIFNldHVwIHNob3cgcHJldmlldyBidXR0b24gKi9cbiAgICAgICAgY29uc3QgdGVtcGxhdGVQcmV2aWV3RGlhbG9nID0gbmV3IE91dHB1dFByZXZpZXdEaWFsb2coeyBzaXplOiAnbGFyZ2UnIH0sIHRoaXMucGFnZVRpdGxlUGFyc2VkKTtcbiAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFt0ZW1wbGF0ZVByZXZpZXdEaWFsb2ddKTtcblxuICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU2hvdyBwcmV2aWV3JywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGVtcGxhdGVQcmV2aWV3RGlhbG9nLnNldERhdGEoXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRlbXBsYXRlUHJldmlld0RpYWxvZy5vcGVuKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFNldHVwIHNob3cgY2hhbmdlcyBidXR0b24gKi9cbiAgICAgICAgY29uc3Qgc2hvd0NoYW5nZXNEaWFsb2cgPSBuZXcgQ2hhbmdlc0RpYWxvZyh7IHNpemU6ICdsYXJnZScgfSk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbc2hvd0NoYW5nZXNEaWFsb2ddKTtcblxuICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU2hvdyBjaGFuZ2VzJywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24ub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLnBhZ2VDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRQYWdlQ29udGVudCh0aGlzLnBhZ2VUaXRsZSk7XG5cbiAgICAgICAgICAgIHNob3dDaGFuZ2VzRGlhbG9nLnNldERhdGEoW1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQsXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICBzaG93Q2hhbmdlc0RpYWxvZy5vcGVuKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFNldHVwIHN5bmMgdGFsayBjaGVja2JveCAqL1xuICAgICAgICBpZiAoIXRoaXMucGFnZVRpdGxlUGFyc2VkLmlzVGFsa1BhZ2UoKSkge1xuICAgICAgICAgICAgdGhpcy50YWxrRGF0YSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcbiAgICAgICAgICAgIHRoaXMuc3luY1RhbGtDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KHsgc2VsZWN0ZWQ6ICEhdGhpcy50YWxrRGF0YS5xdWVyeS5wYWdlc1swXS5yZWRpcmVjdCB9KTtcblxuICAgICAgICAgICAgdGhpcy5zeW5jVGFsa0NoZWNrYm94TGF5b3V0ID0gbmV3IE9PLnVpLldpZGdldCh7XG4gICAgICAgICAgICAgICAgY29udGVudDogW25ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnN5bmNUYWxrQ2hlY2tib3gsIHsgbGFiZWw6ICdTeW5jIHRhbGsgcGFnZScsIGFsaWduOiAnaW5saW5lJyB9KV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFNldHVwIHBhdHJvbCBjaGVja2JveCAqL1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5jaGVja1Nob3VsZFByb21wdFBhdHJvbCgpKSB7XG4gICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94ID0gbmV3IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQoeyBzZWxlY3RlZDogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveExheW91dCA9IG5ldyBPTy51aS5XaWRnZXQoe1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFtuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5wYXRyb2xDaGVja2JveCwgeyBsYWJlbDogJ01hcmsgYXMgcGF0cm9sbGVkJywgYWxpZ246ICdpbmxpbmUnIH0pXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2V0dXAgbGF5b3V0ICovXG4gICAgICAgIHRoaXMuc3VibWl0TGF5b3V0ID0gbmV3IE9PLnVpLkhvcml6b250YWxMYXlvdXQoe1xuICAgICAgICAgICAgaWQ6ICdyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dCcsXG4gICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveExheW91dCxcbiAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pIGFzIE9PLnVpLldpZGdldFtdLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCB0byBwYXRyb2wgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja1Nob3VsZFByb21wdFBhdHJvbCgpIHtcbiAgICAgICAgY29uc3QgcGFnZVRyaWFnZU1hcmtCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbWFnZUVsZW1lbnQ+KCcjbXdlLXB0LW1hcmsgLm13ZS1wdC10b29sLWljb24nKTtcbiAgICAgICAgcGFnZVRyaWFnZU1hcmtCdXR0b24/LmNsaWNrKCk7XG4gICAgICAgIHBhZ2VUcmlhZ2VNYXJrQnV0dG9uPy5jbGljaygpO1xuXG4gICAgICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGVsc2UgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYXRyb2xsaW5rJykpIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmstYXMtcmV2aWV3ZWQtYnV0dG9uJykpIHJldHVybiB0cnVlO1xuICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmstYXMtdW5yZXZpZXdlZC1idXR0b24nKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICghbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgdXNlclBlcm1pc3Npb25zID0gYXdhaXQgbXcudXNlci5nZXRSaWdodHMoKTtcbiAgICAgICAgICAgIGlmICghdXNlclBlcm1pc3Npb25zLmluY2x1ZGVzKCdwYXRyb2wnKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgICAgICBjb25zdCBwYXRyb2xSZXNwb25zZSA9IChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3BhZ2V0cmlhZ2VsaXN0JyxcbiAgICAgICAgICAgICAgICBwYWdlX2lkOiBtdy5jb25maWcuZ2V0KCd3Z0FydGljbGVJZCcpLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgUGFnZVRyaWFnZUFwaVBhZ2VUcmlhZ2VMaXN0UGFyYW1zKSkgYXMgUGFnZVRyaWFnZUxpc3RSZXNwb25zZTtcblxuICAgICAgICAgICAgaWYgKHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzWzBdPy51c2VyX25hbWUgPT09IG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZWxzZSBpZiAocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucmVzdWx0ICE9PSAnc3VjY2VzcycgfHwgcGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBlbHNlIHJldHVybiAhTnVtYmVyLnBhcnNlSW50KHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzWzBdPy5wYXRyb2xfc3RhdHVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHN1bW1hcnkgaW5wdXQgcGxhY2Vob2xkZXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVTdW1tYXJ5KCkge1xuICAgICAgICBjb25zdCByZWRpcmVjdFZhbHVlID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgIGlmICghcmVkaXJlY3RWYWx1ZSkgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gJyc7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZXhpc3RzKSB7XG4gICAgICAgICAgICBsZXQgb2xkVGFyZ2V0ID0gdGhpcy5vbGRSZWRpcmVjdFRhcmdldD8ucmVwbGFjZUFsbCgnXycsICcgJyk7XG4gICAgICAgICAgICBpZiAob2xkVGFyZ2V0KSBvbGRUYXJnZXQgPSBvbGRUYXJnZXRbMF0udG9VcHBlckNhc2UoKSArIG9sZFRhcmdldC5zbGljZSgxKTtcblxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0Q2hhbmdlZCA9IHJlZGlyZWN0VmFsdWUgIT09IG9sZFRhcmdldDtcblxuICAgICAgICAgICAgY29uc3QgdGFnc0NoYW5nZWQgPVxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuc29tZSgodGFnKSA9PiAhdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLmluY2x1ZGVzKHRhZyBhcyBzdHJpbmcpKSB8fFxuICAgICAgICAgICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdzIS5zb21lKCh0YWcpID0+ICF0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpO1xuXG4gICAgICAgICAgICBsZXQgdGFnQXJndW1lbnRzQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnc1dpdGhQYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAoWywgZGF0YV0pID0+IE9iamVjdC5lbnRyaWVzKGRhdGEucGFyYW1ldGVycykubGVuZ3RoID4gMCxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbdGFnLCBkYXRhXSBvZiB0YWdzV2l0aFBhcmFtZXRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnV2FzU2VsZWN0ZWQgPSB0aGlzLm9sZFJlZGlyZWN0VGFncyEuaW5jbHVkZXModGFnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdXYXNTZWxlY3RlZCB8fCAhdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyh0YWcpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRUYWdEYXRhID0gdGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGFbdGFnXSA/PyBPYmplY3QuZW50cmllcyhkYXRhLnBhcmFtZXRlcnMpLm1hcCgoW25hbWVdKSA9PiBbbmFtZSwgJyddKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFRhZ0VkaXRvckRhdGEgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm5hbWUgPT09IHRhZykhO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIGZvdW5kVGFnRWRpdG9yRGF0YS5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRBcmd1bWVudCA9IG9sZFRhZ0RhdGEuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50WzBdID09PSBwYXJhbWV0ZXIubmFtZSk/LlsxXSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FyZ3VtZW50ID0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEFyZ3VtZW50ICE9PSBuZXdBcmd1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0FyZ3VtZW50c0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ0FyZ3VtZW50c0NoYW5nZWQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZGVmYXVsdFNvcnRDaGFuZ2VkID0gdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCkudHJpbSgpICE9PSB0aGlzLm9sZERlZmF1bHRTb3J0IS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0NoYW5nZWQgPVxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKChjYXRlZ29yeSkgPT4gIXRoaXMub2xkQ2F0ZWdvcmllcyEuaW5jbHVkZXMoY2F0ZWdvcnkgYXMgc3RyaW5nKSkgfHxcbiAgICAgICAgICAgICAgICB0aGlzLm9sZENhdGVnb3JpZXMhLnNvbWUoKGNhdGVnb3J5KSA9PiAhdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKGNhdGVnb3J5KSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSBbXTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldENoYW5nZWQpIGNoYW5nZXMucHVzaChgcmV0YXJnZXQgdG8gW1ske3JlZGlyZWN0VmFsdWV9XV1gKTtcbiAgICAgICAgICAgIGlmICh0YWdzQ2hhbmdlZClcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkubGVuZ3RoID4gMCAmJiB0aGlzLm9sZFJlZGlyZWN0VGFncyEubGVuZ3RoID4gMCA/ICdjaGFuZ2UnIDogdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwID8gJ2FkZCcgOiAncmVtb3ZlJ30gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHRhZ0FyZ3VtZW50c0NoYW5nZWQpIGNoYW5nZXMucHVzaCgnY2hhbmdlIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIGFyZ3VtZW50cycpO1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRTb3J0Q2hhbmdlZClcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKS5sZW5ndGggPiAwICYmIHRoaXMub2xkRGVmYXVsdFNvcnQhLnJlcGxhY2VBbGwoJ18nLCAnICcpLmxlbmd0aCA+IDAgPyAnY2hhbmdlJyA6IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKS5sZW5ndGggPiAwID8gJ2FkZCcgOiAncmVtb3ZlJ30gZGVmYXVsdCBzb3J0IGtleWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChjYXRlZ29yaWVzQ2hhbmdlZClcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwICYmIHRoaXMub2xkQ2F0ZWdvcmllcyEubGVuZ3RoID4gMCA/ICdjaGFuZ2UnIDogdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgPyAnYWRkJyA6ICdyZW1vdmUnfSBjYXRlZ29yaWVzYCxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPT09IDApIGNoYW5nZXMucHVzaCgncGVyZm9ybSByZWRpcmVjdCBjbGVhbnVwJyk7XG5cbiAgICAgICAgICAgIGNoYW5nZXNbMF0gPSBjaGFuZ2VzWzBdWzBdLnRvVXBwZXJDYXNlKCkgKyBjaGFuZ2VzWzBdLnNsaWNlKDEpO1xuICAgICAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoID4gMSkgY2hhbmdlc1tjaGFuZ2VzLmxlbmd0aCAtIDFdID0gYGFuZCAke2NoYW5nZXMuYXQoLTEpfWA7XG5cbiAgICAgICAgICAgICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9IGNoYW5nZXMuam9pbihjaGFuZ2VzLmxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTtcbiAgICAgICAgfSBlbHNlICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9IGBDcmVhdGUgcmVkaXJlY3QgdG8gW1ske3JlZGlyZWN0VmFsdWV9XV1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIGV4aXN0aW5nIHBhZ2UgZGF0YS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRFeGlzdGluZ0RhdGEoKSB7XG4gICAgICAgIGlmICh0aGlzLmV4aXN0cykgdGhpcy5wYWdlQ29udGVudCA9IGF3YWl0IHRoaXMuZ2V0UGFnZUNvbnRlbnQodGhpcy5wYWdlVGl0bGUpO1xuXG4gICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYXJnZXQgPSB0aGlzLnJlZGlyZWN0UmVnZXguZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzFdO1xuXG4gICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdzID0gKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICAubWFwKChbdGFnLCB0YWdEYXRhXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgW3RhZywgLi4udGFnRGF0YS5hbGlhc2VzXS5zb21lKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRlc3QodGhpcy5wYWdlQ29udGVudCksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGFnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW11cbiAgICAgICAgKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlZGlyZWN0VGFncyA9IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpXG4gICAgICAgICAgICAuZmxhdE1hcCgoW3RhZywgdGFnRGF0YV0pID0+IFt0YWcsIC4uLnRhZ0RhdGEuYWxpYXNlc10pXG4gICAgICAgICAgICAubWFwKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgPyB0YWdPclJlZGlyZWN0XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW107XG5cbiAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBvcmlnaW5hbFJlZGlyZWN0VGFnc1xuICAgICAgICAgICAgICAgIC5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnWzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdbMF19XSR7dGFnLnNsaWNlKDEpfVxcXFx8PyguKj8pXFxcXHMqfX1gKS5leGVjKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdUYWcgPSBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5maW5kKChbdGVtcGxhdGUsIHRhZ0RhdGFdKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlLCAuLi50YWdEYXRhLmFsaWFzZXNdLmluY2x1ZGVzKHRhZyksXG4gICAgICAgICAgICAgICAgICAgICk/LlswXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEFyZ3VtZW50cyA9IG1hdGNoPy5bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3JpZ2luYWxBcmd1bWVudHMpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEFyZ3VtZW50cyA9IG1hdGNoWzFdLnNwbGl0KCd8JykubWFwKChhcmd1bWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnQuaW5jbHVkZXMoJz0nKSkgcmV0dXJuIFsoaW5kZXggKyAxKS50b1N0cmluZygpLCBhcmd1bWVudC50cmltKCldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gYXJndW1lbnQuc3BsaXQoJz0nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuYW1lLnRyaW0oKSwgdmFsdWUudHJpbSgpXTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuZXdUYWcsIGZvcm1hdHRlZEFyZ3VtZW50c107XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFtzdHJpbmcsIHN0cmluZ1tdW11dW10sXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vbGREZWZhdWx0U29ydCA9XG4gICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50XG4gICAgICAgICAgICAgICAgLm1hdGNoKC97e0RFRkFVTFRTT1JUOi4qP319L2cpXG4gICAgICAgICAgICAgICAgPy5hdCgtMSlcbiAgICAgICAgICAgICAgICA/LnNsaWNlKDE0LCAtMilcbiAgICAgICAgICAgICAgICA/LnRyaW0oKSA/PyAnJztcblxuICAgICAgICB0aGlzLm9sZENhdGVnb3JpZXMgPSB0aGlzLnBhZ2VDb250ZW50Lm1hdGNoKC9cXFtcXFtbQ2NdYXRlZ29yeTouKz9dXS9nKT8ubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuc2xpY2UoMTEsIC0yKSkgPz8gW107XG5cbiAgICAgICAgdGhpcy5vbGRTdHJheVRleHQgPSBbXG4gICAgICAgICAgICAve3tzaG9ydCBkZXNjcmlwdGlvblxcfC4qP319L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICAgICAgL3t7RElTUExBWVRJVExFOi4qP319Ly5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3tpdGFsaWMgdGl0bGVcXHw/Lio/fX0vaS5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3t0aXRsZSBsYW5ndWFnZVxcfC4qP319Ly5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAve3thdXRob3JpdHkgY29udHJvbChcXHwuKj8pP319L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICBdXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAgICAgaWYgKHRoaXMub2xkUmVkaXJlY3RUYXJnZXQpIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZSh0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0LnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgZWxzZSBtdy5ub3RpZnkoJ0NvdWxkIG5vdCBmaW5kIHJlZGlyZWN0IHRhcmdldCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUodGhpcy5vbGRSZWRpcmVjdFRhZ3MpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW3RlbXBsYXRlTmFtZSwgZGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEpKSB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZFRlbXBsYXRlRWRpdG9yID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGVtcGxhdGVOYW1lKTtcbiAgICAgICAgICAgIGlmICghZm91bmRUZW1wbGF0ZUVkaXRvcikgY29udGludWU7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhcmFtZXRlck5hbWUsIGFyZ3VtZW50XSBvZiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm91bmRQYXJhbWV0ZXJFZGl0b3IgPSBmb3VuZFRlbXBsYXRlRWRpdG9yLnBhcmFtZXRlcnMuZmluZCgocGFyYW1ldGVyKSA9PlxuICAgICAgICAgICAgICAgICAgICBbcGFyYW1ldGVyLm5hbWUsIC4uLnBhcmFtZXRlci5hbGlhc2VzXS5pbmNsdWRlcyhwYXJhbWV0ZXJOYW1lKSxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKGZvdW5kUGFyYW1ldGVyRWRpdG9yKSBmb3VuZFBhcmFtZXRlckVkaXRvci5lZGl0b3Iuc2V0VmFsdWUoYXJndW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub2xkRGVmYXVsdFNvcnQpIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZSh0aGlzLm9sZERlZmF1bHRTb3J0KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIHRoaXMub2xkQ2F0ZWdvcmllcykgdGhpcy5jYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUoY2F0ZWdvcnkpO1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHRoaXMub2xkQ2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiAoeyBkYXRhOiBjYXRlZ29yeSwgbGFiZWw6IGNhdGVnb3J5IH0pKSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBjaGVja3Mgb24gdGhlIHByb3ZpZGVkIGRhdGEgYW5kIHJldHVybnMgdGhlIGVycm9ycyAoaWYgYW55KS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlU3VibWlzc2lvbigpIHtcbiAgICAgICAgY29uc3QgZXJyb3JzOiB7XG4gICAgICAgICAgICB0aXRsZT86IHN0cmluZztcbiAgICAgICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgICAgIGF1dG9GaXhlcz86ICh7IHR5cGU6ICdhZGQnIHwgJ3JlbW92ZSc7IHRhZzogc3RyaW5nIH0gfCB7IHR5cGU6ICdjaGFuZ2UtdGFyZ2V0JzsgdGFyZ2V0OiBzdHJpbmcgfSlbXTtcbiAgICAgICAgfVtdID0gW107XG5cbiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIC8qIEludmFsaWQgY2hhcmFjdGVycyAqL1xuICAgICAgICBpZiAoIS9eXFxzKlteW1xcXXt8fV0rXFxzKiQvLnRlc3QoZGVzdGluYXRpb24pKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcblxuICAgICAgICAvKiBGYWlsZWQgZHVyaW5nIHRpdGxlIHBhcnNpbmcgKi9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucGFyc2VkRGVzdGluYXRpb24gPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChkZXN0aW5hdGlvbik7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgcGFnZSB0aXRsZSEnIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5wYXJzZWREZXN0aW5hdGlvbiAmJiBlcnJvcnMubGVuZ3RoID09PSAwKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcblxuICAgICAgICAvKiBTZWxmIHJlZGlyZWN0cyAqL1xuICAgICAgICBpZiAodGhpcy5wYXJzZWREZXN0aW5hdGlvbj8uZ2V0UHJlZml4ZWRUZXh0KCkgPT09IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFByZWZpeGVkVGV4dCgpKVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnY2Fubm90IHJlZGlyZWN0IHRvIGl0c2VsZiEnIH0pO1xuXG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uRGF0YSA9IChhd2FpdCB0aGlzLmFwaVxuICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiBbJ3BhZ2Vwcm9wcycsICdjYXRlZ29yaWVzJ10sXG4gICAgICAgICAgICAgICAgdGl0bGVzOiBkZXN0aW5hdGlvbixcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UGFnZVByb3BzUGFyYW1zKVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIC8qIE5vbmV4aXN0ZW50IGRlc3RpbmF0aW9uICovIGlmIChlcnJvckNvZGUgPT09ICdtaXNzaW5ndGl0bGUnKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2RvZXMgbm90IGV4aXN0IScgfSk7XG4gICAgICAgICAgICAgICAgLyogT3RoZXIgQVBJIGVycm9yICovIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6IGB3YXMgbm90IGFibGUgdG8gYmUgZmV0Y2hlZCBmcm9tIHRoZSBBUEkgKCR7ZXJyb3JDb2RlfSkhYCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0pKSBhcyAoUGFnZXByb3BzUmVzdWx0ICYgQ2F0ZWdvcmllc1Jlc3VsdCkgfCBudWxsO1xuICAgICAgICBjb25zdCBkZXN0aW5hdGlvblBhcnNlUmVzdWx0ID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdwYXJzZScsXG4gICAgICAgICAgICBwYWdlOiBkZXN0aW5hdGlvbixcbiAgICAgICAgICAgIHByb3A6ICdzZWN0aW9ucycsXG4gICAgICAgICAgICByZWRpcmVjdHM6IHRydWUsXG4gICAgICAgIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKSkgYXMgUGFnZVBhcnNlUmVzdWx0O1xuXG4gICAgICAgIC8qIERvdWJsZSByZWRpcmVjdHMgKi9cbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzPy5bMF0pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uUmVkaXJlY3QgPVxuICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvICtcbiAgICAgICAgICAgICAgICAoZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHNbMF0udG9mcmFnbWVudCA/IGAjJHtkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnJlZGlyZWN0c1swXS50b2ZyYWdtZW50fWAgOiAnJyk7XG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKFxuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblJlZGlyZWN0LFxuICAgICAgICAgICAgICAgICl9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHtkZXN0aW5hdGlvblJlZGlyZWN0fTwvYT4uIFJldGFyZ2V0IHRvIHRoYXQgcGFnZSBpbnN0ZWFkLCBhcyBkb3VibGUgcmVkaXJlY3RzIGFyZW4ndCBhbGxvd2VkLmAsXG4gICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnY2hhbmdlLXRhcmdldCcsIHRhcmdldDogZGVzdGluYXRpb25SZWRpcmVjdCB9XSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogTm9uZXhpc3RlbnQgc2VjdGlvbiAqL1xuICAgICAgICBpZiAoZGVzdGluYXRpb24uc3BsaXQoJyMnKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZFNlY3Rpb24gPSBkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnNlY3Rpb25zLmZpbmQoXG4gICAgICAgICAgICAgICAgKHNlY3Rpb24pID0+IHNlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKSA9PT0gZGVzdGluYXRpb24uc3BsaXQoJyMnKVsxXSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodmFsaWRTZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXMoJ1IgdG8gYW5jaG9yJykpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyB0YWdnZWQgYXMgYSByZWRpcmVjdCB0byBhbiBhbmNob3IsIGJ1dCBpdCBpcyBhY3R1YWxseSBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBzZWN0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1IgdG8gYW5jaG9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKCdSIHRvIHNlY3Rpb24nKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB0byBzZWN0aW9ufX08L2NvZGU+IScsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHRvIHNlY3Rpb24nIH1dLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Db250ZW50ID0gKFxuICAgICAgICAgICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcnZwcm9wOiAnY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFyc2VkRGVzdGluYXRpb24hLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcykpIGFzIFBhZ2VSZXZpc2lvbnNSZXN1bHRcbiAgICAgICAgICAgICAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQ7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3JzID0gW1xuICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goLyg/PD17e1xccyo/W0FhXSg/Om5jaG9ycz98bmNob3IgZm9yIHJlZGlyZWN0fG5rZXJ8TkNIT1J8bmMpXFxzKj9cXHwpLis/KD89fX0pL2cpXG4gICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGFuY2hvci5zcGxpdCgnfCcpLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgPy5mbGF0KCkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyg/PD17e1xccyo/KD86W1Z2XSg/OmlzaWJsZSBhbmNob3JzP3xpc2FuY3xBbmNofGFuY2hvcnxpc2libGVhbmNob3J8YSl8W0FhXSg/Om5jaG9yZHxjaG9yZWR8bmNob3JcXCspfFtUdF1leHQgYW5jaG9yKVxccyo/XFx8KS4rPyg/PSg/PCEhfD0pfX0pL2csXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnfCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhcnQpID0+IHBhcnQudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiAhL150ZXh0XFxzKj89Ly50ZXN0KHBhcnQpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgID8uZmxhdCgpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudC5tYXRjaCgvKD88PWlkPSlcIj8uKz8oPz1cInw+fFxcfCkvZyk/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGFuY2hvci50cmltKCkpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudC5tYXRjaCgvRXBpc29kZU51bWJlciArPSArXFxkKy9nKT8ubWFwKChhbmNob3I6IHN0cmluZykgPT4gYGVwJHthbmNob3Iuc3BsaXQoJz0nKVsxXS50cmltKCl9YCkgPz9cbiAgICAgICAgICAgICAgICAgICAgICAgIFtdKSxcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGlmIChhbmNob3JzLmluY2x1ZGVzKGRlc3RpbmF0aW9uLnNwbGl0KCcjJylbMV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHRvIHNlY3Rpb24nKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgdGFnZ2VkIGFzIGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uLCBidXQgaXQgaXMgYWN0dWFsbHkgYSByZWRpcmVjdCB0byBhbiBhbmNob3IhJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBhbmNob3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1IgdG8gc2VjdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFncy5pbmNsdWRlcygnUiB0byBhbmNob3InKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhbiBhbmNob3IsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIGZyb20gYW5jaG9yfX08L2NvZGU+IScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBhbmNob3InIH1dLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBpcyBhIHJlZGlyZWN0IHRvIDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKGRlc3RpbmF0aW9uKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2Rlc3RpbmF0aW9ufTwvYT4sIGJ1dCB0aGF0IHNlY3Rpb24gb3IgYW5jaG9yIGRvZXMgbm90IGV4aXN0IWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdjaGFuZ2UtdGFyZ2V0JywgdGFyZ2V0OiBkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzBdIH1dLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEltcHJvcGVybHkgdGFnZ2VkIGFzIHJlZGlyZWN0IHRvIHNlY3Rpb24vYW5jaG9yICovXG4gICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIFsnUiB0byBzZWN0aW9uJywgJ1IgdG8gYW5jaG9yJ10pXG4gICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModGFnKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIG5vdCBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbi9hbmNob3IsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCA8Y29kZT57eyR7dGFnfX19PC9jb2RlPiFgLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnIH1dLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSA9ICEhKFxuICAgICAgICAgICAgZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5wYWdlcHJvcHMgJiYgJ2Rpc2FtYmlndWF0aW9uJyBpbiBkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnBhZ2Vwcm9wc1xuICAgICAgICApO1xuICAgICAgICBjb25zdCB0YXJnZXRJc1N1cm5hbWVMaXN0ID0gISFkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLmNhdGVnb3JpZXM/LnNvbWUoXG4gICAgICAgICAgICAoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6U3VybmFtZXMnLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyA9IFsnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJywgJ1IgZnJvbSBpbmNvbXBsZXRlIGRpc2FtYmlndWF0aW9uJ107XG4gICAgICAgIGNvbnN0IHRvU3VybmFtZUxpc3RUYWdzID0gWydSIGZyb20gYW1iaWd1b3VzIHNvcnQgbmFtZScsICdSIGZyb20gYW1iaWd1b3VzIHRlcm0nXTtcblxuICAgICAgICBjb25zdCB0YWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgPSB0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3Muc29tZSgodGVtcGxhdGUpID0+IHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKTtcbiAgICAgICAgY29uc3QgdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QgPSB0b1N1cm5hbWVMaXN0VGFncy5zb21lKCh0ZW1wbGF0ZSkgPT4gdGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpO1xuXG4gICAgICAgIC8qIFJlZGlyZWN0IHRvIGRpc2FtYmlndWF0aW9uIHBhZ2Ugd2l0aG91dCB0ZW1wbGF0ZSAqL1xuICAgICAgICBpZiAodGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSAmJiAhdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBkaXNhbWJpZ3VhdGlvbiBwYWdlLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIGEgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnBhZ2Vwcm9wcyAmJiAhdGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UpIHtcbiAgICAgICAgICAgIC8qIEltcHJvcGVybHkgdGFnZ2VkIGFzIHJlZGlyZWN0IHRvIGRpc2FtYmlndWF0aW9uIHBhZ2UgKi9cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAoIXRhcmdldElzU3VybmFtZUxpc3QgJiYgKHRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSB8fCB0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdCkpIHx8XG4gICAgICAgICAgICAgICAgKHRhcmdldElzU3VybmFtZUxpc3QgJiYgdGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIG5vdCBhIHJlZGlyZWN0IHRvIGEgZGlzYW1iaWd1YXRpb24gcGFnZSwgYnV0IGl0IGlzIHRhZ2dlZCB3aXRoIGEgZGlzYW1iaWd1YXRpb24gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUhJyxcbiAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbLi4udG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzLCAuLi50b1N1cm5hbWVMaXN0VGFnc10ubWFwKCh0YWcpID0+ICh7IHR5cGU6ICdyZW1vdmUnLCB0YWcgfSkpLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBSZWRpcmVjdCB0byBzdXJuYW1lIGxpc3Qgd2l0aG91dCB0ZW1wbGF0ZSAqL1xuICAgICAgICAgICAgaWYgKHRhcmdldElzU3VybmFtZUxpc3QgJiYgIXRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0KVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBzdXJuYW1lIGxpc3QsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggYSBjb3JyZWN0IGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiB7e1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZX19IHdpdGhvdXQgXCIgKGRpc2FtYmlndWF0aW9uKVwiIGF0IGVuZCBvZiB0aXRsZSAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSAmJlxuICAgICAgICAgICAgdGFncy5pbmNsdWRlcygnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJykgJiZcbiAgICAgICAgICAgICF0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRNYWluVGV4dCgpLmVuZHNXaXRoKCcgKGRpc2FtYmlndWF0aW9uKScpXG4gICAgICAgIClcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAnaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fTwvY29kZT4sIGJ1dCB0aGlzIHRpdGxlIGRvZXMgbm90IGVuZCB3aXRoIFwiIChkaXNhbWJpZ3VhdGlvbilcIi4gVXNlIDxjb2RlPnt7UiBmcm9tIGFtYmlndW91cyB0ZXJtfX08L2NvZGU+IG9yIGEgc2ltaWxhciBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBpbnN0ZWFkIScsXG4gICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnOiAnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJyB9XSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFRhZ2dlZCB3aXRoIGEgcHJvdGVjdGlvbiB0ZW1wbGF0ZSAqL1xuICAgICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIFsnUiBwcm90ZWN0ZWQnLCAnUiBzZW1pLXByb3RlY3RlZCcsICdSIGV4dGVuZGVkLXByb3RlY3RlZCcsICdSIHRlbXBsYXRlLXByb3RlY3RlZCcsICdSIGZ1bGx5IHByb3RlY3RlZCddKVxuICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIHRhZ2dlZCB3aXRoIHVubmVjZXNzYXJpbHkgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RlbXBsYXRlfX19PC9jb2RlPiB3aGljaCB3aWxsIGJlIGR1cGxpY2F0ZWQgYnkgdGhlIHJlZGlyZWN0IGNhdGVnb3J5IHNoZWxsIWAsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogdGVtcGxhdGUgfV0sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLyogTGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSB3aXRob3V0IGJlaW5nIHRhZ2dlZCB3aXRoIHt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fSAqL1xuICAgICAgICBpZiAobXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpICYmICF0YWdzLmluY2x1ZGVzKCdSIHdpdGggV2lraWRhdGEgaXRlbScpKVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiaXMgbGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSBidXQgaXQgaXNuJ3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHdpdGggV2lraWRhdGEgaXRlbX19PC9jb2RlPiFcIixcbiAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHdpdGggV2lraWRhdGEgaXRlbScgfV0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKiBUYWdnZWQgd2l0aCB7e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX0gd2l0aG91dCBiZWluZyBsaW5rZWQgdG8gYW4gaXRlbSAqL1xuICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nKSAmJiAhbXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpKVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyB0YWdnZWQgd2l0aCA8Y29kZT57e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX08L2NvZGU+IGJ1dCBpdCBpcyBub3QgYWN0dWFsbHkgbGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSEnLFxuICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJyB9XSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8qIE1pc3NpbmcgdGFnIHJlcXVpcmVkIHBhcmFtZXRlciAqL1xuICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiB0YWdzKSB7XG4gICAgICAgICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5yZWRpcmVjdFRlbXBsYXRlc1t0YWddO1xuICAgICAgICAgICAgaWYgKCF0YWdEYXRhKSBjb250aW51ZTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGFnRGF0YS5wYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kUGFyYW1ldGVyID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZylcbiAgICAgICAgICAgICAgICAgICAgPy5wYXJhbWV0ZXJzLmZpbmQoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCAuLi5wYXJhbWV0ZXIuYWxpYXNlc10uaW5jbHVkZXMocGFyYW1ldGVyTmFtZSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZFBhcmFtZXRlcikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyRGF0YS5yZXF1aXJlZCAmJiAhZm91bmRQYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RhZ319fTwvY29kZT4gYnV0IGl0IGlzIG1pc3NpbmcgdGhlIHJlcXVpcmVkIHBhcmFtZXRlciA8Y29kZT4ke3BhcmFtZXRlck5hbWV9PC9jb2RlPiFgLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFN5bmNpbmcgdGFsayBwYWdlIGJ1dCB0YWxrIHBhZ2UgZXhpc3RzIGFuZCBpc24ndCBhIHJlZGlyZWN0ICovXG4gICAgICAgIGlmICh0aGlzLnN5bmNUYWxrQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSAmJiAhdGhpcy50YWxrRGF0YSEucXVlcnkucGFnZXNbMF0ubWlzc2luZyAmJiAhdGhpcy50YWxrRGF0YSEucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QpXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdleGlzdHMsIGJ1dCBpcyBub3QgYSByZWRpcmVjdCEnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGVzIHRoZSBldmVudCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgXCJTdWJtaXRcIiBidXR0b24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBoYW5kbGVTdWJtaXRCdXR0b25DbGljaygpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudHNUb0Rpc2FibGUgPSBbXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQsXG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdCxcbiAgICAgICAgICAgIC4uLnRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5mbGF0TWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLmVkaXRvcikpLFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24sXG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LFxuICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXQsXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbixcbiAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24sXG4gICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5zeW5jVGFsa0NoZWNrYm94LFxuICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCxcbiAgICAgICAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzVG9EaXNhYmxlKSAoZWxlbWVudCBhcyBPTy51aS5XaWRnZXQpLnNldERpc2FibGVkKHRydWUpO1xuXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDaGVja2luZyB0YXJnZXQgdmFsaWRpdHkuLi4nKTtcblxuICAgICAgICBsZXQgZXJyb3JzOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHRoaXMudmFsaWRhdGVTdWJtaXNzaW9uPj4gPSBbXTtcbiAgICAgICAgaWYgKHRoaXMubmVlZHNDaGVjaykgZXJyb3JzID0gYXdhaXQgdGhpcy52YWxpZGF0ZVN1Ym1pc3Npb24oKTtcbiAgICAgICAgZWxzZSB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkpO1xuXG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5yZWRpcmVjdC1oZWxwZXItd2FybmluZycpKSBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCB7IHRpdGxlLCBtZXNzYWdlLCBhdXRvRml4ZXMgfSBvZiBlcnJvcnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgYCR7dGl0bGUgPyBgPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwodGl0bGUpfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7dGl0bGV9PC9hPmAgOiAnVGhpcyBwYWdlJ30gJHttZXNzYWdlfSBDbGljayBhZ2FpbiB3aXRob3V0IG1ha2luZyBjaGFuZ2VzIHRvIHN1Ym1pdCBhbnl3YXkuYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdhcm5pbmdNZXNzYWdlID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWhlbHBlci13YXJuaW5nJ10sXG4gICAgICAgICAgICAgICAgICAgIGlubGluZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG9GaXhCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUGVyZm9ybSBhdXRvLWZpeCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnczogWydwcm9ncmVzc2l2ZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1oZWxwZXItYXV0b2ZpeC1idXR0b24nXSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFncyA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0b0ZpeCBvZiBhdXRvRml4ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeC50eXBlID09PSAnYWRkJyAmJiAhdGFncy5pbmNsdWRlcyhhdXRvRml4LnRhZykpIHRoaXMudGFnU2VsZWN0LmFkZFRhZyhhdXRvRml4LnRhZywgYXV0b0ZpeC50YWcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9GaXgudHlwZSA9PT0gJ3JlbW92ZScgJiYgdGFncy5pbmNsdWRlcyhhdXRvRml4LnRhZykpIHRoaXMudGFnU2VsZWN0LnJlbW92ZVRhZ0J5RGF0YShhdXRvRml4LnRhZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXV0b0ZpeC50eXBlID09PSAnY2hhbmdlLXRhcmdldCcpIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZShhdXRvRml4LnRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdNZXNzYWdlLiRlbGVtZW50WzBdLnN0eWxlLnRleHREZWNvcmF0aW9uID0gJ2xpbmUtdGhyb3VnaCAycHggYmxhY2snO1xuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeEJ1dHRvbi4kZWxlbWVudFswXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ01lc3NhZ2UuJGVsZW1lbnRbMF0ucXVlcnlTZWxlY3RvcignLm9vLXVpLWxhYmVsRWxlbWVudC1sYWJlbCcpIS5hcHBlbmQoYXV0b0ZpeEJ1dHRvbi4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5lZGl0b3JCb3guJGVsZW1lbnRbMF0uYXBwZW5kKHdhcm5pbmdNZXNzYWdlLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzVG9EaXNhYmxlKSAoZWxlbWVudCBhcyBPTy51aS5XaWRnZXQpLnNldERpc2FibGVkKGZhbHNlKTtcblxuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCBhbnl3YXknKTtcbiAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvKiBFZGl0L2NyZWF0ZSByZWRpcmVjdCAqL1xuICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbChgJHt0aGlzLmV4aXN0cyA/ICdFZGl0aW5nJyA6ICdDcmVhdGluZyd9IHJlZGlyZWN0Li4uYCk7XG5cbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHN1bW1hcnkgPVxuICAgICAgICAgICAgKHRoaXMuc3VtbWFyeUlucHV0LmdldFZhbHVlKCkgfHwgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyKSArIHRoaXMuc2NyaXB0TWVzc2FnZTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZSh0aGlzLnBhZ2VUaXRsZSwgb3V0cHV0LCBzdW1tYXJ5KTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybjtcblxuICAgICAgICBtdy5ub3RpZnkoYFJlZGlyZWN0ICR7dGhpcy5leGlzdHMgPyAnZWRpdGVkJyA6ICdjcmVhdGVkJ30gc3VjY2Vzc2Z1bGx5IWAsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuXG4gICAgICAgIC8qIFN5bmMgdGFsayBwYWdlIGNoZWNrYm94IGhhbmRsZXIgKi9cbiAgICAgICAgaWYgKHRoaXMuc3luY1RhbGtDaGVja2JveD8uaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnRWRpdGluZyB0YWxrIHBhZ2UuLi4nKTtcblxuICAgICAgICAgICAgY29uc3QgZnJvbU1vdmUgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKCdSIGZyb20gbW92ZScpO1xuXG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZERlc3RpbmF0aW9uIS5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgICAgICBmcm9tTW92ZSA/IFsnUiBmcm9tIG1vdmUnXSA6IFtdLFxuICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCB0YWxrUmVzdWx0ID0gYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgb3V0cHV0LFxuICAgICAgICAgICAgICAgICdTeW5jaW5nIHJlZGlyZWN0IGZyb20gbWFpbiBwYWdlJyArIHRoaXMuc2NyaXB0TWVzc2FnZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoIXRhbGtSZXN1bHQpIHJldHVybjtcblxuICAgICAgICAgICAgbXcubm90aWZ5KCdUYWxrIHBhZ2Ugc3luY2VkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFBhdHJvbCBjaGVja2JveCBoYW5kbGVyICovXG4gICAgICAgIGlmICh0aGlzLnBhdHJvbENoZWNrYm94Py5pc1NlbGVjdGVkKCkpIHtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdQYXRyb2xsaW5nIHJlZGlyZWN0Li4uJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHBhdHJvbExpbms6IEhUTUxBbmNob3JFbGVtZW50IHwgbnVsbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wYXRyb2xsaW5rIGEnKTtcbiAgICAgICAgICAgIGNvbnN0IG1hcmtSZXZpZXdlZEJ1dHRvbiA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEJ1dHRvbkVsZW1lbnQ+KCcjbXdlLXB0LW1hcmstYXMtcmV2aWV3ZWQtYnV0dG9uJyk7XG5cbiAgICAgICAgICAgIGlmIChwYXRyb2xMaW5rKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0cm9sUmVzdWx0ID0gYXdhaXQgdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgLnBvc3RXaXRoVG9rZW4oJ3BhdHJvbCcsIHsgYWN0aW9uOiAncGF0cm9sJywgcmNpZDogbmV3IFVSTChwYXRyb2xMaW5rLmhyZWYpLnNlYXJjaFBhcmFtcy5nZXQoJ3JjaWQnKSEgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgcGF0cm9sbGluZyAke3RoaXMucGFnZVRpdGxlfSB2aWEgQVBJOiAke2Vycm9ySW5mbz8uZXJyb3IuaW5mbyA/PyAnVW5rbm93biBlcnJvcid9ICgke2Vycm9yQ29kZX0pYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdlcnJvcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhdHJvbFJlc3VsdCkgbXcubm90aWZ5KCdSZWRpcmVjdCBwYXRyb2xsZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXJrUmV2aWV3ZWRCdXR0b24pIHtcbiAgICAgICAgICAgICAgICBtYXJrUmV2aWV3ZWRCdXR0b24uY2xpY2soKTtcbiAgICAgICAgICAgICAgICBtdy5ub3RpZnkoJ1JlZGlyZWN0IHBhdHJvbGxlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICB9IGVsc2UgbXcubm90aWZ5KCdQYWdlIGN1cmF0aW9uIHRvb2xiYXIgbm90IGZvdW5kLCByZWRpcmVjdCBjYW5ub3QgYmUgcGF0cm9sbGVkIScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDb21wbGV0ZSwgcmVsb2FkaW5nLi4uJyk7XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBtdy51dGlsLmdldFVybCh0aGlzLnBhZ2VUaXRsZSwgeyByZWRpcmVjdDogJ25vJyB9KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFRha2VzIHByb3ZpZGVkIHZhbHVlcyB0byBjcmVhdGUgdGhlIHBhZ2Ugb3V0cHV0LlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlT3V0cHV0KFxuICAgICAgICB0YXJnZXQ6IHN0cmluZyxcbiAgICAgICAgdGFnczogc3RyaW5nW10sXG4gICAgICAgIHN0cmF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICBkZWZhdWx0U29ydDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgICAgICBjYXRlZ29yaWVzOiBzdHJpbmdbXSxcbiAgICApIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVGFyZ2V0ID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGFyZ2V0KTtcblxuICAgICAgICBjb25zdCBmb3JtYXR0ZWRUaXRsZSA9IHBhcnNlZFRhcmdldFxuICAgICAgICAgICAgPyBgJHtwYXJzZWRUYXJnZXQuZ2V0TmFtZXNwYWNlSWQoKSA9PT0gMTQgPyAnOicgOiAnJ30ke3BhcnNlZFRhcmdldC5nZXRQcmVmaXhlZFRleHQoKX0ke3BhcnNlZFRhcmdldC5nZXRGcmFnbWVudCgpID8gYCMke3BhcnNlZFRhcmdldC5nZXRGcmFnbWVudCgpfWAgOiAnJ31gXG4gICAgICAgICAgICA6IHRhcmdldC50cmltKCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWRcbiAgICAgICAgICAgICAgICAuZ2V0TWFpblRleHQoKVxuICAgICAgICAgICAgICAgIC50b0xvY2FsZUxvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvW1xcdTAzMDAtXFx1MDM2Rl0vZywgJycpID09PVxuICAgICAgICAgICAgZGVmYXVsdFNvcnRcbiAgICAgICAgICAgICAgICA/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAubm9ybWFsaXplKCdORkQnKVxuICAgICAgICAgICAgICAgIC5yZXBsYWNlQWxsKC9bXFx1MDMwMC1cXHUwMzZGXS9nLCAnJylcbiAgICAgICAgKVxuICAgICAgICAgICAgZGVmYXVsdFNvcnQgPSB1bmRlZmluZWQ7IC8vIENoZWNrIGlmIHRpdGxlcyBub3JtYWxpemUgdG8gdGhlIHNhbWUgdGV4dCwgYW5kIHJlbW92ZXMgdGhlIERFRkFVTFRTT1JUIGlmIHNvXG5cbiAgICAgICAgY29uc3QgdGFnc1dpdGhBcmd1bWVudHMgPSB0YWdzLm1hcCgodGFnKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmb3VuZEFyZ3VtZW50RWRpdG9yID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcbiAgICAgICAgICAgIGlmICghZm91bmRBcmd1bWVudEVkaXRvcikgcmV0dXJuIGB7eyR7dGFnfX19YDtcblxuICAgICAgICAgICAgY29uc3QgbGFzdE51bWJlclBhcmFtZXRlckluZGV4ID0gZm91bmRBcmd1bWVudEVkaXRvci5wYXJhbWV0ZXJzLmZpbmRMYXN0SW5kZXgoXG4gICAgICAgICAgICAgICAgKHBhcmFtZXRlciwgaW5kZXgpID0+IHBhcmFtZXRlci5uYW1lID09PSAoaW5kZXggKyAxKS50b1N0cmluZygpICYmIHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBtYXBwZWRBcmd1bWVudHMgPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSAmJiBpbmRleCA+IGxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB8JHtwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSA/ICcnIDogYCR7cGFyYW1ldGVyLm5hbWV9PWB9JHt2YWx1ZX1gO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgIC5qb2luKCcnKTtcblxuICAgICAgICAgICAgcmV0dXJuIGB7eyR7dGFnfSR7bWFwcGVkQXJndW1lbnRzfX19YDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGAjUkVESVJFQ1QgW1ske2Zvcm1hdHRlZFRpdGxlfV1dXFxuYCxcbiAgICAgICAgICAgIHRhZ3MubGVuZ3RoID4gMCA/IGB7e1JlZGlyZWN0IGNhdGVnb3J5IHNoZWxsfFxcbiR7dGFnc1dpdGhBcmd1bWVudHMuam9pbignXFxuJyl9XFxufX1cXG5gIDogbnVsbCxcbiAgICAgICAgICAgIHN0cmF5VGV4dCA/IHN0cmF5VGV4dCArICdcXG4nIDogbnVsbCxcbiAgICAgICAgICAgIGRlZmF1bHRTb3J0ID8gYHt7REVGQVVMVFNPUlQ6JHtkZWZhdWx0U29ydC50cmltKCl9fX1gIDogbnVsbCxcbiAgICAgICAgICAgIGNhdGVnb3JpZXMubGVuZ3RoID4gMCA/IGNhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gYFtbQ2F0ZWdvcnk6JHtjYXRlZ29yeX1dXWApLmpvaW4oJ1xcbicpIDogbnVsbCxcbiAgICAgICAgXVxuICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoZXMgdGhlIGNvbnRlbnQgb2YgYSBnaXZlbiBwYWdlLlxuICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgdG8gZmV0Y2guXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRQYWdlQ29udGVudCh0aXRsZTogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6ICdyZXZpc2lvbnMnLFxuICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IHRpdGxlLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICkucXVlcnkucGFnZXNbMF0ucmV2aXNpb25zWzBdLnNsb3RzLm1haW4uY29udGVudC50cmltKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRWRpdHMgb3IgY3JlYXRlcyBhIHBhZ2Ugd2l0aCBnaXZlbiB0ZXh0LlxuICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgcGFnZSB0aXRsZS5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgcGFnZSB0ZXh0LlxuICAgICAqIEBwYXJhbSBzdW1tYXJ5IFRoZSBlZGl0IHN1bW1hcnkuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBlZGl0T3JDcmVhdGUodGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nLCBzdW1tYXJ5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAuZWRpdCh0aXRsZSwgKCkgPT4gKHsgdGV4dCwgc3VtbWFyeSB9KSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9ySW5mbzogTWVkaWFXaWtpRGF0YUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ25vY3JlYXRlLW1pc3NpbmcnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGkuY3JlYXRlKHRpdGxlLCB7IHN1bW1hcnkgfSwgdGV4dCkuY2F0Y2goKGVycm9yQ29kZTogc3RyaW5nLCBlcnJvckluZm86IE1lZGlhV2lraURhdGFFcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBFcnJvciBjcmVhdGluZyAke3RpdGxlfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEVycm9yIGVkaXRpbmcgb3IgY3JlYXRpbmcgJHt0aXRsZX06ICR7ZXJyb3JJbmZvPy5lcnJvci5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxufVxuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlJbmZvUGFyYW1zLCBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS9hcGlfcGFyYW1zJztcbmltcG9ydCB0eXBlIHsgUGFnZUluZm9SZXN1bHQsIFBhZ2VSZXZpc2lvbnNSZXN1bHQgfSBmcm9tICcuLi8uLi9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBSZWRpcmVjdFRlbXBsYXRlRGF0YSB9IGZyb20gJy4vcmVkaXJlY3QtaGVscGVyLWRpYWxvZyc7XG5cbmNvbnN0IGRlcGVuZGVuY2llcyA9IFtcbiAgICAnbWVkaWF3aWtpLnV0aWwnLFxuICAgICdvb2pzLXVpLWNvcmUnLFxuICAgICdvb2pzLXVpLXdpZGdldHMnLFxuICAgICdvb2pzLXVpLXdpbmRvd3MnLFxuICAgICdvb2pzLXVpLnN0eWxlcy5pY29ucy1jb250ZW50JyxcbiAgICAnb29qcy11aS5zdHlsZXMuaWNvbnMtZWRpdGluZy1jb3JlJyxcbl07XG5cbm13LmxvYWRlci51c2luZyhkZXBlbmRlbmNpZXMsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGRlZmF1bHQ6IFJlZGlyZWN0SGVscGVyRGlhbG9nIH0gPSBhd2FpdCBpbXBvcnQoJy4vcmVkaXJlY3QtaGVscGVyLWRpYWxvZycpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBlbnRpcmUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgcmVkaXJlY3QtaGVscGVyIHNjcmlwdC5cbiAgICAgKi9cbiAgICBjbGFzcyBSZWRpcmVjdEhlbHBlciB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RUZW1wbGF0ZXMhOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgcHJpdmF0ZSBjb250ZW50VGV4dCE6IEhUTUxEaXZFbGVtZW50O1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZSE6IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQhOiBtdy5UaXRsZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgcmVkaXJlY3QgaGVscGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcnVuKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhc3Nlc1ByZUNoZWNrcygpKSByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLmZldGNoUmVkaXJlY3RUZW1wbGF0ZXMoKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTERpdkVsZW1lbnQ+KCcjbXctY29udGVudC10ZXh0JykhO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRlbnRUZXh0KSByZXR1cm4gbXcubm90aWZ5KCdyZWRpcmVjdC1oZWxwZXI6IEZhaWxlZCB0byBmaW5kIGNvbnRlbnQgdGV4dCBlbGVtZW50IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJyk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGhpcy5wYWdlVGl0bGUpITtcbiAgICAgICAgICAgIGlmICghdGhpcy5wYWdlVGl0bGVQYXJzZWQpIHJldHVybiBtdy5ub3RpZnkoJ3JlZGlyZWN0LWhlbHBlcjogRmFpbGVkIHRvIHBhcnNlIHBhZ2UgdGl0bGUhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNoZWNrUGFnZUFuZExvYWQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgaWYgdGhlIHBhZ2UgcGFzc2VzIHByZSBjaGVja3MuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIHBhc3Nlc1ByZUNoZWNrcygpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSA+PSAwLCAvLyBJcyBub3QgdmlydHVhbCBuYW1lc3BhY2VcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z0lzUHJvYmFibHlFZGl0YWJsZScpLCAvLyBQYWdlIGlzIGVkaXRhYmxlXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dBY3Rpb24nKSA9PT0gJ3ZpZXcnIHx8IG13LmNvbmZpZy5nZXQoJ3dnQWN0aW9uJykgPT09ICdlZGl0JywgLy8gVmlld2luZyBvciBlZGl0aW5nIHRoZSBwYWdlXG4gICAgICAgICAgICAgICAgKG13LmNvbmZpZy5nZXQoJ3dnUmV2aXNpb25JZCcpIHx8IG13LmNvbmZpZy5nZXQoJ3dnQ3VyUmV2aXNpb25JZCcpKSA9PT0gbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJyksIC8vIFZpZXdpbmcgdGhlIGN1cnJlbnQgcmV2aXNpb25cbiAgICAgICAgICAgICAgICAhbXcuY29uZmlnLmdldCgnd2dEaWZmT2xkSWQnKSwgLy8gTm90IHZpZXdpbmcgYSBkaWZmXG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICByZXR1cm4gY29uZGl0aW9ucy5ldmVyeShCb29sZWFuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaGVzIHRoZSByZWRpcmVjdCB0ZW1wbGF0ZXMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGZldGNoUmVkaXJlY3RUZW1wbGF0ZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlczogJ1VzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci5qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICAgICAgKS5xdWVyeS5wYWdlcz8uWzBdPy5yZXZpc2lvbnM/LlswXT8uc2xvdHM/Lm1haW4/LmNvbnRlbnQgfHwgJ3t9JyxcbiAgICAgICAgICAgICkgYXMgUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGEgcGFnZSdzIHN0YXR1cyBhbmQgbG9hZHMgdGhlIGhlbHBlciBhcHByb3ByaWF0ZWx5LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBjaGVja1BhZ2VBbmRMb2FkKCkge1xuICAgICAgICAgICAgY29uc3QgcGFnZUluZm8gPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6ICdpbmZvJyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlJbmZvUGFyYW1zKSkgYXMgUGFnZUluZm9SZXN1bHQ7XG5cbiAgICAgICAgICAgIGNvbnN0IGRpYWxvZ0luZm8gPSB7XG4gICAgICAgICAgICAgICAgcmVkaXJlY3RUZW1wbGF0ZXM6IHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMsXG4gICAgICAgICAgICAgICAgY29udGVudFRleHQ6IHRoaXMuY29udGVudFRleHQsXG4gICAgICAgICAgICAgICAgcGFnZVRpdGxlOiB0aGlzLnBhZ2VUaXRsZSxcbiAgICAgICAgICAgICAgICBwYWdlVGl0bGVQYXJzZWQ6IHRoaXMucGFnZVRpdGxlUGFyc2VkLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHBhZ2VJbmZvLnF1ZXJ5LnBhZ2VzWzBdLm1pc3NpbmcpIHtcbiAgICAgICAgICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4jY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1gKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICBpZDogJ2NyZWF0ZS1yZWRpcmVjdC1idXR0b24nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ0NyZWF0ZSByZWRpcmVjdCcsXG4gICAgICAgICAgICAgICAgICAgIGljb246ICdhcnRpY2xlUmVkaXJlY3QnLFxuICAgICAgICAgICAgICAgICAgICBmbGFnczogWydwcm9ncmVzc2l2ZSddLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJ1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi4kZWxlbWVudFswXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlKS5sb2FkKCk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0LnByZXBlbmQoYnV0dG9uLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFnZUluZm8ucXVlcnkucGFnZXNbMF0ucmVkaXJlY3QpIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCB0cnVlKS5sb2FkKCk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwb3J0bGV0TGluayA9IG13LnV0aWwuYWRkUG9ydGxldExpbmsoXG4gICAgICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3NraW4nKSA9PT0gJ21pbmVydmEnID8gJ3AtdGInIDogJ3AtY2FjdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICAnIycsXG4gICAgICAgICAgICAgICAgICAgICdSZWRpcmVjdCBwYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgJ3JlZGlyZWN0LWhlbHBlcicsXG4gICAgICAgICAgICAgICAgKSE7XG4gICAgICAgICAgICAgICAgcG9ydGxldExpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICAgICBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgZmFsc2UpLmxvYWQoKTtcblxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oeyB0b3A6IDAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICBwb3J0bGV0TGluay5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5ldyBSZWRpcmVjdEhlbHBlcigpLnJ1bigpO1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Z0pBQUEsSUFNcUJBLEVBTnJCQyxFQUFBQyxFQUFBLGtCQU1xQkYsRUFBckIsY0FBaUQsR0FBRyxHQUFHLGVBQWdCLENBRTNELElBQU0sSUFBSSxHQUFHLElBRXJCLFlBQVlHLEVBQTZCLENBQ3JDLE1BQU1BLENBQU0sRUFFWixHQUFHLEdBQUcsTUFBTSxjQUFjLEtBQUssS0FBOENBLENBQU0sQ0FDdkYsQ0FFQSxpQkFB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Q2xDLEdBQUkseUJBQ0osTUFBTyxrQkFDUCxLQUFNLGtCQUNOLE1BQU8sQ0FBQyxhQUFhLENBQ3pCLENBQUMsRUFDREEsRUFBTyxHQUFHLFFBQVMsSUFBTSxDQUNyQkEsRUFBTyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQzFCLElBQUlKLEVBQXFCRyxFQUFZLEVBQUssRUFBRSxLQUFLLENBQ3JELENBQUMsRUFFRCxLQUFLLFlBQVksUUFBUUMsRUFBTyxTQUFTLENBQUMsQ0FBQyxDQUMvQyxTQUFXRixFQUFTLE1BQU0sTUFBTSxDQUFDLEVBQUUsU0FBVSxJQUFJRixFQUFxQkcsRUFBWSxFQUFJLEVBQUUsS0FBSyxNQUN4RixDQUNELElBQU1FLEVBQWMsR0FBRyxLQUFLLGVBQ3hCLEdBQUcsT0FBTyxJQUFJLE1BQU0sSUFBTSxVQUFZLE9BQVMsYUFDL0MsSUFDQSxnQkFDQSxpQkFDSixFQUNBQSxFQUFZLGlCQUFpQixRQUFVQyxHQUFVLENBQzdDQSxFQUFNLGVBQWUsRUFFckIsSUFBSU4sRUFBcUJHLEVBQVksRUFBSyxFQUFFLEtBQUssRUFFakQsT0FBTyxTQUFTLENBQUUsSUFBSyxFQUFHLFNBQVUsUUFBUyxDQUFDLEVBRTlDRSxFQUFZLE9BQU8sQ0FDdkIsQ0FBQyxDQUNMLENBQ0osQ0FDSixDQUVBLElBQUlKLEVBQWUsRUFBRSxJQUFJLENBQzdCLENBQUMiLAogICJuYW1lcyI6IFsiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJpbml0X2NhdGVnb3J5X2lucHV0X3dpZGdldCIsICJfX2VzbU1pbiIsICJjb25maWciLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAicGFyc2VkVGl0bGUiLCAicmVzdWx0IiwgInBhZ2VzIiwgInBhZ2UiLCAiY2F0ZWdvcnkiLCAidGl0bGVXaXRob3V0TmFtZXNwYWNlIiwgInJlc3BvbnNlIiwgImRhdGEiLCAibGFiZWwiLCAiQ2hhbmdlc0RpYWxvZyIsICJpbml0X2NoYW5nZXNfZGlhbG9nIiwgIl9fZXNtTWluIiwgIl9DaGFuZ2VzRGlhbG9nIiwgImNvbmZpZyIsICJvbGRUZXh0IiwgIm5ld1RleHQiLCAicmVzdWx0IiwgImNvbXBhcmlzb24iLCAibm9DaGFuZ2VzRWxlbWVudCIsICJwYW5lbExheW91dCIsICJhY3Rpb24iLCAiT3V0cHV0UHJldmlld0RpYWxvZyIsICJpbml0X291dHB1dF9wcmV2aWV3X2RpYWxvZyIsICJfX2VzbU1pbiIsICJfT3V0cHV0UHJldmlld0RpYWxvZyIsICJjb25maWciLCAicGFnZVRpdGxlUGFyc2VkIiwgInJlc3VsdCIsICJ0YWdzQ29udGVudCIsICJjYXRlZ29yaWVzQ29udGVudCIsICJwYW5lbExheW91dCIsICJhY3Rpb24iLCAiUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldCIsICJpbml0X3JlZGlyZWN0X3RhcmdldF9pbnB1dF93aWRnZXQiLCAiX19lc21NaW4iLCAiY29uZmlnIiwgInBhZ2VUaXRsZVBhcnNlZCIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJ0aXRsZSIsICJyZXN1bHQiLCAibWF0Y2hlZFNlY3Rpb25zIiwgInNlY3Rpb24iLCAicGFyc2VkVGl0bGUiLCAicGFnZSIsICJyZXNwb25zZSIsICJkYXRhIiwgImxhYmVsIiwgInJlZGlyZWN0X2hlbHBlcl9kaWFsb2dfZXhwb3J0cyIsICJfX2V4cG9ydCIsICJSZWRpcmVjdEhlbHBlckRpYWxvZyIsICJpbml0X3JlZGlyZWN0X2hlbHBlcl9kaWFsb2ciLCAiX19lc21NaW4iLCAiaW5pdF9jYXRlZ29yeV9pbnB1dF93aWRnZXQiLCAiaW5pdF9jaGFuZ2VzX2RpYWxvZyIsICJpbml0X291dHB1dF9wcmV2aWV3X2RpYWxvZyIsICJpbml0X3JlZGlyZWN0X3RhcmdldF9pbnB1dF93aWRnZXQiLCAicmVkaXJlY3RUZW1wbGF0ZXMiLCAiY29udGVudFRleHQiLCAicGFnZVRpdGxlIiwgInBhZ2VUaXRsZVBhcnNlZCIsICJleGlzdHMiLCAibWFpblBhZ2VDb250ZW50IiwgInRhcmdldCIsICJ0YWdPclJlZGlyZWN0IiwgIlJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQiLCAidmFsdWUiLCAidGFnIiwgInJlZGlyZWN0IiwgImxhYmVsIiwgInNvcnRlZFRhZ3MiLCAiYSIsICJiIiwgImVkaXRvckluZm8iLCAic2hvd25UZW1wbGF0ZUVkaXRvcnMiLCAic3VtbWFyeUVsZW1lbnQiLCAibm9UZW1wbGF0ZXNNZXNzYWdlIiwgInRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZURhdGEiLCAicGFyYW1ldGVycyIsICJkZXRhaWxzIiwgInN1bW1hcnkiLCAiZWxlbWVudERhdGEiLCAicGFyYW1ldGVyTmFtZSIsICJwYXJhbWV0ZXJEYXRhIiwgImlucHV0IiwgImlucHV0TGF5b3V0IiwgIm5hbWUiLCAiZ2VuZXJhdGlvbmFsU3VmZml4IiwgImxhc3ROYW1lIiwgIm90aGVyTmFtZXMiLCAibmV3TmFtZSIsICJsZWFkaW5nQXJ0aWNsZSIsICJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgInBhZ2VzIiwgInBhZ2UiLCAid2luZG93TWFuYWdlciIsICJ0ZW1wbGF0ZVByZXZpZXdEaWFsb2ciLCAiT3V0cHV0UHJldmlld0RpYWxvZyIsICJzaG93Q2hhbmdlc0RpYWxvZyIsICJDaGFuZ2VzRGlhbG9nIiwgInBhZ2VUcmlhZ2VNYXJrQnV0dG9uIiwgInBhdHJvbFJlc3BvbnNlIiwgInJlZGlyZWN0VmFsdWUiLCAib2xkVGFyZ2V0IiwgInRhcmdldENoYW5nZWQiLCAidGFnc0NoYW5nZWQiLCAidGFnQXJndW1lbnRzQ2hhbmdlZCIsICJ0YWdzV2l0aFBhcmFtZXRlcnMiLCAiZGF0YSIsICJvbGRUYWdEYXRhIiwgImZvdW5kVGFnRWRpdG9yRGF0YSIsICJ0ZW1wbGF0ZSIsICJwYXJhbWV0ZXIiLCAib2xkQXJndW1lbnQiLCAiYXJndW1lbnQiLCAibmV3QXJndW1lbnQiLCAiZGVmYXVsdFNvcnRDaGFuZ2VkIiwgImNhdGVnb3JpZXNDaGFuZ2VkIiwgImNhdGVnb3J5IiwgImNoYW5nZXMiLCAidGFnRGF0YSIsICJvcmlnaW5hbFJlZGlyZWN0VGFncyIsICJtYXRjaCIsICJuZXdUYWciLCAiZm9ybWF0dGVkQXJndW1lbnRzIiwgImluZGV4IiwgImZvdW5kVGVtcGxhdGVFZGl0b3IiLCAiZm91bmRQYXJhbWV0ZXJFZGl0b3IiLCAiZXJyb3JzIiwgImRlc3RpbmF0aW9uIiwgInRhZ3MiLCAiZGVzdGluYXRpb25EYXRhIiwgImVycm9yQ29kZSIsICJkZXN0aW5hdGlvblBhcnNlUmVzdWx0IiwgImRlc3RpbmF0aW9uUmVkaXJlY3QiLCAic2VjdGlvbiIsICJkZXN0aW5hdGlvbkNvbnRlbnQiLCAiYW5jaG9yIiwgInBhcnQiLCAidGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UiLCAidGFyZ2V0SXNTdXJuYW1lTGlzdCIsICJ0b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3MiLCAidG9TdXJuYW1lTGlzdFRhZ3MiLCAidGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlIiwgInRhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0IiwgImZvdW5kUGFyYW1ldGVyIiwgImVsZW1lbnRzVG9EaXNhYmxlIiwgImVsZW1lbnQiLCAidGl0bGUiLCAibWVzc2FnZSIsICJhdXRvRml4ZXMiLCAid2FybmluZ01lc3NhZ2UiLCAiYXV0b0ZpeEJ1dHRvbiIsICJhdXRvRml4IiwgIm91dHB1dCIsICJmcm9tTW92ZSIsICJwYXRyb2xMaW5rIiwgIm1hcmtSZXZpZXdlZEJ1dHRvbiIsICJlcnJvckluZm8iLCAic3RyYXlUZXh0IiwgImRlZmF1bHRTb3J0IiwgImNhdGVnb3JpZXMiLCAicGFyc2VkVGFyZ2V0IiwgImZvcm1hdHRlZFRpdGxlIiwgInRhZ3NXaXRoQXJndW1lbnRzIiwgImZvdW5kQXJndW1lbnRFZGl0b3IiLCAibGFzdE51bWJlclBhcmFtZXRlckluZGV4IiwgIm1hcHBlZEFyZ3VtZW50cyIsICJ0ZXh0IiwgImRlcGVuZGVuY2llcyIsICJSZWRpcmVjdEhlbHBlckRpYWxvZyIsICJSZWRpcmVjdEhlbHBlciIsICJwYWdlSW5mbyIsICJkaWFsb2dJbmZvIiwgImJ1dHRvbiIsICJwb3J0bGV0TGluayIsICJldmVudCJdCn0K