User:Eejit43/scripts/article-cleaner.js

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/article-cleaner.ts

"use strict";(()=>{var N=new mw.Api;async function C(e){return(await N.get({action:"query",formatversion:"2",prop:"revisions",rvprop:"content",rvslots:"main",titles:e})).query.pages[0].revisions?.[0].slots.main.content.trim()}(()=>{if(mw.config.get("wgNamespaceNumber")<0||!mw.config.get("wgIsProbablyEditable"))return;let e=["mediawiki.util","jquery.textSelection"];mw.config.get("skin")!=="minerva"&&e.push("mobile.editor.overlay"),mw.loader.using(e,()=>{let p=!1,f="Cleaned up article content (via [[User:Eejit43/scripts/article-cleaner|article-cleaner]])";function d(l){setTimeout(()=>{l.value.includes(f.slice(1))||(l.value+=l.value&&!l.value.startsWith("/* ")&&!l.value.endsWith(" */ ")?`; ${f.charAt(0).toLowerCase()+f.slice(1)}`:f)},0),p=!1}async function o(l){l.preventDefault();let m=$(mw.config.get("skin")==="minerva"?"#wikitext-editor":"#wpTextbox1");if(m.length===0)return mw.notify("Edit box not found!",{type:"error",autoHideSeconds:"short"});let g=m.textSelection("getContents"),t=g;if(t=v(t),t=P(t),t=M(t),t=_(t),t=O(t),t=D(t,[F,H]),t=U(t),t=R(t),t=G(t),t=await W(t),t=j(t),t=R(t,!0),t=B(t),g===t)mw.notify("No changes to be made to the article!",{type:"warn",autoHideSeconds:"short"});else{if(ve.init){let s=ve.init.target.getSurface().getModel();s.getLinearFragment(s.getRangeFromSourceOffsets(0,g.length)).insertContent(t),s.setSelection(new ve.dm.LinearSelection(new ve.Range(0,0)))}else m.textSelection("setContents",t),m.textSelection("setSelection",{start:0});mw.notify("Article cleanup complete!",{type:"success",autoHideSeconds:"short"});let n=document.querySelector("#wpSummary");n?d(n):p=!0}}mw.config.get("skin")==="minerva"?(mw.hook("mobileFrontend.editorOpened").add(()=>{let l=document.querySelector(".overlay-header .switcher-container"),g=new OO.ui.ButtonWidget({icon:"articleCheck",framed:!1}).$element[0];g.addEventListener("click",o),l.before(g)}),mw.hook("wikipage.content").add(l=>{if(l[0]?.classList.contains("preview")&&p){let m=document.querySelector(".summary-input textarea");d(m)}})):(mw.util.addCSS(`
#article-cleaner {
    display: none;
}

#content:has(#wpTextbox1) #article-cleaner {
    display: unset;
}`),mw.util.addPortletLink(mw.config.get("skin")==="minerva"?"p-navigation":"p-cactions","#","Perform article cleanup","article-cleaner").addEventListener("click",o),mw.hook("ve.saveDialog.stateChanged").add(()=>{if(p){let m=document.querySelector(".ve-ui-mwSaveDialog-summary textarea");d(m)}}))})})();function x(e){return e.replaceAll(/[$()*+.?[\\\]^{|}]/g,"\\$&")}function v(e){let p=/[\u0000-\u0009\u000B\u000C\u000E-\u001F\u007F\u00AD\u200B-\u200F\u202A-\u202E\u2060\u2063\uFEFF]/g;return p.test(e)&&(e=e.replaceAll(p,"")),e}function P(e){let p={"See also":["also see"],References:["reference","source","sources","citation","citations"],"Further reading":["further reading"],"External links":["external link","weblink","weblinks"]},f=["and","birth","career","death","education","life","of","or"],d=Object.fromEntries(Object.entries(p).flatMap(([t,n])=>[[t.toLowerCase(),t],...n.map(s=>[s,t])])),l=[...e.matchAll(/(?<=^|\n)\n*(?<startMarkup>=+) *(?<name>.*?) *(?<endMarkup>=+)(\n+|$)/g)].map(t=>{let{name:n}=t.groups,{startMarkup:s,endMarkup:c}=t.groups;n=n.replaceAll(/'{3}/g,"");let A=n.matchAll(/\[\[(.+?)]]/g).toArray();for(let a of A)n=n.replace(a[0],a[1].split("|").at(-1));let u=Math.max(s.length,c.length,2);return{name:n,depth:u,original:t[0]}}),m=new Set(l.map(t=>t.name)),g=l.length>0&&/^\n*=+ | =+\n+$/.test(l[0].original)?" ":"";for(let t of l){let n=t.name.toLowerCase(),c=n in d&&!m.has(d[n])?d[n]:t.name;for(let u of f)c=c.replaceAll(new RegExp(`\\b${u}\\b`,"gi"),u);c=c.charAt(0).toUpperCase()+c.slice(1);let A=`${"=".repeat(t.depth)}${g}${c}${g}${"=".repeat(t.depth)}`;t.original!==A&&(e=e.replace(t.original,`

${A}
`))}return e}function M(e){return e.replaceAll(/__(INDEX|NOINDEX|NEWSECTIONLINK|NONEWSECTIONLINK|NOEDITSECTION|DISAMBIG|STATICREDIRECT|FORCETOC)__\n*/g,"")}function _(e){let f=[...e.matchAll(/{{(displaytitle|defaultsort)[:|](.*?)}}/gi)].map(o=>{let[l,m,g]=o;return{type:m.toUpperCase(),value:g,original:l}}),d=mw.Title.newFromText(mw.config.get("wgPageName"));for(let o of f){let l=new RegExp(`${x(o.original)}
*`,"g"),m=mw.Title.newFromText(o.value);if(!m)continue;let g=mw.Title.makeTitle(d.getNamespaceId(),m.getMainText());if(!g)continue;let t=o.type==="DISPLAYTITLE"?d.toText():d.getMainText(),n=o.type==="DISPLAYTITLE"?g.toText():g.getMainText();if(t===n){e=e.replace(l,"");continue}let s=`{{${o.type}:${n}}}
`;e=e.replace(l,s)}return e}function O(e){return e.replaceAll(/(\[\[|}}):?category:(.*?)(]]|}})/gi,`[[${mw.config.get("wgCanonicalNamespace")==="Draft"?":":""}Category:$2]]`)}function D(e,p){let f=[],d=[],o=!1,l=!1,m=0;function g(s,c=!0){let A=e.slice(m,m+s.length)===s;return A&&c&&(m+=s.length),A}for(;m<e.length;)if(g("<nowiki>"))o=!0;else if(g("</nowiki>"))o=!1;else if(g("<!--"))l=!0;else if(g("-->"))l=!1;else if(!o&&!l)if(g("[["))d.push({start:m-2,end:-1,isNested:d.length>0});else if(g("]]")){let s=d.pop();if(!s)continue;s.end=m,f.push(s)}else m++;else m++;let t=[],n=Object.values(mw.config.get("wgFormattedNamespaces"));for(let s of f){let c=e.slice(s.start+2,s.end-2),[A,...u]=c.split("|");e=e.slice(0,s.start+2)+"\0".repeat(A.length)+e.slice(s.start+2+A.length);let a=A.replaceAll("_"," ").trim(),i=u.join("|");i=i===" "?" ":i.trim();let h=a.startsWith(":");h&&(a=a.slice(1));let b=!1,r=a.charAt(0).toUpperCase()+a.slice(1),E=a.charAt(0).toLowerCase()+a.slice(1),T=a.split(":")[0];T=T.charAt(0).toUpperCase()+T.slice(1),a.includes(":")&&(r.startsWith("Image:")&&(a=`${a.startsWith("Image:")?"F":"f"}ile:${a.slice(6)}`),h&&(["Image","File","Category"].includes(r.split(":")[0])||!n.includes(T))&&(b=!0));let w="",L="",k=/^('{2,})(.*?)\1$/.exec(i);if(k&&!k[2].includes("''")&&(w=k[1],i=k[2].trim(),L=k[1]),/[!,.:;?]$/.test(i)&&!["Image","File","Category"].includes(r.split(":")[0])){let S=i.slice(-1);a.endsWith(S)||(L+=S,i=i.slice(0,-1))}a===i?i="":new RegExp(`^${x(a)}[a-z]+$`).test(i)&&(L=i.slice(a.length)+L,i="");for(let S of[r,E])S===i?(a=S,i=""):new RegExp(`^${x(S)}[a-z]+$`).test(i)&&(a=S,L=i.slice(S.length)+L,i="");(i&&a.includes(":")&&n.includes(T)||a.startsWith("file:")||a.startsWith("category:"))&&(a=a.charAt(0).toUpperCase()+a.slice(1)),a=`${b?":":""}${a}`,a=a.padStart(A.length,"\0");let I=`${w}[[${a}${i?`|${i}`:""}]]${L}`;t.push([s,I])}for(let s of p)e=s(e,1);for(let s=0;s<2;s++)for(let[c,A]of t)s===0&&c.isNested||s===1&&!c.isNested||(e=e.slice(0,c.start)+A.padEnd(c.end-c.start,"\0")+e.slice(c.end));for(let s of p)e=s(e,2);return e.replaceAll("\0","")}function F(e,p){return p===1?(e=e.replaceAll(/[“”„‟]/g,'"'),e=e.replaceAll(/[‘’‚‛]/g,"'"),e=e.replaceAll("\u2026","\x7F"),e=e.replaceAll("\xA0","\x9F")):(e=e.replaceAll("\x7F","..."),e=e.replaceAll("\x9F","&nbsp;")),e}function H(e,p){return p===1&&(e=e.replaceAll(/(\(\d{3,4}) ?[‒–−-] ?(\d{3,4}\))/g,(f,d,o)=>`${d}\u2013${o}`.padEnd(f.length,"\0"))),e}function U(e){let p=[/'+(Bold|Italic)( text)?'+ */g,/(<big>)+Big( text)?(<\/big>)+ */g,/(<small>)+Small( text)?(<\/small>)+ */g,/(<sup>)+Superscript( text)?(<\/sup>)+ */g,/(<sub>)+Subscript( text)?(<\/sub>)+ */g,/(<s>)+Strikethrough(<\/s>)+ */g,/(<u>)+Underline(<\/u>)+ */g,/(<code>)+Computer code(<\/code>)+ */g,/(<nowiki>)+Insert non-formatted text here(<\/nowiki>)+ */g,/=+ Heading text =+ */g,/\* Bulleted list item */g,/# Numbered list item */g,/<gallery>\nExample.jpg\|Caption1\nExample.jpg\|Caption2\n<\/gallery> */g,/#REDIRECT \[\[Target page name]] */g,/<!-- Invisible comment --> */g,/<\s*(big|small|sup|sub|s|u|code|nowiki|noinclude|onlyinclude|includeonly|center|blockquote|gallery)\s*(\s+[^<>]*)?>\s*<\s*\/\s*\1\s*>/gi];for(let f of p)for(;f.test(e);)e=e.replace(f,"");return e}function R(e,p=!1){let d=["poem","pre","references","templatedata"],o=[];e=e.replaceAll(new RegExp(`(<(${d.join("|")})(?: [^<>]*?)?>)(.*?)(</\\2>)`,"gs"),(l,m,g,t,n)=>(t=t.replaceAll(/ +$/gm,"").trim(),o.push(`${m}
${t}
${n}`),"\u{F0000}")),e=e.replaceAll(/(\b|\p{Punctuation}|\]\]|\}\}|\w>) {2,}(\b|\p{Punctuation}|\[\[|\{\{|<\w)/gu,"$1 $2"),p||(e=e.replaceAll(/^ +| +$/gm,"")),e=e.replaceAll(/\n{3,}/g,`

`),e=e.replace(/\s*({{[^}]*stub}})/i,`

$1`),e=e.replaceAll(/\s+$/g,""),e=e.replaceAll(/^([#*]+) */gm,"$1 "),e=e.replaceAll(/^([#*]+ .*)\n+(?=[#*]+ )/gm,`$1
`),p||(e=e.replaceAll(/(?<!\|)\s+(?=<ref(?!erences))/g,"")),e=e.replaceAll(/<\/([A-Za-z]+) +>/g,"</$1>"),e=e.replaceAll(/^(=+.*?=+)$\n{2,}(?=^=+.*?=+$)/gm,`$1
`),e=e.trim();for(let l of o)e=e.replace("\u{F0000}",l);return e}function G(e){e=e.replaceAll(/((?:<ref(?!erences)[^/]*?>.*?<\/ref>|<ref(?!erences).*?\/>)+)([!,.;?])?/g,(n,s,c)=>(c??"")+s);let p=[],f=!1,d=!1,o=0;function l(n){let s=e.slice(o,o+n.length)===n;return s&&(o+=n.length),s}function m(n){for(;o<e.length&&!l(n);)o++}for(;o<e.length;)if(l("<nowiki>"))f=!0;else if(l("</nowiki>"))f=!1;else if(l("<!--"))d=!0;else if(l("-->"))d=!1;else if(!f&&!d)if(!l("<references")&&l("<ref")){let n=o-4;m(">");let s=e.slice(n,o-1).trim().endsWith("/");p.push(s?{start:n,end:o,isSelfClosing:s}:{start:n,end:-1})}else l("</ref>")?p.at(-1).end=o:o++;else o++;let g=new DOMParser,t=[];for(let n of p){let s=e.slice(n.start,n.end),c=/<ref(?!erences).*?>/is.exec(s)[0],u=g.parseFromString(n.isSelfClosing?c.replace(/ *\/ *>/," />"):c+"</ref>","text/html").body.firstChild.outerHTML.replaceAll("&amp;","&"),a=s.slice(c.length,-6).trim().replaceAll(/^\[ *([^ \]]*) *]$/gm,"$1").trim();u=n.isSelfClosing||a.length===0?u.replace(/>\s*<\/ref>/," />"):`${u.slice(0,-6)}${a}</ref>`,s!==u&&t.push([s,u])}for(let[n,s]of t)e=e.replace(n,s);return e}var y;async function W(e){let p;(b=>(b[b.Expanded=0]="Expanded",b[b.ExpandedAligned=1]="ExpandedAligned",b[b.Minimized=2]="Minimized",b[b.MinimizedSpaced=3]="MinimizedSpaced"))(p||={});let f;(h=>(h[h.User=2]="User",h[h.Template=10]="Template",h[h.Draft=118]="Draft"))(f||={}),y??=JSON.parse(await C("User:Eejit43/scripts/article-cleaner.json")??"[]");let d=Object.fromEntries(y.flatMap(u=>u.from.map(a=>[a.charAt(0).toLowerCase()+a.slice(1),u.to])));class o{location;isNested=!1;fullText;fullTextEscaped;rawName;name;parameters=[];subTemplates=[];PLACEHOLDER_STRINGS=["\u{F0000}","\u{10FFFF}","\u{FFFFE}"];PIPE_ESCAPE_REGEXES=[/(\[\[[^\]]*?)\|(.*?]])/g,/(<!--.*?)\|(.*?-->)/g,/(<nowiki>.*?)\|(.*?<\/nowiki>)/g];TAG_EQUALS_ESCAPE_REGEXES=[/<(\w+)( [^<>]+?)(?<!\/)>.*?<\/\1>/g,/<(\w+)( [^<>]+?)\/>/g];TEMPLATE_ALIASES=d;DEFAULT_TEMPLATE_STYLES={1:["album rating","album reviews","american football uniform","australian rules football kit","automatic taxobox","baseball uniform","basketball kit","beachhandball kit","blockquote","chembox","cricket uniform","election box","emblem table","episode list","external music video","extra album cover","field hockey kit","football box","football kit","footballbox","gallery","handball kit","hybridbox","icehockey kit","ichnobox","infobox","infraspeciesbox","judo bracket","judo repechage","listen","location map","medical resources","motorsport season","multiple image","music ratings","mycomorphbox","navbox","oobox","orbitbox","osm location map","quote box","repechage","rugbybox","sidebar","single ratings","singles","song ratings","speciesbox","starbox","subject bar","succession box","taxobox","team bracket","track listing","tweet","virusbox","volleyball kit","weather box","nteambracket","2nteam-nteambracket","2teambracket","3teambracket","3teamrr","4teambracket","4teamrr","5teambracket","5teamrr","6teambracket","6teamrr","7teambracket","7teamrr","8teambracket","8teamroundrobin","8teamrr","9teambracket","10teambracket","11teambracket","12teambracket","13teambracket","14teambracket","15teambracket","16teambracket","18teambracket","20teambracket","24teambracket","27teambracket","32teambracket","40teambracket","48teambracket","64teambracket","128teambracket"],2:["birth date","coord","death date","end date","lang","start date"],3:["infobox mapframe"]};NAMESPACE_SPECIFIC_TEMPLATES={118:["afc comment","afc submission","afc submission/draft","afc topic","draft article","draft categories","draft topics","draft","drafts moved from mainspace","preloaddraft submit"],2:["dashboard.wikiedu.org sandbox","user sandbox","userspace draft"]};TEMPLATES_TO_KEEP_CONTENT=["draft categories"];TEMPLATES_TO_SUBST=["articlepagename","articlespace","basepagename","fullpagename","namespace","namespacenumber","pagename","rootpagename","subjectpagename","subjectspace","subpagename","talkpagename","talkspace","pagenamebase"];IMAGE_PARAMETERS=new Set(["cover","image_flag","image_seal","image_skyline","image","logo","map_image"]);IGNORED_IMAGE_SYNTAX=new Set(["thumb","thumbnail","frame","framed","frameless","border","right","left","center","none","baseline","middle","sub","super","text-top","text-bottom","top","bottom"]);constructor(a){this.location={start:a};for(let i=1;i<=10;i++)this.IMAGE_PARAMETERS.add(`image${i}`)}parse(){this.fullText=e.slice(this.location.start,this.location.end),this.fullTextEscaped=this.fullText;for(let r of this.subTemplates)r.parse(),this.fullTextEscaped=this.fullTextEscaped.replace(r.fullText,this.PLACEHOLDER_STRINGS[0]);let a=this.fullTextEscaped.slice(2,-2).trim();for(let r of this.PIPE_ESCAPE_REGEXES)for(;r.test(a);)a=a.replaceAll(r,`$1${this.PLACEHOLDER_STRINGS[1]}$2`);for(let r of this.TAG_EQUALS_ESCAPE_REGEXES)a=a.replaceAll(r,(E,T,w)=>E.replace(w,w.replaceAll("=",this.PLACEHOLDER_STRINGS[2])));let i=a.split("|").map(r=>r.replaceAll(this.PLACEHOLDER_STRINGS[1],"|").trim());this.rawName=i.shift(),this.name=this.rawName.replaceAll("_"," "),this.name.toLowerCase().startsWith("template:")&&(this.name=this.name.slice(9));let h=this.name.charAt(0).toLowerCase()+this.name.slice(1);if(h in this.TEMPLATE_ALIASES){let r=this.name.startsWith(this.name.charAt(0).toLowerCase()),E=this.TEMPLATE_ALIASES[h],T=E.startsWith(E.slice(0,2).toUpperCase())&&/^[A-Z]+$/.exec(E.slice(0,2));this.name=r&&!T?E.charAt(0).toLowerCase()+E.slice(1):E}let b=i.map(r=>{let E=r.indexOf("=");if(E===-1)return{key:null,value:r.replaceAll(this.PLACEHOLDER_STRINGS[2],"=").trim()};let T=r.slice(E+1).replaceAll(this.PLACEHOLDER_STRINGS[2],"=");return{key:r.slice(0,E).trim(),value:`${T.startsWith(`
`)?`
`:""}${T.trim()}`}});this.parameters=b}shouldBeRemoved(){for(let[a,i]of Object.entries(this.NAMESPACE_SPECIFIC_TEMPLATES))if(mw.config.get("wgNamespaceNumber")!==Number.parseInt(a)&&i.includes(this.name.toLowerCase()))return!0;return!1}getStyle(){let a=0,i;for(let[h,b]of Object.entries(this.DEFAULT_TEMPLATE_STYLES))for(let r of b)this.name.toLowerCase().startsWith(r)&&r.length>=a&&(a=r.length,i=Number.parseInt(h));return i}cleanupParameters(){this.parameters=this.parameters.map(({key:a,value:i})=>{if(a&&this.IMAGE_PARAMETERS.has(a)){i=i.trim();let h=i;i.startsWith("[[")&&i.endsWith("]]")&&(i=i.slice(2,-2).split("|")[0].trim()),i=i.replace(/^(File|Image):/,"").replaceAll("_"," ");let b=h.slice(2,-2).split("|").slice(1).map(r=>r.trim()).filter(r=>!this.IGNORED_IMAGE_SYNTAX.has(r)).join("|");b.length>0&&(i+=` <!-- Previous additional data: "${b}" -->`)}return{key:a,value:i}})}format(){if(this.fullText||this.parse(),this.shouldBeRemoved())return this.TEMPLATES_TO_KEEP_CONTENT.includes(this.name.toLowerCase())?this.parameters[0].value:"";let a=mw.config.get("wgNamespaceNumber")!==10&&this.TEMPLATES_TO_SUBST.some(r=>r===this.name.toLowerCase()||this.name.toLowerCase().startsWith(`${r}:`)),i=this.getStyle();if(i===void 0){let r=this.name;this.name.toLowerCase().startsWith("template:")&&(r=this.name.slice(9)),a&&(r=`subst:${r}`),r!==this.rawName&&(this.fullTextEscaped=this.fullTextEscaped.replace(this.rawName,r));for(let E of this.subTemplates)this.fullTextEscaped=this.fullTextEscaped.replace(this.PLACEHOLDER_STRINGS[0],E.format());return this.fullTextEscaped}let h=[`{{${a?"subst:":""}${this.name}`];if(this.cleanupParameters(),i===0||i===1){let r=0;i===1&&(r=Math.max(...this.parameters.map(E=>E.key?.length??0)));for(let[E,T]of this.parameters.entries())!T.key&&!T.value&&this.parameters.slice(E+1).every(w=>w.key??!w.value)||h.push(`| ${T.key?`${T.key.padEnd(r)} = `:""}${T.value}`)}else for(let[r,E]of this.parameters.entries())!E.value&&(E.key||this.parameters.slice(r+1).every(T=>T.key??!T.value))||h.push(`|${E.key?`${E.key}=`:""}${E.value}`);h.push("}}"),h.length===2?(h[0]+="}}",h.pop()):i===3&&(h[h.length-2]+="}}",h.pop());let b=h.join(i===0||i===1?`
`:i===3?" ":"");for(let r of this.subTemplates)b=b.replace(this.PLACEHOLDER_STRINGS[0],r.format());return b}}let l=[],m=[],g=!1,t=!1,n=!1,s=0;function c(u){let a=e.slice(s,s+u.length)===u;return a&&(s+=u.length),a}for(;s<e.length;)if(c("<nowiki>"))t=!0;else if(c("</nowiki>"))t=!1;else if(c("<!--"))n=!0;else if(c("-->"))n=!1;else if(!t&&!n)if(c("[["))g=!0;else if(g&&c("]]"))g=!1;else if(c("{{")){let u=new o(s-2);m.length>0&&(u.isNested=!0,m.at(-1)?.subTemplates.push(u)),m.push(u)}else if(c("}}")){let u=m.pop();if(!u)continue;u.location.end=s,l.push(u)}else s++;else s++;let A=e;for(let u of l)u.isNested||(u.parse(),A=A.replace(u.fullText,u.format()));return A}function j(e){if(mw.config.get("wgNamespaceNumber")!==0)return e;let p=["Do not remove this line","EDIT BELOW THIS LINE","Important, do not remove anything above this line before article has been created","Important, do not remove this line before article has been created","Inline citations added to your article will automatically display here","Note: The following pages were redirects to "];for(let f of p)e=e.replaceAll(new RegExp(` *<!-- ?${x(f)}.*?--> *
?`,"gs"),"");return e}function B(e){let p=mw.config.get("wgNamespaceNumber")!==0,f=!!new URLSearchParams(window.location.search).get("section"),d=mw.config.get("wgCategories").includes("All disambiguation pages"),o=mw.config.get("wgIsRedirect");if(p||f||d||o)return e;let l=[...e.matchAll(/\[\[Category:/g)].length;return e=e.replaceAll(/\n*{{(uncategorized|improve categories)(\|.+?)?}}({{|\n+|$)/gi,""),l===0&&!/{{uncategorized/i.test(e)?e+=`

{{Uncategorized|date={{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}}}`:l===1&&!/{{improve categories/i.test(e)&&(e+=`

{{Improve categories|date={{subst:CURRENTMONTHNAME}} {{subst:CURRENTYEAR}}}}`),e}})();

// </pre>
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vdXRpbGl0eS50cyIsICIuLi9zY3JpcHRzL2FydGljbGUtY2xlYW5lci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHR5cGUgeyBBcGlRdWVyeUFsbE1lc3NhZ2VzUGFyYW1zLCBBcGlRdWVyeVJldmlzaW9uc1BhcmFtcyB9IGZyb20gJ3R5cGVzLW1lZGlhd2lraS1hcGknO1xuaW1wb3J0IHR5cGUgeyBBbGxNZXNzYWdlc1Jlc3VsdCwgUGFnZVJldmlzaW9uc1Jlc3VsdCB9IGZyb20gJy4vZ2xvYmFsLXR5cGVzJztcblxuZXhwb3J0IGNvbnN0IGFwaSA9IG5ldyBtdy5BcGkoKTtcblxuLyoqXG4gKiBGZXRjaGVzIHRoZSBjb250ZW50IG9mIGEgZ2l2ZW4gcGFnZS5cbiAqIEBwYXJhbSB0aXRsZSBUaGUgdGl0bGUgdG8gZmV0Y2guXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRQYWdlQ29udGVudCh0aXRsZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgZm9ybWF0dmVyc2lvbjogJzInLFxuICAgICAgICAgICAgcHJvcDogJ3JldmlzaW9ucycsXG4gICAgICAgICAgICBydnByb3A6ICdjb250ZW50JyxcbiAgICAgICAgICAgIHJ2c2xvdHM6ICdtYWluJyxcbiAgICAgICAgICAgIHRpdGxlczogdGl0bGUsXG4gICAgICAgIH0gc2F0aXNmaWVzIEFwaVF1ZXJ5UmV2aXNpb25zUGFyYW1zKSkgYXMgUGFnZVJldmlzaW9uc1Jlc3VsdFxuICAgICkucXVlcnkucGFnZXNbMF0ucmV2aXNpb25zPy5bMF0uc2xvdHMubWFpbi5jb250ZW50LnRyaW0oKTtcbn1cblxuLyoqXG4gKiBHZXRzIGEgc3lzdGVtIG1lc3NhZ2UuXG4gKiBAcGFyYW0gbWVzc2FnZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5c3RlbSBtZXNzYWdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U3lzdGVtTWVzc2FnZShtZXNzYWdlTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICAgKGF3YWl0IGFwaS5nZXQoe1xuICAgICAgICAgICAgYWN0aW9uOiAncXVlcnknLFxuICAgICAgICAgICAgbWV0YTogJ2FsbG1lc3NhZ2VzJyxcbiAgICAgICAgICAgIGFtbWVzc2FnZXM6IG1lc3NhZ2VOYW1lLFxuICAgICAgICAgICAgYW1sYW5nOiBtdy5jb25maWcuZ2V0KCd3Z0NvbnRlbnRMYW5ndWFnZScpLFxuICAgICAgICB9IHNhdGlzZmllcyBBcGlRdWVyeUFsbE1lc3NhZ2VzUGFyYW1zKSkgYXMgQWxsTWVzc2FnZXNSZXN1bHRcbiAgICApLnF1ZXJ5Py5hbGxtZXNzYWdlc1swXS5jb250ZW50O1xufVxuXG4vKipcbiAqIEludGVycG9sYXRlcyBhIHN5c3RlbSBtZXNzYWdlIHdpdGggdmFsdWVzLlxuICogQHBhcmFtIG1lc3NhZ2UgVGhlIHN5c3RlbSBtZXNzYWdlIHRvIGludGVycG9sYXRlLlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIHRvIGludGVycG9sYXRlIGludG8gdGhlIG1lc3NhZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnBvbGF0ZVN5c3RlbU1lc3NhZ2UobWVzc2FnZTogc3RyaW5nLCB2YWx1ZXM6IHN0cmluZ1tdKSB7XG4gICAgbGV0IHJlc3VsdCA9IG1lc3NhZ2U7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgdmFsdWVdIG9mIHZhbHVlcy5lbnRyaWVzKCkpIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlQWxsKGAkJHtpbmRleCArIDF9YCwgdmFsdWUpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cbiIsICJpbXBvcnQgeyBnZXRQYWdlQ29udGVudCB9IGZyb20gJ0AvdXRpbGl0eSc7XG5cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4dHJhbmVvdXMtY2xhc3NcbiAgICBjbGFzcyBWZVJhbmdlIHtcbiAgICAgICAgY29uc3RydWN0b3Ioc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpO1xuICAgIH1cblxuICAgIGNsYXNzIFZlRnJhZ21lbnQge1xuICAgICAgICBpbnNlcnRDb250ZW50KGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG4gICAgfVxuXG4gICAgY2xhc3MgVmVTdXJmYWNlTW9kZWwge1xuICAgICAgICBnZXRMaW5lYXJGcmFnbWVudChyYW5nZTogVmVSYW5nZSk6IFZlRnJhZ21lbnQ7XG4gICAgICAgIGdldFJhbmdlRnJvbVNvdXJjZU9mZnNldHMoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIpOiBWZVJhbmdlO1xuICAgICAgICBzZXRTZWxlY3Rpb24oc2VsZWN0aW9uOiBWZUxpbmVhclNlbGVjdGlvbik6IHZvaWQ7XG4gICAgfVxuXG4gICAgY2xhc3MgVmVUYXJnZXQge1xuICAgICAgICBnZXRTdXJmYWNlKCk6IHsgZ2V0TW9kZWwoKTogVmVTdXJmYWNlTW9kZWwgfTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4dHJhbmVvdXMtY2xhc3NcbiAgICBjbGFzcyBWZUxpbmVhclNlbGVjdGlvbiB7XG4gICAgICAgIGNvbnN0cnVjdG9yKHJhbmdlOiBWZVJhbmdlKTtcbiAgICB9XG5cbiAgICBjb25zdCB2ZToge1xuICAgICAgICBSYW5nZTogdHlwZW9mIFZlUmFuZ2U7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgICAgIGRtOiB7IExpbmVhclNlbGVjdGlvbjogdHlwZW9mIFZlTGluZWFyU2VsZWN0aW9uIH07IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgICAgIGluaXQ/OiB7IHRhcmdldDogVmVUYXJnZXQgfTtcbiAgICB9O1xufVxuXG4oKCkgPT4ge1xuICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpIDwgMCkgcmV0dXJuOyAvLyBEb24ndCBydW4gaW4gdmlydHVhbCBuYW1lc3BhY2VzXG4gICAgaWYgKCFtdy5jb25maWcuZ2V0KCd3Z0lzUHJvYmFibHlFZGl0YWJsZScpKSByZXR1cm47IC8vIERvbid0IHJ1biBpZiB1c2VyIGNhbid0IGVkaXQgcGFnZVxuXG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gWydtZWRpYXdpa2kudXRpbCcsICdqcXVlcnkudGV4dFNlbGVjdGlvbiddO1xuXG4gICAgaWYgKG13LmNvbmZpZy5nZXQoJ3NraW4nKSAhPT0gJ21pbmVydmEnKSBkZXBlbmRlbmNpZXMucHVzaCgnbW9iaWxlLmVkaXRvci5vdmVybGF5Jyk7XG5cbiAgICBtdy5sb2FkZXIudXNpbmcoZGVwZW5kZW5jaWVzLCAoKSA9PiB7XG4gICAgICAgIGxldCBzaG91bGRBZGRTY3JpcHRNZXNzYWdlID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgU0NSSVBUX01FU1NBR0UgPSAnQ2xlYW5lZCB1cCBhcnRpY2xlIGNvbnRlbnQgKHZpYSBbW1VzZXI6RWVqaXQ0My9zY3JpcHRzL2FydGljbGUtY2xlYW5lcnxhcnRpY2xlLWNsZWFuZXJdXSknO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdW1tYXJ5IHRleHRhcmVhIHdpdGggdGhlIHNjcmlwdCBtZXNzYWdlIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuXG4gICAgICAgICAqIEBwYXJhbSB0ZXh0YXJlYSBUaGUgc3VtbWFyeSB0ZXh0YXJlYSBlbGVtZW50IHRvIHVwZGF0ZS5cbiAgICAgICAgICovXG4gICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVN1bW1hcnkodGV4dGFyZWE6IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBBZGQgdGltZW91dCBiZWZvcmUgc2V0dGluZyB0ZXh0YXJlYSB2YWx1ZSBhcyB0aGlzIGlzIG92ZXJ3cml0dGVuIHNvbWV0aW1lcyBmb3Igc29tZSByZWFzb25cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGV4dGFyZWEudmFsdWUuaW5jbHVkZXMoU0NSSVBUX01FU1NBR0Uuc2xpY2UoMSkpKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0YXJlYS52YWx1ZSArPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWEudmFsdWUgJiYgIXRleHRhcmVhLnZhbHVlLnN0YXJ0c1dpdGgoJy8qICcpICYmICF0ZXh0YXJlYS52YWx1ZS5lbmRzV2l0aCgnICovICcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgOyAke1NDUklQVF9NRVNTQUdFLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgU0NSSVBUX01FU1NBR0Uuc2xpY2UoMSl9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU0NSSVBUX01FU1NBR0U7XG4gICAgICAgICAgICB9LCAwKTtcblxuICAgICAgICAgICAgc2hvdWxkQWRkU2NyaXB0TWVzc2FnZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIEhhbmRsZXMgdGhlIGNsaWNrIGV2ZW50IGZvciB0aGUgYWN0aXZhdGlvbiBidXR0b24uXG4gICAgICAgICAqIEBwYXJhbSBldmVudCBUaGUgbW91c2UgZXZlbnQgdGhhdCB0cmlnZ2VyZWQgdGhlIGNsaWNrLlxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZnVuY3Rpb24gaGFuZGxlQWN0aXZhdGlvbihldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgY29uc3QgZWRpdG9yID0gJChtdy5jb25maWcuZ2V0KCdza2luJykgPT09ICdtaW5lcnZhJyA/ICcjd2lraXRleHQtZWRpdG9yJyA6ICcjd3BUZXh0Ym94MScpO1xuICAgICAgICAgICAgaWYgKGVkaXRvci5sZW5ndGggPT09IDApIHJldHVybiBtdy5ub3RpZnkoJ0VkaXQgYm94IG5vdCBmb3VuZCEnLCB7IHR5cGU6ICdlcnJvcicsIGF1dG9IaWRlU2Vjb25kczogJ3Nob3J0JyB9KTtcblxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gZWRpdG9yLnRleHRTZWxlY3Rpb24oJ2dldENvbnRlbnRzJyk7XG5cbiAgICAgICAgICAgIGxldCBmaW5hbFRleHQgPSBvcmlnaW5hbFRleHQ7XG5cbiAgICAgICAgICAgIGZpbmFsVGV4dCA9IGNsZWFudXBTdHJheVVuaWNvZGVDaGFyYWN0ZXJzKGZpbmFsVGV4dCk7XG4gICAgICAgICAgICBmaW5hbFRleHQgPSBjbGVhbnVwU2VjdGlvbkhlYWRlcnMoZmluYWxUZXh0KTtcbiAgICAgICAgICAgIGZpbmFsVGV4dCA9IGNsZWFudXBNYWdpY1dvcmRzKGZpbmFsVGV4dCk7XG4gICAgICAgICAgICBmaW5hbFRleHQgPSBjbGVhbnVwRGlzcGxheXRpdGxlc0FuZERlZmF1bHRzb3J0cyhmaW5hbFRleHQpO1xuICAgICAgICAgICAgZmluYWxUZXh0ID0gY2xlYW51cENhdGVnb3JpZXMoZmluYWxUZXh0KTtcbiAgICAgICAgICAgIGZpbmFsVGV4dCA9IGNsZWFudXBMaW5rcyhmaW5hbFRleHQsIFtjbGVhbnVwSW1wcm9wZXJDaGFyYWN0ZXJzLCBjbGVhbnVwWWVhclJhbmdlc10pO1xuICAgICAgICAgICAgZmluYWxUZXh0ID0gY2xlYW51cFN0cmF5TWFya3VwKGZpbmFsVGV4dCk7XG4gICAgICAgICAgICBmaW5hbFRleHQgPSBjbGVhbnVwU3BhY2luZyhmaW5hbFRleHQpO1xuICAgICAgICAgICAgZmluYWxUZXh0ID0gY2xlYW51cFJlZmVyZW5jZXMoZmluYWxUZXh0KTtcbiAgICAgICAgICAgIGZpbmFsVGV4dCA9IGF3YWl0IGZvcm1hdFRlbXBsYXRlcyhmaW5hbFRleHQpO1xuICAgICAgICAgICAgZmluYWxUZXh0ID0gcmVtb3ZlQ29tbWVudHMoZmluYWxUZXh0KTtcbiAgICAgICAgICAgIGZpbmFsVGV4dCA9IGNsZWFudXBTcGFjaW5nKGZpbmFsVGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICBmaW5hbFRleHQgPSBhdXRvVGFnUGFnZShmaW5hbFRleHQpO1xuXG4gICAgICAgICAgICBpZiAob3JpZ2luYWxUZXh0ID09PSBmaW5hbFRleHQpIG13Lm5vdGlmeSgnTm8gY2hhbmdlcyB0byBiZSBtYWRlIHRvIHRoZSBhcnRpY2xlIScsIHsgdHlwZTogJ3dhcm4nLCBhdXRvSGlkZVNlY29uZHM6ICdzaG9ydCcgfSk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodmUuaW5pdCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXJmYWNlTW9kZWwgPSB2ZS5pbml0LnRhcmdldC5nZXRTdXJmYWNlKCkuZ2V0TW9kZWwoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBzdXJmYWNlTW9kZWwuZ2V0TGluZWFyRnJhZ21lbnQoc3VyZmFjZU1vZGVsLmdldFJhbmdlRnJvbVNvdXJjZU9mZnNldHMoMCwgb3JpZ2luYWxUZXh0Lmxlbmd0aCkpO1xuICAgICAgICAgICAgICAgICAgICBmcmFnbWVudC5pbnNlcnRDb250ZW50KGZpbmFsVGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIHN1cmZhY2VNb2RlbC5zZXRTZWxlY3Rpb24obmV3IHZlLmRtLkxpbmVhclNlbGVjdGlvbihuZXcgdmUuUmFuZ2UoMCwgMCkpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBlZGl0b3IudGV4dFNlbGVjdGlvbignc2V0Q29udGVudHMnLCBmaW5hbFRleHQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGVkaXRvci50ZXh0U2VsZWN0aW9uKCdzZXRTZWxlY3Rpb24nLCB7IHN0YXJ0OiAwIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIG13Lm5vdGlmeSgnQXJ0aWNsZSBjbGVhbnVwIGNvbXBsZXRlIScsIHsgdHlwZTogJ3N1Y2Nlc3MnLCBhdXRvSGlkZVNlY29uZHM6ICdzaG9ydCcgfSk7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5SW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcjd3BTdW1tYXJ5Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeUlucHV0KSB1cGRhdGVTdW1tYXJ5KHN1bW1hcnlJbnB1dCk7XG4gICAgICAgICAgICAgICAgZWxzZSBzaG91bGRBZGRTY3JpcHRNZXNzYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtdy5jb25maWcuZ2V0KCdza2luJykgPT09ICdtaW5lcnZhJykge1xuICAgICAgICAgICAgLy8gU2V0IHVwIGhvb2sgdG8gYWRkIGJ1dHRvbiB0byBlZGl0aW5nIHRvb2xiYXJcbiAgICAgICAgICAgIG13Lmhvb2soJ21vYmlsZUZyb250ZW5kLmVkaXRvck9wZW5lZCcpLmFkZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGVhZGVyU3dpdGNoZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxEaXZFbGVtZW50PignLm92ZXJsYXktaGVhZGVyIC5zd2l0Y2hlci1jb250YWluZXInKSE7XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0b29sID0gbmV3IE9PLnVpLkJ1dHRvbldpZGdldCh7IGljb246ICdhcnRpY2xlQ2hlY2snLCBmcmFtZWQ6IGZhbHNlIH0pO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYnV0dG9uID0gdG9vbC4kZWxlbWVudFswXTtcbiAgICAgICAgICAgICAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVBY3RpdmF0aW9uKTtcblxuICAgICAgICAgICAgICAgIGhlYWRlclN3aXRjaGVyLmJlZm9yZShidXR0b24pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFNldCB1cCBob29rIGZvciB1cGRhdGluZyBlZGl0IHN1bW1hcnlcbiAgICAgICAgICAgIG13Lmhvb2soJ3dpa2lwYWdlLmNvbnRlbnQnKS5hZGQoKGNvbnRlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZ25vcmUgaWYgdHJpZ2dlcmVkIGJ5IG1haW4gY29udGVudCBsb2FkIGluc3RlYWQgb2YgcHJldmlld1xuICAgICAgICAgICAgICAgIGlmICghY29udGVudFswXT8uY2xhc3NMaXN0LmNvbnRhaW5zKCdwcmV2aWV3JykpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG5cbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQWRkU2NyaXB0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5SW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQ+KCcuc3VtbWFyeS1pbnB1dCB0ZXh0YXJlYScpITtcblxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdW1tYXJ5KHN1bW1hcnlJbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBTZXQgdXAgbGluayBpbiBzaWRlIG1lbnVcbiAgICAgICAgICAgIG13LnV0aWwuYWRkQ1NTKGBcbiNhcnRpY2xlLWNsZWFuZXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG5cbiNjb250ZW50Omhhcygjd3BUZXh0Ym94MSkgI2FydGljbGUtY2xlYW5lciB7XG4gICAgZGlzcGxheTogdW5zZXQ7XG59YCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBtdy51dGlsLmFkZFBvcnRsZXRMaW5rKFxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3NraW4nKSA9PT0gJ21pbmVydmEnID8gJ3AtbmF2aWdhdGlvbicgOiAncC1jYWN0aW9ucycsXG4gICAgICAgICAgICAgICAgJyMnLFxuICAgICAgICAgICAgICAgICdQZXJmb3JtIGFydGljbGUgY2xlYW51cCcsXG4gICAgICAgICAgICAgICAgJ2FydGljbGUtY2xlYW5lcicsXG4gICAgICAgICAgICApITtcbiAgICAgICAgICAgIGxpbmsuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBoYW5kbGVBY3RpdmF0aW9uKTtcblxuICAgICAgICAgICAgLy8gU2V0IHVwIGhvb2sgZm9yIHVwZGF0aW5nIGVkaXQgc3VtbWFyeSBpbiBWaXN1YWxFZGl0b3JcbiAgICAgICAgICAgIG13Lmhvb2soJ3ZlLnNhdmVEaWFsb2cuc3RhdGVDaGFuZ2VkJykuYWRkKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQWRkU2NyaXB0TWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdW1tYXJ5SW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxUZXh0QXJlYUVsZW1lbnQ+KCcudmUtdWktbXdTYXZlRGlhbG9nLXN1bW1hcnkgdGV4dGFyZWEnKSE7XG5cbiAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3VtbWFyeShzdW1tYXJ5SW5wdXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59KSgpO1xuXG4vKipcbiAqIEVzY2FwZXMgcmVnZXggY2hhcmFjdGVycyBpbiBhIHN0cmluZy5cbiAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBlc2NhcGUgcmVnZXggY2hhcmFjdGVycyBpbi5cbiAqL1xuZnVuY3Rpb24gZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKHN0cmluZzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlQWxsKC9bJCgpKisuP1tcXFxcXFxdXnt8fV0vZywgJ1xcXFwkJicpO1xufVxuXG4vKipcbiAqIENsZWFucyB1cCBzdHJheSBVbmljb2RlIGNoYXJhY3RlcnMgaW4gYW4gYXJ0aWNsZSdzIGNvbnRlbnQuXG4gKiBAcGFyYW0gY29udGVudCBUaGUgYXJ0aWNsZSBjb250ZW50IHRvIGNsZWFuIHVwLlxuICovXG5mdW5jdGlvbiBjbGVhbnVwU3RyYXlVbmljb2RlQ2hhcmFjdGVycyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICAvLyBUaGlzIHJlZ2V4IHJlbW92ZXM6XG4gICAgLy8gICAtIEFTQ0lJIGNvbnRyb2wgY2hhcmFjdGVycyAoXFx1MDAwMC1cXHUwMDA5LCBcXHUwMDBCLVxcdTAwMEMsIFxcdTAwMEUtXFx1MDAxRilcbiAgICAvLyAgIC0gREVMIChcXHUwMDdGKVxuICAgIC8vICAgLSBTb2Z0IGh5cGhlbiAoXFx1MDBBRClcbiAgICAvLyAgIC0gWmVyby13aWR0aCBjaGFyYWN0ZXJzIGFuZCBkaXJlY3Rpb25hbGl0eSBtYXJrcyAoXFx1MjAwQi1cXHUyMDBGKVxuICAgIC8vICAgLSBCaWRpIG92ZXJyaWRlIGFuZCBmb3JtYXR0aW5nIGNoYXJhY3RlcnMgKFxcdTIwMkEtXFx1MjAyRSlcbiAgICAvLyAgIC0gV29yZCBqb2luZXIgYW5kIGludmlzaWJsZSBzZXBhcmF0b3IgKFxcdTIwNjAsIFxcdTIwNjMpXG4gICAgLy8gICAtIEJ5dGUgb3JkZXIgbWFyayAoQk9NKSAoXFx1RkVGRilcbiAgICBjb25zdCBTVFJBWV9VTklDT0RFX1JFR0VYID0gL1tcXHUwMDAwLVxcdTAwMDlcXHUwMDBCXFx1MDAwQ1xcdTAwMEUtXFx1MDAxRlxcdTAwN0ZcXHUwMEFEXFx1MjAwQi1cXHUyMDBGXFx1MjAyQS1cXHUyMDJFXFx1MjA2MFxcdTIwNjNcXHVGRUZGXS9nOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnRyb2wtcmVnZXhcblxuICAgIGlmIChTVFJBWV9VTklDT0RFX1JFR0VYLnRlc3QoY29udGVudCkpIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoU1RSQVlfVU5JQ09ERV9SRUdFWCwgJycpO1xuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbi8qKlxuICogQ2xlYW5zIHVwIHNlY3Rpb24gaGVhZGVycyBpbiBhbiBhcnRpY2xlJ3MgY29udGVudC5cbiAqIEBwYXJhbSBjb250ZW50IFRoZSBhcnRpY2xlIGNvbnRlbnQgdG8gY2xlYW4gdXAuXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBTZWN0aW9uSGVhZGVycyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICBjb25zdCBDT01NT05fUkVQTEFDRU1FTlRTID0ge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cbiAgICAgICAgJ1NlZSBhbHNvJzogWydhbHNvIHNlZSddLFxuICAgICAgICAnUmVmZXJlbmNlcyc6IFsncmVmZXJlbmNlJywgJ3NvdXJjZScsICdzb3VyY2VzJywgJ2NpdGF0aW9uJywgJ2NpdGF0aW9ucyddLFxuICAgICAgICAnRnVydGhlciByZWFkaW5nJzogWydmdXJ0aGVyIHJlYWRpbmcnXSxcbiAgICAgICAgJ0V4dGVybmFsIGxpbmtzJzogWydleHRlcm5hbCBsaW5rJywgJ3dlYmxpbmsnLCAnd2VibGlua3MnXSxcbiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBAdHlwZXNjcmlwdC1lc2xpbnQvbmFtaW5nLWNvbnZlbnRpb24gKi9cbiAgICB9O1xuXG4gICAgY29uc3QgQ09NTU9OX01JU0NBUElUQUxJWkVEX1dPUkRTID0gWydhbmQnLCAnYmlydGgnLCAnY2FyZWVyJywgJ2RlYXRoJywgJ2VkdWNhdGlvbicsICdsaWZlJywgJ29mJywgJ29yJ107XG5cbiAgICBjb25zdCByZXZlcnNlQ29tbW9uUmVwbGFjZW1lbnRzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhDT01NT05fUkVQTEFDRU1FTlRTKS5mbGF0TWFwKChba2V5LCB2YWx1ZXNdKSA9PiBbXG4gICAgICAgICAgICBba2V5LnRvTG93ZXJDYXNlKCksIGtleV0sXG4gICAgICAgICAgICAuLi4odmFsdWVzLm1hcCgodmFsdWUpID0+IFt2YWx1ZSwga2V5XSkgYXMgW3N0cmluZywgc3RyaW5nXVtdKSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgXSksXG4gICAgKTtcblxuICAgIGNvbnN0IGhlYWRlcnMgPSBjb250ZW50Lm1hdGNoQWxsKC8oPzw9XnxcXG4pXFxuKig/PHN0YXJ0TWFya3VwPj0rKSAqKD88bmFtZT4uKj8pICooPzxlbmRNYXJrdXA+PSspKFxcbit8JCkvZyk7XG5cbiAgICBjb25zdCBwYXJzZWRIZWFkZXJzID0gWy4uLmhlYWRlcnNdLm1hcCgoaGVhZGVyKSA9PiB7XG4gICAgICAgIGxldCB7IG5hbWUgfSA9IGhlYWRlci5ncm91cHMhO1xuICAgICAgICBjb25zdCB7IHN0YXJ0TWFya3VwLCBlbmRNYXJrdXAgfSA9IGhlYWRlci5ncm91cHMhO1xuXG4gICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoLyd7M30vZywgJycpO1xuXG4gICAgICAgIGNvbnN0IGxpbmtzID0gbmFtZS5tYXRjaEFsbCgvXFxbXFxbKC4rPyldXS9nKS50b0FycmF5KCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBsaW5rIG9mIGxpbmtzKSBuYW1lID0gbmFtZS5yZXBsYWNlKGxpbmtbMF0sIGxpbmtbMV0uc3BsaXQoJ3wnKS5hdCgtMSkhKTtcblxuICAgICAgICBjb25zdCBkZXB0aCA9IE1hdGgubWF4KHN0YXJ0TWFya3VwLmxlbmd0aCwgZW5kTWFya3VwLmxlbmd0aCwgMik7XG5cbiAgICAgICAgcmV0dXJuIHsgbmFtZSwgZGVwdGgsIG9yaWdpbmFsOiBoZWFkZXJbMF0gfTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGhlYWRlcnNTZXQgPSBuZXcgU2V0KHBhcnNlZEhlYWRlcnMubWFwKChoZWFkZXIpID0+IGhlYWRlci5uYW1lKSk7XG5cbiAgICBjb25zdCB0aXRsZVNwYWNlciA9IHBhcnNlZEhlYWRlcnMubGVuZ3RoID4gMCA/ICgvXlxcbio9KyB8ID0rXFxuKyQvLnRlc3QocGFyc2VkSGVhZGVyc1swXS5vcmlnaW5hbCkgPyAnICcgOiAnJykgOiAnJztcblxuICAgIGZvciAoY29uc3QgaGVhZGVyIG9mIHBhcnNlZEhlYWRlcnMpIHtcbiAgICAgICAgY29uc3QgbG93ZXJjYXNlTmFtZSA9IGhlYWRlci5uYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgY29uc3QgcmVwbGFjZWROYW1lID1cbiAgICAgICAgICAgIGxvd2VyY2FzZU5hbWUgaW4gcmV2ZXJzZUNvbW1vblJlcGxhY2VtZW50cyAmJiAhaGVhZGVyc1NldC5oYXMocmV2ZXJzZUNvbW1vblJlcGxhY2VtZW50c1tsb3dlcmNhc2VOYW1lXSlcbiAgICAgICAgICAgICAgICA/IHJldmVyc2VDb21tb25SZXBsYWNlbWVudHNbbG93ZXJjYXNlTmFtZV1cbiAgICAgICAgICAgICAgICA6IGhlYWRlci5uYW1lO1xuXG4gICAgICAgIGxldCBjYXBpdGFsaXplZE5hbWUgPSByZXBsYWNlZE5hbWU7XG5cbiAgICAgICAgZm9yIChjb25zdCB3b3JkIG9mIENPTU1PTl9NSVNDQVBJVEFMSVpFRF9XT1JEUylcbiAgICAgICAgICAgIGNhcGl0YWxpemVkTmFtZSA9IGNhcGl0YWxpemVkTmFtZS5yZXBsYWNlQWxsKG5ldyBSZWdFeHAoYFxcXFxiJHt3b3JkfVxcXFxiYCwgJ2dpJyksIHdvcmQpO1xuXG4gICAgICAgIGNhcGl0YWxpemVkTmFtZSA9IGNhcGl0YWxpemVkTmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGNhcGl0YWxpemVkTmFtZS5zbGljZSgxKTtcblxuICAgICAgICBjb25zdCBvdXRwdXQgPSBgJHsnPScucmVwZWF0KGhlYWRlci5kZXB0aCl9JHt0aXRsZVNwYWNlcn0ke2NhcGl0YWxpemVkTmFtZX0ke3RpdGxlU3BhY2VyfSR7Jz0nLnJlcGVhdChoZWFkZXIuZGVwdGgpfWA7XG5cbiAgICAgICAgaWYgKGhlYWRlci5vcmlnaW5hbCAhPT0gb3V0cHV0KSBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKGhlYWRlci5vcmlnaW5hbCwgYFxcblxcbiR7b3V0cHV0fVxcbmApO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdW5uZWNlc3NhcnkgbWFnaWMgd29yZHMgZnJvbSBhbiBhcnRpY2xlJ3MgY29udGVudC5cbiAqIEBwYXJhbSBjb250ZW50IFRoZSBhcnRpY2xlIGNvbnRlbnQgdG8gY2xlYW4gdXAuXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBNYWdpY1dvcmRzKGNvbnRlbnQ6IHN0cmluZykge1xuICAgIHJldHVybiBjb250ZW50LnJlcGxhY2VBbGwoL19fKElOREVYfE5PSU5ERVh8TkVXU0VDVElPTkxJTkt8Tk9ORVdTRUNUSU9OTElOS3xOT0VESVRTRUNUSU9OfERJU0FNQklHfFNUQVRJQ1JFRElSRUNUfEZPUkNFVE9DKV9fXFxuKi9nLCAnJyk7XG59XG5cbi8qKlxuICogQ2xlYW5zIHVwIERJU1BMQVlUSVRMRXMgYW5kIERFRkFVTFRTT1JUcyBpbiBhbiBhcnRpY2xlJ3MgY29udGVudC5cbiAqIEBwYXJhbSBjb250ZW50IFRoZSBhcnRpY2xlIGNvbnRlbnQgdG8gY2xlYW4gdXAuXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBEaXNwbGF5dGl0bGVzQW5kRGVmYXVsdHNvcnRzKGNvbnRlbnQ6IHN0cmluZykge1xuICAgIGNvbnN0IHRhZ3MgPSBjb250ZW50Lm1hdGNoQWxsKC97eyhkaXNwbGF5dGl0bGV8ZGVmYXVsdHNvcnQpWzp8XSguKj8pfX0vZ2kpO1xuXG4gICAgY29uc3QgcGFyc2VkVGFncyA9IFsuLi50YWdzXS5tYXAoKHRhZykgPT4ge1xuICAgICAgICBjb25zdCBbZnVsbFRhZywgdHlwZSwgdmFsdWVdID0gdGFnO1xuXG4gICAgICAgIHJldHVybiB7IHR5cGU6IHR5cGUudG9VcHBlckNhc2UoKSwgdmFsdWUsIG9yaWdpbmFsOiBmdWxsVGFnIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBjdXJyZW50VGl0bGUgPSBtdy5UaXRsZS5uZXdGcm9tVGV4dChtdy5jb25maWcuZ2V0KCd3Z1BhZ2VOYW1lJykpITtcblxuICAgIGZvciAoY29uc3QgdGFnIG9mIHBhcnNlZFRhZ3MpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxUYWdSZWdleCA9IG5ldyBSZWdFeHAoYCR7ZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKHRhZy5vcmlnaW5hbCl9XFxuKmAsICdnJyk7XG5cbiAgICAgICAgY29uc3QgdW5wcmVmaXhlZFRpdGxlID0gbXcuVGl0bGUubmV3RnJvbVRleHQodGFnLnZhbHVlKTtcblxuICAgICAgICBpZiAoIXVucHJlZml4ZWRUaXRsZSkgY29udGludWU7XG5cbiAgICAgICAgY29uc3QgdGl0bGUgPSBtdy5UaXRsZS5tYWtlVGl0bGUoY3VycmVudFRpdGxlLmdldE5hbWVzcGFjZUlkKCksIHVucHJlZml4ZWRUaXRsZS5nZXRNYWluVGV4dCgpKTtcblxuICAgICAgICBpZiAoIXRpdGxlKSBjb250aW51ZTtcblxuICAgICAgICBjb25zdCBkZWZhdWx0S2V5ID0gdGFnLnR5cGUgPT09ICdESVNQTEFZVElUTEUnID8gY3VycmVudFRpdGxlLnRvVGV4dCgpIDogY3VycmVudFRpdGxlLmdldE1haW5UZXh0KCk7XG5cbiAgICAgICAgY29uc3QgY3VzdG9tS2V5ID0gdGFnLnR5cGUgPT09ICdESVNQTEFZVElUTEUnID8gdGl0bGUudG9UZXh0KCkgOiB0aXRsZS5nZXRNYWluVGV4dCgpO1xuXG4gICAgICAgIGlmIChkZWZhdWx0S2V5ID09PSBjdXN0b21LZXkpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2Uob3JpZ2luYWxUYWdSZWdleCwgJycpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdUZXh0ID0gYHt7JHt0YWcudHlwZX06JHtjdXN0b21LZXl9fX1cXG5gO1xuXG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2Uob3JpZ2luYWxUYWdSZWdleCwgbmV3VGV4dCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbi8qKlxuICogQ2xlYW5zIHVwIGNhdGVnb3JpZXMgaW4gYW4gYXJ0aWNsZSdzIGNvbnRlbnQuXG4gKiBAcGFyYW0gY29udGVudCBUaGUgYXJ0aWNsZSBjb250ZW50IHRvIGNsZWFuIHVwLlxuICovXG5mdW5jdGlvbiBjbGVhbnVwQ2F0ZWdvcmllcyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKFxuICAgICAgICAvKFxcW1xcW3x9fSk6P2NhdGVnb3J5OiguKj8pKF1dfH19KS9naSxcbiAgICAgICAgYFtbJHttdy5jb25maWcuZ2V0KCd3Z0Nhbm9uaWNhbE5hbWVzcGFjZScpID09PSAnRHJhZnQnID8gJzonIDogJyd9Q2F0ZWdvcnk6JDJdXWAsXG4gICAgKTtcbn1cblxuaW50ZXJmYWNlIExpbmtJbmZvcm1hdGlvbiB7XG4gICAgc3RhcnQ6IG51bWJlcjtcbiAgICBlbmQ6IG51bWJlcjtcbiAgICBpc05lc3RlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDbGVhbnMgdXAgbGlua3MgaW4gYW4gYXJ0aWNsZSdzIGNvbnRlbnQuXG4gKiBAcGFyYW0gY29udGVudCBUaGUgYXJ0aWNsZSBjb250ZW50IHRvIGNsZWFuIHVwLlxuICogQHBhcmFtIGZ1bmN0aW9uc0NhbGxlZFdoaWxlRXNjYXBlZCBUaGUgZnVuY3Rpb25zIGNhbGxlZCB3aGlsZSB0aGUgbGlua3MgYXJlIGVzY2FwZWQuXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBMaW5rcyhjb250ZW50OiBzdHJpbmcsIGZ1bmN0aW9uc0NhbGxlZFdoaWxlRXNjYXBlZDogKChjb250ZW50OiBzdHJpbmcsIHJ1bjogMSB8IDIpID0+IHN0cmluZylbXSkge1xuICAgIGNvbnN0IGNsb3NlZExpbmtzOiBMaW5rSW5mb3JtYXRpb25bXSA9IFtdO1xuICAgIGNvbnN0IGxpbmtzOiBMaW5rSW5mb3JtYXRpb25bXSA9IFtdO1xuXG4gICAgbGV0IGlzSW5zaWRlTm93aWtpID0gZmFsc2U7XG4gICAgbGV0IGlzSW5zaWRlQ29tbWVudCA9IGZhbHNlO1xuXG4gICAgbGV0IGN1cnJlbnRMb2NhdGlvbiA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGNvbnRlbnQgZm9sbG93aW5nIHRoZSBjdXJyZW50IGxvY2F0aW9uIG1hdGNoZXMgdGhlIGRlc2lyZWQgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBkZXNpcmVkU3RyaW5nIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKiBAcGFyYW0gc2hvdWxkSW5jcmVtZW50IFdoZXRoZXIgdG8gaW5jcmVtZW50IHRoZSBjdXJyZW50IGxvY2F0aW9uIGlmIHRoZSBzdHJpbmcgaXMgZm91bmQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNBdFN0cmluZyhkZXNpcmVkU3RyaW5nOiBzdHJpbmcsIHNob3VsZEluY3JlbWVudCA9IHRydWUpIHtcbiAgICAgICAgY29uc3QgaXNBdFN0cmluZyA9IGNvbnRlbnQuc2xpY2UoY3VycmVudExvY2F0aW9uLCBjdXJyZW50TG9jYXRpb24gKyBkZXNpcmVkU3RyaW5nLmxlbmd0aCkgPT09IGRlc2lyZWRTdHJpbmc7XG5cbiAgICAgICAgaWYgKGlzQXRTdHJpbmcgJiYgc2hvdWxkSW5jcmVtZW50KSBjdXJyZW50TG9jYXRpb24gKz0gZGVzaXJlZFN0cmluZy5sZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIGlzQXRTdHJpbmc7XG4gICAgfVxuXG4gICAgd2hpbGUgKGN1cnJlbnRMb2NhdGlvbiA8IGNvbnRlbnQubGVuZ3RoKVxuICAgICAgICBpZiAoaXNBdFN0cmluZygnPG5vd2lraT4nKSkgaXNJbnNpZGVOb3dpa2kgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChpc0F0U3RyaW5nKCc8L25vd2lraT4nKSkgaXNJbnNpZGVOb3dpa2kgPSBmYWxzZTtcbiAgICAgICAgZWxzZSBpZiAoaXNBdFN0cmluZygnPCEtLScpKSBpc0luc2lkZUNvbW1lbnQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChpc0F0U3RyaW5nKCctLT4nKSkgaXNJbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gICAgICAgIGVsc2UgaWYgKCFpc0luc2lkZU5vd2lraSAmJiAhaXNJbnNpZGVDb21tZW50KVxuICAgICAgICAgICAgaWYgKGlzQXRTdHJpbmcoJ1tbJykpIGxpbmtzLnB1c2goeyBzdGFydDogY3VycmVudExvY2F0aW9uIC0gMiwgZW5kOiAtMSwgaXNOZXN0ZWQ6IGxpbmtzLmxlbmd0aCA+IDAgfSk7XG4gICAgICAgICAgICBlbHNlIGlmIChpc0F0U3RyaW5nKCddXScpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdExpbmsgPSBsaW5rcy5wb3AoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWxhc3RMaW5rKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGxhc3RMaW5rLmVuZCA9IGN1cnJlbnRMb2NhdGlvbjtcblxuICAgICAgICAgICAgICAgIGNsb3NlZExpbmtzLnB1c2gobGFzdExpbmspO1xuICAgICAgICAgICAgfSBlbHNlIGN1cnJlbnRMb2NhdGlvbisrO1xuICAgICAgICBlbHNlIGN1cnJlbnRMb2NhdGlvbisrO1xuXG4gICAgY29uc3QgbmV3TGlua0NvbnRlbnQ6IFtMaW5rSW5mb3JtYXRpb24sIHN0cmluZ11bXSA9IFtdO1xuXG4gICAgY29uc3QgbmFtZXNwYWNlTmFtZXMgPSBPYmplY3QudmFsdWVzKG13LmNvbmZpZy5nZXQoJ3dnRm9ybWF0dGVkTmFtZXNwYWNlcycpKTtcblxuICAgIGZvciAoY29uc3QgbGlua0xvY2F0aW9uIG9mIGNsb3NlZExpbmtzKSB7XG4gICAgICAgIGNvbnN0IGlubmVyTGluayA9IGNvbnRlbnQuc2xpY2UobGlua0xvY2F0aW9uLnN0YXJ0ICsgMiwgbGlua0xvY2F0aW9uLmVuZCAtIDIpO1xuXG4gICAgICAgIGNvbnN0IFt1bnBhcnNlZExpbmssIC4uLnBhcmFtZXRlcnNdID0gaW5uZXJMaW5rLnNwbGl0KCd8Jyk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSBsaW5rIG5hbWVzIHNvIHRoZXNlIHdvbid0IGJlIGFmZmVjdGVkIGJ5IGZ1bmN0aW9ucyBjYWxsZWQgd2hpbGUgZXNjYXBlZFxuICAgICAgICBjb250ZW50ID1cbiAgICAgICAgICAgIGNvbnRlbnQuc2xpY2UoMCwgbGlua0xvY2F0aW9uLnN0YXJ0ICsgMikgK1xuICAgICAgICAgICAgJ1xcMCcucmVwZWF0KHVucGFyc2VkTGluay5sZW5ndGgpICtcbiAgICAgICAgICAgIGNvbnRlbnQuc2xpY2UobGlua0xvY2F0aW9uLnN0YXJ0ICsgMiArIHVucGFyc2VkTGluay5sZW5ndGgpO1xuXG4gICAgICAgIGxldCBsaW5rID0gdW5wYXJzZWRMaW5rLnJlcGxhY2VBbGwoJ18nLCAnICcpLnRyaW0oKTtcbiAgICAgICAgbGV0IGFsdFRleHQgPSBwYXJhbWV0ZXJzLmpvaW4oJ3wnKTtcbiAgICAgICAgYWx0VGV4dCA9IGFsdFRleHQgPT09ICcgJyA/ICcgJyA6IGFsdFRleHQudHJpbSgpO1xuXG4gICAgICAgIGNvbnN0IGlzRmlyc3RDaGFyYWN0ZXJDb2xvbiA9IGxpbmsuc3RhcnRzV2l0aCgnOicpO1xuICAgICAgICBpZiAoaXNGaXJzdENoYXJhY3RlckNvbG9uKSBsaW5rID0gbGluay5zbGljZSgxKTtcblxuICAgICAgICBsZXQgc2hvdWxkRmlyc3RDaGFyYWN0ZXJCZUNvbG9uID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgbGlua1VwcGVyY2FzZVN0YXJ0ID0gbGluay5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGxpbmsuc2xpY2UoMSk7XG4gICAgICAgIGNvbnN0IGxpbmtMb3dlcmNhc2VTdGFydCA9IGxpbmsuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBsaW5rLnNsaWNlKDEpO1xuXG4gICAgICAgIGxldCBuYW1lc3BhY2UgPSBsaW5rLnNwbGl0KCc6JylbMF07XG4gICAgICAgIG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWVzcGFjZS5zbGljZSgxKTtcblxuICAgICAgICBpZiAobGluay5pbmNsdWRlcygnOicpKSB7XG4gICAgICAgICAgICBpZiAobGlua1VwcGVyY2FzZVN0YXJ0LnN0YXJ0c1dpdGgoJ0ltYWdlOicpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkU3RhcnRVcHBlcmNhc2UgPSBsaW5rLnN0YXJ0c1dpdGgoJ0ltYWdlOicpO1xuXG4gICAgICAgICAgICAgICAgbGluayA9IGAke3Nob3VsZFN0YXJ0VXBwZXJjYXNlID8gJ0YnIDogJ2YnfWlsZToke2xpbmsuc2xpY2UoNil9YDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGlzRmlyc3RDaGFyYWN0ZXJDb2xvbiAmJlxuICAgICAgICAgICAgICAgIChbJ0ltYWdlJywgJ0ZpbGUnLCAnQ2F0ZWdvcnknXS5pbmNsdWRlcyhsaW5rVXBwZXJjYXNlU3RhcnQuc3BsaXQoJzonKVswXSkgfHwgIW5hbWVzcGFjZU5hbWVzLmluY2x1ZGVzKG5hbWVzcGFjZSkpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgc2hvdWxkRmlyc3RDaGFyYWN0ZXJCZUNvbG9uID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiZWZvcmVMaW5rVGV4dCA9ICcnO1xuICAgICAgICBsZXQgYWZ0ZXJMaW5rVGV4dCA9ICcnO1xuXG4gICAgICAgIGNvbnN0IG1hdGNoZWRNYXJrdXAgPSAvXignezIsfSkoLio/KVxcMSQvLmV4ZWMoYWx0VGV4dCk7XG5cbiAgICAgICAgaWYgKG1hdGNoZWRNYXJrdXAgJiYgIW1hdGNoZWRNYXJrdXBbMl0uaW5jbHVkZXMoXCInJ1wiKSkge1xuICAgICAgICAgICAgYmVmb3JlTGlua1RleHQgPSBtYXRjaGVkTWFya3VwWzFdO1xuICAgICAgICAgICAgYWx0VGV4dCA9IG1hdGNoZWRNYXJrdXBbMl0udHJpbSgpO1xuICAgICAgICAgICAgYWZ0ZXJMaW5rVGV4dCA9IG1hdGNoZWRNYXJrdXBbMV07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoL1shLC46Oz9dJC8udGVzdChhbHRUZXh0KSAmJiAhWydJbWFnZScsICdGaWxlJywgJ0NhdGVnb3J5J10uaW5jbHVkZXMobGlua1VwcGVyY2FzZVN0YXJ0LnNwbGl0KCc6JylbMF0pKSB7XG4gICAgICAgICAgICBjb25zdCBhZGRlZFB1bmN0dWF0aW9uID0gYWx0VGV4dC5zbGljZSgtMSk7XG5cbiAgICAgICAgICAgIGlmICghbGluay5lbmRzV2l0aChhZGRlZFB1bmN0dWF0aW9uKSkge1xuICAgICAgICAgICAgICAgIGFmdGVyTGlua1RleHQgKz0gYWRkZWRQdW5jdHVhdGlvbjtcbiAgICAgICAgICAgICAgICBhbHRUZXh0ID0gYWx0VGV4dC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGluayA9PT0gYWx0VGV4dCkgYWx0VGV4dCA9ICcnO1xuICAgICAgICBlbHNlIGlmIChuZXcgUmVnRXhwKGBeJHtlc2NhcGVSZWdleENoYXJhY3RlcnMobGluayl9W2Etel0rJGApLnRlc3QoYWx0VGV4dCkpIHtcbiAgICAgICAgICAgIGFmdGVyTGlua1RleHQgPSBhbHRUZXh0LnNsaWNlKGxpbmsubGVuZ3RoKSArIGFmdGVyTGlua1RleHQ7XG4gICAgICAgICAgICBhbHRUZXh0ID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IG5ld0xpbmsgb2YgW2xpbmtVcHBlcmNhc2VTdGFydCwgbGlua0xvd2VyY2FzZVN0YXJ0XSlcbiAgICAgICAgICAgIGlmIChuZXdMaW5rID09PSBhbHRUZXh0KSB7XG4gICAgICAgICAgICAgICAgbGluayA9IG5ld0xpbms7XG4gICAgICAgICAgICAgICAgYWx0VGV4dCA9ICcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChuZXcgUmVnRXhwKGBeJHtlc2NhcGVSZWdleENoYXJhY3RlcnMobmV3TGluayl9W2Etel0rJGApLnRlc3QoYWx0VGV4dCkpIHtcbiAgICAgICAgICAgICAgICBsaW5rID0gbmV3TGluaztcbiAgICAgICAgICAgICAgICBhZnRlckxpbmtUZXh0ID0gYWx0VGV4dC5zbGljZShuZXdMaW5rLmxlbmd0aCkgKyBhZnRlckxpbmtUZXh0O1xuICAgICAgICAgICAgICAgIGFsdFRleHQgPSAnJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoYWx0VGV4dCAmJiBsaW5rLmluY2x1ZGVzKCc6JykgJiYgbmFtZXNwYWNlTmFtZXMuaW5jbHVkZXMobmFtZXNwYWNlKSkgfHxcbiAgICAgICAgICAgIGxpbmsuc3RhcnRzV2l0aCgnZmlsZTonKSB8fFxuICAgICAgICAgICAgbGluay5zdGFydHNXaXRoKCdjYXRlZ29yeTonKVxuICAgICAgICApXG4gICAgICAgICAgICBsaW5rID0gbGluay5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGxpbmsuc2xpY2UoMSk7XG5cbiAgICAgICAgbGluayA9IGAke3Nob3VsZEZpcnN0Q2hhcmFjdGVyQmVDb2xvbiA/ICc6JyA6ICcnfSR7bGlua31gO1xuXG4gICAgICAgIGxpbmsgPSBsaW5rLnBhZFN0YXJ0KHVucGFyc2VkTGluay5sZW5ndGgsICdcXDAnKTtcblxuICAgICAgICBjb25zdCBvdXRwdXQgPSBgJHtiZWZvcmVMaW5rVGV4dH1bWyR7bGlua30ke2FsdFRleHQgPyBgfCR7YWx0VGV4dH1gIDogJyd9XV0ke2FmdGVyTGlua1RleHR9YDtcblxuICAgICAgICBuZXdMaW5rQ29udGVudC5wdXNoKFtsaW5rTG9jYXRpb24sIG91dHB1dF0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgZnVuY3Rpb25Ub0NhbGwgb2YgZnVuY3Rpb25zQ2FsbGVkV2hpbGVFc2NhcGVkKSBjb250ZW50ID0gZnVuY3Rpb25Ub0NhbGwoY29udGVudCwgMSk7XG5cbiAgICBmb3IgKGxldCBsb29wQ291bnRlciA9IDA7IGxvb3BDb3VudGVyIDwgMjsgbG9vcENvdW50ZXIrKylcbiAgICAgICAgZm9yIChjb25zdCBbbGlua0RhdGEsIGxpbmtDb250ZW50XSBvZiBuZXdMaW5rQ29udGVudCkge1xuICAgICAgICAgICAgaWYgKGxvb3BDb3VudGVyID09PSAwICYmIGxpbmtEYXRhLmlzTmVzdGVkKSBjb250aW51ZTtcbiAgICAgICAgICAgIGVsc2UgaWYgKGxvb3BDb3VudGVyID09PSAxICYmICFsaW5rRGF0YS5pc05lc3RlZCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnRlbnQgPVxuICAgICAgICAgICAgICAgIGNvbnRlbnQuc2xpY2UoMCwgbGlua0RhdGEuc3RhcnQpICsgbGlua0NvbnRlbnQucGFkRW5kKGxpbmtEYXRhLmVuZCAtIGxpbmtEYXRhLnN0YXJ0LCAnXFwwJykgKyBjb250ZW50LnNsaWNlKGxpbmtEYXRhLmVuZCk7XG4gICAgICAgIH1cblxuICAgIGZvciAoY29uc3QgZnVuY3Rpb25Ub0NhbGwgb2YgZnVuY3Rpb25zQ2FsbGVkV2hpbGVFc2NhcGVkKSBjb250ZW50ID0gZnVuY3Rpb25Ub0NhbGwoY29udGVudCwgMik7XG5cbiAgICByZXR1cm4gY29udGVudC5yZXBsYWNlQWxsKCdcXDAnLCAnJyk7XG59XG5cbi8qKlxuICogQ2xlYW5zIHVwIGltcHJvcGVyIGNoYXJhY3RlcnMgaW4gYW4gYXJ0aWNsZSdzIGNvbnRlbnQuXG4gKiBAcGFyYW0gY29udGVudCBUaGUgYXJ0aWNsZSBjb250ZW50IHRvIGNsZWFuIHVwLlxuICogQHBhcmFtIHJ1biBUaGUgcnVuIG51bWJlciBvZiB0aGUgZnVuY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBJbXByb3BlckNoYXJhY3RlcnMoY29udGVudDogc3RyaW5nLCBydW46IDEgfCAyKSB7XG4gICAgY29uc3QgRUxJUFNJU19QTEFDRUhPTERFUiA9ICdcXHUwMDdGJztcbiAgICBjb25zdCBOQlNQX1BMQUNFSE9MREVSID0gJ1xcdTAwOUYnO1xuXG4gICAgaWYgKHJ1biA9PT0gMSkge1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKC9bXHUyMDFDXHUyMDFEXHUyMDFFXHUyMDFGXS9nLCAnXCInKTtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCgvW1x1MjAxOFx1MjAxOVx1MjAxQVx1MjAxQl0vZywgXCInXCIpO1xuICAgICAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKCdcdTIwMjYnLCBFTElQU0lTX1BMQUNFSE9MREVSKTtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCgnXHUwMEEwJywgTkJTUF9QTEFDRUhPTERFUik7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbChFTElQU0lTX1BMQUNFSE9MREVSLCAnLi4uJyk7XG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoTkJTUF9QTEFDRUhPTERFUiwgJyZuYnNwOycpO1xuICAgIH1cblxuICAgIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIENsZWFucyB1cCB5ZWFyIHJhbmdlcyBpbiBhbiBhcnRpY2xlJ3MgY29udGVudC5cbiAqIEBwYXJhbSBjb250ZW50IFRoZSBhcnRpY2xlIGNvbnRlbnQgdG8gY2xlYW4gdXAuXG4gKiBAcGFyYW0gcnVuIFRoZSBydW4gbnVtYmVyIG9mIHRoZSBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gY2xlYW51cFllYXJSYW5nZXMoY29udGVudDogc3RyaW5nLCBydW46IDEgfCAyKSB7XG4gICAgaWYgKHJ1biA9PT0gMSlcbiAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCgvKFxcKFxcZHszLDR9KSA/W1x1MjAxMlx1MjAxM1x1MjIxMi1dID8oXFxkezMsNH1cXCkpL2csIChvcmlnaW5hbCwgc3RhcnQsIGVuZCkgPT5cbiAgICAgICAgICAgIGAke3N0YXJ0fVx1MjAxMyR7ZW5kfWAucGFkRW5kKG9yaWdpbmFsLmxlbmd0aCwgJ1xcMCcpLFxuICAgICAgICApO1xuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbi8qKlxuICogUmVtb3ZlcyBzdHJheSBtYXJrdXAgaW4gYW4gYXJ0aWNsZSdzIGNvbnRlbnQuXG4gKiBAcGFyYW0gY29udGVudCBUaGUgYXJ0aWNsZSBjb250ZW50IHRvIGNsZWFuIHVwLlxuICovXG5mdW5jdGlvbiBjbGVhbnVwU3RyYXlNYXJrdXAoY29udGVudDogc3RyaW5nKSB7XG4gICAgY29uc3QgU1RSQVlfTUFSS1VQX1JFR0VYRVMgPSBbXG4gICAgICAgIC8nKyhCb2xkfEl0YWxpYykoIHRleHQpPycrICovZyxcbiAgICAgICAgLyg8YmlnPikrQmlnKCB0ZXh0KT8oPFxcL2JpZz4pKyAqL2csXG4gICAgICAgIC8oPHNtYWxsPikrU21hbGwoIHRleHQpPyg8XFwvc21hbGw+KSsgKi9nLFxuICAgICAgICAvKDxzdXA+KStTdXBlcnNjcmlwdCggdGV4dCk/KDxcXC9zdXA+KSsgKi9nLFxuICAgICAgICAvKDxzdWI+KStTdWJzY3JpcHQoIHRleHQpPyg8XFwvc3ViPikrICovZyxcbiAgICAgICAgLyg8cz4pK1N0cmlrZXRocm91Z2goPFxcL3M+KSsgKi9nLFxuICAgICAgICAvKDx1PikrVW5kZXJsaW5lKDxcXC91PikrICovZyxcbiAgICAgICAgLyg8Y29kZT4pK0NvbXB1dGVyIGNvZGUoPFxcL2NvZGU+KSsgKi9nLFxuICAgICAgICAvKDxub3dpa2k+KStJbnNlcnQgbm9uLWZvcm1hdHRlZCB0ZXh0IGhlcmUoPFxcL25vd2lraT4pKyAqL2csXG4gICAgICAgIC89KyBIZWFkaW5nIHRleHQgPSsgKi9nLFxuICAgICAgICAvXFwqIEJ1bGxldGVkIGxpc3QgaXRlbSAqL2csXG4gICAgICAgIC8jIE51bWJlcmVkIGxpc3QgaXRlbSAqL2csXG4gICAgICAgIC88Z2FsbGVyeT5cXG5FeGFtcGxlLmpwZ1xcfENhcHRpb24xXFxuRXhhbXBsZS5qcGdcXHxDYXB0aW9uMlxcbjxcXC9nYWxsZXJ5PiAqL2csXG4gICAgICAgIC8jUkVESVJFQ1QgXFxbXFxbVGFyZ2V0IHBhZ2UgbmFtZV1dICovZyxcbiAgICAgICAgLzwhLS0gSW52aXNpYmxlIGNvbW1lbnQgLS0+ICovZyxcbiAgICAgICAgLzxcXHMqKGJpZ3xzbWFsbHxzdXB8c3VifHN8dXxjb2RlfG5vd2lraXxub2luY2x1ZGV8b25seWluY2x1ZGV8aW5jbHVkZW9ubHl8Y2VudGVyfGJsb2NrcXVvdGV8Z2FsbGVyeSlcXHMqKFxccytbXjw+XSopPz5cXHMqPFxccypcXC9cXHMqXFwxXFxzKj4vZ2ksXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgcmVnZXggb2YgU1RSQVlfTUFSS1VQX1JFR0VYRVMpIHdoaWxlIChyZWdleC50ZXN0KGNvbnRlbnQpKSBjb250ZW50ID0gY29udGVudC5yZXBsYWNlKHJlZ2V4LCAnJyk7XG5cbiAgICByZXR1cm4gY29udGVudDtcbn1cblxuLyoqXG4gKiBDbGVhbnMgdXAgc3BhY2luZyBpbiBhbiBhcnRpY2xlJ3MgY29udGVudC5cbiAqIEBwYXJhbSBjb250ZW50IFRoZSBhcnRpY2xlIGNvbnRlbnQgdG8gY2xlYW4gdXAuXG4gKiBAcGFyYW0gc2Vjb25kUnVuIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIHJ1biBmb3IgdGhlIHNlY29uZCB0aW1lLCBhZnRlciBvdGhlciBwcm9jZXNzaW5nLlxuICovXG5mdW5jdGlvbiBjbGVhbnVwU3BhY2luZyhjb250ZW50OiBzdHJpbmcsIHNlY29uZFJ1biA9IGZhbHNlKSB7XG4gICAgY29uc3QgUExBQ0VIT0xERVIgPSAnXFx1e0YwMDAwfSc7XG5cbiAgICBjb25zdCBUQUdTX1RPX0lHTk9SRSA9IFsncG9lbScsICdwcmUnLCAncmVmZXJlbmNlcycsICd0ZW1wbGF0ZWRhdGEnXTtcblxuICAgIGNvbnN0IGlnbm9yZWRUYWdzQ29udGVudDogc3RyaW5nW10gPSBbXTtcblxuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoXG4gICAgICAgIG5ldyBSZWdFeHAoYCg8KCR7VEFHU19UT19JR05PUkUuam9pbignfCcpfSkoPzogW148Pl0qPyk/PikoLio/KSg8L1xcXFwyPilgLCAnZ3MnKSxcbiAgICAgICAgKGZ1bGxNYXRjaCwgc3RhcnRUYWc6IHN0cmluZywgdGFnTmFtZTogc3RyaW5nLCBpbm5lckNvbnRlbnQ6IHN0cmluZywgZW5kVGFnOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlubmVyQ29udGVudCA9IGlubmVyQ29udGVudC5yZXBsYWNlQWxsKC8gKyQvZ20sICcnKS50cmltKCk7XG5cbiAgICAgICAgICAgIGlnbm9yZWRUYWdzQ29udGVudC5wdXNoKGAke3N0YXJ0VGFnfVxcbiR7aW5uZXJDb250ZW50fVxcbiR7ZW5kVGFnfWApO1xuXG4gICAgICAgICAgICByZXR1cm4gUExBQ0VIT0xERVI7XG4gICAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoLyhcXGJ8XFxwe1B1bmN0dWF0aW9ufXxcXF1cXF18XFx9XFx9fFxcdz4pIHsyLH0oXFxifFxccHtQdW5jdHVhdGlvbn18XFxbXFxbfFxce1xce3w8XFx3KS9ndSwgJyQxICQyJyk7IC8vIFJlbW92ZSBleHRyYSBzcGFjZXMgYmV0d2VlbiB3b3JkcyBhbmQgc2VudGVuY2VzXG4gICAgaWYgKCFzZWNvbmRSdW4pIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoL14gK3wgKyQvZ20sICcnKTsgLy8gUmVtb3ZlIGV4dHJhIHNwYWNlcyBhdCB0aGUgc3RhcnQgb3IgZW5kIG9mIGxpbmVzXG4gICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZUFsbCgvXFxuezMsfS9nLCAnXFxuXFxuJyk7IC8vIFJlbW92ZSBleHRyYSBuZXdsaW5lc1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL1xccyooe3tbXn1dKnN0dWJ9fSkvaSwgJ1xcblxcbiQxJyk7IC8vIEVuc3VyZSB0aGVyZSBpcyBvbmUgYmxhbmsgbGluZSBiZWZvcmUgdGhlIGZpcnN0IHN0dWIgdGVtcGxhdGVcbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKC9cXHMrJC9nLCAnJyk7IC8vIFJlbW92ZSB0cmFpbGluZyBzcGFjZXNcbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKC9eKFsjKl0rKSAqL2dtLCAnJDEgJyk7IC8vIEVuc3VyZSB0aGVyZSBpcyBhIHNwYWNlIGFmdGVyIGEgYnVsbGV0IG9yIGhhc2ggaW4gYSBsaXN0IGl0ZW1cbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKC9eKFsjKl0rIC4qKVxcbisoPz1bIypdKyApL2dtLCAnJDFcXG4nKTsgLy8gUmVtb3ZlIG5ld2xpbmVzIGJldHdlZW4gbGlzdCBpdGVtc1xuICAgIGlmICghc2Vjb25kUnVuKSBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKC8oPzwhXFx8KVxccysoPz08cmVmKD8hZXJlbmNlcykpL2csICcnKTsgLy8gUmVtb3ZlIHNwYWNlcyBiZWZvcmUgcmVmZXJlbmNlc1xuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwoLzxcXC8oW0EtWmEtel0rKSArPi9nLCAnPC8kMT4nKTsgLy8gUmVtb3ZlIGV4Y2VzcyBzcGFjZSBpbiBjbG9zaW5nIHRhZ3NcbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKC9eKD0rLio/PSspJFxcbnsyLH0oPz1ePSsuKj89KyQpL2dtLCAnJDFcXG4nKTsgLy8gUmVtb3ZlIGV4dHJhIG5ld2xpbmVzIGJldHdlZW4gZW1wdHkgc2VjdGlvbiBhbmQgZm9sbG93aW5nIHNlY3Rpb25cbiAgICBjb250ZW50ID0gY29udGVudC50cmltKCk7IC8vIFJlbW92ZSB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydCBvciBlbmQgb2YgdGhlIGNvbnRlbnRcblxuICAgIC8vIEFkZCBiYWNrIGlnbm9yZWQgdGFnc1xuICAgIGZvciAoY29uc3QgdGFnQ29udGVudCBvZiBpZ25vcmVkVGFnc0NvbnRlbnQpIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoUExBQ0VIT0xERVIsIHRhZ0NvbnRlbnQpO1xuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbi8qKlxuICogQ2xlYW5zIHVwIHJlZmVyZW5jZXMgaW4gYW4gYXJ0aWNsZSdzIGNvbnRlbnQuXG4gKiBAcGFyYW0gY29udGVudCBUaGUgYXJ0aWNsZSBjb250ZW50IHRvIGNsZWFuIHVwLlxuICovXG5mdW5jdGlvbiBjbGVhbnVwUmVmZXJlbmNlcyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKFxuICAgICAgICAvKCg/OjxyZWYoPyFlcmVuY2VzKVteL10qPz4uKj88XFwvcmVmPnw8cmVmKD8hZXJlbmNlcykuKj9cXC8+KSspKFshLC47P10pPy9nLFxuICAgICAgICAoZnVsbE1hdGNoLCByZWZlcmVuY2VUYWc6IHN0cmluZywgcHVuY3R1YXRpb246IHN0cmluZyB8IHVuZGVmaW5lZCkgPT4gKHB1bmN0dWF0aW9uID8/ICcnKSArIHJlZmVyZW5jZVRhZyxcbiAgICApOyAvLyBGaXggcHVuY3R1YXRpb24gZm9sbG93aW5nIHJlZmVyZW5jZXNcblxuICAgIGNvbnN0IHJlZmVyZW5jZXM6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IGlzU2VsZkNsb3Npbmc/OiB0cnVlIH1bXSA9IFtdO1xuXG4gICAgbGV0IGlzSW5zaWRlTm93aWtpID0gZmFsc2U7XG4gICAgbGV0IGlzSW5zaWRlQ29tbWVudCA9IGZhbHNlO1xuXG4gICAgbGV0IGN1cnJlbnRMb2NhdGlvbiA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGNvbnRlbnQgZm9sbG93aW5nIHRoZSBjdXJyZW50IGxvY2F0aW9uIG1hdGNoZXMgdGhlIGRlc2lyZWQgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBkZXNpcmVkU3RyaW5nIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpc0F0U3RyaW5nKGRlc2lyZWRTdHJpbmc6IHN0cmluZykge1xuICAgICAgICBjb25zdCBpc0F0U3RyaW5nID0gY29udGVudC5zbGljZShjdXJyZW50TG9jYXRpb24sIGN1cnJlbnRMb2NhdGlvbiArIGRlc2lyZWRTdHJpbmcubGVuZ3RoKSA9PT0gZGVzaXJlZFN0cmluZztcblxuICAgICAgICBpZiAoaXNBdFN0cmluZykgY3VycmVudExvY2F0aW9uICs9IGRlc2lyZWRTdHJpbmcubGVuZ3RoO1xuXG4gICAgICAgIHJldHVybiBpc0F0U3RyaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFByb2NlZWRzIHRocm91Z2ggdGhlIGNvbnRlbnQgdW50aWwgdGhlIGRlc2lyZWQgc3RyaW5nIGlzIGZvdW5kLlxuICAgICAqIEBwYXJhbSBkZXNpcmVkU3RyaW5nIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBwcm9jZWVkVW50aWxTdHJpbmcoZGVzaXJlZFN0cmluZzogc3RyaW5nKSB7XG4gICAgICAgIHdoaWxlIChjdXJyZW50TG9jYXRpb24gPCBjb250ZW50Lmxlbmd0aCAmJiAhaXNBdFN0cmluZyhkZXNpcmVkU3RyaW5nKSkgY3VycmVudExvY2F0aW9uKys7XG4gICAgfVxuXG4gICAgd2hpbGUgKGN1cnJlbnRMb2NhdGlvbiA8IGNvbnRlbnQubGVuZ3RoKVxuICAgICAgICBpZiAoaXNBdFN0cmluZygnPG5vd2lraT4nKSkgaXNJbnNpZGVOb3dpa2kgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChpc0F0U3RyaW5nKCc8L25vd2lraT4nKSkgaXNJbnNpZGVOb3dpa2kgPSBmYWxzZTtcbiAgICAgICAgZWxzZSBpZiAoaXNBdFN0cmluZygnPCEtLScpKSBpc0luc2lkZUNvbW1lbnQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChpc0F0U3RyaW5nKCctLT4nKSkgaXNJbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gICAgICAgIGVsc2UgaWYgKCFpc0luc2lkZU5vd2lraSAmJiAhaXNJbnNpZGVDb21tZW50KVxuICAgICAgICAgICAgaWYgKCFpc0F0U3RyaW5nKCc8cmVmZXJlbmNlcycpICYmIGlzQXRTdHJpbmcoJzxyZWYnKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gY3VycmVudExvY2F0aW9uIC0gNDtcblxuICAgICAgICAgICAgICAgIHByb2NlZWRVbnRpbFN0cmluZygnPicpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgaXNTZWxmQ2xvc2luZyA9IGNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgLnNsaWNlKHN0YXJ0LCBjdXJyZW50TG9jYXRpb24gLSAxKVxuICAgICAgICAgICAgICAgICAgICAudHJpbSgpXG4gICAgICAgICAgICAgICAgICAgIC5lbmRzV2l0aCgnLycpO1xuXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlcy5wdXNoKGlzU2VsZkNsb3NpbmcgPyB7IHN0YXJ0LCBlbmQ6IGN1cnJlbnRMb2NhdGlvbiwgaXNTZWxmQ2xvc2luZyB9IDogeyBzdGFydCwgZW5kOiAtMSB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNBdFN0cmluZygnPC9yZWY+JykpIHJlZmVyZW5jZXMuYXQoLTEpIS5lbmQgPSBjdXJyZW50TG9jYXRpb247XG4gICAgICAgICAgICBlbHNlIGN1cnJlbnRMb2NhdGlvbisrO1xuICAgICAgICBlbHNlIGN1cnJlbnRMb2NhdGlvbisrO1xuXG4gICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xuXG4gICAgY29uc3QgcmVwbGFjZW1lbnRzOiBbc3RyaW5nLCBzdHJpbmddW10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxUZXh0ID0gY29udGVudC5zbGljZShyZWZlcmVuY2Uuc3RhcnQsIHJlZmVyZW5jZS5lbmQpO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0VGFnID0gLzxyZWYoPyFlcmVuY2VzKS4qPz4vaXMuZXhlYyhvcmlnaW5hbFRleHQpIVswXTtcblxuICAgICAgICBjb25zdCBwYXJzZWRUYWcgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKFxuICAgICAgICAgICAgcmVmZXJlbmNlLmlzU2VsZkNsb3NpbmcgPyBzdGFydFRhZy5yZXBsYWNlKC8gKlxcLyAqPi8sICcgLz4nKSA6IHN0YXJ0VGFnICsgJzwvcmVmPicsXG4gICAgICAgICAgICAndGV4dC9odG1sJyxcbiAgICAgICAgKS5ib2R5LmZpcnN0Q2hpbGQgYXMgSFRNTFVua25vd25FbGVtZW50O1xuXG4gICAgICAgIGxldCBvdXRwdXQgPSBwYXJzZWRUYWcub3V0ZXJIVE1MLnJlcGxhY2VBbGwoJyZhbXA7JywgJyYnKTtcblxuICAgICAgICBjb25zdCB0YWdDb250ZW50ID0gb3JpZ2luYWxUZXh0XG4gICAgICAgICAgICAuc2xpY2Uoc3RhcnRUYWcubGVuZ3RoLCAtNilcbiAgICAgICAgICAgIC50cmltKClcbiAgICAgICAgICAgIC5yZXBsYWNlQWxsKC9eXFxbICooW14gXFxdXSopICpdJC9nbSwgJyQxJylcbiAgICAgICAgICAgIC50cmltKCk7XG5cbiAgICAgICAgb3V0cHV0ID1cbiAgICAgICAgICAgIHJlZmVyZW5jZS5pc1NlbGZDbG9zaW5nIHx8IHRhZ0NvbnRlbnQubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgPyBvdXRwdXQucmVwbGFjZSgvPlxccyo8XFwvcmVmPi8sICcgLz4nKVxuICAgICAgICAgICAgICAgIDogYCR7b3V0cHV0LnNsaWNlKDAsIC02KX0ke3RhZ0NvbnRlbnR9PC9yZWY+YDtcblxuICAgICAgICBpZiAob3JpZ2luYWxUZXh0ICE9PSBvdXRwdXQpIHJlcGxhY2VtZW50cy5wdXNoKFtvcmlnaW5hbFRleHQsIG91dHB1dF0pO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW29yaWdpbmFsVGV4dCwgb3V0cHV0XSBvZiByZXBsYWNlbWVudHMpIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2Uob3JpZ2luYWxUZXh0LCBvdXRwdXQpO1xuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbmludGVyZmFjZSBUZW1wbGF0ZVJlZGlyZWN0IHtcbiAgICBmcm9tOiBzdHJpbmdbXTtcbiAgICB0bzogc3RyaW5nO1xufVxuXG5sZXQgdGVtcGxhdGVBbGlhc2VzOiBUZW1wbGF0ZVJlZGlyZWN0W10gfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogRm9ybWF0cyB0ZW1wbGF0ZSBzcGFjaW5nIGluIGFuIGFydGljbGUncyBjb250ZW50LlxuICogQHBhcmFtIGNvbnRlbnQgVGhlIGFydGljbGUgY29udGVudCB0byBmb3JtYXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZvcm1hdFRlbXBsYXRlcyhjb250ZW50OiBzdHJpbmcpIHtcbiAgICBlbnVtIEZvcm1hdFN0eWxlIHtcbiAgICAgICAgRXhwYW5kZWQsXG4gICAgICAgIEV4cGFuZGVkQWxpZ25lZCxcbiAgICAgICAgTWluaW1pemVkLFxuICAgICAgICBNaW5pbWl6ZWRTcGFjZWQsXG4gICAgfVxuXG4gICAgZW51bSBOYW1lc3BhY2Uge1xuICAgICAgICBVc2VyID0gMixcbiAgICAgICAgVGVtcGxhdGUgPSAxMCxcbiAgICAgICAgRHJhZnQgPSAxMTgsXG4gICAgfVxuXG4gICAgdGVtcGxhdGVBbGlhc2VzID8/PSBKU09OLnBhcnNlKChhd2FpdCBnZXRQYWdlQ29udGVudCgnVXNlcjpFZWppdDQzL3NjcmlwdHMvYXJ0aWNsZS1jbGVhbmVyLmpzb24nKSkgPz8gJ1tdJykgYXMgVGVtcGxhdGVSZWRpcmVjdFtdO1xuXG4gICAgY29uc3QgbWFwcGVkVGVtcGxhdGVBbGlhc2VzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICB0ZW1wbGF0ZUFsaWFzZXMuZmxhdE1hcCgoYWxpYXMpID0+IGFsaWFzLmZyb20ubWFwKChmcm9tKSA9PiBbZnJvbS5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSArIGZyb20uc2xpY2UoMSksIGFsaWFzLnRvXSkpLFxuICAgICk7XG5cbiAgICBjbGFzcyBUZW1wbGF0ZSB7XG4gICAgICAgIHB1YmxpYyBsb2NhdGlvbjogeyBzdGFydDogbnVtYmVyOyBlbmQ/OiBudW1iZXIgfTtcbiAgICAgICAgcHVibGljIGlzTmVzdGVkID0gZmFsc2U7XG5cbiAgICAgICAgcHVibGljIGZ1bGxUZXh0Pzogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIGZ1bGxUZXh0RXNjYXBlZD86IHN0cmluZztcbiAgICAgICAgcHJpdmF0ZSByYXdOYW1lPzogc3RyaW5nO1xuICAgICAgICBwcml2YXRlIG5hbWU/OiBzdHJpbmc7XG4gICAgICAgIHByaXZhdGUgcGFyYW1ldGVyczogeyBrZXk6IHN0cmluZyB8IG51bGw7IHZhbHVlOiBzdHJpbmcgfVtdID0gW107XG4gICAgICAgIHB1YmxpYyBzdWJUZW1wbGF0ZXM6IFRlbXBsYXRlW10gPSBbXTtcblxuICAgICAgICBwcml2YXRlIFBMQUNFSE9MREVSX1NUUklOR1MgPSBbJ1xcdXtGMDAwMH0nLCAnXFx1ezEwRkZGRn0nLCAnXFx1e0ZGRkZFfSddO1xuXG4gICAgICAgIHByaXZhdGUgUElQRV9FU0NBUEVfUkVHRVhFUyA9IFsvKFxcW1xcW1teXFxdXSo/KVxcfCguKj9dXSkvZywgLyg8IS0tLio/KVxcfCguKj8tLT4pL2csIC8oPG5vd2lraT4uKj8pXFx8KC4qPzxcXC9ub3dpa2k+KS9nXTtcblxuICAgICAgICBwcml2YXRlIFRBR19FUVVBTFNfRVNDQVBFX1JFR0VYRVMgPSBbLzwoXFx3KykoIFtePD5dKz8pKD88IVxcLyk+Lio/PFxcL1xcMT4vZywgLzwoXFx3KykoIFtePD5dKz8pXFwvPi9nXTtcblxuICAgICAgICBwcml2YXRlIFRFTVBMQVRFX0FMSUFTRVMgPSBtYXBwZWRUZW1wbGF0ZUFsaWFzZXM7XG5cbiAgICAgICAgcHJpdmF0ZSBERUZBVUxUX1RFTVBMQVRFX1NUWUxFUyA9IHtcbiAgICAgICAgICAgIFtGb3JtYXRTdHlsZS5FeHBhbmRlZEFsaWduZWRdOiBbXG4gICAgICAgICAgICAgICAgJ2FsYnVtIHJhdGluZycsXG4gICAgICAgICAgICAgICAgJ2FsYnVtIHJldmlld3MnLFxuICAgICAgICAgICAgICAgICdhbWVyaWNhbiBmb290YmFsbCB1bmlmb3JtJyxcbiAgICAgICAgICAgICAgICAnYXVzdHJhbGlhbiBydWxlcyBmb290YmFsbCBraXQnLFxuICAgICAgICAgICAgICAgICdhdXRvbWF0aWMgdGF4b2JveCcsXG4gICAgICAgICAgICAgICAgJ2Jhc2ViYWxsIHVuaWZvcm0nLFxuICAgICAgICAgICAgICAgICdiYXNrZXRiYWxsIGtpdCcsXG4gICAgICAgICAgICAgICAgJ2JlYWNoaGFuZGJhbGwga2l0JyxcbiAgICAgICAgICAgICAgICAnYmxvY2txdW90ZScsXG4gICAgICAgICAgICAgICAgJ2NoZW1ib3gnLFxuICAgICAgICAgICAgICAgICdjcmlja2V0IHVuaWZvcm0nLFxuICAgICAgICAgICAgICAgICdlbGVjdGlvbiBib3gnLFxuICAgICAgICAgICAgICAgICdlbWJsZW0gdGFibGUnLFxuICAgICAgICAgICAgICAgICdlcGlzb2RlIGxpc3QnLFxuICAgICAgICAgICAgICAgICdleHRlcm5hbCBtdXNpYyB2aWRlbycsXG4gICAgICAgICAgICAgICAgJ2V4dHJhIGFsYnVtIGNvdmVyJyxcbiAgICAgICAgICAgICAgICAnZmllbGQgaG9ja2V5IGtpdCcsXG4gICAgICAgICAgICAgICAgJ2Zvb3RiYWxsIGJveCcsXG4gICAgICAgICAgICAgICAgJ2Zvb3RiYWxsIGtpdCcsXG4gICAgICAgICAgICAgICAgJ2Zvb3RiYWxsYm94JyxcbiAgICAgICAgICAgICAgICAnZ2FsbGVyeScsXG4gICAgICAgICAgICAgICAgJ2hhbmRiYWxsIGtpdCcsXG4gICAgICAgICAgICAgICAgJ2h5YnJpZGJveCcsXG4gICAgICAgICAgICAgICAgJ2ljZWhvY2tleSBraXQnLFxuICAgICAgICAgICAgICAgICdpY2hub2JveCcsXG4gICAgICAgICAgICAgICAgJ2luZm9ib3gnLFxuICAgICAgICAgICAgICAgICdpbmZyYXNwZWNpZXNib3gnLFxuICAgICAgICAgICAgICAgICdqdWRvIGJyYWNrZXQnLFxuICAgICAgICAgICAgICAgICdqdWRvIHJlcGVjaGFnZScsXG4gICAgICAgICAgICAgICAgJ2xpc3RlbicsXG4gICAgICAgICAgICAgICAgJ2xvY2F0aW9uIG1hcCcsXG4gICAgICAgICAgICAgICAgJ21lZGljYWwgcmVzb3VyY2VzJyxcbiAgICAgICAgICAgICAgICAnbW90b3JzcG9ydCBzZWFzb24nLFxuICAgICAgICAgICAgICAgICdtdWx0aXBsZSBpbWFnZScsXG4gICAgICAgICAgICAgICAgJ211c2ljIHJhdGluZ3MnLFxuICAgICAgICAgICAgICAgICdteWNvbW9ycGhib3gnLFxuICAgICAgICAgICAgICAgICduYXZib3gnLFxuICAgICAgICAgICAgICAgICdvb2JveCcsXG4gICAgICAgICAgICAgICAgJ29yYml0Ym94JyxcbiAgICAgICAgICAgICAgICAnb3NtIGxvY2F0aW9uIG1hcCcsXG4gICAgICAgICAgICAgICAgJ3F1b3RlIGJveCcsXG4gICAgICAgICAgICAgICAgJ3JlcGVjaGFnZScsXG4gICAgICAgICAgICAgICAgJ3J1Z2J5Ym94JyxcbiAgICAgICAgICAgICAgICAnc2lkZWJhcicsXG4gICAgICAgICAgICAgICAgJ3NpbmdsZSByYXRpbmdzJyxcbiAgICAgICAgICAgICAgICAnc2luZ2xlcycsXG4gICAgICAgICAgICAgICAgJ3NvbmcgcmF0aW5ncycsXG4gICAgICAgICAgICAgICAgJ3NwZWNpZXNib3gnLFxuICAgICAgICAgICAgICAgICdzdGFyYm94JyxcbiAgICAgICAgICAgICAgICAnc3ViamVjdCBiYXInLFxuICAgICAgICAgICAgICAgICdzdWNjZXNzaW9uIGJveCcsXG4gICAgICAgICAgICAgICAgJ3RheG9ib3gnLFxuICAgICAgICAgICAgICAgICd0ZWFtIGJyYWNrZXQnLFxuICAgICAgICAgICAgICAgICd0cmFjayBsaXN0aW5nJyxcbiAgICAgICAgICAgICAgICAndHdlZXQnLFxuICAgICAgICAgICAgICAgICd2aXJ1c2JveCcsXG4gICAgICAgICAgICAgICAgJ3ZvbGxleWJhbGwga2l0JyxcbiAgICAgICAgICAgICAgICAnd2VhdGhlciBib3gnLFxuXG4gICAgICAgICAgICAgICAgLy8gTnVtYmVyZWQgYnJhY2tldHNcbiAgICAgICAgICAgICAgICAnbnRlYW1icmFja2V0JyxcbiAgICAgICAgICAgICAgICAnMm50ZWFtLW50ZWFtYnJhY2tldCcsXG4gICAgICAgICAgICAgICAgJzJ0ZWFtYnJhY2tldCcsXG4gICAgICAgICAgICAgICAgJzN0ZWFtYnJhY2tldCcsXG4gICAgICAgICAgICAgICAgJzN0ZWFtcnInLFxuICAgICAgICAgICAgICAgICc0dGVhbWJyYWNrZXQnLFxuICAgICAgICAgICAgICAgICc0dGVhbXJyJyxcbiAgICAgICAgICAgICAgICAnNXRlYW1icmFja2V0JyxcbiAgICAgICAgICAgICAgICAnNXRlYW1ycicsXG4gICAgICAgICAgICAgICAgJzZ0ZWFtYnJhY2tldCcsXG4gICAgICAgICAgICAgICAgJzZ0ZWFtcnInLFxuICAgICAgICAgICAgICAgICc3dGVhbWJyYWNrZXQnLFxuICAgICAgICAgICAgICAgICc3dGVhbXJyJyxcbiAgICAgICAgICAgICAgICAnOHRlYW1icmFja2V0JyxcbiAgICAgICAgICAgICAgICAnOHRlYW1yb3VuZHJvYmluJyxcbiAgICAgICAgICAgICAgICAnOHRlYW1ycicsXG4gICAgICAgICAgICAgICAgJzl0ZWFtYnJhY2tldCcsXG4gICAgICAgICAgICAgICAgJzEwdGVhbWJyYWNrZXQnLFxuICAgICAgICAgICAgICAgICcxMXRlYW1icmFja2V0JyxcbiAgICAgICAgICAgICAgICAnMTJ0ZWFtYnJhY2tldCcsXG4gICAgICAgICAgICAgICAgJzEzdGVhbWJyYWNrZXQnLFxuICAgICAgICAgICAgICAgICcxNHRlYW1icmFja2V0JyxcbiAgICAgICAgICAgICAgICAnMTV0ZWFtYnJhY2tldCcsXG4gICAgICAgICAgICAgICAgJzE2dGVhbWJyYWNrZXQnLFxuICAgICAgICAgICAgICAgICcxOHRlYW1icmFja2V0JyxcbiAgICAgICAgICAgICAgICAnMjB0ZWFtYnJhY2tldCcsXG4gICAgICAgICAgICAgICAgJzI0dGVhbWJyYWNrZXQnLFxuICAgICAgICAgICAgICAgICcyN3RlYW1icmFja2V0JyxcbiAgICAgICAgICAgICAgICAnMzJ0ZWFtYnJhY2tldCcsXG4gICAgICAgICAgICAgICAgJzQwdGVhbWJyYWNrZXQnLFxuICAgICAgICAgICAgICAgICc0OHRlYW1icmFja2V0JyxcbiAgICAgICAgICAgICAgICAnNjR0ZWFtYnJhY2tldCcsXG4gICAgICAgICAgICAgICAgJzEyOHRlYW1icmFja2V0JyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBbRm9ybWF0U3R5bGUuTWluaW1pemVkXTogWydiaXJ0aCBkYXRlJywgJ2Nvb3JkJywgJ2RlYXRoIGRhdGUnLCAnZW5kIGRhdGUnLCAnbGFuZycsICdzdGFydCBkYXRlJ10sXG4gICAgICAgICAgICBbRm9ybWF0U3R5bGUuTWluaW1pemVkU3BhY2VkXTogWydpbmZvYm94IG1hcGZyYW1lJ10sXG4gICAgICAgIH07XG5cbiAgICAgICAgcHJpdmF0ZSBOQU1FU1BBQ0VfU1BFQ0lGSUNfVEVNUExBVEVTID0ge1xuICAgICAgICAgICAgW05hbWVzcGFjZS5EcmFmdF06IFtcbiAgICAgICAgICAgICAgICAnYWZjIGNvbW1lbnQnLFxuICAgICAgICAgICAgICAgICdhZmMgc3VibWlzc2lvbicsXG4gICAgICAgICAgICAgICAgJ2FmYyBzdWJtaXNzaW9uL2RyYWZ0JyxcbiAgICAgICAgICAgICAgICAnYWZjIHRvcGljJyxcbiAgICAgICAgICAgICAgICAnZHJhZnQgYXJ0aWNsZScsXG4gICAgICAgICAgICAgICAgJ2RyYWZ0IGNhdGVnb3JpZXMnLFxuICAgICAgICAgICAgICAgICdkcmFmdCB0b3BpY3MnLFxuICAgICAgICAgICAgICAgICdkcmFmdCcsXG4gICAgICAgICAgICAgICAgJ2RyYWZ0cyBtb3ZlZCBmcm9tIG1haW5zcGFjZScsXG4gICAgICAgICAgICAgICAgJ3ByZWxvYWRkcmFmdCBzdWJtaXQnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFtOYW1lc3BhY2UuVXNlcl06IFsnZGFzaGJvYXJkLndpa2llZHUub3JnIHNhbmRib3gnLCAndXNlciBzYW5kYm94JywgJ3VzZXJzcGFjZSBkcmFmdCddLFxuICAgICAgICB9O1xuXG4gICAgICAgIHByaXZhdGUgVEVNUExBVEVTX1RPX0tFRVBfQ09OVEVOVCA9IFsnZHJhZnQgY2F0ZWdvcmllcyddO1xuXG4gICAgICAgIHByaXZhdGUgVEVNUExBVEVTX1RPX1NVQlNUID0gW1xuICAgICAgICAgICAgLy8gTWFnaWMgd29yZHNcbiAgICAgICAgICAgICdhcnRpY2xlcGFnZW5hbWUnLFxuICAgICAgICAgICAgJ2FydGljbGVzcGFjZScsXG4gICAgICAgICAgICAnYmFzZXBhZ2VuYW1lJyxcbiAgICAgICAgICAgICdmdWxscGFnZW5hbWUnLFxuICAgICAgICAgICAgJ25hbWVzcGFjZScsXG4gICAgICAgICAgICAnbmFtZXNwYWNlbnVtYmVyJyxcbiAgICAgICAgICAgICdwYWdlbmFtZScsXG4gICAgICAgICAgICAncm9vdHBhZ2VuYW1lJyxcbiAgICAgICAgICAgICdzdWJqZWN0cGFnZW5hbWUnLFxuICAgICAgICAgICAgJ3N1YmplY3RzcGFjZScsXG4gICAgICAgICAgICAnc3VicGFnZW5hbWUnLFxuICAgICAgICAgICAgJ3RhbGtwYWdlbmFtZScsXG4gICAgICAgICAgICAndGFsa3NwYWNlJyxcblxuICAgICAgICAgICAgLy8gVGVtcGxhdGVzXG4gICAgICAgICAgICAncGFnZW5hbWViYXNlJyxcbiAgICAgICAgXTtcblxuICAgICAgICBwcml2YXRlIElNQUdFX1BBUkFNRVRFUlMgPSBuZXcgU2V0KFsnY292ZXInLCAnaW1hZ2VfZmxhZycsICdpbWFnZV9zZWFsJywgJ2ltYWdlX3NreWxpbmUnLCAnaW1hZ2UnLCAnbG9nbycsICdtYXBfaW1hZ2UnXSk7XG5cbiAgICAgICAgcHJpdmF0ZSBJR05PUkVEX0lNQUdFX1NZTlRBWCA9IG5ldyBTZXQoW1xuICAgICAgICAgICAgLy8gVHlwZVxuICAgICAgICAgICAgJ3RodW1iJyxcbiAgICAgICAgICAgICd0aHVtYm5haWwnLFxuICAgICAgICAgICAgJ2ZyYW1lJyxcbiAgICAgICAgICAgICdmcmFtZWQnLFxuICAgICAgICAgICAgJ2ZyYW1lbGVzcycsXG4gICAgICAgICAgICAvLyBCb3JkZXJcbiAgICAgICAgICAgICdib3JkZXInLFxuICAgICAgICAgICAgJ3JpZ2h0JyxcbiAgICAgICAgICAgICdsZWZ0JyxcbiAgICAgICAgICAgICdjZW50ZXInLFxuICAgICAgICAgICAgJ25vbmUnLFxuICAgICAgICAgICAgLy8gQWxpZ25tZW50XG4gICAgICAgICAgICAnYmFzZWxpbmUnLFxuICAgICAgICAgICAgJ21pZGRsZScsXG4gICAgICAgICAgICAnc3ViJyxcbiAgICAgICAgICAgICdzdXBlcicsXG4gICAgICAgICAgICAndGV4dC10b3AnLFxuICAgICAgICAgICAgJ3RleHQtYm90dG9tJyxcbiAgICAgICAgICAgICd0b3AnLFxuICAgICAgICAgICAgJ2JvdHRvbScsXG4gICAgICAgIF0pO1xuXG4gICAgICAgIGNvbnN0cnVjdG9yKHN0YXJ0TG9jYXRpb246IG51bWJlcikge1xuICAgICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IHsgc3RhcnQ6IHN0YXJ0TG9jYXRpb24gfTtcblxuICAgICAgICAgICAgZm9yIChsZXQgbnVtYmVyID0gMTsgbnVtYmVyIDw9IDEwOyBudW1iZXIrKykgdGhpcy5JTUFHRV9QQVJBTUVURVJTLmFkZChgaW1hZ2Uke251bWJlcn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHB1YmxpYyBwYXJzZSgpIHtcbiAgICAgICAgICAgIHRoaXMuZnVsbFRleHQgPSBjb250ZW50LnNsaWNlKHRoaXMubG9jYXRpb24uc3RhcnQsIHRoaXMubG9jYXRpb24uZW5kKTtcbiAgICAgICAgICAgIHRoaXMuZnVsbFRleHRFc2NhcGVkID0gdGhpcy5mdWxsVGV4dDtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBzdWJUZW1wbGF0ZSBvZiB0aGlzLnN1YlRlbXBsYXRlcykge1xuICAgICAgICAgICAgICAgIHN1YlRlbXBsYXRlLnBhcnNlKCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmZ1bGxUZXh0RXNjYXBlZCA9IHRoaXMuZnVsbFRleHRFc2NhcGVkLnJlcGxhY2Uoc3ViVGVtcGxhdGUuZnVsbFRleHQhLCB0aGlzLlBMQUNFSE9MREVSX1NUUklOR1NbMF0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdHJpbW1lZElubmVyVGV4dCA9IHRoaXMuZnVsbFRleHRFc2NhcGVkLnNsaWNlKDIsIC0yKS50cmltKCk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcGlwZUVzY2FwZVJlZ2V4IG9mIHRoaXMuUElQRV9FU0NBUEVfUkVHRVhFUylcbiAgICAgICAgICAgICAgICB3aGlsZSAocGlwZUVzY2FwZVJlZ2V4LnRlc3QodHJpbW1lZElubmVyVGV4dCkpXG4gICAgICAgICAgICAgICAgICAgIHRyaW1tZWRJbm5lclRleHQgPSB0cmltbWVkSW5uZXJUZXh0LnJlcGxhY2VBbGwocGlwZUVzY2FwZVJlZ2V4LCBgJDEke3RoaXMuUExBQ0VIT0xERVJfU1RSSU5HU1sxXX0kMmApO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlZ2V4IG9mIHRoaXMuVEFHX0VRVUFMU19FU0NBUEVfUkVHRVhFUylcbiAgICAgICAgICAgICAgICB0cmltbWVkSW5uZXJUZXh0ID0gdHJpbW1lZElubmVyVGV4dC5yZXBsYWNlQWxsKHJlZ2V4LCAoZnVsbFRleHQsIHRhZ05hbWU6IHN0cmluZywgYXR0cmlidXRlczogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmdWxsVGV4dC5yZXBsYWNlKGF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMucmVwbGFjZUFsbCgnPScsIHRoaXMuUExBQ0VIT0xERVJfU1RSSU5HU1syXSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzID0gdHJpbW1lZElubmVyVGV4dFxuICAgICAgICAgICAgICAgIC5zcGxpdCgnfCcpXG4gICAgICAgICAgICAgICAgLm1hcCgocGFyYW1ldGVyKSA9PiBwYXJhbWV0ZXIucmVwbGFjZUFsbCh0aGlzLlBMQUNFSE9MREVSX1NUUklOR1NbMV0sICd8JykudHJpbSgpKTtcblxuICAgICAgICAgICAgdGhpcy5yYXdOYW1lID0gcGFyYW1ldGVycy5zaGlmdCgpITtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMucmF3TmFtZS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgLy8gU3RyaXAgbmFtZXNwYWNlIHByZWZpeCBmcm9tIG5hbWVcbiAgICAgICAgICAgIGlmICh0aGlzLm5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKCd0ZW1wbGF0ZTonKSkgdGhpcy5uYW1lID0gdGhpcy5uYW1lLnNsaWNlKDkpO1xuXG4gICAgICAgICAgICBjb25zdCBuYW1lTG93ZXJjYXNlRmlyc3QgPSB0aGlzLm5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyB0aGlzLm5hbWUuc2xpY2UoMSk7XG5cbiAgICAgICAgICAgIC8vIFJlc29sdmUgdGVtcGxhdGUgYWxpYXMgaW4gbmFtZVxuICAgICAgICAgICAgaWYgKG5hbWVMb3dlcmNhc2VGaXJzdCBpbiB0aGlzLlRFTVBMQVRFX0FMSUFTRVMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1N0YXJ0TG93ZXIgPSB0aGlzLm5hbWUuc3RhcnRzV2l0aCh0aGlzLm5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgZmluYWxOYW1lID0gdGhpcy5URU1QTEFURV9BTElBU0VTW25hbWVMb3dlcmNhc2VGaXJzdF07XG5cbiAgICAgICAgICAgICAgICBjb25zdCBtdXN0U3RhcnRCZVVwcGVyY2FzZSA9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsTmFtZS5zdGFydHNXaXRoKGZpbmFsTmFtZS5zbGljZSgwLCAyKS50b1VwcGVyQ2FzZSgpKSAmJiAvXltBLVpdKyQvLmV4ZWMoZmluYWxOYW1lLnNsaWNlKDAsIDIpKTtcblxuICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IGlzU3RhcnRMb3dlciAmJiAhbXVzdFN0YXJ0QmVVcHBlcmNhc2UgPyBmaW5hbE5hbWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyBmaW5hbE5hbWUuc2xpY2UoMSkgOiBmaW5hbE5hbWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNwbGl0UGFyYW1ldGVycyA9IHBhcmFtZXRlcnMubWFwKChwYXJhbWV0ZXJzKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXF1YWxzTG9jYXRpb24gPSBwYXJhbWV0ZXJzLmluZGV4T2YoJz0nKTtcblxuICAgICAgICAgICAgICAgIGlmIChlcXVhbHNMb2NhdGlvbiA9PT0gLTEpIHJldHVybiB7IGtleTogbnVsbCwgdmFsdWU6IHBhcmFtZXRlcnMucmVwbGFjZUFsbCh0aGlzLlBMQUNFSE9MREVSX1NUUklOR1NbMl0sICc9JykudHJpbSgpIH07XG5cbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcmFtZXRlcnMuc2xpY2UoZXF1YWxzTG9jYXRpb24gKyAxKS5yZXBsYWNlQWxsKHRoaXMuUExBQ0VIT0xERVJfU1RSSU5HU1syXSwgJz0nKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGtleTogcGFyYW1ldGVycy5zbGljZSgwLCBlcXVhbHNMb2NhdGlvbikudHJpbSgpLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYCR7dmFsdWUuc3RhcnRzV2l0aCgnXFxuJykgPyAnXFxuJyA6ICcnfSR7dmFsdWUudHJpbSgpfWAsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBzcGxpdFBhcmFtZXRlcnM7XG4gICAgICAgIH1cblxuICAgICAgICBwcml2YXRlIHNob3VsZEJlUmVtb3ZlZCgpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW25hbWVzcGFjZSwgdGVtcGxhdGVzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLk5BTUVTUEFDRV9TUEVDSUZJQ19URU1QTEFURVMpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgPT09IE51bWJlci5wYXJzZUludChuYW1lc3BhY2UpKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZXMuaW5jbHVkZXModGhpcy5uYW1lIS50b0xvd2VyQ2FzZSgpKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByaXZhdGUgZ2V0U3R5bGUoKSB7XG4gICAgICAgICAgICBsZXQgbW9zdFNwZWNpZmljRGVmYXVsdFN0eWxlUHJlZml4TGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGxldCBtb3N0U3BlY2lmaWNEZWZhdWx0U3R5bGVGb3JtYXRTdHlsZTogRm9ybWF0U3R5bGUgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgW2Zvcm1hdFN0eWxlLCB0ZW1wbGF0ZVByZWZpeGVzXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLkRFRkFVTFRfVEVNUExBVEVfU1RZTEVTKSlcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRlbXBsYXRlUHJlZml4IG9mIHRlbXBsYXRlUHJlZml4ZXMpXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZSEudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHRlbXBsYXRlUHJlZml4KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVQcmVmaXgubGVuZ3RoID49IG1vc3RTcGVjaWZpY0RlZmF1bHRTdHlsZVByZWZpeExlbmd0aFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vc3RTcGVjaWZpY0RlZmF1bHRTdHlsZVByZWZpeExlbmd0aCA9IHRlbXBsYXRlUHJlZml4Lmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vc3RTcGVjaWZpY0RlZmF1bHRTdHlsZUZvcm1hdFN0eWxlID0gTnVtYmVyLnBhcnNlSW50KGZvcm1hdFN0eWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbW9zdFNwZWNpZmljRGVmYXVsdFN0eWxlRm9ybWF0U3R5bGU7XG4gICAgICAgIH1cblxuICAgICAgICBwcml2YXRlIGNsZWFudXBQYXJhbWV0ZXJzKCkge1xuICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzLm1hcCgoeyBrZXksIHZhbHVlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoa2V5ICYmIHRoaXMuSU1BR0VfUEFSQU1FVEVSUy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZUJlZm9yZSA9IHZhbHVlO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdbWycpICYmIHZhbHVlLmVuZHNXaXRoKCddXScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbWFnZVBhcmFtZXRlcnMgPSB2YWx1ZS5zbGljZSgyLCAtMikuc3BsaXQoJ3wnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBpbWFnZVBhcmFtZXRlcnNbMF0udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9eKEZpbGV8SW1hZ2UpOi8sICcnKS5yZXBsYWNlQWxsKCdfJywgJyAnKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsRGF0YSA9IHZhbHVlQmVmb3JlXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMiwgLTIpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJ3wnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKChwYXJhbWV0ZXIpID0+ICF0aGlzLklHTk9SRURfSU1BR0VfU1lOVEFYLmhhcyhwYXJhbWV0ZXIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmpvaW4oJ3wnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbERhdGEubGVuZ3RoID4gMCkgdmFsdWUgKz0gYCA8IS0tIFByZXZpb3VzIGFkZGl0aW9uYWwgZGF0YTogXCIke2FkZGl0aW9uYWxEYXRhfVwiIC0tPmA7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsga2V5LCB2YWx1ZSB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwdWJsaWMgZm9ybWF0KCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZ1bGxUZXh0KSB0aGlzLnBhcnNlKCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnNob3VsZEJlUmVtb3ZlZCgpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLlRFTVBMQVRFU19UT19LRUVQX0NPTlRFTlQuaW5jbHVkZXModGhpcy5uYW1lIS50b0xvd2VyQ2FzZSgpKSA/IHRoaXMucGFyYW1ldGVyc1swXS52YWx1ZSA6ICcnO1xuXG4gICAgICAgICAgICBjb25zdCBzaG91bGRTdWJzdCA9XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgICAgIG13LmNvbmZpZy5nZXQoJ3dnTmFtZXNwYWNlTnVtYmVyJykgIT09IChOYW1lc3BhY2UuVGVtcGxhdGUgYXMgbnVtYmVyKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuVEVNUExBVEVTX1RPX1NVQlNULnNvbWUoXG4gICAgICAgICAgICAgICAgICAgIChuYW1lKSA9PiBuYW1lID09PSB0aGlzLm5hbWUhLnRvTG93ZXJDYXNlKCkgfHwgdGhpcy5uYW1lIS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoYCR7bmFtZX06YCksXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLmdldFN0eWxlKCk7XG4gICAgICAgICAgICBpZiAoc3R5bGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxldCBuZXdOYW1lID0gdGhpcy5uYW1lITtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uYW1lIS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ3RlbXBsYXRlOicpKSBuZXdOYW1lID0gdGhpcy5uYW1lIS5zbGljZSg5KTtcblxuICAgICAgICAgICAgICAgIGlmIChzaG91bGRTdWJzdCkgbmV3TmFtZSA9IGBzdWJzdDoke25ld05hbWV9YDtcblxuICAgICAgICAgICAgICAgIGlmIChuZXdOYW1lICE9PSB0aGlzLnJhd05hbWUhKSB0aGlzLmZ1bGxUZXh0RXNjYXBlZCA9IHRoaXMuZnVsbFRleHRFc2NhcGVkIS5yZXBsYWNlKHRoaXMucmF3TmFtZSEsIG5ld05hbWUpO1xuXG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdWJUZW1wbGF0ZSBvZiB0aGlzLnN1YlRlbXBsYXRlcylcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mdWxsVGV4dEVzY2FwZWQgPSB0aGlzLmZ1bGxUZXh0RXNjYXBlZCEucmVwbGFjZSh0aGlzLlBMQUNFSE9MREVSX1NUUklOR1NbMF0sIHN1YlRlbXBsYXRlLmZvcm1hdCgpKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZ1bGxUZXh0RXNjYXBlZCE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dCA9IFtge3ske3Nob3VsZFN1YnN0ID8gJ3N1YnN0OicgOiAnJ30ke3RoaXMubmFtZSF9YF07XG5cbiAgICAgICAgICAgIHRoaXMuY2xlYW51cFBhcmFtZXRlcnMoKTtcblxuICAgICAgICAgICAgaWYgKHN0eWxlID09PSBGb3JtYXRTdHlsZS5FeHBhbmRlZCB8fCBzdHlsZSA9PT0gRm9ybWF0U3R5bGUuRXhwYW5kZWRBbGlnbmVkKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlcXVpcmVkS2V5TGVuZ3RoID0gMDtcblxuICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PT0gRm9ybWF0U3R5bGUuRXhwYW5kZWRBbGlnbmVkKVxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZEtleUxlbmd0aCA9IE1hdGgubWF4KC4uLnRoaXMucGFyYW1ldGVycy5tYXAoKHBhcmFtZXRlcikgPT4gcGFyYW1ldGVyLmtleT8ubGVuZ3RoID8/IDApKTtcblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBwYXJhbWV0ZXJdIG9mIHRoaXMucGFyYW1ldGVycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgIXBhcmFtZXRlci5rZXkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFwYXJhbWV0ZXIudmFsdWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5zbGljZShpbmRleCArIDEpLmV2ZXJ5KChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci5rZXkgPz8gIXBhcmFtZXRlci52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goYHwgJHtwYXJhbWV0ZXIua2V5ID8gYCR7cGFyYW1ldGVyLmtleS5wYWRFbmQocmVxdWlyZWRLZXlMZW5ndGgpfSA9IGAgOiAnJ30ke3BhcmFtZXRlci52YWx1ZX1gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtpbmRleCwgcGFyYW1ldGVyXSBvZiB0aGlzLnBhcmFtZXRlcnMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICFwYXJhbWV0ZXIudmFsdWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbWV0ZXIua2V5IHx8IHRoaXMucGFyYW1ldGVycy5zbGljZShpbmRleCArIDEpLmV2ZXJ5KChwYXJhbWV0ZXIpID0+IHBhcmFtZXRlci5rZXkgPz8gIXBhcmFtZXRlci52YWx1ZSkpXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKGB8JHtwYXJhbWV0ZXIua2V5ID8gYCR7cGFyYW1ldGVyLmtleX09YCA6ICcnfSR7cGFyYW1ldGVyLnZhbHVlfWApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgb3V0cHV0LnB1c2goJ319Jyk7XG5cbiAgICAgICAgICAgIGlmIChvdXRwdXQubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0WzBdICs9ICd9fSc7XG5cbiAgICAgICAgICAgICAgICBvdXRwdXQucG9wKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlID09PSBGb3JtYXRTdHlsZS5NaW5pbWl6ZWRTcGFjZWQpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbb3V0cHV0Lmxlbmd0aCAtIDJdICs9ICd9fSc7XG5cbiAgICAgICAgICAgICAgICBvdXRwdXQucG9wKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBqb2luZWRPdXRwdXQgPSBvdXRwdXQuam9pbihcbiAgICAgICAgICAgICAgICBzdHlsZSA9PT0gRm9ybWF0U3R5bGUuRXhwYW5kZWQgfHwgc3R5bGUgPT09IEZvcm1hdFN0eWxlLkV4cGFuZGVkQWxpZ25lZFxuICAgICAgICAgICAgICAgICAgICA/ICdcXG4nXG4gICAgICAgICAgICAgICAgICAgIDogc3R5bGUgPT09IEZvcm1hdFN0eWxlLk1pbmltaXplZFNwYWNlZFxuICAgICAgICAgICAgICAgICAgICAgID8gJyAnXG4gICAgICAgICAgICAgICAgICAgICAgOiAnJyxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3ViVGVtcGxhdGUgb2YgdGhpcy5zdWJUZW1wbGF0ZXMpXG4gICAgICAgICAgICAgICAgam9pbmVkT3V0cHV0ID0gam9pbmVkT3V0cHV0LnJlcGxhY2UodGhpcy5QTEFDRUhPTERFUl9TVFJJTkdTWzBdLCBzdWJUZW1wbGF0ZS5mb3JtYXQoKSk7XG5cbiAgICAgICAgICAgIHJldHVybiBqb2luZWRPdXRwdXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhbGxUZW1wbGF0ZXM6IFRlbXBsYXRlW10gPSBbXTtcblxuICAgIGNvbnN0IGluc2lkZVRlbXBsYXRlczogVGVtcGxhdGVbXSA9IFtdO1xuICAgIGxldCBpc0luc2lkZUxpbmsgPSBmYWxzZTtcbiAgICBsZXQgaXNJbnNpZGVOb3dpa2kgPSBmYWxzZTtcbiAgICBsZXQgaXNJbnNpZGVDb21tZW50ID0gZmFsc2U7XG5cbiAgICBsZXQgY3VycmVudExvY2F0aW9uID0gMDtcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY29udGVudCBmb2xsb3dpbmcgdGhlIGN1cnJlbnQgbG9jYXRpb24gbWF0Y2hlcyB0aGUgZGVzaXJlZCBzdHJpbmcuXG4gICAgICogQHBhcmFtIGRlc2lyZWRTdHJpbmcgVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQXRTdHJpbmcoZGVzaXJlZFN0cmluZzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IGlzQXRTdHJpbmcgPSBjb250ZW50LnNsaWNlKGN1cnJlbnRMb2NhdGlvbiwgY3VycmVudExvY2F0aW9uICsgZGVzaXJlZFN0cmluZy5sZW5ndGgpID09PSBkZXNpcmVkU3RyaW5nO1xuXG4gICAgICAgIGlmIChpc0F0U3RyaW5nKSBjdXJyZW50TG9jYXRpb24gKz0gZGVzaXJlZFN0cmluZy5sZW5ndGg7XG5cbiAgICAgICAgcmV0dXJuIGlzQXRTdHJpbmc7XG4gICAgfVxuXG4gICAgd2hpbGUgKGN1cnJlbnRMb2NhdGlvbiA8IGNvbnRlbnQubGVuZ3RoKVxuICAgICAgICBpZiAoaXNBdFN0cmluZygnPG5vd2lraT4nKSkgaXNJbnNpZGVOb3dpa2kgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChpc0F0U3RyaW5nKCc8L25vd2lraT4nKSkgaXNJbnNpZGVOb3dpa2kgPSBmYWxzZTtcbiAgICAgICAgZWxzZSBpZiAoaXNBdFN0cmluZygnPCEtLScpKSBpc0luc2lkZUNvbW1lbnQgPSB0cnVlO1xuICAgICAgICBlbHNlIGlmIChpc0F0U3RyaW5nKCctLT4nKSkgaXNJbnNpZGVDb21tZW50ID0gZmFsc2U7XG4gICAgICAgIGVsc2UgaWYgKCFpc0luc2lkZU5vd2lraSAmJiAhaXNJbnNpZGVDb21tZW50KVxuICAgICAgICAgICAgaWYgKGlzQXRTdHJpbmcoJ1tbJykpIGlzSW5zaWRlTGluayA9IHRydWU7XG4gICAgICAgICAgICBlbHNlIGlmIChpc0luc2lkZUxpbmsgJiYgaXNBdFN0cmluZygnXV0nKSkgaXNJbnNpZGVMaW5rID0gZmFsc2U7XG4gICAgICAgICAgICBlbHNlIGlmIChpc0F0U3RyaW5nKCd7eycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBuZXcgVGVtcGxhdGUoY3VycmVudExvY2F0aW9uIC0gMik7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5zaWRlVGVtcGxhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuaXNOZXN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpbnNpZGVUZW1wbGF0ZXMuYXQoLTEpPy5zdWJUZW1wbGF0ZXMucHVzaCh0ZW1wbGF0ZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaW5zaWRlVGVtcGxhdGVzLnB1c2godGVtcGxhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0F0U3RyaW5nKCd9fScpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdFRlbXBsYXRlID0gaW5zaWRlVGVtcGxhdGVzLnBvcCgpO1xuICAgICAgICAgICAgICAgIGlmICghbGFzdFRlbXBsYXRlKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgIGxhc3RUZW1wbGF0ZS5sb2NhdGlvbi5lbmQgPSBjdXJyZW50TG9jYXRpb247XG5cbiAgICAgICAgICAgICAgICBhbGxUZW1wbGF0ZXMucHVzaChsYXN0VGVtcGxhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIGN1cnJlbnRMb2NhdGlvbisrO1xuICAgICAgICBlbHNlIGN1cnJlbnRMb2NhdGlvbisrO1xuXG4gICAgbGV0IG5ld0NvbnRlbnQgPSBjb250ZW50O1xuXG4gICAgZm9yIChjb25zdCB0ZW1wbGF0ZSBvZiBhbGxUZW1wbGF0ZXMpXG4gICAgICAgIGlmICghdGVtcGxhdGUuaXNOZXN0ZWQpIHtcbiAgICAgICAgICAgIHRlbXBsYXRlLnBhcnNlKCk7XG5cbiAgICAgICAgICAgIG5ld0NvbnRlbnQgPSBuZXdDb250ZW50LnJlcGxhY2UodGVtcGxhdGUuZnVsbFRleHQhLCB0ZW1wbGF0ZS5mb3JtYXQoKSk7XG4gICAgICAgIH1cblxuICAgIHJldHVybiBuZXdDb250ZW50O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdW5uZWNlc3NhcnkgY29tbWVudHMgZnJvbSBhbiBhcnRpY2xlJ3MgY29udGVudC5cbiAqIEBwYXJhbSBjb250ZW50IFRoZSBhcnRpY2xlIGNvbnRlbnQgdG8gY2xlYW4gdXAuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUNvbW1lbnRzKGNvbnRlbnQ6IHN0cmluZykge1xuICAgIGlmIChtdy5jb25maWcuZ2V0KCd3Z05hbWVzcGFjZU51bWJlcicpICE9PSAwKSByZXR1cm4gY29udGVudDtcblxuICAgIGNvbnN0IENPTU1FTlRTX1RPX1JFTU9WRSA9IFtcbiAgICAgICAgJ0RvIG5vdCByZW1vdmUgdGhpcyBsaW5lJyxcbiAgICAgICAgJ0VESVQgQkVMT1cgVEhJUyBMSU5FJyxcbiAgICAgICAgJ0ltcG9ydGFudCwgZG8gbm90IHJlbW92ZSBhbnl0aGluZyBhYm92ZSB0aGlzIGxpbmUgYmVmb3JlIGFydGljbGUgaGFzIGJlZW4gY3JlYXRlZCcsXG4gICAgICAgICdJbXBvcnRhbnQsIGRvIG5vdCByZW1vdmUgdGhpcyBsaW5lIGJlZm9yZSBhcnRpY2xlIGhhcyBiZWVuIGNyZWF0ZWQnLFxuICAgICAgICAnSW5saW5lIGNpdGF0aW9ucyBhZGRlZCB0byB5b3VyIGFydGljbGUgd2lsbCBhdXRvbWF0aWNhbGx5IGRpc3BsYXkgaGVyZScsXG4gICAgICAgICdOb3RlOiBUaGUgZm9sbG93aW5nIHBhZ2VzIHdlcmUgcmVkaXJlY3RzIHRvICcsXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgY29tbWVudCBvZiBDT01NRU5UU19UT19SRU1PVkUpXG4gICAgICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2VBbGwobmV3IFJlZ0V4cChgICo8IS0tID8ke2VzY2FwZVJlZ2V4Q2hhcmFjdGVycyhjb21tZW50KX0uKj8tLT4gKlxcbj9gLCAnZ3MnKSwgJycpO1xuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG59XG5cbi8qKlxuICogQWRkcyByZWxldmFudCB0YWdzIHRvIGFuIGFydGljbGUncyBjb250ZW50LlxuICogQHBhcmFtIGNvbnRlbnQgVGhlIGFydGljbGUgY29udGVudCB0byBhZGQgdGFncyB0by5cbiAqL1xuZnVuY3Rpb24gYXV0b1RhZ1BhZ2UoY29udGVudDogc3RyaW5nKSB7XG4gICAgY29uc3QgaXNPdXRzaWRlTWFpbnNwYWNlID0gbXcuY29uZmlnLmdldCgnd2dOYW1lc3BhY2VOdW1iZXInKSAhPT0gMDtcbiAgICBjb25zdCBpc0VkaXRpbmdTZWN0aW9uID0gISFuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgnc2VjdGlvbicpO1xuICAgIGNvbnN0IGlzRGlzYW1iaWd1YXRpb24gPSBtdy5jb25maWcuZ2V0KCd3Z0NhdGVnb3JpZXMnKS5pbmNsdWRlcygnQWxsIGRpc2FtYmlndWF0aW9uIHBhZ2VzJyk7XG4gICAgY29uc3QgaXNSZWRpcmVjdCA9IG13LmNvbmZpZy5nZXQoJ3dnSXNSZWRpcmVjdCcpO1xuXG4gICAgaWYgKGlzT3V0c2lkZU1haW5zcGFjZSB8fCBpc0VkaXRpbmdTZWN0aW9uIHx8IGlzRGlzYW1iaWd1YXRpb24gfHwgaXNSZWRpcmVjdCkgcmV0dXJuIGNvbnRlbnQ7XG5cbiAgICBjb25zdCBudW1iZXJPZkNhdGVnb3JpZXMgPSBbLi4uY29udGVudC5tYXRjaEFsbCgvXFxbXFxbQ2F0ZWdvcnk6L2cpXS5sZW5ndGg7XG5cbiAgICBjb250ZW50ID0gY29udGVudC5yZXBsYWNlQWxsKC9cXG4qe3sodW5jYXRlZ29yaXplZHxpbXByb3ZlIGNhdGVnb3JpZXMpKFxcfC4rPyk/fX0oe3t8XFxuK3wkKS9naSwgJycpO1xuXG4gICAgaWYgKG51bWJlck9mQ2F0ZWdvcmllcyA9PT0gMCAmJiAhL3t7dW5jYXRlZ29yaXplZC9pLnRlc3QoY29udGVudCkpXG4gICAgICAgIGNvbnRlbnQgKz0gJ1xcblxcbnt7VW5jYXRlZ29yaXplZHxkYXRlPXt7c3Vic3Q6Q1VSUkVOVE1PTlRITkFNRX19IHt7c3Vic3Q6Q1VSUkVOVFlFQVJ9fX19JztcbiAgICBlbHNlIGlmIChudW1iZXJPZkNhdGVnb3JpZXMgPT09IDEgJiYgIS97e2ltcHJvdmUgY2F0ZWdvcmllcy9pLnRlc3QoY29udGVudCkpXG4gICAgICAgIGNvbnRlbnQgKz0gJ1xcblxcbnt7SW1wcm92ZSBjYXRlZ29yaWVzfGRhdGU9e3tzdWJzdDpDVVJSRU5UTU9OVEhOQU1FfX0ge3tzdWJzdDpDVVJSRU5UWUVBUn19fX0nO1xuXG4gICAgcmV0dXJuIGNvbnRlbnQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7bUJBR08sSUFBTUEsRUFBTSxJQUFJLEdBQUcsSUFNMUIsZUFBc0JDLEVBQWVDLEVBQWUsQ0FDaEQsT0FDSyxNQUFNRixFQUFJLElBQUksQ0FDWCxPQUFRLFFBQ1IsY0FBZSxJQUNmLEtBQU0sWUFDTixPQUFRLFVBQ1IsUUFBUyxPQUNULE9BQVFFLENBQ1osQ0FBbUMsR0FDckMsTUFBTSxNQUFNLENBQUMsRUFBRSxZQUFZLENBQUMsRUFBRSxNQUFNLEtBQUssUUFBUSxLQUFLLENBQzVELEVDY0MsSUFBTSxDQUVILEdBREksR0FBRyxPQUFPLElBQUksbUJBQW1CLEVBQUksR0FDckMsQ0FBQyxHQUFHLE9BQU8sSUFBSSxzQkFBc0IsRUFBRyxPQUU1QyxJQUFNQyxFQUFlLENBQUMsaUJBQWtCLHNCQUFzQixFQUUxRCxHQUFHLE9BQU8sSUFBSSxNQUFNLElBQU0sV0FBV0EsRUFBYSxLQUFLLHVCQUF1QixFQUVsRixHQUFHLE9BQU8sTUFBTUEsRUFBYyxJQUFNLENBQ2hDLElBQUlDLEVBQXlCLEdBRXZCQyxFQUFpQiw0RkFNdkIsU0FBU0MsRUFBY0MsRUFBa0QsQ0FFckUsV0FBVyxJQUFNLENBQ1JBLEVBQVMsTUFBTSxTQUFTRixFQUFlLE1BQU0sQ0FBQyxDQUFDLElBQ2hERSxFQUFTLE9BQ0xBLEVBQVMsT0FBUyxDQUFDQSxFQUFTLE1BQU0sV0FBVyxLQUFLLEdBQUssQ0FBQ0EsRUFBUyxNQUFNLFNBQVMsTUFBTSxFQUNoRixLQUFLRixF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QUksbUJBQW1CLElBQU0sRUFDNURDLEVBQW1CLENBQUMsQ0FBQyxJQUFJLGdCQUFnQixPQUFPLFNBQVMsTUFBTSxFQUFFLElBQUksU0FBUyxFQUM5RUMsRUFBbUIsR0FBRyxPQUFPLElBQUksY0FBYyxFQUFFLFNBQVMsMEJBQTBCLEVBQ3BGQyxFQUFhLEdBQUcsT0FBTyxJQUFJLGNBQWMsRUFFL0MsR0FBSUgsR0FBc0JDLEdBQW9CQyxHQUFvQkMsRUFBWSxPQUFPdkksRUFFckYsSUFBTXdJLEVBQXFCLENBQUMsR0FBR3hJLEVBQVEsU0FBUyxnQkFBZ0IsQ0FBQyxFQUFFLE9BRW5FLE9BQUFBLEVBQVVBLEVBQVEsV0FBVyxnRUFBaUUsRUFBRSxFQUU1RndJLElBQXVCLEdBQUssQ0FBQyxtQkFBbUIsS0FBS3hJLENBQU8sRUFDNURBLEdBQVc7QUFBQTtBQUFBLHlFQUNOd0ksSUFBdUIsR0FBSyxDQUFDLHdCQUF3QixLQUFLeEksQ0FBTyxJQUN0RUEsR0FBVztBQUFBO0FBQUEsK0VBRVJBLENBQ1giLAogICJuYW1lcyI6IFsiYXBpIiwgImdldFBhZ2VDb250ZW50IiwgInRpdGxlIiwgImRlcGVuZGVuY2llcyIsICJzaG91bGRBZGRTY3JpcHRNZXNzYWdlIiwgIlNDUklQVF9NRVNTQUdFIiwgInVwZGF0ZVN1bW1hcnkiLCAidGV4dGFyZWEiLCAiaGFuZGxlQWN0aXZhdGlvbiIsICJldmVudCIsICJlZGl0b3IiLCAib3JpZ2luYWxUZXh0IiwgImZpbmFsVGV4dCIsICJjbGVhbnVwU3RyYXlVbmljb2RlQ2hhcmFjdGVycyIsICJjbGVhbnVwU2VjdGlvbkhlYWRlcnMiLCAiY2xlYW51cE1hZ2ljV29yZHMiLCAiY2xlYW51cERpc3BsYXl0aXRsZXNBbmREZWZhdWx0c29ydHMiLCAiY2xlYW51cENhdGVnb3JpZXMiLCAiY2xlYW51cExpbmtzIiwgImNsZWFudXBJbXByb3BlckNoYXJhY3RlcnMiLCAiY2xlYW51cFllYXJSYW5nZXMiLCAiY2xlYW51cFN0cmF5TWFya3VwIiwgImNsZWFudXBTcGFjaW5nIiwgImNsZWFudXBSZWZlcmVuY2VzIiwgImZvcm1hdFRlbXBsYXRlcyIsICJyZW1vdmVDb21tZW50cyIsICJhdXRvVGFnUGFnZSIsICJzdXJmYWNlTW9kZWwiLCAic3VtbWFyeUlucHV0IiwgImhlYWRlclN3aXRjaGVyIiwgImJ1dHRvbiIsICJjb250ZW50IiwgImVzY2FwZVJlZ2V4Q2hhcmFjdGVycyIsICJzdHJpbmciLCAiU1RSQVlfVU5JQ09ERV9SRUdFWCIsICJDT01NT05fUkVQTEFDRU1FTlRTIiwgIkNPTU1PTl9NSVNDQVBJVEFMSVpFRF9XT1JEUyIsICJyZXZlcnNlQ29tbW9uUmVwbGFjZW1lbnRzIiwgImtleSIsICJ2YWx1ZXMiLCAidmFsdWUiLCAicGFyc2VkSGVhZGVycyIsICJoZWFkZXIiLCAibmFtZSIsICJzdGFydE1hcmt1cCIsICJlbmRNYXJrdXAiLCAibGlua3MiLCAibGluayIsICJkZXB0aCIsICJoZWFkZXJzU2V0IiwgInRpdGxlU3BhY2VyIiwgImxvd2VyY2FzZU5hbWUiLCAiY2FwaXRhbGl6ZWROYW1lIiwgIndvcmQiLCAib3V0cHV0IiwgInBhcnNlZFRhZ3MiLCAidGFnIiwgImZ1bGxUYWciLCAidHlwZSIsICJjdXJyZW50VGl0bGUiLCAib3JpZ2luYWxUYWdSZWdleCIsICJ1bnByZWZpeGVkVGl0bGUiLCAidGl0bGUiLCAiZGVmYXVsdEtleSIsICJjdXN0b21LZXkiLCAibmV3VGV4dCIsICJmdW5jdGlvbnNDYWxsZWRXaGlsZUVzY2FwZWQiLCAiY2xvc2VkTGlua3MiLCAiaXNJbnNpZGVOb3dpa2kiLCAiaXNJbnNpZGVDb21tZW50IiwgImN1cnJlbnRMb2NhdGlvbiIsICJpc0F0U3RyaW5nIiwgImRlc2lyZWRTdHJpbmciLCAic2hvdWxkSW5jcmVtZW50IiwgImxhc3RMaW5rIiwgIm5ld0xpbmtDb250ZW50IiwgIm5hbWVzcGFjZU5hbWVzIiwgImxpbmtMb2NhdGlvbiIsICJpbm5lckxpbmsiLCAidW5wYXJzZWRMaW5rIiwgInBhcmFtZXRlcnMiLCAiYWx0VGV4dCIsICJpc0ZpcnN0Q2hhcmFjdGVyQ29sb24iLCAic2hvdWxkRmlyc3RDaGFyYWN0ZXJCZUNvbG9uIiwgImxpbmtVcHBlcmNhc2VTdGFydCIsICJsaW5rTG93ZXJjYXNlU3RhcnQiLCAibmFtZXNwYWNlIiwgImJlZm9yZUxpbmtUZXh0IiwgImFmdGVyTGlua1RleHQiLCAibWF0Y2hlZE1hcmt1cCIsICJhZGRlZFB1bmN0dWF0aW9uIiwgIm5ld0xpbmsiLCAiZnVuY3Rpb25Ub0NhbGwiLCAibG9vcENvdW50ZXIiLCAibGlua0RhdGEiLCAibGlua0NvbnRlbnQiLCAicnVuIiwgIm9yaWdpbmFsIiwgInN0YXJ0IiwgImVuZCIsICJTVFJBWV9NQVJLVVBfUkVHRVhFUyIsICJyZWdleCIsICJzZWNvbmRSdW4iLCAiVEFHU19UT19JR05PUkUiLCAiaWdub3JlZFRhZ3NDb250ZW50IiwgImZ1bGxNYXRjaCIsICJzdGFydFRhZyIsICJ0YWdOYW1lIiwgImlubmVyQ29udGVudCIsICJlbmRUYWciLCAidGFnQ29udGVudCIsICJyZWZlcmVuY2VUYWciLCAicHVuY3R1YXRpb24iLCAicmVmZXJlbmNlcyIsICJwcm9jZWVkVW50aWxTdHJpbmciLCAiaXNTZWxmQ2xvc2luZyIsICJwYXJzZXIiLCAicmVwbGFjZW1lbnRzIiwgInJlZmVyZW5jZSIsICJ0ZW1wbGF0ZUFsaWFzZXMiLCAiRm9ybWF0U3R5bGUiLCAiTmFtZXNwYWNlIiwgImdldFBhZ2VDb250ZW50IiwgIm1hcHBlZFRlbXBsYXRlQWxpYXNlcyIsICJhbGlhcyIsICJmcm9tIiwgIlRlbXBsYXRlIiwgInN0YXJ0TG9jYXRpb24iLCAibnVtYmVyIiwgInN1YlRlbXBsYXRlIiwgInRyaW1tZWRJbm5lclRleHQiLCAicGlwZUVzY2FwZVJlZ2V4IiwgImZ1bGxUZXh0IiwgImF0dHJpYnV0ZXMiLCAicGFyYW1ldGVyIiwgIm5hbWVMb3dlcmNhc2VGaXJzdCIsICJpc1N0YXJ0TG93ZXIiLCAiZmluYWxOYW1lIiwgIm11c3RTdGFydEJlVXBwZXJjYXNlIiwgInNwbGl0UGFyYW1ldGVycyIsICJlcXVhbHNMb2NhdGlvbiIsICJ0ZW1wbGF0ZXMiLCAibW9zdFNwZWNpZmljRGVmYXVsdFN0eWxlUHJlZml4TGVuZ3RoIiwgIm1vc3RTcGVjaWZpY0RlZmF1bHRTdHlsZUZvcm1hdFN0eWxlIiwgImZvcm1hdFN0eWxlIiwgInRlbXBsYXRlUHJlZml4ZXMiLCAidGVtcGxhdGVQcmVmaXgiLCAidmFsdWVCZWZvcmUiLCAiYWRkaXRpb25hbERhdGEiLCAic2hvdWxkU3Vic3QiLCAic3R5bGUiLCAibmV3TmFtZSIsICJyZXF1aXJlZEtleUxlbmd0aCIsICJpbmRleCIsICJqb2luZWRPdXRwdXQiLCAiYWxsVGVtcGxhdGVzIiwgImluc2lkZVRlbXBsYXRlcyIsICJpc0luc2lkZUxpbmsiLCAidGVtcGxhdGUiLCAibGFzdFRlbXBsYXRlIiwgIm5ld0NvbnRlbnQiLCAiQ09NTUVOVFNfVE9fUkVNT1ZFIiwgImNvbW1lbnQiLCAiaXNPdXRzaWRlTWFpbnNwYWNlIiwgImlzRWRpdGluZ1NlY3Rpb24iLCAiaXNEaXNhbWJpZ3VhdGlvbiIsICJpc1JlZGlyZWN0IiwgIm51bWJlck9mQ2F0ZWdvcmllcyJdCn0K