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 code will be executed when previewing this page.
This user script seems to have a documentation page at User:Eejit43/scripts/redirect-helper and an accompanying .json page at User:Eejit43/scripts/redirect-helper.json.
// <pre>
// Note: This script was compiled and minified from TypeScript. For a more readable version, see https://github.com/Eejit43/wikipedia-scripts/blob/main/scripts/redirect-helper/redirect-helper.ts
"use strict";(()=>{var H=Object.defineProperty;var y=(u,t,i)=>()=>{if(i)throw i[0];try{return u&&(t=u(u=0)),t}catch(e){throw i=[e],e}};var L=(u,t)=>{for(var i in t)H(u,i,{get:t[i],enumerable:!0})};async function b(u){return(await d.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:u})).query.pages[0].revisions?.[0].slots.main.content.trim()}var d,T=y(()=>{"use strict";d=new mw.Api});var O,D=y(()=>{"use strict";T();O=class extends OO.ui.TextInputWidget{validCategories=new Set;constructor(t){super(t),OO.ui.mixin.LookupElement.call(this,t)}getLookupRequest=()=>{let t=this.getValue().split("|")[0],i=$.Deferred();t||i.resolve([]);let e=this.getValue().split("|")[1];if(e&&this.validCategories.has(t)){let s=[{data:`${t}|${e}`,label:`${t} (with sort key "${e}")`}];i.resolve(s),this.emit("showing-values",s)}let a=mw.Title.newFromText(t);return d.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:14,gapprefix:a?.getMainText()??t,generator:"allpages",prop:"categories",cllimit:"max"}).catch(()=>null).then(s=>{if(s?.query?.pages){let r=s.query.pages.filter(o=>!o.categories?.some(n=>n.title==="Category:Wikipedia soft redirected categories")).map(o=>{let n=o.title.split(":")[1];return this.validCategories.add(n),{data:n,label:n}});this.emit("showing-values",r),i.resolve(r)}else i.resolve([])}),i.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:i,label:e})=>new OO.ui.MenuOptionWidget({data:i,label:e}))};Object.assign(O.prototype,OO.ui.mixin.LookupElement.prototype)});var P,A=y(()=>{"use strict";T();P=class u extends OO.ui.ProcessDialog{hasLoadedDiffStyles=!1;constructor(t){super(t),u.static.name="ChangesDialog",u.static.title="Changes to be made",u.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>u.super.prototype.getSetupProcess.call(this).next(()=>{this.hasLoadedDiffStyles||(mw.loader.addLinkTag("https://www.mediawiki.org/w/load.php?modules=mediawiki.diff.styles&only=styles"),this.hasLoadedDiffStyles=!0);let[t,i]=this.getData();return d.post({action:"compare",formatversion:"2",prop:["diff"],fromslots:"main","fromtext-main":t,"fromcontentmodel-main":"wikitext",toslots:"main","totext-main":i,"tocontentmodel-main":"wikitext"}).then(e=>{let a=e.compare.body,s=new OO.ui.MessageWidget({type:"warning",label:"No changes to make!"}),r=new OO.ui.PanelLayout({padded:!0,expanded:!1});r.$element.append(a?`
<table class="diff diff-editfont-monospace">
<colgroup>
<col class="diff-marker">
<col class="diff-content">
<col class="diff-marker">
<col class="diff-content">
</colgroup>
<tbody>
${a}
</tbody>
</table>`:s.$element[0]),this.$body.append(r.$element)})});getActionProcess=t=>t?new OO.ui.Process(()=>{this.close()}):u.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>u.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};Object.assign(P.prototype,OO.ui.ProcessDialog.prototype)});var S,W=y(()=>{"use strict";T();S=class u extends OO.ui.ProcessDialog{pageTitleParsed;constructor(t,i){super(t),this.pageTitleParsed=i,u.static.name="OutputPreviewDialog",u.static.title="Redirect categorization templates preview",u.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]}]}getSetupProcess=()=>u.super.prototype.getSetupProcess.call(this).next(()=>d.post({action:"parse",formatversion:"2",contentmodel:"wikitext",prop:["text","categorieshtml"],title:this.pageTitleParsed.getPrefixedDb(),text:this.getData()}).then(t=>{let i=t.parse.text,e=t.parse.categorieshtml,a=new OO.ui.PanelLayout({padded:!0,expanded:!1});a.$element.append(i,e),this.$body.append(a.$element)}));getActionProcess=t=>t?new OO.ui.Process(()=>{this.close()}):u.super.prototype.getActionProcess.call(this,t);getTeardownProcess=()=>u.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};Object.assign(S.prototype,OO.ui.ProcessDialog.prototype)});function I(u,t){let e=new DOMParser().parseFromString(u,"text/html");for(let s of N)for(let r of e.querySelectorAll(s))r.remove();return[...e.querySelectorAll("[id]")].map(s=>{if(U.some(n=>s.classList.contains(n))||"mwCommentStart"in s.dataset)return null;let r=s.id.replaceAll("_"," "),o=`${t}#${r}`;return{fragment:r,isSection:!1,result:{data:o,label:new OO.ui.HtmlSnippet(`${o} <i>(anchor)</i>`)}}}).filter(Boolean)}var N,U,v,B=y(()=>{"use strict";T();N=["div.navbox","ol.references"],U=["citation","mw-file-element","reference"];v=class extends OO.ui.TextInputWidget{pageTitleParsed;knownPageSections=new Map;constructor(t,i){super(t),OO.ui.mixin.LookupElement.call(this,t),this.pageTitleParsed=i}getLookupRequest=()=>{let t=this.getValue(),i=$.Deferred();if(!t)i.resolve([]);else if(t.includes("#")){let e=t.split("#")[0],a=t.split("#").slice(1).join("#").toLowerCase();if(this.knownPageSections.has(e)){let s=this.knownPageSections.get(e),r=s.filter(({isSection:n})=>n),o=s.filter(({isSection:n})=>!n);i.resolve(this.getMatchingFragmentResults(r,o,a))}else d.get({action:"parse",page:e,prop:["text","tocdata"],redirects:!0}).catch(()=>null).then(s=>{if(s){let r=s.parse.tocdata.sections.map(n=>{let l=n.line.replaceAll(/<\/?i>/g,""),p=`${s.parse.title}#${l}`;return{fragment:l,isSection:!0,result:{data:p,label:p}}}),o=I(s.parse.text["*"],s.parse.title);this.knownPageSections.set(e,[...r,...o]),i.resolve(this.getMatchingFragmentResults(r,o,a))}else i.resolve([])})}else{let e=mw.Title.newFromText(t);d.get({action:"query",formatversion:"2",gaplimit:20,gapnamespace:e?.getNamespaceId()??0,gapprefix:e?.getMainText()??t,generator:"allpages",prop:["info","pageprops"]}).catch(()=>null).then(a=>{a?.query?i.resolve(a.query.pages.filter(s=>s.title!==this.pageTitleParsed.getPrefixedText()).map(s=>({data:s.title,label:new OO.ui.HtmlSnippet(`${s.title}${s.pageprops&&"disambiguation"in s.pageprops?" <i>(disambiguation)</i>":""}${"redirect"in s?" <i>(redirect)</i>":""}`)}))):i.resolve([])})}return i.promise({abort(){}})};getLookupCacheDataFromResponse=t=>t??[];getLookupMenuOptionsFromData=t=>t.map(({data:i,label:e})=>new OO.ui.MenuOptionWidget({data:i,label:e}));getMatchingFragmentResults=(t,i,e)=>{let a=t.filter(({fragment:l})=>l.toLowerCase().startsWith(e)),s=new Set(a.map(({fragment:l})=>l.toLowerCase())),r=i.filter(({fragment:l})=>l.toLowerCase().startsWith(e)&&!s.has(l.toLowerCase())),o=a.map(({result:l})=>l),n=r.map(({result:l})=>l);return[...o,...n]}};Object.assign(v.prototype,OO.ui.mixin.LookupElement.prototype)});var M={};L(M,{default:()=>R});var R,F=y(()=>{"use strict";T();D();A();W();B();R=class{REDIRECT_REGEX=/^#.*?:?\s*\[\[\s*:?([^[\]{|}]+?)\s*(?:\|[^[\]{|}]+)?\]\]\s*/;SCRIPT_MESSAGE=" (via [[w:en:User:Eejit43/scripts/redirect-helper|redirect-helper]])";redirectTemplates;contentText;pageTitle;pageTitleParsed;defaultRedirectTarget;doesExist;config;isOnEnwiki;needsCheck=!0;editorBox;syncWithSubjectPageButton;syncWithRootPageButton;redirectInput;redirectInputLayout;tagSelect;tagSelectLayout;templateParametersEditor;templateEditorsInfo=[];categorySelect;categorySelectInput;categorySelectLayout;defaultSortInput;defaultSortSuggestButton;defaultSortInputLayout;summaryInput;summaryInputLayout;submitButton;showChangesButton;showPreviewButton;syncTalkCheckbox;syncTalkCheckboxLayout;watchCheckbox;watchCheckboxLayout;patrolCheckbox;patrolCheckboxLayout;submitLayout;submissionWarnings;autoFixAllButton;talkData;pageContent="";oldRedirectTarget;oldRedirectTags;oldRedirectTagData;oldDefaultSort;oldCategories;oldStrayText;parsedDestination;constructor({redirectTemplates:t,contentText:i,pageTitle:e,pageTitleParsed:a,defaultRedirectTarget:s},r,o,n){this.redirectTemplates=t,this.contentText=i,this.pageTitle=e,this.pageTitleParsed=a,this.defaultRedirectTarget=s,this.doesExist=r,this.config=o,this.isOnEnwiki=n}async load(){this.editorBox=new OO.ui.PanelLayout({id:"redirect-helper-box",padded:!0,expanded:!1,framed:!0}),this.pageTitleParsed.isTalkPage()&&((await d.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getSubjectPage().getPrefixedText()})).query.pages[0].redirect?await this.loadSyncWithSubjectPageButton():this.pageTitleParsed.getPrefixedText().includes("/")&&(await d.get({action:"query",formatversion:"2",prop:"info",titles:this.pageTitleParsed.getPrefixedText().split("/")[0]})).query.pages[0].redirect&&await this.loadSyncWithRootPageButton()),this.loadInputElements(),await this.loadSubmitElements(),this.defaultRedirectTarget&&this.redirectInput.setValue(this.defaultRedirectTarget),this.editorBox.$element[0].append(...[this.syncWithSubjectPageButton?.$element[0],this.syncWithRootPageButton?.$element[0],this.redirectInputLayout.$element[0],this.isOnEnwiki?this.tagSelectLayout.$element[0]:null,this.isOnEnwiki?this.templateParametersEditor:null,this.defaultSortInputLayout.$element[0],this.categorySelectLayout.$element[0],this.summaryInputLayout.$element[0],this.submitLayout.$element[0],this.submissionWarnings,this.autoFixAllButton.$element[0]].filter(Boolean)),this.contentText.prepend(this.editorBox.$element[0]),this.doesExist&&this.loadExistingData()}async loadSyncWithSubjectPageButton(){let t=await b(this.pageTitleParsed.getSubjectPage().getPrefixedText())??"";this.syncWithSubjectPageButton=new OO.ui.ButtonWidget({label:"Sync with subject page",icon:"link",flags:["progressive"]}),this.syncWithSubjectPageButton.on("click",()=>{let i=this.REDIRECT_REGEX.exec(t)?.[1];if(!i)return mw.notify("Failed to parse subject page content!",{type:"error"});this.redirectInput.setValue(mw.Title.newFromText(i)?.getTalkPage()?.getPrefixedText()??"");let e=["R from move",...this.redirectTemplates["R from move"].aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(t));this.tagSelect.setValue(e?["R from move"]:[])})}async loadSyncWithRootPageButton(){let t=this.pageTitleParsed.getPrefixedText().split("/"),i=t.slice(1).join("/"),e=await b(t[0])??"";this.syncWithRootPageButton=new OO.ui.ButtonWidget({label:"Sync with root page",icon:"link",flags:["progressive"]}),this.syncWithRootPageButton.on("click",()=>{let a=this.REDIRECT_REGEX.exec(e)?.[1];if(!a)return mw.notify("Failed to parse root page content!",{type:"error"});let s=mw.Title.newFromText(a)?.getPrefixedText();this.redirectInput.setValue(s?`${s}/${i}`:"");let r=["R from move",...this.redirectTemplates["R from move"].aliases].some(o=>new RegExp(`{{\\s*[${o[0].toLowerCase()}${o[0]}]${o.slice(1)}\\s*(\\||}})`).test(e));this.tagSelect.setValue(r?["R from move"]:[])})}loadInputElements(){this.redirectInput=new v({placeholder:"Target page name",required:!0},this.pageTitleParsed),this.redirectInput.on("change",()=>{let e=this.redirectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^:/,""),e.length>0?(this.redirectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," ")),this.defaultSortSuggestButton.setDisabled(!1),this.submitButton.setDisabled(!1),this.showPreviewButton.setDisabled(!1),this.showChangesButton.setDisabled(!1)):(this.defaultSortSuggestButton.setDisabled(!0),this.submitButton.setDisabled(!0),this.showPreviewButton.setDisabled(!0),this.showChangesButton.setDisabled(!0)),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.redirectInputLayout=new OO.ui.FieldLayout(this.redirectInput,{label:"Redirect target:",classes:["redirect-input-layout"],align:"top"}),this.tagSelect=new OO.ui.MenuTagMultiselectWidget({allowArbitrary:!1,allowReordering:!1,options:Object.entries(this.redirectTemplates).map(([e,{redirect:a}])=>{if(!a)return{data:e,label:e};let s=new OO.ui.HtmlSnippet(`<span class="redirect-helper-redirect-possibilities">${e}</span>`);return{data:e,label:s}})}),this.tagSelect.getMenu().filterMode="substring",this.tagSelect.on("change",e=>{let a=e.map(o=>o.getData()),s=a.toSorted((o,n)=>o.toLowerCase().localeCompare(n.toLowerCase()));if(a.join(";")!==s.join(";")){let o=e.at(-1);this.tagSelect.reorder(o,s.indexOf(o.getData()))}this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0;for(let o of this.templateEditorsInfo)o.details.style.display="none";let r=0;for(let o of this.tagSelect.getValue()){let n=this.templateEditorsInfo.find(l=>l.name===o);n&&(n.details.style.display="block",r++)}t.textContent=`Template parameters (${r>0?`for ${r} template${r>1?"s":""}`:"none to show"})`,i.style.display=r>0?"none":"block"}),this.tagSelectLayout=new OO.ui.FieldLayout(this.tagSelect,{label:"Redirect categorization templates:",classes:["redirect-input-layout"],align:"top"}),this.templateParametersEditor=document.createElement("details"),this.templateParametersEditor.classList.add("redirect-helper-template-parameters-container");let t=document.createElement("summary");t.textContent="Template parameters (none to show)",this.templateParametersEditor.append(t);for(let[e,a]of Object.entries(this.redirectTemplates)){let s=Object.entries(a.parameters);if(s.length===0)continue;let r=document.createElement("details");r.style.display="none";let o=document.createElement("summary");o.textContent=e,r.append(o);let n={name:e,details:r,parameters:[]};for(let[l,p]of s){let h=new OO.ui.TextInputWidget({placeholder:p.default?.toString(),required:p.required});h.on("change",()=>{this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0});let c=new OO.ui.FieldLayout(h,{label:new OO.ui.HtmlSnippet(`${l}${!p.label||l.toLowerCase()===p.label.toLowerCase()?"":` (${p.label})`}${p.description?` (${p.description})`:""} (type: ${p.type}) ${p.suggested?" (suggested)":""}${p.example?` (example: "${p.example}")`:""}`),align:"inline"});r.append(c.$element[0]),n.parameters.push({name:l,aliases:p.aliases,editor:h})}this.templateParametersEditor.append(r),this.templateEditorsInfo.push(n)}let i=document.createElement("div");i.id="redirect-helper-no-templates-message",i.textContent="No templates with parameters to display!",this.templateParametersEditor.append(i),this.defaultSortInput=new OO.ui.TextInputWidget,this.defaultSortInput.on("change",()=>{let e=this.defaultSortInput.getValue();e.length>0&&this.defaultSortInput.setValue(e.replaceAll("_"," ")),this.updateSummary(),this.submitButton.setLabel("Submit"),this.needsCheck=!0}),this.defaultSortSuggestButton=new OO.ui.ButtonWidget({icon:"robot",label:"Suggest",disabled:!0}),this.defaultSortSuggestButton.on("click",()=>{let e=this.pageTitleParsed.getMainText().replace(/ \(.*\)$/,"");if(["R from birth name","R from fictional character","R from band member","R from member","R from person","R from personal name","R from relative","R from spouse"].some(a=>this.tagSelect.getValue().includes(a))){if(!e.includes(" "))return mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"});let a="";if(/ (?:[JS]r.?|[IVX]+)$/.test(e)&&(a=e.slice(e.lastIndexOf(" ")),e=e.slice(0,e.lastIndexOf(" ")),!e.includes(" ")))return e+a;let s=e.slice(e.lastIndexOf(" ")+1).replace(/,$/,"").replace(/O'/,"O"),r=e.slice(0,e.lastIndexOf(" "));this.defaultSortInput.setValue(s+", "+r+a)}else{let a=e.replaceAll("Mr.","Mister").replaceAll("&","And");for(let s of["An","A","The"])if(a.startsWith(s+" ")){a=a.slice(s.length+1)+", "+s;break}a===e?mw.notify("redirect-helper wasn't able to determine a sort key different from the current page title!",{type:"warn"}):this.defaultSortInput.setValue(a)}}),this.defaultSortInputLayout=new OO.ui.ActionFieldLayout(this.defaultSortInput,this.defaultSortSuggestButton,{label:new OO.ui.HtmlSnippet(`Default sort key (DEFAULTSORT) (see <a href="${mw.util.getUrl("Wikipedia:Categorization#Sort keys")}" target="_blank">guideline</a>):`),classes:["redirect-input-layout"],align:"top"}),this.categorySelectInput=new O({placeholder:"Add categories here"}),this.categorySelectInput.on("change",()=>{let e=this.categorySelectInput.getValue();e=e.replace(new RegExp(`^(https?:)?/{2}?${mw.config.get("wgServer").replace(/^\/{2}/,"")}/wiki/`),""),e=e.replace(/^Category:/,""),e.length>0&&this.categorySelectInput.setValue(e[0].toUpperCase()+e.slice(1).replaceAll("_"," "))}),this.categorySelectInput.on("showing-values",e=>{for(let a of e)this.categorySelect.addAllowedValue(a.data)}),this.categorySelect=new OO.ui.TagMultiselectWidget({allowReordering:!1,inputPosition:"outline",inputWidget:this.categorySelectInput}),this.categorySelect.on("change",e=>{let a=e.map(r=>r.getData()),s=a.toSorted((r,o)=>r.toLowerCase().localeCompare(o.toLowerCase()));if(a.join(";")!==s.join(";")){let r=e.at(-1);this.categorySelect.reorder(r,s.indexOf(r.getData()))}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.TextInputWidget,this.summaryInput.on("enter",()=>this.handleSubmitButtonClick()),this.summaryInputLayout=new OO.ui.FieldLayout(this.summaryInput,{id:"redirect-helper-summary-layout",label:"Summary:",classes:["redirect-input-layout"],align:"top"})}async loadSubmitElements(){let t=new OO.ui.WindowManager;document.body.append(t.$element[0]),this.submitButton=new OO.ui.ButtonWidget({label:"Submit",disabled:!0,flags:["progressive"]}),this.submitButton.on("click",()=>this.handleSubmitButtonClick());let i=new S({size:"large"},this.pageTitleParsed);t.addWindows([i]),this.showPreviewButton=new OO.ui.ButtonWidget({label:"Show preview",disabled:!0}),this.showPreviewButton.on("click",()=>{i.setData(this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue())),i.open()});let e=new P({size:"large"});if(t.addWindows([e]),this.showChangesButton=new OO.ui.ButtonWidget({label:"Show changes",disabled:!0}),this.showChangesButton.on("click",async()=>{this.doesExist&&(this.pageContent=await b(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 d.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"})]})),!this.doesExist){let a={};["nochange","preferences"].includes(this.config.createdWatchMethod)?a.indeterminate=!0:this.config.createdWatchMethod==="watch"?a.selected=!0:a.selected=!1,this.watchCheckbox=new OO.ui.CheckboxInputWidget(a),this.watchCheckboxLayout=new OO.ui.Widget({content:[new OO.ui.FieldLayout(this.watchCheckbox,{label:"Watch page",align:"inline"})]})}await this.checkShouldPromptPatrol()&&(this.patrolCheckbox=new OO.ui.CheckboxInputWidget({selected:this.config.patrolByDefault}),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.watchCheckboxLayout,this.patrolCheckboxLayout].filter(Boolean)}),this.submissionWarnings=document.createElement("div"),this.autoFixAllButton=new OO.ui.ButtonWidget({label:"Auto-fix all and resubmit",flags:["progressive"],classes:["redirect-helper-autofix-all-button"]}),this.autoFixAllButton.$element.hide()}async checkShouldPromptPatrol(){let t=document.querySelector("#mwe-pt-mark .mwe-pt-tool-icon");if(t?.click(),t?.click(),mw.config.get("wgNamespaceNumber")!==0)return!1;if(document.querySelector(".patrollink")||document.querySelector("#mwe-pt-mark-as-reviewed-button"))return!0;if(document.querySelector("#mwe-pt-mark-as-unreviewed-button")||!mw.config.get("wgArticleId")||!(await mw.user.getRights()).includes("patrol"))return!1;let e=await d.get({action:"pagetriagelist",page_id:mw.config.get("wgArticleId")});return e.pagetriagelist.pages[0]?.user_name===mw.config.get("wgUserName")||e.pagetriagelist.result!=="success"||e.pagetriagelist.pages.length===0?!1:!Number.parseInt(e.pagetriagelist.pages[0]?.patrol_status)}updateSummary(){let t=this.redirectInput.getValue().trim();if(!t)this.summaryInput.$tabIndexed[0].placeholder="";else if(this.doesExist){let i=this.oldRedirectTarget?.replaceAll("_"," ");i&&(i=i[0].toUpperCase()+i.slice(1));let e=t!==i,a=this.tagSelect.getValue().some(l=>!this.oldRedirectTags.includes(l))||this.oldRedirectTags.some(l=>!this.tagSelect.getValue().includes(l)),s=!1;if(this.oldRedirectTagData){let l=Object.entries(this.redirectTemplates).filter(([,p])=>Object.entries(p.parameters).length>0);for(let[p,h]of l){if(!this.oldRedirectTags.includes(p)||!this.tagSelect.getValue().includes(p))continue;let m=this.oldRedirectTagData[p]??Object.keys(h.parameters).map(g=>[g,""]),f=this.templateEditorsInfo.find(g=>g.name===p);e:for(let g of f.parameters){let k=m.find(w=>w[0]===g.name)?.[1]??"",x=g.editor.getValue().trim();if(k!==x){s=!0;break e}}if(s)break}}let r=this.defaultSortInput.getValue().trim()!==this.oldDefaultSort.replaceAll("_"," "),o=this.categorySelect.getValue().some(l=>!this.oldCategories.includes(l))||this.oldCategories.some(l=>!this.categorySelect.getValue().includes(l)),n=[];e&&n.push(`retarget to [[${t}]]`),a&&n.push(`${this.tagSelect.getValue().length>0&&this.oldRedirectTags.length>0?"change":this.tagSelect.getValue().length>0?"add":"remove"} categorization templates`),s&&n.push("change categorization template arguments"),r&&n.push(`${this.defaultSortInput.getValue().trim().length>0&&this.oldDefaultSort.replaceAll("_"," ").length>0?"change":this.defaultSortInput.getValue().trim().length>0?"add":"remove"} default sort key`),o&&n.push(`${this.categorySelect.getValue().length>0&&this.oldCategories.length>0?"change":this.categorySelect.getValue().length>0?"add":"remove"} categories`),n.length===0&&n.push("perform redirect cleanup"),n[0]=n[0][0].toUpperCase()+n[0].slice(1),n.length>1&&(n[n.length-1]=`and ${n.at(-1)}`),this.summaryInput.$tabIndexed[0].placeholder=n.join(n.length>2?", ":" ")}else this.summaryInput.$tabIndexed[0].placeholder=`Create redirect to [[${t}]]`}async loadExistingData(){this.doesExist&&(this.pageContent=await b(this.pageTitle)??""),this.oldRedirectTarget=this.REDIRECT_REGEX.exec(this.pageContent)?.[1],this.oldRedirectTags=Object.entries(this.redirectTemplates).map(([i,e])=>[i,...e.aliases].some(a=>new RegExp(`{{\\s*[${a[0].toLowerCase()}${a[0]}]${a.slice(1)}\\s*(\\||}})`).test(this.pageContent))?i:null).filter(Boolean).sort((i,e)=>i.toLowerCase().localeCompare(e.toLowerCase()));let t=Object.entries(this.redirectTemplates).flatMap(([i,e])=>[i,...e.aliases]).map(i=>new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\s*(\\||}})`).test(this.pageContent)?i:null).filter(Boolean);this.oldRedirectTagData=Object.fromEntries(t.map(i=>{let e=new RegExp(`{{\\s*[${i[0].toLowerCase()}${i[0]}]${i.slice(1)}\\|?(.*?)\\s*}}`).exec(this.pageContent),a=Object.entries(this.redirectTemplates).find(([o,n])=>[o,...n.aliases].includes(i))?.[0];if(!e?.[1])return null;let r=e[1].split("|").map((o,n)=>{if(!o.includes("="))return[(n+1).toString(),o.trim()];let[l,p]=o.split("=");return[l.trim(),p.trim()]});return[a,r]}).filter(Boolean)),this.oldDefaultSort=this.pageContent.match(/\{\{DEFAULTSORT:.*?\}\}/g)?.at(-1)?.slice(14,-2).trim()??"",this.oldCategories=this.pageContent.match(/\[\[[Cc]ategory:.+?\]\]/g)?.map(i=>i.slice(11,-2)).sort((i,e)=>i.toLowerCase().localeCompare(e.toLowerCase()))??[],this.oldStrayText=[/\{\{short description\|.*?\}\}/i.exec(this.pageContent)?.[0],/\{\{DISPLAYTITLE:.*?\}\}/.exec(this.pageContent)?.[0],/\{\{italic title\|?.*?\}\}/i.exec(this.pageContent)?.[0],/\{\{title language\|.*?\}\}/.exec(this.pageContent)?.[0],/\{\{authority control(?:\|.*?)?\}\}/i.exec(this.pageContent)?.[0]].filter(Boolean).join(`
`),this.defaultRedirectTarget||(this.oldRedirectTarget?this.redirectInput.setValue(this.oldRedirectTarget.replaceAll("_"," ")):mw.notify("redirect-helper: Could not find redirect target!",{type:"error"})),this.tagSelect.setValue(this.oldRedirectTags);for(let[i,e]of Object.entries(this.oldRedirectTagData)){let a=this.templateEditorsInfo.find(s=>s.name===i);if(a)for(let[s,r]of e){let o=a.parameters.find(n=>[n.name,...n.aliases].includes(s));o&&o.editor.setValue(r)}}this.oldDefaultSort&&this.defaultSortInput.setValue(this.oldDefaultSort);for(let i of this.oldCategories)this.categorySelect.addAllowedValue(i),this.categorySelectInput.validCategories.add(i);this.categorySelect.setValue(this.oldCategories.map(i=>({data:i,label:i}))),this.updateSummary()}async validateSubmission(){let t=[],i=this.redirectInput.getValue().trim(),e=this.tagSelect.getValue();/^[^[\]{|}]+$/.test(i)||t.push({title:i,message:"is not a valid page title!"});try{this.parsedDestination=mw.Title.newFromText(i)}catch{t.length===0&&t.push({title:i,message:"is not a valid page title!"})}!this.parsedDestination&&t.length===0&&t.push({title:i,message:"is not a valid page title!"}),this.parsedDestination.getPrefixedText()===this.pageTitleParsed.getPrefixedText()&&t.push({message:"cannot redirect to itself!"});let a=await d.get({action:"query",formatversion:"2",prop:["pageprops","categories"],cllimit:"max",titles:i}).catch(c=>(t.push({title:i,message:`was not able to be fetched from the API (${c})!`}),null));if(a?.query.pages[0].missing&&t.push({title:i,message:"does not exist!"}),!a||a.query.pages[0].missing)return t;let s=await d.get({action:"parse",page:i,prop:["text","tocdata"],redirects:!0}).catch(c=>(t.push({title:i,message:`was not able to be parsed by the API (${c})!`}),null));if(!s)return t;if(s.parse.redirects.length>0){let c=s.parse.redirects[0].to+(s.parse.redirects[0].tofragment?`#${s.parse.redirects[0].tofragment}`:"");t.push({title:i,message:`is a redirect to <a href="${mw.util.getUrl(c)}" target="_blank">${c}</a>. Retarget to that page instead, as double redirects aren't allowed.`,autoFixes:[{type:"change-target",target:c}]})}if(i.split("#").length>1){let c=this.parsedDestination.getFragment()??i.split("#").slice(1).join("#"),m=s.parse.tocdata.sections.map(w=>w.line.replaceAll(/<\/?i>/g,"")),f=new Set(m),g=I(s.parse.text["*"],s.parse.title).filter(({fragment:w})=>!f.has(w)).map(({fragment:w})=>w),k=m.includes(c),x=g.includes(c);k?(e.includes("R to anchor")&&t.push({message:"is tagged as a redirect to an anchor, but it is actually a redirect to a section!",autoFixes:[{type:"add",tag:"R to section"},{type:"remove",tag:"R to anchor"}]}),e.includes("R to section")||t.push({message:"is a redirect to a section, but it is not tagged with <code>{{R to section}}</code>!",autoFixes:[{type:"add",tag:"R to section"}]})):x?(e.includes("R to section")&&t.push({message:"is tagged as a redirect to a section, but it is actually a redirect to an anchor!",autoFixes:[{type:"add",tag:"R to anchor"},{type:"remove",tag:"R to section"}]}),e.includes("R to anchor")||t.push({message:"is a redirect to an anchor, but it is not tagged with <code>{{R to anchor}}</code>!",autoFixes:[{type:"add",tag:"R to anchor"}]})):t.push({message:`is a redirect to <a href="${mw.util.getUrl(i)}" target="_blank">${i}</a>, but that section or anchor does not exist!`})}if(i.split("#").length===1)for(let c of["R to section","R to anchor"])e.includes(c)&&t.push({message:`is not a redirect to a section/anchor, but it is tagged with <code>{{${c}}}</code>!`,autoFixes:[{type:"remove",tag:c}]});let r=!!(a.query.pages[0].pageprops&&"disambiguation"in a.query.pages[0].pageprops),o=!!a.query.pages[0].categories?.some(c=>c.title==="Category:Surnames"),n=["R to disambiguation page","R from incomplete disambiguation"],l=["R from ambiguous sort name","R from ambiguous term"],p=n.some(c=>e.includes(c)),h=l.some(c=>e.includes(c));r&&!p&&!h&&t.push({message:"is a redirect to a disambiguation page, but it is not tagged with a disambiguation categorization template!"}),!r&&a.query.pages[0].pageprops&&((!o&&(p||h)||o&&p)&&t.push({message:"is not a redirect to a disambiguation page, but it is tagged with a disambiguation categorization template!",autoFixes:[...n,...l].map(c=>({type:"remove",tag:c}))}),o&&!h&&t.push({message:"is a redirect to a surname list, but it is not tagged with a correct disambiguation categorization template!"})),r&&e.includes("R to disambiguation page")&&!this.pageTitleParsed.getMainText().endsWith(" (disambiguation)")&&t.push({message:'is tagged with <code>{{R to disambiguation page}}</code>, but this title does not end with " (disambiguation)". Use <code>{{R from ambiguous term}}</code> or a similar categorization template instead!',autoFixes:[{type:"remove",tag:"R to disambiguation page"}]});for(let c of["R protected","R protected/semi","R protected/excon","R protected/template","R protected/full"])e.includes(c)&&t.push({message:`is tagged with unnecessarily tagged with <code>{{${c}}}</code> which will be duplicated by the redirect category shell!`,autoFixes:[{type:"remove",tag:c}]});mw.config.get("wgWikibaseItemId")&&!e.includes("R with Wikidata item")&&t.push({message:"is linked to a Wikidata item but it isn't tagged with <code>{{R with Wikidata item}}</code>!",autoFixes:[{type:"add",tag:"R with Wikidata item"}]}),e.includes("R with Wikidata item")&&!mw.config.get("wgWikibaseItemId")&&t.push({message:"is tagged with <code>{{R with Wikidata item}}</code> but it is not actually linked to a Wikidata item!",autoFixes:[{type:"remove",tag:"R with Wikidata item"}]});for(let c of e){if(!(c in this.redirectTemplates))continue;let m=this.redirectTemplates[c];m.namespaceRequirement.some(g=>g==="ALL"?!0:g==="TALK"?this.pageTitleParsed.isTalkPage():this.pageTitleParsed.getNamespaceId()===g)||t.push({message:`is tagged with <code>{{${c}}}</code> but that tag is not valid in this namespace!`,autoFixes:[{type:"remove",tag:c}]});for(let[g,k]of Object.entries(m.parameters)){let x=this.templateEditorsInfo.find(w=>w.name===c)?.parameters.find(w=>[w.name,...w.aliases].includes(g));x&&k.required&&!x.editor.getValue().trim()&&t.push({message:`is tagged with <code>{{${c}}}</code> but it is missing the required parameter <code>${g}</code>!`})}}return this.syncTalkCheckbox?.isSelected()&&!this.talkData.query.pages[0].missing&&!this.talkData.query.pages[0].redirect&&t.push({title:this.pageTitleParsed.getTalkPage().getPrefixedText(),message:"exists, but is not a redirect!"}),t}async handleSubmitButtonClick(){let t=[this.redirectInput,this.tagSelect,...this.templateEditorsInfo.flatMap(r=>r.parameters.map(o=>o.editor)),this.defaultSortInput,this.defaultSortSuggestButton,this.categorySelect,this.summaryInput,this.submitButton,this.showPreviewButton,this.showChangesButton,this.syncTalkCheckbox,this.watchCheckbox,this.patrolCheckbox,this.autoFixAllButton].filter(Boolean);for(let r of t)r.setDisabled(!0);this.submitButton.setLabel("Checking target validity...");let i=[];if(this.needsCheck?i=await this.validateSubmission():this.parsedDestination=mw.Title.newFromText(this.redirectInput.getValue()),i.length>0){this.submissionWarnings.replaceChildren(),this.autoFixAllButton.$element.hide();let r=[];for(let{title:o,message:n,autoFixes:l}of i){let p=new OO.ui.HtmlSnippet(`${o?`<a href="${mw.util.getUrl(o)}" target="_blank">${o}</a>`:"This page"} ${n} Click again without making changes to submit anyway.`),h=new OO.ui.MessageWidget({type:"error",classes:["redirect-helper-warning"],inline:!0,label:p});if(l){let c=new OO.ui.ButtonWidget({label:"Perform auto-fix",flags:["progressive"],classes:["redirect-helper-autofix-button"]}),m=()=>{let f=this.tagSelect.getValue();for(let g of l)g.type==="add"&&!f.includes(g.tag)&&this.tagSelect.addTag(g.tag,g.tag),g.type==="remove"&&f.includes(g.tag)&&this.tagSelect.removeTagByData(g.tag),g.type==="change-target"&&this.redirectInput.setValue(g.target);h.$element[0].style.textDecoration="line-through 2px black",c.$element[0].remove()};r.push(m),c.on("click",m),h.$element[0].querySelector(".oo-ui-labelElement-label").append(c.$element[0])}this.submissionWarnings.append(h.$element[0])}r.length>0&&(this.autoFixAllButton.$element.off("click").on("click",()=>{for(let o of r)o();this.handleSubmitButtonClick()}),this.autoFixAllButton.$element.show());for(let o of t)o.setDisabled(!1);this.submitButton.setLabel("Submit anyway"),this.needsCheck=!1;return}this.submitButton.setLabel(`${this.doesExist?"Editing":"Creating"} redirect...`);let e=this.createOutput(this.redirectInput.getValue(),this.tagSelect.getValue(),this.oldStrayText,this.defaultSortInput.getValue(),this.categorySelect.getValue()),a=(this.summaryInput.getValue()||this.summaryInput.$tabIndexed[0].placeholder)+this.SCRIPT_MESSAGE;if(await this.editOrCreate(this.pageTitle,e,a)){if(mw.notify(`Redirect ${this.doesExist?"edited":"created"} successfully!`,{type:"success"}),this.syncTalkCheckbox?.isSelected()){this.submitButton.setLabel("Editing talk page...");let r=this.tagSelect.getValue().includes("R from move"),o=this.createOutput(this.parsedDestination.getTalkPage().getPrefixedText(),r?["R from move"]:[],void 0,void 0,[]);if(!await this.editOrCreate(this.pageTitleParsed.getTalkPage().getPrefixedText(),o,"Syncing redirect from subject page"+this.SCRIPT_MESSAGE))return;mw.notify("Talk page synced successfully!",{type:"success"})}if(this.patrolCheckbox?.isSelected()){this.submitButton.setLabel("Patrolling redirect...");let r=document.querySelector(".patrollink a"),o=document.querySelector("#mwe-pt-mark-as-reviewed-button");r?await d.postWithToken("patrol",{action:"patrol",rcid:new URL(r.href).searchParams.get("rcid")}).catch((l,p)=>(mw.notify(`Error patrolling ${this.pageTitle} via API: ${p?.error?.info??"Unknown error"} (${l})`,{type:"error"}),null))&&mw.notify("Redirect patrolled successfully!",{type:"success"}):o?(o.click(),mw.notify("Redirect patrolled successfully!",{type:"success"})):mw.notify("Page curation toolbar not found, redirect cannot be patrolled!",{type:"error"})}this.submitButton.setLabel("Complete, reloading..."),window.location.assign(mw.util.getUrl(this.pageTitle,{redirect:"no"}))}}createOutput(t,i,e,a,s){let r=mw.Title.newFromText(t),o=r?`${r.getNamespaceId()===6||r.getNamespaceId()===14?":":""}${r.getPrefixedText()}${r.getFragment()?`#${r.getFragment()}`:""}`:t.trim();this.pageTitleParsed.getMainText().toLocaleLowerCase().normalize("NFD").replaceAll(/[\u{300}-\u{36F}]/gu,"")===a?.toLowerCase().normalize("NFD").replaceAll(/[\u{300}-\u{36F}]/gu,"")&&(a=void 0);let n=i.map(l=>{let p=this.templateEditorsInfo.find(m=>m.name===l);if(!p)return`{{${l}}}`;let h=p.parameters.findLastIndex((m,f)=>m.name===(f+1).toString()&&m.editor.getValue().trim()),c=p.parameters.map((m,f)=>{let g=m.editor.getValue().trim();return!g&&f>h?null:`|${m.name===(f+1).toString()?"":`${m.name}=`}${g}`}).filter(Boolean).join("");return`{{${l}${c}}}`});return[`#REDIRECT [[${o}]]
`,i.length>0?`{{Redirect category shell|
${n.join(`
`)}
}}
`:null,e?e+`
`:null,a?`{{DEFAULTSORT:${a.trim()}}}`:null,s.length>0?s.map(l=>`[[Category:${l}]]`).join(`
`):null].filter(Boolean).join(`
`)}async editOrCreate(t,i,e){let a="preferences";return this.watchCheckbox&&(this.watchCheckbox.isIndeterminate()?a=this.config.createdWatchMethod:this.watchCheckbox.isSelected()?a="watch":a="unwatch"),await d.edit(t,()=>({text:i,summary:e})).catch((s,r)=>s==="nocreate-missing"?d.create(t,{summary:e,watchlist:a},i).catch((o,n)=>(mw.notify(`Error creating ${t}: ${n?.error?.info??"Unknown error"} (${o})`,{type:"error"}),null)):(mw.notify(`Error editing or creating ${t}: ${r?.error?.info??"Unknown error"} (${s})`,{type:"error"}),null))}}});var V={};L(V,{default:()=>C});var C,j=y(()=>{"use strict";C=class u extends OO.ui.ProcessDialog{pageTitleParsed;titleInputElement;constructor(t){super(),this.pageTitleParsed=t,u.static.name="RedirectPageHereDialog",u.static.title="Redirect page here",u.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"create",label:"Create",flags:["primary","progressive"]}]}getSetupProcess=()=>u.super.prototype.getSetupProcess.call(this).next(()=>{let t=new OO.ui.PanelLayout({padded:!0,expanded:!1});this.titleInputElement=new OO.ui.TextInputWidget,this.titleInputElement.on("enter",()=>this.executeAction("create"));let i=new OO.ui.FieldLayout(this.titleInputElement,{label:new OO.ui.HtmlSnippet("<b>Page to redirect here:</b>"),align:"top",help:'This title will be opened in a new tab upon clicking "Create", where the editor will automatically open and be targeting the current title.',helpInline:!0});t.$element.append(i.$element),this.$body.append(t.$element)});getActionProcess=t=>{switch(t){case"create":return new OO.ui.Process(()=>{let i=this.titleInputElement.getValue().trim(),e=mw.Title.newFromText(i);if(!e){mw.notify("Invalid title. Please enter a valid page title.",{type:"error"});return}e.getFragment()&&(mw.notify("The title cannot contain a fragment, this will be ignored.",{type:"warn"}),e=mw.Title.newFromText(e.getPrefixedText()));let a=e.getUrl({redirect:"no",redirectHelperTarget:this.pageTitleParsed.getPrefixedText()});this.close(),window.open(a,"_blank")});case"cancel":return new OO.ui.Process(()=>{this.close()});default:return u.super.prototype.getActionProcess.call(this,t)}};getTeardownProcess=()=>u.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()})};Object.assign(C.prototype,OO.ui.ProcessDialog.prototype)});T();var E=`#create-redirect-button{margin-bottom:20px}#redirect-helper-box{width:700px;max-width:calc(100% - 50px);margin-right:auto;margin-bottom:25px!important;margin-left:auto;color:#202122;color:var(--color-base, #202122);background-color:#f8f9fa;background-color:var(--background-color-neutral-subtle, #f8f9fa)}.redirect-input-layout label{font-weight:700}.redirect-helper-redirect-possibilities:after{font-style:italic;content:" (redirect with possibilities)"}.redirect-helper-template-parameters-container{margin-top:10px;margin-bottom:10px;padding:5px;background-color:#eaecf0;background-color:var(--background-color-interactive, #eaecf0);border-radius:5px}.redirect-helper-template-parameters-container summary{font-weight:700;cursor:pointer}.redirect-helper-template-parameters-container details{margin-top:5px;margin-bottom:5px;padding:5px;background-color:#dadde3;background-color:var(--background-color-interactive--hover, #dadde3);border-radius:5px}#redirect-helper-no-templates-message{padding:5px}#redirect-helper-summary-layout{margin-top:15px;padding-top:10px;border-top:1px solid #a2a9b1;border-top:1px solid var(--border-color-base, #a2a9b1)}#redirect-helper-submit-layout{margin-top:10px}#redirect-helper-submit-layout>*{margin-bottom:0}.redirect-helper-warning{margin-top:8px}.redirect-helper-autofix-button{margin-left:5px;font-size:12px}.redirect-helper-autofix-button a{min-height:0!important;min-height:initial!important;padding:3px 4px!important}.redirect-helper-autofix-all-button{margin-top:8px}
`;var Q=["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows","oojs-ui.styles.icons-content","oojs-ui.styles.icons-editing-core"];mw.loader.using(Q,async()=>{let{default:u}=await Promise.resolve().then(()=>(F(),M)),{default:t}=await Promise.resolve().then(()=>(j(),V));class i{redirectTemplates;contentText;pageTitle;pageTitleParsed;config;isOnEnwiki=mw.config.get("wgDBname")==="enwiki";isMissing=mw.config.get("wgArticleId")===0;isRedirect=mw.config.get("wgIsRedirect");async run(){this.pageTitle=mw.config.get("wgPageName");let a=mw.Title.newFromText(this.pageTitle);if(!a)return mw.notify("redirect-helper: Failed to parse page title!",{type:"error"});if(this.pageTitleParsed=a,!this.passesPreChecks()){this.loadRedirectPageHere();return}this.redirectTemplates=await this.fetchRedirectTemplates();let s=document.querySelector("#mw-content-text");if(!s)return mw.notify("redirect-helper: Failed to find content text element!",{type:"error"});this.contentText=s;let r=window.redirectHelperConfiguration,o=r?.createdWatchMethod&&["nochange","preferences","unwatch","watch"].includes(r.createdWatchMethod)?r.createdWatchMethod:"preferences",n=!(r&&"patrolByDefault"in r&&r.patrolByDefault===!1);this.config={createdWatchMethod:o,patrolByDefault:n},this.checkPageAndLoad()}passesPreChecks(){return[mw.config.get("wgNamespaceNumber")>=0,mw.config.get("wgIsProbablyEditable"),mw.config.get("wgAction")==="view"||mw.config.get("wgAction")==="edit",(mw.config.get("wgRevisionId")||mw.config.get("wgCurRevisionId"))===mw.config.get("wgCurRevisionId"),!mw.config.get("wgDiffOldId")].every(Boolean)}async fetchRedirectTemplates(){return this.isOnEnwiki?JSON.parse(await b("User:Eejit43/scripts/redirect-helper.json")??"{}"):{}}checkPageAndLoad(){mw.util.addCSS(E);let a={redirectTemplates:this.redirectTemplates,contentText:this.contentText,pageTitle:this.pageTitle,pageTitleParsed:this.pageTitleParsed},s=!1,r=new URLSearchParams(window.location.search).get("redirectHelperTarget");if(r){let o=mw.Title.newFromText(r);o?(new u({...a,defaultRedirectTarget:o.getPrefixedText()},!this.isMissing,this.config,this.isOnEnwiki).load(),s=!0):mw.notify("redirect-helper: Invalid redirect target specified in URL.",{type:"error"})}if(!s)if(this.isMissing){let o=new OO.ui.ButtonWidget({id:"create-redirect-button",label:"Create redirect",icon:"articleRedirect",flags:["progressive"]});o.on("click",()=>{o.$element[0].remove(),new u(a,!1,this.config,this.isOnEnwiki).load()}),this.contentText.prepend(o.$element[0])}else if(this.isRedirect)new u(a,!0,this.config,this.isOnEnwiki).load();else{let o=mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-tb":"p-cactions","#","Redirect page","redirect-helper");o.addEventListener("click",n=>{n.preventDefault(),new u(a,!1,this.config,this.isOnEnwiki).load(),window.scrollTo({top:0,behavior:"smooth"}),o.remove()})}this.loadRedirectPageHere()}loadRedirectPageHere(){if(this.isMissing||this.isRedirect)return;mw.util.addPortletLink((mw.config.get("skin")==="minerva","p-cactions"),"#","Redirect page here","redirect-page-here").addEventListener("click",s=>{s.preventDefault();let r=new OO.ui.WindowManager;document.body.append(r.$element[0]);let o=new t(this.pageTitleParsed);r.addWindows([o]),o.open()})}}new i().run()});})();
// </pre>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbGl0eS50cyIsICIuLi9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9jYXRlZ29yeS1pbnB1dC13aWRnZXQudHMiLCAiLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvY2hhbmdlcy1kaWFsb2cudHMiLCAiLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvb3V0cHV0LXByZXZpZXctZGlhbG9nLnRzIiwgIi4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LXRhcmdldC1pbnB1dC13aWRnZXQudHMiLCAiLi4vc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyLWRpYWxvZy50cyIsICIuLi9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC1wYWdlLWhlcmUtZGlhbG9nLnRzIiwgIi4uL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LWhlbHBlci50cyIsICIuLi9zdHlsZXMvcmVkaXJlY3QtaGVscGVyLmNzcyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbE1lc3NhZ2VzUGFyYW1zLCBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS1hcGknO1xuaW1wb3J0IHR5cGUgeyBBbGxNZXNzYWdlc1Jlc3VsdCwgUGFnZVJldmlzaW9uc1Jlc3VsdCB9IGZyb20gJy4vZ2xvYmFsLXR5cGVzJztcblxuZXhwb3J0IGNvbnN0IGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuLyoqXG4gKiBGZXRjaGVzIHRoZSBjb250ZW50IG9mIGEgZ2l2ZW4gcGFnZS5cbiAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgdG8gZmV0Y2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWdlQ29udGVudCh0aXRsZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgIHRpdGxlczogdGl0bGUsXG4gICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICkucXVlcnkucGFnZXNbMF0ucmV2aXNpb25zPy5bMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgc3lzdGVtIG1lc3NhZ2UuXG4gKiBAcGFyYW0gbWVzc2FnZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5c3RlbSBtZXNzYWdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3lzdGVtTWVzc2FnZShtZXNzYWdlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgbWV0YTogJ2FsbG1lc3NhZ2VzJyxcbiAgICAgICAgICAgIGFtbWVzc2FnZXM6IG1lc3NhZ2VOYW1lLFxuICAgICAgICAgICAgYW1sYW5nOiBtdy5jb25maWcuZ2V0KCd3Z0NvbnRlbnRMYW5ndWFnZScpLFxuICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbE1lc3NhZ2VzUGFyYW1zKSkgYXMgQWxsTWVzc2FnZXNSZXN1bHRcbiAgICApLnF1ZXJ5Py5hbGxtZXNzYWdlc1swXS5jb250ZW50O1xufVxuXG4vKipcbiAqIEludGVycG9sYXRlcyBhIHN5c3RlbSBtZXNzYWdlIHdpdGggdmFsdWVzLlxuICogQHBhcmFtIG1lc3NhZ2UgVGhlIHN5c3RlbSBtZXNzYWdlIHRvIGludGVycG9sYXRlLlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHRvIGludGVycG9sYXRlIGludG8gdGhlIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZVN5c3RlbU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCB2YWx1ZXM6IHN0cmluZ1tdKSB7XG4gICAgbGV0IHJlc3VsdCA9IG1lc3NhZ2U7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlQWxsKGAkJHtpbmRleCArIDF9YCwgdmFsdWUpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5QWxsUGFnZXNHZW5lcmF0b3JQYXJhbWV0ZXJzLCBDYXRlZ29yaWVzUmVzdWx0IH0gZnJvbSAnQC9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHsgYXBpIH0gZnJvbSAnQC91dGlsaXR5JztcbmltcG9ydCB0eXBlIHsgTG9va3VwRWxlbWVudENvbmZpZyB9IGZyb20gJ0BzY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC10YXJnZXQtaW5wdXQtd2lkZ2V0JztcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgY2F0ZWdvcnkgbG9va3VwIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhdGVnb3J5SW5wdXRXaWRnZXQgZXh0ZW5kcyBPTy51aS5UZXh0SW5wdXRXaWRnZXQge1xuICAgIHB1YmxpYyB2YWxpZENhdGVnb3JpZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogTG9va3VwRWxlbWVudENvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQuY2FsbCh0aGlzIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uTG9va3VwRWxlbWVudCwgY29uZmlnKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWNsYXNzLW1lbWJlci1vcmRlclxuICAgIGdldExvb2t1cFJlcXVlc3QgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpLnNwbGl0KCd8JylbMF07XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuXG4gICAgICAgIGNvbnN0IHNvcnRLZXkgPSB0aGlzLmdldFZhbHVlKCkuc3BsaXQoJ3wnKVsxXTtcblxuICAgICAgICBpZiAoc29ydEtleSAmJiB0aGlzLnZhbGlkQ2F0ZWdvcmllcy5oYXModmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IFt7IGRhdGE6IGAke3ZhbHVlfXwke3NvcnRLZXl9YCwgbGFiZWw6IGAke3ZhbHVlfSAod2l0aCBzb3J0IGtleSBcIiR7c29ydEtleX1cIilgIH1dO1xuXG4gICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcblxuICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHJlc3BvbnNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgIGFwaS5nZXQoe1xuICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgZ2FwbGltaXQ6IDIwLFxuICAgICAgICAgICAgZ2FwbmFtZXNwYWNlOiAxNCxcbiAgICAgICAgICAgIGdhcHByZWZpeDogcGFyc2VkVGl0bGU/LmdldE1haW5UZXh0KCkgPz8gdmFsdWUsXG4gICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICBwcm9wOiAnY2F0ZWdvcmllcycsXG4gICAgICAgICAgICBjbGxpbWl0OiAnbWF4JyxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgIC50aGVuKChyZXN1bHQ6IENhdGVnb3JpZXNSZXN1bHQgfCBudWxsKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8ucXVlcnk/LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VzID0gcmVzdWx0LnF1ZXJ5LnBhZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhcGFnZS5jYXRlZ29yaWVzPy5zb21lKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkudGl0bGUgPT09ICdDYXRlZ29yeTpXaWtpcGVkaWEgc29mdCByZWRpcmVjdGVkIGNhdGVnb3JpZXMnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKHBhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZVdpdGhvdXROYW1lc3BhY2UgPSBwYWdlLnRpdGxlLnNwbGl0KCc6JylbMV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkQ2F0ZWdvcmllcy5hZGQodGl0bGVXaXRob3V0TmFtZXNwYWNlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSwgbGFiZWw6IHRpdGxlV2l0aG91dE5hbWVzcGFjZSB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdzaG93aW5nLXZhbHVlcycsIHBhZ2VzKTtcblxuICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKHBhZ2VzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgZGVmZXJyZWQucmVzb2x2ZShbXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG59XG5cbk9iamVjdC5hc3NpZ24oQ2F0ZWdvcnlJbnB1dFdpZGdldC5wcm90b3R5cGUsIE9PLnVpLm1peGluLkxvb2t1cEVsZW1lbnQucHJvdG90eXBlKTtcbiIsICJpbXBvcnQgeyBhcGkgfSBmcm9tICdAL3V0aWxpdHknO1xuaW1wb3J0IHR5cGUgeyBBcGlDb21wYXJlUGFnZXNQYXJhbXMgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2ktYXBpJztcblxuLyoqXG4gKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGEgZGlhbG9nIHVzZWQgZm9yIHNob3dpbmcgY2hhbmdlcyB0byBiZSBtYWRlLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDaGFuZ2VzRGlhbG9nIGV4dGVuZHMgT08udWkuUHJvY2Vzc0RpYWxvZyB7XG4gICAgcHJpdmF0ZSBoYXNMb2FkZWREaWZmU3R5bGVzID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihjb25maWc6IE9PLnVpLlByb2Nlc3NEaWFsb2cuQ29uZmlnT3B0aW9ucykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuXG4gICAgICAgIENoYW5nZXNEaWFsb2cuc3RhdGljLm5hbWUgPSAnQ2hhbmdlc0RpYWxvZyc7XG4gICAgICAgIENoYW5nZXNEaWFsb2cuc3RhdGljLnRpdGxlID0gJ0NoYW5nZXMgdG8gYmUgbWFkZSc7XG4gICAgICAgIENoYW5nZXNEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH1dO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtY2xhc3MtbWVtYmVyLW9yZGVyXG4gICAgZ2V0U2V0dXBQcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gQ2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaGFzTG9hZGVkRGlmZlN0eWxlcykge1xuICAgICAgICAgICAgICAgIG13LmxvYWRlci5hZGRMaW5rVGFnKCdodHRwczovL3d3dy5tZWRpYXdpa2kub3JnL3cvbG9hZC5waHA/bW9kdWxlcz1tZWRpYXdpa2kuZGlmZi5zdHlsZXMmb25seT1zdHlsZXMnKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaGFzTG9hZGVkRGlmZlN0eWxlcyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IFtvbGRUZXh0LCBuZXdUZXh0XSA9IHRoaXMuZ2V0RGF0YSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICByZXR1cm4gYXBpXG4gICAgICAgICAgICAgICAgLnBvc3Qoe1xuICAgICAgICAgICAgICAgICAgICAnYWN0aW9uJzogJ2NvbXBhcmUnLFxuICAgICAgICAgICAgICAgICAgICAnZm9ybWF0dmVyc2lvbic6ICcyJyxcbiAgICAgICAgICAgICAgICAgICAgJ3Byb3AnOiBbJ2RpZmYnXSxcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb21zbG90cyc6ICdtYWluJyxcbiAgICAgICAgICAgICAgICAgICAgJ2Zyb210ZXh0LW1haW4nOiBvbGRUZXh0LFxuICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgJ3Rvc2xvdHMnOiAnbWFpbicsXG4gICAgICAgICAgICAgICAgICAgICd0b3RleHQtbWFpbic6IG5ld1RleHQsXG4gICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlDb21wYXJlUGFnZXNQYXJhbXMgJiB7XG4gICAgICAgICAgICAgICAgICAgICdmcm9tdGV4dC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAnZnJvbWNvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAndG90ZXh0LW1haW4nOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICd0b2NvbnRlbnRtb2RlbC1tYWluJzogc3RyaW5nO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJpc29uID0gKHJlc3VsdCBhcyB7IGNvbXBhcmU6IHsgYm9keTogc3RyaW5nIH0gfSkuY29tcGFyZS5ib2R5O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vQ2hhbmdlc0VsZW1lbnQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICd3YXJuaW5nJywgbGFiZWw6ICdObyBjaGFuZ2VzIHRvIG1ha2UhJyB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICBwYW5lbExheW91dC4kZWxlbWVudC5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgXG48dGFibGUgY2xhc3M9XCJkaWZmIGRpZmYtZWRpdGZvbnQtbW9ub3NwYWNlXCI+XG4gICAgPGNvbGdyb3VwPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1tYXJrZXJcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtY29udGVudFwiPlxuICAgICAgICA8Y29sIGNsYXNzPVwiZGlmZi1tYXJrZXJcIj5cbiAgICAgICAgPGNvbCBjbGFzcz1cImRpZmYtY29udGVudFwiPlxuICAgIDwvY29sZ3JvdXA+XG4gICAgPHRib2R5PlxuICAgICAgICAke2NvbXBhcmlzb259XG4gICAgPC90Ym9keT5cbjwvdGFibGU+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbm9DaGFuZ2VzRWxlbWVudC4kZWxlbWVudFswXSxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQocGFuZWxMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICA/IG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogQ2hhbmdlc0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgfTtcblxuICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIENoYW5nZXNEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuT2JqZWN0LmFzc2lnbihDaGFuZ2VzRGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB7IGFwaSB9IGZyb20gJ0AvdXRpbGl0eSc7XG5pbXBvcnQgdHlwZSB7IEFwaVBhcnNlUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpLWFwaSc7XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyB1c2VkIGZvciBwcmV2aWV3aW5nIHRlbXBsYXRlIG91dHB1dC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT3V0cHV0UHJldmlld0RpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcblxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzogT08udWkuUHJvY2Vzc0RpYWxvZy5Db25maWdPcHRpb25zLCBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgdGhpcy5wYWdlVGl0bGVQYXJzZWQgPSBwYWdlVGl0bGVQYXJzZWQ7XG5cbiAgICAgICAgT3V0cHV0UHJldmlld0RpYWxvZy5zdGF0aWMubmFtZSA9ICdPdXRwdXRQcmV2aWV3RGlhbG9nJztcbiAgICAgICAgT3V0cHV0UHJldmlld0RpYWxvZy5zdGF0aWMudGl0bGUgPSAnUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzIHByZXZpZXcnO1xuICAgICAgICBPdXRwdXRQcmV2aWV3RGlhbG9nLnN0YXRpYy5hY3Rpb25zID0gW3sgYWN0aW9uOiAnY2FuY2VsJywgbGFiZWw6ICdDbG9zZScsIGZsYWdzOiBbJ3NhZmUnLCAnY2xvc2UnXSB9XTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWNsYXNzLW1lbWJlci1vcmRlclxuICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIE91dHB1dFByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGFwaVxuICAgICAgICAgICAgICAgIC5wb3N0KHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAncGFyc2UnLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRtb2RlbDogJ3dpa2l0ZXh0JyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcDogWyd0ZXh0JywgJ2NhdGVnb3JpZXNodG1sJ10sXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRQcmVmaXhlZERiKCksXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMuZ2V0RGF0YSgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcylcbiAgICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NDb250ZW50ID0gKHJlc3VsdCBhcyB7IHBhcnNlOiB7IHRleHQ6IHN0cmluZyB9IH0pLnBhcnNlLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhdGVnb3JpZXNDb250ZW50ID0gKHJlc3VsdCBhcyB7IHBhcnNlOiB7IGNhdGVnb3JpZXNodG1sOiBzdHJpbmcgfSB9KS5wYXJzZS5jYXRlZ29yaWVzaHRtbDtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYW5lbExheW91dCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgICAgICBwYW5lbExheW91dC4kZWxlbWVudC5hcHBlbmQodGFnc0NvbnRlbnQsIGNhdGVnb3JpZXNDb250ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQocGFuZWxMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZ2V0QWN0aW9uUHJvY2VzcyA9IChhY3Rpb246IHN0cmluZykgPT4ge1xuICAgICAgICByZXR1cm4gYWN0aW9uXG4gICAgICAgICAgICA/IG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIDogT3V0cHV0UHJldmlld0RpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgfTtcblxuICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIE91dHB1dFByZXZpZXdEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFRlYXJkb3duUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuZW1wdHkoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcbn1cblxuT2JqZWN0LmFzc2lnbihPdXRwdXRQcmV2aWV3RGlhbG9nLnByb3RvdHlwZSwgT08udWkuUHJvY2Vzc0RpYWxvZy5wcm90b3R5cGUpO1xuIiwgImltcG9ydCB0eXBlIHsgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMsIFBhZ2VQYXJzZVJlc3VsdCB9IGZyb20gJ0AvZ2xvYmFsLXR5cGVzJztcbmltcG9ydCB7IGFwaSB9IGZyb20gJ0AvdXRpbGl0eSc7XG5pbXBvcnQgdHlwZSB7IEFwaVBhcnNlUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpLWFwaSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9va3VwRWxlbWVudENvbmZpZyBleHRlbmRzIE9PLnVpLlRleHRJbnB1dFdpZGdldC5Db25maWdPcHRpb25zLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LkNvbmZpZ09wdGlvbnMge31cblxuaW50ZXJmYWNlIFBhZ2VTZWN0aW9uRGF0YSB7XG4gICAgZnJhZ21lbnQ6IHN0cmluZztcbiAgICBpc1NlY3Rpb246IGJvb2xlYW47XG4gICAgcmVzdWx0OiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB8IE9PLnVpLkh0bWxTbmlwcGV0IH07XG59XG5cbmNvbnN0IEFOQ0hPUl9RVUVSSUVTX1RPX1JFTU9WRSA9IFsnZGl2Lm5hdmJveCcsICdvbC5yZWZlcmVuY2VzJ107XG5cbmNvbnN0IEFOQ0hPUl9DTEFTU0VTX1RPX0VYQ0xVREUgPSBbJ2NpdGF0aW9uJywgJ213LWZpbGUtZWxlbWVudCcsICdyZWZlcmVuY2UnXTtcblxuLyoqXG4gKiBHZXRzIHRoZSBhbmNob3JzIGZyb20gdGhlIEhUTUwgb2YgYSBwYWdlLlxuICogQHBhcmFtIGh0bWwgVGhlIEhUTUwgb2YgdGhlIHBhZ2UuXG4gKiBAcGFyYW0gdGl0bGUgVGhlIHRpdGxlIG9mIHRoZSBwYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QW5jaG9yc0Zyb21IdG1sKGh0bWw6IHN0cmluZywgdGl0bGU6IHN0cmluZyk6IFBhZ2VTZWN0aW9uRGF0YVtdIHtcbiAgICBjb25zdCBkb21QYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG5cbiAgICBjb25zdCBkb2N1bWVudCA9IGRvbVBhcnNlci5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpO1xuXG4gICAgZm9yIChjb25zdCBxdWVyeSBvZiBBTkNIT1JfUVVFUklFU19UT19SRU1PVkUpIGZvciAoY29uc3QgZWxlbWVudCBvZiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHF1ZXJ5KSkgZWxlbWVudC5yZW1vdmUoKTtcblxuICAgIGNvbnN0IGFuY2hvcnMgPSBbLi4uZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oJ1tpZF0nKV1cbiAgICAgICAgLm1hcCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgaWYgKEFOQ0hPUl9DTEFTU0VTX1RPX0VYQ0xVREUuc29tZSgoY2xhc3NOYW1lKSA9PiBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjbGFzc05hbWUpKSB8fCAnbXdDb21tZW50U3RhcnQnIGluIGVsZW1lbnQuZGF0YXNldClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBlbGVtZW50LmlkLnJlcGxhY2VBbGwoJ18nLCAnICcpO1xuXG4gICAgICAgICAgICBjb25zdCBmdWxsVGl0bGUgPSBgJHt0aXRsZX0jJHtmcmFnbWVudH1gO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50LFxuICAgICAgICAgICAgICAgIGlzU2VjdGlvbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVzdWx0OiB7IGRhdGE6IGZ1bGxUaXRsZSwgbGFiZWw6IG5ldyBPTy51aS5IdG1sU25pcHBldChgJHtmdWxsVGl0bGV9IDxpPihhbmNob3IpPC9pPmApIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFBhZ2VTZWN0aW9uRGF0YVtdO1xuXG4gICAgcmV0dXJuIGFuY2hvcnM7XG59XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIHRpdGxlIGxvb2t1cCBlbGVtZW50LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0IGV4dGVuZHMgT08udWkuVGV4dElucHV0V2lkZ2V0IHtcbiAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGU7XG5cbiAgICBwcml2YXRlIGtub3duUGFnZVNlY3Rpb25zID0gbmV3IE1hcDxzdHJpbmcsIFBhZ2VTZWN0aW9uRGF0YVtdPigpO1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnOiBMb29rdXBFbGVtZW50Q29uZmlnLCBwYWdlVGl0bGVQYXJzZWQ6IG13LlRpdGxlKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG5cbiAgICAgICAgT08udWkubWl4aW4uTG9va3VwRWxlbWVudC5jYWxsKHRoaXMgYXMgdW5rbm93biBhcyBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LCBjb25maWcpO1xuXG4gICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtY2xhc3MtbWVtYmVyLW9yZGVyXG4gICAgZ2V0TG9va3VwUmVxdWVzdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKCk7XG4gICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgIGlmICghdmFsdWUpIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICBlbHNlIGlmICh2YWx1ZS5pbmNsdWRlcygnIycpKSB7XG4gICAgICAgICAgICBjb25zdCB0aXRsZSA9IHZhbHVlLnNwbGl0KCcjJylbMF07XG4gICAgICAgICAgICBjb25zdCBzZWFyY2hlZEZyYWdtZW50ID0gdmFsdWUuc3BsaXQoJyMnKS5zbGljZSgxKS5qb2luKCcjJykudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMua25vd25QYWdlU2VjdGlvbnMuaGFzKHRpdGxlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25zQW5kRnJhZ21lbnRzID0gdGhpcy5rbm93blBhZ2VTZWN0aW9ucy5nZXQodGl0bGUpITtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHNlY3Rpb25zID0gc2VjdGlvbnNBbmRGcmFnbWVudHMuZmlsdGVyKCh7IGlzU2VjdGlvbiB9KSA9PiBpc1NlY3Rpb24pO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2hvcnMgPSBzZWN0aW9uc0FuZEZyYWdtZW50cy5maWx0ZXIoKHsgaXNTZWN0aW9uIH0pID0+ICFpc1NlY3Rpb24pO1xuXG4gICAgICAgICAgICAgICAgZGVmZXJyZWQucmVzb2x2ZSh0aGlzLmdldE1hdGNoaW5nRnJhZ21lbnRSZXN1bHRzKHNlY3Rpb25zLCBhbmNob3JzLCBzZWFyY2hlZEZyYWdtZW50KSk7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICBhcGkuZ2V0KHsgYWN0aW9uOiAncGFyc2UnLCBwYWdlOiB0aXRsZSwgcHJvcDogWyd0ZXh0JywgJ3RvY2RhdGEnXSwgcmVkaXJlY3RzOiB0cnVlIH0gc2F0aXNmaWVzIEFwaVBhcnNlUGFyYW1zKVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oKHJlc3VsdDogUGFnZVBhcnNlUmVzdWx0IHwgbnVsbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbFNlY3Rpb25zID0gcmVzdWx0LnBhcnNlIS50b2NkYXRhLnNlY3Rpb25zLm1hcCgoc2VjdGlvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmcmFnbWVudCA9IHNlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmdWxsVGl0bGUgPSBgJHtyZXN1bHQucGFyc2UhLnRpdGxlfSMke2ZyYWdtZW50fWA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZnJhZ21lbnQsIGlzU2VjdGlvbjogdHJ1ZSwgcmVzdWx0OiB7IGRhdGE6IGZ1bGxUaXRsZSwgbGFiZWw6IGZ1bGxUaXRsZSB9IH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxBbmNob3JzID0gZ2V0QW5jaG9yc0Zyb21IdG1sKHJlc3VsdC5wYXJzZSEudGV4dFsnKiddLCByZXN1bHQucGFyc2UhLnRpdGxlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMua25vd25QYWdlU2VjdGlvbnMuc2V0KHRpdGxlLCBbLi4uYWxsU2VjdGlvbnMsIC4uLmFsbEFuY2hvcnNdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkLnJlc29sdmUodGhpcy5nZXRNYXRjaGluZ0ZyYWdtZW50UmVzdWx0cyhhbGxTZWN0aW9ucywgYWxsQW5jaG9ycywgc2VhcmNoZWRGcmFnbWVudCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodmFsdWUpO1xuXG4gICAgICAgICAgICBhcGkuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIGdhcGxpbWl0OiAyMCxcbiAgICAgICAgICAgICAgICBnYXBuYW1lc3BhY2U6IHBhcnNlZFRpdGxlPy5nZXROYW1lc3BhY2VJZCgpID8/IDAsXG4gICAgICAgICAgICAgICAgZ2FwcHJlZml4OiBwYXJzZWRUaXRsZT8uZ2V0TWFpblRleHQoKSA/PyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0b3I6ICdhbGxwYWdlcycsXG4gICAgICAgICAgICAgICAgcHJvcDogWydpbmZvJywgJ3BhZ2Vwcm9wcyddLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlBbGxQYWdlc0dlbmVyYXRvclBhcmFtZXRlcnMpXG4gICAgICAgICAgICAgICAgLmNhdGNoKCgpID0+IG51bGwpXG4gICAgICAgICAgICAgICAgLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5OiB7IHBhZ2VzOiB7IHRpdGxlOiBzdHJpbmc7IHBhZ2Vwcm9wcz86IHsgZGlzYW1iaWd1YXRpb24/OiBzdHJpbmcgfTsgcmVkaXJlY3Q/OiBzdHJpbmcgfVtdIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IHwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0Py5xdWVyeSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucXVlcnkucGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+IHBhZ2UudGl0bGUgIT09IHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFByZWZpeGVkVGV4dCgpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBwYWdlLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke3BhZ2UudGl0bGV9JHtwYWdlLnBhZ2Vwcm9wcyAmJiAnZGlzYW1iaWd1YXRpb24nIGluIHBhZ2UucGFnZXByb3BzID8gJyA8aT4oZGlzYW1iaWd1YXRpb24pPC9pPicgOiAnJ30keydyZWRpcmVjdCcgaW4gcGFnZSA/ICcgPGk+KHJlZGlyZWN0KTwvaT4nIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGRlZmVycmVkLnJlc29sdmUoW10pO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVmZXJyZWQucHJvbWlzZSh7IGFib3J0KCkge30gfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXG4gICAgfTtcblxuICAgIGdldExvb2t1cENhY2hlRGF0YUZyb21SZXNwb25zZSA9IDxUPihyZXNwb25zZTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCkgPT4gcmVzcG9uc2UgPz8gW107XG5cbiAgICBnZXRMb29rdXBNZW51T3B0aW9uc0Zyb21EYXRhID0gKGRhdGE6IHsgZGF0YTogc3RyaW5nOyBsYWJlbDogc3RyaW5nIH1bXSkgPT5cbiAgICAgICAgZGF0YS5tYXAoKHsgZGF0YSwgbGFiZWwgfSkgPT4gbmV3IE9PLnVpLk1lbnVPcHRpb25XaWRnZXQoeyBkYXRhLCBsYWJlbCB9KSk7XG5cbiAgICBwcml2YXRlIGdldE1hdGNoaW5nRnJhZ21lbnRSZXN1bHRzID0gKGFsbFNlY3Rpb25zOiBQYWdlU2VjdGlvbkRhdGFbXSwgYWxsQW5jaG9yczogUGFnZVNlY3Rpb25EYXRhW10sIHNlYXJjaGVkRnJhZ21lbnQ6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBtYXRjaGVkU2VjdGlvbnMgPSBhbGxTZWN0aW9ucy5maWx0ZXIoKHsgZnJhZ21lbnQgfSkgPT4gZnJhZ21lbnQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHNlYXJjaGVkRnJhZ21lbnQpKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlZFNlY3Rpb25zU2V0ID0gbmV3IFNldChtYXRjaGVkU2VjdGlvbnMubWFwKCh7IGZyYWdtZW50IH0pID0+IGZyYWdtZW50LnRvTG93ZXJDYXNlKCkpKTtcblxuICAgICAgICBjb25zdCBtYXRjaGVkQW5jaG9ycyA9IGFsbEFuY2hvcnMuZmlsdGVyKFxuICAgICAgICAgICAgKHsgZnJhZ21lbnQgfSkgPT4gZnJhZ21lbnQudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHNlYXJjaGVkRnJhZ21lbnQpICYmICFtYXRjaGVkU2VjdGlvbnNTZXQuaGFzKGZyYWdtZW50LnRvTG93ZXJDYXNlKCkpLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG1hcHBlZE1hdGNoZWRTZWN0aW9ucyA9IG1hdGNoZWRTZWN0aW9ucy5tYXAoKHsgcmVzdWx0IH0pID0+IHJlc3VsdCk7XG5cbiAgICAgICAgY29uc3QgbWFwcGVkTWF0Y2hlZEFuY2hvcnMgPSBtYXRjaGVkQW5jaG9ycy5tYXAoKHsgcmVzdWx0IH0pID0+IHJlc3VsdCk7XG5cbiAgICAgICAgcmV0dXJuIFsuLi5tYXBwZWRNYXRjaGVkU2VjdGlvbnMsIC4uLm1hcHBlZE1hdGNoZWRBbmNob3JzXTtcbiAgICB9O1xufVxuXG5PYmplY3QuYXNzaWduKFJlZGlyZWN0VGFyZ2V0SW5wdXRXaWRnZXQucHJvdG90eXBlLCBPTy51aS5taXhpbi5Mb29rdXBFbGVtZW50LnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHR5cGUge1xuICAgIENhdGVnb3JpZXNSZXN1bHQsXG4gICAgTWVkaWFXaWtpRGF0YUVycm9yLFxuICAgIFBhZ2VJbmZvUmVzdWx0LFxuICAgIFBhZ2VQYXJzZVJlc3VsdCxcbiAgICBQYWdlVHJpYWdlTGlzdFJlc3BvbnNlLFxuICAgIFBhZ2Vwcm9wc1Jlc3VsdCxcbn0gZnJvbSAnQC9nbG9iYWwtdHlwZXMnO1xuaW1wb3J0IHsgYXBpLCBnZXRQYWdlQ29udGVudCB9IGZyb20gJ0AvdXRpbGl0eSc7XG5pbXBvcnQgdHlwZSB7IFdhdGNoTWV0aG9kIH0gZnJvbSAnQHNjcmlwdHMvYWZjcmMtaGVscGVyL2FmY3JjLWhlbHBlcic7XG5pbXBvcnQgQ2F0ZWdvcnlJbnB1dFdpZGdldCBmcm9tICdAc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvY2F0ZWdvcnktaW5wdXQtd2lkZ2V0JztcbmltcG9ydCBDaGFuZ2VzRGlhbG9nIGZyb20gJ0BzY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9jaGFuZ2VzLWRpYWxvZyc7XG5pbXBvcnQgT3V0cHV0UHJldmlld0RpYWxvZyBmcm9tICdAc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvb3V0cHV0LXByZXZpZXctZGlhbG9nJztcbmltcG9ydCB0eXBlIHsgUmVkaXJlY3RIZWxwZXJDb25maWcgfSBmcm9tICdAc2NyaXB0cy9yZWRpcmVjdC1oZWxwZXIvcmVkaXJlY3QtaGVscGVyJztcbmltcG9ydCBSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0LCB7IGdldEFuY2hvcnNGcm9tSHRtbCB9IGZyb20gJ0BzY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC10YXJnZXQtaW5wdXQtd2lkZ2V0JztcbmltcG9ydCB0eXBlIHsgQXBpUGFyc2VQYXJhbXMsIEFwaVF1ZXJ5SW5mb1BhcmFtcywgQXBpUXVlcnlQYWdlUHJvcHNQYXJhbXMsIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS1hcGknO1xuXG5leHBvcnQgdHlwZSBSZWRpcmVjdFRlbXBsYXRlRGF0YSA9IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgeyByZWRpcmVjdD86IHRydWU7IG5hbWVzcGFjZVJlcXVpcmVtZW50OiAobnVtYmVyIHwgc3RyaW5nKVtdOyBwYXJhbWV0ZXJzOiBSZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVyczsgYWxpYXNlczogc3RyaW5nW10gfVxuPjtcblxudHlwZSBSZWRpcmVjdFRlbXBsYXRlUGFyYW1ldGVycyA9IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgICBhbGlhc2VzOiBzdHJpbmdbXTtcbiAgICAgICAgbGFiZWw6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICAgIHJlcXVpcmVkOiBib29sZWFuO1xuICAgICAgICBzdWdnZXN0ZWQ6IGJvb2xlYW47XG4gICAgICAgIGRlZmF1bHQ6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuICAgICAgICBleGFtcGxlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbDtcbiAgICB9XG4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8ge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBkZXRhaWxzOiBIVE1MRGV0YWlsc0VsZW1lbnQ7XG4gICAgcGFyYW1ldGVyczogeyBuYW1lOiBzdHJpbmc7IGFsaWFzZXM6IHN0cmluZ1tdOyBlZGl0b3I6IE9PLnVpLlRleHRJbnB1dFdpZGdldCB9W107XG59XG5cbi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBkaWFsb2cgcG9ydGlvbiBvZiByZWRpcmVjdC1oZWxwZXIgc2NyaXB0LlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWRpcmVjdEhlbHBlckRpYWxvZyB7XG4gICAgLy8gVXRpbGl0eSB2YXJpYWJsZXNcbiAgICBwcml2YXRlIHJlYWRvbmx5IFJFRElSRUNUX1JFR0VYID0gL14jLio/Oj9cXHMqXFxbXFxbXFxzKjo/KFteW1xcXXt8fV0rPylcXHMqKD86XFx8W15bXFxde3x9XSspP1xcXVxcXVxccyovO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgU0NSSVBUX01FU1NBR0UgPSAnICh2aWEgW1t3OmVuOlVzZXI6RWVqaXQ0My9zY3JpcHRzL3JlZGlyZWN0LWhlbHBlcnxyZWRpcmVjdC1oZWxwZXJdXSknO1xuXG4gICAgLy8gQXNzaWduZWQgaW4gY29uc3RydWN0b3JcbiAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICBwcml2YXRlIGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDtcbiAgICBwcml2YXRlIHBhZ2VUaXRsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcbiAgICBwcml2YXRlIGRlZmF1bHRSZWRpcmVjdFRhcmdldD86IHN0cmluZztcblxuICAgIHByaXZhdGUgZG9lc0V4aXN0OiBib29sZWFuO1xuICAgIHByaXZhdGUgY29uZmlnOiBSZWRpcmVjdEhlbHBlckNvbmZpZztcbiAgICBwcml2YXRlIGlzT25Fbndpa2k6IGJvb2xlYW47XG5cbiAgICAvLyBVc2VkIGR1cmluZyBydW4oKVxuICAgIHByaXZhdGUgbmVlZHNDaGVjayA9IHRydWU7XG5cbiAgICBwcml2YXRlIGVkaXRvckJveCE6IE9PLnVpLlBhbmVsTGF5b3V0O1xuICAgIHByaXZhdGUgc3luY1dpdGhTdWJqZWN0UGFnZUJ1dHRvbj86IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIHN5bmNXaXRoUm9vdFBhZ2VCdXR0b24/OiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgcHJpdmF0ZSByZWRpcmVjdElucHV0ITogUmVkaXJlY3RUYXJnZXRJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIHJlZGlyZWN0SW5wdXRMYXlvdXQhOiBPTy51aS5GaWVsZExheW91dDtcbiAgICBwcml2YXRlIHRhZ1NlbGVjdCE6IE9PLnVpLk1lbnVUYWdNdWx0aXNlbGVjdFdpZGdldDtcbiAgICBwcml2YXRlIHRhZ1NlbGVjdExheW91dCE6IE9PLnVpLkFjdGlvbkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgdGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yITogSFRNTERldGFpbHNFbGVtZW50O1xuICAgIHByaXZhdGUgdGVtcGxhdGVFZGl0b3JzSW5mbzogVGVtcGxhdGVFZGl0b3JFbGVtZW50SW5mb1tdID0gW107XG4gICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdCE6IE9PLnVpLlRhZ011bHRpc2VsZWN0V2lkZ2V0O1xuICAgIHByaXZhdGUgY2F0ZWdvcnlTZWxlY3RJbnB1dCE6IENhdGVnb3J5SW5wdXRXaWRnZXQ7XG4gICAgcHJpdmF0ZSBjYXRlZ29yeVNlbGVjdExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgZGVmYXVsdFNvcnRJbnB1dCE6IE9PLnVpLlRleHRJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIGRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIGRlZmF1bHRTb3J0SW5wdXRMYXlvdXQhOiBPTy51aS5BY3Rpb25GaWVsZExheW91dDtcbiAgICBwcml2YXRlIHN1bW1hcnlJbnB1dCE6IE9PLnVpLlRleHRJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIHN1bW1hcnlJbnB1dExheW91dCE6IE9PLnVpLkZpZWxkTGF5b3V0O1xuICAgIHByaXZhdGUgc3VibWl0QnV0dG9uITogT08udWkuQnV0dG9uV2lkZ2V0O1xuICAgIHByaXZhdGUgc2hvd0NoYW5nZXNCdXR0b24hOiBPTy51aS5CdXR0b25XaWRnZXQ7XG4gICAgcHJpdmF0ZSBzaG93UHJldmlld0J1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcbiAgICBwcml2YXRlIHN5bmNUYWxrQ2hlY2tib3g/OiBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgc3luY1RhbGtDaGVja2JveExheW91dD86IE9PLnVpLldpZGdldDtcbiAgICBwcml2YXRlIHdhdGNoQ2hlY2tib3g/OiBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0O1xuICAgIHByaXZhdGUgd2F0Y2hDaGVja2JveExheW91dD86IE9PLnVpLldpZGdldDtcbiAgICBwcml2YXRlIHBhdHJvbENoZWNrYm94PzogT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldDtcbiAgICBwcml2YXRlIHBhdHJvbENoZWNrYm94TGF5b3V0PzogT08udWkuV2lkZ2V0O1xuICAgIHByaXZhdGUgc3VibWl0TGF5b3V0ITogT08udWkuSG9yaXpvbnRhbExheW91dDtcbiAgICBwcml2YXRlIHN1Ym1pc3Npb25XYXJuaW5ncyE6IEhUTUxEaXZFbGVtZW50O1xuICAgIHByaXZhdGUgYXV0b0ZpeEFsbEJ1dHRvbiE6IE9PLnVpLkJ1dHRvbldpZGdldDtcblxuICAgIHByaXZhdGUgdGFsa0RhdGE/OiBQYWdlSW5mb1Jlc3VsdDtcblxuICAgIHByaXZhdGUgcGFnZUNvbnRlbnQgPSAnJztcblxuICAgIHByaXZhdGUgb2xkUmVkaXJlY3RUYXJnZXQ/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvbGRSZWRpcmVjdFRhZ3M/OiBzdHJpbmdbXTtcbiAgICBwcml2YXRlIG9sZFJlZGlyZWN0VGFnRGF0YT86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdW10+O1xuICAgIHByaXZhdGUgb2xkRGVmYXVsdFNvcnQ/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBvbGRDYXRlZ29yaWVzPzogc3RyaW5nW107XG4gICAgcHJpdmF0ZSBvbGRTdHJheVRleHQ/OiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIHBhcnNlZERlc3RpbmF0aW9uITogbXcuVGl0bGUgfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHtcbiAgICAgICAgICAgIHJlZGlyZWN0VGVtcGxhdGVzLFxuICAgICAgICAgICAgY29udGVudFRleHQsXG4gICAgICAgICAgICBwYWdlVGl0bGUsXG4gICAgICAgICAgICBwYWdlVGl0bGVQYXJzZWQsXG4gICAgICAgICAgICBkZWZhdWx0UmVkaXJlY3RUYXJnZXQsXG4gICAgICAgIH06IHtcbiAgICAgICAgICAgIHJlZGlyZWN0VGVtcGxhdGVzOiBSZWRpcmVjdFRlbXBsYXRlRGF0YTtcbiAgICAgICAgICAgIGNvbnRlbnRUZXh0OiBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgICAgIHBhZ2VUaXRsZTogc3RyaW5nO1xuICAgICAgICAgICAgcGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZTtcbiAgICAgICAgICAgIGRlZmF1bHRSZWRpcmVjdFRhcmdldD86IHN0cmluZztcbiAgICAgICAgfSxcbiAgICAgICAgZG9lc0V4aXN0OiBib29sZWFuLFxuICAgICAgICBjb25maWc6IFJlZGlyZWN0SGVscGVyQ29uZmlnLFxuICAgICAgICBpc09uRW53aWtpOiBib29sZWFuLFxuICAgICkge1xuICAgICAgICB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzID0gcmVkaXJlY3RUZW1wbGF0ZXM7XG4gICAgICAgIHRoaXMuY29udGVudFRleHQgPSBjb250ZW50VGV4dDtcbiAgICAgICAgdGhpcy5wYWdlVGl0bGUgPSBwYWdlVGl0bGU7XG4gICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuICAgICAgICB0aGlzLmRlZmF1bHRSZWRpcmVjdFRhcmdldCA9IGRlZmF1bHRSZWRpcmVjdFRhcmdldDtcblxuICAgICAgICB0aGlzLmRvZXNFeGlzdCA9IGRvZXNFeGlzdDtcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcblxuICAgICAgICB0aGlzLmlzT25Fbndpa2kgPSBpc09uRW53aWtpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExvYWRzIHRoZSByZWRpcmVjdC1oZWxwZXIgZGlhbG9nIGludG8gdGhlIHBhZ2UuXG4gICAgICovXG4gICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgLyogTG9hZCBlbGVtZW50cyAqL1xuICAgICAgICB0aGlzLmVkaXRvckJveCA9IG5ldyBPTy51aS5QYW5lbExheW91dCh7IGlkOiAncmVkaXJlY3QtaGVscGVyLWJveCcsIHBhZGRlZDogdHJ1ZSwgZXhwYW5kZWQ6IGZhbHNlLCBmcmFtZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMucGFnZVRpdGxlUGFyc2VkLmlzVGFsa1BhZ2UoKSkge1xuICAgICAgICAgICAgY29uc3Qgc3ViamVjdFBhZ2VEYXRhID0gKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICAgICAgcHJvcDogJ2luZm8nLFxuICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0U3ViamVjdFBhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgaWYgKHN1YmplY3RQYWdlRGF0YS5xdWVyeSEucGFnZXNbMF0ucmVkaXJlY3QpIGF3YWl0IHRoaXMubG9hZFN5bmNXaXRoU3ViamVjdFBhZ2VCdXR0b24oKTtcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFByZWZpeGVkVGV4dCgpLmluY2x1ZGVzKCcvJykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb290UGFnZURhdGEgPSAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgICAgICBwcm9wOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlczogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0UHJlZml4ZWRUZXh0KCkuc3BsaXQoJy8nKVswXSxcbiAgICAgICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUluZm9QYXJhbXMpKSBhcyBQYWdlSW5mb1Jlc3VsdDtcblxuICAgICAgICAgICAgICAgIGlmIChyb290UGFnZURhdGEucXVlcnkhLnBhZ2VzWzBdLnJlZGlyZWN0KSBhd2FpdCB0aGlzLmxvYWRTeW5jV2l0aFJvb3RQYWdlQnV0dG9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRJbnB1dEVsZW1lbnRzKCk7XG4gICAgICAgIGF3YWl0IHRoaXMubG9hZFN1Ym1pdEVsZW1lbnRzKCk7XG5cbiAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFJlZGlyZWN0VGFyZ2V0KSB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUodGhpcy5kZWZhdWx0UmVkaXJlY3RUYXJnZXQpO1xuXG4gICAgICAgIC8qIEFkZCBlbGVtZW50cyB0byBzY3JlZW4gYW5kIGxvYWQgZGF0YSAoaWYgYXBwbGljYWJsZSkgKi9cbiAgICAgICAgdGhpcy5lZGl0b3JCb3guJGVsZW1lbnRbMF0uYXBwZW5kKFxuICAgICAgICAgICAgLi4uKFtcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNXaXRoU3ViamVjdFBhZ2VCdXR0b24/LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuc3luY1dpdGhSb290UGFnZUJ1dHRvbj8uJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuaXNPbkVud2lraSA/IHRoaXMudGFnU2VsZWN0TGF5b3V0LiRlbGVtZW50WzBdIDogbnVsbCxcbiAgICAgICAgICAgICAgICB0aGlzLmlzT25Fbndpa2kgPyB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvciA6IG51bGwsXG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0TGF5b3V0LiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRMYXlvdXQuJGVsZW1lbnRbMF0sXG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXNzaW9uV2FybmluZ3MsXG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvRml4QWxsQnV0dG9uLiRlbGVtZW50WzBdLFxuICAgICAgICAgICAgXS5maWx0ZXIoQm9vbGVhbikgYXMgSFRNTEVsZW1lbnRbXSksXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5jb250ZW50VGV4dC5wcmVwZW5kKHRoaXMuZWRpdG9yQm94LiRlbGVtZW50WzBdKTtcblxuICAgICAgICBpZiAodGhpcy5kb2VzRXhpc3QpIHZvaWQgdGhpcy5sb2FkRXhpc3RpbmdEYXRhKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIFwiU3luYyB3aXRoIHN1YmplY3QgcGFnZVwiIGJ1dHRvblwiIG9uIHRhbGsgcGFnZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkU3luY1dpdGhTdWJqZWN0UGFnZUJ1dHRvbigpIHtcbiAgICAgICAgY29uc3Qgc3ViamVjdFBhZ2VDb250ZW50ID0gKGF3YWl0IGdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFN1YmplY3RQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpKSkgPz8gJyc7XG5cbiAgICAgICAgdGhpcy5zeW5jV2l0aFN1YmplY3RQYWdlQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU3luYyB3aXRoIHN1YmplY3QgcGFnZScsIGljb246ICdsaW5rJywgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSB9KTtcbiAgICAgICAgdGhpcy5zeW5jV2l0aFN1YmplY3RQYWdlQnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuUkVESVJFQ1RfUkVHRVguZXhlYyhzdWJqZWN0UGFnZUNvbnRlbnQpPy5bMV07XG4gICAgICAgICAgICBpZiAoIXRhcmdldCkgcmV0dXJuIG13Lm5vdGlmeSgnRmFpbGVkIHRvIHBhcnNlIHN1YmplY3QgcGFnZSBjb250ZW50IScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcblxuICAgICAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0LnNldFZhbHVlKG13LlRpdGxlLm5ld0Zyb21UZXh0KHRhcmdldCk/LmdldFRhbGtQYWdlKCk/LmdldFByZWZpeGVkVGV4dCgpID8/ICcnKTtcblxuICAgICAgICAgICAgY29uc3QgaXNGcm9tTW92ZSA9IFsnUiBmcm9tIG1vdmUnLCAuLi50aGlzLnJlZGlyZWN0VGVtcGxhdGVzWydSIGZyb20gbW92ZSddLmFsaWFzZXNdLnNvbWUoKHRhZ09yUmVkaXJlY3QpID0+XG4gICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWApLnRlc3QoXG4gICAgICAgICAgICAgICAgICAgIHN1YmplY3RQYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3Quc2V0VmFsdWUoaXNGcm9tTW92ZSA/IFsnUiBmcm9tIG1vdmUnXSA6IFtdKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIFwiU3luYyB3aXRoIHJvb3QgcGFnZVwiIGJ1dHRvbiBvbiBzdWJwYWdlIHRhbGsgcGFnZXMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBsb2FkU3luY1dpdGhSb290UGFnZUJ1dHRvbigpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFRpdGxlU3BsaXQgPSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRQcmVmaXhlZFRleHQoKS5zcGxpdCgnLycpO1xuICAgICAgICBjb25zdCBjdXJyZW50U3VicGFnZSA9IGN1cnJlbnRUaXRsZVNwbGl0LnNsaWNlKDEpLmpvaW4oJy8nKTtcblxuICAgICAgICBjb25zdCByb290UGFnZUNvbnRlbnQgPSAoYXdhaXQgZ2V0UGFnZUNvbnRlbnQoY3VycmVudFRpdGxlU3BsaXRbMF0pKSA/PyAnJztcblxuICAgICAgICB0aGlzLnN5bmNXaXRoUm9vdFBhZ2VCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgbGFiZWw6ICdTeW5jIHdpdGggcm9vdCBwYWdlJywgaWNvbjogJ2xpbmsnLCBmbGFnczogWydwcm9ncmVzc2l2ZSddIH0pO1xuICAgICAgICB0aGlzLnN5bmNXaXRoUm9vdFBhZ2VCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5SRURJUkVDVF9SRUdFWC5leGVjKHJvb3RQYWdlQ29udGVudCk/LlsxXTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm4gbXcubm90aWZ5KCdGYWlsZWQgdG8gcGFyc2Ugcm9vdCBwYWdlIGNvbnRlbnQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgICAgICBjb25zdCB0YXJnZXRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRhcmdldCk/LmdldFByZWZpeGVkVGV4dCgpO1xuXG4gICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUodGFyZ2V0VGl0bGUgPyBgJHt0YXJnZXRUaXRsZX0vJHtjdXJyZW50U3VicGFnZX1gIDogJycpO1xuXG4gICAgICAgICAgICBjb25zdCBpc0Zyb21Nb3ZlID0gWydSIGZyb20gbW92ZScsIC4uLnRoaXMucmVkaXJlY3RUZW1wbGF0ZXNbJ1IgZnJvbSBtb3ZlJ10uYWxpYXNlc10uc29tZSgodGFnT3JSZWRpcmVjdCkgPT5cbiAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGB7e1xcXFxzKlske3RhZ09yUmVkaXJlY3RbMF0udG9Mb3dlckNhc2UoKX0ke3RhZ09yUmVkaXJlY3RbMF19XSR7dGFnT3JSZWRpcmVjdC5zbGljZSgxKX1cXFxccyooXFxcXHx8fX0pYCkudGVzdChcbiAgICAgICAgICAgICAgICAgICAgcm9vdFBhZ2VDb250ZW50LFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5zZXRWYWx1ZShpc0Zyb21Nb3ZlID8gWydSIGZyb20gbW92ZSddIDogW10pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgaW5wdXQgZWxlbWVudHMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsb2FkSW5wdXRFbGVtZW50cygpIHtcbiAgICAgICAgLyogUmVkaXJlY3QgdGFyZ2V0IGlucHV0ICovXG4gICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dCA9IG5ldyBSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0KHsgcGxhY2Vob2xkZXI6ICdUYXJnZXQgcGFnZSBuYW1lJywgcmVxdWlyZWQ6IHRydWUgfSwgdGhpcy5wYWdlVGl0bGVQYXJzZWQpO1xuICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eOi8sICcnKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUodmFsdWVbMF0udG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpLnJlcGxhY2VBbGwoJ18nLCAnICcpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbi5zZXREaXNhYmxlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24uc2V0RGlzYWJsZWQoZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXREaXNhYmxlZCh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uLnNldERpc2FibGVkKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24uc2V0RGlzYWJsZWQodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5yZWRpcmVjdElucHV0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMucmVkaXJlY3RJbnB1dCwge1xuICAgICAgICAgICAgbGFiZWw6ICdSZWRpcmVjdCB0YXJnZXQ6JyxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFJlZGlyZWN0IGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIHNlbGVjdGlvbiAqL1xuICAgICAgICB0aGlzLnRhZ1NlbGVjdCA9IG5ldyBPTy51aS5NZW51VGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dBcmJpdHJhcnk6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIG9wdGlvbnM6IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpLm1hcCgoW3RhZywgeyByZWRpcmVjdCB9XSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghcmVkaXJlY3QpIHJldHVybiB7IGRhdGE6IHRhZywgbGFiZWw6IHRhZyB9O1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQoYDxzcGFuIGNsYXNzPVwicmVkaXJlY3QtaGVscGVyLXJlZGlyZWN0LXBvc3NpYmlsaXRpZXNcIj4ke3RhZ308L3NwYW4+YCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhOiB0YWcsIGxhYmVsIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgfSk7XG4gICAgICAgICh0aGlzLnRhZ1NlbGVjdC5nZXRNZW51KCkgYXMgT08udWkuTWVudVNlbGVjdFdpZGdldC5Db25maWdPcHRpb25zKS5maWx0ZXJNb2RlID0gJ3N1YnN0cmluZyc7XG4gICAgICAgIHRoaXMudGFnU2VsZWN0Lm9uKCdjaGFuZ2UnLCAoc2VsZWN0ZWRFbGVtZW50cykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRUYWdzID0gc2VsZWN0ZWRFbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0RGF0YSgpIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZFRhZ3MgPSBzZWxlY3RlZFRhZ3MudG9Tb3J0ZWQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRUYWdzLmpvaW4oJzsnKSAhPT0gc29ydGVkVGFncy5qb2luKCc7JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMuYXQoLTEpIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uRHJhZ2dhYmxlRWxlbWVudCAmIE9PLnVpLkVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5yZW9yZGVyKGxhc3RFbGVtZW50LCBzb3J0ZWRUYWdzLmluZGV4T2YobGFzdEVsZW1lbnQuZ2V0RGF0YSgpIGFzIHN0cmluZykpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN1bW1hcnkoKTtcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdTdWJtaXQnKTtcbiAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZWRpdG9ySW5mbyBvZiB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8pIGVkaXRvckluZm8uZGV0YWlscy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuXG4gICAgICAgICAgICBsZXQgc2hvd25UZW1wbGF0ZUVkaXRvcnMgPSAwO1xuICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRvckluZm8gPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgoZWRpdG9ySW5mbykgPT4gZWRpdG9ySW5mby5uYW1lID09PSB0YWcpO1xuICAgICAgICAgICAgICAgIGlmICghZWRpdG9ySW5mbykgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBlZGl0b3JJbmZvLmRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgc2hvd25UZW1wbGF0ZUVkaXRvcnMrKztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSBgVGVtcGxhdGUgcGFyYW1ldGVycyAoJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDAgPyBgZm9yICR7c2hvd25UZW1wbGF0ZUVkaXRvcnN9IHRlbXBsYXRlJHtzaG93blRlbXBsYXRlRWRpdG9ycyA+IDEgPyAncycgOiAnJ31gIDogJ25vbmUgdG8gc2hvdyd9KWA7XG5cbiAgICAgICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS5zdHlsZS5kaXNwbGF5ID0gc2hvd25UZW1wbGF0ZUVkaXRvcnMgPiAwID8gJ25vbmUnIDogJ2Jsb2NrJztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50YWdTZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy50YWdTZWxlY3QsIHtcbiAgICAgICAgICAgIGxhYmVsOiAnUmVkaXJlY3QgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzOicsXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3JlZGlyZWN0LWlucHV0LWxheW91dCddLFxuICAgICAgICAgICAgYWxpZ246ICd0b3AnLFxuICAgICAgICB9KTtcblxuICAgICAgICAvKiBSZWRpcmVjdCBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzICovXG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGV0YWlscycpO1xuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5jbGFzc0xpc3QuYWRkKCdyZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXInKTtcblxuICAgICAgICBjb25zdCBzdW1tYXJ5RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgc3VtbWFyeUVsZW1lbnQudGV4dENvbnRlbnQgPSAnVGVtcGxhdGUgcGFyYW1ldGVycyAobm9uZSB0byBzaG93KSc7XG4gICAgICAgIHRoaXMudGVtcGxhdGVQYXJhbWV0ZXJzRWRpdG9yLmFwcGVuZChzdW1tYXJ5RWxlbWVudCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBbdGVtcGxhdGVOYW1lLCB0ZW1wbGF0ZURhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gT2JqZWN0LmVudHJpZXModGVtcGxhdGVEYXRhLnBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RldGFpbHMnKTtcbiAgICAgICAgICAgIGRldGFpbHMuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgICAgICAgY29uc3Qgc3VtbWFyeSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N1bW1hcnknKTtcbiAgICAgICAgICAgIHN1bW1hcnkudGV4dENvbnRlbnQgPSB0ZW1wbGF0ZU5hbWU7XG4gICAgICAgICAgICBkZXRhaWxzLmFwcGVuZChzdW1tYXJ5KTtcblxuICAgICAgICAgICAgY29uc3QgZWxlbWVudERhdGE6IFRlbXBsYXRlRWRpdG9yRWxlbWVudEluZm8gPSB7IG5hbWU6IHRlbXBsYXRlTmFtZSwgZGV0YWlscywgcGFyYW1ldGVyczogW10gfTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyRGF0YV0gb2YgcGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gbmV3IE9PLnVpLlRleHRJbnB1dFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwYXJhbWV0ZXJEYXRhLmRlZmF1bHQ/LnRvU3RyaW5nKCksXG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBwYXJhbWV0ZXJEYXRhLnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlucHV0Lm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0Jyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmVlZHNDaGVjayA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dChpbnB1dCwge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgICAgICAgICAgYCR7cGFyYW1ldGVyTmFtZX0keyFwYXJhbWV0ZXJEYXRhLmxhYmVsIHx8IHBhcmFtZXRlck5hbWUudG9Mb3dlckNhc2UoKSA9PT0gcGFyYW1ldGVyRGF0YS5sYWJlbC50b0xvd2VyQ2FzZSgpID8gJycgOiBgICgke3BhcmFtZXRlckRhdGEubGFiZWx9KWB9JHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9uID8gYCAoJHtwYXJhbWV0ZXJEYXRhLmRlc2NyaXB0aW9ufSlgIDogJyd9ICh0eXBlOiAke3BhcmFtZXRlckRhdGEudHlwZX0pICR7cGFyYW1ldGVyRGF0YS5zdWdnZXN0ZWQgPyAnIChzdWdnZXN0ZWQpJyA6ICcnfSR7cGFyYW1ldGVyRGF0YS5leGFtcGxlID8gYCAoZXhhbXBsZTogXCIke3BhcmFtZXRlckRhdGEuZXhhbXBsZX1cIilgIDogJyd9YCxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ246ICdpbmxpbmUnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRldGFpbHMuYXBwZW5kKGlucHV0TGF5b3V0LiRlbGVtZW50WzBdKTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnREYXRhLnBhcmFtZXRlcnMucHVzaCh7IG5hbWU6IHBhcmFtZXRlck5hbWUsIGFsaWFzZXM6IHBhcmFtZXRlckRhdGEuYWxpYXNlcywgZWRpdG9yOiBpbnB1dCB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZVBhcmFtZXRlcnNFZGl0b3IuYXBwZW5kKGRldGFpbHMpO1xuXG4gICAgICAgICAgICB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8ucHVzaChlbGVtZW50RGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBub1RlbXBsYXRlc01lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgbm9UZW1wbGF0ZXNNZXNzYWdlLmlkID0gJ3JlZGlyZWN0LWhlbHBlci1uby10ZW1wbGF0ZXMtbWVzc2FnZSc7XG4gICAgICAgIG5vVGVtcGxhdGVzTWVzc2FnZS50ZXh0Q29udGVudCA9ICdObyB0ZW1wbGF0ZXMgd2l0aCBwYXJhbWV0ZXJzIHRvIGRpc3BsYXkhJztcblxuICAgICAgICB0aGlzLnRlbXBsYXRlUGFyYW1ldGVyc0VkaXRvci5hcHBlbmQobm9UZW1wbGF0ZXNNZXNzYWdlKTtcblxuICAgICAgICAvKiBERUZBVUxUU09SVCBpbnB1dCAqL1xuICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KCk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5vbignY2hhbmdlJywgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuZ2V0VmFsdWUoKTtcblxuICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA+IDApIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZSh2YWx1ZS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5kZWZhdWx0U29ydFN1Z2dlc3RCdXR0b24gPSBuZXcgT08udWkuQnV0dG9uV2lkZ2V0KHsgaWNvbjogJ3JvYm90JywgbGFiZWw6ICdTdWdnZXN0JywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0TWFpblRleHQoKS5yZXBsYWNlKC8gXFwoLipcXCkkLywgJycpOyAvLyBSZW1vdmUgZGlzYW1iaWd1YXRpb25cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBiaXJ0aCBuYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBmaWN0aW9uYWwgY2hhcmFjdGVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBiYW5kIG1lbWJlcicsXG4gICAgICAgICAgICAgICAgICAgICdSIGZyb20gbWVtYmVyJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBwZXJzb24nLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHBlcnNvbmFsIG5hbWUnLFxuICAgICAgICAgICAgICAgICAgICAnUiBmcm9tIHJlbGF0aXZlJyxcbiAgICAgICAgICAgICAgICAgICAgJ1IgZnJvbSBzcG91c2UnLFxuICAgICAgICAgICAgICAgIF0uc29tZSgodGFnKSA9PiB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGluZyBpcyBtb2RpZmllZCBmcm9tIGV2YWQzNydzIFwiUmF0ZXJcIlxuXG4gICAgICAgICAgICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCcgJykpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtdy5ub3RpZnkoXCJyZWRpcmVjdC1oZWxwZXIgd2Fzbid0IGFibGUgdG8gZGV0ZXJtaW5lIGEgc29ydCBrZXkgZGlmZmVyZW50IGZyb20gdGhlIGN1cnJlbnQgcGFnZSB0aXRsZSFcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm4nLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGxldCBnZW5lcmF0aW9uYWxTdWZmaXggPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoLyAoPzpbSlNdci4/fFtJVlhdKykkLy50ZXN0KG5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25hbFN1ZmZpeCA9IG5hbWUuc2xpY2UobmFtZS5sYXN0SW5kZXhPZignICcpKTtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZignICcpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lLmluY2x1ZGVzKCcgJykpIHJldHVybiBuYW1lICsgZ2VuZXJhdGlvbmFsU3VmZml4O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3ROYW1lID0gbmFtZVxuICAgICAgICAgICAgICAgICAgICAuc2xpY2UobmFtZS5sYXN0SW5kZXhPZignICcpICsgMSlcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLywkLywgJycpXG4gICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9PJy8sICdPJyk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJOYW1lcyA9IG5hbWUuc2xpY2UoMCwgbmFtZS5sYXN0SW5kZXhPZignICcpKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5zZXRWYWx1ZShsYXN0TmFtZSArICcsICcgKyBvdGhlck5hbWVzICsgZ2VuZXJhdGlvbmFsU3VmZml4KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IG5ld05hbWUgPSBuYW1lLnJlcGxhY2VBbGwoJ01yLicsICdNaXN0ZXInKS5yZXBsYWNlQWxsKCcmJywgJ0FuZCcpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsZWFkaW5nQXJ0aWNsZSBvZiBbJ0FuJywgJ0EnLCAnVGhlJ10pXG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lLnN0YXJ0c1dpdGgobGVhZGluZ0FydGljbGUgKyAnICcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOYW1lID0gbmV3TmFtZS5zbGljZShsZWFkaW5nQXJ0aWNsZS5sZW5ndGggKyAxKSArICcsICcgKyBsZWFkaW5nQXJ0aWNsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobmV3TmFtZSA9PT0gbmFtZSlcbiAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KFwicmVkaXJlY3QtaGVscGVyIHdhc24ndCBhYmxlIHRvIGRldGVybWluZSBhIHNvcnQga2V5IGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHBhZ2UgdGl0bGUhXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZWxzZSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUobmV3TmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dExheW91dCA9IG5ldyBPTy51aS5BY3Rpb25GaWVsZExheW91dCh0aGlzLmRlZmF1bHRTb3J0SW5wdXQsIHRoaXMuZGVmYXVsdFNvcnRTdWdnZXN0QnV0dG9uLCB7XG4gICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KFxuICAgICAgICAgICAgICAgIGBEZWZhdWx0IHNvcnQga2V5IChERUZBVUxUU09SVCkgKHNlZSA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybCgnV2lraXBlZGlhOkNhdGVnb3JpemF0aW9uI1NvcnQga2V5cycpfVwiIHRhcmdldD1cIl9ibGFua1wiPmd1aWRlbGluZTwvYT4pOmAsXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogQ2F0ZWdvcmllcyBzZWxlY3Rpb24gKi9cbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0ID0gbmV3IENhdGVnb3J5SW5wdXRXaWRnZXQoeyBwbGFjZWhvbGRlcjogJ0FkZCBjYXRlZ29yaWVzIGhlcmUnIH0pO1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC5nZXRWYWx1ZSgpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKG5ldyBSZWdFeHAoYF4oaHR0cHM/Oik/L3syfT8ke213LmNvbmZpZy5nZXQoJ3dnU2VydmVyJykucmVwbGFjZSgvXlxcL3syfS8sICcnKX0vd2lraS9gKSwgJycpO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eQ2F0ZWdvcnk6LywgJycpO1xuXG4gICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID4gMCkgdGhpcy5jYXRlZ29yeVNlbGVjdElucHV0LnNldFZhbHVlKHZhbHVlWzBdLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zbGljZSgxKS5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQub24oJ3Nob3dpbmctdmFsdWVzJywgKHBhZ2VzOiB7IGRhdGE6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9W10pID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykgdGhpcy5jYXRlZ29yeVNlbGVjdC5hZGRBbGxvd2VkVmFsdWUocGFnZS5kYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QgPSBuZXcgT08udWkuVGFnTXVsdGlzZWxlY3RXaWRnZXQoe1xuICAgICAgICAgICAgYWxsb3dSZW9yZGVyaW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlucHV0UG9zaXRpb246ICdvdXRsaW5lJyxcbiAgICAgICAgICAgIGlucHV0V2lkZ2V0OiB0aGlzLmNhdGVnb3J5U2VsZWN0SW5wdXQsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0Lm9uKCdjaGFuZ2UnLCAoc2VsZWN0ZWRFbGVtZW50cykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRDYXRlZ29yaWVzID0gc2VsZWN0ZWRFbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGVsZW1lbnQuZ2V0RGF0YSgpIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNvcnRlZENhdGVnb3JpZXMgPSBzZWxlY3RlZENhdGVnb3JpZXMudG9Tb3J0ZWQoKGEsIGIpID0+IGEudG9Mb3dlckNhc2UoKS5sb2NhbGVDb21wYXJlKGIudG9Mb3dlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWRDYXRlZ29yaWVzLmpvaW4oJzsnKSAhPT0gc29ydGVkQ2F0ZWdvcmllcy5qb2luKCc7JykpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0RWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHMuYXQoLTEpIGFzIHVua25vd24gYXMgT08udWkubWl4aW4uRHJhZ2dhYmxlRWxlbWVudCAmIE9PLnVpLkVsZW1lbnQ7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LnJlb3JkZXIobGFzdEVsZW1lbnQsIHNvcnRlZENhdGVnb3JpZXMuaW5kZXhPZihsYXN0RWxlbWVudC5nZXREYXRhKCkgYXMgc3RyaW5nKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlU3VtbWFyeSgpO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1N1Ym1pdCcpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gdHJ1ZTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jYXRlZ29yeVNlbGVjdExheW91dCA9IG5ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLmNhdGVnb3J5U2VsZWN0LCB7XG4gICAgICAgICAgICBsYWJlbDogJ0NhdGVnb3JpZXM6JyxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaW5wdXQtbGF5b3V0J10sXG4gICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFN1bW1hcnkgaW5wdXQgKi9cbiAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXQgPSBuZXcgT08udWkuVGV4dElucHV0V2lkZ2V0KCk7XG4gICAgICAgIHRoaXMuc3VtbWFyeUlucHV0Lm9uKCdlbnRlcicsICgpID0+IHRoaXMuaGFuZGxlU3VibWl0QnV0dG9uQ2xpY2soKSk7XG5cbiAgICAgICAgdGhpcy5zdW1tYXJ5SW5wdXRMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5zdW1tYXJ5SW5wdXQsIHtcbiAgICAgICAgICAgIGlkOiAncmVkaXJlY3QtaGVscGVyLXN1bW1hcnktbGF5b3V0JyxcbiAgICAgICAgICAgIGxhYmVsOiAnU3VtbWFyeTonLFxuICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1pbnB1dC1sYXlvdXQnXSxcbiAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgdGhlIGVsZW1lbnRzIGluIHRoZSBzdWJtaXQgYnV0dG9uIHJvdy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGxvYWRTdWJtaXRFbGVtZW50cygpIHtcbiAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHdpbmRvd01hbmFnZXIuJGVsZW1lbnRbMF0pO1xuXG4gICAgICAgIC8qIFNldCB1cCBzdWJtaXQgYnV0dG9uICovXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU3VibWl0JywgZGlzYWJsZWQ6IHRydWUsIGZsYWdzOiBbJ3Byb2dyZXNzaXZlJ10gfSk7XG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLm9uKCdjbGljaycsICgpID0+IHRoaXMuaGFuZGxlU3VibWl0QnV0dG9uQ2xpY2soKSk7XG5cbiAgICAgICAgLyogU2V0IHVwIHNob3cgcHJldmlldyBidXR0b24gKi9cbiAgICAgICAgY29uc3QgdGVtcGxhdGVQcmV2aWV3RGlhbG9nID0gbmV3IE91dHB1dFByZXZpZXdEaWFsb2coeyBzaXplOiAnbGFyZ2UnIH0sIHRoaXMucGFnZVRpdGxlUGFyc2VkKTtcbiAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFt0ZW1wbGF0ZVByZXZpZXdEaWFsb2ddKTtcblxuICAgICAgICB0aGlzLnNob3dQcmV2aWV3QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGxhYmVsOiAnU2hvdyBwcmV2aWV3JywgZGlzYWJsZWQ6IHRydWUgfSk7XG4gICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24ub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGVtcGxhdGVQcmV2aWV3RGlhbG9nLnNldERhdGEoXG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVPdXRwdXQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9sZFN0cmF5VGV4dCxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHRlbXBsYXRlUHJldmlld0RpYWxvZy5vcGVuKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8qIFNldCB1cCBzaG93IGNoYW5nZXMgYnV0dG9uICovXG4gICAgICAgIGNvbnN0IHNob3dDaGFuZ2VzRGlhbG9nID0gbmV3IENoYW5nZXNEaWFsb2coeyBzaXplOiAnbGFyZ2UnIH0pO1xuICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZFdpbmRvd3MoW3Nob3dDaGFuZ2VzRGlhbG9nXSk7XG5cbiAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoeyBsYWJlbDogJ1Nob3cgY2hhbmdlcycsIGRpc2FibGVkOiB0cnVlIH0pO1xuICAgICAgICB0aGlzLnNob3dDaGFuZ2VzQnV0dG9uLm9uKCdjbGljaycsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRvZXNFeGlzdCkgdGhpcy5wYWdlQ29udGVudCA9IChhd2FpdCBnZXRQYWdlQ29udGVudCh0aGlzLnBhZ2VUaXRsZSkpID8/ICcnO1xuXG4gICAgICAgICAgICBzaG93Q2hhbmdlc0RpYWxvZy5zZXREYXRhKFtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50LFxuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbGRTdHJheVRleHQsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgc2hvd0NoYW5nZXNEaWFsb2cub3BlbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvKiBTZXQgdXAgc3luYyB0YWxrIGNoZWNrYm94ICovXG4gICAgICAgIGlmICghdGhpcy5wYWdlVGl0bGVQYXJzZWQuaXNUYWxrUGFnZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnRhbGtEYXRhID0gYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgICAgICBwcm9wOiAnaW5mbycsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRUYWxrUGFnZSgpIS5nZXRQcmVmaXhlZFRleHQoKSxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5SW5mb1BhcmFtcyk7XG4gICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3ggPSBuZXcgT08udWkuQ2hlY2tib3hJbnB1dFdpZGdldCh7IHNlbGVjdGVkOiAhIXRoaXMudGFsa0RhdGEucXVlcnkhLnBhZ2VzWzBdLnJlZGlyZWN0IH0pO1xuXG4gICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQgPSBuZXcgT08udWkuV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuc3luY1RhbGtDaGVja2JveCwgeyBsYWJlbDogJ1N5bmMgdGFsayBwYWdlJywgYWxpZ246ICdpbmxpbmUnIH0pXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2V0IHVwIHdhdGNoIHBhZ2UgY2hlY2tib3ggKi9cbiAgICAgICAgaWYgKCF0aGlzLmRvZXNFeGlzdCkge1xuICAgICAgICAgICAgY29uc3QgY2hlY2tib3hDb25maWc6IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQuQ29uZmlnT3B0aW9ucyA9IHt9O1xuXG4gICAgICAgICAgICBpZiAoWydub2NoYW5nZScsICdwcmVmZXJlbmNlcyddLmluY2x1ZGVzKHRoaXMuY29uZmlnLmNyZWF0ZWRXYXRjaE1ldGhvZCkpIGNoZWNrYm94Q29uZmlnLmluZGV0ZXJtaW5hdGUgPSB0cnVlO1xuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jb25maWcuY3JlYXRlZFdhdGNoTWV0aG9kID09PSAnd2F0Y2gnKSBjaGVja2JveENvbmZpZy5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGNoZWNrYm94Q29uZmlnLnNlbGVjdGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHRoaXMud2F0Y2hDaGVja2JveCA9IG5ldyBPTy51aS5DaGVja2JveElucHV0V2lkZ2V0KGNoZWNrYm94Q29uZmlnKTtcblxuICAgICAgICAgICAgdGhpcy53YXRjaENoZWNrYm94TGF5b3V0ID0gbmV3IE9PLnVpLldpZGdldCh7XG4gICAgICAgICAgICAgICAgY29udGVudDogW25ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLndhdGNoQ2hlY2tib3gsIHsgbGFiZWw6ICdXYXRjaCBwYWdlJywgYWxpZ246ICdpbmxpbmUnIH0pXSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2V0IHVwIHBhdHJvbCBjaGVja2JveCAqL1xuICAgICAgICBpZiAoYXdhaXQgdGhpcy5jaGVja1Nob3VsZFByb21wdFBhdHJvbCgpKSB7XG4gICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94ID0gbmV3IE9PLnVpLkNoZWNrYm94SW5wdXRXaWRnZXQoeyBzZWxlY3RlZDogdGhpcy5jb25maWcucGF0cm9sQnlEZWZhdWx0IH0pO1xuXG4gICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94TGF5b3V0ID0gbmV3IE9PLnVpLldpZGdldCh7XG4gICAgICAgICAgICAgICAgY29udGVudDogW25ldyBPTy51aS5GaWVsZExheW91dCh0aGlzLnBhdHJvbENoZWNrYm94LCB7IGxhYmVsOiAnTWFyayBhcyBwYXRyb2xsZWQnLCBhbGlnbjogJ2lubGluZScgfSldLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBTZXQgdXAgbGF5b3V0ICovXG4gICAgICAgIHRoaXMuc3VibWl0TGF5b3V0ID0gbmV3IE9PLnVpLkhvcml6b250YWxMYXlvdXQoe1xuICAgICAgICAgICAgaWQ6ICdyZWRpcmVjdC1oZWxwZXItc3VibWl0LWxheW91dCcsXG4gICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLFxuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ByZXZpZXdCdXR0b24sXG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2hhbmdlc0J1dHRvbixcbiAgICAgICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3hMYXlvdXQsXG4gICAgICAgICAgICAgICAgdGhpcy53YXRjaENoZWNrYm94TGF5b3V0LFxuICAgICAgICAgICAgICAgIHRoaXMucGF0cm9sQ2hlY2tib3hMYXlvdXQsXG4gICAgICAgICAgICBdLmZpbHRlcihCb29sZWFuKSBhcyBPTy51aS5XaWRnZXRbXSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLyogU2V0IHVwIHN1Ym1pc3Npb24gd2FybmluZ3MgY29udGFpbmVyICovXG4gICAgICAgIHRoaXMuc3VibWlzc2lvbldhcm5pbmdzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgLyogU2V0IHVwIGF1dG8tZml4IGFsbCBidXR0b24gKi9cbiAgICAgICAgdGhpcy5hdXRvRml4QWxsQnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XG4gICAgICAgICAgICBsYWJlbDogJ0F1dG8tZml4IGFsbCBhbmQgcmVzdWJtaXQnLFxuICAgICAgICAgICAgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaGVscGVyLWF1dG9maXgtYWxsLWJ1dHRvbiddLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5hdXRvRml4QWxsQnV0dG9uLiRlbGVtZW50LmhpZGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB1c2VyIHNob3VsZCBiZSBwcm9tcHRlZCB0byBwYXRyb2wgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBjaGVja1Nob3VsZFByb21wdFBhdHJvbCgpIHtcbiAgICAgICAgY29uc3QgcGFnZVRyaWFnZU1hcmtCdXR0b24gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbWFnZUVsZW1lbnQ+KCcjbXdlLXB0LW1hcmsgLm13ZS1wdC10b29sLWljb24nKTtcbiAgICAgICAgcGFnZVRyaWFnZU1hcmtCdXR0b24/LmNsaWNrKCk7XG4gICAgICAgIHBhZ2VUcmlhZ2VNYXJrQnV0dG9uPy5jbGljaygpO1xuXG4gICAgICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpICE9PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGF0cm9sbGluaycpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtd2UtcHQtbWFyay1hcy1yZXZpZXdlZC1idXR0b24nKSkgcmV0dXJuIHRydWU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdW5pY29ybi9wcmVmZXItY29tYmluZWQtZ3VhcmRzXG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbXdlLXB0LW1hcmstYXMtdW5yZXZpZXdlZC1idXR0b24nKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmICghbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSkgcmV0dXJuIGZhbHNlOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vcHJlZmVyLWNvbWJpbmVkLWd1YXJkc1xuICAgICAgICBjb25zdCB1c2VyUGVybWlzc2lvbnMgPSBhd2FpdCBtdy51c2VyLmdldFJpZ2h0cygpO1xuICAgICAgICBpZiAoIXVzZXJQZXJtaXNzaW9ucy5pbmNsdWRlcygncGF0cm9sJykpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBwYXRyb2xSZXNwb25zZSA9IChhd2FpdCBhcGkuZ2V0KHtcbiAgICAgICAgICAgIGFjdGlvbjogJ3BhZ2V0cmlhZ2VsaXN0JyxcbiAgICAgICAgICAgIHBhZ2VfaWQ6IG13LmNvbmZpZy5nZXQoJ3dnQXJ0aWNsZUlkJyksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgICAgIH0gc2F0aXNmaWVzIFBhZ2VUcmlhZ2VBcGlQYWdlVHJpYWdlTGlzdFBhcmFtcykpIGFzIFBhZ2VUcmlhZ2VMaXN0UmVzcG9uc2U7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLXRlcm5hcnlcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXNbMF0/LnVzZXJfbmFtZSA9PT0gbXcuY29uZmlnLmdldCgnd2dVc2VyTmFtZScpIHx8XG4gICAgICAgICAgICBwYXRyb2xSZXNwb25zZS5wYWdldHJpYWdlbGlzdC5yZXN1bHQgIT09ICdzdWNjZXNzJyB8fFxuICAgICAgICAgICAgcGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXMubGVuZ3RoID09PSAwXG4gICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgcmV0dXJuICFOdW1iZXIucGFyc2VJbnQocGF0cm9sUmVzcG9uc2UucGFnZXRyaWFnZWxpc3QucGFnZXNbMF0/LnBhdHJvbF9zdGF0dXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHN1bW1hcnkgaW5wdXQgcGxhY2Vob2xkZXIuXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVTdW1tYXJ5KCkge1xuICAgICAgICBjb25zdCByZWRpcmVjdFZhbHVlID0gdGhpcy5yZWRpcmVjdElucHV0LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgIGlmICghcmVkaXJlY3RWYWx1ZSkgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gJyc7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZG9lc0V4aXN0KSB7XG4gICAgICAgICAgICBsZXQgb2xkVGFyZ2V0ID0gdGhpcy5vbGRSZWRpcmVjdFRhcmdldD8ucmVwbGFjZUFsbCgnXycsICcgJyk7XG4gICAgICAgICAgICBpZiAob2xkVGFyZ2V0KSBvbGRUYXJnZXQgPSBvbGRUYXJnZXRbMF0udG9VcHBlckNhc2UoKSArIG9sZFRhcmdldC5zbGljZSgxKTtcblxuICAgICAgICAgICAgY29uc3QgaXNUYXJnZXRDaGFuZ2VkID0gcmVkaXJlY3RWYWx1ZSAhPT0gb2xkVGFyZ2V0O1xuXG4gICAgICAgICAgICBjb25zdCBhcmVUYWdzQ2hhbmdlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5zb21lKCh0YWcpID0+ICF0aGlzLm9sZFJlZGlyZWN0VGFncyEuaW5jbHVkZXModGFnIGFzIHN0cmluZykpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhZ3MhLnNvbWUoKHRhZykgPT4gIXRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXModGFnKSk7XG5cbiAgICAgICAgICAgIGxldCBhcmVUYWdBcmd1bWVudHNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAodGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWdzV2l0aFBhcmFtZXRlcnMgPSBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgIChbLCBkYXRhXSkgPT4gT2JqZWN0LmVudHJpZXMoZGF0YS5wYXJhbWV0ZXJzKS5sZW5ndGggPiAwLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0YWcsIGRhdGFdIG9mIHRhZ3NXaXRoUGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3YXNUYWdTZWxlY3RlZCA9IHRoaXMub2xkUmVkaXJlY3RUYWdzIS5pbmNsdWRlcyh0YWcpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXdhc1RhZ1NlbGVjdGVkIHx8ICF0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpLmluY2x1ZGVzKHRhZykpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFRhZ0RhdGEgPSB0aGlzLm9sZFJlZGlyZWN0VGFnRGF0YVt0YWddID8/IE9iamVjdC5rZXlzKGRhdGEucGFyYW1ldGVycykubWFwKChuYW1lKSA9PiBbbmFtZSwgJyddKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3VuZFRhZ0VkaXRvckRhdGEgPSB0aGlzLnRlbXBsYXRlRWRpdG9yc0luZm8uZmluZCgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm5hbWUgPT09IHRhZykhO1xuXG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlckxvb3A6IGZvciAoY29uc3QgcGFyYW1ldGVyIG9mIGZvdW5kVGFnRWRpdG9yRGF0YS5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRBcmd1bWVudCA9IG9sZFRhZ0RhdGEuZmluZCgoYXJndW1lbnQpID0+IGFyZ3VtZW50WzBdID09PSBwYXJhbWV0ZXIubmFtZSk/LlsxXSA/PyAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld0FyZ3VtZW50ID0gcGFyYW1ldGVyLmVkaXRvci5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZEFyZ3VtZW50ICE9PSBuZXdBcmd1bWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZVRhZ0FyZ3VtZW50c0NoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHBhcmFtZXRlckxvb3A7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoYXJlVGFnQXJndW1lbnRzQ2hhbmdlZCkgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBpc0RlZmF1bHRTb3J0Q2hhbmdlZCA9IHRoaXMuZGVmYXVsdFNvcnRJbnB1dC5nZXRWYWx1ZSgpLnRyaW0oKSAhPT0gdGhpcy5vbGREZWZhdWx0U29ydCEucmVwbGFjZUFsbCgnXycsICcgJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGFyZUNhdGVnb3JpZXNDaGFuZ2VkID1cbiAgICAgICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkuc29tZSgoY2F0ZWdvcnkpID0+ICF0aGlzLm9sZENhdGVnb3JpZXMhLmluY2x1ZGVzKGNhdGVnb3J5IGFzIHN0cmluZykpIHx8XG4gICAgICAgICAgICAgICAgdGhpcy5vbGRDYXRlZ29yaWVzIS5zb21lKChjYXRlZ29yeSkgPT4gIXRoaXMuY2F0ZWdvcnlTZWxlY3QuZ2V0VmFsdWUoKS5pbmNsdWRlcyhjYXRlZ29yeSkpO1xuXG4gICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gW107XG5cbiAgICAgICAgICAgIGlmIChpc1RhcmdldENoYW5nZWQpIGNoYW5nZXMucHVzaChgcmV0YXJnZXQgdG8gW1ske3JlZGlyZWN0VmFsdWV9XV1gKTtcbiAgICAgICAgICAgIGlmIChhcmVUYWdzQ2hhbmdlZClcbiAgICAgICAgICAgICAgICBjaGFuZ2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgIGAke3RoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkubGVuZ3RoID4gMCAmJiB0aGlzLm9sZFJlZGlyZWN0VGFncyEubGVuZ3RoID4gMCA/ICdjaGFuZ2UnIDogdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKS5sZW5ndGggPiAwID8gJ2FkZCcgOiAncmVtb3ZlJ30gY2F0ZWdvcml6YXRpb24gdGVtcGxhdGVzYCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGFyZVRhZ0FyZ3VtZW50c0NoYW5nZWQpIGNoYW5nZXMucHVzaCgnY2hhbmdlIGNhdGVnb3JpemF0aW9uIHRlbXBsYXRlIGFyZ3VtZW50cycpO1xuICAgICAgICAgICAgaWYgKGlzRGVmYXVsdFNvcnRDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCkudHJpbSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5vbGREZWZhdWx0U29ydCEucmVwbGFjZUFsbCgnXycsICcgJykubGVuZ3RoID4gMCA/ICdjaGFuZ2UnIDogdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCkudHJpbSgpLmxlbmd0aCA+IDAgPyAnYWRkJyA6ICdyZW1vdmUnfSBkZWZhdWx0IHNvcnQga2V5YCxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGFyZUNhdGVnb3JpZXNDaGFuZ2VkKVxuICAgICAgICAgICAgICAgIGNoYW5nZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7dGhpcy5jYXRlZ29yeVNlbGVjdC5nZXRWYWx1ZSgpLmxlbmd0aCA+IDAgJiYgdGhpcy5vbGRDYXRlZ29yaWVzIS5sZW5ndGggPiAwID8gJ2NoYW5nZScgOiB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkubGVuZ3RoID4gMCA/ICdhZGQnIDogJ3JlbW92ZSd9IGNhdGVnb3JpZXNgLFxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmxlbmd0aCA9PT0gMCkgY2hhbmdlcy5wdXNoKCdwZXJmb3JtIHJlZGlyZWN0IGNsZWFudXAnKTtcblxuICAgICAgICAgICAgY2hhbmdlc1swXSA9IGNoYW5nZXNbMF1bMF0udG9VcHBlckNhc2UoKSArIGNoYW5nZXNbMF0uc2xpY2UoMSk7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5sZW5ndGggPiAxKSBjaGFuZ2VzW2NoYW5nZXMubGVuZ3RoIC0gMV0gPSBgYW5kICR7Y2hhbmdlcy5hdCgtMSl9YDtcblxuICAgICAgICAgICAgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gY2hhbmdlcy5qb2luKGNoYW5nZXMubGVuZ3RoID4gMiA/ICcsICcgOiAnICcpO1xuICAgICAgICB9IGVsc2UgKHRoaXMuc3VtbWFyeUlucHV0LiR0YWJJbmRleGVkWzBdIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnBsYWNlaG9sZGVyID0gYENyZWF0ZSByZWRpcmVjdCB0byBbWyR7cmVkaXJlY3RWYWx1ZX1dXWA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZHMgZXhpc3RpbmcgcGFnZSBkYXRhLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgbG9hZEV4aXN0aW5nRGF0YSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZG9lc0V4aXN0KSB0aGlzLnBhZ2VDb250ZW50ID0gKGF3YWl0IGdldFBhZ2VDb250ZW50KHRoaXMucGFnZVRpdGxlKSkgPz8gJyc7XG5cbiAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhcmdldCA9IHRoaXMuUkVESVJFQ1RfUkVHRVguZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzFdO1xuXG4gICAgICAgIHRoaXMub2xkUmVkaXJlY3RUYWdzID0gKFxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXModGhpcy5yZWRpcmVjdFRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICAubWFwKChbdGFnLCB0YWdEYXRhXSkgPT5cbiAgICAgICAgICAgICAgICAgICAgW3RhZywgLi4udGFnRGF0YS5hbGlhc2VzXS5zb21lKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBge3tcXFxccypbJHt0YWdPclJlZGlyZWN0WzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdPclJlZGlyZWN0WzBdfV0ke3RhZ09yUmVkaXJlY3Quc2xpY2UoMSl9XFxcXHMqKFxcXFx8fH19KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICApLnRlc3QodGhpcy5wYWdlQ29udGVudCksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGFnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW11cbiAgICAgICAgKS5zb3J0KChhLCBiKSA9PiBhLnRvTG93ZXJDYXNlKCkubG9jYWxlQ29tcGFyZShiLnRvTG93ZXJDYXNlKCkpKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bmljb3JuL25vLWFycmF5LXNvcnRcblxuICAgICAgICBjb25zdCBvcmlnaW5hbFJlZGlyZWN0VGFncyA9IE9iamVjdC5lbnRyaWVzKHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMpXG4gICAgICAgICAgICAuZmxhdE1hcCgoW3RhZywgdGFnRGF0YV0pID0+IFt0YWcsIC4uLnRhZ0RhdGEuYWxpYXNlc10pXG4gICAgICAgICAgICAubWFwKCh0YWdPclJlZGlyZWN0KSA9PlxuICAgICAgICAgICAgICAgIG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnT3JSZWRpcmVjdFswXS50b0xvd2VyQ2FzZSgpfSR7dGFnT3JSZWRpcmVjdFswXX1dJHt0YWdPclJlZGlyZWN0LnNsaWNlKDEpfVxcXFxzKihcXFxcfHx9fSlgKS50ZXN0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgPyB0YWdPclJlZGlyZWN0XG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgc3RyaW5nW107XG5cbiAgICAgICAgdGhpcy5vbGRSZWRpcmVjdFRhZ0RhdGEgPSBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBvcmlnaW5hbFJlZGlyZWN0VGFnc1xuICAgICAgICAgICAgICAgIC5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IG5ldyBSZWdFeHAoYHt7XFxcXHMqWyR7dGFnWzBdLnRvTG93ZXJDYXNlKCl9JHt0YWdbMF19XSR7dGFnLnNsaWNlKDEpfVxcXFx8PyguKj8pXFxcXHMqfX1gKS5leGVjKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlQ29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdUYWcgPSBPYmplY3QuZW50cmllcyh0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKS5maW5kKChbdGVtcGxhdGUsIHRhZ0RhdGFdKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgW3RlbXBsYXRlLCAuLi50YWdEYXRhLmFsaWFzZXNdLmluY2x1ZGVzKHRhZyksXG4gICAgICAgICAgICAgICAgICAgICk/LlswXTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbEFyZ3VtZW50cyA9IG1hdGNoPy5bMV07XG4gICAgICAgICAgICAgICAgICAgIGlmICghb3JpZ2luYWxBcmd1bWVudHMpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZEFyZ3VtZW50cyA9IG1hdGNoWzFdLnNwbGl0KCd8JykubWFwKChhcmd1bWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnQuaW5jbHVkZXMoJz0nKSkgcmV0dXJuIFsoaW5kZXggKyAxKS50b1N0cmluZygpLCBhcmd1bWVudC50cmltKCldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBbbmFtZSwgdmFsdWVdID0gYXJndW1lbnQuc3BsaXQoJz0nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuYW1lLnRyaW0oKSwgdmFsdWUudHJpbSgpXTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtuZXdUYWcsIGZvcm1hdHRlZEFyZ3VtZW50c107XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFtzdHJpbmcsIHN0cmluZ1tdW11dW10sXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5vbGREZWZhdWx0U29ydCA9XG4gICAgICAgICAgICB0aGlzLnBhZ2VDb250ZW50XG4gICAgICAgICAgICAgICAgLm1hdGNoKC9cXHtcXHtERUZBVUxUU09SVDouKj9cXH1cXH0vZylcbiAgICAgICAgICAgICAgICA/LmF0KC0xKVxuICAgICAgICAgICAgICAgID8uc2xpY2UoMTQsIC0yKVxuICAgICAgICAgICAgICAgIC50cmltKCkgPz8gJyc7XG5cbiAgICAgICAgdGhpcy5vbGRDYXRlZ29yaWVzID1cbiAgICAgICAgICAgIHRoaXMucGFnZUNvbnRlbnRcbiAgICAgICAgICAgICAgICAubWF0Y2goL1xcW1xcW1tDY11hdGVnb3J5Oi4rP1xcXVxcXS9nKVxuICAgICAgICAgICAgICAgID8ubWFwKChjYXRlZ29yeSkgPT4gY2F0ZWdvcnkuc2xpY2UoMTEsIC0yKSlcbiAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS50b0xvd2VyQ2FzZSgpLmxvY2FsZUNvbXBhcmUoYi50b0xvd2VyQ2FzZSgpKSkgPz8gW107IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdW5pY29ybi9uby1hcnJheS1zb3J0XG5cbiAgICAgICAgdGhpcy5vbGRTdHJheVRleHQgPSBbXG4gICAgICAgICAgICAvXFx7XFx7c2hvcnQgZGVzY3JpcHRpb25cXHwuKj9cXH1cXH0vaS5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAvXFx7XFx7RElTUExBWVRJVExFOi4qP1xcfVxcfS8uZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICAgICAgL1xce1xce2l0YWxpYyB0aXRsZVxcfD8uKj9cXH1cXH0vaS5leGVjKHRoaXMucGFnZUNvbnRlbnQpPy5bMF0sXG4gICAgICAgICAgICAvXFx7XFx7dGl0bGUgbGFuZ3VhZ2VcXHwuKj9cXH1cXH0vLmV4ZWModGhpcy5wYWdlQ29udGVudCk/LlswXSxcbiAgICAgICAgICAgIC9cXHtcXHthdXRob3JpdHkgY29udHJvbCg/OlxcfC4qPyk/XFx9XFx9L2kuZXhlYyh0aGlzLnBhZ2VDb250ZW50KT8uWzBdLFxuICAgICAgICBdXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmRlZmF1bHRSZWRpcmVjdFRhcmdldClcbiAgICAgICAgICAgIGlmICh0aGlzLm9sZFJlZGlyZWN0VGFyZ2V0KSB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUodGhpcy5vbGRSZWRpcmVjdFRhcmdldC5yZXBsYWNlQWxsKCdfJywgJyAnKSk7XG4gICAgICAgICAgICBlbHNlIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBDb3VsZCBub3QgZmluZCByZWRpcmVjdCB0YXJnZXQhJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuXG4gICAgICAgIHRoaXMudGFnU2VsZWN0LnNldFZhbHVlKHRoaXMub2xkUmVkaXJlY3RUYWdzKTtcblxuICAgICAgICBmb3IgKGNvbnN0IFt0ZW1wbGF0ZU5hbWUsIGRhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMub2xkUmVkaXJlY3RUYWdEYXRhKSkge1xuICAgICAgICAgICAgY29uc3QgZm91bmRUZW1wbGF0ZUVkaXRvciA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRlbXBsYXRlTmFtZSk7XG4gICAgICAgICAgICBpZiAoIWZvdW5kVGVtcGxhdGVFZGl0b3IpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwYXJhbWV0ZXJOYW1lLCBhcmd1bWVudF0gb2YgZGF0YSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kUGFyYW1ldGVyRWRpdG9yID0gZm91bmRUZW1wbGF0ZUVkaXRvci5wYXJhbWV0ZXJzLmZpbmQoKHBhcmFtZXRlcikgPT5cbiAgICAgICAgICAgICAgICAgICAgW3BhcmFtZXRlci5uYW1lLCAuLi5wYXJhbWV0ZXIuYWxpYXNlc10uaW5jbHVkZXMocGFyYW1ldGVyTmFtZSksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChmb3VuZFBhcmFtZXRlckVkaXRvcikgZm91bmRQYXJhbWV0ZXJFZGl0b3IuZWRpdG9yLnNldFZhbHVlKGFyZ3VtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9sZERlZmF1bHRTb3J0KSB0aGlzLmRlZmF1bHRTb3J0SW5wdXQuc2V0VmFsdWUodGhpcy5vbGREZWZhdWx0U29ydCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiB0aGlzLm9sZENhdGVnb3JpZXMpIHtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QuYWRkQWxsb3dlZFZhbHVlKGNhdGVnb3J5KTtcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3RJbnB1dC52YWxpZENhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LnNldFZhbHVlKHRoaXMub2xkQ2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiAoeyBkYXRhOiBjYXRlZ29yeSwgbGFiZWw6IGNhdGVnb3J5IH0pKSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGVTdW1tYXJ5KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUnVucyBjaGVja3Mgb24gdGhlIHByb3ZpZGVkIGRhdGEgYW5kIHJldHVybnMgdGhlIGVycm9ycyAoaWYgYW55KS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIHZhbGlkYXRlU3VibWlzc2lvbigpIHtcbiAgICAgICAgY29uc3QgZXJyb3JzOiB7XG4gICAgICAgICAgICB0aXRsZT86IHN0cmluZztcbiAgICAgICAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgICAgICAgIGF1dG9GaXhlcz86ICh7IHR5cGU6ICdhZGQnIHwgJ3JlbW92ZSc7IHRhZzogc3RyaW5nIH0gfCB7IHR5cGU6ICdjaGFuZ2UtdGFyZ2V0JzsgdGFyZ2V0OiBzdHJpbmcgfSlbXTtcbiAgICAgICAgfVtdID0gW107XG5cbiAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgIC8qIEludmFsaWQgY2hhcmFjdGVycyAqL1xuICAgICAgICBpZiAoIS9eW15bXFxde3x9XSskLy50ZXN0KGRlc3RpbmF0aW9uKSkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG5cbiAgICAgICAgLyogRmFpbGVkIGR1cmluZyB0aXRsZSBwYXJzaW5nICovXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBhcnNlZERlc3RpbmF0aW9uID0gbXcuVGl0bGUubmV3RnJvbVRleHQoZGVzdGluYXRpb24pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID09PSAwKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2lzIG5vdCBhIHZhbGlkIHBhZ2UgdGl0bGUhJyB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucGFyc2VkRGVzdGluYXRpb24gJiYgZXJyb3JzLmxlbmd0aCA9PT0gMCkgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6ICdpcyBub3QgYSB2YWxpZCBwYWdlIHRpdGxlIScgfSk7XG5cbiAgICAgICAgLyogU2VsZiByZWRpcmVjdHMgKi9cbiAgICAgICAgaWYgKHRoaXMucGFyc2VkRGVzdGluYXRpb24hLmdldFByZWZpeGVkVGV4dCgpID09PSB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5nZXRQcmVmaXhlZFRleHQoKSlcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgbWVzc2FnZTogJ2Nhbm5vdCByZWRpcmVjdCB0byBpdHNlbGYhJyB9KTtcblxuICAgICAgICBjb25zdCBkZXN0aW5hdGlvbkRhdGEgPSAoYXdhaXQgYXBpXG4gICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgICAgIHByb3A6IFsncGFnZXByb3BzJywgJ2NhdGVnb3JpZXMnXSxcbiAgICAgICAgICAgICAgICBjbGxpbWl0OiAnbWF4JyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IGRlc3RpbmF0aW9uLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlQYWdlUHJvcHNQYXJhbXMpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHsgdGl0bGU6IGRlc3RpbmF0aW9uLCBtZXNzYWdlOiBgd2FzIG5vdCBhYmxlIHRvIGJlIGZldGNoZWQgZnJvbSB0aGUgQVBJICgke2Vycm9yQ29kZX0pIWAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0pKSBhcyAoUGFnZXByb3BzUmVzdWx0ICYgQ2F0ZWdvcmllc1Jlc3VsdCkgfCBudWxsO1xuXG4gICAgICAgIGlmIChkZXN0aW5hdGlvbkRhdGE/LnF1ZXJ5IS5wYWdlc1swXS5taXNzaW5nKSBlcnJvcnMucHVzaCh7IHRpdGxlOiBkZXN0aW5hdGlvbiwgbWVzc2FnZTogJ2RvZXMgbm90IGV4aXN0IScgfSk7XG5cbiAgICAgICAgaWYgKCFkZXN0aW5hdGlvbkRhdGEgfHwgZGVzdGluYXRpb25EYXRhLnF1ZXJ5IS5wYWdlc1swXS5taXNzaW5nKSByZXR1cm4gZXJyb3JzO1xuXG4gICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQgPSAoYXdhaXQgYXBpXG4gICAgICAgICAgICAuZ2V0KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdwYXJzZScsXG4gICAgICAgICAgICAgICAgcGFnZTogZGVzdGluYXRpb24sXG4gICAgICAgICAgICAgICAgcHJvcDogWyd0ZXh0JywgJ3RvY2RhdGEnXSxcbiAgICAgICAgICAgICAgICByZWRpcmVjdHM6IHRydWUsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlQYXJzZVBhcmFtcylcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlKSA9PiB7XG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goeyB0aXRsZTogZGVzdGluYXRpb24sIG1lc3NhZ2U6IGB3YXMgbm90IGFibGUgdG8gYmUgcGFyc2VkIGJ5IHRoZSBBUEkgKCR7ZXJyb3JDb2RlfSkhYCB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSkpIGFzIFBhZ2VQYXJzZVJlc3VsdCB8IG51bGw7XG5cbiAgICAgICAgaWYgKCFkZXN0aW5hdGlvblBhcnNlUmVzdWx0KSByZXR1cm4gZXJyb3JzO1xuXG4gICAgICAgIC8qIERvdWJsZSByZWRpcmVjdHMgKi9cbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UhLnJlZGlyZWN0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvblJlZGlyZWN0ID1cbiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlIS5yZWRpcmVjdHNbMF0udG8gK1xuICAgICAgICAgICAgICAgIChkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlIS5yZWRpcmVjdHNbMF0udG9mcmFnbWVudCA/IGAjJHtkZXN0aW5hdGlvblBhcnNlUmVzdWx0LnBhcnNlIS5yZWRpcmVjdHNbMF0udG9mcmFnbWVudH1gIDogJycpO1xuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIHRpdGxlOiBkZXN0aW5hdGlvbixcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgYSByZWRpcmVjdCB0byA8YSBocmVmPVwiJHttdy51dGlsLmdldFVybChcbiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25SZWRpcmVjdCxcbiAgICAgICAgICAgICAgICApfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7ZGVzdGluYXRpb25SZWRpcmVjdH08L2E+LiBSZXRhcmdldCB0byB0aGF0IHBhZ2UgaW5zdGVhZCwgYXMgZG91YmxlIHJlZGlyZWN0cyBhcmVuJ3QgYWxsb3dlZC5gLFxuICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ2NoYW5nZS10YXJnZXQnLCB0YXJnZXQ6IGRlc3RpbmF0aW9uUmVkaXJlY3QgfV0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIE5vbmV4aXN0ZW50IHNlY3Rpb24gKi9cbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uLnNwbGl0KCcjJykubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSB0aGlzLnBhcnNlZERlc3RpbmF0aW9uIS5nZXRGcmFnbWVudCgpID8/IGRlc3RpbmF0aW9uLnNwbGl0KCcjJykuc2xpY2UoMSkuam9pbignIycpO1xuXG4gICAgICAgICAgICBjb25zdCB2YWxpZFNlY3Rpb25zID0gZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZSEudG9jZGF0YS5zZWN0aW9ucy5tYXAoKHNlY3Rpb24pID0+IHNlY3Rpb24ubGluZS5yZXBsYWNlQWxsKC88XFwvP2k+L2csICcnKSk7XG4gICAgICAgICAgICBjb25zdCB2YWxpZFNlY3Rpb25zU2V0ID0gbmV3IFNldCh2YWxpZFNlY3Rpb25zKTtcblxuICAgICAgICAgICAgY29uc3QgdmFsaWRBbmNob3JzID0gZ2V0QW5jaG9yc0Zyb21IdG1sKGRlc3RpbmF0aW9uUGFyc2VSZXN1bHQucGFyc2UhLnRleHRbJyonXSwgZGVzdGluYXRpb25QYXJzZVJlc3VsdC5wYXJzZSEudGl0bGUpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeyBmcmFnbWVudCB9KSA9PiAhdmFsaWRTZWN0aW9uc1NldC5oYXMoZnJhZ21lbnQpKVxuICAgICAgICAgICAgICAgIC5tYXAoKHsgZnJhZ21lbnQgfSkgPT4gZnJhZ21lbnQpO1xuXG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkU2VjdGlvbiA9IHZhbGlkU2VjdGlvbnMuaW5jbHVkZXMoZnJhZ21lbnQpO1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZEFuY2hvciA9IHZhbGlkQW5jaG9ycy5pbmNsdWRlcyhmcmFnbWVudCk7XG5cbiAgICAgICAgICAgIGlmIChpc1ZhbGlkU2VjdGlvbikge1xuICAgICAgICAgICAgICAgIGlmICh0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgdGFnZ2VkIGFzIGEgcmVkaXJlY3QgdG8gYW4gYW5jaG9yLCBidXQgaXQgaXMgYWN0dWFsbHkgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24hJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2FkZCcsIHRhZzogJ1IgdG8gc2VjdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdyZW1vdmUnLCB0YWc6ICdSIHRvIGFuY2hvcicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghdGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbiwgYnV0IGl0IGlzIG5vdCB0YWdnZWQgd2l0aCA8Y29kZT57e1IgdG8gc2VjdGlvbn19PC9jb2RlPiEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBzZWN0aW9uJyB9XSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzVmFsaWRBbmNob3IpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB0byBzZWN0aW9uJykpXG4gICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyB0YWdnZWQgYXMgYSByZWRpcmVjdCB0byBhIHNlY3Rpb24sIGJ1dCBpdCBpcyBhY3R1YWxseSBhIHJlZGlyZWN0IHRvIGFuIGFuY2hvciEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBhbmNob3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAncmVtb3ZlJywgdGFnOiAnUiB0byBzZWN0aW9uJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YWdzLmluY2x1ZGVzKCdSIHRvIGFuY2hvcicpKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhbiBhbmNob3IsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHRvIGFuY2hvcn19PC9jb2RlPiEnLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAnYWRkJywgdGFnOiAnUiB0byBhbmNob3InIH1dLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIGEgcmVkaXJlY3QgdG8gPGEgaHJlZj1cIiR7bXcudXRpbC5nZXRVcmwoZGVzdGluYXRpb24pfVwiIHRhcmdldD1cIl9ibGFua1wiPiR7ZGVzdGluYXRpb259PC9hPiwgYnV0IHRoYXQgc2VjdGlvbiBvciBhbmNob3IgZG9lcyBub3QgZXhpc3QhYCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEltcHJvcGVybHkgdGFnZ2VkIGFzIHJlZGlyZWN0IHRvIHNlY3Rpb24vYW5jaG9yICovXG4gICAgICAgIGlmIChkZXN0aW5hdGlvbi5zcGxpdCgnIycpLmxlbmd0aCA9PT0gMSlcbiAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIFsnUiB0byBzZWN0aW9uJywgJ1IgdG8gYW5jaG9yJ10pXG4gICAgICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModGFnKSlcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIG5vdCBhIHJlZGlyZWN0IHRvIGEgc2VjdGlvbi9hbmNob3IsIGJ1dCBpdCBpcyB0YWdnZWQgd2l0aCA8Y29kZT57eyR7dGFnfX19PC9jb2RlPiFgLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0ZpeGVzOiBbeyB0eXBlOiAncmVtb3ZlJywgdGFnIH1dLFxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBpc1RhcmdldERpc2FtYmlndWF0aW9uUGFnZSA9ICEhKFxuICAgICAgICAgICAgZGVzdGluYXRpb25EYXRhLnF1ZXJ5IS5wYWdlc1swXS5wYWdlcHJvcHMgJiYgJ2Rpc2FtYmlndWF0aW9uJyBpbiBkZXN0aW5hdGlvbkRhdGEucXVlcnkhLnBhZ2VzWzBdLnBhZ2Vwcm9wc1xuICAgICAgICApO1xuICAgICAgICBjb25zdCBpc1RhcmdldFN1cm5hbWVMaXN0ID0gISFkZXN0aW5hdGlvbkRhdGEucXVlcnkhLnBhZ2VzWzBdLmNhdGVnb3JpZXM/LnNvbWUoXG4gICAgICAgICAgICAoY2F0ZWdvcnkpID0+IGNhdGVnb3J5LnRpdGxlID09PSAnQ2F0ZWdvcnk6U3VybmFtZXMnLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHRvRGlzYW1iaWd1YXRpb25QYWdlVGFncyA9IFsnUiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlJywgJ1IgZnJvbSBpbmNvbXBsZXRlIGRpc2FtYmlndWF0aW9uJ107XG4gICAgICAgIGNvbnN0IHRvU3VybmFtZUxpc3RUYWdzID0gWydSIGZyb20gYW1iaWd1b3VzIHNvcnQgbmFtZScsICdSIGZyb20gYW1iaWd1b3VzIHRlcm0nXTtcblxuICAgICAgICBjb25zdCBpc1RhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSA9IHRvRGlzYW1iaWd1YXRpb25QYWdlVGFncy5zb21lKCh0ZW1wbGF0ZSkgPT4gdGFncy5pbmNsdWRlcyh0ZW1wbGF0ZSkpO1xuICAgICAgICBjb25zdCBpc1RhZ2dlZEFzUmVkaXJlY3RUb1N1cm5hbWVMaXN0ID0gdG9TdXJuYW1lTGlzdFRhZ3Muc29tZSgodGVtcGxhdGUpID0+IHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKTtcblxuICAgICAgICAvKiBSZWRpcmVjdCB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlIHdpdGhvdXQgdGVtcGxhdGUgKi9cbiAgICAgICAgaWYgKGlzVGFyZ2V0RGlzYW1iaWd1YXRpb25QYWdlICYmICFpc1RhZ2dlZEFzUmVkaXJlY3RUb0Rpc2FtYmlndWF0aW9uUGFnZSAmJiAhaXNUYWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdClcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgYSByZWRpcmVjdCB0byBhIGRpc2FtYmlndWF0aW9uIHBhZ2UsIGJ1dCBpdCBpcyBub3QgdGFnZ2VkIHdpdGggYSBkaXNhbWJpZ3VhdGlvbiBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSEnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFpc1RhcmdldERpc2FtYmlndWF0aW9uUGFnZSAmJiBkZXN0aW5hdGlvbkRhdGEucXVlcnkhLnBhZ2VzWzBdLnBhZ2Vwcm9wcykge1xuICAgICAgICAgICAgLyogSW1wcm9wZXJseSB0YWdnZWQgYXMgcmVkaXJlY3QgdG8gZGlzYW1iaWd1YXRpb24gcGFnZSAqL1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICghaXNUYXJnZXRTdXJuYW1lTGlzdCAmJiAoaXNUYWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UgfHwgaXNUYWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdCkpIHx8XG4gICAgICAgICAgICAgICAgKGlzVGFyZ2V0U3VybmFtZUxpc3QgJiYgaXNUYWdnZWRBc1JlZGlyZWN0VG9EaXNhbWJpZ3VhdGlvblBhZ2UpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnaXMgbm90IGEgcmVkaXJlY3QgdG8gYSBkaXNhbWJpZ3VhdGlvbiBwYWdlLCBidXQgaXQgaXMgdGFnZ2VkIHdpdGggYSBkaXNhbWJpZ3VhdGlvbiBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSEnLFxuICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFsuLi50b0Rpc2FtYmlndWF0aW9uUGFnZVRhZ3MsIC4uLnRvU3VybmFtZUxpc3RUYWdzXS5tYXAoKHRhZykgPT4gKHsgdHlwZTogJ3JlbW92ZScsIHRhZyB9KSksXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIFJlZGlyZWN0IHRvIHN1cm5hbWUgbGlzdCB3aXRob3V0IHRlbXBsYXRlICovXG4gICAgICAgICAgICBpZiAoaXNUYXJnZXRTdXJuYW1lTGlzdCAmJiAhaXNUYWdnZWRBc1JlZGlyZWN0VG9TdXJuYW1lTGlzdClcbiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyBhIHJlZGlyZWN0IHRvIGEgc3VybmFtZSBsaXN0LCBidXQgaXQgaXMgbm90IHRhZ2dlZCB3aXRoIGEgY29ycmVjdCBkaXNhbWJpZ3VhdGlvbiBjYXRlZ29yaXphdGlvbiB0ZW1wbGF0ZSEnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoge3tSIHRvIGRpc2FtYmlndWF0aW9uIHBhZ2V9fSB3aXRob3V0IFwiIChkaXNhbWJpZ3VhdGlvbilcIiBhdCBlbmQgb2YgdGl0bGUgKi9cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNUYXJnZXREaXNhbWJpZ3VhdGlvblBhZ2UgJiZcbiAgICAgICAgICAgIHRhZ3MuaW5jbHVkZXMoJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScpICYmXG4gICAgICAgICAgICAhdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0TWFpblRleHQoKS5lbmRzV2l0aCgnIChkaXNhbWJpZ3VhdGlvbiknKVxuICAgICAgICApXG4gICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgbWVzc2FnZTpcbiAgICAgICAgICAgICAgICAgICAgJ2lzIHRhZ2dlZCB3aXRoIDxjb2RlPnt7UiB0byBkaXNhbWJpZ3VhdGlvbiBwYWdlfX08L2NvZGU+LCBidXQgdGhpcyB0aXRsZSBkb2VzIG5vdCBlbmQgd2l0aCBcIiAoZGlzYW1iaWd1YXRpb24pXCIuIFVzZSA8Y29kZT57e1IgZnJvbSBhbWJpZ3VvdXMgdGVybX19PC9jb2RlPiBvciBhIHNpbWlsYXIgY2F0ZWdvcml6YXRpb24gdGVtcGxhdGUgaW5zdGVhZCEnLFxuICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1IgdG8gZGlzYW1iaWd1YXRpb24gcGFnZScgfV0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKiBUYWdnZWQgd2l0aCBhIHByb3RlY3Rpb24gdGVtcGxhdGUgKi9cbiAgICAgICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiBbJ1IgcHJvdGVjdGVkJywgJ1IgcHJvdGVjdGVkL3NlbWknLCAnUiBwcm90ZWN0ZWQvZXhjb24nLCAnUiBwcm90ZWN0ZWQvdGVtcGxhdGUnLCAnUiBwcm90ZWN0ZWQvZnVsbCddKVxuICAgICAgICAgICAgaWYgKHRhZ3MuaW5jbHVkZXModGVtcGxhdGUpKVxuICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYGlzIHRhZ2dlZCB3aXRoIHVubmVjZXNzYXJpbHkgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RlbXBsYXRlfX19PC9jb2RlPiB3aGljaCB3aWxsIGJlIGR1cGxpY2F0ZWQgYnkgdGhlIHJlZGlyZWN0IGNhdGVnb3J5IHNoZWxsIWAsXG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogdGVtcGxhdGUgfV0sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgLyogTGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSB3aXRob3V0IGJlaW5nIHRhZ2dlZCB3aXRoIHt7UiB3aXRoIFdpa2lkYXRhIGl0ZW19fSAqL1xuICAgICAgICBpZiAobXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpICYmICF0YWdzLmluY2x1ZGVzKCdSIHdpdGggV2lraWRhdGEgaXRlbScpKVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IFwiaXMgbGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSBidXQgaXQgaXNuJ3QgdGFnZ2VkIHdpdGggPGNvZGU+e3tSIHdpdGggV2lraWRhdGEgaXRlbX19PC9jb2RlPiFcIixcbiAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdhZGQnLCB0YWc6ICdSIHdpdGggV2lraWRhdGEgaXRlbScgfV0sXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvKiBUYWdnZWQgd2l0aCB7e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX0gd2l0aG91dCBiZWluZyBsaW5rZWQgdG8gYW4gaXRlbSAqL1xuICAgICAgICBpZiAodGFncy5pbmNsdWRlcygnUiB3aXRoIFdpa2lkYXRhIGl0ZW0nKSAmJiAhbXcuY29uZmlnLmdldCgnd2dXaWtpYmFzZUl0ZW1JZCcpKVxuICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgIG1lc3NhZ2U6ICdpcyB0YWdnZWQgd2l0aCA8Y29kZT57e1Igd2l0aCBXaWtpZGF0YSBpdGVtfX08L2NvZGU+IGJ1dCBpdCBpcyBub3QgYWN0dWFsbHkgbGlua2VkIHRvIGEgV2lraWRhdGEgaXRlbSEnLFxuICAgICAgICAgICAgICAgIGF1dG9GaXhlczogW3sgdHlwZTogJ3JlbW92ZScsIHRhZzogJ1Igd2l0aCBXaWtpZGF0YSBpdGVtJyB9XSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcbiAgICAgICAgICAgIGlmICghKHRhZyBpbiB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzKSkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHRhZ0RhdGEgPSB0aGlzLnJlZGlyZWN0VGVtcGxhdGVzW3RhZ107XG5cbiAgICAgICAgICAgIC8qIFRhZyB1c2VkIGluIGluY29ycmVjdCBuYW1lc3BhY2UgKi9cbiAgICAgICAgICAgIGNvbnN0IGRvZXNNZWV0TmFtZXNwYWNlUmVxdWlyZW1lbnQgPSB0YWdEYXRhLm5hbWVzcGFjZVJlcXVpcmVtZW50LnNvbWUoKHJlcXVpcmVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVtZW50ID09PSAnQUxMJykgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVpcmVtZW50ID09PSAnVEFMSycpIHJldHVybiB0aGlzLnBhZ2VUaXRsZVBhcnNlZC5pc1RhbGtQYWdlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldE5hbWVzcGFjZUlkKCkgPT09IHJlcXVpcmVtZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWRvZXNNZWV0TmFtZXNwYWNlUmVxdWlyZW1lbnQpXG4gICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RhZ319fTwvY29kZT4gYnV0IHRoYXQgdGFnIGlzIG5vdCB2YWxpZCBpbiB0aGlzIG5hbWVzcGFjZSFgLFxuICAgICAgICAgICAgICAgICAgICBhdXRvRml4ZXM6IFt7IHR5cGU6ICdyZW1vdmUnLCB0YWcgfV0sXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8qIE1pc3NpbmcgdGFnIHJlcXVpcmVkIHBhcmFtZXRlciAqL1xuICAgICAgICAgICAgZm9yIChjb25zdCBbcGFyYW1ldGVyTmFtZSwgcGFyYW1ldGVyRGF0YV0gb2YgT2JqZWN0LmVudHJpZXModGFnRGF0YS5wYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kUGFyYW1ldGVyID0gdGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvXG4gICAgICAgICAgICAgICAgICAgIC5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZylcbiAgICAgICAgICAgICAgICAgICAgPy5wYXJhbWV0ZXJzLmZpbmQoKHBhcmFtZXRlcikgPT4gW3BhcmFtZXRlci5uYW1lLCAuLi5wYXJhbWV0ZXIuYWxpYXNlc10uaW5jbHVkZXMocGFyYW1ldGVyTmFtZSkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFmb3VuZFBhcmFtZXRlcikgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyRGF0YS5yZXF1aXJlZCAmJiAhZm91bmRQYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpKVxuICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgaXMgdGFnZ2VkIHdpdGggPGNvZGU+e3ske3RhZ319fTwvY29kZT4gYnV0IGl0IGlzIG1pc3NpbmcgdGhlIHJlcXVpcmVkIHBhcmFtZXRlciA8Y29kZT4ke3BhcmFtZXRlck5hbWV9PC9jb2RlPiFgLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFN5bmNpbmcgdGFsayBwYWdlIGJ1dCB0YWxrIHBhZ2UgZXhpc3RzIGFuZCBpc24ndCBhIHJlZGlyZWN0ICovXG4gICAgICAgIGlmICh0aGlzLnN5bmNUYWxrQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSAmJiAhdGhpcy50YWxrRGF0YSEucXVlcnkhLnBhZ2VzWzBdLm1pc3NpbmcgJiYgIXRoaXMudGFsa0RhdGEhLnF1ZXJ5IS5wYWdlc1swXS5yZWRpcmVjdClcbiAgICAgICAgICAgIGVycm9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0VGFsa1BhZ2UoKSEuZ2V0UHJlZml4ZWRUZXh0KCksXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogJ2V4aXN0cywgYnV0IGlzIG5vdCBhIHJlZGlyZWN0IScsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZXMgdGhlIGV2ZW50IHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBcIlN1Ym1pdFwiIGJ1dHRvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGhhbmRsZVN1Ym1pdEJ1dHRvbkNsaWNrKCkge1xuICAgICAgICBjb25zdCBlbGVtZW50c1RvRGlzYWJsZSA9IFtcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dCxcbiAgICAgICAgICAgIHRoaXMudGFnU2VsZWN0LFxuICAgICAgICAgICAgLi4udGhpcy50ZW1wbGF0ZUVkaXRvcnNJbmZvLmZsYXRNYXAoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZS5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiBwYXJhbWV0ZXIuZWRpdG9yKSksXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0SW5wdXQsXG4gICAgICAgICAgICB0aGlzLmRlZmF1bHRTb3J0U3VnZ2VzdEJ1dHRvbixcbiAgICAgICAgICAgIHRoaXMuY2F0ZWdvcnlTZWxlY3QsXG4gICAgICAgICAgICB0aGlzLnN1bW1hcnlJbnB1dCxcbiAgICAgICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLFxuICAgICAgICAgICAgdGhpcy5zaG93UHJldmlld0J1dHRvbixcbiAgICAgICAgICAgIHRoaXMuc2hvd0NoYW5nZXNCdXR0b24sXG4gICAgICAgICAgICB0aGlzLnN5bmNUYWxrQ2hlY2tib3gsXG4gICAgICAgICAgICB0aGlzLndhdGNoQ2hlY2tib3gsXG4gICAgICAgICAgICB0aGlzLnBhdHJvbENoZWNrYm94LFxuICAgICAgICAgICAgdGhpcy5hdXRvRml4QWxsQnV0dG9uLFxuICAgICAgICBdLmZpbHRlcihCb29sZWFuKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNUb0Rpc2FibGUpIChlbGVtZW50IGFzIE9PLnVpLldpZGdldCkuc2V0RGlzYWJsZWQodHJ1ZSk7XG5cbiAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ0NoZWNraW5nIHRhcmdldCB2YWxpZGl0eS4uLicpO1xuXG4gICAgICAgIGxldCBlcnJvcnM6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgdGhpcy52YWxpZGF0ZVN1Ym1pc3Npb24+PiA9IFtdO1xuICAgICAgICBpZiAodGhpcy5uZWVkc0NoZWNrKSBlcnJvcnMgPSBhd2FpdCB0aGlzLnZhbGlkYXRlU3VibWlzc2lvbigpO1xuICAgICAgICBlbHNlIHRoaXMucGFyc2VkRGVzdGluYXRpb24gPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh0aGlzLnJlZGlyZWN0SW5wdXQuZ2V0VmFsdWUoKSk7XG5cbiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pc3Npb25XYXJuaW5ncy5yZXBsYWNlQ2hpbGRyZW4oKTsgLy8gQ2xlYXIgZXhpc3Rpbmcgd2FybmluZ3NcbiAgICAgICAgICAgIHRoaXMuYXV0b0ZpeEFsbEJ1dHRvbi4kZWxlbWVudC5oaWRlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGF1dG9GaXhGdW5jdGlvbnM6ICgoKSA9PiB2b2lkKVtdID0gW107XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgeyB0aXRsZSwgbWVzc2FnZSwgYXV0b0ZpeGVzIH0gb2YgZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBuZXcgT08udWkuSHRtbFNuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgIGAke3RpdGxlID8gYDxhIGhyZWY9XCIke213LnV0aWwuZ2V0VXJsKHRpdGxlKX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke3RpdGxlfTwvYT5gIDogJ1RoaXMgcGFnZSd9ICR7bWVzc2FnZX0gQ2xpY2sgYWdhaW4gd2l0aG91dCBtYWtpbmcgY2hhbmdlcyB0byBzdWJtaXQgYW55d2F5LmAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCB3YXJuaW5nTWVzc2FnZSA9IG5ldyBPTy51aS5NZXNzYWdlV2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NlczogWydyZWRpcmVjdC1oZWxwZXItd2FybmluZyddLFxuICAgICAgICAgICAgICAgICAgICBpbmxpbmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGF1dG9GaXhlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdXRvRml4QnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1BlcmZvcm0gYXV0by1maXgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzZXM6IFsncmVkaXJlY3QtaGVscGVyLWF1dG9maXgtYnV0dG9uJ10sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG9GaXhGdW5jdGlvbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLnRhZ1NlbGVjdC5nZXRWYWx1ZSgpIGFzIHN0cmluZ1tdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG9GaXggb2YgYXV0b0ZpeGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9GaXgudHlwZSA9PT0gJ2FkZCcgJiYgIXRhZ3MuaW5jbHVkZXMoYXV0b0ZpeC50YWcpKSB0aGlzLnRhZ1NlbGVjdC5hZGRUYWcoYXV0b0ZpeC50YWcsIGF1dG9GaXgudGFnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRvRml4LnR5cGUgPT09ICdyZW1vdmUnICYmIHRhZ3MuaW5jbHVkZXMoYXV0b0ZpeC50YWcpKSB0aGlzLnRhZ1NlbGVjdC5yZW1vdmVUYWdCeURhdGEoYXV0b0ZpeC50YWcpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dG9GaXgudHlwZSA9PT0gJ2NoYW5nZS10YXJnZXQnKSB0aGlzLnJlZGlyZWN0SW5wdXQuc2V0VmFsdWUoYXV0b0ZpeC50YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXS5zdHlsZS50ZXh0RGVjb3JhdGlvbiA9ICdsaW5lLXRocm91Z2ggMnB4IGJsYWNrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9GaXhCdXR0b24uJGVsZW1lbnRbMF0ucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhGdW5jdGlvbnMucHVzaChhdXRvRml4RnVuY3Rpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgIGF1dG9GaXhCdXR0b24ub24oJ2NsaWNrJywgYXV0b0ZpeEZ1bmN0aW9uKTtcblxuICAgICAgICAgICAgICAgICAgICB3YXJuaW5nTWVzc2FnZS4kZWxlbWVudFswXS5xdWVyeVNlbGVjdG9yKCcub28tdWktbGFiZWxFbGVtZW50LWxhYmVsJykhLmFwcGVuZChhdXRvRml4QnV0dG9uLiRlbGVtZW50WzBdKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnN1Ym1pc3Npb25XYXJuaW5ncy5hcHBlbmQod2FybmluZ01lc3NhZ2UuJGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYXV0b0ZpeEZ1bmN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvRml4QWxsQnV0dG9uLiRlbGVtZW50Lm9mZignY2xpY2snKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0b0ZpeEZ1bmN0aW9uIG9mIGF1dG9GaXhGdW5jdGlvbnMpIGF1dG9GaXhGdW5jdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB2b2lkIHRoaXMuaGFuZGxlU3VibWl0QnV0dG9uQ2xpY2soKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmF1dG9GaXhBbGxCdXR0b24uJGVsZW1lbnQuc2hvdygpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHNUb0Rpc2FibGUpIChlbGVtZW50IGFzIE9PLnVpLldpZGdldCkuc2V0RGlzYWJsZWQoZmFsc2UpO1xuXG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnU3VibWl0IGFueXdheScpO1xuICAgICAgICAgICAgdGhpcy5uZWVkc0NoZWNrID0gZmFsc2U7XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEVkaXQvY3JlYXRlIHJlZGlyZWN0ICovXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKGAke3RoaXMuZG9lc0V4aXN0ID8gJ0VkaXRpbmcnIDogJ0NyZWF0aW5nJ30gcmVkaXJlY3QuLi5gKTtcblxuICAgICAgICBjb25zdCBvdXRwdXQgPSB0aGlzLmNyZWF0ZU91dHB1dChcbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RJbnB1dC5nZXRWYWx1ZSgpLFxuICAgICAgICAgICAgdGhpcy50YWdTZWxlY3QuZ2V0VmFsdWUoKSBhcyBzdHJpbmdbXSxcbiAgICAgICAgICAgIHRoaXMub2xkU3RyYXlUZXh0LFxuICAgICAgICAgICAgdGhpcy5kZWZhdWx0U29ydElucHV0LmdldFZhbHVlKCksXG4gICAgICAgICAgICB0aGlzLmNhdGVnb3J5U2VsZWN0LmdldFZhbHVlKCkgYXMgc3RyaW5nW10sXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9XG4gICAgICAgICAgICAodGhpcy5zdW1tYXJ5SW5wdXQuZ2V0VmFsdWUoKSB8fCAodGhpcy5zdW1tYXJ5SW5wdXQuJHRhYkluZGV4ZWRbMF0gYXMgSFRNTElucHV0RWxlbWVudCkucGxhY2Vob2xkZXIpICsgdGhpcy5TQ1JJUFRfTUVTU0FHRTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZSh0aGlzLnBhZ2VUaXRsZSwgb3V0cHV0LCBzdW1tYXJ5KTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybjtcblxuICAgICAgICBtdy5ub3RpZnkoYFJlZGlyZWN0ICR7dGhpcy5kb2VzRXhpc3QgPyAnZWRpdGVkJyA6ICdjcmVhdGVkJ30gc3VjY2Vzc2Z1bGx5IWAsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuXG4gICAgICAgIC8qIFN5bmMgdGFsayBwYWdlIGNoZWNrYm94IGhhbmRsZXIgKi9cbiAgICAgICAgaWYgKHRoaXMuc3luY1RhbGtDaGVja2JveD8uaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnN1Ym1pdEJ1dHRvbi5zZXRMYWJlbCgnRWRpdGluZyB0YWxrIHBhZ2UuLi4nKTtcblxuICAgICAgICAgICAgY29uc3QgaXNGcm9tTW92ZSA9IHRoaXMudGFnU2VsZWN0LmdldFZhbHVlKCkuaW5jbHVkZXMoJ1IgZnJvbSBtb3ZlJyk7XG5cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuY3JlYXRlT3V0cHV0KFxuICAgICAgICAgICAgICAgIHRoaXMucGFyc2VkRGVzdGluYXRpb24hLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIGlzRnJvbU1vdmUgPyBbJ1IgZnJvbSBtb3ZlJ10gOiBbXSxcbiAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgdGFsa1Jlc3VsdCA9IGF3YWl0IHRoaXMuZWRpdE9yQ3JlYXRlKFxuICAgICAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkLmdldFRhbGtQYWdlKCkhLmdldFByZWZpeGVkVGV4dCgpLFxuICAgICAgICAgICAgICAgIG91dHB1dCxcbiAgICAgICAgICAgICAgICAnU3luY2luZyByZWRpcmVjdCBmcm9tIHN1YmplY3QgcGFnZScgKyB0aGlzLlNDUklQVF9NRVNTQUdFLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghdGFsa1Jlc3VsdCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBtdy5ub3RpZnkoJ1RhbGsgcGFnZSBzeW5jZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogUGF0cm9sIGNoZWNrYm94IGhhbmRsZXIgKi9cbiAgICAgICAgaWYgKHRoaXMucGF0cm9sQ2hlY2tib3g/LmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5zdWJtaXRCdXR0b24uc2V0TGFiZWwoJ1BhdHJvbGxpbmcgcmVkaXJlY3QuLi4nKTtcblxuICAgICAgICAgICAgY29uc3QgcGF0cm9sTGluazogSFRNTEFuY2hvckVsZW1lbnQgfCBudWxsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBhdHJvbGxpbmsgYScpO1xuICAgICAgICAgICAgY29uc3QgbWFya1Jldmlld2VkQnV0dG9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MQnV0dG9uRWxlbWVudD4oJyNtd2UtcHQtbWFyay1hcy1yZXZpZXdlZC1idXR0b24nKTtcblxuICAgICAgICAgICAgaWYgKHBhdHJvbExpbmspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXRyb2xSZXN1bHQgPSAoYXdhaXQgYXBpXG4gICAgICAgICAgICAgICAgICAgIC5wb3N0V2l0aFRva2VuKCdwYXRyb2wnLCB7IGFjdGlvbjogJ3BhdHJvbCcsIHJjaWQ6IG5ldyBVUkwocGF0cm9sTGluay5ocmVmKS5zZWFyY2hQYXJhbXMuZ2V0KCdyY2lkJykhIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3JDb2RlLCBlcnJvckluZm8pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgRXJyb3IgcGF0cm9sbGluZyAke3RoaXMucGFnZVRpdGxlfSB2aWEgQVBJOiAkeyhlcnJvckluZm8gYXMgTWVkaWFXaWtpRGF0YUVycm9yKT8uZXJyb3I/LmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZXJyb3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfSkpIGFzIG9iamVjdCB8IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKHBhdHJvbFJlc3VsdCkgbXcubm90aWZ5KCdSZWRpcmVjdCBwYXRyb2xsZWQgc3VjY2Vzc2Z1bGx5IScsIHsgdHlwZTogJ3N1Y2Nlc3MnIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXJrUmV2aWV3ZWRCdXR0b24pIHtcbiAgICAgICAgICAgICAgICBtYXJrUmV2aWV3ZWRCdXR0b24uY2xpY2soKTtcbiAgICAgICAgICAgICAgICBtdy5ub3RpZnkoJ1JlZGlyZWN0IHBhdHJvbGxlZCBzdWNjZXNzZnVsbHkhJywgeyB0eXBlOiAnc3VjY2VzcycgfSk7XG4gICAgICAgICAgICB9IGVsc2UgbXcubm90aWZ5KCdQYWdlIGN1cmF0aW9uIHRvb2xiYXIgbm90IGZvdW5kLCByZWRpcmVjdCBjYW5ub3QgYmUgcGF0cm9sbGVkIScsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uLnNldExhYmVsKCdDb21wbGV0ZSwgcmVsb2FkaW5nLi4uJyk7XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbihtdy51dGlsLmdldFVybCh0aGlzLnBhZ2VUaXRsZSwgeyByZWRpcmVjdDogJ25vJyB9KSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUYWtlcyBwcm92aWRlZCB2YWx1ZXMgdG8gY3JlYXRlIHRoZSBwYWdlIG91dHB1dC5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNyZWF0ZU91dHB1dChcbiAgICAgICAgdGFyZ2V0OiBzdHJpbmcsXG4gICAgICAgIHRhZ3M6IHN0cmluZ1tdLFxuICAgICAgICBzdHJheVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgZGVmYXVsdFNvcnQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgY2F0ZWdvcmllczogc3RyaW5nW10sXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFRhcmdldCA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRhcmdldCk7XG5cbiAgICAgICAgY29uc3QgZm9ybWF0dGVkVGl0bGUgPSBwYXJzZWRUYXJnZXRcbiAgICAgICAgICAgID8gYCR7cGFyc2VkVGFyZ2V0LmdldE5hbWVzcGFjZUlkKCkgPT09IDYgfHwgcGFyc2VkVGFyZ2V0LmdldE5hbWVzcGFjZUlkKCkgPT09IDE0ID8gJzonIDogJyd9JHtwYXJzZWRUYXJnZXQuZ2V0UHJlZml4ZWRUZXh0KCl9JHtwYXJzZWRUYXJnZXQuZ2V0RnJhZ21lbnQoKSA/IGAjJHtwYXJzZWRUYXJnZXQuZ2V0RnJhZ21lbnQoKX1gIDogJyd9YFxuICAgICAgICAgICAgOiB0YXJnZXQudHJpbSgpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkXG4gICAgICAgICAgICAgICAgLmdldE1haW5UZXh0KClcbiAgICAgICAgICAgICAgICAudG9Mb2NhbGVMb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgIC5ub3JtYWxpemUoJ05GRCcpXG4gICAgICAgICAgICAgICAgLnJlcGxhY2VBbGwoL1tcXHV7MzAwfS1cXHV7MzZGfV0vZ3UsICcnKSA9PT1cbiAgICAgICAgICAgIGRlZmF1bHRTb3J0XG4gICAgICAgICAgICAgICAgPy50b0xvd2VyQ2FzZSgpXG4gICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcbiAgICAgICAgICAgICAgICAucmVwbGFjZUFsbCgvW1xcdXszMDB9LVxcdXszNkZ9XS9ndSwgJycpXG4gICAgICAgIClcbiAgICAgICAgICAgIGRlZmF1bHRTb3J0ID0gdW5kZWZpbmVkOyAvLyBDaGVjayBpZiB0aXRsZXMgbm9ybWFsaXplIHRvIHRoZSBzYW1lIHRleHQsIGFuZCByZW1vdmVzIHRoZSBERUZBVUxUU09SVCBpZiBzb1xuXG4gICAgICAgIGNvbnN0IHRhZ3NXaXRoQXJndW1lbnRzID0gdGFncy5tYXAoKHRhZykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm91bmRBcmd1bWVudEVkaXRvciA9IHRoaXMudGVtcGxhdGVFZGl0b3JzSW5mby5maW5kKChlZGl0b3JJbmZvKSA9PiBlZGl0b3JJbmZvLm5hbWUgPT09IHRhZyk7XG4gICAgICAgICAgICBpZiAoIWZvdW5kQXJndW1lbnRFZGl0b3IpIHJldHVybiBge3ske3RhZ319fWA7XG5cbiAgICAgICAgICAgIGNvbnN0IGxhc3ROdW1iZXJQYXJhbWV0ZXJJbmRleCA9IGZvdW5kQXJndW1lbnRFZGl0b3IucGFyYW1ldGVycy5maW5kTGFzdEluZGV4KFxuICAgICAgICAgICAgICAgIChwYXJhbWV0ZXIsIGluZGV4KSA9PiBwYXJhbWV0ZXIubmFtZSA9PT0gKGluZGV4ICsgMSkudG9TdHJpbmcoKSAmJiBwYXJhbWV0ZXIuZWRpdG9yLmdldFZhbHVlKCkudHJpbSgpLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgbWFwcGVkQXJndW1lbnRzID0gZm91bmRBcmd1bWVudEVkaXRvci5wYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgLm1hcCgocGFyYW1ldGVyLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlci5lZGl0b3IuZ2V0VmFsdWUoKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUgJiYgaW5kZXggPiBsYXN0TnVtYmVyUGFyYW1ldGVySW5kZXgpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgfCR7cGFyYW1ldGVyLm5hbWUgPT09IChpbmRleCArIDEpLnRvU3RyaW5nKCkgPyAnJyA6IGAke3BhcmFtZXRlci5uYW1lfT1gfSR7dmFsdWV9YDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgICAgICAuam9pbignJyk7XG5cbiAgICAgICAgICAgIHJldHVybiBge3ske3RhZ30ke21hcHBlZEFyZ3VtZW50c319fWA7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBgI1JFRElSRUNUIFtbJHtmb3JtYXR0ZWRUaXRsZX1dXVxcbmAsXG4gICAgICAgICAgICB0YWdzLmxlbmd0aCA+IDAgPyBge3tSZWRpcmVjdCBjYXRlZ29yeSBzaGVsbHxcXG4ke3RhZ3NXaXRoQXJndW1lbnRzLmpvaW4oJ1xcbicpfVxcbn19XFxuYCA6IG51bGwsXG4gICAgICAgICAgICBzdHJheVRleHQgPyBzdHJheVRleHQgKyAnXFxuJyA6IG51bGwsXG4gICAgICAgICAgICBkZWZhdWx0U29ydCA/IGB7e0RFRkFVTFRTT1JUOiR7ZGVmYXVsdFNvcnQudHJpbSgpfX19YCA6IG51bGwsXG4gICAgICAgICAgICBjYXRlZ29yaWVzLmxlbmd0aCA+IDAgPyBjYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IGBbW0NhdGVnb3J5OiR7Y2F0ZWdvcnl9XV1gKS5qb2luKCdcXG4nKSA6IG51bGwsXG4gICAgICAgIF1cbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFZGl0cyBvciBjcmVhdGVzIGEgcGFnZSB3aXRoIGdpdmVuIHRleHQuXG4gICAgICogQHBhcmFtIHRpdGxlIFRoZSBwYWdlIHRpdGxlLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBwYWdlIHRleHQuXG4gICAgICogQHBhcmFtIHN1bW1hcnkgVGhlIGVkaXQgc3VtbWFyeS5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGVkaXRPckNyZWF0ZSh0aXRsZTogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIHN1bW1hcnk6IHN0cmluZykge1xuICAgICAgICBsZXQgd2F0Y2hsaXN0OiBXYXRjaE1ldGhvZCA9ICdwcmVmZXJlbmNlcyc7XG5cbiAgICAgICAgaWYgKHRoaXMud2F0Y2hDaGVja2JveClcbiAgICAgICAgICAgIGlmICh0aGlzLndhdGNoQ2hlY2tib3guaXNJbmRldGVybWluYXRlKCkpIHdhdGNobGlzdCA9IHRoaXMuY29uZmlnLmNyZWF0ZWRXYXRjaE1ldGhvZDtcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMud2F0Y2hDaGVja2JveC5pc1NlbGVjdGVkKCkpIHdhdGNobGlzdCA9ICd3YXRjaCc7XG4gICAgICAgICAgICBlbHNlIHdhdGNobGlzdCA9ICd1bndhdGNoJztcblxuICAgICAgICByZXR1cm4gKGF3YWl0IGFwaVxuICAgICAgICAgICAgLmVkaXQodGl0bGUsICgpID0+ICh7IHRleHQsIHN1bW1hcnkgfSkpXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yQ29kZSwgZXJyb3JJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yQ29kZSA9PT0gJ25vY3JlYXRlLW1pc3NpbmcnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBpLmNyZWF0ZSh0aXRsZSwgeyBzdW1tYXJ5LCB3YXRjaGxpc3QgfSwgdGV4dCkuY2F0Y2goKGVycm9yQ29kZSwgZXJyb3JJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIGNyZWF0aW5nICR7dGl0bGV9OiAkeyhlcnJvckluZm8gYXMgTWVkaWFXaWtpRGF0YUVycm9yKT8uZXJyb3I/LmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZXJyb3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbXcubm90aWZ5KFxuICAgICAgICAgICAgICAgICAgICBgRXJyb3IgZWRpdGluZyBvciBjcmVhdGluZyAke3RpdGxlfTogJHsoZXJyb3JJbmZvIGFzIE1lZGlhV2lraURhdGFFcnJvcik/LmVycm9yPy5pbmZvID8/ICdVbmtub3duIGVycm9yJ30gKCR7ZXJyb3JDb2RlfSlgLFxuICAgICAgICAgICAgICAgICAgICB7IHR5cGU6ICdlcnJvcicgfSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSkpIGFzIFJldHVyblR5cGU8dHlwZW9mIGFwaS5lZGl0PiB8IG51bGw7XG4gICAgfVxufVxuIiwgIi8qKlxuICogQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBhIGRpYWxvZyBwcm9tcHRpbmcgdGhlIHVzZXIgZm9yIGEgdGFyZ2V0IHBhZ2UgdG8gcmVkaXJlY3QgdG8uXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlZGlyZWN0UGFnZUhlcmVEaWFsb2cgZXh0ZW5kcyBPTy51aS5Qcm9jZXNzRGlhbG9nIHtcbiAgICBwcml2YXRlIHBhZ2VUaXRsZVBhcnNlZDogbXcuVGl0bGU7XG5cbiAgICBwcml2YXRlIHRpdGxlSW5wdXRFbGVtZW50ITogT08udWkuVGV4dElucHV0V2lkZ2V0O1xuXG4gICAgY29uc3RydWN0b3IocGFnZVRpdGxlUGFyc2VkOiBtdy5UaXRsZSkge1xuICAgICAgICBzdXBlcigpO1xuXG4gICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgIFJlZGlyZWN0UGFnZUhlcmVEaWFsb2cuc3RhdGljLm5hbWUgPSAnUmVkaXJlY3RQYWdlSGVyZURpYWxvZyc7XG4gICAgICAgIFJlZGlyZWN0UGFnZUhlcmVEaWFsb2cuc3RhdGljLnRpdGxlID0gJ1JlZGlyZWN0IHBhZ2UgaGVyZSc7XG4gICAgICAgIFJlZGlyZWN0UGFnZUhlcmVEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbXG4gICAgICAgICAgICB7IGFjdGlvbjogJ2NhbmNlbCcsIGxhYmVsOiAnQ2xvc2UnLCBmbGFnczogWydzYWZlJywgJ2Nsb3NlJ10gfSxcbiAgICAgICAgICAgIHsgYWN0aW9uOiAnY3JlYXRlJywgbGFiZWw6ICdDcmVhdGUnLCBmbGFnczogWydwcmltYXJ5JywgJ3Byb2dyZXNzaXZlJ10gfSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWNsYXNzLW1lbWJlci1vcmRlclxuICAgIGdldFNldHVwUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIFJlZGlyZWN0UGFnZUhlcmVEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldFNldHVwUHJvY2Vzcy5jYWxsKHRoaXMpLm5leHQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGFuZWxMYXlvdXQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgdGhpcy50aXRsZUlucHV0RWxlbWVudCA9IG5ldyBPTy51aS5UZXh0SW5wdXRXaWRnZXQoKTtcbiAgICAgICAgICAgIHRoaXMudGl0bGVJbnB1dEVsZW1lbnQub24oJ2VudGVyJywgKCkgPT4gdGhpcy5leGVjdXRlQWN0aW9uKCdjcmVhdGUnKSk7XG5cbiAgICAgICAgICAgIGNvbnN0IGZpZWxkTGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMudGl0bGVJbnB1dEVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KCc8Yj5QYWdlIHRvIHJlZGlyZWN0IGhlcmU6PC9iPicpLFxuICAgICAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgICAgICAgICBoZWxwOiAnVGhpcyB0aXRsZSB3aWxsIGJlIG9wZW5lZCBpbiBhIG5ldyB0YWIgdXBvbiBjbGlja2luZyBcIkNyZWF0ZVwiLCB3aGVyZSB0aGUgZWRpdG9yIHdpbGwgYXV0b21hdGljYWxseSBvcGVuIGFuZCBiZSB0YXJnZXRpbmcgdGhlIGN1cnJlbnQgdGl0bGUuJyxcbiAgICAgICAgICAgICAgICBoZWxwSW5saW5lOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHBhbmVsTGF5b3V0LiRlbGVtZW50LmFwcGVuZChmaWVsZExheW91dC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICh0aGlzIGFzIHVua25vd24gYXMgeyAkYm9keTogSlF1ZXJ5IH0pLiRib2R5LmFwcGVuZChwYW5lbExheW91dC4kZWxlbWVudCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBnZXRBY3Rpb25Qcm9jZXNzID0gKGFjdGlvbjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoYWN0aW9uKSB7XG4gICAgICAgICAgICBjYXNlICdjcmVhdGUnOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPTy51aS5Qcm9jZXNzKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGl0bGUgPSB0aGlzLnRpdGxlSW5wdXRFbGVtZW50LmdldFZhbHVlKCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJzZWRUaXRsZSA9IG13LlRpdGxlLm5ld0Zyb21UZXh0KHRpdGxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZWRUaXRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KCdJbnZhbGlkIHRpdGxlLiBQbGVhc2UgZW50ZXIgYSB2YWxpZCBwYWdlIHRpdGxlLicsIHsgdHlwZTogJ2Vycm9yJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRUaXRsZS5nZXRGcmFnbWVudCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoJ1RoZSB0aXRsZSBjYW5ub3QgY29udGFpbiBhIGZyYWdtZW50LCB0aGlzIHdpbGwgYmUgaWdub3JlZC4nLCB7IHR5cGU6ICd3YXJuJyB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQocGFyc2VkVGl0bGUuZ2V0UHJlZml4ZWRUZXh0KCkpITtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHBhcnNlZFRpdGxlLmdldFVybCh7IHJlZGlyZWN0OiAnbm8nLCByZWRpcmVjdEhlbHBlclRhcmdldDogdGhpcy5wYWdlVGl0bGVQYXJzZWQuZ2V0UHJlZml4ZWRUZXh0KCkgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vcGVuKHVybCwgJ19ibGFuaycpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnY2FuY2VsJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUmVkaXJlY3RQYWdlSGVyZURpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0QWN0aW9uUHJvY2Vzcy5jYWxsKHRoaXMsIGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgZ2V0VGVhcmRvd25Qcm9jZXNzID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gUmVkaXJlY3RQYWdlSGVyZURpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0VGVhcmRvd25Qcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xufVxuXG5PYmplY3QuYXNzaWduKFJlZGlyZWN0UGFnZUhlcmVEaWFsb2cucHJvdG90eXBlLCBPTy51aS5Qcm9jZXNzRGlhbG9nLnByb3RvdHlwZSk7XG4iLCAiaW1wb3J0IHsgZ2V0UGFnZUNvbnRlbnQgfSBmcm9tICdAL3V0aWxpdHknO1xuaW1wb3J0IHR5cGUgeyBXYXRjaE1ldGhvZCB9IGZyb20gJ0BzY3JpcHRzL2FmY3JjLWhlbHBlci9hZmNyYy1oZWxwZXInO1xuaW1wb3J0IHR5cGUgeyBSZWRpcmVjdFRlbXBsYXRlRGF0YSB9IGZyb20gJ0BzY3JpcHRzL3JlZGlyZWN0LWhlbHBlci9yZWRpcmVjdC1oZWxwZXItZGlhbG9nJztcbmltcG9ydCBjc3NDb250ZW50IGZyb20gJ0BzdHlsZXMvcmVkaXJlY3QtaGVscGVyLmNzcycgd2l0aCB7IHR5cGU6ICdjc3MnIH07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVkaXJlY3RIZWxwZXJDb25maWcge1xuICAgIGNyZWF0ZWRXYXRjaE1ldGhvZDogV2F0Y2hNZXRob2Q7XG4gICAgcGF0cm9sQnlEZWZhdWx0OiBib29sZWFuO1xufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gICAgaW50ZXJmYWNlIFdpbmRvdyB7XG4gICAgICAgIHJlZGlyZWN0SGVscGVyQ29uZmlndXJhdGlvbj86IFBhcnRpYWw8UmVkaXJlY3RIZWxwZXJDb25maWc+O1xuICAgIH1cbn1cblxuY29uc3QgZGVwZW5kZW5jaWVzID0gW1xuICAgICdtZWRpYXdpa2kudXRpbCcsXG4gICAgJ29vanMtdWktY29yZScsXG4gICAgJ29vanMtdWktd2lkZ2V0cycsXG4gICAgJ29vanMtdWktd2luZG93cycsXG4gICAgJ29vanMtdWkuc3R5bGVzLmljb25zLWNvbnRlbnQnLFxuICAgICdvb2pzLXVpLnN0eWxlcy5pY29ucy1lZGl0aW5nLWNvcmUnLFxuXTtcblxubXcubG9hZGVyLnVzaW5nKGRlcGVuZGVuY2llcywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgZGVmYXVsdDogUmVkaXJlY3RIZWxwZXJEaWFsb2cgfSA9IGF3YWl0IGltcG9ydCgnQHNjcmlwdHMvcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LWhlbHBlci1kaWFsb2cnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cbiAgICBjb25zdCB7IGRlZmF1bHQ6IFJlZGlyZWN0UGFnZUhlcmVEaWFsb2cgfSA9IGF3YWl0IGltcG9ydCgnQHNjcmlwdHMvcmVkaXJlY3QtaGVscGVyL3JlZGlyZWN0LXBhZ2UtaGVyZS1kaWFsb2cnKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb25cblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZW50aXJlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIHJlZGlyZWN0LWhlbHBlciBzY3JpcHQuXG4gICAgICovXG4gICAgY2xhc3MgUmVkaXJlY3RIZWxwZXIge1xuICAgICAgICBwcml2YXRlIHJlZGlyZWN0VGVtcGxhdGVzITogUmVkaXJlY3RUZW1wbGF0ZURhdGE7XG4gICAgICAgIHByaXZhdGUgY29udGVudFRleHQhOiBIVE1MRGl2RWxlbWVudDtcbiAgICAgICAgcHJpdmF0ZSBwYWdlVGl0bGUhOiBzdHJpbmc7XG4gICAgICAgIHByaXZhdGUgcGFnZVRpdGxlUGFyc2VkITogbXcuVGl0bGU7XG4gICAgICAgIHByaXZhdGUgY29uZmlnITogUmVkaXJlY3RIZWxwZXJDb25maWc7XG5cbiAgICAgICAgcHJpdmF0ZSBpc09uRW53aWtpID0gbXcuY29uZmlnLmdldCgnd2dEQm5hbWUnKSA9PT0gJ2Vud2lraSc7XG4gICAgICAgIHByaXZhdGUgaXNNaXNzaW5nID0gbXcuY29uZmlnLmdldCgnd2dBcnRpY2xlSWQnKSA9PT0gMDtcbiAgICAgICAgcHJpdmF0ZSBpc1JlZGlyZWN0ID0gbXcuY29uZmlnLmdldCgnd2dJc1JlZGlyZWN0Jyk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJ1bnMgdGhlIHJlZGlyZWN0IGhlbHBlci5cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlID0gbXcuY29uZmlnLmdldCgnd2dQYWdlTmFtZScpO1xuXG4gICAgICAgICAgICBjb25zdCBwYWdlVGl0bGVQYXJzZWQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dCh0aGlzLnBhZ2VUaXRsZSk7XG4gICAgICAgICAgICBpZiAoIXBhZ2VUaXRsZVBhcnNlZCkgcmV0dXJuIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBGYWlsZWQgdG8gcGFyc2UgcGFnZSB0aXRsZSEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIHRoaXMucGFnZVRpdGxlUGFyc2VkID0gcGFnZVRpdGxlUGFyc2VkO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMucGFzc2VzUHJlQ2hlY2tzKCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRSZWRpcmVjdFBhZ2VIZXJlKCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucmVkaXJlY3RUZW1wbGF0ZXMgPSBhd2FpdCB0aGlzLmZldGNoUmVkaXJlY3RUZW1wbGF0ZXMoKTtcblxuICAgICAgICAgICAgY29uc3QgY29udGVudFRleHQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PignI213LWNvbnRlbnQtdGV4dCcpO1xuICAgICAgICAgICAgaWYgKCFjb250ZW50VGV4dCkgcmV0dXJuIG13Lm5vdGlmeSgncmVkaXJlY3QtaGVscGVyOiBGYWlsZWQgdG8gZmluZCBjb250ZW50IHRleHQgZWxlbWVudCEnLCB7IHR5cGU6ICdlcnJvcicgfSk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGVudFRleHQgPSBjb250ZW50VGV4dDtcblxuICAgICAgICAgICAgY29uc3QgY29uZmlnT3ZlcnJpZGVzID0gd2luZG93LnJlZGlyZWN0SGVscGVyQ29uZmlndXJhdGlvbjtcblxuICAgICAgICAgICAgY29uc3QgY3JlYXRlZFdhdGNoTWV0aG9kID1cbiAgICAgICAgICAgICAgICBjb25maWdPdmVycmlkZXM/LmNyZWF0ZWRXYXRjaE1ldGhvZCAmJlxuICAgICAgICAgICAgICAgIFsnbm9jaGFuZ2UnLCAncHJlZmVyZW5jZXMnLCAndW53YXRjaCcsICd3YXRjaCddLmluY2x1ZGVzKGNvbmZpZ092ZXJyaWRlcy5jcmVhdGVkV2F0Y2hNZXRob2QpXG4gICAgICAgICAgICAgICAgICAgID8gY29uZmlnT3ZlcnJpZGVzLmNyZWF0ZWRXYXRjaE1ldGhvZFxuICAgICAgICAgICAgICAgICAgICA6ICdwcmVmZXJlbmNlcyc7XG5cbiAgICAgICAgICAgIGNvbnN0IHNob3VsZFBhdHJvbEJ5RGVmYXVsdCA9ICEoXG4gICAgICAgICAgICAgICAgY29uZmlnT3ZlcnJpZGVzICYmXG4gICAgICAgICAgICAgICAgJ3BhdHJvbEJ5RGVmYXVsdCcgaW4gY29uZmlnT3ZlcnJpZGVzICYmXG4gICAgICAgICAgICAgICAgY29uZmlnT3ZlcnJpZGVzLnBhdHJvbEJ5RGVmYXVsdCA9PT0gZmFsc2VcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHRoaXMuY29uZmlnID0geyBjcmVhdGVkV2F0Y2hNZXRob2QsIHBhdHJvbEJ5RGVmYXVsdDogc2hvdWxkUGF0cm9sQnlEZWZhdWx0IH07XG5cbiAgICAgICAgICAgIHRoaXMuY2hlY2tQYWdlQW5kTG9hZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIENoZWNrcyBpZiB0aGUgcGFnZSBwYXNzZXMgcHJlIGNoZWNrcy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgcGFzc2VzUHJlQ2hlY2tzKCkge1xuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpID49IDAsIC8vIElzIG5vdCB2aXJ0dWFsIG5hbWVzcGFjZVxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnSXNQcm9iYWJseUVkaXRhYmxlJyksIC8vIFBhZ2UgaXMgZWRpdGFibGVcbiAgICAgICAgICAgICAgICBtdy5jb25maWcuZ2V0KCd3Z0FjdGlvbicpID09PSAndmlldycgfHwgbXcuY29uZmlnLmdldCgnd2dBY3Rpb24nKSA9PT0gJ2VkaXQnLCAvLyBWaWV3aW5nIG9yIGVkaXRpbmcgdGhlIHBhZ2VcbiAgICAgICAgICAgICAgICAobXcuY29uZmlnLmdldCgnd2dSZXZpc2lvbklkJykgfHwgbXcuY29uZmlnLmdldCgnd2dDdXJSZXZpc2lvbklkJykpID09PSBtdy5jb25maWcuZ2V0KCd3Z0N1clJldmlzaW9uSWQnKSwgLy8gVmlld2luZyB0aGUgY3VycmVudCByZXZpc2lvblxuICAgICAgICAgICAgICAgICFtdy5jb25maWcuZ2V0KCd3Z0RpZmZPbGRJZCcpLCAvLyBOb3Qgdmlld2luZyBhIGRpZmZcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIHJldHVybiBjb25kaXRpb25zLmV2ZXJ5KEJvb2xlYW4pO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoZXMgdGhlIHJlZGlyZWN0IHRlbXBsYXRlcy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgYXN5bmMgZmV0Y2hSZWRpcmVjdFRlbXBsYXRlcygpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzT25Fbndpa2lcbiAgICAgICAgICAgICAgICA/IChKU09OLnBhcnNlKChhd2FpdCBnZXRQYWdlQ29udGVudCgnVXNlcjpFZWppdDQzL3NjcmlwdHMvcmVkaXJlY3QtaGVscGVyLmpzb24nKSkgPz8gJ3t9JykgYXMgUmVkaXJlY3RUZW1wbGF0ZURhdGEpXG4gICAgICAgICAgICAgICAgOiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVja3MgYSBwYWdlJ3Mgc3RhdHVzIGFuZCBsb2FkcyB0aGUgaGVscGVyIGFwcHJvcHJpYXRlbHkuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGNoZWNrUGFnZUFuZExvYWQoKSB7XG4gICAgICAgICAgICBtdy51dGlsLmFkZENTUyhjc3NDb250ZW50KTtcblxuICAgICAgICAgICAgY29uc3QgZGlhbG9nSW5mbyA9IHtcbiAgICAgICAgICAgICAgICByZWRpcmVjdFRlbXBsYXRlczogdGhpcy5yZWRpcmVjdFRlbXBsYXRlcyxcbiAgICAgICAgICAgICAgICBjb250ZW50VGV4dDogdGhpcy5jb250ZW50VGV4dCxcbiAgICAgICAgICAgICAgICBwYWdlVGl0bGU6IHRoaXMucGFnZVRpdGxlLFxuICAgICAgICAgICAgICAgIHBhZ2VUaXRsZVBhcnNlZDogdGhpcy5wYWdlVGl0bGVQYXJzZWQsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgaGFzTG9hZGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0SGVscGVyVGFyZ2V0ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoJ3JlZGlyZWN0SGVscGVyVGFyZ2V0Jyk7XG4gICAgICAgICAgICBpZiAocmVkaXJlY3RIZWxwZXJUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRUYXJnZXQgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChyZWRpcmVjdEhlbHBlclRhcmdldCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZFRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICB2b2lkIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgLi4uZGlhbG9nSW5mbywgZGVmYXVsdFJlZGlyZWN0VGFyZ2V0OiBwYXJzZWRUYXJnZXQuZ2V0UHJlZml4ZWRUZXh0KCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLmlzTWlzc2luZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09uRW53aWtpLFxuICAgICAgICAgICAgICAgICAgICApLmxvYWQoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgbXcubm90aWZ5KCdyZWRpcmVjdC1oZWxwZXI6IEludmFsaWQgcmVkaXJlY3QgdGFyZ2V0IHNwZWNpZmllZCBpbiBVUkwuJywgeyB0eXBlOiAnZXJyb3InIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWhhc0xvYWRlZClcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2NyZWF0ZS1yZWRpcmVjdC1idXR0b24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdDcmVhdGUgcmVkaXJlY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2FydGljbGVSZWRpcmVjdCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBmbGFnczogWydwcm9ncmVzc2l2ZSddLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbi4kZWxlbWVudFswXS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlLCB0aGlzLmNvbmZpZywgdGhpcy5pc09uRW53aWtpKS5sb2FkKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFRleHQucHJlcGVuZChidXR0b24uJGVsZW1lbnRbMF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1JlZGlyZWN0KSB2b2lkIG5ldyBSZWRpcmVjdEhlbHBlckRpYWxvZyhkaWFsb2dJbmZvLCB0cnVlLCB0aGlzLmNvbmZpZywgdGhpcy5pc09uRW53aWtpKS5sb2FkKCk7XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0SGVscGVyUG9ydGxldExpbmsgPSBtdy51dGlsLmFkZFBvcnRsZXRMaW5rKFxuICAgICAgICAgICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC10YicgOiAncC1jYWN0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnIycsXG4gICAgICAgICAgICAgICAgICAgICAgICAnUmVkaXJlY3QgcGFnZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAncmVkaXJlY3QtaGVscGVyJyxcbiAgICAgICAgICAgICAgICAgICAgKSE7XG4gICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0SGVscGVyUG9ydGxldExpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgbmV3IFJlZGlyZWN0SGVscGVyRGlhbG9nKGRpYWxvZ0luZm8sIGZhbHNlLCB0aGlzLmNvbmZpZywgdGhpcy5pc09uRW53aWtpKS5sb2FkKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7IHRvcDogMCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdEhlbHBlclBvcnRsZXRMaW5rLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMubG9hZFJlZGlyZWN0UGFnZUhlcmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyB0aGUgXCJSZWRpcmVjdCBwYWdlIGhlcmVcIiBmdW5jdGlvbmFsaXR5LCBpZiBub3Qgb24gYSByZWRpcmVjdC5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgbG9hZFJlZGlyZWN0UGFnZUhlcmUoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc01pc3NpbmcgfHwgdGhpcy5pc1JlZGlyZWN0KSByZXR1cm47XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0UGFnZUhlcmVQb3J0bGV0TGluayA9IG13LnV0aWwuYWRkUG9ydGxldExpbmsoXG4gICAgICAgICAgICAgICAgbXcuY29uZmlnLmdldCgnc2tpbicpID09PSAnbWluZXJ2YScgPyAncC1jYWN0aW9ucycgOiAncC1jYWN0aW9ucycsXG4gICAgICAgICAgICAgICAgJyMnLFxuICAgICAgICAgICAgICAgICdSZWRpcmVjdCBwYWdlIGhlcmUnLFxuICAgICAgICAgICAgICAgICdyZWRpcmVjdC1wYWdlLWhlcmUnLFxuICAgICAgICAgICAgKSE7XG4gICAgICAgICAgICByZWRpcmVjdFBhZ2VIZXJlUG9ydGxldExpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgd2luZG93TWFuYWdlciA9IG5ldyBPTy51aS5XaW5kb3dNYW5hZ2VyKCk7XG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBkaWFsb2cgPSBuZXcgUmVkaXJlY3RQYWdlSGVyZURpYWxvZyh0aGlzLnBhZ2VUaXRsZVBhcnNlZCk7XG4gICAgICAgICAgICAgICAgd2luZG93TWFuYWdlci5hZGRXaW5kb3dzKFtkaWFsb2ddKTtcblxuICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZvaWQgbmV3IFJlZGlyZWN0SGVscGVyKCkucnVuKCk7XG59KTtcbiIsICIjY3JlYXRlLXJlZGlyZWN0LWJ1dHRvbnttYXJnaW4tYm90dG9tOjIwcHh9I3JlZGlyZWN0LWhlbHBlci1ib3h7d2lkdGg6NzAwcHg7bWF4LXdpZHRoOmNhbGMoMTAwJSAtIDUwcHgpO21hcmdpbi1yaWdodDphdXRvO21hcmdpbi1ib3R0b206MjVweCFpbXBvcnRhbnQ7bWFyZ2luLWxlZnQ6YXV0bztjb2xvcjojMjAyMTIyO2NvbG9yOnZhcigtLWNvbG9yLWJhc2UsICMyMDIxMjIpO2JhY2tncm91bmQtY29sb3I6I2Y4ZjlmYTtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJhY2tncm91bmQtY29sb3ItbmV1dHJhbC1zdWJ0bGUsICNmOGY5ZmEpfS5yZWRpcmVjdC1pbnB1dC1sYXlvdXQgbGFiZWx7Zm9udC13ZWlnaHQ6NzAwfS5yZWRpcmVjdC1oZWxwZXItcmVkaXJlY3QtcG9zc2liaWxpdGllczphZnRlcntmb250LXN0eWxlOml0YWxpYztjb250ZW50OlwiIChyZWRpcmVjdCB3aXRoIHBvc3NpYmlsaXRpZXMpXCJ9LnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lcnttYXJnaW4tdG9wOjEwcHg7bWFyZ2luLWJvdHRvbToxMHB4O3BhZGRpbmc6NXB4O2JhY2tncm91bmQtY29sb3I6I2VhZWNmMDtiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJhY2tncm91bmQtY29sb3ItaW50ZXJhY3RpdmUsICNlYWVjZjApO2JvcmRlci1yYWRpdXM6NXB4fS5yZWRpcmVjdC1oZWxwZXItdGVtcGxhdGUtcGFyYW1ldGVycy1jb250YWluZXIgc3VtbWFyeXtmb250LXdlaWdodDo3MDA7Y3Vyc29yOnBvaW50ZXJ9LnJlZGlyZWN0LWhlbHBlci10ZW1wbGF0ZS1wYXJhbWV0ZXJzLWNvbnRhaW5lciBkZXRhaWxze21hcmdpbi10b3A6NXB4O21hcmdpbi1ib3R0b206NXB4O3BhZGRpbmc6NXB4O2JhY2tncm91bmQtY29sb3I6I2RhZGRlMztiYWNrZ3JvdW5kLWNvbG9yOnZhcigtLWJhY2tncm91bmQtY29sb3ItaW50ZXJhY3RpdmUtLWhvdmVyLCAjZGFkZGUzKTtib3JkZXItcmFkaXVzOjVweH0jcmVkaXJlY3QtaGVscGVyLW5vLXRlbXBsYXRlcy1tZXNzYWdle3BhZGRpbmc6NXB4fSNyZWRpcmVjdC1oZWxwZXItc3VtbWFyeS1sYXlvdXR7bWFyZ2luLXRvcDoxNXB4O3BhZGRpbmctdG9wOjEwcHg7Ym9yZGVyLXRvcDoxcHggc29saWQgI2EyYTliMTtib3JkZXItdG9wOjFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3ItYmFzZSwgI2EyYTliMSl9I3JlZGlyZWN0LWhlbHBlci1zdWJtaXQtbGF5b3V0e21hcmdpbi10b3A6MTBweH0jcmVkaXJlY3QtaGVscGVyLXN1Ym1pdC1sYXlvdXQ+KnttYXJnaW4tYm90dG9tOjB9LnJlZGlyZWN0LWhlbHBlci13YXJuaW5ne21hcmdpbi10b3A6OHB4fS5yZWRpcmVjdC1oZWxwZXItYXV0b2ZpeC1idXR0b257bWFyZ2luLWxlZnQ6NXB4O2ZvbnQtc2l6ZToxMnB4fS5yZWRpcmVjdC1oZWxwZXItYXV0b2ZpeC1idXR0b24gYXttaW4taGVpZ2h0OjAhaW1wb3J0YW50O21pbi1oZWlnaHQ6aW5pdGlhbCFpbXBvcnRhbnQ7cGFkZGluZzozcHggNHB4IWltcG9ydGFudH0ucmVkaXJlY3QtaGVscGVyLWF1dG9maXgtYWxsLWJ1dHRvbnttYXJnaW4tdG9wOjhweH1cbiJdLAogICJtYXBwaW5ncyI6ICI7OztxTUFTQSxlQUFzQkEsRUFBZUMsRUFBZSxDQUNoRCxPQUNLLE1BQU1DLEVBQUksSUFBSSxDQUNYLE9BQVEsUUFDUixjQUFlLElBQ2YsS0FBTSxZQUNOLE9BQVEsVUFDUixRQUFTLE9BQ1QsT0FBUUQsQ0FDWixDQUFtQyxHQUNyQyxNQUFNLE1BQU0sQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLE1BQU0sS0FBSyxRQUFRLEtBQUssQ0FDNUQsQ0FwQkEsSUFHYUMsRUFIYkMsRUFBQUMsRUFBQSxrQkFHYUYsRUFBTSxJQUFJLEdBQUcsTUNIMUIsSUFPcUJHLEVBUHJCQyxFQUFBQyxFQUFBLGtCQUNBQyxJQU1xQkgsRUFBckIs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aEIsRUFBcUJVLEVBQVksR0FBTyxLQUFLLE9BQVEsS0FBSyxVQUFVLEVBQUUsS0FBSyxFQUVwRixPQUFPLFNBQVMsQ0FBRSxJQUFLLEVBQUcsU0FBVSxRQUFTLENBQUMsRUFFOUNLLEVBQTBCLE9BQU8sQ0FDckMsQ0FBQyxDQUNMLENBRUosS0FBSyxxQkFBcUIsQ0FDOUIsQ0FLUSxzQkFBdUIsQ0FDM0IsR0FBSSxLQUFLLFdBQWEsS0FBSyxXQUFZLE9BRUgsR0FBRyxLQUFLLGdCQUN4QyxHQUFHLE9BQU8sSUFBSSxNQUFNLElBQU0sVUFBWSxjQUN0QyxJQUNBLHFCQUNBLG9CQUNKLEVBQzRCLGlCQUFpQixRQUFVQyxHQUFVLENBQzdEQSxFQUFNLGVBQWUsRUFFckIsSUFBTUMsRUFBZ0IsSUFBSSxHQUFHLEdBQUcsY0FDaEMsU0FBUyxLQUFLLE9BQU9BLEVBQWMsU0FBUyxDQUFDLENBQUMsRUFFOUMsSUFBTUMsRUFBUyxJQUFJakIsRUFBdUIsS0FBSyxlQUFlLEVBQzlEZ0IsRUFBYyxXQUFXLENBQUNDLENBQU0sQ0FBQyxFQUVqQ0EsRUFBTyxLQUFLLENBQ2hCLENBQUMsQ0FDTCxDQUNKLENBRUssSUFBSWhCLEVBQWUsRUFBRSxJQUFJLENBQ2xDLENBQUMiLAogICJuYW1lcyI6IFsiZ2V0UGFnZUNvbnRlbnQiLCAidGl0bGUiLCAiYXBpIiwgImluaXRfdXRpbGl0eSIsICJfX2VzbU1pbiIsICJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgImluaXRfY2F0ZWdvcnlfaW5wdXRfd2lkZ2V0IiwgIl9fZXNtTWluIiwgImluaXRfdXRpbGl0eSIsICJjb25maWciLCAidmFsdWUiLCAiZGVmZXJyZWQiLCAic29ydEtleSIsICJyZXNwb25zZSIsICJwYXJzZWRUaXRsZSIsICJhcGkiLCAicmVzdWx0IiwgInBhZ2VzIiwgInBhZ2UiLCAiY2F0ZWdvcnkiLCAidGl0bGVXaXRob3V0TmFtZXNwYWNlIiwgImRhdGEiLCAibGFiZWwiLCAiQ2hhbmdlc0RpYWxvZyIsICJpbml0X2NoYW5nZXNfZGlhbG9nIiwgIl9fZXNtTWluIiwgImluaXRfdXRpbGl0eSIsICJfQ2hhbmdlc0RpYWxvZyIsICJjb25maWciLCAib2xkVGV4dCIsICJuZXdUZXh0IiwgImFwaSIsICJyZXN1bHQiLCAiY29tcGFyaXNvbiIsICJub0NoYW5nZXNFbGVtZW50IiwgInBhbmVsTGF5b3V0IiwgImFjdGlvbiIsICJPdXRwdXRQcmV2aWV3RGlhbG9nIiwgImluaXRfb3V0cHV0X3ByZXZpZXdfZGlhbG9nIiwgIl9fZXNtTWluIiwgImluaXRfdXRpbGl0eSIsICJfT3V0cHV0UHJldmlld0RpYWxvZyIsICJjb25maWciLCAicGFnZVRpdGxlUGFyc2VkIiwgImFwaSIsICJyZXN1bHQiLCAidGFnc0NvbnRlbnQiLCAiY2F0ZWdvcmllc0NvbnRlbnQiLCAicGFuZWxMYXlvdXQiLCAiYWN0aW9uIiwgImdldEFuY2hvcnNGcm9tSHRtbCIsICJodG1sIiwgInRpdGxlIiwgImRvY3VtZW50IiwgInF1ZXJ5IiwgIkFOQ0hPUl9RVUVSSUVTX1RPX1JFTU9WRSIsICJlbGVtZW50IiwgIkFOQ0hPUl9DTEFTU0VTX1RPX0VYQ0xVREUiLCAiY2xhc3NOYW1lIiwgImZyYWdtZW50IiwgImZ1bGxUaXRsZSIsICJSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0IiwgImluaXRfcmVkaXJlY3RfdGFyZ2V0X2lucHV0X3dpZGdldCIsICJfX2VzbU1pbiIsICJpbml0X3V0aWxpdHkiLCAiY29uZmlnIiwgInBhZ2VUaXRsZVBhcnNlZCIsICJ2YWx1ZSIsICJkZWZlcnJlZCIsICJzZWFyY2hlZEZyYWdtZW50IiwgInNlY3Rpb25zQW5kRnJhZ21lbnRzIiwgInNlY3Rpb25zIiwgImlzU2VjdGlvbiIsICJhbmNob3JzIiwgImFwaSIsICJyZXN1bHQiLCAiYWxsU2VjdGlvbnMiLCAic2VjdGlvbiIsICJhbGxBbmNob3JzIiwgInBhcnNlZFRpdGxlIiwgInBhZ2UiLCAicmVzcG9uc2UiLCAiZGF0YSIsICJsYWJlbCIsICJtYXRjaGVkU2VjdGlvbnMiLCAibWF0Y2hlZFNlY3Rpb25zU2V0IiwgIm1hdGNoZWRBbmNob3JzIiwgIm1hcHBlZE1hdGNoZWRTZWN0aW9ucyIsICJtYXBwZWRNYXRjaGVkQW5jaG9ycyIsICJyZWRpcmVjdF9oZWxwZXJfZGlhbG9nX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiUmVkaXJlY3RIZWxwZXJEaWFsb2ciLCAiaW5pdF9yZWRpcmVjdF9oZWxwZXJfZGlhbG9nIiwgIl9fZXNtTWluIiwgImluaXRfdXRpbGl0eSIsICJpbml0X2NhdGVnb3J5X2lucHV0X3dpZGdldCIsICJpbml0X2NoYW5nZXNfZGlhbG9nIiwgImluaXRfb3V0cHV0X3ByZXZpZXdfZGlhbG9nIiwgImluaXRfcmVkaXJlY3RfdGFyZ2V0X2lucHV0X3dpZGdldCIsICJyZWRpcmVjdFRlbXBsYXRlcyIsICJjb250ZW50VGV4dCIsICJwYWdlVGl0bGUiLCAicGFnZVRpdGxlUGFyc2VkIiwgImRlZmF1bHRSZWRpcmVjdFRhcmdldCIsICJkb2VzRXhpc3QiLCAiY29uZmlnIiwgImlzT25Fbndpa2kiLCAiYXBpIiwgInN1YmplY3RQYWdlQ29udGVudCIsICJnZXRQYWdlQ29udGVudCIsICJ0YXJnZXQiLCAiaXNGcm9tTW92ZSIsICJ0YWdPclJlZGlyZWN0IiwgImN1cnJlbnRUaXRsZVNwbGl0IiwgImN1cnJlbnRTdWJwYWdlIiwgInJvb3RQYWdlQ29udGVudCIsICJ0YXJnZXRUaXRsZSIsICJSZWRpcmVjdFRhcmdldElucHV0V2lkZ2V0IiwgInZhbHVlIiwgInRhZyIsICJyZWRpcmVjdCIsICJsYWJlbCIsICJzZWxlY3RlZEVsZW1lbnRzIiwgInNlbGVjdGVkVGFncyIsICJlbGVtZW50IiwgInNvcnRlZFRhZ3MiLCAiYSIsICJiIiwgImxhc3RFbGVtZW50IiwgImVkaXRvckluZm8iLCAic2hvd25UZW1wbGF0ZUVkaXRvcnMiLCAic3VtbWFyeUVsZW1lbnQiLCAibm9UZW1wbGF0ZXNNZXNzYWdlIiwgInRlbXBsYXRlTmFtZSIsICJ0ZW1wbGF0ZURhdGEiLCAicGFyYW1ldGVycyIsICJkZXRhaWxzIiwgInN1bW1hcnkiLCAiZWxlbWVudERhdGEiLCAicGFyYW1ldGVyTmFtZSIsICJwYXJhbWV0ZXJEYXRhIiwgImlucHV0IiwgImlucHV0TGF5b3V0IiwgIm5hbWUiLCAiZ2VuZXJhdGlvbmFsU3VmZml4IiwgImxhc3ROYW1lIiwgIm90aGVyTmFtZXMiLCAibmV3TmFtZSIsICJsZWFkaW5nQXJ0aWNsZSIsICJDYXRlZ29yeUlucHV0V2lkZ2V0IiwgInBhZ2VzIiwgInBhZ2UiLCAic2VsZWN0ZWRDYXRlZ29yaWVzIiwgInNvcnRlZENhdGVnb3JpZXMiLCAid2luZG93TWFuYWdlciIsICJ0ZW1wbGF0ZVByZXZpZXdEaWFsb2ciLCAiT3V0cHV0UHJldmlld0RpYWxvZyIsICJzaG93Q2hhbmdlc0RpYWxvZyIsICJDaGFuZ2VzRGlhbG9nIiwgImNoZWNrYm94Q29uZmlnIiwgInBhZ2VUcmlhZ2VNYXJrQnV0dG9uIiwgInBhdHJvbFJlc3BvbnNlIiwgInJlZGlyZWN0VmFsdWUiLCAib2xkVGFyZ2V0IiwgImlzVGFyZ2V0Q2hhbmdlZCIsICJhcmVUYWdzQ2hhbmdlZCIsICJhcmVUYWdBcmd1bWVudHNDaGFuZ2VkIiwgInRhZ3NXaXRoUGFyYW1ldGVycyIsICJkYXRhIiwgIm9sZFRhZ0RhdGEiLCAiZm91bmRUYWdFZGl0b3JEYXRhIiwgInRlbXBsYXRlIiwgInBhcmFtZXRlckxvb3AiLCAicGFyYW1ldGVyIiwgIm9sZEFyZ3VtZW50IiwgImFyZ3VtZW50IiwgIm5ld0FyZ3VtZW50IiwgImlzRGVmYXVsdFNvcnRDaGFuZ2VkIiwgImFyZUNhdGVnb3JpZXNDaGFuZ2VkIiwgImNhdGVnb3J5IiwgImNoYW5nZXMiLCAidGFnRGF0YSIsICJvcmlnaW5hbFJlZGlyZWN0VGFncyIsICJtYXRjaCIsICJuZXdUYWciLCAiZm9ybWF0dGVkQXJndW1lbnRzIiwgImluZGV4IiwgImZvdW5kVGVtcGxhdGVFZGl0b3IiLCAiZm91bmRQYXJhbWV0ZXJFZGl0b3IiLCAiZXJyb3JzIiwgImRlc3RpbmF0aW9uIiwgInRhZ3MiLCAiZGVzdGluYXRpb25EYXRhIiwgImVycm9yQ29kZSIsICJkZXN0aW5hdGlvblBhcnNlUmVzdWx0IiwgImRlc3RpbmF0aW9uUmVkaXJlY3QiLCAiZnJhZ21lbnQiLCAidmFsaWRTZWN0aW9ucyIsICJzZWN0aW9uIiwgInZhbGlkU2VjdGlvbnNTZXQiLCAidmFsaWRBbmNob3JzIiwgImdldEFuY2hvcnNGcm9tSHRtbCIsICJpc1ZhbGlkU2VjdGlvbiIsICJpc1ZhbGlkQW5jaG9yIiwgImlzVGFyZ2V0RGlzYW1iaWd1YXRpb25QYWdlIiwgImlzVGFyZ2V0U3VybmFtZUxpc3QiLCAidG9EaXNhbWJpZ3VhdGlvblBhZ2VUYWdzIiwgInRvU3VybmFtZUxpc3RUYWdzIiwgImlzVGFnZ2VkQXNSZWRpcmVjdFRvRGlzYW1iaWd1YXRpb25QYWdlIiwgImlzVGFnZ2VkQXNSZWRpcmVjdFRvU3VybmFtZUxpc3QiLCAicmVxdWlyZW1lbnQiLCAiZm91bmRQYXJhbWV0ZXIiLCAiZWxlbWVudHNUb0Rpc2FibGUiLCAiYXV0b0ZpeEZ1bmN0aW9ucyIsICJ0aXRsZSIsICJtZXNzYWdlIiwgImF1dG9GaXhlcyIsICJ3YXJuaW5nTWVzc2FnZSIsICJhdXRvRml4QnV0dG9uIiwgImF1dG9GaXhGdW5jdGlvbiIsICJhdXRvRml4IiwgIm91dHB1dCIsICJwYXRyb2xMaW5rIiwgIm1hcmtSZXZpZXdlZEJ1dHRvbiIsICJlcnJvckluZm8iLCAic3RyYXlUZXh0IiwgImRlZmF1bHRTb3J0IiwgImNhdGVnb3JpZXMiLCAicGFyc2VkVGFyZ2V0IiwgImZvcm1hdHRlZFRpdGxlIiwgInRhZ3NXaXRoQXJndW1lbnRzIiwgImZvdW5kQXJndW1lbnRFZGl0b3IiLCAibGFzdE51bWJlclBhcmFtZXRlckluZGV4IiwgIm1hcHBlZEFyZ3VtZW50cyIsICJ0ZXh0IiwgIndhdGNobGlzdCIsICJyZWRpcmVjdF9wYWdlX2hlcmVfZGlhbG9nX2V4cG9ydHMiLCAiX19leHBvcnQiLCAiUmVkaXJlY3RQYWdlSGVyZURpYWxvZyIsICJpbml0X3JlZGlyZWN0X3BhZ2VfaGVyZV9kaWFsb2ciLCAiX19lc21NaW4iLCAiX1JlZGlyZWN0UGFnZUhlcmVEaWFsb2ciLCAicGFnZVRpdGxlUGFyc2VkIiwgInBhbmVsTGF5b3V0IiwgImZpZWxkTGF5b3V0IiwgImFjdGlvbiIsICJ0aXRsZSIsICJwYXJzZWRUaXRsZSIsICJ1cmwiLCAiaW5pdF91dGlsaXR5IiwgInJlZGlyZWN0X2hlbHBlcl9kZWZhdWx0IiwgImRlcGVuZGVuY2llcyIsICJSZWRpcmVjdEhlbHBlckRpYWxvZyIsICJSZWRpcmVjdFBhZ2VIZXJlRGlhbG9nIiwgIlJlZGlyZWN0SGVscGVyIiwgInBhZ2VUaXRsZVBhcnNlZCIsICJjb250ZW50VGV4dCIsICJjb25maWdPdmVycmlkZXMiLCAiY3JlYXRlZFdhdGNoTWV0aG9kIiwgInNob3VsZFBhdHJvbEJ5RGVmYXVsdCIsICJnZXRQYWdlQ29udGVudCIsICJyZWRpcmVjdF9oZWxwZXJfZGVmYXVsdCIsICJkaWFsb2dJbmZvIiwgImhhc0xvYWRlZCIsICJyZWRpcmVjdEhlbHBlclRhcmdldCIsICJwYXJzZWRUYXJnZXQiLCAiYnV0dG9uIiwgInJlZGlyZWN0SGVscGVyUG9ydGxldExpbmsiLCAiZXZlbnQiLCAid2luZG93TWFuYWdlciIsICJkaWFsb2ciXQp9Cg==