Jump to content

User:Eejit43/scripts/script-updater.js

From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
// <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/script-updater.ts

"use strict";(()=>{var g=new mw.Api;async function w(d){return(await g.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:d})).query.pages[0].revisions?.[0].slots.main.content.trim()}mw.loader.using(["mediawiki.util","oojs-ui-core","oojs-ui-widgets","oojs-ui-windows"],()=>{if(mw.config.get("wgUserName")!=="Eejit43"||mw.config.get("wgPageName")!=="User:Eejit43")return;let d=document.querySelector(".mw-editsection").cloneNode(!0),u=document.createElement("a");u.href="#",u.style.fontWeight="bold",u.textContent="Sync from GitHub",u.addEventListener("click",p=>{p.preventDefault();let e=new OO.ui.WindowManager;document.body.append(e.$element[0]);let i=new l;e.addWindows([i]),i.open()}),d.querySelector("a").replaceWith(u),document.querySelector("h2#My_user_scripts + .mw-editsection").after(d);class l extends OO.ui.ProcessDialog{REPO_OWNER="Eejit43";REPO_NAME="wikipedia-scripts";SCRIPT_MESSAGE=" (via [[User:Eejit43/scripts/script-updater.js|script]])";content;scriptsMultiselect;actionsMultiselect;latestCommitHash;scripts;scriptDataUpdaters={"article-cleaner":O,"redirect-helper":k};constructor(){super({size:"medium"}),l.static.name="ScriptUpdaterDialog",l.static.title="script-updater",l.static.actions=[{action:"cancel",label:"Close",flags:["safe","close"]},{action:"save",label:"Run",flags:["primary","progressive"]}]}getSetupProcess=()=>l.super.prototype.getSetupProcess.call(this).next(()=>this.wrapAsyncMethod(this.loadScriptData).then(e=>{if(e){let a=new OO.ui.MessageWidget({type:"error",label:e});this.content=new OO.ui.PanelLayout({padded:!0,expanded:!1}),this.content.$element.append(a.$element),this.$body.append(this.content.$element),this.getActions().setAbilities({save:!1});return}this.content=new OO.ui.PanelLayout({padded:!0,expanded:!1}),this.scriptsMultiselect=new OO.ui.CheckboxMultiselectWidget({items:this.scripts.map(a=>new OO.ui.CheckboxMultioptionWidget({data:a.name,label:a.name}))}),this.scriptsMultiselect.$element[0].style.columnCount="2";let i=new OO.ui.FieldLayout(this.scriptsMultiselect,{label:new OO.ui.HtmlSnippet("<b>Scripts to update:</b>"),align:"top"});this.actionsMultiselect=new OO.ui.CheckboxMultiselectWidget({items:[{id:"documentation",name:"Update script documentation"},{id:"script",name:"Update script code"},{id:"talk",name:"Create talk redirect",selectedDefault:!1}].map(({id:a,name:r,selectedDefault:s=!0})=>new OO.ui.CheckboxMultioptionWidget({data:a,label:r,selected:s}))});let n=new OO.ui.FieldLayout(this.actionsMultiselect,{label:new OO.ui.HtmlSnippet("<b>Actions to take (if applicable):</b>"),align:"top"}),m=new OO.ui.ButtonGroupWidget({items:Object.entries(this.scriptDataUpdaters).map(([a,r])=>{let s=new OO.ui.ButtonWidget({label:a,flags:["progressive"]});return s.on("click",async()=>{mw.notify(`Fetching ${a} data...`,{tag:"update-script-data-notification"});let o=await r();mw.notify(`Successfully fetched ${a} data, opening diff...`,{type:"success",tag:"update-script-data-notification"}),await new Promise(c=>setTimeout(c,500)),this.openDiff(`User:Eejit43/scripts/${a}.json`,o)}),s})}),t=new OO.ui.FieldLayout(m,{label:new OO.ui.HtmlSnippet("<b>Script data updaters:</b>"),align:"top"});this.content.$element.append(i.$element),this.content.$element.append(n.$element),this.content.$element.append(t.$element),this.$body.append(this.content.$element)}));getActionProcess=e=>e==="cancel"?new OO.ui.Process(()=>{this.close()}):e==="save"?new OO.ui.Process(()=>{let i=this.scriptsMultiselect.findSelectedItemsData().map(n=>this.scripts.find(m=>m.name===n));this.close(),(async()=>(mw.notify("Syncing scripts...",{tag:"sync-scripts-notification"}),await Promise.all(i.map(n=>this.handleScript(n))),await this.editOrCreate("User:Eejit43/scripts-info",[this.mapScripts(this.scripts.filter(n=>!n.personal&&!n.fork)),"","=== Forks ===",this.mapScripts(this.scripts.filter(n=>n.fork)),"","=== Personal scripts ===",this.mapScripts(this.scripts.filter(n=>n.personal))].join(`
`),"Syncing script list from GitHub"),mw.notify(`Synced ${i.length} script${i.length===1?"":"s"} from GitHub!`,{type:"success",tag:"sync-scripts-notification"})))()}):l.super.prototype.getActionProcess.call(this,e);getTeardownProcess=()=>l.super.prototype.getTeardownProcess.call(this).next(()=>{this.$body.empty()});wrapAsyncMethod(e){let i=$.Deferred();return e().then(n=>i.resolve(n)),i.promise()}loadScriptData=async()=>{let e=await fetch(`https://api.github.com/repos/${this.REPO_OWNER}/${this.REPO_NAME}/commits`);if(!e.ok)return`Failed to fetch latest commit hash from GitHub: ${e.statusText} (${e.status})`;this.latestCommitHash=(await e.json())[0].sha;let i=await fetch(`https://raw.githubusercontent.com/${this.REPO_OWNER}/${this.REPO_NAME}/${this.latestCommitHash}/scripts.json`);if(!i.ok)return`Failed to fetch script data from GitHub: ${i.statusText} (${i.status})`;let n=await i.json();this.scripts=Object.entries(n).map(([m,t])=>({name:m,...t}))};async handleScript(e){let i=this.actionsMultiselect.findSelectedItemsData(),n=`User:Eejit43/scripts/${e.name}`,m=`User talk:Eejit43/scripts/${e.name}`,t=`${n}.js`,a=["{{User:Eejit43/script-documentation",e.image===!1?`| image             = ${e.image}`:null,e["in-development"]?`| in-development    = ${e["in-development"]}`:null,e["use-instead"]?`| use-instead       = ${e["use-instead"].includes("User:")?e["use-instead"]:`[[User:Eejit43/scripts/${e["use-instead"]}|${e["use-instead"]}]]`}`:null,e["image-caption"]?`| image-caption     = ${e["image-caption"]}`:null,e["other-authors"]?`| other-authors     = ${e["other-authors"].map(s=>`[[User:${s}|${s}]]`).join(", ")}`:null,`| description-short = ${e["short-description"]}`,`| description       = ${e.description}`,e.usage?`| usage             = ${e.usage}`:null,e.configuration?`| configuration     = ${e.configuration}`:null,e.changelog?`| changelog         = 
${Object.entries(e.changelog).map(([s,o])=>`* '''{{start date and age|${s}}}:'''${Array.isArray(o)?`
${o.map(c=>`** ${c}`).join(`
`)}`:` ${o}`}`).join(`
`)}`:null,`| skin-support      = {{User:Eejit43/script-documentation/skin-support|${Object.entries(e["skin-support"]).map(([s,o])=>`${s}=${o}`).join("|")}}}`,e["source-multiple"]?`| source-multiple   = ${e["source-multiple"]}`:null,e["global-support"]?`| global-support    = ${e["global-support"]}`:null,`| released          = {{start date and age|${e.released}}}`,`| updated           = {{start date and age|${e.updated}}}`,"}}",e.categories?`
${e.categories.map(s=>`[[Category:${s}]]`).join(`
`)}`:null].filter(Boolean),r=null;if(i.includes("script")){let s=await fetch(`https://raw.githubusercontent.com/${this.REPO_OWNER}/${this.REPO_NAME}/${this.latestCommitHash}/dist/${e.name}.js`);if(s.ok)r=await s.text();else return mw.notify(`Failed to fetch "${e.name}.js" from GitHub: ${s.statusText} (${s.status})`,{type:"error",tag:"sync-scripts-notification"})}e.personal||(i.includes("documentation")&&await this.editOrCreate(n,a.join(`
`),"Syncing script documentation from GitHub"),i.includes("talk")&&await this.editOrCreate(m,"#REDIRECT [[User talk:Eejit43]]","Redirecting script documentation talk page to main user talk page")),r&&await this.editOrCreate(t,r,"Syncing script from GitHub")}mapScripts(e){return e.map(i=>`* [[User:Eejit43/scripts/${i.name}${i.personal?".js":""}|${i.name}]] - ${i["short-description"]||i.description}${i["in-development"]?' (<span style="color: var(--color-warning, #886425)">in development</span>)':""}${i["use-instead"]?' (<span style="color: var(--color-error, #bf3c2c)">deprecated</span>)':""}`).join(`
`)}async editOrCreate(e,i,n){n+=this.SCRIPT_MESSAGE,await g.edit(e,()=>({text:i,summary:n,watchlist:"watch"})).catch(async(m,t)=>{if(m==="nocreate-missing")await g.create(e,{summary:n,watchlist:"watch"},i).catch((a,r)=>{mw.notify(`Error creating ${e}: ${r?.error?.info??"Unknown error"} (${a})`,{type:"error"})});else{mw.notify(`Error editing or creating ${e}: ${t?.error?.info??"Unknown error"} (${m})`,{type:"error"});return}})}openDiff(e,i){let n={wpTextbox1:i,wpSummary:`Updating data${this.SCRIPT_MESSAGE}`,wpDiff:"1",wpWatchthis:"1",wpUltimateParam:"1"},m=new URL(`${mw.config.get("wgScriptPath")}/index.php`,window.location.origin);m.searchParams.set("title",e),m.searchParams.set("action","submit");let t=document.createElement("form");t.action=m.href,t.method="POST",t.target="_blank";for(let[a,r]of Object.entries(n)){let s=document.createElement("input");s.type="hidden",s.name=a,s.value=r,t.append(s)}document.body.append(t),t.submit(),t.remove()}}Object.assign(l.prototype,OO.ui.ProcessDialog.prototype)});async function O(){let u=(await w("Wikipedia:AutoWikiBrowser/Template redirects")??"").matchAll(/\* \{\{tl\|.+/g).map(l=>{let p=l[0].matchAll(/\{\{tl\|(.+?)\}\}/g).toArray();return{from:p.slice(0,-1).map(e=>e[1]),to:p.at(-1)[1]}}).toArray();return JSON.stringify(u)}function h(d,u){let l=[];for(let p=0;p<d.length;p+=u){let e=d.slice(p,p+u);l.push(e)}return l}async function R(d){let u=0,l=[],p={continue:{}};for(;"continue"in p&&u<10;)p=await g.get({...d,...p.continue}),l.push(p),u++;return l}var y=mw.config.get("wgNamespaceIds"),b={"All namespace redirect templates":{numberOrType:"ALL",templates:[]},"Category namespace redirect templates":{numberOrType:y.category,templates:[]},"Draft namespace redirect templates":{numberOrType:y.draft,templates:[]},"Help namespace redirect templates":{numberOrType:y.help,templates:[]},"Main namespace redirect templates":{numberOrType:y[""],templates:[]},"Other namespace redirect templates":{numberOrType:"ALL",templates:[]},"Portal namespace redirect templates":{numberOrType:y.portal,templates:[]},"Talk namespace redirect templates":{numberOrType:"TALK",templates:[]},"Template namespace redirect templates":{numberOrType:y.template,templates:[]},"Unknown namespace redirect templates":{numberOrType:"ALL",templates:[]},"User namespace redirect templates":{numberOrType:y.user,templates:[]},"Wikipedia namespace redirect templates":{numberOrType:y.wikipedia,templates:[]}};async function k(){let d=await g.get({action:"query",list:"categorymembers",cmtitle:"Category:Redirect templates",cmlimit:"max",formatversion:"2"}),u=await g.get({action:"query",list:"categorymembers",cmtitle:"Category:Template redirects with possibilities",cmlimit:"max",formatversion:"2"});await Promise.all(Object.entries(b).map(async([t,a])=>{let r=await g.get({action:"query",list:"categorymembers",cmtitle:`Category:${t}`,cmlimit:"max",formatversion:"2"});a.templates=r.query.categorymembers.map(s=>s.title.split(":").slice(1).join(":"))}));let l=d.query.categorymembers.filter(t=>t.title.startsWith("Template:R ")&&t.title!=="Template:R template index").map(t=>({name:t.title.split(":").slice(1).join(":"),redirect:!1})),p=u.query.categorymembers.filter(t=>t.title.startsWith("Template:R ")&&t.title!=="Template:R with possibilities").map(t=>({name:t.title.split(":").slice(1).join(":"),redirect:!0})),e=[...l,...p].sort((t,a)=>t.name.localeCompare(a.name)),i=Object.fromEntries(e.map(t=>[t.name,{redirect:t.redirect,namespaceRequirement:[],parameters:{},aliases:[]}]));await Promise.all(h(e,50).map(async t=>{let a=await g.get({action:"templatedata",titles:t.map(r=>`Template:${r.name}`),formatversion:"2"});for(let r of Object.values(a.pages)){let s=Object.fromEntries(Object.entries(r.params).map(([o,c])=>[o,{aliases:c.aliases,label:c.label?.en??null,description:c.description?.en??null,type:c.type,required:c.required,suggested:c.suggested,default:c.default?.en??null,example:c.example?.en??null}]));i[r.title.split(":").slice(1).join(":")].parameters=s}})),await Promise.all(h(l,50).map(async t=>{let r=(await R({action:"query",titles:t.map(s=>`Template:${s.name}`),prop:"redirects",rdnamespace:10,rdlimit:"max",formatversion:"2"})).flatMap(s=>s.query.pages);for(let s of r){let o=s.redirects?.map(c=>c.title.split(":").slice(1).join(":")).filter(c=>p.every(f=>f.name!==c)).sort((c,f)=>c.localeCompare(f))??[];i[s.title.split(":").slice(1).join(":")].aliases.push(...o)}}));let n=[];await Promise.all(h(p,50).map(async t=>{let a=await g.get({action:"query",titles:t.map(r=>`Template:${r.name}`),prop:"linkshere",lhnamespace:10,lhlimit:"max",formatversion:"2"});for(let r of a.query.pages){let s=r.linkshere?.filter(o=>o.redirect).map(o=>o.title.split(":").slice(1).join(":")).filter(o=>!o.endsWith("/doc")&&!o.endsWith("/sandbox")).sort((o,c)=>o.localeCompare(c))??[];n.push(...s),i[r.title.split(":").slice(1).join(":")].aliases=s}}));for(let t of Object.values(b))for(let a of t.templates){if(!(a in i)){let r=`Template ${a} is in the namespace requirement mapping but not in the final data.`;mw.notify(r,{type:"warn"}),console.warn(r);continue}i[a].namespaceRequirement.push(t.numberOrType)}let m=Object.entries(i).map(([t,a])=>{let r={...a.redirect&&{redirect:!0},namespaceRequirement:a.namespaceRequirement.length>0?a.namespaceRequirement.toSorted((s,o)=>typeof s=="number"&&typeof o=="number"?s-o:String(s).localeCompare(String(o))):["ALL"],parameters:a.parameters,aliases:a.aliases.sort((s,o)=>s.localeCompare(o))};return[t,r]});for(let t of n)for(let[,a]of m)!a.redirect&&a.aliases.includes(t)&&(a.aliases=a.aliases.filter(r=>r!==t));return JSON.stringify(Object.fromEntries(m))}})();

// </pre>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbGl0eS50cyIsICIuLi9zY3JpcHRzL3NjcmlwdC11cGRhdGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7IEFwaVF1ZXJ5QWxsTWVzc2FnZXNQYXJhbXMsIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zIH0gZnJvbSAndHlwZXMtbWVkaWF3aWtpLWFwaSc7XG5pbXBvcnQgdHlwZSB7IEFsbE1lc3NhZ2VzUmVzdWx0LCBQYWdlUmV2aXNpb25zUmVzdWx0IH0gZnJvbSAnLi9nbG9iYWwtdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgYXBpID0gbmV3IG13LkFwaSgpO1xuXG4vKipcbiAqIEZldGNoZXMgdGhlIGNvbnRlbnQgb2YgYSBnaXZlbiBwYWdlLlxuICogQHBhcmFtIHRpdGxlIFRoZSB0aXRsZSB0byBmZXRjaC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFBhZ2VDb250ZW50KHRpdGxlOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICBwcm9wOiAncmV2aXNpb25zJyxcbiAgICAgICAgICAgIHJ2cHJvcDogJ2NvbnRlbnQnLFxuICAgICAgICAgICAgcnZzbG90czogJ21haW4nLFxuICAgICAgICAgICAgdGl0bGVzOiB0aXRsZSxcbiAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlSZXZpc2lvbnNQYXJhbXMpKSBhcyBQYWdlUmV2aXNpb25zUmVzdWx0XG4gICAgKS5xdWVyeS5wYWdlc1swXS5yZXZpc2lvbnM/LlswXS5zbG90cy5tYWluLmNvbnRlbnQudHJpbSgpO1xufVxuXG4vKipcbiAqIEdldHMgYSBzeXN0ZW0gbWVzc2FnZS5cbiAqIEBwYXJhbSBtZXNzYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3lzdGVtIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTeXN0ZW1NZXNzYWdlKG1lc3NhZ2VOYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKFxuICAgICAgICAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICBtZXRhOiAnYWxsbWVzc2FnZXMnLFxuICAgICAgICAgICAgYW1tZXNzYWdlczogbWVzc2FnZU5hbWUsXG4gICAgICAgICAgICBhbWxhbmc6IG13LmNvbmZpZy5nZXQoJ3dnQ29udGVudExhbmd1YWdlJyksXG4gICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5QWxsTWVzc2FnZXNQYXJhbXMpKSBhcyBBbGxNZXNzYWdlc1Jlc3VsdFxuICAgICkucXVlcnk/LmFsbG1lc3NhZ2VzWzBdLmNvbnRlbnQ7XG59XG5cbi8qKlxuICogSW50ZXJwb2xhdGVzIGEgc3lzdGVtIG1lc3NhZ2Ugd2l0aCB2YWx1ZXMuXG4gKiBAcGFyYW0gbWVzc2FnZSBUaGUgc3lzdGVtIG1lc3NhZ2UgdG8gaW50ZXJwb2xhdGUuXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gaW50ZXJwb2xhdGUgaW50byB0aGUgbWVzc2FnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVycG9sYXRlU3lzdGVtTWVzc2FnZShtZXNzYWdlOiBzdHJpbmcsIHZhbHVlczogc3RyaW5nW10pIHtcbiAgICBsZXQgcmVzdWx0ID0gbWVzc2FnZTtcblxuICAgIGZvciAoY29uc3QgW2luZGV4LCB2YWx1ZV0gb2YgdmFsdWVzLmVudHJpZXMoKSkgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2VBbGwoYCQke2luZGV4ICsgMX1gLCB2YWx1ZSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwgImltcG9ydCB0eXBlIHtcbiAgICBDYXRlZ29yeU1lbWJlcnNSZXN1bHQsXG4gICAgTGlua3NIZXJlUmVzdWx0LFxuICAgIE1lZGlhV2lraURhdGFFcnJvcixcbiAgICBRdWVyeUNvbnRpbnVhdGlvbixcbiAgICBSZWRpcmVjdHNSZXN1bHQsXG4gICAgVGVtcGxhdGVEYXRhUmVzdWx0LFxufSBmcm9tICdAL2dsb2JhbC10eXBlcyc7XG5pbXBvcnQgeyBhcGksIGdldFBhZ2VDb250ZW50IH0gZnJvbSAnQC91dGlsaXR5JztcbmltcG9ydCB0eXBlIHtcbiAgICBBcGlRdWVyeUJhY2tsaW5rc3Byb3BQYXJhbXMsXG4gICAgQXBpUXVlcnlDYXRlZ29yeU1lbWJlcnNQYXJhbXMsXG4gICAgQXBpUXVlcnlQYXJhbXMsXG4gICAgVGVtcGxhdGVEYXRhQXBpVGVtcGxhdGVEYXRhUGFyYW1zLFxufSBmcm9tICd0eXBlcy1tZWRpYXdpa2ktYXBpJztcbmltcG9ydCB0eXBlIHsgQXBpUmVzcG9uc2UgfSBmcm9tICd0eXBlcy1tZWRpYXdpa2kvbXcvQXBpJztcblxuaW50ZXJmYWNlIFNjcmlwdCB7XG4gICAgJ25hbWUnOiBzdHJpbmc7XG4gICAgJ2luLWRldmVsb3BtZW50Jz86IGJvb2xlYW47XG4gICAgJ3VzZS1pbnN0ZWFkJz86IHN0cmluZztcbiAgICAnaW1hZ2UnPzogZmFsc2U7XG4gICAgJ2ltYWdlLWNhcHRpb24nPzogc3RyaW5nO1xuICAgICdzaG9ydC1kZXNjcmlwdGlvbic6IHN0cmluZztcbiAgICAnZGVzY3JpcHRpb24nOiBzdHJpbmc7XG4gICAgJ3VzYWdlJz86IHN0cmluZztcbiAgICAnY29uZmlndXJhdGlvbic/OiBzdHJpbmc7XG4gICAgJ2NoYW5nZWxvZyc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT47XG4gICAgJ290aGVyLWF1dGhvcnMnPzogc3RyaW5nW107XG4gICAgJ2ZvcmsnPzogdHJ1ZTtcbiAgICAncGVyc29uYWwnPzogdHJ1ZTtcbiAgICAnc2tpbi1zdXBwb3J0JzogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG4gICAgJ3NvdXJjZS1tdWx0aXBsZSc/OiB0cnVlO1xuICAgICdnbG9iYWwtc3VwcG9ydCc/OiB0cnVlO1xuICAgICdyZWxlYXNlZCc6IHN0cmluZztcbiAgICAndXBkYXRlZCc6IHN0cmluZztcbiAgICAnY2F0ZWdvcmllcyc/OiBzdHJpbmdbXTtcbn1cblxubXcubG9hZGVyLnVzaW5nKFsnbWVkaWF3aWtpLnV0aWwnLCAnb29qcy11aS1jb3JlJywgJ29vanMtdWktd2lkZ2V0cycsICdvb2pzLXVpLXdpbmRvd3MnXSwgKCkgPT4ge1xuICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z1VzZXJOYW1lJykgIT09ICdFZWppdDQzJyB8fCBtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykgIT09ICdVc2VyOkVlaml0NDMnKSByZXR1cm47XG5cbiAgICBjb25zdCBmdWxsTGlua0VsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubXctZWRpdHNlY3Rpb24nKSEuY2xvbmVOb2RlKHRydWUpIGFzIEhUTUxTcGFuRWxlbWVudDtcblxuICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgbGluay5ocmVmID0gJyMnO1xuICAgIGxpbmsuc3R5bGUuZm9udFdlaWdodCA9ICdib2xkJztcbiAgICBsaW5rLnRleHRDb250ZW50ID0gJ1N5bmMgZnJvbSBHaXRIdWInO1xuICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZXZlbnQpID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCB3aW5kb3dNYW5hZ2VyID0gbmV3IE9PLnVpLldpbmRvd01hbmFnZXIoKTtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQod2luZG93TWFuYWdlci4kZWxlbWVudFswXSk7XG5cbiAgICAgICAgY29uc3Qgc2NyaXB0VXBkYXRlckRpYWxvZyA9IG5ldyBTY3JpcHRVcGRhdGVyRGlhbG9nKCk7XG4gICAgICAgIHdpbmRvd01hbmFnZXIuYWRkV2luZG93cyhbc2NyaXB0VXBkYXRlckRpYWxvZ10pO1xuXG4gICAgICAgIHNjcmlwdFVwZGF0ZXJEaWFsb2cub3BlbigpO1xuICAgIH0pO1xuXG4gICAgZnVsbExpbmtFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2EnKSEucmVwbGFjZVdpdGgobGluayk7XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoMiNNeV91c2VyX3NjcmlwdHMgKyAubXctZWRpdHNlY3Rpb24nKSEuYWZ0ZXIoZnVsbExpbmtFbGVtZW50KTtcblxuICAgIC8qKlxuICAgICAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgYSBkaWFsb2cgdGhhdCBtYW5hZ2VzIHVwZGF0aW5nIHNjcmlwdHMuXG4gICAgICovXG4gICAgY2xhc3MgU2NyaXB0VXBkYXRlckRpYWxvZyBleHRlbmRzIE9PLnVpLlByb2Nlc3NEaWFsb2cge1xuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFJFUE9fT1dORVIgPSAnRWVqaXQ0Myc7XG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgUkVQT19OQU1FID0gJ3dpa2lwZWRpYS1zY3JpcHRzJztcblxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNDUklQVF9NRVNTQUdFID0gJyAodmlhIFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvc2NyaXB0LXVwZGF0ZXIuanN8c2NyaXB0XV0pJztcblxuICAgICAgICBwcml2YXRlIGNvbnRlbnQhOiBPTy51aS5QYW5lbExheW91dDtcbiAgICAgICAgcHJpdmF0ZSBzY3JpcHRzTXVsdGlzZWxlY3QhOiBPTy51aS5DaGVja2JveE11bHRpc2VsZWN0V2lkZ2V0O1xuICAgICAgICBwcml2YXRlIGFjdGlvbnNNdWx0aXNlbGVjdCE6IE9PLnVpLkNoZWNrYm94TXVsdGlzZWxlY3RXaWRnZXQ7XG5cbiAgICAgICAgcHJpdmF0ZSBsYXRlc3RDb21taXRIYXNoITogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIHNjcmlwdHMhOiBTY3JpcHRbXTtcblxuICAgICAgICBwcml2YXRlIHNjcmlwdERhdGFVcGRhdGVycyA9IHtcbiAgICAgICAgICAgICdhcnRpY2xlLWNsZWFuZXInOiBnZXRBcnRpY2xlQ2xlYW5lckRhdGEsXG4gICAgICAgICAgICAncmVkaXJlY3QtaGVscGVyJzogZ2V0UmVkaXJlY3RIZWxwZXJEYXRhLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICAgICAgc3VwZXIoeyBzaXplOiAnbWVkaXVtJyB9KTtcblxuICAgICAgICAgICAgU2NyaXB0VXBkYXRlckRpYWxvZy5zdGF0aWMubmFtZSA9ICdTY3JpcHRVcGRhdGVyRGlhbG9nJztcbiAgICAgICAgICAgIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3RhdGljLnRpdGxlID0gJ3NjcmlwdC11cGRhdGVyJztcbiAgICAgICAgICAgIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3RhdGljLmFjdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgeyBhY3Rpb246ICdjYW5jZWwnLCBsYWJlbDogJ0Nsb3NlJywgZmxhZ3M6IFsnc2FmZScsICdjbG9zZSddIH0sXG4gICAgICAgICAgICAgICAgeyBhY3Rpb246ICdzYXZlJywgbGFiZWw6ICdSdW4nLCBmbGFnczogWydwcmltYXJ5JywgJ3Byb2dyZXNzaXZlJ10gfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9jb25zaXN0ZW50LWNsYXNzLW1lbWJlci1vcmRlclxuICAgICAgICBnZXRTZXR1cFByb2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gU2NyaXB0VXBkYXRlckRpYWxvZy5zdXBlci5wcm90b3R5cGUuZ2V0U2V0dXBQcm9jZXNzLmNhbGwodGhpcykubmV4dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud3JhcEFzeW5jTWV0aG9kKHRoaXMubG9hZFNjcmlwdERhdGEpLnRoZW4oKGVycm9yPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWVzc2FnZUVsZW1lbnQgPSBuZXcgT08udWkuTWVzc2FnZVdpZGdldCh7IHR5cGU6ICdlcnJvcicsIGxhYmVsOiBlcnJvciB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50ID0gbmV3IE9PLnVpLlBhbmVsTGF5b3V0KHsgcGFkZGVkOiB0cnVlLCBleHBhbmRlZDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuJGVsZW1lbnQuYXBwZW5kKG1lc3NhZ2VFbGVtZW50LiRlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgYXMgdW5rbm93biBhcyB7ICRib2R5OiBKUXVlcnkgfSkuJGJvZHkuYXBwZW5kKHRoaXMuY29udGVudC4kZWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0QWN0aW9ucygpLnNldEFiaWxpdGllcyh7IHNhdmU6IGZhbHNlIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBuZXcgT08udWkuUGFuZWxMYXlvdXQoeyBwYWRkZWQ6IHRydWUsIGV4cGFuZGVkOiBmYWxzZSB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcmlwdHNNdWx0aXNlbGVjdCA9IG5ldyBPTy51aS5DaGVja2JveE11bHRpc2VsZWN0V2lkZ2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zOiB0aGlzLnNjcmlwdHMubWFwKChzY3JpcHQpID0+IG5ldyBPTy51aS5DaGVja2JveE11bHRpb3B0aW9uV2lkZ2V0KHsgZGF0YTogc2NyaXB0Lm5hbWUsIGxhYmVsOiBzY3JpcHQubmFtZSB9KSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcmlwdHNNdWx0aXNlbGVjdC4kZWxlbWVudFswXS5zdHlsZS5jb2x1bW5Db3VudCA9ICcyJztcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JpcHRzTXVsdGlzZWxlY3RMYXlvdXQgPSBuZXcgT08udWkuRmllbGRMYXlvdXQodGhpcy5zY3JpcHRzTXVsdGlzZWxlY3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBuZXcgT08udWkuSHRtbFNuaXBwZXQoJzxiPlNjcmlwdHMgdG8gdXBkYXRlOjwvYj4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3Rpb25zTXVsdGlzZWxlY3QgPSBuZXcgT08udWkuQ2hlY2tib3hNdWx0aXNlbGVjdFdpZGdldCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgaWQ6ICdkb2N1bWVudGF0aW9uJywgbmFtZTogJ1VwZGF0ZSBzY3JpcHQgZG9jdW1lbnRhdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAnc2NyaXB0JywgbmFtZTogJ1VwZGF0ZSBzY3JpcHQgY29kZScgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGlkOiAndGFsaycsIG5hbWU6ICdDcmVhdGUgdGFsayByZWRpcmVjdCcsIHNlbGVjdGVkRGVmYXVsdDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIF0ubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7IGlkLCBuYW1lLCBzZWxlY3RlZERlZmF1bHQgPSB0cnVlIH0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPTy51aS5DaGVja2JveE11bHRpb3B0aW9uV2lkZ2V0KHsgZGF0YTogaWQsIGxhYmVsOiBuYW1lLCBzZWxlY3RlZDogc2VsZWN0ZWREZWZhdWx0IH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aW9uc011bHRpc2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KHRoaXMuYWN0aW9uc011bHRpc2VsZWN0LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KCc8Yj5BY3Rpb25zIHRvIHRha2UgKGlmIGFwcGxpY2FibGUpOjwvYj4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiAndG9wJyxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnV0dG9uR3JvdXAgPSBuZXcgT08udWkuQnV0dG9uR3JvdXBXaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM6IE9iamVjdC5lbnRyaWVzKHRoaXMuc2NyaXB0RGF0YVVwZGF0ZXJzKS5tYXAoKFtuYW1lLCB1cGRhdGVyXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1dHRvbiA9IG5ldyBPTy51aS5CdXR0b25XaWRnZXQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6IFsncHJvZ3Jlc3NpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXR0b24ub24oJ2NsaWNrJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYEZldGNoaW5nICR7bmFtZX0gZGF0YS4uLmAsIHsgdGFnOiAndXBkYXRlLXNjcmlwdC1kYXRhLW5vdGlmaWNhdGlvbicgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHVwZGF0ZXIoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdy5ub3RpZnkoYFN1Y2Nlc3NmdWxseSBmZXRjaGVkICR7bmFtZX0gZGF0YSwgb3BlbmluZyBkaWZmLi4uYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiAndXBkYXRlLXNjcmlwdC1kYXRhLW5vdGlmaWNhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDUwMCkpOyAvLyBBbGxvdyB0aGUgbm90aWZpY2F0aW9uIHRvIGJlIHNob3duXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuRGlmZihgVXNlcjpFZWppdDQzL3NjcmlwdHMvJHtuYW1lfS5qc29uYCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnV0dG9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdERhdGFVcGRhdGVyc011bHRpc2VsZWN0TGF5b3V0ID0gbmV3IE9PLnVpLkZpZWxkTGF5b3V0KGJ1dHRvbkdyb3VwLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbmV3IE9PLnVpLkh0bWxTbmlwcGV0KCc8Yj5TY3JpcHQgZGF0YSB1cGRhdGVyczo8L2I+JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogJ3RvcCcsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudC4kZWxlbWVudC5hcHBlbmQoc2NyaXB0c011bHRpc2VsZWN0TGF5b3V0LiRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZW50LiRlbGVtZW50LmFwcGVuZChhY3Rpb25zTXVsdGlzZWxlY3RMYXlvdXQuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQuJGVsZW1lbnQuYXBwZW5kKHNjcmlwdERhdGFVcGRhdGVyc011bHRpc2VsZWN0TGF5b3V0LiRlbGVtZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5hcHBlbmQodGhpcy5jb250ZW50LiRlbGVtZW50KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldEFjdGlvblByb2Nlc3MgPSAoYWN0aW9uOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChhY3Rpb24gPT09ICdjYW5jZWwnKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ3NhdmUnKVxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgT08udWkuUHJvY2VzcygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkU2NyaXB0cyA9ICh0aGlzLnNjcmlwdHNNdWx0aXNlbGVjdC5maW5kU2VsZWN0ZWRJdGVtc0RhdGEoKSBhcyBzdHJpbmdbXSkubWFwKChzY3JpcHROYW1lKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JpcHRzLmZpbmQoKHNjcmlwdCkgPT4gc2NyaXB0Lm5hbWUgPT09IHNjcmlwdE5hbWUpISxcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdm9pZCAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KCdTeW5jaW5nIHNjcmlwdHMuLi4nLCB7IHRhZzogJ3N5bmMtc2NyaXB0cy1ub3RpZmljYXRpb24nIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChzZWxlY3RlZFNjcmlwdHMubWFwKChzY3JpcHQpID0+IHRoaXMuaGFuZGxlU2NyaXB0KHNjcmlwdCkpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VzZXI6RWVqaXQ0My9zY3JpcHRzLWluZm8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBTY3JpcHRzKHRoaXMuc2NyaXB0cy5maWx0ZXIoKHNjcmlwdCkgPT4gIXNjcmlwdC5wZXJzb25hbCAmJiAhc2NyaXB0LmZvcmspKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9PT0gRm9ya3MgPT09JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBTY3JpcHRzKHRoaXMuc2NyaXB0cy5maWx0ZXIoKHNjcmlwdCkgPT4gc2NyaXB0LmZvcmspKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9PT0gUGVyc29uYWwgc2NyaXB0cyA9PT0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcFNjcmlwdHModGhpcy5zY3JpcHRzLmZpbHRlcigoc2NyaXB0KSA9PiBzY3JpcHQucGVyc29uYWwpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLmpvaW4oJ1xcbicpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTeW5jaW5nIHNjcmlwdCBsaXN0IGZyb20gR2l0SHViJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShgU3luY2VkICR7c2VsZWN0ZWRTY3JpcHRzLmxlbmd0aH0gc2NyaXB0JHtzZWxlY3RlZFNjcmlwdHMubGVuZ3RoID09PSAxID8gJycgOiAncyd9IGZyb20gR2l0SHViIWAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnOiAnc3luYy1zY3JpcHRzLW5vdGlmaWNhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSkoKTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIFNjcmlwdFVwZGF0ZXJEaWFsb2cuc3VwZXIucHJvdG90eXBlLmdldEFjdGlvblByb2Nlc3MuY2FsbCh0aGlzLCBhY3Rpb24pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGdldFRlYXJkb3duUHJvY2VzcyA9ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBTY3JpcHRVcGRhdGVyRGlhbG9nLnN1cGVyLnByb3RvdHlwZS5nZXRUZWFyZG93blByb2Nlc3MuY2FsbCh0aGlzKS5uZXh0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAodGhpcyBhcyB1bmtub3duIGFzIHsgJGJvZHk6IEpRdWVyeSB9KS4kYm9keS5lbXB0eSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdyYXBzIGFuIGFzeW5jIG1ldGhvZCBpbnRvIGEgalF1ZXJ5IERlZmVycmVkIG9iamVjdC5cbiAgICAgICAgICogQHBhcmFtIG1ldGhvZCBUaGUgbWV0aG9kIHRvIHdyYXAuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIHdyYXBBc3luY01ldGhvZChtZXRob2Q6ICgpID0+IFByb21pc2U8dW5rbm93bj4pIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmVycmVkID0gJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgICAgICB2b2lkIG1ldGhvZCgpLnRoZW4oKHJlc3VsdCkgPT4gZGVmZXJyZWQucmVzb2x2ZShyZXN1bHQpKTtcblxuICAgICAgICAgICAgcmV0dXJuIGRlZmVycmVkLnByb21pc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb2FkcyBkYXRhIGZvciBhbGwgc2NyaXB0cy5cbiAgICAgICAgICovXG4gICAgICAgIHByaXZhdGUgbG9hZFNjcmlwdERhdGEgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsYXRlc3RDb21taXRIYXNoUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8ke3RoaXMuUkVQT19PV05FUn0vJHt0aGlzLlJFUE9fTkFNRX0vY29tbWl0c2ApO1xuICAgICAgICAgICAgaWYgKCFsYXRlc3RDb21taXRIYXNoUmVzcG9uc2Uub2spXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBGYWlsZWQgdG8gZmV0Y2ggbGF0ZXN0IGNvbW1pdCBoYXNoIGZyb20gR2l0SHViOiAke2xhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5zdGF0dXNUZXh0fSAoJHtsYXRlc3RDb21taXRIYXNoUmVzcG9uc2Uuc3RhdHVzfSlgO1xuXG4gICAgICAgICAgICB0aGlzLmxhdGVzdENvbW1pdEhhc2ggPSAoKGF3YWl0IGxhdGVzdENvbW1pdEhhc2hSZXNwb25zZS5qc29uKCkpIGFzIHsgc2hhOiBzdHJpbmcgfVtdKVswXS5zaGE7XG5cbiAgICAgICAgICAgIGNvbnN0IHNjcmlwdERhdGFSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgIGBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vJHt0aGlzLlJFUE9fT1dORVJ9LyR7dGhpcy5SRVBPX05BTUV9LyR7dGhpcy5sYXRlc3RDb21taXRIYXNofS9zY3JpcHRzLmpzb25gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICghc2NyaXB0RGF0YVJlc3BvbnNlLm9rKVxuICAgICAgICAgICAgICAgIHJldHVybiBgRmFpbGVkIHRvIGZldGNoIHNjcmlwdCBkYXRhIGZyb20gR2l0SHViOiAke3NjcmlwdERhdGFSZXNwb25zZS5zdGF0dXNUZXh0fSAoJHtzY3JpcHREYXRhUmVzcG9uc2Uuc3RhdHVzfSlgO1xuXG4gICAgICAgICAgICBjb25zdCBzY3JpcHREYXRhID0gKGF3YWl0IHNjcmlwdERhdGFSZXNwb25zZS5qc29uKCkpIGFzIFJlY29yZDxzdHJpbmcsIE9taXQ8U2NyaXB0LCAnbmFtZSc+PjtcblxuICAgICAgICAgICAgdGhpcy5zY3JpcHRzID0gT2JqZWN0LmVudHJpZXMoc2NyaXB0RGF0YSkubWFwKChbc2NyaXB0TmFtZSwgc2NyaXB0XSkgPT4gKHsgbmFtZTogc2NyaXB0TmFtZSwgLi4uc2NyaXB0IH0pKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogSGFuZGxlcyBhbmQgZWRpdHMvY3JlYXRlcyBwYWdlcyBmb3IgYSBnaXZlbiBzY3JpcHQuXG4gICAgICAgICAqIEBwYXJhbSBzY3JpcHQgVGhlIHNjcmlwdCB0byBoYW5kbGUuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIGFzeW5jIGhhbmRsZVNjcmlwdChzY3JpcHQ6IFNjcmlwdCkge1xuICAgICAgICAgICAgY29uc3QgYWN0aW9uc1RvVGFrZSA9IHRoaXMuYWN0aW9uc011bHRpc2VsZWN0LmZpbmRTZWxlY3RlZEl0ZW1zRGF0YSgpIGFzICgnZG9jdW1lbnRhdGlvbicgfCAnc2NyaXB0JyB8ICd0YWxrJylbXTtcblxuICAgICAgICAgICAgY29uc3Qgc3VicGFnZU5hbWUgPSBgVXNlcjpFZWppdDQzL3NjcmlwdHMvJHtzY3JpcHQubmFtZX1gO1xuICAgICAgICAgICAgY29uc3Qgc3VicGFnZVRhbGtOYW1lID0gYFVzZXIgdGFsazpFZWppdDQzL3NjcmlwdHMvJHtzY3JpcHQubmFtZX1gO1xuICAgICAgICAgICAgY29uc3Qgc2NyaXB0TmFtZSA9IGAke3N1YnBhZ2VOYW1lfS5qc2A7XG5cbiAgICAgICAgICAgIGNvbnN0IGZ1bGxTdWJwYWdlSW5mbyA9IFtcbiAgICAgICAgICAgICAgICAne3tVc2VyOkVlaml0NDMvc2NyaXB0LWRvY3VtZW50YXRpb24nLFxuICAgICAgICAgICAgICAgIHNjcmlwdC5pbWFnZSA9PT0gZmFsc2UgPyBgfCBpbWFnZSAgICAgICAgICAgICA9ICR7c2NyaXB0LmltYWdlfWAgOiBudWxsLFxuICAgICAgICAgICAgICAgIHNjcmlwdFsnaW4tZGV2ZWxvcG1lbnQnXSA/IGB8IGluLWRldmVsb3BtZW50ICAgID0gJHtzY3JpcHRbJ2luLWRldmVsb3BtZW50J119YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0Wyd1c2UtaW5zdGVhZCddXG4gICAgICAgICAgICAgICAgICAgID8gYHwgdXNlLWluc3RlYWQgICAgICAgPSAke3NjcmlwdFsndXNlLWluc3RlYWQnXS5pbmNsdWRlcygnVXNlcjonKSA/IHNjcmlwdFsndXNlLWluc3RlYWQnXSA6IGBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzLyR7c2NyaXB0Wyd1c2UtaW5zdGVhZCddfXwke3NjcmlwdFsndXNlLWluc3RlYWQnXX1dXWB9YFxuICAgICAgICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0WydpbWFnZS1jYXB0aW9uJ10gPyBgfCBpbWFnZS1jYXB0aW9uICAgICA9ICR7c2NyaXB0WydpbWFnZS1jYXB0aW9uJ119YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0WydvdGhlci1hdXRob3JzJ11cbiAgICAgICAgICAgICAgICAgICAgPyBgfCBvdGhlci1hdXRob3JzICAgICA9ICR7c2NyaXB0WydvdGhlci1hdXRob3JzJ10ubWFwKChhdXRob3IpID0+IGBbW1VzZXI6JHthdXRob3J9fCR7YXV0aG9yfV1dYCkuam9pbignLCAnKX1gXG4gICAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICBgfCBkZXNjcmlwdGlvbi1zaG9ydCA9ICR7c2NyaXB0WydzaG9ydC1kZXNjcmlwdGlvbiddfWAsXG4gICAgICAgICAgICAgICAgYHwgZGVzY3JpcHRpb24gICAgICAgPSAke3NjcmlwdC5kZXNjcmlwdGlvbn1gLFxuICAgICAgICAgICAgICAgIHNjcmlwdC51c2FnZSA/IGB8IHVzYWdlICAgICAgICAgICAgID0gJHtzY3JpcHQudXNhZ2V9YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0LmNvbmZpZ3VyYXRpb24gPyBgfCBjb25maWd1cmF0aW9uICAgICA9ICR7c2NyaXB0LmNvbmZpZ3VyYXRpb259YCA6IG51bGwsXG4gICAgICAgICAgICAgICAgc2NyaXB0LmNoYW5nZWxvZ1xuICAgICAgICAgICAgICAgICAgICA/IGB8IGNoYW5nZWxvZyAgICAgICAgID0gXFxuJHtPYmplY3QuZW50cmllcyhzY3JpcHQuY2hhbmdlbG9nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFtkYXRlLCBkZXNjcmlwdGlvbl0pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYCogJycne3tzdGFydCBkYXRlIGFuZCBhZ2V8JHtkYXRlfX19OicnJyR7QXJyYXkuaXNBcnJheShkZXNjcmlwdGlvbikgPyBgXFxuJHtkZXNjcmlwdGlvbi5tYXAoKGxpbmUpID0+IGAqKiAke2xpbmV9YCkuam9pbignXFxuJyl9YCA6IGAgJHtkZXNjcmlwdGlvbn1gfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ1xcbicpfWBcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIGB8IHNraW4tc3VwcG9ydCAgICAgID0ge3tVc2VyOkVlaml0NDMvc2NyaXB0LWRvY3VtZW50YXRpb24vc2tpbi1zdXBwb3J0fCR7T2JqZWN0LmVudHJpZXMoc2NyaXB0Wydza2luLXN1cHBvcnQnXSlcbiAgICAgICAgICAgICAgICAgICAgLm1hcCgoW3NraW4sIHN0YXR1c10pID0+IGAke3NraW59PSR7c3RhdHVzfWApXG4gICAgICAgICAgICAgICAgICAgIC5qb2luKCd8Jyl9fX1gLFxuICAgICAgICAgICAgICAgIHNjcmlwdFsnc291cmNlLW11bHRpcGxlJ10gPyBgfCBzb3VyY2UtbXVsdGlwbGUgICA9ICR7c2NyaXB0Wydzb3VyY2UtbXVsdGlwbGUnXX1gIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzY3JpcHRbJ2dsb2JhbC1zdXBwb3J0J10gPyBgfCBnbG9iYWwtc3VwcG9ydCAgICA9ICR7c2NyaXB0WydnbG9iYWwtc3VwcG9ydCddfWAgOiBudWxsLFxuICAgICAgICAgICAgICAgIGB8IHJlbGVhc2VkICAgICAgICAgID0ge3tzdGFydCBkYXRlIGFuZCBhZ2V8JHtzY3JpcHQucmVsZWFzZWR9fX1gLFxuICAgICAgICAgICAgICAgIGB8IHVwZGF0ZWQgICAgICAgICAgID0ge3tzdGFydCBkYXRlIGFuZCBhZ2V8JHtzY3JpcHQudXBkYXRlZH19fWAsXG4gICAgICAgICAgICAgICAgJ319JyxcbiAgICAgICAgICAgICAgICBzY3JpcHQuY2F0ZWdvcmllcyA/IGBcXG4ke3NjcmlwdC5jYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IGBbW0NhdGVnb3J5OiR7Y2F0ZWdvcnl9XV1gKS5qb2luKCdcXG4nKX1gIDogbnVsbCxcbiAgICAgICAgICAgIF0uZmlsdGVyKEJvb2xlYW4pO1xuXG4gICAgICAgICAgICBsZXQgc2NyaXB0Q29udGVudCA9IG51bGw7XG5cbiAgICAgICAgICAgIGlmIChhY3Rpb25zVG9UYWtlLmluY2x1ZGVzKCdzY3JpcHQnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdENvbnRlbnRSZXNwb25zZSA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgICAgICAgICBgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLyR7dGhpcy5SRVBPX09XTkVSfS8ke3RoaXMuUkVQT19OQU1FfS8ke3RoaXMubGF0ZXN0Q29tbWl0SGFzaH0vZGlzdC8ke3NjcmlwdC5uYW1lfS5qc2AsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoc2NyaXB0Q29udGVudFJlc3BvbnNlLm9rKSBzY3JpcHRDb250ZW50ID0gYXdhaXQgc2NyaXB0Q29udGVudFJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtdy5ub3RpZnkoXG4gICAgICAgICAgICAgICAgICAgICAgICBgRmFpbGVkIHRvIGZldGNoIFwiJHtzY3JpcHQubmFtZX0uanNcIiBmcm9tIEdpdEh1YjogJHtzY3JpcHRDb250ZW50UmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7c2NyaXB0Q29udGVudFJlc3BvbnNlLnN0YXR1c30pYCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Vycm9yJywgdGFnOiAnc3luYy1zY3JpcHRzLW5vdGlmaWNhdGlvbicgfSxcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzY3JpcHQucGVyc29uYWwpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uc1RvVGFrZS5pbmNsdWRlcygnZG9jdW1lbnRhdGlvbicpKVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmVkaXRPckNyZWF0ZShzdWJwYWdlTmFtZSwgZnVsbFN1YnBhZ2VJbmZvLmpvaW4oJ1xcbicpLCAnU3luY2luZyBzY3JpcHQgZG9jdW1lbnRhdGlvbiBmcm9tIEdpdEh1YicpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGFjdGlvbnNUb1Rha2UuaW5jbHVkZXMoJ3RhbGsnKSlcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBzdWJwYWdlVGFsa05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAnI1JFRElSRUNUIFtbVXNlciB0YWxrOkVlaml0NDNdXScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnUmVkaXJlY3Rpbmcgc2NyaXB0IGRvY3VtZW50YXRpb24gdGFsayBwYWdlIHRvIG1haW4gdXNlciB0YWxrIHBhZ2UnLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoc2NyaXB0Q29udGVudCkgYXdhaXQgdGhpcy5lZGl0T3JDcmVhdGUoc2NyaXB0TmFtZSwgc2NyaXB0Q29udGVudCwgJ1N5bmNpbmcgc2NyaXB0IGZyb20gR2l0SHViJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogTWFwcyBzY3JpcHRzIHRvIGEgYnVsbGV0ZWQgbGlzdC5cbiAgICAgICAgICogQHBhcmFtIHNjcmlwdHMgVGhlIHNjcmlwdHMgdG8gbWFwLlxuICAgICAgICAgKiBAcmV0dXJucyBUaGUgbWFwcGVkIHNjcmlwdHMuXG4gICAgICAgICAqL1xuICAgICAgICBwcml2YXRlIG1hcFNjcmlwdHMoc2NyaXB0czogU2NyaXB0W10pIHtcbiAgICAgICAgICAgIHJldHVybiBzY3JpcHRzXG4gICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgKHNjcmlwdCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGAqIFtbVXNlcjpFZWppdDQzL3NjcmlwdHMvJHtzY3JpcHQubmFtZX0ke3NjcmlwdC5wZXJzb25hbCA/ICcuanMnIDogJyd9fCR7c2NyaXB0Lm5hbWV9XV0gLSAke3NjcmlwdFsnc2hvcnQtZGVzY3JpcHRpb24nXSB8fCBzY3JpcHQuZGVzY3JpcHRpb259JHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRbJ2luLWRldmVsb3BtZW50J10gPyAnICg8c3BhbiBzdHlsZT1cImNvbG9yOiB2YXIoLS1jb2xvci13YXJuaW5nLCAjODg2NDI1KVwiPmluIGRldmVsb3BtZW50PC9zcGFuPiknIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgIH0ke3NjcmlwdFsndXNlLWluc3RlYWQnXSA/ICcgKDxzcGFuIHN0eWxlPVwiY29sb3I6IHZhcigtLWNvbG9yLWVycm9yLCAjYmYzYzJjKVwiPmRlcHJlY2F0ZWQ8L3NwYW4+KScgOiAnJ31gLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogRWRpdHMgYSBwYWdlLCBvciBjcmVhdGVzIGl0IGlmIGl0IGRvZXNuJ3QgZXhpc3QuXG4gICAgICAgICAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgb2YgdGhlIHBhZ2UgdG8gZWRpdC5cbiAgICAgICAgICogQHBhcmFtIHRleHQgVGhlIHBhZ2UgY29udGVudCB0byBzZXQuXG4gICAgICAgICAqIEBwYXJhbSBzdW1tYXJ5IFRoZSBlZGl0IHN1bW1hcnkgKHdpbGwgYXBwZW5kIHNjcmlwdCBub3RpY2UpLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBhc3luYyBlZGl0T3JDcmVhdGUodGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nLCBzdW1tYXJ5OiBzdHJpbmcpIHtcbiAgICAgICAgICAgIHN1bW1hcnkgKz0gdGhpcy5TQ1JJUFRfTUVTU0FHRTtcblxuICAgICAgICAgICAgYXdhaXQgYXBpXG4gICAgICAgICAgICAgICAgLmVkaXQodGl0bGUsICgpID0+ICh7IHRleHQsIHN1bW1hcnksIHdhdGNobGlzdDogJ3dhdGNoJyB9KSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goYXN5bmMgKGVycm9yQ29kZSwgZXJyb3JJbmZvKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvZGUgPT09ICdub2NyZWF0ZS1taXNzaW5nJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwaS5jcmVhdGUodGl0bGUsIHsgc3VtbWFyeSwgd2F0Y2hsaXN0OiAnd2F0Y2gnIH0sIHRleHQpLmNhdGNoKChlcnJvckNvZGUsIGVycm9ySW5mbykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG13Lm5vdGlmeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEVycm9yIGNyZWF0aW5nICR7dGl0bGV9OiAkeyhlcnJvckluZm8gYXMgTWVkaWFXaWtpRGF0YUVycm9yKT8uZXJyb3I/LmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdHlwZTogJ2Vycm9yJyB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbXcubm90aWZ5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBFcnJvciBlZGl0aW5nIG9yIGNyZWF0aW5nICR7dGl0bGV9OiAkeyhlcnJvckluZm8gYXMgTWVkaWFXaWtpRGF0YUVycm9yKT8uZXJyb3I/LmluZm8gPz8gJ1Vua25vd24gZXJyb3InfSAoJHtlcnJvckNvZGV9KWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0eXBlOiAnZXJyb3InIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogT3BlbnMgYSBkaWZmIGZvciB0aGUgZ2l2ZW4gcGFnZSB0aXRsZSBhbmQgY29udGVudC5cbiAgICAgICAgICogQHBhcmFtIHBhZ2VUaXRsZSBUaGUgdGl0bGUgb2YgdGhlIHBhZ2UgdG8gb3BlbiBhIGRpZmYgZm9yLlxuICAgICAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCB0byBzZXQgZm9yIHRoZSBwYWdlLlxuICAgICAgICAgKi9cbiAgICAgICAgcHJpdmF0ZSBvcGVuRGlmZihwYWdlVGl0bGU6IHN0cmluZywgY29udGVudDogc3RyaW5nKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtRGF0YSA9IHtcbiAgICAgICAgICAgICAgICB3cFRleHRib3gxOiBjb250ZW50LFxuICAgICAgICAgICAgICAgIHdwU3VtbWFyeTogYFVwZGF0aW5nIGRhdGEke3RoaXMuU0NSSVBUX01FU1NBR0V9YCxcbiAgICAgICAgICAgICAgICB3cERpZmY6ICcxJywgLy8gQW55IHRydXRoeSB2YWx1ZSBtYWtlcyB0aGlzIHdvcmtcbiAgICAgICAgICAgICAgICB3cFdhdGNodGhpczogJzEnLFxuICAgICAgICAgICAgICAgIHdwVWx0aW1hdGVQYXJhbTogJzEnLCAvLyBNYXJrcyB0aGUgZW5kIG9mIGZvcm0gZGF0YVxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgZm9ybVVybCA9IG5ldyBVUkwoYCR7bXcuY29uZmlnLmdldCgnd2dTY3JpcHRQYXRoJyl9L2luZGV4LnBocGAsIHdpbmRvdy5sb2NhdGlvbi5vcmlnaW4pO1xuICAgICAgICAgICAgZm9ybVVybC5zZWFyY2hQYXJhbXMuc2V0KCd0aXRsZScsIHBhZ2VUaXRsZSk7XG4gICAgICAgICAgICBmb3JtVXJsLnNlYXJjaFBhcmFtcy5zZXQoJ2FjdGlvbicsICdzdWJtaXQnKTtcblxuICAgICAgICAgICAgY29uc3QgZm9ybSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2Zvcm0nKTtcbiAgICAgICAgICAgIGZvcm0uYWN0aW9uID0gZm9ybVVybC5ocmVmO1xuICAgICAgICAgICAgZm9ybS5tZXRob2QgPSAnUE9TVCc7XG4gICAgICAgICAgICBmb3JtLnRhcmdldCA9ICdfYmxhbmsnO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmb3JtRGF0YSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBoaWRkZW5GaWVsZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgICAgICAgICAgICAgaGlkZGVuRmllbGQudHlwZSA9ICdoaWRkZW4nO1xuICAgICAgICAgICAgICAgIGhpZGRlbkZpZWxkLm5hbWUgPSBrZXk7XG4gICAgICAgICAgICAgICAgaGlkZGVuRmllbGQudmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgICAgIGZvcm0uYXBwZW5kKGhpZGRlbkZpZWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmQoZm9ybSk7XG4gICAgICAgICAgICBmb3JtLnN1Ym1pdCgpO1xuICAgICAgICAgICAgZm9ybS5yZW1vdmUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIE9iamVjdC5hc3NpZ24oU2NyaXB0VXBkYXRlckRpYWxvZy5wcm90b3R5cGUsIE9PLnVpLlByb2Nlc3NEaWFsb2cucHJvdG90eXBlKTtcbn0pO1xuXG4vKipcbiAqIEdldHMgdGhlIHNjcmlwdCBkYXRhIGZvciBhcnRpY2xlLWNsZWFuZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldEFydGljbGVDbGVhbmVyRGF0YSgpIHtcbiAgICBjb25zdCBjb250ZW50ID0gKGF3YWl0IGdldFBhZ2VDb250ZW50KCdXaWtpcGVkaWE6QXV0b1dpa2lCcm93c2VyL1RlbXBsYXRlIHJlZGlyZWN0cycpKSA/PyAnJztcblxuICAgIGNvbnN0IHJlcGxhY2VtZW50cyA9IGNvbnRlbnRcbiAgICAgICAgLm1hdGNoQWxsKC9cXCogXFx7XFx7dGxcXHwuKy9nKVxuICAgICAgICAubWFwKChsaW5lKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZXMgPSBsaW5lWzBdLm1hdGNoQWxsKC9cXHtcXHt0bFxcfCguKz8pXFx9XFx9L2cpLnRvQXJyYXkoKTtcblxuICAgICAgICAgICAgcmV0dXJuIHsgZnJvbTogdGVtcGxhdGVzLnNsaWNlKDAsIC0xKS5tYXAoKHRlbXBsYXRlKSA9PiB0ZW1wbGF0ZVsxXSksIHRvOiB0ZW1wbGF0ZXMuYXQoLTEpIVsxXSB9O1xuICAgICAgICB9KVxuICAgICAgICAudG9BcnJheSgpO1xuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHJlcGxhY2VtZW50cyk7XG59XG5cbi8qKlxuICogQ2h1bmtzIGFuIGFycmF5IGludG8gc21hbGxlciBhcnJheXMgb2YgYSBzcGVjaWZpZWQgc2l6ZS5cbiAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gY2h1bmsuXG4gKiBAcGFyYW0gY2h1bmtTaXplIFRoZSBzaXplIG9mIGVhY2ggY2h1bmsuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXVubmVjZXNzYXJ5LXBhcmFtZXRlcnNcbmZ1bmN0aW9uIGNodW5rQXJyYXk8VD4oYXJyYXk6IFRbXSwgY2h1bmtTaXplOiBudW1iZXIpOiBUW11bXSB7XG4gICAgY29uc3QgY2h1bmtlZCA9IFtdO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXggKz0gY2h1bmtTaXplKSB7XG4gICAgICAgIGNvbnN0IGNodW5rID0gYXJyYXkuc2xpY2UoaW5kZXgsIGluZGV4ICsgY2h1bmtTaXplKTtcblxuICAgICAgICBjaHVua2VkLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIHJldHVybiBjaHVua2VkO1xufVxuXG4vKipcbiAqIEdldHMgYSBjb250aW51ZWQgcXVlcnkgcmVzdWx0IGZyb20gdGhlIEFQSSwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHJlc3VsdHMuXG4gKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gdXNlIGZvciB0aGUgQVBJIHJlcXVlc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENvbnRpbnVlZFF1ZXJ5KHF1ZXJ5OiBBcGlRdWVyeVBhcmFtcyk6IFByb21pc2U8QXBpUmVzcG9uc2VbXT4ge1xuICAgIGxldCBpdGVyYXRpb24gPSAwO1xuXG4gICAgY29uc3QgcmV0dXJuVmFsdWUgPSBbXTtcblxuICAgIGxldCByZXNwb25zZSA9IHsgY29udGludWU6IHt9IH0gYXMgQXBpUmVzcG9uc2UgJiBRdWVyeUNvbnRpbnVhdGlvbjtcblxuICAgIHdoaWxlICgnY29udGludWUnIGluIHJlc3BvbnNlICYmIGl0ZXJhdGlvbiA8IDEwKSB7XG4gICAgICAgIHJlc3BvbnNlID0gYXdhaXQgYXBpLmdldCh7IC4uLnF1ZXJ5LCAuLi5yZXNwb25zZS5jb250aW51ZSB9IGFzIEFwaVF1ZXJ5UGFyYW1zKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1hd2FpdC1pbi1sb29wXG5cbiAgICAgICAgcmV0dXJuVmFsdWUucHVzaChyZXNwb25zZSk7XG5cbiAgICAgICAgaXRlcmF0aW9uKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJldHVyblZhbHVlO1xufVxuXG5jb25zdCBuYW1lc3BhY2VNYXBwaW5nID0gbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VJZHMnKTtcblxuY29uc3QgcmVkaXJlY3RUZW1wbGF0ZU5hbWVzcGFjZUNhdGVnb3J5TWFwcGluZzogUmVjb3JkPHN0cmluZywgeyBudW1iZXJPclR5cGU6IG51bWJlciB8IHN0cmluZzsgdGVtcGxhdGVzOiBzdHJpbmdbXSB9PiA9IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cbiAgICAnQWxsIG5hbWVzcGFjZSByZWRpcmVjdCB0ZW1wbGF0ZXMnOiB7IG51bWJlck9yVHlwZTogJ0FMTCcsIHRlbXBsYXRlczogW10gfSxcbiAgICAnQ2F0ZWdvcnkgbmFtZXNwYWNlIHJlZGlyZWN0IHRlbXBsYXRlcyc6IHsgbnVtYmVyT3JUeXBlOiBuYW1lc3BhY2VNYXBwaW5nLmNhdGVnb3J5LCB0ZW1wbGF0ZXM6IFtdIH0sXG4gICAgJ0RyYWZ0IG5hbWVzcGFjZSByZWRpcmVjdCB0ZW1wbGF0ZXMnOiB7IG51bWJlck9yVHlwZTogbmFtZXNwYWNlTWFwcGluZy5kcmFmdCwgdGVtcGxhdGVzOiBbXSB9LFxuICAgICdIZWxwIG5hbWVzcGFjZSByZWRpcmVjdCB0ZW1wbGF0ZXMnOiB7IG51bWJlck9yVHlwZTogbmFtZXNwYWNlTWFwcGluZy5oZWxwLCB0ZW1wbGF0ZXM6IFtdIH0sXG4gICAgJ01haW4gbmFtZXNwYWNlIHJlZGlyZWN0IHRlbXBsYXRlcyc6IHsgbnVtYmVyT3JUeXBlOiBuYW1lc3BhY2VNYXBwaW5nWycnXSwgdGVtcGxhdGVzOiBbXSB9LFxuICAgICdPdGhlciBuYW1lc3BhY2UgcmVkaXJlY3QgdGVtcGxhdGVzJzogeyBudW1iZXJPclR5cGU6ICdBTEwnLCB0ZW1wbGF0ZXM6IFtdIH0sXG4gICAgJ1BvcnRhbCBuYW1lc3BhY2UgcmVkaXJlY3QgdGVtcGxhdGVzJzogeyBudW1iZXJPclR5cGU6IG5hbWVzcGFjZU1hcHBpbmcucG9ydGFsLCB0ZW1wbGF0ZXM6IFtdIH0sXG4gICAgJ1RhbGsgbmFtZXNwYWNlIHJlZGlyZWN0IHRlbXBsYXRlcyc6IHsgbnVtYmVyT3JUeXBlOiAnVEFMSycsIHRlbXBsYXRlczogW10gfSxcbiAgICAnVGVtcGxhdGUgbmFtZXNwYWNlIHJlZGlyZWN0IHRlbXBsYXRlcyc6IHsgbnVtYmVyT3JUeXBlOiBuYW1lc3BhY2VNYXBwaW5nLnRlbXBsYXRlLCB0ZW1wbGF0ZXM6IFtdIH0sXG4gICAgJ1Vua25vd24gbmFtZXNwYWNlIHJlZGlyZWN0IHRlbXBsYXRlcyc6IHsgbnVtYmVyT3JUeXBlOiAnQUxMJywgdGVtcGxhdGVzOiBbXSB9LFxuICAgICdVc2VyIG5hbWVzcGFjZSByZWRpcmVjdCB0ZW1wbGF0ZXMnOiB7IG51bWJlck9yVHlwZTogbmFtZXNwYWNlTWFwcGluZy51c2VyLCB0ZW1wbGF0ZXM6IFtdIH0sXG4gICAgJ1dpa2lwZWRpYSBuYW1lc3BhY2UgcmVkaXJlY3QgdGVtcGxhdGVzJzogeyBudW1iZXJPclR5cGU6IG5hbWVzcGFjZU1hcHBpbmcud2lraXBlZGlhLCB0ZW1wbGF0ZXM6IFtdIH0sXG4gICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cbn07XG5cbi8qKlxuICogR2V0cyB0aGUgc2NyaXB0IGRhdGEgZm9yIHJlZGlyZWN0LWhlbHBlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UmVkaXJlY3RIZWxwZXJEYXRhKCkge1xuICAgIGNvbnN0IGFsbFJlZGlyZWN0VGVtcGxhdGVzID0gKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgIGxpc3Q6ICdjYXRlZ29yeW1lbWJlcnMnLFxuICAgICAgICBjbXRpdGxlOiAnQ2F0ZWdvcnk6UmVkaXJlY3QgdGVtcGxhdGVzJyxcbiAgICAgICAgY21saW1pdDogJ21heCcsXG4gICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUNhdGVnb3J5TWVtYmVyc1BhcmFtcykpIGFzIENhdGVnb3J5TWVtYmVyc1Jlc3VsdDtcbiAgICBjb25zdCBhbGxQb3NzaWJsZVJlZGlyZWN0VGVtcGxhdGVzID0gKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgIGxpc3Q6ICdjYXRlZ29yeW1lbWJlcnMnLFxuICAgICAgICBjbXRpdGxlOiAnQ2F0ZWdvcnk6VGVtcGxhdGUgcmVkaXJlY3RzIHdpdGggcG9zc2liaWxpdGllcycsXG4gICAgICAgIGNtbGltaXQ6ICdtYXgnLFxuICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlDYXRlZ29yeU1lbWJlcnNQYXJhbXMpKSBhcyBDYXRlZ29yeU1lbWJlcnNSZXN1bHQ7XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocmVkaXJlY3RUZW1wbGF0ZU5hbWVzcGFjZUNhdGVnb3J5TWFwcGluZykubWFwKGFzeW5jIChbY2F0ZWdvcnlOYW1lLCBkYXRhXSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVkaXJlY3RUZW1wbGF0ZXNGb3JOYW1lc3BhY2UgPSAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgICAgIGxpc3Q6ICdjYXRlZ29yeW1lbWJlcnMnLFxuICAgICAgICAgICAgICAgIGNtdGl0bGU6IGBDYXRlZ29yeToke2NhdGVnb3J5TmFtZX1gLFxuICAgICAgICAgICAgICAgIGNtbGltaXQ6ICdtYXgnLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5Q2F0ZWdvcnlNZW1iZXJzUGFyYW1zKSkgYXMgQ2F0ZWdvcnlNZW1iZXJzUmVzdWx0O1xuXG4gICAgICAgICAgICBkYXRhLnRlbXBsYXRlcyA9IHJlZGlyZWN0VGVtcGxhdGVzRm9yTmFtZXNwYWNlLnF1ZXJ5LmNhdGVnb3J5bWVtYmVycy5tYXAoKHBhZ2UpID0+IHBhZ2UudGl0bGUuc3BsaXQoJzonKS5zbGljZSgxKS5qb2luKCc6JykpO1xuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgcmVkaXJlY3RUZW1wbGF0ZXMgPSBhbGxSZWRpcmVjdFRlbXBsYXRlcy5xdWVyeS5jYXRlZ29yeW1lbWJlcnNcbiAgICAgICAgLmZpbHRlcigocGFnZSkgPT4gcGFnZS50aXRsZS5zdGFydHNXaXRoKCdUZW1wbGF0ZTpSICcpICYmIHBhZ2UudGl0bGUgIT09ICdUZW1wbGF0ZTpSIHRlbXBsYXRlIGluZGV4JylcbiAgICAgICAgLm1hcCgocGFnZSkgPT4gKHsgbmFtZTogcGFnZS50aXRsZS5zcGxpdCgnOicpLnNsaWNlKDEpLmpvaW4oJzonKSwgcmVkaXJlY3Q6IGZhbHNlIH0pKTtcbiAgICBjb25zdCBwb3NzaWJsZVJlZGlyZWN0VGVtcGxhdGVzID0gYWxsUG9zc2libGVSZWRpcmVjdFRlbXBsYXRlcy5xdWVyeS5jYXRlZ29yeW1lbWJlcnNcbiAgICAgICAgLmZpbHRlcigocGFnZSkgPT4gcGFnZS50aXRsZS5zdGFydHNXaXRoKCdUZW1wbGF0ZTpSICcpICYmIHBhZ2UudGl0bGUgIT09ICdUZW1wbGF0ZTpSIHdpdGggcG9zc2liaWxpdGllcycpXG4gICAgICAgIC5tYXAoKHBhZ2UpID0+ICh7IG5hbWU6IHBhZ2UudGl0bGUuc3BsaXQoJzonKS5zbGljZSgxKS5qb2luKCc6JyksIHJlZGlyZWN0OiB0cnVlIH0pKTtcblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLWFycmF5LXNvcnRcbiAgICBjb25zdCBhbGxUZW1wbGF0ZXMgPSBbLi4ucmVkaXJlY3RUZW1wbGF0ZXMsIC4uLnBvc3NpYmxlUmVkaXJlY3RUZW1wbGF0ZXNdLnNvcnQoKGEsIGIpID0+IGEubmFtZS5sb2NhbGVDb21wYXJlKGIubmFtZSkpO1xuXG4gICAgY29uc3QgZmluYWxEYXRhID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBhbGxUZW1wbGF0ZXMubWFwKChwYWdlKSA9PiBbXG4gICAgICAgICAgICBwYWdlLm5hbWUsXG4gICAgICAgICAgICB7IHJlZGlyZWN0OiBwYWdlLnJlZGlyZWN0LCBuYW1lc3BhY2VSZXF1aXJlbWVudDogW10gYXMgKG51bWJlciB8IHN0cmluZylbXSwgcGFyYW1ldGVyczoge30sIGFsaWFzZXM6IFtdIGFzIHN0cmluZ1tdIH0sXG4gICAgICAgIF0pLFxuICAgICk7XG5cbiAgICAvLyBGZXRjaCB0aGUgVGVtcGxhdGVEYXRhIGZvciBhbGwgdGVtcGxhdGVzXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIGNodW5rQXJyYXkoYWxsVGVtcGxhdGVzLCA1MCkubWFwKGFzeW5jIChjaHVuaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVEYXRhUXVlcnlSZXN1bHQgPSAoYXdhaXQgYXBpLmdldCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiAndGVtcGxhdGVkYXRhJyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IGNodW5rLm1hcCgocGFnZSkgPT4gYFRlbXBsYXRlOiR7cGFnZS5uYW1lfWApLFxuICAgICAgICAgICAgICAgIGZvcm1hdHZlcnNpb246ICcyJyxcbiAgICAgICAgICAgIH0gc2F0aXNmaWVzIFRlbXBsYXRlRGF0YUFwaVRlbXBsYXRlRGF0YVBhcmFtcykpIGFzIFRlbXBsYXRlRGF0YVJlc3VsdDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBwYWdlIG9mIE9iamVjdC52YWx1ZXModGVtcGxhdGVEYXRhUXVlcnlSZXN1bHQucGFnZXMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkUGFyYW1ldGVycyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocGFnZS5wYXJhbXMpLm1hcCgoW25hbWUsIGRhdGFdKSA9PiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzZXM6IGRhdGEuYWxpYXNlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogZGF0YS5sYWJlbD8uZW4gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS5kZXNjcmlwdGlvbj8uZW4gPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ6IGRhdGEucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkOiBkYXRhLnN1Z2dlc3RlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBkYXRhLmRlZmF1bHQ/LmVuID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZTogZGF0YS5leGFtcGxlPy5lbiA/PyBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGZpbmFsRGF0YVtwYWdlLnRpdGxlLnNwbGl0KCc6Jykuc2xpY2UoMSkuam9pbignOicpXS5wYXJhbWV0ZXJzID0gZm9ybWF0dGVkUGFyYW1ldGVycztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEZpbmQgYWxpYXNlcyBvZiByZWRpcmVjdCB0ZW1wbGF0ZXNcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgY2h1bmtBcnJheShyZWRpcmVjdFRlbXBsYXRlcywgNTApLm1hcChhc3luYyAoY2h1bmspID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFsbFJlZGlyZWN0c1F1ZXJ5UmVzdWx0ID0gKGF3YWl0IGdldENvbnRpbnVlZFF1ZXJ5KHtcbiAgICAgICAgICAgICAgICBhY3Rpb246ICdxdWVyeScsXG4gICAgICAgICAgICAgICAgdGl0bGVzOiBjaHVuay5tYXAoKHBhZ2UpID0+IGBUZW1wbGF0ZToke3BhZ2UubmFtZX1gKSxcbiAgICAgICAgICAgICAgICBwcm9wOiAncmVkaXJlY3RzJyxcbiAgICAgICAgICAgICAgICByZG5hbWVzcGFjZTogMTAsXG4gICAgICAgICAgICAgICAgcmRsaW1pdDogJ21heCcsXG4gICAgICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgfSBzYXRpc2ZpZXMgQXBpUXVlcnlCYWNrbGlua3Nwcm9wUGFyYW1zKSkgYXMgUmVkaXJlY3RzUmVzdWx0W107XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0c1F1ZXJ5UmVzdWx0UGFnZXMgPSBhbGxSZWRpcmVjdHNRdWVyeVJlc3VsdC5mbGF0TWFwKChyZXN1bHQpID0+IHJlc3VsdC5xdWVyeS5wYWdlcyk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiByZWRpcmVjdHNRdWVyeVJlc3VsdFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkUmVkaXJlY3RzID1cbiAgICAgICAgICAgICAgICAgICAgcGFnZS5yZWRpcmVjdHNcbiAgICAgICAgICAgICAgICAgICAgICAgID8ubWFwKChyZWRpcmVjdCkgPT4gcmVkaXJlY3QudGl0bGUuc3BsaXQoJzonKS5zbGljZSgxKS5qb2luKCc6JykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChyZWRpcmVjdCkgPT4gcG9zc2libGVSZWRpcmVjdFRlbXBsYXRlcy5ldmVyeSgodGVtcGxhdGUpID0+IHRlbXBsYXRlLm5hbWUgIT09IHJlZGlyZWN0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpID8/IFtdOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHVuaWNvcm4vbm8tYXJyYXktc29ydFxuXG4gICAgICAgICAgICAgICAgZmluYWxEYXRhW3BhZ2UudGl0bGUuc3BsaXQoJzonKS5zbGljZSgxKS5qb2luKCc6JyldLmFsaWFzZXMucHVzaCguLi5tYXBwZWRSZWRpcmVjdHMpOyAvLyBEYXRhIG1pZ2h0IGV4aXN0IGZyb20gcHJldmlvdXMgcXVlcmllcywgc28gdXBkYXRlIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEZpbmQgYWxpYXNlcyBvZiBwb3NzaWJsZSByZWRpcmVjdCB0ZW1wbGF0ZXNcbiAgICBjb25zdCBhbGxBbGlhc2VzT2ZQb3NzaWJsZVRlbXBsYXRlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBjaHVua0FycmF5KHBvc3NpYmxlUmVkaXJlY3RUZW1wbGF0ZXMsIDUwKS5tYXAoYXN5bmMgKGNodW5rKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsaW5rc1F1ZXJ5UmVzdWx0ID0gKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ3F1ZXJ5JyxcbiAgICAgICAgICAgICAgICB0aXRsZXM6IGNodW5rLm1hcCgocGFnZSkgPT4gYFRlbXBsYXRlOiR7cGFnZS5uYW1lfWApLFxuICAgICAgICAgICAgICAgIHByb3A6ICdsaW5rc2hlcmUnLFxuICAgICAgICAgICAgICAgIGxobmFtZXNwYWNlOiAxMCxcbiAgICAgICAgICAgICAgICBsaGxpbWl0OiAnbWF4JyxcbiAgICAgICAgICAgICAgICBmb3JtYXR2ZXJzaW9uOiAnMicsXG4gICAgICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUJhY2tsaW5rc3Byb3BQYXJhbXMpKSBhcyBMaW5rc0hlcmVSZXN1bHQ7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGFnZSBvZiBsaW5rc1F1ZXJ5UmVzdWx0LnF1ZXJ5LnBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkUmVkaXJlY3RzID1cbiAgICAgICAgICAgICAgICAgICAgcGFnZS5saW5rc2hlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgID8uZmlsdGVyKChwYWdlKSA9PiBwYWdlLnJlZGlyZWN0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocGFnZSkgPT4gcGFnZS50aXRsZS5zcGxpdCgnOicpLnNsaWNlKDEpLmpvaW4oJzonKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhZ2UpID0+ICFwYWdlLmVuZHNXaXRoKCcvZG9jJykgJiYgIXBhZ2UuZW5kc1dpdGgoJy9zYW5kYm94JykpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSA/PyBbXTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSB1bmljb3JuL25vLWFycmF5LXNvcnRcblxuICAgICAgICAgICAgICAgIGFsbEFsaWFzZXNPZlBvc3NpYmxlVGVtcGxhdGVzLnB1c2goLi4ubWFwcGVkUmVkaXJlY3RzKTtcblxuICAgICAgICAgICAgICAgIGZpbmFsRGF0YVtwYWdlLnRpdGxlLnNwbGl0KCc6Jykuc2xpY2UoMSkuam9pbignOicpXS5hbGlhc2VzID0gbWFwcGVkUmVkaXJlY3RzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gQWRkIG5hbWVzcGFjZSByZXF1aXJlbWVudHNcbiAgICBmb3IgKGNvbnN0IG5hbWVzcGFjZVJlcXVpcmVtZW50RGF0YSBvZiBPYmplY3QudmFsdWVzKHJlZGlyZWN0VGVtcGxhdGVOYW1lc3BhY2VDYXRlZ29yeU1hcHBpbmcpKVxuICAgICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlIG9mIG5hbWVzcGFjZVJlcXVpcmVtZW50RGF0YS50ZW1wbGF0ZXMpIHtcbiAgICAgICAgICAgIGlmICghKHRlbXBsYXRlIGluIGZpbmFsRGF0YSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gYFRlbXBsYXRlICR7dGVtcGxhdGV9IGlzIGluIHRoZSBuYW1lc3BhY2UgcmVxdWlyZW1lbnQgbWFwcGluZyBidXQgbm90IGluIHRoZSBmaW5hbCBkYXRhLmA7XG4gICAgICAgICAgICAgICAgbXcubm90aWZ5KG1lc3NhZ2UsIHsgdHlwZTogJ3dhcm4nIH0pO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbmFsRGF0YVt0ZW1wbGF0ZV0ubmFtZXNwYWNlUmVxdWlyZW1lbnQucHVzaChuYW1lc3BhY2VSZXF1aXJlbWVudERhdGEubnVtYmVyT3JUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgY29uc3QgbWFwcGVkRmluYWxEYXRhID0gT2JqZWN0LmVudHJpZXMoZmluYWxEYXRhKS5tYXAoKFtuYW1lLCB0ZW1wbGF0ZURhdGFdKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbmFsVGVtcGxhdGVEYXRhID0ge1xuICAgICAgICAgICAgLi4uKHRlbXBsYXRlRGF0YS5yZWRpcmVjdCAmJiB7IHJlZGlyZWN0OiB0cnVlIH0pLFxuICAgICAgICAgICAgbmFtZXNwYWNlUmVxdWlyZW1lbnQ6XG4gICAgICAgICAgICAgICAgdGVtcGxhdGVEYXRhLm5hbWVzcGFjZVJlcXVpcmVtZW50Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB0ZW1wbGF0ZURhdGEubmFtZXNwYWNlUmVxdWlyZW1lbnQudG9Tb3J0ZWQoKGEsIGIpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBhID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgYiA9PT0gJ251bWJlcicgPyBhIC0gYiA6IFN0cmluZyhhKS5sb2NhbGVDb21wYXJlKFN0cmluZyhiKSksXG4gICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA6IFsnQUxMJ10sXG4gICAgICAgICAgICBwYXJhbWV0ZXJzOiB0ZW1wbGF0ZURhdGEucGFyYW1ldGVycyxcbiAgICAgICAgICAgIGFsaWFzZXM6IHRlbXBsYXRlRGF0YS5hbGlhc2VzLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgdW5pY29ybi9uby1hcnJheS1zb3J0XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIFtuYW1lLCBmaW5hbFRlbXBsYXRlRGF0YV0gYXMgY29uc3Q7XG4gICAgfSk7XG5cbiAgICBmb3IgKGNvbnN0IHBvc3NpYmxlVGVtcGxhdGVBbGlhcyBvZiBhbGxBbGlhc2VzT2ZQb3NzaWJsZVRlbXBsYXRlcylcbiAgICAgICAgZm9yIChjb25zdCBbLCBkYXRhXSBvZiBtYXBwZWRGaW5hbERhdGEpXG4gICAgICAgICAgICBpZiAoIWRhdGEucmVkaXJlY3QgJiYgZGF0YS5hbGlhc2VzLmluY2x1ZGVzKHBvc3NpYmxlVGVtcGxhdGVBbGlhcykpXG4gICAgICAgICAgICAgICAgZGF0YS5hbGlhc2VzID0gZGF0YS5hbGlhc2VzLmZpbHRlcigoYWxpYXMpID0+IGFsaWFzICE9PSBwb3NzaWJsZVRlbXBsYXRlQWxpYXMpO1xuXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KE9iamVjdC5mcm9tRW50cmllcyhtYXBwZWRGaW5hbERhdGEpKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7OzttQkFHTyxJQUFNQSxFQUFNLElBQUksR0FBRyxJQU0xQixlQUFzQkMsRUFBZUMsRUFBZSxDQUNoRCxPQUNLLE1BQU1GLEVBQUksSUFBSSxDQUNYLE9BQVEsUUFDUixjQUFlLElBQ2YsS0FBTSxZQUNOLE9BQVEsVUFDUixRQUFTLE9BQ1QsT0FBUUUsQ0FDWixDQUFtQyxHQUNyQyxNQUFNLE1BQU0sQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLE1BQU0sS0FBSyxRQUFRLEtBQUssQ0FDNUQsQ0NtQkEsR0FBRyxPQUFPLE1BQU0sQ0FBQyxpQkFBa0IsZUFBZ0Isa0JBQW1CLGlCQUFpQixFQUFHLElBQU0sQ0FDNUYsR0FBSSxHQUFHLE9BQU8sSUFBSSxZQUFZLElBQU0sV0FBYSxHQUFHLE9BQU8sSUFBSSxZQUFZLElBQU0sZUFBZ0IsT0FFakcsSUFBTUMsRUFBa0IsU0FBUyxjQUFjLGlCQUFpQixFQUFHLFVBQVUsRUFBSSxFQUUzRUMsRUFBTyxTQUFTLGNBQWMsR0FBRyxFQUN2Q0EsRUFBSyxLQUFPLElB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QUFVLE9BQU8sWUFBWUgsQ0FBZSxDQUFDLENBQzdEIiwKICAibmFtZXMiOiBbImFwaSIsICJnZXRQYWdlQ29udGVudCIsICJ0aXRsZSIsICJmdWxsTGlua0VsZW1lbnQiLCAibGluayIsICJldmVudCIsICJ3aW5kb3dNYW5hZ2VyIiwgInNjcmlwdFVwZGF0ZXJEaWFsb2ciLCAiU2NyaXB0VXBkYXRlckRpYWxvZyIsICJnZXRBcnRpY2xlQ2xlYW5lckRhdGEiLCAiZ2V0UmVkaXJlY3RIZWxwZXJEYXRhIiwgImVycm9yIiwgIm1lc3NhZ2VFbGVtZW50IiwgInNjcmlwdCIsICJzY3JpcHRzTXVsdGlzZWxlY3RMYXlvdXQiLCAiaWQiLCAibmFtZSIsICJzZWxlY3RlZERlZmF1bHQiLCAiYWN0aW9uc011bHRpc2VsZWN0TGF5b3V0IiwgImJ1dHRvbkdyb3VwIiwgInVwZGF0ZXIiLCAiYnV0dG9uIiwgImRhdGEiLCAicmVzb2x2ZSIsICJzY3JpcHREYXRhVXBkYXRlcnNNdWx0aXNlbGVjdExheW91dCIsICJhY3Rpb24iLCAic2VsZWN0ZWRTY3JpcHRzIiwgInNjcmlwdE5hbWUiLCAibWV0aG9kIiwgImRlZmVycmVkIiwgInJlc3VsdCIsICJsYXRlc3RDb21taXRIYXNoUmVzcG9uc2UiLCAic2NyaXB0RGF0YVJlc3BvbnNlIiwgInNjcmlwdERhdGEiLCAiYWN0aW9uc1RvVGFrZSIsICJzdWJwYWdlTmFtZSIsICJzdWJwYWdlVGFsa05hbWUiLCAiZnVsbFN1YnBhZ2VJbmZvIiwgImF1dGhvciIsICJkYXRlIiwgImRlc2NyaXB0aW9uIiwgImxpbmUiLCAic2tpbiIsICJzdGF0dXMiLCAiY2F0ZWdvcnkiLCAic2NyaXB0Q29udGVudCIsICJzY3JpcHRDb250ZW50UmVzcG9uc2UiLCAic2NyaXB0cyIsICJ0aXRsZSIsICJ0ZXh0IiwgInN1bW1hcnkiLCAiYXBpIiwgImVycm9yQ29kZSIsICJlcnJvckluZm8iLCAicGFnZVRpdGxlIiwgImNvbnRlbnQiLCAiZm9ybURhdGEiLCAiZm9ybVVybCIsICJmb3JtIiwgImtleSIsICJ2YWx1ZSIsICJoaWRkZW5GaWVsZCIsICJyZXBsYWNlbWVudHMiLCAiZ2V0UGFnZUNvbnRlbnQiLCAidGVtcGxhdGVzIiwgInRlbXBsYXRlIiwgImNodW5rQXJyYXkiLCAiYXJyYXkiLCAiY2h1bmtTaXplIiwgImNodW5rZWQiLCAiaW5kZXgiLCAiY2h1bmsiLCAiZ2V0Q29udGludWVkUXVlcnkiLCAicXVlcnkiLCAiaXRlcmF0aW9uIiwgInJldHVyblZhbHVlIiwgInJlc3BvbnNlIiwgIm5hbWVzcGFjZU1hcHBpbmciLCAicmVkaXJlY3RUZW1wbGF0ZU5hbWVzcGFjZUNhdGVnb3J5TWFwcGluZyIsICJhbGxSZWRpcmVjdFRlbXBsYXRlcyIsICJhbGxQb3NzaWJsZVJlZGlyZWN0VGVtcGxhdGVzIiwgImNhdGVnb3J5TmFtZSIsICJyZWRpcmVjdFRlbXBsYXRlc0Zvck5hbWVzcGFjZSIsICJwYWdlIiwgInJlZGlyZWN0VGVtcGxhdGVzIiwgInBvc3NpYmxlUmVkaXJlY3RUZW1wbGF0ZXMiLCAiYWxsVGVtcGxhdGVzIiwgImEiLCAiYiIsICJmaW5hbERhdGEiLCAidGVtcGxhdGVEYXRhUXVlcnlSZXN1bHQiLCAiZm9ybWF0dGVkUGFyYW1ldGVycyIsICJyZWRpcmVjdHNRdWVyeVJlc3VsdFBhZ2VzIiwgIm1hcHBlZFJlZGlyZWN0cyIsICJyZWRpcmVjdCIsICJhbGxBbGlhc2VzT2ZQb3NzaWJsZVRlbXBsYXRlcyIsICJsaW5rc1F1ZXJ5UmVzdWx0IiwgIm5hbWVzcGFjZVJlcXVpcmVtZW50RGF0YSIsICJtZXNzYWdlIiwgIm1hcHBlZEZpbmFsRGF0YSIsICJ0ZW1wbGF0ZURhdGEiLCAiZmluYWxUZW1wbGF0ZURhdGEiLCAicG9zc2libGVUZW1wbGF0ZUFsaWFzIiwgImFsaWFzIl0KfQo=