Files
logseq/resources/js/lsplugin.core.js
2021-06-29 17:55:21 +08:00

3 lines
453 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*! For license information please see lsplugin.core.js.LICENSE.txt */
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.LSPlugin=t():e.LSPlugin=t()}(self,(function(){return(()=>{var e={227:(e,t,n)=>{var r=n(155);t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,i=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(i=r))})),t.splice(i,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}return!e&&void 0!==r&&"env"in r&&(e=r.env.DEBUG),e},t.useColors=function(){return!("undefined"==typeof window||!window.process||"renderer"!==window.process.type&&!window.process.__nwjs)||("undefined"==typeof navigator||!navigator.userAgent||!navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))&&("undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/))},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=n(447)(t);const{formatters:i}=e.exports;i.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}},447:(e,t,n)=>{e.exports=function(e){function t(e){let n,i=null;function o(...e){if(!o.enabled)return;const r=o,i=Number(new Date),s=i-(n||i);r.diff=s,r.prev=n,r.curr=i,n=i,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let a=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((n,i)=>{if("%%"===n)return"%";a++;const o=t.formatters[i];if("function"==typeof o){const t=e[a];n=o.call(r,t),e.splice(a,1),a--}return n})),t.formatArgs.call(r,e),(r.log||t.log).apply(r,e)}return o.namespace=e,o.useColors=t.useColors(),o.color=t.selectColor(e),o.extend=r,o.destroy=t.destroy,Object.defineProperty(o,"enabled",{enumerable:!0,configurable:!1,get:()=>null===i?t.enabled(e):i,set:e=>{i=e}}),"function"==typeof t.init&&t.init(o),o}function r(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function i(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){return e instanceof Error?e.stack||e.message:e},t.disable=function(){const e=[...t.names.map(i),...t.skips.map(i).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),i=r.length;for(n=0;n<i;n++)r[n]&&("-"===(e=r[n].replace(/\*/g,".*?"))[0]?t.skips.push(new RegExp("^"+e.substr(1)+"$")):t.names.push(new RegExp("^"+e+"$")))},t.enabled=function(e){if("*"===e[e.length-1])return!0;let n,r;for(n=0,r=t.skips.length;n<r;n++)if(t.skips[n].test(e))return!1;for(n=0,r=t.names.length;n<r;n++)if(t.names[n].test(e))return!0;return!1},t.humanize=n(824),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach((n=>{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t<e.length;t++)n=(n<<5)-n+e.charCodeAt(t),n|=0;return t.colors[Math.abs(n)%t.colors.length]},t.enable(t.load()),t}},856:function(e){e.exports=function(){"use strict";var e=Object.hasOwnProperty,t=Object.setPrototypeOf,n=Object.isFrozen,r=Object.getPrototypeOf,i=Object.getOwnPropertyDescriptor,o=Object.freeze,s=Object.seal,a=Object.create,l="undefined"!=typeof Reflect&&Reflect,c=l.apply,u=l.construct;c||(c=function(e,t,n){return e.apply(t,n)}),o||(o=function(e){return e}),s||(s=function(e){return e}),u||(u=function(e,t){return new(Function.prototype.bind.apply(e,[null].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}(t))))});var d,h=C(Array.prototype.forEach),p=C(Array.prototype.pop),f=C(Array.prototype.push),m=C(String.prototype.toLowerCase),g=C(String.prototype.match),y=C(String.prototype.replace),v=C(String.prototype.indexOf),b=C(String.prototype.trim),_=C(RegExp.prototype.test),w=(d=TypeError,function(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];return u(d,t)});function C(e){return function(t){for(var n=arguments.length,r=Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];return c(e,t,r)}}function x(e,r){t&&t(e,null);for(var i=r.length;i--;){var o=r[i];if("string"==typeof o){var s=m(o);s!==o&&(n(r)||(r[i]=s),o=s)}e[o]=!0}return e}function A(t){var n=a(null),r=void 0;for(r in t)c(e,t,[r])&&(n[r]=t[r]);return n}function S(e,t){for(;null!==e;){var n=i(e,t);if(n){if(n.get)return C(n.get);if("function"==typeof n.value)return C(n.value)}e=r(e)}return function(e){return console.warn("fallback value for",e),null}}var T=o(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),E=o(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),O=o(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),k=o(["animate","color-profile","cursor","discard","fedropshadow","feimage","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),L=o(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover"]),F=o(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),M=o(["#text"]),j=o(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","xmlns"]),P=o(["accent-height","accumulate","additive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),I=o(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),R=o(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),N=s(/\{\{[\s\S]*|[\s\S]*\}\}/gm),D=s(/<%[\s\S]*|[\s\S]*%>/gm),U=s(/^data-[\-\w.\u00B7-\uFFFF]/),z=s(/^aria-[\-\w]+$/),$=s(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),H=s(/^(?:\w+script|data):/i),W=s(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),B="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function G(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}var J=function(){return"undefined"==typeof window?null:window},q=function(e,t){if("object"!==(void 0===e?"undefined":B(e))||"function"!=typeof e.createPolicy)return null;var n=null,r="data-tt-policy-suffix";t.currentScript&&t.currentScript.hasAttribute(r)&&(n=t.currentScript.getAttribute(r));var i="dompurify"+(n?"#"+n:"");try{return e.createPolicy(i,{createHTML:function(e){return e}})}catch(e){return console.warn("TrustedTypes policy "+i+" could not be created."),null}};return function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:J(),n=function(t){return e(t)};if(n.version="2.2.7",n.removed=[],!t||!t.document||9!==t.document.nodeType)return n.isSupported=!1,n;var r=t.document,i=t.document,s=t.DocumentFragment,a=t.HTMLTemplateElement,l=t.Node,c=t.Element,u=t.NodeFilter,d=t.NamedNodeMap,C=void 0===d?t.NamedNodeMap||t.MozNamedAttrMap:d,Z=t.Text,V=t.Comment,K=t.DOMParser,Y=t.trustedTypes,X=c.prototype,Q=S(X,"cloneNode"),ee=S(X,"nextSibling"),te=S(X,"childNodes"),ne=S(X,"parentNode");if("function"==typeof a){var re=i.createElement("template");re.content&&re.content.ownerDocument&&(i=re.content.ownerDocument)}var ie=q(Y,r),oe=ie&&Ne?ie.createHTML(""):"",se=i,ae=se.implementation,le=se.createNodeIterator,ce=se.getElementsByTagName,ue=se.createDocumentFragment,de=r.importNode,he={};try{he=A(i).documentMode?i.documentMode:{}}catch(e){}var pe={};n.isSupported="function"==typeof ne&&ae&&void 0!==ae.createHTMLDocument&&9!==he;var fe=N,me=D,ge=U,ye=z,ve=H,be=W,_e=$,we=null,Ce=x({},[].concat(G(T),G(E),G(O),G(L),G(M))),xe=null,Ae=x({},[].concat(G(j),G(P),G(I),G(R))),Se=null,Te=null,Ee=!0,Oe=!0,ke=!1,Le=!1,Fe=!1,Me=!1,je=!1,Pe=!1,Ie=!1,Re=!0,Ne=!1,De=!0,Ue=!0,ze=!1,$e={},He=x({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]),We=null,Be=x({},["audio","video","img","source","image","track"]),Ge=null,Je=x({},["alt","class","for","id","label","name","pattern","placeholder","summary","title","value","style","xmlns"]),qe=null,Ze=i.createElement("form"),Ve=function(e){qe&&qe===e||(e&&"object"===(void 0===e?"undefined":B(e))||(e={}),e=A(e),we="ALLOWED_TAGS"in e?x({},e.ALLOWED_TAGS):Ce,xe="ALLOWED_ATTR"in e?x({},e.ALLOWED_ATTR):Ae,Ge="ADD_URI_SAFE_ATTR"in e?x(A(Je),e.ADD_URI_SAFE_ATTR):Je,We="ADD_DATA_URI_TAGS"in e?x(A(Be),e.ADD_DATA_URI_TAGS):Be,Se="FORBID_TAGS"in e?x({},e.FORBID_TAGS):{},Te="FORBID_ATTR"in e?x({},e.FORBID_ATTR):{},$e="USE_PROFILES"in e&&e.USE_PROFILES,Ee=!1!==e.ALLOW_ARIA_ATTR,Oe=!1!==e.ALLOW_DATA_ATTR,ke=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Le=e.SAFE_FOR_TEMPLATES||!1,Fe=e.WHOLE_DOCUMENT||!1,Pe=e.RETURN_DOM||!1,Ie=e.RETURN_DOM_FRAGMENT||!1,Re=!1!==e.RETURN_DOM_IMPORT,Ne=e.RETURN_TRUSTED_TYPE||!1,je=e.FORCE_BODY||!1,De=!1!==e.SANITIZE_DOM,Ue=!1!==e.KEEP_CONTENT,ze=e.IN_PLACE||!1,_e=e.ALLOWED_URI_REGEXP||_e,Le&&(Oe=!1),Ie&&(Pe=!0),$e&&(we=x({},[].concat(G(M))),xe=[],!0===$e.html&&(x(we,T),x(xe,j)),!0===$e.svg&&(x(we,E),x(xe,P),x(xe,R)),!0===$e.svgFilters&&(x(we,O),x(xe,P),x(xe,R)),!0===$e.mathMl&&(x(we,L),x(xe,I),x(xe,R))),e.ADD_TAGS&&(we===Ce&&(we=A(we)),x(we,e.ADD_TAGS)),e.ADD_ATTR&&(xe===Ae&&(xe=A(xe)),x(xe,e.ADD_ATTR)),e.ADD_URI_SAFE_ATTR&&x(Ge,e.ADD_URI_SAFE_ATTR),Ue&&(we["#text"]=!0),Fe&&x(we,["html","head","body"]),we.table&&(x(we,["tbody"]),delete Se.tbody),o&&o(e),qe=e)},Ke=x({},["mi","mo","mn","ms","mtext"]),Ye=x({},["foreignobject","desc","title","annotation-xml"]),Xe=x({},E);x(Xe,O),x(Xe,k);var Qe=x({},L);x(Qe,F);var et="http://www.w3.org/1998/Math/MathML",tt="http://www.w3.org/2000/svg",nt="http://www.w3.org/1999/xhtml",rt=function(e){var t=ne(e);t&&t.tagName||(t={namespaceURI:nt,tagName:"template"});var n=m(e.tagName),r=m(t.tagName);if(e.namespaceURI===tt)return t.namespaceURI===nt?"svg"===n:t.namespaceURI===et?"svg"===n&&("annotation-xml"===r||Ke[r]):Boolean(Xe[n]);if(e.namespaceURI===et)return t.namespaceURI===nt?"math"===n:t.namespaceURI===tt?"math"===n&&Ye[r]:Boolean(Qe[n]);if(e.namespaceURI===nt){if(t.namespaceURI===tt&&!Ye[r])return!1;if(t.namespaceURI===et&&!Ke[r])return!1;var i=x({},["title","style","font","a","script"]);return!Qe[n]&&(i[n]||!Xe[n])}return!1},it=function(e){f(n.removed,{element:e});try{e.parentNode.removeChild(e)}catch(t){try{e.outerHTML=oe}catch(t){e.remove()}}},ot=function(e,t){try{f(n.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){f(n.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!xe[e])if(Pe||Ie)try{it(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},st=function(e){var t=void 0,n=void 0;if(je)e="<remove></remove>"+e;else{var r=g(e,/^[\r\n\t ]+/);n=r&&r[0]}var o=ie?ie.createHTML(e):e;try{t=(new K).parseFromString(o,"text/html")}catch(e){}if(!t||!t.documentElement){var s=(t=ae.createHTMLDocument("")).body;s.parentNode.removeChild(s.parentNode.firstElementChild),s.outerHTML=o}return e&&n&&t.body.insertBefore(i.createTextNode(n),t.body.childNodes[0]||null),ce.call(t,Fe?"html":"body")[0]},at=function(e){return le.call(e.ownerDocument||e,e,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT,(function(){return u.FILTER_ACCEPT}),!1)},lt=function(e){return!(e instanceof Z||e instanceof V||"string"==typeof e.nodeName&&"string"==typeof e.textContent&&"function"==typeof e.removeChild&&e.attributes instanceof C&&"function"==typeof e.removeAttribute&&"function"==typeof e.setAttribute&&"string"==typeof e.namespaceURI&&"function"==typeof e.insertBefore)},ct=function(e){return"object"===(void 0===l?"undefined":B(l))?e instanceof l:e&&"object"===(void 0===e?"undefined":B(e))&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName},ut=function(e,t,r){pe[e]&&h(pe[e],(function(e){e.call(n,t,r,qe)}))},dt=function(e){var t=void 0;if(ut("beforeSanitizeElements",e,null),lt(e))return it(e),!0;if(g(e.nodeName,/[\u0080-\uFFFF]/))return it(e),!0;var r=m(e.nodeName);if(ut("uponSanitizeElement",e,{tagName:r,allowedTags:we}),!ct(e.firstElementChild)&&(!ct(e.content)||!ct(e.content.firstElementChild))&&_(/<[/\w]/g,e.innerHTML)&&_(/<[/\w]/g,e.textContent))return it(e),!0;if(!we[r]||Se[r]){if(Ue&&!He[r]){var i=ne(e),o=te(e);if(o&&i)for(var s=o.length-1;s>=0;--s)i.insertBefore(Q(o[s],!0),ee(e))}return it(e),!0}return e instanceof c&&!rt(e)?(it(e),!0):"noscript"!==r&&"noembed"!==r||!_(/<\/no(script|embed)/i,e.innerHTML)?(Le&&3===e.nodeType&&(t=e.textContent,t=y(t,fe," "),t=y(t,me," "),e.textContent!==t&&(f(n.removed,{element:e.cloneNode()}),e.textContent=t)),ut("afterSanitizeElements",e,null),!1):(it(e),!0)},ht=function(e,t,n){if(De&&("id"===t||"name"===t)&&(n in i||n in Ze))return!1;if(Oe&&_(ge,t));else if(Ee&&_(ye,t));else{if(!xe[t]||Te[t])return!1;if(Ge[t]);else if(_(_e,y(n,be,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==v(n,"data:")||!We[e])if(ke&&!_(ve,y(n,be,"")));else if(n)return!1}return!0},pt=function(e){var t=void 0,r=void 0,i=void 0,o=void 0;ut("beforeSanitizeAttributes",e,null);var s=e.attributes;if(s){var a={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:xe};for(o=s.length;o--;){var l=t=s[o],c=l.name,u=l.namespaceURI;if(r=b(t.value),i=m(c),a.attrName=i,a.attrValue=r,a.keepAttr=!0,a.forceKeepAttr=void 0,ut("uponSanitizeAttribute",e,a),r=a.attrValue,!a.forceKeepAttr&&(ot(c,e),a.keepAttr))if(_(/\/>/i,r))ot(c,e);else{Le&&(r=y(r,fe," "),r=y(r,me," "));var d=e.nodeName.toLowerCase();if(ht(d,i,r))try{u?e.setAttributeNS(u,c,r):e.setAttribute(c,r),p(n.removed)}catch(e){}}}ut("afterSanitizeAttributes",e,null)}},ft=function e(t){var n=void 0,r=at(t);for(ut("beforeSanitizeShadowDOM",t,null);n=r.nextNode();)ut("uponSanitizeShadowNode",n,null),dt(n)||(n.content instanceof s&&e(n.content),pt(n));ut("afterSanitizeShadowDOM",t,null)};return n.sanitize=function(e,i){var o=void 0,a=void 0,c=void 0,u=void 0,d=void 0;if(e||(e="\x3c!--\x3e"),"string"!=typeof e&&!ct(e)){if("function"!=typeof e.toString)throw w("toString is not a function");if("string"!=typeof(e=e.toString()))throw w("dirty is not a string, aborting")}if(!n.isSupported){if("object"===B(t.toStaticHTML)||"function"==typeof t.toStaticHTML){if("string"==typeof e)return t.toStaticHTML(e);if(ct(e))return t.toStaticHTML(e.outerHTML)}return e}if(Me||Ve(i),n.removed=[],"string"==typeof e&&(ze=!1),ze);else if(e instanceof l)1===(a=(o=st("\x3c!----\x3e")).ownerDocument.importNode(e,!0)).nodeType&&"BODY"===a.nodeName||"HTML"===a.nodeName?o=a:o.appendChild(a);else{if(!Pe&&!Le&&!Fe&&-1===e.indexOf("<"))return ie&&Ne?ie.createHTML(e):e;if(!(o=st(e)))return Pe?null:oe}o&&je&&it(o.firstChild);for(var h=at(ze?e:o);c=h.nextNode();)3===c.nodeType&&c===u||dt(c)||(c.content instanceof s&&ft(c.content),pt(c),u=c);if(u=null,ze)return e;if(Pe){if(Ie)for(d=ue.call(o.ownerDocument);o.firstChild;)d.appendChild(o.firstChild);else d=o;return Re&&(d=de.call(r,d,!0)),d}var p=Fe?o.outerHTML:o.innerHTML;return Le&&(p=y(p,fe," "),p=y(p,me," ")),ie&&Ne?ie.createHTML(p):p},n.setConfig=function(e){Ve(e),Me=!0},n.clearConfig=function(){qe=null,Me=!1},n.isValidAttribute=function(e,t,n){qe||Ve({});var r=m(e),i=m(t);return ht(r,i,n)},n.addHook=function(e,t){"function"==typeof t&&(pe[e]=pe[e]||[],f(pe[e],t))},n.removeHook=function(e){pe[e]&&p(pe[e])},n.removeHooks=function(e){pe[e]&&(pe[e]=[])},n.removeAllHooks=function(){pe={}},n}()}()},729:e=>{"use strict";var t=Object.prototype.hasOwnProperty,n="~";function r(){}function i(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(e,t,r,o,s){if("function"!=typeof r)throw new TypeError("The listener must be a function");var a=new i(r,o||e,s),l=n?n+t:t;return e._events[l]?e._events[l].fn?e._events[l]=[e._events[l],a]:e._events[l].push(a):(e._events[l]=a,e._eventsCount++),e}function s(e,t){0==--e._eventsCount?e._events=new r:delete e._events[t]}function a(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),a.prototype.eventNames=function(){var e,r,i=[];if(0===this._eventsCount)return i;for(r in e=this._events)t.call(e,r)&&i.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?i.concat(Object.getOwnPropertySymbols(e)):i},a.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var i=0,o=r.length,s=new Array(o);i<o;i++)s[i]=r[i].fn;return s},a.prototype.listenerCount=function(e){var t=n?n+e:e,r=this._events[t];return r?r.fn?1:r.length:0},a.prototype.emit=function(e,t,r,i,o,s){var a=n?n+e:e;if(!this._events[a])return!1;var l,c,u=this._events[a],d=arguments.length;if(u.fn){switch(u.once&&this.removeListener(e,u.fn,void 0,!0),d){case 1:return u.fn.call(u.context),!0;case 2:return u.fn.call(u.context,t),!0;case 3:return u.fn.call(u.context,t,r),!0;case 4:return u.fn.call(u.context,t,r,i),!0;case 5:return u.fn.call(u.context,t,r,i,o),!0;case 6:return u.fn.call(u.context,t,r,i,o,s),!0}for(c=1,l=new Array(d-1);c<d;c++)l[c-1]=arguments[c];u.fn.apply(u.context,l)}else{var h,p=u.length;for(c=0;c<p;c++)switch(u[c].once&&this.removeListener(e,u[c].fn,void 0,!0),d){case 1:u[c].fn.call(u[c].context);break;case 2:u[c].fn.call(u[c].context,t);break;case 3:u[c].fn.call(u[c].context,t,r);break;case 4:u[c].fn.call(u[c].context,t,r,i);break;default:if(!l)for(h=1,l=new Array(d-1);h<d;h++)l[h-1]=arguments[h];u[c].fn.apply(u[c].context,l)}}return!0},a.prototype.on=function(e,t,n){return o(this,e,t,n,!1)},a.prototype.once=function(e,t,n){return o(this,e,t,n,!0)},a.prototype.removeListener=function(e,t,r,i){var o=n?n+e:e;if(!this._events[o])return this;if(!t)return s(this,o),this;var a=this._events[o];if(a.fn)a.fn!==t||i&&!a.once||r&&a.context!==r||s(this,o);else{for(var l=0,c=[],u=a.length;l<u;l++)(a[l].fn!==t||i&&!a[l].once||r&&a[l].context!==r)&&c.push(a[l]);c.length?this._events[o]=1===c.length?c[0]:c:s(this,o)}return this},a.prototype.removeAllListeners=function(e){var t;return e?(t=n?n+e:e,this._events[t]&&s(this,t)):(this._events=new r,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=n,a.EventEmitter=a,e.exports=a},717:e=>{"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},824:e=>{var t=1e3,n=60*t,r=60*n,i=24*r;function o(e,t,n,r){var i=t>=1.5*n;return Math.round(e/n)+" "+r+(i?"s":"")}e.exports=function(e,s){s=s||{};var a,l,c=typeof e;if("string"===c&&e.length>0)return function(e){if(!((e=String(e)).length>100)){var o=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(e);if(o){var s=parseFloat(o[1]);switch((o[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return 315576e5*s;case"weeks":case"week":case"w":return 6048e5*s;case"days":case"day":case"d":return s*i;case"hours":case"hour":case"hrs":case"hr":case"h":return s*r;case"minutes":case"minute":case"mins":case"min":case"m":return s*n;case"seconds":case"second":case"secs":case"sec":case"s":return s*t;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return s;default:return}}}}(e);if("number"===c&&isFinite(e))return s.long?(a=e,(l=Math.abs(a))>=i?o(a,l,i,"day"):l>=r?o(a,l,r,"hour"):l>=n?o(a,l,n,"minute"):l>=t?o(a,l,t,"second"):a+" ms"):function(e){var o=Math.abs(e);return o>=i?Math.round(e/i)+"d":o>=r?Math.round(e/r)+"h":o>=n?Math.round(e/n)+"m":o>=t?Math.round(e/t)+"s":e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},520:(e,t,n)=>{"use strict";var r=n(155),i="win32"===r.platform,o=n(539);function s(e,t){for(var n=[],r=0;r<e.length;r++){var i=e[r];i&&"."!==i&&(".."===i?n.length&&".."!==n[n.length-1]?n.pop():t&&n.push(".."):n.push(i))}return n}function a(e){for(var t=e.length-1,n=0;n<=t&&!e[n];n++);for(var r=t;r>=0&&!e[r];r--);return 0===n&&r===t?e:n>r?[]:e.slice(n,r+1)}var l=/^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/,c=/^([\s\S]*?)((?:\.{1,2}|[^\\\/]+?|)(\.[^.\/\\]*|))(?:[\\\/]*)$/,u={};function d(e){var t=l.exec(e),n=(t[1]||"")+(t[2]||""),r=t[3]||"",i=c.exec(r);return[n,i[1],i[2],i[3]]}function h(e){var t=l.exec(e),n=t[1]||"",r=!!n&&":"!==n[1];return{device:n,isUnc:r,isAbsolute:r||!!t[2],tail:t[3]}}function p(e){return"\\\\"+e.replace(/^[\\\/]+/,"").replace(/[\\\/]+/g,"\\")}u.resolve=function(){for(var e="",t="",n=!1,i=arguments.length-1;i>=-1;i--){var a;if(i>=0?a=arguments[i]:e?(a=r.env["="+e])&&a.substr(0,3).toLowerCase()===e.toLowerCase()+"\\"||(a=e+"\\"):a=r.cwd(),!o.isString(a))throw new TypeError("Arguments to path.resolve must be strings");if(a){var l=h(a),c=l.device,u=l.isUnc,d=l.isAbsolute,f=l.tail;if((!c||!e||c.toLowerCase()===e.toLowerCase())&&(e||(e=c),n||(t=f+"\\"+t,n=d),e&&n))break}}return u&&(e=p(e)),e+(n?"\\":"")+(t=s(t.split(/[\\\/]+/),!n).join("\\"))||"."},u.normalize=function(e){var t=h(e),n=t.device,r=t.isUnc,i=t.isAbsolute,o=t.tail,a=/[\\\/]$/.test(o);return(o=s(o.split(/[\\\/]+/),!i).join("\\"))||i||(o="."),o&&a&&(o+="\\"),r&&(n=p(n)),n+(i?"\\":"")+o},u.isAbsolute=function(e){return h(e).isAbsolute},u.join=function(){for(var e=[],t=0;t<arguments.length;t++){var n=arguments[t];if(!o.isString(n))throw new TypeError("Arguments to path.join must be strings");n&&e.push(n)}var r=e.join("\\");return/^[\\\/]{2}[^\\\/]/.test(e[0])||(r=r.replace(/^[\\\/]{2,}/,"\\")),u.normalize(r)},u.relative=function(e,t){e=u.resolve(e),t=u.resolve(t);for(var n=e.toLowerCase(),r=t.toLowerCase(),i=a(t.split("\\")),o=a(n.split("\\")),s=a(r.split("\\")),l=Math.min(o.length,s.length),c=l,d=0;d<l;d++)if(o[d]!==s[d]){c=d;break}if(0==c)return t;var h=[];for(d=c;d<o.length;d++)h.push("..");return(h=h.concat(i.slice(c))).join("\\")},u._makeLong=function(e){if(!o.isString(e))return e;if(!e)return"";var t=u.resolve(e);return/^[a-zA-Z]\:\\/.test(t)?"\\\\?\\"+t:/^\\\\[^?.]/.test(t)?"\\\\?\\UNC\\"+t.substring(2):e},u.dirname=function(e){var t=d(e),n=t[0],r=t[1];return n||r?(r&&(r=r.substr(0,r.length-1)),n+r):"."},u.basename=function(e,t){var n=d(e)[2];return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},u.extname=function(e){return d(e)[3]},u.format=function(e){if(!o.isObject(e))throw new TypeError("Parameter 'pathObject' must be an object, not "+typeof e);var t=e.root||"";if(!o.isString(t))throw new TypeError("'pathObject.root' must be a string or undefined, not "+typeof e.root);var n=e.dir,r=e.base||"";return n?n[n.length-1]===u.sep?n+r:n+u.sep+r:r},u.parse=function(e){if(!o.isString(e))throw new TypeError("Parameter 'pathString' must be a string, not "+typeof e);var t=d(e);if(!t||4!==t.length)throw new TypeError("Invalid path '"+e+"'");return{root:t[0],dir:t[0]+t[1].slice(0,-1),base:t[2],ext:t[3],name:t[2].slice(0,t[2].length-t[3].length)}},u.sep="\\",u.delimiter=";";var f=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/,m={};function g(e){return f.exec(e).slice(1)}m.resolve=function(){for(var e="",t=!1,n=arguments.length-1;n>=-1&&!t;n--){var i=n>=0?arguments[n]:r.cwd();if(!o.isString(i))throw new TypeError("Arguments to path.resolve must be strings");i&&(e=i+"/"+e,t="/"===i[0])}return(t?"/":"")+(e=s(e.split("/"),!t).join("/"))||"."},m.normalize=function(e){var t=m.isAbsolute(e),n=e&&"/"===e[e.length-1];return(e=s(e.split("/"),!t).join("/"))||t||(e="."),e&&n&&(e+="/"),(t?"/":"")+e},m.isAbsolute=function(e){return"/"===e.charAt(0)},m.join=function(){for(var e="",t=0;t<arguments.length;t++){var n=arguments[t];if(!o.isString(n))throw new TypeError("Arguments to path.join must be strings");n&&(e+=e?"/"+n:n)}return m.normalize(e)},m.relative=function(e,t){e=m.resolve(e).substr(1),t=m.resolve(t).substr(1);for(var n=a(e.split("/")),r=a(t.split("/")),i=Math.min(n.length,r.length),o=i,s=0;s<i;s++)if(n[s]!==r[s]){o=s;break}var l=[];for(s=o;s<n.length;s++)l.push("..");return(l=l.concat(r.slice(o))).join("/")},m._makeLong=function(e){return e},m.dirname=function(e){var t=g(e),n=t[0],r=t[1];return n||r?(r&&(r=r.substr(0,r.length-1)),n+r):"."},m.basename=function(e,t){var n=g(e)[2];return t&&n.substr(-1*t.length)===t&&(n=n.substr(0,n.length-t.length)),n},m.extname=function(e){return g(e)[3]},m.format=function(e){if(!o.isObject(e))throw new TypeError("Parameter 'pathObject' must be an object, not "+typeof e);var t=e.root||"";if(!o.isString(t))throw new TypeError("'pathObject.root' must be a string or undefined, not "+typeof e.root);return(e.dir?e.dir+m.sep:"")+(e.base||"")},m.parse=function(e){if(!o.isString(e))throw new TypeError("Parameter 'pathString' must be a string, not "+typeof e);var t=g(e);if(!t||4!==t.length)throw new TypeError("Invalid path '"+e+"'");return t[1]=t[1]||"",t[2]=t[2]||"",t[3]=t[3]||"",{root:t[0],dir:t[0]+t[1].slice(0,-1),base:t[2],ext:t[3],name:t[2].slice(0,t[2].length-t[3].length)}},m.sep="/",m.delimiter=":",e.exports=i?u:m,e.exports.posix=m,e.exports.win32=u},155:e=>{var t,n,r=e.exports={};function i(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function s(e){if(t===setTimeout)return setTimeout(e,0);if((t===i||!t)&&setTimeout)return t=setTimeout,setTimeout(e,0);try{return t(e,0)}catch(n){try{return t.call(null,e,0)}catch(n){return t.call(this,e,0)}}}!function(){try{t="function"==typeof setTimeout?setTimeout:i}catch(e){t=i}try{n="function"==typeof clearTimeout?clearTimeout:o}catch(e){n=o}}();var a,l=[],c=!1,u=-1;function d(){c&&a&&(c=!1,a.length?l=a.concat(l):u=-1,l.length&&h())}function h(){if(!c){var e=s(d);c=!0;for(var t=l.length;t;){for(a=l,l=[];++u<t;)a&&a[u].run();u=-1,t=l.length}a=null,c=!1,function(e){if(n===clearTimeout)return clearTimeout(e);if((n===o||!n)&&clearTimeout)return n=clearTimeout,clearTimeout(e);try{n(e)}catch(t){try{return n.call(null,e)}catch(t){return n.call(this,e)}}}(e)}}function p(e,t){this.fun=e,this.array=t}function f(){}r.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)t[n-1]=arguments[n];l.push(new p(e,t)),1!==l.length||c||s(h)},p.prototype.run=function(){this.fun.apply(null,this.array)},r.title="browser",r.browser=!0,r.env={},r.argv=[],r.version="",r.versions={},r.on=f,r.addListener=f,r.once=f,r.off=f,r.removeListener=f,r.removeAllListeners=f,r.emit=f,r.prependListener=f,r.prependOnceListener=f,r.listeners=function(e){return[]},r.binding=function(e){throw new Error("process.binding is not supported")},r.cwd=function(){return"/"},r.chdir=function(e){throw new Error("process.chdir is not supported")},r.umask=function(){return 0}},384:e=>{e.exports=function(e){return e&&"object"==typeof e&&"function"==typeof e.copy&&"function"==typeof e.fill&&"function"==typeof e.readUInt8}},539:(e,t,n)=>{var r=n(155),i=/%[sdj%]/g;t.format=function(e){if(!y(e)){for(var t=[],n=0;n<arguments.length;n++)t.push(a(arguments[n]));return t.join(" ")}n=1;for(var r=arguments,o=r.length,s=String(e).replace(i,(function(e){if("%%"===e)return"%";if(n>=o)return e;switch(e){case"%s":return String(r[n++]);case"%d":return Number(r[n++]);case"%j":try{return JSON.stringify(r[n++])}catch(e){return"[Circular]"}default:return e}})),l=r[n];n<o;l=r[++n])m(l)||!_(l)?s+=" "+l:s+=" "+a(l);return s},t.deprecate=function(e,i){if(v(n.g.process))return function(){return t.deprecate(e,i).apply(this,arguments)};if(!0===r.noDeprecation)return e;var o=!1;return function(){if(!o){if(r.throwDeprecation)throw new Error(i);r.traceDeprecation?console.trace(i):console.error(i),o=!0}return e.apply(this,arguments)}};var o,s={};function a(e,n){var r={seen:[],stylize:c};return arguments.length>=3&&(r.depth=arguments[2]),arguments.length>=4&&(r.colors=arguments[3]),f(n)?r.showHidden=n:n&&t._extend(r,n),v(r.showHidden)&&(r.showHidden=!1),v(r.depth)&&(r.depth=2),v(r.colors)&&(r.colors=!1),v(r.customInspect)&&(r.customInspect=!0),r.colors&&(r.stylize=l),u(r,e,r.depth)}function l(e,t){var n=a.styles[t];return n?"["+a.colors[n][0]+"m"+e+"["+a.colors[n][1]+"m":e}function c(e,t){return e}function u(e,n,r){if(e.customInspect&&n&&x(n.inspect)&&n.inspect!==t.inspect&&(!n.constructor||n.constructor.prototype!==n)){var i=n.inspect(r,e);return y(i)||(i=u(e,i,r)),i}var o=function(e,t){if(v(t))return e.stylize("undefined","undefined");if(y(t)){var n="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(n,"string")}return g(t)?e.stylize(""+t,"number"):f(t)?e.stylize(""+t,"boolean"):m(t)?e.stylize("null","null"):void 0}(e,n);if(o)return o;var s=Object.keys(n),a=function(e){var t={};return e.forEach((function(e,n){t[e]=!0})),t}(s);if(e.showHidden&&(s=Object.getOwnPropertyNames(n)),C(n)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return d(n);if(0===s.length){if(x(n)){var l=n.name?": "+n.name:"";return e.stylize("[Function"+l+"]","special")}if(b(n))return e.stylize(RegExp.prototype.toString.call(n),"regexp");if(w(n))return e.stylize(Date.prototype.toString.call(n),"date");if(C(n))return d(n)}var c,_="",A=!1,S=["{","}"];return p(n)&&(A=!0,S=["[","]"]),x(n)&&(_=" [Function"+(n.name?": "+n.name:"")+"]"),b(n)&&(_=" "+RegExp.prototype.toString.call(n)),w(n)&&(_=" "+Date.prototype.toUTCString.call(n)),C(n)&&(_=" "+d(n)),0!==s.length||A&&0!=n.length?r<0?b(n)?e.stylize(RegExp.prototype.toString.call(n),"regexp"):e.stylize("[Object]","special"):(e.seen.push(n),c=A?function(e,t,n,r,i){for(var o=[],s=0,a=t.length;s<a;++s)O(t,String(s))?o.push(h(e,t,n,r,String(s),!0)):o.push("");return i.forEach((function(i){i.match(/^\d+$/)||o.push(h(e,t,n,r,i,!0))})),o}(e,n,r,a,s):s.map((function(t){return h(e,n,r,a,t,A)})),e.seen.pop(),function(e,t,n){return e.reduce((function(e,t){return t.indexOf("\n"),e+t.replace(/\u001b\[\d\d?m/g,"").length+1}),0)>60?n[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+n[1]:n[0]+t+" "+e.join(", ")+" "+n[1]}(c,_,S)):S[0]+_+S[1]}function d(e){return"["+Error.prototype.toString.call(e)+"]"}function h(e,t,n,r,i,o){var s,a,l;if((l=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]}).get?a=l.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):l.set&&(a=e.stylize("[Setter]","special")),O(r,i)||(s="["+i+"]"),a||(e.seen.indexOf(l.value)<0?(a=m(n)?u(e,l.value,null):u(e,l.value,n-1)).indexOf("\n")>-1&&(a=o?a.split("\n").map((function(e){return" "+e})).join("\n").substr(2):"\n"+a.split("\n").map((function(e){return" "+e})).join("\n")):a=e.stylize("[Circular]","special")),v(s)){if(o&&i.match(/^\d+$/))return a;(s=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string"))}return s+": "+a}function p(e){return Array.isArray(e)}function f(e){return"boolean"==typeof e}function m(e){return null===e}function g(e){return"number"==typeof e}function y(e){return"string"==typeof e}function v(e){return void 0===e}function b(e){return _(e)&&"[object RegExp]"===A(e)}function _(e){return"object"==typeof e&&null!==e}function w(e){return _(e)&&"[object Date]"===A(e)}function C(e){return _(e)&&("[object Error]"===A(e)||e instanceof Error)}function x(e){return"function"==typeof e}function A(e){return Object.prototype.toString.call(e)}function S(e){return e<10?"0"+e.toString(10):e.toString(10)}t.debuglog=function(e){if(v(o)&&(o=r.env.NODE_DEBUG||""),e=e.toUpperCase(),!s[e])if(new RegExp("\\b"+e+"\\b","i").test(o)){var n=r.pid;s[e]=function(){var r=t.format.apply(t,arguments);console.error("%s %d: %s",e,n,r)}}else s[e]=function(){};return s[e]},t.inspect=a,a.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},a.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},t.isArray=p,t.isBoolean=f,t.isNull=m,t.isNullOrUndefined=function(e){return null==e},t.isNumber=g,t.isString=y,t.isSymbol=function(e){return"symbol"==typeof e},t.isUndefined=v,t.isRegExp=b,t.isObject=_,t.isDate=w,t.isError=C,t.isFunction=x,t.isPrimitive=function(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||void 0===e},t.isBuffer=n(384);var T=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function E(){var e=new Date,t=[S(e.getHours()),S(e.getMinutes()),S(e.getSeconds())].join(":");return[e.getDate(),T[e.getMonth()],t].join(" ")}function O(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.log=function(){console.log("%s - %s",E(),t.format.apply(t,arguments))},t.inherits=n(717),t._extend=function(e,t){if(!t||!_(t))return e;for(var n=Object.keys(t),r=n.length;r--;)e[n[r]]=t[n[r]];return e}}},t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={exports:{}};return e[r].call(i.exports,i,i.exports,n),i.exports}n.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return n.d(t,{a:t}),t},n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var r={};return(()=>{"use strict";n.r(r),n.d(r,{PluginLocal:()=>ce,pluginHelpers:()=>e,setupPluginCore:()=>de});var e={};n.r(e),n.d(e,{deepMerge:()=>h,deferred:()=>g,genID:()=>p,invokeHostExportedApi:()=>y,isObject:()=>d,setupIframeSandbox:()=>v,setupInjectedStyle:()=>b,setupInjectedTheme:()=>x,setupInjectedUI:()=>_,transformableEvent:()=>w,ucFirst:()=>f,withFileProtocol:()=>m});var t=n(729),i=n.n(t),o=function(){return(o=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function s(e){return e.toLowerCase()}Object.create,Object.create;var a=[/([a-z0-9])([A-Z])/g,/([A-Z])([A-Z][a-z])/g],l=/[^A-Z0-9]+/gi;function c(e,t,n){return t instanceof RegExp?e.replace(t,n):t.reduce((function(e,t){return e.replace(t,n)}),e)}function u(e,t){return void 0===t&&(t={}),function(e,t){return void 0===t&&(t={}),function(e,t){void 0===t&&(t={});for(var n=t.splitRegexp,r=void 0===n?a:n,i=t.stripRegexp,o=void 0===i?l:i,u=t.transform,d=void 0===u?s:u,h=t.delimiter,p=void 0===h?" ":h,f=c(c(e,r,"$1\0$2"),o,"\0"),m=0,g=f.length;"\0"===f.charAt(m);)m++;for(;"\0"===f.charAt(g-1);)g--;return f.slice(m,g).split("\0").map(d).join(p)}(e,o({delimiter:"."},t))}(e,o({delimiter:"_"},t))}function d(e){return e===Object(e)&&!Array.isArray(e)}function h(e,...t){if(!t.length)return e;const n=e;if(d(n)){const e=t.length;for(let r=0;r<e;r+=1){const e=t[r];if(d(e))for(const t in e)e.hasOwnProperty(t)&&(d(e[t])?(n[t]&&d(n[t])||(n[t]={}),h(n[t],e[t])):Array.isArray(n[t])&&Array.isArray(e[t])?n[t]=Array.from(new Set(n[t].concat(e[t]))):n[t]=e[t])}}return n}function p(){return"_"+Math.random().toString(36).substr(2,9)}function f(e){return e.charAt(0).toUpperCase()+e.slice(1)}function m(e){return e?(/^(http|file|assets)/.test(e)||(e="file://"+e),e):""}function g(e,t){let n,r,i=!1;const o=t=>n=>{e&&clearTimeout(e),t(n),i=!0},s=new Promise(((i,s)=>{n=o(i),r=o(s),e&&(e=setTimeout((()=>r(new Error(`[deferred timeout] ${t}`))),e))}));return{created:Date.now(),setTag:e=>t=e,resolve:n,reject:r,promise:s,get settled(){return i}}}function y(e,...t){const n=u(e),r=window.logseq?.api||{},i=r[n]||window.apis[n]||r[e]||window.apis[e];if(!i)throw new Error(`Not existed method #${e}`);return"function"!=typeof i?i:i.apply(null,t)}function v(e,t){const n=document.createElement("iframe");return n.classList.add("lsp-iframe-sandbox"),Object.entries(e).forEach((([e,t])=>{n.setAttribute(e,t)})),t.appendChild(n),async()=>{t.removeChild(n)}}function b(e,t){const n=t["data-injected-style"];let r=n&&document.querySelector(`[data-injected-style=${n}]`);if(!r)return r=document.createElement("style"),r.textContent=e,t&&Object.entries(t).forEach((([e,t])=>{r.setAttribute(e,t)})),document.head.append(r),()=>{document.head.removeChild(r)};r.textContent=e}function _(e,t){const n=this;let r="";r="slot"in e?`#${e.slot}`:e.path;const i=r&&document.querySelector(r);if(!i)return void console.error(`${this.debugTag} can not resolve selector target ${r}`);const o=`${e.key}-${n.id}`;let s=document.querySelector(`div[data-injected-ui="${o}"]`);if(!s)return s=document.createElement("div"),s.dataset.injectedUi=o||"",s.innerHTML=e.template,t&&Object.entries(t).forEach((([e,t])=>{s.setAttribute(e,t)})),i.appendChild(s),["click","focus","focusin","focusout","blur","dblclick","keyup","keypress","keydown","change","input"].forEach((e=>{s.addEventListener(e,(t=>{const r=t.target.closest(`[data-on-${e}]`);if(!r)return;const i=r.dataset[`on${f(e)}`];i&&n.caller?.callUserModel(i,w(r))}),!1)})),()=>{i.removeChild(s)};s.innerHTML=e.template}function w(e,t){const n={};if(e){const t=e.dataset,r="rect";["value","id","className","dataset",r].forEach((i=>{let o;switch(i){case r:if(!t.hasOwnProperty(r))return;o=e.getBoundingClientRect().toJSON();break;default:o=e[i]}"object"==typeof o&&(o={...o}),n[i]=o}))}return n}let C=null;function x(e){if(C?.call(),!e)return;const t=document.createElement("link");return t.rel="stylesheet",t.href=e,document.head.appendChild(t),C=()=>{document.head.removeChild(t),C=null}}var A=n(227),S=n.n(A),T="application/x-postmate-v1+json",E=0,O={handshake:1,"handshake-reply":1,call:1,emit:1,reply:1,request:1},k=function(e,t){return!("string"==typeof t&&e.origin!==t||!e.data||"object"==typeof e.data&&!("postmate"in e.data)||e.data.type!==T||!O[e.data.postmate])},L=function(){function e(e){var t=this;this.parent=e.parent,this.frame=e.frame,this.child=e.child,this.childOrigin=e.childOrigin,this.events={},this.listener=function(e){if(!k(e,t.childOrigin))return!1;var n=((e||{}).data||{}).value||{},r=n.data,i=n.name;"emit"===e.data.postmate&&i in t.events&&t.events[i].call(t,r)},this.parent.addEventListener("message",this.listener,!1)}var t=e.prototype;return t.get=function(e){var t=this;return new M.Promise((function(n){var r=++E;t.parent.addEventListener("message",(function e(i){i.data.uid===r&&"reply"===i.data.postmate&&(t.parent.removeEventListener("message",e,!1),n(i.data.value))}),!1),t.child.postMessage({postmate:"request",type:T,property:e,uid:r},t.childOrigin)}))},t.call=function(e,t){this.child.postMessage({postmate:"call",type:T,property:e,data:t},this.childOrigin)},t.on=function(e,t){this.events[e]=t},t.destroy=function(){window.removeEventListener("message",this.listener,!1),this.frame.parentNode.removeChild(this.frame)},e}(),F=function(){function e(e){var t=this;this.model=e.model,this.parent=e.parent,this.parentOrigin=e.parentOrigin,this.child=e.child,this.child.addEventListener("message",(function(e){if(k(e,t.parentOrigin)){var n=e.data,r=n.property,i=n.uid,o=n.data;"call"!==e.data.postmate?function(e,t){var n="function"==typeof e[t]?e[t]():e[t];return M.Promise.resolve(n)}(t.model,r).then((function(t){return e.source.postMessage({property:r,postmate:"reply",type:T,uid:i,value:t},e.origin)})):r in t.model&&"function"==typeof t.model[r]&&t.model[r](o)}}))}return e.prototype.emit=function(e,t){this.parent.postMessage({postmate:"emit",type:T,value:{name:e,data:t}},this.parentOrigin)},e}(),M=function(){function e(e){var t=e.container,n=void 0===t?void 0!==n?n:document.body:t,r=e.model,i=e.url,o=e.name,s=e.classListArray,a=void 0===s?[]:s;return this.parent=window,this.frame=document.createElement("iframe"),this.frame.name=o||"",this.frame.classList.add.apply(this.frame.classList,a),n.appendChild(this.frame),this.child=this.frame.contentWindow||this.frame.contentDocument.parentWindow,this.model=r||{},this.sendHandshake(i)}return e.prototype.sendHandshake=function(t){var n,r=this,i=function(e){var t=document.createElement("a");t.href=e;var n=t.protocol.length>4?t.protocol:window.location.protocol,r=t.host.length?"80"===t.port||"443"===t.port?t.hostname:t.host:window.location.host;return t.origin||n+"//"+r}(t),o=0;return new e.Promise((function(e,s){r.parent.addEventListener("message",(function t(o){return!!k(o,i)&&("handshake-reply"===o.data.postmate?(clearInterval(n),r.parent.removeEventListener("message",t,!1),r.childOrigin=o.origin,e(new L(r))):s("Failed handshake"))}),!1);var a=function(){o++,r.child.postMessage({postmate:"handshake",type:T,model:r.model},i),5===o&&clearInterval(n)},l=function(){a(),n=setInterval(a,500)};r.frame.attachEvent?r.frame.attachEvent("onload",l):r.frame.onload=l,r.frame.src=t}))},e}();M.debug=!1,M.Promise=function(){try{return window?window.Promise:Promise}catch(e){return null}}(),M.Model=function(){function e(e){return this.child=window,this.model=e,this.parent=this.child.parent,this.sendHandshakeReply()}return e.prototype.sendHandshakeReply=function(){var e=this;return new M.Promise((function(t,n){e.child.addEventListener("message",(function r(i){if(i.data.postmate){if("handshake"===i.data.postmate){e.child.removeEventListener("message",r,!1),i.source.postMessage({postmate:"handshake-reply",type:T},i.origin),e.parentOrigin=i.origin;var o=i.data.model;return o&&Object.keys(o).forEach((function(t){e.model[t]=o[t]})),t(new F(e))}return n("Handshake Reply Failed")}}),!1)}))},e}();const j=M,P=S()("LSPlugin:user"),I={registerUIItem(e,t){const n=this.baseInfo.id;return this.caller?.call("api:call",{method:"register-plugin-ui-item",args:[n,e,t]}),!1}};let R=0;const N={registerSlashCommand(e,t){return P("Register slash command #",this.baseInfo.id,e,t),"function"==typeof t&&(t=[["editor/clear-current-slash",!1],["editor/restore-saved-cursor"],["editor/hook",t]]),t=t.map((e=>{const[t,...n]=e;switch(t){case"editor/hook":let r=n[0],i=()=>{this.caller?.callUserModel(r)};"function"==typeof r&&(i=r);const o=`SlashCommandHook${t}${++R}`;e[1]=o,this.Editor["on"+o](i)}return e})),this.caller?.call("api:call",{method:"register-plugin-slash-command",args:[this.baseInfo.id,[e,t]]}),!1},registerBlockContextMenu(e,t){if("function"!=typeof t)return!1;const n=e,r=e,i=`SimpleCommandHook${e}${++R}`;return this.Editor["on"+i](t),this.caller?.call("api:call",{method:"register-plugin-simple-command",args:[this.baseInfo.id,[{key:n,label:r,type:"block-context-menu"},["editor/hook",i]]]}),!0}},D={};class U extends(i()){constructor(e,t){super(),this._baseInfo=e,this._caller=t,this._connected=!1,this._ui=new Map,t.on("settings:changed",(e=>{const t=Object.assign({},this.settings),n=Object.assign(this._baseInfo.settings,e);this.emit("settings:changed",{...n},t)})),t.on("beforeunload",(async e=>{const{actor:n,...r}=e,i=this._beforeunloadCallback;try{i&&await i(r),n?.resolve(null)}catch(e){console.debug(`${t.debugTag} [beforeunload] `,e),n?.reject(e)}}))}async ready(e,t){if(!this._connected)try{"function"==typeof e&&(t=e,e={});let n=await this._caller.connectToParent(e);n=h(this._baseInfo,n),this._connected=!0,n?.id&&(this._caller.debugTag=`#${n.id} [${n.name}]`),t&&t.call(this,n)}catch(e){console.error("[LSPlugin Ready Error]",e)}}beforeunload(e){"function"==typeof e&&(this._beforeunloadCallback=e)}provideModel(e){return this.caller._extendUserModel(e),this}provideTheme(e){return this.caller.call("provider:theme",e),this}provideStyle(e){return this.caller.call("provider:style",e),this}provideUI(e){return this.caller.call("provider:ui",e),this}updateSettings(e){this.caller.call("settings:update",e)}setMainUIAttrs(e){this.caller.call("main-ui:attrs",e)}setMainUIInlineStyle(e){this.caller.call("main-ui:style",e)}hideMainUI(e){const t={key:0,visible:!1,cursor:e?.restoreEditingCursor};this.caller.call("main-ui:visible",t),this.emit("ui:visible:changed",t),this._ui.set(t.key,t)}showMainUI(){const e={key:0,visible:!0};this.caller.call("main-ui:visible",e),this.emit("ui:visible:changed",e),this._ui.set(e.key,e)}toggleMainUI(){const e=this._ui.get(0);e&&e.visible?this.hideMainUI():this.showMainUI()}get isMainUIVisible(){const e=this._ui.get(0);return Boolean(e&&e.visible)}get connected(){return this._connected}get baseInfo(){return this._baseInfo}get settings(){return this.baseInfo?.settings}get caller(){return this._caller}_makeUserProxy(e,t){const n=this,r=this.caller;return new Proxy(e,{get(e,i,o){const s=e[i];return function(...e){if(!s||!1!==s.apply(n,e)){if(t){const n=i.toString().match(/^(once|off|on)/i);if(null!=n){const i=n[0].toLowerCase(),o=n.input.slice(i.length),s=`hook:${t}:${u(o)}`,a=e[0];return r[i](s,a),"off"!==i?()=>r.off(s,a):void 0}}return r.callAsync("api:call",{method:i,args:e})}}}})}get App(){return this._makeUserProxy(I,"app")}get Editor(){return this._makeUserProxy(N,"editor")}get DB(){return this._makeUserProxy(D)}}if(null==window.__LSP__HOST__){const e=new Q(null);window.logseq=new U({},e)}const{importHTML:z,createSandboxContainer:$}=window.QSandbox||{};function H(e,t){return e.startsWith("http")?fetch(e,t):(e=e.replace("file://",""),new Promise((async(t,n)=>{try{const n=await window.apis.doAction(["readFile",e]);t({text:()=>n})}catch(e){console.error(e),n(e)}})))}class W extends(i()){constructor(e){super(),this._pluginLocal=e,this._loaded=!1,this._unmountFns=[],e._dispose((()=>{this._unmount()}))}async load(){const{name:e,entry:t}=this._pluginLocal.options;if(this.loaded||!t)return;const{template:n,execScripts:r}=await z(t,{fetch:H});this._mount(n,document.body);const i=$(e,{elementGetter:()=>this._root?.firstChild}).instance.proxy;i.__shadow_mode__=!0,i.LSPluginLocal=this._pluginLocal,i.LSPluginShadow=this,i.LSPluginUser=i.logseq=new U(this._pluginLocal.toJSON(),this._pluginLocal.caller);const o=await r(i,!0);this._unmountFns.push(o.unmount),this._loaded=!0}_mount(e,t){const n=this._frame=document.createElement("div");n.classList.add("lsp-shadow-sandbox"),n.id=this._pluginLocal.id,this._root=n.attachShadow({mode:"open"}),this._root.innerHTML=`<div>${e}</div>`,t.appendChild(n),this.emit("mounted")}_unmount(){for(const e of this._unmountFns)e&&e.call(null)}destroy(){this.frame?.parentNode?.removeChild(this.frame)}get loaded(){return this._loaded}get document(){return this._root?.firstChild}get frame(){return this._frame}}const B=S()("LSPlugin:caller"),G="#await#response#",J="#lspmsg#",q="#lspmsg#error#",Z="#lspmsg#settings#",V="#lspmsg#beforeunload#",K="#lspmsg#reply#",Y="#lspmsg#ready#",X=e=>`#lspmsg#${e}`;class Q extends(i()){constructor(e){super(),this._pluginLocal=e,this._connected=!1,this._userModel={},this._debugTag="",e&&(this._debugTag=e.debugTag)}async connectToChild(){if(this._connected)return;const{shadow:e}=this._pluginLocal;e?await this._setupShadowSandbox():await this._setupIframeSandbox()}async connectToParent(e={}){if(this._connected)return;const t=this,n=null!=this._pluginLocal;let r=0,i=0;const o=new Map,s=g(5e3),a=this._extendUserModel({[Y]:async()=>{await s.resolve()},[V]:async e=>{const n=g(1e4);t.emit("beforeunload",Object.assign({actor:n},e)),await n.promise},[Z]:async({type:e,payload:n})=>{t.emit("settings:changed",n)},[J]:async({ns:e,type:n,payload:r})=>{B(`${this._debugTag} [call from host]`,e,n,r),e&&e.startsWith("hook")?t.emit(`${e}:${n}`,r):t.emit(n,r)},[K]:({_sync:e,result:t})=>{if(B(`sync reply #${e}`,t),o.has(e)){const n=o.get(e);n&&(t?.hasOwnProperty(q)?n.reject(t[q]):n.resolve(t),o.delete(e))}},...e});if(n)return await s.promise,JSON.parse(JSON.stringify(this._pluginLocal?.toJSON()));const l=new j.Model(a);return this._status="pending",await l.then((e=>{this._child=e,this._connected=!0,this._call=async(t,n={},r)=>{if(r){const e=++i;o.set(e,r),n._sync=e,r.setTag(`async call #${e}`),B("async call #",e)}return e.emit(X(a.baseInfo.id),{type:t,payload:n}),r?.promise},this._callUserModel=async(e,t)=>{try{a[e](t)}catch(t){B(`model method #${e} not existed`)}},r=setInterval((()=>{if(o.size>100)for(const[e,t]of o)t.settled&&o.delete(e)}),18e5)})).finally((()=>{this._status=void 0})),await s.promise,a.baseInfo}async call(e,t={}){return this._call?.call(this,e,t)}async callAsync(e,t={}){const n=g(1e4);return this._call?.call(this,e,t,n)}async callUserModel(e,t={}){return this._callUserModel?.call(this,e,t)}async _setupIframeSandbox(){const e=this._pluginLocal,t=new j({container:document.body,url:e.options.entry,classListArray:["lsp-iframe-sandbox"],model:{baseInfo:JSON.parse(JSON.stringify(e.toJSON()))}});let n;return this._status="pending",new Promise(((r,i)=>{n=setTimeout((()=>{i(new Error("handshake Timeout"))}),3e3),t.then((t=>{this._parent=t,this._connected=!0,this.emit("connected"),t.frame.setAttribute("id",e.id),t.on(X(e.id),(({type:e,payload:t})=>{B("[call from plugin] ",e,t),this._pluginLocal?.emit(e,t||{})})),this._call=async(...n)=>{await t.call(X(e.id),{type:n[0],payload:n[1]||{}})},this._callUserModel=async(e,n)=>{if(e.startsWith(G))return await t.get(e.replace(G,""));t.call(e,n)},r(null)})).catch((e=>{i(e)})).finally((()=>{clearTimeout(n)}))})).catch((e=>{throw B("iframe sandbox error",e),e})).finally((()=>{this._status=void 0}))}async _setupShadowSandbox(){const e=this._pluginLocal,t=this._shadow=new W(e);try{this._status="pending",await t.load(),this._connected=!0,this.emit("connected"),this._call=async(e,t={},n)=>(n&&(t.actor=n),this._pluginLocal?.emit(e,t),n?.promise),this._callUserModel=async(...e)=>{let t=e[0];t?.startsWith(G)&&(t=t.replace(G,""));const n=e[1]||{},r=this._userModel[t];"function"==typeof r&&await r.call(null,n)}}catch(e){throw B("shadow sandbox error",e),e}finally{this._status=void 0}}_extendUserModel(e){return Object.assign(this._userModel,e)}_getSandboxIframeContainer(){return this._parent?.frame}_getSandboxShadowContainer(){return this._shadow?.frame}set debugTag(e){this._debugTag=e}async destroy(){this._parent&&await this._parent.destroy(),this._shadow&&this._shadow.destroy()}}var ee=n(856),te=n.n(ee),ne=n(520);const re=S()("LSPlugin:core");class ie extends(i()){constructor(e){super(),this._userPluginSettings=e,this._settings={disabled:!1},Object.assign(this._settings,e)}get(e){return this._settings[e]}set(e,t){const n=h({},this._settings);if("string"==typeof e){if(this._settings[e]==t)return;this._settings[e]=t}else{if(!d(e))return;h(this._settings,e)}this.emit("change",Object.assign({},this._settings),n)}toJSON(){return this._settings}}class oe extends(i()){constructor(e){super(),this._tag=e,this._logs=[]}write(e,t){let n=t.reduce(((e,t)=>(t&&t instanceof Error?e+=`${t.message} ${t.stack}`:e+=t.toString(),e)),`[${this._tag}][${(new Date).toLocaleTimeString()}] `);this._logs.push([e,n]),this.emit("change")}clear(){this._logs=[],this.emit("change")}info(...e){this.write("INFO",e)}error(...e){this.write("ERROR",e)}warn(...e){this.write("WARN",e)}toJSON(){return this._logs}}var se;!function(e){e.LOADING="loading",e.UNLOADING="unloading",e.LOADED="loaded",e.UNLOADED="unload",e.ERROR="error"}(se||(se={}));class ae extends Error{constructor(e){super(e),this.name=ae.name}}class le extends Error{constructor(e){super(e),this.name=le.name}}class ce extends(i()){constructor(e,t,n){var r;super(),this._options=e,this._themeMgr=t,this._ctx=n,this._disposes=[],this._status=se.UNLOADED,this._id=e.key||p(),(r=this).on("settings:update",(e=>{e&&r.settings?.set(e)})),function(e){const t=e=>`main-ui:${e}`;e.on(t("visible"),(({visible:t,toggle:n,cursor:r})=>{const i=e.getMainUI();i?.classList[n?"toggle":t?"add":"remove"]("visible"),t&&!e.shadow&&i&&i.contentWindow?.focus(),r&&y("restore_editing_cursor")})),e.on(t("attrs"),(t=>{const n=e.getMainUI();Object.entries(t).forEach((([e,t])=>{n?.setAttribute(e,t)}))})),e.on(t("style"),(t=>{const n=e.getMainUI();Object.entries(t).forEach((([e,t])=>{n.style[e]=t}))}))}(this),function(e){let t=e=>`provider:${e}`,n=!1;e.on(t("theme"),(t=>{e.themeMgr.registerTheme(e.id,t),n||(e._dispose((()=>{e.themeMgr.unregisterTheme(e.id)})),n=!0)})),e.on(t("style"),(t=>{let n;"string"!=typeof t&&(n=t.key,t=t.style),t&&t.trim()&&e._dispose(b(t,{"data-injected-style":n?`${n}-${e.id}`:"","data-ref":e.id}))})),e.on(t("ui"),(t=>{e._onHostMounted((()=>{t.template=te().sanitize(t.template),e._dispose(_.call(e,t,{"data-ref":e.id}))}))}))}(this),function(e){e.on("api:call",(async t=>{let n;try{n=await y(t.method,...t.args)}catch(e){n={[q]:e}}const{_sync:r}=t;if(e.shadow)t.actor&&t.actor.resolve(n);else if(null!=r){const t=t=>{e.caller?.callUserModel(K,{result:t,_sync:r})};Promise.resolve(n).then(t,t)}}))}(this)}async _setupUserSettings(){const{_options:e}=this,t=e.name.replace(/[^a-z0-9]/gi,"_").toLowerCase()+"_"+this.id,n=e.logger=new oe("Loader");try{const[n,r]=await y("load_plugin_user_settings",t);this._userSettingsFile=n,(e.settings=new ie(r)).on("change",((e,n)=>{re("linked settings change",e),!e.disabled&&n.disabled&&this.load(),e.disabled&&!n.disabled&&this.unload(),e&&y("save_plugin_user_settings",t,e)}))}catch(e){re("[load plugin user settings Error]",e),n?.error(e)}}getMainUI(){return this.shadow?this.caller?._getSandboxShadowContainer():this.caller?._getSandboxIframeContainer()}async _preparePackageConfigs(){const{url:e}=this._options;let t;try{if(!e)throw new Error("Can not resolve package config location");if(re("prepare package root",e),t=await y("load_plugin_config",e),!t||(t=JSON.parse(t),!t))throw new Error(`Parse package config error #${e}/package.json`)}catch(e){throw new ae(e.message)}["name","author","repository","version","description"].forEach((e=>{this._options[e]=t[e]}));const n=this._localRoot=e,r=t.logseq||{},i=(e,t=!1)=>{if(!e)return;const r=/^(http|file|assets)/;if(!r.test(e)){const t=ne.join(n,e);e=r.test(t)?t:"file://"+t}return t?e:e.replace("file:","assets:")};var o;(o=t.main)&&/\.(js|html)$/.test(o)&&(this._options.entry=i(t.main,!0),r.mode&&(this._options.mode=r.mode));const s=r.icon||t.icon;if(s&&(this._options.icon=i(s)),r.id)this._id=r.id;else{r.id=this.id;try{await y("save_plugin_config",e,{...t,logseq:r})}catch(e){re("[save plugin ID Error] ",e)}}const{registeredPlugins:a,isRegistering:l}=this._ctx;if(l&&a.has(r.id))throw new le("prepare package Error");return async()=>{try{let e=r.themes;e&&await this._loadConfigThemes(Array.isArray(e)?e:[e])}catch(e){re("[prepare package effect Error]",e)}}}async _tryToNormalizeEntry(){let{entry:e,settings:t}=this.options,n=t?.get("_devEntry");if(n)return void(this._options.entry=n);if(!e.endsWith(".js"))return;let r=await y("_callApplication","getAppPath"),i=await y("write_user_tmp_file",`${this._id}_index.html`,`<!doctype html>\n<html lang="en">\n <head>\n <meta charset="UTF-8">\n <title>logseq plugin entry</title>\n <script src="${r}/js/lsplugin.user.js"><\/script>\n </head>\n <body>\n <div id="app"></div>\n <script src="${e}"><\/script>\n </body>\n</html>`);this._options.entry=m(i)}async _loadConfigThemes(e){e.forEach((e=>{e.url&&(!e.url.startsWith("http")&&this._localRoot&&(e.url=ne.join(this._localRoot,e.url),e.url.startsWith("file:")||(e.url="assets://"+e.url)),this.emit("provider:theme",e))}))}async load(e){if(!this.pending){this._status=se.LOADING,this._loadErr=void 0;try{let t=()=>Promise.resolve();if(this.options.entry||(t=await this._preparePackageConfigs()),this.settings||await this._setupUserSettings(),this.disabled||await t.call(null),this.disabled||!this.options.entry)return;await this._tryToNormalizeEntry(),this._caller=new Q(this),await this._caller.connectToChild();const n=()=>{this._caller?.callUserModel(Y)};e?e.promise.then(n):n(),this._disposes.push((async()=>{await(this._caller?.destroy())}))}catch(e){re("[Load Plugin Error] ",e),this.logger?.error(e),this._status=se.ERROR,this._loadErr=e}finally{this._loadErr||(this._status=se.LOADED)}}}async reload(){re("TODO: reload plugin",this.id)}async unload(e=!1){if(!this.pending){if(e)return await this.unload(),void(this.isInstalledInUserRoot&&re("TODO: remove plugin local files from user home root :)"));try{this._status=se.UNLOADING;const t={unregister:e};try{await(this._caller?.callUserModel((V,`${G}#lspmsg#beforeunload#`),t)),this.emit("beforeunload",t)}catch(e){console.error("[beforeunload Error]",e)}await this.dispose(),this.emit("unloaded")}catch(e){re("[plugin unload Error]",e)}finally{this._status=se.UNLOADED}}}async dispose(){for(const e of this._disposes)try{e&&await e()}catch(e){console.error(this.debugTag,"dispose Error",e)}this._disposes=[]}_dispose(e){e&&this._disposes.push(e)}_onHostMounted(e){const t=this._ctx.hostMountedActor;!t||t.settled?e():t?.promise.then(e)}get isInstalledInUserRoot(){const e=this._ctx.options.localUserConfigRoot,t=this._localRoot;return e&&t&&t.startsWith(e)}get loaded(){return this._status===se.LOADED}get pending(){return[se.LOADING,se.UNLOADING].includes(this._status)}get status(){return this._status}get settings(){return this.options.settings}get logger(){return this.options.logger}get disabled(){return this.settings?.get("disabled")}get caller(){return this._caller}get id(){return this._id}get shadow(){return"shadow"===this.options.mode}get options(){return this._options}get themeMgr(){return this._themeMgr}get debugTag(){const e=this._options?.name;return`#${this._id} ${e??""}`}get localRoot(){return this._localRoot||this._options.url}get loadErr(){return this._loadErr}get userSettingsFile(){return this._userSettingsFile}toJSON(){const e={...this.options};return e.id=this.id,e.err=this.loadErr,e.usf=this.userSettingsFile,e}}class ue extends(i()){constructor(e){super(),this._options=e,this._isRegistering=!1,this._hostMountedActor=g(),this._userPreferences={},this._registeredThemes=new Map,this._registeredPlugins=new Map}async loadUserPreferences(){try{const e=await y("load_user_preferences");e&&Object.assign(this._userPreferences,e)}catch(e){re("[load user preferences Error]",e)}}async saveUserPreferences(e){try{e&&Object.assign(this._userPreferences,e),await y("save_user_preferences",this._userPreferences)}catch(e){re("[save user preferences Error]",e)}}async activateUserPreferences(){const{theme:e}=this._userPreferences;e&&await this.selectTheme(e,!1)}async register(e,t=!1){if(Array.isArray(e))try{this._isRegistering=!0,this._options.localUserConfigRoot;const n=this._readyIndicator=g();await this.loadUserPreferences();const r=new Set(this._userPreferences.externals||[]);t&&(e=e.concat([...r].filter((t=>!e.length||e.every((e=>!e.entry&&e.url!==t)))).map((e=>({url:e})))));for(const t of e){const{url:e}=t,i=new ce(t,this,this),o=`[LOAD Plugin] ${i.debugTag}`;console.time(o),await i.load(n);const{loadErr:s}=i;s&&(re("[Failed LOAD Plugin] #",t),this.emit("error",s),s instanceof ae||s instanceof le)||(console.timeEnd(o),i.settings?.on("change",(e=>{this.emit("settings-changed",i.id,e),i.caller?.callUserModel(Z,{payload:e})})),this._registeredPlugins.set(i.id,i),this.emit("registered",i),i.isInstalledInUserRoot||r.add(e))}await this.saveUserPreferences({externals:Array.from(r)}),await this.activateUserPreferences(),n.resolve("ready")}catch(e){console.error(e)}finally{this._isRegistering=!1}else await this.register([e])}async reload(e){if(Array.isArray(e))for(const t of e){const e=this.ensurePlugin(t);await e.reload()}else await this.reload([e])}async unregister(e){if(!Array.isArray(e))return void await this.unregister([e]);const t=[];for(const n of e){const e=this.ensurePlugin(n);e.isInstalledInUserRoot||t.push(e.options.url),await e.unload(!0),this._registeredPlugins.delete(n),this.emit("unregistered",n)}let n=this._userPreferences.externals||[];n.length&&t.length&&await this.saveUserPreferences({externals:n.filter((e=>!t.includes(e)))})}async enable(e){const t=this.ensurePlugin(e);t.pending||(this.emit("beforeenable"),t.settings?.set("disabled",!1),this.emit("enabled",t.id))}async disable(e){const t=this.ensurePlugin(e);t.pending||(this.emit("beforedisable"),t.settings?.set("disabled",!0),this.emit("disabled",t.id))}async _hook(e,t,n,r){for(const[i,o]of this._registeredPlugins)r&&r!==o.id||o.caller?.callUserModel(J,{ns:e,type:u(t),payload:n})}hookApp(e,t,n){this._hook("hook:app",e,t,n)}hookEditor(e,t,n){this._hook("hook:editor",e,t,n)}_execDirective(e,...t){}ensurePlugin(e){if(e instanceof ce)return e;const t=this._registeredPlugins.get(e);if(!t)throw new Error(`plugin #${e} not existed.`);return t}hostMounted(){this._hostMountedActor.resolve()}get registeredPlugins(){return this._registeredPlugins}get options(){return this._options}get readyIndicator(){return this._readyIndicator}get hostMountedActor(){return this._hostMountedActor}get isRegistering(){return this._isRegistering}get themes(){return this._registeredThemes}async registerTheme(e,t){if(re("registered Theme #",e,t),!e)return;let n=this._registeredThemes.get(e);n||this._registeredThemes.set(e,n=[]),n.push(t),this.emit("theme-changed",this.themes,{id:e,...t})}async selectTheme(e,t=!0){x(e?.url),this.emit("theme-selected",e),t&&this.saveUserPreferences({theme:e})}async unregisterTheme(e){re("unregistered Theme #",e),this._registeredThemes.has(e)&&(this._registeredThemes.delete(e),this.emit("theme-changed",this.themes,{id:e}))}}function de(e){const t=new ue(e);re("=== 🔗 Setup Logseq Plugin System 🔗 ==="),window.LSPluginCore=t}})(),r})()}));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24iLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2NvbW1vbi5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9kb21wdXJpZnkvZGlzdC9wdXJpZnkuanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvZXZlbnRlbWl0dGVyMy9pbmRleC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL21zL2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL3BhdGgvcGF0aC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL0xTUGx1Z2luL3dlYnBhY2svcnVudGltZS9nbG9iYWwiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9MU1BsdWdpbi93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9sb3dlci1jYXNlL2Rpc3QuZXMyMDE1L2luZGV4LmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL25vLWNhc2UvZGlzdC5lczIwMTUvaW5kZXguanMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9ub2RlX21vZHVsZXMvc25ha2UtY2FzZS9kaXN0LmVzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL25vZGVfbW9kdWxlcy9kb3QtY2FzZS9kaXN0LmVzMjAxNS9pbmRleC5qcyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL3NyYy9oZWxwZXJzLnRzIiwid2VicGFjazovL0xTUGx1Z2luLy4vbm9kZV9tb2R1bGVzL3Bvc3RtYXRlL2J1aWxkL3Bvc3RtYXRlLmVzLmpzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL0xTUGx1Z2luLnVzZXIudHMiLCJ3ZWJwYWNrOi8vTFNQbHVnaW4vLi9zcmMvTFNQbHVnaW4uc2hhZG93LnRzIiwid2VicGFjazovL0xTUGx1Z2luLy4vc3JjL0xTUGx1Z2luLmNhbGxlci50cyIsIndlYnBhY2s6Ly9MU1BsdWdpbi8uL3NyYy9MU1BsdWdpbi5jb3JlLnRzIl0sIm5hbWVzIjpbInJvb3QiLCJmYWN0b3J5IiwiZXhwb3J0cyIsIm1vZHVsZSIsImRlZmluZSIsImFtZCIsInNlbGYiLCJmb3JtYXRBcmdzIiwiYXJncyIsInRoaXMiLCJ1c2VDb2xvcnMiLCJuYW1lc3BhY2UiLCJodW1hbml6ZSIsImRpZmYiLCJjIiwiY29sb3IiLCJzcGxpY2UiLCJpbmRleCIsImxhc3RDIiwicmVwbGFjZSIsIm1hdGNoIiwic2F2ZSIsIm5hbWVzcGFjZXMiLCJzdG9yYWdlIiwic2V0SXRlbSIsInJlbW92ZUl0ZW0iLCJlcnJvciIsImxvYWQiLCJyIiwiZ2V0SXRlbSIsInByb2Nlc3MiLCJlbnYiLCJERUJVRyIsIndpbmRvdyIsInR5cGUiLCJfX253anMiLCJuYXZpZ2F0b3IiLCJ1c2VyQWdlbnQiLCJ0b0xvd2VyQ2FzZSIsImRvY3VtZW50IiwiZG9jdW1lbnRFbGVtZW50Iiwic3R5bGUiLCJXZWJraXRBcHBlYXJhbmNlIiwiY29uc29sZSIsImZpcmVidWciLCJleGNlcHRpb24iLCJ0YWJsZSIsInBhcnNlSW50IiwiUmVnRXhwIiwiJDEiLCJsb2NhbFN0b3JhZ2UiLCJsb2NhbHN0b3JhZ2UiLCJkZXN0cm95Iiwid2FybmVkIiwid2FybiIsImNvbG9ycyIsImxvZyIsImRlYnVnIiwiZm9ybWF0dGVycyIsImoiLCJ2IiwiSlNPTiIsInN0cmluZ2lmeSIsIm1lc3NhZ2UiLCJjcmVhdGVEZWJ1ZyIsInByZXZUaW1lIiwiZW5hYmxlT3ZlcnJpZGUiLCJlbmFibGVkIiwiY3VyciIsIk51bWJlciIsIkRhdGUiLCJtcyIsInByZXYiLCJjb2VyY2UiLCJ1bnNoaWZ0IiwiZm9ybWF0IiwiZm9ybWF0dGVyIiwidmFsIiwiY2FsbCIsImFwcGx5Iiwic2VsZWN0Q29sb3IiLCJleHRlbmQiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJnZXQiLCJzZXQiLCJpbml0IiwiZGVsaW1pdGVyIiwibmV3RGVidWciLCJ0b05hbWVzcGFjZSIsInJlZ2V4cCIsInRvU3RyaW5nIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiZGVmYXVsdCIsIkVycm9yIiwic3RhY2siLCJkaXNhYmxlIiwibmFtZXMiLCJtYXAiLCJza2lwcyIsImpvaW4iLCJlbmFibGUiLCJpIiwic3BsaXQiLCJsZW4iLCJwdXNoIiwic3Vic3RyIiwibmFtZSIsInRlc3QiLCJrZXlzIiwiZm9yRWFjaCIsImtleSIsImhhc2giLCJjaGFyQ29kZUF0IiwiTWF0aCIsImFicyIsImhhc093blByb3BlcnR5Iiwic2V0UHJvdG90eXBlT2YiLCJpc0Zyb3plbiIsImdldFByb3RvdHlwZU9mIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZnJlZXplIiwic2VhbCIsImNyZWF0ZSIsIl9yZWYiLCJSZWZsZWN0IiwiY29uc3RydWN0IiwiZnVuIiwidGhpc1ZhbHVlIiwieCIsIkZ1bmMiLCJGdW5jdGlvbiIsInByb3RvdHlwZSIsImJpbmQiLCJjb25jYXQiLCJhcnIiLCJBcnJheSIsImlzQXJyYXkiLCJhcnIyIiwiZnJvbSIsIl90b0NvbnN1bWFibGVBcnJheSIsImZ1bmMiLCJhcnJheUZvckVhY2giLCJ1bmFwcGx5IiwiYXJyYXlQb3AiLCJwb3AiLCJhcnJheVB1c2giLCJzdHJpbmdUb0xvd2VyQ2FzZSIsIlN0cmluZyIsInN0cmluZ01hdGNoIiwic3RyaW5nUmVwbGFjZSIsInN0cmluZ0luZGV4T2YiLCJpbmRleE9mIiwic3RyaW5nVHJpbSIsInRyaW0iLCJyZWdFeHBUZXN0IiwidHlwZUVycm9yQ3JlYXRlIiwiVHlwZUVycm9yIiwiX2xlbjIiLCJhcmd1bWVudHMiLCJfa2V5MiIsInRoaXNBcmciLCJfbGVuIiwiX2tleSIsImFkZFRvU2V0IiwiYXJyYXkiLCJsIiwiZWxlbWVudCIsImxjRWxlbWVudCIsImNsb25lIiwib2JqZWN0IiwibmV3T2JqZWN0IiwicHJvcGVydHkiLCJsb29rdXBHZXR0ZXIiLCJwcm9wIiwiZGVzYyIsInZhbHVlIiwiaHRtbCIsInN2ZyIsInN2Z0ZpbHRlcnMiLCJzdmdEaXNhbGxvd2VkIiwibWF0aE1sIiwibWF0aE1sRGlzYWxsb3dlZCIsInRleHQiLCJodG1sJDEiLCJzdmckMSIsIm1hdGhNbCQxIiwieG1sIiwiTVVTVEFDSEVfRVhQUiIsIkVSQl9FWFBSIiwiREFUQV9BVFRSIiwiQVJJQV9BVFRSIiwiSVNfQUxMT1dFRF9VUkkiLCJJU19TQ1JJUFRfT1JfREFUQSIsIkFUVFJfV0hJVEVTUEFDRSIsIl90eXBlb2YiLCJTeW1ib2wiLCJpdGVyYXRvciIsIm9iaiIsImNvbnN0cnVjdG9yIiwiX3RvQ29uc3VtYWJsZUFycmF5JDEiLCJnZXRHbG9iYWwiLCJfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5IiwidHJ1c3RlZFR5cGVzIiwiY3JlYXRlUG9saWN5Iiwic3VmZml4IiwiQVRUUl9OQU1FIiwiY3VycmVudFNjcmlwdCIsImhhc0F0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZSIsInBvbGljeU5hbWUiLCJjcmVhdGVIVE1MIiwiaHRtbCQkMSIsIl8iLCJjcmVhdGVET01QdXJpZnkiLCJ1bmRlZmluZWQiLCJET01QdXJpZnkiLCJ2ZXJzaW9uIiwicmVtb3ZlZCIsIm5vZGVUeXBlIiwiaXNTdXBwb3J0ZWQiLCJvcmlnaW5hbERvY3VtZW50IiwiRG9jdW1lbnRGcmFnbWVudCIsIkhUTUxUZW1wbGF0ZUVsZW1lbnQiLCJOb2RlIiwiRWxlbWVudCIsIk5vZGVGaWx0ZXIiLCJfd2luZG93JE5hbWVkTm9kZU1hcCIsIk5hbWVkTm9kZU1hcCIsIk1vek5hbWVkQXR0ck1hcCIsIlRleHQiLCJDb21tZW50IiwiRE9NUGFyc2VyIiwiRWxlbWVudFByb3RvdHlwZSIsImNsb25lTm9kZSIsImdldE5leHRTaWJsaW5nIiwiZ2V0Q2hpbGROb2RlcyIsImdldFBhcmVudE5vZGUiLCJ0ZW1wbGF0ZSIsImNyZWF0ZUVsZW1lbnQiLCJjb250ZW50Iiwib3duZXJEb2N1bWVudCIsInRydXN0ZWRUeXBlc1BvbGljeSIsImVtcHR5SFRNTCIsIlJFVFVSTl9UUlVTVEVEX1RZUEUiLCJfZG9jdW1lbnQiLCJpbXBsZW1lbnRhdGlvbiIsImNyZWF0ZU5vZGVJdGVyYXRvciIsImdldEVsZW1lbnRzQnlUYWdOYW1lIiwiY3JlYXRlRG9jdW1lbnRGcmFnbWVudCIsImltcG9ydE5vZGUiLCJkb2N1bWVudE1vZGUiLCJob29rcyIsImNyZWF0ZUhUTUxEb2N1bWVudCIsIk1VU1RBQ0hFX0VYUFIkJDEiLCJFUkJfRVhQUiQkMSIsIkRBVEFfQVRUUiQkMSIsIkFSSUFfQVRUUiQkMSIsIklTX1NDUklQVF9PUl9EQVRBJCQxIiwiQVRUUl9XSElURVNQQUNFJCQxIiwiSVNfQUxMT1dFRF9VUkkkJDEiLCJBTExPV0VEX1RBR1MiLCJERUZBVUxUX0FMTE9XRURfVEFHUyIsIkFMTE9XRURfQVRUUiIsIkRFRkFVTFRfQUxMT1dFRF9BVFRSIiwiRk9SQklEX1RBR1MiLCJGT1JCSURfQVRUUiIsIkFMTE9XX0FSSUFfQVRUUiIsIkFMTE9XX0RBVEFfQVRUUiIsIkFMTE9XX1VOS05PV05fUFJPVE9DT0xTIiwiU0FGRV9GT1JfVEVNUExBVEVTIiwiV0hPTEVfRE9DVU1FTlQiLCJTRVRfQ09ORklHIiwiRk9SQ0VfQk9EWSIsIlJFVFVSTl9ET00iLCJSRVRVUk5fRE9NX0ZSQUdNRU5UIiwiUkVUVVJOX0RPTV9JTVBPUlQiLCJTQU5JVElaRV9ET00iLCJLRUVQX0NPTlRFTlQiLCJJTl9QTEFDRSIsIlVTRV9QUk9GSUxFUyIsIkZPUkJJRF9DT05URU5UUyIsIkRBVEFfVVJJX1RBR1MiLCJERUZBVUxUX0RBVEFfVVJJX1RBR1MiLCJVUklfU0FGRV9BVFRSSUJVVEVTIiwiREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTIiwiQ09ORklHIiwiZm9ybUVsZW1lbnQiLCJfcGFyc2VDb25maWciLCJjZmciLCJBRERfVVJJX1NBRkVfQVRUUiIsIkFERF9EQVRBX1VSSV9UQUdTIiwiQUxMT1dFRF9VUklfUkVHRVhQIiwiQUREX1RBR1MiLCJBRERfQVRUUiIsInRib2R5IiwiTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTIiwiSFRNTF9JTlRFR1JBVElPTl9QT0lOVFMiLCJBTExfU1ZHX1RBR1MiLCJBTExfTUFUSE1MX1RBR1MiLCJNQVRITUxfTkFNRVNQQUNFIiwiU1ZHX05BTUVTUEFDRSIsIkhUTUxfTkFNRVNQQUNFIiwiX2NoZWNrVmFsaWROYW1lc3BhY2UiLCJwYXJlbnQiLCJ0YWdOYW1lIiwibmFtZXNwYWNlVVJJIiwicGFyZW50VGFnTmFtZSIsIkJvb2xlYW4iLCJjb21tb25TdmdBbmRIVE1MRWxlbWVudHMiLCJfZm9yY2VSZW1vdmUiLCJub2RlIiwicGFyZW50Tm9kZSIsInJlbW92ZUNoaWxkIiwib3V0ZXJIVE1MIiwicmVtb3ZlIiwiX3JlbW92ZUF0dHJpYnV0ZSIsImF0dHJpYnV0ZSIsImdldEF0dHJpYnV0ZU5vZGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJzZXRBdHRyaWJ1dGUiLCJfaW5pdERvY3VtZW50IiwiZGlydHkiLCJkb2MiLCJsZWFkaW5nV2hpdGVzcGFjZSIsIm1hdGNoZXMiLCJkaXJ0eVBheWxvYWQiLCJwYXJzZUZyb21TdHJpbmciLCJib2R5IiwiZmlyc3RFbGVtZW50Q2hpbGQiLCJpbnNlcnRCZWZvcmUiLCJjcmVhdGVUZXh0Tm9kZSIsImNoaWxkTm9kZXMiLCJfY3JlYXRlSXRlcmF0b3IiLCJTSE9XX0VMRU1FTlQiLCJTSE9XX0NPTU1FTlQiLCJTSE9XX1RFWFQiLCJGSUxURVJfQUNDRVBUIiwiX2lzQ2xvYmJlcmVkIiwiZWxtIiwibm9kZU5hbWUiLCJ0ZXh0Q29udGVudCIsImF0dHJpYnV0ZXMiLCJfaXNOb2RlIiwiX2V4ZWN1dGVIb29rIiwiZW50cnlQb2ludCIsImN1cnJlbnROb2RlIiwiZGF0YSIsImhvb2siLCJfc2FuaXRpemVFbGVtZW50cyIsImFsbG93ZWRUYWdzIiwiaW5uZXJIVE1MIiwiX2lzVmFsaWRBdHRyaWJ1dGUiLCJsY1RhZyIsImxjTmFtZSIsIl9zYW5pdGl6ZUF0dHJpYnV0ZXMiLCJhdHRyIiwiaG9va0V2ZW50IiwiYXR0ck5hbWUiLCJhdHRyVmFsdWUiLCJrZWVwQXR0ciIsImFsbG93ZWRBdHRyaWJ1dGVzIiwiX2F0dHIiLCJmb3JjZUtlZXBBdHRyIiwic2V0QXR0cmlidXRlTlMiLCJfc2FuaXRpemVTaGFkb3dET00iLCJmcmFnbWVudCIsInNoYWRvd05vZGUiLCJzaGFkb3dJdGVyYXRvciIsIm5leHROb2RlIiwic2FuaXRpemUiLCJpbXBvcnRlZE5vZGUiLCJvbGROb2RlIiwicmV0dXJuTm9kZSIsInRvU3RhdGljSFRNTCIsImFwcGVuZENoaWxkIiwiZmlyc3RDaGlsZCIsIm5vZGVJdGVyYXRvciIsInNlcmlhbGl6ZWRIVE1MIiwic2V0Q29uZmlnIiwiY2xlYXJDb25maWciLCJpc1ZhbGlkQXR0cmlidXRlIiwidGFnIiwiYWRkSG9vayIsImhvb2tGdW5jdGlvbiIsInJlbW92ZUhvb2siLCJyZW1vdmVIb29rcyIsInJlbW92ZUFsbEhvb2tzIiwiaGFzIiwicHJlZml4IiwiRXZlbnRzIiwiRUUiLCJmbiIsImNvbnRleHQiLCJvbmNlIiwiYWRkTGlzdGVuZXIiLCJlbWl0dGVyIiwiZXZlbnQiLCJsaXN0ZW5lciIsImV2dCIsIl9ldmVudHMiLCJfZXZlbnRzQ291bnQiLCJjbGVhckV2ZW50IiwiRXZlbnRFbWl0dGVyIiwiX19wcm90b19fIiwiZXZlbnROYW1lcyIsImV2ZW50cyIsInNsaWNlIiwiZ2V0T3duUHJvcGVydHlTeW1ib2xzIiwibGlzdGVuZXJzIiwiaGFuZGxlcnMiLCJlZSIsImxpc3RlbmVyQ291bnQiLCJlbWl0IiwiYTEiLCJhMiIsImEzIiwiYTQiLCJhNSIsInJlbW92ZUxpc3RlbmVyIiwib24iLCJyZW1vdmVBbGxMaXN0ZW5lcnMiLCJvZmYiLCJwcmVmaXhlZCIsImN0b3IiLCJzdXBlckN0b3IiLCJzdXBlcl8iLCJ3cml0YWJsZSIsIlRlbXBDdG9yIiwicyIsIm0iLCJoIiwiZCIsInBsdXJhbCIsIm1zQWJzIiwibiIsImlzUGx1cmFsIiwicm91bmQiLCJvcHRpb25zIiwic3RyIiwiZXhlYyIsInBhcnNlRmxvYXQiLCJwYXJzZSIsImlzRmluaXRlIiwibG9uZyIsImZtdFNob3J0IiwiaXNXaW5kb3dzIiwicGxhdGZvcm0iLCJ1dGlsIiwibm9ybWFsaXplQXJyYXkiLCJwYXJ0cyIsImFsbG93QWJvdmVSb290IiwicmVzIiwicCIsInRyaW1BcnJheSIsImxhc3RJbmRleCIsInN0YXJ0IiwiZW5kIiwic3BsaXREZXZpY2VSZSIsInNwbGl0VGFpbFJlIiwid2luMzIiLCJ3aW4zMlNwbGl0UGF0aCIsImZpbGVuYW1lIiwicmVzdWx0IiwiZGV2aWNlIiwidGFpbCIsInJlc3VsdDIiLCJ3aW4zMlN0YXRQYXRoIiwicGF0aCIsImlzVW5jIiwiaXNBYnNvbHV0ZSIsIm5vcm1hbGl6ZVVOQ1Jvb3QiLCJyZXNvbHZlIiwicmVzb2x2ZWREZXZpY2UiLCJyZXNvbHZlZFRhaWwiLCJyZXNvbHZlZEFic29sdXRlIiwiY3dkIiwiaXNTdHJpbmciLCJub3JtYWxpemUiLCJ0cmFpbGluZ1NsYXNoIiwicGF0aHMiLCJhcmciLCJqb2luZWQiLCJyZWxhdGl2ZSIsInRvIiwibG93ZXJGcm9tIiwibG93ZXJUbyIsInRvUGFydHMiLCJsb3dlckZyb21QYXJ0cyIsImxvd2VyVG9QYXJ0cyIsIm1pbiIsInNhbWVQYXJ0c0xlbmd0aCIsIm91dHB1dFBhcnRzIiwiX21ha2VMb25nIiwicmVzb2x2ZWRQYXRoIiwiZGlybmFtZSIsImRpciIsImJhc2VuYW1lIiwiZXh0IiwiZiIsImV4dG5hbWUiLCJwYXRoT2JqZWN0IiwiaXNPYmplY3QiLCJiYXNlIiwic2VwIiwicGF0aFN0cmluZyIsImFsbFBhcnRzIiwic3BsaXRQYXRoUmUiLCJwb3NpeCIsInBvc2l4U3BsaXRQYXRoIiwiY2hhckF0Iiwic2VnbWVudCIsImZyb21QYXJ0cyIsImNhY2hlZFNldFRpbWVvdXQiLCJjYWNoZWRDbGVhclRpbWVvdXQiLCJkZWZhdWx0U2V0VGltb3V0IiwiZGVmYXVsdENsZWFyVGltZW91dCIsInJ1blRpbWVvdXQiLCJzZXRUaW1lb3V0IiwiZSIsImNsZWFyVGltZW91dCIsImN1cnJlbnRRdWV1ZSIsInF1ZXVlIiwiZHJhaW5pbmciLCJxdWV1ZUluZGV4IiwiY2xlYW5VcE5leHRUaWNrIiwiZHJhaW5RdWV1ZSIsInRpbWVvdXQiLCJydW4iLCJtYXJrZXIiLCJydW5DbGVhclRpbWVvdXQiLCJJdGVtIiwibm9vcCIsIm5leHRUaWNrIiwidGl0bGUiLCJicm93c2VyIiwiYXJndiIsInZlcnNpb25zIiwicHJlcGVuZExpc3RlbmVyIiwicHJlcGVuZE9uY2VMaXN0ZW5lciIsImJpbmRpbmciLCJjaGRpciIsInVtYXNrIiwiY29weSIsImZpbGwiLCJyZWFkVUludDgiLCJmb3JtYXRSZWdFeHAiLCJvYmplY3RzIiwiaW5zcGVjdCIsImlzTnVsbCIsImRlcHJlY2F0ZSIsIm1zZyIsImlzVW5kZWZpbmVkIiwiZyIsIm5vRGVwcmVjYXRpb24iLCJ0aHJvd0RlcHJlY2F0aW9uIiwidHJhY2VEZXByZWNhdGlvbiIsInRyYWNlIiwiZGVidWdFbnZpcm9uIiwiZGVidWdzIiwib3B0cyIsImN0eCIsInNlZW4iLCJzdHlsaXplIiwic3R5bGl6ZU5vQ29sb3IiLCJkZXB0aCIsImlzQm9vbGVhbiIsInNob3dIaWRkZW4iLCJfZXh0ZW5kIiwiY3VzdG9tSW5zcGVjdCIsInN0eWxpemVXaXRoQ29sb3IiLCJmb3JtYXRWYWx1ZSIsInN0eWxlVHlwZSIsInN0eWxlcyIsInJlY3Vyc2VUaW1lcyIsImlzRnVuY3Rpb24iLCJyZXQiLCJwcmltaXRpdmUiLCJzaW1wbGUiLCJpc051bWJlciIsImZvcm1hdFByaW1pdGl2ZSIsInZpc2libGVLZXlzIiwiaWR4IiwiYXJyYXlUb0hhc2giLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiaXNFcnJvciIsImZvcm1hdEVycm9yIiwiaXNSZWdFeHAiLCJpc0RhdGUiLCJvdXRwdXQiLCJicmFjZXMiLCJ0b1VUQ1N0cmluZyIsImZvcm1hdFByb3BlcnR5IiwiZm9ybWF0QXJyYXkiLCJyZWR1Y2UiLCJjdXIiLCJyZWR1Y2VUb1NpbmdsZVN0cmluZyIsImxpbmUiLCJhciIsInJlIiwib2JqZWN0VG9TdHJpbmciLCJvIiwicGFkIiwiZGVidWdsb2ciLCJOT0RFX0RFQlVHIiwidG9VcHBlckNhc2UiLCJwaWQiLCJpc051bGxPclVuZGVmaW5lZCIsImlzU3ltYm9sIiwiaXNQcmltaXRpdmUiLCJpc0J1ZmZlciIsIm1vbnRocyIsInRpbWVzdGFtcCIsInRpbWUiLCJnZXRIb3VycyIsImdldE1pbnV0ZXMiLCJnZXRTZWNvbmRzIiwiZ2V0RGF0ZSIsImdldE1vbnRoIiwiaW5oZXJpdHMiLCJvcmlnaW4iLCJhZGQiLCJfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18iLCJfX3dlYnBhY2tfcmVxdWlyZV9fIiwibW9kdWxlSWQiLCJfX3dlYnBhY2tfbW9kdWxlc19fIiwiZ2V0dGVyIiwiX19lc01vZHVsZSIsImEiLCJkZWZpbml0aW9uIiwiZ2xvYmFsVGhpcyIsInRvU3RyaW5nVGFnIiwiX19hc3NpZ24iLCJhc3NpZ24iLCJ0IiwibG93ZXJDYXNlIiwiREVGQVVMVF9TUExJVF9SRUdFWFAiLCJERUZBVUxUX1NUUklQX1JFR0VYUCIsImlucHV0Iiwic25ha2VDYXNlIiwiX2EiLCJzcGxpdFJlZ2V4cCIsIl9iIiwic3RyaXBSZWdleHAiLCJfYyIsInRyYW5zZm9ybSIsIl9kIiwibm9DYXNlIiwiZG90Q2FzZSIsIml0ZW0iLCJkZWVwTWVyZ2UiLCJ0YXJnZXQiLCJzb3VyY2VzIiwiU2V0IiwiZ2VuSUQiLCJyYW5kb20iLCJ1Y0ZpcnN0Iiwid2l0aEZpbGVQcm90b2NvbCIsImRlZmVycmVkIiwicmVqZWN0Iiwic2V0dGxlZCIsInRpbWVGbiIsInByb21pc2UiLCJQcm9taXNlIiwicmVzb2x2ZTEiLCJyZWplY3QxIiwiY3JlYXRlZCIsIm5vdyIsInNldFRhZyIsImludm9rZUhvc3RFeHBvcnRlZEFwaSIsIm1ldGhvZCIsIm1ldGhvZDEiLCJsb2dzZXFIb3N0RXhwb3J0ZWRBcGkiLCJsb2dzZXEiLCJhcGkiLCJhcGlzIiwic2V0dXBJZnJhbWVTYW5kYm94IiwicHJvcHMiLCJpZnJhbWUiLCJjbGFzc0xpc3QiLCJlbnRyaWVzIiwiayIsImFzeW5jIiwic2V0dXBJbmplY3RlZFN0eWxlIiwiYXR0cnMiLCJlbCIsInF1ZXJ5U2VsZWN0b3IiLCJoZWFkIiwiYXBwZW5kIiwic2V0dXBJbmplY3RlZFVJIiwidWkiLCJwbCIsInNlbGVjdG9yIiwic2xvdCIsImRlYnVnVGFnIiwiaWQiLCJkYXRhc2V0IiwiaW5qZWN0ZWRVaSIsImFkZEV2ZW50TGlzdGVuZXIiLCJ0cmlnZ2VyIiwiY2xvc2VzdCIsIm1zZ1R5cGUiLCJjYWxsZXIiLCJjYWxsVXNlck1vZGVsIiwidHJhbnNmb3JtYWJsZUV2ZW50IiwiZHMiLCJGTEFHX1JFQ1QiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0b0pTT04iLCJpbmplY3RlZFRoZW1lRWZmZWN0Iiwic2V0dXBJbmplY3RlZFRoZW1lIiwidXJsIiwibGluayIsInJlbCIsImhyZWYiLCJtZXNzYWdlVHlwZSIsIl9tZXNzYWdlSWQiLCJtZXNzYWdlVHlwZXMiLCJoYW5kc2hha2UiLCJyZXBseSIsInJlcXVlc3QiLCJhbGxvd2VkT3JpZ2luIiwicG9zdG1hdGUiLCJQYXJlbnRBUEkiLCJpbmZvIiwiX3RoaXMiLCJmcmFtZSIsImNoaWxkIiwiY2hpbGRPcmlnaW4iLCJfcHJvdG8iLCJfdGhpczIiLCJQb3N0bWF0ZSIsInVpZCIsInRyYW5zYWN0IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInBvc3RNZXNzYWdlIiwiZXZlbnROYW1lIiwiY2FsbGJhY2siLCJDaGlsZEFQSSIsIl90aGlzMyIsIm1vZGVsIiwicGFyZW50T3JpZ2luIiwiX2UkZGF0YSIsInVud3JhcHBlZENvbnRleHQiLCJyZXNvbHZlVmFsdWUiLCJ0aGVuIiwic291cmNlIiwiX3JlZjIiLCJfcmVmMiRjb250YWluZXIiLCJjb250YWluZXIiLCJfcmVmMiRjbGFzc0xpc3RBcnJheSIsImNsYXNzTGlzdEFycmF5IiwiY29udGVudFdpbmRvdyIsImNvbnRlbnREb2N1bWVudCIsInBhcmVudFdpbmRvdyIsInNlbmRIYW5kc2hha2UiLCJyZXNwb25zZUludGVydmFsIiwiX3RoaXM0IiwicHJvdG9jb2wiLCJsb2NhdGlvbiIsImhvc3QiLCJwb3J0IiwiaG9zdG5hbWUiLCJyZXNvbHZlT3JpZ2luIiwiYXR0ZW1wdCIsImNsZWFySW50ZXJ2YWwiLCJkb1NlbmQiLCJsb2FkZWQiLCJzZXRJbnRlcnZhbCIsImF0dGFjaEV2ZW50Iiwib25sb2FkIiwic3JjIiwiTW9kZWwiLCJzZW5kSGFuZHNoYWtlUmVwbHkiLCJfdGhpczUiLCJzaGFrZSIsImRlZmF1bHRzIiwiYXBwIiwiYmFzZUluZm8iLCJyZWdpc3RlcmVkQ21kVWlkIiwiZWRpdG9yIiwiYWN0aW9ucyIsIml0IiwiZXZlbnRLZXkiLCJFZGl0b3IiLCJhY3Rpb24iLCJsYWJlbCIsImRiIiwiTFNQbHVnaW5Vc2VyIiwiX2Jhc2VJbmZvIiwiX2NhbGxlciIsInN1cGVyIiwiX2Nvbm5lY3RlZCIsIl91aSIsIk1hcCIsInBheWxvYWQiLCJiIiwic2V0dGluZ3MiLCJhY3RvciIsInJlc3QiLCJjYiIsIl9iZWZvcmV1bmxvYWRDYWxsYmFjayIsImNvbm5lY3RUb1BhcmVudCIsIl9leHRlbmRVc2VyTW9kZWwiLCJ0aGVtZSIsInZpc2libGUiLCJjdXJzb3IiLCJyZXN0b3JlRWRpdGluZ0N1cnNvciIsInN0YXRlIiwiaGlkZU1haW5VSSIsInNob3dNYWluVUkiLCJ0aGF0IiwiUHJveHkiLCJwcm9wS2V5IiwicmVjZWl2ZXIiLCJvcmlnTWV0aG9kIiwiaG9va01hdGNoZXIiLCJoYW5kbGVyIiwiY2FsbEFzeW5jIiwiX21ha2VVc2VyUHJveHkiLCJfX0xTUF9fSE9TVF9fIiwiTFNQbHVnaW5DYWxsZXIiLCJpbXBvcnRIVE1MIiwiY3JlYXRlU2FuZGJveENvbnRhaW5lciIsIlFTYW5kYm94IiwidXNlckZldGNoIiwic3RhcnRzV2l0aCIsImZldGNoIiwiZG9BY3Rpb24iLCJMU1BsdWdpblNoYWRvd0ZyYW1lIiwiX3BsdWdpbkxvY2FsIiwiX2xvYWRlZCIsIl91bm1vdW50Rm5zIiwiX2Rpc3Bvc2UiLCJfdW5tb3VudCIsImVudHJ5IiwiZXhlY1NjcmlwdHMiLCJfbW91bnQiLCJnbG9iYWwiLCJlbGVtZW50R2V0dGVyIiwiX3Jvb3QiLCJpbnN0YW5jZSIsInByb3h5IiwiX19zaGFkb3dfbW9kZV9fIiwiTFNQbHVnaW5Mb2NhbCIsIkxTUGx1Z2luU2hhZG93IiwiZXhlY1Jlc3VsdCIsInVubW91bnQiLCJfZnJhbWUiLCJhdHRhY2hTaGFkb3ciLCJtb2RlIiwiRkxBR19BV0FJVCIsIkxTUE1TRyIsIkxTUE1TR19FUlJPUl9UQUciLCJMU1BNU0dfU0VUVElOR1MiLCJMU1BNU0dfQkVGT1JFX1VOTE9BRCIsIkxTUE1TR19TWU5DIiwiTFNQTVNHX1JFQURZIiwiTFNQTVNHRm4iLCJfdXNlck1vZGVsIiwiX2RlYnVnVGFnIiwic2hhZG93IiwiX3NldHVwU2hhZG93U2FuZGJveCIsIl9zZXR1cElmcmFtZVNhbmRib3giLCJ1c2VyTW9kZWwiLCJpc1NoYWRvd01vZGUiLCJzeW5jR0NUaW1lciIsInN5bmNUYWciLCJzeW5jQWN0b3JzIiwicmVhZHlEZWZlcnJlZCIsIm5zIiwiX3N5bmMiLCJkZWxldGUiLCJfc3RhdHVzIiwicmVmUGFyZW50IiwiX2NoaWxkIiwiX2NhbGwiLCJfY2FsbFVzZXJNb2RlbCIsInNpemUiLCJmaW5hbGx5IiwidGltZXIiLCJyZWZDaGlsZCIsIl9wYXJlbnQiLCJjYXRjaCIsIl9zaGFkb3ciLCJQbHVnaW5TZXR0aW5ncyIsIl91c2VyUGx1Z2luU2V0dGluZ3MiLCJfc2V0dGluZ3MiLCJkaXNhYmxlZCIsIlBsdWdpbkxvZ2dlciIsIl90YWciLCJfbG9ncyIsImFjIiwidG9Mb2NhbGVUaW1lU3RyaW5nIiwid3JpdGUiLCJQbHVnaW5Mb2NhbExvYWRTdGF0dXMiLCJJbGxlZ2FsUGx1Z2luUGFja2FnZUVycm9yIiwiRXhpc3RlZEltcG9ydGVkUGx1Z2luUGFja2FnZUVycm9yIiwiUGx1Z2luTG9jYWwiLCJfb3B0aW9ucyIsIl90aGVtZU1nciIsIl9jdHgiLCJwbHVnaW5Mb2NhbCIsIl9kaXNwb3NlcyIsIlVOTE9BREVEIiwiX2lkIiwidG9nZ2xlIiwiZ2V0TWFpblVJIiwiZm9jdXMiLCJpbml0TWFpblVJSGFuZGxlcnMiLCJ0aGVtZWQiLCJ0aGVtZU1nciIsInJlZ2lzdGVyVGhlbWUiLCJ1bnJlZ2lzdGVyVGhlbWUiLCJfb25Ib3N0TW91bnRlZCIsImluaXRQcm92aWRlckhhbmRsZXJzIiwiaW5pdEFwaVByb3h5SGFuZGxlcnMiLCJsb2dnZXIiLCJ1c2VyU2V0dGluZ3NGaWxlUGF0aCIsInVzZXJTZXR0aW5ncyIsIl91c2VyU2V0dGluZ3NGaWxlIiwidW5sb2FkIiwiX2dldFNhbmRib3hTaGFkb3dDb250YWluZXIiLCJfZ2V0U2FuZGJveElmcmFtZUNvbnRhaW5lciIsInBrZyIsImxvY2FsUm9vdCIsIl9sb2NhbFJvb3QiLCJtYWtlRnVsbFVybCIsImxvYyIsInVzZUZpbGVQcm90b2NvbCIsInJlZyIsIm1haW4iLCJpY29uIiwicmVnaXN0ZXJlZFBsdWdpbnMiLCJpc1JlZ2lzdGVyaW5nIiwidGhlbWVzIiwiX2xvYWRDb25maWdUaGVtZXMiLCJkZXZFbnRyeSIsImVuZHNXaXRoIiwic2RrUGF0aCIsImVudHJ5UGF0aCIsInJlYWR5SW5kaWNhdG9yIiwicGVuZGluZyIsIkxPQURJTkciLCJfbG9hZEVyciIsImluc3RhbGxQYWNrYWdlVGhlbWVzIiwiX3ByZXBhcmVQYWNrYWdlQ29uZmlncyIsIl9zZXR1cFVzZXJTZXR0aW5ncyIsIl90cnlUb05vcm1hbGl6ZUVudHJ5IiwiY29ubmVjdFRvQ2hpbGQiLCJyZWFkeUZuIiwiRVJST1IiLCJMT0FERUQiLCJ1bnJlZ2lzdGVyIiwiaXNJbnN0YWxsZWRJblVzZXJSb290IiwiVU5MT0FESU5HIiwiZXZlbnRCZWZvcmVVbmxvYWQiLCJkaXNwb3NlIiwiaG9zdE1vdW50ZWRBY3RvciIsInVzZXJSb290IiwibG9jYWxVc2VyQ29uZmlnUm9vdCIsInBsdWdSb290IiwiaW5jbHVkZXMiLCJqc29uIiwiZXJyIiwibG9hZEVyciIsInVzZiIsInVzZXJTZXR0aW5nc0ZpbGUiLCJMU1BsdWdpbkNvcmUiLCJfaXNSZWdpc3RlcmluZyIsIl9ob3N0TW91bnRlZEFjdG9yIiwiX3VzZXJQcmVmZXJlbmNlcyIsIl9yZWdpc3RlcmVkVGhlbWVzIiwiX3JlZ2lzdGVyZWRQbHVnaW5zIiwic2VsZWN0VGhlbWUiLCJwbHVnaW5zIiwiaW5pdGlhbCIsIl9yZWFkeUluZGljYXRvciIsImxvYWRVc2VyUHJlZmVyZW5jZXMiLCJleHRlcm5hbHMiLCJmaWx0ZXIiLCJldmVyeSIsInBsdWdpbk9wdGlvbnMiLCJ0aW1lTGFiZWwiLCJ0aW1lRW5kIiwic2F2ZVVzZXJQcmVmZXJlbmNlcyIsImFjdGl2YXRlVXNlclByZWZlcmVuY2VzIiwicmVnaXN0ZXIiLCJpZGVudGl0eSIsImVuc3VyZVBsdWdpbiIsInJlbG9hZCIsInVucmVnaXN0ZXJlZEV4dGVybmFscyIsInBsdWdpbiIsIl9ob29rIiwicGFyYW1zIiwib3B0IiwiZWZmZWN0Iiwic2V0dXBQbHVnaW5Db3JlIiwicGx1Z2luQ29yZSJdLCJtYXBwaW5ncyI6IjtDQUFBLFNBQTJDQSxFQUFNQyxHQUMxQixpQkFBWkMsU0FBMEMsaUJBQVhDLE9BQ3hDQSxPQUFPRCxRQUFVRCxJQUNRLG1CQUFYRyxRQUF5QkEsT0FBT0MsSUFDOUNELE9BQU8sR0FBSUgsR0FDZSxpQkFBWkMsUUFDZEEsUUFBa0IsU0FBSUQsSUFFdEJELEVBQWUsU0FBSUMsSUFSckIsQ0FTR0ssTUFBTSxXQUNULE0sd0NDSkFKLEVBQVFLLFdBMklSLFNBQW9CQyxHQVFuQixHQVBBQSxFQUFLLElBQU1DLEtBQUtDLFVBQVksS0FBTyxJQUNsQ0QsS0FBS0UsV0FDSkYsS0FBS0MsVUFBWSxNQUFRLEtBQzFCRixFQUFLLElBQ0pDLEtBQUtDLFVBQVksTUFBUSxLQUMxQixJQUFNUCxFQUFPRCxRQUFRVSxTQUFTSCxLQUFLSSxPQUUvQkosS0FBS0MsVUFDVCxPQUdELE1BQU1JLEVBQUksVUFBWUwsS0FBS00sTUFDM0JQLEVBQUtRLE9BQU8sRUFBRyxFQUFHRixFQUFHLGtCQUtyQixJQUFJRyxFQUFRLEVBQ1JDLEVBQVEsRUFDWlYsRUFBSyxHQUFHVyxRQUFRLGVBQWVDLElBQ2hCLE9BQVZBLElBR0pILElBQ2MsT0FBVkcsSUFHSEYsRUFBUUQsT0FJVlQsRUFBS1EsT0FBT0UsRUFBTyxFQUFHSixJQTFLdkJaLEVBQVFtQixLQTZMUixTQUFjQyxHQUNiLElBQ0tBLEVBQ0hwQixFQUFRcUIsUUFBUUMsUUFBUSxRQUFTRixHQUVqQ3BCLEVBQVFxQixRQUFRRSxXQUFXLFNBRTNCLE1BQU9DLE1Bbk1WeEIsRUFBUXlCLEtBK01SLFdBQ0MsSUFBSUMsRUFDSixJQUNDQSxFQUFJ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Z0JBQWlCdlosS0FBS2k2QixPQUFRLENBQUVoUCxTQUdsRCxTQUFTOFMsR0FBZ0IvaUIsR0FDckIsTUFBTWdqQixFQUFhLElBQUk5QixHQUFhbGhCLEdBQ3BDLEdBQU0sNENBQ054WixPQUFPMDZCLGFBQWU4QixJIiwiZmlsZSI6ImxzcGx1Z2luLmNvcmUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJMU1BsdWdpblwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJMU1BsdWdpblwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsIGZ1bmN0aW9uKCkge1xucmV0dXJuICIsIi8qIGVzbGludC1lbnYgYnJvd3NlciAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHdlYiBicm93c2VyIGltcGxlbWVudGF0aW9uIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5leHBvcnRzLmZvcm1hdEFyZ3MgPSBmb3JtYXRBcmdzO1xuZXhwb3J0cy5zYXZlID0gc2F2ZTtcbmV4cG9ydHMubG9hZCA9IGxvYWQ7XG5leHBvcnRzLnVzZUNvbG9ycyA9IHVzZUNvbG9ycztcbmV4cG9ydHMuc3RvcmFnZSA9IGxvY2Fsc3RvcmFnZSgpO1xuZXhwb3J0cy5kZXN0cm95ID0gKCgpID0+IHtcblx0bGV0IHdhcm5lZCA9IGZhbHNlO1xuXG5cdHJldHVybiAoKSA9PiB7XG5cdFx0aWYgKCF3YXJuZWQpIHtcblx0XHRcdHdhcm5lZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0XHR9XG5cdH07XG59KSgpO1xuXG4vKipcbiAqIENvbG9ycy5cbiAqL1xuXG5leHBvcnRzLmNvbG9ycyA9IFtcblx0JyMwMDAwQ0MnLFxuXHQnIzAwMDBGRicsXG5cdCcjMDAzM0NDJyxcblx0JyMwMDMzRkYnLFxuXHQnIzAwNjZDQycsXG5cdCcjMDA2NkZGJyxcblx0JyMwMDk5Q0MnLFxuXHQnIzAwOTlGRicsXG5cdCcjMDBDQzAwJyxcblx0JyMwMENDMzMnLFxuXHQnIzAwQ0M2NicsXG5cdCcjMDBDQzk5Jyxcblx0JyMwMENDQ0MnLFxuXHQnIzAwQ0NGRicsXG5cdCcjMzMwMENDJyxcblx0JyMzMzAwRkYnLFxuXHQnIzMzMzNDQycsXG5cdCcjMzMzM0ZGJyxcblx0JyMzMzY2Q0MnLFxuXHQnIzMzNjZGRicsXG5cdCcjMzM5OUNDJyxcblx0JyMzMzk5RkYnLFxuXHQnIzMzQ0MwMCcsXG5cdCcjMzNDQzMzJyxcblx0JyMzM0NDNjYnLFxuXHQnIzMzQ0M5OScsXG5cdCcjMzNDQ0NDJyxcblx0JyMzM0NDRkYnLFxuXHQnIzY2MDBDQycsXG5cdCcjNjYwMEZGJyxcblx0JyM2NjMzQ0MnLFxuXHQnIzY2MzNGRicsXG5cdCcjNjZDQzAwJyxcblx0JyM2NkNDMzMnLFxuXHQnIzk5MDBDQycsXG5cdCcjOTkwMEZGJyxcblx0JyM5OTMzQ0MnLFxuXHQnIzk5MzNGRicsXG5cdCcjOTlDQzAwJyxcblx0JyM5OUNDMzMnLFxuXHQnI0NDMDAwMCcsXG5cdCcjQ0MwMDMzJyxcblx0JyNDQzAwNjYnLFxuXHQnI0NDMDA5OScsXG5cdCcjQ0MwMENDJyxcblx0JyNDQzAwRkYnLFxuXHQnI0NDMzMwMCcsXG5cdCcjQ0MzMzMzJyxcblx0JyNDQzMzNjYnLFxuXHQnI0NDMzM5OScsXG5cdCcjQ0MzM0NDJyxcblx0JyNDQzMzRkYnLFxuXHQnI0NDNjYwMCcsXG5cdCcjQ0M2NjMzJyxcblx0JyNDQzk5MDAnLFxuXHQnI0NDOTkzMycsXG5cdCcjQ0NDQzAwJyxcblx0JyNDQ0NDMzMnLFxuXHQnI0ZGMDAwMCcsXG5cdCcjRkYwMDMzJyxcblx0JyNGRjAwNjYnLFxuXHQnI0ZGMDA5OScsXG5cdCcjRkYwMENDJyxcblx0JyNGRjAwRkYnLFxuXHQnI0ZGMzMwMCcsXG5cdCcjRkYzMzMzJyxcblx0JyNGRjMzNjYnLFxuXHQnI0ZGMzM5OScsXG5cdCcjRkYzM0NDJyxcblx0JyNGRjMzRkYnLFxuXHQnI0ZGNjYwMCcsXG5cdCcjRkY2NjMzJyxcblx0JyNGRjk5MDAnLFxuXHQnI0ZGOTkzMycsXG5cdCcjRkZDQzAwJyxcblx0JyNGRkNDMzMnXG5dO1xuXG4vKipcbiAqIEN1cnJlbnRseSBvbmx5IFdlYktpdC1iYXNlZCBXZWIgSW5zcGVjdG9ycywgRmlyZWZveCA+PSB2MzEsXG4gKiBhbmQgdGhlIEZpcmVidWcgZXh0ZW5zaW9uIChhbnkgRmlyZWZveCB2ZXJzaW9uKSBhcmUga25vd25cbiAqIHRvIHN1cHBvcnQgXCIlY1wiIENTUyBjdXN0b21pemF0aW9ucy5cbiAqXG4gKiBUT0RPOiBhZGQgYSBgbG9jYWxTdG9yYWdlYCB2YXJpYWJsZSB0byBleHBsaWNpdGx5IGVuYWJsZS9kaXNhYmxlIGNvbG9yc1xuICovXG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5mdW5jdGlvbiB1c2VDb2xvcnMoKSB7XG5cdC8vIE5COiBJbiBhbiBFbGVjdHJvbiBwcmVsb2FkIHNjcmlwdCwgZG9jdW1lbnQgd2lsbCBiZSBkZWZpbmVkIGJ1dCBub3QgZnVsbHlcblx0Ly8gaW5pdGlhbGl6ZWQuIFNpbmNlIHdlIGtub3cgd2UncmUgaW4gQ2hyb21lLCB3ZSdsbCBqdXN0IGRldGVjdCB0aGlzIGNhc2Vcblx0Ly8gZXhwbGljaXRseVxuXHRpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LnByb2Nlc3MgJiYgKHdpbmRvdy5wcm9jZXNzLnR5cGUgPT09ICdyZW5kZXJlcicgfHwgd2luZG93LnByb2Nlc3MuX19ud2pzKSkge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Ly8gSW50ZXJuZXQgRXhwbG9yZXIgYW5kIEVkZ2UgZG8gbm90IHN1cHBvcnQgY29sb3JzLlxuXHRpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goLyhlZGdlfHRyaWRlbnQpXFwvKFxcZCspLykpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBJcyB3ZWJraXQ/IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzE2NDU5NjA2LzM3Njc3M1xuXHQvLyBkb2N1bWVudCBpcyB1bmRlZmluZWQgaW4gcmVhY3QtbmF0aXZlOiBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svcmVhY3QtbmF0aXZlL3B1bGwvMTYzMlxuXHRyZXR1cm4gKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuV2Via2l0QXBwZWFyYW5jZSkgfHxcblx0XHQvLyBJcyBmaXJlYnVnPyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zOTgxMjAvMzc2NzczXG5cdFx0KHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5jb25zb2xlICYmICh3aW5kb3cuY29uc29sZS5maXJlYnVnIHx8ICh3aW5kb3cuY29uc29sZS5leGNlcHRpb24gJiYgd2luZG93LmNvbnNvbGUudGFibGUpKSkgfHxcblx0XHQvLyBJcyBmaXJlZm94ID49IHYzMT9cblx0XHQvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1Rvb2xzL1dlYl9Db25zb2xlI1N0eWxpbmdfbWVzc2FnZXNcblx0XHQodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkubWF0Y2goL2ZpcmVmb3hcXC8oXFxkKykvKSAmJiBwYXJzZUludChSZWdFeHAuJDEsIDEwKSA+PSAzMSkgfHxcblx0XHQvLyBEb3VibGUgY2hlY2sgd2Via2l0IGluIHVzZXJBZ2VudCBqdXN0IGluIGNhc2Ugd2UgYXJlIGluIGEgd29ya2VyXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9hcHBsZXdlYmtpdFxcLyhcXGQrKS8pKTtcbn1cblxuLyoqXG4gKiBDb2xvcml6ZSBsb2cgYXJndW1lbnRzIGlmIGVuYWJsZWQuXG4gKlxuICogQGFwaSBwdWJsaWNcbiAqL1xuXG5mdW5jdGlvbiBmb3JtYXRBcmdzKGFyZ3MpIHtcblx0YXJnc1swXSA9ICh0aGlzLnVzZUNvbG9ycyA/ICclYycgOiAnJykgK1xuXHRcdHRoaXMubmFtZXNwYWNlICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnICVjJyA6ICcgJykgK1xuXHRcdGFyZ3NbMF0gK1xuXHRcdCh0aGlzLnVzZUNvbG9ycyA/ICclYyAnIDogJyAnKSArXG5cdFx0JysnICsgbW9kdWxlLmV4cG9ydHMuaHVtYW5pemUodGhpcy5kaWZmKTtcblxuXHRpZiAoIXRoaXMudXNlQ29sb3JzKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Y29uc3QgYyA9ICdjb2xvcjogJyArIHRoaXMuY29sb3I7XG5cdGFyZ3Muc3BsaWNlKDEsIDAsIGMsICdjb2xvcjogaW5oZXJpdCcpO1xuXG5cdC8vIFRoZSBmaW5hbCBcIiVjXCIgaXMgc29tZXdoYXQgdHJpY2t5LCBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIG90aGVyXG5cdC8vIGFyZ3VtZW50cyBwYXNzZWQgZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgJWMsIHNvIHdlIG5lZWQgdG9cblx0Ly8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBpbmRleCB0byBpbnNlcnQgdGhlIENTUyBpbnRvXG5cdGxldCBpbmRleCA9IDA7XG5cdGxldCBsYXN0QyA9IDA7XG5cdGFyZ3NbMF0ucmVwbGFjZSgvJVthLXpBLVolXS9nLCBtYXRjaCA9PiB7XG5cdFx0aWYgKG1hdGNoID09PSAnJSUnKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGluZGV4Kys7XG5cdFx0aWYgKG1hdGNoID09PSAnJWMnKSB7XG5cdFx0XHQvLyBXZSBvbmx5IGFyZSBpbnRlcmVzdGVkIGluIHRoZSAqbGFzdCogJWNcblx0XHRcdC8vICh0aGUgdXNlciBtYXkgaGF2ZSBwcm92aWRlZCB0aGVpciBvd24pXG5cdFx0XHRsYXN0QyA9IGluZGV4O1xuXHRcdH1cblx0fSk7XG5cblx0YXJncy5zcGxpY2UobGFzdEMsIDAsIGMpO1xufVxuXG4vKipcbiAqIEludm9rZXMgYGNvbnNvbGUuZGVidWcoKWAgd2hlbiBhdmFpbGFibGUuXG4gKiBOby1vcCB3aGVuIGBjb25zb2xlLmRlYnVnYCBpcyBub3QgYSBcImZ1bmN0aW9uXCIuXG4gKiBJZiBgY29uc29sZS5kZWJ1Z2AgaXMgbm90IGF2YWlsYWJsZSwgZmFsbHMgYmFja1xuICogdG8gYGNvbnNvbGUubG9nYC5cbiAqXG4gKiBAYXBpIHB1YmxpY1xuICovXG5leHBvcnRzLmxvZyA9IGNvbnNvbGUuZGVidWcgfHwgY29uc29sZS5sb2cgfHwgKCgpID0+IHt9KTtcblxuLyoqXG4gKiBTYXZlIGBuYW1lc3BhY2VzYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZXNwYWNlc1xuICogQGFwaSBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIHNhdmUobmFtZXNwYWNlcykge1xuXHR0cnkge1xuXHRcdGlmIChuYW1lc3BhY2VzKSB7XG5cdFx0XHRleHBvcnRzLnN0b3JhZ2Uuc2V0SXRlbSgnZGVidWcnLCBuYW1lc3BhY2VzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZXhwb3J0cy5zdG9yYWdlLnJlbW92ZUl0ZW0oJ2RlYnVnJyk7XG5cdFx0fVxuXHR9IGNhdGNoIChlcnJvcikge1xuXHRcdC8vIFN3YWxsb3dcblx0XHQvLyBYWFggKEBRaXgtKSBzaG91bGQgd2UgYmUgbG9nZ2luZyB0aGVzZT9cblx0fVxufVxuXG4vKipcbiAqIExvYWQgYG5hbWVzcGFjZXNgLlxuICpcbiAqIEByZXR1cm4ge1N0cmluZ30gcmV0dXJucyB0aGUgcHJldmlvdXNseSBwZXJzaXN0ZWQgZGVidWcgbW9kZXNcbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBsb2FkKCkge1xuXHRsZXQgcjtcblx0dHJ5IHtcblx0XHRyID0gZXhwb3J0cy5zdG9yYWdlLmdldEl0ZW0oJ2RlYnVnJyk7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0Ly8gU3dhbGxvd1xuXHRcdC8vIFhYWCAoQFFpeC0pIHNob3VsZCB3ZSBiZSBsb2dnaW5nIHRoZXNlP1xuXHR9XG5cblx0Ly8gSWYgZGVidWcgaXNuJ3Qgc2V0IGluIExTLCBhbmQgd2UncmUgaW4gRWxlY3Ryb24sIHRyeSB0byBsb2FkICRERUJVR1xuXHRpZiAoIXIgJiYgdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmICdlbnYnIGluIHByb2Nlc3MpIHtcblx0XHRyID0gcHJvY2Vzcy5lbnYuREVCVUc7XG5cdH1cblxuXHRyZXR1cm4gcjtcbn1cblxuLyoqXG4gKiBMb2NhbHN0b3JhZ2UgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSBsb2NhbHN0b3JhZ2UuXG4gKlxuICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBzYWZhcmkgdGhyb3dzXG4gKiB3aGVuIGEgdXNlciBkaXNhYmxlcyBjb29raWVzL2xvY2Fsc3RvcmFnZVxuICogYW5kIHlvdSBhdHRlbXB0IHRvIGFjY2VzcyBpdC5cbiAqXG4gKiBAcmV0dXJuIHtMb2NhbFN0b3JhZ2V9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBsb2NhbHN0b3JhZ2UoKSB7XG5cdHRyeSB7XG5cdFx0Ly8gVFZNTEtpdCAoQXBwbGUgVFYgSlMgUnVudGltZSkgZG9lcyBub3QgaGF2ZSBhIHdpbmRvdyBvYmplY3QsIGp1c3QgbG9jYWxTdG9yYWdlIGluIHRoZSBnbG9iYWwgY29udGV4dFxuXHRcdC8vIFRoZSBCcm93c2VyIGFsc28gaGFzIGxvY2FsU3RvcmFnZSBpbiB0aGUgZ2xvYmFsIGNvbnRleHQuXG5cdFx0cmV0dXJuIGxvY2FsU3RvcmFnZTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHQvLyBTd2FsbG93XG5cdFx0Ly8gWFhYIChAUWl4LSkgc2hvdWxkIHdlIGJlIGxvZ2dpbmcgdGhlc2U/XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2NvbW1vbicpKGV4cG9ydHMpO1xuXG5jb25zdCB7Zm9ybWF0dGVyc30gPSBtb2R1bGUuZXhwb3J0cztcblxuLyoqXG4gKiBNYXAgJWogdG8gYEpTT04uc3RyaW5naWZ5KClgLCBzaW5jZSBubyBXZWIgSW5zcGVjdG9ycyBkbyB0aGF0IGJ5IGRlZmF1bHQuXG4gKi9cblxuZm9ybWF0dGVycy5qID0gZnVuY3Rpb24gKHYpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkodik7XG5cdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0cmV0dXJuICdbVW5leHBlY3RlZEpTT05QYXJzZUVycm9yXTogJyArIGVycm9yLm1lc3NhZ2U7XG5cdH1cbn07XG4iLCJcbi8qKlxuICogVGhpcyBpcyB0aGUgY29tbW9uIGxvZ2ljIGZvciBib3RoIHRoZSBOb2RlLmpzIGFuZCB3ZWIgYnJvd3NlclxuICogaW1wbGVtZW50YXRpb25zIG9mIGBkZWJ1ZygpYC5cbiAqL1xuXG5mdW5jdGlvbiBzZXR1cChlbnYpIHtcblx0Y3JlYXRlRGVidWcuZGVidWcgPSBjcmVhdGVEZWJ1Zztcblx0Y3JlYXRlRGVidWcuZGVmYXVsdCA9IGNyZWF0ZURlYnVnO1xuXHRjcmVhdGVEZWJ1Zy5jb2VyY2UgPSBjb2VyY2U7XG5cdGNyZWF0ZURlYnVnLmRpc2FibGUgPSBkaXNhYmxlO1xuXHRjcmVhdGVEZWJ1Zy5lbmFibGUgPSBlbmFibGU7XG5cdGNyZWF0ZURlYnVnLmVuYWJsZWQgPSBlbmFibGVkO1xuXHRjcmVhdGVEZWJ1Zy5odW1hbml6ZSA9IHJlcXVpcmUoJ21zJyk7XG5cdGNyZWF0ZURlYnVnLmRlc3Ryb3kgPSBkZXN0cm95O1xuXG5cdE9iamVjdC5rZXlzKGVudikuZm9yRWFjaChrZXkgPT4ge1xuXHRcdGNyZWF0ZURlYnVnW2tleV0gPSBlbnZba2V5XTtcblx0fSk7XG5cblx0LyoqXG5cdCogVGhlIGN1cnJlbnRseSBhY3RpdmUgZGVidWcgbW9kZSBuYW1lcywgYW5kIG5hbWVzIHRvIHNraXAuXG5cdCovXG5cblx0Y3JlYXRlRGVidWcubmFtZXMgPSBbXTtcblx0Y3JlYXRlRGVidWcuc2tpcHMgPSBbXTtcblxuXHQvKipcblx0KiBNYXAgb2Ygc3BlY2lhbCBcIiVuXCIgaGFuZGxpbmcgZnVuY3Rpb25zLCBmb3IgdGhlIGRlYnVnIFwiZm9ybWF0XCIgYXJndW1lbnQuXG5cdCpcblx0KiBWYWxpZCBrZXkgbmFtZXMgYXJlIGEgc2luZ2xlLCBsb3dlciBvciB1cHBlci1jYXNlIGxldHRlciwgaS5lLiBcIm5cIiBhbmQgXCJOXCIuXG5cdCovXG5cdGNyZWF0ZURlYnVnLmZvcm1hdHRlcnMgPSB7fTtcblxuXHQvKipcblx0KiBTZWxlY3RzIGEgY29sb3IgZm9yIGEgZGVidWcgbmFtZXNwYWNlXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZSBUaGUgbmFtZXNwYWNlIHN0cmluZyBmb3IgdGhlIGZvciB0aGUgZGVidWcgaW5zdGFuY2UgdG8gYmUgY29sb3JlZFxuXHQqIEByZXR1cm4ge051bWJlcnxTdHJpbmd9IEFuIEFOU0kgY29sb3IgY29kZSBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVxuXHQqIEBhcGkgcHJpdmF0ZVxuXHQqL1xuXHRmdW5jdGlvbiBzZWxlY3RDb2xvcihuYW1lc3BhY2UpIHtcblx0XHRsZXQgaGFzaCA9IDA7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IG5hbWVzcGFjZS5sZW5ndGg7IGkrKykge1xuXHRcdFx0aGFzaCA9ICgoaGFzaCA8PCA1KSAtIGhhc2gpICsgbmFtZXNwYWNlLmNoYXJDb2RlQXQoaSk7XG5cdFx0XHRoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuXHRcdH1cblxuXHRcdHJldHVybiBjcmVhdGVEZWJ1Zy5jb2xvcnNbTWF0aC5hYnMoaGFzaCkgJSBjcmVhdGVEZWJ1Zy5jb2xvcnMubGVuZ3RoXTtcblx0fVxuXHRjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvciA9IHNlbGVjdENvbG9yO1xuXG5cdC8qKlxuXHQqIENyZWF0ZSBhIGRlYnVnZ2VyIHdpdGggdGhlIGdpdmVuIGBuYW1lc3BhY2VgLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuXHQqIEByZXR1cm4ge0Z1bmN0aW9ufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGNyZWF0ZURlYnVnKG5hbWVzcGFjZSkge1xuXHRcdGxldCBwcmV2VGltZTtcblx0XHRsZXQgZW5hYmxlT3ZlcnJpZGUgPSBudWxsO1xuXG5cdFx0ZnVuY3Rpb24gZGVidWcoLi4uYXJncykge1xuXHRcdFx0Ly8gRGlzYWJsZWQ/XG5cdFx0XHRpZiAoIWRlYnVnLmVuYWJsZWQpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzZWxmID0gZGVidWc7XG5cblx0XHRcdC8vIFNldCBgZGlmZmAgdGltZXN0YW1wXG5cdFx0XHRjb25zdCBjdXJyID0gTnVtYmVyKG5ldyBEYXRlKCkpO1xuXHRcdFx0Y29uc3QgbXMgPSBjdXJyIC0gKHByZXZUaW1lIHx8IGN1cnIpO1xuXHRcdFx0c2VsZi5kaWZmID0gbXM7XG5cdFx0XHRzZWxmLnByZXYgPSBwcmV2VGltZTtcblx0XHRcdHNlbGYuY3VyciA9IGN1cnI7XG5cdFx0XHRwcmV2VGltZSA9IGN1cnI7XG5cblx0XHRcdGFyZ3NbMF0gPSBjcmVhdGVEZWJ1Zy5jb2VyY2UoYXJnc1swXSk7XG5cblx0XHRcdGlmICh0eXBlb2YgYXJnc1swXSAhPT0gJ3N0cmluZycpIHtcblx0XHRcdFx0Ly8gQW55dGhpbmcgZWxzZSBsZXQncyBpbnNwZWN0IHdpdGggJU9cblx0XHRcdFx0YXJncy51bnNoaWZ0KCclTycpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBcHBseSBhbnkgYGZvcm1hdHRlcnNgIHRyYW5zZm9ybWF0aW9uc1xuXHRcdFx0bGV0IGluZGV4ID0gMDtcblx0XHRcdGFyZ3NbMF0gPSBhcmdzWzBdLnJlcGxhY2UoLyUoW2EtekEtWiVdKS9nLCAobWF0Y2gsIGZvcm1hdCkgPT4ge1xuXHRcdFx0XHQvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gZXNjYXBlZCAlIHRoZW4gZG9uJ3QgaW5jcmVhc2UgdGhlIGFycmF5IGluZGV4XG5cdFx0XHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1xuXHRcdFx0XHRcdHJldHVybiAnJSc7XG5cdFx0XHRcdH1cblx0XHRcdFx0aW5kZXgrKztcblx0XHRcdFx0Y29uc3QgZm9ybWF0dGVyID0gY3JlYXRlRGVidWcuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXHRcdFx0XHRpZiAodHlwZW9mIGZvcm1hdHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0XHRcdGNvbnN0IHZhbCA9IGFyZ3NbaW5kZXhdO1xuXHRcdFx0XHRcdG1hdGNoID0gZm9ybWF0dGVyLmNhbGwoc2VsZiwgdmFsKTtcblxuXHRcdFx0XHRcdC8vIE5vdyB3ZSBuZWVkIHRvIHJlbW92ZSBgYXJnc1tpbmRleF1gIHNpbmNlIGl0J3MgaW5saW5lZCBpbiB0aGUgYGZvcm1hdGBcblx0XHRcdFx0XHRhcmdzLnNwbGljZShpbmRleCwgMSk7XG5cdFx0XHRcdFx0aW5kZXgtLTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0XHR9KTtcblxuXHRcdFx0Ly8gQXBwbHkgZW52LXNwZWNpZmljIGZvcm1hdHRpbmcgKGNvbG9ycywgZXRjLilcblx0XHRcdGNyZWF0ZURlYnVnLmZvcm1hdEFyZ3MuY2FsbChzZWxmLCBhcmdzKTtcblxuXHRcdFx0Y29uc3QgbG9nRm4gPSBzZWxmLmxvZyB8fCBjcmVhdGVEZWJ1Zy5sb2c7XG5cdFx0XHRsb2dGbi5hcHBseShzZWxmLCBhcmdzKTtcblx0XHR9XG5cblx0XHRkZWJ1Zy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cdFx0ZGVidWcudXNlQ29sb3JzID0gY3JlYXRlRGVidWcudXNlQ29sb3JzKCk7XG5cdFx0ZGVidWcuY29sb3IgPSBjcmVhdGVEZWJ1Zy5zZWxlY3RDb2xvcihuYW1lc3BhY2UpO1xuXHRcdGRlYnVnLmV4dGVuZCA9IGV4dGVuZDtcblx0XHRkZWJ1Zy5kZXN0cm95ID0gY3JlYXRlRGVidWcuZGVzdHJveTsgLy8gWFhYIFRlbXBvcmFyeS4gV2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHJlbGVhc2UuXG5cblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZGVidWcsICdlbmFibGVkJywge1xuXHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcblx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXG5cdFx0XHRnZXQ6ICgpID0+IGVuYWJsZU92ZXJyaWRlID09PSBudWxsID8gY3JlYXRlRGVidWcuZW5hYmxlZChuYW1lc3BhY2UpIDogZW5hYmxlT3ZlcnJpZGUsXG5cdFx0XHRzZXQ6IHYgPT4ge1xuXHRcdFx0XHRlbmFibGVPdmVycmlkZSA9IHY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cblx0XHQvLyBFbnYtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMgZm9yIGRlYnVnIGluc3RhbmNlc1xuXHRcdGlmICh0eXBlb2YgY3JlYXRlRGVidWcuaW5pdCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Y3JlYXRlRGVidWcuaW5pdChkZWJ1Zyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlYnVnO1xuXHR9XG5cblx0ZnVuY3Rpb24gZXh0ZW5kKG5hbWVzcGFjZSwgZGVsaW1pdGVyKSB7XG5cdFx0Y29uc3QgbmV3RGVidWcgPSBjcmVhdGVEZWJ1Zyh0aGlzLm5hbWVzcGFjZSArICh0eXBlb2YgZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/ICc6JyA6IGRlbGltaXRlcikgKyBuYW1lc3BhY2UpO1xuXHRcdG5ld0RlYnVnLmxvZyA9IHRoaXMubG9nO1xuXHRcdHJldHVybiBuZXdEZWJ1Zztcblx0fVxuXG5cdC8qKlxuXHQqIEVuYWJsZXMgYSBkZWJ1ZyBtb2RlIGJ5IG5hbWVzcGFjZXMuIFRoaXMgY2FuIGluY2x1ZGUgbW9kZXNcblx0KiBzZXBhcmF0ZWQgYnkgYSBjb2xvbiBhbmQgd2lsZGNhcmRzLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBlbmFibGUobmFtZXNwYWNlcykge1xuXHRcdGNyZWF0ZURlYnVnLnNhdmUobmFtZXNwYWNlcyk7XG5cblx0XHRjcmVhdGVEZWJ1Zy5uYW1lcyA9IFtdO1xuXHRcdGNyZWF0ZURlYnVnLnNraXBzID0gW107XG5cblx0XHRsZXQgaTtcblx0XHRjb25zdCBzcGxpdCA9ICh0eXBlb2YgbmFtZXNwYWNlcyA9PT0gJ3N0cmluZycgPyBuYW1lc3BhY2VzIDogJycpLnNwbGl0KC9bXFxzLF0rLyk7XG5cdFx0Y29uc3QgbGVuID0gc3BsaXQubGVuZ3RoO1xuXG5cdFx0Zm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoIXNwbGl0W2ldKSB7XG5cdFx0XHRcdC8vIGlnbm9yZSBlbXB0eSBzdHJpbmdzXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRuYW1lc3BhY2VzID0gc3BsaXRbaV0ucmVwbGFjZSgvXFwqL2csICcuKj8nKTtcblxuXHRcdFx0aWYgKG5hbWVzcGFjZXNbMF0gPT09ICctJykge1xuXHRcdFx0XHRjcmVhdGVEZWJ1Zy5za2lwcy5wdXNoKG5ldyBSZWdFeHAoJ14nICsgbmFtZXNwYWNlcy5zdWJzdHIoMSkgKyAnJCcpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNyZWF0ZURlYnVnLm5hbWVzLnB1c2gobmV3IFJlZ0V4cCgnXicgKyBuYW1lc3BhY2VzICsgJyQnKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCogRGlzYWJsZSBkZWJ1ZyBvdXRwdXQuXG5cdCpcblx0KiBAcmV0dXJuIHtTdHJpbmd9IG5hbWVzcGFjZXNcblx0KiBAYXBpIHB1YmxpY1xuXHQqL1xuXHRmdW5jdGlvbiBkaXNhYmxlKCkge1xuXHRcdGNvbnN0IG5hbWVzcGFjZXMgPSBbXG5cdFx0XHQuLi5jcmVhdGVEZWJ1Zy5uYW1lcy5tYXAodG9OYW1lc3BhY2UpLFxuXHRcdFx0Li4uY3JlYXRlRGVidWcuc2tpcHMubWFwKHRvTmFtZXNwYWNlKS5tYXAobmFtZXNwYWNlID0+ICctJyArIG5hbWVzcGFjZSlcblx0XHRdLmpvaW4oJywnKTtcblx0XHRjcmVhdGVEZWJ1Zy5lbmFibGUoJycpO1xuXHRcdHJldHVybiBuYW1lc3BhY2VzO1xuXHR9XG5cblx0LyoqXG5cdCogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBtb2RlIG5hbWUgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuXHQqXG5cdCogQHBhcmFtIHtTdHJpbmd9IG5hbWVcblx0KiBAcmV0dXJuIHtCb29sZWFufVxuXHQqIEBhcGkgcHVibGljXG5cdCovXG5cdGZ1bmN0aW9uIGVuYWJsZWQobmFtZSkge1xuXHRcdGlmIChuYW1lW25hbWUubGVuZ3RoIC0gMV0gPT09ICcqJykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0bGV0IGk7XG5cdFx0bGV0IGxlbjtcblxuXHRcdGZvciAoaSA9IDAsIGxlbiA9IGNyZWF0ZURlYnVnLnNraXBzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG5cdFx0XHRpZiAoY3JlYXRlRGVidWcuc2tpcHNbaV0udGVzdChuYW1lKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChpID0gMCwgbGVuID0gY3JlYXRlRGVidWcubmFtZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcblx0XHRcdGlmIChjcmVhdGVEZWJ1Zy5uYW1lc1tpXS50ZXN0KG5hbWUpKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQqIENvbnZlcnQgcmVnZXhwIHRvIG5hbWVzcGFjZVxuXHQqXG5cdCogQHBhcmFtIHtSZWdFeHB9IHJlZ3hlcFxuXHQqIEByZXR1cm4ge1N0cmluZ30gbmFtZXNwYWNlXG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIHRvTmFtZXNwYWNlKHJlZ2V4cCkge1xuXHRcdHJldHVybiByZWdleHAudG9TdHJpbmcoKVxuXHRcdFx0LnN1YnN0cmluZygyLCByZWdleHAudG9TdHJpbmcoKS5sZW5ndGggLSAyKVxuXHRcdFx0LnJlcGxhY2UoL1xcLlxcKlxcPyQvLCAnKicpO1xuXHR9XG5cblx0LyoqXG5cdCogQ29lcmNlIGB2YWxgLlxuXHQqXG5cdCogQHBhcmFtIHtNaXhlZH0gdmFsXG5cdCogQHJldHVybiB7TWl4ZWR9XG5cdCogQGFwaSBwcml2YXRlXG5cdCovXG5cdGZ1bmN0aW9uIGNvZXJjZSh2YWwpIHtcblx0XHRpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRcdHJldHVybiB2YWwuc3RhY2sgfHwgdmFsLm1lc3NhZ2U7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cblxuXHQvKipcblx0KiBYWFggRE8gTk9UIFVTRS4gVGhpcyBpcyBhIHRlbXBvcmFyeSBzdHViIGZ1bmN0aW9uLlxuXHQqIFhYWCBJdCBXSUxMIGJlIHJlbW92ZWQgaW4gdGhlIG5leHQgbWFqb3IgcmVsZWFzZS5cblx0Ki9cblx0ZnVuY3Rpb24gZGVzdHJveSgpIHtcblx0XHRjb25zb2xlLndhcm4oJ0luc3RhbmNlIG1ldGhvZCBgZGVidWcuZGVzdHJveSgpYCBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgZG9lcyBhbnl0aGluZy4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IG1ham9yIHZlcnNpb24gb2YgYGRlYnVnYC4nKTtcblx0fVxuXG5cdGNyZWF0ZURlYnVnLmVuYWJsZShjcmVhdGVEZWJ1Zy5sb2FkKCkpO1xuXG5cdHJldHVybiBjcmVhdGVEZWJ1Zztcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzZXR1cDtcbiIsIi8qISBAbGljZW5zZSBET01QdXJpZnkgfCAoYykgQ3VyZTUzIGFuZCBvdGhlciBjb250cmlidXRvcnMgfCBSZWxlYXNlZCB1bmRlciB0aGUgQXBhY2hlIGxpY2Vuc2UgMi4wIGFuZCBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIDIuMCB8IGdpdGh1Yi5jb20vY3VyZTUzL0RPTVB1cmlmeS9ibG9iLzIuMi4yL0xJQ0VOU0UgKi9cblxuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5ET01QdXJpZnkgPSBmYWN0b3J5KCkpO1xufSh0aGlzLCBmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JztcblxuICBmdW5jdGlvbiBfdG9Db25zdW1hYmxlQXJyYXkoYXJyKSB7IGlmIChBcnJheS5pc0FycmF5KGFycikpIHsgZm9yICh2YXIgaSA9IDAsIGFycjIgPSBBcnJheShhcnIubGVuZ3RoKTsgaSA8IGFyci5sZW5ndGg7IGkrKykgeyBhcnIyW2ldID0gYXJyW2ldOyB9IHJldHVybiBhcnIyOyB9IGVsc2UgeyByZXR1cm4gQXJyYXkuZnJvbShhcnIpOyB9IH1cblxuICB2YXIgaGFzT3duUHJvcGVydHkgPSBPYmplY3QuaGFzT3duUHJvcGVydHksXG4gICAgICBzZXRQcm90b3R5cGVPZiA9IE9iamVjdC5zZXRQcm90b3R5cGVPZixcbiAgICAgIGlzRnJvemVuID0gT2JqZWN0LmlzRnJvemVuLFxuICAgICAgZ2V0UHJvdG90eXBlT2YgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YsXG4gICAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICB2YXIgZnJlZXplID0gT2JqZWN0LmZyZWV6ZSxcbiAgICAgIHNlYWwgPSBPYmplY3Quc2VhbCxcbiAgICAgIGNyZWF0ZSA9IE9iamVjdC5jcmVhdGU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgaW1wb3J0L25vLW11dGFibGUtZXhwb3J0c1xuXG4gIHZhciBfcmVmID0gdHlwZW9mIFJlZmxlY3QgIT09ICd1bmRlZmluZWQnICYmIFJlZmxlY3QsXG4gICAgICBhcHBseSA9IF9yZWYuYXBwbHksXG4gICAgICBjb25zdHJ1Y3QgPSBfcmVmLmNvbnN0cnVjdDtcblxuICBpZiAoIWFwcGx5KSB7XG4gICAgYXBwbHkgPSBmdW5jdGlvbiBhcHBseShmdW4sIHRoaXNWYWx1ZSwgYXJncykge1xuICAgICAgcmV0dXJuIGZ1bi5hcHBseSh0aGlzVmFsdWUsIGFyZ3MpO1xuICAgIH07XG4gIH1cblxuICBpZiAoIWZyZWV6ZSkge1xuICAgIGZyZWV6ZSA9IGZ1bmN0aW9uIGZyZWV6ZSh4KSB7XG4gICAgICByZXR1cm4geDtcbiAgICB9O1xuICB9XG5cbiAgaWYgKCFzZWFsKSB7XG4gICAgc2VhbCA9IGZ1bmN0aW9uIHNlYWwoeCkge1xuICAgICAgcmV0dXJuIHg7XG4gICAgfTtcbiAgfVxuXG4gIGlmICghY29uc3RydWN0KSB7XG4gICAgY29uc3RydWN0ID0gZnVuY3Rpb24gY29uc3RydWN0KEZ1bmMsIGFyZ3MpIHtcbiAgICAgIHJldHVybiBuZXcgKEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLmFwcGx5KEZ1bmMsIFtudWxsXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5KGFyZ3MpKSkpKCk7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBhcnJheUZvckVhY2ggPSB1bmFwcGx5KEFycmF5LnByb3RvdHlwZS5mb3JFYWNoKTtcbiAgdmFyIGFycmF5UG9wID0gdW5hcHBseShBcnJheS5wcm90b3R5cGUucG9wKTtcbiAgdmFyIGFycmF5UHVzaCA9IHVuYXBwbHkoQXJyYXkucHJvdG90eXBlLnB1c2gpO1xuXG4gIHZhciBzdHJpbmdUb0xvd2VyQ2FzZSA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS50b0xvd2VyQ2FzZSk7XG4gIHZhciBzdHJpbmdNYXRjaCA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS5tYXRjaCk7XG4gIHZhciBzdHJpbmdSZXBsYWNlID0gdW5hcHBseShTdHJpbmcucHJvdG90eXBlLnJlcGxhY2UpO1xuICB2YXIgc3RyaW5nSW5kZXhPZiA9IHVuYXBwbHkoU3RyaW5nLnByb3RvdHlwZS5pbmRleE9mKTtcbiAgdmFyIHN0cmluZ1RyaW0gPSB1bmFwcGx5KFN0cmluZy5wcm90b3R5cGUudHJpbSk7XG5cbiAgdmFyIHJlZ0V4cFRlc3QgPSB1bmFwcGx5KFJlZ0V4cC5wcm90b3R5cGUudGVzdCk7XG5cbiAgdmFyIHR5cGVFcnJvckNyZWF0ZSA9IHVuY29uc3RydWN0KFR5cGVFcnJvcik7XG5cbiAgZnVuY3Rpb24gdW5hcHBseShmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0aGlzQXJnKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IEFycmF5KF9sZW4gPiAxID8gX2xlbiAtIDEgOiAwKSwgX2tleSA9IDE7IF9rZXkgPCBfbGVuOyBfa2V5KyspIHtcbiAgICAgICAgYXJnc1tfa2V5IC0gMV0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKTtcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gdW5jb25zdHJ1Y3QoZnVuYykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBmb3IgKHZhciBfbGVuMiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBBcnJheShfbGVuMiksIF9rZXkyID0gMDsgX2tleTIgPCBfbGVuMjsgX2tleTIrKykge1xuICAgICAgICBhcmdzW19rZXkyXSA9IGFyZ3VtZW50c1tfa2V5Ml07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBjb25zdHJ1Y3QoZnVuYywgYXJncyk7XG4gICAgfTtcbiAgfVxuXG4gIC8qIEFkZCBwcm9wZXJ0aWVzIHRvIGEgbG9va3VwIHRhYmxlICovXG4gIGZ1bmN0aW9uIGFkZFRvU2V0KHNldCwgYXJyYXkpIHtcbiAgICBpZiAoc2V0UHJvdG90eXBlT2YpIHtcbiAgICAgIC8vIE1ha2UgJ2luJyBhbmQgdHJ1dGh5IGNoZWNrcyBsaWtlIEJvb2xlYW4oc2V0LmNvbnN0cnVjdG9yKVxuICAgICAgLy8gaW5kZXBlbmRlbnQgb2YgYW55IHByb3BlcnRpZXMgZGVmaW5lZCBvbiBPYmplY3QucHJvdG90eXBlLlxuICAgICAgLy8gUHJldmVudCBwcm90b3R5cGUgc2V0dGVycyBmcm9tIGludGVyY2VwdGluZyBzZXQgYXMgYSB0aGlzIHZhbHVlLlxuICAgICAgc2V0UHJvdG90eXBlT2Yoc2V0LCBudWxsKTtcbiAgICB9XG5cbiAgICB2YXIgbCA9IGFycmF5Lmxlbmd0aDtcbiAgICB3aGlsZSAobC0tKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IGFycmF5W2xdO1xuICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgbGNFbGVtZW50ID0gc3RyaW5nVG9Mb3dlckNhc2UoZWxlbWVudCk7XG4gICAgICAgIGlmIChsY0VsZW1lbnQgIT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBDb25maWcgcHJlc2V0cyAoZS5nLiB0YWdzLmpzLCBhdHRycy5qcykgYXJlIGltbXV0YWJsZS5cbiAgICAgICAgICBpZiAoIWlzRnJvemVuKGFycmF5KSkge1xuICAgICAgICAgICAgYXJyYXlbbF0gPSBsY0VsZW1lbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlbWVudCA9IGxjRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzZXRbZWxlbWVudF0gPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBzZXQ7XG4gIH1cblxuICAvKiBTaGFsbG93IGNsb25lIGFuIG9iamVjdCAqL1xuICBmdW5jdGlvbiBjbG9uZShvYmplY3QpIHtcbiAgICB2YXIgbmV3T2JqZWN0ID0gY3JlYXRlKG51bGwpO1xuXG4gICAgdmFyIHByb3BlcnR5ID0gdm9pZCAwO1xuICAgIGZvciAocHJvcGVydHkgaW4gb2JqZWN0KSB7XG4gICAgICBpZiAoYXBwbHkoaGFzT3duUHJvcGVydHksIG9iamVjdCwgW3Byb3BlcnR5XSkpIHtcbiAgICAgICAgbmV3T2JqZWN0W3Byb3BlcnR5XSA9IG9iamVjdFtwcm9wZXJ0eV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld09iamVjdDtcbiAgfVxuXG4gIC8qIElFMTAgZG9lc24ndCBzdXBwb3J0IF9fbG9va3VwR2V0dGVyX18gc28gbGV0cydcbiAgICogc2ltdWxhdGUgaXQuIEl0IGFsc28gYXV0b21hdGljYWxseSBjaGVja3NcbiAgICogaWYgdGhlIHByb3AgaXMgZnVuY3Rpb24gb3IgZ2V0dGVyIGFuZCBiZWhhdmVzXG4gICAqIGFjY29yZGluZ2x5LiAqL1xuICBmdW5jdGlvbiBsb29rdXBHZXR0ZXIob2JqZWN0LCBwcm9wKSB7XG4gICAgd2hpbGUgKG9iamVjdCAhPT0gbnVsbCkge1xuICAgICAgdmFyIGRlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBwcm9wKTtcbiAgICAgIGlmIChkZXNjKSB7XG4gICAgICAgIGlmIChkZXNjLmdldCkge1xuICAgICAgICAgIHJldHVybiB1bmFwcGx5KGRlc2MuZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgZGVzYy52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHJldHVybiB1bmFwcGx5KGRlc2MudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIG9iamVjdCA9IGdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZmFsbGJhY2tWYWx1ZShlbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oJ2ZhbGxiYWNrIHZhbHVlIGZvcicsIGVsZW1lbnQpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbGxiYWNrVmFsdWU7XG4gIH1cblxuICB2YXIgaHRtbCA9IGZyZWV6ZShbJ2EnLCAnYWJicicsICdhY3JvbnltJywgJ2FkZHJlc3MnLCAnYXJlYScsICdhcnRpY2xlJywgJ2FzaWRlJywgJ2F1ZGlvJywgJ2InLCAnYmRpJywgJ2JkbycsICdiaWcnLCAnYmxpbmsnLCAnYmxvY2txdW90ZScsICdib2R5JywgJ2JyJywgJ2J1dHRvbicsICdjYW52YXMnLCAnY2FwdGlvbicsICdjZW50ZXInLCAnY2l0ZScsICdjb2RlJywgJ2NvbCcsICdjb2xncm91cCcsICdjb250ZW50JywgJ2RhdGEnLCAnZGF0YWxpc3QnLCAnZGQnLCAnZGVjb3JhdG9yJywgJ2RlbCcsICdkZXRhaWxzJywgJ2RmbicsICdkaWFsb2cnLCAnZGlyJywgJ2RpdicsICdkbCcsICdkdCcsICdlbGVtZW50JywgJ2VtJywgJ2ZpZWxkc2V0JywgJ2ZpZ2NhcHRpb24nLCAnZmlndXJlJywgJ2ZvbnQnLCAnZm9vdGVyJywgJ2Zvcm0nLCAnaDEnLCAnaDInLCAnaDMnLCAnaDQnLCAnaDUnLCAnaDYnLCAnaGVhZCcsICdoZWFkZXInLCAnaGdyb3VwJywgJ2hyJywgJ2h0bWwnLCAnaScsICdpbWcnLCAnaW5wdXQnLCAnaW5zJywgJ2tiZCcsICdsYWJlbCcsICdsZWdlbmQnLCAnbGknLCAnbWFpbicsICdtYXAnLCAnbWFyaycsICdtYXJxdWVlJywgJ21lbnUnLCAnbWVudWl0ZW0nLCAnbWV0ZXInLCAnbmF2JywgJ25vYnInLCAnb2wnLCAnb3B0Z3JvdXAnLCAnb3B0aW9uJywgJ291dHB1dCcsICdwJywgJ3BpY3R1cmUnLCAncHJlJywgJ3Byb2dyZXNzJywgJ3EnLCAncnAnLCAncnQnLCAncnVieScsICdzJywgJ3NhbXAnLCAnc2VjdGlvbicsICdzZWxlY3QnLCAnc2hhZG93JywgJ3NtYWxsJywgJ3NvdXJjZScsICdzcGFjZXInLCAnc3BhbicsICdzdHJpa2UnLCAnc3Ryb25nJywgJ3N0eWxlJywgJ3N1YicsICdzdW1tYXJ5JywgJ3N1cCcsICd0YWJsZScsICd0Ym9keScsICd0ZCcsICd0ZW1wbGF0ZScsICd0ZXh0YXJlYScsICd0Zm9vdCcsICd0aCcsICd0aGVhZCcsICd0aW1lJywgJ3RyJywgJ3RyYWNrJywgJ3R0JywgJ3UnLCAndWwnLCAndmFyJywgJ3ZpZGVvJywgJ3diciddKTtcblxuICAvLyBTVkdcbiAgdmFyIHN2ZyA9IGZyZWV6ZShbJ3N2ZycsICdhJywgJ2FsdGdseXBoJywgJ2FsdGdseXBoZGVmJywgJ2FsdGdseXBoaXRlbScsICdhbmltYXRlY29sb3InLCAnYW5pbWF0ZW1vdGlvbicsICdhbmltYXRldHJhbnNmb3JtJywgJ2NpcmNsZScsICdjbGlwcGF0aCcsICdkZWZzJywgJ2Rlc2MnLCAnZWxsaXBzZScsICdmaWx0ZXInLCAnZm9udCcsICdnJywgJ2dseXBoJywgJ2dseXBocmVmJywgJ2hrZXJuJywgJ2ltYWdlJywgJ2xpbmUnLCAnbGluZWFyZ3JhZGllbnQnLCAnbWFya2VyJywgJ21hc2snLCAnbWV0YWRhdGEnLCAnbXBhdGgnLCAncGF0aCcsICdwYXR0ZXJuJywgJ3BvbHlnb24nLCAncG9seWxpbmUnLCAncmFkaWFsZ3JhZGllbnQnLCAncmVjdCcsICdzdG9wJywgJ3N0eWxlJywgJ3N3aXRjaCcsICdzeW1ib2wnLCAndGV4dCcsICd0ZXh0cGF0aCcsICd0aXRsZScsICd0cmVmJywgJ3RzcGFuJywgJ3ZpZXcnLCAndmtlcm4nXSk7XG5cbiAgdmFyIHN2Z0ZpbHRlcnMgPSBmcmVlemUoWydmZUJsZW5kJywgJ2ZlQ29sb3JNYXRyaXgnLCAnZmVDb21wb25lbnRUcmFuc2ZlcicsICdmZUNvbXBvc2l0ZScsICdmZUNvbnZvbHZlTWF0cml4JywgJ2ZlRGlmZnVzZUxpZ2h0aW5nJywgJ2ZlRGlzcGxhY2VtZW50TWFwJywgJ2ZlRGlzdGFudExpZ2h0JywgJ2ZlRmxvb2QnLCAnZmVGdW5jQScsICdmZUZ1bmNCJywgJ2ZlRnVuY0cnLCAnZmVGdW5jUicsICdmZUdhdXNzaWFuQmx1cicsICdmZU1lcmdlJywgJ2ZlTWVyZ2VOb2RlJywgJ2ZlTW9ycGhvbG9neScsICdmZU9mZnNldCcsICdmZVBvaW50TGlnaHQnLCAnZmVTcGVjdWxhckxpZ2h0aW5nJywgJ2ZlU3BvdExpZ2h0JywgJ2ZlVGlsZScsICdmZVR1cmJ1bGVuY2UnXSk7XG5cbiAgLy8gTGlzdCBvZiBTVkcgZWxlbWVudHMgdGhhdCBhcmUgZGlzYWxsb3dlZCBieSBkZWZhdWx0LlxuICAvLyBXZSBzdGlsbCBuZWVkIHRvIGtub3cgdGhlbSBzbyB0aGF0IHdlIGNhbiBkbyBuYW1lc3BhY2VcbiAgLy8gY2hlY2tzIHByb3Blcmx5IGluIGNhc2Ugb25lIHdhbnRzIHRvIGFkZCB0aGVtIHRvXG4gIC8vIGFsbG93LWxpc3QuXG4gIHZhciBzdmdEaXNhbGxvd2VkID0gZnJlZXplKFsnYW5pbWF0ZScsICdjb2xvci1wcm9maWxlJywgJ2N1cnNvcicsICdkaXNjYXJkJywgJ2ZlZHJvcHNoYWRvdycsICdmZWltYWdlJywgJ2ZvbnQtZmFjZScsICdmb250LWZhY2UtZm9ybWF0JywgJ2ZvbnQtZmFjZS1uYW1lJywgJ2ZvbnQtZmFjZS1zcmMnLCAnZm9udC1mYWNlLXVyaScsICdmb3JlaWdub2JqZWN0JywgJ2hhdGNoJywgJ2hhdGNocGF0aCcsICdtZXNoJywgJ21lc2hncmFkaWVudCcsICdtZXNocGF0Y2gnLCAnbWVzaHJvdycsICdtaXNzaW5nLWdseXBoJywgJ3NjcmlwdCcsICdzZXQnLCAnc29saWRjb2xvcicsICd1bmtub3duJywgJ3VzZSddKTtcblxuICB2YXIgbWF0aE1sID0gZnJlZXplKFsnbWF0aCcsICdtZW5jbG9zZScsICdtZXJyb3InLCAnbWZlbmNlZCcsICdtZnJhYycsICdtZ2x5cGgnLCAnbWknLCAnbWxhYmVsZWR0cicsICdtbXVsdGlzY3JpcHRzJywgJ21uJywgJ21vJywgJ21vdmVyJywgJ21wYWRkZWQnLCAnbXBoYW50b20nLCAnbXJvb3QnLCAnbXJvdycsICdtcycsICdtc3BhY2UnLCAnbXNxcnQnLCAnbXN0eWxlJywgJ21zdWInLCAnbXN1cCcsICdtc3Vic3VwJywgJ210YWJsZScsICdtdGQnLCAnbXRleHQnLCAnbXRyJywgJ211bmRlcicsICdtdW5kZXJvdmVyJ10pO1xuXG4gIC8vIFNpbWlsYXJseSB0byBTVkcsIHdlIHdhbnQgdG8ga25vdyBhbGwgTWF0aE1MIGVsZW1lbnRzLFxuICAvLyBldmVuIHRob3NlIHRoYXQgd2UgZGlzYWxsb3cgYnkgZGVmYXVsdC5cbiAgdmFyIG1hdGhNbERpc2FsbG93ZWQgPSBmcmVlemUoWydtYWN0aW9uJywgJ21hbGlnbmdyb3VwJywgJ21hbGlnbm1hcmsnLCAnbWxvbmdkaXYnLCAnbXNjYXJyaWVzJywgJ21zY2FycnknLCAnbXNncm91cCcsICdtc3RhY2snLCAnbXNsaW5lJywgJ21zcm93JywgJ3NlbWFudGljcycsICdhbm5vdGF0aW9uJywgJ2Fubm90YXRpb24teG1sJywgJ21wcmVzY3JpcHRzJywgJ25vbmUnXSk7XG5cbiAgdmFyIHRleHQgPSBmcmVlemUoWycjdGV4dCddKTtcblxuICB2YXIgaHRtbCQxID0gZnJlZXplKFsnYWNjZXB0JywgJ2FjdGlvbicsICdhbGlnbicsICdhbHQnLCAnYXV0b2NhcGl0YWxpemUnLCAnYXV0b2NvbXBsZXRlJywgJ2F1dG9waWN0dXJlaW5waWN0dXJlJywgJ2F1dG9wbGF5JywgJ2JhY2tncm91bmQnLCAnYmdjb2xvcicsICdib3JkZXInLCAnY2FwdHVyZScsICdjZWxscGFkZGluZycsICdjZWxsc3BhY2luZycsICdjaGVja2VkJywgJ2NpdGUnLCAnY2xhc3MnLCAnY2xlYXInLCAnY29sb3InLCAnY29scycsICdjb2xzcGFuJywgJ2NvbnRyb2xzJywgJ2NvbnRyb2xzbGlzdCcsICdjb29yZHMnLCAnY3Jvc3NvcmlnaW4nLCAnZGF0ZXRpbWUnLCAnZGVjb2RpbmcnLCAnZGVmYXVsdCcsICdkaXInLCAnZGlzYWJsZWQnLCAnZGlzYWJsZXBpY3R1cmVpbnBpY3R1cmUnLCAnZGlzYWJsZXJlbW90ZXBsYXliYWNrJywgJ2Rvd25sb2FkJywgJ2RyYWdnYWJsZScsICdlbmN0eXBlJywgJ2VudGVya2V5aGludCcsICdmYWNlJywgJ2ZvcicsICdoZWFkZXJzJywgJ2hlaWdodCcsICdoaWRkZW4nLCAnaGlnaCcsICdocmVmJywgJ2hyZWZsYW5nJywgJ2lkJywgJ2lucHV0bW9kZScsICdpbnRlZ3JpdHknLCAnaXNtYXAnLCAna2luZCcsICdsYWJlbCcsICdsYW5nJywgJ2xpc3QnLCAnbG9hZGluZycsICdsb29wJywgJ2xvdycsICdtYXgnLCAnbWF4bGVuZ3RoJywgJ21lZGlhJywgJ21ldGhvZCcsICdtaW4nLCAnbWlubGVuZ3RoJywgJ211bHRpcGxlJywgJ211dGVkJywgJ25hbWUnLCAnbm9zaGFkZScsICdub3ZhbGlkYXRlJywgJ25vd3JhcCcsICdvcGVuJywgJ29wdGltdW0nLCAncGF0dGVybicsICdwbGFjZWhvbGRlcicsICdwbGF5c2lubGluZScsICdwb3N0ZXInLCAncHJlbG9hZCcsICdwdWJkYXRlJywgJ3JhZGlvZ3JvdXAnLCAncmVhZG9ubHknLCAncmVsJywgJ3JlcXVpcmVkJywgJ3JldicsICdyZXZlcnNlZCcsICdyb2xlJywgJ3Jvd3MnLCAncm93c3BhbicsICdzcGVsbGNoZWNrJywgJ3Njb3BlJywgJ3NlbGVjdGVkJywgJ3NoYXBlJywgJ3NpemUnLCAnc2l6ZXMnLCAnc3BhbicsICdzcmNsYW5nJywgJ3N0YXJ0JywgJ3NyYycsICdzcmNzZXQnLCAnc3RlcCcsICdzdHlsZScsICdzdW1tYXJ5JywgJ3RhYmluZGV4JywgJ3RpdGxlJywgJ3RyYW5zbGF0ZScsICd0eXBlJywgJ3VzZW1hcCcsICd2YWxpZ24nLCAndmFsdWUnLCAnd2lkdGgnLCAneG1sbnMnXSk7XG5cbiAgdmFyIHN2ZyQxID0gZnJlZXplKFsnYWNjZW50LWhlaWdodCcsICdhY2N1bXVsYXRlJywgJ2FkZGl0aXZlJywgJ2FsaWdubWVudC1iYXNlbGluZScsICdhc2NlbnQnLCAnYXR0cmlidXRlbmFtZScsICdhdHRyaWJ1dGV0eXBlJywgJ2F6aW11dGgnLCAnYmFzZWZyZXF1ZW5jeScsICdiYXNlbGluZS1zaGlmdCcsICdiZWdpbicsICdiaWFzJywgJ2J5JywgJ2NsYXNzJywgJ2NsaXAnLCAnY2xpcHBhdGh1bml0cycsICdjbGlwLXBhdGgnLCAnY2xpcC1ydWxlJywgJ2NvbG9yJywgJ2NvbG9yLWludGVycG9sYXRpb24nLCAnY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzJywgJ2NvbG9yLXByb2ZpbGUnLCAnY29sb3ItcmVuZGVyaW5nJywgJ2N4JywgJ2N5JywgJ2QnLCAnZHgnLCAnZHknLCAnZGlmZnVzZWNvbnN0YW50JywgJ2RpcmVjdGlvbicsICdkaXNwbGF5JywgJ2Rpdmlzb3InLCAnZHVyJywgJ2VkZ2Vtb2RlJywgJ2VsZXZhdGlvbicsICdlbmQnLCAnZmlsbCcsICdmaWxsLW9wYWNpdHknLCAnZmlsbC1ydWxlJywgJ2ZpbHRlcicsICdmaWx0ZXJ1bml0cycsICdmbG9vZC1jb2xvcicsICdmbG9vZC1vcGFjaXR5JywgJ2ZvbnQtZmFtaWx5JywgJ2ZvbnQtc2l6ZScsICdmb250LXNpemUtYWRqdXN0JywgJ2ZvbnQtc3RyZXRjaCcsICdmb250LXN0eWxlJywgJ2ZvbnQtdmFyaWFudCcsICdmb250LXdlaWdodCcsICdmeCcsICdmeScsICdnMScsICdnMicsICdnbHlwaC1uYW1lJywgJ2dseXBocmVmJywgJ2dyYWRpZW50dW5pdHMnLCAnZ3JhZGllbnR0cmFuc2Zvcm0nLCAnaGVpZ2h0JywgJ2hyZWYnLCAnaWQnLCAnaW1hZ2UtcmVuZGVyaW5nJywgJ2luJywgJ2luMicsICdrJywgJ2sxJywgJ2syJywgJ2szJywgJ2s0JywgJ2tlcm5pbmcnLCAna2V5cG9pbnRzJywgJ2tleXNwbGluZXMnLCAna2V5dGltZXMnLCAnbGFuZycsICdsZW5ndGhhZGp1c3QnLCAnbGV0dGVyLXNwYWNpbmcnLCAna2VybmVsbWF0cml4JywgJ2tlcm5lbHVuaXRsZW5ndGgnLCAnbGlnaHRpbmctY29sb3InLCAnbG9jYWwnLCAnbWFya2VyLWVuZCcsICdtYXJrZXItbWlkJywgJ21hcmtlci1zdGFydCcsICdtYXJrZXJoZWlnaHQnLCAnbWFya2VydW5pdHMnLCAnbWFya2Vyd2lkdGgnLCAnbWFza2NvbnRlbnR1bml0cycsICdtYXNrdW5pdHMnLCAnbWF4JywgJ21hc2snLCAnbWVkaWEnLCAnbWV0aG9kJywgJ21vZGUnLCAnbWluJywgJ25hbWUnLCAnbnVtb2N0YXZlcycsICdvZmZzZXQnLCAnb3BlcmF0b3InLCAnb3BhY2l0eScsICdvcmRlcicsICdvcmllbnQnLCAnb3JpZW50YXRpb24nLCAnb3JpZ2luJywgJ292ZXJmbG93JywgJ3BhaW50LW9yZGVyJywgJ3BhdGgnLCAncGF0aGxlbmd0aCcsICdwYXR0ZXJuY29udGVudHVuaXRzJywgJ3BhdHRlcm50cmFuc2Zvcm0nLCAncGF0dGVybnVuaXRzJywgJ3BvaW50cycsICdwcmVzZXJ2ZWFscGhhJywgJ3ByZXNlcnZlYXNwZWN0cmF0aW8nLCAncHJpbWl0aXZldW5pdHMnLCAncicsICdyeCcsICdyeScsICdyYWRpdXMnLCAncmVmeCcsICdyZWZ5JywgJ3JlcGVhdGNvdW50JywgJ3JlcGVhdGR1cicsICdyZXN0YXJ0JywgJ3Jlc3VsdCcsICdyb3RhdGUnLCAnc2NhbGUnLCAnc2VlZCcsICdzaGFwZS1yZW5kZXJpbmcnLCAnc3BlY3VsYXJjb25zdGFudCcsICdzcGVjdWxhcmV4cG9uZW50JywgJ3NwcmVhZG1ldGhvZCcsICdzdGFydG9mZnNldCcsICdzdGRkZXZpYXRpb24nLCAnc3RpdGNodGlsZXMnLCAnc3RvcC1jb2xvcicsICdzdG9wLW9wYWNpdHknLCAnc3Ryb2tlLWRhc2hhcnJheScsICdzdHJva2UtZGFzaG9mZnNldCcsICdzdHJva2UtbGluZWNhcCcsICdzdHJva2UtbGluZWpvaW4nLCAnc3Ryb2tlLW1pdGVybGltaXQnLCAnc3Ryb2tlLW9wYWNpdHknLCAnc3Ryb2tlJywgJ3N0cm9rZS13aWR0aCcsICdzdHlsZScsICdzdXJmYWNlc2NhbGUnLCAnc3lzdGVtbGFuZ3VhZ2UnLCAndGFiaW5kZXgnLCAndGFyZ2V0eCcsICd0YXJnZXR5JywgJ3RyYW5zZm9ybScsICd0ZXh0LWFuY2hvcicsICd0ZXh0LWRlY29yYXRpb24nLCAndGV4dC1yZW5kZXJpbmcnLCAndGV4dGxlbmd0aCcsICd0eXBlJywgJ3UxJywgJ3UyJywgJ3VuaWNvZGUnLCAndmFsdWVzJywgJ3ZpZXdib3gnLCAndmlzaWJpbGl0eScsICd2ZXJzaW9uJywgJ3ZlcnQtYWR2LXknLCAndmVydC1vcmlnaW4teCcsICd2ZXJ0LW9yaWdpbi15JywgJ3dpZHRoJywgJ3dvcmQtc3BhY2luZycsICd3cmFwJywgJ3dyaXRpbmctbW9kZScsICd4Y2hhbm5lbHNlbGVjdG9yJywgJ3ljaGFubmVsc2VsZWN0b3InLCAneCcsICd4MScsICd4MicsICd4bWxucycsICd5JywgJ3kxJywgJ3kyJywgJ3onLCAnem9vbWFuZHBhbiddKTtcblxuICB2YXIgbWF0aE1sJDEgPSBmcmVlemUoWydhY2NlbnQnLCAnYWNjZW50dW5kZXInLCAnYWxpZ24nLCAnYmV2ZWxsZWQnLCAnY2xvc2UnLCAnY29sdW1uc2FsaWduJywgJ2NvbHVtbmxpbmVzJywgJ2NvbHVtbnNwYW4nLCAnZGVub21hbGlnbicsICdkZXB0aCcsICdkaXInLCAnZGlzcGxheScsICdkaXNwbGF5c3R5bGUnLCAnZW5jb2RpbmcnLCAnZmVuY2UnLCAnZnJhbWUnLCAnaGVpZ2h0JywgJ2hyZWYnLCAnaWQnLCAnbGFyZ2VvcCcsICdsZW5ndGgnLCAnbGluZXRoaWNrbmVzcycsICdsc3BhY2UnLCAnbHF1b3RlJywgJ21hdGhiYWNrZ3JvdW5kJywgJ21hdGhjb2xvcicsICdtYXRoc2l6ZScsICdtYXRodmFyaWFudCcsICdtYXhzaXplJywgJ21pbnNpemUnLCAnbW92YWJsZWxpbWl0cycsICdub3RhdGlvbicsICdudW1hbGlnbicsICdvcGVuJywgJ3Jvd2FsaWduJywgJ3Jvd2xpbmVzJywgJ3Jvd3NwYWNpbmcnLCAncm93c3BhbicsICdyc3BhY2UnLCAncnF1b3RlJywgJ3NjcmlwdGxldmVsJywgJ3NjcmlwdG1pbnNpemUnLCAnc2NyaXB0c2l6ZW11bHRpcGxpZXInLCAnc2VsZWN0aW9uJywgJ3NlcGFyYXRvcicsICdzZXBhcmF0b3JzJywgJ3N0cmV0Y2h5JywgJ3N1YnNjcmlwdHNoaWZ0JywgJ3N1cHNjcmlwdHNoaWZ0JywgJ3N5bW1ldHJpYycsICd2b2Zmc2V0JywgJ3dpZHRoJywgJ3htbG5zJ10pO1xuXG4gIHZhciB4bWwgPSBmcmVlemUoWyd4bGluazpocmVmJywgJ3htbDppZCcsICd4bGluazp0aXRsZScsICd4bWw6c3BhY2UnLCAneG1sbnM6eGxpbmsnXSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vYmV0dGVyLXJlZ2V4XG4gIHZhciBNVVNUQUNIRV9FWFBSID0gc2VhbCgvXFx7XFx7W1xcc1xcU10qfFtcXHNcXFNdKlxcfVxcfS9nbSk7IC8vIFNwZWNpZnkgdGVtcGxhdGUgZGV0ZWN0aW9uIHJlZ2V4IGZvciBTQUZFX0ZPUl9URU1QTEFURVMgbW9kZVxuICB2YXIgRVJCX0VYUFIgPSBzZWFsKC88JVtcXHNcXFNdKnxbXFxzXFxTXSolPi9nbSk7XG4gIHZhciBEQVRBX0FUVFIgPSBzZWFsKC9eZGF0YS1bXFwtXFx3LlxcdTAwQjctXFx1RkZGRl0vKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICB2YXIgQVJJQV9BVFRSID0gc2VhbCgvXmFyaWEtW1xcLVxcd10rJC8pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gIHZhciBJU19BTExPV0VEX1VSSSA9IHNlYWwoL14oPzooPzooPzpmfGh0KXRwcz98bWFpbHRvfHRlbHxjYWxsdG98Y2lkfHhtcHApOnxbXmEtel18W2EteisuXFwtXSsoPzpbXmEteisuXFwtOl18JCkpL2kgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11c2VsZXNzLWVzY2FwZVxuICApO1xuICB2YXIgSVNfU0NSSVBUX09SX0RBVEEgPSBzZWFsKC9eKD86XFx3K3NjcmlwdHxkYXRhKTovaSk7XG4gIHZhciBBVFRSX1dISVRFU1BBQ0UgPSBzZWFsKC9bXFx1MDAwMC1cXHUwMDIwXFx1MDBBMFxcdTE2ODBcXHUxODBFXFx1MjAwMC1cXHUyMDI5XFx1MjA1RlxcdTMwMDBdL2cgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb250cm9sLXJlZ2V4XG4gICk7XG5cbiAgdmFyIF90eXBlb2YgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5pdGVyYXRvciA9PT0gXCJzeW1ib2xcIiA/IGZ1bmN0aW9uIChvYmopIHsgcmV0dXJuIHR5cGVvZiBvYmo7IH0gOiBmdW5jdGlvbiAob2JqKSB7IHJldHVybiBvYmogJiYgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIG9iai5jb25zdHJ1Y3RvciA9PT0gU3ltYm9sICYmIG9iaiAhPT0gU3ltYm9sLnByb3RvdHlwZSA/IFwic3ltYm9sXCIgOiB0eXBlb2Ygb2JqOyB9O1xuXG4gIGZ1bmN0aW9uIF90b0NvbnN1bWFibGVBcnJheSQxKGFycikgeyBpZiAoQXJyYXkuaXNBcnJheShhcnIpKSB7IGZvciAodmFyIGkgPSAwLCBhcnIyID0gQXJyYXkoYXJyLmxlbmd0aCk7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsgYXJyMltpXSA9IGFycltpXTsgfSByZXR1cm4gYXJyMjsgfSBlbHNlIHsgcmV0dXJuIEFycmF5LmZyb20oYXJyKTsgfSB9XG5cbiAgdmFyIGdldEdsb2JhbCA9IGZ1bmN0aW9uIGdldEdsb2JhbCgpIHtcbiAgICByZXR1cm4gdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBudWxsIDogd2luZG93O1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbm8tb3AgcG9saWN5IGZvciBpbnRlcm5hbCB1c2Ugb25seS5cbiAgICogRG9uJ3QgZXhwb3J0IHRoaXMgZnVuY3Rpb24gb3V0c2lkZSB0aGlzIG1vZHVsZSFcbiAgICogQHBhcmFtIHs/VHJ1c3RlZFR5cGVQb2xpY3lGYWN0b3J5fSB0cnVzdGVkVHlwZXMgVGhlIHBvbGljeSBmYWN0b3J5LlxuICAgKiBAcGFyYW0ge0RvY3VtZW50fSBkb2N1bWVudCBUaGUgZG9jdW1lbnQgb2JqZWN0ICh0byBkZXRlcm1pbmUgcG9saWN5IG5hbWUgc3VmZml4KVxuICAgKiBAcmV0dXJuIHs/VHJ1c3RlZFR5cGVQb2xpY3l9IFRoZSBwb2xpY3kgY3JlYXRlZCAob3IgbnVsbCwgaWYgVHJ1c3RlZCBUeXBlc1xuICAgKiBhcmUgbm90IHN1cHBvcnRlZCkuXG4gICAqL1xuICB2YXIgX2NyZWF0ZVRydXN0ZWRUeXBlc1BvbGljeSA9IGZ1bmN0aW9uIF9jcmVhdGVUcnVzdGVkVHlwZXNQb2xpY3kodHJ1c3RlZFR5cGVzLCBkb2N1bWVudCkge1xuICAgIGlmICgodHlwZW9mIHRydXN0ZWRUeXBlcyA9PT0gJ3VuZGVmaW5lZCcgPyAndW5kZWZpbmVkJyA6IF90eXBlb2YodHJ1c3RlZFR5cGVzKSkgIT09ICdvYmplY3QnIHx8IHR5cGVvZiB0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBBbGxvdyB0aGUgY2FsbGVycyB0byBjb250cm9sIHRoZSB1bmlxdWUgcG9saWN5IG5hbWVcbiAgICAvLyBieSBhZGRpbmcgYSBkYXRhLXR0LXBvbGljeS1zdWZmaXggdG8gdGhlIHNjcmlwdCBlbGVtZW50IHdpdGggdGhlIERPTVB1cmlmeS5cbiAgICAvLyBQb2xpY3kgY3JlYXRpb24gd2l0aCBkdXBsaWNhdGUgbmFtZXMgdGhyb3dzIGluIFRydXN0ZWQgVHlwZXMuXG4gICAgdmFyIHN1ZmZpeCA9IG51bGw7XG4gICAgdmFyIEFUVFJfTkFNRSA9ICdkYXRhLXR0LXBvbGljeS1zdWZmaXgnO1xuICAgIGlmIChkb2N1bWVudC5jdXJyZW50U2NyaXB0ICYmIGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuaGFzQXR0cmlidXRlKEFUVFJfTkFNRSkpIHtcbiAgICAgIHN1ZmZpeCA9IGRvY3VtZW50LmN1cnJlbnRTY3JpcHQuZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7XG4gICAgfVxuXG4gICAgdmFyIHBvbGljeU5hbWUgPSAnZG9tcHVyaWZ5JyArIChzdWZmaXggPyAnIycgKyBzdWZmaXggOiAnJyk7XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kocG9saWN5TmFtZSwge1xuICAgICAgICBjcmVhdGVIVE1MOiBmdW5jdGlvbiBjcmVhdGVIVE1MKGh0bWwkJDEpIHtcbiAgICAgICAgICByZXR1cm4gaHRtbCQkMTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgLy8gUG9saWN5IGNyZWF0aW9uIGZhaWxlZCAobW9zdCBsaWtlbHkgYW5vdGhlciBET01QdXJpZnkgc2NyaXB0IGhhc1xuICAgICAgLy8gYWxyZWFkeSBydW4pLiBTa2lwIGNyZWF0aW5nIHRoZSBwb2xpY3ksIGFzIHRoaXMgd2lsbCBvbmx5IGNhdXNlIGVycm9yc1xuICAgICAgLy8gaWYgVFQgYXJlIGVuZm9yY2VkLlxuICAgICAgY29uc29sZS53YXJuKCdUcnVzdGVkVHlwZXMgcG9saWN5ICcgKyBwb2xpY3lOYW1lICsgJyBjb3VsZCBub3QgYmUgY3JlYXRlZC4nKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBjcmVhdGVET01QdXJpZnkoKSB7XG4gICAgdmFyIHdpbmRvdyA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogZ2V0R2xvYmFsKCk7XG5cbiAgICB2YXIgRE9NUHVyaWZ5ID0gZnVuY3Rpb24gRE9NUHVyaWZ5KHJvb3QpIHtcbiAgICAgIHJldHVybiBjcmVhdGVET01QdXJpZnkocm9vdCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFZlcnNpb24gbGFiZWwsIGV4cG9zZWQgZm9yIGVhc2llciBjaGVja3NcbiAgICAgKiBpZiBET01QdXJpZnkgaXMgdXAgdG8gZGF0ZSBvciBub3RcbiAgICAgKi9cbiAgICBET01QdXJpZnkudmVyc2lvbiA9ICcyLjIuNyc7XG5cbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBlbGVtZW50cyB0aGF0IERPTVB1cmlmeSByZW1vdmVkIGR1cmluZyBzYW5pdGF0aW9uLlxuICAgICAqIEVtcHR5IGlmIG5vdGhpbmcgd2FzIHJlbW92ZWQuXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LnJlbW92ZWQgPSBbXTtcblxuICAgIGlmICghd2luZG93IHx8ICF3aW5kb3cuZG9jdW1lbnQgfHwgd2luZG93LmRvY3VtZW50Lm5vZGVUeXBlICE9PSA5KSB7XG4gICAgICAvLyBOb3QgcnVubmluZyBpbiBhIGJyb3dzZXIsIHByb3ZpZGUgYSBmYWN0b3J5IGZ1bmN0aW9uXG4gICAgICAvLyBzbyB0aGF0IHlvdSBjYW4gcGFzcyB5b3VyIG93biBXaW5kb3dcbiAgICAgIERPTVB1cmlmeS5pc1N1cHBvcnRlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gRE9NUHVyaWZ5O1xuICAgIH1cblxuICAgIHZhciBvcmlnaW5hbERvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG4gICAgdmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuICAgIHZhciBEb2N1bWVudEZyYWdtZW50ID0gd2luZG93LkRvY3VtZW50RnJhZ21lbnQsXG4gICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQgPSB3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudCxcbiAgICAgICAgTm9kZSA9IHdpbmRvdy5Ob2RlLFxuICAgICAgICBFbGVtZW50ID0gd2luZG93LkVsZW1lbnQsXG4gICAgICAgIE5vZGVGaWx0ZXIgPSB3aW5kb3cuTm9kZUZpbHRlcixcbiAgICAgICAgX3dpbmRvdyROYW1lZE5vZGVNYXAgPSB3aW5kb3cuTmFtZWROb2RlTWFwLFxuICAgICAgICBOYW1lZE5vZGVNYXAgPSBfd2luZG93JE5hbWVkTm9kZU1hcCA9PT0gdW5kZWZpbmVkID8gd2luZG93Lk5hbWVkTm9kZU1hcCB8fCB3aW5kb3cuTW96TmFtZWRBdHRyTWFwIDogX3dpbmRvdyROYW1lZE5vZGVNYXAsXG4gICAgICAgIFRleHQgPSB3aW5kb3cuVGV4dCxcbiAgICAgICAgQ29tbWVudCA9IHdpbmRvdy5Db21tZW50LFxuICAgICAgICBET01QYXJzZXIgPSB3aW5kb3cuRE9NUGFyc2VyLFxuICAgICAgICB0cnVzdGVkVHlwZXMgPSB3aW5kb3cudHJ1c3RlZFR5cGVzO1xuXG5cbiAgICB2YXIgRWxlbWVudFByb3RvdHlwZSA9IEVsZW1lbnQucHJvdG90eXBlO1xuXG4gICAgdmFyIGNsb25lTm9kZSA9IGxvb2t1cEdldHRlcihFbGVtZW50UHJvdG90eXBlLCAnY2xvbmVOb2RlJyk7XG4gICAgdmFyIGdldE5leHRTaWJsaW5nID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICduZXh0U2libGluZycpO1xuICAgIHZhciBnZXRDaGlsZE5vZGVzID0gbG9va3VwR2V0dGVyKEVsZW1lbnRQcm90b3R5cGUsICdjaGlsZE5vZGVzJyk7XG4gICAgdmFyIGdldFBhcmVudE5vZGUgPSBsb29rdXBHZXR0ZXIoRWxlbWVudFByb3RvdHlwZSwgJ3BhcmVudE5vZGUnKTtcblxuICAgIC8vIEFzIHBlciBpc3N1ZSAjNDcsIHRoZSB3ZWItY29tcG9uZW50cyByZWdpc3RyeSBpcyBpbmhlcml0ZWQgYnkgYVxuICAgIC8vIG5ldyBkb2N1bWVudCBjcmVhdGVkIHZpYSBjcmVhdGVIVE1MRG9jdW1lbnQuIEFzIHBlciB0aGUgc3BlY1xuICAgIC8vIChodHRwOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvY3VzdG9tLyNjcmVhdGluZy1hbmQtcGFzc2luZy1yZWdpc3RyaWVzKVxuICAgIC8vIGEgbmV3IGVtcHR5IHJlZ2lzdHJ5IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBhIHRlbXBsYXRlIGNvbnRlbnRzIG93bmVyXG4gICAgLy8gZG9jdW1lbnQsIHNvIHdlIHVzZSB0aGF0IGFzIG91ciBwYXJlbnQgZG9jdW1lbnQgdG8gZW5zdXJlIG5vdGhpbmdcbiAgICAvLyBpcyBpbmhlcml0ZWQuXG4gICAgaWYgKHR5cGVvZiBIVE1MVGVtcGxhdGVFbGVtZW50ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB2YXIgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpO1xuICAgICAgaWYgKHRlbXBsYXRlLmNvbnRlbnQgJiYgdGVtcGxhdGUuY29udGVudC5vd25lckRvY3VtZW50KSB7XG4gICAgICAgIGRvY3VtZW50ID0gdGVtcGxhdGUuY29udGVudC5vd25lckRvY3VtZW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciB0cnVzdGVkVHlwZXNQb2xpY3kgPSBfY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KHRydXN0ZWRUeXBlcywgb3JpZ2luYWxEb2N1bWVudCk7XG4gICAgdmFyIGVtcHR5SFRNTCA9IHRydXN0ZWRUeXBlc1BvbGljeSAmJiBSRVRVUk5fVFJVU1RFRF9UWVBFID8gdHJ1c3RlZFR5cGVzUG9saWN5LmNyZWF0ZUhUTUwoJycpIDogJyc7XG5cbiAgICB2YXIgX2RvY3VtZW50ID0gZG9jdW1lbnQsXG4gICAgICAgIGltcGxlbWVudGF0aW9uID0gX2RvY3VtZW50LmltcGxlbWVudGF0aW9uLFxuICAgICAgICBjcmVhdGVOb2RlSXRlcmF0b3IgPSBfZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yLFxuICAgICAgICBnZXRFbGVtZW50c0J5VGFnTmFtZSA9IF9kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSxcbiAgICAgICAgY3JlYXRlRG9jdW1lbnRGcmFnbWVudCA9IF9kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50O1xuICAgIHZhciBpbXBvcnROb2RlID0gb3JpZ2luYWxEb2N1bWVudC5pbXBvcnROb2RlO1xuXG5cbiAgICB2YXIgZG9jdW1lbnRNb2RlID0ge307XG4gICAgdHJ5IHtcbiAgICAgIGRvY3VtZW50TW9kZSA9IGNsb25lKGRvY3VtZW50KS5kb2N1bWVudE1vZGUgPyBkb2N1bWVudC5kb2N1bWVudE1vZGUgOiB7fTtcbiAgICB9IGNhdGNoIChfKSB7fVxuXG4gICAgdmFyIGhvb2tzID0ge307XG5cbiAgICAvKipcbiAgICAgKiBFeHBvc2Ugd2hldGhlciB0aGlzIGJyb3dzZXIgc3VwcG9ydHMgcnVubmluZyB0aGUgZnVsbCBET01QdXJpZnkuXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LmlzU3VwcG9ydGVkID0gdHlwZW9mIGdldFBhcmVudE5vZGUgPT09ICdmdW5jdGlvbicgJiYgaW1wbGVtZW50YXRpb24gJiYgdHlwZW9mIGltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZG9jdW1lbnRNb2RlICE9PSA5O1xuXG4gICAgdmFyIE1VU1RBQ0hFX0VYUFIkJDEgPSBNVVNUQUNIRV9FWFBSLFxuICAgICAgICBFUkJfRVhQUiQkMSA9IEVSQl9FWFBSLFxuICAgICAgICBEQVRBX0FUVFIkJDEgPSBEQVRBX0FUVFIsXG4gICAgICAgIEFSSUFfQVRUUiQkMSA9IEFSSUFfQVRUUixcbiAgICAgICAgSVNfU0NSSVBUX09SX0RBVEEkJDEgPSBJU19TQ1JJUFRfT1JfREFUQSxcbiAgICAgICAgQVRUUl9XSElURVNQQUNFJCQxID0gQVRUUl9XSElURVNQQUNFO1xuICAgIHZhciBJU19BTExPV0VEX1VSSSQkMSA9IElTX0FMTE9XRURfVVJJO1xuXG4gICAgLyoqXG4gICAgICogV2UgY29uc2lkZXIgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGJlbG93IHRvIGJlIHNhZmUuIElkZWFsbHlcbiAgICAgKiBkb24ndCBhZGQgYW55IG5ldyBvbmVzIGJ1dCBmZWVsIGZyZWUgdG8gcmVtb3ZlIHVud2FudGVkIG9uZXMuXG4gICAgICovXG5cbiAgICAvKiBhbGxvd2VkIGVsZW1lbnQgbmFtZXMgKi9cblxuICAgIHZhciBBTExPV0VEX1RBR1MgPSBudWxsO1xuICAgIHZhciBERUZBVUxUX0FMTE9XRURfVEFHUyA9IGFkZFRvU2V0KHt9LCBbXS5jb25jYXQoX3RvQ29uc3VtYWJsZUFycmF5JDEoaHRtbCksIF90b0NvbnN1bWFibGVBcnJheSQxKHN2ZyksIF90b0NvbnN1bWFibGVBcnJheSQxKHN2Z0ZpbHRlcnMpLCBfdG9Db25zdW1hYmxlQXJyYXkkMShtYXRoTWwpLCBfdG9Db25zdW1hYmxlQXJyYXkkMSh0ZXh0KSkpO1xuXG4gICAgLyogQWxsb3dlZCBhdHRyaWJ1dGUgbmFtZXMgKi9cbiAgICB2YXIgQUxMT1dFRF9BVFRSID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9BTExPV0VEX0FUVFIgPSBhZGRUb1NldCh7fSwgW10uY29uY2F0KF90b0NvbnN1bWFibGVBcnJheSQxKGh0bWwkMSksIF90b0NvbnN1bWFibGVBcnJheSQxKHN2ZyQxKSwgX3RvQ29uc3VtYWJsZUFycmF5JDEobWF0aE1sJDEpLCBfdG9Db25zdW1hYmxlQXJyYXkkMSh4bWwpKSk7XG5cbiAgICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiB0YWdzIChvdmVycmlkZXMgQUxMT1dFRF9UQUdTL0FERF9UQUdTKSAqL1xuICAgIHZhciBGT1JCSURfVEFHUyA9IG51bGw7XG5cbiAgICAvKiBFeHBsaWNpdGx5IGZvcmJpZGRlbiBhdHRyaWJ1dGVzIChvdmVycmlkZXMgQUxMT1dFRF9BVFRSL0FERF9BVFRSKSAqL1xuICAgIHZhciBGT1JCSURfQVRUUiA9IG51bGw7XG5cbiAgICAvKiBEZWNpZGUgaWYgQVJJQSBhdHRyaWJ1dGVzIGFyZSBva2F5ICovXG4gICAgdmFyIEFMTE9XX0FSSUFfQVRUUiA9IHRydWU7XG5cbiAgICAvKiBEZWNpZGUgaWYgY3VzdG9tIGRhdGEgYXR0cmlidXRlcyBhcmUgb2theSAqL1xuICAgIHZhciBBTExPV19EQVRBX0FUVFIgPSB0cnVlO1xuXG4gICAgLyogRGVjaWRlIGlmIHVua25vd24gcHJvdG9jb2xzIGFyZSBva2F5ICovXG4gICAgdmFyIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gZmFsc2U7XG5cbiAgICAvKiBPdXRwdXQgc2hvdWxkIGJlIHNhZmUgZm9yIGNvbW1vbiB0ZW1wbGF0ZSBlbmdpbmVzLlxuICAgICAqIFRoaXMgbWVhbnMsIERPTVB1cmlmeSByZW1vdmVzIGRhdGEgYXR0cmlidXRlcywgbXVzdGFjaGVzIGFuZCBFUkJcbiAgICAgKi9cbiAgICB2YXIgU0FGRV9GT1JfVEVNUExBVEVTID0gZmFsc2U7XG5cbiAgICAvKiBEZWNpZGUgaWYgZG9jdW1lbnQgd2l0aCA8aHRtbD4uLi4gc2hvdWxkIGJlIHJldHVybmVkICovXG4gICAgdmFyIFdIT0xFX0RPQ1VNRU5UID0gZmFsc2U7XG5cbiAgICAvKiBUcmFjayB3aGV0aGVyIGNvbmZpZyBpcyBhbHJlYWR5IHNldCBvbiB0aGlzIGluc3RhbmNlIG9mIERPTVB1cmlmeS4gKi9cbiAgICB2YXIgU0VUX0NPTkZJRyA9IGZhbHNlO1xuXG4gICAgLyogRGVjaWRlIGlmIGFsbCBlbGVtZW50cyAoZS5nLiBzdHlsZSwgc2NyaXB0KSBtdXN0IGJlIGNoaWxkcmVuIG9mXG4gICAgICogZG9jdW1lbnQuYm9keS4gQnkgZGVmYXVsdCwgYnJvd3NlcnMgbWlnaHQgbW92ZSB0aGVtIHRvIGRvY3VtZW50LmhlYWQgKi9cbiAgICB2YXIgRk9SQ0VfQk9EWSA9IGZhbHNlO1xuXG4gICAgLyogRGVjaWRlIGlmIGEgRE9NIGBIVE1MQm9keUVsZW1lbnRgIHNob3VsZCBiZSByZXR1cm5lZCwgaW5zdGVhZCBvZiBhIGh0bWxcbiAgICAgKiBzdHJpbmcgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkuXG4gICAgICogSWYgYFdIT0xFX0RPQ1VNRU5UYCBpcyBlbmFibGVkIGEgYEhUTUxIdG1sRWxlbWVudGAgd2lsbCBiZSByZXR1cm5lZCBpbnN0ZWFkXG4gICAgICovXG4gICAgdmFyIFJFVFVSTl9ET00gPSBmYWxzZTtcblxuICAgIC8qIERlY2lkZSBpZiBhIERPTSBgRG9jdW1lbnRGcmFnbWVudGAgc2hvdWxkIGJlIHJldHVybmVkLCBpbnN0ZWFkIG9mIGEgaHRtbFxuICAgICAqIHN0cmluZyAgKG9yIGEgVHJ1c3RlZEhUTUwgb2JqZWN0IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCkgKi9cbiAgICB2YXIgUkVUVVJOX0RPTV9GUkFHTUVOVCA9IGZhbHNlO1xuXG4gICAgLyogSWYgYFJFVFVSTl9ET01gIG9yIGBSRVRVUk5fRE9NX0ZSQUdNRU5UYCBpcyBlbmFibGVkLCBkZWNpZGUgaWYgdGhlIHJldHVybmVkIERPTVxuICAgICAqIGBOb2RlYCBpcyBpbXBvcnRlZCBpbnRvIHRoZSBjdXJyZW50IGBEb2N1bWVudGAuIElmIHRoaXMgZmxhZyBpcyBub3QgZW5hYmxlZCB0aGVcbiAgICAgKiBgTm9kZWAgd2lsbCBiZWxvbmcgKGl0cyBvd25lckRvY3VtZW50KSB0byBhIGZyZXNoIGBIVE1MRG9jdW1lbnRgLCBjcmVhdGVkIGJ5XG4gICAgICogRE9NUHVyaWZ5LlxuICAgICAqXG4gICAgICogVGhpcyBkZWZhdWx0cyB0byBgdHJ1ZWAgc3RhcnRpbmcgRE9NUHVyaWZ5IDIuMi4wLiBOb3RlIHRoYXQgc2V0dGluZyBpdCB0byBgZmFsc2VgXG4gICAgICogbWlnaHQgY2F1c2UgWFNTIGZyb20gYXR0YWNrcyBoaWRkZW4gaW4gY2xvc2VkIHNoYWRvd3Jvb3RzIGluIGNhc2UgdGhlIGJyb3dzZXJcbiAgICAgKiBzdXBwb3J0cyBEZWNsYXJhdGl2ZSBTaGFkb3c6IERPTSBodHRwczovL3dlYi5kZXYvZGVjbGFyYXRpdmUtc2hhZG93LWRvbS9cbiAgICAgKi9cbiAgICB2YXIgUkVUVVJOX0RPTV9JTVBPUlQgPSB0cnVlO1xuXG4gICAgLyogVHJ5IHRvIHJldHVybiBhIFRydXN0ZWQgVHlwZSBvYmplY3QgaW5zdGVhZCBvZiBhIHN0cmluZywgcmV0dXJuIGEgc3RyaW5nIGluXG4gICAgICogY2FzZSBUcnVzdGVkIFR5cGVzIGFyZSBub3Qgc3VwcG9ydGVkICAqL1xuICAgIHZhciBSRVRVUk5fVFJVU1RFRF9UWVBFID0gZmFsc2U7XG5cbiAgICAvKiBPdXRwdXQgc2hvdWxkIGJlIGZyZWUgZnJvbSBET00gY2xvYmJlcmluZyBhdHRhY2tzPyAqL1xuICAgIHZhciBTQU5JVElaRV9ET00gPSB0cnVlO1xuXG4gICAgLyogS2VlcCBlbGVtZW50IGNvbnRlbnQgd2hlbiByZW1vdmluZyBlbGVtZW50PyAqL1xuICAgIHZhciBLRUVQX0NPTlRFTlQgPSB0cnVlO1xuXG4gICAgLyogSWYgYSBgTm9kZWAgaXMgcGFzc2VkIHRvIHNhbml0aXplKCksIHRoZW4gcGVyZm9ybXMgc2FuaXRpemF0aW9uIGluLXBsYWNlIGluc3RlYWRcbiAgICAgKiBvZiBpbXBvcnRpbmcgaXQgaW50byBhIG5ldyBEb2N1bWVudCBhbmQgcmV0dXJuaW5nIGEgc2FuaXRpemVkIGNvcHkgKi9cbiAgICB2YXIgSU5fUExBQ0UgPSBmYWxzZTtcblxuICAgIC8qIEFsbG93IHVzYWdlIG9mIHByb2ZpbGVzIGxpa2UgaHRtbCwgc3ZnIGFuZCBtYXRoTWwgKi9cbiAgICB2YXIgVVNFX1BST0ZJTEVTID0ge307XG5cbiAgICAvKiBUYWdzIHRvIGlnbm9yZSBjb250ZW50IG9mIHdoZW4gS0VFUF9DT05URU5UIGlzIHRydWUgKi9cbiAgICB2YXIgRk9SQklEX0NPTlRFTlRTID0gYWRkVG9TZXQoe30sIFsnYW5ub3RhdGlvbi14bWwnLCAnYXVkaW8nLCAnY29sZ3JvdXAnLCAnZGVzYycsICdmb3JlaWdub2JqZWN0JywgJ2hlYWQnLCAnaWZyYW1lJywgJ21hdGgnLCAnbWknLCAnbW4nLCAnbW8nLCAnbXMnLCAnbXRleHQnLCAnbm9lbWJlZCcsICdub2ZyYW1lcycsICdub3NjcmlwdCcsICdwbGFpbnRleHQnLCAnc2NyaXB0JywgJ3N0eWxlJywgJ3N2ZycsICd0ZW1wbGF0ZScsICd0aGVhZCcsICd0aXRsZScsICd2aWRlbycsICd4bXAnXSk7XG5cbiAgICAvKiBUYWdzIHRoYXQgYXJlIHNhZmUgZm9yIGRhdGE6IFVSSXMgKi9cbiAgICB2YXIgREFUQV9VUklfVEFHUyA9IG51bGw7XG4gICAgdmFyIERFRkFVTFRfREFUQV9VUklfVEFHUyA9IGFkZFRvU2V0KHt9LCBbJ2F1ZGlvJywgJ3ZpZGVvJywgJ2ltZycsICdzb3VyY2UnLCAnaW1hZ2UnLCAndHJhY2snXSk7XG5cbiAgICAvKiBBdHRyaWJ1dGVzIHNhZmUgZm9yIHZhbHVlcyBsaWtlIFwiamF2YXNjcmlwdDpcIiAqL1xuICAgIHZhciBVUklfU0FGRV9BVFRSSUJVVEVTID0gbnVsbDtcbiAgICB2YXIgREVGQVVMVF9VUklfU0FGRV9BVFRSSUJVVEVTID0gYWRkVG9TZXQoe30sIFsnYWx0JywgJ2NsYXNzJywgJ2ZvcicsICdpZCcsICdsYWJlbCcsICduYW1lJywgJ3BhdHRlcm4nLCAncGxhY2Vob2xkZXInLCAnc3VtbWFyeScsICd0aXRsZScsICd2YWx1ZScsICdzdHlsZScsICd4bWxucyddKTtcblxuICAgIC8qIEtlZXAgYSByZWZlcmVuY2UgdG8gY29uZmlnIHRvIHBhc3MgdG8gaG9va3MgKi9cbiAgICB2YXIgQ09ORklHID0gbnVsbDtcblxuICAgIC8qIElkZWFsbHksIGRvIG5vdCB0b3VjaCBhbnl0aGluZyBiZWxvdyB0aGlzIGxpbmUgKi9cbiAgICAvKiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fICovXG5cbiAgICB2YXIgZm9ybUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdmb3JtJyk7XG5cbiAgICAvKipcbiAgICAgKiBfcGFyc2VDb25maWdcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge09iamVjdH0gY2ZnIG9wdGlvbmFsIGNvbmZpZyBsaXRlcmFsXG4gICAgICovXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbiAgICB2YXIgX3BhcnNlQ29uZmlnID0gZnVuY3Rpb24gX3BhcnNlQ29uZmlnKGNmZykge1xuICAgICAgaWYgKENPTkZJRyAmJiBDT05GSUcgPT09IGNmZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8qIFNoaWVsZCBjb25maWd1cmF0aW9uIG9iamVjdCBmcm9tIHRhbXBlcmluZyAqL1xuICAgICAgaWYgKCFjZmcgfHwgKHR5cGVvZiBjZmcgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKGNmZykpICE9PSAnb2JqZWN0Jykge1xuICAgICAgICBjZmcgPSB7fTtcbiAgICAgIH1cblxuICAgICAgLyogU2hpZWxkIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZyb20gcHJvdG90eXBlIHBvbGx1dGlvbiAqL1xuICAgICAgY2ZnID0gY2xvbmUoY2ZnKTtcblxuICAgICAgLyogU2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAqL1xuICAgICAgQUxMT1dFRF9UQUdTID0gJ0FMTE9XRURfVEFHUycgaW4gY2ZnID8gYWRkVG9TZXQoe30sIGNmZy5BTExPV0VEX1RBR1MpIDogREVGQVVMVF9BTExPV0VEX1RBR1M7XG4gICAgICBBTExPV0VEX0FUVFIgPSAnQUxMT1dFRF9BVFRSJyBpbiBjZmcgPyBhZGRUb1NldCh7fSwgY2ZnLkFMTE9XRURfQVRUUikgOiBERUZBVUxUX0FMTE9XRURfQVRUUjtcbiAgICAgIFVSSV9TQUZFX0FUVFJJQlVURVMgPSAnQUREX1VSSV9TQUZFX0FUVFInIGluIGNmZyA/IGFkZFRvU2V0KGNsb25lKERFRkFVTFRfVVJJX1NBRkVfQVRUUklCVVRFUyksIGNmZy5BRERfVVJJX1NBRkVfQVRUUikgOiBERUZBVUxUX1VSSV9TQUZFX0FUVFJJQlVURVM7XG4gICAgICBEQVRBX1VSSV9UQUdTID0gJ0FERF9EQVRBX1VSSV9UQUdTJyBpbiBjZmcgPyBhZGRUb1NldChjbG9uZShERUZBVUxUX0RBVEFfVVJJX1RBR1MpLCBjZmcuQUREX0RBVEFfVVJJX1RBR1MpIDogREVGQVVMVF9EQVRBX1VSSV9UQUdTO1xuICAgICAgRk9SQklEX1RBR1MgPSAnRk9SQklEX1RBR1MnIGluIGNmZyA/IGFkZFRvU2V0KHt9LCBjZmcuRk9SQklEX1RBR1MpIDoge307XG4gICAgICBGT1JCSURfQVRUUiA9ICdGT1JCSURfQVRUUicgaW4gY2ZnID8gYWRkVG9TZXQoe30sIGNmZy5GT1JCSURfQVRUUikgOiB7fTtcbiAgICAgIFVTRV9QUk9GSUxFUyA9ICdVU0VfUFJPRklMRVMnIGluIGNmZyA/IGNmZy5VU0VfUFJPRklMRVMgOiBmYWxzZTtcbiAgICAgIEFMTE9XX0FSSUFfQVRUUiA9IGNmZy5BTExPV19BUklBX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICAgIEFMTE9XX0RBVEFfQVRUUiA9IGNmZy5BTExPV19EQVRBX0FUVFIgIT09IGZhbHNlOyAvLyBEZWZhdWx0IHRydWVcbiAgICAgIEFMTE9XX1VOS05PV05fUFJPVE9DT0xTID0gY2ZnLkFMTE9XX1VOS05PV05fUFJPVE9DT0xTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBTQUZFX0ZPUl9URU1QTEFURVMgPSBjZmcuU0FGRV9GT1JfVEVNUExBVEVTIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBXSE9MRV9ET0NVTUVOVCA9IGNmZy5XSE9MRV9ET0NVTUVOVCB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgUkVUVVJOX0RPTSA9IGNmZy5SRVRVUk5fRE9NIHx8IGZhbHNlOyAvLyBEZWZhdWx0IGZhbHNlXG4gICAgICBSRVRVUk5fRE9NX0ZSQUdNRU5UID0gY2ZnLlJFVFVSTl9ET01fRlJBR01FTlQgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIFJFVFVSTl9ET01fSU1QT1JUID0gY2ZnLlJFVFVSTl9ET01fSU1QT1JUICE9PSBmYWxzZTsgLy8gRGVmYXVsdCB0cnVlXG4gICAgICBSRVRVUk5fVFJVU1RFRF9UWVBFID0gY2ZnLlJFVFVSTl9UUlVTVEVEX1RZUEUgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIEZPUkNFX0JPRFkgPSBjZmcuRk9SQ0VfQk9EWSB8fCBmYWxzZTsgLy8gRGVmYXVsdCBmYWxzZVxuICAgICAgU0FOSVRJWkVfRE9NID0gY2ZnLlNBTklUSVpFX0RPTSAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgICAgS0VFUF9DT05URU5UID0gY2ZnLktFRVBfQ09OVEVOVCAhPT0gZmFsc2U7IC8vIERlZmF1bHQgdHJ1ZVxuICAgICAgSU5fUExBQ0UgPSBjZmcuSU5fUExBQ0UgfHwgZmFsc2U7IC8vIERlZmF1bHQgZmFsc2VcbiAgICAgIElTX0FMTE9XRURfVVJJJCQxID0gY2ZnLkFMTE9XRURfVVJJX1JFR0VYUCB8fCBJU19BTExPV0VEX1VSSSQkMTtcbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgQUxMT1dfREFUQV9BVFRSID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgIFJFVFVSTl9ET00gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBQYXJzZSBwcm9maWxlIGluZm8gKi9cbiAgICAgIGlmIChVU0VfUFJPRklMRVMpIHtcbiAgICAgICAgQUxMT1dFRF9UQUdTID0gYWRkVG9TZXQoe30sIFtdLmNvbmNhdChfdG9Db25zdW1hYmxlQXJyYXkkMSh0ZXh0KSkpO1xuICAgICAgICBBTExPV0VEX0FUVFIgPSBbXTtcbiAgICAgICAgaWYgKFVTRV9QUk9GSUxFUy5odG1sID09PSB0cnVlKSB7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBodG1sKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIGh0bWwkMSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2ZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgc3ZnKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHN2ZyQxKTtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX0FUVFIsIHhtbCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVVNFX1BST0ZJTEVTLnN2Z0ZpbHRlcnMgPT09IHRydWUpIHtcbiAgICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIHN2Z0ZpbHRlcnMpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgc3ZnJDEpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChVU0VfUFJPRklMRVMubWF0aE1sID09PSB0cnVlKSB7XG4gICAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBtYXRoTWwpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgbWF0aE1sJDEpO1xuICAgICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgeG1sKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBNZXJnZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi9cbiAgICAgIGlmIChjZmcuQUREX1RBR1MpIHtcbiAgICAgICAgaWYgKEFMTE9XRURfVEFHUyA9PT0gREVGQVVMVF9BTExPV0VEX1RBR1MpIHtcbiAgICAgICAgICBBTExPV0VEX1RBR1MgPSBjbG9uZShBTExPV0VEX1RBR1MpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWRkVG9TZXQoQUxMT1dFRF9UQUdTLCBjZmcuQUREX1RBR1MpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2ZnLkFERF9BVFRSKSB7XG4gICAgICAgIGlmIChBTExPV0VEX0FUVFIgPT09IERFRkFVTFRfQUxMT1dFRF9BVFRSKSB7XG4gICAgICAgICAgQUxMT1dFRF9BVFRSID0gY2xvbmUoQUxMT1dFRF9BVFRSKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfQVRUUiwgY2ZnLkFERF9BVFRSKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNmZy5BRERfVVJJX1NBRkVfQVRUUikge1xuICAgICAgICBhZGRUb1NldChVUklfU0FGRV9BVFRSSUJVVEVTLCBjZmcuQUREX1VSSV9TQUZFX0FUVFIpO1xuICAgICAgfVxuXG4gICAgICAvKiBBZGQgI3RleHQgaW4gY2FzZSBLRUVQX0NPTlRFTlQgaXMgc2V0IHRvIHRydWUgKi9cbiAgICAgIGlmIChLRUVQX0NPTlRFTlQpIHtcbiAgICAgICAgQUxMT1dFRF9UQUdTWycjdGV4dCddID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogQWRkIGh0bWwsIGhlYWQgYW5kIGJvZHkgdG8gQUxMT1dFRF9UQUdTIGluIGNhc2UgV0hPTEVfRE9DVU1FTlQgaXMgdHJ1ZSAqL1xuICAgICAgaWYgKFdIT0xFX0RPQ1VNRU5UKSB7XG4gICAgICAgIGFkZFRvU2V0KEFMTE9XRURfVEFHUywgWydodG1sJywgJ2hlYWQnLCAnYm9keSddKTtcbiAgICAgIH1cblxuICAgICAgLyogQWRkIHRib2R5IHRvIEFMTE9XRURfVEFHUyBpbiBjYXNlIHRhYmxlcyBhcmUgcGVybWl0dGVkLCBzZWUgIzI4NiwgIzM2NSAqL1xuICAgICAgaWYgKEFMTE9XRURfVEFHUy50YWJsZSkge1xuICAgICAgICBhZGRUb1NldChBTExPV0VEX1RBR1MsIFsndGJvZHknXSk7XG4gICAgICAgIGRlbGV0ZSBGT1JCSURfVEFHUy50Ym9keTtcbiAgICAgIH1cblxuICAgICAgLy8gUHJldmVudCBmdXJ0aGVyIG1hbmlwdWxhdGlvbiBvZiBjb25maWd1cmF0aW9uLlxuICAgICAgLy8gTm90IGF2YWlsYWJsZSBpbiBJRTgsIFNhZmFyaSA1LCBldGMuXG4gICAgICBpZiAoZnJlZXplKSB7XG4gICAgICAgIGZyZWV6ZShjZmcpO1xuICAgICAgfVxuXG4gICAgICBDT05GSUcgPSBjZmc7XG4gICAgfTtcblxuICAgIHZhciBNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFMgPSBhZGRUb1NldCh7fSwgWydtaScsICdtbycsICdtbicsICdtcycsICdtdGV4dCddKTtcblxuICAgIHZhciBIVE1MX0lOVEVHUkFUSU9OX1BPSU5UUyA9IGFkZFRvU2V0KHt9LCBbJ2ZvcmVpZ25vYmplY3QnLCAnZGVzYycsICd0aXRsZScsICdhbm5vdGF0aW9uLXhtbCddKTtcblxuICAgIC8qIEtlZXAgdHJhY2sgb2YgYWxsIHBvc3NpYmxlIFNWRyBhbmQgTWF0aE1MIHRhZ3NcbiAgICAgKiBzbyB0aGF0IHdlIGNhbiBwZXJmb3JtIHRoZSBuYW1lc3BhY2UgY2hlY2tzXG4gICAgICogY29ycmVjdGx5LiAqL1xuICAgIHZhciBBTExfU1ZHX1RBR1MgPSBhZGRUb1NldCh7fSwgc3ZnKTtcbiAgICBhZGRUb1NldChBTExfU1ZHX1RBR1MsIHN2Z0ZpbHRlcnMpO1xuICAgIGFkZFRvU2V0KEFMTF9TVkdfVEFHUywgc3ZnRGlzYWxsb3dlZCk7XG5cbiAgICB2YXIgQUxMX01BVEhNTF9UQUdTID0gYWRkVG9TZXQoe30sIG1hdGhNbCk7XG4gICAgYWRkVG9TZXQoQUxMX01BVEhNTF9UQUdTLCBtYXRoTWxEaXNhbGxvd2VkKTtcblxuICAgIHZhciBNQVRITUxfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwnO1xuICAgIHZhciBTVkdfTkFNRVNQQUNFID0gJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJztcbiAgICB2YXIgSFRNTF9OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG5cbiAgICAvKipcbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcmFtICB7RWxlbWVudH0gZWxlbWVudCBhIERPTSBlbGVtZW50IHdob3NlIG5hbWVzcGFjZSBpcyBiZWluZyBjaGVja2VkXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybiBmYWxzZSBpZiB0aGUgZWxlbWVudCBoYXMgYVxuICAgICAqICBuYW1lc3BhY2UgdGhhdCBhIHNwZWMtY29tcGxpYW50IHBhcnNlciB3b3VsZCBuZXZlclxuICAgICAqICByZXR1cm4uIFJldHVybiB0cnVlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICB2YXIgX2NoZWNrVmFsaWROYW1lc3BhY2UgPSBmdW5jdGlvbiBfY2hlY2tWYWxpZE5hbWVzcGFjZShlbGVtZW50KSB7XG4gICAgICB2YXIgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICAgICAgLy8gSW4gSlNET00sIGlmIHdlJ3JlIGluc2lkZSBzaGFkb3cgRE9NLCB0aGVuIHBhcmVudE5vZGVcbiAgICAgIC8vIGNhbiBiZSBudWxsLiBXZSBqdXN0IHNpbXVsYXRlIHBhcmVudCBpbiB0aGlzIGNhc2UuXG4gICAgICBpZiAoIXBhcmVudCB8fCAhcGFyZW50LnRhZ05hbWUpIHtcbiAgICAgICAgcGFyZW50ID0ge1xuICAgICAgICAgIG5hbWVzcGFjZVVSSTogSFRNTF9OQU1FU1BBQ0UsXG4gICAgICAgICAgdGFnTmFtZTogJ3RlbXBsYXRlJ1xuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICB2YXIgdGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKGVsZW1lbnQudGFnTmFtZSk7XG4gICAgICB2YXIgcGFyZW50VGFnTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKHBhcmVudC50YWdOYW1lKTtcblxuICAgICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFKSB7XG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBIVE1MIG5hbWVzcGFjZSB0byBTVkdcbiAgICAgICAgLy8gaXMgdmlhIDxzdmc+LiBJZiBpdCBoYXBwZW5zIHZpYSBhbnkgb3RoZXIgdGFnLCB0aGVuXG4gICAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnc3ZnJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRoZSBvbmx5IHdheSB0byBzd2l0Y2ggZnJvbSBNYXRoTUwgdG8gU1ZHIGlzIHZpYVxuICAgICAgICAvLyBzdmcgaWYgcGFyZW50IGlzIGVpdGhlciA8YW5ub3RhdGlvbi14bWw+IG9yIE1hdGhNTFxuICAgICAgICAvLyB0ZXh0IGludGVncmF0aW9uIHBvaW50cy5cbiAgICAgICAgaWYgKHBhcmVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgICByZXR1cm4gdGFnTmFtZSA9PT0gJ3N2ZycgJiYgKHBhcmVudFRhZ05hbWUgPT09ICdhbm5vdGF0aW9uLXhtbCcgfHwgTUFUSE1MX1RFWFRfSU5URUdSQVRJT05fUE9JTlRTW3BhcmVudFRhZ05hbWVdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdlIG9ubHkgYWxsb3cgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCBpbiBTVkdcbiAgICAgICAgLy8gc3BlYy4gQWxsIG90aGVycyBhcmUgZGlzYWxsb3dlZCBpbiBTVkcgbmFtZXNwYWNlLlxuICAgICAgICByZXR1cm4gQm9vbGVhbihBTExfU1ZHX1RBR1NbdGFnTmFtZV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IE1BVEhNTF9OQU1FU1BBQ0UpIHtcbiAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIHN3aXRjaCBmcm9tIEhUTUwgbmFtZXNwYWNlIHRvIE1hdGhNTFxuICAgICAgICAvLyBpcyB2aWEgPG1hdGg+LiBJZiBpdCBoYXBwZW5zIHZpYSBhbnkgb3RoZXIgdGFnLCB0aGVuXG4gICAgICAgIC8vIGl0IHNob3VsZCBiZSBraWxsZWQuXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnbWF0aCc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gU1ZHIHRvIE1hdGhNTCBpcyB2aWFcbiAgICAgICAgLy8gPG1hdGg+IGFuZCBIVE1MIGludGVncmF0aW9uIHBvaW50c1xuICAgICAgICBpZiAocGFyZW50Lm5hbWVzcGFjZVVSSSA9PT0gU1ZHX05BTUVTUEFDRSkge1xuICAgICAgICAgIHJldHVybiB0YWdOYW1lID09PSAnbWF0aCcgJiYgSFRNTF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBvbmx5IGFsbG93IGVsZW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgaW4gTWF0aE1MXG4gICAgICAgIC8vIHNwZWMuIEFsbCBvdGhlcnMgYXJlIGRpc2FsbG93ZWQgaW4gTWF0aE1MIG5hbWVzcGFjZS5cbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oQUxMX01BVEhNTF9UQUdTW3RhZ05hbWVdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQubmFtZXNwYWNlVVJJID09PSBIVE1MX05BTUVTUEFDRSkge1xuICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gc3dpdGNoIGZyb20gU1ZHIHRvIEhUTUwgaXMgdmlhXG4gICAgICAgIC8vIEhUTUwgaW50ZWdyYXRpb24gcG9pbnRzLCBhbmQgZnJvbSBNYXRoTUwgdG8gSFRNTFxuICAgICAgICAvLyBpcyB2aWEgTWF0aE1MIHRleHQgaW50ZWdyYXRpb24gcG9pbnRzXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBTVkdfTkFNRVNQQUNFICYmICFIVE1MX0lOVEVHUkFUSU9OX1BPSU5UU1twYXJlbnRUYWdOYW1lXSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJlbnQubmFtZXNwYWNlVVJJID09PSBNQVRITUxfTkFNRVNQQUNFICYmICFNQVRITUxfVEVYVF9JTlRFR1JBVElPTl9QT0lOVFNbcGFyZW50VGFnTmFtZV0pIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDZXJ0YWluIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGJvdGggU1ZHIGFuZCBIVE1MXG4gICAgICAgIC8vIG5hbWVzcGFjZS4gV2UgbmVlZCB0byBzcGVjaWZ5IHRoZW0gZXhwbGljaXRseVxuICAgICAgICAvLyBzbyB0aGF0IHRoZXkgZG9uJ3QgZ2V0IGVycm9ub3VzbHkgZGVsZXRlZCBmcm9tXG4gICAgICAgIC8vIEhUTUwgbmFtZXNwYWNlLlxuICAgICAgICB2YXIgY29tbW9uU3ZnQW5kSFRNTEVsZW1lbnRzID0gYWRkVG9TZXQoe30sIFsndGl0bGUnLCAnc3R5bGUnLCAnZm9udCcsICdhJywgJ3NjcmlwdCddKTtcblxuICAgICAgICAvLyBXZSBkaXNhbGxvdyB0YWdzIHRoYXQgYXJlIHNwZWNpZmljIGZvciBNYXRoTUxcbiAgICAgICAgLy8gb3IgU1ZHIGFuZCBzaG91bGQgbmV2ZXIgYXBwZWFyIGluIEhUTUwgbmFtZXNwYWNlXG4gICAgICAgIHJldHVybiAhQUxMX01BVEhNTF9UQUdTW3RhZ05hbWVdICYmIChjb21tb25TdmdBbmRIVE1MRWxlbWVudHNbdGFnTmFtZV0gfHwgIUFMTF9TVkdfVEFHU1t0YWdOYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb2RlIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIHBsYWNlICh0aGlzIG1lYW5zXG4gICAgICAvLyB0aGF0IHRoZSBlbGVtZW50IHNvbWVob3cgZ290IG5hbWVzcGFjZSB0aGF0IGlzIG5vdFxuICAgICAgLy8gSFRNTCwgU1ZHIG9yIE1hdGhNTCkuIFJldHVybiBmYWxzZSBqdXN0IGluIGNhc2UuXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9mb3JjZVJlbW92ZVxuICAgICAqXG4gICAgICogQHBhcmFtICB7Tm9kZX0gbm9kZSBhIERPTSBub2RlXG4gICAgICovXG4gICAgdmFyIF9mb3JjZVJlbW92ZSA9IGZ1bmN0aW9uIF9mb3JjZVJlbW92ZShub2RlKSB7XG4gICAgICBhcnJheVB1c2goRE9NUHVyaWZ5LnJlbW92ZWQsIHsgZWxlbWVudDogbm9kZSB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBub2RlLm91dGVySFRNTCA9IGVtcHR5SFRNTDtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIG5vZGUucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX3JlbW92ZUF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBuYW1lIGFuIEF0dHJpYnV0ZSBuYW1lXG4gICAgICogQHBhcmFtICB7Tm9kZX0gbm9kZSBhIERPTSBub2RlXG4gICAgICovXG4gICAgdmFyIF9yZW1vdmVBdHRyaWJ1dGUgPSBmdW5jdGlvbiBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIG5vZGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICAgIGF0dHJpYnV0ZTogbm9kZS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpLFxuICAgICAgICAgIGZyb206IG5vZGVcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgIGFycmF5UHVzaChET01QdXJpZnkucmVtb3ZlZCwge1xuICAgICAgICAgIGF0dHJpYnV0ZTogbnVsbCxcbiAgICAgICAgICBmcm9tOiBub2RlXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcblxuICAgICAgLy8gV2Ugdm9pZCBhdHRyaWJ1dGUgdmFsdWVzIGZvciB1bnJlbW92YWJsZSBcImlzXCJcIiBhdHRyaWJ1dGVzXG4gICAgICBpZiAobmFtZSA9PT0gJ2lzJyAmJiAhQUxMT1dFRF9BVFRSW25hbWVdKSB7XG4gICAgICAgIGlmIChSRVRVUk5fRE9NIHx8IFJFVFVSTl9ET01fRlJBR01FTlQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgX2ZvcmNlUmVtb3ZlKG5vZGUpO1xuICAgICAgICAgIH0gY2F0Y2ggKF8pIHt9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsICcnKTtcbiAgICAgICAgICB9IGNhdGNoIChfKSB7fVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9pbml0RG9jdW1lbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gZGlydHkgYSBzdHJpbmcgb2YgZGlydHkgbWFya3VwXG4gICAgICogQHJldHVybiB7RG9jdW1lbnR9IGEgRE9NLCBmaWxsZWQgd2l0aCB0aGUgZGlydHkgbWFya3VwXG4gICAgICovXG4gICAgdmFyIF9pbml0RG9jdW1lbnQgPSBmdW5jdGlvbiBfaW5pdERvY3VtZW50KGRpcnR5KSB7XG4gICAgICAvKiBDcmVhdGUgYSBIVE1MIGRvY3VtZW50ICovXG4gICAgICB2YXIgZG9jID0gdm9pZCAwO1xuICAgICAgdmFyIGxlYWRpbmdXaGl0ZXNwYWNlID0gdm9pZCAwO1xuXG4gICAgICBpZiAoRk9SQ0VfQk9EWSkge1xuICAgICAgICBkaXJ0eSA9ICc8cmVtb3ZlPjwvcmVtb3ZlPicgKyBkaXJ0eTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIElmIEZPUkNFX0JPRFkgaXNuJ3QgdXNlZCwgbGVhZGluZyB3aGl0ZXNwYWNlIG5lZWRzIHRvIGJlIHByZXNlcnZlZCBtYW51YWxseSAqL1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IHN0cmluZ01hdGNoKGRpcnR5LCAvXltcXHJcXG5cXHQgXSsvKTtcbiAgICAgICAgbGVhZGluZ1doaXRlc3BhY2UgPSBtYXRjaGVzICYmIG1hdGNoZXNbMF07XG4gICAgICB9XG5cbiAgICAgIHZhciBkaXJ0eVBheWxvYWQgPSB0cnVzdGVkVHlwZXNQb2xpY3kgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChkaXJ0eSkgOiBkaXJ0eTtcbiAgICAgIC8qIFVzZSB0aGUgRE9NUGFyc2VyIEFQSSBieSBkZWZhdWx0LCBmYWxsYmFjayBsYXRlciBpZiBuZWVkcyBiZSAqL1xuICAgICAgdHJ5IHtcbiAgICAgICAgZG9jID0gbmV3IERPTVBhcnNlcigpLnBhcnNlRnJvbVN0cmluZyhkaXJ0eVBheWxvYWQsICd0ZXh0L2h0bWwnKTtcbiAgICAgIH0gY2F0Y2ggKF8pIHt9XG5cbiAgICAgIC8qIFVzZSBjcmVhdGVIVE1MRG9jdW1lbnQgaW4gY2FzZSBET01QYXJzZXIgaXMgbm90IGF2YWlsYWJsZSAqL1xuICAgICAgaWYgKCFkb2MgfHwgIWRvYy5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgZG9jID0gaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCcnKTtcbiAgICAgICAgdmFyIF9kb2MgPSBkb2MsXG4gICAgICAgICAgICBib2R5ID0gX2RvYy5ib2R5O1xuXG4gICAgICAgIGJvZHkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChib2R5LnBhcmVudE5vZGUuZmlyc3RFbGVtZW50Q2hpbGQpO1xuICAgICAgICBib2R5Lm91dGVySFRNTCA9IGRpcnR5UGF5bG9hZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpcnR5ICYmIGxlYWRpbmdXaGl0ZXNwYWNlKSB7XG4gICAgICAgIGRvYy5ib2R5Lmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsZWFkaW5nV2hpdGVzcGFjZSksIGRvYy5ib2R5LmNoaWxkTm9kZXNbMF0gfHwgbnVsbCk7XG4gICAgICB9XG5cbiAgICAgIC8qIFdvcmsgb24gd2hvbGUgZG9jdW1lbnQgb3IganVzdCBpdHMgYm9keSAqL1xuICAgICAgcmV0dXJuIGdldEVsZW1lbnRzQnlUYWdOYW1lLmNhbGwoZG9jLCBXSE9MRV9ET0NVTUVOVCA/ICdodG1sJyA6ICdib2R5JylbMF07XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9jcmVhdGVJdGVyYXRvclxuICAgICAqXG4gICAgICogQHBhcmFtICB7RG9jdW1lbnR9IHJvb3QgZG9jdW1lbnQvZnJhZ21lbnQgdG8gY3JlYXRlIGl0ZXJhdG9yIGZvclxuICAgICAqIEByZXR1cm4ge0l0ZXJhdG9yfSBpdGVyYXRvciBpbnN0YW5jZVxuICAgICAqL1xuICAgIHZhciBfY3JlYXRlSXRlcmF0b3IgPSBmdW5jdGlvbiBfY3JlYXRlSXRlcmF0b3Iocm9vdCkge1xuICAgICAgcmV0dXJuIGNyZWF0ZU5vZGVJdGVyYXRvci5jYWxsKHJvb3Qub3duZXJEb2N1bWVudCB8fCByb290LCByb290LCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCB8IE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIHwgTm9kZUZpbHRlci5TSE9XX1RFWFQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIE5vZGVGaWx0ZXIuRklMVEVSX0FDQ0VQVDtcbiAgICAgIH0sIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX2lzQ2xvYmJlcmVkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBlbG0gZWxlbWVudCB0byBjaGVjayBmb3IgY2xvYmJlcmluZyBhdHRhY2tzXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiBjbG9iYmVyZWQsIGZhbHNlIGlmIHNhZmVcbiAgICAgKi9cbiAgICB2YXIgX2lzQ2xvYmJlcmVkID0gZnVuY3Rpb24gX2lzQ2xvYmJlcmVkKGVsbSkge1xuICAgICAgaWYgKGVsbSBpbnN0YW5jZW9mIFRleHQgfHwgZWxtIGluc3RhbmNlb2YgQ29tbWVudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgZWxtLm5vZGVOYW1lICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLnRleHRDb250ZW50ICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLnJlbW92ZUNoaWxkICE9PSAnZnVuY3Rpb24nIHx8ICEoZWxtLmF0dHJpYnV0ZXMgaW5zdGFuY2VvZiBOYW1lZE5vZGVNYXApIHx8IHR5cGVvZiBlbG0ucmVtb3ZlQXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbG0uc2V0QXR0cmlidXRlICE9PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBlbG0ubmFtZXNwYWNlVVJJICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgZWxtLmluc2VydEJlZm9yZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfaXNOb2RlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtOb2RlfSBvYmogb2JqZWN0IHRvIGNoZWNrIHdoZXRoZXIgaXQncyBhIERPTSBub2RlXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpcyBvYmplY3QgaXMgYSBET00gbm9kZVxuICAgICAqL1xuICAgIHZhciBfaXNOb2RlID0gZnVuY3Rpb24gX2lzTm9kZShvYmplY3QpIHtcbiAgICAgIHJldHVybiAodHlwZW9mIE5vZGUgPT09ICd1bmRlZmluZWQnID8gJ3VuZGVmaW5lZCcgOiBfdHlwZW9mKE5vZGUpKSA9PT0gJ29iamVjdCcgPyBvYmplY3QgaW5zdGFuY2VvZiBOb2RlIDogb2JqZWN0ICYmICh0eXBlb2Ygb2JqZWN0ID09PSAndW5kZWZpbmVkJyA/ICd1bmRlZmluZWQnIDogX3R5cGVvZihvYmplY3QpKSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iamVjdC5ub2RlVHlwZSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIG9iamVjdC5ub2RlTmFtZSA9PT0gJ3N0cmluZyc7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9leGVjdXRlSG9va1xuICAgICAqIEV4ZWN1dGUgdXNlciBjb25maWd1cmFibGUgaG9va3NcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge1N0cmluZ30gZW50cnlQb2ludCAgTmFtZSBvZiB0aGUgaG9vaydzIGVudHJ5IHBvaW50XG4gICAgICogQHBhcmFtICB7Tm9kZX0gY3VycmVudE5vZGUgbm9kZSB0byB3b3JrIG9uIHdpdGggdGhlIGhvb2tcbiAgICAgKiBAcGFyYW0gIHtPYmplY3R9IGRhdGEgYWRkaXRpb25hbCBob29rIHBhcmFtZXRlcnNcbiAgICAgKi9cbiAgICB2YXIgX2V4ZWN1dGVIb29rID0gZnVuY3Rpb24gX2V4ZWN1dGVIb29rKGVudHJ5UG9pbnQsIGN1cnJlbnROb2RlLCBkYXRhKSB7XG4gICAgICBpZiAoIWhvb2tzW2VudHJ5UG9pbnRdKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgYXJyYXlGb3JFYWNoKGhvb2tzW2VudHJ5UG9pbnRdLCBmdW5jdGlvbiAoaG9vaykge1xuICAgICAgICBob29rLmNhbGwoRE9NUHVyaWZ5LCBjdXJyZW50Tm9kZSwgZGF0YSwgQ09ORklHKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfc2FuaXRpemVFbGVtZW50c1xuICAgICAqXG4gICAgICogQHByb3RlY3Qgbm9kZU5hbWVcbiAgICAgKiBAcHJvdGVjdCB0ZXh0Q29udGVudFxuICAgICAqIEBwcm90ZWN0IHJlbW92ZUNoaWxkXG4gICAgICpcbiAgICAgKiBAcGFyYW0gICB7Tm9kZX0gY3VycmVudE5vZGUgdG8gY2hlY2sgZm9yIHBlcm1pc3Npb24gdG8gZXhpc3RcbiAgICAgKiBAcmV0dXJuICB7Qm9vbGVhbn0gdHJ1ZSBpZiBub2RlIHdhcyBraWxsZWQsIGZhbHNlIGlmIGxlZnQgYWxpdmVcbiAgICAgKi9cbiAgICB2YXIgX3Nhbml0aXplRWxlbWVudHMgPSBmdW5jdGlvbiBfc2FuaXRpemVFbGVtZW50cyhjdXJyZW50Tm9kZSkge1xuICAgICAgdmFyIGNvbnRlbnQgPSB2b2lkIDA7XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYmVmb3JlU2FuaXRpemVFbGVtZW50cycsIGN1cnJlbnROb2RlLCBudWxsKTtcblxuICAgICAgLyogQ2hlY2sgaWYgZWxlbWVudCBpcyBjbG9iYmVyZWQgb3IgY2FuIGNsb2JiZXIgKi9cbiAgICAgIGlmIChfaXNDbG9iYmVyZWQoY3VycmVudE5vZGUpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBDaGVjayBpZiB0YWduYW1lIGNvbnRhaW5zIFVuaWNvZGUgKi9cbiAgICAgIGlmIChzdHJpbmdNYXRjaChjdXJyZW50Tm9kZS5ub2RlTmFtZSwgL1tcXHUwMDgwLVxcdUZGRkZdLykpIHtcbiAgICAgICAgX2ZvcmNlUmVtb3ZlKGN1cnJlbnROb2RlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8qIE5vdyBsZXQncyBjaGVjayB0aGUgZWxlbWVudCdzIHR5cGUgYW5kIG5hbWUgKi9cbiAgICAgIHZhciB0YWdOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UoY3VycmVudE5vZGUubm9kZU5hbWUpO1xuXG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ3Vwb25TYW5pdGl6ZUVsZW1lbnQnLCBjdXJyZW50Tm9kZSwge1xuICAgICAgICB0YWdOYW1lOiB0YWdOYW1lLFxuICAgICAgICBhbGxvd2VkVGFnczogQUxMT1dFRF9UQUdTXG4gICAgICB9KTtcblxuICAgICAgLyogRGV0ZWN0IG1YU1MgYXR0ZW1wdHMgYWJ1c2luZyBuYW1lc3BhY2UgY29uZnVzaW9uICovXG4gICAgICBpZiAoIV9pc05vZGUoY3VycmVudE5vZGUuZmlyc3RFbGVtZW50Q2hpbGQpICYmICghX2lzTm9kZShjdXJyZW50Tm9kZS5jb250ZW50KSB8fCAhX2lzTm9kZShjdXJyZW50Tm9kZS5jb250ZW50LmZpcnN0RWxlbWVudENoaWxkKSkgJiYgcmVnRXhwVGVzdCgvPFsvXFx3XS9nLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpICYmIHJlZ0V4cFRlc3QoLzxbL1xcd10vZywgY3VycmVudE5vZGUudGV4dENvbnRlbnQpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBSZW1vdmUgZWxlbWVudCBpZiBhbnl0aGluZyBmb3JiaWRzIGl0cyBwcmVzZW5jZSAqL1xuICAgICAgaWYgKCFBTExPV0VEX1RBR1NbdGFnTmFtZV0gfHwgRk9SQklEX1RBR1NbdGFnTmFtZV0pIHtcbiAgICAgICAgLyogS2VlcCBjb250ZW50IGV4Y2VwdCBmb3IgYmFkLWxpc3RlZCBlbGVtZW50cyAqL1xuICAgICAgICBpZiAoS0VFUF9DT05URU5UICYmICFGT1JCSURfQ09OVEVOVFNbdGFnTmFtZV0pIHtcbiAgICAgICAgICB2YXIgcGFyZW50Tm9kZSA9IGdldFBhcmVudE5vZGUoY3VycmVudE5vZGUpO1xuICAgICAgICAgIHZhciBjaGlsZE5vZGVzID0gZ2V0Q2hpbGROb2RlcyhjdXJyZW50Tm9kZSk7XG5cbiAgICAgICAgICBpZiAoY2hpbGROb2RlcyAmJiBwYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB2YXIgY2hpbGRDb3VudCA9IGNoaWxkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gY2hpbGRDb3VudCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgICAgICAgIHBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNsb25lTm9kZShjaGlsZE5vZGVzW2ldLCB0cnVlKSwgZ2V0TmV4dFNpYmxpbmcoY3VycmVudE5vZGUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBfZm9yY2VSZW1vdmUoY3VycmVudE5vZGUpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLyogQ2hlY2sgd2hldGhlciBlbGVtZW50IGhhcyBhIHZhbGlkIG5hbWVzcGFjZSAqL1xuICAgICAgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiAhX2NoZWNrVmFsaWROYW1lc3BhY2UoY3VycmVudE5vZGUpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoKHRhZ05hbWUgPT09ICdub3NjcmlwdCcgfHwgdGFnTmFtZSA9PT0gJ25vZW1iZWQnKSAmJiByZWdFeHBUZXN0KC88XFwvbm8oc2NyaXB0fGVtYmVkKS9pLCBjdXJyZW50Tm9kZS5pbm5lckhUTUwpKSB7XG4gICAgICAgIF9mb3JjZVJlbW92ZShjdXJyZW50Tm9kZSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvKiBTYW5pdGl6ZSBlbGVtZW50IGNvbnRlbnQgdG8gYmUgdGVtcGxhdGUtc2FmZSAqL1xuICAgICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUyAmJiBjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAvKiBHZXQgdGhlIGVsZW1lbnQncyB0ZXh0IGNvbnRlbnQgKi9cbiAgICAgICAgY29udGVudCA9IGN1cnJlbnROb2RlLnRleHRDb250ZW50O1xuICAgICAgICBjb250ZW50ID0gc3RyaW5nUmVwbGFjZShjb250ZW50LCBNVVNUQUNIRV9FWFBSJCQxLCAnICcpO1xuICAgICAgICBjb250ZW50ID0gc3RyaW5nUmVwbGFjZShjb250ZW50LCBFUkJfRVhQUiQkMSwgJyAnKTtcbiAgICAgICAgaWYgKGN1cnJlbnROb2RlLnRleHRDb250ZW50ICE9PSBjb250ZW50KSB7XG4gICAgICAgICAgYXJyYXlQdXNoKERPTVB1cmlmeS5yZW1vdmVkLCB7IGVsZW1lbnQ6IGN1cnJlbnROb2RlLmNsb25lTm9kZSgpIH0pO1xuICAgICAgICAgIGN1cnJlbnROb2RlLnRleHRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICBfZXhlY3V0ZUhvb2soJ2FmdGVyU2FuaXRpemVFbGVtZW50cycsIGN1cnJlbnROb2RlLCBudWxsKTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBfaXNWYWxpZEF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBsY1RhZyBMb3dlcmNhc2UgdGFnIG5hbWUgb2YgY29udGFpbmluZyBlbGVtZW50LlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gbGNOYW1lIExvd2VyY2FzZSBhdHRyaWJ1dGUgbmFtZS5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyB2YWxpZCwgb3RoZXJ3aXNlIGZhbHNlLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG4gICAgdmFyIF9pc1ZhbGlkQXR0cmlidXRlID0gZnVuY3Rpb24gX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpIHtcbiAgICAgIC8qIE1ha2Ugc3VyZSBhdHRyaWJ1dGUgY2Fubm90IGNsb2JiZXIgKi9cbiAgICAgIGlmIChTQU5JVElaRV9ET00gJiYgKGxjTmFtZSA9PT0gJ2lkJyB8fCBsY05hbWUgPT09ICduYW1lJykgJiYgKHZhbHVlIGluIGRvY3VtZW50IHx8IHZhbHVlIGluIGZvcm1FbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8qIEFsbG93IHZhbGlkIGRhdGEtKiBhdHRyaWJ1dGVzOiBBdCBsZWFzdCBvbmUgY2hhcmFjdGVyIGFmdGVyIFwiLVwiXG4gICAgICAgICAgKGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2RvbS5odG1sI2VtYmVkZGluZy1jdXN0b20tbm9uLXZpc2libGUtZGF0YS13aXRoLXRoZS1kYXRhLSotYXR0cmlidXRlcylcbiAgICAgICAgICBYTUwtY29tcGF0aWJsZSAoaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5mcmFzdHJ1Y3R1cmUuaHRtbCN4bWwtY29tcGF0aWJsZSBhbmQgaHR0cDovL3d3dy53My5vcmcvVFIveG1sLyNkMGU4MDQpXG4gICAgICAgICAgV2UgZG9uJ3QgbmVlZCB0byBjaGVjayB0aGUgdmFsdWU7IGl0J3MgYWx3YXlzIFVSSSBzYWZlLiAqL1xuICAgICAgaWYgKEFMTE9XX0RBVEFfQVRUUiAmJiByZWdFeHBUZXN0KERBVEFfQVRUUiQkMSwgbGNOYW1lKSkgOyBlbHNlIGlmIChBTExPV19BUklBX0FUVFIgJiYgcmVnRXhwVGVzdChBUklBX0FUVFIkJDEsIGxjTmFtZSkpIDsgZWxzZSBpZiAoIUFMTE9XRURfQVRUUltsY05hbWVdIHx8IEZPUkJJRF9BVFRSW2xjTmFtZV0pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8qIENoZWNrIHZhbHVlIGlzIHNhZmUuIEZpcnN0LCBpcyBhdHRyIGluZXJ0PyBJZiBzbywgaXMgc2FmZSAqL1xuICAgICAgfSBlbHNlIGlmIChVUklfU0FGRV9BVFRSSUJVVEVTW2xjTmFtZV0pIDsgZWxzZSBpZiAocmVnRXhwVGVzdChJU19BTExPV0VEX1VSSSQkMSwgc3RyaW5nUmVwbGFjZSh2YWx1ZSwgQVRUUl9XSElURVNQQUNFJCQxLCAnJykpKSA7IGVsc2UgaWYgKChsY05hbWUgPT09ICdzcmMnIHx8IGxjTmFtZSA9PT0gJ3hsaW5rOmhyZWYnIHx8IGxjTmFtZSA9PT0gJ2hyZWYnKSAmJiBsY1RhZyAhPT0gJ3NjcmlwdCcgJiYgc3RyaW5nSW5kZXhPZih2YWx1ZSwgJ2RhdGE6JykgPT09IDAgJiYgREFUQV9VUklfVEFHU1tsY1RhZ10pIDsgZWxzZSBpZiAoQUxMT1dfVU5LTk9XTl9QUk9UT0NPTFMgJiYgIXJlZ0V4cFRlc3QoSVNfU0NSSVBUX09SX0RBVEEkJDEsIHN0cmluZ1JlcGxhY2UodmFsdWUsIEFUVFJfV0hJVEVTUEFDRSQkMSwgJycpKSkgOyBlbHNlIGlmICghdmFsdWUpIDsgZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIF9zYW5pdGl6ZUF0dHJpYnV0ZXNcbiAgICAgKlxuICAgICAqIEBwcm90ZWN0IGF0dHJpYnV0ZXNcbiAgICAgKiBAcHJvdGVjdCBub2RlTmFtZVxuICAgICAqIEBwcm90ZWN0IHJlbW92ZUF0dHJpYnV0ZVxuICAgICAqIEBwcm90ZWN0IHNldEF0dHJpYnV0ZVxuICAgICAqXG4gICAgICogQHBhcmFtICB7Tm9kZX0gY3VycmVudE5vZGUgdG8gc2FuaXRpemVcbiAgICAgKi9cbiAgICB2YXIgX3Nhbml0aXplQXR0cmlidXRlcyA9IGZ1bmN0aW9uIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoY3VycmVudE5vZGUpIHtcbiAgICAgIHZhciBhdHRyID0gdm9pZCAwO1xuICAgICAgdmFyIHZhbHVlID0gdm9pZCAwO1xuICAgICAgdmFyIGxjTmFtZSA9IHZvaWQgMDtcbiAgICAgIHZhciBsID0gdm9pZCAwO1xuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgX2V4ZWN1dGVIb29rKCdiZWZvcmVTYW5pdGl6ZUF0dHJpYnV0ZXMnLCBjdXJyZW50Tm9kZSwgbnVsbCk7XG5cbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gY3VycmVudE5vZGUuYXR0cmlidXRlcztcblxuICAgICAgLyogQ2hlY2sgaWYgd2UgaGF2ZSBhdHRyaWJ1dGVzOyBpZiBub3Qgd2UgbWlnaHQgaGF2ZSBhIHRleHQgbm9kZSAqL1xuXG4gICAgICBpZiAoIWF0dHJpYnV0ZXMpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgaG9va0V2ZW50ID0ge1xuICAgICAgICBhdHRyTmFtZTogJycsXG4gICAgICAgIGF0dHJWYWx1ZTogJycsXG4gICAgICAgIGtlZXBBdHRyOiB0cnVlLFxuICAgICAgICBhbGxvd2VkQXR0cmlidXRlczogQUxMT1dFRF9BVFRSXG4gICAgICB9O1xuICAgICAgbCA9IGF0dHJpYnV0ZXMubGVuZ3RoO1xuXG4gICAgICAvKiBHbyBiYWNrd2FyZHMgb3ZlciBhbGwgYXR0cmlidXRlczsgc2FmZWx5IHJlbW92ZSBiYWQgb25lcyAqL1xuICAgICAgd2hpbGUgKGwtLSkge1xuICAgICAgICBhdHRyID0gYXR0cmlidXRlc1tsXTtcbiAgICAgICAgdmFyIF9hdHRyID0gYXR0cixcbiAgICAgICAgICAgIG5hbWUgPSBfYXR0ci5uYW1lLFxuICAgICAgICAgICAgbmFtZXNwYWNlVVJJID0gX2F0dHIubmFtZXNwYWNlVVJJO1xuXG4gICAgICAgIHZhbHVlID0gc3RyaW5nVHJpbShhdHRyLnZhbHVlKTtcbiAgICAgICAgbGNOYW1lID0gc3RyaW5nVG9Mb3dlckNhc2UobmFtZSk7XG5cbiAgICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgICBob29rRXZlbnQuYXR0ck5hbWUgPSBsY05hbWU7XG4gICAgICAgIGhvb2tFdmVudC5hdHRyVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgaG9va0V2ZW50LmtlZXBBdHRyID0gdHJ1ZTtcbiAgICAgICAgaG9va0V2ZW50LmZvcmNlS2VlcEF0dHIgPSB1bmRlZmluZWQ7IC8vIEFsbG93cyBkZXZlbG9wZXJzIHRvIHNlZSB0aGlzIGlzIGEgcHJvcGVydHkgdGhleSBjYW4gc2V0XG4gICAgICAgIF9leGVjdXRlSG9vaygndXBvblNhbml0aXplQXR0cmlidXRlJywgY3VycmVudE5vZGUsIGhvb2tFdmVudCk7XG4gICAgICAgIHZhbHVlID0gaG9va0V2ZW50LmF0dHJWYWx1ZTtcbiAgICAgICAgLyogRGlkIHRoZSBob29rcyBhcHByb3ZlIG9mIHRoZSBhdHRyaWJ1dGU/ICovXG4gICAgICAgIGlmIChob29rRXZlbnQuZm9yY2VLZWVwQXR0cikge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogUmVtb3ZlIGF0dHJpYnV0ZSAqL1xuICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcblxuICAgICAgICAvKiBEaWQgdGhlIGhvb2tzIGFwcHJvdmUgb2YgdGhlIGF0dHJpYnV0ZT8gKi9cbiAgICAgICAgaWYgKCFob29rRXZlbnQua2VlcEF0dHIpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFdvcmsgYXJvdW5kIGEgc2VjdXJpdHkgaXNzdWUgaW4galF1ZXJ5IDMuMCAqL1xuICAgICAgICBpZiAocmVnRXhwVGVzdCgvXFwvPi9pLCB2YWx1ZSkpIHtcbiAgICAgICAgICBfcmVtb3ZlQXR0cmlidXRlKG5hbWUsIGN1cnJlbnROb2RlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIFNhbml0aXplIGF0dHJpYnV0ZSBjb250ZW50IHRvIGJlIHRlbXBsYXRlLXNhZmUgKi9cbiAgICAgICAgaWYgKFNBRkVfRk9SX1RFTVBMQVRFUykge1xuICAgICAgICAgIHZhbHVlID0gc3RyaW5nUmVwbGFjZSh2YWx1ZSwgTVVTVEFDSEVfRVhQUiQkMSwgJyAnKTtcbiAgICAgICAgICB2YWx1ZSA9IHN0cmluZ1JlcGxhY2UodmFsdWUsIEVSQl9FWFBSJCQxLCAnICcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogSXMgYHZhbHVlYCB2YWxpZCBmb3IgdGhpcyBhdHRyaWJ1dGU/ICovXG4gICAgICAgIHZhciBsY1RhZyA9IGN1cnJlbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghX2lzVmFsaWRBdHRyaWJ1dGUobGNUYWcsIGxjTmFtZSwgdmFsdWUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBIYW5kbGUgaW52YWxpZCBkYXRhLSogYXR0cmlidXRlIHNldCBieSB0cnktY2F0Y2hpbmcgaXQgKi9cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJKSB7XG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVUkksIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogRmFsbGJhY2sgdG8gc2V0QXR0cmlidXRlKCkgZm9yIGJyb3dzZXItdW5yZWNvZ25pemVkIG5hbWVzcGFjZXMgZS5nLiBcIngtc2NoZW1hXCIuICovXG4gICAgICAgICAgICBjdXJyZW50Tm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGFycmF5UG9wKERPTVB1cmlmeS5yZW1vdmVkKTtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIH1cblxuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgX2V4ZWN1dGVIb29rKCdhZnRlclNhbml0aXplQXR0cmlidXRlcycsIGN1cnJlbnROb2RlLCBudWxsKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogX3Nhbml0aXplU2hhZG93RE9NXG4gICAgICpcbiAgICAgKiBAcGFyYW0gIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudCB0byBpdGVyYXRlIG92ZXIgcmVjdXJzaXZlbHlcbiAgICAgKi9cbiAgICB2YXIgX3Nhbml0aXplU2hhZG93RE9NID0gZnVuY3Rpb24gX3Nhbml0aXplU2hhZG93RE9NKGZyYWdtZW50KSB7XG4gICAgICB2YXIgc2hhZG93Tm9kZSA9IHZvaWQgMDtcbiAgICAgIHZhciBzaGFkb3dJdGVyYXRvciA9IF9jcmVhdGVJdGVyYXRvcihmcmFnbWVudCk7XG5cbiAgICAgIC8qIEV4ZWN1dGUgYSBob29rIGlmIHByZXNlbnQgKi9cbiAgICAgIF9leGVjdXRlSG9vaygnYmVmb3JlU2FuaXRpemVTaGFkb3dET00nLCBmcmFnbWVudCwgbnVsbCk7XG5cbiAgICAgIHdoaWxlIChzaGFkb3dOb2RlID0gc2hhZG93SXRlcmF0b3IubmV4dE5vZGUoKSkge1xuICAgICAgICAvKiBFeGVjdXRlIGEgaG9vayBpZiBwcmVzZW50ICovXG4gICAgICAgIF9leGVjdXRlSG9vaygndXBvblNhbml0aXplU2hhZG93Tm9kZScsIHNoYWRvd05vZGUsIG51bGwpO1xuXG4gICAgICAgIC8qIFNhbml0aXplIHRhZ3MgYW5kIGVsZW1lbnRzICovXG4gICAgICAgIGlmIChfc2FuaXRpemVFbGVtZW50cyhzaGFkb3dOb2RlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogRGVlcCBzaGFkb3cgRE9NIGRldGVjdGVkICovXG4gICAgICAgIGlmIChzaGFkb3dOb2RlLmNvbnRlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKHNoYWRvd05vZGUuY29udGVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKiBDaGVjayBhdHRyaWJ1dGVzLCBzYW5pdGl6ZSBpZiBuZWNlc3NhcnkgKi9cbiAgICAgICAgX3Nhbml0aXplQXR0cmlidXRlcyhzaGFkb3dOb2RlKTtcbiAgICAgIH1cblxuICAgICAgLyogRXhlY3V0ZSBhIGhvb2sgaWYgcHJlc2VudCAqL1xuICAgICAgX2V4ZWN1dGVIb29rKCdhZnRlclNhbml0aXplU2hhZG93RE9NJywgZnJhZ21lbnQsIG51bGwpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTYW5pdGl6ZVxuICAgICAqIFB1YmxpYyBtZXRob2QgcHJvdmlkaW5nIGNvcmUgc2FuaXRhdGlvbiBmdW5jdGlvbmFsaXR5XG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xOb2RlfSBkaXJ0eSBzdHJpbmcgb3IgRE9NIG5vZGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlndXJhdGlvbiBvYmplY3RcbiAgICAgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuICAgIERPTVB1cmlmeS5zYW5pdGl6ZSA9IGZ1bmN0aW9uIChkaXJ0eSwgY2ZnKSB7XG4gICAgICB2YXIgYm9keSA9IHZvaWQgMDtcbiAgICAgIHZhciBpbXBvcnRlZE5vZGUgPSB2b2lkIDA7XG4gICAgICB2YXIgY3VycmVudE5vZGUgPSB2b2lkIDA7XG4gICAgICB2YXIgb2xkTm9kZSA9IHZvaWQgMDtcbiAgICAgIHZhciByZXR1cm5Ob2RlID0gdm9pZCAwO1xuICAgICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSBzdHJpbmcgdG8gc2FuaXRpemUuXG4gICAgICAgIERPIE5PVCByZXR1cm4gZWFybHksIGFzIHRoaXMgd2lsbCByZXR1cm4gdGhlIHdyb25nIHR5cGUgaWZcbiAgICAgICAgdGhlIHVzZXIgaGFzIHJlcXVlc3RlZCBhIERPTSBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJpbmcgKi9cbiAgICAgIGlmICghZGlydHkpIHtcbiAgICAgICAgZGlydHkgPSAnPCEtLT4nO1xuICAgICAgfVxuXG4gICAgICAvKiBTdHJpbmdpZnksIGluIGNhc2UgZGlydHkgaXMgYW4gb2JqZWN0ICovXG4gICAgICBpZiAodHlwZW9mIGRpcnR5ICE9PSAnc3RyaW5nJyAmJiAhX2lzTm9kZShkaXJ0eSkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lZ2F0ZWQtY29uZGl0aW9uXG4gICAgICAgIGlmICh0eXBlb2YgZGlydHkudG9TdHJpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoJ3RvU3RyaW5nIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGlydHkgPSBkaXJ0eS50b1N0cmluZygpO1xuICAgICAgICAgIGlmICh0eXBlb2YgZGlydHkgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyB0eXBlRXJyb3JDcmVhdGUoJ2RpcnR5IGlzIG5vdCBhIHN0cmluZywgYWJvcnRpbmcnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyogQ2hlY2sgd2UgY2FuIHJ1bi4gT3RoZXJ3aXNlIGZhbGwgYmFjayBvciBpZ25vcmUgKi9cbiAgICAgIGlmICghRE9NUHVyaWZ5LmlzU3VwcG9ydGVkKSB7XG4gICAgICAgIGlmIChfdHlwZW9mKHdpbmRvdy50b1N0YXRpY0hUTUwpID09PSAnb2JqZWN0JyB8fCB0eXBlb2Ygd2luZG93LnRvU3RhdGljSFRNTCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGlydHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LnRvU3RhdGljSFRNTChkaXJ0eSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF9pc05vZGUoZGlydHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2luZG93LnRvU3RhdGljSFRNTChkaXJ0eS5vdXRlckhUTUwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkaXJ0eTtcbiAgICAgIH1cblxuICAgICAgLyogQXNzaWduIGNvbmZpZyB2YXJzICovXG4gICAgICBpZiAoIVNFVF9DT05GSUcpIHtcbiAgICAgICAgX3BhcnNlQ29uZmlnKGNmZyk7XG4gICAgICB9XG5cbiAgICAgIC8qIENsZWFuIHVwIHJlbW92ZWQgZWxlbWVudHMgKi9cbiAgICAgIERPTVB1cmlmeS5yZW1vdmVkID0gW107XG5cbiAgICAgIC8qIENoZWNrIGlmIGRpcnR5IGlzIGNvcnJlY3RseSB0eXBlZCBmb3IgSU5fUExBQ0UgKi9cbiAgICAgIGlmICh0eXBlb2YgZGlydHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIElOX1BMQUNFID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChJTl9QTEFDRSkgOyBlbHNlIGlmIChkaXJ0eSBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgICAgLyogSWYgZGlydHkgaXMgYSBET00gZWxlbWVudCwgYXBwZW5kIHRvIGFuIGVtcHR5IGRvY3VtZW50IHRvIGF2b2lkXG4gICAgICAgICAgIGVsZW1lbnRzIGJlaW5nIHN0cmlwcGVkIGJ5IHRoZSBwYXJzZXIgKi9cbiAgICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoJzwhLS0tLT4nKTtcbiAgICAgICAgaW1wb3J0ZWROb2RlID0gYm9keS5vd25lckRvY3VtZW50LmltcG9ydE5vZGUoZGlydHksIHRydWUpO1xuICAgICAgICBpZiAoaW1wb3J0ZWROb2RlLm5vZGVUeXBlID09PSAxICYmIGltcG9ydGVkTm9kZS5ub2RlTmFtZSA9PT0gJ0JPRFknKSB7XG4gICAgICAgICAgLyogTm9kZSBpcyBhbHJlYWR5IGEgYm9keSwgdXNlIGFzIGlzICovXG4gICAgICAgICAgYm9keSA9IGltcG9ydGVkTm9kZTtcbiAgICAgICAgfSBlbHNlIGlmIChpbXBvcnRlZE5vZGUubm9kZU5hbWUgPT09ICdIVE1MJykge1xuICAgICAgICAgIGJvZHkgPSBpbXBvcnRlZE5vZGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLW5vZGUtYXBwZW5kXG4gICAgICAgICAgYm9keS5hcHBlbmRDaGlsZChpbXBvcnRlZE5vZGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKiBFeGl0IGRpcmVjdGx5IGlmIHdlIGhhdmUgbm90aGluZyB0byBkbyAqL1xuICAgICAgICBpZiAoIVJFVFVSTl9ET00gJiYgIVNBRkVfRk9SX1RFTVBMQVRFUyAmJiAhV0hPTEVfRE9DVU1FTlQgJiZcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLWluY2x1ZGVzXG4gICAgICAgIGRpcnR5LmluZGV4T2YoJzwnKSA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1c3RlZFR5cGVzUG9saWN5ICYmIFJFVFVSTl9UUlVTVEVEX1RZUEUgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChkaXJ0eSkgOiBkaXJ0eTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEluaXRpYWxpemUgdGhlIGRvY3VtZW50IHRvIHdvcmsgb24gKi9cbiAgICAgICAgYm9keSA9IF9pbml0RG9jdW1lbnQoZGlydHkpO1xuXG4gICAgICAgIC8qIENoZWNrIHdlIGhhdmUgYSBET00gbm9kZSBmcm9tIHRoZSBkYXRhICovXG4gICAgICAgIGlmICghYm9keSkge1xuICAgICAgICAgIHJldHVybiBSRVRVUk5fRE9NID8gbnVsbCA6IGVtcHR5SFRNTDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBSZW1vdmUgZmlyc3QgZWxlbWVudCBub2RlIChvdXJzKSBpZiBGT1JDRV9CT0RZIGlzIHNldCAqL1xuICAgICAgaWYgKGJvZHkgJiYgRk9SQ0VfQk9EWSkge1xuICAgICAgICBfZm9yY2VSZW1vdmUoYm9keS5maXJzdENoaWxkKTtcbiAgICAgIH1cblxuICAgICAgLyogR2V0IG5vZGUgaXRlcmF0b3IgKi9cbiAgICAgIHZhciBub2RlSXRlcmF0b3IgPSBfY3JlYXRlSXRlcmF0b3IoSU5fUExBQ0UgPyBkaXJ0eSA6IGJvZHkpO1xuXG4gICAgICAvKiBOb3cgc3RhcnQgaXRlcmF0aW5nIG92ZXIgdGhlIGNyZWF0ZWQgZG9jdW1lbnQgKi9cbiAgICAgIHdoaWxlIChjdXJyZW50Tm9kZSA9IG5vZGVJdGVyYXRvci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgIC8qIEZpeCBJRSdzIHN0cmFuZ2UgYmVoYXZpb3Igd2l0aCBtYW5pcHVsYXRlZCB0ZXh0Tm9kZXMgIzg5ICovXG4gICAgICAgIGlmIChjdXJyZW50Tm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBjdXJyZW50Tm9kZSA9PT0gb2xkTm9kZSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2FuaXRpemUgdGFncyBhbmQgZWxlbWVudHMgKi9cbiAgICAgICAgaWYgKF9zYW5pdGl6ZUVsZW1lbnRzKGN1cnJlbnROb2RlKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogU2hhZG93IERPTSBkZXRlY3RlZCwgc2FuaXRpemUgaXQgKi9cbiAgICAgICAgaWYgKGN1cnJlbnROb2RlLmNvbnRlbnQgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSB7XG4gICAgICAgICAgX3Nhbml0aXplU2hhZG93RE9NKGN1cnJlbnROb2RlLmNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLyogQ2hlY2sgYXR0cmlidXRlcywgc2FuaXRpemUgaWYgbmVjZXNzYXJ5ICovXG4gICAgICAgIF9zYW5pdGl6ZUF0dHJpYnV0ZXMoY3VycmVudE5vZGUpO1xuXG4gICAgICAgIG9sZE5vZGUgPSBjdXJyZW50Tm9kZTtcbiAgICAgIH1cblxuICAgICAgb2xkTm9kZSA9IG51bGw7XG5cbiAgICAgIC8qIElmIHdlIHNhbml0aXplZCBgZGlydHlgIGluLXBsYWNlLCByZXR1cm4gaXQuICovXG4gICAgICBpZiAoSU5fUExBQ0UpIHtcbiAgICAgICAgcmV0dXJuIGRpcnR5O1xuICAgICAgfVxuXG4gICAgICAvKiBSZXR1cm4gc2FuaXRpemVkIHN0cmluZyBvciBET00gKi9cbiAgICAgIGlmIChSRVRVUk5fRE9NKSB7XG4gICAgICAgIGlmIChSRVRVUk5fRE9NX0ZSQUdNRU5UKSB7XG4gICAgICAgICAgcmV0dXJuTm9kZSA9IGNyZWF0ZURvY3VtZW50RnJhZ21lbnQuY2FsbChib2R5Lm93bmVyRG9jdW1lbnQpO1xuXG4gICAgICAgICAgd2hpbGUgKGJvZHkuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vcHJlZmVyLW5vZGUtYXBwZW5kXG4gICAgICAgICAgICByZXR1cm5Ob2RlLmFwcGVuZENoaWxkKGJvZHkuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybk5vZGUgPSBib2R5O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFJFVFVSTl9ET01fSU1QT1JUKSB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgIEFkb3B0Tm9kZSgpIGlzIG5vdCB1c2VkIGJlY2F1c2UgaW50ZXJuYWwgc3RhdGUgaXMgbm90IHJlc2V0XG4gICAgICAgICAgICAoZS5nLiB0aGUgcGFzdCBuYW1lcyBtYXAgb2YgYSBIVE1MRm9ybUVsZW1lbnQpLCB0aGlzIGlzIHNhZmVcbiAgICAgICAgICAgIGluIHRoZW9yeSBidXQgd2Ugd291bGQgcmF0aGVyIG5vdCByaXNrIGFub3RoZXIgYXR0YWNrIHZlY3Rvci5cbiAgICAgICAgICAgIFRoZSBzdGF0ZSB0aGF0IGlzIGNsb25lZCBieSBpbXBvcnROb2RlKCkgaXMgZXhwbGljaXRseSBkZWZpbmVkXG4gICAgICAgICAgICBieSB0aGUgc3BlY3MuXG4gICAgICAgICAgKi9cbiAgICAgICAgICByZXR1cm5Ob2RlID0gaW1wb3J0Tm9kZS5jYWxsKG9yaWdpbmFsRG9jdW1lbnQsIHJldHVybk5vZGUsIHRydWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJldHVybk5vZGU7XG4gICAgICB9XG5cbiAgICAgIHZhciBzZXJpYWxpemVkSFRNTCA9IFdIT0xFX0RPQ1VNRU5UID8gYm9keS5vdXRlckhUTUwgOiBib2R5LmlubmVySFRNTDtcblxuICAgICAgLyogU2FuaXRpemUgZmluYWwgc3RyaW5nIHRlbXBsYXRlLXNhZmUgKi9cbiAgICAgIGlmIChTQUZFX0ZPUl9URU1QTEFURVMpIHtcbiAgICAgICAgc2VyaWFsaXplZEhUTUwgPSBzdHJpbmdSZXBsYWNlKHNlcmlhbGl6ZWRIVE1MLCBNVVNUQUNIRV9FWFBSJCQxLCAnICcpO1xuICAgICAgICBzZXJpYWxpemVkSFRNTCA9IHN0cmluZ1JlcGxhY2Uoc2VyaWFsaXplZEhUTUwsIEVSQl9FWFBSJCQxLCAnICcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1c3RlZFR5cGVzUG9saWN5ICYmIFJFVFVSTl9UUlVTVEVEX1RZUEUgPyB0cnVzdGVkVHlwZXNQb2xpY3kuY3JlYXRlSFRNTChzZXJpYWxpemVkSFRNTCkgOiBzZXJpYWxpemVkSFRNTDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUHVibGljIG1ldGhvZCB0byBzZXQgdGhlIGNvbmZpZ3VyYXRpb24gb25jZVxuICAgICAqIHNldENvbmZpZ1xuICAgICAqXG4gICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyBjb25maWd1cmF0aW9uIG9iamVjdFxuICAgICAqL1xuICAgIERPTVB1cmlmeS5zZXRDb25maWcgPSBmdW5jdGlvbiAoY2ZnKSB7XG4gICAgICBfcGFyc2VDb25maWcoY2ZnKTtcbiAgICAgIFNFVF9DT05GSUcgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHJlbW92ZSB0aGUgY29uZmlndXJhdGlvblxuICAgICAqIGNsZWFyQ29uZmlnXG4gICAgICpcbiAgICAgKi9cbiAgICBET01QdXJpZnkuY2xlYXJDb25maWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBDT05GSUcgPSBudWxsO1xuICAgICAgU0VUX0NPTkZJRyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIGNoZWNrIGlmIGFuIGF0dHJpYnV0ZSB2YWx1ZSBpcyB2YWxpZC5cbiAgICAgKiBVc2VzIGxhc3Qgc2V0IGNvbmZpZywgaWYgYW55LiBPdGhlcndpc2UsIHVzZXMgY29uZmlnIGRlZmF1bHRzLlxuICAgICAqIGlzVmFsaWRBdHRyaWJ1dGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gdGFnIFRhZyBuYW1lIG9mIGNvbnRhaW5pbmcgZWxlbWVudC5cbiAgICAgKiBAcGFyYW0gIHtzdHJpbmd9IGF0dHIgQXR0cmlidXRlIG5hbWUuXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQuIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS5cbiAgICAgKi9cbiAgICBET01QdXJpZnkuaXNWYWxpZEF0dHJpYnV0ZSA9IGZ1bmN0aW9uICh0YWcsIGF0dHIsIHZhbHVlKSB7XG4gICAgICAvKiBJbml0aWFsaXplIHNoYXJlZCBjb25maWcgdmFycyBpZiBuZWNlc3NhcnkuICovXG4gICAgICBpZiAoIUNPTkZJRykge1xuICAgICAgICBfcGFyc2VDb25maWcoe30pO1xuICAgICAgfVxuXG4gICAgICB2YXIgbGNUYWcgPSBzdHJpbmdUb0xvd2VyQ2FzZSh0YWcpO1xuICAgICAgdmFyIGxjTmFtZSA9IHN0cmluZ1RvTG93ZXJDYXNlKGF0dHIpO1xuICAgICAgcmV0dXJuIF9pc1ZhbGlkQXR0cmlidXRlKGxjVGFnLCBsY05hbWUsIHZhbHVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkSG9va1xuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gYWRkIERPTVB1cmlmeSBob29rc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGVudHJ5UG9pbnQgZW50cnkgcG9pbnQgZm9yIHRoZSBob29rIHRvIGFkZFxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGhvb2tGdW5jdGlvbiBmdW5jdGlvbiB0byBleGVjdXRlXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LmFkZEhvb2sgPSBmdW5jdGlvbiAoZW50cnlQb2ludCwgaG9va0Z1bmN0aW9uKSB7XG4gICAgICBpZiAodHlwZW9mIGhvb2tGdW5jdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGhvb2tzW2VudHJ5UG9pbnRdID0gaG9va3NbZW50cnlQb2ludF0gfHwgW107XG4gICAgICBhcnJheVB1c2goaG9va3NbZW50cnlQb2ludF0sIGhvb2tGdW5jdGlvbik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZUhvb2tcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHJlbW92ZSBhIERPTVB1cmlmeSBob29rIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgICAqIChwb3BzIGl0IGZyb20gdGhlIHN0YWNrIG9mIGhvb2tzIGlmIG1vcmUgYXJlIHByZXNlbnQpXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZW50cnlQb2ludCBlbnRyeSBwb2ludCBmb3IgdGhlIGhvb2sgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LnJlbW92ZUhvb2sgPSBmdW5jdGlvbiAoZW50cnlQb2ludCkge1xuICAgICAgaWYgKGhvb2tzW2VudHJ5UG9pbnRdKSB7XG4gICAgICAgIGFycmF5UG9wKGhvb2tzW2VudHJ5UG9pbnRdKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlSG9va3NcbiAgICAgKiBQdWJsaWMgbWV0aG9kIHRvIHJlbW92ZSBhbGwgRE9NUHVyaWZ5IGhvb2tzIGF0IGEgZ2l2ZW4gZW50cnlQb2ludFxuICAgICAqXG4gICAgICogQHBhcmFtICB7U3RyaW5nfSBlbnRyeVBvaW50IGVudHJ5IHBvaW50IGZvciB0aGUgaG9va3MgdG8gcmVtb3ZlXG4gICAgICovXG4gICAgRE9NUHVyaWZ5LnJlbW92ZUhvb2tzID0gZnVuY3Rpb24gKGVudHJ5UG9pbnQpIHtcbiAgICAgIGlmIChob29rc1tlbnRyeVBvaW50XSkge1xuICAgICAgICBob29rc1tlbnRyeVBvaW50XSA9IFtdO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVBbGxIb29rc1xuICAgICAqIFB1YmxpYyBtZXRob2QgdG8gcmVtb3ZlIGFsbCBET01QdXJpZnkgaG9va3NcbiAgICAgKlxuICAgICAqL1xuICAgIERPTVB1cmlmeS5yZW1vdmVBbGxIb29rcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGhvb2tzID0ge307XG4gICAgfTtcblxuICAgIHJldHVybiBET01QdXJpZnk7XG4gIH1cblxuICB2YXIgcHVyaWZ5ID0gY3JlYXRlRE9NUHVyaWZ5KCk7XG5cbiAgcmV0dXJuIHB1cmlmeTtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cHVyaWZ5LmpzLm1hcFxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eVxuICAsIHByZWZpeCA9ICd+JztcblxuLyoqXG4gKiBDb25zdHJ1Y3RvciB0byBjcmVhdGUgYSBzdG9yYWdlIGZvciBvdXIgYEVFYCBvYmplY3RzLlxuICogQW4gYEV2ZW50c2AgaW5zdGFuY2UgaXMgYSBwbGFpbiBvYmplY3Qgd2hvc2UgcHJvcGVydGllcyBhcmUgZXZlbnQgbmFtZXMuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBFdmVudHMoKSB7fVxuXG4vL1xuLy8gV2UgdHJ5IHRvIG5vdCBpbmhlcml0IGZyb20gYE9iamVjdC5wcm90b3R5cGVgLiBJbiBzb21lIGVuZ2luZXMgY3JlYXRpbmcgYW5cbi8vIGluc3RhbmNlIGluIHRoaXMgd2F5IGlzIGZhc3RlciB0aGFuIGNhbGxpbmcgYE9iamVjdC5jcmVhdGUobnVsbClgIGRpcmVjdGx5LlxuLy8gSWYgYE9iamVjdC5jcmVhdGUobnVsbClgIGlzIG5vdCBzdXBwb3J0ZWQgd2UgcHJlZml4IHRoZSBldmVudCBuYW1lcyB3aXRoIGFcbi8vIGNoYXJhY3RlciB0byBtYWtlIHN1cmUgdGhhdCB0aGUgYnVpbHQtaW4gb2JqZWN0IHByb3BlcnRpZXMgYXJlIG5vdFxuLy8gb3ZlcnJpZGRlbiBvciB1c2VkIGFzIGFuIGF0dGFjayB2ZWN0b3IuXG4vL1xuaWYgKE9iamVjdC5jcmVhdGUpIHtcbiAgRXZlbnRzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy9cbiAgLy8gVGhpcyBoYWNrIGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBgX19wcm90b19fYCBwcm9wZXJ0eSBpcyBzdGlsbCBpbmhlcml0ZWQgaW5cbiAgLy8gc29tZSBvbGQgYnJvd3NlcnMgbGlrZSBBbmRyb2lkIDQsIGlQaG9uZSA1LjEsIE9wZXJhIDExIGFuZCBTYWZhcmkgNS5cbiAgLy9cbiAgaWYgKCFuZXcgRXZlbnRzKCkuX19wcm90b19fKSBwcmVmaXggPSBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBldmVudCBsaXN0ZW5lci5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHBhcmFtIHtCb29sZWFufSBbb25jZT1mYWxzZV0gU3BlY2lmeSBpZiB0aGUgbGlzdGVuZXIgaXMgYSBvbmUtdGltZSBsaXN0ZW5lci5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gRUUoZm4sIGNvbnRleHQsIG9uY2UpIHtcbiAgdGhpcy5mbiA9IGZuO1xuICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuICB0aGlzLm9uY2UgPSBvbmNlIHx8IGZhbHNlO1xufVxuXG4vKipcbiAqIEFkZCBhIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RXZlbnRFbWl0dGVyfSBlbWl0dGVyIFJlZmVyZW5jZSB0byB0aGUgYEV2ZW50RW1pdHRlcmAgaW5zdGFuY2UuXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IGNvbnRleHQgVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHBhcmFtIHtCb29sZWFufSBvbmNlIFNwZWNpZnkgaWYgdGhlIGxpc3RlbmVyIGlzIGEgb25lLXRpbWUgbGlzdGVuZXIuXG4gKiBAcmV0dXJucyB7RXZlbnRFbWl0dGVyfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gYWRkTGlzdGVuZXIoZW1pdHRlciwgZXZlbnQsIGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICB2YXIgbGlzdGVuZXIgPSBuZXcgRUUoZm4sIGNvbnRleHQgfHwgZW1pdHRlciwgb25jZSlcbiAgICAsIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnQ7XG5cbiAgaWYgKCFlbWl0dGVyLl9ldmVudHNbZXZ0XSkgZW1pdHRlci5fZXZlbnRzW2V2dF0gPSBsaXN0ZW5lciwgZW1pdHRlci5fZXZlbnRzQ291bnQrKztcbiAgZWxzZSBpZiAoIWVtaXR0ZXIuX2V2ZW50c1tldnRdLmZuKSBlbWl0dGVyLl9ldmVudHNbZXZ0XS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZSBlbWl0dGVyLl9ldmVudHNbZXZ0XSA9IFtlbWl0dGVyLl9ldmVudHNbZXZ0XSwgbGlzdGVuZXJdO1xuXG4gIHJldHVybiBlbWl0dGVyO1xufVxuXG4vKipcbiAqIENsZWFyIGV2ZW50IGJ5IG5hbWUuXG4gKlxuICogQHBhcmFtIHtFdmVudEVtaXR0ZXJ9IGVtaXR0ZXIgUmVmZXJlbmNlIHRvIHRoZSBgRXZlbnRFbWl0dGVyYCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldnQgVGhlIEV2ZW50IG5hbWUuXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiBjbGVhckV2ZW50KGVtaXR0ZXIsIGV2dCkge1xuICBpZiAoLS1lbWl0dGVyLl9ldmVudHNDb3VudCA9PT0gMCkgZW1pdHRlci5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICBlbHNlIGRlbGV0ZSBlbWl0dGVyLl9ldmVudHNbZXZ0XTtcbn1cblxuLyoqXG4gKiBNaW5pbWFsIGBFdmVudEVtaXR0ZXJgIGludGVyZmFjZSB0aGF0IGlzIG1vbGRlZCBhZ2FpbnN0IHRoZSBOb2RlLmpzXG4gKiBgRXZlbnRFbWl0dGVyYCBpbnRlcmZhY2UuXG4gKlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcHVibGljXG4gKi9cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gbmV3IEV2ZW50cygpO1xuICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG59XG5cbi8qKlxuICogUmV0dXJuIGFuIGFycmF5IGxpc3RpbmcgdGhlIGV2ZW50cyBmb3Igd2hpY2ggdGhlIGVtaXR0ZXIgaGFzIHJlZ2lzdGVyZWRcbiAqIGxpc3RlbmVycy5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9XG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZXZlbnROYW1lcyA9IGZ1bmN0aW9uIGV2ZW50TmFtZXMoKSB7XG4gIHZhciBuYW1lcyA9IFtdXG4gICAgLCBldmVudHNcbiAgICAsIG5hbWU7XG5cbiAgaWYgKHRoaXMuX2V2ZW50c0NvdW50ID09PSAwKSByZXR1cm4gbmFtZXM7XG5cbiAgZm9yIChuYW1lIGluIChldmVudHMgPSB0aGlzLl9ldmVudHMpKSB7XG4gICAgaWYgKGhhcy5jYWxsKGV2ZW50cywgbmFtZSkpIG5hbWVzLnB1c2gocHJlZml4ID8gbmFtZS5zbGljZSgxKSA6IG5hbWUpO1xuICB9XG5cbiAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHtcbiAgICByZXR1cm4gbmFtZXMuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZXZlbnRzKSk7XG4gIH1cblxuICByZXR1cm4gbmFtZXM7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgZm9yIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge0FycmF5fSBUaGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24gbGlzdGVuZXJzKGV2ZW50KSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50XG4gICAgLCBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG4gIGlmICghaGFuZGxlcnMpIHJldHVybiBbXTtcbiAgaWYgKGhhbmRsZXJzLmZuKSByZXR1cm4gW2hhbmRsZXJzLmZuXTtcblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGhhbmRsZXJzLmxlbmd0aCwgZWUgPSBuZXcgQXJyYXkobCk7IGkgPCBsOyBpKyspIHtcbiAgICBlZVtpXSA9IGhhbmRsZXJzW2ldLmZuO1xuICB9XG5cbiAgcmV0dXJuIGVlO1xufTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIG51bWJlciBvZiBsaXN0ZW5lcnMgbGlzdGVuaW5nIHRvIGEgZ2l2ZW4gZXZlbnQuXG4gKlxuICogQHBhcmFtIHsoU3RyaW5nfFN5bWJvbCl9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHJldHVybnMge051bWJlcn0gVGhlIG51bWJlciBvZiBsaXN0ZW5lcnMuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uIGxpc3RlbmVyQ291bnQoZXZlbnQpIHtcbiAgdmFyIGV2dCA9IHByZWZpeCA/IHByZWZpeCArIGV2ZW50IDogZXZlbnRcbiAgICAsIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG4gIGlmICghbGlzdGVuZXJzKSByZXR1cm4gMDtcbiAgaWYgKGxpc3RlbmVycy5mbikgcmV0dXJuIDE7XG4gIHJldHVybiBsaXN0ZW5lcnMubGVuZ3RoO1xufTtcblxuLyoqXG4gKiBDYWxscyBlYWNoIG9mIHRoZSBsaXN0ZW5lcnMgcmVnaXN0ZXJlZCBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBldmVudCBoYWQgbGlzdGVuZXJzLCBlbHNlIGBmYWxzZWAuXG4gKiBAcHVibGljXG4gKi9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuZW1pdCA9IGZ1bmN0aW9uIGVtaXQoZXZlbnQsIGExLCBhMiwgYTMsIGE0LCBhNSkge1xuICB2YXIgZXZ0ID0gcHJlZml4ID8gcHJlZml4ICsgZXZlbnQgOiBldmVudDtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1tldnRdKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdXG4gICAgLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoXG4gICAgLCBhcmdzXG4gICAgLCBpO1xuXG4gIGlmIChsaXN0ZW5lcnMuZm4pIHtcbiAgICBpZiAobGlzdGVuZXJzLm9uY2UpIHRoaXMucmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVycy5mbiwgdW5kZWZpbmVkLCB0cnVlKTtcblxuICAgIHN3aXRjaCAobGVuKSB7XG4gICAgICBjYXNlIDE6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCksIHRydWU7XG4gICAgICBjYXNlIDI6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEpLCB0cnVlO1xuICAgICAgY2FzZSAzOiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiksIHRydWU7XG4gICAgICBjYXNlIDQ6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMyksIHRydWU7XG4gICAgICBjYXNlIDU6IHJldHVybiBsaXN0ZW5lcnMuZm4uY2FsbChsaXN0ZW5lcnMuY29udGV4dCwgYTEsIGEyLCBhMywgYTQpLCB0cnVlO1xuICAgICAgY2FzZSA2OiByZXR1cm4gbGlzdGVuZXJzLmZuLmNhbGwobGlzdGVuZXJzLmNvbnRleHQsIGExLCBhMiwgYTMsIGE0LCBhNSksIHRydWU7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMSwgYXJncyA9IG5ldyBBcnJheShsZW4gLTEpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cblxuICAgIGxpc3RlbmVycy5mbi5hcHBseShsaXN0ZW5lcnMuY29udGV4dCwgYXJncyk7XG4gIH0gZWxzZSB7XG4gICAgdmFyIGxlbmd0aCA9IGxpc3RlbmVycy5sZW5ndGhcbiAgICAgICwgajtcblxuICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGxpc3RlbmVyc1tpXS5vbmNlKSB0aGlzLnJlbW92ZUxpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcnNbaV0uZm4sIHVuZGVmaW5lZCwgdHJ1ZSk7XG5cbiAgICAgIHN3aXRjaCAobGVuKSB7XG4gICAgICAgIGNhc2UgMTogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQpOyBicmVhaztcbiAgICAgICAgY2FzZSAyOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEpOyBicmVhaztcbiAgICAgICAgY2FzZSAzOiBsaXN0ZW5lcnNbaV0uZm4uY2FsbChsaXN0ZW5lcnNbaV0uY29udGV4dCwgYTEsIGEyKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgNDogbGlzdGVuZXJzW2ldLmZuLmNhbGwobGlzdGVuZXJzW2ldLmNvbnRleHQsIGExLCBhMiwgYTMpOyBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpZiAoIWFyZ3MpIGZvciAoaiA9IDEsIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0xKTsgaiA8IGxlbjsgaisrKSB7XG4gICAgICAgICAgICBhcmdzW2ogLSAxXSA9IGFyZ3VtZW50c1tqXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsaXN0ZW5lcnNbaV0uZm4uYXBwbHkobGlzdGVuZXJzW2ldLmNvbnRleHQsIGFyZ3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBBZGQgYSBsaXN0ZW5lciBmb3IgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgbGlzdGVuZXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyp9IFtjb250ZXh0PXRoaXNdIFRoZSBjb250ZXh0IHRvIGludm9rZSB0aGUgbGlzdGVuZXIgd2l0aC5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uIG9uKGV2ZW50LCBmbiwgY29udGV4dCkge1xuICByZXR1cm4gYWRkTGlzdGVuZXIodGhpcywgZXZlbnQsIGZuLCBjb250ZXh0LCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIEFkZCBhIG9uZS10aW1lIGxpc3RlbmVyIGZvciBhIGdpdmVuIGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7KFN0cmluZ3xTeW1ib2wpfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBsaXN0ZW5lciBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gW2NvbnRleHQ9dGhpc10gVGhlIGNvbnRleHQgdG8gaW52b2tlIHRoZSBsaXN0ZW5lciB3aXRoLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbiBvbmNlKGV2ZW50LCBmbiwgY29udGV4dCkge1xuICByZXR1cm4gYWRkTGlzdGVuZXIodGhpcywgZXZlbnQsIGZuLCBjb250ZXh0LCB0cnVlKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIHRoZSBsaXN0ZW5lcnMgb2YgYSBnaXZlbiBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBPbmx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzIHRoYXQgbWF0Y2ggdGhpcyBmdW5jdGlvbi5cbiAqIEBwYXJhbSB7Kn0gY29udGV4dCBPbmx5IHJlbW92ZSB0aGUgbGlzdGVuZXJzIHRoYXQgaGF2ZSB0aGlzIGNvbnRleHQuXG4gKiBAcGFyYW0ge0Jvb2xlYW59IG9uY2UgT25seSByZW1vdmUgb25lLXRpbWUgbGlzdGVuZXJzLlxuICogQHJldHVybnMge0V2ZW50RW1pdHRlcn0gYHRoaXNgLlxuICogQHB1YmxpY1xuICovXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIoZXZlbnQsIGZuLCBjb250ZXh0LCBvbmNlKSB7XG4gIHZhciBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuXG4gIGlmICghdGhpcy5fZXZlbnRzW2V2dF0pIHJldHVybiB0aGlzO1xuICBpZiAoIWZuKSB7XG4gICAgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1tldnRdO1xuXG4gIGlmIChsaXN0ZW5lcnMuZm4pIHtcbiAgICBpZiAoXG4gICAgICBsaXN0ZW5lcnMuZm4gPT09IGZuICYmXG4gICAgICAoIW9uY2UgfHwgbGlzdGVuZXJzLm9uY2UpICYmXG4gICAgICAoIWNvbnRleHQgfHwgbGlzdGVuZXJzLmNvbnRleHQgPT09IGNvbnRleHQpXG4gICAgKSB7XG4gICAgICBjbGVhckV2ZW50KHRoaXMsIGV2dCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAodmFyIGkgPSAwLCBldmVudHMgPSBbXSwgbGVuZ3RoID0gbGlzdGVuZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoXG4gICAgICAgIGxpc3RlbmVyc1tpXS5mbiAhPT0gZm4gfHxcbiAgICAgICAgKG9uY2UgJiYgIWxpc3RlbmVyc1tpXS5vbmNlKSB8fFxuICAgICAgICAoY29udGV4dCAmJiBsaXN0ZW5lcnNbaV0uY29udGV4dCAhPT0gY29udGV4dClcbiAgICAgICkge1xuICAgICAgICBldmVudHMucHVzaChsaXN0ZW5lcnNbaV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vXG4gICAgLy8gUmVzZXQgdGhlIGFycmF5LCBvciByZW1vdmUgaXQgY29tcGxldGVseSBpZiB3ZSBoYXZlIG5vIG1vcmUgbGlzdGVuZXJzLlxuICAgIC8vXG4gICAgaWYgKGV2ZW50cy5sZW5ndGgpIHRoaXMuX2V2ZW50c1tldnRdID0gZXZlbnRzLmxlbmd0aCA9PT0gMSA/IGV2ZW50c1swXSA6IGV2ZW50cztcbiAgICBlbHNlIGNsZWFyRXZlbnQodGhpcywgZXZ0KTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYWxsIGxpc3RlbmVycywgb3IgdGhvc2Ugb2YgdGhlIHNwZWNpZmllZCBldmVudC5cbiAqXG4gKiBAcGFyYW0geyhTdHJpbmd8U3ltYm9sKX0gW2V2ZW50XSBUaGUgZXZlbnQgbmFtZS5cbiAqIEByZXR1cm5zIHtFdmVudEVtaXR0ZXJ9IGB0aGlzYC5cbiAqIEBwdWJsaWNcbiAqL1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbiByZW1vdmVBbGxMaXN0ZW5lcnMoZXZlbnQpIHtcbiAgdmFyIGV2dDtcblxuICBpZiAoZXZlbnQpIHtcbiAgICBldnQgPSBwcmVmaXggPyBwcmVmaXggKyBldmVudCA6IGV2ZW50O1xuICAgIGlmICh0aGlzLl9ldmVudHNbZXZ0XSkgY2xlYXJFdmVudCh0aGlzLCBldnQpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuX2V2ZW50cyA9IG5ldyBFdmVudHMoKTtcbiAgICB0aGlzLl9ldmVudHNDb3VudCA9IDA7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vXG4vLyBBbGlhcyBtZXRob2RzIG5hbWVzIGJlY2F1c2UgcGVvcGxlIHJvbGwgbGlrZSB0aGF0LlxuLy9cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub2ZmID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcjtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXIgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uO1xuXG4vL1xuLy8gRXhwb3NlIHRoZSBwcmVmaXguXG4vL1xuRXZlbnRFbWl0dGVyLnByZWZpeGVkID0gcHJlZml4O1xuXG4vL1xuLy8gQWxsb3cgYEV2ZW50RW1pdHRlcmAgdG8gYmUgaW1wb3J0ZWQgYXMgbW9kdWxlIG5hbWVzcGFjZS5cbi8vXG5FdmVudEVtaXR0ZXIuRXZlbnRFbWl0dGVyID0gRXZlbnRFbWl0dGVyO1xuXG4vL1xuLy8gRXhwb3NlIHRoZSBtb2R1bGUuXG4vL1xuaWYgKCd1bmRlZmluZWQnICE9PSB0eXBlb2YgbW9kdWxlKSB7XG4gIG1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xufVxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIvKipcbiAqIEhlbHBlcnMuXG4gKi9cblxudmFyIHMgPSAxMDAwO1xudmFyIG0gPSBzICogNjA7XG52YXIgaCA9IG0gKiA2MDtcbnZhciBkID0gaCAqIDI0O1xudmFyIHcgPSBkICogNztcbnZhciB5ID0gZCAqIDM2NS4yNTtcblxuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciB0eXBlID0gdHlwZW9mIHZhbDtcbiAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnNlKHZhbCk7XG4gIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgIHJldHVybiBvcHRpb25zLmxvbmcgPyBmbXRMb25nKHZhbCkgOiBmbXRTaG9ydCh2YWwpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAndmFsIGlzIG5vdCBhIG5vbi1lbXB0eSBzdHJpbmcgb3IgYSB2YWxpZCBudW1iZXIuIHZhbD0nICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KHZhbClcbiAgKTtcbn07XG5cbi8qKlxuICogUGFyc2UgdGhlIGdpdmVuIGBzdHJgIGFuZCByZXR1cm4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHJcbiAqIEByZXR1cm4ge051bWJlcn1cbiAqIEBhcGkgcHJpdmF0ZVxuICovXG5cbmZ1bmN0aW9uIHBhcnNlKHN0cikge1xuICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgaWYgKHN0ci5sZW5ndGggPiAxMDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIG1hdGNoID0gL14oLT8oPzpcXGQrKT9cXC4/XFxkKykgKihtaWxsaXNlY29uZHM/fG1zZWNzP3xtc3xzZWNvbmRzP3xzZWNzP3xzfG1pbnV0ZXM/fG1pbnM/fG18aG91cnM/fGhycz98aHxkYXlzP3xkfHdlZWtzP3x3fHllYXJzP3x5cnM/fHkpPyQvaS5leGVjKFxuICAgIHN0clxuICApO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBuID0gcGFyc2VGbG9hdChtYXRjaFsxXSk7XG4gIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgJ3llYXJzJzpcbiAgICBjYXNlICd5ZWFyJzpcbiAgICBjYXNlICd5cnMnOlxuICAgIGNhc2UgJ3lyJzpcbiAgICBjYXNlICd5JzpcbiAgICAgIHJldHVybiBuICogeTtcbiAgICBjYXNlICd3ZWVrcyc6XG4gICAgY2FzZSAnd2Vlayc6XG4gICAgY2FzZSAndyc6XG4gICAgICByZXR1cm4gbiAqIHc7XG4gICAgY2FzZSAnZGF5cyc6XG4gICAgY2FzZSAnZGF5JzpcbiAgICBjYXNlICdkJzpcbiAgICAgIHJldHVybiBuICogZDtcbiAgICBjYXNlICdob3Vycyc6XG4gICAgY2FzZSAnaG91cic6XG4gICAgY2FzZSAnaHJzJzpcbiAgICBjYXNlICdocic6XG4gICAgY2FzZSAnaCc6XG4gICAgICByZXR1cm4gbiAqIGg7XG4gICAgY2FzZSAnbWludXRlcyc6XG4gICAgY2FzZSAnbWludXRlJzpcbiAgICBjYXNlICdtaW5zJzpcbiAgICBjYXNlICdtaW4nOlxuICAgIGNhc2UgJ20nOlxuICAgICAgcmV0dXJuIG4gKiBtO1xuICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgIGNhc2UgJ3NlY29uZCc6XG4gICAgY2FzZSAnc2Vjcyc6XG4gICAgY2FzZSAnc2VjJzpcbiAgICBjYXNlICdzJzpcbiAgICAgIHJldHVybiBuICogcztcbiAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgIGNhc2UgJ21pbGxpc2Vjb25kJzpcbiAgICBjYXNlICdtc2Vjcyc6XG4gICAgY2FzZSAnbXNlYyc6XG4gICAgY2FzZSAnbXMnOlxuICAgICAgcmV0dXJuIG47XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTaG9ydCBmb3JtYXQgZm9yIGBtc2AuXG4gKlxuICogQHBhcmFtIHtOdW1iZXJ9IG1zXG4gKiBAcmV0dXJuIHtTdHJpbmd9XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBmbXRTaG9ydChtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBkKSArICdkJztcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gIH1cbiAgaWYgKG1zQWJzID49IG0pIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG0pICsgJ20nO1xuICB9XG4gIGlmIChtc0FicyA+PSBzKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQobXMgLyBzKSArICdzJztcbiAgfVxuICByZXR1cm4gbXMgKyAnbXMnO1xufVxuXG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi9cblxuZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICB2YXIgbXNBYnMgPSBNYXRoLmFicyhtcyk7XG4gIGlmIChtc0FicyA+PSBkKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIGQsICdkYXknKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gaCkge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBoLCAnaG91cicpO1xuICB9XG4gIGlmIChtc0FicyA+PSBtKSB7XG4gICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgfVxuICBpZiAobXNBYnMgPj0gcykge1xuICAgIHJldHVybiBwbHVyYWwobXMsIG1zQWJzLCBzLCAnc2Vjb25kJyk7XG4gIH1cbiAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG5cbi8qKlxuICogUGx1cmFsaXphdGlvbiBoZWxwZXIuXG4gKi9cblxuZnVuY3Rpb24gcGx1cmFsKG1zLCBtc0FicywgbiwgbmFtZSkge1xuICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICByZXR1cm4gTWF0aC5yb3VuZChtcyAvIG4pICsgJyAnICsgbmFtZSArIChpc1BsdXJhbCA/ICdzJyA6ICcnKTtcbn1cbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxyXG4vL1xyXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxyXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXHJcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xyXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXHJcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcclxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXHJcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4vL1xyXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxyXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuLy9cclxuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xyXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXHJcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cclxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXHJcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxyXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXHJcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXHJcblxyXG4ndXNlIHN0cmljdCc7XHJcblxyXG5cclxudmFyIGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XHJcbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbCcpO1xyXG5cclxuXHJcbi8vIHJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCBhcnJheSB3aXRoIGRpcmVjdG9yeSBuYW1lcyB0aGVyZVxyXG4vLyBtdXN0IGJlIG5vIHNsYXNoZXMgb3IgZGV2aWNlIG5hbWVzIChjOlxcKSBpbiB0aGUgYXJyYXlcclxuLy8gKHNvIGFsc28gbm8gbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyAtIGl0IGRvZXMgbm90IGRpc3Rpbmd1aXNoXHJcbi8vIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSBwYXRocylcclxuZnVuY3Rpb24gbm9ybWFsaXplQXJyYXkocGFydHMsIGFsbG93QWJvdmVSb290KSB7XHJcbiAgdmFyIHJlcyA9IFtdO1xyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgIHZhciBwID0gcGFydHNbaV07XHJcblxyXG4gICAgLy8gaWdub3JlIGVtcHR5IHBhcnRzXHJcbiAgICBpZiAoIXAgfHwgcCA9PT0gJy4nKVxyXG4gICAgICBjb250aW51ZTtcclxuXHJcbiAgICBpZiAocCA9PT0gJy4uJykge1xyXG4gICAgICBpZiAocmVzLmxlbmd0aCAmJiByZXNbcmVzLmxlbmd0aCAtIDFdICE9PSAnLi4nKSB7XHJcbiAgICAgICAgcmVzLnBvcCgpO1xyXG4gICAgICB9IGVsc2UgaWYgKGFsbG93QWJvdmVSb290KSB7XHJcbiAgICAgICAgcmVzLnB1c2goJy4uJyk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlcy5wdXNoKHApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHJlcztcclxufVxyXG5cclxuLy8gcmV0dXJucyBhbiBhcnJheSB3aXRoIGVtcHR5IGVsZW1lbnRzIHJlbW92ZWQgZnJvbSBlaXRoZXIgZW5kIG9mIHRoZSBpbnB1dFxyXG4vLyBhcnJheSBvciB0aGUgb3JpZ2luYWwgYXJyYXkgaWYgbm8gZWxlbWVudHMgbmVlZCB0byBiZSByZW1vdmVkXHJcbmZ1bmN0aW9uIHRyaW1BcnJheShhcnIpIHtcclxuICB2YXIgbGFzdEluZGV4ID0gYXJyLmxlbmd0aCAtIDE7XHJcbiAgdmFyIHN0YXJ0ID0gMDtcclxuICBmb3IgKDsgc3RhcnQgPD0gbGFzdEluZGV4OyBzdGFydCsrKSB7XHJcbiAgICBpZiAoYXJyW3N0YXJ0XSlcclxuICAgICAgYnJlYWs7XHJcbiAgfVxyXG5cclxuICB2YXIgZW5kID0gbGFzdEluZGV4O1xyXG4gIGZvciAoOyBlbmQgPj0gMDsgZW5kLS0pIHtcclxuICAgIGlmIChhcnJbZW5kXSlcclxuICAgICAgYnJlYWs7XHJcbiAgfVxyXG5cclxuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBsYXN0SW5kZXgpXHJcbiAgICByZXR1cm4gYXJyO1xyXG4gIGlmIChzdGFydCA+IGVuZClcclxuICAgIHJldHVybiBbXTtcclxuICByZXR1cm4gYXJyLnNsaWNlKHN0YXJ0LCBlbmQgKyAxKTtcclxufVxyXG5cclxuLy8gUmVnZXggdG8gc3BsaXQgYSB3aW5kb3dzIHBhdGggaW50byB0aHJlZSBwYXJ0czogWyosIGRldmljZSwgc2xhc2gsXHJcbi8vIHRhaWxdIHdpbmRvd3Mtb25seVxyXG52YXIgc3BsaXREZXZpY2VSZSA9XHJcbiAgICAvXihbYS16QS1aXTp8W1xcXFxcXC9dezJ9W15cXFxcXFwvXStbXFxcXFxcL10rW15cXFxcXFwvXSspPyhbXFxcXFxcL10pPyhbXFxzXFxTXSo/KSQvO1xyXG5cclxuLy8gUmVnZXggdG8gc3BsaXQgdGhlIHRhaWwgcGFydCBvZiB0aGUgYWJvdmUgaW50byBbKiwgZGlyLCBiYXNlbmFtZSwgZXh0XVxyXG52YXIgc3BsaXRUYWlsUmUgPVxyXG4gICAgL14oW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXFxcXFwvXSs/fCkoXFwuW14uXFwvXFxcXF0qfCkpKD86W1xcXFxcXC9dKikkLztcclxuXHJcbnZhciB3aW4zMiA9IHt9O1xyXG5cclxuLy8gRnVuY3Rpb24gdG8gc3BsaXQgYSBmaWxlbmFtZSBpbnRvIFtyb290LCBkaXIsIGJhc2VuYW1lLCBleHRdXHJcbmZ1bmN0aW9uIHdpbjMyU3BsaXRQYXRoKGZpbGVuYW1lKSB7XHJcbiAgLy8gU2VwYXJhdGUgZGV2aWNlK3NsYXNoIGZyb20gdGFpbFxyXG4gIHZhciByZXN1bHQgPSBzcGxpdERldmljZVJlLmV4ZWMoZmlsZW5hbWUpLFxyXG4gICAgICBkZXZpY2UgPSAocmVzdWx0WzFdIHx8ICcnKSArIChyZXN1bHRbMl0gfHwgJycpLFxyXG4gICAgICB0YWlsID0gcmVzdWx0WzNdIHx8ICcnO1xyXG4gIC8vIFNwbGl0IHRoZSB0YWlsIGludG8gZGlyLCBiYXNlbmFtZSBhbmQgZXh0ZW5zaW9uXHJcbiAgdmFyIHJlc3VsdDIgPSBzcGxpdFRhaWxSZS5leGVjKHRhaWwpLFxyXG4gICAgICBkaXIgPSByZXN1bHQyWzFdLFxyXG4gICAgICBiYXNlbmFtZSA9IHJlc3VsdDJbMl0sXHJcbiAgICAgIGV4dCA9IHJlc3VsdDJbM107XHJcbiAgcmV0dXJuIFtkZXZpY2UsIGRpciwgYmFzZW5hbWUsIGV4dF07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdpbjMyU3RhdFBhdGgocGF0aCkge1xyXG4gIHZhciByZXN1bHQgPSBzcGxpdERldmljZVJlLmV4ZWMocGF0aCksXHJcbiAgICAgIGRldmljZSA9IHJlc3VsdFsxXSB8fCAnJyxcclxuICAgICAgaXNVbmMgPSAhIWRldmljZSAmJiBkZXZpY2VbMV0gIT09ICc6JztcclxuICByZXR1cm4ge1xyXG4gICAgZGV2aWNlOiBkZXZpY2UsXHJcbiAgICBpc1VuYzogaXNVbmMsXHJcbiAgICBpc0Fic29sdXRlOiBpc1VuYyB8fCAhIXJlc3VsdFsyXSwgLy8gVU5DIHBhdGhzIGFyZSBhbHdheXMgYWJzb2x1dGVcclxuICAgIHRhaWw6IHJlc3VsdFszXVxyXG4gIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZVVOQ1Jvb3QoZGV2aWNlKSB7XHJcbiAgcmV0dXJuICdcXFxcXFxcXCcgKyBkZXZpY2UucmVwbGFjZSgvXltcXFxcXFwvXSsvLCAnJykucmVwbGFjZSgvW1xcXFxcXC9dKy9nLCAnXFxcXCcpO1xyXG59XHJcblxyXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXHJcbndpbjMyLnJlc29sdmUgPSBmdW5jdGlvbigpIHtcclxuICB2YXIgcmVzb2x2ZWREZXZpY2UgPSAnJyxcclxuICAgICAgcmVzb2x2ZWRUYWlsID0gJycsXHJcbiAgICAgIHJlc29sdmVkQWJzb2x1dGUgPSBmYWxzZTtcclxuXHJcbiAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IC0xOyBpLS0pIHtcclxuICAgIHZhciBwYXRoO1xyXG4gICAgaWYgKGkgPj0gMCkge1xyXG4gICAgICBwYXRoID0gYXJndW1lbnRzW2ldO1xyXG4gICAgfSBlbHNlIGlmICghcmVzb2x2ZWREZXZpY2UpIHtcclxuICAgICAgcGF0aCA9IHByb2Nlc3MuY3dkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBXaW5kb3dzIGhhcyB0aGUgY29uY2VwdCBvZiBkcml2ZS1zcGVjaWZpYyBjdXJyZW50IHdvcmtpbmdcclxuICAgICAgLy8gZGlyZWN0b3JpZXMuIElmIHdlJ3ZlIHJlc29sdmVkIGEgZHJpdmUgbGV0dGVyIGJ1dCBub3QgeWV0IGFuXHJcbiAgICAgIC8vIGFic29sdXRlIHBhdGgsIGdldCBjd2QgZm9yIHRoYXQgZHJpdmUuIFdlJ3JlIHN1cmUgdGhlIGRldmljZSBpcyBub3RcclxuICAgICAgLy8gYW4gdW5jIHBhdGggYXQgdGhpcyBwb2ludHMsIGJlY2F1c2UgdW5jIHBhdGhzIGFyZSBhbHdheXMgYWJzb2x1dGUuXHJcbiAgICAgIHBhdGggPSBwcm9jZXNzLmVudlsnPScgKyByZXNvbHZlZERldmljZV07XHJcbiAgICAgIC8vIFZlcmlmeSB0aGF0IGEgZHJpdmUtbG9jYWwgY3dkIHdhcyBmb3VuZCBhbmQgdGhhdCBpdCBhY3R1YWxseSBwb2ludHNcclxuICAgICAgLy8gdG8gb3VyIGRyaXZlLiBJZiBub3QsIGRlZmF1bHQgdG8gdGhlIGRyaXZlJ3Mgcm9vdC5cclxuICAgICAgaWYgKCFwYXRoIHx8IHBhdGguc3Vic3RyKDAsIDMpLnRvTG93ZXJDYXNlKCkgIT09XHJcbiAgICAgICAgICByZXNvbHZlZERldmljZS50b0xvd2VyQ2FzZSgpICsgJ1xcXFwnKSB7XHJcbiAgICAgICAgcGF0aCA9IHJlc29sdmVkRGV2aWNlICsgJ1xcXFwnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2tpcCBlbXB0eSBhbmQgaW52YWxpZCBlbnRyaWVzXHJcbiAgICBpZiAoIXV0aWwuaXNTdHJpbmcocGF0aCkpIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MnKTtcclxuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHJlc3VsdCA9IHdpbjMyU3RhdFBhdGgocGF0aCksXHJcbiAgICAgICAgZGV2aWNlID0gcmVzdWx0LmRldmljZSxcclxuICAgICAgICBpc1VuYyA9IHJlc3VsdC5pc1VuYyxcclxuICAgICAgICBpc0Fic29sdXRlID0gcmVzdWx0LmlzQWJzb2x1dGUsXHJcbiAgICAgICAgdGFpbCA9IHJlc3VsdC50YWlsO1xyXG5cclxuICAgIGlmIChkZXZpY2UgJiZcclxuICAgICAgICByZXNvbHZlZERldmljZSAmJlxyXG4gICAgICAgIGRldmljZS50b0xvd2VyQ2FzZSgpICE9PSByZXNvbHZlZERldmljZS50b0xvd2VyQ2FzZSgpKSB7XHJcbiAgICAgIC8vIFRoaXMgcGF0aCBwb2ludHMgdG8gYW5vdGhlciBkZXZpY2Ugc28gaXQgaXMgbm90IGFwcGxpY2FibGVcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFyZXNvbHZlZERldmljZSkge1xyXG4gICAgICByZXNvbHZlZERldmljZSA9IGRldmljZTtcclxuICAgIH1cclxuICAgIGlmICghcmVzb2x2ZWRBYnNvbHV0ZSkge1xyXG4gICAgICByZXNvbHZlZFRhaWwgPSB0YWlsICsgJ1xcXFwnICsgcmVzb2x2ZWRUYWlsO1xyXG4gICAgICByZXNvbHZlZEFic29sdXRlID0gaXNBYnNvbHV0ZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocmVzb2x2ZWREZXZpY2UgJiYgcmVzb2x2ZWRBYnNvbHV0ZSkge1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIENvbnZlcnQgc2xhc2hlcyB0byBiYWNrc2xhc2hlcyB3aGVuIGByZXNvbHZlZERldmljZWAgcG9pbnRzIHRvIGFuIFVOQ1xyXG4gIC8vIHJvb3QuIEFsc28gc3F1YXNoIG11bHRpcGxlIHNsYXNoZXMgaW50byBhIHNpbmdsZSBvbmUgd2hlcmUgYXBwcm9wcmlhdGUuXHJcbiAgaWYgKGlzVW5jKSB7XHJcbiAgICByZXNvbHZlZERldmljZSA9IG5vcm1hbGl6ZVVOQ1Jvb3QocmVzb2x2ZWREZXZpY2UpO1xyXG4gIH1cclxuXHJcbiAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsXHJcbiAgLy8gYnV0IGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpXHJcbiAgLy8gZmFpbHMpXHJcblxyXG4gIC8vIE5vcm1hbGl6ZSB0aGUgdGFpbCBwYXRoXHJcbiAgcmVzb2x2ZWRUYWlsID0gbm9ybWFsaXplQXJyYXkocmVzb2x2ZWRUYWlsLnNwbGl0KC9bXFxcXFxcL10rLyksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXJlc29sdmVkQWJzb2x1dGUpLmpvaW4oJ1xcXFwnKTtcclxuXHJcbiAgcmV0dXJuIChyZXNvbHZlZERldmljZSArIChyZXNvbHZlZEFic29sdXRlID8gJ1xcXFwnIDogJycpICsgcmVzb2x2ZWRUYWlsKSB8fFxyXG4gICAgICAgICAnLic7XHJcbn07XHJcblxyXG5cclxud2luMzIubm9ybWFsaXplID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIHZhciByZXN1bHQgPSB3aW4zMlN0YXRQYXRoKHBhdGgpLFxyXG4gICAgICBkZXZpY2UgPSByZXN1bHQuZGV2aWNlLFxyXG4gICAgICBpc1VuYyA9IHJlc3VsdC5pc1VuYyxcclxuICAgICAgaXNBYnNvbHV0ZSA9IHJlc3VsdC5pc0Fic29sdXRlLFxyXG4gICAgICB0YWlsID0gcmVzdWx0LnRhaWwsXHJcbiAgICAgIHRyYWlsaW5nU2xhc2ggPSAvW1xcXFxcXC9dJC8udGVzdCh0YWlsKTtcclxuXHJcbiAgLy8gTm9ybWFsaXplIHRoZSB0YWlsIHBhdGhcclxuICB0YWlsID0gbm9ybWFsaXplQXJyYXkodGFpbC5zcGxpdCgvW1xcXFxcXC9dKy8pLCAhaXNBYnNvbHV0ZSkuam9pbignXFxcXCcpO1xyXG5cclxuICBpZiAoIXRhaWwgJiYgIWlzQWJzb2x1dGUpIHtcclxuICAgIHRhaWwgPSAnLic7XHJcbiAgfVxyXG4gIGlmICh0YWlsICYmIHRyYWlsaW5nU2xhc2gpIHtcclxuICAgIHRhaWwgKz0gJ1xcXFwnO1xyXG4gIH1cclxuXHJcbiAgLy8gQ29udmVydCBzbGFzaGVzIHRvIGJhY2tzbGFzaGVzIHdoZW4gYGRldmljZWAgcG9pbnRzIHRvIGFuIFVOQyByb290LlxyXG4gIC8vIEFsc28gc3F1YXNoIG11bHRpcGxlIHNsYXNoZXMgaW50byBhIHNpbmdsZSBvbmUgd2hlcmUgYXBwcm9wcmlhdGUuXHJcbiAgaWYgKGlzVW5jKSB7XHJcbiAgICBkZXZpY2UgPSBub3JtYWxpemVVTkNSb290KGRldmljZSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gZGV2aWNlICsgKGlzQWJzb2x1dGUgPyAnXFxcXCcgOiAnJykgKyB0YWlsO1xyXG59O1xyXG5cclxuXHJcbndpbjMyLmlzQWJzb2x1dGUgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgcmV0dXJuIHdpbjMyU3RhdFBhdGgocGF0aCkuaXNBYnNvbHV0ZTtcclxufTtcclxuXHJcbndpbjMyLmpvaW4gPSBmdW5jdGlvbigpIHtcclxuICB2YXIgcGF0aHMgPSBbXTtcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXTtcclxuICAgIGlmICghdXRpbC5pc1N0cmluZyhhcmcpKSB7XHJcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyB0byBwYXRoLmpvaW4gbXVzdCBiZSBzdHJpbmdzJyk7XHJcbiAgICB9XHJcbiAgICBpZiAoYXJnKSB7XHJcbiAgICAgIHBhdGhzLnB1c2goYXJnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhciBqb2luZWQgPSBwYXRocy5qb2luKCdcXFxcJyk7XHJcblxyXG4gIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBqb2luZWQgcGF0aCBkb2Vzbid0IHN0YXJ0IHdpdGggdHdvIHNsYXNoZXMsIGJlY2F1c2VcclxuICAvLyBub3JtYWxpemUoKSB3aWxsIG1pc3Rha2UgaXQgZm9yIGFuIFVOQyBwYXRoIHRoZW4uXHJcbiAgLy9cclxuICAvLyBUaGlzIHN0ZXAgaXMgc2tpcHBlZCB3aGVuIGl0IGlzIHZlcnkgY2xlYXIgdGhhdCB0aGUgdXNlciBhY3R1YWxseVxyXG4gIC8vIGludGVuZGVkIHRvIHBvaW50IGF0IGFuIFVOQyBwYXRoLiBUaGlzIGlzIGFzc3VtZWQgd2hlbiB0aGUgZmlyc3RcclxuICAvLyBub24tZW1wdHkgc3RyaW5nIGFyZ3VtZW50cyBzdGFydHMgd2l0aCBleGFjdGx5IHR3byBzbGFzaGVzIGZvbGxvd2VkIGJ5XHJcbiAgLy8gYXQgbGVhc3Qgb25lIG1vcmUgbm9uLXNsYXNoIGNoYXJhY3Rlci5cclxuICAvL1xyXG4gIC8vIE5vdGUgdGhhdCBmb3Igbm9ybWFsaXplKCkgdG8gdHJlYXQgYSBwYXRoIGFzIGFuIFVOQyBwYXRoIGl0IG5lZWRzIHRvXHJcbiAgLy8gaGF2ZSBhdCBsZWFzdCAyIGNvbXBvbmVudHMsIHNvIHdlIGRvbid0IGZpbHRlciBmb3IgdGhhdCBoZXJlLlxyXG4gIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgdXNlciBjYW4gdXNlIGpvaW4gdG8gY29uc3RydWN0IFVOQyBwYXRocyBmcm9tXHJcbiAgLy8gYSBzZXJ2ZXIgbmFtZSBhbmQgYSBzaGFyZSBuYW1lOyBmb3IgZXhhbXBsZTpcclxuICAvLyAgIHBhdGguam9pbignLy9zZXJ2ZXInLCAnc2hhcmUnKSAtPiAnXFxcXFxcXFxzZXJ2ZXJcXFxcc2hhcmVcXCcpXHJcbiAgaWYgKCEvXltcXFxcXFwvXXsyfVteXFxcXFxcL10vLnRlc3QocGF0aHNbMF0pKSB7XHJcbiAgICBqb2luZWQgPSBqb2luZWQucmVwbGFjZSgvXltcXFxcXFwvXXsyLH0vLCAnXFxcXCcpO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHdpbjMyLm5vcm1hbGl6ZShqb2luZWQpO1xyXG59O1xyXG5cclxuXHJcbi8vIHBhdGgucmVsYXRpdmUoZnJvbSwgdG8pXHJcbi8vIGl0IHdpbGwgc29sdmUgdGhlIHJlbGF0aXZlIHBhdGggZnJvbSAnZnJvbScgdG8gJ3RvJywgZm9yIGluc3RhbmNlOlxyXG4vLyBmcm9tID0gJ0M6XFxcXG9yYW5kZWFcXFxcdGVzdFxcXFxhYWEnXHJcbi8vIHRvID0gJ0M6XFxcXG9yYW5kZWFcXFxcaW1wbFxcXFxiYmInXHJcbi8vIFRoZSBvdXRwdXQgb2YgdGhlIGZ1bmN0aW9uIHNob3VsZCBiZTogJy4uXFxcXC4uXFxcXGltcGxcXFxcYmJiJ1xyXG53aW4zMi5yZWxhdGl2ZSA9IGZ1bmN0aW9uKGZyb20sIHRvKSB7XHJcbiAgZnJvbSA9IHdpbjMyLnJlc29sdmUoZnJvbSk7XHJcbiAgdG8gPSB3aW4zMi5yZXNvbHZlKHRvKTtcclxuXHJcbiAgLy8gd2luZG93cyBpcyBub3QgY2FzZSBzZW5zaXRpdmVcclxuICB2YXIgbG93ZXJGcm9tID0gZnJvbS50b0xvd2VyQ2FzZSgpO1xyXG4gIHZhciBsb3dlclRvID0gdG8udG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgdmFyIHRvUGFydHMgPSB0cmltQXJyYXkodG8uc3BsaXQoJ1xcXFwnKSk7XHJcblxyXG4gIHZhciBsb3dlckZyb21QYXJ0cyA9IHRyaW1BcnJheShsb3dlckZyb20uc3BsaXQoJ1xcXFwnKSk7XHJcbiAgdmFyIGxvd2VyVG9QYXJ0cyA9IHRyaW1BcnJheShsb3dlclRvLnNwbGl0KCdcXFxcJykpO1xyXG5cclxuICB2YXIgbGVuZ3RoID0gTWF0aC5taW4obG93ZXJGcm9tUGFydHMubGVuZ3RoLCBsb3dlclRvUGFydHMubGVuZ3RoKTtcclxuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgIGlmIChsb3dlckZyb21QYXJ0c1tpXSAhPT0gbG93ZXJUb1BhcnRzW2ldKSB7XHJcbiAgICAgIHNhbWVQYXJ0c0xlbmd0aCA9IGk7XHJcbiAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaWYgKHNhbWVQYXJ0c0xlbmd0aCA9PSAwKSB7XHJcbiAgICByZXR1cm4gdG87XHJcbiAgfVxyXG5cclxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcclxuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgbG93ZXJGcm9tUGFydHMubGVuZ3RoOyBpKyspIHtcclxuICAgIG91dHB1dFBhcnRzLnB1c2goJy4uJyk7XHJcbiAgfVxyXG5cclxuICBvdXRwdXRQYXJ0cyA9IG91dHB1dFBhcnRzLmNvbmNhdCh0b1BhcnRzLnNsaWNlKHNhbWVQYXJ0c0xlbmd0aCkpO1xyXG5cclxuICByZXR1cm4gb3V0cHV0UGFydHMuam9pbignXFxcXCcpO1xyXG59O1xyXG5cclxuXHJcbndpbjMyLl9tYWtlTG9uZyA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICAvLyBOb3RlOiB0aGlzIHdpbGwgKnByb2JhYmx5KiB0aHJvdyBzb21ld2hlcmUuXHJcbiAgaWYgKCF1dGlsLmlzU3RyaW5nKHBhdGgpKVxyXG4gICAgcmV0dXJuIHBhdGg7XHJcblxyXG4gIGlmICghcGF0aCkge1xyXG4gICAgcmV0dXJuICcnO1xyXG4gIH1cclxuXHJcbiAgdmFyIHJlc29sdmVkUGF0aCA9IHdpbjMyLnJlc29sdmUocGF0aCk7XHJcblxyXG4gIGlmICgvXlthLXpBLVpdXFw6XFxcXC8udGVzdChyZXNvbHZlZFBhdGgpKSB7XHJcbiAgICAvLyBwYXRoIGlzIGxvY2FsIGZpbGVzeXN0ZW0gcGF0aCwgd2hpY2ggbmVlZHMgdG8gYmUgY29udmVydGVkXHJcbiAgICAvLyB0byBsb25nIFVOQyBwYXRoLlxyXG4gICAgcmV0dXJuICdcXFxcXFxcXD9cXFxcJyArIHJlc29sdmVkUGF0aDtcclxuICB9IGVsc2UgaWYgKC9eXFxcXFxcXFxbXj8uXS8udGVzdChyZXNvbHZlZFBhdGgpKSB7XHJcbiAgICAvLyBwYXRoIGlzIG5ldHdvcmsgVU5DIHBhdGgsIHdoaWNoIG5lZWRzIHRvIGJlIGNvbnZlcnRlZFxyXG4gICAgLy8gdG8gbG9uZyBVTkMgcGF0aC5cclxuICAgIHJldHVybiAnXFxcXFxcXFw/XFxcXFVOQ1xcXFwnICsgcmVzb2x2ZWRQYXRoLnN1YnN0cmluZygyKTtcclxuICB9XHJcblxyXG4gIHJldHVybiBwYXRoO1xyXG59O1xyXG5cclxuXHJcbndpbjMyLmRpcm5hbWUgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgdmFyIHJlc3VsdCA9IHdpbjMyU3BsaXRQYXRoKHBhdGgpLFxyXG4gICAgICByb290ID0gcmVzdWx0WzBdLFxyXG4gICAgICBkaXIgPSByZXN1bHRbMV07XHJcblxyXG4gIGlmICghcm9vdCAmJiAhZGlyKSB7XHJcbiAgICAvLyBObyBkaXJuYW1lIHdoYXRzb2V2ZXJcclxuICAgIHJldHVybiAnLic7XHJcbiAgfVxyXG5cclxuICBpZiAoZGlyKSB7XHJcbiAgICAvLyBJdCBoYXMgYSBkaXJuYW1lLCBzdHJpcCB0cmFpbGluZyBzbGFzaFxyXG4gICAgZGlyID0gZGlyLnN1YnN0cigwLCBkaXIubGVuZ3RoIC0gMSk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gcm9vdCArIGRpcjtcclxufTtcclxuXHJcblxyXG53aW4zMi5iYXNlbmFtZSA9IGZ1bmN0aW9uKHBhdGgsIGV4dCkge1xyXG4gIHZhciBmID0gd2luMzJTcGxpdFBhdGgocGF0aClbMl07XHJcbiAgLy8gVE9ETzogbWFrZSB0aGlzIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZSBvbiB3aW5kb3dzP1xyXG4gIGlmIChleHQgJiYgZi5zdWJzdHIoLTEgKiBleHQubGVuZ3RoKSA9PT0gZXh0KSB7XHJcbiAgICBmID0gZi5zdWJzdHIoMCwgZi5sZW5ndGggLSBleHQubGVuZ3RoKTtcclxuICB9XHJcbiAgcmV0dXJuIGY7XHJcbn07XHJcblxyXG5cclxud2luMzIuZXh0bmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICByZXR1cm4gd2luMzJTcGxpdFBhdGgocGF0aClbM107XHJcbn07XHJcblxyXG5cclxud2luMzIuZm9ybWF0ID0gZnVuY3Rpb24ocGF0aE9iamVjdCkge1xyXG4gIGlmICghdXRpbC5pc09iamVjdChwYXRoT2JqZWN0KSkge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICBcIlBhcmFtZXRlciAncGF0aE9iamVjdCcgbXVzdCBiZSBhbiBvYmplY3QsIG5vdCBcIiArIHR5cGVvZiBwYXRoT2JqZWN0XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgdmFyIHJvb3QgPSBwYXRoT2JqZWN0LnJvb3QgfHwgJyc7XHJcblxyXG4gIGlmICghdXRpbC5pc1N0cmluZyhyb290KSkge1xyXG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcclxuICAgICAgICBcIidwYXRoT2JqZWN0LnJvb3QnIG11c3QgYmUgYSBzdHJpbmcgb3IgdW5kZWZpbmVkLCBub3QgXCIgK1xyXG4gICAgICAgIHR5cGVvZiBwYXRoT2JqZWN0LnJvb3RcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICB2YXIgZGlyID0gcGF0aE9iamVjdC5kaXI7XHJcbiAgdmFyIGJhc2UgPSBwYXRoT2JqZWN0LmJhc2UgfHwgJyc7XHJcbiAgaWYgKCFkaXIpIHtcclxuICAgIHJldHVybiBiYXNlO1xyXG4gIH1cclxuICBpZiAoZGlyW2Rpci5sZW5ndGggLSAxXSA9PT0gd2luMzIuc2VwKSB7XHJcbiAgICByZXR1cm4gZGlyICsgYmFzZTtcclxuICB9XHJcbiAgcmV0dXJuIGRpciArIHdpbjMyLnNlcCArIGJhc2U7XHJcbn07XHJcblxyXG5cclxud2luMzIucGFyc2UgPSBmdW5jdGlvbihwYXRoU3RyaW5nKSB7XHJcbiAgaWYgKCF1dGlsLmlzU3RyaW5nKHBhdGhTdHJpbmcpKSB7XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG4gICAgICAgIFwiUGFyYW1ldGVyICdwYXRoU3RyaW5nJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgcGF0aFN0cmluZ1xyXG4gICAgKTtcclxuICB9XHJcbiAgdmFyIGFsbFBhcnRzID0gd2luMzJTcGxpdFBhdGgocGF0aFN0cmluZyk7XHJcbiAgaWYgKCFhbGxQYXJ0cyB8fCBhbGxQYXJ0cy5sZW5ndGggIT09IDQpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIHBhdGggJ1wiICsgcGF0aFN0cmluZyArIFwiJ1wiKTtcclxuICB9XHJcbiAgcmV0dXJuIHtcclxuICAgIHJvb3Q6IGFsbFBhcnRzWzBdLFxyXG4gICAgZGlyOiBhbGxQYXJ0c1swXSArIGFsbFBhcnRzWzFdLnNsaWNlKDAsIC0xKSxcclxuICAgIGJhc2U6IGFsbFBhcnRzWzJdLFxyXG4gICAgZXh0OiBhbGxQYXJ0c1szXSxcclxuICAgIG5hbWU6IGFsbFBhcnRzWzJdLnNsaWNlKDAsIGFsbFBhcnRzWzJdLmxlbmd0aCAtIGFsbFBhcnRzWzNdLmxlbmd0aClcclxuICB9O1xyXG59O1xyXG5cclxuXHJcbndpbjMyLnNlcCA9ICdcXFxcJztcclxud2luMzIuZGVsaW1pdGVyID0gJzsnO1xyXG5cclxuXHJcbi8vIFNwbGl0IGEgZmlsZW5hbWUgaW50byBbcm9vdCwgZGlyLCBiYXNlbmFtZSwgZXh0XSwgdW5peCB2ZXJzaW9uXHJcbi8vICdyb290JyBpcyBqdXN0IGEgc2xhc2gsIG9yIG5vdGhpbmcuXHJcbnZhciBzcGxpdFBhdGhSZSA9XHJcbiAgICAvXihcXC8/fCkoW1xcc1xcU10qPykoKD86XFwuezEsMn18W15cXC9dKz98KShcXC5bXi5cXC9dKnwpKSg/OltcXC9dKikkLztcclxudmFyIHBvc2l4ID0ge307XHJcblxyXG5cclxuZnVuY3Rpb24gcG9zaXhTcGxpdFBhdGgoZmlsZW5hbWUpIHtcclxuICByZXR1cm4gc3BsaXRQYXRoUmUuZXhlYyhmaWxlbmFtZSkuc2xpY2UoMSk7XHJcbn1cclxuXHJcblxyXG4vLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXHJcbi8vIHBvc2l4IHZlcnNpb25cclxucG9zaXgucmVzb2x2ZSA9IGZ1bmN0aW9uKCkge1xyXG4gIHZhciByZXNvbHZlZFBhdGggPSAnJyxcclxuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IGZhbHNlO1xyXG5cclxuICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gLTEgJiYgIXJlc29sdmVkQWJzb2x1dGU7IGktLSkge1xyXG4gICAgdmFyIHBhdGggPSAoaSA+PSAwKSA/IGFyZ3VtZW50c1tpXSA6IHByb2Nlc3MuY3dkKCk7XHJcblxyXG4gICAgLy8gU2tpcCBlbXB0eSBhbmQgaW52YWxpZCBlbnRyaWVzXHJcbiAgICBpZiAoIXV0aWwuaXNTdHJpbmcocGF0aCkpIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGgucmVzb2x2ZSBtdXN0IGJlIHN0cmluZ3MnKTtcclxuICAgIH0gZWxzZSBpZiAoIXBhdGgpIHtcclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzb2x2ZWRQYXRoID0gcGF0aCArICcvJyArIHJlc29sdmVkUGF0aDtcclxuICAgIHJlc29sdmVkQWJzb2x1dGUgPSBwYXRoWzBdID09PSAnLyc7XHJcbiAgfVxyXG5cclxuICAvLyBBdCB0aGlzIHBvaW50IHRoZSBwYXRoIHNob3VsZCBiZSByZXNvbHZlZCB0byBhIGZ1bGwgYWJzb2x1dGUgcGF0aCwgYnV0XHJcbiAgLy8gaGFuZGxlIHJlbGF0aXZlIHBhdGhzIHRvIGJlIHNhZmUgKG1pZ2h0IGhhcHBlbiB3aGVuIHByb2Nlc3MuY3dkKCkgZmFpbHMpXHJcblxyXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxyXG4gIHJlc29sdmVkUGF0aCA9IG5vcm1hbGl6ZUFycmF5KHJlc29sdmVkUGF0aC5zcGxpdCgnLycpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFyZXNvbHZlZEFic29sdXRlKS5qb2luKCcvJyk7XHJcblxyXG4gIHJldHVybiAoKHJlc29sdmVkQWJzb2x1dGUgPyAnLycgOiAnJykgKyByZXNvbHZlZFBhdGgpIHx8ICcuJztcclxufTtcclxuXHJcbi8vIHBhdGgubm9ybWFsaXplKHBhdGgpXHJcbi8vIHBvc2l4IHZlcnNpb25cclxucG9zaXgubm9ybWFsaXplID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIHZhciBpc0Fic29sdXRlID0gcG9zaXguaXNBYnNvbHV0ZShwYXRoKSxcclxuICAgICAgdHJhaWxpbmdTbGFzaCA9IHBhdGggJiYgcGF0aFtwYXRoLmxlbmd0aCAtIDFdID09PSAnLyc7XHJcblxyXG4gIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxyXG4gIHBhdGggPSBub3JtYWxpemVBcnJheShwYXRoLnNwbGl0KCcvJyksICFpc0Fic29sdXRlKS5qb2luKCcvJyk7XHJcblxyXG4gIGlmICghcGF0aCAmJiAhaXNBYnNvbHV0ZSkge1xyXG4gICAgcGF0aCA9ICcuJztcclxuICB9XHJcbiAgaWYgKHBhdGggJiYgdHJhaWxpbmdTbGFzaCkge1xyXG4gICAgcGF0aCArPSAnLyc7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gKGlzQWJzb2x1dGUgPyAnLycgOiAnJykgKyBwYXRoO1xyXG59O1xyXG5cclxuLy8gcG9zaXggdmVyc2lvblxyXG5wb3NpeC5pc0Fic29sdXRlID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIHJldHVybiBwYXRoLmNoYXJBdCgwKSA9PT0gJy8nO1xyXG59O1xyXG5cclxuLy8gcG9zaXggdmVyc2lvblxyXG5wb3NpeC5qb2luID0gZnVuY3Rpb24oKSB7XHJcbiAgdmFyIHBhdGggPSAnJztcclxuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgdmFyIHNlZ21lbnQgPSBhcmd1bWVudHNbaV07XHJcbiAgICBpZiAoIXV0aWwuaXNTdHJpbmcoc2VnbWVudCkpIHtcclxuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnRzIHRvIHBhdGguam9pbiBtdXN0IGJlIHN0cmluZ3MnKTtcclxuICAgIH1cclxuICAgIGlmIChzZWdtZW50KSB7XHJcbiAgICAgIGlmICghcGF0aCkge1xyXG4gICAgICAgIHBhdGggKz0gc2VnbWVudDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwYXRoICs9ICcvJyArIHNlZ21lbnQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgcmV0dXJuIHBvc2l4Lm5vcm1hbGl6ZShwYXRoKTtcclxufTtcclxuXHJcblxyXG4vLyBwYXRoLnJlbGF0aXZlKGZyb20sIHRvKVxyXG4vLyBwb3NpeCB2ZXJzaW9uXHJcbnBvc2l4LnJlbGF0aXZlID0gZnVuY3Rpb24oZnJvbSwgdG8pIHtcclxuICBmcm9tID0gcG9zaXgucmVzb2x2ZShmcm9tKS5zdWJzdHIoMSk7XHJcbiAgdG8gPSBwb3NpeC5yZXNvbHZlKHRvKS5zdWJzdHIoMSk7XHJcblxyXG4gIHZhciBmcm9tUGFydHMgPSB0cmltQXJyYXkoZnJvbS5zcGxpdCgnLycpKTtcclxuICB2YXIgdG9QYXJ0cyA9IHRyaW1BcnJheSh0by5zcGxpdCgnLycpKTtcclxuXHJcbiAgdmFyIGxlbmd0aCA9IE1hdGgubWluKGZyb21QYXJ0cy5sZW5ndGgsIHRvUGFydHMubGVuZ3RoKTtcclxuICB2YXIgc2FtZVBhcnRzTGVuZ3RoID0gbGVuZ3RoO1xyXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcclxuICAgIGlmIChmcm9tUGFydHNbaV0gIT09IHRvUGFydHNbaV0pIHtcclxuICAgICAgc2FtZVBhcnRzTGVuZ3RoID0gaTtcclxuICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YXIgb3V0cHV0UGFydHMgPSBbXTtcclxuICBmb3IgKHZhciBpID0gc2FtZVBhcnRzTGVuZ3RoOyBpIDwgZnJvbVBhcnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICBvdXRwdXRQYXJ0cy5wdXNoKCcuLicpO1xyXG4gIH1cclxuXHJcbiAgb3V0cHV0UGFydHMgPSBvdXRwdXRQYXJ0cy5jb25jYXQodG9QYXJ0cy5zbGljZShzYW1lUGFydHNMZW5ndGgpKTtcclxuXHJcbiAgcmV0dXJuIG91dHB1dFBhcnRzLmpvaW4oJy8nKTtcclxufTtcclxuXHJcblxyXG5wb3NpeC5fbWFrZUxvbmcgPSBmdW5jdGlvbihwYXRoKSB7XHJcbiAgcmV0dXJuIHBhdGg7XHJcbn07XHJcblxyXG5cclxucG9zaXguZGlybmFtZSA9IGZ1bmN0aW9uKHBhdGgpIHtcclxuICB2YXIgcmVzdWx0ID0gcG9zaXhTcGxpdFBhdGgocGF0aCksXHJcbiAgICAgIHJvb3QgPSByZXN1bHRbMF0sXHJcbiAgICAgIGRpciA9IHJlc3VsdFsxXTtcclxuXHJcbiAgaWYgKCFyb290ICYmICFkaXIpIHtcclxuICAgIC8vIE5vIGRpcm5hbWUgd2hhdHNvZXZlclxyXG4gICAgcmV0dXJuICcuJztcclxuICB9XHJcblxyXG4gIGlmIChkaXIpIHtcclxuICAgIC8vIEl0IGhhcyBhIGRpcm5hbWUsIHN0cmlwIHRyYWlsaW5nIHNsYXNoXHJcbiAgICBkaXIgPSBkaXIuc3Vic3RyKDAsIGRpci5sZW5ndGggLSAxKTtcclxuICB9XHJcblxyXG4gIHJldHVybiByb290ICsgZGlyO1xyXG59O1xyXG5cclxuXHJcbnBvc2l4LmJhc2VuYW1lID0gZnVuY3Rpb24ocGF0aCwgZXh0KSB7XHJcbiAgdmFyIGYgPSBwb3NpeFNwbGl0UGF0aChwYXRoKVsyXTtcclxuICAvLyBUT0RPOiBtYWtlIHRoaXMgY29tcGFyaXNvbiBjYXNlLWluc2Vuc2l0aXZlIG9uIHdpbmRvd3M/XHJcbiAgaWYgKGV4dCAmJiBmLnN1YnN0cigtMSAqIGV4dC5sZW5ndGgpID09PSBleHQpIHtcclxuICAgIGYgPSBmLnN1YnN0cigwLCBmLmxlbmd0aCAtIGV4dC5sZW5ndGgpO1xyXG4gIH1cclxuICByZXR1cm4gZjtcclxufTtcclxuXHJcblxyXG5wb3NpeC5leHRuYW1lID0gZnVuY3Rpb24ocGF0aCkge1xyXG4gIHJldHVybiBwb3NpeFNwbGl0UGF0aChwYXRoKVszXTtcclxufTtcclxuXHJcblxyXG5wb3NpeC5mb3JtYXQgPSBmdW5jdGlvbihwYXRoT2JqZWN0KSB7XHJcbiAgaWYgKCF1dGlsLmlzT2JqZWN0KHBhdGhPYmplY3QpKSB7XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG4gICAgICAgIFwiUGFyYW1ldGVyICdwYXRoT2JqZWN0JyBtdXN0IGJlIGFuIG9iamVjdCwgbm90IFwiICsgdHlwZW9mIHBhdGhPYmplY3RcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICB2YXIgcm9vdCA9IHBhdGhPYmplY3Qucm9vdCB8fCAnJztcclxuXHJcbiAgaWYgKCF1dGlsLmlzU3RyaW5nKHJvb3QpKSB7XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG4gICAgICAgIFwiJ3BhdGhPYmplY3Qucm9vdCcgbXVzdCBiZSBhIHN0cmluZyBvciB1bmRlZmluZWQsIG5vdCBcIiArXHJcbiAgICAgICAgdHlwZW9mIHBhdGhPYmplY3Qucm9vdFxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHZhciBkaXIgPSBwYXRoT2JqZWN0LmRpciA/IHBhdGhPYmplY3QuZGlyICsgcG9zaXguc2VwIDogJyc7XHJcbiAgdmFyIGJhc2UgPSBwYXRoT2JqZWN0LmJhc2UgfHwgJyc7XHJcbiAgcmV0dXJuIGRpciArIGJhc2U7XHJcbn07XHJcblxyXG5cclxucG9zaXgucGFyc2UgPSBmdW5jdGlvbihwYXRoU3RyaW5nKSB7XHJcbiAgaWYgKCF1dGlsLmlzU3RyaW5nKHBhdGhTdHJpbmcpKSB7XHJcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxyXG4gICAgICAgIFwiUGFyYW1ldGVyICdwYXRoU3RyaW5nJyBtdXN0IGJlIGEgc3RyaW5nLCBub3QgXCIgKyB0eXBlb2YgcGF0aFN0cmluZ1xyXG4gICAgKTtcclxuICB9XHJcbiAgdmFyIGFsbFBhcnRzID0gcG9zaXhTcGxpdFBhdGgocGF0aFN0cmluZyk7XHJcbiAgaWYgKCFhbGxQYXJ0cyB8fCBhbGxQYXJ0cy5sZW5ndGggIT09IDQpIHtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIHBhdGggJ1wiICsgcGF0aFN0cmluZyArIFwiJ1wiKTtcclxuICB9XHJcbiAgYWxsUGFydHNbMV0gPSBhbGxQYXJ0c1sxXSB8fCAnJztcclxuICBhbGxQYXJ0c1syXSA9IGFsbFBhcnRzWzJdIHx8ICcnO1xyXG4gIGFsbFBhcnRzWzNdID0gYWxsUGFydHNbM10gfHwgJyc7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICByb290OiBhbGxQYXJ0c1swXSxcclxuICAgIGRpcjogYWxsUGFydHNbMF0gKyBhbGxQYXJ0c1sxXS5zbGljZSgwLCAtMSksXHJcbiAgICBiYXNlOiBhbGxQYXJ0c1syXSxcclxuICAgIGV4dDogYWxsUGFydHNbM10sXHJcbiAgICBuYW1lOiBhbGxQYXJ0c1syXS5zbGljZSgwLCBhbGxQYXJ0c1syXS5sZW5ndGggLSBhbGxQYXJ0c1szXS5sZW5ndGgpXHJcbiAgfTtcclxufTtcclxuXHJcblxyXG5wb3NpeC5zZXAgPSAnLyc7XHJcbnBvc2l4LmRlbGltaXRlciA9ICc6JztcclxuXHJcblxyXG5pZiAoaXNXaW5kb3dzKVxyXG4gIG1vZHVsZS5leHBvcnRzID0gd2luMzI7XHJcbmVsc2UgLyogcG9zaXggKi9cclxuICBtb2R1bGUuZXhwb3J0cyA9IHBvc2l4O1xyXG5cclxubW9kdWxlLmV4cG9ydHMucG9zaXggPSBwb3NpeDtcclxubW9kdWxlLmV4cG9ydHMud2luMzIgPSB3aW4zMjtcclxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kTGlzdGVuZXIgPSBub29wO1xucHJvY2Vzcy5wcmVwZW5kT25jZUxpc3RlbmVyID0gbm9vcDtcblxucHJvY2Vzcy5saXN0ZW5lcnMgPSBmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gW10gfVxuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHRpZihfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdKSB7XG5cdFx0cmV0dXJuIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0uZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5nID0gKGZ1bmN0aW9uKCkge1xuXHRpZiAodHlwZW9mIGdsb2JhbFRoaXMgPT09ICdvYmplY3QnKSByZXR1cm4gZ2xvYmFsVGhpcztcblx0dHJ5IHtcblx0XHRyZXR1cm4gdGhpcyB8fCBuZXcgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdGlmICh0eXBlb2Ygd2luZG93ID09PSAnb2JqZWN0JykgcmV0dXJuIHdpbmRvdztcblx0fVxufSkoKTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20pIHtcclxuICAgIGZvciAodmFyIGkgPSAwLCBpbCA9IGZyb20ubGVuZ3RoLCBqID0gdG8ubGVuZ3RoOyBpIDwgaWw7IGkrKywgaisrKVxyXG4gICAgICAgIHRvW2pdID0gZnJvbVtpXTtcclxuICAgIHJldHVybiB0bztcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXQodikge1xyXG4gICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jR2VuZXJhdG9yKHRoaXNBcmcsIF9hcmd1bWVudHMsIGdlbmVyYXRvcikge1xyXG4gICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaWYgKGdbbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKGEsIGIpIHsgcS5wdXNoKFtuLCB2LCBhLCBiXSkgPiAxIHx8IHJlc3VtZShuLCB2KTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSBcInJldHVyblwiIH0gOiBmID8gZih2KSA6IHY7IH0gOiBmOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2FzeW5jVmFsdWVzKG8pIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpO1xyXG4gICAgcmV0dXJuIG0gPyBtLmNhbGwobykgOiAobyA9IHR5cGVvZiBfX3ZhbHVlcyA9PT0gXCJmdW5jdGlvblwiID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIpLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlbbl0gPSBvW25dICYmIGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IHYgPSBvW25dKHYpLCBzZXR0bGUocmVzb2x2ZSwgcmVqZWN0LCB2LmRvbmUsIHYudmFsdWUpOyB9KTsgfTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgZCwgdikgeyBQcm9taXNlLnJlc29sdmUodikudGhlbihmdW5jdGlvbih2KSB7IHJlc29sdmUoeyB2YWx1ZTogdiwgZG9uZTogZCB9KTsgfSwgcmVqZWN0KTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHtcclxuICAgIGlmIChPYmplY3QuZGVmaW5lUHJvcGVydHkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvb2tlZCwgXCJyYXdcIiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9XHJcbiAgICByZXR1cm4gY29va2VkO1xyXG59O1xyXG5cclxudmFyIF9fc2V0TW9kdWxlRGVmYXVsdCA9IE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgdikge1xyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIFwiZGVmYXVsdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIHZhbHVlOiB2IH0pO1xyXG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIG9bXCJkZWZhdWx0XCJdID0gdjtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydFN0YXIobW9kKSB7XHJcbiAgICBpZiAobW9kICYmIG1vZC5fX2VzTW9kdWxlKSByZXR1cm4gbW9kO1xyXG4gICAgdmFyIHJlc3VsdCA9IHt9O1xyXG4gICAgaWYgKG1vZCAhPSBudWxsKSBmb3IgKHZhciBrIGluIG1vZCkgaWYgKGsgIT09IFwiZGVmYXVsdFwiICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChtb2QsIGspKSBfX2NyZWF0ZUJpbmRpbmcocmVzdWx0LCBtb2QsIGspO1xyXG4gICAgX19zZXRNb2R1bGVEZWZhdWx0KHJlc3VsdCwgbW9kKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2ltcG9ydERlZmF1bHQobW9kKSB7XHJcbiAgICByZXR1cm4gKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgPyBtb2QgOiB7IGRlZmF1bHQ6IG1vZCB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19jbGFzc1ByaXZhdGVGaWVsZEdldChyZWNlaXZlciwgcHJpdmF0ZU1hcCkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIGdldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcml2YXRlTWFwLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBwcml2YXRlTWFwLCB2YWx1ZSkge1xyXG4gICAgaWYgKCFwcml2YXRlTWFwLmhhcyhyZWNlaXZlcikpIHtcclxuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiYXR0ZW1wdGVkIHRvIHNldCBwcml2YXRlIGZpZWxkIG9uIG5vbi1pbnN0YW5jZVwiKTtcclxuICAgIH1cclxuICAgIHByaXZhdGVNYXAuc2V0KHJlY2VpdmVyLCB2YWx1ZSk7XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbn1cclxuIiwiLyoqXG4gKiBTb3VyY2U6IGZ0cDovL2Z0cC51bmljb2RlLm9yZy9QdWJsaWMvVUNEL2xhdGVzdC91Y2QvU3BlY2lhbENhc2luZy50eHRcbiAqL1xudmFyIFNVUFBPUlRFRF9MT0NBTEUgPSB7XG4gICAgdHI6IHtcbiAgICAgICAgcmVnZXhwOiAvXFx1MDEzMHxcXHUwMDQ5fFxcdTAwNDlcXHUwMzA3L2csXG4gICAgICAgIG1hcDoge1xuICAgICAgICAgICAgxLA6IFwiXFx1MDA2OVwiLFxuICAgICAgICAgICAgSTogXCJcXHUwMTMxXCIsXG4gICAgICAgICAgICBJzIc6IFwiXFx1MDA2OVwiLFxuICAgICAgICB9LFxuICAgIH0sXG4gICAgYXo6IHtcbiAgICAgICAgcmVnZXhwOiAvXFx1MDEzMC9nLFxuICAgICAgICBtYXA6IHtcbiAgICAgICAgICAgIMSwOiBcIlxcdTAwNjlcIixcbiAgICAgICAgICAgIEk6IFwiXFx1MDEzMVwiLFxuICAgICAgICAgICAgScyHOiBcIlxcdTAwNjlcIixcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIGx0OiB7XG4gICAgICAgIHJlZ2V4cDogL1xcdTAwNDl8XFx1MDA0QXxcXHUwMTJFfFxcdTAwQ0N8XFx1MDBDRHxcXHUwMTI4L2csXG4gICAgICAgIG1hcDoge1xuICAgICAgICAgICAgSTogXCJcXHUwMDY5XFx1MDMwN1wiLFxuICAgICAgICAgICAgSjogXCJcXHUwMDZBXFx1MDMwN1wiLFxuICAgICAgICAgICAgxK46IFwiXFx1MDEyRlxcdTAzMDdcIixcbiAgICAgICAgICAgIMOMOiBcIlxcdTAwNjlcXHUwMzA3XFx1MDMwMFwiLFxuICAgICAgICAgICAgw406IFwiXFx1MDA2OVxcdTAzMDdcXHUwMzAxXCIsXG4gICAgICAgICAgICDEqDogXCJcXHUwMDY5XFx1MDMwN1xcdTAzMDNcIixcbiAgICAgICAgfSxcbiAgICB9LFxufTtcbi8qKlxuICogTG9jYWxpemVkIGxvd2VyIGNhc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2NhbGVMb3dlckNhc2Uoc3RyLCBsb2NhbGUpIHtcbiAgICB2YXIgbGFuZyA9IFNVUFBPUlRFRF9MT0NBTEVbbG9jYWxlLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmIChsYW5nKVxuICAgICAgICByZXR1cm4gbG93ZXJDYXNlKHN0ci5yZXBsYWNlKGxhbmcucmVnZXhwLCBmdW5jdGlvbiAobSkgeyByZXR1cm4gbGFuZy5tYXBbbV07IH0pKTtcbiAgICByZXR1cm4gbG93ZXJDYXNlKHN0cik7XG59XG4vKipcbiAqIExvd2VyIGNhc2UgYXMgYSBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvd2VyQ2FzZShzdHIpIHtcbiAgICByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBsb3dlckNhc2UgfSBmcm9tIFwibG93ZXItY2FzZVwiO1xuLy8gU3VwcG9ydCBjYW1lbCBjYXNlIChcImNhbWVsQ2FzZVwiIC0+IFwiY2FtZWwgQ2FzZVwiIGFuZCBcIkNBTUVMQ2FzZVwiIC0+IFwiQ0FNRUwgQ2FzZVwiKS5cbnZhciBERUZBVUxUX1NQTElUX1JFR0VYUCA9IFsvKFthLXowLTldKShbQS1aXSkvZywgLyhbQS1aXSkoW0EtWl1bYS16XSkvZ107XG4vLyBSZW1vdmUgYWxsIG5vbi13b3JkIGNoYXJhY3RlcnMuXG52YXIgREVGQVVMVF9TVFJJUF9SRUdFWFAgPSAvW15BLVowLTldKy9naTtcbi8qKlxuICogTm9ybWFsaXplIHRoZSBzdHJpbmcgaW50byBzb21ldGhpbmcgb3RoZXIgbGlicmFyaWVzIGNhbiBtYW5pcHVsYXRlIGVhc2llci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vQ2FzZShpbnB1dCwgb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zID09PSB2b2lkIDApIHsgb3B0aW9ucyA9IHt9OyB9XG4gICAgdmFyIF9hID0gb3B0aW9ucy5zcGxpdFJlZ2V4cCwgc3BsaXRSZWdleHAgPSBfYSA9PT0gdm9pZCAwID8gREVGQVVMVF9TUExJVF9SRUdFWFAgOiBfYSwgX2IgPSBvcHRpb25zLnN0cmlwUmVnZXhwLCBzdHJpcFJlZ2V4cCA9IF9iID09PSB2b2lkIDAgPyBERUZBVUxUX1NUUklQX1JFR0VYUCA6IF9iLCBfYyA9IG9wdGlvbnMudHJhbnNmb3JtLCB0cmFuc2Zvcm0gPSBfYyA9PT0gdm9pZCAwID8gbG93ZXJDYXNlIDogX2MsIF9kID0gb3B0aW9ucy5kZWxpbWl0ZXIsIGRlbGltaXRlciA9IF9kID09PSB2b2lkIDAgPyBcIiBcIiA6IF9kO1xuICAgIHZhciByZXN1bHQgPSByZXBsYWNlKHJlcGxhY2UoaW5wdXQsIHNwbGl0UmVnZXhwLCBcIiQxXFwwJDJcIiksIHN0cmlwUmVnZXhwLCBcIlxcMFwiKTtcbiAgICB2YXIgc3RhcnQgPSAwO1xuICAgIHZhciBlbmQgPSByZXN1bHQubGVuZ3RoO1xuICAgIC8vIFRyaW0gdGhlIGRlbGltaXRlciBmcm9tIGFyb3VuZCB0aGUgb3V0cHV0IHN0cmluZy5cbiAgICB3aGlsZSAocmVzdWx0LmNoYXJBdChzdGFydCkgPT09IFwiXFwwXCIpXG4gICAgICAgIHN0YXJ0Kys7XG4gICAgd2hpbGUgKHJlc3VsdC5jaGFyQXQoZW5kIC0gMSkgPT09IFwiXFwwXCIpXG4gICAgICAgIGVuZC0tO1xuICAgIC8vIFRyYW5zZm9ybSBlYWNoIHRva2VuIGluZGVwZW5kZW50bHkuXG4gICAgcmV0dXJuIHJlc3VsdC5zbGljZShzdGFydCwgZW5kKS5zcGxpdChcIlxcMFwiKS5tYXAodHJhbnNmb3JtKS5qb2luKGRlbGltaXRlcik7XG59XG4vKipcbiAqIFJlcGxhY2UgYHJlYCBpbiB0aGUgaW5wdXQgc3RyaW5nIHdpdGggdGhlIHJlcGxhY2VtZW50IHZhbHVlLlxuICovXG5mdW5jdGlvbiByZXBsYWNlKGlucHV0LCByZSwgdmFsdWUpIHtcbiAgICBpZiAocmUgaW5zdGFuY2VvZiBSZWdFeHApXG4gICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKHJlLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHJlLnJlZHVjZShmdW5jdGlvbiAoaW5wdXQsIHJlKSB7IHJldHVybiBpbnB1dC5yZXBsYWNlKHJlLCB2YWx1ZSk7IH0sIGlucHV0KTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBkb3RDYXNlIH0gZnJvbSBcImRvdC1jYXNlXCI7XG5leHBvcnQgZnVuY3Rpb24gc25ha2VDYXNlKGlucHV0LCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH1cbiAgICByZXR1cm4gZG90Q2FzZShpbnB1dCwgX19hc3NpZ24oeyBkZWxpbWl0ZXI6IFwiX1wiIH0sIG9wdGlvbnMpKTtcbn1cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsImltcG9ydCB7IF9fYXNzaWduIH0gZnJvbSBcInRzbGliXCI7XG5pbXBvcnQgeyBub0Nhc2UgfSBmcm9tIFwibm8tY2FzZVwiO1xuZXhwb3J0IGZ1bmN0aW9uIGRvdENhc2UoaW5wdXQsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7IG9wdGlvbnMgPSB7fTsgfVxuICAgIHJldHVybiBub0Nhc2UoaW5wdXQsIF9fYXNzaWduKHsgZGVsaW1pdGVyOiBcIi5cIiB9LCBvcHRpb25zKSk7XG59XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCJpbXBvcnQgeyBzbmFrZUNhc2UgfSBmcm9tICdzbmFrZS1jYXNlJztcbmV4cG9ydCBmdW5jdGlvbiBpc09iamVjdChpdGVtKSB7XG4gICAgcmV0dXJuIChpdGVtID09PSBPYmplY3QoaXRlbSkgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSkpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlZXBNZXJnZSh0YXJnZXQsIC4uLnNvdXJjZXMpIHtcbiAgICAvLyByZXR1cm4gdGhlIHRhcmdldCBpZiBubyBzb3VyY2VzIHBhc3NlZFxuICAgIGlmICghc291cmNlcy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gdGFyZ2V0O1xuICAgIGlmIChpc09iamVjdChyZXN1bHQpKSB7XG4gICAgICAgIGNvbnN0IGxlbiA9IHNvdXJjZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgICBjb25zdCBlbG0gPSBzb3VyY2VzW2ldO1xuICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGVsbSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbG0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsbS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QoZWxtW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRba2V5XSB8fCAhaXNPYmplY3QocmVzdWx0W2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBNZXJnZShyZXN1bHRba2V5XSwgZWxtW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzdWx0W2tleV0pICYmIEFycmF5LmlzQXJyYXkoZWxtW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbmNhdGVuYXRlIHRoZSB0d28gYXJyYXlzIGFuZCByZW1vdmUgYW55IGR1cGxpY2F0ZSBwcmltaXRpdmUgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gQXJyYXkuZnJvbShuZXcgU2V0KHJlc3VsdFtrZXldLmNvbmNhdChlbG1ba2V5XSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtrZXldID0gZWxtW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2VuSUQoKSB7XG4gICAgLy8gTWF0aC5yYW5kb20gc2hvdWxkIGJlIHVuaXF1ZSBiZWNhdXNlIG9mIGl0cyBzZWVkaW5nIGFsZ29yaXRobS5cbiAgICAvLyBDb252ZXJ0IGl0IHRvIGJhc2UgMzYgKG51bWJlcnMgKyBsZXR0ZXJzKSwgYW5kIGdyYWIgdGhlIGZpcnN0IDkgY2hhcmFjdGVyc1xuICAgIC8vIGFmdGVyIHRoZSBkZWNpbWFsLlxuICAgIHJldHVybiAnXycgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdWNGaXJzdChzdHIpIHtcbiAgICByZXR1cm4gc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhGaWxlUHJvdG9jb2wocGF0aCkge1xuICAgIGlmICghcGF0aClcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIGNvbnN0IHJlZyA9IC9eKGh0dHB8ZmlsZXxhc3NldHMpLztcbiAgICBpZiAoIXJlZy50ZXN0KHBhdGgpKSB7XG4gICAgICAgIHBhdGggPSAnZmlsZTovLycgKyBwYXRoO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aDtcbn1cbi8qKlxuICogQHBhcmFtIHRpbWVvdXQgbWlsbGlzZWNvbmRzXG4gKiBAcGFyYW0gdGFnIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmZXJyZWQodGltZW91dCwgdGFnKSB7XG4gICAgbGV0IHJlc29sdmUsIHJlamVjdDtcbiAgICBsZXQgc2V0dGxlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHRpbWVGbiA9IChyKSA9PiB7XG4gICAgICAgIHJldHVybiAodikgPT4ge1xuICAgICAgICAgICAgdGltZW91dCAmJiBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgICByKHYpO1xuICAgICAgICAgICAgc2V0dGxlZCA9IHRydWU7XG4gICAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUxLCByZWplY3QxKSA9PiB7XG4gICAgICAgIHJlc29sdmUgPSB0aW1lRm4ocmVzb2x2ZTEpO1xuICAgICAgICByZWplY3QgPSB0aW1lRm4ocmVqZWN0MSk7XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiByZWplY3QobmV3IEVycm9yKGBbZGVmZXJyZWQgdGltZW91dF0gJHt0YWd9YCkpLCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIGNyZWF0ZWQ6IERhdGUubm93KCksXG4gICAgICAgIHNldFRhZzogKHQpID0+IHRhZyA9IHQsXG4gICAgICAgIHJlc29sdmUsIHJlamVjdCwgcHJvbWlzZSxcbiAgICAgICAgZ2V0IHNldHRsZWQoKSB7XG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlZDtcbiAgICAgICAgfVxuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gaW52b2tlSG9zdEV4cG9ydGVkQXBpKG1ldGhvZCwgLi4uYXJncykge1xuICAgIGNvbnN0IG1ldGhvZDEgPSBzbmFrZUNhc2UobWV0aG9kKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgbG9nc2VxSG9zdEV4cG9ydGVkQXBpID0gd2luZG93LmxvZ3NlcT8uYXBpIHx8IHt9O1xuICAgIGNvbnN0IGZuID0gbG9nc2VxSG9zdEV4cG9ydGVkQXBpW21ldGhvZDFdIHx8IHdpbmRvdy5hcGlzW21ldGhvZDFdIHx8XG4gICAgICAgIGxvZ3NlcUhvc3RFeHBvcnRlZEFwaVttZXRob2RdIHx8IHdpbmRvdy5hcGlzW21ldGhvZF07XG4gICAgaWYgKCFmbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdCBleGlzdGVkIG1ldGhvZCAjJHttZXRob2R9YCk7XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicgPyBmbiA6IGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSWZyYW1lU2FuZGJveChwcm9wcywgdGFyZ2V0KSB7XG4gICAgY29uc3QgaWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaWZyYW1lJyk7XG4gICAgaWZyYW1lLmNsYXNzTGlzdC5hZGQoJ2xzcC1pZnJhbWUtc2FuZGJveCcpO1xuICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgaWZyYW1lLnNldEF0dHJpYnV0ZShrLCB2KTtcbiAgICB9KTtcbiAgICB0YXJnZXQuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSW5qZWN0ZWRTdHlsZShzdHlsZSwgYXR0cnMpIHtcbiAgICBjb25zdCBrZXkgPSBhdHRyc1snZGF0YS1pbmplY3RlZC1zdHlsZSddO1xuICAgIGxldCBlbCA9IGtleSAmJiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pbmplY3RlZC1zdHlsZT0ke2tleX1dYCk7XG4gICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLnRleHRDb250ZW50ID0gc3R5bGU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgIGVsLnRleHRDb250ZW50ID0gc3R5bGU7XG4gICAgYXR0cnMgJiYgT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgfSk7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmQoZWwpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0dXBJbmplY3RlZFVJKHVpLCBhdHRycykge1xuICAgIGNvbnN0IHBsID0gdGhpcztcbiAgICBsZXQgc2VsZWN0b3IgPSAnJztcbiAgICBpZiAoJ3Nsb3QnIGluIHVpKSB7XG4gICAgICAgIHNlbGVjdG9yID0gYCMke3VpLnNsb3R9YDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHNlbGVjdG9yID0gdWkucGF0aDtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gc2VsZWN0b3IgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgJHt0aGlzLmRlYnVnVGFnfSBjYW4gbm90IHJlc29sdmUgc2VsZWN0b3IgdGFyZ2V0ICR7c2VsZWN0b3J9YCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qga2V5ID0gYCR7dWkua2V5fS0ke3BsLmlkfWA7XG4gICAgbGV0IGVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgZGl2W2RhdGEtaW5qZWN0ZWQtdWk9XCIke2tleX1cIl1gKTtcbiAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwuaW5uZXJIVE1MID0gdWkudGVtcGxhdGU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbC5kYXRhc2V0LmluamVjdGVkVWkgPSBrZXkgfHwgJyc7XG4gICAgLy8gVE9ETzogU3VwcG9ydCBtb3JlXG4gICAgZWwuaW5uZXJIVE1MID0gdWkudGVtcGxhdGU7XG4gICAgYXR0cnMgJiYgT2JqZWN0LmVudHJpZXMoYXR0cnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgfSk7XG4gICAgdGFyZ2V0LmFwcGVuZENoaWxkKGVsKTtcbiAgICAvLyBUT0RPOiBIb3cgaGFuZGxlIGV2ZW50c1xuICAgIFsnY2xpY2snLCAnZm9jdXMnLCAnZm9jdXNpbicsICdmb2N1c291dCcsICdibHVyJywgJ2RibGNsaWNrJyxcbiAgICAgICAgJ2tleXVwJywgJ2tleXByZXNzJywgJ2tleWRvd24nLCAnY2hhbmdlJywgJ2lucHV0J10uZm9yRWFjaCgodHlwZSkgPT4ge1xuICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKHR5cGUsIChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXIgPSB0YXJnZXQuY2xvc2VzdChgW2RhdGEtb24tJHt0eXBlfV1gKTtcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCBtc2dUeXBlID0gdHJpZ2dlci5kYXRhc2V0W2BvbiR7dWNGaXJzdCh0eXBlKX1gXTtcbiAgICAgICAgICAgIG1zZ1R5cGUgJiYgcGwuY2FsbGVyPy5jYWxsVXNlck1vZGVsKG1zZ1R5cGUsIHRyYW5zZm9ybWFibGVFdmVudCh0cmlnZ2VyLCBlKSk7XG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICB9KTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZWwpO1xuICAgIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdHJhbnNmb3JtYWJsZUV2ZW50KHRhcmdldCwgZSkge1xuICAgIGNvbnN0IG9iaiA9IHt9O1xuICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgY29uc3QgZHMgPSB0YXJnZXQuZGF0YXNldDtcbiAgICAgICAgY29uc3QgRkxBR19SRUNUID0gJ3JlY3QnO1xuICAgICAgICBbJ3ZhbHVlJywgJ2lkJywgJ2NsYXNzTmFtZScsXG4gICAgICAgICAgICAnZGF0YXNldCcsIEZMQUdfUkVDVFxuICAgICAgICBdLmZvckVhY2goKGspID0+IHtcbiAgICAgICAgICAgIGxldCB2O1xuICAgICAgICAgICAgc3dpdGNoIChrKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBGTEFHX1JFQ1Q6XG4gICAgICAgICAgICAgICAgICAgIGlmICghZHMuaGFzT3duUHJvcGVydHkoRkxBR19SRUNUKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgdiA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b0pTT04oKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgdiA9IHRhcmdldFtrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICB2ID0geyAuLi52IH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvYmpba10gPSB2O1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn1cbmxldCBpbmplY3RlZFRoZW1lRWZmZWN0ID0gbnVsbDtcbmV4cG9ydCBmdW5jdGlvbiBzZXR1cEluamVjdGVkVGhlbWUodXJsKSB7XG4gICAgaW5qZWN0ZWRUaGVtZUVmZmVjdD8uY2FsbCgpO1xuICAgIGlmICghdXJsKVxuICAgICAgICByZXR1cm47XG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcbiAgICBsaW5rLnJlbCA9ICdzdHlsZXNoZWV0JztcbiAgICBsaW5rLmhyZWYgPSB1cmw7XG4gICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsaW5rKTtcbiAgICByZXR1cm4gKGluamVjdGVkVGhlbWVFZmZlY3QgPSAoKSA9PiB7XG4gICAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQobGluayk7XG4gICAgICAgIGluamVjdGVkVGhlbWVFZmZlY3QgPSBudWxsO1xuICAgIH0pO1xufVxuIiwiLyoqXG4gIHBvc3RtYXRlIC0gQSBwb3dlcmZ1bCwgc2ltcGxlLCBwcm9taXNlLWJhc2VkIHBvc3RNZXNzYWdlIGxpYnJhcnlcbiAgQHZlcnNpb24gdjEuNS4yXG4gIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9kb2xsYXJzaGF2ZWNsdWIvcG9zdG1hdGVcbiAgQGF1dGhvciBKYWNvYiBLZWxsZXkgPGpha2llOEBnbWFpbC5jb20+XG4gIEBsaWNlbnNlIE1JVFxuKiovXG4vKipcbiAqIFRoZSB0eXBlIG9mIG1lc3NhZ2VzIG91ciBmcmFtZXMgb3VyIHNlbmRpbmdcbiAqIEB0eXBlIHtTdHJpbmd9XG4gKi9cbnZhciBtZXNzYWdlVHlwZSA9ICdhcHBsaWNhdGlvbi94LXBvc3RtYXRlLXYxK2pzb24nO1xuLyoqXG4gKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYXR0ZW1wdHMgdG8gc2VuZCBhIGhhbmRzaGFrZSByZXF1ZXN0IHRvIHRoZSBwYXJlbnRcbiAqIEB0eXBlIHtOdW1iZXJ9XG4gKi9cblxudmFyIG1heEhhbmRzaGFrZVJlcXVlc3RzID0gNTtcbi8qKlxuICogQSB1bmlxdWUgbWVzc2FnZSBJRCB0aGF0IGlzIHVzZWQgdG8gZW5zdXJlIHJlc3BvbnNlcyBhcmUgc2VudCB0byB0aGUgY29ycmVjdCByZXF1ZXN0c1xuICogQHR5cGUge051bWJlcn1cbiAqL1xuXG52YXIgX21lc3NhZ2VJZCA9IDA7XG4vKipcbiAqIEluY3JlbWVudHMgYW5kIHJldHVybnMgYSBtZXNzYWdlIElEXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IEEgdW5pcXVlIElEIGZvciBhIG1lc3NhZ2VcbiAqL1xuXG52YXIgZ2VuZXJhdGVOZXdNZXNzYWdlSWQgPSBmdW5jdGlvbiBnZW5lcmF0ZU5ld01lc3NhZ2VJZCgpIHtcbiAgcmV0dXJuICsrX21lc3NhZ2VJZDtcbn07XG4vKipcbiAqIFBvc3RtYXRlIGxvZ2dpbmcgZnVuY3Rpb24gdGhhdCBlbmFibGVzL2Rpc2FibGVzIHZpYSBjb25maWdcbiAqIEBwYXJhbSAge09iamVjdH0gLi4uYXJncyBSZXN0IEFyZ3VtZW50c1xuICovXG5cbnZhciBsb2cgPSBmdW5jdGlvbiBsb2coKSB7XG4gIHZhciBfY29uc29sZTtcblxuICByZXR1cm4gUG9zdG1hdGUuZGVidWcgPyAoX2NvbnNvbGUgPSBjb25zb2xlKS5sb2cuYXBwbHkoX2NvbnNvbGUsIGFyZ3VtZW50cykgOiBudWxsO1xufTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1jb25zb2xlXG5cbi8qKlxuICogVGFrZXMgYSBVUkwgYW5kIHJldHVybnMgdGhlIG9yaWdpblxuICogQHBhcmFtICB7U3RyaW5nfSB1cmwgVGhlIGZ1bGwgVVJMIGJlaW5nIHJlcXVlc3RlZFxuICogQHJldHVybiB7U3RyaW5nfSAgICAgVGhlIFVSTHMgb3JpZ2luXG4gKi9cblxudmFyIHJlc29sdmVPcmlnaW4gPSBmdW5jdGlvbiByZXNvbHZlT3JpZ2luKHVybCkge1xuICB2YXIgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgYS5ocmVmID0gdXJsO1xuICB2YXIgcHJvdG9jb2wgPSBhLnByb3RvY29sLmxlbmd0aCA+IDQgPyBhLnByb3RvY29sIDogd2luZG93LmxvY2F0aW9uLnByb3RvY29sO1xuICB2YXIgaG9zdCA9IGEuaG9zdC5sZW5ndGggPyBhLnBvcnQgPT09ICc4MCcgfHwgYS5wb3J0ID09PSAnNDQzJyA/IGEuaG9zdG5hbWUgOiBhLmhvc3QgOiB3aW5kb3cubG9jYXRpb24uaG9zdDtcbiAgcmV0dXJuIGEub3JpZ2luIHx8IHByb3RvY29sICsgXCIvL1wiICsgaG9zdDtcbn07XG52YXIgbWVzc2FnZVR5cGVzID0ge1xuICBoYW5kc2hha2U6IDEsXG4gICdoYW5kc2hha2UtcmVwbHknOiAxLFxuICBjYWxsOiAxLFxuICBlbWl0OiAxLFxuICByZXBseTogMSxcbiAgcmVxdWVzdDogMVxuICAvKipcbiAgICogRW5zdXJlcyB0aGF0IGEgbWVzc2FnZSBpcyBzYWZlIHRvIGludGVycHJldFxuICAgKiBAcGFyYW0gIHtPYmplY3R9IG1lc3NhZ2UgVGhlIHBvc3RtYXRlIG1lc3NhZ2UgYmVpbmcgc2VudFxuICAgKiBAcGFyYW0gIHtTdHJpbmd8Qm9vbGVhbn0gYWxsb3dlZE9yaWdpbiBUaGUgd2hpdGVsaXN0ZWQgb3JpZ2luIG9yIGZhbHNlIHRvIHNraXAgb3JpZ2luIGNoZWNrXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuXG59O1xudmFyIHNhbml0aXplID0gZnVuY3Rpb24gc2FuaXRpemUobWVzc2FnZSwgYWxsb3dlZE9yaWdpbikge1xuICBpZiAodHlwZW9mIGFsbG93ZWRPcmlnaW4gPT09ICdzdHJpbmcnICYmIG1lc3NhZ2Uub3JpZ2luICE9PSBhbGxvd2VkT3JpZ2luKSByZXR1cm4gZmFsc2U7XG4gIGlmICghbWVzc2FnZS5kYXRhKSByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgbWVzc2FnZS5kYXRhID09PSAnb2JqZWN0JyAmJiAhKCdwb3N0bWF0ZScgaW4gbWVzc2FnZS5kYXRhKSkgcmV0dXJuIGZhbHNlO1xuICBpZiAobWVzc2FnZS5kYXRhLnR5cGUgIT09IG1lc3NhZ2VUeXBlKSByZXR1cm4gZmFsc2U7XG4gIGlmICghbWVzc2FnZVR5cGVzW21lc3NhZ2UuZGF0YS5wb3N0bWF0ZV0pIHJldHVybiBmYWxzZTtcbiAgcmV0dXJuIHRydWU7XG59O1xuLyoqXG4gKiBUYWtlcyBhIG1vZGVsLCBhbmQgc2VhcmNoZXMgZm9yIGEgdmFsdWUgYnkgdGhlIHByb3BlcnR5XG4gKiBAcGFyYW0gIHtPYmplY3R9IG1vZGVsICAgICBUaGUgZGljdGlvbmFyeSB0byBzZWFyY2ggYWdhaW5zdFxuICogQHBhcmFtICB7U3RyaW5nfSBwcm9wZXJ0eSAgQSBwYXRoIHdpdGhpbiBhIGRpY3Rpb25hcnkgKGkuZS4gJ3dpbmRvdy5sb2NhdGlvbi5ocmVmJylcbiAqIEBwYXJhbSAge09iamVjdH0gZGF0YSAgICAgIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZnJvbSB0aGUgZ2V0IHJlcXVlc3QgdGhhdCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIGZ1bmN0aW9ucyBpbiB0aGUgY2hpbGQgbW9kZWxcbiAqIEByZXR1cm4ge1Byb21pc2V9XG4gKi9cblxudmFyIHJlc29sdmVWYWx1ZSA9IGZ1bmN0aW9uIHJlc29sdmVWYWx1ZShtb2RlbCwgcHJvcGVydHkpIHtcbiAgdmFyIHVud3JhcHBlZENvbnRleHQgPSB0eXBlb2YgbW9kZWxbcHJvcGVydHldID09PSAnZnVuY3Rpb24nID8gbW9kZWxbcHJvcGVydHldKCkgOiBtb2RlbFtwcm9wZXJ0eV07XG4gIHJldHVybiBQb3N0bWF0ZS5Qcm9taXNlLnJlc29sdmUodW53cmFwcGVkQ29udGV4dCk7XG59O1xuLyoqXG4gKiBDb21wb3NlcyBhbiBBUEkgdG8gYmUgdXNlZCBieSB0aGUgcGFyZW50XG4gKiBAcGFyYW0ge09iamVjdH0gaW5mbyBJbmZvcm1hdGlvbiBvbiB0aGUgY29uc3VtZXJcbiAqL1xuXG52YXIgUGFyZW50QVBJID1cbi8qI19fUFVSRV9fKi9cbmZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gUGFyZW50QVBJKGluZm8pIHtcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgdGhpcy5wYXJlbnQgPSBpbmZvLnBhcmVudDtcbiAgICB0aGlzLmZyYW1lID0gaW5mby5mcmFtZTtcbiAgICB0aGlzLmNoaWxkID0gaW5mby5jaGlsZDtcbiAgICB0aGlzLmNoaWxkT3JpZ2luID0gaW5mby5jaGlsZE9yaWdpbjtcbiAgICB0aGlzLmV2ZW50cyA9IHt9O1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGxvZygnUGFyZW50OiBSZWdpc3RlcmluZyBBUEknKTtcbiAgICAgIGxvZygnUGFyZW50OiBBd2FpdGluZyBtZXNzYWdlcy4uLicpO1xuICAgIH1cblxuICAgIHRoaXMubGlzdGVuZXIgPSBmdW5jdGlvbiAoZSkge1xuICAgICAgaWYgKCFzYW5pdGl6ZShlLCBfdGhpcy5jaGlsZE9yaWdpbikpIHJldHVybiBmYWxzZTtcbiAgICAgIC8qKlxuICAgICAgICogdGhlIGFzc2lnbm1lbnRzIGJlbG93IGVuc3VyZXMgdGhhdCBlLCBkYXRhLCBhbmQgdmFsdWUgYXJlIGFsbCBkZWZpbmVkXG4gICAgICAgKi9cblxuICAgICAgdmFyIF9yZWYgPSAoKGUgfHwge30pLmRhdGEgfHwge30pLnZhbHVlIHx8IHt9LFxuICAgICAgICAgIGRhdGEgPSBfcmVmLmRhdGEsXG4gICAgICAgICAgbmFtZSA9IF9yZWYubmFtZTtcblxuICAgICAgaWYgKGUuZGF0YS5wb3N0bWF0ZSA9PT0gJ2VtaXQnKSB7XG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgbG9nKFwiUGFyZW50OiBSZWNlaXZlZCBldmVudCBlbWlzc2lvbjogXCIgKyBuYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChuYW1lIGluIF90aGlzLmV2ZW50cykge1xuICAgICAgICAgIF90aGlzLmV2ZW50c1tuYW1lXS5jYWxsKF90aGlzLCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLnBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5saXN0ZW5lciwgZmFsc2UpO1xuXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgIGxvZygnUGFyZW50OiBBd2FpdGluZyBldmVudCBlbWlzc2lvbnMgZnJvbSBDaGlsZCcpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBfcHJvdG8gPSBQYXJlbnRBUEkucHJvdG90eXBlO1xuXG4gIF9wcm90by5nZXQgPSBmdW5jdGlvbiBnZXQocHJvcGVydHkpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUG9zdG1hdGUuUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgLy8gRXh0cmFjdCBkYXRhIGZyb20gcmVzcG9uc2UgYW5kIGtpbGwgbGlzdGVuZXJzXG4gICAgICB2YXIgdWlkID0gZ2VuZXJhdGVOZXdNZXNzYWdlSWQoKTtcblxuICAgICAgdmFyIHRyYW5zYWN0ID0gZnVuY3Rpb24gdHJhbnNhY3QoZSkge1xuICAgICAgICBpZiAoZS5kYXRhLnVpZCA9PT0gdWlkICYmIGUuZGF0YS5wb3N0bWF0ZSA9PT0gJ3JlcGx5Jykge1xuICAgICAgICAgIF90aGlzMi5wYXJlbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHRyYW5zYWN0LCBmYWxzZSk7XG5cbiAgICAgICAgICByZXNvbHZlKGUuZGF0YS52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07IC8vIFByZXBhcmUgZm9yIHJlc3BvbnNlIGZyb20gQ2hpbGQuLi5cblxuXG4gICAgICBfdGhpczIucGFyZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0cmFuc2FjdCwgZmFsc2UpOyAvLyBUaGVuIGFzayBjaGlsZCBmb3IgaW5mb3JtYXRpb25cblxuXG4gICAgICBfdGhpczIuY2hpbGQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBwb3N0bWF0ZTogJ3JlcXVlc3QnLFxuICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgcHJvcGVydHk6IHByb3BlcnR5LFxuICAgICAgICB1aWQ6IHVpZFxuICAgICAgfSwgX3RoaXMyLmNoaWxkT3JpZ2luKTtcbiAgICB9KTtcbiAgfTtcblxuICBfcHJvdG8uY2FsbCA9IGZ1bmN0aW9uIGNhbGwocHJvcGVydHksIGRhdGEpIHtcbiAgICAvLyBTZW5kIGluZm9ybWF0aW9uIHRvIHRoZSBjaGlsZFxuICAgIHRoaXMuY2hpbGQucG9zdE1lc3NhZ2Uoe1xuICAgICAgcG9zdG1hdGU6ICdjYWxsJyxcbiAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLFxuICAgICAgcHJvcGVydHk6IHByb3BlcnR5LFxuICAgICAgZGF0YTogZGF0YVxuICAgIH0sIHRoaXMuY2hpbGRPcmlnaW4pO1xuICB9O1xuXG4gIF9wcm90by5vbiA9IGZ1bmN0aW9uIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICB0aGlzLmV2ZW50c1tldmVudE5hbWVdID0gY2FsbGJhY2s7XG4gIH07XG5cbiAgX3Byb3RvLmRlc3Ryb3kgPSBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBsb2coJ1BhcmVudDogRGVzdHJveWluZyBQb3N0bWF0ZSBpbnN0YW5jZScpO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgdGhpcy5saXN0ZW5lciwgZmFsc2UpO1xuICAgIHRoaXMuZnJhbWUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmZyYW1lKTtcbiAgfTtcblxuICByZXR1cm4gUGFyZW50QVBJO1xufSgpO1xuLyoqXG4gKiBDb21wb3NlcyBhbiBBUEkgdG8gYmUgdXNlZCBieSB0aGUgY2hpbGRcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIEluZm9ybWF0aW9uIG9uIHRoZSBjb25zdW1lclxuICovXG5cbnZhciBDaGlsZEFQSSA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIENoaWxkQVBJKGluZm8pIHtcbiAgICB2YXIgX3RoaXMzID0gdGhpcztcblxuICAgIHRoaXMubW9kZWwgPSBpbmZvLm1vZGVsO1xuICAgIHRoaXMucGFyZW50ID0gaW5mby5wYXJlbnQ7XG4gICAgdGhpcy5wYXJlbnRPcmlnaW4gPSBpbmZvLnBhcmVudE9yaWdpbjtcbiAgICB0aGlzLmNoaWxkID0gaW5mby5jaGlsZDtcblxuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICBsb2coJ0NoaWxkOiBSZWdpc3RlcmluZyBBUEknKTtcbiAgICAgIGxvZygnQ2hpbGQ6IEF3YWl0aW5nIG1lc3NhZ2VzLi4uJyk7XG4gICAgfVxuXG4gICAgdGhpcy5jaGlsZC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgIGlmICghc2FuaXRpemUoZSwgX3RoaXMzLnBhcmVudE9yaWdpbikpIHJldHVybjtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgbG9nKCdDaGlsZDogUmVjZWl2ZWQgcmVxdWVzdCcsIGUuZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBfZSRkYXRhID0gZS5kYXRhLFxuICAgICAgICAgIHByb3BlcnR5ID0gX2UkZGF0YS5wcm9wZXJ0eSxcbiAgICAgICAgICB1aWQgPSBfZSRkYXRhLnVpZCxcbiAgICAgICAgICBkYXRhID0gX2UkZGF0YS5kYXRhO1xuXG4gICAgICBpZiAoZS5kYXRhLnBvc3RtYXRlID09PSAnY2FsbCcpIHtcbiAgICAgICAgaWYgKHByb3BlcnR5IGluIF90aGlzMy5tb2RlbCAmJiB0eXBlb2YgX3RoaXMzLm1vZGVsW3Byb3BlcnR5XSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIF90aGlzMy5tb2RlbFtwcm9wZXJ0eV0oZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9IC8vIFJlcGx5IHRvIFBhcmVudFxuXG5cbiAgICAgIHJlc29sdmVWYWx1ZShfdGhpczMubW9kZWwsIHByb3BlcnR5KS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZS5zb3VyY2UucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eSxcbiAgICAgICAgICBwb3N0bWF0ZTogJ3JlcGx5JyxcbiAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgICB1aWQ6IHVpZCxcbiAgICAgICAgICB2YWx1ZTogdmFsdWVcbiAgICAgICAgfSwgZS5vcmlnaW4pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgX3Byb3RvMiA9IENoaWxkQVBJLnByb3RvdHlwZTtcblxuICBfcHJvdG8yLmVtaXQgPSBmdW5jdGlvbiBlbWl0KG5hbWUsIGRhdGEpIHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgbG9nKFwiQ2hpbGQ6IEVtaXR0aW5nIEV2ZW50IFxcXCJcIiArIG5hbWUgKyBcIlxcXCJcIiwgZGF0YSk7XG4gICAgfVxuXG4gICAgdGhpcy5wYXJlbnQucG9zdE1lc3NhZ2Uoe1xuICAgICAgcG9zdG1hdGU6ICdlbWl0JyxcbiAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlLFxuICAgICAgdmFsdWU6IHtcbiAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgZGF0YTogZGF0YVxuICAgICAgfVxuICAgIH0sIHRoaXMucGFyZW50T3JpZ2luKTtcbiAgfTtcblxuICByZXR1cm4gQ2hpbGRBUEk7XG59KCk7XG4vKipcbiAgKiBUaGUgZW50cnkgcG9pbnQgb2YgdGhlIFBhcmVudC5cbiAqIEB0eXBlIHtDbGFzc31cbiAqL1xuXG52YXIgUG9zdG1hdGUgPVxuLyojX19QVVJFX18qL1xuZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gIC8vIEludGVybmV0IEV4cGxvcmVyIGNyYXBzIGl0c2VsZlxuXG4gIC8qKlxuICAgKiBTZXRzIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGFyZW50XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGVsZW1lbnQgdG8gaW5qZWN0IHRoZSBmcmFtZSBpbnRvLCBhbmQgdGhlIHVybFxuICAgKiBAcmV0dXJuIHtQcm9taXNlfVxuICAgKi9cbiAgZnVuY3Rpb24gUG9zdG1hdGUoX3JlZjIpIHtcbiAgICB2YXIgX3JlZjIkY29udGFpbmVyID0gX3JlZjIuY29udGFpbmVyLFxuICAgICAgICBjb250YWluZXIgPSBfcmVmMiRjb250YWluZXIgPT09IHZvaWQgMCA/IHR5cGVvZiBjb250YWluZXIgIT09ICd1bmRlZmluZWQnID8gY29udGFpbmVyIDogZG9jdW1lbnQuYm9keSA6IF9yZWYyJGNvbnRhaW5lcixcbiAgICAgICAgbW9kZWwgPSBfcmVmMi5tb2RlbCxcbiAgICAgICAgdXJsID0gX3JlZjIudXJsLFxuICAgICAgICBuYW1lID0gX3JlZjIubmFtZSxcbiAgICAgICAgX3JlZjIkY2xhc3NMaXN0QXJyYXkgPSBfcmVmMi5jbGFzc0xpc3RBcnJheSxcbiAgICAgICAgY2xhc3NMaXN0QXJyYXkgPSBfcmVmMiRjbGFzc0xpc3RBcnJheSA9PT0gdm9pZCAwID8gW10gOiBfcmVmMiRjbGFzc0xpc3RBcnJheTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmXG4gICAgdGhpcy5wYXJlbnQgPSB3aW5kb3c7XG4gICAgdGhpcy5mcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICAgIHRoaXMuZnJhbWUubmFtZSA9IG5hbWUgfHwgJyc7XG4gICAgdGhpcy5mcmFtZS5jbGFzc0xpc3QuYWRkLmFwcGx5KHRoaXMuZnJhbWUuY2xhc3NMaXN0LCBjbGFzc0xpc3RBcnJheSk7XG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUpO1xuICAgIHRoaXMuY2hpbGQgPSB0aGlzLmZyYW1lLmNvbnRlbnRXaW5kb3cgfHwgdGhpcy5mcmFtZS5jb250ZW50RG9jdW1lbnQucGFyZW50V2luZG93O1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbCB8fCB7fTtcbiAgICByZXR1cm4gdGhpcy5zZW5kSGFuZHNoYWtlKHVybCk7XG4gIH1cbiAgLyoqXG4gICAqIEJlZ2lucyB0aGUgaGFuZHNoYWtlIHN0cmF0ZWd5XG4gICAqIEBwYXJhbSAge1N0cmluZ30gdXJsIFRoZSBVUkwgdG8gc2VuZCBhIGhhbmRzaGFrZSByZXF1ZXN0IHRvXG4gICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaGFuZHNoYWtlIGlzIGNvbXBsZXRlXG4gICAqL1xuXG5cbiAgdmFyIF9wcm90bzMgPSBQb3N0bWF0ZS5wcm90b3R5cGU7XG5cbiAgX3Byb3RvMy5zZW5kSGFuZHNoYWtlID0gZnVuY3Rpb24gc2VuZEhhbmRzaGFrZSh1cmwpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIHZhciBjaGlsZE9yaWdpbiA9IHJlc29sdmVPcmlnaW4odXJsKTtcbiAgICB2YXIgYXR0ZW1wdCA9IDA7XG4gICAgdmFyIHJlc3BvbnNlSW50ZXJ2YWw7XG4gICAgcmV0dXJuIG5ldyBQb3N0bWF0ZS5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZXBseSA9IGZ1bmN0aW9uIHJlcGx5KGUpIHtcbiAgICAgICAgaWYgKCFzYW5pdGl6ZShlLCBjaGlsZE9yaWdpbikpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoZS5kYXRhLnBvc3RtYXRlID09PSAnaGFuZHNoYWtlLXJlcGx5Jykge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwocmVzcG9uc2VJbnRlcnZhbCk7XG5cbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCdQYXJlbnQ6IFJlY2VpdmVkIGhhbmRzaGFrZSByZXBseSBmcm9tIENoaWxkJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXM0LnBhcmVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcmVwbHksIGZhbHNlKTtcblxuICAgICAgICAgIF90aGlzNC5jaGlsZE9yaWdpbiA9IGUub3JpZ2luO1xuXG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGxvZygnUGFyZW50OiBTYXZpbmcgQ2hpbGQgb3JpZ2luJywgX3RoaXM0LmNoaWxkT3JpZ2luKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXcgUGFyZW50QVBJKF90aGlzNCkpO1xuICAgICAgICB9IC8vIE1pZ2h0IG5lZWQgdG8gcmVtb3ZlIHNpbmNlIHBhcmVudCBtaWdodCBiZSByZWNlaXZpbmcgZGlmZmVyZW50IG1lc3NhZ2VzXG4gICAgICAgIC8vIGZyb20gZGlmZmVyZW50IGhvc3RzXG5cblxuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgIGxvZygnUGFyZW50OiBJbnZhbGlkIGhhbmRzaGFrZSByZXBseScpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlamVjdCgnRmFpbGVkIGhhbmRzaGFrZScpO1xuICAgICAgfTtcblxuICAgICAgX3RoaXM0LnBhcmVudC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcmVwbHksIGZhbHNlKTtcblxuICAgICAgdmFyIGRvU2VuZCA9IGZ1bmN0aW9uIGRvU2VuZCgpIHtcbiAgICAgICAgYXR0ZW1wdCsrO1xuXG4gICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgbG9nKFwiUGFyZW50OiBTZW5kaW5nIGhhbmRzaGFrZSBhdHRlbXB0IFwiICsgYXR0ZW1wdCwge1xuICAgICAgICAgICAgY2hpbGRPcmlnaW46IGNoaWxkT3JpZ2luXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczQuY2hpbGQucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgIHBvc3RtYXRlOiAnaGFuZHNoYWtlJyxcbiAgICAgICAgICB0eXBlOiBtZXNzYWdlVHlwZSxcbiAgICAgICAgICBtb2RlbDogX3RoaXM0Lm1vZGVsXG4gICAgICAgIH0sIGNoaWxkT3JpZ2luKTtcblxuICAgICAgICBpZiAoYXR0ZW1wdCA9PT0gbWF4SGFuZHNoYWtlUmVxdWVzdHMpIHtcbiAgICAgICAgICBjbGVhckludGVydmFsKHJlc3BvbnNlSW50ZXJ2YWwpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgbG9hZGVkID0gZnVuY3Rpb24gbG9hZGVkKCkge1xuICAgICAgICBkb1NlbmQoKTtcbiAgICAgICAgcmVzcG9uc2VJbnRlcnZhbCA9IHNldEludGVydmFsKGRvU2VuZCwgNTAwKTtcbiAgICAgIH07XG5cbiAgICAgIGlmIChfdGhpczQuZnJhbWUuYXR0YWNoRXZlbnQpIHtcbiAgICAgICAgX3RoaXM0LmZyYW1lLmF0dGFjaEV2ZW50KCdvbmxvYWQnLCBsb2FkZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXM0LmZyYW1lLm9ubG9hZCA9IGxvYWRlZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgbG9nKCdQYXJlbnQ6IExvYWRpbmcgZnJhbWUnLCB7XG4gICAgICAgICAgdXJsOiB1cmxcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzNC5mcmFtZS5zcmMgPSB1cmw7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIFBvc3RtYXRlO1xufSgpO1xuLyoqXG4gKiBUaGUgZW50cnkgcG9pbnQgb2YgdGhlIENoaWxkXG4gKiBAdHlwZSB7Q2xhc3N9XG4gKi9cblxuXG5Qb3N0bWF0ZS5kZWJ1ZyA9IGZhbHNlO1xuXG5Qb3N0bWF0ZS5Qcm9taXNlID0gZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cgPyB3aW5kb3cuUHJvbWlzZSA6IFByb21pc2U7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufSgpO1xuXG5Qb3N0bWF0ZS5Nb2RlbCA9XG4vKiNfX1BVUkVfXyovXG5mdW5jdGlvbiAoKSB7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyB0aGUgY2hpbGQsIG1vZGVsLCBwYXJlbnQsIGFuZCByZXNwb25kcyB0byB0aGUgUGFyZW50cyBoYW5kc2hha2VcbiAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIEhhc2ggb2YgdmFsdWVzLCBmdW5jdGlvbnMsIG9yIHByb21pc2VzXG4gICAqIEByZXR1cm4ge1Byb21pc2V9ICAgICAgIFRoZSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgaGFuZHNoYWtlIGhhcyBiZWVuIHJlY2VpdmVkXG4gICAqL1xuICBmdW5jdGlvbiBNb2RlbChtb2RlbCkge1xuICAgIHRoaXMuY2hpbGQgPSB3aW5kb3c7XG4gICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgIHRoaXMucGFyZW50ID0gdGhpcy5jaGlsZC5wYXJlbnQ7XG4gICAgcmV0dXJuIHRoaXMuc2VuZEhhbmRzaGFrZVJlcGx5KCk7XG4gIH1cbiAgLyoqXG4gICAqIFJlc3BvbmRzIHRvIGEgaGFuZHNoYWtlIGluaXRpYXRlZCBieSB0aGUgUGFyZW50XG4gICAqIEByZXR1cm4ge1Byb21pc2V9IFJlc29sdmVzIGFuIG9iamVjdCB0aGF0IGV4cG9zZXMgYW4gQVBJIGZvciB0aGUgQ2hpbGRcbiAgICovXG5cblxuICB2YXIgX3Byb3RvNCA9IE1vZGVsLnByb3RvdHlwZTtcblxuICBfcHJvdG80LnNlbmRIYW5kc2hha2VSZXBseSA9IGZ1bmN0aW9uIHNlbmRIYW5kc2hha2VSZXBseSgpIHtcbiAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgIHJldHVybiBuZXcgUG9zdG1hdGUuUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICB2YXIgc2hha2UgPSBmdW5jdGlvbiBzaGFrZShlKSB7XG4gICAgICAgIGlmICghZS5kYXRhLnBvc3RtYXRlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGUuZGF0YS5wb3N0bWF0ZSA9PT0gJ2hhbmRzaGFrZScpIHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCdDaGlsZDogUmVjZWl2ZWQgaGFuZHNoYWtlIGZyb20gUGFyZW50Jyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgX3RoaXM1LmNoaWxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBzaGFrZSwgZmFsc2UpO1xuXG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAncHJvZHVjdGlvbicpIHtcbiAgICAgICAgICAgIGxvZygnQ2hpbGQ6IFNlbmRpbmcgaGFuZHNoYWtlIHJlcGx5IHRvIFBhcmVudCcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGUuc291cmNlLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHBvc3RtYXRlOiAnaGFuZHNoYWtlLXJlcGx5JyxcbiAgICAgICAgICAgIHR5cGU6IG1lc3NhZ2VUeXBlXG4gICAgICAgICAgfSwgZS5vcmlnaW4pO1xuICAgICAgICAgIF90aGlzNS5wYXJlbnRPcmlnaW4gPSBlLm9yaWdpbjsgLy8gRXh0ZW5kIG1vZGVsIHdpdGggdGhlIG9uZSBwcm92aWRlZCBieSB0aGUgcGFyZW50XG5cbiAgICAgICAgICB2YXIgZGVmYXVsdHMgPSBlLmRhdGEubW9kZWw7XG5cbiAgICAgICAgICBpZiAoZGVmYXVsdHMpIHtcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGRlZmF1bHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgICAgX3RoaXM1Lm1vZGVsW2tleV0gPSBkZWZhdWx0c1trZXldO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nKSB7XG4gICAgICAgICAgICAgIGxvZygnQ2hpbGQ6IEluaGVyaXRlZCBhbmQgZXh0ZW5kZWQgbW9kZWwgZnJvbSBQYXJlbnQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xuICAgICAgICAgICAgbG9nKCdDaGlsZDogU2F2aW5nIFBhcmVudCBvcmlnaW4nLCBfdGhpczUucGFyZW50T3JpZ2luKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcmVzb2x2ZShuZXcgQ2hpbGRBUEkoX3RoaXM1KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVqZWN0KCdIYW5kc2hha2UgUmVwbHkgRmFpbGVkJyk7XG4gICAgICB9O1xuXG4gICAgICBfdGhpczUuY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHNoYWtlLCBmYWxzZSk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIE1vZGVsO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBQb3N0bWF0ZTtcbiIsImltcG9ydCB7IGRlZXBNZXJnZSB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgeyBMU1BsdWdpbkNhbGxlciB9IGZyb20gJy4vTFNQbHVnaW4uY2FsbGVyJztcbmltcG9ydCBEZWJ1ZyBmcm9tICdkZWJ1Zyc7XG5pbXBvcnQgeyBzbmFrZUNhc2UgfSBmcm9tICdzbmFrZS1jYXNlJztcbmltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRlbWl0dGVyMyc7XG5jb25zdCBkZWJ1ZyA9IERlYnVnKCdMU1BsdWdpbjp1c2VyJyk7XG5jb25zdCBhcHAgPSB7XG4gICAgcmVnaXN0ZXJVSUl0ZW0odHlwZSwgb3B0cykge1xuICAgICAgICBjb25zdCBwaWQgPSB0aGlzLmJhc2VJbmZvLmlkO1xuICAgICAgICAvLyBvcHRzLmtleSA9IGAke3BpZH1fJHtvcHRzLmtleX1gXG4gICAgICAgIHRoaXMuY2FsbGVyPy5jYWxsKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3JlZ2lzdGVyLXBsdWdpbi11aS1pdGVtJyxcbiAgICAgICAgICAgIGFyZ3M6IFtwaWQsIHR5cGUsIG9wdHNdXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmxldCByZWdpc3RlcmVkQ21kVWlkID0gMDtcbmNvbnN0IGVkaXRvciA9IHtcbiAgICByZWdpc3RlclNsYXNoQ29tbWFuZCh0YWcsIGFjdGlvbnMpIHtcbiAgICAgICAgZGVidWcoJ1JlZ2lzdGVyIHNsYXNoIGNvbW1hbmQgIycsIHRoaXMuYmFzZUluZm8uaWQsIHRhZywgYWN0aW9ucyk7XG4gICAgICAgIGlmICh0eXBlb2YgYWN0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgYWN0aW9ucyA9IFtcbiAgICAgICAgICAgICAgICBbJ2VkaXRvci9jbGVhci1jdXJyZW50LXNsYXNoJywgZmFsc2VdLFxuICAgICAgICAgICAgICAgIFsnZWRpdG9yL3Jlc3RvcmUtc2F2ZWQtY3Vyc29yJ10sXG4gICAgICAgICAgICAgICAgWydlZGl0b3IvaG9vaycsIGFjdGlvbnNdXG4gICAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGFjdGlvbnMgPSBhY3Rpb25zLm1hcCgoaXQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IFt0YWcsIC4uLmFyZ3NdID0gaXQ7XG4gICAgICAgICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2VkaXRvci9ob29rJzpcbiAgICAgICAgICAgICAgICAgICAgbGV0IGtleSA9IGFyZ3NbMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBmbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGVyPy5jYWxsVXNlck1vZGVsKGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmbiA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBldmVudEtleSA9IGBTbGFzaENvbW1hbmRIb29rJHt0YWd9JHsrK3JlZ2lzdGVyZWRDbWRVaWR9YDtcbiAgICAgICAgICAgICAgICAgICAgaXRbMV0gPSBldmVudEtleTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgY29tbWFuZCBsaXN0ZW5lclxuICAgICAgICAgICAgICAgICAgICB0aGlzLkVkaXRvclsnb24nICsgZXZlbnRLZXldKGZuKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2FsbGVyPy5jYWxsKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3JlZ2lzdGVyLXBsdWdpbi1zbGFzaC1jb21tYW5kJyxcbiAgICAgICAgICAgIGFyZ3M6IFt0aGlzLmJhc2VJbmZvLmlkLCBbdGFnLCBhY3Rpb25zXV1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9LFxuICAgIHJlZ2lzdGVyQmxvY2tDb250ZXh0TWVudSh0YWcsIGFjdGlvbikge1xuICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGtleSA9IHRhZztcbiAgICAgICAgY29uc3QgbGFiZWwgPSB0YWc7XG4gICAgICAgIGNvbnN0IHR5cGUgPSAnYmxvY2stY29udGV4dC1tZW51JztcbiAgICAgICAgY29uc3QgZXZlbnRLZXkgPSBgU2ltcGxlQ29tbWFuZEhvb2ske3RhZ30keysrcmVnaXN0ZXJlZENtZFVpZH1gO1xuICAgICAgICB0aGlzLkVkaXRvclsnb24nICsgZXZlbnRLZXldKGFjdGlvbik7XG4gICAgICAgIHRoaXMuY2FsbGVyPy5jYWxsKGBhcGk6Y2FsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ3JlZ2lzdGVyLXBsdWdpbi1zaW1wbGUtY29tbWFuZCcsXG4gICAgICAgICAgICBhcmdzOiBbdGhpcy5iYXNlSW5mby5pZCwgW3sga2V5LCBsYWJlbCwgdHlwZSB9LCBbJ2VkaXRvci9ob29rJywgZXZlbnRLZXldXV1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn07XG5jb25zdCBkYiA9IHt9O1xuY29uc3QgS0VZX01BSU5fVUkgPSAwO1xuLyoqXG4gKiBVc2VyIHBsdWdpbiBpbnN0YW5jZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY2xhc3MgTFNQbHVnaW5Vc2VyIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gX2Jhc2VJbmZvXG4gICAgICogQHBhcmFtIF9jYWxsZXJcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3RvcihfYmFzZUluZm8sIF9jYWxsZXIpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fYmFzZUluZm8gPSBfYmFzZUluZm87XG4gICAgICAgIHRoaXMuX2NhbGxlciA9IF9jYWxsZXI7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICAgKi9cbiAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB1aSBmcmFtZSBpZGVudGl0aWVzXG4gICAgICAgICAqIEBwcml2YXRlXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLl91aSA9IG5ldyBNYXAoKTtcbiAgICAgICAgX2NhbGxlci5vbignc2V0dGluZ3M6Y2hhbmdlZCcsIChwYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zZXR0aW5ncyk7XG4gICAgICAgICAgICBjb25zdCBhID0gT2JqZWN0LmFzc2lnbih0aGlzLl9iYXNlSW5mby5zZXR0aW5ncywgcGF5bG9hZCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3NldHRpbmdzOmNoYW5nZWQnLCB7IC4uLmEgfSwgYik7XG4gICAgICAgIH0pO1xuICAgICAgICBfY2FsbGVyLm9uKCdiZWZvcmV1bmxvYWQnLCBhc3luYyAocGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBhY3RvciwgLi4ucmVzdCB9ID0gcGF5bG9hZDtcbiAgICAgICAgICAgIGNvbnN0IGNiID0gdGhpcy5fYmVmb3JldW5sb2FkQ2FsbGJhY2s7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNiICYmIGF3YWl0IGNiKHJlc3QpO1xuICAgICAgICAgICAgICAgIGFjdG9yPy5yZXNvbHZlKG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKGAke19jYWxsZXIuZGVidWdUYWd9IFtiZWZvcmV1bmxvYWRdIGAsIGUpO1xuICAgICAgICAgICAgICAgIGFjdG9yPy5yZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyByZWFkeShtb2RlbCwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbW9kZWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG1vZGVsO1xuICAgICAgICAgICAgICAgIG1vZGVsID0ge307XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgYmFzZUluZm8gPSBhd2FpdCB0aGlzLl9jYWxsZXIuY29ubmVjdFRvUGFyZW50KG1vZGVsKTtcbiAgICAgICAgICAgIGJhc2VJbmZvID0gZGVlcE1lcmdlKHRoaXMuX2Jhc2VJbmZvLCBiYXNlSW5mbyk7XG4gICAgICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGJhc2VJbmZvPy5pZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxlci5kZWJ1Z1RhZyA9IGAjJHtiYXNlSW5mby5pZH0gWyR7YmFzZUluZm8ubmFtZX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhbGxiYWNrICYmIGNhbGxiYWNrLmNhbGwodGhpcywgYmFzZUluZm8pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbTFNQbHVnaW4gUmVhZHkgRXJyb3JdJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYmVmb3JldW5sb2FkKGNhbGxiYWNrKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX2JlZm9yZXVubG9hZENhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgfVxuICAgIHByb3ZpZGVNb2RlbChtb2RlbCkge1xuICAgICAgICB0aGlzLmNhbGxlci5fZXh0ZW5kVXNlck1vZGVsKG1vZGVsKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHByb3ZpZGVUaGVtZSh0aGVtZSkge1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdwcm92aWRlcjp0aGVtZScsIHRoZW1lKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHByb3ZpZGVTdHlsZShzdHlsZSkge1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdwcm92aWRlcjpzdHlsZScsIHN0eWxlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHByb3ZpZGVVSSh1aSkge1xuICAgICAgICB0aGlzLmNhbGxlci5jYWxsKCdwcm92aWRlcjp1aScsIHVpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHVwZGF0ZVNldHRpbmdzKGF0dHJzKSB7XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ3NldHRpbmdzOnVwZGF0ZScsIGF0dHJzKTtcbiAgICAgICAgLy8gVE9ETzogdXBkYXRlIGFzc29jaWF0ZWQgYmFzZUluZm8gc2V0dGluZ3NcbiAgICB9XG4gICAgc2V0TWFpblVJQXR0cnMoYXR0cnMpIHtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgnbWFpbi11aTphdHRycycsIGF0dHJzKTtcbiAgICB9XG4gICAgc2V0TWFpblVJSW5saW5lU3R5bGUoc3R5bGUpIHtcbiAgICAgICAgdGhpcy5jYWxsZXIuY2FsbCgnbWFpbi11aTpzdHlsZScsIHN0eWxlKTtcbiAgICB9XG4gICAgaGlkZU1haW5VSShvcHRzKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IGtleTogS0VZX01BSU5fVUksIHZpc2libGU6IGZhbHNlLCBjdXJzb3I6IG9wdHM/LnJlc3RvcmVFZGl0aW5nQ3Vyc29yIH07XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ21haW4tdWk6dmlzaWJsZScsIHBheWxvYWQpO1xuICAgICAgICB0aGlzLmVtaXQoJ3VpOnZpc2libGU6Y2hhbmdlZCcsIHBheWxvYWQpO1xuICAgICAgICB0aGlzLl91aS5zZXQocGF5bG9hZC5rZXksIHBheWxvYWQpO1xuICAgIH1cbiAgICBzaG93TWFpblVJKCkge1xuICAgICAgICBjb25zdCBwYXlsb2FkID0geyBrZXk6IEtFWV9NQUlOX1VJLCB2aXNpYmxlOiB0cnVlIH07XG4gICAgICAgIHRoaXMuY2FsbGVyLmNhbGwoJ21haW4tdWk6dmlzaWJsZScsIHBheWxvYWQpO1xuICAgICAgICB0aGlzLmVtaXQoJ3VpOnZpc2libGU6Y2hhbmdlZCcsIHBheWxvYWQpO1xuICAgICAgICB0aGlzLl91aS5zZXQocGF5bG9hZC5rZXksIHBheWxvYWQpO1xuICAgIH1cbiAgICB0b2dnbGVNYWluVUkoKSB7XG4gICAgICAgIGNvbnN0IHBheWxvYWQgPSB7IGtleTogS0VZX01BSU5fVUksIHRvZ2dsZTogdHJ1ZSB9O1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3VpLmdldChwYXlsb2FkLmtleSk7XG4gICAgICAgIGlmIChzdGF0ZSAmJiBzdGF0ZS52aXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmhpZGVNYWluVUkoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd01haW5VSSgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldCBpc01haW5VSVZpc2libGUoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fdWkuZ2V0KDApO1xuICAgICAgICByZXR1cm4gQm9vbGVhbihzdGF0ZSAmJiBzdGF0ZS52aXNpYmxlKTtcbiAgICB9XG4gICAgZ2V0IGNvbm5lY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3RlZDtcbiAgICB9XG4gICAgZ2V0IGJhc2VJbmZvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYmFzZUluZm87XG4gICAgfVxuICAgIGdldCBzZXR0aW5ncygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZUluZm8/LnNldHRpbmdzO1xuICAgIH1cbiAgICBnZXQgY2FsbGVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsbGVyO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBfbWFrZVVzZXJQcm94eSh0YXJnZXQsIHRhZykge1xuICAgICAgICBjb25zdCB0aGF0ID0gdGhpcztcbiAgICAgICAgY29uc3QgY2FsbGVyID0gdGhpcy5jYWxsZXI7XG4gICAgICAgIHJldHVybiBuZXcgUHJveHkodGFyZ2V0LCB7XG4gICAgICAgICAgICBnZXQodGFyZ2V0LCBwcm9wS2V5LCByZWNlaXZlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdNZXRob2QgPSB0YXJnZXRbcHJvcEtleV07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcmlnTWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBvcmlnTWV0aG9kLmFwcGx5KHRoYXQsIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA9PT0gZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBob29rXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvb2tNYXRjaGVyID0gcHJvcEtleS50b1N0cmluZygpLm1hdGNoKC9eKG9uY2V8b2ZmfG9uKS9pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChob29rTWF0Y2hlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZiA9IGhvb2tNYXRjaGVyWzBdLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcyA9IGhvb2tNYXRjaGVyLmlucHV0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGUgPSBzLnNsaWNlKGYubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gYGhvb2s6JHt0YWd9OiR7c25ha2VDYXNlKGUpfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IGFyZ3NbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGVyW2ZdKHR5cGUsIGhhbmRsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmICE9PSAnb2ZmJyA/ICgpID0+IChjYWxsZXIub2ZmKHR5cGUsIGhhbmRsZXIpKSA6IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBDYWxsIGhvc3RcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxlci5jYWxsQXN5bmMoYGFwaTpjYWxsYCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiBwcm9wS2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnczogYXJnc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVGhlIGludGVyZmFjZSBtZXRob2RzIG9mIHtAbGluayBJQXBwUHJveHl9XG4gICAgICovXG4gICAgZ2V0IEFwcCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VVc2VyUHJveHkoYXBwLCAnYXBwJyk7XG4gICAgfVxuICAgIGdldCBFZGl0b3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWtlVXNlclByb3h5KGVkaXRvciwgJ2VkaXRvcicpO1xuICAgIH1cbiAgICBnZXQgREIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWtlVXNlclByb3h5KGRiKTtcbiAgICB9XG59XG5leHBvcnQgKiBmcm9tICcuL0xTUGx1Z2luJztcbi8qKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cFBsdWdpblVzZXJJbnN0YW5jZShwbHVnaW5CYXNlSW5mbywgcGx1Z2luQ2FsbGVyKSB7XG4gICAgcmV0dXJuIG5ldyBMU1BsdWdpblVzZXIocGx1Z2luQmFzZUluZm8sIHBsdWdpbkNhbGxlcik7XG59XG5pZiAod2luZG93Ll9fTFNQX19IT1NUX18gPT0gbnVsbCkgeyAvLyBFbnRyeSBvZiBpZnJhbWUgbW9kZVxuICAgIGNvbnN0IGNhbGxlciA9IG5ldyBMU1BsdWdpbkNhbGxlcihudWxsKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgd2luZG93LmxvZ3NlcSA9IHNldHVwUGx1Z2luVXNlckluc3RhbmNlKHt9LCBjYWxsZXIpO1xufVxuIiwiaW1wb3J0IEV2ZW50RW1pdHRlciBmcm9tICdldmVudGVtaXR0ZXIzJztcbmltcG9ydCB7IExTUGx1Z2luVXNlciB9IGZyb20gJy4vTFNQbHVnaW4udXNlcic7XG4vLyBAdHMtaWdub3JlXG5jb25zdCB7IGltcG9ydEhUTUwsIGNyZWF0ZVNhbmRib3hDb250YWluZXIgfSA9IHdpbmRvdy5RU2FuZGJveCB8fCB7fTtcbmZ1bmN0aW9uIHVzZXJGZXRjaCh1cmwsIG9wdHMpIHtcbiAgICBpZiAoIXVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgdXJsID0gdXJsLnJlcGxhY2UoJ2ZpbGU6Ly8nLCAnJyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB3aW5kb3cuYXBpcy5kb0FjdGlvbihbJ3JlYWRGaWxlJywgdXJsXSk7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgIHRleHQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiBmZXRjaCh1cmwsIG9wdHMpO1xufVxuY2xhc3MgTFNQbHVnaW5TaGFkb3dGcmFtZSBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX3BsdWdpbkxvY2FsKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX3BsdWdpbkxvY2FsID0gX3BsdWdpbkxvY2FsO1xuICAgICAgICB0aGlzLl9sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdW5tb3VudEZucyA9IFtdO1xuICAgICAgICBfcGx1Z2luTG9jYWwuX2Rpc3Bvc2UoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fdW5tb3VudCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgbG9hZCgpIHtcbiAgICAgICAgY29uc3QgeyBuYW1lLCBlbnRyeSB9ID0gdGhpcy5fcGx1Z2luTG9jYWwub3B0aW9ucztcbiAgICAgICAgaWYgKHRoaXMubG9hZGVkIHx8ICFlbnRyeSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgeyB0ZW1wbGF0ZSwgZXhlY1NjcmlwdHMgfSA9IGF3YWl0IGltcG9ydEhUTUwoZW50cnksIHsgZmV0Y2g6IHVzZXJGZXRjaCB9KTtcbiAgICAgICAgdGhpcy5fbW91bnQodGVtcGxhdGUsIGRvY3VtZW50LmJvZHkpO1xuICAgICAgICBjb25zdCBzYW5kYm94ID0gY3JlYXRlU2FuZGJveENvbnRhaW5lcihuYW1lLCB7XG4gICAgICAgICAgICBlbGVtZW50R2V0dGVyOiAoKSA9PiB0aGlzLl9yb290Py5maXJzdENoaWxkLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZ2xvYmFsID0gc2FuZGJveC5pbnN0YW5jZS5wcm94eTtcbiAgICAgICAgZ2xvYmFsLl9fc2hhZG93X21vZGVfXyA9IHRydWU7XG4gICAgICAgIGdsb2JhbC5MU1BsdWdpbkxvY2FsID0gdGhpcy5fcGx1Z2luTG9jYWw7XG4gICAgICAgIGdsb2JhbC5MU1BsdWdpblNoYWRvdyA9IHRoaXM7XG4gICAgICAgIGdsb2JhbC5MU1BsdWdpblVzZXIgPSBnbG9iYWwubG9nc2VxID0gbmV3IExTUGx1Z2luVXNlcih0aGlzLl9wbHVnaW5Mb2NhbC50b0pTT04oKSwgdGhpcy5fcGx1Z2luTG9jYWwuY2FsbGVyKTtcbiAgICAgICAgLy8gVE9ETzoge21vdW50LCB1bm1vdW50fVxuICAgICAgICBjb25zdCBleGVjUmVzdWx0ID0gYXdhaXQgZXhlY1NjcmlwdHMoZ2xvYmFsLCB0cnVlKTtcbiAgICAgICAgdGhpcy5fdW5tb3VudEZucy5wdXNoKGV4ZWNSZXN1bHQudW5tb3VudCk7XG4gICAgICAgIHRoaXMuX2xvYWRlZCA9IHRydWU7XG4gICAgfVxuICAgIF9tb3VudChjb250ZW50LCBjb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgZnJhbWUgPSB0aGlzLl9mcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBmcmFtZS5jbGFzc0xpc3QuYWRkKCdsc3Atc2hhZG93LXNhbmRib3gnKTtcbiAgICAgICAgZnJhbWUuaWQgPSB0aGlzLl9wbHVnaW5Mb2NhbC5pZDtcbiAgICAgICAgdGhpcy5fcm9vdCA9IGZyYW1lLmF0dGFjaFNoYWRvdyh7IG1vZGU6ICdvcGVuJyB9KTtcbiAgICAgICAgdGhpcy5fcm9vdC5pbm5lckhUTUwgPSBgPGRpdj4ke2NvbnRlbnR9PC9kaXY+YDtcbiAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGZyYW1lKTtcbiAgICAgICAgdGhpcy5lbWl0KCdtb3VudGVkJyk7XG4gICAgfVxuICAgIF91bm1vdW50KCkge1xuICAgICAgICBmb3IgKGNvbnN0IGZuIG9mIHRoaXMuX3VubW91bnRGbnMpIHtcbiAgICAgICAgICAgIGZuICYmIGZuLmNhbGwobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5mcmFtZT8ucGFyZW50Tm9kZT8ucmVtb3ZlQ2hpbGQodGhpcy5mcmFtZSk7XG4gICAgfVxuICAgIGdldCBsb2FkZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkZWQ7XG4gICAgfVxuICAgIGdldCBkb2N1bWVudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3Jvb3Q/LmZpcnN0Q2hpbGQ7XG4gICAgfVxuICAgIGdldCBmcmFtZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZyYW1lO1xuICAgIH1cbn1cbmV4cG9ydCB7IExTUGx1Z2luU2hhZG93RnJhbWUgfTtcbiIsImltcG9ydCBQb3N0bWF0ZSBmcm9tICdwb3N0bWF0ZSc7XG5pbXBvcnQgRXZlbnRFbWl0dGVyIGZyb20gJ2V2ZW50ZW1pdHRlcjMnO1xuaW1wb3J0IERlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IGRlZmVycmVkIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IExTUGx1Z2luU2hhZG93RnJhbWUgfSBmcm9tICcuL0xTUGx1Z2luLnNoYWRvdyc7XG5jb25zdCBkZWJ1ZyA9IERlYnVnKCdMU1BsdWdpbjpjYWxsZXInKTtcbmV4cG9ydCBjb25zdCBGTEFHX0FXQUlUID0gJyNhd2FpdCNyZXNwb25zZSMnO1xuZXhwb3J0IGNvbnN0IExTUE1TRyA9ICcjbHNwbXNnIyc7XG5leHBvcnQgY29uc3QgTFNQTVNHX0VSUk9SX1RBRyA9ICcjbHNwbXNnI2Vycm9yIyc7XG5leHBvcnQgY29uc3QgTFNQTVNHX1NFVFRJTkdTID0gJyNsc3Btc2cjc2V0dGluZ3MjJztcbmV4cG9ydCBjb25zdCBMU1BNU0dfQkVGT1JFX1VOTE9BRCA9ICcjbHNwbXNnI2JlZm9yZXVubG9hZCMnO1xuZXhwb3J0IGNvbnN0IExTUE1TR19TWU5DID0gJyNsc3Btc2cjcmVwbHkjJztcbmV4cG9ydCBjb25zdCBMU1BNU0dfUkVBRFkgPSAnI2xzcG1zZyNyZWFkeSMnO1xuZXhwb3J0IGNvbnN0IExTUE1TR0ZuID0gKGlkKSA9PiBgJHtMU1BNU0d9JHtpZH1gO1xuZXhwb3J0IGNvbnN0IEFXQUlUX0xTUE1TR0ZuID0gKGlkKSA9PiBgJHtGTEFHX0FXQUlUfSR7aWR9YDtcbi8qKlxuICogQ2FsbCBiZXR3ZWVuIGNvcmUgYW5kIHVzZXJcbiAqL1xuY2xhc3MgTFNQbHVnaW5DYWxsZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKF9wbHVnaW5Mb2NhbCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLl9wbHVnaW5Mb2NhbCA9IF9wbHVnaW5Mb2NhbDtcbiAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX3VzZXJNb2RlbCA9IHt9O1xuICAgICAgICB0aGlzLl9kZWJ1Z1RhZyA9ICcnO1xuICAgICAgICBpZiAoX3BsdWdpbkxvY2FsKSB7XG4gICAgICAgICAgICB0aGlzLl9kZWJ1Z1RhZyA9IF9wbHVnaW5Mb2NhbC5kZWJ1Z1RhZztcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBjb25uZWN0VG9DaGlsZCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgeyBzaGFkb3cgfSA9IHRoaXMuX3BsdWdpbkxvY2FsO1xuICAgICAgICBpZiAoc2hhZG93KSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLl9zZXR1cFNoYWRvd1NhbmRib3goKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuX3NldHVwSWZyYW1lU2FuZGJveCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIGNvbm5lY3RUb1BhcmVudCh1c2VyTW9kZWwgPSB7fSkge1xuICAgICAgICBpZiAodGhpcy5fY29ubmVjdGVkKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBjb25zdCBjYWxsZXIgPSB0aGlzO1xuICAgICAgICBjb25zdCBpc1NoYWRvd01vZGUgPSB0aGlzLl9wbHVnaW5Mb2NhbCAhPSBudWxsO1xuICAgICAgICBsZXQgc3luY0dDVGltZXIgPSAwO1xuICAgICAgICBsZXQgc3luY1RhZyA9IDA7XG4gICAgICAgIGNvbnN0IHN5bmNBY3RvcnMgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IHJlYWR5RGVmZXJyZWQgPSBkZWZlcnJlZCgxMDAwICogNSk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5fZXh0ZW5kVXNlck1vZGVsKHtcbiAgICAgICAgICAgIFtMU1BNU0dfUkVBRFldOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVhZHlEZWZlcnJlZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgW0xTUE1TR19CRUZPUkVfVU5MT0FEXTogYXN5bmMgKGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RvciA9IGRlZmVycmVkKDEwICogMTAwMCk7XG4gICAgICAgICAgICAgICAgY2FsbGVyLmVtaXQoJ2JlZm9yZXVubG9hZCcsIE9iamVjdC5hc3NpZ24oeyBhY3RvciB9LCBlKSk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYWN0b3IucHJvbWlzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTFNQTVNHX1NFVFRJTkdTXTogYXN5bmMgKHsgdHlwZSwgcGF5bG9hZCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY2FsbGVyLmVtaXQoJ3NldHRpbmdzOmNoYW5nZWQnLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTFNQTVNHXTogYXN5bmMgKHsgbnMsIHR5cGUsIHBheWxvYWQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGRlYnVnKGAke3RoaXMuX2RlYnVnVGFnfSBbY2FsbCBmcm9tIGhvc3RdYCwgbnMsIHR5cGUsIHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIGlmIChucyAmJiBucy5zdGFydHNXaXRoKCdob29rJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGVyLmVtaXQoYCR7bnN9OiR7dHlwZX1gLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYWxsZXIuZW1pdCh0eXBlLCBwYXlsb2FkKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbTFNQTVNHX1NZTkNdOiAoeyBfc3luYywgcmVzdWx0IH0pID0+IHtcbiAgICAgICAgICAgICAgICBkZWJ1Zyhgc3luYyByZXBseSAjJHtfc3luY31gLCByZXN1bHQpO1xuICAgICAgICAgICAgICAgIGlmIChzeW5jQWN0b3JzLmhhcyhfc3luYykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0b3IgPSBzeW5jQWN0b3JzLmdldChfc3luYyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdD8uaGFzT3duUHJvcGVydHkoTFNQTVNHX0VSUk9SX1RBRykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rvci5yZWplY3QocmVzdWx0W0xTUE1TR19FUlJPUl9UQUddKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdG9yLnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNBY3RvcnMuZGVsZXRlKF9zeW5jKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi51c2VyTW9kZWxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChpc1NoYWRvd01vZGUpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlYWR5RGVmZXJyZWQucHJvbWlzZTtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuX3BsdWdpbkxvY2FsPy50b0pTT04oKSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhhbmRzaGFrZSA9IG5ldyBQb3N0bWF0ZS5Nb2RlbChtb2RlbCk7XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9ICdwZW5kaW5nJztcbiAgICAgICAgYXdhaXQgaGFuZHNoYWtlLnRoZW4ocmVmUGFyZW50ID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2NoaWxkID0gcmVmUGFyZW50O1xuICAgICAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuX2NhbGwgPSBhc3luYyAodHlwZSwgcGF5bG9hZCA9IHt9LCBhY3RvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChhY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSArK3N5bmNUYWc7XG4gICAgICAgICAgICAgICAgICAgIHN5bmNBY3RvcnMuc2V0KHRhZywgYWN0b3IpO1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkLl9zeW5jID0gdGFnO1xuICAgICAgICAgICAgICAgICAgICBhY3Rvci5zZXRUYWcoYGFzeW5jIGNhbGwgIyR7dGFnfWApO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZygnYXN5bmMgY2FsbCAjJywgdGFnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVmUGFyZW50LmVtaXQoTFNQTVNHRm4obW9kZWwuYmFzZUluZm8uaWQpLCB7IHR5cGUsIHBheWxvYWQgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjdG9yPy5wcm9taXNlO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxVc2VyTW9kZWwgPSBhc3luYyAodHlwZSwgcGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGVsW3R5cGVdKHBheWxvYWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhgbW9kZWwgbWV0aG9kICMke3R5cGV9IG5vdCBleGlzdGVkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIC8vIGFjdG9ycyBHQ1xuICAgICAgICAgICAgc3luY0dDVGltZXIgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHN5bmNBY3RvcnMuc2l6ZSA+IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBzeW5jQWN0b3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodi5zZXR0bGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY0FjdG9ycy5kZWxldGUoayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAxMDAwICogNjAgKiAzMCk7XG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgcmVhZHlEZWZlcnJlZC5wcm9taXNlO1xuICAgICAgICByZXR1cm4gbW9kZWwuYmFzZUluZm87XG4gICAgfVxuICAgIGFzeW5jIGNhbGwodHlwZSwgcGF5bG9hZCA9IHt9KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsPy5jYWxsKHRoaXMsIHR5cGUsIHBheWxvYWQpO1xuICAgIH1cbiAgICBhc3luYyBjYWxsQXN5bmModHlwZSwgcGF5bG9hZCA9IHt9KSB7XG4gICAgICAgIGNvbnN0IGFjdG9yID0gZGVmZXJyZWQoMTAwMCAqIDEwKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NhbGw/LmNhbGwodGhpcywgdHlwZSwgcGF5bG9hZCwgYWN0b3IpO1xuICAgIH1cbiAgICBhc3luYyBjYWxsVXNlck1vZGVsKHR5cGUsIHBheWxvYWQgPSB7fSkge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2FsbFVzZXJNb2RlbD8uY2FsbCh0aGlzLCB0eXBlLCBwYXlsb2FkKTtcbiAgICB9XG4gICAgYXN5bmMgX3NldHVwSWZyYW1lU2FuZGJveCgpIHtcbiAgICAgICAgY29uc3QgcGwgPSB0aGlzLl9wbHVnaW5Mb2NhbDtcbiAgICAgICAgY29uc3QgaGFuZHNoYWtlID0gbmV3IFBvc3RtYXRlKHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogZG9jdW1lbnQuYm9keSxcbiAgICAgICAgICAgIHVybDogcGwub3B0aW9ucy5lbnRyeSxcbiAgICAgICAgICAgIGNsYXNzTGlzdEFycmF5OiBbJ2xzcC1pZnJhbWUtc2FuZGJveCddLFxuICAgICAgICAgICAgbW9kZWw6IHsgYmFzZUluZm86IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkocGwudG9KU09OKCkpKSB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zdGF0dXMgPSAncGVuZGluZyc7XG4gICAgICAgIC8vIHRpbWVvdXQgZm9yIGhhbmRzaGFrZVxuICAgICAgICBsZXQgdGltZXI7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYGhhbmRzaGFrZSBUaW1lb3V0YCkpO1xuICAgICAgICAgICAgfSwgMyAqIDEwMDApOyAvLyAzc2Vjc1xuICAgICAgICAgICAgaGFuZHNoYWtlLnRoZW4ocmVmQ2hpbGQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9IHJlZkNoaWxkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdjb25uZWN0ZWQnKTtcbiAgICAgICAgICAgICAgICByZWZDaGlsZC5mcmFtZS5zZXRBdHRyaWJ1dGUoJ2lkJywgcGwuaWQpO1xuICAgICAgICAgICAgICAgIHJlZkNoaWxkLm9uKExTUE1TR0ZuKHBsLmlkKSwgKHsgdHlwZSwgcGF5bG9hZCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnKGBbY2FsbCBmcm9tIHBsdWdpbl0gYCwgdHlwZSwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3BsdWdpbkxvY2FsPy5lbWl0KHR5cGUsIHBheWxvYWQgfHwge30pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGwgPSBhc3luYyAoLi4uYXJncykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgYWxsIHdpbGwgZ2V0IG1lc3NhZ2UgYmVmb3JlIGhhbmRzaGFrZWRcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgcmVmQ2hpbGQuY2FsbChMU1BNU0dGbihwbC5pZCksIHsgdHlwZTogYXJnc1swXSwgcGF5bG9hZDogYXJnc1sxXSB8fCB7fSB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxVc2VyTW9kZWwgPSBhc3luYyAodHlwZSwgcGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5zdGFydHNXaXRoKEZMQUdfQVdBSVQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhdHRhY2ggcGF5bG9hZCB3aXRoIG1ldGhvZCBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgcmVmQ2hpbGQuZ2V0KHR5cGUucmVwbGFjZShGTEFHX0FXQUlULCAnJykpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVmQ2hpbGQuY2FsbCh0eXBlLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShudWxsKTtcbiAgICAgICAgICAgIH0pLmNhdGNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICBkZWJ1ZygnaWZyYW1lIHNhbmRib3ggZXJyb3InLCBlKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgX3NldHVwU2hhZG93U2FuZGJveCgpIHtcbiAgICAgICAgY29uc3QgcGwgPSB0aGlzLl9wbHVnaW5Mb2NhbDtcbiAgICAgICAgY29uc3Qgc2hhZG93ID0gdGhpcy5fc2hhZG93ID0gbmV3IExTUGx1Z2luU2hhZG93RnJhbWUocGwpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gJ3BlbmRpbmcnO1xuICAgICAgICAgICAgYXdhaXQgc2hhZG93LmxvYWQoKTtcbiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICAgICAgdGhpcy5fY2FsbCA9IGFzeW5jICh0eXBlLCBwYXlsb2FkID0ge30sIGFjdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgYWN0b3IgJiYgKHBheWxvYWQuYWN0b3IgPSBhY3Rvcik7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBzeW5jIGNhbGxcbiAgICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIENhbGwgaW4gc2FtZSB0aHJlYWRcbiAgICAgICAgICAgICAgICB0aGlzLl9wbHVnaW5Mb2NhbD8uZW1pdCh0eXBlLCBwYXlsb2FkKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYWN0b3I/LnByb21pc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5fY2FsbFVzZXJNb2RlbCA9IGFzeW5jICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlPy5zdGFydHNXaXRoKEZMQUdfQVdBSVQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLnJlcGxhY2UoRkxBR19BV0FJVCwgJycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gYXJnc1sxXSB8fCB7fTtcbiAgICAgICAgICAgICAgICBjb25zdCBmbiA9IHRoaXMuX3VzZXJNb2RlbFt0eXBlXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGZuLmNhbGwobnVsbCwgcGF5bG9hZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ3NoYWRvdyBzYW5kYm94IGVycm9yJywgZSk7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9leHRlbmRVc2VyTW9kZWwobW9kZWwpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24odGhpcy5fdXNlck1vZGVsLCBtb2RlbCk7XG4gICAgfVxuICAgIF9nZXRTYW5kYm94SWZyYW1lQ29udGFpbmVyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50Py5mcmFtZTtcbiAgICB9XG4gICAgX2dldFNhbmRib3hTaGFkb3dDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaGFkb3c/LmZyYW1lO1xuICAgIH1cbiAgICBzZXQgZGVidWdUYWcodmFsdWUpIHtcbiAgICAgICAgdGhpcy5fZGVidWdUYWcgPSB2YWx1ZTtcbiAgICB9XG4gICAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3BhcmVudCkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fcGFyZW50LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fc2hhZG93KSB7XG4gICAgICAgICAgICB0aGlzLl9zaGFkb3cuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IHsgTFNQbHVnaW5DYWxsZXIgfTtcbiIsImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRlbWl0dGVyMyc7XG5pbXBvcnQgeyBkZWVwTWVyZ2UsIHNldHVwSW5qZWN0ZWRTdHlsZSwgZ2VuSUQsIHNldHVwSW5qZWN0ZWRUaGVtZSwgc2V0dXBJbmplY3RlZFVJLCBkZWZlcnJlZCwgaW52b2tlSG9zdEV4cG9ydGVkQXBpLCBpc09iamVjdCwgd2l0aEZpbGVQcm90b2NvbCB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgKiBhcyBwbHVnaW5IZWxwZXJzIGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgRGVidWcgZnJvbSAnZGVidWcnO1xuaW1wb3J0IHsgTFNQbHVnaW5DYWxsZXIsIExTUE1TR19SRUFEWSwgTFNQTVNHX1NZTkMsIExTUE1TRywgTFNQTVNHX1NFVFRJTkdTLCBMU1BNU0dfRVJST1JfVEFHLCBMU1BNU0dfQkVGT1JFX1VOTE9BRCwgQVdBSVRfTFNQTVNHRm4gfSBmcm9tICcuL0xTUGx1Z2luLmNhbGxlcic7XG5pbXBvcnQgeyBzbmFrZUNhc2UgfSBmcm9tICdzbmFrZS1jYXNlJztcbmltcG9ydCBET01QdXJpZnkgZnJvbSAnZG9tcHVyaWZ5JztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5jb25zdCBkZWJ1ZyA9IERlYnVnKCdMU1BsdWdpbjpjb3JlJyk7XG4vKipcbiAqIFVzZXIgc2V0dGluZ3NcbiAqL1xuY2xhc3MgUGx1Z2luU2V0dGluZ3MgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKF91c2VyUGx1Z2luU2V0dGluZ3MpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdXNlclBsdWdpblNldHRpbmdzID0gX3VzZXJQbHVnaW5TZXR0aW5ncztcbiAgICAgICAgdGhpcy5fc2V0dGluZ3MgPSB7XG4gICAgICAgICAgICBkaXNhYmxlZDogZmFsc2VcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9zZXR0aW5ncywgX3VzZXJQbHVnaW5TZXR0aW5ncyk7XG4gICAgfVxuICAgIGdldChrKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc1trXTtcbiAgICB9XG4gICAgc2V0KGssIHYpIHtcbiAgICAgICAgY29uc3QgbyA9IGRlZXBNZXJnZSh7fSwgdGhpcy5fc2V0dGluZ3MpO1xuICAgICAgICBpZiAodHlwZW9mIGsgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fc2V0dGluZ3Nba10gPT0gdilcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB0aGlzLl9zZXR0aW5nc1trXSA9IHY7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QoaykpIHtcbiAgICAgICAgICAgIGRlZXBNZXJnZSh0aGlzLl9zZXR0aW5ncywgayk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnLCBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9zZXR0aW5ncyksIG8pO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZXR0aW5ncztcbiAgICB9XG59XG5jbGFzcyBQbHVnaW5Mb2dnZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIGNvbnN0cnVjdG9yKF90YWcpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fdGFnID0gX3RhZztcbiAgICAgICAgdGhpcy5fbG9ncyA9IFtdO1xuICAgIH1cbiAgICB3cml0ZSh0eXBlLCBwYXlsb2FkKSB7XG4gICAgICAgIGxldCBtc2cgPSBwYXlsb2FkLnJlZHVjZSgoYWMsIGl0KSA9PiB7XG4gICAgICAgICAgICBpZiAoaXQgJiYgaXQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICAgIGFjICs9IGAke2l0Lm1lc3NhZ2V9ICR7aXQuc3RhY2t9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGFjICs9IGl0LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gYWM7XG4gICAgICAgIH0sIGBbJHt0aGlzLl90YWd9XVske25ldyBEYXRlKCkudG9Mb2NhbGVUaW1lU3RyaW5nKCl9XSBgKTtcbiAgICAgICAgdGhpcy5fbG9ncy5wdXNoKFt0eXBlLCBtc2ddKTtcbiAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnKTtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX2xvZ3MgPSBbXTtcbiAgICAgICAgdGhpcy5lbWl0KCdjaGFuZ2UnKTtcbiAgICB9XG4gICAgaW5mbyguLi5hcmdzKSB7XG4gICAgICAgIHRoaXMud3JpdGUoJ0lORk8nLCBhcmdzKTtcbiAgICB9XG4gICAgZXJyb3IoLi4uYXJncykge1xuICAgICAgICB0aGlzLndyaXRlKCdFUlJPUicsIGFyZ3MpO1xuICAgIH1cbiAgICB3YXJuKC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy53cml0ZSgnV0FSTicsIGFyZ3MpO1xuICAgIH1cbiAgICB0b0pTT04oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2dzO1xuICAgIH1cbn1cbnZhciBQbHVnaW5Mb2NhbExvYWRTdGF0dXM7XG4oZnVuY3Rpb24gKFBsdWdpbkxvY2FsTG9hZFN0YXR1cykge1xuICAgIFBsdWdpbkxvY2FsTG9hZFN0YXR1c1tcIkxPQURJTkdcIl0gPSBcImxvYWRpbmdcIjtcbiAgICBQbHVnaW5Mb2NhbExvYWRTdGF0dXNbXCJVTkxPQURJTkdcIl0gPSBcInVubG9hZGluZ1wiO1xuICAgIFBsdWdpbkxvY2FsTG9hZFN0YXR1c1tcIkxPQURFRFwiXSA9IFwibG9hZGVkXCI7XG4gICAgUGx1Z2luTG9jYWxMb2FkU3RhdHVzW1wiVU5MT0FERURcIl0gPSBcInVubG9hZFwiO1xuICAgIFBsdWdpbkxvY2FsTG9hZFN0YXR1c1tcIkVSUk9SXCJdID0gXCJlcnJvclwiO1xufSkoUGx1Z2luTG9jYWxMb2FkU3RhdHVzIHx8IChQbHVnaW5Mb2NhbExvYWRTdGF0dXMgPSB7fSkpO1xuZnVuY3Rpb24gaW5pdFVzZXJTZXR0aW5nc0hhbmRsZXJzKHBsdWdpbkxvY2FsKSB7XG4gICAgY29uc3QgXyA9IChsYWJlbCkgPT4gYHNldHRpbmdzOiR7bGFiZWx9YDtcbiAgICBwbHVnaW5Mb2NhbC5vbihfKCd1cGRhdGUnKSwgKGF0dHJzKSA9PiB7XG4gICAgICAgIGlmICghYXR0cnMpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHBsdWdpbkxvY2FsLnNldHRpbmdzPy5zZXQoYXR0cnMpO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaW5pdE1haW5VSUhhbmRsZXJzKHBsdWdpbkxvY2FsKSB7XG4gICAgY29uc3QgXyA9IChsYWJlbCkgPT4gYG1haW4tdWk6JHtsYWJlbH1gO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ3Zpc2libGUnKSwgKHsgdmlzaWJsZSwgdG9nZ2xlLCBjdXJzb3IgfSkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IHBsdWdpbkxvY2FsLmdldE1haW5VSSgpO1xuICAgICAgICBlbD8uY2xhc3NMaXN0W3RvZ2dsZSA/ICd0b2dnbGUnIDogKHZpc2libGUgPyAnYWRkJyA6ICdyZW1vdmUnKV0oJ3Zpc2libGUnKTtcbiAgICAgICAgLy8gcGx1Z2luTG9jYWwuY2FsbGVyIS5jYWxsVXNlck1vZGVsKExTUE1TRywgeyB0eXBlOiBfKCd2aXNpYmxlJyksIHBheWxvYWQ6IHZpc2libGUgfSlcbiAgICAgICAgLy8gYXV0byBmb2N1cyBmcmFtZVxuICAgICAgICBpZiAodmlzaWJsZSkge1xuICAgICAgICAgICAgaWYgKCFwbHVnaW5Mb2NhbC5zaGFkb3cgJiYgZWwpIHtcbiAgICAgICAgICAgICAgICBlbC5jb250ZW50V2luZG93Py5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJzb3IpIHtcbiAgICAgICAgICAgIGludm9rZUhvc3RFeHBvcnRlZEFwaSgncmVzdG9yZV9lZGl0aW5nX2N1cnNvcicpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcGx1Z2luTG9jYWwub24oXygnYXR0cnMnKSwgKGF0dHJzKSA9PiB7XG4gICAgICAgIGNvbnN0IGVsID0gcGx1Z2luTG9jYWwuZ2V0TWFpblVJKCk7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGF0dHJzKS5mb3JFYWNoKChbaywgdl0pID0+IHtcbiAgICAgICAgICAgIGVsPy5zZXRBdHRyaWJ1dGUoaywgdik7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIHBsdWdpbkxvY2FsLm9uKF8oJ3N0eWxlJyksIChzdHlsZSkgPT4ge1xuICAgICAgICBjb25zdCBlbCA9IHBsdWdpbkxvY2FsLmdldE1haW5VSSgpO1xuICAgICAgICBPYmplY3QuZW50cmllcyhzdHlsZSkuZm9yRWFjaCgoW2ssIHZdKSA9PiB7XG4gICAgICAgICAgICBlbC5zdHlsZVtrXSA9IHY7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaW5pdFByb3ZpZGVySGFuZGxlcnMocGx1Z2luTG9jYWwpIHtcbiAgICBsZXQgXyA9IChsYWJlbCkgPT4gYHByb3ZpZGVyOiR7bGFiZWx9YDtcbiAgICBsZXQgdGhlbWVkID0gZmFsc2U7XG4gICAgcGx1Z2luTG9jYWwub24oXygndGhlbWUnKSwgKHRoZW1lKSA9PiB7XG4gICAgICAgIHBsdWdpbkxvY2FsLnRoZW1lTWdyLnJlZ2lzdGVyVGhlbWUocGx1Z2luTG9jYWwuaWQsIHRoZW1lKTtcbiAgICAgICAgaWYgKCF0aGVtZWQpIHtcbiAgICAgICAgICAgIHBsdWdpbkxvY2FsLl9kaXNwb3NlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBwbHVnaW5Mb2NhbC50aGVtZU1nci51bnJlZ2lzdGVyVGhlbWUocGx1Z2luTG9jYWwuaWQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGVtZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcGx1Z2luTG9jYWwub24oXygnc3R5bGUnKSwgKHN0eWxlKSA9PiB7XG4gICAgICAgIGxldCBrZXk7XG4gICAgICAgIGlmICh0eXBlb2Ygc3R5bGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBrZXkgPSBzdHlsZS5rZXk7XG4gICAgICAgICAgICBzdHlsZSA9IHN0eWxlLnN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc3R5bGUgfHwgIXN0eWxlLnRyaW0oKSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgcGx1Z2luTG9jYWwuX2Rpc3Bvc2Uoc2V0dXBJbmplY3RlZFN0eWxlKHN0eWxlLCB7XG4gICAgICAgICAgICAnZGF0YS1pbmplY3RlZC1zdHlsZSc6IGtleSA/IGAke2tleX0tJHtwbHVnaW5Mb2NhbC5pZH1gIDogJycsXG4gICAgICAgICAgICAnZGF0YS1yZWYnOiBwbHVnaW5Mb2NhbC5pZFxuICAgICAgICB9KSk7XG4gICAgfSk7XG4gICAgcGx1Z2luTG9jYWwub24oXygndWknKSwgKHVpKSA9PiB7XG4gICAgICAgIHBsdWdpbkxvY2FsLl9vbkhvc3RNb3VudGVkKCgpID0+IHtcbiAgICAgICAgICAgIC8vIHNhZmUgdGVtcGxhdGVcbiAgICAgICAgICAgIHVpLnRlbXBsYXRlID0gRE9NUHVyaWZ5LnNhbml0aXplKHVpLnRlbXBsYXRlKTtcbiAgICAgICAgICAgIHBsdWdpbkxvY2FsLl9kaXNwb3NlKHNldHVwSW5qZWN0ZWRVSS5jYWxsKHBsdWdpbkxvY2FsLCB1aSwge1xuICAgICAgICAgICAgICAgICdkYXRhLXJlZic6IHBsdWdpbkxvY2FsLmlkXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufVxuZnVuY3Rpb24gaW5pdEFwaVByb3h5SGFuZGxlcnMocGx1Z2luTG9jYWwpIHtcbiAgICBsZXQgXyA9IChsYWJlbCkgPT4gYGFwaToke2xhYmVsfWA7XG4gICAgcGx1Z2luTG9jYWwub24oXygnY2FsbCcpLCBhc3luYyAocGF5bG9hZCkgPT4ge1xuICAgICAgICBsZXQgcmV0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0ID0gYXdhaXQgaW52b2tlSG9zdEV4cG9ydGVkQXBpKHBheWxvYWQubWV0aG9kLCAuLi5wYXlsb2FkLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZXQgPSB7XG4gICAgICAgICAgICAgICAgW0xTUE1TR19FUlJPUl9UQUddOiBlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IF9zeW5jIH0gPSBwYXlsb2FkO1xuICAgICAgICBpZiAocGx1Z2luTG9jYWwuc2hhZG93KSB7XG4gICAgICAgICAgICBpZiAocGF5bG9hZC5hY3Rvcikge1xuICAgICAgICAgICAgICAgIHBheWxvYWQuYWN0b3IucmVzb2x2ZShyZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfc3luYyAhPSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCByZXBseSA9IChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICBwbHVnaW5Mb2NhbC5jYWxsZXI/LmNhbGxVc2VyTW9kZWwoTFNQTVNHX1NZTkMsIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LCBfc3luY1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShyZXQpLnRoZW4ocmVwbHksIHJlcGx5KTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuY2xhc3MgSWxsZWdhbFBsdWdpblBhY2thZ2VFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXNzYWdlKSB7XG4gICAgICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgICAgICB0aGlzLm5hbWUgPSBJbGxlZ2FsUGx1Z2luUGFja2FnZUVycm9yLm5hbWU7XG4gICAgfVxufVxuY2xhc3MgRXhpc3RlZEltcG9ydGVkUGx1Z2luUGFja2FnZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMubmFtZSA9IEV4aXN0ZWRJbXBvcnRlZFBsdWdpblBhY2thZ2VFcnJvci5uYW1lO1xuICAgIH1cbn1cbi8qKlxuICogSG9zdCBwbHVnaW4gZm9yIGxvY2FsXG4gKi9cbmNsYXNzIFBsdWdpbkxvY2FsIGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICAvKipcbiAgICAgKiBAcGFyYW0gX29wdGlvbnNcbiAgICAgKiBAcGFyYW0gX3RoZW1lTWdyXG4gICAgICogQHBhcmFtIF9jdHhcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihfb3B0aW9ucywgX3RoZW1lTWdyLCBfY3R4KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5fdGhlbWVNZ3IgPSBfdGhlbWVNZ3I7XG4gICAgICAgIHRoaXMuX2N0eCA9IF9jdHg7XG4gICAgICAgIHRoaXMuX2Rpc3Bvc2VzID0gW107XG4gICAgICAgIHRoaXMuX3N0YXR1cyA9IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5VTkxPQURFRDtcbiAgICAgICAgdGhpcy5faWQgPSBfb3B0aW9ucy5rZXkgfHwgZ2VuSUQoKTtcbiAgICAgICAgaW5pdFVzZXJTZXR0aW5nc0hhbmRsZXJzKHRoaXMpO1xuICAgICAgICBpbml0TWFpblVJSGFuZGxlcnModGhpcyk7XG4gICAgICAgIGluaXRQcm92aWRlckhhbmRsZXJzKHRoaXMpO1xuICAgICAgICBpbml0QXBpUHJveHlIYW5kbGVycyh0aGlzKTtcbiAgICB9XG4gICAgYXN5bmMgX3NldHVwVXNlclNldHRpbmdzKCkge1xuICAgICAgICBjb25zdCB7IF9vcHRpb25zIH0gPSB0aGlzO1xuICAgICAgICBjb25zdCBrZXkgPSBfb3B0aW9ucy5uYW1lLnJlcGxhY2UoL1teYS16MC05XS9naSwgJ18nKS50b0xvd2VyQ2FzZSgpICsgJ18nICsgdGhpcy5pZDtcbiAgICAgICAgY29uc3QgbG9nZ2VyID0gX29wdGlvbnMubG9nZ2VyID0gbmV3IFBsdWdpbkxvZ2dlcignTG9hZGVyJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBbdXNlclNldHRpbmdzRmlsZVBhdGgsIHVzZXJTZXR0aW5nc10gPSBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoJ2xvYWRfcGx1Z2luX3VzZXJfc2V0dGluZ3MnLCBrZXkpO1xuICAgICAgICAgICAgdGhpcy5fdXNlclNldHRpbmdzRmlsZSA9IHVzZXJTZXR0aW5nc0ZpbGVQYXRoO1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBfb3B0aW9ucy5zZXR0aW5ncyA9IG5ldyBQbHVnaW5TZXR0aW5ncyh1c2VyU2V0dGluZ3MpO1xuICAgICAgICAgICAgLy8gb2JzZXJ2ZSBzZXR0aW5nc1xuICAgICAgICAgICAgc2V0dGluZ3Mub24oJ2NoYW5nZScsIChhLCBiKSA9PiB7XG4gICAgICAgICAgICAgICAgZGVidWcoJ2xpbmtlZCBzZXR0aW5ncyBjaGFuZ2UnLCBhKTtcbiAgICAgICAgICAgICAgICBpZiAoIWEuZGlzYWJsZWQgJiYgYi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbmFibGUgcGx1Z2luXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYS5kaXNhYmxlZCAmJiAhYi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHBsdWdpblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnVubG9hZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYSkge1xuICAgICAgICAgICAgICAgICAgICBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoYHNhdmVfcGx1Z2luX3VzZXJfc2V0dGluZ3NgLCBrZXksIGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkZWJ1ZygnW2xvYWQgcGx1Z2luIHVzZXIgc2V0dGluZ3MgRXJyb3JdJywgZSk7XG4gICAgICAgICAgICBsb2dnZXI/LmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGdldE1haW5VSSgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hhZG93KSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jYWxsZXI/Ll9nZXRTYW5kYm94U2hhZG93Q29udGFpbmVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbGVyPy5fZ2V0U2FuZGJveElmcmFtZUNvbnRhaW5lcigpO1xuICAgIH1cbiAgICBhc3luYyBfcHJlcGFyZVBhY2thZ2VDb25maWdzKCkge1xuICAgICAgICBjb25zdCB7IHVybCB9ID0gdGhpcy5fb3B0aW9ucztcbiAgICAgICAgbGV0IHBrZztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICghdXJsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW4gbm90IHJlc29sdmUgcGFja2FnZSBjb25maWcgbG9jYXRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlYnVnKCdwcmVwYXJlIHBhY2thZ2Ugcm9vdCcsIHVybCk7XG4gICAgICAgICAgICBwa2cgPSBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoJ2xvYWRfcGx1Z2luX2NvbmZpZycsIHVybCk7XG4gICAgICAgICAgICBpZiAoIXBrZyB8fCAocGtnID0gSlNPTi5wYXJzZShwa2cpLCAhcGtnKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGFyc2UgcGFja2FnZSBjb25maWcgZXJyb3IgIyR7dXJsfS9wYWNrYWdlLmpzb25gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxQbHVnaW5QYWNrYWdlRXJyb3IoZS5tZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQaWNrIGxlZ2FsIGF0dHJzXG4gICAgICAgIFsnbmFtZScsICdhdXRob3InLCAncmVwb3NpdG9yeScsICd2ZXJzaW9uJywgJ2Rlc2NyaXB0aW9uJ10uZm9yRWFjaChrID0+IHtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnNba10gPSBwa2dba107XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUT0RPOiBIb3cgd2l0aCBsb2NhbCBwcm90b2NvbFxuICAgICAgICBjb25zdCBsb2NhbFJvb3QgPSB0aGlzLl9sb2NhbFJvb3QgPSB1cmw7XG4gICAgICAgIGNvbnN0IGxvZ3NlcSA9IHBrZy5sb2dzZXEgfHwge307XG4gICAgICAgIGNvbnN0IG1ha2VGdWxsVXJsID0gKGxvYywgdXNlRmlsZVByb3RvY29sID0gZmFsc2UpID0+IHtcbiAgICAgICAgICAgIGlmICghbG9jKVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIGNvbnN0IHJlZyA9IC9eKGh0dHB8ZmlsZXxhc3NldHMpLztcbiAgICAgICAgICAgIGlmICghcmVnLnRlc3QobG9jKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHBhdGguam9pbihsb2NhbFJvb3QsIGxvYyk7XG4gICAgICAgICAgICAgICAgbG9jID0gcmVnLnRlc3QodXJsKSA/IHVybCA6ICgnZmlsZTovLycgKyB1cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVzZUZpbGVQcm90b2NvbCA/IGxvYyA6IGxvYy5yZXBsYWNlKCdmaWxlOicsICdhc3NldHM6Jyk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlTWFpbiA9IChtYWluKSA9PiBtYWluICYmIC9cXC4oanN8aHRtbCkkLy50ZXN0KG1haW4pO1xuICAgICAgICAvLyBFbnRyeSBmcm9tIG1haW5cbiAgICAgICAgaWYgKHZhbGlkYXRlTWFpbihwa2cubWFpbikpIHtcbiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuZW50cnkgPSBtYWtlRnVsbFVybChwa2cubWFpbiwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAobG9nc2VxLm1vZGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vcHRpb25zLm1vZGUgPSBsb2dzZXEubW9kZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpY29uID0gbG9nc2VxLmljb24gfHwgcGtnLmljb247XG4gICAgICAgIGlmIChpY29uKSB7XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmljb24gPSBtYWtlRnVsbFVybChpY29uKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBzdHJhdGVneSBmb3IgTG9nc2VxIHBsdWdpbnMgY2VudGVyXG4gICAgICAgIGlmIChsb2dzZXEuaWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2lkID0gbG9nc2VxLmlkO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nc2VxLmlkID0gdGhpcy5pZDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgaW52b2tlSG9zdEV4cG9ydGVkQXBpKCdzYXZlX3BsdWdpbl9jb25maWcnLCB1cmwsIHsgLi4ucGtnLCBsb2dzZXEgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGRlYnVnKCdbc2F2ZSBwbHVnaW4gSUQgRXJyb3JdICcsIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFZhbGlkYXRlIGlkXG4gICAgICAgIGNvbnN0IHsgcmVnaXN0ZXJlZFBsdWdpbnMsIGlzUmVnaXN0ZXJpbmcgfSA9IHRoaXMuX2N0eDtcbiAgICAgICAgaWYgKGlzUmVnaXN0ZXJpbmcgJiYgcmVnaXN0ZXJlZFBsdWdpbnMuaGFzKGxvZ3NlcS5pZCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFeGlzdGVkSW1wb3J0ZWRQbHVnaW5QYWNrYWdlRXJyb3IoJ3ByZXBhcmUgcGFja2FnZSBFcnJvcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIC8vIDAuIEluc3RhbGwgVGhlbWVzXG4gICAgICAgICAgICAgICAgbGV0IHRoZW1lcyA9IGxvZ3NlcS50aGVtZXM7XG4gICAgICAgICAgICAgICAgaWYgKHRoZW1lcykge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLl9sb2FkQ29uZmlnVGhlbWVzKEFycmF5LmlzQXJyYXkodGhlbWVzKSA/IHRoZW1lcyA6IFt0aGVtZXNdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGRlYnVnKCdbcHJlcGFyZSBwYWNrYWdlIGVmZmVjdCBFcnJvcl0nLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG4gICAgYXN5bmMgX3RyeVRvTm9ybWFsaXplRW50cnkoKSB7XG4gICAgICAgIGxldCB7IGVudHJ5LCBzZXR0aW5ncyB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgICBsZXQgZGV2RW50cnkgPSBzZXR0aW5ncz8uZ2V0KCdfZGV2RW50cnknKTtcbiAgICAgICAgaWYgKGRldkVudHJ5KSB7XG4gICAgICAgICAgICB0aGlzLl9vcHRpb25zLmVudHJ5ID0gZGV2RW50cnk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnRyeS5lbmRzV2l0aCgnLmpzJykpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIGxldCBzZGtQYXRoID0gYXdhaXQgaW52b2tlSG9zdEV4cG9ydGVkQXBpKCdfY2FsbEFwcGxpY2F0aW9uJywgJ2dldEFwcFBhdGgnKTtcbiAgICAgICAgbGV0IGVudHJ5UGF0aCA9IGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaSgnd3JpdGVfdXNlcl90bXBfZmlsZScsIGAke3RoaXMuX2lkfV9pbmRleC5odG1sYCwgYDwhZG9jdHlwZSBodG1sPlxuPGh0bWwgbGFuZz1cImVuXCI+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGNoYXJzZXQ9XCJVVEYtOFwiPlxuICAgIDx0aXRsZT5sb2dzZXEgcGx1Z2luIGVudHJ5PC90aXRsZT5cbiAgICA8c2NyaXB0IHNyYz1cIiR7c2RrUGF0aH0vanMvbHNwbHVnaW4udXNlci5qc1wiPjwvc2NyaXB0PlxuICA8L2hlYWQ+XG4gIDxib2R5PlxuICA8ZGl2IGlkPVwiYXBwXCI+PC9kaXY+XG4gIDxzY3JpcHQgc3JjPVwiJHtlbnRyeX1cIj48L3NjcmlwdD5cbiAgPC9ib2R5PlxuPC9odG1sPmApO1xuICAgICAgICB0aGlzLl9vcHRpb25zLmVudHJ5ID0gd2l0aEZpbGVQcm90b2NvbChlbnRyeVBhdGgpO1xuICAgIH1cbiAgICBhc3luYyBfbG9hZENvbmZpZ1RoZW1lcyh0aGVtZXMpIHtcbiAgICAgICAgdGhlbWVzLmZvckVhY2goKG9wdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy51cmwpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybC5zdGFydHNXaXRoKCdodHRwJykgJiYgdGhpcy5fbG9jYWxSb290KSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy51cmwgPSBwYXRoLmpvaW4odGhpcy5fbG9jYWxSb290LCBvcHRpb25zLnVybCk7XG4gICAgICAgICAgICAgICAgLy8gZmlsZTovLyBmb3IgbmF0aXZlXG4gICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zLnVybC5zdGFydHNXaXRoKCdmaWxlOicpKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMudXJsID0gJ2Fzc2V0czovLycgKyBvcHRpb25zLnVybDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Byb3ZpZGVyOnRoZW1lJywgb3B0aW9ucyk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBhc3luYyBsb2FkKHJlYWR5SW5kaWNhdG9yKSB7XG4gICAgICAgIGlmICh0aGlzLnBlbmRpbmcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuTE9BRElORztcbiAgICAgICAgdGhpcy5fbG9hZEVyciA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBpbnN0YWxsUGFja2FnZVRoZW1lcyA9ICgpID0+IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuZW50cnkpIHsgLy8gVGhlbWVzIHBhY2thZ2Ugbm8gZW50cnkgZmllbGRcbiAgICAgICAgICAgICAgICBpbnN0YWxsUGFja2FnZVRoZW1lcyA9IGF3YWl0IHRoaXMuX3ByZXBhcmVQYWNrYWdlQ29uZmlncygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLnNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5fc2V0dXBVc2VyU2V0dGluZ3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGluc3RhbGxQYWNrYWdlVGhlbWVzLmNhbGwobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5vcHRpb25zLmVudHJ5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5fdHJ5VG9Ob3JtYWxpemVFbnRyeSgpO1xuICAgICAgICAgICAgdGhpcy5fY2FsbGVyID0gbmV3IExTUGx1Z2luQ2FsbGVyKHRoaXMpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5fY2FsbGVyLmNvbm5lY3RUb0NoaWxkKCk7XG4gICAgICAgICAgICBjb25zdCByZWFkeUZuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxlcj8uY2FsbFVzZXJNb2RlbChMU1BNU0dfUkVBRFkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChyZWFkeUluZGljYXRvcikge1xuICAgICAgICAgICAgICAgIHJlYWR5SW5kaWNhdG9yLnByb21pc2UudGhlbihyZWFkeUZuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlYWR5Rm4oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VzLnB1c2goYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2NhbGxlcj8uZGVzdHJveSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGRlYnVnKCdbTG9hZCBQbHVnaW4gRXJyb3JdICcsIGUpO1xuICAgICAgICAgICAgdGhpcy5sb2dnZXI/LmVycm9yKGUpO1xuICAgICAgICAgICAgdGhpcy5fc3RhdHVzID0gUGx1Z2luTG9jYWxMb2FkU3RhdHVzLkVSUk9SO1xuICAgICAgICAgICAgdGhpcy5fbG9hZEVyciA9IGU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuX2xvYWRFcnIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuTE9BREVEO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGFzeW5jIHJlbG9hZCgpIHtcbiAgICAgICAgZGVidWcoJ1RPRE86IHJlbG9hZCBwbHVnaW4nLCB0aGlzLmlkKTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHVucmVnaXN0ZXIgSWYgdHJ1ZSBkZWxldGUgcGx1Z2luIGZpbGVzXG4gICAgICovXG4gICAgYXN5bmMgdW5sb2FkKHVucmVnaXN0ZXIgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5wZW5kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVucmVnaXN0ZXIpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudW5sb2FkKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0luc3RhbGxlZEluVXNlclJvb3QpIHtcbiAgICAgICAgICAgICAgICBkZWJ1ZygnVE9ETzogcmVtb3ZlIHBsdWdpbiBsb2NhbCBmaWxlcyBmcm9tIHVzZXIgaG9tZSByb290IDopJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMuX3N0YXR1cyA9IFBsdWdpbkxvY2FsTG9hZFN0YXR1cy5VTkxPQURJTkc7XG4gICAgICAgICAgICBjb25zdCBldmVudEJlZm9yZVVubG9hZCA9IHsgdW5yZWdpc3RlciB9O1xuICAgICAgICAgICAgLy8gc3luYyBjYWxsXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuX2NhbGxlcj8uY2FsbFVzZXJNb2RlbChBV0FJVF9MU1BNU0dGbihMU1BNU0dfQkVGT1JFX1VOTE9BRCksIGV2ZW50QmVmb3JlVW5sb2FkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2JlZm9yZXVubG9hZCcsIGV2ZW50QmVmb3JlVW5sb2FkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW2JlZm9yZXVubG9hZCBFcnJvcl0nLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHRoaXMuZGlzcG9zZSgpO1xuICAgICAgICAgICAgdGhpcy5lbWl0KCd1bmxvYWRlZCcpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICBkZWJ1ZygnW3BsdWdpbiB1bmxvYWQgRXJyb3JdJywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuVU5MT0FERUQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgZGlzcG9zZSgpIHtcbiAgICAgICAgZm9yIChjb25zdCBmbiBvZiB0aGlzLl9kaXNwb3Nlcykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBmbiAmJiAoYXdhaXQgZm4oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IodGhpcy5kZWJ1Z1RhZywgJ2Rpc3Bvc2UgRXJyb3InLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjbGVhclxuICAgICAgICB0aGlzLl9kaXNwb3NlcyA9IFtdO1xuICAgIH1cbiAgICBfZGlzcG9zZShmbikge1xuICAgICAgICBpZiAoIWZuKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLl9kaXNwb3Nlcy5wdXNoKGZuKTtcbiAgICB9XG4gICAgX29uSG9zdE1vdW50ZWQoY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgYWN0b3IgPSB0aGlzLl9jdHguaG9zdE1vdW50ZWRBY3RvcjtcbiAgICAgICAgaWYgKCFhY3RvciB8fCBhY3Rvci5zZXR0bGVkKSB7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWN0b3I/LnByb21pc2UudGhlbihjYWxsYmFjayk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IGlzSW5zdGFsbGVkSW5Vc2VyUm9vdCgpIHtcbiAgICAgICAgY29uc3QgdXNlclJvb3QgPSB0aGlzLl9jdHgub3B0aW9ucy5sb2NhbFVzZXJDb25maWdSb290O1xuICAgICAgICBjb25zdCBwbHVnUm9vdCA9IHRoaXMuX2xvY2FsUm9vdDtcbiAgICAgICAgcmV0dXJuIHVzZXJSb290ICYmIHBsdWdSb290ICYmIHBsdWdSb290LnN0YXJ0c1dpdGgodXNlclJvb3QpO1xuICAgIH1cbiAgICBnZXQgbG9hZGVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzID09PSBQbHVnaW5Mb2NhbExvYWRTdGF0dXMuTE9BREVEO1xuICAgIH1cbiAgICBnZXQgcGVuZGluZygpIHtcbiAgICAgICAgcmV0dXJuIFtQbHVnaW5Mb2NhbExvYWRTdGF0dXMuTE9BRElORywgUGx1Z2luTG9jYWxMb2FkU3RhdHVzLlVOTE9BRElOR11cbiAgICAgICAgICAgIC5pbmNsdWRlcyh0aGlzLl9zdGF0dXMpO1xuICAgIH1cbiAgICBnZXQgc3RhdHVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3RhdHVzO1xuICAgIH1cbiAgICBnZXQgc2V0dGluZ3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuc2V0dGluZ3M7XG4gICAgfVxuICAgIGdldCBsb2dnZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMubG9nZ2VyO1xuICAgIH1cbiAgICBnZXQgZGlzYWJsZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldHRpbmdzPy5nZXQoJ2Rpc2FibGVkJyk7XG4gICAgfVxuICAgIGdldCBjYWxsZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jYWxsZXI7XG4gICAgfVxuICAgIGdldCBpZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lkO1xuICAgIH1cbiAgICBnZXQgc2hhZG93KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLm1vZGUgPT09ICdzaGFkb3cnO1xuICAgIH1cbiAgICBnZXQgb3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuICAgIGdldCB0aGVtZU1ncigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RoZW1lTWdyO1xuICAgIH1cbiAgICBnZXQgZGVidWdUYWcoKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLl9vcHRpb25zPy5uYW1lO1xuICAgICAgICByZXR1cm4gYCMke3RoaXMuX2lkfSAke25hbWUgPz8gJyd9YDtcbiAgICB9XG4gICAgZ2V0IGxvY2FsUm9vdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvY2FsUm9vdCB8fCB0aGlzLl9vcHRpb25zLnVybDtcbiAgICB9XG4gICAgZ2V0IGxvYWRFcnIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2FkRXJyO1xuICAgIH1cbiAgICBnZXQgdXNlclNldHRpbmdzRmlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTZXR0aW5nc0ZpbGU7XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QganNvbiA9IHsgLi4udGhpcy5vcHRpb25zIH07XG4gICAgICAgIGpzb24uaWQgPSB0aGlzLmlkO1xuICAgICAgICBqc29uLmVyciA9IHRoaXMubG9hZEVycjtcbiAgICAgICAganNvbi51c2YgPSB0aGlzLnVzZXJTZXR0aW5nc0ZpbGU7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgIH1cbn1cbi8qKlxuICogSG9zdCBwbHVnaW4gY29yZVxuICovXG5jbGFzcyBMU1BsdWdpbkNvcmUgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSBfb3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKF9vcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucztcbiAgICAgICAgdGhpcy5faXNSZWdpc3RlcmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9ob3N0TW91bnRlZEFjdG9yID0gZGVmZXJyZWQoKTtcbiAgICAgICAgdGhpcy5fdXNlclByZWZlcmVuY2VzID0ge307XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRUaGVtZXMgPSBuZXcgTWFwKCk7XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRQbHVnaW5zID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBhc3luYyBsb2FkVXNlclByZWZlcmVuY2VzKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3Qgc2V0dGluZ3MgPSBhd2FpdCBpbnZva2VIb3N0RXhwb3J0ZWRBcGkoYGxvYWRfdXNlcl9wcmVmZXJlbmNlc2ApO1xuICAgICAgICAgICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl91c2VyUHJlZmVyZW5jZXMsIHNldHRpbmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ1tsb2FkIHVzZXIgcHJlZmVyZW5jZXMgRXJyb3JdJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgc2F2ZVVzZXJQcmVmZXJlbmNlcyhzZXR0aW5ncykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKHNldHRpbmdzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl91c2VyUHJlZmVyZW5jZXMsIHNldHRpbmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IGludm9rZUhvc3RFeHBvcnRlZEFwaShgc2F2ZV91c2VyX3ByZWZlcmVuY2VzYCwgdGhpcy5fdXNlclByZWZlcmVuY2VzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgZGVidWcoJ1tzYXZlIHVzZXIgcHJlZmVyZW5jZXMgRXJyb3JdJywgZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgYWN0aXZhdGVVc2VyUHJlZmVyZW5jZXMoKSB7XG4gICAgICAgIGNvbnN0IHsgdGhlbWUgfSA9IHRoaXMuX3VzZXJQcmVmZXJlbmNlcztcbiAgICAgICAgLy8gMC4gdGhlbWVcbiAgICAgICAgaWYgKHRoZW1lKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbGVjdFRoZW1lKHRoZW1lLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogQHBhcmFtIHBsdWdpbnNcbiAgICAgKiBAcGFyYW0gaW5pdGlhbFxuICAgICAqL1xuICAgIGFzeW5jIHJlZ2lzdGVyKHBsdWdpbnMsIGluaXRpYWwgPSBmYWxzZSkge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkocGx1Z2lucykpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMucmVnaXN0ZXIoW3BsdWdpbnNdKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5faXNSZWdpc3RlcmluZyA9IHRydWU7XG4gICAgICAgICAgICBjb25zdCB1c2VyQ29uZmlnUm9vdCA9IHRoaXMuX29wdGlvbnMubG9jYWxVc2VyQ29uZmlnUm9vdDtcbiAgICAgICAgICAgIGNvbnN0IHJlYWR5SW5kaWNhdG9yID0gdGhpcy5fcmVhZHlJbmRpY2F0b3IgPSBkZWZlcnJlZCgpO1xuICAgICAgICAgICAgYXdhaXQgdGhpcy5sb2FkVXNlclByZWZlcmVuY2VzKCk7XG4gICAgICAgICAgICBjb25zdCBleHRlcm5hbHMgPSBuZXcgU2V0KHRoaXMuX3VzZXJQcmVmZXJlbmNlcy5leHRlcm5hbHMgfHwgW10pO1xuICAgICAgICAgICAgaWYgKGluaXRpYWwpIHtcbiAgICAgICAgICAgICAgICBwbHVnaW5zID0gcGx1Z2lucy5jb25jYXQoWy4uLmV4dGVybmFsc10uZmlsdGVyKHVybCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAhcGx1Z2lucy5sZW5ndGggfHwgcGx1Z2lucy5ldmVyeSgocCkgPT4gIXAuZW50cnkgJiYgKHAudXJsICE9PSB1cmwpKTtcbiAgICAgICAgICAgICAgICB9KS5tYXAodXJsID0+ICh7IHVybCB9KSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBwbHVnaW5PcHRpb25zIG9mIHBsdWdpbnMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHVybCB9ID0gcGx1Z2luT3B0aW9ucztcbiAgICAgICAgICAgICAgICBjb25zdCBwbHVnaW5Mb2NhbCA9IG5ldyBQbHVnaW5Mb2NhbChwbHVnaW5PcHRpb25zLCB0aGlzLCB0aGlzKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lTGFiZWwgPSBgW0xPQUQgUGx1Z2luXSAke3BsdWdpbkxvY2FsLmRlYnVnVGFnfWA7XG4gICAgICAgICAgICAgICAgY29uc29sZS50aW1lKHRpbWVMYWJlbCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGx1Z2luTG9jYWwubG9hZChyZWFkeUluZGljYXRvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBsb2FkRXJyIH0gPSBwbHVnaW5Mb2NhbDtcbiAgICAgICAgICAgICAgICBpZiAobG9hZEVycikge1xuICAgICAgICAgICAgICAgICAgICBkZWJ1ZyhgW0ZhaWxlZCBMT0FEIFBsdWdpbl0gI2AsIHBsdWdpbk9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgbG9hZEVycik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsb2FkRXJyIGluc3RhbmNlb2YgSWxsZWdhbFBsdWdpblBhY2thZ2VFcnJvciB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZEVyciBpbnN0YW5jZW9mIEV4aXN0ZWRJbXBvcnRlZFBsdWdpblBhY2thZ2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbm90aWZ5IGdsb2JhbCBsb2cgc3lzdGVtP1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc29sZS50aW1lRW5kKHRpbWVMYWJlbCk7XG4gICAgICAgICAgICAgICAgcGx1Z2luTG9jYWwuc2V0dGluZ3M/Lm9uKCdjaGFuZ2UnLCAoYSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3NldHRpbmdzLWNoYW5nZWQnLCBwbHVnaW5Mb2NhbC5pZCwgYSk7XG4gICAgICAgICAgICAgICAgICAgIHBsdWdpbkxvY2FsLmNhbGxlcj8uY2FsbFVzZXJNb2RlbChMU1BNU0dfU0VUVElOR1MsIHsgcGF5bG9hZDogYSB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlcmVkUGx1Z2lucy5zZXQocGx1Z2luTG9jYWwuaWQsIHBsdWdpbkxvY2FsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ3JlZ2lzdGVyZWQnLCBwbHVnaW5Mb2NhbCk7XG4gICAgICAgICAgICAgICAgLy8gZXh0ZXJuYWwgcGx1Z2luc1xuICAgICAgICAgICAgICAgIGlmICghcGx1Z2luTG9jYWwuaXNJbnN0YWxsZWRJblVzZXJSb290KSB7XG4gICAgICAgICAgICAgICAgICAgIGV4dGVybmFscy5hZGQodXJsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVVc2VyUHJlZmVyZW5jZXMoeyBleHRlcm5hbHM6IEFycmF5LmZyb20oZXh0ZXJuYWxzKSB9KTtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuYWN0aXZhdGVVc2VyUHJlZmVyZW5jZXMoKTtcbiAgICAgICAgICAgIHJlYWR5SW5kaWNhdG9yLnJlc29sdmUoJ3JlYWR5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0aGlzLl9pc1JlZ2lzdGVyaW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgcmVsb2FkKHBsdWdpbnMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBsdWdpbnMpKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbG9hZChbcGx1Z2luc10pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMuZW5zdXJlUGx1Z2luKGlkZW50aXR5KTtcbiAgICAgICAgICAgIGF3YWl0IHAucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXN5bmMgdW5yZWdpc3RlcihwbHVnaW5zKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShwbHVnaW5zKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy51bnJlZ2lzdGVyKFtwbHVnaW5zXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdW5yZWdpc3RlcmVkRXh0ZXJuYWxzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgaWRlbnRpdHkgb2YgcGx1Z2lucykge1xuICAgICAgICAgICAgY29uc3QgcCA9IHRoaXMuZW5zdXJlUGx1Z2luKGlkZW50aXR5KTtcbiAgICAgICAgICAgIGlmICghcC5pc0luc3RhbGxlZEluVXNlclJvb3QpIHtcbiAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyZWRFeHRlcm5hbHMucHVzaChwLm9wdGlvbnMudXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGF3YWl0IHAudW5sb2FkKHRydWUpO1xuICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZFBsdWdpbnMuZGVsZXRlKGlkZW50aXR5KTtcbiAgICAgICAgICAgIHRoaXMuZW1pdCgndW5yZWdpc3RlcmVkJywgaWRlbnRpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBleHRlcm5hbHMgPSB0aGlzLl91c2VyUHJlZmVyZW5jZXMuZXh0ZXJuYWxzIHx8IFtdO1xuICAgICAgICBpZiAoZXh0ZXJuYWxzLmxlbmd0aCAmJiB1bnJlZ2lzdGVyZWRFeHRlcm5hbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVVc2VyUHJlZmVyZW5jZXMoe1xuICAgICAgICAgICAgICAgIGV4dGVybmFsczogZXh0ZXJuYWxzLmZpbHRlcigoaXQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF1bnJlZ2lzdGVyZWRFeHRlcm5hbHMuaW5jbHVkZXMoaXQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhc3luYyBlbmFibGUocGx1Z2luKSB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLmVuc3VyZVBsdWdpbihwbHVnaW4pO1xuICAgICAgICBpZiAocC5wZW5kaW5nKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLmVtaXQoJ2JlZm9yZWVuYWJsZScpO1xuICAgICAgICBwLnNldHRpbmdzPy5zZXQoJ2Rpc2FibGVkJywgZmFsc2UpO1xuICAgICAgICB0aGlzLmVtaXQoJ2VuYWJsZWQnLCBwLmlkKTtcbiAgICB9XG4gICAgYXN5bmMgZGlzYWJsZShwbHVnaW4pIHtcbiAgICAgICAgY29uc3QgcCA9IHRoaXMuZW5zdXJlUGx1Z2luKHBsdWdpbik7XG4gICAgICAgIGlmIChwLnBlbmRpbmcpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuZW1pdCgnYmVmb3JlZGlzYWJsZScpO1xuICAgICAgICBwLnNldHRpbmdzPy5zZXQoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZW1pdCgnZGlzYWJsZWQnLCBwLmlkKTtcbiAgICB9XG4gICAgYXN5bmMgX2hvb2sobnMsIHR5cGUsIHBheWxvYWQsIHBpZCkge1xuICAgICAgICBmb3IgKGNvbnN0IFtfLCBwXSBvZiB0aGlzLl9yZWdpc3RlcmVkUGx1Z2lucykge1xuICAgICAgICAgICAgaWYgKCFwaWQgfHwgcGlkID09PSBwLmlkKSB7XG4gICAgICAgICAgICAgICAgcC5jYWxsZXI/LmNhbGxVc2VyTW9kZWwoTFNQTVNHLCB7XG4gICAgICAgICAgICAgICAgICAgIG5zLCB0eXBlOiBzbmFrZUNhc2UodHlwZSksIHBheWxvYWRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBob29rQXBwKHR5cGUsIHBheWxvYWQsIHBpZCkge1xuICAgICAgICB0aGlzLl9ob29rKGBob29rOmFwcGAsIHR5cGUsIHBheWxvYWQsIHBpZCk7XG4gICAgfVxuICAgIGhvb2tFZGl0b3IodHlwZSwgcGF5bG9hZCwgcGlkKSB7XG4gICAgICAgIHRoaXMuX2hvb2soYGhvb2s6ZWRpdG9yYCwgdHlwZSwgcGF5bG9hZCwgcGlkKTtcbiAgICB9XG4gICAgX2V4ZWNEaXJlY3RpdmUodGFnLCAuLi5wYXJhbXMpIHtcbiAgICB9XG4gICAgZW5zdXJlUGx1Z2luKHBsdWdpbikge1xuICAgICAgICBpZiAocGx1Z2luIGluc3RhbmNlb2YgUGx1Z2luTG9jYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBwbHVnaW47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcCA9IHRoaXMuX3JlZ2lzdGVyZWRQbHVnaW5zLmdldChwbHVnaW4pO1xuICAgICAgICBpZiAoIXApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgcGx1Z2luICMke3BsdWdpbn0gbm90IGV4aXN0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuICAgIGhvc3RNb3VudGVkKCkge1xuICAgICAgICB0aGlzLl9ob3N0TW91bnRlZEFjdG9yLnJlc29sdmUoKTtcbiAgICB9XG4gICAgZ2V0IHJlZ2lzdGVyZWRQbHVnaW5zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFBsdWdpbnM7XG4gICAgfVxuICAgIGdldCBvcHRpb25zKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fb3B0aW9ucztcbiAgICB9XG4gICAgZ2V0IHJlYWR5SW5kaWNhdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZHlJbmRpY2F0b3I7XG4gICAgfVxuICAgIGdldCBob3N0TW91bnRlZEFjdG9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faG9zdE1vdW50ZWRBY3RvcjtcbiAgICB9XG4gICAgZ2V0IGlzUmVnaXN0ZXJpbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc1JlZ2lzdGVyaW5nO1xuICAgIH1cbiAgICBnZXQgdGhlbWVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVnaXN0ZXJlZFRoZW1lcztcbiAgICB9XG4gICAgYXN5bmMgcmVnaXN0ZXJUaGVtZShpZCwgb3B0KSB7XG4gICAgICAgIGRlYnVnKCdyZWdpc3RlcmVkIFRoZW1lICMnLCBpZCwgb3B0KTtcbiAgICAgICAgaWYgKCFpZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgbGV0IHRoZW1lcyA9IHRoaXMuX3JlZ2lzdGVyZWRUaGVtZXMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKCF0aGVtZXMpIHtcbiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRUaGVtZXMuc2V0KGlkLCB0aGVtZXMgPSBbXSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhlbWVzLnB1c2gob3B0KTtcbiAgICAgICAgdGhpcy5lbWl0KCd0aGVtZS1jaGFuZ2VkJywgdGhpcy50aGVtZXMsIHsgaWQsIC4uLm9wdCB9KTtcbiAgICB9XG4gICAgYXN5bmMgc2VsZWN0VGhlbWUob3B0LCBlZmZlY3QgPSB0cnVlKSB7XG4gICAgICAgIHNldHVwSW5qZWN0ZWRUaGVtZShvcHQ/LnVybCk7XG4gICAgICAgIHRoaXMuZW1pdCgndGhlbWUtc2VsZWN0ZWQnLCBvcHQpO1xuICAgICAgICBlZmZlY3QgJiYgdGhpcy5zYXZlVXNlclByZWZlcmVuY2VzKHsgdGhlbWU6IG9wdCB9KTtcbiAgICB9XG4gICAgYXN5bmMgdW5yZWdpc3RlclRoZW1lKGlkKSB7XG4gICAgICAgIGRlYnVnKCd1bnJlZ2lzdGVyZWQgVGhlbWUgIycsIGlkKTtcbiAgICAgICAgaWYgKCF0aGlzLl9yZWdpc3RlcmVkVGhlbWVzLmhhcyhpZCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIHRoaXMuX3JlZ2lzdGVyZWRUaGVtZXMuZGVsZXRlKGlkKTtcbiAgICAgICAgdGhpcy5lbWl0KCd0aGVtZS1jaGFuZ2VkJywgdGhpcy50aGVtZXMsIHsgaWQgfSk7XG4gICAgfVxufVxuZnVuY3Rpb24gc2V0dXBQbHVnaW5Db3JlKG9wdGlvbnMpIHtcbiAgICBjb25zdCBwbHVnaW5Db3JlID0gbmV3IExTUGx1Z2luQ29yZShvcHRpb25zKTtcbiAgICBkZWJ1ZygnPT09IPCflJcgU2V0dXAgTG9nc2VxIFBsdWdpbiBTeXN0ZW0g8J+UlyA9PT0nKTtcbiAgICB3aW5kb3cuTFNQbHVnaW5Db3JlID0gcGx1Z2luQ29yZTtcbn1cbmV4cG9ydCB7IFBsdWdpbkxvY2FsLCBwbHVnaW5IZWxwZXJzLCBzZXR1cFBsdWdpbkNvcmUgfTtcbiJdLCJzb3VyY2VSb290IjoiIn0=