User:Eejit43/scripts/redirect-helper.js
Appearance
< User:Eejit43 | scripts
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
![]() | This user script seems to have a documentation page at User:Eejit43/scripts/redirect-helper. |
// <nowiki>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/redirect-helper.ts
"use strict";mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","oojs-ui.styles.icons-content","oojs-ui.styles.icons-editing-core"],()=>{class O extends OO.ui.TextInputWidget{constructor(t,e){super(t);this.api=new mw.Api;this.getLookupRequest=()=>{const t=this.getValue(),e=$.Deferred();if(!t)e.resolve([]);else if(t.includes("#")){const a=t.split("#")[0];this.api.get({action:"parse",page:a,prop:"sections",redirects:!0}).catch(()=>null).then(n=>{if(n){const s=n.parse.sections.filter(r=>r.line.toLowerCase().replaceAll(/<\/?i>/g,"").startsWith(t.split("#")[1].toLowerCase()));e.resolve(s.map(r=>({data:`${n.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`,label:`${n.parse.title}#${r.line.replaceAll(/<\/?i>/g,"")}`})))}else e.resolve([])})}else{const a=mw.Title.newFromText(t);this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:a?.getNamespaceId()??0,gapprefix:a?.getMainText()??t,generator:"allpages",prop:["info","pageprops"]}).catch(()=>null).then(n=>{n?e.resolve(n.query?.pages?n.query.pages.filter(s=>s.title!==this.pageTitleParsed.toString()).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>":""}`)})):[]):e.resolve([])})}return e.promise({abort(){}})};this.getLookupCacheDataFromResponse=t=>t??[];this.getLookupMenuOptionsFromData=t=>t.map(({data:e,label:a})=>new OO.ui.MenuOptionWidget({data:e,label:a}));OO.ui.mixin.LookupElement.call(this,t),this.pageTitleParsed=e}}Object.assign(O.prototype,OO.ui.mixin.LookupElement.prototype);class P extends OO.ui.TextInputWidget{constructor(t){super(t);this.api=new mw.Api;this.getLookupRequest=()=>{const t=this.getValue(),e=$.Deferred();t||e.resolve([]);const a=mw.Title.newFromText(t);return this.api.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:a?.getMainText()??t,generator:"allpages",prop:"categories"}).catch(()=>null).then(n=>{if(n?.query?.pages){const s=n.query.pages.filter(r=>!(r.categories&&r.categories.some(o=>o.title==="Category:Wikipedia soft redirected categories"))).map(r=>{const o=r.title.split(":")[1];return{data:o,label:o}});this.emit("showing-values",s),e.resolve(s)}else e.resolve([])}),e.promise({abort(){}})};this.getLookupCacheDataFromResponse=t=>t??[];this.getLookupMenuOptionsFromData=t=>t.map(({data:e,label:a})=>new OO.ui.MenuOptionWidget({data:e,label:a}));OO.ui.mixin.LookupElement.call(this,t)}}Object.assign(P.prototype,OO.ui.mixin.LookupElement.prototype);class d extends OO.ui.ProcessDialog{constructor(t,e){super(t);this.api=new mw.Api;this.getSetupProcess=()=>d.super.prototype.getSetupProcess.call(this).next(()=>this.api.post({action:"parse",formatversion:"2",contentmodel:"wikitext",prop:["text","categorieshtml"],title:this.pageTitleParsed.getPrefixedDb(),text:this.getData()}).then(t=>{const e=t.parse.text,a=t.parse.categorieshtml,n=new OO.ui.PanelLayout({padded:!0,expanded:!1});n.$element.append(e,a),this.$body.append(n.$element)}));this.getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):d.super.prototype.getActionProcess.call(this,t);this.getTeardownProcess=()=>d.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});this.pageTitleParsed=e,d.static.name="TemplatePreviewDialog",d.static.title="Redirect categorization templates preview",d.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}}Object.assign(d.prototype,OO.ui.ProcessDialog.prototype);class m extends OO.ui.ProcessDialog{constructor(t){super(t);this.api=new mw.Api;this.getSetupProcess=()=>m.super.prototype.getSetupProcess.call(this).next(()=>{const[t,e]=this.getData();return this.api.post({action:"compare",formatversion:"2",prop:["diff"],fromslots:"main","fromtext-main":t,"fromcontentmodel-main":"wikitext",toslots:"main","totext-main":e,"tocontentmodel-main":"wikitext"}).then(a=>{const n=a.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(n?`
<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>
${n}
</tbody>
</table>`:s.$element[0]),this.$body.append(r.$element)})});this.getActionProcess=t=>t?new OO.ui.Process(()=>{this.getManager().closeWindow(this)}):m.super.prototype.getActionProcess.call(this,t);this.getTeardownProcess=()=>m.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});m.static.name="ShowChangesDialog",m.static.title="Changes to be made",m.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}}Object.assign(m.prototype,OO.ui.ProcessDialog.prototype);class x{constructor(){this.api=new mw.Api}async run(){if(this.passesPreChecks()){if(this.redirectTemplates=await this.fetchRedirectTemplates(),this.contentText=document.querySelector("#mw-content-text"),!this.contentText)return mw.notify("redirect-helper: Failed to find content text element!",{type:"error"});if(this.pageTitle=mw.config.get("wgPageName"),this.pageTitleParsed=mw.Title.newFromText(this.pageTitle),!this.pageTitleParsed)return mw.notify("redirect-helper: Failed to parse page title!",{type:"error"});await this.checkPageAndLoad()}}passesPreChecks(){return[mw.config.get("wgNamespaceNumber")>=0,mw.config.get("wgIsProbablyEditable"),mw.config.get("wgIsArticle"),mw.config.get("wgAction")==="view",mw.config.get("wgRevisionId")===mw.config.get("wgCurRevisionId"),!mw.config.get("wgDiffOldId")].every(Boolean)}async fetchRedirectTemplates(){return JSON.parse((await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:"User:Eejit43/scripts/redirect-helper.json"})).query.pages?.[0]?.revisions?.[0]?.slots?.main?.content||"{}")}async checkPageAndLoad(){const i=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitle}),t={redirectTemplates:this.redirectTemplates,contentText:this.contentText,pageTitle:this.pageTitle,pageTitleParsed:this.pageTitleParsed};if(i.query.pages[0].missing){mw.util.addCSS(`
#create-redirect-button {
margin-bottom: 20px;
}`);const e=new OO.ui.ButtonWidget({id:"create-redirect-button",label:"Create redirect",icon:"articleRedirect",flags:["progressive"]});e.on("click",()=>{e.$element[0].remove(),new b(t,!1).load()}),this.contentText.prepend(e.$element[0])}else if(i.query.pages[0].redirect)new b(t,!0).load();else{const e=mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Redirect page","redirect-helper");e.addEventListener("click",a=>{a.preventDefault(),new b(t,!1).load(),window.scrollTo({top:0,behavior:"smooth"}),e.remove()})}}}class b{constructor({redirectTemplates:i,contentText:t,pageTitle:e,pageTitleParsed:a},n){this.api=new mw.Api;this.redirectRegex=/^#redirect:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+?)?]]\s*/i;this.scriptAdvert=" (via [[User:Eejit43/scripts/redirect-helper|redirect-helper]])";this.needsCheck=!0;this.templateEditorsInfo=[];this.pageContent="";this.redirectTemplates=i,this.contentText=t,this.pageTitle=e,this.pageTitleParsed=a,this.exists=n}async load(){mw.util.addCSS(`
#create-redirect-button {
margin-bottom: 20px;
}
#redirect-helper-box {
background-color: whitesmoke;
width: 700px;
max-width: calc(100% - 50px);
margin-left: auto;
margin-right: auto;
margin-bottom: 25px !important;
}
.redirect-input-layout label {
font-weight: bold;
}
.redirect-helper-template-parameters-container, .redirect-helper-template-parameters-container details {
background-color: #e2e2e2;
border-radius: 5px;
margin-block: 10px;
padding: 5px;
}
.redirect-helper-template-parameters-container summary {
cursor: pointer;
font-weight: bold;
}
.redirect-helper-template-parameters-container details {
background-color: #d1cece;
margin-block: 5px;
}
.redirect-helper-template-parameters-contained #redirect-helper-no-templates-message {
padding: 5px;
}
#redirect-helper-summary-layout {
padding-top: 10px;
margin-top: 15px;
border-top: 1px solid gray;
}
#redirect-helper-submit-layout {
margin-top: 10px;
}
#redirect-helper-submit-layout > * {
margin-bottom: 0;
}
.redirect-helper-warning {
margin-top: 8px;
}`),mw.loader.addLinkTag("https://www.mediawiki.org/w/load.php?modules=mediawiki.diff.styles&only=styles"),this.editorBox=new OO.ui.PanelLayout({id:"redirect-helper-box",padded:!0,expanded:!1,framed:!0}),this.pageTitleParsed.isTalkPage()&&(await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getSubjectPage().getPrefixedText()})).query.pages[0].redirect&&await this.loadSyncWithMainButton(),this.loadInputElements(),await this.loadSubmitElements(),this.editorBox.$element[0].append(...[this.syncWithMainButton?.$element?.[0],this.redirectInputLayout.$element[0],this.tagSelectLayout.$element[0],this.templateParametersEditor,this.defaultSortInputLayout.$element[0],this.categorySelectLayout.$element[0],this.summaryInputLayout.$element[0],this.submitLayout.$element[0]].filter(Boolean)),this.contentText.prepend(this.editorBox.$element[0]),this.exists&&this.loadExistingData()}async loadSyncWithMainButton(){const i=await this.getPageContent(this.pageTitleParsed.getSubjectPage().getPrefixedText());this.syncWithMainButton=new OO.ui.ButtonWidget({label:"Sync with main page",icon:"link",flags:["progressive"]}),this.syncWithMainButton.on("click",()=>{const t=this.redirectRegex.exec(i)?.[1];if(!t)return mw.notify("Failed to parse main page content!",{type:"error"});this.redirectInput.setValue(mw.Title.newFromText(t)?.getTalkPage()?.toString()??""),["R from move",...this.redirectTemplates["R from move"].aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(i))&&this.tagSelect.setValue(["R from move"])})}loadInputElements(){this.redirectInput=new O({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.keys(this.redirectTemplates).map(e=>({data:e,label:e}))}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",()=>{const e=this.tagSelect.getValue().sort((n,s)=>n.toLowerCase().localeCompare(s.toLowerCase()));this.tagSelect.getValue().join(";")!==e.join(";")&&this.tagSelect.setValue(e),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0;for(const n of this.templateEditorsInfo)n.details.style.display="none";let a=0;for(const n of this.tagSelect.getValue()){const s=this.templateEditorsInfo.find(r=>r.name===n);s&&(s.details.style.display="block",a++)}t.style.display=a>0?"none":"block"}),this.tagSelectLayout=new OO.ui.FieldLayout(this.tagSelect,{label:"Redirect categorization templates:",classes:["redirect-input-layout"],align:"top"}),this.templateParametersEditor=document.createElement("details"),this.templateParametersEditor.classList.add("redirect-helper-template-parameters-container");const i=document.createElement("summary");i.textContent="Template parameters",this.templateParametersEditor.append(i);for(const[e,a]of Object.entries(this.redirectTemplates)){const n=Object.entries(a.parameters);if(n.length===0)continue;const s=document.createElement("details");s.style.display="none";const r=document.createElement("summary");r.textContent=e,s.append(r);const o={name:e,details:s,parameters:[]};for(const[u,c]of n){const p=new OO.ui.TextInputWidget({placeholder:c.default?.toString(),required:c.required});p.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});const l=new OO.ui.FieldLayout(p,{label:new OO.ui.HtmlSnippet(`${u}${!c.label||u.toLowerCase()===c.label?.toLowerCase()?"":` (${c.label})`}${c.description?` (${c.description})`:""} (type: ${c.type}) ${c.suggested?" (suggested)":""}${c.example?` (example: "${c.example}")`:""}`),align:"inline"});s.append(l.$element[0]),o.parameters.push({name:u,aliases:c.aliases,editor:p})}this.templateParametersEditor.append(s),this.templateEditorsInfo.push(o)}const t=document.createElement("div");t.id="redirect-helper-no-templates-message",t.textContent="No templates with parameters to display!",t.style.display=this.exists?"none":"block",this.templateParametersEditor.append(t),this.defaultSortInput=new OO.ui.TextInputWidget,this.defaultSortInput.on("change",()=>{const e=this.defaultSortInput.getValue();e.length>0&&this.defaultSortInput.setValue(e.replaceAll("_"," ")),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.defaultSortSuggestButton=new OO.ui.ButtonWidget({icon:"robot",label:"Suggest",disabled:!0}),this.defaultSortSuggestButton.on("click",()=>{let e=this.pageTitleParsed.getMainText().replace(/ \(.*\)$/,"");if(this.tagSelect.getValue().includes("R from person")){if(!e.includes(" "))return;let a="";if(/ (?:[JS]r.?|[IVX]+)$/.test(e)&&(a=e.slice(e.lastIndexOf(" ")),e=e.slice(0,e.lastIndexOf(" ")),!e.includes(" ")))return e+a;const n=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),s=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(n+", "+s+a)}else{let a=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(const n of["An","A","The"])if(a.startsWith(n+" ")){a=a.slice(n.length+1)+", "+n;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 P({placeholder:"Add categories here"}),this.categorySelectInput.on("change",()=>{let e=this.categorySelectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^Category:/,""),e.length>0&&this.categorySelectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," "))}),this.categorySelectInput.on("showing-values",e=>{for(const a of e)this.categorySelect.addAllowedValue(a.data)}),this.categorySelect=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:this.categorySelectInput}),this.categorySelect.on("change",()=>{const e=this.categorySelect.getValue().sort((a,n)=>a.toLowerCase().localeCompare(n.toLowerCase()));this.categorySelect.getValue().join(";")!==e.join(";")&&this.categorySelect.setValue(e),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.categorySelectLayout=new OO.ui.FieldLayout(this.categorySelect,{label:"Categories:",classes:["redirect-input-layout"],align:"top"}),this.summaryInput=new OO.ui.ComboBoxInputWidget({options:[{data:"Resolve double redirect"},{data:"Resolve self redirect"},{data:"Remove incorrect rcats"}]}),this.summaryInputLayout=new OO.ui.FieldLayout(this.summaryInput,{id:"redirect-helper-summary-layout",label:"Summary:",classes:["redirect-input-layout"],align:"top"})}async loadSubmitElements(){const i=new OO.ui.WindowManager;document.body.append(i.$element[0]),this.submitButton=new OO.ui.ButtonWidget({label:"Submit",disabled:!0,flags:["progressive"]}),this.submitButton.on("click",()=>this.handleSubmitButtonClick());const t=new d({size:"large"},this.pageTitleParsed);i.addWindows([t]),this.showPreviewButton=new OO.ui.ButtonWidget({label:"Show preview",disabled:!0}),this.showPreviewButton.on("click",()=>{t.setData(this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())),t.open()});const e=new m({size:"large"});i.addWindows([e]),this.showChangesButton=new OO.ui.ButtonWidget({label:"Show changes",disabled:!0}),this.showChangesButton.on("click",async()=>{this.exists&&(this.pageContent=await this.getPageContent(this.pageTitle)),e.setData([this.pageContent,this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())]),e.open()}),this.pageTitleParsed.isTalkPage()||(this.talkData=await this.api.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getTalkPage().getPrefixedText()}),this.syncTalkCheckbox=new OO.ui.CheckboxInputWidget({selected:!!this.talkData.query.pages[0].redirect}),this.syncTalkCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.syncTalkCheckbox,{label:"Sync talk page",align:"inline"})]})),await this.checkShouldPromptPatrol()&&(this.patrolCheckbox=new OO.ui.CheckboxInputWidget({selected:!0}),this.patrolCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.patrolCheckbox,{label:"Mark as patrolled",align:"inline"})]})),this.submitLayout=new OO.ui.HorizontalLayout({id:"redirect-helper-submit-layout",items:[this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckboxLayout,this.patrolCheckboxLayout].filter(Boolean)})}async checkShouldPromptPatrol(){const i=document.querySelector("#mwe-pt-mark .mwe-pt-tool-icon");if(i?.click(),i?.click(),mw.config.get("wgNamespaceNumber")!==0)return!1;if(document.querySelector(".patrollink"))return!0;if(document.querySelector("#mwe-pt-mark-as-reviewed-button"))return!0;if(document.querySelector("#mwe-pt-mark-as-unreviewed-button"))return!1;{if(!mw.config.get("wgArticleId")||!(await this.api.get({action:"query",meta:"userinfo",uiprop:"rights"})).query.userinfo.rights.includes("patrol"))return!1;const e=await this.api.get({action:"pagetriagelist",page_id:mw.config.get("wgArticleId")});return e.pagetriagelist.pages[0]?.user_name===mw.config.get("wgUserName")||e.pagetriagelist.result!=="success"||e.pagetriagelist.pages.length===0?!1:!Number.parseInt(e.pagetriagelist.pages[0]?.patrol_status)}}updateSummary(){const i=this.redirectInput.getValue().trim();if(!i)this.summaryInput.$tabIndexed[0].placeholder="";else if(this.exists){const t=i!==this.oldRedirectTarget?.replaceAll("_"," "),e=this.tagSelect.getValue().some(o=>!this.oldRedirectTags.includes(o))||this.oldRedirectTags.some(o=>!this.tagSelect.getValue().includes(o)),a=this.oldRedirectTagData?this.tagSelect.getValue().some(o=>this.templateEditorsInfo.find(u=>u.name===o)?.parameters.some(u=>{const c=this.oldRedirectTagData[o]?.find(p=>p[0]===u.name)?.[1];return c?c!==u.editor.getValue().trim():!1})):!1,n=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),s=this.categorySelect.getValue().some(o=>!this.oldCategories.includes(o))||this.oldCategories.some(o=>!this.categorySelect.getValue().includes(o)),r=[];t&&r.push(`retarget to [[${i}]]`),e&&r.push("change categorization templates"),a&&r.push("change categorization template arguments"),n&&r.push("change default sort key"),s&&r.push("change categories"),r.length===0&&r.push("perform redirect cleanup"),r[0]=r[0][0].toUpperCase()+r[0].slice(1),r.length>1&&(r[r.length-1]=`and ${r.at(-1)}`),this.summaryInput.$tabIndexed[0].placeholder=r.join(r.length>2?", ":" ")}else this.summaryInput.$tabIndexed[0].placeholder=`Create redirect to [[${i}]]`}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(([t,e])=>[t,...e.aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(this.pageContent))?t:null).filter(Boolean).sort((t,e)=>t.toLowerCase().localeCompare(e.toLowerCase()));const i=Object.entries(this.redirectTemplates).flatMap(([t,e])=>[t,...e.aliases]).map(t=>new RegExp(`{{\\s*[${t[0].toLowerCase()}${t[0]}]${t.slice(1)}\\s*(\\||}})`).test(this.pageContent)?t:null).filter(Boolean);this.oldRedirectTagData=Object.fromEntries(i.map(t=>{const e=new RegExp(`{{\\s*[${t[0].toLowerCase()}${t[0]}]${t.slice(1)}\\|?(.*?)\\s*}}`).exec(this.pageContent),a=Object.entries(this.redirectTemplates).find(([r,o])=>[r,...o.aliases].includes(t))?.[0];if(!e?.[1])return null;const s=e[1].split("|").map((r,o)=>{if(!r.includes("="))return[(o+1).toString(),r.trim()];const[u,c]=r.split("=");return[u.trim(),c.trim()]});return[a,s]}).filter(Boolean)),this.oldDefaultSort=this.pageContent.match(/{{DEFAULTSORT:.*?}}/g)?.at(-1)?.slice(14,-2)?.trim()??"",this.oldCategories=this.pageContent.match(/\[\[[Cc]ategory:.+?]]/g)?.map(t=>t.slice(11,-2))??[],this.oldStrayText=[this.pageContent.match(/{{short description\|.*?}}/i)?.[0],this.pageContent.match(/{{DISPLAYTITLE:.*?}}/)?.[0],this.pageContent.match(/{{italic title\|?.*?}}/i)?.[0],this.pageContent.match(/{{title language\|.*?}}/)?.[0]].filter(Boolean).join(`
`),this.oldRedirectTarget?this.redirectInput.setValue(this.oldRedirectTarget.replaceAll("_"," ")):mw.notify("Could not find redirect target!",{type:"error"}),this.tagSelect.setValue(this.oldRedirectTags);for(const[t,e]of Object.entries(this.oldRedirectTagData)){const a=this.templateEditorsInfo.find(n=>n.name===t);if(a)for(const[n,s]of e){const r=a.parameters.find(o=>[o.name,...o.aliases].includes(n));r&&r.editor.setValue(s)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(const t of this.oldCategories)this.categorySelect.addAllowedValue(t);this.categorySelect.setValue(this.oldCategories.map(t=>({data:t,label:t}))),this.updateSummary()}async validateSubmission(){const i=[],t=this.redirectInput.getValue().trim(),e=this.tagSelect.getValue();/^\s*[^[\]{|}]+\s*$/.test(t)||i.push({title:t,message:"is not a valid page title!"});try{this.parsedDestination=mw.Title.newFromText(t)}catch{i.length===0&&i.push({title:t,message:"is not a valid page title!"})}!this.parsedDestination&&i.length===0&&i.push({title:t,message:"is not a valid page title!"}),this.parsedDestination?.toString()===this.pageTitleParsed.toString()&&i.push({message:"cannot redirect to itself!"});const a=await this.api.get({action:"query",formatversion:"2",prop:["pageprops","categories"],titles:t}).catch(l=>(l==="missingtitle"?i.push({title:t,message:"does not exist!"}):i.push({title:t,message:`was not able to be fetched from the API (${l})!`}),null)),n=await this.api.get({action:"parse",page:t,prop:"sections",redirects:!0});if(n.parse.redirects?.[0]){const l=n.parse.redirects[0].to+(n.parse.redirects[0].tofragment?`#${n.parse.redirects[0].tofragment}`:"");i.push({title:t,message:`is a redirect to <a href="${mw.util.getUrl(l)}" target="_blank">${l}</a>. Retarget to that page instead, as double redirects aren't allowed.`})}if(t.split("#").length>1)if(n.parse.sections.find(g=>g.line.replaceAll(/<\/?i>/g,"")===t.split("#")[1]))e.includes("R to anchor")&&i.push({message:"is tagged as a redirect to an anchor, but it is actually a redirect to a section!"}),e.includes("R to section")||i.push({message:"is a redirect to a section, but it is not tagged with <code>{{R to section}}</code>!"});else{const g=(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:this.parsedDestination.toString()})).query.pages[0].revisions[0].slots.main.content;[...g.match(/(?<={{\s*?[Aa](?:nchors?|nchor for redirect|nker|NCHOR|nc)\s*?\|).+?(?=}})/g)?.map(f=>f.split("|").map(h=>h.trim()))?.flat()??[],...g.match(/(?<={{\s*?(?:[Vv](?:isible anchors?|isanc|Anch|anchor|isibleanchor|a)|[Aa](?:nchord|chored|nchor\+)|[Tt]ext anchor)\s*?\|).+?(?=(?<!!|=)}})/g)?.map(f=>f.split("|").map(h=>h.trim()).filter(h=>!/^text\s*?=/.test(h)))?.flat()??[],...g.match(/(?<=id=)"?.+?(?="|>|\|)/g)?.map(f=>f.trim())??[]].includes(t.split("#")[1])?(e.includes("R to section")&&i.push({message:"is tagged as a redirect to a section, but it is actually a redirect to an anchor!"}),e.includes("R to anchor")||i.push({message:"is a redirect to an anchor, but it is not tagged with <code>{{R from anchor}}</code>!"})):i.push({message:`is a redirect to <a href="${mw.util.getUrl(t)}" target="_blank">${t}</a>, but that section or anchor does not exist!`})}t.split("#").length===1&&(e.includes("R to section")||e.includes("R to anchor"))&&i.push({message:"is not a redirect to a section/anchor, but it is tagged with <code>{{R from section}}</code> or <code>{{R from anchor}}</code>!"});const s=!!(a.query.pages[0].pageprops&&"disambiguation"in a.query.pages[0].pageprops),r=!!(a.query.pages[0].categories&&a.query.pages[0].categories.some(l=>l.title==="Category:Surnames")),o=["R to disambiguation page","R from incomplete disambiguation"],u=["R from ambiguous sort name","R from ambiguous term"],c=o.some(l=>e.includes(l)),p=u.some(l=>e.includes(l));s&&!c&&!p&&i.push({message:"is a redirect to a disambiguation page, but it is not tagged with a disambiguation categorization template!"}),a.query.pages[0].pageprops&&!s&&(c&&i.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!"}),r&&!p&&i.push({message:"is a redirect to a surname list, but it is not tagged with a correct disambiguation categorization template!"})),s&&e.includes("R to disambiguation page")&&!this.pageTitleParsed.getMainText().endsWith(" (disambiguation)")&&i.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!'});for(const l of["R semi-protected","R extended-protected","R template-protected","R fully protected"])e.includes(l)&&i.push({message:`is tagged with unnecessarily tagged with <code>{{${l}}}</code> which will be duplicated by the redirect category shell!`});mw.config.get("wgWikibaseItemId")&&!e.includes("R with Wikidata item")&&i.push({message:"is linked to a Wikidata item but it isn't tagged with <code>{{R with Wikidata item}}</code>!"}),e.includes("R with Wikidata item")&&!mw.config.get("wgWikibaseItemId")&&i.push({message:"is tagged with <code>{{R with Wikidata item}}</code> but it is not actually linked to a Wikidata item!"});for(const l of e){const g=this.redirectTemplates[l];if(g)for(const[y,f]of Object.entries(g.parameters)){const h=this.templateEditorsInfo.find(w=>w.name===l)?.parameters.find(w=>[w.name,...w.aliases].includes(y));h&&f.required&&!h.editor.getValue().trim()&&i.push({message:`is tagged with <code>{{${l}}}</code> but it is missing the required parameter <code>${y}</code>!`})}}return this.syncTalkCheckbox?.isSelected()&&!this.talkData.query.pages[0].missing&&!this.talkData.query.pages[0].redirect&&i.push({title:this.pageTitleParsed.getTalkPage().getPrefixedText(),message:"exists, but is not a redirect!"}),i}async handleSubmitButtonClick(){const i=[this.redirectInput,this.tagSelect,...this.templateEditorsInfo.flatMap(s=>s.parameters.map(r=>r.editor)),this.defaultSortInput,this.defaultSortSuggestButton,this.categorySelect,this.summaryInput,this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckbox,this.patrolCheckbox].filter(Boolean);for(const s of i)s.setDisabled(!0);this.submitButton.setLabel("Checking target validity...");let t=[];if(this.needsCheck?t=await this.validateSubmission():this.parsedDestination=mw.Title.newFromText(this.redirectInput.getValue()),t.length>0){for(const s of document.querySelectorAll(".redirect-helper-warning"))s.remove();for(const{title:s,message:r}of t){const o=new OO.ui.HtmlSnippet(`${s?`<a href="${mw.util.getUrl(s)}" target="_blank">${s}</a>`:"This page"} ${r} Click again without making changes to submit anyway.`),u=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:o});this.editorBox.$element[0].append(u.$element[0])}for(const s of i)s.setDisabled(!1);this.submitButton.setLabel("Submit anyway"),this.needsCheck=!1;return}this.submitButton.setLabel(`${this.exists?"Editing":"Creating"} redirect...`);const e=this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue()),a=(this.summaryInput.getValue()||this.summaryInput.$tabIndexed[0].placeholder)+this.scriptAdvert;if(await this.editOrCreate(this.pageTitle,e,a)){if(mw.notify(`Redirect ${this.exists?"edited":"created"} successfully!`,{type:"success"}),this.syncTalkCheckbox?.isSelected()){this.submitButton.setLabel("Editing talk page...");const s=this.tagSelect.getValue().includes("R from move"),r=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),s?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),r,"Syncing redirect from main page"+this.scriptAdvert))return;mw.notify("Talk page synced successfully!",{type:"success"})}if(this.patrolCheckbox?.isSelected()){this.submitButton.setLabel("Patrolling redirect...");const s=document.querySelector(".patrollink a"),r=document.querySelector("#mwe-pt-mark-as-reviewed-button");s?await this.api.postWithToken("patrol",{action:"patrol",rcid:new URL(s.href).searchParams.get("rcid")}).catch((u,c)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${c?.error.info??"Unknown error"} (${u})`,{type:"error"}),null))&&mw.notify("Redirect patrolled successfully!",{type:"success"}):r?(r.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(i,t,e,a,n){const s=mw.Title.newFromText(i),r=s?`${s.getNamespaceId()===14?":":""}${s.getPrefixedText()}${s.getFragment()?`#${s.getFragment()}`:""}`:i.trim();this.pageTitleParsed.getMainText().toLocaleLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")===a?.toLowerCase().normalize("NFD").replaceAll(/[\u0300-\u036F]/g,"")&&(a=void 0);const o=t.map(u=>{const c=this.templateEditorsInfo.find(l=>l.name===u);if(!c)return`{{${u}}}`;const p=c.parameters.map((l,g)=>{const y=l.editor.getValue().trim();return y?`|${l.name===(g+1).toString()?"":`${l.name}=`}${y}`:null}).filter(Boolean).join("");return`{{${u}${p}}}`});return[`#REDIRECT [[${r}]]
`,t.length>0?`{{Redirect category shell|
${o.join(`
`)}
}}
`:null,e?e+`
`:null,a?`{{DEFAULTSORT:${a.trim()}}}`:null,n.length>0?n.map(u=>`[[Category:${u}]]`).join(`
`):null].filter(Boolean).join(`
`)}async getPageContent(i){return(await this.api.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:i})).query.pages[0].revisions[0].slots.main.content.trim()}async editOrCreate(i,t,e){return await this.api.edit(i,()=>({text:t,summary:e})).catch((a,n)=>a==="nocreate-missing"?this.api.create(i,{summary:e},t).catch((s,r)=>{mw.notify(`Error creating ${i}: ${r?.error.info??"Unknown error"} (${s})`,{type:"error"})}):(mw.notify(`Error editing or creating ${i}: ${n?.error.info??"Unknown error"} (${a})`,{type:"error"}),null))}}new x().run()});
// </nowiki>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gICAgQXBpQ29tcGFyZVBhZ2VzUGFyYW1zLFxuICAgIEFwaVBhcnNlUGFyYW1zLFxuICAgIEFwaVF1ZXJ5SW5mb1BhcmFtcyxcbiAgICBBcGlRdWVyeVBhZ2VQcm9wc1BhcmFtcyxcbiAgICBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyxcbiAgICBBcGlRdWVyeVVzZXJJbmZvUGFyYW1zLFxuICAgIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcyxcbn0gZnJvbSAndHlwZXMtbWVkaWF3aWtpL2FwaV9wYXJhbXMnO1xuaW1wb3J0IHtcbiAgICBBcGlRdWVyeUFsbFBhZ2VzR2VuZXJhdG9yUGFyYW1zLCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vcHJldmVudC1hYmJyZXZpYXRpb25zXG4gICAgQ2F0ZWdvcmllc1Jlc3VsdCxcbiAgICBNZWRpYVdpa2lEYXRhRXJyb3IsXG4gICAgUGFnZUluZm9SZXN1bHQsXG4gICAgUGFnZVBhcnNlUmVzdWx0LFxuICAgIFBhZ2VSZXZpc2lvbnNSZXN1bHQsXG4gICAgUGFnZVRyaWFnZUxpc3RSZXNwb25zZSxcbiAgICBQYWdlcHJvcHNSZXN1bHQsXG4gICAgVXNlclBlcm1pc3Npb25zUmVzcG9uc2UsXG59IGZyb20gJy4uL2dsb2JhbC10eXBlcyc7XG5cbnR5cGUgUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnMgPSBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHtcbiAgICAgICAgYWxpYXNlczogc3RyaW5nW107XG4gICAgICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgdHlwZTogc3RyaW5nO1xuICAgICAgICByZXF1aXJlZDogYm9vbGVhbjtcbiAgICAgICAgc3VnZ2VzdGVkOiBib29sZWFuO1xuICAgICAgICBkZWZhdWx0OiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICAgICAgZXhhbXBsZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGw7XG4gICAgfVxuPjtcblxudHlwZSBSZWRpcmVjdFRlbXBsYXRlRGF0YSA9IFJlY29yZDxzdHJpbmcsIHsgcGFyYW1ldGVyczogUmVkaXJlY3RUZW1wbGF0ZVBhcmFtZXRlcnM7IGFsaWFzZXM6IHN0cmluZ1tdIH0+O1xuXG5pbnRlcmZhY2UgVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mbyB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGRldGFpbHM6IEhUTUxEZXRhaWxzRWxlbWVudDtcbiAgICBwYXJhbWV0ZXJzOiB7IG5hbWU6IHN0cmluZzsgYWxpYXNlczogc3RyaW5nW107IGVkaXRvcjogT08udWkuVGV4dElucHV0V2lkZ2V0IH1bXTtcbn1cblxuaW50ZXJmYWNlIExvb2t1cEVsZW1lbnRDb25maWcgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQuQ29uZmlnT3B0aW9ucywgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5Db25maWdPcHRpb25zIHt9XG5cbm13LmxvYWRlci51c2luZyhbJ21lZGlhd2lraS51dGlsJywgJ29vanMtdWktY29yZScsICdvb2pzLXVpLXdpZGdldHMnLCAnb29qcy11aS13aW5kb3dzJywgJ29vanMtdWkuc3R5bGVzLmljb25zLWNvbnRlbnQnLCAnb29qcy11aS5zdHlsZXMuaWNvbnMtZWRpdGluZy1jb3JlJ10sICgpID0+IHtcbiAgICAvLyBTZXR1cCBSZWRpcmVjdElucHV0V2lkZ2V0XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgdGl0bGUgbG9va3VwIGVsZW1lbnQuXG4gICAgICovXG4gICAgY2xhc3MgUmVkaXJlY3RJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgICAgICBjb25zdHJ1Y3Rvcihjb25maWc6IExvb2t1cEVsZW1lbnRDb25maWcsIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGUpIHtcbiAgICAgICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgICAgICBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LmNhbGwodGhpcyBhcyB1bmtub3duIGFzIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQsIGNvbmZpZyk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuICAgICAgICB9XG5cbiAgICAgICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgY29uc3QgZGVmZXJyZWQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUuaW5jbHVkZXMoJyMnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gdmFsdWUuc3BsaXQoJyMnKVswXTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgIC5nZXQoeyBhY3Rpb246ICdwYXJzZScsIHBhZ2U6IHRpdGxlLCBwcm9wOiAnc2VjdGlvbnMnLCByZWRpcmVjdHM6IHRydWUgfSBzYXRpc2ZpZXMgQXBpUGFyc2VQYXJhbXMpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0OiBQYWdlUGFyc2VSZXN1bHQgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlZFNlY3Rpb25zID0gcmVzdWx0LnBhcnNlLnNlY3Rpb25zLmZpbHRlcigoc2VjdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbi5saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhcnRzV2l0aCh2YWx1ZS5zcGxpdCgnIycpWzFdLnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFNlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGAke3Jlc3VsdC5wYXJzZS50aXRsZX0jJHtzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBgJHtyZXN1bHQucGFyc2UudGl0bGV9IyR7c2VjdGlvbi5saW5lLnJlcGxhY2VBbGwoLzxcXC8/aT4vZywgJycpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmFwaVxuICAgICAgICAgICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogcGFyc2VkVGl0bGU/LmdldE5hbWVzcGFjZUlkKCkgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiBbJ2luZm8nLCAncGFnZXByb3BzJ10sXG4gICAgICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbXMpXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiBudWxsKVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0OiB7IHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IHBhZ2Vwcm9wczogeyBkaXNhbWJpZ3VhdGlvbj86IHN0cmluZyB9OyByZWRpcmVjdD86IHN0cmluZyB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucXVlcnk/LnBhZ2VzIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC5xdWVyeS5wYWdlcyAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGFnZSkgPT4gcGFnZS50aXRsZSAhPT0gdGhpcy5wYWdlVGl0bGVQYXJzZWQudG9TdHJpbmcoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogcGFnZS50aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwYWdlLnRpdGxlfSR7cGFnZS5wYWdlcHJvcHMgJiYgJ2Rpc2FtYmlndWF0aW9uJyBpbiBwYWdlLnBhZ2Vwcm9wcyA/ICcgPGk+KGRpc2FtYmlndWF0aW9uKTwvaT4nIDogJyd9JHsncmVkaXJlY3QnIGluIHBhZ2UgPyAnIDxpPihyZWRpcmVjdCk8L2k+JyA6ICcnfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkZWZlcnJlZC5wcm9taXNlKHsgYWJvcnQoKSB7fSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cbiAgICAgICAgfTtcblxuICAgICAgICBnZXRMb29rdXBDYWNoZURhdGFGcm9tUmVzcG9uc2UgPSA8VD4ocmVzcG9uc2U6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpID0+IHJlc3BvbnNlID8/IFtdO1xuXG4gICAgICAgIGdldExvb2t1cE1lbnVPcHRpb25zRnJvbURhdGEgPSAoZGF0YTogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiBkYXRhLm1hcCgoeyBkYXRhLCBsYWJlbCB9KSA9PiBuZXcgT08udWkuTWVudU9wdGlvbldpZGdldCh7IGRhdGEsIGxhYmVsIH0pKTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKFJlZGlyZWN0SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG5cbiAgICAvLyBTZXR1cCBDYXRlZ29yeUlucHV0V2lkZ2V0XG5cbiAgICAvKipcbiAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgY2F0ZWdvcnkgbG9va3VwIGVsZW1lbnQuXG4gICAgICovXG4gICAgY2xhc3MgQ2F0ZWdvcnlJbnB1dFdpZGdldCBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldCB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZykge1xuICAgICAgICAgICAgc3VwZXIoY29uZmlnKTtcbiAgICAgICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgICAgICBpZiAoIXZhbHVlKSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyc2VkVGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh2YWx1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBnYXBsaW1pdDogMjAsXG4gICAgICAgICAgICAgICAgICAgIGdhcG5hbWVzcGFjZTogMTQsXG4gICAgICAgICAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcjogJ2FsbHBhZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ2NhdGVnb3JpZXMnLFxuICAgICAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbXMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogeyBxdWVyeTogeyBwYWdlczogeyB0aXRsZTogc3RyaW5nOyBjYXRlZ29yaWVzPzogeyB0aXRsZTogc3RyaW5nIH1bXSB9W10gfSB9IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeT8ucGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigocGFnZSkgPT4gIShwYWdlLmNhdGVnb3JpZXMgJiYgcGFnZS5jYXRlZ29yaWVzLnNvbWUoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS50aXRsZSA9PT0gJ0NhdGVnb3J5Oldpa2lwZWRpYSBzb2Z0IHJlZGlyZWN0ZWQgY2F0ZWdvcmllcycpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYWdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpdGxlV2l0aG91dE5hbWVzcGFjZSA9IHBhZ2UudGl0bGUuc3BsaXQoJzonKVsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UsIGxhYmVsOiB0aXRsZVdpdGhvdXROYW1lc3BhY2UgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZShwYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBkZWZlcnJlZC5yZXNvbHZlKFtdKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoeyBhYm9ydCgpIHt9IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1lbXB0eS1mdW5jdGlvblxuICAgICAgICB9O1xuXG4gICAgICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICAgICAgZ2V0TG9va3VwTWVudU9wdGlvbnNGcm9tRGF0YSA9IChkYXRhOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IGRhdGEubWFwKCh7IGRhdGEsIGxhYmVsIH0pID0+IG5ldyBPTy51aS5NZW51T3B0aW9uV2lkZ2V0KHsgZGF0YSwgbGFiZWwgfSkpO1xuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oQ2F0ZWdvcnlJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcblxuICAgIC8vIFNldHVwIFRlbXBsYXRlUHJldmlld0RpYWxvZ1xuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB1c2VkIGZvciBwcmV2aWV3aW5nIHRlbXBsYXRlcy5cbiAgICAgKi9cbiAgICBjbGFzcyBUZW1wbGF0ZVByZXZpZXdEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG5cbiAgICAgICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT08udWkuUHJvY2Vzc0RpYWxvZy5Db25maWdPcHRpb25zLCBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlKSB7XG4gICAgICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcblxuICAgICAgICAgICAgVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnN0YXRpYy5uYW1lID0gJ1RlbXBsYXRlUHJldmlld0RpYWxvZyc7XG4gICAgICAgICAgICBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3RhdGljLnRpdGxlID0gJ1JlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlcyBwcmV2aWV3JztcbiAgICAgICAgICAgIFRlbXBsYXRlUHJldmlld0RpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFt7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfV07XG4gICAgICAgIH1cblxuICAgICAgICBnZXRTZXR1cFByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVQcmV2aWV3RGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRTZXR1cFByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hcGlcbiAgICAgICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncGFyc2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudG1vZGVsOiAnd2lraXRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogWyd0ZXh0JywgJ2NhdGVnb3JpZXNodG1sJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0UHJlZml4ZWREYigpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5nZXREYXRhKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcylcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFnc0NvbnRlbnQgPSAocmVzdWx0IGFzIHsgcGFyc2U6IHsgdGV4dDogc3RyaW5nIH0gfSkucGFyc2UudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXNDb250ZW50ID0gKHJlc3VsdCBhcyB7IHBhcnNlOiB7IGNhdGVnb3JpZXNodG1sOiBzdHJpbmcgfSB9KS5wYXJzZS5jYXRlZ29yaWVzaHRtbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFuZWxMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhbmVsTGF5b3V0LiRlbGVtZW50LmFwcGVuZCh0YWdzQ29udGVudCwgY2F0ZWdvcmllc0NvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQocGFuZWxMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldEFjdGlvblByb2Nlc3MgPSAoYWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBhY3Rpb25cbiAgICAgICAgICAgICAgICA/IG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldE1hbmFnZXIoKS5jbG9zZVdpbmRvdyh0aGlzKTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgOiBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZVByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKFRlbXBsYXRlUHJldmlld0RpYWxvZy5wcm90b3R5cGUsIE9PLnVpLlByb2Nlc3NEaWFsb2cucHJvdG90eXBlKTtcblxuICAgIC8vIFNldHVwIFRlbXBsYXRlUHJldmlld0RpYWxvZ1xuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB1c2VkIGZvciBzaG93aW5nIGNoYW5nZXMgdG8gYmUgbWFkZS5cbiAgICAgKi9cbiAgICBjbGFzcyBTaG93Q2hhbmdlc0RpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgICAgICAvLyBVdGlsaXR5IHZhcmlhYmxlc1xuICAgICAgICBwcml2YXRlIGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuICAgICAgICBjb25zdHJ1Y3Rvcihjb25maWc6IE9PLnVpLlByb2Nlc3NEaWFsb2cuQ29uZmlnT3B0aW9ucykge1xuICAgICAgICAgICAgc3VwZXIoY29uZmlnKTtcblxuICAgICAgICAgICAgU2hvd0NoYW5nZXNEaWFsb2cuc3RhdGljLm5hbWUgPSAnU2hvd0NoYW5nZXNEaWFsb2cnO1xuICAgICAgICAgICAgU2hvd0NoYW5nZXNEaWFsb2cuc3RhdGljLnRpdGxlID0gJ0NoYW5nZXMgdG8gYmUgbWFkZSc7XG4gICAgICAgICAgICBTaG93Q2hhbmdlc0RpYWxvZy5zdGF0aWMuYWN0aW9ucyA9IFt7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfV07XG4gICAgICAgIH1cblxuICAgICAgICBnZXRTZXR1cFByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gU2hvd0NoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IFtvbGRUZXh0LCBuZXdUZXh0XSA9IHRoaXMuZ2V0RGF0YSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgIC5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NvbXBhcmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogWydkaWZmJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBmcm9tc2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tdGV4dC1tYWluJzogb2xkVGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tY29udGVudG1vZGVsLW1haW4nOiAnd2lraXRleHQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9zbG90czogJ21haW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3RvdGV4dC1tYWluJzogbmV3VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpQ29tcGFyZVBhZ2VzUGFyYW1zICYgeyAnZnJvbXRleHQtbWFpbic6IHN0cmluZzsgJ2Zyb21jb250ZW50bW9kZWwtbWFpbic6IHN0cmluZzsgJ3RvdGV4dC1tYWluJzogc3RyaW5nOyAndG9jb250ZW50bW9kZWwtbWFpbic6IHN0cmluZyB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJpc29uID0gKHJlc3VsdCBhcyB7IGNvbXBhcmU6IHsgYm9keTogc3RyaW5nIH0gfSkuY29tcGFyZS5ib2R5O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub0NoYW5nZXNFbGVtZW50ID0gbmV3IE9PLnVpLk1lc3NhZ2VXaWRnZXQoeyB0eXBlOiAnd2FybmluZycsIGxhYmVsOiAnTm8gY2hhbmdlcyB0byBtYWtlIScgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhbmVsTGF5b3V0ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYW5lbExheW91dC4kZWxlbWVudC5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyaXNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGBcbjx0YWJsZSBjbGFzcz1cImRpZmYgZGlmZi1lZGl0Zm9udC1tb25vc3BhY2VcIj5cbiAgICA8Y29sZ3JvdXA+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLW1hcmtlclwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1jb250ZW50XCI+XG4gICAgICAgIDxjb2wgY2xhc3M9XCJkaWZmLW1hcmtlclwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1jb250ZW50XCI+XG4gICAgPC9jb2xncm91cD5cbiAgICA8dGJvZHk+XG4gICAgICAgICR7Y29tcGFyaXNvbn1cbiAgICA8L3Rib2R5PlxuPC90YWJsZT5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbm9DaGFuZ2VzRWxlbWVudC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChwYW5lbExheW91dC4kZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFjdGlvblxuICAgICAgICAgICAgICAgID8gbmV3IE9PLnVpLlByb2Nlc3MoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0TWFuYWdlcigpLmNsb3NlV2luZG93KHRoaXMpO1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IFNob3dDaGFuZ2VzRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRBY3Rpb25Qcm9jZXNzLmNhbGwodGhpcywgYWN0aW9uKTtcbiAgICAgICAgfTtcblxuICAgICAgICBnZXRUZWFyZG93blByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gU2hvd0NoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmVtcHR5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBPYmplY3QuYXNzaWduKFNob3dDaGFuZ2VzRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBlbnRpcmUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgcmVkaXJlY3QtaGVscGVyIHNjcmlwdC5cbiAgICAgKi9cbiAgICBjbGFzcyBSZWRpcmVjdEhlbHBlciB7XG4gICAgICAgIC8vIFV0aWxpdHkgdmFyaWFibGVzXG4gICAgICAgIHByaXZhdGUgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4gICAgICAgIC8vIEFzc2lnbmVkIGluIGNvbnN0cnVjdG9yXG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RUZW1wbGF0ZXMhOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgcHJpdmF0ZSBjb250ZW50VGV4dCE6IEhUTUxEaXZFbGVtZW50O1xuICAgICAgICBwcml2YXRlIHBhZ2VUaXRsZSE6IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGVQYXJzZWQhOiBtdy5UaXRsZTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyB0aGUgcmVkaXJlY3QgaGVscGVyLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcnVuKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhc3Nlc1ByZUNoZWNrcygpKSByZXR1cm47XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLmZldGNoUmVkaXJlY3RUZW1wbGF0ZXMoKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtdy1jb250ZW50LXRleHQnKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50VGV4dCkgcmV0dXJuIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBGYWlsZWQgdG8gZmluZCBjb250ZW50IHRleHQgZWxlbWVudCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRoaXMucGFnZVRpdGxlKSE7XG4gICAgICAgICAgICBpZiAoIXRoaXMucGFnZVRpdGxlUGFyc2VkKSByZXR1cm4gbXcubm90aWZ5KCdyZWRpcmVjdC1oZWxwZXI6IEZhaWxlZCB0byBwYXJzZSBwYWdlIHRpdGxlIScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jaGVja1BhZ2VBbmRMb2FkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGlmIHRoZSBwYWdlIHBhc3NlcyBwcmUgY2hlY2tzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBwYXNzZXNQcmVDaGVja3MoKSB7XG4gICAgICAgICAgICBjb25zdCBjb25kaXRpb25zID0gW1xuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPj0gMCwgLy8gSXMgbm90IHZpcnR1YWwgbmFtZXNwYWNlXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dJc1Byb2JhYmx5RWRpdGFibGUnKSwgLy8gUGFnZSBpcyBlZGl0YWJsZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnSXNBcnRpY2xlJyksIC8vIFZpZXdpbmcgdGhlIGNvbnRlbnQgb2YgYSBwYWdlXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnd2dBY3Rpb24nKSA9PT0gJ3ZpZXcnLCAvLyBWaWV3aW5nIHRoZSBwYWdlIChub3QgZWRpdGluZylcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z1JldmlzaW9uSWQnKSA9PT0gbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJyksIC8vIFZpZXdpbmcgdGhlIGN1cnJlbnQgcmV2aXNpb25cbiAgICAgICAgICAgICAgICAhbXcuY29uZmlnLmdldCgnd2dEaWZmT2xkSWQnKSwgLy8gTm90IHZpZXdpbmcgYSBkaWZmXG4gICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICByZXR1cm4gY29uZGl0aW9ucy5ldmVyeShCb29sZWFuKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaGVzIHRoZSByZWRpcmVjdCB0ZW1wbGF0ZXMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGZldGNoUmVkaXJlY3RUZW1wbGF0ZXMoKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAoXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlczogJ1VzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci5qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICAgICAgKS5xdWVyeS5wYWdlcz8uWzBdPy5yZXZpc2lvbnM/LlswXT8uc2xvdHM/Lm1haW4/LmNvbnRlbnQgfHwgJ3t9JyxcbiAgICAgICAgICAgICkgYXMgUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2tzIGEgcGFnZSdzIHN0YXR1cyBhbmQgbG9hZHMgdGhlIGhlbHBlciBhcHByb3ByaWF0ZWx5LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBjaGVja1BhZ2VBbmRMb2FkKCkge1xuICAgICAgICAgICAgY29uc3QgcGFnZUluZm8gPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHsgYWN0aW9uOiAncXVlcnknLCBmb3JtYXR2ZXJzaW9uOiAnMicsIHByb3A6ICdpbmZvJywgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZSB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgY29uc3QgZGlhbG9nSW5mbyA9IHsgcmVkaXJlY3RUZW1wbGF0ZXM6IHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMsIGNvbnRlbnRUZXh0OiB0aGlzLmNvbnRlbnRUZXh0LCBwYWdlVGl0bGU6IHRoaXMucGFnZVRpdGxlLCBwYWdlVGl0bGVQYXJzZWQ6IHRoaXMucGFnZVRpdGxlUGFyc2VkIH07XG5cbiAgICAgICAgICAgIGlmIChwYWdlSW5mby5xdWVyeS5wYWdlc1swXS5taXNzaW5nKSB7XG4gICAgICAgICAgICAgICAgbXcudXRpbC5hZGRDU1MoYFxuI2NyZWF0ZS1yZWRpcmVjdC1idXR0b24ge1xuICAgIG1hcmdpbi1ib3R0b206IDIwcHg7XG59YCk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBidXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgaWQ6ICdjcmVhdGUtcmVkaXJlY3QtYnV0dG9uJywgbGFiZWw6ICdDcmVhdGUgcmVkaXJlY3QnLCBpY29uOiAnYXJ0aWNsZVJlZGlyZWN0JywgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSB9KTtcbiAgICAgICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBidXR0b24uJGVsZW1lbnRbMF0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCBmYWxzZSkubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dC5wcmVwZW5kKGJ1dHRvbi4kZWxlbWVudFswXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhZ2VJbmZvLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0KSBuZXcgUmVkaXJlY3RIZWxwZXJEaWFsb2coZGlhbG9nSW5mbywgdHJ1ZSkubG9hZCgpO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcG9ydGxldExpbmsgPSBtdy51dGlsLmFkZFBvcnRsZXRMaW5rKG13LmNvbmZpZy5nZXQoJ3NraW4nKSA9PT0gJ21pbmVydmEnID8gJ3AtdGInIDogJ3AtY2FjdGlvbnMnLCAnIycsICdSZWRpcmVjdCBwYWdlJywgJ3JlZGlyZWN0LWhlbHBlcicpITtcbiAgICAgICAgICAgICAgICBwb3J0bGV0TGluay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCBmYWxzZSkubG9hZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHBvcnRsZXRMaW5rLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBkaWFsb2cgcG9ydGlvbiBvZiByZWRpcmVjdC1oZWxwZXIgc2NyaXB0LlxuICAgICAqL1xuICAgIGNsYXNzIFJlZGlyZWN0SGVscGVyRGlhbG9nIHtcbiAgICAgICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICAgICAgcHJpdmF0ZSBhcGkgPSBuZXcgbXcuQXBpKCk7XG4gICAgICAgIHByaXZhdGUgcmVkaXJlY3RSZWdleCA9IC9eI3JlZGlyZWN0Oj9cXHMqXFxbXFxbXFxzKjo/KFteW1xcXXt8fV0rPylcXHMqKD86XFx8W15bXFxde3x9XSs/KT9dXVxccyovaTtcbiAgICAgICAgcHJpdmF0ZSBzY3JpcHRBZHZlcnQgPSAnICh2aWEgW1tVc2VyOkVlaml0NDMvc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXJ8cmVkaXJlY3QtaGVscGVyXV0pJztcblxuICAgICAgICAvLyBBc3NpZ25lZCBpbiBjb25zdHJ1Y3RvclxuICAgICAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgcHJpdmF0ZSBjb250ZW50VGV4dDogSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlOiBzdHJpbmc7XG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgICAgICBwcml2YXRlIGV4aXN0czogYm9vbGVhbjtcblxuICAgICAgICAvLyBVc2VkIGR1cmluZyBydW4oKVxuICAgICAgICBwcml2YXRlIG5lZWRzQ2hlY2sgPSB0cnVlO1xuXG4gICAgICAgIHByaXZhdGUgZWRpdG9yQm94ITogT08udWkuUGFuZWxMYXlvdXQ7XG4gICAgICAgIHByaXZhdGUgc3luY1dpdGhNYWluQnV0dG9uPzogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHJlZGlyZWN0SW5wdXQhOiBSZWRpcmVjdElucHV0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIHJlZGlyZWN0SW5wdXRMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcbiAgICAgICAgcHJpdmF0ZSB0YWdTZWxlY3QhOiBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgdGFnU2VsZWN0TGF5b3V0ITogT08udWkuQWN0aW9uRmllbGRMYXlvdXQ7XG4gICAgICAgIHByaXZhdGUgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yITogSFRNTERldGFpbHNFbGVtZW50O1xuICAgICAgICBwcml2YXRlIHRlbXBsYXRlRWRpdG9yc0luZm86IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm9bXSA9IFtdO1xuICAgICAgICBwcml2YXRlIGNhdGVnb3J5U2VsZWN0ITogT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3RJbnB1dCE6IENhdGVnb3J5SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3RMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBkZWZhdWx0U29ydElucHV0ITogT08udWkuVGV4dElucHV0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIGRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBkZWZhdWx0U29ydElucHV0TGF5b3V0ITogT08udWkuQWN0aW9uRmllbGRMYXlvdXQ7XG4gICAgICAgIHByaXZhdGUgc3VtbWFyeUlucHV0ITogT08udWkuQ29tYm9Cb3hJbnB1dFdpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBzdW1tYXJ5SW5wdXRMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBzdWJtaXRCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgc2hvd0NoYW5nZXNCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgc2hvd1ByZXZpZXdCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgc3luY1RhbGtDaGVja2JveD86IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgc3luY1RhbGtDaGVja2JveExheW91dD86IE9PLnVpLldpZGdldDtcbiAgICAgICAgcHJpdmF0ZSBwYXRyb2xDaGVja2JveD86IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgcGF0cm9sQ2hlY2tib3hMYXlvdXQ/OiBPTy51aS5XaWRnZXQ7XG4gICAgICAgIHByaXZhdGUgc3VibWl0TGF5b3V0ITogT08udWkuSG9yaXpvbnRhbExheW91dDtcblxuICAgICAgICBwcml2YXRlIHRhbGtEYXRhPzogUGFnZUluZm9SZXN1bHQ7XG5cbiAgICAgICAgcHJpdmF0ZSBwYWdlQ29udGVudCA9ICcnO1xuXG4gICAgICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYXJnZXQ/OiBzdHJpbmc7XG4gICAgICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYWdzPzogc3RyaW5nW107XG4gICAgICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYWdEYXRhPzogUmVjb3JkPHN0cmluZywgc3RyaW5nW11bXT47XG4gICAgICAgIHByaXZhdGUgb2xkRGVmYXVsdFNvcnQ/OiBzdHJpbmc7XG4gICAgICAgIHByaXZhdGUgb2xkQ2F0ZWdvcmllcz86IHN0cmluZ1tdO1xuICAgICAgICBwcml2YXRlIG9sZFN0cmF5VGV4dD86IHN0cmluZztcblxuICAgICAgICBwcml2YXRlIHBhcnNlZERlc3RpbmF0aW9uITogbXcuVGl0bGUgfCBudWxsO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICAgICAgeyByZWRpcmVjdFRlbXBsYXRlcywgY29udGVudFRleHQsIHBhZ2VUaXRsZSwgcGFnZVRpdGxlUGFyc2VkIH06IHsgcmVkaXJlY3RUZW1wbGF0ZXM6IFJlZGlyZWN0VGVtcGxhdGVEYXRhOyBjb250ZW50VGV4dDogSFRNTERpdkVsZW1lbnQ7IHBhZ2VUaXRsZTogc3RyaW5nOyBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlIH0sXG4gICAgICAgICAgICBleGlzdHM6IGJvb2xlYW4sXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyA9IHJlZGlyZWN0VGVtcGxhdGVzO1xuICAgICAgICAgICAgdGhpcy5jb250ZW50VGV4dCA9IGNvbnRlbnRUZXh0O1xuICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVBhcnNlZCA9IHBhZ2VUaXRsZVBhcnNlZDtcblxuICAgICAgICAgICAgdGhpcy5leGlzdHMgPSBleGlzdHM7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIHJlZGlyZWN0LWhlbHBlciBkaWFsb2cgaW50byB0aGUgcGFnZS5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGxvYWQoKSB7XG4gICAgICAgICAgICBtdy51dGlsLmFkZENTUyhgXG4jY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMjBweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1ib3gge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlc21va2U7XG4gICAgd2lkdGg6IDcwMHB4O1xuICAgIG1heC13aWR0aDogY2FsYygxMDAlIC0gNTBweCk7XG4gICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgbWFyZ2luLXJpZ2h0OiBhdXRvO1xuICAgIG1hcmdpbi1ib3R0b206IDI1cHggIWltcG9ydGFudDtcbn1cblxuLnJlZGlyZWN0LWlucHV0LWxheW91dCBsYWJlbCB7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIsIC5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgbWFyZ2luLWJsb2NrOiAxMHB4O1xuICAgIHBhZGRpbmc6IDVweDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBzdW1tYXJ5IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgZGV0YWlscyB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2QxY2VjZTtcbiAgICBtYXJnaW4tYmxvY2s6IDVweDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lZCAjcmVkaXJlY3QtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlIHtcbiAgICBwYWRkaW5nOiA1cHg7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItc3VtbWFyeS1sYXlvdXQge1xuICAgIHBhZGRpbmctdG9wOiAxMHB4O1xuICAgIG1hcmdpbi10b3A6IDE1cHg7XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGdyYXk7XG59XG5cbiNyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dCB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbn1cblxuI3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0ID4gKiB7XG4gICAgbWFyZ2luLWJvdHRvbTogMDtcbn1cblxuLnJlZGlyZWN0LWhlbHBlci13YXJuaW5nIHtcbiAgICBtYXJnaW4tdG9wOiA4cHg7XG59YCk7XG5cbiAgICAgICAgICAgIG13LmxvYWRlci5hZGRMaW5rVGFnKCdodHRwczovL3d3dy5tZWRpYXdpa2kub3JnL3cvbG9hZC5waHA/bW9kdWxlcz1tZWRpYXdpa2kuZGlmZi5zdHlsZXMmb25seT1zdHlsZXMnKTtcblxuICAgICAgICAgICAgLyogTG9hZCBlbGVtZW50cyAqL1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JCb3ggPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBpZDogJ3JlZGlyZWN0LWhlbHBlci1ib3gnLCBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSwgZnJhbWVkOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5wYWdlVGl0bGVQYXJzZWQuaXNUYWxrUGFnZSgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFpblBhZ2VEYXRhID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlJbmZvUGFyYW1zKSkgYXMgUGFnZUluZm9SZXN1bHQ7XG5cbiAgICAgICAgICAgICAgICBpZiAobWFpblBhZ2VEYXRhLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0KSBhd2FpdCB0aGlzLmxvYWRTeW5jV2l0aE1haW5CdXR0b24oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sb2FkSW5wdXRFbGVtZW50cygpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkU3VibWl0RWxlbWVudHMoKTtcblxuICAgICAgICAgICAgLyogQWRkIGVsZW1lbnRzIHRvIHNjcmVlbiBhbmQgbG9hZCBkYXRhIChpZiBhcHBsaWNhYmxlKSAqL1xuICAgICAgICAgICAgdGhpcy5lZGl0b3JCb3guJGVsZW1lbnRbMF0uYXBwZW5kKFxuICAgICAgICAgICAgICAgIC4uLihbXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3luY1dpdGhNYWluQnV0dG9uPy4kZWxlbWVudD8uWzBdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvcixcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dExheW91dC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikgYXMgSFRNTEVsZW1lbnRbXSksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRUZXh0LnByZXBlbmQodGhpcy5lZGl0b3JCb3guJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5leGlzdHMpIHRoaXMubG9hZEV4aXN0aW5nRGF0YSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvYWRzIHRoZSBcIlN5bmMgd2l0aCBtYWluIHBhZ2VcIiBidXR0b25cIiBvbiB0YWxrIHBhZ2VzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBsb2FkU3luY1dpdGhNYWluQnV0dG9uKCkge1xuICAgICAgICAgICAgY29uc3QgbWFpblBhZ2VDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRQYWdlQ29udGVudCh0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRTdWJqZWN0UGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3luY1dpdGhNYWluQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU3luYyB3aXRoIG1haW4gcGFnZScsIGljb246ICdsaW5rJywgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSB9KTtcbiAgICAgICAgICAgIHRoaXMuc3luY1dpdGhNYWluQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnJlZGlyZWN0UmVnZXguZXhlYyhtYWluUGFnZUNvbnRlbnQpPy5bMV07XG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHJldHVybiBtdy5ub3RpZnkoJ0ZhaWxlZCB0byBwYXJzZSBtYWluIHBhZ2UgY29udGVudCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUobXcuVGl0bGUubmV3RnJvbVRleHQodGFyZ2V0KT8uZ2V0VGFsa1BhZ2UoKT8udG9TdHJpbmcoKSA/PyAnJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgZnJvbU1vdmUgPSBbJ1IgZnJvbSBtb3ZlJywgLi4udGhpcy5yZWRpcmVjdFRlbXBsYXRlc1snUiBmcm9tIG1vdmUnXS5hbGlhc2VzXS5zb21lKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ09yUmVkaXJlY3RbMF0udG9Mb3dlckNhc2UoKX0ke3RhZ09yUmVkaXJlY3RbMF19XSR7dGFnT3JSZWRpcmVjdC5zbGljZSgxKX1cXFxccyooXFxcXHx8fX0pYCkudGVzdChtYWluUGFnZUNvbnRlbnQpLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKGZyb21Nb3ZlKSB0aGlzLnRhZ1NlbGVjdC5zZXRWYWx1ZShbJ1IgZnJvbSBtb3ZlJ10pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgdGhlIGlucHV0IGVsZW1lbnRzLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBsb2FkSW5wdXRFbGVtZW50cygpIHtcbiAgICAgICAgICAgIC8qIFJlZGlyZWN0IHRhcmdldCBpbnB1dCAqL1xuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0ID0gbmV3IFJlZGlyZWN0SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ1RhcmdldCBwYWdlIG5hbWUnLCByZXF1aXJlZDogdHJ1ZSB9LCB0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UobmV3IFJlZ0V4cChgXihodHRwcz86KT8vezJ9PyR7bXcuY29uZmlnLmdldCgnd2dTZXJ2ZXInKS5yZXBsYWNlKC9eXFwvezJ9LywgJycpfS93aWtpL2ApLCAnJyk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eOi8sICcnKTtcblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5zZXRWYWx1ZSh2YWx1ZVswXS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSkucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldERpc2FibGVkKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5yZWRpcmVjdElucHV0LCB7IGxhYmVsOiAnUmVkaXJlY3QgdGFyZ2V0OicsIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sIGFsaWduOiAndG9wJyB9KTtcblxuICAgICAgICAgICAgLyogUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgc2VsZWN0aW9uICovXG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdCA9IG5ldyBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgICAgIGFsbG93QXJiaXRyYXJ5OiBmYWxzZSxcbiAgICAgICAgICAgICAgICBhbGxvd1Jlb3JkZXJpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5rZXlzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpLm1hcCgodGFnKSA9PiAoeyBkYXRhOiB0YWcsIGxhYmVsOiB0YWcgfSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAodGhpcy50YWdTZWxlY3QuZ2V0TWVudSgpIGFzIE9PLnVpLk1lbnVTZWxlY3RXaWRnZXQuQ29uZmlnT3B0aW9ucykuZmlsdGVyTW9kZSA9ICdzdWJzdHJpbmcnO1xuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3Qub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBzb3J0ZWRUYWdzID0gKHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCh0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSB0aGlzLnRhZ1NlbGVjdC5zZXRWYWx1ZShzb3J0ZWRUYWdzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlZGl0b3JJbmZvIG9mIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mbykgZWRpdG9ySW5mby5kZXRhaWxzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG5cbiAgICAgICAgICAgICAgICBsZXQgc2hvd25UZW1wbGF0ZUVkaXRvcnMgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWRpdG9ySW5mbyA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVkaXRvckluZm8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVkaXRvckluZm8uZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3duVGVtcGxhdGVFZGl0b3JzKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2Uuc3R5bGUuZGlzcGxheSA9IHNob3duVGVtcGxhdGVFZGl0b3JzID4gMCA/ICdub25lJyA6ICdibG9jayc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy50YWdTZWxlY3QsIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJ1JlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlczonLFxuICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHBhcmFtZXRlcnMgKi9cbiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuY2xhc3NMaXN0LmFkZCgncmVkaXJlY3QtaGVscGVyLXRlbXBsYXRlLXBhcmFtZXRlcnMtY29udGFpbmVyJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnlFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3VtbWFyeScpO1xuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSAnVGVtcGxhdGUgcGFyYW1ldGVycyc7XG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQoc3VtbWFyeUVsZW1lbnQpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIHRlbXBsYXRlRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXModGVtcGxhdGVEYXRhLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICAgICAgICAgIGRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdW1tYXJ5Jyk7XG4gICAgICAgICAgICAgICAgc3VtbWFyeS50ZXh0Q29udGVudCA9IHRlbXBsYXRlTmFtZTtcbiAgICAgICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChzdW1tYXJ5KTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnREYXRhOiBUZW1wbGF0ZUVkaXRvckVsZW1lbnRJbmZvID0geyBuYW1lOiB0ZW1wbGF0ZU5hbWUsIGRldGFpbHMsIHBhcmFtZXRlcnM6IFtdIH07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCh7IHBsYWNlaG9sZGVyOiBwYXJhbWV0ZXJEYXRhLmRlZmF1bHQ/LnRvU3RyaW5nKCksIHJlcXVpcmVkOiBwYXJhbWV0ZXJEYXRhLnJlcXVpcmVkIH0pO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChpbnB1dCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtwYXJhbWV0ZXJOYW1lfSR7IXBhcmFtZXRlckRhdGEubGFiZWwgfHwgcGFyYW1ldGVyTmFtZS50b0xvd2VyQ2FzZSgpID09PSBwYXJhbWV0ZXJEYXRhLmxhYmVsPy50b0xvd2VyQ2FzZSgpID8gJycgOiBgICgke3BhcmFtZXRlckRhdGEubGFiZWx9KWB9JHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9uID8gYCAoJHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9ufSlgIDogJyd9ICh0eXBlOiAke3BhcmFtZXRlckRhdGEudHlwZX0pICR7cGFyYW1ldGVyRGF0YS5zdWdnZXN0ZWQgPyAnIChzdWdnZXN0ZWQpJyA6ICcnfSR7cGFyYW1ldGVyRGF0YS5leGFtcGxlID8gYCAoZXhhbXBsZTogXCIke3BhcmFtZXRlckRhdGEuZXhhbXBsZX1cIilgIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ2lubGluZScsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChpbnB1dExheW91dC4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudERhdGEucGFyYW1ldGVycy5wdXNoKHsgbmFtZTogcGFyYW1ldGVyTmFtZSwgYWxpYXNlczogcGFyYW1ldGVyRGF0YS5hbGlhc2VzLCBlZGl0b3I6IGlucHV0IH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChkZXRhaWxzKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5wdXNoKGVsZW1lbnREYXRhKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgbm9UZW1wbGF0ZXNNZXNzYWdlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICBub1RlbXBsYXRlc01lc3NhZ2UuaWQgPSAncmVkaXJlY3QtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdlJztcbiAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS50ZXh0Q29udGVudCA9ICdObyB0ZW1wbGF0ZXMgd2l0aCBwYXJhbWV0ZXJzIHRvIGRpc3BsYXkhJztcbiAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5zdHlsZS5kaXNwbGF5ID0gdGhpcy5leGlzdHMgPyAnbm9uZScgOiAnYmxvY2snO1xuXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQobm9UZW1wbGF0ZXNNZXNzYWdlKTtcblxuICAgICAgICAgICAgLyogREVGQVVMVFNPUlQgaW5wdXQgKi9cbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKHZhbHVlLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLm5lZWRzQ2hlY2sgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGljb246ICdyb2JvdCcsIGxhYmVsOiAnU3VnZ2VzdCcsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0TWFpblRleHQoKS5yZXBsYWNlKC8gXFwoLipcXCkkLywgJycpOyAvLyBSZW1vdmUgZGlzYW1iaWd1YXRpb25cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKCdSIGZyb20gcGVyc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxpbmcgaXMgbW9kaWZpZWQgZnJvbSBldmFkMzcncyBcIlJhdGVyXCJcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJyAnKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBnZW5lcmF0aW9uYWxTdWZmaXggPSAnJztcbiAgICAgICAgICAgICAgICAgICAgaWYgKC8gKD86W0pTXXIuP3xbSVZYXSspJC8udGVzdChuYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbmFsU3VmZml4ID0gbmFtZS5zbGljZShuYW1lLmxhc3RJbmRleE9mKCcgJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZignICcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbmFtZS5pbmNsdWRlcygnICcpKSByZXR1cm4gbmFtZSArIGdlbmVyYXRpb25hbFN1ZmZpeDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3ROYW1lID0gbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKG5hbWUubGFzdEluZGV4T2YoJyAnKSArIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvLCQvLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9PJy8sICdPJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG90aGVyTmFtZXMgPSBuYW1lLnNsaWNlKDAsIG5hbWUubGFzdEluZGV4T2YoJyAnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LnNldFZhbHVlKGxhc3ROYW1lICsgJywgJyArIG90aGVyTmFtZXMgKyBnZW5lcmF0aW9uYWxTdWZmaXgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdOYW1lID0gbmFtZS5yZXBsYWNlQWxsKCdNci4nLCAnTWlzdGVyJykucmVwbGFjZUFsbCgnJicsICdBbmQnKTtcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxlYWRpbmdBcnRpY2xlIG9mIFsnQW4nLCAnQScsICdUaGUnXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lLnN0YXJ0c1dpdGgobGVhZGluZ0FydGljbGUgKyAnICcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TmFtZSA9IG5ld05hbWUuc2xpY2UobGVhZGluZ0FydGljbGUubGVuZ3RoICsgMSkgKyAnLCAnICsgbGVhZGluZ0FydGljbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5ld05hbWUgPT09IG5hbWUpIG13Lm5vdGlmeShcInJlZGlyZWN0LWhlbHBlciB3YXNuJ3QgYWJsZSB0byBkZXRlcm1pbmUgYSBzb3J0IGtleSBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBwYWdlIHRpdGxlIVwiLCB7IHR5cGU6ICd3YXJuJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUobmV3TmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dExheW91dCA9IG5ldyBPTy51aS5BY3Rpb25GaWVsZExheW91dCh0aGlzLmRlZmF1bHRTb3J0SW5wdXQsIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLCB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChgRGVmYXVsdCBzb3J0IGtleSAoREVGQVVMVFNPUlQpIChzZWUgPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoJ1dpa2lwZWRpYTpDYXRlZ29yaXphdGlvbiNTb3J0IGtleXMnKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5ndWlkZWxpbmU8L2E+KTpgKSxcbiAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBDYXRlZ29yaWVzIHNlbGVjdGlvbiAqL1xuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0ID0gbmV3IENhdGVnb3J5SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ0FkZCBjYXRlZ29yaWVzIGhlcmUnIH0pO1xuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0LmdldFZhbHVlKCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXkNhdGVnb3J5Oi8sICcnKTtcblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0Lm9uKCdzaG93aW5nLXZhbHVlcycsIChwYWdlczogeyBkYXRhOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVtdKSA9PiB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIHBhZ2VzKSB0aGlzLmNhdGVnb3J5U2VsZWN0LmFkZEFsbG93ZWRWYWx1ZShwYWdlLmRhdGEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0ID0gbmV3IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0KHsgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSwgaW5wdXRQb3NpdGlvbjogJ291dGxpbmUnLCBpbnB1dFdpZGdldDogdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0IH0pO1xuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSAodGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICAgICAgICAgIGlmICgodGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdKS5qb2luKCc7JykgIT09IHNvcnRlZFRhZ3Muam9pbignOycpKSB0aGlzLmNhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHNvcnRlZFRhZ3MpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmNhdGVnb3J5U2VsZWN0LCB7IGxhYmVsOiAnQ2F0ZWdvcmllczonLCBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLCBhbGlnbjogJ3RvcCcgfSk7XG5cbiAgICAgICAgICAgIC8qIFN1bW1hcnkgaW5wdXQgKi9cbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0ID0gbmV3IE9PLnVpLkNvbWJvQm94SW5wdXRXaWRnZXQoe1xuICAgICAgICAgICAgICAgIG9wdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVzb2x2ZSBkb3VibGUgcmVkaXJlY3QnIH0sIC8vXG4gICAgICAgICAgICAgICAgICAgIHsgZGF0YTogJ1Jlc29sdmUgc2VsZiByZWRpcmVjdCcgfSxcbiAgICAgICAgICAgICAgICAgICAgeyBkYXRhOiAnUmVtb3ZlIGluY29ycmVjdCByY2F0cycgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3VtbWFyeUlucHV0LCB7IGlkOiAncmVkaXJlY3QtaGVscGVyLXN1bW1hcnktbGF5b3V0JywgbGFiZWw6ICdTdW1tYXJ5OicsIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sIGFsaWduOiAndG9wJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyB0aGUgZWxlbWVudHMgaW4gdGhlIHN1Ym1pdCBidXR0b24gcm93LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBsb2FkU3VibWl0RWxlbWVudHMoKSB7XG4gICAgICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHdpbmRvd01hbmFnZXIuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgICAgICAvKiBTZXR1cCBzdWJtaXQgYnV0dG9uICovXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1N1Ym1pdCcsIGRpc2FibGVkOiB0cnVlLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4gdGhpcy5oYW5kbGVTdWJtaXRCdXR0b25DbGljaygpKTtcblxuICAgICAgICAgICAgLyogU2V0dXAgc2hvdyBwcmV2aWV3IGJ1dHRvbiAqL1xuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVQcmV2aWV3RGlhbG9nID0gbmV3IFRlbXBsYXRlUHJldmlld0RpYWxvZyh7IHNpemU6ICdsYXJnZScgfSwgdGhpcy5wYWdlVGl0bGVQYXJzZWQpO1xuICAgICAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFt0ZW1wbGF0ZVByZXZpZXdEaWFsb2ddKTtcblxuICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1Nob3cgcHJldmlldycsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbi5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVQcmV2aWV3RGlhbG9nLnNldERhdGEoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHRlbXBsYXRlUHJldmlld0RpYWxvZy5vcGVuKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLyogU2V0dXAgc2hvdyBjaGFuZ2VzIGJ1dHRvbiAqL1xuICAgICAgICAgICAgY29uc3Qgc2hvd0NoYW5nZXNEaWFsb2cgPSBuZXcgU2hvd0NoYW5nZXNEaWFsb2coeyBzaXplOiAnbGFyZ2UnIH0pO1xuICAgICAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFtzaG93Q2hhbmdlc0RpYWxvZ10pO1xuXG4gICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU2hvdyBjaGFuZ2VzJywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLm9uKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5leGlzdHMpIHRoaXMucGFnZUNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlKTtcblxuICAgICAgICAgICAgICAgIHNob3dDaGFuZ2VzRGlhbG9nLnNldERhdGEoW1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgc2hvd0NoYW5nZXNEaWFsb2cub3BlbigpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFNldHVwIHN5bmMgdGFsayBjaGVja2JveCAqL1xuICAgICAgICAgICAgaWYgKCF0aGlzLnBhZ2VUaXRsZVBhcnNlZC5pc1RhbGtQYWdlKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhbGtEYXRhID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlJbmZvUGFyYW1zKSkgYXMgUGFnZUluZm9SZXN1bHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jVGFsa0NoZWNrYm94ID0gbmV3IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQoeyBzZWxlY3RlZDogISF0aGlzLnRhbGtEYXRhLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0IH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zeW5jVGFsa0NoZWNrYm94TGF5b3V0ID0gbmV3IE9PLnVpLldpZGdldCh7IGNvbnRlbnQ6IFtuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5zeW5jVGFsa0NoZWNrYm94LCB7IGxhYmVsOiAnU3luYyB0YWxrIHBhZ2UnLCBhbGlnbjogJ2lubGluZScgfSldIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBTZXR1cCBwYXRyb2wgY2hlY2tib3ggKi9cbiAgICAgICAgICAgIGlmIChhd2FpdCB0aGlzLmNoZWNrU2hvdWxkUHJvbXB0UGF0cm9sKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94ID0gbmV3IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQoeyBzZWxlY3RlZDogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3hMYXlvdXQgPSBuZXcgT08udWkuV2lkZ2V0KHsgY29udGVudDogW25ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnBhdHJvbENoZWNrYm94LCB7IGxhYmVsOiAnTWFyayBhcyBwYXRyb2xsZWQnLCBhbGlnbjogJ2lubGluZScgfSldIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBTZXR1cCBsYXlvdXQgKi9cbiAgICAgICAgICAgIHRoaXMuc3VibWl0TGF5b3V0ID0gbmV3IE9PLnVpLkhvcml6b250YWxMYXlvdXQoe1xuICAgICAgICAgICAgICAgIGlkOiAncmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQnLFxuICAgICAgICAgICAgICAgIGl0ZW1zOiBbdGhpcy5zdWJtaXRCdXR0b24sIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24sIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24sIHRoaXMuc3luY1RhbGtDaGVja2JveExheW91dCwgdGhpcy5wYXRyb2xDaGVja2JveExheW91dF0uZmlsdGVyKEJvb2xlYW4pIGFzIE9PLnVpLldpZGdldFtdLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRGV0ZXJtaW5lcyBpZiB0aGUgdXNlciBzaG91bGQgYmUgcHJvbXB0ZWQgdG8gcGF0cm9sIHRoZSBwYWdlLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBjaGVja1Nob3VsZFByb21wdFBhdHJvbCgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhZ2VUcmlhZ2VNYXJrQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrIC5td2UtcHQtdG9vbC1pY29uJykgYXMgSFRNTEltYWdlRWxlbWVudCB8IG51bGw7XG4gICAgICAgICAgICBwYWdlVHJpYWdlTWFya0J1dHRvbj8uY2xpY2soKTtcbiAgICAgICAgICAgIHBhZ2VUcmlhZ2VNYXJrQnV0dG9uPy5jbGljaygpO1xuXG4gICAgICAgICAgICBpZiAobXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSAhPT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhdHJvbGxpbmsnKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmstYXMtcmV2aWV3ZWQtYnV0dG9uJykpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXVucmV2aWV3ZWQtYnV0dG9uJykpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJQZXJtaXNzaW9ucyA9IChhd2FpdCB0aGlzLmFwaS5nZXQoeyBhY3Rpb246ICdxdWVyeScsIG1ldGE6ICd1c2VyaW5mbycsIHVpcHJvcDogJ3JpZ2h0cycgfSBzYXRpc2ZpZXMgQXBpUXVlcnlVc2VySW5mb1BhcmFtcykpIGFzIFVzZXJQZXJtaXNzaW9uc1Jlc3BvbnNlO1xuICAgICAgICAgICAgICAgIGlmICghdXNlclBlcm1pc3Npb25zLnF1ZXJ5LnVzZXJpbmZvLnJpZ2h0cy5pbmNsdWRlcygncGF0cm9sJykpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdHJvbFJlc3BvbnNlID0gKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3BhZ2V0cmlhZ2VsaXN0JyxcbiAgICAgICAgICAgICAgICAgICAgcGFnZV9pZDogbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBQYWdlVHJpYWdlQXBpUGFnZVRyaWFnZUxpc3RQYXJhbXMpKSBhcyBQYWdlVHJpYWdlTGlzdFJlc3BvbnNlO1xuXG4gICAgICAgICAgICAgICAgaWYgKHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzWzBdPy51c2VyX25hbWUgPT09IG13LmNvbmZpZy5nZXQoJ3dnVXNlck5hbWUnKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnJlc3VsdCAhPT0gJ3N1Y2Nlc3MnIHx8IHBhdHJvbFJlc3BvbnNlLnBhZ2V0cmlhZ2VsaXN0LnBhZ2VzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuICFOdW1iZXIucGFyc2VJbnQocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXNbMF0/LnBhdHJvbF9zdGF0dXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZXMgdGhlIHN1bW1hcnkgaW5wdXQgcGxhY2Vob2xkZXIuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIHVwZGF0ZVN1bW1hcnkoKSB7XG4gICAgICAgICAgICBjb25zdCByZWRpcmVjdFZhbHVlID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoIXJlZGlyZWN0VmFsdWUpICh0aGlzLnN1bW1hcnlJbnB1dC4kdGFiSW5kZXhlZFswXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5wbGFjZWhvbGRlciA9ICcnO1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5leGlzdHMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRDaGFuZ2VkID0gcmVkaXJlY3RWYWx1ZSAhPT0gdGhpcy5vbGRSZWRpcmVjdFRhcmdldD8ucmVwbGFjZUFsbCgnXycsICcgJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnc0NoYW5nZWQgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLnNvbWUoKHRhZykgPT4gIXRoaXMub2xkUmVkaXJlY3RUYWdzIS5pbmNsdWRlcyh0YWcgYXMgc3RyaW5nKSkgfHwgdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLnNvbWUoKHRhZykgPT4gIXRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGFnQXJndW1lbnRzQ2hhbmdlZCA9IHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKCh0YWcpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5uYW1lID09PSB0YWcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LnBhcmFtZXRlcnMuc29tZSgocGFyYW1ldGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRPbGRBcmd1bWVudCA9IHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhIVt0YWcgYXMgc3RyaW5nXT8uZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50WzBdID09PSBwYXJhbWV0ZXIubmFtZSk/LlsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZE9sZEFyZ3VtZW50ID8gZm91bmRPbGRBcmd1bWVudCAhPT0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTb3J0Q2hhbmdlZCA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKSAhPT0gdGhpcy5vbGREZWZhdWx0U29ydCEucmVwbGFjZUFsbCgnXycsICcgJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllc0NoYW5nZWQgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkuc29tZSgoY2F0ZWdvcnkpID0+ICF0aGlzLm9sZENhdGVnb3JpZXMhLmluY2x1ZGVzKGNhdGVnb3J5IGFzIHN0cmluZykpIHx8XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2xkQ2F0ZWdvcmllcyEuc29tZSgoY2F0ZWdvcnkpID0+ICF0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXMoY2F0ZWdvcnkpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSBbXTtcblxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXRDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goYHJldGFyZ2V0IHRvIFtbJHtyZWRpcmVjdFZhbHVlfV1dYCk7XG4gICAgICAgICAgICAgICAgaWYgKHRhZ3NDaGFuZ2VkKSBjaGFuZ2VzLnB1c2goJ2NoYW5nZSBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZXMnKTtcbiAgICAgICAgICAgICAgICBpZiAodGFnQXJndW1lbnRzQ2hhbmdlZCkgY2hhbmdlcy5wdXNoKCdjaGFuZ2UgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgYXJndW1lbnRzJyk7XG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRTb3J0Q2hhbmdlZCkgY2hhbmdlcy5wdXNoKCdjaGFuZ2UgZGVmYXVsdCBzb3J0IGtleScpO1xuICAgICAgICAgICAgICAgIGlmIChjYXRlZ29yaWVzQ2hhbmdlZCkgY2hhbmdlcy5wdXNoKCdjaGFuZ2UgY2F0ZWdvcmllcycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoID09PSAwKSBjaGFuZ2VzLnB1c2goJ3BlcmZvcm0gcmVkaXJlY3QgY2xlYW51cCcpO1xuXG4gICAgICAgICAgICAgICAgY2hhbmdlc1swXSA9IGNoYW5nZXNbMF1bMF0udG9VcHBlckNhc2UoKSArIGNoYW5nZXNbMF0uc2xpY2UoMSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoYW5nZXMubGVuZ3RoID4gMSkgY2hhbmdlc1tjaGFuZ2VzLmxlbmd0aCAtIDFdID0gYGFuZCAke2NoYW5nZXMuYXQoLTEpfWA7XG5cbiAgICAgICAgICAgICAgICAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIgPSBjaGFuZ2VzLmpvaW4oY2hhbmdlcy5sZW5ndGggPiAyID8gJywgJyA6ICcgJyk7XG4gICAgICAgICAgICB9IGVsc2UgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gYENyZWF0ZSByZWRpcmVjdCB0byBbWyR7cmVkaXJlY3RWYWx1ZX1dXWA7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTG9hZHMgZXhpc3RpbmcgcGFnZSBkYXRhLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBsb2FkRXhpc3RpbmdEYXRhKCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RzKSB0aGlzLnBhZ2VDb250ZW50ID0gYXdhaXQgdGhpcy5nZXRQYWdlQ29udGVudCh0aGlzLnBhZ2VUaXRsZSk7XG5cbiAgICAgICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYXJnZXQgPSB0aGlzLnJlZGlyZWN0UmVnZXguZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzFdO1xuXG4gICAgICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFncyA9IChcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKVxuICAgICAgICAgICAgICAgICAgICAubWFwKChbdGFnLCB0YWdEYXRhXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIFt0YWcsIC4uLnRhZ0RhdGEuYWxpYXNlc10uc29tZSgodGFnT3JSZWRpcmVjdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ09yUmVkaXJlY3RbMF0udG9Mb3dlckNhc2UoKX0ke3RhZ09yUmVkaXJlY3RbMF19XSR7dGFnT3JSZWRpcmVjdC5zbGljZSgxKX1cXFxccyooXFxcXHx8fX0pYCkudGVzdCh0aGlzLnBhZ2VDb250ZW50KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdXG4gICAgICAgICAgICApLnNvcnQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFJlZGlyZWN0VGFncyA9IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpXG4gICAgICAgICAgICAgICAgLmZsYXRNYXAoKFt0YWcsIHRhZ0RhdGFdKSA9PiBbdGFnLCAuLi50YWdEYXRhLmFsaWFzZXNdKVxuICAgICAgICAgICAgICAgIC5tYXAoKHRhZ09yUmVkaXJlY3QpID0+IChuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ09yUmVkaXJlY3RbMF0udG9Mb3dlckNhc2UoKX0ke3RhZ09yUmVkaXJlY3RbMF19XSR7dGFnT3JSZWRpcmVjdC5zbGljZSgxKX1cXFxccyooXFxcXHx8fX0pYCkudGVzdCh0aGlzLnBhZ2VDb250ZW50KSA/IHRhZ09yUmVkaXJlY3QgOiBudWxsKSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICB0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YSA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICBvcmlnaW5hbFJlZGlyZWN0VGFnc1xuICAgICAgICAgICAgICAgICAgICAubWFwKCh0YWcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbmV3IFJlZ0V4cChge3tcXFxccypbJHt0YWdbMF0udG9Mb3dlckNhc2UoKX0ke3RhZ1swXX1dJHt0YWcuc2xpY2UoMSl9XFxcXHw/KC4qPylcXFxccyp9fWApLmV4ZWModGhpcy5wYWdlQ29udGVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1RhZyA9IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpLmZpbmQoKFt0ZW1wbGF0ZSwgdGFnRGF0YV0pID0+IFt0ZW1wbGF0ZSwgLi4udGFnRGF0YS5hbGlhc2VzXS5pbmNsdWRlcyh0YWcpKT8uWzBdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEFyZ3VtZW50cyA9IG1hdGNoPy5bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9yaWdpbmFsQXJndW1lbnRzKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkQXJndW1lbnRzID0gbWF0Y2hbMV0uc3BsaXQoJ3wnKS5tYXAoKGFyZ3VtZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnQuaW5jbHVkZXMoJz0nKSkgcmV0dXJuIFsoaW5kZXggKyAxKS50b1N0cmluZygpLCBhcmd1bWVudC50cmltKCldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW25hbWUsIHZhbHVlXSA9IGFyZ3VtZW50LnNwbGl0KCc9Jyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW25hbWUudHJpbSgpLCB2YWx1ZS50cmltKCldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbbmV3VGFnLCBmb3JtYXR0ZWRBcmd1bWVudHNdO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFtzdHJpbmcsIHN0cmluZ1tdW11dW10sXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLm9sZERlZmF1bHRTb3J0ID1cbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50XG4gICAgICAgICAgICAgICAgICAgIC5tYXRjaCgve3tERUZBVUxUU09SVDouKj99fS9nKVxuICAgICAgICAgICAgICAgICAgICA/LmF0KC0xKVxuICAgICAgICAgICAgICAgICAgICA/LnNsaWNlKDE0LCAtMilcbiAgICAgICAgICAgICAgICAgICAgPy50cmltKCkgPz8gJyc7XG5cbiAgICAgICAgICAgIHRoaXMub2xkQ2F0ZWdvcmllcyA9IHRoaXMucGFnZUNvbnRlbnQubWF0Y2goL1xcW1xcW1tDY11hdGVnb3J5Oi4rP11dL2cpPy5tYXAoKGNhdGVnb3J5KSA9PiBjYXRlZ29yeS5zbGljZSgxMSwgLTIpKSA/PyBbXTtcblxuICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQgPSBbXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudC5tYXRjaCgve3tzaG9ydCBkZXNjcmlwdGlvblxcfC4qP319L2kpPy5bMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudC5tYXRjaCgve3tESVNQTEFZVElUTEU6Lio/fX0vKT8uWzBdLFxuICAgICAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnQubWF0Y2goL3t7aXRhbGljIHRpdGxlXFx8Py4qP319L2kpPy5bMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudC5tYXRjaCgve3t0aXRsZSBsYW5ndWFnZVxcfC4qP319Lyk/LlswXSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vbGRSZWRpcmVjdFRhcmdldCkgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKHRoaXMub2xkUmVkaXJlY3RUYXJnZXQucmVwbGFjZUFsbCgnXycsICcgJykpO1xuICAgICAgICAgICAgZWxzZSBtdy5ub3RpZnkoJ0NvdWxkIG5vdCBmaW5kIHJlZGlyZWN0IHRhcmdldCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKHRoaXMub2xkUmVkaXJlY3RUYWdzKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCBkYXRhXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFRlbXBsYXRlRWRpdG9yID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGVtcGxhdGVOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kVGVtcGxhdGVFZGl0b3IpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgYXJndW1lbnRdIG9mIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmRQYXJhbWV0ZXJFZGl0b3IgPSBmb3VuZFRlbXBsYXRlRWRpdG9yLnBhcmFtZXRlcnMuZmluZCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIC4uLnBhcmFtZXRlci5hbGlhc2VzXS5pbmNsdWRlcyhwYXJhbWV0ZXJOYW1lKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kUGFyYW1ldGVyRWRpdG9yKSBmb3VuZFBhcmFtZXRlckVkaXRvci5lZGl0b3Iuc2V0VmFsdWUoYXJndW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMub2xkRGVmYXVsdFNvcnQpIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZSh0aGlzLm9sZERlZmF1bHRTb3J0KTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiB0aGlzLm9sZENhdGVnb3JpZXMpIHRoaXMuY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKGNhdGVnb3J5KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3Quc2V0VmFsdWUodGhpcy5vbGRDYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+ICh7IGRhdGE6IGNhdGVnb3J5LCBsYWJlbDogY2F0ZWdvcnkgfSkpKTtcblxuICAgICAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogUnVucyBjaGVja3Mgb24gdGhlIHByb3ZpZGVkIGRhdGEgYW5kIHJldHVybnMgdGhlIGVycm9ycyAoaWYgYW55KS5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgdmFsaWRhdGVTdWJtaXNzaW9uKCkge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gW107XG5cbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgY29uc3QgdGFncyA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCk7XG5cbiAgICAgICAgICAgIC8qIEludmFsaWQgY2hhcmFjdGVycyAqL1xuICAgICAgICAgICAgaWYgKCEvXlxccypbXltcXF17fH1dK1xccyokLy50ZXN0KGRlc3RpbmF0aW9uKSkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG5cbiAgICAgICAgICAgIC8qIEZhaWxlZCBkdXJpbmcgdGl0bGUgcGFyc2luZyAqL1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQoZGVzdGluYXRpb24pO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPT09IDApIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgcGFnZSB0aXRsZSEnIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnBhcnNlZERlc3RpbmF0aW9uICYmIGVycm9ycy5sZW5ndGggPT09IDApIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiAnaXMgbm90IGEgdmFsaWQgcGFnZSB0aXRsZSEnIH0pO1xuXG4gICAgICAgICAgICAvKiBTZWxmIHJlZGlyZWN0cyAqL1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyc2VkRGVzdGluYXRpb24/LnRvU3RyaW5nKCkgPT09IHRoaXMucGFnZVRpdGxlUGFyc2VkLnRvU3RyaW5nKCkpIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2Nhbm5vdCByZWRpcmVjdCB0byBpdHNlbGYhJyB9KTtcblxuICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25EYXRhID0gKGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgLmdldCh7IGFjdGlvbjogJ3F1ZXJ5JywgZm9ybWF0dmVyc2lvbjogJzInLCBwcm9wOiBbJ3BhZ2Vwcm9wcycsICdjYXRlZ29yaWVzJ10sIHRpdGxlczogZGVzdGluYXRpb24gfSBzYXRpc2ZpZXMgQXBpUXVlcnlQYWdlUHJvcHNQYXJhbXMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvKiBOb25leGlzdGVudCBkZXN0aW5hdGlvbiAqLyBpZiAoZXJyb3JDb2RlID09PSAnbWlzc2luZ3RpdGxlJykgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdkb2VzIG5vdCBleGlzdCEnIH0pO1xuICAgICAgICAgICAgICAgICAgICAvKiBPdGhlciBBUEkgZXJyb3IgKi8gZWxzZSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogYHdhcyBub3QgYWJsZSB0byBiZSBmZXRjaGVkIGZyb20gdGhlIEFQSSAoJHtlcnJvckNvZGV9KSFgIH0pO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9KSkgYXMgKFBhZ2Vwcm9wc1Jlc3VsdCAmIENhdGVnb3JpZXNSZXN1bHQpIHwgbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQgPSAoYXdhaXQgdGhpcy5hcGkuZ2V0KHsgYWN0aW9uOiAncGFyc2UnLCBwYWdlOiBkZXN0aW5hdGlvbiwgcHJvcDogJ3NlY3Rpb25zJywgcmVkaXJlY3RzOiB0cnVlIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKSkgYXMgUGFnZVBhcnNlUmVzdWx0O1xuXG4gICAgICAgICAgICAvKiBEb3VibGUgcmVkaXJlY3RzICovXG4gICAgICAgICAgICBpZiAoZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5yZWRpcmVjdHM/LlswXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uUmVkaXJlY3QgPVxuICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnJlZGlyZWN0c1swXS50byArIChkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlLnJlZGlyZWN0c1swXS50b2ZyYWdtZW50ID8gYCMke2Rlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UucmVkaXJlY3RzWzBdLnRvZnJhZ21lbnR9YCA6ICcnKTtcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBkZXN0aW5hdGlvbixcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIGEgcmVkaXJlY3QgdG8gPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblJlZGlyZWN0LFxuICAgICAgICAgICAgICAgICAgICApfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7ZGVzdGluYXRpb25SZWRpcmVjdH08L2E+LiBSZXRhcmdldCB0byB0aGF0IHBhZ2UgaW5zdGVhZCwgYXMgZG91YmxlIHJlZGlyZWN0cyBhcmVuJ3QgYWxsb3dlZC5gLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBOb25leGlzdGVudCBzZWN0aW9uICovXG4gICAgICAgICAgICBpZiAoZGVzdGluYXRpb24uc3BsaXQoJyMnKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRTZWN0aW9uID0gZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZS5zZWN0aW9ucy5maW5kKChzZWN0aW9uKSA9PiBzZWN0aW9uLmxpbmUucmVwbGFjZUFsbCgvPFxcLz9pPi9nLCAnJykgPT09IGRlc3RpbmF0aW9uLnNwbGl0KCcjJylbMV0pO1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZFNlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXMoJ1IgdG8gYW5jaG9yJykpIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIHRhZ2dlZCBhcyBhIHJlZGlyZWN0IHRvIGFuIGFuY2hvciwgYnV0IGl0IGlzIGFjdHVhbGx5IGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uIScgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykpIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBzZWN0aW9uLCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB0byBzZWN0aW9ufX08L2NvZGU+IScgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Db250ZW50ID0gKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IHRoaXMuYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhcnNlZERlc3RpbmF0aW9uIS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICkucXVlcnkucGFnZXNbMF0ucmV2aXNpb25zWzBdLnNsb3RzLm1haW4uY29udGVudDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNob3JzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGRlc3RpbmF0aW9uQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaCgvKD88PXt7XFxzKj9bQWFdKD86bmNob3JzP3xuY2hvciBmb3IgcmVkaXJlY3R8bmtlcnxOQ0hPUnxuYylcXHMqP1xcfCkuKz8oPz19fSkvZylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/Lm1hcCgoYW5jaG9yOiBzdHJpbmcpID0+IGFuY2hvci5zcGxpdCgnfCcpLm1hcCgocGFydCkgPT4gcGFydC50cmltKCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8uZmxhdCgpID8/IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLihkZXN0aW5hdGlvbkNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goLyg/PD17e1xccyo/KD86W1Z2XSg/OmlzaWJsZSBhbmNob3JzP3xpc2FuY3xBbmNofGFuY2hvcnxpc2libGVhbmNob3J8YSl8W0FhXSg/Om5jaG9yZHxjaG9yZWR8bmNob3JcXCspfFtUdF1leHQgYW5jaG9yKVxccyo/XFx8KS4rPyg/PSg/PCEhfD0pfX0pL2cpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5tYXAoKGFuY2hvcjogc3RyaW5nKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnfCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBwYXJ0LnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhcnQpID0+ICEvXnRleHRcXHMqPz0vLnRlc3QocGFydCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/LmZsYXQoKSA/PyBbXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi4oZGVzdGluYXRpb25Db250ZW50Lm1hdGNoKC8oPzw9aWQ9KVwiPy4rPyg/PVwifD58XFx8KS9nKT8ubWFwKChhbmNob3I6IHN0cmluZykgPT4gYW5jaG9yLnRyaW0oKSkgPz8gW10pLFxuICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYW5jaG9ycy5pbmNsdWRlcyhkZXN0aW5hdGlvbi5zcGxpdCgnIycpWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXMoJ1IgdG8gc2VjdGlvbicpKSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyB0YWdnZWQgYXMgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24sIGJ1dCBpdCBpcyBhY3R1YWxseSBhIHJlZGlyZWN0IHRvIGFuIGFuY2hvciEnIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGFuIGFuY2hvciwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCA8Y29kZT57e1IgZnJvbSBhbmNob3J9fTwvY29kZT4hJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogYGlzIGEgcmVkaXJlY3QgdG8gPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoZGVzdGluYXRpb24pfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7ZGVzdGluYXRpb259PC9hPiwgYnV0IHRoYXQgc2VjdGlvbiBvciBhbmNob3IgZG9lcyBub3QgZXhpc3QhYCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIEltcHJvcGVybHkgdGFnZ2VkIGFzIHJlZGlyZWN0IHRvIHNlY3Rpb24vYW5jaG9yICovXG4gICAgICAgICAgICBpZiAoZGVzdGluYXRpb24uc3BsaXQoJyMnKS5sZW5ndGggPT09IDEgJiYgKHRhZ3MuaW5jbHVkZXMoJ1IgdG8gc2VjdGlvbicpIHx8IHRhZ3MuaW5jbHVkZXMoJ1IgdG8gYW5jaG9yJykpKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIG5vdCBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbi9hbmNob3IsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCA8Y29kZT57e1IgZnJvbSBzZWN0aW9ufX08L2NvZGU+IG9yIDxjb2RlPnt7UiBmcm9tIGFuY2hvcn19PC9jb2RlPiEnIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSA9ICEhKGRlc3RpbmF0aW9uRGF0YSEucXVlcnkucGFnZXNbMF0ucGFnZXByb3BzICYmICdkaXNhbWJpZ3VhdGlvbicgaW4gZGVzdGluYXRpb25EYXRhIS5xdWVyeS5wYWdlc1swXS5wYWdlcHJvcHMpO1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0SXNTdXJuYW1lTGlzdCA9ICEhKGRlc3RpbmF0aW9uRGF0YSEucXVlcnkucGFnZXNbMF0uY2F0ZWdvcmllcyAmJiBkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLmNhdGVnb3JpZXMuc29tZSgoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6U3VybmFtZXMnKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyA9IFsnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJywgJ1IgZnJvbSBpbmNvbXBsZXRlIGRpc2FtYmlndWF0aW9uJ107XG4gICAgICAgICAgICBjb25zdCB0b1N1cm5hbWVMaXN0VGFncyA9IFsnUiBmcm9tIGFtYmlndW91cyBzb3J0IG5hbWUnLCAnUiBmcm9tIGFtYmlndW91cyB0ZXJtJ107XG5cbiAgICAgICAgICAgIGNvbnN0IHRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSA9IHRvRGlzYW1iaWd1YXRpb25QYWdlVGFncy5zb21lKCh0ZW1wbGF0ZSkgPT4gdGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpO1xuICAgICAgICAgICAgY29uc3QgdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QgPSB0b1N1cm5hbWVMaXN0VGFncy5zb21lKCh0ZW1wbGF0ZSkgPT4gdGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpO1xuXG4gICAgICAgICAgICAvKiBSZWRpcmVjdCB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlIHdpdGhvdXQgdGVtcGxhdGUgKi9cbiAgICAgICAgICAgIGlmICh0YXJnZXRJc0Rpc2FtYmlndWF0aW9uUGFnZSAmJiAhdGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlICYmICF0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdClcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgZGlzYW1iaWd1YXRpb24gcGFnZSwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCBhIGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScgfSk7XG5cbiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbkRhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnBhZ2Vwcm9wcyAmJiAhdGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UpIHtcbiAgICAgICAgICAgICAgICAvKiBJbXByb3Blcmx5IHRhZ2dlZCBhcyByZWRpcmVjdCB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlICovXG4gICAgICAgICAgICAgICAgaWYgKHRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSkgZXJyb3JzLnB1c2goeyBtZXNzYWdlOiAnaXMgbm90IGEgcmVkaXJlY3QgdG8gYSBkaXNhbWJpZ3VhdGlvbiBwYWdlLCBidXQgaXQgaXMgdGFnZ2VkIHdpdGggYSBkaXNhbWJpZ3VhdGlvbiBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSEnIH0pO1xuXG4gICAgICAgICAgICAgICAgLyogUmVkaXJlY3QgdG8gc3VybmFtZSBsaXN0IHdpdGhvdXQgdGVtcGxhdGUgKi9cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXNTdXJuYW1lTGlzdCAmJiAhdGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2lzIGEgcmVkaXJlY3QgdG8gYSBzdXJuYW1lIGxpc3QsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggYSBjb3JyZWN0IGRpc2FtYmlndWF0aW9uIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIScgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIHt7UiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlfX0gd2l0aG91dCBcIiAoZGlzYW1iaWd1YXRpb24pXCIgYXQgZW5kIG9mIHRpdGxlICovXG4gICAgICAgICAgICBpZiAodGFyZ2V0SXNEaXNhbWJpZ3VhdGlvblBhZ2UgJiYgdGFncy5pbmNsdWRlcygnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJykgJiYgIXRoaXMucGFnZVRpdGxlUGFyc2VkLmdldE1haW5UZXh0KCkuZW5kc1dpdGgoJyAoZGlzYW1iaWd1YXRpb24pJykpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOlxuICAgICAgICAgICAgICAgICAgICAgICAgJ2lzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlfX08L2NvZGU+LCBidXQgdGhpcyB0aXRsZSBkb2VzIG5vdCBlbmQgd2l0aCBcIiAoZGlzYW1iaWd1YXRpb24pXCIuIFVzZSA8Y29kZT57e1IgZnJvbSBhbWJpZ3VvdXMgdGVybX19PC9jb2RlPiBvciBhIHNpbWlsYXIgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgaW5zdGVhZCEnLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvKiBUYWdnZWQgd2l0aCBhIHByb3RlY3Rpb24gdGVtcGxhdGUgKi9cbiAgICAgICAgICAgIGZvciAoY29uc3QgdGVtcGxhdGUgb2YgWydSIHNlbWktcHJvdGVjdGVkJywgJ1IgZXh0ZW5kZWQtcHJvdGVjdGVkJywgJ1IgdGVtcGxhdGUtcHJvdGVjdGVkJywgJ1IgZnVsbHkgcHJvdGVjdGVkJ10pXG4gICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKSBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6IGBpcyB0YWdnZWQgd2l0aCB1bm5lY2Vzc2FyaWx5IHRhZ2dlZCB3aXRoIDxjb2RlPnt7JHt0ZW1wbGF0ZX19fTwvY29kZT4gd2hpY2ggd2lsbCBiZSBkdXBsaWNhdGVkIGJ5IHRoZSByZWRpcmVjdCBjYXRlZ29yeSBzaGVsbCFgIH0pO1xuXG4gICAgICAgICAgICAvKiBMaW5rZWQgdG8gYSBXaWtpZGF0YSBpdGVtIHdpdGhvdXQgYmVpbmcgdGFnZ2VkIHdpdGgge3tSIHdpdGggV2lraWRhdGEgaXRlbX19ICovXG4gICAgICAgICAgICBpZiAobXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpICYmICF0YWdzLmluY2x1ZGVzKCdSIHdpdGggV2lraWRhdGEgaXRlbScpKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogXCJpcyBsaW5rZWQgdG8gYSBXaWtpZGF0YSBpdGVtIGJ1dCBpdCBpc24ndCB0YWdnZWQgd2l0aCA8Y29kZT57e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX08L2NvZGU+IVwiIH0pO1xuXG4gICAgICAgICAgICAvKiBUYWdnZWQgd2l0aCB7e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX0gd2l0aG91dCBiZWluZyBsaW5rZWQgdG8gYW4gaXRlbSAqL1xuICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXMoJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJykgJiYgIW13LmNvbmZpZy5nZXQoJ3dnV2lraWJhc2VJdGVtSWQnKSlcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7IG1lc3NhZ2U6ICdpcyB0YWdnZWQgd2l0aCA8Y29kZT57e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX08L2NvZGU+IGJ1dCBpdCBpcyBub3QgYWN0dWFsbHkgbGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSEnIH0pO1xuXG4gICAgICAgICAgICAvKiBNaXNzaW5nIHRhZyByZXF1aXJlZCBwYXJhbWV0ZXIgKi9cbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MgYXMgc3RyaW5nW10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdEYXRhID0gdGhpcy5yZWRpcmVjdFRlbXBsYXRlc1t0YWddO1xuICAgICAgICAgICAgICAgIGlmICghdGFnRGF0YSkgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBwYXJhbWV0ZXJEYXRhXSBvZiBPYmplY3QuZW50cmllcyh0YWdEYXRhLnBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kUGFyYW1ldGVyID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpXG4gICAgICAgICAgICAgICAgICAgICAgICA/LnBhcmFtZXRlcnMuZmluZCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIC4uLnBhcmFtZXRlci5hbGlhc2VzXS5pbmNsdWRlcyhwYXJhbWV0ZXJOYW1lKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZFBhcmFtZXRlcikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlckRhdGEucmVxdWlyZWQgJiYgIWZvdW5kUGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogYGlzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7JHt0YWd9fX08L2NvZGU+IGJ1dCBpdCBpcyBtaXNzaW5nIHRoZSByZXF1aXJlZCBwYXJhbWV0ZXIgPGNvZGU+JHtwYXJhbWV0ZXJOYW1lfTwvY29kZT4hYCB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIFN5bmNpbmcgdGFsayBwYWdlIGJ1dCB0YWxrIHBhZ2UgZXhpc3RzIGFuZCBpc24ndCBhIHJlZGlyZWN0ICovXG4gICAgICAgICAgICBpZiAodGhpcy5zeW5jVGFsa0NoZWNrYm94Py5pc1NlbGVjdGVkKCkgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5LnBhZ2VzWzBdLm1pc3NpbmcgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5LnBhZ2VzWzBdLnJlZGlyZWN0KVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgdGl0bGU6IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLCBtZXNzYWdlOiAnZXhpc3RzLCBidXQgaXMgbm90IGEgcmVkaXJlY3QhJyB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBIYW5kbGVzIHRoZSBldmVudCB3aGVuIHRoZSB1c2VyIGNsaWNrcyB0aGUgXCJTdWJtaXRcIiBidXR0b24uXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGhhbmRsZVN1Ym1pdEJ1dHRvbkNsaWNrKCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNUb0Rpc2FibGUgPSBbXG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LFxuICAgICAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LFxuICAgICAgICAgICAgICAgIC4uLnRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5mbGF0TWFwKCh0ZW1wbGF0ZSkgPT4gdGVtcGxhdGUucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLmVkaXRvcikpLFxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dCxcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LFxuICAgICAgICAgICAgICAgIHRoaXMuc3VtbWFyeUlucHV0LFxuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3gsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXRyb2xDaGVja2JveCxcbiAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNUb0Rpc2FibGUpIChlbGVtZW50IGFzIE9PLnVpLldpZGdldCkuc2V0RGlzYWJsZWQodHJ1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDaGVja2luZyB0YXJnZXQgdmFsaWRpdHkuLi4nKTtcblxuICAgICAgICAgICAgbGV0IGVycm9yczogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLnZhbGlkYXRlU3VibWlzc2lvbj4+ID0gW107XG4gICAgICAgICAgICBpZiAodGhpcy5uZWVkc0NoZWNrKSBlcnJvcnMgPSBhd2FpdCB0aGlzLnZhbGlkYXRlU3VibWlzc2lvbigpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkpO1xuXG4gICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnJlZGlyZWN0LWhlbHBlci13YXJuaW5nJykpIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IHRpdGxlLCBtZXNzYWdlIH0gb2YgZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7dGl0bGUgPyBgPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwodGl0bGUpfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7dGl0bGV9PC9hPmAgOiAnVGhpcyBwYWdlJ30gJHttZXNzYWdlfSBDbGljayBhZ2FpbiB3aXRob3V0IG1ha2luZyBjaGFuZ2VzIHRvIHN1Ym1pdCBhbnl3YXkuYCxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2FybmluZ01lc3NhZ2UgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICdlcnJvcicsIGNsYXNzZXM6IFsncmVkaXJlY3QtaGVscGVyLXdhcm5pbmcnXSwgaW5saW5lOiB0cnVlLCBsYWJlbCB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvckJveC4kZWxlbWVudFswXS5hcHBlbmQod2FybmluZ01lc3NhZ2UuJGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50c1RvRGlzYWJsZSkgKGVsZW1lbnQgYXMgT08udWkuV2lkZ2V0KS5zZXREaXNhYmxlZChmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0IGFueXdheScpO1xuICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBFZGl0L2NyZWF0ZSByZWRpcmVjdCAqL1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoYCR7dGhpcy5leGlzdHMgPyAnRWRpdGluZycgOiAnQ3JlYXRpbmcnfSByZWRpcmVjdC4uLmApO1xuXG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGNvbnN0IHN1bW1hcnkgPSAodGhpcy5zdW1tYXJ5SW5wdXQuZ2V0VmFsdWUoKSB8fCAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIpICsgdGhpcy5zY3JpcHRBZHZlcnQ7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKHRoaXMucGFnZVRpdGxlLCBvdXRwdXQsIHN1bW1hcnkpO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybjtcblxuICAgICAgICAgICAgbXcubm90aWZ5KGBSZWRpcmVjdCAke3RoaXMuZXhpc3RzID8gJ2VkaXRlZCcgOiAnY3JlYXRlZCd9IHN1Y2Nlc3NmdWxseSFgLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcblxuICAgICAgICAgICAgLyogU3luYyB0YWxrIHBhZ2UgY2hlY2tib3ggaGFuZGxlciAqL1xuICAgICAgICAgICAgaWYgKHRoaXMuc3luY1RhbGtDaGVja2JveD8uaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ0VkaXRpbmcgdGFsayBwYWdlLi4uJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBmcm9tTW92ZSA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXMoJ1IgZnJvbSBtb3ZlJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmNyZWF0ZU91dHB1dCh0aGlzLnBhcnNlZERlc3RpbmF0aW9uIS5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSwgZnJvbU1vdmUgPyBbJ1IgZnJvbSBtb3ZlJ10gOiBbXSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFtdKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHRhbGtSZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZSh0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSwgb3V0cHV0LCAnU3luY2luZyByZWRpcmVjdCBmcm9tIG1haW4gcGFnZScgKyB0aGlzLnNjcmlwdEFkdmVydCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YWxrUmVzdWx0KSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBtdy5ub3RpZnkoJ1RhbGsgcGFnZSBzeW5jZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiBQYXRyb2wgY2hlY2tib3ggaGFuZGxlciAqL1xuICAgICAgICAgICAgaWYgKHRoaXMucGF0cm9sQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdQYXRyb2xsaW5nIHJlZGlyZWN0Li4uJyk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXRyb2xMaW5rOiBIVE1MQW5jaG9yRWxlbWVudCB8IG51bGwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF0cm9sbGluayBhJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFya1Jldmlld2VkQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI213ZS1wdC1tYXJrLWFzLXJldmlld2VkLWJ1dHRvbicpIGFzIEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmIChwYXRyb2xMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdHJvbFJlc3VsdCA9IGF3YWl0IHRoaXMuYXBpXG4gICAgICAgICAgICAgICAgICAgICAgICAucG9zdFdpdGhUb2tlbigncGF0cm9sJywgeyBhY3Rpb246ICdwYXRyb2wnLCByY2lkOiBuZXcgVVJMKHBhdHJvbExpbmsuaHJlZikuc2VhcmNoUGFyYW1zLmdldCgncmNpZCcpISB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKChlcnJvckNvZGU6IHN0cmluZywgZXJyb3JJbmZvOiBNZWRpYVdpa2lEYXRhRXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEVycm9yIHBhdHJvbGxpbmcgJHt0aGlzLnBhZ2VUaXRsZX0gdmlhIEFQSTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF0cm9sUmVzdWx0KSBtdy5ub3RpZnkoJ1JlZGlyZWN0IHBhdHJvbGxlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXJrUmV2aWV3ZWRCdXR0b24pIHtcbiAgICAgICAgICAgICAgICAgICAgbWFya1Jldmlld2VkQnV0dG9uLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeSgnUmVkaXJlY3QgcGF0cm9sbGVkIHN1Y2Nlc3NmdWxseSEnLCB7IHR5cGU6ICdzdWNjZXNzJyB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgbXcubm90aWZ5KCdQYWdlIGN1cmF0aW9uIHRvb2xiYXIgbm90IGZvdW5kLCByZWRpcmVjdCBjYW5ub3QgYmUgcGF0cm9sbGVkIScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ0NvbXBsZXRlLCByZWxvYWRpbmcuLi4nKTtcblxuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBtdy51dGlsLmdldFVybCh0aGlzLnBhZ2VUaXRsZSwgeyByZWRpcmVjdDogJ25vJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRha2VzIHByb3ZpZGVkIHZhbHVlcyB0byBjcmVhdGUgdGhlIHBhZ2Ugb3V0cHV0LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBjcmVhdGVPdXRwdXQodGFyZ2V0OiBzdHJpbmcsIHRhZ3M6IHN0cmluZ1tdLCBzdHJheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgZGVmYXVsdFNvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgY2F0ZWdvcmllczogc3RyaW5nW10pIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRhcmdldCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZFRpdGxlID0gcGFyc2VkVGFyZ2V0XG4gICAgICAgICAgICAgICAgPyBgJHtwYXJzZWRUYXJnZXQuZ2V0TmFtZXNwYWNlSWQoKSA9PT0gMTQgPyAnOicgOiAnJ30ke3BhcnNlZFRhcmdldC5nZXRQcmVmaXhlZFRleHQoKX0ke3BhcnNlZFRhcmdldC5nZXRGcmFnbWVudCgpID8gYCMke3BhcnNlZFRhcmdldC5nZXRGcmFnbWVudCgpfWAgOiAnJ31gXG4gICAgICAgICAgICAgICAgOiB0YXJnZXQudHJpbSgpO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWRcbiAgICAgICAgICAgICAgICAgICAgLmdldE1haW5UZXh0KClcbiAgICAgICAgICAgICAgICAgICAgLnRvTG9jYWxlTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1tcXHUwMzAwLVxcdTAzNkZdL2csICcnKSA9PT1cbiAgICAgICAgICAgICAgICBkZWZhdWx0U29ydFxuICAgICAgICAgICAgICAgICAgICA/LnRvTG93ZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1tcXHUwMzAwLVxcdTAzNkZdL2csICcnKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGRlZmF1bHRTb3J0ID0gdW5kZWZpbmVkOyAvLyBDaGVjayBpZiB0aXRsZXMgbm9ybWFsaXplIHRvIHRoZSBzYW1lIHRleHQsIGFuZCByZW1vdmVzIHRoZSBERUZBVUxUU09SVCBpZiBzb1xuXG4gICAgICAgICAgICBjb25zdCB0YWdzV2l0aEFyZ3VtZW50cyA9IHRhZ3MubWFwKCh0YWcpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZEFyZ3VtZW50RWRpdG9yID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZpbmQoKGVkaXRvckluZm8pID0+IGVkaXRvckluZm8ubmFtZSA9PT0gdGFnKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kQXJndW1lbnRFZGl0b3IpIHJldHVybiBge3ske3RhZ319fWA7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRBcmd1bWVudHMgPSBmb3VuZEFyZ3VtZW50RWRpdG9yLnBhcmFtZXRlcnNcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgfCR7cGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgPyAnJyA6IGAke3BhcmFtZXRlci5uYW1lfT1gfSR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAgICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gYHt7JHt0YWd9JHttYXBwZWRBcmd1bWVudHN9fX1gO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgYCNSRURJUkVDVCBbWyR7Zm9ybWF0dGVkVGl0bGV9XV1cXG5gLCAvL1xuICAgICAgICAgICAgICAgIHRhZ3MubGVuZ3RoID4gMCA/IGB7e1JlZGlyZWN0IGNhdGVnb3J5IHNoZWxsfFxcbiR7dGFnc1dpdGhBcmd1bWVudHMuam9pbignXFxuJyl9XFxufX1cXG5gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzdHJheVRleHQgPyBzdHJheVRleHQgKyAnXFxuJyA6IG51bGwsXG4gICAgICAgICAgICAgICAgZGVmYXVsdFNvcnQgPyBge3tERUZBVUxUU09SVDoke2RlZmF1bHRTb3J0LnRyaW0oKX19fWAgOiBudWxsLFxuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXMubGVuZ3RoID4gMCA/IGNhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gYFtbQ2F0ZWdvcnk6JHtjYXRlZ29yeX1dXWApLmpvaW4oJ1xcbicpIDogbnVsbCxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoZXMgdGhlIGNvbnRlbnQgb2YgYSBnaXZlbiBwYWdlLlxuICAgICAgICAgKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIHRvIGZldGNoLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBnZXRQYWdlQ29udGVudCh0aXRsZTogc3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIChhd2FpdCB0aGlzLmFwaS5nZXQoe1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgICAgICAgICBydnNsb3RzOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGl0bGUsXG4gICAgICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgICAgICAgICApLnF1ZXJ5LnBhZ2VzWzBdLnJldmlzaW9uc1swXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVkaXRzIG9yIGNyZWF0ZXMgYSBwYWdlIHdpdGggZ2l2ZW4gdGV4dC5cbiAgICAgICAgICogQHBhcmFtIHRpdGxlIFRoZSBwYWdlIHRpdGxlLlxuICAgICAgICAgKiBAcGFyYW0gdGV4dCBUaGUgcGFnZSB0ZXh0LlxuICAgICAgICAgKiBAcGFyYW0gc3VtbWFyeSBUaGUgZWRpdCBzdW1tYXJ5LlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBlZGl0T3JDcmVhdGUodGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nLCBzdW1tYXJ5OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmFwaVxuICAgICAgICAgICAgICAgIC5lZGl0KHRpdGxlLCAoKSA9PiAoeyB0ZXh0LCBzdW1tYXJ5IH0pKVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9ySW5mbzogTWVkaWFXaWtpRGF0YUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdub2NyZWF0ZS1taXNzaW5nJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaS5jcmVhdGUodGl0bGUsIHsgc3VtbWFyeSB9LCB0ZXh0KS5jYXRjaCgoZXJyb3JDb2RlOiBzdHJpbmcsIGVycm9ySW5mbzogTWVkaWFXaWtpRGF0YUVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KGBFcnJvciBjcmVhdGluZyAke3RpdGxlfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgRXJyb3IgZWRpdGluZyBvciBjcmVhdGluZyAke3RpdGxlfTogJHtlcnJvckluZm8/LmVycm9yLmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXcgUmVkaXJlY3RIZWxwZXIoKS5ydW4oKTtcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7O2FBNkNBLEdBQUcsT0FBTyxNQUFNLENBQUMsaUJBQWtCLGVBQWdCLGtCQUFtQixrQkFBbUIsK0JBQWdDLG1DQUFtQyxFQUFHLElBQU0sQ0FNakssTUFBTUEsVUFBNEIsR0FBRyxHQUFHLGVBQWdCLENBT3BELFlBQVlDLEVBQTZCQyxFQUEyQixDQUNoRSxNQUFNRCxDQUFNLEVBTmhCLEtBQVEsSUFBTSxJQUFJLEdBQUcsSUFZckIsc0JBQW1CLElBQU0sQ0FDckIsTUFBTUUsRUFBUSxLQUFLLFNBQVMsRUFDdEJDLEVBQVcsRUFBRSxTQUFTLEVBRTVCLEdBQUksQ0FBQ0QsRUFBT0MsRUFBUyxRQUFRLENBQUMsQ0FBQyxVQUN0QkQsRUFBTSxTQUFTLEdBQUcsRUFBRyxDQUMxQixNQUFNRSxFQUFRRixFQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFFaEMsS0FBSyxJQUNBLElBQUksQ0FBRSxPQUFRLFFBQVMsS0FBTUUsRUFBTyxLQUFNLFdBQVksVUFBVyxFQUFLLENBQTBCLEVBQ2hHLE1BQU0sSUFBTSxJQUFJLEVBQ2hCLEtBQU1DLEdBQW1DLENBQ3RDLEdBQUlBLEVBQVEsQ0FDUixNQUFNQyxFQUFrQkQsRUFBTyxNQUFNLFNBQVMsT0FBUUUsR0FDbERBLEVBQVEsS0FDSCxZQUFZLEVBQ1osV0FBVyxVQUFXLEVBQUUsRUFDeEIsV0FBV0wsRUFBTSxNQUFN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TixPQUFRLFVBQ1IsUUFBUyxPQUNULE9BQVFBLENBQ1osQ0FBbUMsR0FDckMsTUFBTSxNQUFNLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxNQUFNLEtBQUssUUFBUSxLQUFLLENBQzFELENBUUEsTUFBYyxhQUFhQSxFQUFldUgsRUFBY3RFLEVBQWlCLENBQ3JFLE9BQU8sTUFBTSxLQUFLLElBQ2IsS0FBS2pELEVBQU8sS0FBTyxDQUFFLEtBQUF1SCxFQUFNLFFBQUF0RSxDQUFRLEVBQUUsRUFDckMsTUFBTSxDQUFDd0MsRUFBbUJxQixJQUNuQnJCLElBQWMsbUJBQ1AsS0FBSyxJQUFJLE9BQU96RixFQUFPLENBQUUsUUFBQWlELENBQVEsRUFBR3NFLENBQUksRUFBRSxNQUFNLENBQUM5QixFQUFtQnFCLElBQWtDLENBQ3pHLEdBQUcsT0FBTyxrQkFBa0I5RyxDQUFLLEtBQUs4RyxHQUFXLE1BQU0sTUFBUSxlQUFlLEtBQUtyQixDQUFTLElBQUssQ0FBRSxLQUFNLE9BQVEsQ0FBQyxDQUN0SCxDQUFDLEdBRUQsR0FBRyxPQUFPLDZCQUE2QnpGLENBQUssS0FBSzhHLEdBQVcsTUFBTSxNQUFRLGVBQWUsS0FBS3JCLENBQVMsSUFBSyxDQUFFLEtBQU0sT0FBUSxDQUFDLEVBQ3RILEtBRWQsQ0FDVCxDQUNKLENBRUEsSUFBSWxFLEVBQWUsRUFBRSxJQUFJLENBQzdCLENBQUMiLAogICJuYW1lcyI6IFsiUmVkaXJlY3RJbnB1dFdpZGdldCIsICJjb25maWciLCAicGFnZVRpdGxlUGFyc2VkIiwgInZhbHVlIiwgImRlZmVycmVkIiwgInRpdGxlIiwgInJlc3VsdCIsICJtYXRjaGVkU2VjdGlvbnMiLCAic2VjdGlvbiIsICJwYXJzZWRUaXRsZSIsICJwYWdlIiwgInJlc3BvbnNlIiwgImRhdGEiLCAibGFiZWwiLCAiQ2F0ZWdvcnlJbnB1dFdpZGdldCIsICJwYWdlcyIsICJjYXRlZ29yeSIsICJ0aXRsZVdpdGhvdXROYW1lc3BhY2UiLCAiVGVtcGxhdGVQcmV2aWV3RGlhbG9nIiwgInRhZ3NDb250ZW50IiwgImNhdGVnb3JpZXNDb250ZW50IiwgInBhbmVsTGF5b3V0IiwgImFjdGlvbiIsICJTaG93Q2hhbmdlc0RpYWxvZyIsICJvbGRUZXh0IiwgIm5ld1RleHQiLCAiY29tcGFyaXNvbiIsICJub0NoYW5nZXNFbGVtZW50IiwgIlJlZGlyZWN0SGVscGVyIiwgInBhZ2VJbmZvIiwgImRpYWxvZ0luZm8iLCAiYnV0dG9uIiwgIlJlZGlyZWN0SGVscGVyRGlhbG9nIiwgInBvcnRsZXRMaW5rIiwgImV2ZW50IiwgInJlZGlyZWN0VGVtcGxhdGVzIiwgImNvbnRlbnRUZXh0IiwgInBhZ2VUaXRsZSIsICJleGlzdHMiLCAibWFpblBhZ2VDb250ZW50IiwgInRhcmdldCIsICJ0YWdPclJlZGlyZWN0IiwgInRhZyIsICJzb3J0ZWRUYWdzIiwgImEiLCAiYiIsICJlZGl0b3JJbmZvIiwgInNob3duVGVtcGxhdGVFZGl0b3JzIiwgIm5vVGVtcGxhdGVzTWVzc2FnZSIsICJzdW1tYXJ5RWxlbWVudCIsICJ0ZW1wbGF0ZU5hbWUiLCAidGVtcGxhdGVEYXRhIiwgInBhcmFtZXRlcnMiLCAiZGV0YWlscyIsICJzdW1tYXJ5IiwgImVsZW1lbnREYXRhIiwgInBhcmFtZXRlck5hbWUiLCAicGFyYW1ldGVyRGF0YSIsICJpbnB1dCIsICJpbnB1dExheW91dCIsICJuYW1lIiwgImdlbmVyYXRpb25hbFN1ZmZpeCIsICJsYXN0TmFtZSIsICJvdGhlck5hbWVzIiwgIm5ld05hbWUiLCAibGVhZGluZ0FydGljbGUiLCAid2luZG93TWFuYWdlciIsICJ0ZW1wbGF0ZVByZXZpZXdEaWFsb2ciLCAic2hvd0NoYW5nZXNEaWFsb2ciLCAicGFnZVRyaWFnZU1hcmtCdXR0b24iLCAicGF0cm9sUmVzcG9uc2UiLCAicmVkaXJlY3RWYWx1ZSIsICJ0YXJnZXRDaGFuZ2VkIiwgInRhZ3NDaGFuZ2VkIiwgInRhZ0FyZ3VtZW50c0NoYW5nZWQiLCAidGVtcGxhdGUiLCAicGFyYW1ldGVyIiwgImZvdW5kT2xkQXJndW1lbnQiLCAiYXJndW1lbnQiLCAiZGVmYXVsdFNvcnRDaGFuZ2VkIiwgImNhdGVnb3JpZXNDaGFuZ2VkIiwgImNoYW5nZXMiLCAidGFnRGF0YSIsICJvcmlnaW5hbFJlZGlyZWN0VGFncyIsICJtYXRjaCIsICJuZXdUYWciLCAiZm9ybWF0dGVkQXJndW1lbnRzIiwgImluZGV4IiwgImZvdW5kVGVtcGxhdGVFZGl0b3IiLCAiZm91bmRQYXJhbWV0ZXJFZGl0b3IiLCAiZXJyb3JzIiwgImRlc3RpbmF0aW9uIiwgInRhZ3MiLCAiZGVzdGluYXRpb25EYXRhIiwgImVycm9yQ29kZSIsICJkZXN0aW5hdGlvblBhcnNlUmVzdWx0IiwgImRlc3RpbmF0aW9uUmVkaXJlY3QiLCAiZGVzdGluYXRpb25Db250ZW50IiwgImFuY2hvciIsICJwYXJ0IiwgInRhcmdldElzRGlzYW1iaWd1YXRpb25QYWdlIiwgInRhcmdldElzU3VybmFtZUxpc3QiLCAidG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzIiwgInRvU3VybmFtZUxpc3RUYWdzIiwgInRhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSIsICJ0YWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdCIsICJmb3VuZFBhcmFtZXRlciIsICJlbGVtZW50c1RvRGlzYWJsZSIsICJlbGVtZW50IiwgIm1lc3NhZ2UiLCAid2FybmluZ01lc3NhZ2UiLCAib3V0cHV0IiwgImZyb21Nb3ZlIiwgInBhdHJvbExpbmsiLCAibWFya1Jldmlld2VkQnV0dG9uIiwgImVycm9ySW5mbyIsICJzdHJheVRleHQiLCAiZGVmYXVsdFNvcnQiLCAiY2F0ZWdvcmllcyIsICJwYXJzZWRUYXJnZXQiLCAiZm9ybWF0dGVkVGl0bGUiLCAidGFnc1dpdGhBcmd1bWVudHMiLCAiZm91bmRBcmd1bWVudEVkaXRvciIsICJtYXBwZWRBcmd1bWVudHMiLCAidGV4dCJdCn0K